This is an automated email from the ASF dual-hosted git repository.

gaojun2048 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-seatunnel-web.git


The following commit(s) were added to refs/heads/main by this push:
     new 80db01c7 [Doc&Web] Improve readme add how to start seatunnel web (#51)
80db01c7 is described below

commit 80db01c75de059b114694d750756a8eebe4a9c6b
Author: Eric <[email protected]>
AuthorDate: Wed May 10 11:00:44 2023 +0800

    [Doc&Web] Improve readme add how to start seatunnel web (#51)
    
    * Improve the readme
    
    * Make support deploy by installer package
---
 .gitignore                                         |   4 +
 README.md                                          | 158 +++++++++++++--------
 build.sh                                           |   2 +-
 docs/images/application_config.png                 | Bin 0 -> 392200 bytes
 docs/images/ds_create_project.png                  | Bin 0 -> 202373 bytes
 docs/images/ds_create_tenant.png                   | Bin 0 -> 267768 bytes
 docs/images/ds_create_token.png                    | Bin 0 -> 268746 bytes
 docs/images/ds_create_user.png                     | Bin 0 -> 294395 bytes
 seatunnel-server/seatunnel-app/pom.xml             |  87 +++++++++---
 .../{seatunnel-web.xml => seatunnel-web-ci.xml}    |  26 +++-
 .../src/main/assembly/seatunnel-web.xml            |  12 +-
 .../seatunnel/app/adapter/SeatunnelWebAdapter.java |  57 ++++++--
 .../seatunnel/app/controller/AuthController.java   |   2 +-
 .../seatunnel/app/controller/ScriptController.java |   2 +-
 .../seatunnel/app/controller/TaskController.java   |   2 +-
 .../seatunnel/app/controller/UserController.java   |   2 +-
 .../app/interceptor/AuthenticationInterceptor.java |  20 ++-
 .../src/main/resources/application.yml             |   8 +-
 .../main/resources/script/seatunnel_server_env.sh  |   8 +-
 .../main/resources/script/seatunnel_server_h2.sql  |   2 +
 .../resources/script/seatunnel_server_mysql.sql    |   2 +
 seatunnel-ui/src/router/index.ts                   |   4 +-
 seatunnel-ui/src/router/routes.ts                  |   6 +-
 seatunnel-ui/src/service/service.ts                |   8 +-
 seatunnel-ui/vite.config.ts                        |   3 +-
 25 files changed, 295 insertions(+), 120 deletions(-)

diff --git a/.gitignore b/.gitignore
index 1197e9bd..9bf8b904 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,3 +48,7 @@ test.conf
 spark-warehouse
 *.flattened-pom.xml
 /seatunnel-ui/package-lock.json
+/seatunnel-ui/node
+/seatunnel-ui/node/*
+/seatunnel-ui/node_modules
+/seatunnel-ui/node_modules/*
diff --git a/README.md b/README.md
index 30444830..822472d8 100644
--- a/README.md
+++ b/README.md
@@ -21,90 +21,128 @@ Click it if your want to know more about our design. 
👉🏻[Design](https://gi
 
 ## How to start
 
-First, we need clone this project from Github.
+### 1 Preparing the Apache DolphinScheduler environment
 
-```shell
-git clone https://github.com/apache/incubator-seatunnel-web.git
-```
+#### 1.1 Install Apache DolphinScheduler
+
+If you already have Apache DolphinScheduler environment, you can skip this 
step and go to [Create Tenant and User for SeaTunnel Web](#1.2 Create Tenant 
and User for SeaTunnel Web)
+
+Because running SeaTunnel Web must rely on the DolphinScheduler, if you do not 
have a DS environment, you need to first install and deploy a DolphinScheduler 
(hereinafter referred to as DS). Taking DS version 3.1.5 as an example.
+
+Reference 
`https://dolphinscheduler.apache.org/zh-cn/docs/3.1.5/guide/installation/standalone`
 to install a standalone DS.
+
+#### 1.2 Create Tenant and User for SeaTunnel Web
+
+If you already have a DS environment and decide to use existing users and 
tenants for SeaTunnel Web, you can skip this step and go to [Create Project for 
SeaTunnel Web](#1.3 Create Project for SeaTunnel Web).
+
+Because SeaTunnel Web needs to call the interface of DS to create workflows 
and tasks, it is necessary to submit the projects, users, and tenants created 
in DS for SeaTunnel to use.
+
+1. Create Tenant
+
+"Security" -> "Tenant Manage" -> "Create Tenant"
+
+![image](docs/images/ds_create_tenant.png)
+
+2. For simplicity, use the default user admin of DS directly here
+
+#### 1.3 Create Project for SeaTunnel Web
+
+![image](docs/images/ds_create_project.png)
+
+#### 1.4 Create Token for SeaTunnel Web
+
+![image](docs/images/ds_create_token.png)
+
+### 2 Run SeaTunnel Web in IDEA
+
+If you want to deploy and run SeaTunnel Web, Please turn to [3 Run SeaTunnel 
Web In Server](#3 Run SeaTunnel Web In Server)
+
+#### 2.1 Init database 
+
+1. Edit 
`whaletunnel-server/whaletunnel-app/src/main/resources/script/seatunnel_server_env.sh`
 file, Complete the installed database address, port, username, and password. 
Here is an example:
+
+    ```
+    export HOSTNAME="localhost"
+    export PORT="3306"
+    export USERNAME="root"
+    export PASSWORD="123456"
+    ```
+2. Run init shell `sh 
seatunnel-server/seatunnel-app/src/main/resources/script/init_sql.sh` If there 
are no errors during operation, it indicates successful initialization.
+
+#### 2.2 Config application and Run SeaTunnel Web Backend Server
+
+1. Edit `seatunnel-server/seatunnel-app/src/main/resources/application.yml` 
Fill in the database connection information and DS interface related 
information in the file.
+
+![image](docs/images/application_config.png)
+
+2. Run 
`seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/SeatunnelApplication.java`
 If there are no errors reported, the seatunnel web backend service is 
successfully started.
+
+#### 2.3 Run SeaTunnel Web Front End
 
-Then, setup up configuration of db and more.
-```shell
-vim seatunnel-server/seatunnel-app/src/main/resources/application.yml
 ```
+cd seatunnel-ui
+npm install
+npm run dev
 
-Notice:
-At present, we only support the following scheduler systems: dolphinscheduler, 
more scheduler systems will be supported in the future;
-And for easier use, we plan to build our own scheduling system in Seatunnel.
-
-Here is a sample parameter configuration for Seatunnel integration 
dolphinscheduler:
-```yaml
-ds:
-  script:
-    # The path where the script is stored
-    dir: /dj
-  project:
-    # The default project name of dolphinscheduler
-    default: test_dj
-  tenant:
-    # Which tenant been used to submit script  
-    default: default
-  api:
-    # The dolphinscheduler user token
-    token: 12345678
-    # The dolphinscheduler api prefix address
-    prefix: http://127.0.0.1:12345/dolphinscheduler
 ```
 
-Now comes the crucial part, this is about your account security, please modify 
the Jwt secret key and algorithm.
+If there are no issues with the operation, the following information will be 
displayed:
 
-```yaml
-jwt:
-  expireTime: 86400
-  secretKey: https://github.com/apache/incubator-seatunnel
-  algorithm: HS256
 ```
+  ➜  Local:   http://127.0.0.1:5173/
+  ➜  Network: use --host to expose
+  ➜  press h to show help
 
-
-Next, execute sql to create table .(Your must create database first by 
yourself)
-```shell
-# Replace `username` & `dbName` with the real username and database name.
-# We will provided script in future.
-mysql -u username -p [dbName] < bin/seatunnl.sql
 ```
 
-Now, you've done all the preparatory work, launch our app.
+Accessing in a browser http://127.0.0.1:5173/login Okay, the default username 
and password are admin/admin.
 
-### Launch it in IntelliJ IDEA
+### 3 Run SeaTunnel Web In Server
 
-Starting the back end of St in idea is really simple, just run the main method 
of `SeatunnelApplication.java` in the `seatunnel-app` module.
-And the log will tell u anything you need to know.
+#### 3.1 Build Install Package From Code
 
-### Start it in the command line
+```
+cd incubator-seatunnel-web
+sh build.sh code
+```
 
-```shell
-# start backend
+Then you can find the installer package in dir 
`incubator-seatunnel-web/seatunnel-server/seatunnel-app/target/apache-seatunnel-web-incubating-${project.version}.tar.gz`.
 
-# for build code
-sh build.sh code
+#### 3.2 Install
 
-# for build image
-sh build.sh image
- 
-# and then start docker container
-docker run apache/seatunnel-web
+Copy the `apache-seatunnel-web-incubating-${project.version}.tar.gz` to your 
server node and unzip it.
 
+```shell
+tar -zxvf apache-seatunnel-web-incubating-${project.version}.tar.gz
 ```
 
-### start frontend
-You can use a Web server such as Apache HTTP Server or Nginx to start 
front-end applications. Deploy the built front-end code to the root directory 
of the Web server, start the Web server, and enter the URL of the Web server in 
a browser to access the application.
+#### 3.3 Init database
+
+1. Edit 
`apache-seatunnel-web-incubating-${project.version}/script/seatunnel_server_env.sh`
 file, Complete the installed database address, port, username, and password. 
Here is an example:
+
+    ```
+    export HOSTNAME="localhost"
+    export PORT="3306"
+    export USERNAME="root"
+    export PASSWORD="123456"
+    ```
+2. Run init shell `sh 
apache-seatunnel-web-incubating-${project.version}/script/init_sql.sh` If there 
are no errors during operation, it indicates successful initialization.
+
+#### 3.4 Config application and Run SeaTunnel Web Backend Server
+
+Edit 
`apache-seatunnel-web-incubating-${project.version}/config/application.yml` 
Fill in the database connection information and DS interface related 
information in the file.
+
+![image](docs/images/application_config.png)
+
+#### 3.5 Start SeaTunnel Web
 
-If you want start in dev mode:
 ```shell
-cd seatunnel-ui
-npm install
-npm run dev
+cd apache-seatunnel-web-incubating-${project.version}
+sh bin/seatunnel-backend-daemon.sh start
 ```
 
+Accessing in a browser http://127.0.0.1:8801/ui/ Okay, the default username 
and password are admin/admin.
+
 ### How to use it
 
 After all the pre-work is done, we can open the following URL: 
127.0.0.1:7890(please replace it according to your configuration) to use it.
diff --git a/build.sh b/build.sh
index d48afbf4..6ce3ed7f 100644
--- a/build.sh
+++ b/build.sh
@@ -29,7 +29,7 @@ DOCKER_VERSION=1.0.0-snapshot
 code() {
   /bin/sh $WORKDIR/mvnw clean package -DskipTests
   # mv release zip
-  mv $WORKDIR/seatunnel-server/seatunnel-app/target/seatunnel-web.zip $WORKDIR/
+  mv 
$WORKDIR/seatunnel-server/seatunnel-app/target/apache-seatunnel-web-incubating-1.0.0-SNAPSHOT.zip
 $WORKDIR/
 }
 
 # build image
diff --git a/docs/images/application_config.png 
b/docs/images/application_config.png
new file mode 100644
index 00000000..eac17bae
Binary files /dev/null and b/docs/images/application_config.png differ
diff --git a/docs/images/ds_create_project.png 
b/docs/images/ds_create_project.png
new file mode 100644
index 00000000..71bb2516
Binary files /dev/null and b/docs/images/ds_create_project.png differ
diff --git a/docs/images/ds_create_tenant.png b/docs/images/ds_create_tenant.png
new file mode 100644
index 00000000..45dfe336
Binary files /dev/null and b/docs/images/ds_create_tenant.png differ
diff --git a/docs/images/ds_create_token.png b/docs/images/ds_create_token.png
new file mode 100644
index 00000000..539c0bdf
Binary files /dev/null and b/docs/images/ds_create_token.png differ
diff --git a/docs/images/ds_create_user.png b/docs/images/ds_create_user.png
new file mode 100644
index 00000000..5117f398
Binary files /dev/null and b/docs/images/ds_create_user.png differ
diff --git a/seatunnel-server/seatunnel-app/pom.xml 
b/seatunnel-server/seatunnel-app/pom.xml
index aef91185..aa41a158 100644
--- a/seatunnel-server/seatunnel-app/pom.xml
+++ b/seatunnel-server/seatunnel-app/pom.xml
@@ -246,26 +246,73 @@
                     </execution>
                 </executions>
             </plugin>
-
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>seatunnel-web</id>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <phase>package</phase>
-                        <configuration>
-                            <finalName>seatunnel-web</finalName>
-                            <descriptors>
-                                
<descriptor>src/main/assembly/seatunnel-web.xml</descriptor>
-                            </descriptors>
-                            <appendAssemblyId>false</appendAssemblyId>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <id>release</id>
+            <activation>
+                <property>
+                    <name>release</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                
<finalName>apache-seatunnel-web-incubating-${project.version}</finalName>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>seatunnel-web</id>
+                                <goals>
+                                    <goal>single</goal>
+                                </goals>
+                                <phase>package</phase>
+                                <configuration>
+                                    <descriptors>
+                                        
<descriptor>src/main/assembly/seatunnel-web.xml</descriptor>
+                                    </descriptors>
+                                    <appendAssemblyId>false</appendAssemblyId>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>ci</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+                <property>
+                    <name>release</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                
<finalName>apache-seatunnel-web-incubating-${project.version}</finalName>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>seatunnel-web</id>
+                                <goals>
+                                    <goal>single</goal>
+                                </goals>
+                                <phase>package</phase>
+                                <configuration>
+                                    <descriptors>
+                                        
<descriptor>src/main/assembly/seatunnel-web-ci.xml</descriptor>
+                                    </descriptors>
+                                    <appendAssemblyId>false</appendAssemblyId>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 </project>
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml 
b/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web-ci.xml
similarity index 67%
copy from seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml
copy to seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web-ci.xml
index 0d1f4935..91fe5e3c 100644
--- a/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml
+++ b/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web-ci.xml
@@ -22,9 +22,9 @@
     <formats>
         <format>dir</format>
         <format>zip</format>
+        <format>tar.gz</format>
     </formats>
     <includeBaseDirectory>false</includeBaseDirectory>
-    <baseDirectory>seatunnel-web</baseDirectory>
     <fileSets>
         <fileSet>
             <directory>${basedir}/src/main/resources</directory>
@@ -35,6 +35,13 @@
             </includes>
             <outputDirectory>conf</outputDirectory>
         </fileSet>
+        <fileSet>
+            <directory>${basedir}/src/main/resources/script</directory>
+            <includes>
+                <include>*.*</include>
+            </includes>
+            <outputDirectory>script</outputDirectory>
+        </fileSet>
         <fileSet>
             <directory>${basedir}/src/main/bin</directory>
             <includes>
@@ -45,14 +52,27 @@
         <fileSet>
             <directory>${basedir}/../../seatunnel-ui/dist</directory>
             <includes>
-                <include>*</include>
+                <include>**/*.*</include>
             </includes>
-            <outputDirectory>dist</outputDirectory>
+            <outputDirectory>ui</outputDirectory>
         </fileSet>
     </fileSets>
     <dependencySets>
         <dependencySet>
             <outputDirectory>libs</outputDirectory>
         </dependencySet>
+        <!-- =================== JDBC Connector Drivers ===================  
-->
+        <dependencySet>
+            <useProjectArtifact>false</useProjectArtifact>
+            <useTransitiveDependencies>true</useTransitiveDependencies>
+            <unpack>false</unpack>
+            <includes>
+                <include>mysql:mysql-connector-java:jar</include>
+                <include>org.postgresql:postgresql:jar</include>
+            </includes>
+            
<outputFileNameMapping>${artifact.file.name}</outputFileNameMapping>
+            <outputDirectory>libs</outputDirectory>
+            <scope>provided</scope>
+        </dependencySet>
     </dependencySets>
 </assembly>
diff --git a/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml 
b/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml
index 0d1f4935..5dce8b83 100644
--- a/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml
+++ b/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml
@@ -24,7 +24,6 @@
         <format>zip</format>
     </formats>
     <includeBaseDirectory>false</includeBaseDirectory>
-    <baseDirectory>seatunnel-web</baseDirectory>
     <fileSets>
         <fileSet>
             <directory>${basedir}/src/main/resources</directory>
@@ -35,6 +34,13 @@
             </includes>
             <outputDirectory>conf</outputDirectory>
         </fileSet>
+        <fileSet>
+            <directory>${basedir}/src/main/resources/script</directory>
+            <includes>
+                <include>*.*</include>
+            </includes>
+            <outputDirectory>script</outputDirectory>
+        </fileSet>
         <fileSet>
             <directory>${basedir}/src/main/bin</directory>
             <includes>
@@ -45,9 +51,9 @@
         <fileSet>
             <directory>${basedir}/../../seatunnel-ui/dist</directory>
             <includes>
-                <include>*</include>
+                <include>**/*.*</include>
             </includes>
-            <outputDirectory>dist</outputDirectory>
+            <outputDirectory>ui</outputDirectory>
         </fileSet>
     </fileSets>
     <dependencySets>
diff --git 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/adapter/SeatunnelWebAdapter.java
 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/adapter/SeatunnelWebAdapter.java
index 9f1d4ab0..84117d8e 100644
--- 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/adapter/SeatunnelWebAdapter.java
+++ 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/adapter/SeatunnelWebAdapter.java
@@ -23,15 +23,26 @@ import 
org.apache.seatunnel.app.resolver.UserIdMethodArgumentResolver;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.LocaleResolver;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import 
org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import 
org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.i18n.CookieLocaleResolver;
 
 import javax.annotation.Resource;
 
 import java.util.List;
+import java.util.Locale;
 
 @Configuration
 public class SeatunnelWebAdapter implements WebMvcConfigurer {
+
+    public static final String LOCALE_LANGUAGE_COOKIE = "language";
+    public static final String LOGIN_INTERCEPTOR_PATH_PATTERN = "/**/*";
+    public static final String LOGIN_PATH_PATTERN = 
"/seatunnel/api/v1/user/login**";
+    public static final String REGISTER_PATH_PATTERN = "/users/register";
+
     @Bean
     public AuthenticationInterceptor authenticationInterceptor() {
         return new AuthenticationInterceptor();
@@ -40,23 +51,47 @@ public class SeatunnelWebAdapter implements 
WebMvcConfigurer {
     @Resource
     private UserIdMethodArgumentResolver currentUserMethodArgumentResolver;
 
+    /**
+     * Cookie
+     *
+     * @return local resolver
+     */
+    @Bean(name = "localeResolver")
+    public LocaleResolver localeResolver() {
+        CookieLocaleResolver localeResolver = new CookieLocaleResolver();
+        localeResolver.setCookieName(LOCALE_LANGUAGE_COOKIE);
+        // set default locale
+        localeResolver.setDefaultLocale(Locale.US);
+        // set language tag compliant
+        localeResolver.setLanguageTagCompliant(false);
+        return localeResolver;
+    }
+
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        
registry.addInterceptor(authenticationInterceptor()).order(1).addPathPatterns("/**")
-                // exclude swagger api path
-                .excludePathPatterns(
-                        "/swagger-resources/**",
-                        "/webjars/**",
-                        "/v2/**",
-                        "/swagger-ui.html**"
-                )
-                // exclude login
-                .excludePathPatterns("/api/v1/user/login**")
-        ;
+        registry.addInterceptor(authenticationInterceptor())
+            .order(1)
+            .addPathPatterns(LOGIN_INTERCEPTOR_PATH_PATTERN)
+            .excludePathPatterns(LOGIN_PATH_PATTERN, REGISTER_PATH_PATTERN,
+                "/swagger-resources/**", "/webjars/**", "/v2/**", "*.html", 
"/ui/**", "/error", "/swagger-ui.html**");
     }
 
     @Override
     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> 
argumentResolvers) {
         argumentResolvers.add(currentUserMethodArgumentResolver);
     }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
+        
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+        registry.addResourceHandler("/ui/**").addResourceLocations("file:ui/");
+    }
+
+    @Override
+    public void addViewControllers(ViewControllerRegistry registry) {
+        registry.addViewController("/").setViewName("redirect:/ui/");
+        
registry.addViewController("/ui/").setViewName("forward:/ui/index.html");
+    }
+
 }
diff --git 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/AuthController.java
 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/AuthController.java
index fa83416f..b2d99503 100644
--- 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/AuthController.java
+++ 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/AuthController.java
@@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.validation.constraints.NotNull;
 
-@RequestMapping("/api/v1/auth")
+@RequestMapping("/seatunnel/api/v1/auth")
 @RestController
 public class AuthController {
 
diff --git 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ScriptController.java
 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ScriptController.java
index ff094d43..e1885e29 100644
--- 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ScriptController.java
+++ 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ScriptController.java
@@ -50,7 +50,7 @@ import javax.validation.constraints.NotNull;
 
 import java.util.List;
 
-@RequestMapping("/api/v1/script")
+@RequestMapping("/seatunnel/api/v1/script")
 @RestController
 public class ScriptController {
     @Resource
diff --git 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/TaskController.java
 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/TaskController.java
index 43f141d7..b66de54d 100644
--- 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/TaskController.java
+++ 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/TaskController.java
@@ -44,7 +44,7 @@ import springfox.documentation.annotations.ApiIgnore;
 import javax.annotation.Resource;
 import javax.validation.constraints.NotNull;
 
-@RequestMapping("/api/v1/task")
+@RequestMapping("/seatunnel/api/v1/task")
 @RestController
 public class TaskController {
 
diff --git 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/UserController.java
 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/UserController.java
index 08cd9072..6a818496 100644
--- 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/UserController.java
+++ 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/UserController.java
@@ -43,7 +43,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.validation.constraints.NotNull;
 
-@RequestMapping("/api/v1/user")
+@RequestMapping("/seatunnel/api/v1/user")
 @RestController
 public class UserController {
 
diff --git 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/interceptor/AuthenticationInterceptor.java
 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/interceptor/AuthenticationInterceptor.java
index 3b432625..05a54fa3 100644
--- 
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/interceptor/AuthenticationInterceptor.java
+++ 
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/interceptor/AuthenticationInterceptor.java
@@ -20,16 +20,15 @@ package org.apache.seatunnel.app.interceptor;
 import static org.apache.seatunnel.server.common.Constants.OPTIONS;
 import static org.apache.seatunnel.server.common.Constants.TOKEN;
 import static org.apache.seatunnel.server.common.Constants.USER_ID;
-import static 
org.apache.seatunnel.server.common.SeatunnelErrorEnum.TOKEN_ILLEGAL;
 import static io.jsonwebtoken.Claims.EXPIRATION;
 
 import org.apache.seatunnel.app.dal.dao.IUserDao;
 import org.apache.seatunnel.app.dal.entity.UserLoginLog;
 import org.apache.seatunnel.app.security.JwtUtils;
-import org.apache.seatunnel.server.common.SeatunnelException;
 
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.eclipse.jetty.http.HttpStatus;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
 
@@ -60,24 +59,33 @@ public class AuthenticationInterceptor implements 
HandlerInterceptor {
             response.setHeader("Access-Control-Max-Age", "3600");
             return true;
         }
+
         long currentTimestamp = System.currentTimeMillis();
         final String token = request.getHeader(TOKEN);
         if (StringUtils.isBlank(token)) {
-            throw new SeatunnelException(TOKEN_ILLEGAL);
+            log.info("user does not exist");
+            response.setStatus(HttpStatus.UNAUTHORIZED_401);
+            return false;
         }
         final Map<String, Object> map = jwtUtils.parseToken(token);
         final Integer userId = (Integer) map.get(USER_ID);
         if (Objects.isNull(userId)) {
-            throw new SeatunnelException(TOKEN_ILLEGAL);
+            log.info("userId does not exist");
+            response.setStatus(HttpStatus.UNAUTHORIZED_401);
+            return false;
         }
         final UserLoginLog userLoginLog = userDaoImpl.getLastLoginLog(userId);
         if (Objects.isNull(userLoginLog) || !userLoginLog.getTokenStatus()) {
-            throw new SeatunnelException(TOKEN_ILLEGAL);
+            log.info("userLoginLog does not exist");
+            response.setStatus(HttpStatus.UNAUTHORIZED_401);
+            return false;
         }
 
         final Integer expireDate = (Integer) map.get(EXPIRATION);
         if (Objects.isNull(expireDate) || currentTimestamp - (long) expireDate 
* 1000 > 0) {
-            throw new SeatunnelException(TOKEN_ILLEGAL);
+            log.info("user token has expired");
+            response.setStatus(HttpStatus.UNAUTHORIZED_401);
+            return false;
         }
 
         map.forEach(request::setAttribute);
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/application.yml 
b/seatunnel-server/seatunnel-app/src/main/resources/application.yml
index 77e35480..7d9f51af 100644
--- a/seatunnel-server/seatunnel-app/src/main/resources/application.yml
+++ b/seatunnel-server/seatunnel-app/src/main/resources/application.yml
@@ -25,7 +25,7 @@ spring:
     date-format: yyyy-MM-dd HH:mm:ss
   datasource:
     driver-class-name: com.mysql.jdbc.Driver
-    url: 
jdbc:mysql://127.0.0.1:3306/seatunnel?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
+    url: 
jdbc:mysql://localhost:3306/seatunnel?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&allowPublicKeyRetrieval=true
     username: root
     password: 123456
   mvc:
@@ -35,11 +35,11 @@ ds:
   script:
     dir: /dj
   project:
-    default: test_dj
+    default: seatunnel_test
   tenant:
-    default: default
+    default: gaojun
   api:
-    token: 12345678
+    token: 296fecc6e5f78e6a5aa39106707476fe
     prefix: http://127.0.0.1:12345/dolphinscheduler
 
 jwt:
diff --git 
a/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_env.sh
 
b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_env.sh
index 3ec563f3..5fdd3459 100644
--- 
a/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_env.sh
+++ 
b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_env.sh
@@ -15,7 +15,7 @@
 # limitations under the License.
 #
 
-export HOSTNAME=""
-export PORT=""
-export USERNAME=""
-export PASSWORD=""
\ No newline at end of file
+export HOSTNAME="127.0.0.1"
+export PORT="3306"
+export USERNAME="root"
+export PASSWORD="123456"
\ No newline at end of file
diff --git 
a/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_h2.sql
 
b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_h2.sql
index 8ee41d34..696abf11 100644
--- 
a/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_h2.sql
+++ 
b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_h2.sql
@@ -171,3 +171,5 @@ CREATE TABLE `user_login_log` (
 -- ----------------------------
 -- Records of user_login_log
 -- ----------------------------
+
+INSERT INTO `seatunnel`.`user`(`username`,`password`,`status`,`type`) values 
('admin', '7f97da8846fed829bb8d1fd9f8030f3b', 0, 0);
\ No newline at end of file
diff --git 
a/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_mysql.sql
 
b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_mysql.sql
index e933890b..a7a84e9d 100644
--- 
a/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_mysql.sql
+++ 
b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_mysql.sql
@@ -171,3 +171,5 @@ CREATE TABLE `seatunnel`.`user_login_log` (
 -- ----------------------------
 -- Records of user_login_log
 -- ----------------------------
+
+INSERT INTO `seatunnel`.`user`(`username`,`password`,`status`,`type`) values 
('admin', '7f97da8846fed829bb8d1fd9f8030f3b', 0, 0);
diff --git a/seatunnel-ui/src/router/index.ts b/seatunnel-ui/src/router/index.ts
index 188a9f44..fba0d6b9 100644
--- a/seatunnel-ui/src/router/index.ts
+++ b/seatunnel-ui/src/router/index.ts
@@ -21,7 +21,9 @@ import NProgress from 'nprogress'
 import 'nprogress/nprogress.css'
 
 const router = createRouter({
-  history: createWebHistory('/'),
+  history: createWebHistory(
+      import.meta.env.MODE === 'production' ? '/ui/' : '/'
+  ),
   routes
 })
 
diff --git a/seatunnel-ui/src/router/routes.ts 
b/seatunnel-ui/src/router/routes.ts
index 8397eecf..64eac468 100644
--- a/seatunnel-ui/src/router/routes.ts
+++ b/seatunnel-ui/src/router/routes.ts
@@ -26,7 +26,11 @@ import type { Component } from 'vue'
 const modules = import.meta.glob('/src/views/**/**.tsx')
 const components: { [key: string]: Component } = utils.mapping(modules)
 
-const basePage: RouteRecordRaw[] = [dataPipes, jobs, tasks, userManage]
+const basePage: RouteRecordRaw[] = [{
+    path: '/',
+    redirect: { name: 'data-pipes' }
+  },
+  dataPipes, jobs, tasks, userManage]
 
 const loginPage: RouteRecordRaw[] = [
   {
diff --git a/seatunnel-ui/src/service/service.ts 
b/seatunnel-ui/src/service/service.ts
index d78f4f10..8f3de6b9 100644
--- a/seatunnel-ui/src/service/service.ts
+++ b/seatunnel-ui/src/service/service.ts
@@ -22,6 +22,7 @@ import axios, {
   InternalAxiosRequestConfig
 } from 'axios'
 import utils from '@/utils'
+import router from '@/router'
 import { useUserStore } from '@/store/user'
 import { useSettingStore } from '@/store/setting'
 import type { UserDetail } from '@/service/user/types'
@@ -41,12 +42,17 @@ const baseRequestConfig: AxiosRequestConfig = {
   timeout: settingStore.getRequestTimeValue
     ? settingStore.getRequestTimeValue
     : 6000,
-  baseURL: '/api/v1'
+  baseURL: '/seatunnel/api/v1'
 }
 
 const service = axios.create(baseRequestConfig)
 
 const err = (err: AxiosError): Promise<AxiosError> => {
+  const userStore = useUserStore()
+  if (err.response?.status === 401) {
+    userStore.setUserInfo({})
+    router.push({ path: '/login' })
+  }
   return Promise.reject(err)
 }
 
diff --git a/seatunnel-ui/vite.config.ts b/seatunnel-ui/vite.config.ts
index 237ef0aa..d7498d01 100644
--- a/seatunnel-ui/vite.config.ts
+++ b/seatunnel-ui/vite.config.ts
@@ -22,6 +22,7 @@ import viteCompression from 'vite-plugin-compression'
 import path from 'path'
 
 export default defineConfig({
+  base: process.env.NODE_ENV === 'production' ? '/ui/' : '/',
   plugins: [
     vue(),
     vueJsx(),
@@ -42,7 +43,7 @@ export default defineConfig({
   },
   server: {
     proxy: {
-      '/api/v1': {
+      '/seatunnel/api/v1': {
         target: loadEnv('development', './').VITE_APP_DEV_WEB_URL,
         changeOrigin: true
       }


Reply via email to