You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@seatunnel.apache.org by ty...@apache.org on 2023/03/26 06:51:15 UTC

[incubator-seatunnel-web] branch dev updated: [Feature] Add README and fix some bugs (#44)

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

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


The following commit(s) were added to refs/heads/dev by this push:
     new 0756d831 [Feature] Add README and fix some bugs (#44)
0756d831 is described below

commit 0756d831fe38e126c5069b1f66241b1a6522d3eb
Author: dijie <nj...@gmail.com>
AuthorDate: Sun Mar 26 14:51:10 2023 +0800

    [Feature] Add README and fix some bugs (#44)
    
    * Add License and Notice files (#6)
    
    * Add License and Notice files
    Add source package
    Add github setting
    
    * [Script]add init sql (#8)
    
    Co-authored-by: shiliang.lu <sh...@clickzetta.com>
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * Solve the dependency version is not defined in the pom file (#11)
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Bug fix
    
    * [Feat][UI] Complete job management. (#14)
    
    * [Feature] Add seatunnel main repository as seatunnel-web submodule (#13)
    
    * remove submodule
    
    * add submodule
    
    * ignore submodule license header check
    
    * ignore submodule license header check
    
    * [Feature][Dao] Added h2 memory database support. (#19)
    
    * Added h2 memory database.
    
    * add h2 license
    
    * [Improve][Jackson] Bump jackson-databind from 2.12.6 to 2.12.7.1 (#20)
    
    * Bump jackson-databind from 2.12.6 to 2.12.7.1
    
    * update jackson core license
    
    * Fix the time field value returned by the user management list query interface to be null (#22)
    
    * Fix the time field value returned by the user management list query interface to be null.
    
    * add dependency license
    
    * add dependency license
    
    * [Fix][API] Fix that the response body does not return the token attribute after successful login (#21)
    
    * Fix that the response body does not return the token attribute after successful login
    
    * fix code style
    
    * Add application ports
    
    * [Feat][UI] Complete style writing. (#24)
    
    * [Feat][UI] Complete style writing.
    
    * [Feat][UI] Complete style writing.
    
    * [Feat][UI] Adjust menu structure. (#25)
    
    * [Feat][UI] Complete the task list interface. (#27)
    
    * [Feat][UI] Complete the task list interface.
    
    * [Feat][UI] Complete the task list interface.
    
    * [Improve][seatunnel-server] Bugfix
    
    * [Feat][UI] Complete the data pipe list and data pipe delete interface.
    
    * [Feat][UI] Complete the data pipe list and data pipe delete interface.
    
    * [Feat][UI] Complete the data pipe list and data pipe delete interface.
    
    * [Feat][UI] Add menu selection and username drop-down. (#30)
    
    * [Perf][UI] Optimize some details and styles. (#31)
    
    * [Feature][UI] Perf login (#32)
    
    * [Perf][UI] Optimize landing page style.
    
    * [Perf][UI] Optimize landing page style.
    
    * [Feat][UI] Complete the kill interface of task.
    
    * [Feat][UI] Write part of the interface logic.
    
    * [Feat][UI] Write part of the interface logic.
    
    * [Feat][UI] Write part of the interface logic.
    
    * [Feat][UI] Complete the kill interface of task.
    
    * [Feat][UI] Finish writing the setting page. (#33)
    
    * [Feat][UI] Complete the view log function. (#35)
    
    * [Feat][UI] Complete the function of setting table fields. (#36)
    
    * [Feat][UI] Add to execute and rerun interfaces. (#37)
    
    * [Feat][UI] Complete data pipes function. (#38)
    
    * [Fix][UI] Fix the error of fillet switching. (#39)
    
    * [Feat][UI] Increase the setting of request time. (#40)
    
    * Hotfix][UI] Fix warnings in the project. (#41)
    
    * [Hotfix] Bugfix 2 (#42)
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Bug fix
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design (#12)
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Bug fix
    
    ---------
    
    Co-authored-by: dijie <di...@clickzetta.com>
    
    * [Improve][seatunnel-server] Bugfix
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Bug fix
    
    * [Improve][seatunnel-server] Bugfix
    
    * [Improve][seatunnel-server] merge conflicts
    
    * [Improve][seatunnel-server] bug fix
    
    * [Improve][seatunnel-server] bug fix
    
    * [Improve][seatunnel-server] bug fix
    
    ---------
    
    Co-authored-by: dijie <di...@clickzetta.com>
    
    * [Improve][seatunnel-server] add build script for build code & docker image
    
    * [Improve][seatunnel-server] bugfix
    
    * [Chore] Remove useless dependency (#45)
    
    * [Chore] Remove useless dependency
    
    * [Chore] Remove .gitmodules
    
    * [Hotfix] Add license headers
    
    * [Hotfix] Fix 404 dead link
    
    * [Hotfix] Fix package maven plugin
    
    * [Hotfix] Fix dependency license
    
    ---------
    
    Co-authored-by: Kirs <ki...@apache.org>
    Co-authored-by: luketalent <lu...@qq.com>
    Co-authored-by: shiliang.lu <sh...@clickzetta.com>
    Co-authored-by: dijie <di...@clickzetta.com>
    Co-authored-by: Kerwin <37...@users.noreply.github.com>
    Co-authored-by: songjianet <17...@qq.com>
    Co-authored-by: Eric <ga...@gmail.com>
    Co-authored-by: Tyrantlucifer <Ty...@gmail.com>
---
 .asf.yaml                                          |   45 +
 .github/workflows/backend.yml                      |   21 +-
 .gitignore                                         |    1 +
 .licenserc.yaml                                    |    1 +
 DISCLAIMER                                         |    5 +
 LICENSE                                            |  212 +++
 NOTICE                                             |   18 +
 README.md                                          |  126 ++
 .../src/main/resources/application.yml => build.sh |   62 +-
 .../application.yml => docker/backend.dockerfile   |   39 +-
 docs/images/datapipeline.png                       |  Bin 0 -> 97439 bytes
 docs/images/job.png                                |  Bin 0 -> 72583 bytes
 docs/images/user.png                               |  Bin 0 -> 77240 bytes
 pom.xml                                            |   48 +-
 seatunnel-server/pom.xml                           |   35 +-
 seatunnel-server/seatunnel-app/pom.xml             |  117 +-
 .../src/main/assembly/seatunnel-web.xml            |   58 +
 .../src/main/bin/seatunnel-backend-daemon.sh       |   81 +
 .../apache/seatunnel/app/aspect/LoginAspect.java   |   77 -
 .../seatunnel/app/common/ScriptStatusEnum.java     |   12 +
 .../seatunnel/app/controller/AuthController.java   |    4 +-
 .../seatunnel/app/controller/ScriptController.java |   25 +-
 .../seatunnel/app/controller/TaskController.java   |    2 +-
 .../apache/seatunnel/app/dal/dao/IScriptDao.java   |    6 +-
 .../seatunnel/app/dal/dao/impl/ScriptDaoImpl.java  |   11 +-
 ...AddEmptyScriptDto.java => CreateScriptDto.java} |    3 +-
 ...AddEmptyScriptReq.java => CreateScriptReq.java} |    4 +-
 .../app/domain/request/script/ScriptListReq.java   |    2 -
 .../domain/response/script/BaseScriptInfoRes.java  |    4 +-
 ...AddEmptyScriptRes.java => CreateScriptRes.java} |    2 +-
 ...dEmptyScriptRes.java => ScriptFullInfoRes.java} |    8 +-
 .../app/domain/response/user/BaseUserInfoRes.java  |    2 +
 .../seatunnel/app/service/IScriptService.java      |    9 +-
 .../app/service/impl/ScriptServiceImpl.java        |   55 +-
 .../app/service/impl/TaskServiceImpl.java          |   65 +-
 .../app/service/impl/UserServiceImpl.java          |   20 +-
 .../src/main/resources/application.yml             |   21 +-
 .../seatunnel/app/dal/mapper/ScriptMapper.xml      |   13 +-
 .../{application.yml => script/init_sql.sh}        |   38 +-
 .../seatunnel_server_env.sh}                       |   30 +-
 .../main/resources/script/seatunnel_server_h2.sql  |  173 ++
 .../resources/script/seatunnel_server_mysql.sql    |  173 ++
 .../seatunnel-scheduler-dolphinscheduler/pom.xml   |    4 +
 .../dolphinscheduler/IDolphinschedulerService.java |    2 +
 .../constants/DolphinschedulerConstants.java       |    1 +
 .../impl/DolphinschedulerServiceImpl.java          |    3 +-
 .../dolphinscheduler/impl/InstanceServiceImpl.java |    3 +-
 .../dolphinscheduler/impl/JobServiceImpl.java      |    7 +
 .../dolphinscheduler/utils/StatusUtils.java        |   49 +-
 seatunnel-server/seatunnel-server-common/pom.xml   |    4 +
 seatunnel-server/seatunnel-spi/pom.xml             |    4 +
 .../spi/scheduler/enums/InstanceStatusEnum.java}   |   14 +-
 seatunnel-ui/.env.development                      |    2 +-
 seatunnel-ui/.gitignore                            |    1 +
 seatunnel-ui/package.json                          |   60 +-
 seatunnel-ui/pnpm-lock.yaml                        | 1973 ++++++++++----------
 seatunnel-ui/src/App.tsx                           |   23 +-
 .../header/logo/index.tsx => common/table.ts}      |   36 +-
 seatunnel-ui/src/components/modal/index.tsx        |    1 +
 .../src/layouts/dashboard/header/index.tsx         |    6 +-
 .../src/layouts/dashboard/header/logo/index.tsx    |    2 +-
 .../src/layouts/dashboard/header/menu/index.tsx    |    7 +-
 .../src/layouts/dashboard/header/menu/use-menu.ts  |    4 +
 .../src/layouts/dashboard/header/setting/index.tsx |   51 -
 .../src/layouts/dashboard/header/user/index.tsx    |   28 +-
 .../dashboard/header/user/use-user-dropdown.ts     |   36 +-
 seatunnel-ui/src/layouts/dashboard/index.tsx       |    8 +-
 seatunnel-ui/src/locales/en_US/data-pipes.ts       |   19 +-
 seatunnel-ui/src/locales/en_US/index.ts            |    4 +-
 seatunnel-ui/src/locales/en_US/jobs.ts             |    6 +-
 seatunnel-ui/src/locales/en_US/menu.ts             |    1 +
 .../src/locales/en_US/{menu.ts => setting.ts}      |   22 +-
 seatunnel-ui/src/locales/en_US/tasks.ts            |   15 +-
 seatunnel-ui/src/locales/en_US/user-manage.ts      |    1 +
 seatunnel-ui/src/router/data-pipes.ts              |    4 +-
 seatunnel-ui/src/router/routes.ts                  |   20 +-
 seatunnel-ui/src/service/script/index.ts           |   26 +-
 seatunnel-ui/src/service/script/types.ts           |   14 +-
 seatunnel-ui/src/service/service.ts                |   16 +-
 seatunnel-ui/src/service/task/index.ts             |   13 +-
 seatunnel-ui/src/service/task/types.ts             |   19 +-
 seatunnel-ui/src/service/types.ts                  |    2 +-
 seatunnel-ui/src/store/setting/index.ts            |   58 +
 .../src/store/setting/types.ts                     |   14 +-
 seatunnel-ui/src/themes/modules/light.ts           |   52 +-
 .../data-pipes}/components/log/index.tsx           |    0
 .../create/components/configuration-modal.tsx      |   98 -
 .../create/components/use-configuration-modal.ts   |   85 -
 seatunnel-ui/src/views/data-pipes/create/index.tsx |   87 +-
 .../detail/components/detail-overview.tsx          |  130 --
 .../detail/components/use-detail-overview.ts       |   51 -
 seatunnel-ui/src/views/data-pipes/detail/index.tsx |   76 +-
 seatunnel-ui/src/views/data-pipes/edit/index.tsx   |   50 +-
 .../data-pipes/list/components/delete-modal.tsx    |    4 +-
 .../data-pipes/list/components/publish-modal.tsx   |    4 +-
 seatunnel-ui/src/views/data-pipes/list/index.tsx   |   37 +-
 .../src/views/data-pipes/list/use-table.ts         |  168 +-
 seatunnel-ui/src/views/jobs/list/index.tsx         |   30 +-
 seatunnel-ui/src/views/jobs/list/use-table.ts      |   83 +-
 seatunnel-ui/src/views/login/index.tsx             |  109 +-
 seatunnel-ui/src/views/setting/index.tsx           |  158 ++
 .../list/components/log-modal.tsx}                 |   45 +-
 seatunnel-ui/src/views/tasks/list/index.tsx        |   64 +-
 seatunnel-ui/src/views/tasks/list/use-table.ts     |  180 +-
 seatunnel-ui/src/views/user-manage/list/index.tsx  |    2 +-
 .../src/views/user-manage/list/use-table.ts        |   33 +-
 seatunnel-ui/vite.config.ts                        |    5 +-
 .../seatunnel-spi => seatunnel-web-dist}/pom.xml   |   46 +-
 seatunnel-web-dist/release-docs/binary/LICENSE     |  334 ++++
 seatunnel-web-dist/release-docs/binary/NOTICE      |  458 +++++
 .../binary/licenses/LICENSE-Jetty-9.x.txt          |  415 ++++
 .../binary/licenses/LICENSE-aspectj.txt            |   71 +
 .../release-docs/binary/licenses/LICENSE-h2.txt    |  552 ++++++
 .../binary/licenses/LICENSE-jakarta.txt            |   71 +
 .../binary/licenses/LICENSE-javax-annotation.txt   |  263 +++
 .../release-docs/binary/licenses/LICENSE-jsoup.txt |   21 +
 .../binary/licenses/LICENSE-logback.txt            |   14 +
 .../binary/licenses/LICENSE-mapstruct.txt          |   28 +
 .../release-docs/binary/licenses/LICENSE-slf4j.txt |   23 +
 .../binary/licenses/LICENSE-spring-plugin.txt      |  216 +++
 .../binary/licenses/LICENSE-swagger-core.txt       |   11 +
 .../src/main/assembly/assembly-src.xml             |   85 +
 task.png                                           |  Bin 0 -> 110176 bytes
 tools/dependencies/checkLicense.sh                 |    2 +-
 tools/dependencies/known-dependencies.txt          |   34 +-
 125 files changed, 6086 insertions(+), 2320 deletions(-)

diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 00000000..6bca8147
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+github:
+  description: SeaTunnel is a distributed, high-performance data integration platform for the synchronization and transformation of massive data (offline & real-time).
+  homepage: https://seatunnel.apache.org/
+  labels:
+    - data-integration
+    - high-performance
+    - offline
+    - real-time
+    - data-pipeline
+    - sql-engine
+    - apache
+    - seatunnel
+    - etl-framework
+  enabled_merge_buttons:
+    squash: true
+    merge: false
+    rebase: false
+  protected_branches:
+    main:
+      required_status_checks:
+        strict: true
+      required_pull_request_reviews:
+        dismiss_stale_reviews: true
+        required_approving_review_count: 1
+
+notifications:
+  commits:      commits@seatunnel.apache.org
+  issues:       commits@seatunnel.apache.org
+  pullrequests: commits@seatunnel.apache.org
diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml
index d32e88dc..efc139b1 100644
--- a/.github/workflows/backend.yml
+++ b/.github/workflows/backend.yml
@@ -21,9 +21,7 @@ on:
   push:
   pull_request:
     paths-ignore:
-      - 'docs/**'
       - '**/*.md'
-      - 'seatunnel-ui/**'
 
 concurrency:
   group: backend-${{ github.event.pull_request.number || github.ref }}
@@ -31,7 +29,7 @@ concurrency:
 
 jobs:
   license-header:
-    if: github.repository == 'apache/incubator-seatunnel'
+    if: github.repository == 'apache/incubator-seatunnel-web'
     name: License header
     runs-on: ubuntu-latest
     timeout-minutes: 10
@@ -43,7 +41,7 @@ jobs:
         uses: apache/skywalking-eyes@985866ce7e324454f61e22eb2db2e998db09d6f3
 
   code-style:
-    if: github.repository == 'apache/incubator-seatunnel'
+    if: github.repository == 'apache/incubator-seatunnel-web'
     name: Code style
     runs-on: ubuntu-latest
     timeout-minutes: 10
@@ -55,7 +53,7 @@ jobs:
         run: ./mvnw --batch-mode --quiet --no-snapshot-updates clean checkstyle:check
 
   dead-link:
-    if: github.repository == 'apache/incubator-seatunnel'
+    if: github.repository == 'apache/incubator-seatunnel-web'
     name: Dead links
     runs-on: ubuntu-latest
     timeout-minutes: 30
@@ -68,7 +66,7 @@ jobs:
           done
 
   sanity-check:
-    if: github.repository == 'apache/incubator-seatunnel'
+    if: github.repository == 'apache/incubator-seatunnel-web'
     name: Sanity check results
     needs: [ license-header, code-style, dead-link ]
     runs-on: ubuntu-latest
@@ -81,7 +79,7 @@ jobs:
           [[ ${{ needs.dead-link.result }} == 'success' ]] || exit 1;
 
   build:
-    if: github.repository == 'apache/incubator-seatunnel'
+    if: github.repository == 'apache/incubator-seatunnel-web'
     name: Build
     needs: [ sanity-check ]
     strategy:
@@ -101,7 +99,7 @@ jobs:
           cache: 'maven'
       - name: Build distribution tar
         run: >-
-          ./mvnw -B install scalastyle:check
+          ./mvnw -B install 
           -D"maven.test.skip"=true
           -D"checkstyle.skip"=true
           -D"license.skipAddThirdParty"=true
@@ -111,7 +109,7 @@ jobs:
           -D"maven.wagon.httpconnectionManager.ttlSeconds"=120
 
   dependency-license:
-    if: github.repository == 'apache/incubator-seatunnel'
+    if: github.repository == 'apache/incubator-seatunnel-web'
     name: Dependency licenses
     needs: [ sanity-check ]
     runs-on: ubuntu-latest
@@ -130,7 +128,6 @@ jobs:
           ./mvnw -B -q install -DskipTests
           -D"maven.test.skip"=true
           -D"maven.javadoc.skip"=true
-          -D"scalastyle.skip"=true
           -D"checkstyle.skip"=true
           -D"license.skipAddThirdParty"
       - name: Check Dependencies Licenses
@@ -155,7 +152,7 @@ jobs:
           cache: 'maven'
       - name: Run Unit tests
         run: |
-          ./mvnw -B -T 1C clean verify -D"maven.test.skip"=false -D"checkstyle.skip"=true -D"scalastyle.skip"=true -D"license.skipAddThirdParty"=true --no-snapshot-updates
+          ./mvnw -B -T 1C clean verify -D"maven.test.skip"=false -D"checkstyle.skip"=true -D"license.skipAddThirdParty"=true --no-snapshot-updates
         env:
           MAVEN_OPTS: -Xmx2048m
 
@@ -178,6 +175,6 @@ jobs:
           cache: 'maven'
       - name: Run Integration tests
         run: |
-          ./mvnw -T 1C -B verify -DskipUT=true -DskipIT=false -D"checkstyle.skip"=true -D"scalastyle.skip"=true -D"license.skipAddThirdParty"=true --no-snapshot-updates
+          ./mvnw -T 1C -B verify -DskipUT=true -D"checkstyle.skip"=true -D"license.skipAddThirdParty"=true --no-snapshot-updates
         env:
           MAVEN_OPTS: -Xmx2048m
diff --git a/.gitignore b/.gitignore
index 757280ec..1197e9bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,3 +47,4 @@ Test.scala
 test.conf
 spark-warehouse
 *.flattened-pom.xml
+/seatunnel-ui/package-lock.json
diff --git a/.licenserc.yaml b/.licenserc.yaml
index 0fd78f91..ec23eba6 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -40,5 +40,6 @@ header:
     - '**/NOTICE'
     - '**/.gitkeep'
     - '**/com/typesafe/config/**'
+    - 'seatunnel-main-repository/**'
 
   comment: on-failure
diff --git a/DISCLAIMER b/DISCLAIMER
new file mode 100644
index 00000000..fac720f1
--- /dev/null
+++ b/DISCLAIMER
@@ -0,0 +1,5 @@
+Apache SeaTunnel (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator PMC.
+Incubation is required of all newly accepted projects until a further review indicates that the infrastructure,
+communications, and decision making process have stabilized in a manner consistent with other successful ASF projects.
+While incubation status is not necessarily a reflection of the completeness or stability of the code,
+it does indicate that the project has yet to be fully endorsed by the ASF.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..1b68162e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,212 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+   
+========================================================================
+Apache 2.0 licenses
+========================================================================
+
+The following components are provided under the Apache License. See project link for details.
+The text of each license is the standard Apache 2.0 license.
+
+tools/dependencies/checkLicense.sh files from https://github.com/apache/skywalking
+mvnw files from https://github.com/apache/maven-wrapper Apache 2.0
+ 
\ No newline at end of file
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 00000000..7dc3e9b5
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,18 @@
+Apache SeaTunnel (incubating)
+Copyright 2021-2022 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+-----------------------------------------------------------------------
+This product contains code form the Apache Maven Wrapper Project:
+
+Apache Maven Wrapper
+Copyright 2013-2022 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+The original idea and initial implementation of the maven-wrapper module is derived 
+from the Gradle Wrapper which was written originally by Hans Dockter and Adam Murdoch.
+Copyright 2007 the original author or authors.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..30444830
--- /dev/null
+++ b/README.md
@@ -0,0 +1,126 @@
+# Apache SeaTunnel (Incubating)
+
+<img src="https://seatunnel.apache.org/image/logo.png" alt="seatunnel logo" height="200px" align="right" />
+
+[![Backend Workflow](https://github.com/apache/incubator-seatunnel/actions/workflows/backend.yml/badge.svg?branch=dev)](https://github.com/apache/incubator-seatunnel/actions/workflows/backend.yml)
+[![Slack](https://img.shields.io/badge/slack-%23seatunnel-4f8eba?logo=slack)](https://join.slack.com/t/apacheseatunnel/shared_invite/zt-123jmewxe-RjB_DW3M3gV~xL91pZ0oVQ)
+[![Twitter Follow](https://img.shields.io/twitter/follow/ASFSeaTunnel.svg?label=Follow&logo=twitter)](https://twitter.com/ASFSeaTunnel)
+
+---
+[![EN doc](https://img.shields.io/badge/document-English-blue.svg)](README.md)
+
+SeaTunnel was formerly named Waterdrop , and renamed SeaTunnel since October 12, 2021.
+
+---
+
+So, What we are?
+
+An open-source web console to manage your seatunnel-script, and would push them to any scheduling-system easily.
+Click it if your want to know more about our design. 👉🏻[Design](https://github.com/apache/incubator-seatunnel/issues/1947)
+
+
+## How to start
+
+First, we need clone this project from Github.
+
+```shell
+git clone https://github.com/apache/incubator-seatunnel-web.git
+```
+
+Then, setup up configuration of db and more.
+```shell
+vim seatunnel-server/seatunnel-app/src/main/resources/application.yml
+```
+
+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.
+
+```yaml
+jwt:
+  expireTime: 86400
+  secretKey: https://github.com/apache/incubator-seatunnel
+  algorithm: HS256
+```
+
+
+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.
+
+### Launch it in IntelliJ IDEA
+
+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.
+
+### Start it in the command line
+
+```shell
+# start backend
+
+# for build code
+sh build.sh code
+
+# for build image
+sh build.sh image
+ 
+# and then start docker container
+docker run apache/seatunnel-web
+
+```
+
+### 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.
+
+If you want start in dev mode:
+```shell
+cd seatunnel-ui
+npm install
+npm run dev
+```
+
+### 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.
+
+Now ,let me show you how to use it.
+
+#### User manage
+
+![img.png](docs/images/user.png)
+
+#### Datapipeline manage
+
+![img.png](docs/images/datapipeline.png)
+
+#### Job manage
+![img.png](docs/images/job.png)
+
+#### Task manage
+![img.png](task.png)
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/application.yml b/build.sh
similarity index 53%
copy from seatunnel-server/seatunnel-app/src/main/resources/application.yml
copy to build.sh
index 1d05098d..d48afbf4 100644
--- a/seatunnel-server/seatunnel-app/src/main/resources/application.yml
+++ b/build.sh
@@ -1,3 +1,5 @@
+#!/bin/sh
+
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
 # contributor license agreements.  See the NOTICE file distributed with
@@ -6,7 +8,7 @@
 # (the "License"); you may not use this file except in compliance with
 # the License.  You may obtain a copy of the License at
 #
-#     http://www.apache.org/licenses/LICENSE-2.0
+#    http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,29 +17,37 @@
 # limitations under the License.
 #
 
-spring:
-  application:
-    name: seatunnel
-  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
-    username: root
-    password: 123456
-  mvc:
-    pathmatch:
-      matching-strategy: ant_path_matcher
-ds:
-  script:
-    dir: /dj
-  project:
-    default: test_dj
-  tenant:
-    default: default
-  api:
-    token: 12345678
-    prefix: http://127.0.0.1:12345/dolphinscheduler
+set -
+WORKDIR=$(
+  cd "$(dirname "$0")" || exit
+  pwd
+)
+
+DOCKER_VERSION=1.0.0-snapshot
+
+# build code
+code() {
+  /bin/sh $WORKDIR/mvnw clean package -DskipTests
+  # mv release zip
+  mv $WORKDIR/seatunnel-server/seatunnel-app/target/seatunnel-web.zip $WORKDIR/
+}
+
+# build image
+image() {
+  docker buildx build --load --no-cache -t apache/seatunnel-web:$DOCKER_VERSION -t apache/seatunnel-web:latest -f $WORKDIR/docker/backend.dockerfile .
+}
 
-jwt:
-  expireTime: 86400
-  secretKey: https://github.com/apache/incubator-seatunnel
-  algorithm: HS256
\ No newline at end of file
+# main
+case "$1" in
+"code")
+  code
+  ;;
+"image")
+  image
+  ;;
+*)
+  echo "Usage: seatunnel-daemon.sh {start|stop|status}"
+  exit 1
+  ;;
+esac
+set +
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/application.yml b/docker/backend.dockerfile
similarity index 53%
copy from seatunnel-server/seatunnel-app/src/main/resources/application.yml
copy to docker/backend.dockerfile
index 1d05098d..c4e5b31a 100644
--- a/seatunnel-server/seatunnel-app/src/main/resources/application.yml
+++ b/docker/backend.dockerfile
@@ -6,7 +6,7 @@
 # (the "License"); you may not use this file except in compliance with
 # the License.  You may obtain a copy of the License at
 #
-#     http://www.apache.org/licenses/LICENSE-2.0
+#    http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,29 +15,16 @@
 # limitations under the License.
 #
 
-spring:
-  application:
-    name: seatunnel
-  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
-    username: root
-    password: 123456
-  mvc:
-    pathmatch:
-      matching-strategy: ant_path_matcher
-ds:
-  script:
-    dir: /dj
-  project:
-    default: test_dj
-  tenant:
-    default: default
-  api:
-    token: 12345678
-    prefix: http://127.0.0.1:12345/dolphinscheduler
+FROM openjdk:8-jre-alpine
 
-jwt:
-  expireTime: 86400
-  secretKey: https://github.com/apache/incubator-seatunnel
-  algorithm: HS256
\ No newline at end of file
+ENV DOCKER true
+ENV TZ Asia/Shanghai
+ENV SEATUNNEL_WEB_HOME /opt/app/seatunnel-web
+
+WORKDIR $SEATUNNEL_WEB_HOME
+
+ADD ../seatunnel-server/seatunnel-app/target/seatunnel-web/ $SEATUNNEL_WEB_HOME/
+
+EXPOSE 8080
+
+CMD [ "/bin/sh", "/opt/app/seatunnel-web/bin/seatunnel-backend-daemon.sh", "start" ]
\ No newline at end of file
diff --git a/docs/images/datapipeline.png b/docs/images/datapipeline.png
new file mode 100644
index 00000000..052b8b9b
Binary files /dev/null and b/docs/images/datapipeline.png differ
diff --git a/docs/images/job.png b/docs/images/job.png
new file mode 100644
index 00000000..bc857f2b
Binary files /dev/null and b/docs/images/job.png differ
diff --git a/docs/images/user.png b/docs/images/user.png
new file mode 100644
index 00000000..fd694e41
Binary files /dev/null and b/docs/images/user.png differ
diff --git a/pom.xml b/pom.xml
index df66f424..e5195ce0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -78,32 +78,50 @@
     <properties>
         <maven.compiler.source>${java.version}</maven.compiler.source>
         <maven.compiler.target>${java.version}</maven.compiler.target>
-        <lombok.version>1.18.0</lombok.version>
-        <commons.logging.version>1.2</commons.logging.version>
-        <slf4j.version>1.7.25</slf4j.version>
-        <jackson.version>2.12.6</jackson.version>
-        <mysql.version>8.0.16</mysql.version>
-        <junit.version>5.9.0</junit.version>
-        <commons-collections4.version>4.4</commons-collections4.version>
-        <commons-lang3.version>3.4</commons-lang3.version>
-        <guava.version>19.0</guava.version>
+        <java.version>1.8</java.version>
+
+        <!-- plugin -->
         <maven.deploy.skip>false</maven.deploy.skip>
         <maven.javadoc.skip>false</maven.javadoc.skip>
+        <maven-source-plugin.version>3.0.1</maven-source-plugin.version>
         <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
         <maven-failsafe-plugin.version>2.22.2</maven-failsafe-plugin.version>
+        <maven-javadoc-plugin.version>2.9.1</maven-javadoc-plugin.version>
         <maven-checkstyle-plugin.version>3.1.2</maven-checkstyle-plugin.version>
         <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
+        <maven-assembly-plugin.version>3.3.0</maven-assembly-plugin.version>
+        <maven-helper-plugin.version>3.2.0</maven-helper-plugin.version>
         <maven-pmd-plugin.version>3.8</maven-pmd-plugin.version>
         <maven-license-maven-plugin>1.20</maven-license-maven-plugin>
-        <checkstyle.fails.on.error>true</checkstyle.fails.on.error>
-
         <maven-scm-provider-jgit.version>1.9.5</maven-scm-provider-jgit.version>
-
+        <exec-maven-plugin.version>3.1.0</exec-maven-plugin.version>
+        <checkstyle.fails.on.error>true</checkstyle.fails.on.error>
+        <lombok.version>1.18.0</lombok.version>
         <skipUT>false</skipUT>
+
+        <!-- dependency -->
+        <seatunnel-common.version>2.1.3</seatunnel-common.version>
+        <commons.logging.version>1.2</commons.logging.version>
+        <slf4j.version>1.7.25</slf4j.version>
+        <jackson.version>2.12.7.1</jackson.version>
+        <mysql.version>8.0.16</mysql.version>
+        <h2.version>2.1.214</h2.version>
+        <junit.version>5.9.0</junit.version>
+        <commons-collections4.version>4.4</commons-collections4.version>
+        <commons-lang3.version>3.4</commons-lang3.version>
+        <guava.version>19.0</guava.version>
+        <checker.qual.version>3.10.0</checker.qual.version>
+        <log4j-core.version>2.17.1</log4j-core.version>
+        <awaitility.version>4.2.0</awaitility.version>
     </properties>
 
     <dependencyManagement>
         <dependencies>
+            <dependency>
+                <groupId>org.apache.seatunnel</groupId>
+                <artifactId>seatunnel-common</artifactId>
+                <version>${seatunnel-common.version}</version>
+            </dependency>
 
             <dependency>
                 <groupId>org.projectlombok</groupId>
@@ -129,7 +147,6 @@
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
-            
 
             <dependency>
                 <groupId>com.fasterxml.jackson.core</groupId>
@@ -186,11 +203,6 @@
             <artifactId>slf4j-api</artifactId>
             <version>${slf4j.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-            <version>${slf4j.version}</version>
-        </dependency>
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-engine</artifactId>
diff --git a/seatunnel-server/pom.xml b/seatunnel-server/pom.xml
index 17f65461..79ef3a31 100644
--- a/seatunnel-server/pom.xml
+++ b/seatunnel-server/pom.xml
@@ -35,7 +35,7 @@
     <properties>
         <spring-boot.version>2.6.8</spring-boot.version>
         <spring.version>5.3.20</spring.version>
-        <mybatis-spring-boot-starter.version>2.2.2</mybatis-spring-boot-starter.version>
+        <mybatis-plus-boot-starter.version>3.5.3.1</mybatis-plus-boot-starter.version>
         <druid-spring-boot-starter.version>1.2.9</druid-spring-boot-starter.version>
         <springfox-swagger.version>2.6.1</springfox-swagger.version>
         <swagger-annotations.version>1.5.10</swagger-annotations.version>
@@ -64,6 +64,11 @@
                 <artifactId>spring-boot-starter-aop</artifactId>
                 <version>${spring-boot.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-jdbc</artifactId>
+                <version>${spring-boot.version}</version>
+            </dependency>
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>druid-spring-boot-starter</artifactId>
@@ -72,9 +77,19 @@
 
             <!-- ORM -->
             <dependency>
-                <groupId>org.mybatis.spring.boot</groupId>
-                <artifactId>mybatis-spring-boot-starter</artifactId>
-                <version>${mybatis-spring-boot-starter.version}</version>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus-boot-starter.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.springframework.boot</groupId>
+                        <artifactId>spring-boot-starter-jdbc</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <artifactId>spring-boot-autoconfigure</artifactId>
+                        <groupId>org.springframework.boot</groupId>
+                    </exclusion>
+                </exclusions>
             </dependency>
             <dependency>
                 <groupId>org.hibernate.validator</groupId>
@@ -127,16 +142,4 @@
         </dependencies>
     </dependencyManagement>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
 </project>
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-app/pom.xml b/seatunnel-server/seatunnel-app/pom.xml
index a268091c..aef91185 100644
--- a/seatunnel-server/seatunnel-app/pom.xml
+++ b/seatunnel-server/seatunnel-app/pom.xml
@@ -25,11 +25,15 @@
 
     <artifactId>seatunnel-app</artifactId>
 
+    <properties>
+        <java.version>1.8</java.version>
+        <frontend.project.name>seatunnel-ui</frontend.project.name>
+    </properties>
+
     <dependencies>
         <dependency>
             <groupId>org.apache.seatunnel</groupId>
             <artifactId>seatunnel-common</artifactId>
-            <version>2.1.3</version>
         </dependency>
         <!--springboot-->
         <dependency>
@@ -63,27 +67,13 @@
         </dependency>
 
         <dependency>
-            <groupId>org.mybatis.spring.boot</groupId>
-            <artifactId>mybatis-spring-boot-starter</artifactId>
-            <version>${mybatis-spring-boot-starter.version}</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>spring-beans</artifactId>
-                    <groupId>org.springframework</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>spring-boot-autoconfigure</artifactId>
-                    <groupId>org.springframework.boot</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>spring-core</artifactId>
-                    <groupId>org.springframework</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>spring-boot-starter</artifactId>
-                    <groupId>org.springframework.boot</groupId>
-                </exclusion>
-            </exclusions>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
         </dependency>
 
         <dependency>
@@ -141,16 +131,34 @@
             <scope>provided</scope>
         </dependency>
 
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>${h2.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.seatunnel</groupId>
             <artifactId>seatunnel-spi</artifactId>
             <version>${project.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-log4j12</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
             <groupId>org.apache.seatunnel</groupId>
             <artifactId>seatunnel-scheduler-dolphinscheduler</artifactId>
             <version>${project.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-log4j12</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
@@ -189,21 +197,72 @@
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
+                <artifactId>maven-jar-plugin</artifactId>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                    <excludes>
+                        <exclude>*.yml</exclude>
+                        <exclude>*.yaml</exclude>
+                        <exclude>*.xml</exclude>
+                    </excludes>
                 </configuration>
             </plugin>
+
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.11.3</version>
+                <configuration>
+                    <workingDirectory>${project.basedir}/../../${frontend.project.name}</workingDirectory>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>install node and npm</id>
+                        <goals>
+                            <goal>install-node-and-npm</goal>
+                        </goals>
+                        <configuration>
+                            <nodeVersion>v16.16.0</nodeVersion>
+                            <npmVersion>8.19.2</npmVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>install</id>
+                        <goals>
+                            <goal>npm</goal>
+                        </goals>
+                        <phase>generate-resources</phase>
+                        <configuration>
+                            <arguments>install --ignore-scripts</arguments>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>build</id>
+                        <goals>
+                            <goal>npm</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build:prod</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
             <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>${spring-boot.version}</version>
+                <artifactId>maven-assembly-plugin</artifactId>
                 <executions>
                     <execution>
+                        <id>seatunnel-web</id>
                         <goals>
-                            <goal>repackage</goal>
+                            <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>
diff --git a/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml b/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml
new file mode 100644
index 00000000..0d1f4935
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/assembly/seatunnel-web.xml
@@ -0,0 +1,58 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
+    <id>seatunnel-web</id>
+    <formats>
+        <format>dir</format>
+        <format>zip</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <baseDirectory>seatunnel-web</baseDirectory>
+    <fileSets>
+        <fileSet>
+            <directory>${basedir}/src/main/resources</directory>
+            <includes>
+                <include>*.yml</include>
+                <include>*.yaml</include>
+                <include>*.xml</include>
+            </includes>
+            <outputDirectory>conf</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>${basedir}/src/main/bin</directory>
+            <includes>
+                <include>*.sh</include>
+            </includes>
+            <outputDirectory>bin</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>${basedir}/../../seatunnel-ui/dist</directory>
+            <includes>
+                <include>*</include>
+            </includes>
+            <outputDirectory>dist</outputDirectory>
+        </fileSet>
+    </fileSets>
+    <dependencySets>
+        <dependencySet>
+            <outputDirectory>libs</outputDirectory>
+        </dependencySet>
+    </dependencySets>
+</assembly>
diff --git a/seatunnel-server/seatunnel-app/src/main/bin/seatunnel-backend-daemon.sh b/seatunnel-server/seatunnel-app/src/main/bin/seatunnel-backend-daemon.sh
new file mode 100644
index 00000000..285f39cd
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/bin/seatunnel-backend-daemon.sh
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+set -
+# usage: seatunnel-backend-daemon.sh <start|stop|status>
+
+WORKDIR=$(cd "$(dirname "$0")" || exit; pwd)
+
+# start
+start() {
+  echo "starting seatunnel..."
+
+  JAVA_OPTS="${JAVA_OPTS} -server -Xms1g -Xmx1g -Xmn512m -XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof"
+  SPRING_OPTS="${SPRING_OPTS} -Dspring.config.name=application.yml -Dspring.config.location=classpath:application.yml"
+
+  # check env JAVA_HOME
+  if [ -z "$JAVA_HOME" ]; then
+    echo "JAVA_HOME is not set"
+    exit 1
+  fi
+
+  echo "$WORKDIR"
+  $JAVA_HOME/bin/java $JAVA_OPTS \
+  -cp "$WORKDIR/../conf":"$WORKDIR/../libs/*" \
+  $SPRING_OPTS \
+  org.apache.seatunnel.app.SeatunnelApplication
+  echo "seatunnel started"
+}
+# stop
+stop() {
+  echo "stopping seatunnel..."
+  pid=$(jcmd | grep -i 'seatunnel-app-.*jar' | grep -v grep | awk '{print $1}')
+  if [ -n "$pid" ]; then
+    kill -15 $pid
+    echo "seatunnel stopped"
+  else
+    echo "seatunnel is not running"
+  fi
+}
+
+#status
+status() {
+  pid=$(jcmd | grep -i 'seatunnel-app-.*jar' | grep -v grep | awk '{print $1}')
+  if [ -n "$pid" ]; then
+    echo "seatunnel is running"
+  else
+    echo "seatunnel is not running"
+  fi
+}
+
+# main
+case "$1" in
+"start")
+  start
+  ;;
+"stop")
+  stop
+  ;;
+"status")
+  status
+  ;;
+*)
+  echo "Usage: seatunnel-daemon.sh {start|stop|status}"
+  exit 1
+esac
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/aspect/LoginAspect.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/aspect/LoginAspect.java
deleted file mode 100644
index 5788c52c..00000000
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/aspect/LoginAspect.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.seatunnel.app.aspect;
-
-import static org.apache.seatunnel.server.common.Constants.TOKEN;
-
-import org.apache.seatunnel.app.common.Result;
-import org.apache.seatunnel.app.common.UserTokenStatusEnum;
-import org.apache.seatunnel.app.dal.dao.IUserDao;
-import org.apache.seatunnel.app.domain.dto.user.UserLoginLogDto;
-import org.apache.seatunnel.app.domain.response.user.UserSimpleInfoRes;
-import org.apache.seatunnel.app.security.JwtUtils;
-
-import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.JoinPoint;
-import org.aspectj.lang.annotation.AfterReturning;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-
-@Slf4j
-@Aspect
-@Component
-@Order(2)
-public class LoginAspect {
-    @Resource
-    private JwtUtils jwtUtils;
-
-    @Resource
-    private IUserDao userDaoImpl;
-
-    @Pointcut("execution(public * org.apache.seatunnel.app.controller.UserController.login(..))")
-    public void loginPointCut() {
-
-    }
-
-    @AfterReturning(value = "loginPointCut()", returning = "obj")
-    public void check(JoinPoint pjp, Object obj) {
-        final Result<UserSimpleInfoRes> target = (Result<UserSimpleInfoRes>) obj;
-        final UserSimpleInfoRes data = target.getData();
-
-        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-        final HttpServletResponse response = attributes.getResponse();
-        final String token = jwtUtils.genToken(data.toMap());
-        response.setHeader(TOKEN, token);
-
-        data.setToken(token);
-
-        final UserLoginLogDto logDto = UserLoginLogDto.builder()
-                .token(token)
-                .tokenStatus(UserTokenStatusEnum.ENABLE.enable())
-                .userId(data.getId())
-                .build();
-        userDaoImpl.insertLoginLog(logDto);
-    }
-}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
index 17704a21..0a4144e0 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
@@ -31,6 +31,18 @@ public enum ScriptStatusEnum {
         this.description = description;
     }
 
+    public static String parse(Byte status) {
+        if (status == null) {
+            throw new IllegalArgumentException("status is null");
+        }
+        for (ScriptStatusEnum scriptStatusEnum : ScriptStatusEnum.values()) {
+            if (scriptStatusEnum.getCode() == status) {
+                return scriptStatusEnum.getDescription();
+            }
+        }
+        throw new IllegalArgumentException("status is illegal");
+    }
+
     public int getCode() {
         return code;
     }
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 3f720be8..fa83416f 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
@@ -41,8 +41,8 @@ public class AuthController {
     @GetMapping("/userRole")
     @ApiOperation(value = "check relation between user and role", httpMethod = "GET")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "username", value = "user name", dataType = "String"),
-            @ApiImplicitParam(name = "roleName", value = "role name", dataType = "String"),
+        @ApiImplicitParam(name = "username", value = "user name", dataType = "String"),
+        @ApiImplicitParam(name = "roleName", value = "role name", dataType = "String"),
     })
     public Result<Boolean> userRole(@RequestParam("username") @NotNull String username, @RequestParam("roleName") @NotNull String roleName){
         final boolean b = roleServiceImpl.checkUserRole(username, roleName);
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 16574f07..ff094d43 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
@@ -19,13 +19,14 @@ package org.apache.seatunnel.app.controller;
 
 import org.apache.seatunnel.app.aspect.UserId;
 import org.apache.seatunnel.app.common.Result;
-import org.apache.seatunnel.app.domain.request.script.AddEmptyScriptReq;
+import org.apache.seatunnel.app.domain.request.script.CreateScriptReq;
 import org.apache.seatunnel.app.domain.request.script.PublishScriptReq;
 import org.apache.seatunnel.app.domain.request.script.ScriptListReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptContentReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptParamReq;
 import org.apache.seatunnel.app.domain.response.PageInfo;
-import org.apache.seatunnel.app.domain.response.script.AddEmptyScriptRes;
+import org.apache.seatunnel.app.domain.response.script.CreateScriptRes;
+import org.apache.seatunnel.app.domain.response.script.ScriptFullInfoRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptParamRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptSimpleInfoRes;
 import org.apache.seatunnel.app.service.IScriptService;
@@ -56,21 +57,19 @@ public class ScriptController {
     private IScriptService iScriptService;
 
     @PostMapping
-    @ApiOperation(value = "add an empty script", httpMethod = "POST")
-    public Result<AddEmptyScriptRes> addEmptyScript(@RequestBody @NotNull AddEmptyScriptReq addEmptyScriptReq,
-                                                    @ApiIgnore @UserId Integer operatorId) {
-        addEmptyScriptReq.setCreatorId(operatorId);
-        return Result.success(iScriptService.addEmptyScript(addEmptyScriptReq));
+    @ApiOperation(value = "add an script with content", httpMethod = "POST")
+    public Result<CreateScriptRes> createScript(@RequestBody @NotNull CreateScriptReq createScriptReq,
+                                                  @ApiIgnore @UserId Integer operatorId) {
+        createScriptReq.setCreatorId(operatorId);
+        return Result.success(iScriptService.createScript(createScriptReq));
     }
 
     @PutMapping("/{scriptId}/content")
     @ApiOperation(value = "update script", httpMethod = "PUT")
     public Result<Void> updateScriptContent(@ApiParam(value = "script id", required = true) @PathVariable(value = "scriptId") Integer scriptId,
-                                            @RequestBody @NotNull String content,
+                                            @RequestBody @NotNull UpdateScriptContentReq req,
                                             @ApiIgnore @UserId Integer operatorId) {
-        final UpdateScriptContentReq req = new UpdateScriptContentReq();
         req.setScriptId(scriptId);
-        req.setContent(content);
         req.setMenderId(operatorId);
 
         iScriptService.updateScriptContent(req);
@@ -93,7 +92,6 @@ public class ScriptController {
 
         final ScriptListReq req = new ScriptListReq();
         req.setName(name);
-        req.setStatus(status);
         req.setPageNo(pageNo);
         req.setPageSize(pageSize);
 
@@ -106,6 +104,11 @@ public class ScriptController {
         return Result.success(iScriptService.fetchScriptContent(scriptId));
     }
 
+    @GetMapping("/{scriptId}")
+    public Result<ScriptFullInfoRes> detail(@ApiParam(value = "script id", required = true) @PathVariable(value = "scriptId") Integer scriptId) {
+        return Result.success(iScriptService.detail(scriptId));
+    }
+
     @PutMapping("/{scriptId}/param")
     @ApiOperation(value = "update script param", httpMethod = "PUT")
     public Result<Void> updateScriptParam(@ApiParam(value = "script id", required = true) @PathVariable(value = "scriptId") Integer scriptId,
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 8657a045..43f141d7 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
@@ -78,7 +78,7 @@ public class TaskController {
 
     @GetMapping("/instance")
     @ApiOperation(value = "list instance", httpMethod = "GET")
-    Result<PageInfo<InstanceSimpleInfoRes>> listInstance(@ApiParam(value = "job name") @RequestParam(required = false) String name,
+    Result<PageInfo<InstanceSimpleInfoRes>> listInstance(@ApiParam(value = "job name", required = false) @RequestParam(required = false) String name,
                                                          @ApiParam(value = "page num", required = true) @RequestParam Integer pageNo,
                                                          @ApiParam(value = "page size", required = true) @RequestParam Integer pageSize) {
         final InstanceListReq req = new InstanceListReq();
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptDao.java
index 0178b58b..d01114f8 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptDao.java
@@ -18,8 +18,8 @@
 package org.apache.seatunnel.app.dal.dao;
 
 import org.apache.seatunnel.app.dal.entity.Script;
-import org.apache.seatunnel.app.domain.dto.script.AddEmptyScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.CheckScriptDuplicateDto;
+import org.apache.seatunnel.app.domain.dto.script.CreateScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.ListScriptsDto;
 import org.apache.seatunnel.app.domain.dto.script.UpdateScriptContentDto;
 import org.apache.seatunnel.server.common.PageData;
@@ -27,7 +27,7 @@ import org.apache.seatunnel.server.common.PageData;
 public interface IScriptDao {
     void checkScriptDuplicate(CheckScriptDuplicateDto dto);
 
-    int addEmptyScript(AddEmptyScriptDto dto);
+    int createScript(CreateScriptDto dto);
 
     Script getScript(Integer id);
 
@@ -36,4 +36,6 @@ public interface IScriptDao {
     void deleteScript(int id);
 
     PageData<Script> list(ListScriptsDto dto, Integer pageNo, Integer pageSize);
+
+    void updateStatus(Script script);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptDaoImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptDaoImpl.java
index 0f2c7357..7f18048d 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptDaoImpl.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptDaoImpl.java
@@ -24,8 +24,8 @@ import org.apache.seatunnel.app.common.ScriptStatusEnum;
 import org.apache.seatunnel.app.dal.dao.IScriptDao;
 import org.apache.seatunnel.app.dal.entity.Script;
 import org.apache.seatunnel.app.dal.mapper.ScriptMapper;
-import org.apache.seatunnel.app.domain.dto.script.AddEmptyScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.CheckScriptDuplicateDto;
+import org.apache.seatunnel.app.domain.dto.script.CreateScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.ListScriptsDto;
 import org.apache.seatunnel.app.domain.dto.script.UpdateScriptContentDto;
 import org.apache.seatunnel.server.common.PageData;
@@ -50,13 +50,14 @@ public class ScriptDaoImpl implements IScriptDao {
     }
 
     @Override
-    public int addEmptyScript(AddEmptyScriptDto dto) {
+    public int createScript(CreateScriptDto dto) {
         final Script script = new Script();
         script.setName(dto.getName());
         script.setType(dto.getType());
         script.setStatus(dto.getStatus());
         script.setCreatorId(dto.getCreatorId());
         script.setMenderId(dto.getMenderId());
+        script.setContent(dto.getContent());
         scriptMapper.insert(script);
         return script.getId();
     }
@@ -80,11 +81,15 @@ public class ScriptDaoImpl implements IScriptDao {
     public PageData<Script> list(ListScriptsDto dto, Integer pageNo, Integer pageSize) {
         final Script script = new Script();
         script.setName(dto.getName());
-        script.setStatus(dto.getStatus());
 
         final List<Script> scripts = scriptMapper.selectBySelectiveAndPage(script, pageNo * pageSize, pageSize);
         int count = scriptMapper.countBySelectiveAndPage(script);
 
         return new PageData<Script>(count, scripts);
     }
+
+    @Override
+    public void updateStatus(Script script) {
+        scriptMapper.updateStatus(script.getId(), script.getStatus());
+    }
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/AddEmptyScriptDto.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/CreateScriptDto.java
similarity index 94%
rename from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/AddEmptyScriptDto.java
rename to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/CreateScriptDto.java
index f2245c4a..35121c5b 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/AddEmptyScriptDto.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/CreateScriptDto.java
@@ -22,10 +22,11 @@ import lombok.Data;
 
 @Builder
 @Data
-public class AddEmptyScriptDto {
+public class CreateScriptDto {
     private String name;
     private byte type;
     private int creatorId;
     private int menderId;
     private byte status;
+    private String content;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/AddEmptyScriptReq.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/CreateScriptReq.java
similarity index 91%
rename from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/AddEmptyScriptReq.java
rename to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/CreateScriptReq.java
index 4bd650d6..a5511321 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/AddEmptyScriptReq.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/CreateScriptReq.java
@@ -25,7 +25,7 @@ import javax.validation.constraints.NotNull;
 
 @Data
 @ApiModel(value = "addEmptyScriptReq", description = "add a new empty script")
-public class AddEmptyScriptReq {
+public class CreateScriptReq {
     @ApiModelProperty(value = "script name", required = true, dataType = "String")
     private String name;
     @ApiModelProperty(value = "script type", required = true, dataType = "Byte")
@@ -34,4 +34,6 @@ public class AddEmptyScriptReq {
     @ApiModelProperty(value = "script creator id", required = true, dataType = "Integer", hidden = true)
     @NotNull
     private Integer creatorId;
+    @ApiModelProperty(value = "script content", required = true, dataType = "String")
+    private String content;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/ScriptListReq.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/ScriptListReq.java
index 3ac64ba1..30cf4eb7 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/ScriptListReq.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/ScriptListReq.java
@@ -28,6 +28,4 @@ import lombok.Data;
 public class ScriptListReq extends BasePageReq {
     @ApiModelProperty(value = "script name", required = false, dataType = "String")
     private String name;
-    @ApiModelProperty(value = "script status", required = false, dataType = "Integer")
-    private Byte status;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/BaseScriptInfoRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/BaseScriptInfoRes.java
index 43580582..d8c5032a 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/BaseScriptInfoRes.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/BaseScriptInfoRes.java
@@ -28,8 +28,8 @@ public class BaseScriptInfoRes {
     private int id;
     @ApiModelProperty(value = "script name", dataType = "String")
     private String name;
-    @ApiModelProperty(value = "script status", dataType = "type")
-    private byte status;
+    @ApiModelProperty(value = "script status", dataType = "String")
+    private String status;
     @ApiModelProperty(value = "script type", dataType = "type")
     private byte type;
     @ApiModelProperty(value = "script creator id", required = true, dataType = "Integer")
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/CreateScriptRes.java
similarity index 96%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/CreateScriptRes.java
index 1037f9f8..9874abfd 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/CreateScriptRes.java
@@ -20,6 +20,6 @@ package org.apache.seatunnel.app.domain.response.script;
 import lombok.Data;
 
 @Data
-public class AddEmptyScriptRes {
+public class CreateScriptRes {
     private int id;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/ScriptFullInfoRes.java
similarity index 73%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/ScriptFullInfoRes.java
index 1037f9f8..5253da02 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/ScriptFullInfoRes.java
@@ -17,9 +17,13 @@
 
 package org.apache.seatunnel.app.domain.response.script;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
-public class AddEmptyScriptRes {
-    private int id;
+@ApiModel(value = "scriptFullInfoRes", description = "script full info")
+public class ScriptFullInfoRes extends BaseScriptInfoRes{
+    @ApiModelProperty(value = "script content", dataType = "String")
+    private String content;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/BaseUserInfoRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/BaseUserInfoRes.java
index a50a2cea..f59ddae0 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/BaseUserInfoRes.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/BaseUserInfoRes.java
@@ -28,6 +28,8 @@ public class BaseUserInfoRes {
     private int id;
     @ApiModelProperty(value = "user name", dataType = "String")
     private String name;
+    @ApiModelProperty(value = "user token", dataType = "String")
+    private String token;
     @ApiModelProperty(value = "user status", dataType = "type")
     private byte status;
     @ApiModelProperty(value = "user type", dataType = "type")
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IScriptService.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IScriptService.java
index 4e9a9ebb..ad061cbe 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IScriptService.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IScriptService.java
@@ -17,20 +17,21 @@
 
 package org.apache.seatunnel.app.service;
 
-import org.apache.seatunnel.app.domain.request.script.AddEmptyScriptReq;
+import org.apache.seatunnel.app.domain.request.script.CreateScriptReq;
 import org.apache.seatunnel.app.domain.request.script.PublishScriptReq;
 import org.apache.seatunnel.app.domain.request.script.ScriptListReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptContentReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptParamReq;
 import org.apache.seatunnel.app.domain.response.PageInfo;
-import org.apache.seatunnel.app.domain.response.script.AddEmptyScriptRes;
+import org.apache.seatunnel.app.domain.response.script.CreateScriptRes;
+import org.apache.seatunnel.app.domain.response.script.ScriptFullInfoRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptParamRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptSimpleInfoRes;
 
 import java.util.List;
 
 public interface IScriptService {
-    AddEmptyScriptRes addEmptyScript(AddEmptyScriptReq addEmptyScriptReq);
+    CreateScriptRes createScript(CreateScriptReq createScriptReq);
 
     void updateScriptContent(UpdateScriptContentReq updateScriptContentReq);
 
@@ -45,4 +46,6 @@ public interface IScriptService {
     void updateScriptParam(UpdateScriptParamReq updateScriptParamReq);
 
     void publishScript(PublishScriptReq req);
+
+    ScriptFullInfoRes detail(Integer scriptId);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/ScriptServiceImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/ScriptServiceImpl.java
index 6d654c97..e0c274ad 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/ScriptServiceImpl.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/ScriptServiceImpl.java
@@ -28,18 +28,19 @@ import org.apache.seatunnel.app.dal.dao.IUserDao;
 import org.apache.seatunnel.app.dal.entity.Script;
 import org.apache.seatunnel.app.dal.entity.ScriptParam;
 import org.apache.seatunnel.app.domain.dto.job.PushScriptDto;
-import org.apache.seatunnel.app.domain.dto.script.AddEmptyScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.CheckScriptDuplicateDto;
+import org.apache.seatunnel.app.domain.dto.script.CreateScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.ListScriptsDto;
 import org.apache.seatunnel.app.domain.dto.script.UpdateScriptContentDto;
 import org.apache.seatunnel.app.domain.dto.script.UpdateScriptParamDto;
-import org.apache.seatunnel.app.domain.request.script.AddEmptyScriptReq;
+import org.apache.seatunnel.app.domain.request.script.CreateScriptReq;
 import org.apache.seatunnel.app.domain.request.script.PublishScriptReq;
 import org.apache.seatunnel.app.domain.request.script.ScriptListReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptContentReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptParamReq;
 import org.apache.seatunnel.app.domain.response.PageInfo;
-import org.apache.seatunnel.app.domain.response.script.AddEmptyScriptRes;
+import org.apache.seatunnel.app.domain.response.script.CreateScriptRes;
+import org.apache.seatunnel.app.domain.response.script.ScriptFullInfoRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptParamRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptSimpleInfoRes;
 import org.apache.seatunnel.app.service.IScriptService;
@@ -79,26 +80,27 @@ public class ScriptServiceImpl implements IScriptService {
     private ITaskService iTaskService;
 
     @Override
-    public AddEmptyScriptRes addEmptyScript(AddEmptyScriptReq addEmptyScriptReq) {
+    public CreateScriptRes createScript(CreateScriptReq createScriptReq) {
         // 1. check script name.
-        checkDuplicate(addEmptyScriptReq.getName(), addEmptyScriptReq.getCreatorId());
-        // 2. create an empty script
-        int scriptId = addEmptyScript(addEmptyScriptReq.getName(), addEmptyScriptReq.getCreatorId(), addEmptyScriptReq.getCreatorId(), addEmptyScriptReq.getType());
+        checkDuplicate(createScriptReq.getName(), createScriptReq.getCreatorId());
+        // 2. create  script
+        int scriptId = translate(createScriptReq.getName(), createScriptReq.getCreatorId(), createScriptReq.getCreatorId(), createScriptReq.getType(), createScriptReq.getContent());
 
-        final AddEmptyScriptRes res = new AddEmptyScriptRes();
+        final CreateScriptRes res = new CreateScriptRes();
         res.setId(scriptId);
         return res;
     }
 
-    private int addEmptyScript(String name, Integer creatorId, Integer menderId, Byte type) {
-        final AddEmptyScriptDto dto = AddEmptyScriptDto.builder()
+    private int translate(String name, Integer creatorId, Integer menderId, Byte type, String content) {
+        final CreateScriptDto dto = CreateScriptDto.builder()
                 .name(name)
                 .menderId(creatorId)
                 .creatorId(menderId)
                 .type(type)
                 .status((byte) ScriptStatusEnum.UNPUBLISHED.getCode())
+                .content(content)
                 .build();
-        return scriptDaoImpl.addEmptyScript(dto);
+        return scriptDaoImpl.createScript(dto);
     }
 
     private void checkDuplicate(String name, Integer creatorId) {
@@ -118,7 +120,7 @@ public class ScriptServiceImpl implements IScriptService {
 
         final boolean needSave = checkIfNeedSave(updateScriptContentReq.getScriptId(), contentMd5);
 
-        if (needSave){
+        if (needSave) {
             final UpdateScriptContentDto dto = UpdateScriptContentDto.builder()
                     .id(updateScriptContentReq.getScriptId())
                     .content(content)
@@ -149,7 +151,6 @@ public class ScriptServiceImpl implements IScriptService {
 
         final ListScriptsDto dto = ListScriptsDto.builder()
                 .name(scriptListReq.getName())
-                .status(scriptListReq.getStatus())
                 .build();
 
         PageData<Script> scriptPageData = scriptDaoImpl.list(dto, scriptListReq.getRealPageNo(), scriptListReq.getPageSize());
@@ -173,7 +174,7 @@ public class ScriptServiceImpl implements IScriptService {
     @Override
     public List<ScriptParamRes> fetchScriptParam(Integer id) {
         List<ScriptParam> scriptParamRes = scriptParamDaoImpl.getParamsByScriptId(id);
-        if (CollectionUtils.isEmpty(scriptParamRes)){
+        if (CollectionUtils.isEmpty(scriptParamRes)) {
             return Collections.emptyList();
         }
         return scriptParamRes.stream().map(this::translate).collect(Collectors.toList());
@@ -195,7 +196,7 @@ public class ScriptServiceImpl implements IScriptService {
     }
 
     @Override
-    public void publishScript(PublishScriptReq req){
+    public void publishScript(PublishScriptReq req) {
         final PushScriptDto dto = PushScriptDto.builder()
                 .scriptId(req.getScriptId())
                 .userId(req.getOperatorId())
@@ -203,6 +204,14 @@ public class ScriptServiceImpl implements IScriptService {
         iTaskService.pushScriptToScheduler(dto);
     }
 
+    @Override
+    public ScriptFullInfoRes detail(Integer scriptId) {
+        final Script script = scriptDaoImpl.getScript(scriptId);
+
+        checkState(Objects.nonNull(script), NO_SUCH_SCRIPT.getTemplate());
+        return translateToFull(script);
+    }
+
     private ScriptParamRes translate(ScriptParam scriptParam) {
         final ScriptParamRes res = new ScriptParamRes();
         res.setId(scriptParam.getId());
@@ -215,12 +224,26 @@ public class ScriptServiceImpl implements IScriptService {
         final ScriptSimpleInfoRes res = new ScriptSimpleInfoRes();
         res.setId(script.getId());
         res.setName(script.getName());
-        res.setStatus(script.getStatus());
+        res.setStatus(ScriptStatusEnum.parse(script.getStatus()));
+        res.setType(script.getType());
+        res.setCreatorId(script.getCreatorId());
+        res.setMenderId(script.getMenderId());
+        res.setCreateTime(script.getCreateTime());
+        res.setUpdateTime(script.getUpdateTime());
+        return res;
+    }
+
+    private ScriptFullInfoRes translateToFull(Script script) {
+        final ScriptFullInfoRes res = new ScriptFullInfoRes();
+        res.setId(script.getId());
+        res.setName(script.getName());
+        res.setStatus(ScriptStatusEnum.parse(script.getStatus()));
         res.setType(script.getType());
         res.setCreatorId(script.getCreatorId());
         res.setMenderId(script.getMenderId());
         res.setCreateTime(script.getCreateTime());
         res.setUpdateTime(script.getUpdateTime());
+        res.setContent(script.getContent());
         return res;
     }
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/TaskServiceImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/TaskServiceImpl.java
index 3c87a8af..04c88f41 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/TaskServiceImpl.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/TaskServiceImpl.java
@@ -29,11 +29,10 @@ import static org.apache.seatunnel.spi.scheduler.constants.SchedulerConstant.NEV
 import static org.apache.seatunnel.spi.scheduler.constants.SchedulerConstant.RETRY_INTERVAL_DEFAULT;
 import static org.apache.seatunnel.spi.scheduler.constants.SchedulerConstant.RETRY_TIMES_DEFAULT;
 import static com.cronutils.model.CronType.QUARTZ;
-import static java.util.Objects.isNull;
-import static java.util.Objects.nonNull;
 import static java.util.Objects.requireNonNull;
 
 import org.apache.seatunnel.app.common.ObjectTypeEnum;
+import org.apache.seatunnel.app.common.ScriptStatusEnum;
 import org.apache.seatunnel.app.dal.dao.ISchedulerConfigDao;
 import org.apache.seatunnel.app.dal.dao.IScriptDao;
 import org.apache.seatunnel.app.dal.dao.IScriptJobApplyDao;
@@ -84,6 +83,7 @@ import java.time.ZonedDateTime;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
@@ -119,7 +119,7 @@ public class TaskServiceImpl implements ITaskService {
     public void initFuncMap(){
         executeFuncMap.put(SCRIPT, this::getExecuteDtoByScriptId);
         executeFuncMap.put(JOB, this::getExecuteDtoByJobId);
-        executeFuncMap.put(INSTANCE, null);
+        executeFuncMap.put(INSTANCE, this::getExecuteDtoByInstanceId);
     }
 
     @Override
@@ -129,7 +129,7 @@ public class TaskServiceImpl implements ITaskService {
 
         // check scheduler param
         SchedulerConfig config = schedulerConfigDaoImpl.getSchedulerConfig(scriptId);
-        if (isNull(config)) {
+        if (Objects.isNull(config)) {
             throw new SeatunnelException(SCHEDULER_CONFIG_NOT_EXIST);
         }
 
@@ -157,7 +157,7 @@ public class TaskServiceImpl implements ITaskService {
                 .build();
 
         ScriptJobApply apply = scriptJobApplyDaoImpl.getByScriptId(script.getId());
-        if (nonNull(apply)) {
+        if (Objects.nonNull(apply)) {
             jobDto.setJobId(apply.getJobId());
         }
 
@@ -166,12 +166,16 @@ public class TaskServiceImpl implements ITaskService {
 
         // Use future to ensure that the page does not show exceptions due to database errors.
         syncScriptJobMapping(scriptId, userId, config.getId(), jobId);
+
+        // Update script status
+        script.setStatus((byte) ScriptStatusEnum.PUBLISHED.getCode());
+        scriptDaoImpl.updateStatus(script);
         return jobId;
     }
 
     @Override
     public void recycleScriptFromScheduler(RecycleScriptReq req) {
-        ScriptJobApply apply = requireNonNull(scriptJobApplyDaoImpl.getByJobId(req.getJobId()), NO_SUCH_JOB::getTemplate);
+        final ScriptJobApply apply = requireNonNull(scriptJobApplyDaoImpl.getByJobId(req.getJobId()), NO_SUCH_JOB::getTemplate);
 
         final Script script = requireNonNull(scriptDaoImpl.getScript(apply.getScriptId()), NO_SUCH_JOB::getTemplate);
 
@@ -210,9 +214,9 @@ public class TaskServiceImpl implements ITaskService {
             });
 
             pageInfo.setData(data);
-            pageInfo.setTotalCount(jobPageData.getTotalCount());
             pageInfo.setPageNo(req.getPageNo());
             pageInfo.setPageSize(req.getPageSize());
+            pageInfo.setTotalCount(jobPageData.getTotalCount());
         }
 
         return pageInfo;
@@ -229,29 +233,31 @@ public class TaskServiceImpl implements ITaskService {
         final PageData<InstanceDto> instancePageData = iInstanceService.list(dto);
         final List<InstanceSimpleInfoRes> data = instancePageData.getData().stream().map(this::translate).collect(Collectors.toList());
 
-        final List<JobDefine> jobDefines = scriptJobApplyDaoImpl.selectJobDefineByJobIds(data.stream().map(InstanceSimpleInfoRes::getJobId).collect(Collectors.toList()));
-        final Map<Long, JobDefine> mapping = jobDefines.stream().collect(Collectors.toMap(JobDefine::getJobId, Function.identity()));
+        if (!CollectionUtils.isEmpty(data)) {
+            final List<JobDefine> jobDefines = scriptJobApplyDaoImpl.selectJobDefineByJobIds(data.stream().map(InstanceSimpleInfoRes::getJobId).collect(Collectors.toList()));
+            final Map<Long, JobDefine> mapping = jobDefines.stream().collect(Collectors.toMap(JobDefine::getJobId, Function.identity()));
 
-        data.forEach(d -> {
-            final JobDefine jobDefine = mapping.get(d.getJobId());
-            CronParser parser = new CronParser(CRON_DEFINITION);
+            data.forEach(d -> {
+                final JobDefine jobDefine = mapping.get(d.getJobId());
+                CronParser parser = new CronParser(CRON_DEFINITION);
 
-            if (nonNull(jobDefine)) {
-                ExecutionTime executionTime = ExecutionTime.forCron(parser.parse(jobDefine.getTriggerExpression()));
-                Optional<ZonedDateTime> nextExecution = executionTime.nextExecution(ZonedDateTime.now());
+                if (Objects.nonNull(jobDefine)) {
+                    ExecutionTime executionTime = ExecutionTime.forCron(parser.parse(jobDefine.getTriggerExpression()));
+                    Optional<ZonedDateTime> nextExecution = executionTime.nextExecution(ZonedDateTime.now());
 
-                if (nextExecution.isPresent()) {
-                    final ZonedDateTime next = nextExecution.get();
-                    d.setNextExecutionTime(Date.from(next.toInstant()));
+                    if (nextExecution.isPresent()) {
+                        final ZonedDateTime next = nextExecution.get();
+                        d.setNextExecutionTime(Date.from(next.toInstant()));
+                    }
                 }
-            }
-        });
+            });
+        }
 
         final PageInfo<InstanceSimpleInfoRes> pageInfo = new PageInfo<>();
         pageInfo.setData(data);
-        pageInfo.setTotalCount(instancePageData.getTotalCount());
         pageInfo.setPageNo(req.getPageNo());
         pageInfo.setPageSize(req.getPageSize());
+        pageInfo.setTotalCount(instancePageData.getTotalCount());
 
         return pageInfo;
     }
@@ -271,11 +277,22 @@ public class TaskServiceImpl implements ITaskService {
         return this.translate(iJobService.execute(dto));
     }
 
+    private ExecuteDto getExecuteDtoByInstanceId(ExecuteReq req) {
+        // objectId of instance is jobId
+        return ExecuteDto.builder()
+                .jobDto(JobDto.builder()
+                        .jobId(req.getObjectId())
+                        .build())
+                .executeTypeEnum(ExecuteTypeEnum.RERUN)
+                .build();
+    }
+
     private ExecuteDto getExecuteDtoByJobId(ExecuteReq req) {
         return ExecuteDto.builder()
                 .jobDto(JobDto.builder()
                         .jobId(req.getObjectId())
                         .build())
+                .executeTypeEnum(ExecuteTypeEnum.parse(req.getExecuteType()))
                 .build();
     }
 
@@ -338,7 +355,7 @@ public class TaskServiceImpl implements ITaskService {
     }
 
     private InstanceSimpleInfoRes translate(InstanceDto dto) {
-        if (isNull(dto)) {
+        if (Objects.isNull(dto)) {
             return null;
         }
         return InstanceSimpleInfoRes.builder()
@@ -357,7 +374,7 @@ public class TaskServiceImpl implements ITaskService {
 
     private Script checkAndGetScript(int scriptId) {
         final Script script = scriptDaoImpl.getScript(scriptId);
-        if (isNull(script)) {
+        if (Objects.isNull(script)) {
             throw new SeatunnelException(NO_SUCH_SCRIPT);
         }
         return script;
@@ -374,7 +391,7 @@ public class TaskServiceImpl implements ITaskService {
                     .build();
             scriptJobApplyDaoImpl.insertOrUpdate(dto);
         }).whenComplete((_return, e) -> {
-            if (nonNull(e)) {
+            if (Objects.nonNull(e)) {
                 log.error("Store script and job mapping failed, please maintain this mapping manually. \n" +
                         "scriptId [{}], schedulerConfigId [{}], jobId [{}], userId [{}]", scriptId, schedulerConfigId, jobId, userId, e);
             }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java
index aa63f60c..636eb0fc 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java
@@ -19,10 +19,12 @@ package org.apache.seatunnel.app.service.impl;
 
 import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.USERNAME_PASSWORD_NO_MATCHED;
 
+import org.apache.seatunnel.app.common.UserTokenStatusEnum;
 import org.apache.seatunnel.app.dal.dao.IUserDao;
 import org.apache.seatunnel.app.dal.entity.User;
 import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
 import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import org.apache.seatunnel.app.domain.dto.user.UserLoginLogDto;
 import org.apache.seatunnel.app.domain.request.user.AddUserReq;
 import org.apache.seatunnel.app.domain.request.user.UpdateUserReq;
 import org.apache.seatunnel.app.domain.request.user.UserListReq;
@@ -30,6 +32,7 @@ import org.apache.seatunnel.app.domain.request.user.UserLoginReq;
 import org.apache.seatunnel.app.domain.response.PageInfo;
 import org.apache.seatunnel.app.domain.response.user.AddUserRes;
 import org.apache.seatunnel.app.domain.response.user.UserSimpleInfoRes;
+import org.apache.seatunnel.app.security.JwtUtils;
 import org.apache.seatunnel.app.service.IRoleService;
 import org.apache.seatunnel.app.service.IUserService;
 import org.apache.seatunnel.app.utils.PasswordUtils;
@@ -54,6 +57,9 @@ public class UserServiceImpl implements IUserService {
     @Resource
     private IRoleService roleServiceImpl;
 
+    @Resource
+    private JwtUtils jwtUtils;
+
     @Value("${user.default.passwordSalt:seatunnel}")
     private String defaultSalt;
 
@@ -142,7 +148,19 @@ public class UserServiceImpl implements IUserService {
         if (Objects.isNull(user)) {
             throw new SeatunnelException(USERNAME_PASSWORD_NO_MATCHED);
         }
-        return translate(user);
+
+        UserSimpleInfoRes translate = translate(user);
+        final String token = jwtUtils.genToken(translate.toMap());
+        translate.setToken(token);
+
+        final UserLoginLogDto logDto = UserLoginLogDto.builder()
+                .token(token)
+                .tokenStatus(UserTokenStatusEnum.ENABLE.enable())
+                .userId(user.getId())
+                .build();
+        userDaoImpl.insertLoginLog(logDto);
+
+        return translate;
     }
 
     private UserSimpleInfoRes translate(User user) {
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/application.yml b/seatunnel-server/seatunnel-app/src/main/resources/application.yml
index 1d05098d..77e35480 100644
--- a/seatunnel-server/seatunnel-app/src/main/resources/application.yml
+++ b/seatunnel-server/seatunnel-app/src/main/resources/application.yml
@@ -15,9 +15,14 @@
 # limitations under the License.
 #
 
+server:
+  port: 8801
+
 spring:
   application:
     name: seatunnel
+  jackson:
+    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
@@ -40,4 +45,18 @@ ds:
 jwt:
   expireTime: 86400
   secretKey: https://github.com/apache/incubator-seatunnel
-  algorithm: HS256
\ No newline at end of file
+  algorithm: HS256
+
+---
+spring:
+  config:
+    activate:
+      on-profile: h2
+  sql:
+    init:
+      schema-locations: classpath:script/seatunnel_server_h2.sql
+  datasource:
+    driver-class-name: org.h2.Driver
+    url: jdbc:h2:mem:seatunnel;MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=true
+    username: sa
+    password: ""
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptMapper.xml b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptMapper.xml
index c74563b9..a481b3a8 100644
--- a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptMapper.xml
+++ b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptMapper.xml
@@ -41,10 +41,11 @@
     </sql>
     <insert id="insert" keyColumn="id" keyProperty="id" parameterType="org.apache.seatunnel.app.dal.entity.Script"
             useGeneratedKeys="true">
-        insert into `script` (name, type, status, creator_id, mender_id)
+        insert into `script` (name, type, status, creator_id, mender_id, content)
         VALUES (#{name,jdbcType=VARCHAR}, #{type,jdbcType=TINYINT}, #{status,jdbcType=TINYINT},
                 #{creatorId,jdbcType=INTEGER},
-                #{menderId,jdbcType=INTEGER})
+                #{menderId,jdbcType=INTEGER},
+                #{content,jdbcType=VARCHAR})
     </insert>
     <update id="updateContentByPrimaryKey">
         update `script`
@@ -69,12 +70,10 @@
         <include refid="Base_Column_List"/>
         from script
         <where>
+            `status` != 2
             <if test="script.name != null and script.name != ''">
                 and `name` = #{script.name,jdbcType=VARCHAR}
             </if>
-            <if test="script.status != null">
-                and `status` = #{script.status,jdbcType=TINYINT}
-            </if>
         </where>
         limit #{start,jdbcType=INTEGER}, #{offset,jdbcType=INTEGER}
     </select>
@@ -91,12 +90,10 @@
         count(1)
         from script
         <where>
+            `status` != 2
             <if test="script.name != null and script.name != ''">
                 and `name` = #{script.name,jdbcType=VARCHAR}
             </if>
-            <if test="script.status != null">
-                and `status` = #{script.status,jdbcType=TINYINT}
-            </if>
         </where>
     </select>
 </mapper>
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/application.yml b/seatunnel-server/seatunnel-app/src/main/resources/script/init_sql.sh
similarity index 56%
copy from seatunnel-server/seatunnel-app/src/main/resources/application.yml
copy to seatunnel-server/seatunnel-app/src/main/resources/script/init_sql.sh
index 1d05098d..3b4675da 100644
--- a/seatunnel-server/seatunnel-app/src/main/resources/application.yml
+++ b/seatunnel-server/seatunnel-app/src/main/resources/script/init_sql.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
 # contributor license agreements.  See the NOTICE file distributed with
@@ -15,29 +16,16 @@
 # limitations under the License.
 #
 
-spring:
-  application:
-    name: seatunnel
-  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
-    username: root
-    password: 123456
-  mvc:
-    pathmatch:
-      matching-strategy: ant_path_matcher
-ds:
-  script:
-    dir: /dj
-  project:
-    default: test_dj
-  tenant:
-    default: default
-  api:
-    token: 12345678
-    prefix: http://127.0.0.1:12345/dolphinscheduler
+workDir=`dirname $0`
+workDir=`cd ${workDir};pwd`
 
-jwt:
-  expireTime: 86400
-  secretKey: https://github.com/apache/incubator-seatunnel
-  algorithm: HS256
\ No newline at end of file
+source ${workDir}/seatunnel_server_env.sh
+
+usage="Usage: seatunnel_server_env.sh must contain hostname/port/username/password."
+
+if [[ ! -n "${HOSTNAME}" ]]  || [[ ! -n "${PORT}" ]] || [[ ! -n "${USERNAME}" ]] || [[ ! -n "${PASSWORD}" ]]; then
+    echo $usage
+    exit 1
+fi
+
+mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} < ${workDir}/seatunnel_server_mysql.sql
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/application.yml b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_env.sh
similarity index 56%
copy from seatunnel-server/seatunnel-app/src/main/resources/application.yml
copy to seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_env.sh
index 1d05098d..3ec563f3 100644
--- a/seatunnel-server/seatunnel-app/src/main/resources/application.yml
+++ b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_env.sh
@@ -15,29 +15,7 @@
 # limitations under the License.
 #
 
-spring:
-  application:
-    name: seatunnel
-  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
-    username: root
-    password: 123456
-  mvc:
-    pathmatch:
-      matching-strategy: ant_path_matcher
-ds:
-  script:
-    dir: /dj
-  project:
-    default: test_dj
-  tenant:
-    default: default
-  api:
-    token: 12345678
-    prefix: http://127.0.0.1:12345/dolphinscheduler
-
-jwt:
-  expireTime: 86400
-  secretKey: https://github.com/apache/incubator-seatunnel
-  algorithm: HS256
\ No newline at end of file
+export HOSTNAME=""
+export PORT=""
+export USERNAME=""
+export PASSWORD=""
\ 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
new file mode 100644
index 00000000..8ee41d34
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_h2.sql
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+-- CREATE DATABASE IF NOT EXISTS seatunnel;
+
+
+-- ----------------------------
+-- Table structure for role
+-- ----------------------------
+DROP TABLE IF EXISTS `role` CASCADE;;
+CREATE TABLE `role` (
+    `id` int(20) NOT NULL AUTO_INCREMENT,
+    `type` int(2) NOT NULL,
+    `role_name` varchar(255) NOT NULL,
+    `description` varchar(255) DEFAULT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+);
+
+-- ----------------------------
+-- Records of role
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for role_user_relation
+-- ----------------------------
+DROP TABLE IF EXISTS `role_user_relation` CASCADE;
+CREATE TABLE `role_user_relation` (
+    `id` int(20) NOT NULL AUTO_INCREMENT,
+    `role_id` int(20) NOT NULL,
+    `user_id` int(20) NOT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+);
+
+-- ----------------------------
+-- Records of role_user_relation
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for scheduler_config
+-- ----------------------------
+DROP TABLE IF EXISTS `scheduler_config` CASCADE;
+CREATE TABLE `scheduler_config` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `script_id` int(11) DEFAULT NULL,
+    `trigger_expression` varchar(255) DEFAULT NULL,
+    `retry_times` int(11) NOT NULL DEFAULT '0',
+    `retry_interval` int(11) NOT NULL DEFAULT '0',
+    `active_start_time` datetime(3) NOT NULL,
+    `active_end_time` datetime(3) NOT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    `creator_id` int(11) NOT NULL,
+    `update_id` int(11) NOT NULL,
+    PRIMARY KEY (`id`)
+);
+-- ----------------------------
+-- Records of scheduler_config
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for script
+-- ----------------------------
+DROP TABLE IF EXISTS `script` CASCADE;
+CREATE TABLE `script` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `name` varchar(255) NOT NULL,
+    `type` tinyint(4) NOT NULL,
+    `status` tinyint(4) NOT NULL,
+    `content` mediumtext,
+    `content_md5` varchar(255) DEFAULT NULL,
+    `creator_id` int(11) NOT NULL,
+    `mender_id` int(11) NOT NULL,
+    `create_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+);
+
+-- ----------------------------
+-- Records of script
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for script_job_apply
+-- ----------------------------
+DROP TABLE IF EXISTS `script_job_apply` CASCADE;
+CREATE TABLE `script_job_apply` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `script_id` int(11) NOT NULL,
+    `scheduler_config_id` int(11) NOT NULL,
+    `job_id` bigint(20) DEFAULT NULL,
+    `operator_id` int(11) NOT NULL,
+    `create_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+);
+
+-- ----------------------------
+-- Records of script_job_apply
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for script_param
+-- ----------------------------
+DROP TABLE IF EXISTS `script_param` CASCADE;
+CREATE TABLE `script_param` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `script_id` int(11) DEFAULT NULL,
+    `key` varchar(255) NOT NULL,
+    `value` varchar(255) DEFAULT NULL,
+    `status` tinyint(4) DEFAULT NULL,
+    `create_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+);
+
+-- ----------------------------
+-- Records of script_param
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for user
+-- ----------------------------
+DROP TABLE IF EXISTS `user` CASCADE;
+CREATE TABLE `user` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `username` varchar(255) NOT NULL,
+    `password` varchar(255) NOT NULL,
+    `status` tinyint(4) NOT NULL,
+    `type` tinyint(4) NOT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+);
+
+-- ----------------------------
+-- Records of user
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for user_login_log
+-- ----------------------------
+DROP TABLE IF EXISTS `user_login_log` CASCADE;
+CREATE TABLE `user_login_log` (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `user_id` int(11) NOT NULL,
+    `token` mediumtext NOT NULL,
+    `token_status` tinyint(1) NOT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+);
+
+-- ----------------------------
+-- Records of user_login_log
+-- ----------------------------
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
new file mode 100644
index 00000000..e933890b
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/resources/script/seatunnel_server_mysql.sql
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+CREATE DATABASE IF NOT EXISTS seatunnel;
+
+
+-- ----------------------------
+-- Table structure for role
+-- ----------------------------
+DROP TABLE IF EXISTS `seatunnel`.`role`;
+CREATE TABLE `seatunnel`.`role` (
+    `id` int(20) NOT NULL AUTO_INCREMENT,
+    `type` int(2) NOT NULL,
+    `role_name` varchar(255) NOT NULL,
+    `description` varchar(255) DEFAULT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Records of role
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for role_user_relation
+-- ----------------------------
+DROP TABLE IF EXISTS `seatunnel`.`role_user_relation`;
+CREATE TABLE `seatunnel`.`role_user_relation` (
+    `id` int(20) NOT NULL AUTO_INCREMENT,
+    `role_id` int(20) NOT NULL,
+    `user_id` int(20) NOT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Records of role_user_relation
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for scheduler_config
+-- ----------------------------
+DROP TABLE IF EXISTS `seatunnel`.`scheduler_config`;
+CREATE TABLE `seatunnel`.`scheduler_config` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `script_id` int(11) DEFAULT NULL,
+    `trigger_expression` varchar(255) DEFAULT NULL,
+    `retry_times` int(11) NOT NULL DEFAULT '0',
+    `retry_interval` int(11) NOT NULL DEFAULT '0',
+    `active_start_time` datetime(3) NOT NULL,
+    `active_end_time` datetime(3) NOT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    `creator_id` int(11) NOT NULL,
+    `update_id` int(11) NOT NULL,
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+-- ----------------------------
+-- Records of scheduler_config
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for script
+-- ----------------------------
+DROP TABLE IF EXISTS `seatunnel`.`script`;
+CREATE TABLE `seatunnel`.`script` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `name` varchar(255) NOT NULL,
+    `type` tinyint(4) NOT NULL,
+    `status` tinyint(4) NOT NULL,
+    `content` mediumtext,
+    `content_md5` varchar(255) DEFAULT NULL,
+    `creator_id` int(11) NOT NULL,
+    `mender_id` int(11) NOT NULL,
+    `create_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Records of script
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for script_job_apply
+-- ----------------------------
+DROP TABLE IF EXISTS `seatunnel`.`script_job_apply`;
+CREATE TABLE `seatunnel`.`script_job_apply` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `script_id` int(11) NOT NULL,
+    `scheduler_config_id` int(11) NOT NULL,
+    `job_id` bigint(20) DEFAULT NULL,
+    `operator_id` int(11) NOT NULL,
+    `create_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Records of script_job_apply
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for script_param
+-- ----------------------------
+DROP TABLE IF EXISTS `seatunnel`.`script_param`;
+CREATE TABLE `seatunnel`.`script_param` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `script_id` int(11) DEFAULT NULL,
+    `key` varchar(255) NOT NULL,
+    `value` varchar(255) DEFAULT NULL,
+    `status` tinyint(4) DEFAULT NULL,
+    `create_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Records of script_param
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for user
+-- ----------------------------
+DROP TABLE IF EXISTS `seatunnel`.`user`;
+CREATE TABLE `seatunnel`.`user` (
+    `id` int(11) NOT NULL AUTO_INCREMENT,
+    `username` varchar(255) NOT NULL,
+    `password` varchar(255) NOT NULL,
+    `status` tinyint(4) NOT NULL,
+    `type` tinyint(4) NOT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Records of user
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for user_login_log
+-- ----------------------------
+DROP TABLE IF EXISTS `seatunnel`.`user_login_log`;
+CREATE TABLE `seatunnel`.`user_login_log` (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `user_id` int(11) NOT NULL,
+    `token` mediumtext NOT NULL,
+    `token_status` tinyint(1) NOT NULL,
+    `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Records of user_login_log
+-- ----------------------------
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/pom.xml b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/pom.xml
index 5bf89de0..099115ad 100644
--- a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/pom.xml
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/pom.xml
@@ -25,6 +25,10 @@
 
     <artifactId>seatunnel-scheduler-dolphinscheduler</artifactId>
 
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
     <dependencies>
         <dependency>
             <groupId>org.springframework</groupId>
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/IDolphinschedulerService.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/IDolphinschedulerService.java
index a460ec27..5454b6ba 100644
--- a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/IDolphinschedulerService.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/IDolphinschedulerService.java
@@ -66,4 +66,6 @@ public interface IDolphinschedulerService {
     InstanceLogDto queryInstanceLog(long instanceId);
 
     void killProcessInstance(long processInstanceId);
+
+    void execute(long processInstanceId, ExecuteTypeEnum executeType);
 }
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/constants/DolphinschedulerConstants.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/constants/DolphinschedulerConstants.java
index e8f886f1..4a01e602 100644
--- a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/constants/DolphinschedulerConstants.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/constants/DolphinschedulerConstants.java
@@ -173,6 +173,7 @@ public class DolphinschedulerConstants {
     public static final String EXECUTE_TYPE = "executeType";
     public static final int LOG_SKIP_LINE_NUM_DEFAULT = 0;
     public static final int LOG_LIMIT_NUM_DEFAULT = Integer.MAX_VALUE;
+    public static final String STATE_TYPE = "stateType";
 
     /**
      * response param
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/DolphinschedulerServiceImpl.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/DolphinschedulerServiceImpl.java
index 52c99b38..f658dc36 100644
--- a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/DolphinschedulerServiceImpl.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/DolphinschedulerServiceImpl.java
@@ -518,7 +518,8 @@ public class DolphinschedulerServiceImpl implements IDolphinschedulerService, In
         return projectDto;
     }
 
-    private void execute(long processInstanceId, ExecuteTypeEnum executeType) {
+    @Override
+    public void execute(long processInstanceId, ExecuteTypeEnum executeType) {
         final Map result = HttpUtils.builder()
             .withUrl(apiPrefix.concat(String.format(EXECUTE, defaultProjectCode)))
             .withMethod(Connection.Method.POST)
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/InstanceServiceImpl.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/InstanceServiceImpl.java
index d4ce1a72..d10fa4f0 100644
--- a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/InstanceServiceImpl.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/InstanceServiceImpl.java
@@ -21,6 +21,7 @@ import org.apache.seatunnel.scheduler.dolphinscheduler.IDolphinschedulerService;
 import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ListProcessInstanceDto;
 import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ProcessInstanceDto;
 import org.apache.seatunnel.scheduler.dolphinscheduler.enums.RunFrequencyEnum;
+import org.apache.seatunnel.scheduler.dolphinscheduler.utils.StatusUtils;
 import org.apache.seatunnel.server.common.PageData;
 import org.apache.seatunnel.spi.scheduler.IInstanceService;
 import org.apache.seatunnel.spi.scheduler.dto.InstanceDto;
@@ -57,7 +58,7 @@ public class InstanceServiceImpl implements IInstanceService {
                 .instanceId(t.getId())
                 .jobId(t.getProcessDefinitionCode())
                 .instanceName(t.getName())
-                .status(t.getState())
+                .status(StatusUtils.getDolphinSchedulerStatus(t.getState()).name())
                 .startTime(t.getStartTime())
                 .endTime(t.getEndTime())
                 .submitTime(t.getScheduleTime())
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/JobServiceImpl.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/JobServiceImpl.java
index 22cc91d5..0a87db2d 100644
--- a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/JobServiceImpl.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/JobServiceImpl.java
@@ -57,6 +57,7 @@ import org.apache.seatunnel.spi.scheduler.dto.InstanceListDto;
 import org.apache.seatunnel.spi.scheduler.dto.JobDto;
 import org.apache.seatunnel.spi.scheduler.dto.JobListDto;
 import org.apache.seatunnel.spi.scheduler.dto.JobSimpleInfoDto;
+import org.apache.seatunnel.spi.scheduler.enums.ExecuteTypeEnum;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -129,6 +130,12 @@ public class JobServiceImpl implements IJobService {
     @Override
     @SuppressWarnings("magicnumber")
     public InstanceDto execute(ExecuteDto dto) {
+
+        if (dto.getExecuteTypeEnum() == ExecuteTypeEnum.RERUN) {
+            iDolphinschedulerService.execute(dto.getJobDto().getJobId(), org.apache.seatunnel.scheduler.dolphinscheduler.ExecuteTypeEnum.REPEAT_RUNNING);
+            return null;
+        }
+
         ProcessDefinitionDto processDefinition = null;
         final JobDto jobDto = dto.getJobDto();
         if (Objects.isNull(jobDto.getJobId())) {
diff --git a/seatunnel-ui/src/layouts/dashboard/header/setting/use-setting-dropdown.ts b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/utils/StatusUtils.java
similarity index 50%
rename from seatunnel-ui/src/layouts/dashboard/header/setting/use-setting-dropdown.ts
rename to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/utils/StatusUtils.java
index 157f04c5..fdfa32b3 100644
--- a/seatunnel-ui/src/layouts/dashboard/header/setting/use-setting-dropdown.ts
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/utils/StatusUtils.java
@@ -15,38 +15,29 @@
  * limitations under the License.
  */
 
-import { useI18n } from 'vue-i18n'
-import { reactive, h } from 'vue'
-import { useRouter } from 'vue-router'
-import type { Router } from 'vue-router'
+package org.apache.seatunnel.scheduler.dolphinscheduler.utils;
 
-export function useSettingDropdown() {
-  const { t } = useI18n()
-  const router: Router = useRouter()
+import org.apache.seatunnel.spi.scheduler.enums.InstanceStatusEnum;
 
-  const dropdownOptions = [
-    {
-      key: 'header',
-      type: 'render',
-      render: () =>
-        h('h3', { class: ['py-1.5', 'px-3', 'font-medium'] }, t('menu.manage'))
-    },
-    {
-      key: 'header-divider',
-      type: 'divider'
-    },
-    { key: 'user-manage', label: t('menu.user_manage') }
-  ]
+public class StatusUtils {
 
-  const state = reactive({
-    dropdownOptions
-  })
-
-  const handleSelect = (key: string) => {
-    if (key === 'user-manage') {
-      router.push({ path: '/user-manage' })
+    public static InstanceStatusEnum getDolphinSchedulerStatus(String status) {
+        switch (status) {
+            case "SUBMITTED_SUCCESS":
+            case "RUNNING_EXECUTION":
+            case "DISPATCH":
+                return InstanceStatusEnum.RUNNING;
+            case "STOP":
+            case "KILL":
+                return InstanceStatusEnum.STOPPED;
+            case "FAILURE":
+                return InstanceStatusEnum.FAILED;
+            case "FORCED_SUCCESS":
+            case "SUCCESS":
+                return InstanceStatusEnum.SUCCESS;
+            default:
+                return InstanceStatusEnum.UNKNOWN;
+        }
     }
-  }
 
-  return { state, handleSelect }
 }
diff --git a/seatunnel-server/seatunnel-server-common/pom.xml b/seatunnel-server/seatunnel-server-common/pom.xml
index e170fdfb..6eb22aac 100644
--- a/seatunnel-server/seatunnel-server-common/pom.xml
+++ b/seatunnel-server/seatunnel-server-common/pom.xml
@@ -25,6 +25,10 @@
 
     <artifactId>seatunnel-server-common</artifactId>
 
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
     <dependencies>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
diff --git a/seatunnel-server/seatunnel-spi/pom.xml b/seatunnel-server/seatunnel-spi/pom.xml
index 318c16c6..614c9025 100644
--- a/seatunnel-server/seatunnel-spi/pom.xml
+++ b/seatunnel-server/seatunnel-spi/pom.xml
@@ -25,6 +25,10 @@
 
     <artifactId>seatunnel-spi</artifactId>
 
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
     <dependencies>
         <dependency>
             <groupId>org.apache.seatunnel</groupId>
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/enums/InstanceStatusEnum.java
similarity index 84%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/enums/InstanceStatusEnum.java
index 1037f9f8..10fd24c5 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/enums/InstanceStatusEnum.java
@@ -15,11 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.domain.response.script;
+package org.apache.seatunnel.spi.scheduler.enums;
 
-import lombok.Data;
-
-@Data
-public class AddEmptyScriptRes {
-    private int id;
+public enum InstanceStatusEnum {
+    RUNNING,
+    STOPPED,
+    FAILED,
+    SUCCESS,
+    UNKNOWN,
+    ;
 }
diff --git a/seatunnel-ui/.env.development b/seatunnel-ui/.env.development
index c73a1a75..0e5ee882 100644
--- a/seatunnel-ui/.env.development
+++ b/seatunnel-ui/.env.development
@@ -15,4 +15,4 @@
 
 NODE_ENV=development
 
-VITE_APP_DEV_WEB_URL=''
+VITE_APP_DEV_WEB_URL='http://127.0.0.1:8801'
diff --git a/seatunnel-ui/.gitignore b/seatunnel-ui/.gitignore
index 87ae7322..d43dfedb 100644
--- a/seatunnel-ui/.gitignore
+++ b/seatunnel-ui/.gitignore
@@ -25,5 +25,6 @@
 node_modules
 dist
 dist-ssr
+package-lock.json
 
 .pnpm-debug.log
diff --git a/seatunnel-ui/package.json b/seatunnel-ui/package.json
index afa6db69..5535b733 100644
--- a/seatunnel-ui/package.json
+++ b/seatunnel-ui/package.json
@@ -9,46 +9,46 @@
     "prettier": "prettier --write \"src/**/*.{vue,ts,tsx}\""
   },
   "dependencies": {
-    "@vueuse/core": "^9.2.0",
-    "autoprefixer": "^10.4.8",
-    "axios": "^0.27.2",
-    "date-fns": "^2.29.2",
-    "date-fns-tz": "^1.3.7",
-    "echarts": "^5.3.3",
+    "@vueuse/core": "^9.13.0",
+    "autoprefixer": "^10.4.13",
+    "axios": "^1.3.4",
+    "date-fns": "^2.29.3",
+    "date-fns-tz": "^2.0.0",
+    "echarts": "^5.4.1",
     "lodash": "^4.17.21",
-    "monaco-editor": "^0.34.0",
-    "naive-ui": "2.30.7",
+    "monaco-editor": "^0.36.1",
+    "naive-ui": "2.34.3",
     "nprogress": "^0.2.0",
-    "pinia": "^2.0.22",
-    "pinia-plugin-persistedstate": "^2.1.1",
-    "postcss": "^8.4.16",
-    "tailwindcss": "^3.1.8",
+    "pinia": "^2.0.32",
+    "pinia-plugin-persistedstate": "^3.1.0",
+    "postcss": "^8.4.21",
+    "tailwindcss": "^3.2.7",
     "vfonts": "^0.0.3",
-    "vue": "^3.2.38",
+    "vue": "^3.2.47",
     "vue-i18n": "^9.2.2",
-    "vue-router": "^4.1.5"
+    "vue-router": "^4.1.6"
   },
   "devDependencies": {
-    "@types/lodash": "^4.14.184",
-    "@types/node": "^18.7.15",
+    "@types/lodash": "^4.14.191",
+    "@types/node": "^18.14.6",
     "@types/nprogress": "^0.2.0",
-    "@typescript-eslint/eslint-plugin": "^5.36.2",
-    "@typescript-eslint/parser": "^5.36.2",
+    "@typescript-eslint/eslint-plugin": "^5.54.0",
+    "@typescript-eslint/parser": "^5.54.0",
     "@vicons/antd": "^0.12.0",
-    "@vitejs/plugin-vue": "^3.1.0",
-    "@vitejs/plugin-vue-jsx": "^2.0.1",
+    "@vitejs/plugin-vue": "^4.0.0",
+    "@vitejs/plugin-vue-jsx": "^3.0.0",
     "dart-sass": "^1.25.0",
-    "eslint": "^8.23.0",
-    "eslint-config-prettier": "^8.5.0",
+    "eslint": "^8.35.0",
+    "eslint-config-prettier": "^8.6.0",
     "eslint-plugin-prettier": "^4.2.1",
-    "eslint-plugin-vue": "^9.4.0",
-    "prettier": "^2.7.1",
-    "sass": "^1.54.8",
-    "sass-loader": "^13.0.2",
-    "typescript": "^4.8.2",
-    "typescript-plugin-css-modules": "^3.4.0",
-    "vite": "^3.1.0",
+    "eslint-plugin-vue": "^9.9.0",
+    "prettier": "^2.8.4",
+    "sass": "^1.58.3",
+    "sass-loader": "^13.2.0",
+    "typescript": "^4.9.5",
+    "typescript-plugin-css-modules": "^4.2.2",
+    "vite": "^4.1.4",
     "vite-plugin-compression": "^0.5.1",
-    "vue-tsc": "^0.40.9"
+    "vue-tsc": "^1.2.0"
   }
 }
diff --git a/seatunnel-ui/pnpm-lock.yaml b/seatunnel-ui/pnpm-lock.yaml
index 8ad56e5d..daee7b32 100644
--- a/seatunnel-ui/pnpm-lock.yaml
+++ b/seatunnel-ui/pnpm-lock.yaml
@@ -18,97 +18,101 @@
 lockfileVersion: 5.4
 
 specifiers:
-  '@types/lodash': ^4.14.184
-  '@types/node': ^18.7.15
+  '@types/lodash': ^4.14.191
+  '@types/node': ^18.14.6
   '@types/nprogress': ^0.2.0
-  '@typescript-eslint/eslint-plugin': ^5.36.2
-  '@typescript-eslint/parser': ^5.36.2
+  '@typescript-eslint/eslint-plugin': ^5.54.0
+  '@typescript-eslint/parser': ^5.54.0
   '@vicons/antd': ^0.12.0
-  '@vitejs/plugin-vue': ^3.1.0
-  '@vitejs/plugin-vue-jsx': ^2.0.1
-  '@vueuse/core': ^9.2.0
-  autoprefixer: ^10.4.8
-  axios: ^0.27.2
+  '@vitejs/plugin-vue': ^4.0.0
+  '@vitejs/plugin-vue-jsx': ^3.0.0
+  '@vueuse/core': ^9.13.0
+  autoprefixer: ^10.4.13
+  axios: ^1.3.4
   dart-sass: ^1.25.0
-  date-fns: ^2.29.2
-  date-fns-tz: ^1.3.7
-  echarts: ^5.3.3
-  eslint: ^8.23.0
-  eslint-config-prettier: ^8.5.0
+  date-fns: ^2.29.3
+  date-fns-tz: ^2.0.0
+  echarts: ^5.4.1
+  eslint: ^8.35.0
+  eslint-config-prettier: ^8.6.0
   eslint-plugin-prettier: ^4.2.1
-  eslint-plugin-vue: ^9.4.0
+  eslint-plugin-vue: ^9.9.0
   lodash: ^4.17.21
-  monaco-editor: ^0.34.0
-  naive-ui: 2.30.7
+  monaco-editor: ^0.36.1
+  naive-ui: 2.34.3
   nprogress: ^0.2.0
-  pinia: ^2.0.22
-  pinia-plugin-persistedstate: ^2.1.1
-  postcss: ^8.4.16
-  prettier: ^2.7.1
-  sass: ^1.54.8
-  sass-loader: ^13.0.2
-  tailwindcss: ^3.1.8
-  typescript: ^4.8.2
-  typescript-plugin-css-modules: ^3.4.0
+  pinia: ^2.0.32
+  pinia-plugin-persistedstate: ^3.1.0
+  postcss: ^8.4.21
+  prettier: ^2.8.4
+  sass: ^1.58.3
+  sass-loader: ^13.2.0
+  tailwindcss: ^3.2.7
+  typescript: ^4.9.5
+  typescript-plugin-css-modules: ^4.2.2
   vfonts: ^0.0.3
-  vite: ^3.1.0
+  vite: ^4.1.4
   vite-plugin-compression: ^0.5.1
-  vue: ^3.2.38
+  vue: ^3.2.47
   vue-i18n: ^9.2.2
-  vue-router: ^4.1.5
-  vue-tsc: ^0.40.9
+  vue-router: ^4.1.6
+  vue-tsc: ^1.2.0
 
 dependencies:
-  '@vueuse/core': 9.2.0_vue@3.2.38
-  autoprefixer: 10.4.8_postcss@8.4.16
-  axios: 0.27.2
-  date-fns: 2.29.2
-  date-fns-tz: 1.3.7_date-fns@2.29.2
-  echarts: 5.3.3
+  '@vueuse/core': 9.13.0_vue@3.2.47
+  autoprefixer: 10.4.13_postcss@8.4.21
+  axios: 1.3.4
+  date-fns: 2.29.3
+  date-fns-tz: 2.0.0_date-fns@2.29.3
+  echarts: 5.4.1
   lodash: 4.17.21
-  monaco-editor: 0.34.0
-  naive-ui: 2.30.7_vue@3.2.38
+  monaco-editor: 0.36.1
+  naive-ui: 2.34.3_vue@3.2.47
   nprogress: 0.2.0
-  pinia: 2.0.22_pj7ch6rmow6odq73xb5hfvge3q
-  pinia-plugin-persistedstate: 2.1.1_pinia@2.0.22
-  postcss: 8.4.16
-  tailwindcss: 3.1.8
+  pinia: 2.0.32_hmuptsblhheur2tugfgucj7gc4
+  pinia-plugin-persistedstate: 3.1.0_pinia@2.0.32
+  postcss: 8.4.21
+  tailwindcss: 3.2.7_postcss@8.4.21
   vfonts: 0.0.3
-  vue: 3.2.38
-  vue-i18n: 9.2.2_vue@3.2.38
-  vue-router: 4.1.5_vue@3.2.38
+  vue: 3.2.47
+  vue-i18n: 9.2.2_vue@3.2.47
+  vue-router: 4.1.6_vue@3.2.47
 
 devDependencies:
-  '@types/lodash': 4.14.184
-  '@types/node': 18.7.15
+  '@types/lodash': 4.14.191
+  '@types/node': 18.14.6
   '@types/nprogress': 0.2.0
-  '@typescript-eslint/eslint-plugin': 5.36.2_iurrlxgqcgk5svigzxakafpeuu
-  '@typescript-eslint/parser': 5.36.2_yqf6kl63nyoq5megxukfnom5rm
+  '@typescript-eslint/eslint-plugin': 5.54.0_6mj2wypvdnknez7kws2nfdgupi
+  '@typescript-eslint/parser': 5.54.0_ycpbpc6yetojsgtrx3mwntkhsu
   '@vicons/antd': 0.12.0
-  '@vitejs/plugin-vue': 3.1.0_vite@3.1.0+vue@3.2.38
-  '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.1.0+vue@3.2.38
+  '@vitejs/plugin-vue': 4.0.0_vite@4.1.4+vue@3.2.47
+  '@vitejs/plugin-vue-jsx': 3.0.0_vite@4.1.4+vue@3.2.47
   dart-sass: 1.25.0
-  eslint: 8.23.0
-  eslint-config-prettier: 8.5.0_eslint@8.23.0
-  eslint-plugin-prettier: 4.2.1_tgumt6uwl2md3n6uqnggd6wvce
-  eslint-plugin-vue: 9.4.0_eslint@8.23.0
-  prettier: 2.7.1
-  sass: 1.54.8
-  sass-loader: 13.0.2_sass@1.54.8
-  typescript: 4.8.2
-  typescript-plugin-css-modules: 3.4.0_typescript@4.8.2
-  vite: 3.1.0_sass@1.54.8
-  vite-plugin-compression: 0.5.1_vite@3.1.0
-  vue-tsc: 0.40.9_typescript@4.8.2
+  eslint: 8.35.0
+  eslint-config-prettier: 8.6.0_eslint@8.35.0
+  eslint-plugin-prettier: 4.2.1_u2zha4kiojzs42thzpgwygphmy
+  eslint-plugin-vue: 9.9.0_eslint@8.35.0
+  prettier: 2.8.4
+  sass: 1.58.3
+  sass-loader: 13.2.0_sass@1.58.3
+  typescript: 4.9.5
+  typescript-plugin-css-modules: 4.2.2_typescript@4.9.5
+  vite: 4.1.4_tbu6ibuzbmq2zng52hwcifltki
+  vite-plugin-compression: 0.5.1_vite@4.1.4
+  vue-tsc: 1.2.0_typescript@4.9.5
 
 packages:
 
+  /@adobe/css-tools/4.2.0:
+    resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==}
+    dev: true
+
   /@ampproject/remapping/2.2.0:
     resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
     engines: {node: '>=6.0.0'}
     dependencies:
       '@jridgewell/gen-mapping': 0.1.1
-      '@jridgewell/trace-mapping': 0.3.15
+      '@jridgewell/trace-mapping': 0.3.17
     dev: true
 
   /@babel/code-frame/7.18.6:
@@ -118,40 +122,41 @@ packages:
       '@babel/highlight': 7.18.6
     dev: true
 
-  /@babel/compat-data/7.19.0:
-    resolution: {integrity: sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==}
+  /@babel/compat-data/7.21.0:
+    resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==}
     engines: {node: '>=6.9.0'}
     dev: true
 
-  /@babel/core/7.19.0:
-    resolution: {integrity: sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==}
+  /@babel/core/7.21.0:
+    resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@ampproject/remapping': 2.2.0
       '@babel/code-frame': 7.18.6
-      '@babel/generator': 7.19.0
-      '@babel/helper-compilation-targets': 7.19.0_@babel+core@7.19.0
-      '@babel/helper-module-transforms': 7.19.0
-      '@babel/helpers': 7.19.0
-      '@babel/parser': 7.19.0
-      '@babel/template': 7.18.10
-      '@babel/traverse': 7.19.0
-      '@babel/types': 7.19.0
-      convert-source-map: 1.8.0
+      '@babel/generator': 7.21.1
+      '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0
+      '@babel/helper-module-transforms': 7.21.2
+      '@babel/helpers': 7.21.0
+      '@babel/parser': 7.21.2
+      '@babel/template': 7.20.7
+      '@babel/traverse': 7.21.2
+      '@babel/types': 7.21.2
+      convert-source-map: 1.9.0
       debug: 4.3.4
       gensync: 1.0.0-beta.2
-      json5: 2.2.1
+      json5: 2.2.3
       semver: 6.3.0
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@babel/generator/7.19.0:
-    resolution: {integrity: sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==}
+  /@babel/generator/7.21.1:
+    resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.19.0
+      '@babel/types': 7.21.2
       '@jridgewell/gen-mapping': 0.3.2
+      '@jridgewell/trace-mapping': 0.3.17
       jsesc: 2.5.2
     dev: true
 
@@ -159,35 +164,37 @@ packages:
     resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.19.0
+      '@babel/types': 7.21.2
     dev: true
 
-  /@babel/helper-compilation-targets/7.19.0_@babel+core@7.19.0:
-    resolution: {integrity: sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==}
+  /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0:
+    resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
     dependencies:
-      '@babel/compat-data': 7.19.0
-      '@babel/core': 7.19.0
-      '@babel/helper-validator-option': 7.18.6
-      browserslist: 4.21.3
+      '@babel/compat-data': 7.21.0
+      '@babel/core': 7.21.0
+      '@babel/helper-validator-option': 7.21.0
+      browserslist: 4.21.5
+      lru-cache: 5.1.1
       semver: 6.3.0
     dev: true
 
-  /@babel/helper-create-class-features-plugin/7.19.0_@babel+core@7.19.0:
-    resolution: {integrity: sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==}
+  /@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0:
+    resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
     dependencies:
-      '@babel/core': 7.19.0
+      '@babel/core': 7.21.0
       '@babel/helper-annotate-as-pure': 7.18.6
       '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-function-name': 7.19.0
-      '@babel/helper-member-expression-to-functions': 7.18.9
+      '@babel/helper-function-name': 7.21.0
+      '@babel/helper-member-expression-to-functions': 7.21.0
       '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/helper-replace-supers': 7.18.9
+      '@babel/helper-replace-supers': 7.20.7
+      '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
       '@babel/helper-split-export-declaration': 7.18.6
     transitivePeerDependencies:
       - supports-color
@@ -198,47 +205,47 @@ packages:
     engines: {node: '>=6.9.0'}
     dev: true
 
-  /@babel/helper-function-name/7.19.0:
-    resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==}
+  /@babel/helper-function-name/7.21.0:
+    resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/template': 7.18.10
-      '@babel/types': 7.19.0
+      '@babel/template': 7.20.7
+      '@babel/types': 7.21.2
     dev: true
 
   /@babel/helper-hoist-variables/7.18.6:
     resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.19.0
+      '@babel/types': 7.21.2
     dev: true
 
-  /@babel/helper-member-expression-to-functions/7.18.9:
-    resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==}
+  /@babel/helper-member-expression-to-functions/7.21.0:
+    resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.19.0
+      '@babel/types': 7.21.2
     dev: true
 
   /@babel/helper-module-imports/7.18.6:
     resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.19.0
+      '@babel/types': 7.21.2
     dev: true
 
-  /@babel/helper-module-transforms/7.19.0:
-    resolution: {integrity: sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==}
+  /@babel/helper-module-transforms/7.21.2:
+    resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/helper-environment-visitor': 7.18.9
       '@babel/helper-module-imports': 7.18.6
-      '@babel/helper-simple-access': 7.18.6
+      '@babel/helper-simple-access': 7.20.2
       '@babel/helper-split-export-declaration': 7.18.6
-      '@babel/helper-validator-identifier': 7.18.6
-      '@babel/template': 7.18.10
-      '@babel/traverse': 7.19.0
-      '@babel/types': 7.19.0
+      '@babel/helper-validator-identifier': 7.19.1
+      '@babel/template': 7.20.7
+      '@babel/traverse': 7.21.2
+      '@babel/types': 7.21.2
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -247,61 +254,69 @@ packages:
     resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.19.0
+      '@babel/types': 7.21.2
     dev: true
 
-  /@babel/helper-plugin-utils/7.19.0:
-    resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==}
+  /@babel/helper-plugin-utils/7.20.2:
+    resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==}
     engines: {node: '>=6.9.0'}
     dev: true
 
-  /@babel/helper-replace-supers/7.18.9:
-    resolution: {integrity: sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==}
+  /@babel/helper-replace-supers/7.20.7:
+    resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-member-expression-to-functions': 7.18.9
+      '@babel/helper-member-expression-to-functions': 7.21.0
       '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/traverse': 7.19.0
-      '@babel/types': 7.19.0
+      '@babel/template': 7.20.7
+      '@babel/traverse': 7.21.2
+      '@babel/types': 7.21.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@babel/helper-simple-access/7.18.6:
-    resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==}
+  /@babel/helper-simple-access/7.20.2:
+    resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.21.2
+    dev: true
+
+  /@babel/helper-skip-transparent-expression-wrappers/7.20.0:
+    resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.19.0
+      '@babel/types': 7.21.2
     dev: true
 
   /@babel/helper-split-export-declaration/7.18.6:
     resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.19.0
+      '@babel/types': 7.21.2
     dev: true
 
-  /@babel/helper-string-parser/7.18.10:
-    resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==}
+  /@babel/helper-string-parser/7.19.4:
+    resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
     engines: {node: '>=6.9.0'}
 
-  /@babel/helper-validator-identifier/7.18.6:
-    resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==}
+  /@babel/helper-validator-identifier/7.19.1:
+    resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
     engines: {node: '>=6.9.0'}
 
-  /@babel/helper-validator-option/7.18.6:
-    resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
+  /@babel/helper-validator-option/7.21.0:
+    resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==}
     engines: {node: '>=6.9.0'}
     dev: true
 
-  /@babel/helpers/7.19.0:
-    resolution: {integrity: sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==}
+  /@babel/helpers/7.21.0:
+    resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/template': 7.18.10
-      '@babel/traverse': 7.19.0
-      '@babel/types': 7.19.0
+      '@babel/template': 7.20.7
+      '@babel/traverse': 7.21.2
+      '@babel/types': 7.21.2
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -310,118 +325,199 @@ packages:
     resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/helper-validator-identifier': 7.18.6
+      '@babel/helper-validator-identifier': 7.19.1
       chalk: 2.4.2
       js-tokens: 4.0.0
     dev: true
 
-  /@babel/parser/7.19.0:
-    resolution: {integrity: sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==}
+  /@babel/parser/7.21.2:
+    resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==}
     engines: {node: '>=6.0.0'}
     hasBin: true
     dependencies:
-      '@babel/types': 7.19.0
+      '@babel/types': 7.21.2
 
-  /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.19.0:
-    resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.19.0
-      '@babel/helper-plugin-utils': 7.19.0
-    dev: true
-
-  /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.19.0:
+  /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.21.0:
     resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.19.0
-      '@babel/helper-plugin-utils': 7.19.0
+      '@babel/core': 7.21.0
+      '@babel/helper-plugin-utils': 7.20.2
     dev: true
 
-  /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.19.0:
-    resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==}
+  /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.21.0:
+    resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.19.0
-      '@babel/helper-plugin-utils': 7.19.0
+      '@babel/core': 7.21.0
+      '@babel/helper-plugin-utils': 7.20.2
     dev: true
 
-  /@babel/plugin-transform-typescript/7.19.0_@babel+core@7.19.0:
-    resolution: {integrity: sha512-DOOIywxPpkQHXijXv+s9MDAyZcLp12oYRl3CMWZ6u7TjSoCBq/KqHR/nNFR3+i2xqheZxoF0H2XyL7B6xeSRuA==}
+  /@babel/plugin-transform-typescript/7.21.0_@babel+core@7.21.0:
+    resolution: {integrity: sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.19.0
-      '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.0
-      '@babel/helper-plugin-utils': 7.19.0
-      '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.19.0
+      '@babel/core': 7.21.0
+      '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0
+      '@babel/helper-plugin-utils': 7.20.2
+      '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.21.0
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@babel/template/7.18.10:
-    resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==}
+  /@babel/template/7.20.7:
+    resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/code-frame': 7.18.6
-      '@babel/parser': 7.19.0
-      '@babel/types': 7.19.0
+      '@babel/parser': 7.21.2
+      '@babel/types': 7.21.2
     dev: true
 
-  /@babel/traverse/7.19.0:
-    resolution: {integrity: sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==}
+  /@babel/traverse/7.21.2:
+    resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/code-frame': 7.18.6
-      '@babel/generator': 7.19.0
+      '@babel/generator': 7.21.1
       '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-function-name': 7.19.0
+      '@babel/helper-function-name': 7.21.0
       '@babel/helper-hoist-variables': 7.18.6
       '@babel/helper-split-export-declaration': 7.18.6
-      '@babel/parser': 7.19.0
-      '@babel/types': 7.19.0
+      '@babel/parser': 7.21.2
+      '@babel/types': 7.21.2
       debug: 4.3.4
       globals: 11.12.0
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@babel/types/7.19.0:
-    resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==}
+  /@babel/types/7.21.2:
+    resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/helper-string-parser': 7.18.10
-      '@babel/helper-validator-identifier': 7.18.6
+      '@babel/helper-string-parser': 7.19.4
+      '@babel/helper-validator-identifier': 7.19.1
       to-fast-properties: 2.0.0
 
-  /@css-render/plugin-bem/0.15.11_css-render@0.15.11:
-    resolution: {integrity: sha512-Bn8qadYPIz5DhZ4obTGHOJzeziQH6kY0+Fk5AEvwuuy378SLwwvXuuoechLjBHcgKkPCM03Oo4dDSGP/6NMdyw==}
+  /@css-render/plugin-bem/0.15.12_css-render@0.15.12:
+    resolution: {integrity: sha512-Lq2jSOZn+wYQtsyaFj6QRz2EzAnd3iW5fZeHO1WSXQdVYwvwGX0ZiH3X2JQgtgYLT1yeGtrwrqJdNdMEUD2xTw==}
     peerDependencies:
-      css-render: ~0.15.11
+      css-render: ~0.15.12
     dependencies:
-      css-render: 0.15.11
+      css-render: 0.15.12
     dev: false
 
-  /@css-render/vue3-ssr/0.15.11_vue@3.2.38:
-    resolution: {integrity: sha512-n+SuqLPbY30FUTM8slX75OaEG+c8XlTOFrAklekX2XQGvBbz9XdBE6hTEgGlV5kPcTMqTJeCG7Vzhs9/29VC7w==}
+  /@css-render/vue3-ssr/0.15.12_vue@3.2.47:
+    resolution: {integrity: sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==}
     peerDependencies:
       vue: ^3.0.11
     dependencies:
-      vue: 3.2.38
+      vue: 3.2.47
     dev: false
 
   /@emotion/hash/0.8.0:
     resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
     dev: false
 
-  /@esbuild/linux-loong64/0.15.7:
-    resolution: {integrity: sha512-IKznSJOsVUuyt7cDzzSZyqBEcZe+7WlBqTVXiF1OXP/4Nm387ToaXZ0fyLwI1iBlI/bzpxVq411QE2/Bt2XWWw==}
+  /@esbuild/android-arm/0.16.17:
+    resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm64/0.16.17:
+    resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64/0.16.17:
+    resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64/0.16.17:
+    resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64/0.16.17:
+    resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64/0.16.17:
+    resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64/0.16.17:
+    resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm/0.16.17:
+    resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64/0.16.17:
+    resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32/0.16.17:
+    resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64/0.16.17:
+    resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]
@@ -429,15 +525,114 @@ packages:
     dev: true
     optional: true
 
-  /@eslint/eslintrc/1.3.1:
-    resolution: {integrity: sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==}
+  /@esbuild/linux-mips64el/0.16.17:
+    resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64/0.16.17:
+    resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64/0.16.17:
+    resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x/0.16.17:
+    resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64/0.16.17:
+    resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64/0.16.17:
+    resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64/0.16.17:
+    resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64/0.16.17:
+    resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64/0.16.17:
+    resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32/0.16.17:
+    resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64/0.16.17:
+    resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@eslint/eslintrc/2.0.0:
+    resolution: {integrity: sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
       ajv: 6.12.6
       debug: 4.3.4
-      espree: 9.4.0
-      globals: 13.17.0
-      ignore: 5.2.0
+      espree: 9.4.1
+      globals: 13.20.0
+      ignore: 5.2.4
       import-fresh: 3.3.0
       js-yaml: 4.1.0
       minimatch: 3.1.2
@@ -446,8 +641,13 @@ packages:
       - supports-color
     dev: true
 
-  /@humanwhocodes/config-array/0.10.4:
-    resolution: {integrity: sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==}
+  /@eslint/js/8.35.0:
+    resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dev: true
+
+  /@humanwhocodes/config-array/0.11.8:
+    resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
     engines: {node: '>=10.10.0'}
     dependencies:
       '@humanwhocodes/object-schema': 1.2.1
@@ -457,10 +657,6 @@ packages:
       - supports-color
     dev: true
 
-  /@humanwhocodes/gitignore-to-minimatch/1.0.2:
-    resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==}
-    dev: true
-
   /@humanwhocodes/module-importer/1.0.1:
     resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
     engines: {node: '>=12.22'}
@@ -522,7 +718,7 @@ packages:
     dependencies:
       '@jridgewell/set-array': 1.1.2
       '@jridgewell/sourcemap-codec': 1.4.14
-      '@jridgewell/trace-mapping': 0.3.15
+      '@jridgewell/trace-mapping': 0.3.17
     dev: true
 
   /@jridgewell/resolve-uri/3.1.0:
@@ -539,8 +735,8 @@ packages:
     resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
     dev: true
 
-  /@jridgewell/trace-mapping/0.3.15:
-    resolution: {integrity: sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==}
+  /@jridgewell/trace-mapping/0.3.17:
+    resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
     dependencies:
       '@jridgewell/resolve-uri': 3.1.0
       '@jridgewell/sourcemap-codec': 1.4.14
@@ -566,43 +762,55 @@ packages:
     engines: {node: '>= 8'}
     dependencies:
       '@nodelib/fs.scandir': 2.1.5
-      fastq: 1.13.0
+      fastq: 1.15.0
 
   /@types/json-schema/7.0.11:
     resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
     dev: true
 
-  /@types/json5/0.0.29:
-    resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
-    dev: true
+  /@types/katex/0.14.0:
+    resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==}
+    dev: false
 
   /@types/lodash-es/4.17.6:
     resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==}
     dependencies:
-      '@types/lodash': 4.14.184
+      '@types/lodash': 4.14.191
     dev: false
 
-  /@types/lodash/4.14.184:
-    resolution: {integrity: sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==}
+  /@types/lodash/4.14.191:
+    resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==}
 
-  /@types/node/17.0.45:
-    resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
-    dev: false
-
-  /@types/node/18.7.15:
-    resolution: {integrity: sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==}
+  /@types/node/18.14.6:
+    resolution: {integrity: sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==}
     dev: true
 
   /@types/nprogress/0.2.0:
     resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==}
     dev: true
 
-  /@types/web-bluetooth/0.0.15:
-    resolution: {integrity: sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==}
+  /@types/postcss-modules-local-by-default/4.0.0:
+    resolution: {integrity: sha512-0VLab/pcLTLcfbxi6THSIMVYcw9hEUBGvjwwaGpW77mMgRXfGF+a76t7BxTGyLh1y68tBvrffp8UWnqvm76+yg==}
+    dependencies:
+      postcss: 8.4.21
+    dev: true
+
+  /@types/postcss-modules-scope/3.0.1:
+    resolution: {integrity: sha512-LNkp3c4ML9EQj2dgslp4i80Jxj72YK3HjYzrTn6ftUVylW1zaKFGqrMlNIyqBmPWmIhZ/Y5r0Y4T49Hk1IuDUg==}
+    dependencies:
+      postcss: 8.4.21
+    dev: true
+
+  /@types/semver/7.3.13:
+    resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==}
+    dev: true
+
+  /@types/web-bluetooth/0.0.16:
+    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
     dev: false
 
-  /@typescript-eslint/eslint-plugin/5.36.2_iurrlxgqcgk5svigzxakafpeuu:
-    resolution: {integrity: sha512-OwwR8LRwSnI98tdc2z7mJYgY60gf7I9ZfGjN5EjCwwns9bdTuQfAXcsjSB2wSQ/TVNYSGKf4kzVXbNGaZvwiXw==}
+  /@typescript-eslint/eslint-plugin/5.54.0_6mj2wypvdnknez7kws2nfdgupi:
+    resolution: {integrity: sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       '@typescript-eslint/parser': ^5.0.0
@@ -612,24 +820,25 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 5.36.2_yqf6kl63nyoq5megxukfnom5rm
-      '@typescript-eslint/scope-manager': 5.36.2
-      '@typescript-eslint/type-utils': 5.36.2_yqf6kl63nyoq5megxukfnom5rm
-      '@typescript-eslint/utils': 5.36.2_yqf6kl63nyoq5megxukfnom5rm
+      '@typescript-eslint/parser': 5.54.0_ycpbpc6yetojsgtrx3mwntkhsu
+      '@typescript-eslint/scope-manager': 5.54.0
+      '@typescript-eslint/type-utils': 5.54.0_ycpbpc6yetojsgtrx3mwntkhsu
+      '@typescript-eslint/utils': 5.54.0_ycpbpc6yetojsgtrx3mwntkhsu
       debug: 4.3.4
-      eslint: 8.23.0
-      functional-red-black-tree: 1.0.1
-      ignore: 5.2.0
+      eslint: 8.35.0
+      grapheme-splitter: 1.0.4
+      ignore: 5.2.4
+      natural-compare-lite: 1.4.0
       regexpp: 3.2.0
-      semver: 7.3.7
-      tsutils: 3.21.0_typescript@4.8.2
-      typescript: 4.8.2
+      semver: 7.3.8
+      tsutils: 3.21.0_typescript@4.9.5
+      typescript: 4.9.5
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/parser/5.36.2_yqf6kl63nyoq5megxukfnom5rm:
-    resolution: {integrity: sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA==}
+  /@typescript-eslint/parser/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu:
+    resolution: {integrity: sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -638,26 +847,26 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/scope-manager': 5.36.2
-      '@typescript-eslint/types': 5.36.2
-      '@typescript-eslint/typescript-estree': 5.36.2_typescript@4.8.2
+      '@typescript-eslint/scope-manager': 5.54.0
+      '@typescript-eslint/types': 5.54.0
+      '@typescript-eslint/typescript-estree': 5.54.0_typescript@4.9.5
       debug: 4.3.4
-      eslint: 8.23.0
-      typescript: 4.8.2
+      eslint: 8.35.0
+      typescript: 4.9.5
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/scope-manager/5.36.2:
-    resolution: {integrity: sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==}
+  /@typescript-eslint/scope-manager/5.54.0:
+    resolution: {integrity: sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
-      '@typescript-eslint/types': 5.36.2
-      '@typescript-eslint/visitor-keys': 5.36.2
+      '@typescript-eslint/types': 5.54.0
+      '@typescript-eslint/visitor-keys': 5.54.0
     dev: true
 
-  /@typescript-eslint/type-utils/5.36.2_yqf6kl63nyoq5megxukfnom5rm:
-    resolution: {integrity: sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw==}
+  /@typescript-eslint/type-utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu:
+    resolution: {integrity: sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: '*'
@@ -666,23 +875,23 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/typescript-estree': 5.36.2_typescript@4.8.2
-      '@typescript-eslint/utils': 5.36.2_yqf6kl63nyoq5megxukfnom5rm
+      '@typescript-eslint/typescript-estree': 5.54.0_typescript@4.9.5
+      '@typescript-eslint/utils': 5.54.0_ycpbpc6yetojsgtrx3mwntkhsu
       debug: 4.3.4
-      eslint: 8.23.0
-      tsutils: 3.21.0_typescript@4.8.2
-      typescript: 4.8.2
+      eslint: 8.35.0
+      tsutils: 3.21.0_typescript@4.9.5
+      typescript: 4.9.5
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/types/5.36.2:
-    resolution: {integrity: sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==}
+  /@typescript-eslint/types/5.54.0:
+    resolution: {integrity: sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /@typescript-eslint/typescript-estree/5.36.2_typescript@4.8.2:
-    resolution: {integrity: sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==}
+  /@typescript-eslint/typescript-estree/5.54.0_typescript@4.9.5:
+    resolution: {integrity: sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       typescript: '*'
@@ -690,41 +899,43 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/types': 5.36.2
-      '@typescript-eslint/visitor-keys': 5.36.2
+      '@typescript-eslint/types': 5.54.0
+      '@typescript-eslint/visitor-keys': 5.54.0
       debug: 4.3.4
       globby: 11.1.0
       is-glob: 4.0.3
-      semver: 7.3.7
-      tsutils: 3.21.0_typescript@4.8.2
-      typescript: 4.8.2
+      semver: 7.3.8
+      tsutils: 3.21.0_typescript@4.9.5
+      typescript: 4.9.5
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/utils/5.36.2_yqf6kl63nyoq5megxukfnom5rm:
-    resolution: {integrity: sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg==}
+  /@typescript-eslint/utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu:
+    resolution: {integrity: sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
     dependencies:
       '@types/json-schema': 7.0.11
-      '@typescript-eslint/scope-manager': 5.36.2
-      '@typescript-eslint/types': 5.36.2
-      '@typescript-eslint/typescript-estree': 5.36.2_typescript@4.8.2
-      eslint: 8.23.0
+      '@types/semver': 7.3.13
+      '@typescript-eslint/scope-manager': 5.54.0
+      '@typescript-eslint/types': 5.54.0
+      '@typescript-eslint/typescript-estree': 5.54.0_typescript@4.9.5
+      eslint: 8.35.0
       eslint-scope: 5.1.1
-      eslint-utils: 3.0.0_eslint@8.23.0
+      eslint-utils: 3.0.0_eslint@8.35.0
+      semver: 7.3.8
     transitivePeerDependencies:
       - supports-color
       - typescript
     dev: true
 
-  /@typescript-eslint/visitor-keys/5.36.2:
-    resolution: {integrity: sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==}
+  /@typescript-eslint/visitor-keys/5.54.0:
+    resolution: {integrity: sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
-      '@typescript-eslint/types': 5.36.2
+      '@typescript-eslint/types': 5.54.0
       eslint-visitor-keys: 3.3.0
     dev: true
 
@@ -732,84 +943,84 @@ packages:
     resolution: {integrity: sha512-C0p6aO1EmGG1QHrqgUWQS1No20934OdWSRQshM5NIDK5H1On6tC26U0hT6Rmp40KfUsvhvX5YW8BoWJdNFifPg==}
     dev: true
 
-  /@vitejs/plugin-vue-jsx/2.0.1_vite@3.1.0+vue@3.2.38:
-    resolution: {integrity: sha512-lmiR1k9+lrF7LMczO0pxtQ8mOn6XeppJDHxnpxkJQpT5SiKz4SKhKdeNstXaTNuR8qZhUo5X0pJlcocn72Y4Jg==}
+  /@vitejs/plugin-vue-jsx/3.0.0_vite@4.1.4+vue@3.2.47:
+    resolution: {integrity: sha512-vurkuzgac5SYuxd2HUZqAFAWGTF10diKBwJNbCvnWijNZfXd+7jMtqjPFbGt7idOJUn584fP1Ar9j/GN2jQ3Ew==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
-      vite: ^3.0.0
+      vite: ^4.0.0
       vue: ^3.0.0
     dependencies:
-      '@babel/core': 7.19.0
-      '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.19.0
-      '@babel/plugin-transform-typescript': 7.19.0_@babel+core@7.19.0
-      '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.19.0
-      vite: 3.1.0_sass@1.54.8
-      vue: 3.2.38
+      '@babel/core': 7.21.0
+      '@babel/plugin-transform-typescript': 7.21.0_@babel+core@7.21.0
+      '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.21.0
+      vite: 4.1.4_tbu6ibuzbmq2zng52hwcifltki
+      vue: 3.2.47
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@vitejs/plugin-vue/3.1.0_vite@3.1.0+vue@3.2.38:
-    resolution: {integrity: sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==}
+  /@vitejs/plugin-vue/4.0.0_vite@4.1.4+vue@3.2.47:
+    resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
-      vite: ^3.0.0
+      vite: ^4.0.0
       vue: ^3.2.25
     dependencies:
-      vite: 3.1.0_sass@1.54.8
-      vue: 3.2.38
+      vite: 4.1.4_tbu6ibuzbmq2zng52hwcifltki
+      vue: 3.2.47
     dev: true
 
-  /@volar/code-gen/0.40.9:
-    resolution: {integrity: sha512-SlLwXi1XzZG9ta4MQ6a2cdbtVYA4ibZFIK1Eb51Ii05m1AvrYvdOsLXOOC6ezRK2bws9dPEKbW0eYYnCoMjM3w==}
+  /@volar/language-core/1.3.0-alpha.0:
+    resolution: {integrity: sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==}
     dependencies:
-      '@volar/source-map': 0.40.9
+      '@volar/source-map': 1.3.0-alpha.0
     dev: true
 
-  /@volar/source-map/0.40.9:
-    resolution: {integrity: sha512-hJcedV2DXVfsu2fBKRuXX4s3WgQYIVtzQSGbfba5/+krY5joZzegnccJJPj/3TIo6P+1/p9CFi10xxP16JUGwQ==}
+  /@volar/source-map/1.3.0-alpha.0:
+    resolution: {integrity: sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==}
     dependencies:
-      '@vue/reactivity': 3.2.38
+      muggle-string: 0.2.2
     dev: true
 
-  /@volar/typescript-faster/0.40.9:
-    resolution: {integrity: sha512-27kVrBwXX/qRLnD/MqsXUYRiYDLjfgwDsdMXKN7Nq7acMvYWmImY9k71x6hyDb/97iKvHFmgxbBlgN3SDcTcxg==}
+  /@volar/typescript/1.3.0-alpha.0:
+    resolution: {integrity: sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==}
     dependencies:
-      semver: 7.3.7
+      '@volar/language-core': 1.3.0-alpha.0
     dev: true
 
-  /@volar/vue-language-core/0.40.9:
-    resolution: {integrity: sha512-Vmx2l7IOl2NCg1RT+CYJowUG2MiAZOZ9OkBVPWZN+GYFcE6W90UDbGJyO64zSqlw/fYO0ERPRvxSBX0IULiigQ==}
+  /@volar/vue-language-core/1.2.0:
+    resolution: {integrity: sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==}
     dependencies:
-      '@volar/code-gen': 0.40.9
-      '@volar/source-map': 0.40.9
-      '@vue/compiler-core': 3.2.38
-      '@vue/compiler-dom': 3.2.38
-      '@vue/compiler-sfc': 3.2.38
-      '@vue/reactivity': 3.2.38
-      '@vue/shared': 3.2.38
+      '@volar/language-core': 1.3.0-alpha.0
+      '@volar/source-map': 1.3.0-alpha.0
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-sfc': 3.2.47
+      '@vue/reactivity': 3.2.47
+      '@vue/shared': 3.2.47
+      minimatch: 6.2.0
+      muggle-string: 0.2.2
+      vue-template-compiler: 2.7.14
     dev: true
 
-  /@volar/vue-typescript/0.40.9:
-    resolution: {integrity: sha512-2k+7B5WGGOWIr0vBNpe7PzkOCRnrbkRpBLpeQJ7TSprnE4oi3OzVDcxDBXIGhW1+ccMJcBcASv2LrvVALbQKZA==}
+  /@volar/vue-typescript/1.2.0:
+    resolution: {integrity: sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==}
     dependencies:
-      '@volar/code-gen': 0.40.9
-      '@volar/typescript-faster': 0.40.9
-      '@volar/vue-language-core': 0.40.9
+      '@volar/typescript': 1.3.0-alpha.0
+      '@volar/vue-language-core': 1.2.0
     dev: true
 
   /@vue/babel-helper-vue-transform-on/1.0.2:
     resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==}
     dev: true
 
-  /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.19.0:
+  /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.21.0:
     resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==}
     dependencies:
       '@babel/helper-module-imports': 7.18.6
-      '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.0
-      '@babel/template': 7.18.10
-      '@babel/traverse': 7.19.0
-      '@babel/types': 7.19.0
+      '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.0
+      '@babel/template': 7.20.7
+      '@babel/traverse': 7.21.2
+      '@babel/types': 7.21.2
       '@vue/babel-helper-vue-transform-on': 1.0.2
       camelcase: 6.3.0
       html-tags: 3.2.0
@@ -819,114 +1030,114 @@ packages:
       - supports-color
     dev: true
 
-  /@vue/compiler-core/3.2.38:
-    resolution: {integrity: sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==}
+  /@vue/compiler-core/3.2.47:
+    resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==}
     dependencies:
-      '@babel/parser': 7.19.0
-      '@vue/shared': 3.2.38
+      '@babel/parser': 7.21.2
+      '@vue/shared': 3.2.47
       estree-walker: 2.0.2
       source-map: 0.6.1
 
-  /@vue/compiler-dom/3.2.38:
-    resolution: {integrity: sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==}
+  /@vue/compiler-dom/3.2.47:
+    resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==}
     dependencies:
-      '@vue/compiler-core': 3.2.38
-      '@vue/shared': 3.2.38
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
 
-  /@vue/compiler-sfc/3.2.38:
-    resolution: {integrity: sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==}
+  /@vue/compiler-sfc/3.2.47:
+    resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==}
     dependencies:
-      '@babel/parser': 7.19.0
-      '@vue/compiler-core': 3.2.38
-      '@vue/compiler-dom': 3.2.38
-      '@vue/compiler-ssr': 3.2.38
-      '@vue/reactivity-transform': 3.2.38
-      '@vue/shared': 3.2.38
+      '@babel/parser': 7.21.2
+      '@vue/compiler-core': 3.2.47
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-ssr': 3.2.47
+      '@vue/reactivity-transform': 3.2.47
+      '@vue/shared': 3.2.47
       estree-walker: 2.0.2
       magic-string: 0.25.9
-      postcss: 8.4.16
+      postcss: 8.4.21
       source-map: 0.6.1
 
-  /@vue/compiler-ssr/3.2.38:
-    resolution: {integrity: sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==}
+  /@vue/compiler-ssr/3.2.47:
+    resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==}
     dependencies:
-      '@vue/compiler-dom': 3.2.38
-      '@vue/shared': 3.2.38
+      '@vue/compiler-dom': 3.2.47
+      '@vue/shared': 3.2.47
 
-  /@vue/devtools-api/6.2.1:
-    resolution: {integrity: sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==}
+  /@vue/devtools-api/6.5.0:
+    resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==}
     dev: false
 
-  /@vue/reactivity-transform/3.2.38:
-    resolution: {integrity: sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==}
+  /@vue/reactivity-transform/3.2.47:
+    resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==}
     dependencies:
-      '@babel/parser': 7.19.0
-      '@vue/compiler-core': 3.2.38
-      '@vue/shared': 3.2.38
+      '@babel/parser': 7.21.2
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
       estree-walker: 2.0.2
       magic-string: 0.25.9
 
-  /@vue/reactivity/3.2.38:
-    resolution: {integrity: sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==}
+  /@vue/reactivity/3.2.47:
+    resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==}
     dependencies:
-      '@vue/shared': 3.2.38
+      '@vue/shared': 3.2.47
 
-  /@vue/runtime-core/3.2.38:
-    resolution: {integrity: sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg==}
+  /@vue/runtime-core/3.2.47:
+    resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==}
     dependencies:
-      '@vue/reactivity': 3.2.38
-      '@vue/shared': 3.2.38
+      '@vue/reactivity': 3.2.47
+      '@vue/shared': 3.2.47
 
-  /@vue/runtime-dom/3.2.38:
-    resolution: {integrity: sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A==}
+  /@vue/runtime-dom/3.2.47:
+    resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==}
     dependencies:
-      '@vue/runtime-core': 3.2.38
-      '@vue/shared': 3.2.38
-      csstype: 2.6.20
+      '@vue/runtime-core': 3.2.47
+      '@vue/shared': 3.2.47
+      csstype: 2.6.21
 
-  /@vue/server-renderer/3.2.38_vue@3.2.38:
-    resolution: {integrity: sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA==}
+  /@vue/server-renderer/3.2.47_vue@3.2.47:
+    resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==}
     peerDependencies:
-      vue: 3.2.38
+      vue: 3.2.47
     dependencies:
-      '@vue/compiler-ssr': 3.2.38
-      '@vue/shared': 3.2.38
-      vue: 3.2.38
+      '@vue/compiler-ssr': 3.2.47
+      '@vue/shared': 3.2.47
+      vue: 3.2.47
 
-  /@vue/shared/3.2.38:
-    resolution: {integrity: sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==}
+  /@vue/shared/3.2.47:
+    resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==}
 
-  /@vueuse/core/9.2.0_vue@3.2.38:
-    resolution: {integrity: sha512-/MZ6qpz6uSyaXrtoeBWQzAKRG3N7CvfVWvQxiM3ei3Xe5ydOjjtVbo7lGl9p8dECV93j7W8s63A8H0kFLpLyxg==}
+  /@vueuse/core/9.13.0_vue@3.2.47:
+    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
     dependencies:
-      '@types/web-bluetooth': 0.0.15
-      '@vueuse/metadata': 9.2.0
-      '@vueuse/shared': 9.2.0_vue@3.2.38
-      vue-demi: 0.13.11_vue@3.2.38
+      '@types/web-bluetooth': 0.0.16
+      '@vueuse/metadata': 9.13.0
+      '@vueuse/shared': 9.13.0_vue@3.2.47
+      vue-demi: 0.13.11_vue@3.2.47
     transitivePeerDependencies:
       - '@vue/composition-api'
       - vue
     dev: false
 
-  /@vueuse/metadata/9.2.0:
-    resolution: {integrity: sha512-exN4KE6iquxDCdt72BgEhb3tlOpECtD61AUdXnUqBTIUCl70x1Ar/QXo3bYcvxmdMS2/peQyfeTzBjRTpvL5xw==}
+  /@vueuse/metadata/9.13.0:
+    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
     dev: false
 
-  /@vueuse/shared/9.2.0_vue@3.2.38:
-    resolution: {integrity: sha512-NnRp/noSWuXW0dKhZK5D0YLrDi0nmZ18UeEgwXQq7Ul5TTP93lcNnKjrHtd68j2xFB/l59yPGFlCryL692bnrA==}
+  /@vueuse/shared/9.13.0_vue@3.2.47:
+    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
     dependencies:
-      vue-demi: 0.13.11_vue@3.2.38
+      vue-demi: 0.13.11_vue@3.2.47
     transitivePeerDependencies:
       - '@vue/composition-api'
       - vue
     dev: false
 
-  /acorn-jsx/5.3.2_acorn@8.8.0:
+  /acorn-jsx/5.3.2_acorn@8.8.2:
     resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
     peerDependencies:
       acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
     dependencies:
-      acorn: 8.8.0
+      acorn: 8.8.2
     dev: true
 
   /acorn-node/1.8.2:
@@ -948,8 +1159,8 @@ packages:
     hasBin: true
     dev: false
 
-  /acorn/8.8.0:
-    resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==}
+  /acorn/8.8.2:
+    resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
     engines: {node: '>=0.4.0'}
     hasBin: true
     dev: true
@@ -982,8 +1193,8 @@ packages:
       color-convert: 2.0.1
     dev: true
 
-  /anymatch/3.1.2:
-    resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
+  /anymatch/3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
     engines: {node: '>= 8'}
     dependencies:
       normalize-path: 3.0.0
@@ -1010,33 +1221,28 @@ packages:
     resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
     dev: false
 
-  /atob/2.1.2:
-    resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
-    engines: {node: '>= 4.5.0'}
-    hasBin: true
-    dev: true
-
-  /autoprefixer/10.4.8_postcss@8.4.16:
-    resolution: {integrity: sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==}
+  /autoprefixer/10.4.13_postcss@8.4.21:
+    resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==}
     engines: {node: ^10 || ^12 || >=14}
     hasBin: true
     peerDependencies:
       postcss: ^8.1.0
     dependencies:
-      browserslist: 4.21.3
-      caniuse-lite: 1.0.30001390
+      browserslist: 4.21.5
+      caniuse-lite: 1.0.30001460
       fraction.js: 4.2.0
       normalize-range: 0.1.2
       picocolors: 1.0.0
-      postcss: 8.4.16
+      postcss: 8.4.21
       postcss-value-parser: 4.2.0
     dev: false
 
-  /axios/0.27.2:
-    resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
+  /axios/1.3.4:
+    resolution: {integrity: sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==}
     dependencies:
-      follow-redirects: 1.15.1
+      follow-redirects: 1.15.2
       form-data: 4.0.0
+      proxy-from-env: 1.1.0
     transitivePeerDependencies:
       - debug
     dev: false
@@ -1045,10 +1251,6 @@ packages:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
     dev: true
 
-  /big.js/3.2.0:
-    resolution: {integrity: sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==}
-    dev: true
-
   /binary-extensions/2.2.0:
     resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
     engines: {node: '>=8'}
@@ -1064,21 +1266,27 @@ packages:
       concat-map: 0.0.1
     dev: true
 
+  /brace-expansion/2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+    dependencies:
+      balanced-match: 1.0.2
+    dev: true
+
   /braces/3.0.2:
     resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
     engines: {node: '>=8'}
     dependencies:
       fill-range: 7.0.1
 
-  /browserslist/4.21.3:
-    resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==}
+  /browserslist/4.21.5:
+    resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==}
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
     hasBin: true
     dependencies:
-      caniuse-lite: 1.0.30001390
-      electron-to-chromium: 1.4.242
-      node-releases: 2.0.6
-      update-browserslist-db: 1.0.7_browserslist@4.21.3
+      caniuse-lite: 1.0.30001460
+      electron-to-chromium: 1.4.320
+      node-releases: 2.0.10
+      update-browserslist-db: 1.0.10_browserslist@4.21.5
 
   /callsites/3.1.0:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
@@ -1095,8 +1303,8 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /caniuse-lite/1.0.30001390:
-    resolution: {integrity: sha512-sS4CaUM+/+vqQUlCvCJ2WtDlV81aWtHhqeEVkLokVJJa3ViN4zDxAGfq9R8i1m90uGHxo99cy10Od+lvn3hf0g==}
+  /caniuse-lite/1.0.30001460:
+    resolution: {integrity: sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==}
 
   /chalk/2.4.2:
     resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
@@ -1119,7 +1327,7 @@ packages:
     resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
     engines: {node: '>= 8.10.0'}
     dependencies:
-      anymatch: 3.1.2
+      anymatch: 3.1.3
       braces: 3.0.2
       glob-parent: 5.1.2
       is-binary-path: 2.1.0
@@ -1160,10 +1368,8 @@ packages:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
     dev: true
 
-  /convert-source-map/1.8.0:
-    resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==}
-    dependencies:
-      safe-buffer: 5.1.2
+  /convert-source-map/1.9.0:
+    resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
     dev: true
 
   /copy-anything/2.0.6:
@@ -1181,43 +1387,20 @@ packages:
       which: 2.0.2
     dev: true
 
-  /css-parse/2.0.0:
-    resolution: {integrity: sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==}
-    dependencies:
-      css: 2.2.4
-    dev: true
-
-  /css-render/0.15.11:
-    resolution: {integrity: sha512-hnLrHPUndVUTF5nmNPRey6hpixK02IPUGdEsm2xRjvJuewToyrVFx9Nmai8rgfVzhTFo5SJVh2PHAtzaIV8JKw==}
+  /css-render/0.15.12:
+    resolution: {integrity: sha512-eWzS66patiGkTTik+ipO9qNGZ+uNuGyTmnz6/+EJIiFg8+3yZRpnMwgFo8YdXhQRsiePzehnusrxVvugNjXzbw==}
     dependencies:
       '@emotion/hash': 0.8.0
-      '@types/node': 17.0.45
       csstype: 3.0.11
     dev: false
 
-  /css-selector-tokenizer/0.7.3:
-    resolution: {integrity: sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==}
-    dependencies:
-      cssesc: 3.0.0
-      fastparse: 1.1.2
-    dev: true
-
-  /css/2.2.4:
-    resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==}
-    dependencies:
-      inherits: 2.0.4
-      source-map: 0.6.1
-      source-map-resolve: 0.5.3
-      urix: 0.1.0
-    dev: true
-
   /cssesc/3.0.0:
     resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
     engines: {node: '>=4'}
     hasBin: true
 
-  /csstype/2.6.20:
-    resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==}
+  /csstype/2.6.21:
+    resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
 
   /csstype/3.0.11:
     resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==}
@@ -1232,28 +1415,29 @@ packages:
       chokidar: 3.5.3
     dev: true
 
-  /date-fns-tz/1.3.7_date-fns@2.29.2:
-    resolution: {integrity: sha512-1t1b8zyJo+UI8aR+g3iqr5fkUHWpd58VBx8J/ZSQ+w7YrGlw80Ag4sA86qkfCXRBLmMc4I2US+aPMd4uKvwj5g==}
+  /date-fns-tz/1.3.8_date-fns@2.29.3:
+    resolution: {integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==}
     peerDependencies:
       date-fns: '>=2.0.0'
     dependencies:
-      date-fns: 2.29.2
+      date-fns: 2.29.3
     dev: false
 
-  /date-fns/2.29.2:
-    resolution: {integrity: sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==}
+  /date-fns-tz/2.0.0_date-fns@2.29.3:
+    resolution: {integrity: sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ==}
+    peerDependencies:
+      date-fns: '>=2.0.0'
+    dependencies:
+      date-fns: 2.29.3
+    dev: false
+
+  /date-fns/2.29.3:
+    resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==}
     engines: {node: '>=0.11'}
     dev: false
 
-  /debug/3.1.0:
-    resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
-    dependencies:
-      ms: 2.0.0
+  /de-indent/1.0.2:
+    resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
     dev: true
 
   /debug/3.2.7:
@@ -1280,17 +1464,12 @@ packages:
       ms: 2.1.2
     dev: true
 
-  /decode-uri-component/0.2.0:
-    resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==}
-    engines: {node: '>=0.10'}
-    dev: true
-
   /deep-is/0.1.4:
     resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
     dev: true
 
-  /defined/1.0.0:
-    resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==}
+  /defined/1.0.1:
+    resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
     dev: false
 
   /delayed-stream/1.0.0:
@@ -1304,8 +1483,8 @@ packages:
     hasBin: true
     dependencies:
       acorn-node: 1.8.2
-      defined: 1.0.0
-      minimist: 1.2.6
+      defined: 1.0.1
+      minimist: 1.2.8
     dev: false
 
   /didyoumean/1.2.2:
@@ -1330,25 +1509,20 @@ packages:
       esutils: 2.0.3
     dev: true
 
-  /dotenv/10.0.0:
-    resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==}
-    engines: {node: '>=10'}
+  /dotenv/16.0.3:
+    resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
+    engines: {node: '>=12'}
     dev: true
 
-  /echarts/5.3.3:
-    resolution: {integrity: sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==}
+  /echarts/5.4.1:
+    resolution: {integrity: sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==}
     dependencies:
       tslib: 2.3.0
-      zrender: 5.3.2
+      zrender: 5.4.1
     dev: false
 
-  /electron-to-chromium/1.4.242:
-    resolution: {integrity: sha512-nPdgMWtjjWGCtreW/2adkrB2jyHjClo9PtVhR6rW+oxa4E4Wom642Tn+5LslHP3XPL5MCpkn5/UEY60EXylNeQ==}
-
-  /emojis-list/2.1.0:
-    resolution: {integrity: sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==}
-    engines: {node: '>= 0.10'}
-    dev: true
+  /electron-to-chromium/1.4.320:
+    resolution: {integrity: sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q==}
 
   /errno/0.1.8:
     resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
@@ -1359,213 +1533,34 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-android-64/0.15.7:
-    resolution: {integrity: sha512-p7rCvdsldhxQr3YHxptf1Jcd86dlhvc3EQmQJaZzzuAxefO9PvcI0GLOa5nCWem1AJ8iMRu9w0r5TG8pHmbi9w==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-android-arm64/0.15.7:
-    resolution: {integrity: sha512-L775l9ynJT7rVqRM5vo+9w5g2ysbOCfsdLV4CWanTZ1k/9Jb3IYlQ06VCI1edhcosTYJRECQFJa3eAvkx72eyQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-64/0.15.7:
-    resolution: {integrity: sha512-KGPt3r1c9ww009t2xLB6Vk0YyNOXh7hbjZ3EecHoVDxgtbUlYstMPDaReimKe6eOEfyY4hBEEeTvKwPsiH5WZg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-arm64/0.15.7:
-    resolution: {integrity: sha512-kBIHvtVqbSGajN88lYMnR3aIleH3ABZLLFLxwL2stiuIGAjGlQW741NxVTpUHQXUmPzxi6POqc9npkXa8AcSZQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-64/0.15.7:
-    resolution: {integrity: sha512-hESZB91qDLV5MEwNxzMxPfbjAhOmtfsr9Wnuci7pY6TtEh4UDuevmGmkUIjX/b+e/k4tcNBMf7SRQ2mdNuK/HQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-arm64/0.15.7:
-    resolution: {integrity: sha512-dLFR0ChH5t+b3J8w0fVKGvtwSLWCv7GYT2Y2jFGulF1L5HftQLzVGN+6pi1SivuiVSmTh28FwUhi9PwQicXI6Q==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-32/0.15.7:
-    resolution: {integrity: sha512-v3gT/LsONGUZcjbt2swrMjwxo32NJzk+7sAgtxhGx1+ZmOFaTRXBAi1PPfgpeo/J//Un2jIKm/I+qqeo4caJvg==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-64/0.15.7:
-    resolution: {integrity: sha512-LxXEfLAKwOVmm1yecpMmWERBshl+Kv5YJ/1KnyAr6HRHFW8cxOEsEfisD3sVl/RvHyW//lhYUVSuy9jGEfIRAQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm/0.15.7:
-    resolution: {integrity: sha512-JKgAHtMR5f75wJTeuNQbyznZZa+pjiUHV7sRZp42UNdyXC6TiUYMW/8z8yIBAr2Fpad8hM1royZKQisqPABPvQ==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm64/0.15.7:
-    resolution: {integrity: sha512-P3cfhudpzWDkglutWgXcT2S7Ft7o2e3YDMrP1n0z2dlbUZghUkKCyaWw0zhp4KxEEzt/E7lmrtRu/pGWnwb9vw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-mips64le/0.15.7:
-    resolution: {integrity: sha512-T7XKuxl0VpeFLCJXub6U+iybiqh0kM/bWOTb4qcPyDDwNVhLUiPcGdG2/0S7F93czUZOKP57YiLV8YQewgLHKw==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-ppc64le/0.15.7:
-    resolution: {integrity: sha512-6mGuC19WpFN7NYbecMIJjeQgvDb5aMuvyk0PDYBJrqAEMkTwg3Z98kEKuCm6THHRnrgsdr7bp4SruSAxEM4eJw==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-riscv64/0.15.7:
-    resolution: {integrity: sha512-uUJsezbswAYo/X7OU/P+PuL/EI9WzxsEQXDekfwpQ23uGiooxqoLFAPmXPcRAt941vjlY9jtITEEikWMBr+F/g==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-s390x/0.15.7:
-    resolution: {integrity: sha512-+tO+xOyTNMc34rXlSxK7aCwJgvQyffqEM5MMdNDEeMU3ss0S6wKvbBOQfgd5jRPblfwJ6b+bKiz0g5nABpY0QQ==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-netbsd-64/0.15.7:
-    resolution: {integrity: sha512-yVc4Wz+Pu3cP5hzm5kIygNPrjar/v5WCSoRmIjCPWfBVJkZNb5brEGKUlf+0Y759D48BCWa0WHrWXaNy0DULTQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-openbsd-64/0.15.7:
-    resolution: {integrity: sha512-GsimbwC4FSR4lN3wf8XmTQ+r8/0YSQo21rWDL0XFFhLHKlzEA4SsT1Tl8bPYu00IU6UWSJ+b3fG/8SB69rcuEQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-sunos-64/0.15.7:
-    resolution: {integrity: sha512-8CDI1aL/ts0mDGbWzjEOGKXnU7p3rDzggHSBtVryQzkSOsjCHRVe0iFYUuhczlxU1R3LN/E7HgUO4NXzGGP/Ag==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-32/0.15.7:
-    resolution: {integrity: sha512-cOnKXUEPS8EGCzRSFa1x6NQjGhGsFlVgjhqGEbLTPsA7x4RRYiy2RKoArNUU4iR2vHmzqS5Gr84MEumO/wxYKA==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-64/0.15.7:
-    resolution: {integrity: sha512-7MI08Ec2sTIDv+zH6StNBKO+2hGUYIT42GmFyW6MBBWWtJhTcQLinKS6ldIN1d52MXIbiJ6nXyCJ+LpL4jBm3Q==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-arm64/0.15.7:
-    resolution: {integrity: sha512-R06nmqBlWjKHddhRJYlqDd3Fabx9LFdKcjoOy08YLimwmsswlFBJV4rXzZCxz/b7ZJXvrZgj8DDv1ewE9+StMw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild/0.15.7:
-    resolution: {integrity: sha512-7V8tzllIbAQV1M4QoE52ImKu8hT/NLGlGXkiDsbEU5PS6K8Mn09ZnYoS+dcmHxOS9CRsV4IRAMdT3I67IyUNXw==}
+  /esbuild/0.16.17:
+    resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@esbuild/linux-loong64': 0.15.7
-      esbuild-android-64: 0.15.7
-      esbuild-android-arm64: 0.15.7
-      esbuild-darwin-64: 0.15.7
-      esbuild-darwin-arm64: 0.15.7
-      esbuild-freebsd-64: 0.15.7
-      esbuild-freebsd-arm64: 0.15.7
-      esbuild-linux-32: 0.15.7
-      esbuild-linux-64: 0.15.7
-      esbuild-linux-arm: 0.15.7
-      esbuild-linux-arm64: 0.15.7
-      esbuild-linux-mips64le: 0.15.7
-      esbuild-linux-ppc64le: 0.15.7
-      esbuild-linux-riscv64: 0.15.7
-      esbuild-linux-s390x: 0.15.7
-      esbuild-netbsd-64: 0.15.7
-      esbuild-openbsd-64: 0.15.7
-      esbuild-sunos-64: 0.15.7
-      esbuild-windows-32: 0.15.7
-      esbuild-windows-64: 0.15.7
-      esbuild-windows-arm64: 0.15.7
+      '@esbuild/android-arm': 0.16.17
+      '@esbuild/android-arm64': 0.16.17
+      '@esbuild/android-x64': 0.16.17
+      '@esbuild/darwin-arm64': 0.16.17
+      '@esbuild/darwin-x64': 0.16.17
+      '@esbuild/freebsd-arm64': 0.16.17
+      '@esbuild/freebsd-x64': 0.16.17
+      '@esbuild/linux-arm': 0.16.17
+      '@esbuild/linux-arm64': 0.16.17
+      '@esbuild/linux-ia32': 0.16.17
+      '@esbuild/linux-loong64': 0.16.17
+      '@esbuild/linux-mips64el': 0.16.17
+      '@esbuild/linux-ppc64': 0.16.17
+      '@esbuild/linux-riscv64': 0.16.17
+      '@esbuild/linux-s390x': 0.16.17
+      '@esbuild/linux-x64': 0.16.17
+      '@esbuild/netbsd-x64': 0.16.17
+      '@esbuild/openbsd-x64': 0.16.17
+      '@esbuild/sunos-x64': 0.16.17
+      '@esbuild/win32-arm64': 0.16.17
+      '@esbuild/win32-ia32': 0.16.17
+      '@esbuild/win32-x64': 0.16.17
     dev: true
 
   /escalade/3.1.1:
@@ -1582,16 +1577,16 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /eslint-config-prettier/8.5.0_eslint@8.23.0:
-    resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==}
+  /eslint-config-prettier/8.6.0_eslint@8.35.0:
+    resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==}
     hasBin: true
     peerDependencies:
       eslint: '>=7.0.0'
     dependencies:
-      eslint: 8.23.0
+      eslint: 8.35.0
     dev: true
 
-  /eslint-plugin-prettier/4.2.1_tgumt6uwl2md3n6uqnggd6wvce:
+  /eslint-plugin-prettier/4.2.1_u2zha4kiojzs42thzpgwygphmy:
     resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
     engines: {node: '>=12.0.0'}
     peerDependencies:
@@ -1602,25 +1597,25 @@ packages:
       eslint-config-prettier:
         optional: true
     dependencies:
-      eslint: 8.23.0
-      eslint-config-prettier: 8.5.0_eslint@8.23.0
-      prettier: 2.7.1
+      eslint: 8.35.0
+      eslint-config-prettier: 8.6.0_eslint@8.35.0
+      prettier: 2.8.4
       prettier-linter-helpers: 1.0.0
     dev: true
 
-  /eslint-plugin-vue/9.4.0_eslint@8.23.0:
-    resolution: {integrity: sha512-Nzz2QIJ8FG+rtJaqT/7/ru5ie2XgT9KCudkbN0y3uFYhQ41nuHEaboLAiqwMcK006hZPQv/rVMRhUIwEGhIvfQ==}
+  /eslint-plugin-vue/9.9.0_eslint@8.35.0:
+    resolution: {integrity: sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
     dependencies:
-      eslint: 8.23.0
-      eslint-utils: 3.0.0_eslint@8.23.0
+      eslint: 8.35.0
+      eslint-utils: 3.0.0_eslint@8.35.0
       natural-compare: 1.4.0
       nth-check: 2.1.1
-      postcss-selector-parser: 6.0.10
-      semver: 7.3.7
-      vue-eslint-parser: 9.0.3_eslint@8.23.0
+      postcss-selector-parser: 6.0.11
+      semver: 7.3.8
+      vue-eslint-parser: 9.1.0_eslint@8.35.0
       xml-name-validator: 4.0.0
     transitivePeerDependencies:
       - supports-color
@@ -1642,13 +1637,13 @@ packages:
       estraverse: 5.3.0
     dev: true
 
-  /eslint-utils/3.0.0_eslint@8.23.0:
+  /eslint-utils/3.0.0_eslint@8.35.0:
     resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
     engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
     peerDependencies:
       eslint: '>=5'
     dependencies:
-      eslint: 8.23.0
+      eslint: 8.35.0
       eslint-visitor-keys: 2.1.0
     dev: true
 
@@ -1662,15 +1657,16 @@ packages:
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /eslint/8.23.0:
-    resolution: {integrity: sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==}
+  /eslint/8.35.0:
+    resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     hasBin: true
     dependencies:
-      '@eslint/eslintrc': 1.3.1
-      '@humanwhocodes/config-array': 0.10.4
-      '@humanwhocodes/gitignore-to-minimatch': 1.0.2
+      '@eslint/eslintrc': 2.0.0
+      '@eslint/js': 8.35.0
+      '@humanwhocodes/config-array': 0.11.8
       '@humanwhocodes/module-importer': 1.0.1
+      '@nodelib/fs.walk': 1.2.8
       ajv: 6.12.6
       chalk: 4.1.2
       cross-spawn: 7.0.3
@@ -1678,23 +1674,23 @@ packages:
       doctrine: 3.0.0
       escape-string-regexp: 4.0.0
       eslint-scope: 7.1.1
-      eslint-utils: 3.0.0_eslint@8.23.0
+      eslint-utils: 3.0.0_eslint@8.35.0
       eslint-visitor-keys: 3.3.0
-      espree: 9.4.0
-      esquery: 1.4.0
+      espree: 9.4.1
+      esquery: 1.5.0
       esutils: 2.0.3
       fast-deep-equal: 3.1.3
       file-entry-cache: 6.0.1
       find-up: 5.0.0
-      functional-red-black-tree: 1.0.1
       glob-parent: 6.0.2
-      globals: 13.17.0
-      globby: 11.1.0
+      globals: 13.20.0
       grapheme-splitter: 1.0.4
-      ignore: 5.2.0
+      ignore: 5.2.4
       import-fresh: 3.3.0
       imurmurhash: 0.1.4
       is-glob: 4.0.3
+      is-path-inside: 3.0.3
+      js-sdsl: 4.3.0
       js-yaml: 4.1.0
       json-stable-stringify-without-jsonify: 1.0.1
       levn: 0.4.1
@@ -1710,17 +1706,17 @@ packages:
       - supports-color
     dev: true
 
-  /espree/9.4.0:
-    resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==}
+  /espree/9.4.1:
+    resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
-      acorn: 8.8.0
-      acorn-jsx: 5.3.2_acorn@8.8.0
+      acorn: 8.8.2
+      acorn-jsx: 5.3.2_acorn@8.8.2
       eslint-visitor-keys: 3.3.0
     dev: true
 
-  /esquery/1.4.0:
-    resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
+  /esquery/1.5.0:
+    resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
     engines: {node: '>=0.10'}
     dependencies:
       estraverse: 5.3.0
@@ -1763,8 +1759,8 @@ packages:
     resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
     dev: true
 
-  /fast-glob/3.2.11:
-    resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
+  /fast-glob/3.2.12:
+    resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
     engines: {node: '>=8.6.0'}
     dependencies:
       '@nodelib/fs.stat': 2.0.5
@@ -1781,12 +1777,8 @@ packages:
     resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
     dev: true
 
-  /fastparse/1.1.2:
-    resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==}
-    dev: true
-
-  /fastq/1.13.0:
-    resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
+  /fastq/1.15.0:
+    resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
     dependencies:
       reusify: 1.0.4
 
@@ -1823,8 +1815,8 @@ packages:
     resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
     dev: true
 
-  /follow-redirects/1.15.1:
-    resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==}
+  /follow-redirects/1.15.2:
+    resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
     engines: {node: '>=4.0'}
     peerDependencies:
       debug: '*'
@@ -1869,16 +1861,6 @@ packages:
   /function-bind/1.1.1:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
 
-  /functional-red-black-tree/1.0.1:
-    resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
-    dev: true
-
-  /generic-names/1.0.3:
-    resolution: {integrity: sha512-b6OHfQuKasIKM9b6YPkX+KUj/TLBTx3B/1aT1T5F12FEuEqyFMdr59OMS53aoaSw8eVtapdqieX6lbg5opaOhA==}
-    dependencies:
-      loader-utils: 0.2.17
-    dev: true
-
   /gensync/1.0.0-beta.2:
     resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
     engines: {node: '>=6.9.0'}
@@ -1912,8 +1894,8 @@ packages:
     engines: {node: '>=4'}
     dev: true
 
-  /globals/13.17.0:
-    resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==}
+  /globals/13.20.0:
+    resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
     engines: {node: '>=8'}
     dependencies:
       type-fest: 0.20.2
@@ -1925,8 +1907,8 @@ packages:
     dependencies:
       array-union: 2.1.0
       dir-glob: 3.0.1
-      fast-glob: 3.2.11
-      ignore: 5.2.0
+      fast-glob: 3.2.12
+      ignore: 5.2.4
       merge2: 1.4.1
       slash: 3.0.0
     dev: true
@@ -1955,8 +1937,13 @@ packages:
     dependencies:
       function-bind: 1.1.1
 
-  /highlight.js/11.6.0:
-    resolution: {integrity: sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==}
+  /he/1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+    dev: true
+
+  /highlight.js/11.7.0:
+    resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==}
     engines: {node: '>=12.0.0'}
     dev: false
 
@@ -1973,23 +1960,17 @@ packages:
     dev: true
     optional: true
 
-  /icss-utils/3.0.1:
-    resolution: {integrity: sha512-ANhVLoEfe0KoC9+z4yiTaXOneB49K6JIXdS+yAgH0NERELpdIT7kkj2XxUPuHafeHnn8umXnECSpsfk1RTaUew==}
-    dependencies:
-      postcss: 6.0.23
-    dev: true
-
-  /icss-utils/5.1.0_postcss@8.4.16:
+  /icss-utils/5.1.0_postcss@8.4.21:
     resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
     engines: {node: ^10 || ^12 || >= 14}
     peerDependencies:
       postcss: ^8.1.0
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
     dev: true
 
-  /ignore/5.2.0:
-    resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
+  /ignore/5.2.4:
+    resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
     engines: {node: '>= 4'}
     dev: true
 
@@ -2001,8 +1982,8 @@ packages:
     dev: true
     optional: true
 
-  /immutable/4.1.0:
-    resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==}
+  /immutable/4.2.4:
+    resolution: {integrity: sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==}
     dev: true
 
   /import-fresh/3.3.0:
@@ -2035,8 +2016,8 @@ packages:
     dependencies:
       binary-extensions: 2.2.0
 
-  /is-core-module/2.10.0:
-    resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
+  /is-core-module/2.11.0:
+    resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
     dependencies:
       has: 1.0.3
 
@@ -2054,6 +2035,11 @@ packages:
     resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
     engines: {node: '>=0.12.0'}
 
+  /is-path-inside/3.0.3:
+    resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+    engines: {node: '>=8'}
+    dev: true
+
   /is-what/3.14.1:
     resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
     dev: true
@@ -2062,6 +2048,10 @@ packages:
     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
     dev: true
 
+  /js-sdsl/4.3.0:
+    resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==}
+    dev: true
+
   /js-tokens/4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
     dev: true
@@ -2087,20 +2077,8 @@ packages:
     resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
     dev: true
 
-  /json5/0.5.1:
-    resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==}
-    hasBin: true
-    dev: true
-
-  /json5/1.0.1:
-    resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==}
-    hasBin: true
-    dependencies:
-      minimist: 1.2.6
-    dev: true
-
-  /json5/2.2.1:
-    resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
+  /json5/2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
     engines: {node: '>=6'}
     hasBin: true
     dev: true
@@ -2113,8 +2091,8 @@ packages:
       graceful-fs: 4.2.10
     dev: true
 
-  /klona/2.0.5:
-    resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==}
+  /klona/2.0.6:
+    resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==}
     engines: {node: '>= 8'}
     dev: true
 
@@ -2125,14 +2103,14 @@ packages:
     dependencies:
       copy-anything: 2.0.6
       parse-node-version: 1.0.1
-      tslib: 2.4.0
+      tslib: 2.5.0
     optionalDependencies:
       errno: 0.1.8
       graceful-fs: 4.2.10
       image-size: 0.5.5
       make-dir: 2.1.0
       mime: 1.6.0
-      needle: 3.1.0
+      needle: 3.2.0
       source-map: 0.6.1
     transitivePeerDependencies:
       - supports-color
@@ -2146,19 +2124,10 @@ packages:
       type-check: 0.4.0
     dev: true
 
-  /lilconfig/2.0.6:
-    resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==}
+  /lilconfig/2.1.0:
+    resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
     engines: {node: '>=10'}
 
-  /loader-utils/0.2.17:
-    resolution: {integrity: sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==}
-    dependencies:
-      big.js: 3.2.0
-      emojis-list: 2.1.0
-      json5: 0.5.1
-      object-assign: 4.1.1
-    dev: true
-
   /locate-path/6.0.0:
     resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
     engines: {node: '>=10'}
@@ -2181,6 +2150,12 @@ packages:
   /lodash/4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
 
+  /lru-cache/5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+    dependencies:
+      yallist: 3.1.1
+    dev: true
+
   /lru-cache/6.0.0:
     resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
     engines: {node: '>=10'}
@@ -2240,22 +2215,19 @@ packages:
       brace-expansion: 1.1.11
     dev: true
 
-  /minimist/1.2.6:
-    resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
-
-  /mkdirp/1.0.4:
-    resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+  /minimatch/6.2.0:
+    resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==}
     engines: {node: '>=10'}
-    hasBin: true
+    dependencies:
+      brace-expansion: 2.0.1
     dev: true
 
-  /monaco-editor/0.34.0:
-    resolution: {integrity: sha512-VF+S5zG8wxfinLKLrWcl4WUizMx+LeJrG4PM/M78OhcwocpV0jiyhX/pG6Q9jIOhrb/ckYi6nHnaR5OojlOZCQ==}
-    dev: false
+  /minimist/1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
 
-  /ms/2.0.0:
-    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
-    dev: true
+  /monaco-editor/0.36.1:
+    resolution: {integrity: sha512-/CaclMHKQ3A6rnzBzOADfwdSJ25BFoFT0Emxsc4zYVyav5SkK9iA6lEtIeuN/oRYbwPgviJT+t3l+sjFa28jYg==}
+    dev: false
 
   /ms/2.1.2:
     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
@@ -2266,29 +2238,34 @@ packages:
     dev: true
     optional: true
 
-  /naive-ui/2.30.7_vue@3.2.38:
-    resolution: {integrity: sha512-5F/dcSP5nnbOGuwZl0TJ6PciuyAatEllcTC+Q/aaxJS/N2iEpysonyWNMruBCQn2vHoASTK5i/KqaHdxM9aL1Q==}
+  /muggle-string/0.2.2:
+    resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==}
+    dev: true
+
+  /naive-ui/2.34.3_vue@3.2.47:
+    resolution: {integrity: sha512-fUMr0dzb/iGsOTWgoblPVobY5X5dihQ1eam5dA+H74oyLYAvgX4pL96xQFPBLIYqvyRFBAsN85kHN5pLqdtpxA==}
     peerDependencies:
       vue: ^3.0.0
     dependencies:
-      '@css-render/plugin-bem': 0.15.11_css-render@0.15.11
-      '@css-render/vue3-ssr': 0.15.11_vue@3.2.38
-      '@types/lodash': 4.14.184
+      '@css-render/plugin-bem': 0.15.12_css-render@0.15.12
+      '@css-render/vue3-ssr': 0.15.12_vue@3.2.47
+      '@types/katex': 0.14.0
+      '@types/lodash': 4.14.191
       '@types/lodash-es': 4.17.6
       async-validator: 4.2.5
-      css-render: 0.15.11
-      date-fns: 2.29.2
-      date-fns-tz: 1.3.7_date-fns@2.29.2
+      css-render: 0.15.12
+      date-fns: 2.29.3
+      date-fns-tz: 1.3.8_date-fns@2.29.3
       evtd: 0.2.4
-      highlight.js: 11.6.0
+      highlight.js: 11.7.0
       lodash: 4.17.21
       lodash-es: 4.17.21
       seemly: 0.3.6
       treemate: 0.3.11
-      vdirs: 0.1.8_vue@3.2.38
-      vooks: 0.2.12_vue@3.2.38
-      vue: 3.2.38
-      vueuc: 0.4.48_vue@3.2.38
+      vdirs: 0.1.8_vue@3.2.47
+      vooks: 0.2.12_vue@3.2.47
+      vue: 3.2.47
+      vueuc: 0.4.51_vue@3.2.47
     dev: false
 
   /nanoid/3.3.4:
@@ -2296,12 +2273,16 @@ packages:
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
 
+  /natural-compare-lite/1.4.0:
+    resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+    dev: true
+
   /natural-compare/1.4.0:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
     dev: true
 
-  /needle/3.1.0:
-    resolution: {integrity: sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==}
+  /needle/3.2.0:
+    resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==}
     engines: {node: '>= 4.4.x'}
     hasBin: true
     requiresBuild: true
@@ -2318,8 +2299,8 @@ packages:
     resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
     dev: true
 
-  /node-releases/2.0.6:
-    resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==}
+  /node-releases/2.0.10:
+    resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
 
   /normalize-path/3.0.0:
     resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
@@ -2340,11 +2321,6 @@ packages:
       boolbase: 1.0.0
     dev: true
 
-  /object-assign/4.1.1:
-    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
   /object-hash/3.0.0:
     resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
     engines: {node: '>= 6'}
@@ -2435,19 +2411,16 @@ packages:
     dev: true
     optional: true
 
-  /pinia-plugin-persistedstate/2.1.1_pinia@2.0.22:
-    resolution: {integrity: sha512-HUgsU5IRtM75eAQiIqzT3p1oPEuYH1/B2ipTMU++yE+FV0LkHaBswdKXs0RMWYCmugO8s62oxLTh/N1dLNp+5A==}
+  /pinia-plugin-persistedstate/3.1.0_pinia@2.0.32:
+    resolution: {integrity: sha512-8UN+vYMEPBdgNLwceY08mi5olI0wkYaEb8b6hD6xW7SnBRuPydWHlEhZvUWgNb/ibuf4PvufpvtS+dmhYjJQOw==}
     peerDependencies:
       pinia: ^2.0.0
-    peerDependenciesMeta:
-      pinia:
-        optional: true
     dependencies:
-      pinia: 2.0.22_pj7ch6rmow6odq73xb5hfvge3q
+      pinia: 2.0.32_hmuptsblhheur2tugfgucj7gc4
     dev: false
 
-  /pinia/2.0.22_pj7ch6rmow6odq73xb5hfvge3q:
-    resolution: {integrity: sha512-u+b8/BC+tmvo3ACbYO2w5NfxHWFOjvvw9DQnyT0dW8aUMCPRQT5QnfZ5R5W2MzZBMTeZRMQI7V/QFbafmM9QHw==}
+  /pinia/2.0.32_hmuptsblhheur2tugfgucj7gc4:
+    resolution: {integrity: sha512-8Tw4OrpCSJ028UUyp0gYPP/wyjigLoEceuO/x1G+FlHVf73337e5vLm4uDmrRIoBG1hvaed/eSHnrCFjOc4nkA==}
     peerDependencies:
       '@vue/composition-api': ^1.4.0
       typescript: '>=4.4.4'
@@ -2458,59 +2431,35 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@vue/devtools-api': 6.2.1
-      typescript: 4.8.2
-      vue: 3.2.38
-      vue-demi: 0.13.11_vue@3.2.38
+      '@vue/devtools-api': 6.5.0
+      typescript: 4.9.5
+      vue: 3.2.47
+      vue-demi: 0.13.11_vue@3.2.47
     dev: false
 
-  /postcss-filter-plugins/3.0.1:
-    resolution: {integrity: sha512-tRKbW4wWBEkSSFuJtamV2wkiV9rj6Yy7P3Y13+zaynlPEEZt8EgYKn3y/RBpMeIhNmHXFlSdzofml65hD5OafA==}
-    dependencies:
-      postcss: 6.0.23
-    dev: true
-
-  /postcss-icss-keyframes/0.2.1:
-    resolution: {integrity: sha512-4m+hLY5TVqoTM198KKnzdNudyu1OvtqwD+8kVZ9PNiEO4+IfHYoyVvEXsOHjV8nZ1k6xowf+nY4HlUfZhOFvvw==}
-    dependencies:
-      icss-utils: 3.0.1
-      postcss: 6.0.23
-      postcss-value-parser: 3.3.1
-    dev: true
-
-  /postcss-icss-selectors/2.0.3:
-    resolution: {integrity: sha512-dxFtq+wscbU9faJaH8kIi98vvCPDbt+qg1g9GoG0os1PY3UvgY1Y2G06iZrZb1iVC9cyFfafwSY1IS+IQpRQ4w==}
-    dependencies:
-      css-selector-tokenizer: 0.7.3
-      generic-names: 1.0.3
-      icss-utils: 3.0.1
-      lodash: 4.17.21
-      postcss: 6.0.23
-    dev: true
-
-  /postcss-import/14.1.0_postcss@8.4.16:
+  /postcss-import/14.1.0_postcss@8.4.21:
     resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
     engines: {node: '>=10.0.0'}
     peerDependencies:
       postcss: ^8.0.0
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
       postcss-value-parser: 4.2.0
       read-cache: 1.0.0
       resolve: 1.22.1
     dev: false
 
-  /postcss-js/4.0.0_postcss@8.4.16:
-    resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==}
+  /postcss-js/4.0.1_postcss@8.4.21:
+    resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
     engines: {node: ^12 || ^14 || >= 16}
     peerDependencies:
-      postcss: ^8.3.3
+      postcss: ^8.4.21
     dependencies:
       camelcase-css: 2.0.1
-      postcss: 8.4.16
+      postcss: 8.4.21
     dev: false
 
-  /postcss-load-config/3.1.4_postcss@8.4.16:
+  /postcss-load-config/3.1.4_postcss@8.4.21:
     resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
     engines: {node: '>= 10'}
     peerDependencies:
@@ -2522,46 +2471,54 @@ packages:
       ts-node:
         optional: true
     dependencies:
-      lilconfig: 2.0.6
-      postcss: 8.4.16
+      lilconfig: 2.1.0
+      postcss: 8.4.21
       yaml: 1.10.2
 
-  /postcss-nested/5.0.6_postcss@8.4.16:
-    resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==}
+  /postcss-modules-local-by-default/4.0.0_postcss@8.4.21:
+    resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      icss-utils: 5.1.0_postcss@8.4.21
+      postcss: 8.4.21
+      postcss-selector-parser: 6.0.11
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-modules-scope/3.0.0_postcss@8.4.21:
+    resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      postcss: 8.4.21
+      postcss-selector-parser: 6.0.11
+    dev: true
+
+  /postcss-nested/6.0.0_postcss@8.4.21:
+    resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==}
     engines: {node: '>=12.0'}
     peerDependencies:
       postcss: ^8.2.14
     dependencies:
-      postcss: 8.4.16
-      postcss-selector-parser: 6.0.10
+      postcss: 8.4.21
+      postcss-selector-parser: 6.0.11
     dev: false
 
-  /postcss-selector-parser/6.0.10:
-    resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+  /postcss-selector-parser/6.0.11:
+    resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==}
     engines: {node: '>=4'}
     dependencies:
       cssesc: 3.0.0
       util-deprecate: 1.0.2
 
-  /postcss-value-parser/3.3.1:
-    resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==}
-    dev: true
-
   /postcss-value-parser/4.2.0:
     resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
-    dev: false
-
-  /postcss/6.0.23:
-    resolution: {integrity: sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==}
-    engines: {node: '>=4.0.0'}
-    dependencies:
-      chalk: 2.4.2
-      source-map: 0.6.1
-      supports-color: 5.5.0
-    dev: true
 
-  /postcss/8.4.16:
-    resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==}
+  /postcss/8.4.21:
+    resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
     engines: {node: ^10 || ^12 || >=14}
     dependencies:
       nanoid: 3.3.4
@@ -2580,19 +2537,23 @@ packages:
       fast-diff: 1.2.0
     dev: true
 
-  /prettier/2.7.1:
-    resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==}
+  /prettier/2.8.4:
+    resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==}
     engines: {node: '>=10.13.0'}
     hasBin: true
     dev: true
 
+  /proxy-from-env/1.1.0:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+    dev: false
+
   /prr/1.0.1:
     resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
     dev: true
     optional: true
 
-  /punycode/2.1.1:
-    resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
+  /punycode/2.3.0:
+    resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
     engines: {node: '>=6'}
     dev: true
 
@@ -2630,16 +2591,11 @@ packages:
     engines: {node: '>=4'}
     dev: true
 
-  /resolve-url/0.2.1:
-    resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
-    deprecated: https://github.com/lydell/resolve-url#deprecated
-    dev: true
-
   /resolve/1.22.1:
     resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
     hasBin: true
     dependencies:
-      is-core-module: 2.10.0
+      is-core-module: 2.11.0
       path-parse: 1.0.7
       supports-preserve-symlinks-flag: 1.0.0
 
@@ -2654,9 +2610,9 @@ packages:
       glob: 7.2.3
     dev: true
 
-  /rollup/2.78.1:
-    resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==}
-    engines: {node: '>=10.0.0'}
+  /rollup/3.18.0:
+    resolution: {integrity: sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg==}
+    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
     hasBin: true
     optionalDependencies:
       fsevents: 2.3.2
@@ -2667,20 +2623,17 @@ packages:
     dependencies:
       queue-microtask: 1.2.3
 
-  /safe-buffer/5.1.2:
-    resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
-    dev: true
-
   /safer-buffer/2.1.2:
     resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
     dev: true
+    optional: true
 
-  /sass-loader/13.0.2_sass@1.54.8:
-    resolution: {integrity: sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==}
+  /sass-loader/13.2.0_sass@1.58.3:
+    resolution: {integrity: sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==}
     engines: {node: '>= 14.15.0'}
     peerDependencies:
       fibers: '>= 3.1.0'
-      node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
+      node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
       sass: ^1.3.0
       sass-embedded: '*'
       webpack: ^5.0.0
@@ -2694,18 +2647,18 @@ packages:
       sass-embedded:
         optional: true
     dependencies:
-      klona: 2.0.5
+      klona: 2.0.6
       neo-async: 2.6.2
-      sass: 1.54.8
+      sass: 1.58.3
     dev: true
 
-  /sass/1.54.8:
-    resolution: {integrity: sha512-ib4JhLRRgbg6QVy6bsv5uJxnJMTS2soVcCp9Y88Extyy13A8vV0G1fAwujOzmNkFQbR3LvedudAMbtuNRPbQww==}
+  /sass/1.58.3:
+    resolution: {integrity: sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==}
     engines: {node: '>=12.0.0'}
     hasBin: true
     dependencies:
       chokidar: 3.5.3
-      immutable: 4.1.0
+      immutable: 4.2.4
       source-map-js: 1.0.2
     dev: true
 
@@ -2728,8 +2681,8 @@ packages:
     hasBin: true
     dev: true
 
-  /semver/7.3.7:
-    resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==}
+  /semver/7.3.8:
+    resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
     engines: {node: '>=10'}
     hasBin: true
     dependencies:
@@ -2757,22 +2710,6 @@ packages:
     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
     engines: {node: '>=0.10.0'}
 
-  /source-map-resolve/0.5.3:
-    resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
-    deprecated: See https://github.com/lydell/source-map-resolve#deprecated
-    dependencies:
-      atob: 2.1.2
-      decode-uri-component: 0.2.0
-      resolve-url: 0.2.1
-      source-map-url: 0.4.1
-      urix: 0.1.0
-    dev: true
-
-  /source-map-url/0.4.1:
-    resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
-    deprecated: See https://github.com/lydell/source-map-url#deprecated
-    dev: true
-
   /source-map/0.6.1:
     resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
     engines: {node: '>=0.10.0'}
@@ -2784,6 +2721,7 @@ packages:
 
   /sourcemap-codec/1.4.8:
     resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+    deprecated: Please use @jridgewell/sourcemap-codec instead
 
   /strip-ansi/6.0.1:
     resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
@@ -2802,17 +2740,14 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
-  /stylus/0.54.8:
-    resolution: {integrity: sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==}
+  /stylus/0.59.0:
+    resolution: {integrity: sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==}
     hasBin: true
     dependencies:
-      css-parse: 2.0.0
-      debug: 3.1.0
+      '@adobe/css-tools': 4.2.0
+      debug: 4.3.4
       glob: 7.2.3
-      mkdirp: 1.0.4
-      safer-buffer: 2.1.2
       sax: 1.2.4
-      semver: 6.3.0
       source-map: 0.7.4
     transitivePeerDependencies:
       - supports-color
@@ -2840,10 +2775,12 @@ packages:
     resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
     dev: true
 
-  /tailwindcss/3.1.8:
-    resolution: {integrity: sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==}
+  /tailwindcss/3.2.7_postcss@8.4.21:
+    resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==}
     engines: {node: '>=12.13.0'}
     hasBin: true
+    peerDependencies:
+      postcss: ^8.0.9
     dependencies:
       arg: 5.0.2
       chokidar: 3.5.3
@@ -2851,19 +2788,20 @@ packages:
       detective: 5.2.1
       didyoumean: 1.2.2
       dlv: 1.1.3
-      fast-glob: 3.2.11
+      fast-glob: 3.2.12
       glob-parent: 6.0.2
       is-glob: 4.0.3
-      lilconfig: 2.0.6
+      lilconfig: 2.1.0
+      micromatch: 4.0.5
       normalize-path: 3.0.0
       object-hash: 3.0.0
       picocolors: 1.0.0
-      postcss: 8.4.16
-      postcss-import: 14.1.0_postcss@8.4.16
-      postcss-js: 4.0.0_postcss@8.4.16
-      postcss-load-config: 3.1.4_postcss@8.4.16
-      postcss-nested: 5.0.6_postcss@8.4.16
-      postcss-selector-parser: 6.0.10
+      postcss: 8.4.21
+      postcss-import: 14.1.0_postcss@8.4.21
+      postcss-js: 4.0.1_postcss@8.4.21
+      postcss-load-config: 3.1.4_postcss@8.4.21
+      postcss-nested: 6.0.0_postcss@8.4.21
+      postcss-selector-parser: 6.0.11
       postcss-value-parser: 4.2.0
       quick-lru: 5.1.1
       resolve: 1.22.1
@@ -2889,12 +2827,12 @@ packages:
     resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==}
     dev: false
 
-  /tsconfig-paths/3.14.1:
-    resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==}
+  /tsconfig-paths/4.1.2:
+    resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==}
+    engines: {node: '>=6'}
     dependencies:
-      '@types/json5': 0.0.29
-      json5: 1.0.1
-      minimist: 1.2.6
+      json5: 2.2.3
+      minimist: 1.2.8
       strip-bom: 3.0.0
     dev: true
 
@@ -2906,18 +2844,18 @@ packages:
     resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
     dev: false
 
-  /tslib/2.4.0:
-    resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
+  /tslib/2.5.0:
+    resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
     dev: true
 
-  /tsutils/3.21.0_typescript@4.8.2:
+  /tsutils/3.21.0_typescript@4.9.5:
     resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
     engines: {node: '>= 6'}
     peerDependencies:
       typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
     dependencies:
       tslib: 1.14.1
-      typescript: 4.8.2
+      typescript: 4.9.5
     dev: true
 
   /type-check/0.4.0:
@@ -2932,32 +2870,34 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /typescript-plugin-css-modules/3.4.0_typescript@4.8.2:
-    resolution: {integrity: sha512-2MdjfSg4MGex1csCWRUwKD+MpgnvcvLLr9bSAMemU/QYGqBsXdez0cc06H/fFhLtRoKJjXg6PSTur3Gy1Umhpw==}
+  /typescript-plugin-css-modules/4.2.2_typescript@4.9.5:
+    resolution: {integrity: sha512-X5OYGkX96ENq2c7xFJO4tgtiMTlBkOMoRmVHQXH2H4CGFcVODKGieDqPU2B0IV0I+AyvKYDFdKh4ZKtKxAcAww==}
     peerDependencies:
-      typescript: '>=3.0.0'
+      typescript: '>=3.9.0'
     dependencies:
-      dotenv: 10.0.0
-      icss-utils: 5.1.0_postcss@8.4.16
+      '@types/postcss-modules-local-by-default': 4.0.0
+      '@types/postcss-modules-scope': 3.0.1
+      dotenv: 16.0.3
+      icss-utils: 5.1.0_postcss@8.4.21
       less: 4.1.3
       lodash.camelcase: 4.3.0
-      postcss: 8.4.16
-      postcss-filter-plugins: 3.0.1
-      postcss-icss-keyframes: 0.2.1
-      postcss-icss-selectors: 2.0.3
-      postcss-load-config: 3.1.4_postcss@8.4.16
+      postcss: 8.4.21
+      postcss-load-config: 3.1.4_postcss@8.4.21
+      postcss-modules-local-by-default: 4.0.0_postcss@8.4.21
+      postcss-modules-scope: 3.0.0_postcss@8.4.21
       reserved-words: 0.1.2
-      sass: 1.54.8
-      stylus: 0.54.8
-      tsconfig-paths: 3.14.1
-      typescript: 4.8.2
+      sass: 1.58.3
+      source-map-js: 1.0.2
+      stylus: 0.59.0
+      tsconfig-paths: 4.1.2
+      typescript: 4.9.5
     transitivePeerDependencies:
       - supports-color
       - ts-node
     dev: true
 
-  /typescript/4.8.2:
-    resolution: {integrity: sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==}
+  /typescript/4.9.5:
+    resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
     engines: {node: '>=4.2.0'}
     hasBin: true
 
@@ -2966,44 +2906,39 @@ packages:
     engines: {node: '>= 10.0.0'}
     dev: true
 
-  /update-browserslist-db/1.0.7_browserslist@4.21.3:
-    resolution: {integrity: sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==}
+  /update-browserslist-db/1.0.10_browserslist@4.21.5:
+    resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
     hasBin: true
     peerDependencies:
       browserslist: '>= 4.21.0'
     dependencies:
-      browserslist: 4.21.3
+      browserslist: 4.21.5
       escalade: 3.1.1
       picocolors: 1.0.0
 
   /uri-js/4.4.1:
     resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
     dependencies:
-      punycode: 2.1.1
-    dev: true
-
-  /urix/0.1.0:
-    resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
-    deprecated: Please see https://github.com/lydell/urix#deprecated
+      punycode: 2.3.0
     dev: true
 
   /util-deprecate/1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
 
-  /vdirs/0.1.8_vue@3.2.38:
+  /vdirs/0.1.8_vue@3.2.47:
     resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==}
     peerDependencies:
       vue: ^3.0.11
     dependencies:
       evtd: 0.2.4
-      vue: 3.2.38
+      vue: 3.2.47
     dev: false
 
   /vfonts/0.0.3:
     resolution: {integrity: sha512-nguyw8L6Un8eelg1vQ31vIU2ESxqid7EYmy8V+MDeMaHBqaRSkg3dTBToC1PR00D89UzS/SLkfYPnx0Wf23IQQ==}
     dev: false
 
-  /vite-plugin-compression/0.5.1_vite@3.1.0:
+  /vite-plugin-compression/0.5.1_vite@4.1.4:
     resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
     peerDependencies:
       vite: '>=2.0.0'
@@ -3011,49 +2946,56 @@ packages:
       chalk: 4.1.2
       debug: 4.3.4
       fs-extra: 10.1.0
-      vite: 3.1.0_sass@1.54.8
+      vite: 4.1.4_tbu6ibuzbmq2zng52hwcifltki
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /vite/3.1.0_sass@1.54.8:
-    resolution: {integrity: sha512-YBg3dUicDpDWFCGttmvMbVyS9ydjntwEjwXRj2KBFwSB8SxmGcudo1yb8FW5+M/G86aS8x828ujnzUVdsLjs9g==}
+  /vite/4.1.4_tbu6ibuzbmq2zng52hwcifltki:
+    resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==}
     engines: {node: ^14.18.0 || >=16.0.0}
     hasBin: true
     peerDependencies:
+      '@types/node': '>= 14'
       less: '*'
       sass: '*'
       stylus: '*'
+      sugarss: '*'
       terser: ^5.4.0
     peerDependenciesMeta:
+      '@types/node':
+        optional: true
       less:
         optional: true
       sass:
         optional: true
       stylus:
         optional: true
+      sugarss:
+        optional: true
       terser:
         optional: true
     dependencies:
-      esbuild: 0.15.7
-      postcss: 8.4.16
+      '@types/node': 18.14.6
+      esbuild: 0.16.17
+      postcss: 8.4.21
       resolve: 1.22.1
-      rollup: 2.78.1
-      sass: 1.54.8
+      rollup: 3.18.0
+      sass: 1.58.3
     optionalDependencies:
       fsevents: 2.3.2
     dev: true
 
-  /vooks/0.2.12_vue@3.2.38:
+  /vooks/0.2.12_vue@3.2.47:
     resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==}
     peerDependencies:
       vue: ^3.0.0
     dependencies:
       evtd: 0.2.4
-      vue: 3.2.38
+      vue: 3.2.47
     dev: false
 
-  /vue-demi/0.13.11_vue@3.2.38:
+  /vue-demi/0.13.11_vue@3.2.47:
     resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==}
     engines: {node: '>=12'}
     hasBin: true
@@ -3065,28 +3007,28 @@ packages:
       '@vue/composition-api':
         optional: true
     dependencies:
-      vue: 3.2.38
+      vue: 3.2.47
     dev: false
 
-  /vue-eslint-parser/9.0.3_eslint@8.23.0:
-    resolution: {integrity: sha512-yL+ZDb+9T0ELG4VIFo/2anAOz8SvBdlqEnQnvJ3M7Scq56DvtjY0VY88bByRZB0D4J0u8olBcfrXTVONXsh4og==}
+  /vue-eslint-parser/9.1.0_eslint@8.35.0:
+    resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: '>=6.0.0'
     dependencies:
       debug: 4.3.4
-      eslint: 8.23.0
+      eslint: 8.35.0
       eslint-scope: 7.1.1
       eslint-visitor-keys: 3.3.0
-      espree: 9.4.0
-      esquery: 1.4.0
+      espree: 9.4.1
+      esquery: 1.5.0
       lodash: 4.17.21
-      semver: 7.3.7
+      semver: 7.3.8
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /vue-i18n/9.2.2_vue@3.2.38:
+  /vue-i18n/9.2.2_vue@3.2.47:
     resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==}
     engines: {node: '>= 14'}
     peerDependencies:
@@ -3095,52 +3037,59 @@ packages:
       '@intlify/core-base': 9.2.2
       '@intlify/shared': 9.2.2
       '@intlify/vue-devtools': 9.2.2
-      '@vue/devtools-api': 6.2.1
-      vue: 3.2.38
+      '@vue/devtools-api': 6.5.0
+      vue: 3.2.47
     dev: false
 
-  /vue-router/4.1.5_vue@3.2.38:
-    resolution: {integrity: sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==}
+  /vue-router/4.1.6_vue@3.2.47:
+    resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==}
     peerDependencies:
       vue: ^3.2.0
     dependencies:
-      '@vue/devtools-api': 6.2.1
-      vue: 3.2.38
+      '@vue/devtools-api': 6.5.0
+      vue: 3.2.47
     dev: false
 
-  /vue-tsc/0.40.9_typescript@4.8.2:
-    resolution: {integrity: sha512-GnfwngCgbUvFgs+vaPesrJB76yoX1W/DSQZqoQ+pArjZ9+EFCFkqMpihE1D8W5p/tgTCAAPr/3Sfz/jtTiYGaA==}
+  /vue-template-compiler/2.7.14:
+    resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==}
+    dependencies:
+      de-indent: 1.0.2
+      he: 1.2.0
+    dev: true
+
+  /vue-tsc/1.2.0_typescript@4.9.5:
+    resolution: {integrity: sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==}
     hasBin: true
     peerDependencies:
       typescript: '*'
     dependencies:
-      '@volar/vue-language-core': 0.40.9
-      '@volar/vue-typescript': 0.40.9
-      typescript: 4.8.2
+      '@volar/vue-language-core': 1.2.0
+      '@volar/vue-typescript': 1.2.0
+      typescript: 4.9.5
     dev: true
 
-  /vue/3.2.38:
-    resolution: {integrity: sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==}
+  /vue/3.2.47:
+    resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==}
     dependencies:
-      '@vue/compiler-dom': 3.2.38
-      '@vue/compiler-sfc': 3.2.38
-      '@vue/runtime-dom': 3.2.38
-      '@vue/server-renderer': 3.2.38_vue@3.2.38
-      '@vue/shared': 3.2.38
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-sfc': 3.2.47
+      '@vue/runtime-dom': 3.2.47
+      '@vue/server-renderer': 3.2.47_vue@3.2.47
+      '@vue/shared': 3.2.47
 
-  /vueuc/0.4.48_vue@3.2.38:
-    resolution: {integrity: sha512-dQTBLxCzfaPuzD3c4/dIxAULtnyY+xwdotCRFUDgf0DJiwuR3tI+txJ9K8uJKmaHwc1JDUVqhRAj9Jd/pvInWg==}
+  /vueuc/0.4.51_vue@3.2.47:
+    resolution: {integrity: sha512-pLiMChM4f+W8czlIClGvGBYo656lc2Y0/mXFSCydcSmnCR1izlKPGMgiYBGjbY9FDkFG8a2HEVz7t0DNzBWbDw==}
     peerDependencies:
       vue: ^3.0.11
     dependencies:
-      '@css-render/vue3-ssr': 0.15.11_vue@3.2.38
+      '@css-render/vue3-ssr': 0.15.12_vue@3.2.47
       '@juggle/resize-observer': 3.4.0
-      css-render: 0.15.11
+      css-render: 0.15.12
       evtd: 0.2.4
       seemly: 0.3.6
-      vdirs: 0.1.8_vue@3.2.38
-      vooks: 0.2.12_vue@3.2.38
-      vue: 3.2.38
+      vdirs: 0.1.8_vue@3.2.47
+      vooks: 0.2.12_vue@3.2.47
+      vue: 3.2.47
     dev: false
 
   /which/2.0.2:
@@ -3170,6 +3119,10 @@ packages:
     engines: {node: '>=0.4'}
     dev: false
 
+  /yallist/3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+    dev: true
+
   /yallist/4.0.0:
     resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
     dev: true
@@ -3183,8 +3136,8 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /zrender/5.3.2:
-    resolution: {integrity: sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==}
+  /zrender/5.4.1:
+    resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==}
     dependencies:
       tslib: 2.3.0
     dev: false
diff --git a/seatunnel-ui/src/App.tsx b/seatunnel-ui/src/App.tsx
index 4c3e60bc..96635f88 100644
--- a/seatunnel-ui/src/App.tsx
+++ b/seatunnel-ui/src/App.tsx
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { defineComponent, computed } from 'vue'
+import { defineComponent, computed, watch, ref } from 'vue'
 import {
   NConfigProvider,
   NMessageProvider,
@@ -27,8 +27,10 @@ import {
 } from 'naive-ui'
 import { useThemeStore } from '@/store/theme'
 import { useLocalesStore } from '@/store/locale'
+import { useSettingStore } from '@/store/setting'
 import themeList from '@/themes'
 import type { GlobalThemeOverrides } from 'naive-ui'
+import type { Ref } from 'vue'
 
 const App = defineComponent({
   setup() {
@@ -37,20 +39,29 @@ const App = defineComponent({
       themeStore.darkTheme ? darkTheme : undefined
     )
     const localesStore = useLocalesStore()
+    const themeOverrides: Ref<GlobalThemeOverrides> = ref(
+      themeList[currentTheme.value ? 'dark' : 'light']
+    )
+
+    watch(
+      () => useSettingStore().getFilletValue,
+      () => {
+        ;(themeOverrides.value.common as any).borderRadius =
+          useSettingStore().getFilletValue + 'px'
+      }
+    )
 
     return {
       currentTheme,
-      localesStore
+      localesStore,
+      themeOverrides
     }
   },
   render() {
-    const themeOverrides: GlobalThemeOverrides =
-      themeList[this.currentTheme ? 'dark' : 'light']
-
     return (
       <NConfigProvider
         theme={this.currentTheme}
-        theme-overrides={themeOverrides}
+        theme-overrides={this.themeOverrides}
         date-locale={
           String(this.localesStore.getLocales) === 'zh_CN' ? dateZhCN : dateEnUS
         }
diff --git a/seatunnel-ui/src/layouts/dashboard/header/logo/index.tsx b/seatunnel-ui/src/common/table.ts
similarity index 58%
copy from seatunnel-ui/src/layouts/dashboard/header/logo/index.tsx
copy to seatunnel-ui/src/common/table.ts
index 361345cc..b3e5e63d 100644
--- a/seatunnel-ui/src/layouts/dashboard/header/logo/index.tsx
+++ b/seatunnel-ui/src/common/table.ts
@@ -15,18 +15,30 @@
  * limitations under the License.
  */
 
-import { defineComponent } from 'vue'
-import { NSpace } from 'naive-ui'
+import { useSettingStore } from '@/store/setting'
 
-const Logo = defineComponent({
-  setup() {},
-  render() {
-    return (
-      <NSpace justify='center' align='center' class='h-16 w-48'>
-        <h2 class='text-2xl font-bold'>SeaTunnel</h2>
-      </NSpace>
+const getTableColumn = (data: Array<{ key: string; title: string }>) => {
+  const tableColumn = []
+  const settingStore = useSettingStore()
+
+  settingStore.getSequenceColumn &&
+    tableColumn.push({
+      title: '#',
+      key: 'index',
+      render: (row: any, index: number) => index + 1
+    })
+
+  settingStore.getDataUniqueValue &&
+    tableColumn.push(
+      ...data.map((i) => {
+        return {
+          title: i.title,
+          key: i.key
+        }
+      })
     )
-  }
-})
 
-export default Logo
+  return tableColumn
+}
+
+export { getTableColumn }
diff --git a/seatunnel-ui/src/components/modal/index.tsx b/seatunnel-ui/src/components/modal/index.tsx
index 4bf22cb8..6d3d0eed 100644
--- a/seatunnel-ui/src/components/modal/index.tsx
+++ b/seatunnel-ui/src/components/modal/index.tsx
@@ -98,6 +98,7 @@ const Modal = defineComponent({
                   onClick={onConfirm}
                   disabled={confirmDisabled}
                   loading={confirmLoading}
+                  type='primary'
                 >
                   {this.confirmText || t('modal.confirm')}
                 </NButton>
diff --git a/seatunnel-ui/src/layouts/dashboard/header/index.tsx b/seatunnel-ui/src/layouts/dashboard/header/index.tsx
index f732f542..2d326586 100644
--- a/seatunnel-ui/src/layouts/dashboard/header/index.tsx
+++ b/seatunnel-ui/src/layouts/dashboard/header/index.tsx
@@ -19,7 +19,6 @@ import { defineComponent } from 'vue'
 import { NSpace } from 'naive-ui'
 import Logo from './logo'
 import Menu from './menu'
-import Setting from './setting'
 import User from './user'
 
 const Header = defineComponent({
@@ -31,10 +30,7 @@ const Header = defineComponent({
           <Logo />
           <Menu />
         </NSpace>
-        <NSpace>
-          <Setting />
-          <User />
-        </NSpace>
+        <User />
       </NSpace>
     )
   }
diff --git a/seatunnel-ui/src/layouts/dashboard/header/logo/index.tsx b/seatunnel-ui/src/layouts/dashboard/header/logo/index.tsx
index 361345cc..356fb51a 100644
--- a/seatunnel-ui/src/layouts/dashboard/header/logo/index.tsx
+++ b/seatunnel-ui/src/layouts/dashboard/header/logo/index.tsx
@@ -22,7 +22,7 @@ const Logo = defineComponent({
   setup() {},
   render() {
     return (
-      <NSpace justify='center' align='center' class='h-16 w-48'>
+      <NSpace justify='start' align='center' class='h-16 w-48 ml-12'>
         <h2 class='text-2xl font-bold'>SeaTunnel</h2>
       </NSpace>
     )
diff --git a/seatunnel-ui/src/layouts/dashboard/header/menu/index.tsx b/seatunnel-ui/src/layouts/dashboard/header/menu/index.tsx
index 2b54ab34..5b30da87 100644
--- a/seatunnel-ui/src/layouts/dashboard/header/menu/index.tsx
+++ b/seatunnel-ui/src/layouts/dashboard/header/menu/index.tsx
@@ -17,13 +17,14 @@
 
 import { defineComponent, toRefs } from 'vue'
 import { NMenu, NSpace } from 'naive-ui'
-import { useRouter } from 'vue-router'
+import { useRouter, useRoute } from 'vue-router'
 import { useMenu } from './use-menu'
 
 const Menu = defineComponent({
   setup() {
     const { state } = useMenu()
     const router = useRouter()
+    const route = useRoute()
 
     const handleMenuClick = (key: string) => {
       router.push({ path: `/${key}` })
@@ -31,13 +32,15 @@ const Menu = defineComponent({
 
     return {
       ...toRefs(state),
-      handleMenuClick
+      handleMenuClick,
+      route
     }
   },
   render() {
     return (
       <NSpace align='center' class='h-16'>
         <NMenu
+          value={this.route.path.split('/')[1]}
           mode='horizontal'
           options={this.menuOptions}
           onUpdateValue={this.handleMenuClick}
diff --git a/seatunnel-ui/src/layouts/dashboard/header/menu/use-menu.ts b/seatunnel-ui/src/layouts/dashboard/header/menu/use-menu.ts
index f3dae99d..aa599ad6 100644
--- a/seatunnel-ui/src/layouts/dashboard/header/menu/use-menu.ts
+++ b/seatunnel-ui/src/layouts/dashboard/header/menu/use-menu.ts
@@ -34,6 +34,10 @@ export function useMenu() {
     {
       label: () => h(NEllipsis, null, { default: () => t('menu.tasks') }),
       key: 'tasks'
+    },
+    {
+      label: () => h(NEllipsis, null, { default: () => t('menu.user_manage') }),
+      key: 'user-manage'
     }
   ]
 
diff --git a/seatunnel-ui/src/layouts/dashboard/header/setting/index.tsx b/seatunnel-ui/src/layouts/dashboard/header/setting/index.tsx
deleted file mode 100644
index 291740da..00000000
--- a/seatunnel-ui/src/layouts/dashboard/header/setting/index.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { defineComponent, toRefs } from 'vue'
-import { NIcon, NSpace, NDropdown } from 'naive-ui'
-import { SettingOutlined } from '@vicons/antd'
-import { useSettingDropdown } from './use-setting-dropdown'
-
-const Setting = defineComponent({
-  setup() {
-    const { state, handleSelect } = useSettingDropdown()
-
-    return { ...toRefs(state), handleSelect }
-  },
-  render() {
-    return (
-      <NSpace
-        align='center'
-        justify='center'
-        class='h-16 w-12'
-        style={{ cursor: 'pointer' }}
-      >
-        <NDropdown
-          trigger='click'
-          options={this.dropdownOptions}
-          onSelect={this.handleSelect}
-        >
-          <NIcon size='20'>
-            <SettingOutlined />
-          </NIcon>
-        </NDropdown>
-      </NSpace>
-    )
-  }
-})
-
-export default Setting
diff --git a/seatunnel-ui/src/layouts/dashboard/header/user/index.tsx b/seatunnel-ui/src/layouts/dashboard/header/user/index.tsx
index 582b7447..b5d1da25 100644
--- a/seatunnel-ui/src/layouts/dashboard/header/user/index.tsx
+++ b/seatunnel-ui/src/layouts/dashboard/header/user/index.tsx
@@ -16,21 +16,29 @@
  */
 
 import { defineComponent, toRefs } from 'vue'
-import { NSpace, NDropdown } from 'naive-ui'
+import { NSpace, NDropdown, NIcon, NButton } from 'naive-ui'
 import { useUserDropdown } from './use-user-dropdown'
+import { useUserStore } from '@/store/user'
+import { DownOutlined, UserOutlined } from '@vicons/antd'
+import type { UserDetail } from '@/service/user/types'
 
 const User = defineComponent({
   setup() {
     const { state, handleSelect } = useUserDropdown()
+    const userDetail = useUserStore()
 
-    return { ...toRefs(state), handleSelect }
+    return {
+      ...toRefs(state),
+      handleSelect,
+      userDetail
+    }
   },
   render() {
     return (
       <NSpace
-        justify='center'
+        justify='end'
         align='center'
-        class='h-16 w-12 mr-2'
+        class='h-16 mr-12'
         style={{ cursor: 'pointer' }}
       >
         <NDropdown
@@ -38,11 +46,13 @@ const User = defineComponent({
           options={this.dropdownOptions}
           onSelect={this.handleSelect}
         >
-          <img
-            class='h-10 w-10 rounded-full'
-            src='https://avatars.githubusercontent.com/u/19239641?s=64&v=4'
-            alt=''
-          />
+          <NButton text>
+            <NSpace>
+              <NIcon component={UserOutlined} />
+              <span>{(this.userDetail.getUserInfo as UserDetail).name}</span>
+              <NIcon component={DownOutlined} />
+            </NSpace>
+          </NButton>
         </NDropdown>
       </NSpace>
     )
diff --git a/seatunnel-ui/src/layouts/dashboard/header/user/use-user-dropdown.ts b/seatunnel-ui/src/layouts/dashboard/header/user/use-user-dropdown.ts
index 0c88b32c..f1bafe79 100644
--- a/seatunnel-ui/src/layouts/dashboard/header/user/use-user-dropdown.ts
+++ b/seatunnel-ui/src/layouts/dashboard/header/user/use-user-dropdown.ts
@@ -15,21 +15,49 @@
  * limitations under the License.
  */
 
-import { reactive } from 'vue'
+import { reactive, h } from 'vue'
 import { useI18n } from 'vue-i18n'
 import { useRouter } from 'vue-router'
+import { NIcon } from 'naive-ui'
 import { userLogout } from '@/service/user'
 import { useUserStore } from '@/store/user'
+import {
+  LogoutOutlined,
+  QuestionCircleOutlined,
+  SettingOutlined
+} from '@vicons/antd'
 import type { Router } from 'vue-router'
+import type { Component } from 'vue'
 
 export function useUserDropdown() {
   const router: Router = useRouter()
   const { t } = useI18n()
   const userStore = useUserStore()
 
+  const renderIcon = (icon: Component) => {
+    return () => {
+      return h(NIcon, null, {
+        default: () => h(icon)
+      })
+    }
+  }
+
   const dropdownOptions = [
-    { key: 'help', label: t('menu.help') },
-    { key: 'logout', label: t('menu.logout') }
+    {
+      key: 'help',
+      label: t('menu.help'),
+      icon: renderIcon(QuestionCircleOutlined)
+    },
+    {
+      key: 'setting',
+      label: t('menu.setting'),
+      icon: renderIcon(SettingOutlined)
+    },
+    {
+      key: 'logout',
+      label: t('menu.logout'),
+      icon: renderIcon(LogoutOutlined)
+    }
   ]
 
   const state = reactive({
@@ -39,6 +67,8 @@ export function useUserDropdown() {
   const handleSelect = (key: string) => {
     if (key === 'help') {
       window.open('http://seatunnel.incubator.apache.org/versions/')
+    } else if (key === 'setting') {
+      router.push({ path: '/setting' })
     } else if (key === 'logout') {
       userLogout().then(() => {
         userStore.setUserInfo({})
diff --git a/seatunnel-ui/src/layouts/dashboard/index.tsx b/seatunnel-ui/src/layouts/dashboard/index.tsx
index 2a0c2458..16050a59 100644
--- a/seatunnel-ui/src/layouts/dashboard/index.tsx
+++ b/seatunnel-ui/src/layouts/dashboard/index.tsx
@@ -26,11 +26,13 @@ const Dashboard = defineComponent({
   render() {
     return (
       <NLayout>
-        <NLayoutHeader>
+        <NLayoutHeader bordered>
           <Header />
         </NLayoutHeader>
-        <NLayoutContent>
-          <router-view class='px-32 py-12' />
+        <NLayoutContent style={{ height: 'calc(100vh - 65px)' }}>
+          <NLayout position='absolute' native-scrollbar={false}>
+            <router-view class='px-32 py-12' />
+          </NLayout>
         </NLayoutContent>
       </NLayout>
     )
diff --git a/seatunnel-ui/src/locales/en_US/data-pipes.ts b/seatunnel-ui/src/locales/en_US/data-pipes.ts
index 3bf63392..af381770 100644
--- a/seatunnel-ui/src/locales/en_US/data-pipes.ts
+++ b/seatunnel-ui/src/locales/en_US/data-pipes.ts
@@ -16,12 +16,13 @@
  */
 
 export default {
+  id: 'Id',
   data_pipes: 'Data Pipes',
   create: 'Create',
   name: 'Name',
   state: 'State',
-  executed_time: 'Executed Time',
-  modification_time: 'Modification Time',
+  create_time: 'Create Time',
+  update_time: 'Update Time',
   operation: 'Operation',
   succeed: 'Succeed',
   running: 'Running',
@@ -37,24 +38,10 @@ export default {
   script: 'Script',
   kill: 'Kill',
   stop: 'Stop',
-  configuration: 'Configuration',
-  run_log: 'Run Log',
   add: 'Add',
   key: 'Key',
   value: 'Value',
-  engine_parameter: 'Engine Parameter',
-  self_defined_parameter: 'Self Defined Parameter',
   name_tips: 'Required fields,number, letter case, 100 characters',
-  overview: 'Overview',
-  input_metrics: 'Input Metrics',
-  historical_run_logs: 'Historical Run Logs',
-  bytes_per_second: 'Bytes Per Second',
-  total_bytes: 'Total Bytes',
-  record_per_second: 'Record Per Second',
-  total_records: 'Total Records',
-  output_metrics: 'Output Metrics',
-  end_time: 'End Time',
-  execute_time: 'Execute Time',
   data_pipes_delete_tips:
     'Whether to delete the data Pipe,It cannot be restored after being deleted.',
   data_pipes_publish_tips: 'Whether to Publish the data pipe.',
diff --git a/seatunnel-ui/src/locales/en_US/index.ts b/seatunnel-ui/src/locales/en_US/index.ts
index 4c71c783..fefb82cb 100644
--- a/seatunnel-ui/src/locales/en_US/index.ts
+++ b/seatunnel-ui/src/locales/en_US/index.ts
@@ -23,6 +23,7 @@ import data_pipes from '@/locales/en_US/data-pipes'
 import log from '@/locales/en_US/log'
 import jobs from '@/locales/en_US/jobs'
 import tasks from '@/locales/en_US/tasks'
+import setting from '@/locales/en_US/setting'
 
 export default {
   login,
@@ -32,5 +33,6 @@ export default {
   data_pipes,
   log,
   jobs,
-  tasks
+  tasks,
+  setting
 }
diff --git a/seatunnel-ui/src/locales/en_US/jobs.ts b/seatunnel-ui/src/locales/en_US/jobs.ts
index 07cae2a7..99de8afb 100644
--- a/seatunnel-ui/src/locales/en_US/jobs.ts
+++ b/seatunnel-ui/src/locales/en_US/jobs.ts
@@ -16,6 +16,8 @@
  */
 
 export default {
+  script_id: 'Script Id',
+  job_id: 'Job Id',
   jobs: 'Jobs',
   search: 'Search',
   data_pipe_name: 'Data Pipe Name',
@@ -23,6 +25,6 @@ export default {
   create_date: 'Create Date',
   publish: 'Publish',
   operation: 'Operation',
-  executed_immediately: 'Executed Immediately',
-  stop_plan: 'Stop Plan'
+  execute: 'Execute',
+  recycle: 'Recycle'
 }
diff --git a/seatunnel-ui/src/locales/en_US/menu.ts b/seatunnel-ui/src/locales/en_US/menu.ts
index 722579a4..37fd071b 100644
--- a/seatunnel-ui/src/locales/en_US/menu.ts
+++ b/seatunnel-ui/src/locales/en_US/menu.ts
@@ -21,6 +21,7 @@ export default {
   manage: 'Manage',
   user_manage: 'User Manage',
   help: 'Help',
+  setting: 'Setting',
   logout: 'Logout',
   tasks: 'Tasks'
 }
diff --git a/seatunnel-ui/src/locales/en_US/menu.ts b/seatunnel-ui/src/locales/en_US/setting.ts
similarity index 66%
copy from seatunnel-ui/src/locales/en_US/menu.ts
copy to seatunnel-ui/src/locales/en_US/setting.ts
index 722579a4..9ce36be7 100644
--- a/seatunnel-ui/src/locales/en_US/menu.ts
+++ b/seatunnel-ui/src/locales/en_US/setting.ts
@@ -16,11 +16,19 @@
  */
 
 export default {
-  data_pipes: 'Data Pipes',
-  jobs: 'Jobs',
-  manage: 'Manage',
-  user_manage: 'User Manage',
-  help: 'Help',
-  logout: 'Logout',
-  tasks: 'Tasks'
+  table_setting: 'Table Setting',
+  sequence_column: 'Sequence Column',
+  data_unique_value: 'Data Unique Value',
+  language_setting: 'Language Setting',
+  request_setting: 'Request Setting',
+  request_time: 'Request Time',
+  language: 'Language',
+  theme_setting: 'Theme Setting',
+  theme: 'Theme',
+  english: 'English',
+  light: 'Light',
+  model: 'Model',
+  hue: 'Hue',
+  purple: 'Purple',
+  fillet: 'Fillet'
 }
diff --git a/seatunnel-ui/src/locales/en_US/tasks.ts b/seatunnel-ui/src/locales/en_US/tasks.ts
index 4031ae00..ac3b7c99 100644
--- a/seatunnel-ui/src/locales/en_US/tasks.ts
+++ b/seatunnel-ui/src/locales/en_US/tasks.ts
@@ -16,22 +16,29 @@
  */
 
 export default {
+  instance_id: 'Instance Id',
+  job_id: 'Job Id',
   tasks: 'Tasks',
   search: 'Search',
-  tasks_name: 'Tasks Name',
   success: 'Success',
   fail: 'Fail',
+  stop: 'Stop',
   running: 'Running',
+  unknown: 'Unknown',
+  unpublished: 'Unpublished',
+  published: 'Published',
   task_name: 'Task Name',
   state: 'State',
   run_frequency: 'Run Frequency',
   once: 'Once',
   crontab: 'Crontab',
-  next_run: 'Next Run',
-  last_run: 'Last Run',
+  start_time: 'Start Time',
+  end_time: 'End Time',
   last_total_bytes: 'Last Total Bytes',
   last_total_records: 'Last Total Records',
   rerun: 'Rerun',
   kill: 'Kill',
-  view_log: 'View Log'
+  operation: 'Operation',
+  view_log: 'View Log',
+  log: 'Log'
 }
diff --git a/seatunnel-ui/src/locales/en_US/user-manage.ts b/seatunnel-ui/src/locales/en_US/user-manage.ts
index e3b95613..eaba9da0 100644
--- a/seatunnel-ui/src/locales/en_US/user-manage.ts
+++ b/seatunnel-ui/src/locales/en_US/user-manage.ts
@@ -16,6 +16,7 @@
  */
 
 export default {
+  id: 'Id',
   user_manage: 'User Manage',
   create: 'Create',
   username: 'Username',
diff --git a/seatunnel-ui/src/router/data-pipes.ts b/seatunnel-ui/src/router/data-pipes.ts
index 365d7bc0..9a06ede6 100644
--- a/seatunnel-ui/src/router/data-pipes.ts
+++ b/seatunnel-ui/src/router/data-pipes.ts
@@ -39,7 +39,7 @@ export default {
       }
     },
     {
-      path: '/data-pipes/:dataPipeCode',
+      path: '/data-pipes/:dataPipeId',
       name: 'data-pipes-detail',
       component: components['data-pipes-detail'],
       meta: {
@@ -47,7 +47,7 @@ export default {
       }
     },
     {
-      path: '/data-pipes/:dataPipeCode/edit',
+      path: '/data-pipes/:dataPipeId/edit',
       name: 'data-pipes-edit',
       component: components['data-pipes-edit'],
       meta: {
diff --git a/seatunnel-ui/src/router/routes.ts b/seatunnel-ui/src/router/routes.ts
index 1784f7c9..8397eecf 100644
--- a/seatunnel-ui/src/router/routes.ts
+++ b/seatunnel-ui/src/router/routes.ts
@@ -32,10 +32,22 @@ const loginPage: RouteRecordRaw[] = [
   {
     path: '/login',
     name: 'login',
-    component: components['login'],
-    meta: {
-      auth: []
-    }
+    component: components['login']
+  },
+  {
+    path: '/setting',
+    redirect: { name: 'setting' },
+    component: () => import('@/layouts/dashboard'),
+    children: [
+      {
+        path: '/setting',
+        name: 'setting',
+        component: components['setting'],
+        meta: {
+          title: 'setting'
+        }
+      }
+    ]
   }
 ]
 
diff --git a/seatunnel-ui/src/service/script/index.ts b/seatunnel-ui/src/service/script/index.ts
index abf8f628..808f9148 100644
--- a/seatunnel-ui/src/service/script/index.ts
+++ b/seatunnel-ui/src/service/script/index.ts
@@ -34,21 +34,21 @@ export function scriptAdd(data: ScriptAdd): any {
   })
 }
 
-export function scriptDelete(scriptId: number): any {
+export function scriptDetail(scriptId: number): any {
   return axios({
     url: `/script/${scriptId}`,
-    method: 'delete'
+    method: 'get'
   })
 }
 
-export function scriptContent(scriptId: number): any {
+export function scriptDelete(scriptId: number): any {
   return axios({
-    url: `/script/${scriptId}/content`,
-    method: 'get'
+    url: `/script/${scriptId}`,
+    method: 'delete'
   })
 }
 
-export function scriptContentUpdate(scriptId: number, content: string): any {
+export function scriptUpdate(scriptId: number, content: string): any {
   return axios({
     url: `/script/${scriptId}/content`,
     method: 'put',
@@ -58,20 +58,6 @@ export function scriptContentUpdate(scriptId: number, content: string): any {
   })
 }
 
-export function scriptParam(scriptId: number): any {
-  return axios({
-    url: `/script/${scriptId}/param`,
-    method: 'get'
-  })
-}
-
-export function scriptParamUpdate(scriptId: number): any {
-  return axios({
-    url: `/script/${scriptId}/param`,
-    method: 'put'
-  })
-}
-
 export function scriptPublish(scriptId: number): any {
   return axios({
     url: `/script/${scriptId}/publish`,
diff --git a/seatunnel-ui/src/service/script/types.ts b/seatunnel-ui/src/service/script/types.ts
index 0b50f206..8c72a321 100644
--- a/seatunnel-ui/src/service/script/types.ts
+++ b/seatunnel-ui/src/service/script/types.ts
@@ -24,7 +24,17 @@ interface ScriptList {
 
 interface ScriptAdd {
   name: string
-  type: string
+  type: number
+  content: string
 }
 
-export { ScriptList, ScriptAdd }
+interface ScriptDetail extends ScriptAdd {
+  id: number
+  status: string
+  creatorId: number
+  menderId: number
+  createTime: string
+  updateTime: string
+}
+
+export { ScriptList, ScriptAdd, ScriptDetail }
diff --git a/seatunnel-ui/src/service/service.ts b/seatunnel-ui/src/service/service.ts
index 94bb5995..d78f4f10 100644
--- a/seatunnel-ui/src/service/service.ts
+++ b/seatunnel-ui/src/service/service.ts
@@ -15,24 +15,32 @@
  * limitations under the License.
  */
 
-import axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios'
+import axios, {
+  AxiosRequestConfig,
+  AxiosResponse,
+  AxiosError,
+  InternalAxiosRequestConfig
+} from 'axios'
 import utils from '@/utils'
 import { useUserStore } from '@/store/user'
+import { useSettingStore } from '@/store/setting'
 import type { UserDetail } from '@/service/user/types'
 
 const userStore = useUserStore()
+const settingStore = useSettingStore()
 
 const handleError = (res: AxiosResponse<any, any>) => {
   if (import.meta.env.MODE === 'development') {
     utils.log.capsule('SeaTunnel', 'UI')
     utils.log.error(res)
   }
-  console.log(res)
   window.$message.error(res.data.msg)
 }
 
 const baseRequestConfig: AxiosRequestConfig = {
-  timeout: 6000,
+  timeout: settingStore.getRequestTimeValue
+    ? settingStore.getRequestTimeValue
+    : 6000,
   baseURL: '/api/v1'
 }
 
@@ -42,7 +50,7 @@ const err = (err: AxiosError): Promise<AxiosError> => {
   return Promise.reject(err)
 }
 
-service.interceptors.request.use((config: AxiosRequestConfig<any>) => {
+service.interceptors.request.use((config: InternalAxiosRequestConfig) => {
   if (Object.keys(userStore.getUserInfo).length > 0) {
     config.headers &&
       (config.headers.token = (userStore.getUserInfo as UserDetail)
diff --git a/seatunnel-ui/src/service/task/index.ts b/seatunnel-ui/src/service/task/index.ts
index 606d7875..2955cefc 100644
--- a/seatunnel-ui/src/service/task/index.ts
+++ b/seatunnel-ui/src/service/task/index.ts
@@ -16,12 +16,7 @@
  */
 
 import { axios } from '@/service/service'
-import type {
-  TaskList,
-  TaskJobList,
-  TaskRecycle,
-  TaskExecute
-} from '@/service/task/types'
+import type { TaskList, TaskExecute } from '@/service/task/types'
 
 export function taskInstanceList(params: TaskList): any {
   return axios({
@@ -39,9 +34,9 @@ export function taskJobList(params: TaskList): any {
   })
 }
 
-export function taskExecute(scriptId: number, data: TaskExecute): any {
+export function taskExecute(id: number, data: TaskExecute): any {
   return axios({
-    url: `/task/${scriptId}/execute`,
+    url: `/task/${id}/execute`,
     method: 'post',
     data
   })
@@ -54,7 +49,7 @@ export function taskRecycle(scriptId: number): any {
   })
 }
 
-export function taskInstanceDetail(taskInstanceId: number): any {
+export function taskInstanceLog(taskInstanceId: number): any {
   return axios({
     url: `/task/${taskInstanceId}`,
     method: 'get'
diff --git a/seatunnel-ui/src/service/task/types.ts b/seatunnel-ui/src/service/task/types.ts
index 7258649a..daa86ab7 100644
--- a/seatunnel-ui/src/service/task/types.ts
+++ b/seatunnel-ui/src/service/task/types.ts
@@ -33,9 +33,22 @@ interface TaskRecycle {
 }
 
 interface TaskExecute {
-  content: string
+  objectType: number
   executeType: number
-  params: object
 }
 
-export { TaskList, TaskJobList, TaskRecycle, TaskExecute }
+interface JobDetail {
+  createTime: string
+  creatorName: string
+  datapipeName: string
+  jobId: number
+  jobPlan: string
+  jobStatus: string
+  menderName: string
+  publish: boolean
+  updateTime: string
+  status?: string
+  instanceId?: number
+}
+
+export { TaskList, TaskJobList, TaskRecycle, TaskExecute, JobDetail }
diff --git a/seatunnel-ui/src/service/types.ts b/seatunnel-ui/src/service/types.ts
index 3bc79fff..dbe12056 100644
--- a/seatunnel-ui/src/service/types.ts
+++ b/seatunnel-ui/src/service/types.ts
@@ -31,4 +31,4 @@ type ResponseTable<T> = ResponseBasic<{
   data: T
 }>
 
-export { ResponseTable }
+export { ResponseBasic, ResponseTable }
diff --git a/seatunnel-ui/src/store/setting/index.ts b/seatunnel-ui/src/store/setting/index.ts
new file mode 100644
index 00000000..561e0b91
--- /dev/null
+++ b/seatunnel-ui/src/store/setting/index.ts
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { defineStore } from 'pinia'
+import { SettingStore } from './types'
+
+export const useSettingStore = defineStore({
+  id: 'setting',
+  state: (): SettingStore => ({
+    sequenceColumn: false,
+    dataUniqueValue: false,
+    fillet: 15,
+    requestTime: 6000
+  }),
+  persist: true,
+  getters: {
+    getSequenceColumn(): boolean {
+      return this.sequenceColumn
+    },
+    getDataUniqueValue(): boolean {
+      return this.dataUniqueValue
+    },
+    getFilletValue(): number {
+      return this.fillet
+    },
+    getRequestTimeValue(): number {
+      return this.requestTime
+    }
+  },
+  actions: {
+    setSequenceColumn(status: boolean): void {
+      this.sequenceColumn = status
+    },
+    setDataUniqueValue(status: boolean): void {
+      this.dataUniqueValue = status
+    },
+    setFilletValue(status: number): void {
+      this.fillet = status
+    },
+    setRequestTimeValue(status: number): void {
+      this.requestTime = status
+    }
+  }
+})
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java b/seatunnel-ui/src/store/setting/types.ts
similarity index 85%
rename from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
rename to seatunnel-ui/src/store/setting/types.ts
index 1037f9f8..ba5327f5 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
+++ b/seatunnel-ui/src/store/setting/types.ts
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.domain.response.script;
-
-import lombok.Data;
-
-@Data
-public class AddEmptyScriptRes {
-    private int id;
+interface SettingStore {
+  sequenceColumn: boolean
+  dataUniqueValue: boolean
+  fillet: number
+  requestTime: number
 }
+
+export { SettingStore }
diff --git a/seatunnel-ui/src/themes/modules/light.ts b/seatunnel-ui/src/themes/modules/light.ts
index 4986ed2c..aa0f52d2 100644
--- a/seatunnel-ui/src/themes/modules/light.ts
+++ b/seatunnel-ui/src/themes/modules/light.ts
@@ -19,15 +19,49 @@ import type { GlobalThemeOverrides } from 'naive-ui'
 
 const light: GlobalThemeOverrides = {
   common: {
-    primaryColor: '#1890ff',
-    primaryColorHover: '#40a9ff',
-    primaryColorPressed: '#096dd9',
-    primaryColorSuppl: '#1890ff',
-
-    infoColor: '#1890ff',
-    successColor: '#52c41a',
-    warningColor: '#faad14',
-    errorColor: '#ff4d4f'
+    primaryColor: '#614bdd',
+    primaryColorHover: '#7d68de',
+    primaryColorSuppl: '#7d68de',
+    primaryColorPressed: '#513ac2',
+
+    infoColor: '#614bdd',
+    infoColorHover: '#7d68de',
+    infoColorSuppl: '#7d68de',
+    infoColorPressed: '#513ac2',
+
+    errorColor: '#db2777',
+    errorColorHover: '#d64687',
+    errorColorSuppl: '#d64687',
+    errorColorPressed: '#c60165',
+
+    successColor: '#04beca',
+    successColorHover: '#69c8d5',
+    successColorSuppl: '#69c8d5',
+    successColorPressed: '#04a6ae',
+
+    warningColor: '#eab308',
+    warningColorHover: '#e5cb41',
+    warningColorSuppl: '#e5cb41',
+    warningColorPressed: '#b38706',
+
+    textColorBase: '#151666',
+    textColor1: '#242660',
+    textColor2: '#313377',
+    textColor3: '#9096b8',
+
+    bodyColor: '#f7f8fa',
+    borderRadius: '15px',
+    tableHeaderColor: '#614bdd'
+  },
+  Layout: {
+    headerColor: '#fff'
+  },
+  DataTable: {
+    thTextColor: '#fff',
+    tdColorHover: '#f2f2fa'
+  },
+  Space: {
+    gapLarge: '28px 32px'
   }
 }
 
diff --git a/seatunnel-ui/src/components/log/index.tsx b/seatunnel-ui/src/views/data-pipes/components/log/index.tsx
similarity index 100%
rename from seatunnel-ui/src/components/log/index.tsx
rename to seatunnel-ui/src/views/data-pipes/components/log/index.tsx
diff --git a/seatunnel-ui/src/views/data-pipes/create/components/configuration-modal.tsx b/seatunnel-ui/src/views/data-pipes/create/components/configuration-modal.tsx
deleted file mode 100644
index 0f558368..00000000
--- a/seatunnel-ui/src/views/data-pipes/create/components/configuration-modal.tsx
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { defineComponent, onMounted, toRefs } from 'vue'
-import { useI18n } from 'vue-i18n'
-import { NButton, NDataTable, NForm, NFormItem, NInput, NSpace } from 'naive-ui'
-import { useConfigurationModal } from './use-configuration-modal'
-import Modal from '@/components/modal'
-import type { PropType } from 'vue'
-
-const props = {
-  showModal: {
-    type: Boolean as PropType<boolean>,
-    default: false
-  },
-  type: {
-    type: String as PropType<'engine-parameter' | 'self-defined-parameter'>
-  }
-}
-
-const ConfigurationModal = defineComponent({
-  props,
-  emits: ['cancelModal', 'confirmModal'],
-  setup(props, ctx) {
-    const { t } = useI18n()
-    const { state, createColumns, handleValidate } = useConfigurationModal()
-
-    const handleCancel = () => {
-      ctx.emit('cancelModal', props.showModal)
-    }
-
-    const handleConfirm = () => {}
-
-    const handleClickAdd = () => {
-      handleValidate()
-    }
-
-    onMounted(() => {
-      createColumns(state)
-    })
-
-    return { t, ...toRefs(state), handleCancel, handleConfirm, handleClickAdd }
-  },
-  render($props: any) {
-    return (
-      <Modal
-        title={
-          this.t(
-            'data_pipes.' +
-              ($props.type === 'engine-parameter'
-                ? 'engine_parameter'
-                : 'self_defined_parameter')
-          ) +
-          ' ' +
-          this.t('data_pipes.configuration')
-        }
-        show={this.showModal}
-        onCancel={this.handleCancel}
-        onConfirm={this.handleConfirm}
-      >
-        <NSpace vertical>
-          <NForm model={this.model} rules={this.rules} ref='parameterForm'>
-            <NFormItem label={this.t('data_pipes.key')} path='key'>
-              <NInput v-model={[this.model.key, 'value']} clearable />
-            </NFormItem>
-            <NFormItem label={this.t('data_pipes.value')} path='value'>
-              <NInput v-model={[this.model.value, 'value']} clearable />
-            </NFormItem>
-            <NButton class='w-full' onClick={this.handleClickAdd}>
-              {this.t('data_pipes.add')}
-            </NButton>
-          </NForm>
-          <NDataTable
-            loading={this.loading}
-            columns={this.columns}
-            data={this.tableData}
-          />
-        </NSpace>
-      </Modal>
-    )
-  }
-})
-
-export default ConfigurationModal
diff --git a/seatunnel-ui/src/views/data-pipes/create/components/use-configuration-modal.ts b/seatunnel-ui/src/views/data-pipes/create/components/use-configuration-modal.ts
deleted file mode 100644
index 5b28e29d..00000000
--- a/seatunnel-ui/src/views/data-pipes/create/components/use-configuration-modal.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { h, reactive, ref, SetupContext } from 'vue'
-import { useI18n } from 'vue-i18n'
-import { NButton, NSpace } from 'naive-ui'
-
-export function useConfigurationModal() {
-  const { t } = useI18n()
-  const state = reactive({
-    parameterForm: ref(),
-    model: {
-      key: ref(''),
-      value: ref('')
-    },
-    rules: {
-      key: {
-        required: true,
-        trigger: ['input', 'blur'],
-        message: t('data_pipes.model_validate_tips')
-      },
-      value: {
-        required: true,
-        trigger: ['input', 'blur'],
-        message: t('data_pipes.model_validate_tips')
-      }
-    },
-    loading: ref(false),
-    columns: [],
-    tableData: [{ key: 'key1', value: 'value1' }]
-  })
-
-  const createColumns = (state: any) => {
-    state.columns = [
-      {
-        title: t('data_pipes.key'),
-        key: 'key'
-      },
-      {
-        title: t('data_pipes.value'),
-        key: 'value'
-      },
-      {
-        title: t('data_pipes.operation'),
-        key: 'operation',
-        render: (row: any) =>
-          h(
-            NButton,
-            { text: true, onClick: () => handleDelete(row) },
-            t('user_manage.delete')
-          )
-      }
-    ]
-  }
-
-  const handleValidate = () => {
-    state.parameterForm.validate((errors: any) => {
-      if (!errors) {
-        state.tableData.push({ key: state.model.key, value: state.model.value })
-        state.model.key = ''
-        state.model.value = ''
-      } else {
-        return
-      }
-    })
-  }
-
-  const handleDelete = (row: any) => {}
-
-  return { state, createColumns, handleValidate }
-}
diff --git a/seatunnel-ui/src/views/data-pipes/create/index.tsx b/seatunnel-ui/src/views/data-pipes/create/index.tsx
index 47d4d710..2699f08a 100644
--- a/seatunnel-ui/src/views/data-pipes/create/index.tsx
+++ b/seatunnel-ui/src/views/data-pipes/create/index.tsx
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { defineComponent, ref } from 'vue'
+import { defineComponent, reactive, toRefs } from 'vue'
 import { useI18n } from 'vue-i18n'
 import { useRouter } from 'vue-router'
 import {
@@ -26,52 +26,38 @@ import {
   NIcon,
   NInput,
   NSpace,
-  NTooltip,
-  NDropdown
+  NTooltip
 } from 'naive-ui'
 import { BulbOutlined } from '@vicons/antd'
+import { scriptAdd } from '@/service/script'
 import MonacoEditor from '@/components/monaco-editor'
-import Log from '@/components/log'
-import ConfigurationModal from './components/configuration-modal'
 import type { Router } from 'vue-router'
-import type { Ref } from 'vue'
 
 const DataPipesCreate = defineComponent({
   setup() {
     const { t } = useI18n()
     const router: Router = useRouter()
-    const showConfigurationModal: Ref<boolean> = ref(false)
-    const configurationType: Ref<
-      'engine-parameter' | 'self-defined-parameter'
-    > = ref('engine-parameter')
+    const variables = reactive({
+      name: '',
+      type: 0,
+      content: ''
+    })
 
     const handleClickDataPipes = () => {
       router.push({ path: '/data-pipes/list' })
     }
 
-    const handleSelectConfiguration = (
-      key: 'engine-parameter' | 'self-defined-parameter'
-    ) => {
-      configurationType.value = key
-      showConfigurationModal.value = true
-    }
-
-    const handleCancelConfigurationModal = () => {
-      showConfigurationModal.value = false
-    }
-
-    const handleConfirmConfigurationModal = () => {
-      showConfigurationModal.value = false
+    const handleAdd = () => {
+      scriptAdd(variables).then(() => {
+        handleClickDataPipes()
+      })
     }
 
     return {
       t,
-      showConfigurationModal,
-      configurationType,
+      ...toRefs(variables),
       handleClickDataPipes,
-      handleSelectConfiguration,
-      handleCancelConfigurationModal,
-      handleConfirmConfigurationModal
+      handleAdd
     }
   },
   render() {
@@ -93,8 +79,12 @@ const DataPipesCreate = defineComponent({
             ),
             'header-extra': () => (
               <NSpace>
-                <NButton secondary>{this.t('data_pipes.cancel')}</NButton>
-                <NButton secondary>{this.t('data_pipes.save')}</NButton>
+                <NButton secondary onClick={this.handleClickDataPipes}>
+                  {this.t('data_pipes.cancel')}
+                </NButton>
+                <NButton secondary type='primary' onClick={this.handleAdd}>
+                  {this.t('data_pipes.save')}
+                </NButton>
               </NSpace>
             )
           }}
@@ -108,6 +98,7 @@ const DataPipesCreate = defineComponent({
                 maxlength='100'
                 showCount
                 style={{ width: '600px' }}
+                v-model={[this.name, 'value']}
               />
               <NTooltip placement='right' trigger='hover'>
                 {{
@@ -123,42 +114,8 @@ const DataPipesCreate = defineComponent({
           </NSpace>
         </NCard>
         <NCard>
-          <NSpace vertical>
-            <NSpace justify='end'>
-              <NButton secondary>{this.t('data_pipes.execute')}</NButton>
-              <NButton secondary>{this.t('data_pipes.kill')}</NButton>
-              <NButton secondary>{this.t('data_pipes.stop')}</NButton>
-              <NDropdown
-                trigger='click'
-                options={[
-                  {
-                    label: this.t('data_pipes.engine_parameter'),
-                    key: 'engine-parameter'
-                  },
-                  {
-                    label: this.t('data_pipes.self_defined_parameter'),
-                    key: 'self-defined-parameter'
-                  }
-                ]}
-                onSelect={this.handleSelectConfiguration}
-              >
-                <NButton secondary>
-                  {this.t('data_pipes.configuration')}
-                </NButton>
-              </NDropdown>
-            </NSpace>
-            <MonacoEditor />
-          </NSpace>
-        </NCard>
-        <NCard>
-          <Log />
+          <MonacoEditor v-model={[this.content, 'value']} />
         </NCard>
-        <ConfigurationModal
-          type={this.configurationType}
-          showModal={this.showConfigurationModal}
-          onCancelModal={this.handleCancelConfigurationModal}
-          onConfirmModal={this.handleConfirmConfigurationModal}
-        />
       </NSpace>
     )
   }
diff --git a/seatunnel-ui/src/views/data-pipes/detail/components/detail-overview.tsx b/seatunnel-ui/src/views/data-pipes/detail/components/detail-overview.tsx
deleted file mode 100644
index 485bf8c1..00000000
--- a/seatunnel-ui/src/views/data-pipes/detail/components/detail-overview.tsx
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { defineComponent, onMounted, toRefs } from 'vue'
-import { NGi, NGrid, NSpace, NTabs, NTabPane, NDataTable } from 'naive-ui'
-import { useI18n } from 'vue-i18n'
-import { useDetailOverview } from './use-detail-overview'
-import Log from '@/components/log'
-
-const DetailOverview = defineComponent({
-  setup() {
-    const { t } = useI18n()
-    const { state, createColumns } = useDetailOverview()
-
-    onMounted(() => {
-      createColumns(state)
-    })
-
-    return { t, ...toRefs(state) }
-  },
-  render() {
-    return (
-      <NSpace vertical>
-        <NGrid x-gap='12' cols='2'>
-          <NGi>{this.t('data_pipes.input_metrics')}</NGi>
-          <NGi>{this.t('data_pipes.output_metrics')}</NGi>
-        </NGrid>
-        <NGrid x-gap='12' cols='4'>
-          <NGi
-            class={['flex', 'justify-between', 'py-4', 'px-3', 'bg-gray-50']}
-          >
-            <span>1212</span>
-            <span class='text-gray-400'>
-              {this.t('data_pipes.bytes_per_second')}
-            </span>
-          </NGi>
-          <NGi
-            class={['flex', 'justify-between', 'py-4', 'px-3', 'bg-gray-50']}
-          >
-            <span>1212</span>
-            <span class='text-gray-400'>
-              {this.t('data_pipes.record_per_second')}
-            </span>
-          </NGi>
-          <NGi
-            class={['flex', 'justify-between', 'py-4', 'px-3', 'bg-gray-50']}
-          >
-            <span>1212</span>
-            <span class='text-gray-400'>
-              {this.t('data_pipes.bytes_per_second')}
-            </span>
-          </NGi>
-          <NGi
-            class={['flex', 'justify-between', 'py-4', 'px-3', 'bg-gray-50']}
-          >
-            <span>1212</span>
-            <span class='text-gray-400'>
-              {this.t('data_pipes.record_per_second')}
-            </span>
-          </NGi>
-        </NGrid>
-        <NGrid x-gap='12' cols='4'>
-          <NGi
-            class={['flex', 'justify-between', 'py-4', 'px-3', 'bg-gray-50']}
-          >
-            <span>1212</span>
-            <span class='text-gray-400'>
-              {this.t('data_pipes.total_bytes')}
-            </span>
-          </NGi>
-          <NGi
-            class={['flex', 'justify-between', 'py-4', 'px-3', 'bg-gray-50']}
-          >
-            <span>1212</span>
-            <span class='text-gray-400'>
-              {this.t('data_pipes.total_records')}
-            </span>
-          </NGi>
-          <NGi
-            class={['flex', 'justify-between', 'py-4', 'px-3', 'bg-gray-50']}
-          >
-            <span>1212</span>
-            <span class='text-gray-400'>
-              {this.t('data_pipes.total_bytes')}
-            </span>
-          </NGi>
-          <NGi
-            class={['flex', 'justify-between', 'py-4', 'px-3', 'bg-gray-50']}
-          >
-            <span>1212</span>
-            <span class='text-gray-400'>
-              {this.t('data_pipes.total_records')}
-            </span>
-          </NGi>
-        </NGrid>
-        <NTabs type='line' justify-content='space-evenly' class='mt-7'>
-          <NTabPane name='run-log' tab={this.t('data_pipes.run_log')}>
-            <Log />
-          </NTabPane>
-          <NTabPane
-            name='historical-run-logs'
-            tab={this.t('data_pipes.historical_run_logs')}
-          >
-            <NDataTable
-              loading={this.loading}
-              columns={this.columns}
-              data={this.tableData}
-            />
-          </NTabPane>
-        </NTabs>
-      </NSpace>
-    )
-  }
-})
-
-export default DetailOverview
diff --git a/seatunnel-ui/src/views/data-pipes/detail/components/use-detail-overview.ts b/seatunnel-ui/src/views/data-pipes/detail/components/use-detail-overview.ts
deleted file mode 100644
index c9eba531..00000000
--- a/seatunnel-ui/src/views/data-pipes/detail/components/use-detail-overview.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { reactive, ref } from 'vue'
-import { useI18n } from 'vue-i18n'
-
-export function useDetailOverview() {
-  const { t } = useI18n()
-  const state = reactive({
-    loading: ref(false),
-    columns: [],
-    tableData: [{ name: '' }]
-  })
-
-  const createColumns = (state: any) => {
-    state.columns = [
-      {
-        title: t('data_pipes.name'),
-        key: 'name'
-      },
-      {
-        title: t('data_pipes.execute_time'),
-        key: 'executeTime'
-      },
-      {
-        title: t('data_pipes.end_time'),
-        key: 'endTime'
-      },
-      {
-        title: t('data_pipes.state'),
-        key: 'state'
-      }
-    ]
-  }
-
-  return { state, createColumns }
-}
diff --git a/seatunnel-ui/src/views/data-pipes/detail/index.tsx b/seatunnel-ui/src/views/data-pipes/detail/index.tsx
index 5f0907f2..aa34cfdf 100644
--- a/seatunnel-ui/src/views/data-pipes/detail/index.tsx
+++ b/seatunnel-ui/src/views/data-pipes/detail/index.tsx
@@ -15,32 +15,42 @@
  * limitations under the License.
  */
 
-import { defineComponent } from 'vue'
-import {
-  NSpace,
-  NCard,
-  NButton,
-  NBreadcrumb,
-  NBreadcrumbItem,
-  NTabs,
-  NTabPane
-} from 'naive-ui'
+import { defineComponent, onMounted, reactive, toRefs } from 'vue'
+import { NSpace, NCard, NBreadcrumb, NBreadcrumbItem } from 'naive-ui'
 import { useI18n } from 'vue-i18n'
-import { useRouter } from 'vue-router'
+import { useRoute, useRouter } from 'vue-router'
+import { scriptDetail } from '@/service/script'
 import MonacoEditor from '@/components/monaco-editor'
-import DetailOverview from './components/detail-overview'
-import type { Router } from 'vue-router'
+import type { Router, RouteLocationNormalizedLoaded } from 'vue-router'
+import type { ResponseBasic } from '@/service/types'
+import type { ScriptDetail } from '@/service/script/types'
 
 const DataPipesDetail = defineComponent({
   setup() {
     const { t } = useI18n()
     const router: Router = useRouter()
+    const route: RouteLocationNormalizedLoaded = useRoute()
+    const variables = reactive({
+      name: '',
+      type: 0,
+      content: ''
+    })
 
     const handleClickDataPipes = () => {
       router.push({ path: '/data-pipes/list' })
     }
 
-    return { t, handleClickDataPipes }
+    onMounted(() => {
+      scriptDetail(Number(route.params.dataPipeId)).then(
+        (res: ResponseBasic<ScriptDetail>) => {
+          variables.name = res.data.name
+          variables.type = res.data.type
+          variables.content = res.data.content
+        }
+      )
+    })
+
+    return { t, ...toRefs(variables), handleClickDataPipes }
   },
   render() {
     return (
@@ -53,42 +63,18 @@ const DataPipesDetail = defineComponent({
                   <NBreadcrumbItem onClick={this.handleClickDataPipes}>
                     {this.t('data_pipes.data_pipes')}
                   </NBreadcrumbItem>
-                  <NBreadcrumbItem>user-order-tables-10</NBreadcrumbItem>
+                  <NBreadcrumbItem>{this.name}</NBreadcrumbItem>
                 </NBreadcrumb>
-                <div
-                  class={['w-3', 'h-3', 'rounded-full', 'bg-green-400']}
-                ></div>
-                <span
-                  style={{
-                    fontSize: 'var(--n-font-size)',
-                    color: 'var(--n-item-text-color-active)'
-                  }}
-                >
-                  {this.t('data_pipes.stop')}
-                </span>
-              </NSpace>
-            ),
-            'header-extra': () => (
-              <NSpace>
-                <NButton secondary>{this.t('data_pipes.execute')}</NButton>
-                <NButton secondary>{this.t('data_pipes.kill')}</NButton>
-                <NButton secondary>{this.t('data_pipes.stop')}</NButton>
               </NSpace>
             )
           }}
         </NCard>
-        <NTabs type='segment' class='mt-9'>
-          <NTabPane name='overview' tab={this.t('data_pipes.overview')}>
-            <NCard>
-              <DetailOverview />
-            </NCard>
-          </NTabPane>
-          <NTabPane name='script' tab={this.t('data_pipes.script')}>
-            <NCard>
-              <MonacoEditor />
-            </NCard>
-          </NTabPane>
-        </NTabs>
+        <NCard>
+          <MonacoEditor
+            v-model={[this.content, 'value']}
+            options={{ readOnly: true }}
+          />
+        </NCard>
       </NSpace>
     )
   }
diff --git a/seatunnel-ui/src/views/data-pipes/edit/index.tsx b/seatunnel-ui/src/views/data-pipes/edit/index.tsx
index 28f33bb0..7a5564f7 100644
--- a/seatunnel-ui/src/views/data-pipes/edit/index.tsx
+++ b/seatunnel-ui/src/views/data-pipes/edit/index.tsx
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { defineComponent } from 'vue'
+import { defineComponent, onMounted, reactive, toRefs } from 'vue'
 import {
   NBreadcrumb,
   NBreadcrumbItem,
@@ -27,21 +27,48 @@ import {
   NTooltip
 } from 'naive-ui'
 import { useI18n } from 'vue-i18n'
-import { useRouter } from 'vue-router'
+import { useRouter, useRoute } from 'vue-router'
 import { BulbOutlined } from '@vicons/antd'
+import { scriptDetail, scriptUpdate } from '@/service/script'
 import MonacoEditor from '@/components/monaco-editor'
-import type { Router } from 'vue-router'
+import type { Router, RouteLocationNormalizedLoaded } from 'vue-router'
+import type { ResponseBasic } from '@/service/types'
+import type { ScriptDetail } from '@/service/script/types'
 
 const DataPipesEdit = defineComponent({
   setup() {
     const { t } = useI18n()
     const router: Router = useRouter()
+    const route: RouteLocationNormalizedLoaded = useRoute()
+    const variables = reactive({
+      name: '',
+      type: 0,
+      content: ''
+    })
 
     const handleClickDataPipes = () => {
       router.push({ path: '/data-pipes/list' })
     }
 
-    return { t, handleClickDataPipes }
+    const handleAdd = () => {
+      scriptUpdate(Number(route.params.dataPipeId), variables.content).then(
+        () => {
+          handleClickDataPipes()
+        }
+      )
+    }
+
+    onMounted(() => {
+      scriptDetail(Number(route.params.dataPipeId)).then(
+        (res: ResponseBasic<ScriptDetail>) => {
+          variables.name = res.data.name
+          variables.type = res.data.type
+          variables.content = res.data.content
+        }
+      )
+    })
+
+    return { t, ...toRefs(variables), handleClickDataPipes, handleAdd }
   },
   render() {
     return (
@@ -54,14 +81,18 @@ const DataPipesEdit = defineComponent({
                   <NBreadcrumbItem onClick={this.handleClickDataPipes}>
                     {this.t('data_pipes.data_pipes')}
                   </NBreadcrumbItem>
-                  <NBreadcrumbItem>{this.t('data_pipes.edit')}</NBreadcrumbItem>
+                  <NBreadcrumbItem>{this.name}</NBreadcrumbItem>
                 </NBreadcrumb>
               </NSpace>
             ),
             'header-extra': () => (
               <NSpace>
-                <NButton secondary>{this.t('data_pipes.cancel')}</NButton>
-                <NButton secondary>{this.t('data_pipes.save')}</NButton>
+                <NButton secondary onClick={this.handleClickDataPipes}>
+                  {this.t('data_pipes.cancel')}
+                </NButton>
+                <NButton secondary type='primary' onClick={this.handleAdd}>
+                  {this.t('data_pipes.save')}
+                </NButton>
               </NSpace>
             )
           }}
@@ -71,10 +102,11 @@ const DataPipesEdit = defineComponent({
             <span>{this.t('data_pipes.name')}</span>
             <NSpace align='center'>
               <NInput
-                clearable
+                disabled
                 maxlength='100'
                 showCount
                 style={{ width: '600px' }}
+                v-model={[this.name, 'value']}
               />
               <NTooltip placement='right' trigger='hover'>
                 {{
@@ -90,7 +122,7 @@ const DataPipesEdit = defineComponent({
           </NSpace>
         </NCard>
         <NCard>
-          <MonacoEditor />
+          <MonacoEditor v-model={[this.content, 'value']} />
         </NCard>
       </NSpace>
     )
diff --git a/seatunnel-ui/src/views/data-pipes/list/components/delete-modal.tsx b/seatunnel-ui/src/views/data-pipes/list/components/delete-modal.tsx
index f2355ace..4fb4b862 100644
--- a/seatunnel-ui/src/views/data-pipes/list/components/delete-modal.tsx
+++ b/seatunnel-ui/src/views/data-pipes/list/components/delete-modal.tsx
@@ -41,7 +41,9 @@ const DeleteModal = defineComponent({
       ctx.emit('cancelModal', props.showModal)
     }
 
-    const handleConfirm = () => {}
+    const handleConfirm = () => {
+      ctx.emit('confirmModal')
+    }
 
     return { t, handleCancel, handleConfirm }
   },
diff --git a/seatunnel-ui/src/views/data-pipes/list/components/publish-modal.tsx b/seatunnel-ui/src/views/data-pipes/list/components/publish-modal.tsx
index abfce10c..b4eddeb6 100644
--- a/seatunnel-ui/src/views/data-pipes/list/components/publish-modal.tsx
+++ b/seatunnel-ui/src/views/data-pipes/list/components/publish-modal.tsx
@@ -41,7 +41,9 @@ const PublishModal = defineComponent({
       ctx.emit('cancelModal', props.showModal)
     }
 
-    const handleConfirm = () => {}
+    const handleConfirm = () => {
+      ctx.emit('confirmModal')
+    }
 
     return { t, handleCancel, handleConfirm }
   },
diff --git a/seatunnel-ui/src/views/data-pipes/list/index.tsx b/seatunnel-ui/src/views/data-pipes/list/index.tsx
index a8cafb81..53775995 100644
--- a/seatunnel-ui/src/views/data-pipes/list/index.tsx
+++ b/seatunnel-ui/src/views/data-pipes/list/index.tsx
@@ -28,13 +28,22 @@ const DataPipesList = defineComponent({
   setup() {
     const { t } = useI18n()
     const router: Router = useRouter()
-    const { state, createColumns } = useTable()
+    const {
+      state,
+      createColumns,
+      getTableData,
+      handleConfirmDeleteModal,
+      handleConfirmPublishModal
+    } = useTable()
 
-    const handleCancelDeleteModal = () => {
-      state.showDeleteModal = false
+    const requestData = () => {
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo
+      })
     }
 
-    const handleConfirmDeleteModal = () => {
+    const handleCancelDeleteModal = () => {
       state.showDeleteModal = false
     }
 
@@ -42,16 +51,18 @@ const DataPipesList = defineComponent({
       state.showPublishModal = false
     }
 
-    const handleConfirmPublishModal = () => {
-      state.showPublishModal = false
-    }
-
     const handleCreate = () => {
       router.push({ path: '/data-pipes/create' })
     }
 
+    const handlePageSize = () => {
+      state.pageNo = 1
+      requestData()
+    }
+
     onMounted(() => {
       createColumns(state)
+      requestData()
     })
 
     return {
@@ -61,7 +72,9 @@ const DataPipesList = defineComponent({
       handleConfirmDeleteModal,
       handleCancelPublishModal,
       handleConfirmPublishModal,
-      handleCreate
+      handleCreate,
+      requestData,
+      handlePageSize
     }
   },
   render() {
@@ -70,7 +83,7 @@ const DataPipesList = defineComponent({
         <NCard title={this.t('data_pipes.data_pipes')}>
           {{
             'header-extra': () => (
-              <NButton onClick={this.handleCreate}>
+              <NButton onClick={this.handleCreate} type='primary'>
                 {this.t('data_pipes.create')}
               </NButton>
             )
@@ -85,12 +98,14 @@ const DataPipesList = defineComponent({
             />
             <NSpace justify='center'>
               <NPagination
-                v-model:page={this.page}
+                v-model:page={this.pageNo}
                 v-model:page-size={this.pageSize}
                 page-count={this.totalPage}
                 show-size-picker
                 page-sizes={[10, 30, 50]}
                 show-quick-jumper
+                onUpdatePage={this.requestData}
+                onUpdatePageSize={this.handlePageSize}
               />
             </NSpace>
           </NSpace>
diff --git a/seatunnel-ui/src/views/data-pipes/list/use-table.ts b/seatunnel-ui/src/views/data-pipes/list/use-table.ts
index cfffaf51..529c7682 100644
--- a/seatunnel-ui/src/views/data-pipes/list/use-table.ts
+++ b/seatunnel-ui/src/views/data-pipes/list/use-table.ts
@@ -17,15 +17,22 @@
 
 import { reactive, ref, h } from 'vue'
 import { useI18n } from 'vue-i18n'
-import { NSpace, NButton, NIcon, NDropdown } from 'naive-ui'
-import { EllipsisOutlined } from '@vicons/antd'
+import { NSpace, NButton, NTag } from 'naive-ui'
+import { scriptList, scriptDelete, scriptPublish } from '@/service/script'
+import { taskExecute } from '@/service/task'
+import { useRouter } from 'vue-router'
+import { getTableColumn } from '@/common/table'
+import type { ResponseTable } from '@/service/types'
+import type { ScriptDetail } from '@/service/script/types'
+import type { Router } from 'vue-router'
 
 export function useTable() {
   const { t } = useI18n()
+  const router: Router = useRouter()
   const state = reactive({
     columns: [],
-    tableData: [{ username: '' }],
-    page: ref(1),
+    tableData: [],
+    pageNo: ref(1),
     pageSize: ref(10),
     totalPage: ref(1),
     row: {},
@@ -36,49 +43,104 @@ export function useTable() {
 
   const createColumns = (state: any) => {
     state.columns = [
+      ...getTableColumn([{ key: 'id', title: t('data_pipes.id') }]),
       {
         title: t('data_pipes.name'),
-        key: 'name'
+        key: 'name',
+        render: (row: ScriptDetail) => {
+          return h(
+            NButton,
+            {
+              text: true,
+              type: 'primary',
+              onClick: () => {
+                router.push({
+                  path: `/data-pipes/${row.id}`
+                })
+              }
+            },
+            {
+              default: () => row.name
+            }
+          )
+        }
       },
       {
         title: t('data_pipes.state'),
-        key: 'state'
+        key: 'status',
+        render: (row: ScriptDetail) => {
+          if (row.status === 'published') {
+            return h(
+              NTag,
+              { type: 'info' },
+              { default: () => t('tasks.published') }
+            )
+          } else {
+            return h(
+              NTag,
+              { type: 'default' },
+              { default: () => t('tasks.unpublished') }
+            )
+          }
+        }
       },
       {
-        title: t('data_pipes.executed_time'),
-        key: 'executedTime'
+        title: t('data_pipes.create_time'),
+        key: 'createTime'
       },
       {
-        title: t('data_pipes.modification_time'),
-        key: 'modificationTime'
+        title: t('data_pipes.update_time'),
+        key: 'updateTime'
       },
       {
         title: t('data_pipes.operation'),
         key: 'operation',
-        render: (row: any) =>
+        render: (row: ScriptDetail) =>
           h(NSpace, null, {
             default: () => [
-              h(NButton, { text: true }, t('data_pipes.execute')),
-              h(NButton, { text: true }, t('data_pipes.edit')),
               h(
                 NButton,
-                { text: true, onClick: () => handlePublish(row) },
-                t('data_pipes.publish')
+                {
+                  text: true,
+                  disabled: row.status !== 'published',
+                  onClick: () => handleExecute(row)
+                },
+                {
+                  default: () => t('data_pipes.execute')
+                }
+              ),
+              h(
+                NButton,
+                {
+                  text: true,
+                  disabled: row.status === 'published',
+                  onClick: () => {
+                    router.push({
+                      path: `/data-pipes/${row.id}/edit`
+                    })
+                  }
+                },
+                {
+                  default: () => t('data_pipes.edit')
+                }
               ),
               h(
                 NButton,
                 {
                   text: true,
-                  trigger: 'click'
+                  disabled: row.status === 'published',
+                  onClick: () => handlePublish(row)
                 },
-                h(
-                  NDropdown,
-                  {
-                    options: [{ key: 'delete', label: t('data_pipes.delete') }],
-                    onClick: () => handleDelete(row)
-                  },
-                  h(NIcon, {}, h(EllipsisOutlined))
-                )
+                { default: () => t('data_pipes.publish') }
+              ),
+              h(
+                NButton,
+                {
+                  text: true,
+                  disabled: row.status === 'published',
+                  onClick: () => handleDelete(row)
+                },
+                { default: () => t('data_pipes.delete') }
               )
             ]
           })
@@ -86,15 +148,67 @@ export function useTable() {
     ]
   }
 
-  const handleDelete = (row: any) => {
+  const handleDelete = (row: ScriptDetail) => {
     state.showDeleteModal = true
     state.row = row
   }
 
-  const handlePublish = (row: any) => {
+  const handleConfirmDeleteModal = () => {
+    if (state.tableData.length === 1 && state.pageNo > 1) {
+      --state.pageNo
+    }
+
+    scriptDelete((state.row as ScriptDetail).id as number).then(() => {
+      state.showDeleteModal = false
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo
+      })
+    })
+  }
+
+  const handlePublish = (row: ScriptDetail) => {
     state.showPublishModal = true
     state.row = row
   }
 
-  return { state, createColumns }
+  const handleConfirmPublishModal = () => {
+    scriptPublish((state.row as ScriptDetail).id as number).then(() => {
+      state.showPublishModal = false
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo
+      })
+    })
+  }
+
+  const handleExecute = (row: ScriptDetail) => {
+    taskExecute(row.id, {
+      objectType: 0,
+      executeType: 0
+    }).then(() => {
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo
+      })
+    })
+  }
+
+  const getTableData = (params: any) => {
+    if (state.loading) return
+    state.loading = true
+    scriptList(params).then((res: ResponseTable<Array<ScriptDetail> | []>) => {
+      state.tableData = res.data.data as any
+      state.totalPage = res.data.totalPage
+      state.loading = false
+    })
+  }
+
+  return {
+    state,
+    createColumns,
+    handleConfirmDeleteModal,
+    handleConfirmPublishModal,
+    getTableData
+  }
 }
diff --git a/seatunnel-ui/src/views/jobs/list/index.tsx b/seatunnel-ui/src/views/jobs/list/index.tsx
index 88a09e7b..e9879527 100644
--- a/seatunnel-ui/src/views/jobs/list/index.tsx
+++ b/seatunnel-ui/src/views/jobs/list/index.tsx
@@ -30,15 +30,32 @@ import { useTable } from './use-table'
 const JobsList = defineComponent({
   setup() {
     const { t } = useI18n()
-    const { state, createColumns } = useTable()
+    const { state, createColumns, getTableData } = useTable()
 
-    const handleSearch = () => {}
+    const handleSearch = () => {
+      state.pageNo = 1
+      requestData()
+    }
+
+    const handlePageSize = () => {
+      state.pageNo = 1
+      requestData()
+    }
+
+    const requestData = () => {
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo,
+        name: state.name
+      })
+    }
 
     onMounted(() => {
       createColumns(state)
+      requestData()
     })
 
-    return { t, handleSearch, ...toRefs(state) }
+    return { t, handleSearch, ...toRefs(state), requestData, handlePageSize }
   },
   render() {
     return (
@@ -48,10 +65,11 @@ const JobsList = defineComponent({
             'header-extra': () => (
               <NSpace>
                 <NInput
+                  v-model={[this.name, 'value']}
                   placeholder={this.t('jobs.data_pipe_name')}
                   style={{ width: '200px' }}
                 />
-                <NButton onClick={this.handleSearch}>
+                <NButton onClick={this.handleSearch} type='primary'>
                   {this.t('jobs.search')}
                 </NButton>
               </NSpace>
@@ -67,12 +85,14 @@ const JobsList = defineComponent({
             />
             <NSpace justify='center'>
               <NPagination
-                v-model:page={this.page}
+                v-model:page={this.pageNo}
                 v-model:page-size={this.pageSize}
                 page-count={this.totalPage}
                 show-size-picker
                 page-sizes={[10, 30, 50]}
                 show-quick-jumper
+                onUpdatePage={this.requestData}
+                onUpdatePageSize={this.handlePageSize}
               />
             </NSpace>
           </NSpace>
diff --git a/seatunnel-ui/src/views/jobs/list/use-table.ts b/seatunnel-ui/src/views/jobs/list/use-table.ts
index ff6e7817..1b910d5b 100644
--- a/seatunnel-ui/src/views/jobs/list/use-table.ts
+++ b/seatunnel-ui/src/views/jobs/list/use-table.ts
@@ -17,15 +17,20 @@
 
 import { useI18n } from 'vue-i18n'
 import { h, reactive, ref } from 'vue'
-import { NButton, NSpace, NSwitch } from 'naive-ui'
+import { NButton, NSpace } from 'naive-ui'
+import { taskJobList, taskExecute, taskRecycle } from '@/service/task'
+import { getTableColumn } from '@/common/table'
+import type { ResponseTable } from '@/service/types'
+import type { JobDetail } from '@/service/task/types'
 
 export function useTable() {
   const { t } = useI18n()
 
   const state = reactive({
     columns: [],
-    tableData: [{}],
-    page: ref(1),
+    tableData: [],
+    name: ref(null),
+    pageNo: ref(1),
     pageSize: ref(10),
     totalPage: ref(1),
     loading: ref(false)
@@ -33,36 +38,84 @@ export function useTable() {
 
   const createColumns = (state: any) => {
     state.columns = [
+      ...getTableColumn([
+        { key: 'scriptId', title: t('jobs.script_id') },
+        { key: 'jobId', title: t('jobs.job_id') }
+      ]),
       {
         title: t('jobs.data_pipe_name'),
-        key: 'data_pipe_name'
+        key: 'datapipeName'
       },
       {
         title: t('jobs.plan'),
-        key: 'plan'
+        key: 'jobPlan'
       },
       {
         title: t('jobs.create_date'),
-        key: 'create_date'
-      },
-      {
-        title: t('jobs.publish'),
-        key: 'publish',
-        render: (row: any) => h(NSwitch, { round: false })
+        key: 'createTime'
       },
       {
         title: t('jobs.operation'),
         key: 'operation',
-        render: (row: any) =>
+        render: (row: JobDetail) =>
           h(NSpace, null, {
             default: () => [
-              h(NButton, { text: true }, t('jobs.executed_immediately')),
-              h(NButton, { text: true }, t('jobs.stop_plan'))
+              h(
+                NButton,
+                {
+                  text: true,
+                  disabled: row.jobStatus === 'OFFLINE',
+                  onClick: () => handleExecute(row.jobId)
+                },
+                { default: () => t('jobs.execute') }
+              ),
+              h(
+                NButton,
+                {
+                  text: true,
+                  disabled: row.jobStatus === 'OFFLINE',
+                  onClick: () => handleRecycle(row.jobId)
+                },
+                { default: () => t('jobs.recycle') }
+              )
             ]
           })
       }
     ]
   }
 
-  return { state, createColumns }
+  const getTableData = (params: any) => {
+    if (state.loading) return
+    state.loading = true
+    taskJobList({ ...params }).then(
+      (res: ResponseTable<Array<JobDetail> | []>) => {
+        state.tableData = res.data.data as any
+        state.totalPage = res.data.totalPage
+        state.loading = false
+      }
+    )
+  }
+
+  const handleExecute = (id: number) => {
+    taskExecute(id, {
+      objectType: 1,
+      executeType: 0
+    }).then(() => {
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo
+      })
+    })
+  }
+
+  const handleRecycle = (id: number) => {
+    taskRecycle(id).then(() => {
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo
+      })
+    })
+  }
+
+  return { state, createColumns, getTableData }
 }
diff --git a/seatunnel-ui/src/views/login/index.tsx b/seatunnel-ui/src/views/login/index.tsx
index 3d665735..59e0b80b 100644
--- a/seatunnel-ui/src/views/login/index.tsx
+++ b/seatunnel-ui/src/views/login/index.tsx
@@ -16,7 +16,16 @@
  */
 
 import { defineComponent, toRefs, withKeys, getCurrentInstance } from 'vue'
-import { NSpace, NForm, NFormItem, NInput, NButton, useMessage } from 'naive-ui'
+import {
+  NSpace,
+  NLayout,
+  NLayoutContent,
+  NForm,
+  NFormItem,
+  NInput,
+  NButton,
+  useMessage
+} from 'naive-ui'
 import { useI18n } from 'vue-i18n'
 import { useForm } from './use-form'
 
@@ -36,52 +45,60 @@ const Login = defineComponent({
   },
   render() {
     return (
-      <NSpace
-        justify='center'
-        align='center'
-        class='w-full h-screen bg-blue-400'
-      >
-        <div class='w-96 bg-white px-10 py-8'>
-          <h2 class='text-2xl mb-6'>{this.t('login.login_to_sea_tunnel')}</h2>
-          <NForm rules={this.rules} ref='loginFormRef'>
-            <NFormItem
-              label={this.t('login.username')}
-              label-style={{ color: 'black' }}
-              path='userName'
-            >
-              <NInput
-                allowInput={this.trim}
-                type='text'
-                v-model={[this.loginForm.username, 'value']}
-                placeholder={this.t('login.username_tips')}
-                autofocus
-                onKeydown={withKeys(this.handleLogin, ['enter'])}
-              />
-            </NFormItem>
-            <NFormItem
-              label={this.t('login.password')}
-              label-style={{ color: 'black' }}
-              path='userPassword'
-            >
-              <NInput
-                allowInput={this.trim}
-                type='password'
-                v-model={[this.loginForm.password, 'value']}
-                placeholder={this.t('login.password_tips')}
-                onKeydown={withKeys(this.handleLogin, ['enter'])}
-              />
-            </NFormItem>
-          </NForm>
-          <NButton
-            type='info'
-            disabled={!this.loginForm.username || !this.loginForm.password}
-            style={{ width: '100%' }}
-            onClick={this.handleLogin}
+      <NLayout>
+        <NLayoutContent>
+          <NSpace
+            justify='center'
+            align='center'
+            class='w-full h-screen bg-gray-100'
           >
-            {this.t('login.login')}
-          </NButton>
-        </div>
-      </NSpace>
+            <div class='w-96 bg-white px-16 py-20 border border-gray-100 rounded-2xl'>
+              <h2 class='text-2xl mb-16 font-bold'>
+                {this.t('login.login_to_sea_tunnel')}
+              </h2>
+              <NForm rules={this.rules} ref='loginFormRef' class='mb-4'>
+                <NFormItem
+                  label={this.t('login.username')}
+                  label-style={{ color: 'black' }}
+                  path='userName'
+                >
+                  <NInput
+                    clearable
+                    allowInput={this.trim}
+                    type='text'
+                    v-model={[this.loginForm.username, 'value']}
+                    placeholder={this.t('login.username_tips')}
+                    autofocus
+                    onKeydown={withKeys(this.handleLogin, ['enter'])}
+                  />
+                </NFormItem>
+                <NFormItem
+                  label={this.t('login.password')}
+                  label-style={{ color: 'black' }}
+                  path='userPassword'
+                >
+                  <NInput
+                    clearable
+                    allowInput={this.trim}
+                    type='password'
+                    v-model={[this.loginForm.password, 'value']}
+                    placeholder={this.t('login.password_tips')}
+                    onKeydown={withKeys(this.handleLogin, ['enter'])}
+                  />
+                </NFormItem>
+              </NForm>
+              <NButton
+                type='info'
+                disabled={!this.loginForm.username || !this.loginForm.password}
+                style={{ width: '100%' }}
+                onClick={this.handleLogin}
+              >
+                {this.t('login.login')}
+              </NButton>
+            </div>
+          </NSpace>
+        </NLayoutContent>
+      </NLayout>
     )
   }
 })
diff --git a/seatunnel-ui/src/views/setting/index.tsx b/seatunnel-ui/src/views/setting/index.tsx
new file mode 100644
index 00000000..fc7e94b1
--- /dev/null
+++ b/seatunnel-ui/src/views/setting/index.tsx
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { defineComponent } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { NSpace, NCard, NSwitch, NList, NListItem, NSelect } from 'naive-ui'
+import { useSettingStore } from '@/store/setting'
+
+const Setting = defineComponent({
+  name: 'Setting',
+  setup() {
+    const { t } = useI18n()
+
+    return {
+      t
+    }
+  },
+  render() {
+    return (
+      <NSpace vertical>
+        <NCard title={this.t('setting.table_setting')}>
+          <NList>
+            <NListItem>
+              <NSpace justify='space-between' align='center'>
+                <span>{this.t('setting.sequence_column')}</span>
+                <NSwitch
+                  value={useSettingStore().getSequenceColumn}
+                  onUpdateValue={(v) => {
+                    useSettingStore().setSequenceColumn(v)
+                  }}
+                />
+              </NSpace>
+            </NListItem>
+            <NListItem>
+              <NSpace justify='space-between' align='center'>
+                <span>{this.t('setting.data_unique_value')}</span>
+                <NSwitch
+                  value={useSettingStore().getDataUniqueValue}
+                  onUpdateValue={(v) => {
+                    useSettingStore().setDataUniqueValue(v)
+                  }}
+                />
+              </NSpace>
+            </NListItem>
+          </NList>
+        </NCard>
+        <NCard title={this.t('setting.language_setting')}>
+          <NList>
+            <NListItem>
+              <NSpace justify='space-between' align='center'>
+                <span>{this.t('setting.language')}</span>
+                <div class='w-56'>
+                  <NSelect
+                    value={'english'}
+                    options={[
+                      { value: 'english', label: this.t('setting.english') }
+                    ]}
+                  />
+                </div>
+              </NSpace>
+            </NListItem>
+          </NList>
+        </NCard>
+        <NCard title={this.t('setting.request_setting')}>
+          <NList>
+            <NListItem>
+              <NSpace justify='space-between' align='center'>
+                <span>{this.t('setting.request_time')}</span>
+                <div class='w-56'>
+                  <NSelect
+                    value={useSettingStore().getRequestTimeValue}
+                    onUpdateValue={(v) => {
+                      useSettingStore().setRequestTimeValue(v)
+                    }}
+                    options={[
+                      { value: 3000, label: '3000ms' },
+                      { value: 6000, label: '6000ms' },
+                      { value: 10000, label: '10000ms' },
+                      { value: 20000, label: '20000ms' },
+                      { value: 30000, label: '30000ms' }
+                    ]}
+                  />
+                </div>
+              </NSpace>
+            </NListItem>
+          </NList>
+        </NCard>
+        <NCard title={this.t('setting.theme_setting')}>
+          <NList>
+            <NListItem>
+              <NSpace justify='space-between' align='center'>
+                <span>{this.t('setting.model')}</span>
+                <div class='w-56'>
+                  <NSelect
+                    value={'light'}
+                    options={[
+                      { value: 'light', label: this.t('setting.light') }
+                    ]}
+                  />
+                </div>
+              </NSpace>
+            </NListItem>
+            <NListItem>
+              <NSpace justify='space-between' align='center'>
+                <span>{this.t('setting.hue')}</span>
+                <div class='w-56'>
+                  <NSelect
+                    value={'purple'}
+                    options={[
+                      { value: 'purple', label: this.t('setting.purple') }
+                    ]}
+                  />
+                </div>
+              </NSpace>
+            </NListItem>
+            <NListItem>
+              <NSpace justify='space-between' align='center'>
+                <span>{this.t('setting.fillet')}</span>
+                <div class='w-56'>
+                  <NSelect
+                    value={useSettingStore().getFilletValue}
+                    onUpdateValue={(v) => {
+                      useSettingStore().setFilletValue(v)
+                    }}
+                    options={[
+                      { value: 5, label: '5px' },
+                      { value: 10, label: '10px' },
+                      { value: 15, label: '15px' },
+                      { value: 20, label: '20px' },
+                      { value: 25, label: '25px' },
+                      { value: 30, label: '30px' }
+                    ]}
+                  />
+                </div>
+              </NSpace>
+            </NListItem>
+          </NList>
+        </NCard>
+      </NSpace>
+    )
+  }
+})
+
+export default Setting
diff --git a/seatunnel-ui/src/views/data-pipes/list/components/publish-modal.tsx b/seatunnel-ui/src/views/tasks/list/components/log-modal.tsx
similarity index 58%
copy from seatunnel-ui/src/views/data-pipes/list/components/publish-modal.tsx
copy to seatunnel-ui/src/views/tasks/list/components/log-modal.tsx
index abfce10c..ea8ca14d 100644
--- a/seatunnel-ui/src/views/data-pipes/list/components/publish-modal.tsx
+++ b/seatunnel-ui/src/views/tasks/list/components/log-modal.tsx
@@ -15,10 +15,13 @@
  * limitations under the License.
  */
 
-import { defineComponent } from 'vue'
+import { defineComponent, onMounted, ref } from 'vue'
 import { useI18n } from 'vue-i18n'
+import { NLog } from 'naive-ui'
+import { taskInstanceLog } from '@/service/task'
 import Modal from '@/components/modal'
-import type { PropType } from 'vue'
+import type { PropType, Ref } from 'vue'
+import type { ResponseBasic } from '@/service/types'
 
 const props = {
   showModal: {
@@ -31,36 +34,46 @@ const props = {
   }
 }
 
-const PublishModal = defineComponent({
+const LogModal = defineComponent({
+  name: 'LogModal',
   props,
-  emits: ['cancelModal', 'confirmModal'],
+  emits: ['confirmModal'],
   setup(props, ctx) {
     const { t } = useI18n()
+    const log: Ref<string> = ref('')
 
-    const handleCancel = () => {
-      ctx.emit('cancelModal', props.showModal)
+    const handleConfirm = () => {
+      ctx.emit('confirmModal')
     }
 
-    const handleConfirm = () => {}
+    onMounted(() => {
+      props.row.instanceId &&
+        taskInstanceLog(props.row.instanceId).then(
+          (res: ResponseBasic<{ instanceId: number; logContent: string }>) => {
+            log.value = res.data.logContent
+          }
+        )
+    })
 
-    return { t, handleCancel, handleConfirm }
+    return {
+      t,
+      log,
+      handleConfirm
+    }
   },
   render() {
     return (
       <Modal
-        title={this.t('data_pipes.publish')}
+        title={this.t('tasks.log')}
         show={this.showModal}
-        onCancel={this.handleCancel}
+        cancelShow={false}
         onConfirm={this.handleConfirm}
+        style={{ width: '80%' }}
       >
-        {{
-          default: () => (
-            <span>{this.t('data_pipes.data_pipes_publish_tips')}</span>
-          )
-        }}
+        <NLog log={this.log} rows={35} />
       </Modal>
     )
   }
 })
 
-export default PublishModal
+export default LogModal
diff --git a/seatunnel-ui/src/views/tasks/list/index.tsx b/seatunnel-ui/src/views/tasks/list/index.tsx
index b18977bc..f581163d 100644
--- a/seatunnel-ui/src/views/tasks/list/index.tsx
+++ b/seatunnel-ui/src/views/tasks/list/index.tsx
@@ -22,24 +22,52 @@ import {
   NDataTable,
   NInput,
   NPagination,
-  NSpace,
-  NSelect
+  NSpace
 } from 'naive-ui'
 import { useI18n } from 'vue-i18n'
 import { useTable } from './use-table'
+import LogModal from '@/views/tasks/list/components/log-modal'
 
 const TasksList = defineComponent({
   setup() {
     const { t } = useI18n()
-    const { state, createColumns } = useTable()
+    const { state, createColumns, getTableData } = useTable()
 
-    const handleSearch = () => {}
+    const requestData = () => {
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo,
+        name: state.name
+      })
+    }
+
+    const handleSearch = () => {
+      state.pageNo = 1
+      requestData()
+    }
+
+    const handlePageSize = () => {
+      state.pageNo = 1
+      requestData()
+    }
+
+    const handleConfirmLogModal = () => {
+      state.showLogModal = false
+    }
 
     onMounted(() => {
       createColumns(state)
+      requestData()
     })
 
-    return { t, handleSearch, ...toRefs(state) }
+    return {
+      t,
+      handleSearch,
+      handlePageSize,
+      requestData,
+      handleConfirmLogModal,
+      ...toRefs(state)
+    }
   },
   render() {
     return (
@@ -49,19 +77,12 @@ const TasksList = defineComponent({
             'header-extra': () => (
               <NSpace>
                 <NInput
-                  placeholder={this.t('tasks.tasks_name')}
-                  style={{ width: '200px' }}
-                />
-                <NSelect
-                  placeholder={this.t('tasks.state')}
+                  clearable
+                  v-model={[this.name, 'value']}
+                  placeholder={this.t('tasks.task_name')}
                   style={{ width: '200px' }}
-                  options={[
-                    { label: this.t('tasks.success'), value: 'success' },
-                    { label: this.t('tasks.fail'), value: 'fail' },
-                    { label: this.t('tasks.running'), value: 'running' }
-                  ]}
                 />
-                <NButton onClick={this.handleSearch}>
+                <NButton onClick={this.handleSearch} type='primary'>
                   {this.t('tasks.search')}
                 </NButton>
               </NSpace>
@@ -77,16 +98,25 @@ const TasksList = defineComponent({
             />
             <NSpace justify='center'>
               <NPagination
-                v-model:page={this.page}
+                v-model:page={this.pageNo}
                 v-model:page-size={this.pageSize}
                 page-count={this.totalPage}
                 show-size-picker
                 page-sizes={[10, 30, 50]}
                 show-quick-jumper
+                onUpdatePage={this.requestData}
+                onUpdatePageSize={this.handlePageSize}
               />
             </NSpace>
           </NSpace>
         </NCard>
+        {this.showLogModal && (
+          <LogModal
+            showModal={this.showLogModal}
+            row={this.row}
+            onConfirmModal={this.handleConfirmLogModal}
+          />
+        )}
       </NSpace>
     )
   }
diff --git a/seatunnel-ui/src/views/tasks/list/use-table.ts b/seatunnel-ui/src/views/tasks/list/use-table.ts
index 0ea56834..020312cf 100644
--- a/seatunnel-ui/src/views/tasks/list/use-table.ts
+++ b/seatunnel-ui/src/views/tasks/list/use-table.ts
@@ -17,100 +17,164 @@
 
 import { useI18n } from 'vue-i18n'
 import { h, reactive, ref } from 'vue'
-import { NButton, NSpace, NTag, NIcon } from 'naive-ui'
-import { UploadOutlined, DownloadOutlined } from '@vicons/antd'
+import { NButton, NSpace, NTag } from 'naive-ui'
+import { taskInstanceList, taskInstanceKill, taskExecute } from '@/service/task'
+import { getTableColumn } from '@/common/table'
+import type { ResponseTable } from '@/service/types'
+import type { JobDetail } from '@/service/task/types'
 
 export function useTable() {
   const { t } = useI18n()
 
   const state = reactive({
     columns: [],
-    tableData: [{ state: 'success' }, { state: 'fail' }, { state: 'running' }],
-    page: ref(1),
+    tableData: [],
+    pageNo: ref(1),
     pageSize: ref(10),
     totalPage: ref(1),
-    loading: ref(false)
+    loading: ref(false),
+    name: ref(''),
+    showLogModal: ref(false),
+    row: ref({})
   })
 
   const createColumns = (state: any) => {
     state.columns = [
+      ...getTableColumn([
+        { key: 'instanceId', title: t('tasks.instance_id') },
+        { key: 'jobId', title: t('tasks.job_id') }
+      ]),
       {
         title: t('tasks.task_name'),
-        key: 'task_name'
+        key: 'instanceName'
       },
       {
         title: t('tasks.state'),
-        key: 'state',
-        render: (row: any) => {
-          if (row.state === 'success') {
-            return h(NTag, { type: 'success' }, t('tasks.success'))
-          } else if (row.state === 'fail') {
-            return h(NTag, { type: 'error' }, t('tasks.fail'))
-          } else if (row.state === 'running') {
-            return h(NTag, { type: 'info' }, t('tasks.running'))
+        key: 'status',
+        render: (row: JobDetail) => {
+          if (row.status === 'SUCCESS') {
+            return h(
+              NTag,
+              { type: 'success' },
+              { default: () => t('tasks.success') }
+            )
+          } else if (row.status === 'FAILED') {
+            return h(
+              NTag,
+              { type: 'error' },
+              { default: () => t('tasks.fail') }
+            )
+          } else if (row.status === 'STOPPED') {
+            return h(
+              NTag,
+              { type: 'warning' },
+              { default: () => t('tasks.stop') }
+            )
+          } else if (row.status === 'RUNNING') {
+            return h(
+              NTag,
+              { type: 'info' },
+              { default: () => t('tasks.running') }
+            )
+          } else {
+            return h(
+              NTag,
+              { type: 'default' },
+              { default: () => t('tasks.unknown') }
+            )
           }
         }
       },
       {
         title: t('tasks.run_frequency'),
-        key: 'run_frequency'
+        key: 'runFrequency'
       },
       {
-        title: t('tasks.next_run'),
-        key: 'next_run'
+        title: t('tasks.start_time'),
+        key: 'startTime'
       },
       {
-        title: t('tasks.last_run'),
-        key: 'last_run'
-      },
-      {
-        title: t('tasks.last_total_bytes'),
-        key: 'last_total_bytes',
-        render: (row: any) =>
-          h(NSpace, {}, [
-            h(
-              NTag,
-              { type: 'success' },
-              { icon: h(NIcon, {}, h(UploadOutlined)), default: 12 + ' (KB)' }
-            ),
-            h(
-              NTag,
-              { type: 'error' },
-              { icon: h(NIcon, {}, h(DownloadOutlined)), default: 16 + ' (KB)' }
-            )
-          ])
-      },
-      {
-        title: t('tasks.last_total_records'),
-        key: 'last_total_records',
-        render: (row: any) =>
-          h(NSpace, {}, [
-            h(
-              NTag,
-              { type: 'success' },
-              { icon: h(NIcon, {}, h(UploadOutlined)), default: 66 }
-            ),
-            h(
-              NTag,
-              { type: 'error' },
-              { icon: h(NIcon, {}, h(DownloadOutlined)), default: 77 }
-            )
-          ])
+        title: t('tasks.end_time'),
+        key: 'endTime'
       },
       {
         title: t('tasks.operation'),
         key: 'operation',
-        render: (row: any) =>
+        render: (row: JobDetail) =>
           h(NSpace, null, {
             default: () => [
-              h(NButton, { text: true }, t('tasks.rerun')),
-              h(NButton, { text: true }, t('tasks.kill')),
-              h(NButton, { text: true }, t('tasks.view_log'))
+              h(
+                NButton,
+                {
+                  text: true,
+                  disabled: row.status === 'RUNNING',
+                  onClick: () => handleRerun(row)
+                },
+                { default: () => t('tasks.rerun') }
+              ),
+              h(
+                NButton,
+                {
+                  text: true,
+                  disabled: row.status !== 'RUNNING',
+                  onClick: () => handleKill(row)
+                },
+                { default: () => t('tasks.kill') }
+              ),
+              h(
+                NButton,
+                { text: true, onClick: () => handleViewLog(row) },
+                { default: () => t('tasks.view_log') }
+              )
             ]
           })
       }
     ]
   }
 
-  return { state, createColumns }
+  const getTableData = (params: any) => {
+    if (state.loading) return
+    state.loading = true
+    taskInstanceList({
+      pageNo: params.pageNo,
+      pageSize: params.pageSize,
+      name: params.name
+    }).then((res: ResponseTable<Array<JobDetail> | []>) => {
+      state.tableData = res.data.data as any
+      state.totalPage = res.data.totalPage
+      state.loading = false
+    })
+  }
+
+  const handleKill = (row: JobDetail) => {
+    taskInstanceKill(row.instanceId as number).then(() => {
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo
+      })
+    })
+  }
+
+  const handleViewLog = (row: JobDetail) => {
+    state.showLogModal = true
+    state.row = row
+  }
+
+  const handleRerun = (row: JobDetail) => {
+    taskExecute(row.instanceId as number, {
+      objectType: 2,
+      executeType: 3
+    }).then(() => {
+      getTableData({
+        pageSize: state.pageSize,
+        pageNo: state.pageNo
+      })
+    })
+  }
+
+  return {
+    state,
+    createColumns,
+    getTableData
+  }
 }
diff --git a/seatunnel-ui/src/views/user-manage/list/index.tsx b/seatunnel-ui/src/views/user-manage/list/index.tsx
index 4de902f7..11a7d9fa 100644
--- a/seatunnel-ui/src/views/user-manage/list/index.tsx
+++ b/seatunnel-ui/src/views/user-manage/list/index.tsx
@@ -82,7 +82,7 @@ const UserManageList = defineComponent({
         <NCard title={this.t('user_manage.user_manage')}>
           {{
             'header-extra': () => (
-              <NButton onClick={this.handleFormModal}>
+              <NButton onClick={this.handleFormModal} type='primary'>
                 {this.t('user_manage.create')}
               </NButton>
             )
diff --git a/seatunnel-ui/src/views/user-manage/list/use-table.ts b/seatunnel-ui/src/views/user-manage/list/use-table.ts
index f21e0a4d..bff9f974 100644
--- a/seatunnel-ui/src/views/user-manage/list/use-table.ts
+++ b/seatunnel-ui/src/views/user-manage/list/use-table.ts
@@ -16,10 +16,10 @@
  */
 
 import { reactive, ref, h } from 'vue'
-import { useAsyncState } from '@vueuse/core'
 import { useI18n } from 'vue-i18n'
 import { NSpace, NButton } from 'naive-ui'
 import { userList, userDelete, userEnable, userDisable } from '@/service/user'
+import { getTableColumn } from '@/common/table'
 import type { ResponseTable } from '@/service/types'
 import type { UserDetail } from '@/service/user/types'
 
@@ -27,7 +27,7 @@ export function useTable() {
   const { t } = useI18n()
   const state = reactive({
     columns: [],
-    tableData: [{ username: '' }],
+    tableData: [],
     pageNo: ref(1),
     pageSize: ref(10),
     totalPage: ref(1),
@@ -40,6 +40,7 @@ export function useTable() {
 
   const createColumns = (state: any) => {
     state.columns = [
+      ...getTableColumn([{ key: 'id', title: t('user_manage.id') }]),
       {
         title: t('user_manage.username'),
         key: 'name'
@@ -61,19 +62,22 @@ export function useTable() {
               h(
                 NButton,
                 { text: true, onClick: () => handleStatus(row) },
-                row.status === 1
-                  ? t('user_manage.enable')
-                  : t('user_manage.disable')
+                {
+                  default: () =>
+                    row.status === 1
+                      ? t('user_manage.enable')
+                      : t('user_manage.disable')
+                }
               ),
               h(
                 NButton,
                 { text: true, onClick: () => handleEdit(row) },
-                t('user_manage.edit')
+                { default: () => t('user_manage.edit') }
               ),
               h(
                 NButton,
                 { text: true, onClick: () => handleDelete(row) },
-                t('user_manage.delete')
+                { default: () => t('user_manage.delete') }
               )
             ]
           })
@@ -119,15 +123,12 @@ export function useTable() {
   const getTableData = (params: any) => {
     if (state.loading) return
     state.loading = true
-    useAsyncState(
-      userList({ ...params }).then(
-        (res: ResponseTable<Array<UserDetail> | []>) => {
-          state.tableData = res.data.data
-          state.totalPage = res.data.totalPage
-          state.loading = false
-        }
-      ),
-      {}
+    userList({ ...params }).then(
+      (res: ResponseTable<Array<UserDetail> | []>) => {
+        state.tableData = res.data.data as any
+        state.totalPage = res.data.totalPage
+        state.loading = false
+      }
     )
   }
 
diff --git a/seatunnel-ui/vite.config.ts b/seatunnel-ui/vite.config.ts
index 48538c9c..237ef0aa 100644
--- a/seatunnel-ui/vite.config.ts
+++ b/seatunnel-ui/vite.config.ts
@@ -36,7 +36,8 @@ export default defineConfig({
   ],
   resolve: {
     alias: {
-      '@': path.resolve(__dirname, 'src')
+      '@': path.resolve(__dirname, 'src'),
+      'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js'
     }
   },
   server: {
@@ -47,4 +48,4 @@ export default defineConfig({
       }
     }
   }
-})
\ No newline at end of file
+})
diff --git a/seatunnel-server/seatunnel-spi/pom.xml b/seatunnel-web-dist/pom.xml
similarity index 50%
copy from seatunnel-server/seatunnel-spi/pom.xml
copy to seatunnel-web-dist/pom.xml
index 318c16c6..6917980a 100644
--- a/seatunnel-server/seatunnel-spi/pom.xml
+++ b/seatunnel-web-dist/pom.xml
@@ -1,36 +1,62 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
+
     Licensed to the Apache Software Foundation (ASF) under one or more
     contributor license agreements.  See the NOTICE file distributed with
     this work for additional information regarding copyright ownership.
     The ASF licenses this file to You under the Apache License, Version 2.0
     (the "License"); you may not use this file except in compliance with
     the License.  You may obtain a copy of the License at
+
        http://www.apache.org/licenses/LICENSE-2.0
+
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
+
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>seatunnel-server</artifactId>
         <groupId>org.apache.seatunnel</groupId>
+        <artifactId>seatunnel-web</artifactId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>seatunnel-spi</artifactId>
+    <properties>
+        <!-- disable mvn deploy to central maven repo by default -->
+        <maven.deploy.skip>true</maven.deploy.skip>
+    </properties>
+
+    <artifactId>seatunnel-dist</artifactId>
+    <packaging>pom</packaging>
 
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.seatunnel</groupId>
-            <artifactId>seatunnel-server-common</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>src</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/assembly/assembly-src.xml</descriptor>
+                            </descriptors>
+                            <appendAssemblyId>true</appendAssemblyId>
+                        </configuration>
+                    </execution>
 
-</project>
\ No newline at end of file
+                </executions>
+            </plugin>
+        </plugins>
+        <finalName>apache-seatunnel-web-incubating-${project.version}</finalName>
+    </build>
+</project>
diff --git a/seatunnel-web-dist/release-docs/binary/LICENSE b/seatunnel-web-dist/release-docs/binary/LICENSE
new file mode 100644
index 00000000..ece66a18
--- /dev/null
+++ b/seatunnel-web-dist/release-docs/binary/LICENSE
@@ -0,0 +1,334 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+=======================================================================
+Apache SeaTunnel (Incubating) Subcomponents:
+
+The Apache SeaTunnel(Incubating) project contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for the these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+
+
+========================================================================
+Apache 2.0 License
+========================================================================
+
+The following components are provided under the Apache License. See project link for details.
+The text of each license is the standard Apache 2.0 license.
+
+     (The Apache Software License, Version 2.0) HikariCP (com.zaxxer:HikariCP:4.0.3 - https://github.com/brettwooldridge/HikariCP)
+     (The Apache Software License, Version 2.0) ClassMate (com.fasterxml:classmate:1.3.1 - http://github.com/cowtowncoder/java-classmate)
+     (Apache License, Version 2.0) Apache Commons Codec (commons-codec:commons-codec:1.13 - https://commons.apache.org/proper/commons-codec/)
+     (Apache License, Version 2.0) Apache Commons Collections (org.apache.commons:commons-collections4:4.4 - https://commons.apache.org/proper/commons-collections/)
+     (Apache License, Version 2.0) Apache Commons Lang (org.apache.commons:commons-lang3:3.4 - http://commons.apache.org/proper/commons-lang/)
+     (Apache License, Version 2.0) config (com.typesafe:config:1.3.3 - https://github.com/lightbend/config)
+     (The Apache Software License, Version 2.0) Guava: Google Core Libraries for Java (com.google.guava:guava:19.0 - https://github.com/google/guava/guava)
+     (Apache License 2.0) Hibernate Validator Engine (org.hibernate.validator:hibernate-validator:6.2.2.Final - http://hibernate.org/validator/hibernate-validator)
+     (The Apache Software License, Version 2.0) Jackson-annotations (com.fasterxml.jackson.core:jackson-annotations:2.12.7 - http://github.com/FasterXML/jackson)
+     (The Apache Software License, Version 2.0) Jackson-core (com.fasterxml.jackson.core:jackson-core:2.12.7 - https://github.com/FasterXML/jackson-core)
+     (The Apache Software License, Version 2.0) jackson-databind (com.fasterxml.jackson.core:jackson-databind:2.12.7.1 - http://github.com/FasterXML/jackson)
+     (The Apache Software License, Version 2.0) Jackson datatype: jdk8 (com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.3 - https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+     (The Apache Software License, Version 2.0) Jackson datatype: JSR310 (com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3 - https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+     (The Apache Software License, Version 2.0) Jackson-module-parameter-names (com.fasterxml.jackson.module:jackson-module-parameter-names:2.13.3 - https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names)
+     (Apache License 2.0) Jakarta Bean Validation API (jakarta.validation:jakarta.validation-api:2.0.2 - https://beanvalidation.org)
+     (Apache License, version 2.0) JBoss Logging 3 (org.jboss.logging:jboss-logging:3.4.1.Final - http://www.jboss.org)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: Continuation (org.eclipse.jetty:jetty-continuation:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-continuation)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-http)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-io)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-security)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-server)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-servlet)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: Utility Servlets and Filters (org.eclipse.jetty:jetty-servlets:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-servlets)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-util)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: Utilities :: Ajax(JSON) (org.eclipse.jetty:jetty-util-ajax:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-util-ajax)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-webapp)
+     (Apache Software License - Version 2.0) (Eclipse Public License - Version 1.0) Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.46.v20220331 - https://eclipse.org/jetty/jetty-xml)
+     (Apache License, Version 2.0) JJWT :: API (io.jsonwebtoken:jjwt-api:0.10.7 - https://github.com/jwtk/jjwt/jjwt-api)
+     (Apache License, Version 2.0) JJWT :: Impl (io.jsonwebtoken:jjwt-impl:0.10.7 - https://github.com/jwtk/jjwt/jjwt-impl)
+     (Apache License, Version 2.0) JJWT :: Extensions :: Jackson (io.jsonwebtoken:jjwt-jackson:0.10.7 - https://github.com/jwtk/jjwt/jjwt-jackson)
+     (The Apache Software License, Version 2.0) Apache Log4j (log4j:log4j:1.2.17 - http://logging.apache.org/log4j/1.2/)
+     (The Apache Software License, Version 2.0) MapStruct Core (org.mapstruct:mapstruct:1.0.0.Final - http://mapstruct.org/mapstruct/)
+     (The Apache Software License, Version 2.0) mybatis (org.mybatis:mybatis:3.5.10 - http://www.mybatis.org/mybatis-3)
+     (The Apache Software License, Version 2.0) mybatis-spring (org.mybatis:mybatis-spring:2.0.7 - http://www.mybatis.org/spring/)
+     (The Apache Software License, Version 2.0) mybatis-plus (com.baomidou:mybatis-plus:3.5.3.1 - https://github.com/baomidou/mybatis-plus/)
+     (The Apache Software License, Version 2.0) mybatis-plus-annotation (com.baomidou:mybatis-plus-annotation:3.5.3.1 - https://github.com/baomidou/mybatis-plus/)
+     (The Apache Software License, Version 2.0) mybatis-plus-boot-starter (com.baomidou:mybatis-plus-boot-starter:3.5.3.1 - https://github.com/baomidou/mybatis-plus/)
+     (The Apache Software License, Version 2.0) mybatis-plus-core (com.baomidou:mybatis-plus-core:3.5.3.1 - https://github.com/baomidou/mybatis-plus/)
+     (The Apache Software License, Version 2.0) mybatis-plus-extension (com.baomidou:mybatis-plus-extension:3.5.3.1 - https://github.com/baomidou/mybatis-plus/)
+     (The Apache Software License, Version 2.0 And GNU Library or Lesser General Public License (LGPL) V2.1) jsqlparser (com.github.jsqlparser:jsqlparser:4.4 - https://github.com/JSQLParser/JSqlParser/)
+     (Apache License, Version 2.0) SnakeYAML (org.yaml:snakeyaml:1.29 - http://www.snakeyaml.org)
+     (Apache License, Version 2.0) Spring AOP (org.springframework:spring-aop:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (Apache License, Version 2.0) Spring Beans (org.springframework:spring-beans:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (Apache License, Version 2.0) spring-boot (org.springframework.boot:spring-boot:2.6.8 - https://spring.io/projects/spring-boot)
+     (Apache License, Version 2.0) spring-boot-autoconfigure (org.springframework.boot:spring-boot-autoconfigure:2.6.8 - https://spring.io/projects/spring-boot)
+     (Apache License, Version 2.0) spring-boot-starter (org.springframework.boot:spring-boot-starter:2.6.8 - https://spring.io/projects/spring-boot)
+     (Apache License, Version 2.0) spring-boot-starter-aop (org.springframework.boot:spring-boot-starter-aop:2.6.8 - https://spring.io/projects/spring-boot)
+     (Apache License, Version 2.0) spring-boot-starter-jdbc (org.springframework.boot:spring-boot-starter-jdbc:2.6.8 - https://spring.io/projects/spring-boot)
+     (Apache License, Version 2.0) spring-boot-starter-jetty (org.springframework.boot:spring-boot-starter-jetty:2.6.8 - https://spring.io/projects/spring-boot)
+     (Apache License, Version 2.0) spring-boot-starter-json (org.springframework.boot:spring-boot-starter-json:2.6.8 - https://spring.io/projects/spring-boot)
+     (Apache License, Version 2.0) spring-boot-starter-logging (org.springframework.boot:spring-boot-starter-logging:2.6.8 - https://spring.io/projects/spring-boot)
+     (Apache License, Version 2.0) spring-boot-starter-web (org.springframework.boot:spring-boot-starter-web:2.6.8 - https://spring.io/projects/spring-boot)
+     (Apache License, Version 2.0) Spring Context (org.springframework:spring-context:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (Apache License, Version 2.0) Spring Core (org.springframework:spring-core:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (Apache License, Version 2.0) Spring Expression Language (SpEL) (org.springframework:spring-expression:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (Apache License, Version 2.0) Spring Commons Logging Bridge (org.springframework:spring-jcl:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (Apache License, Version 2.0) Spring JDBC (org.springframework:spring-jdbc:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (Apache License, Version 2.0) Spring Plugin - Core (org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE - https://github.com/spring-projects/spring-plugin/spring-plugin-core)
+     (Apache License, Version 2.0) Spring Plugin - Metadata Extension (org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE - https://github.com/spring-projects/spring-plugin/spring-plugin-metadata)
+     (Apache License, Version 2.0) Spring Transaction (org.springframework:spring-tx:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (Apache License, Version 2.0) Spring Web (org.springframework:spring-web:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (Apache License, Version 2.0) Spring Web MVC (org.springframework:spring-webmvc:5.3.20 - https://github.com/spring-projects/spring-framework)
+     (The Apache Software License, Version 2.0) springfox-core (io.springfox:springfox-core:2.6.1 - https://github.com/springfox/springfox)
+     (The Apache Software License, Version 2.0) springfox-schema (io.springfox:springfox-schema:2.6.1 - https://github.com/springfox/springfox)
+     (The Apache Software License, Version 2.0) springfox-spi (io.springfox:springfox-spi:2.6.1 - https://github.com/springfox/springfox)
+     (The Apache Software License, Version 2.0) springfox-spring-web (io.springfox:springfox-spring-web:2.6.1 - https://github.com/springfox/springfox)
+     (The Apache Software License, Version 2.0) springfox-swagger-common (io.springfox:springfox-swagger-common:2.6.1 - https://github.com/springfox/springfox)
+     (The Apache Software License, Version 2.0) springfox-swagger-ui (io.springfox:springfox-swagger-ui:2.6.1 - https://github.com/springfox/springfox)
+     (The Apache Software License, Version 2.0) springfox-swagger2 (io.springfox:springfox-swagger2:2.6.1 - https://github.com/springfox/springfox)
+     (Apache License 2.0) swagger-annotations (io.swagger:swagger-annotations:1.5.10 - https://github.com/swagger-api/swagger-core/modules/swagger-annotations)
+     (Apache License 2.0) swagger-models (io.swagger:swagger-models:1.5.10 - https://github.com/swagger-api/swagger-core/modules/swagger-models)
+     (Apache License, Version 2.0) tomcat-embed-el (org.apache.tomcat.embed:tomcat-embed-el:9.0.63 - https://tomcat.apache.org/)
+     (Apache License, Version 2.0) scala-liberary (org.scala-lang:scala-library:jar:2.11.12 - https://www.scala-lang.org/) 
+         
+
+========================================================================
+Eclipse Public License
+========================================================================
+
+The following components are provided under the Eclipse Public License. See project link for details.
+The text of each license is also included at licenses/LICENSE-[project].txt.
+
+     (EPL 2.0) AspectJ Weaver (org.aspectj:aspectjweaver:1.9.7 - https://www.eclipse.org/aspectj/)
+     (EPL 2.0) Jakarta Annotations API (jakarta.annotation:jakarta.annotation-api:1.3.5 - https://projects.eclipse.org/projects/ee4j.ca)
+     (EPL 2.0) Jakarta Servlet (jakarta.servlet:jakarta.servlet-api:4.0.4 - https://projects.eclipse.org/projects/ee4j.servlet)
+     (EPL 2.0) Jakarta WebSocket - Server API (jakarta.websocket:jakarta.websocket-api:1.1.2 - https://projects.eclipse.org/projects/ee4j.websocket)
+     (EPL 1.0) Logback Classic Module (ch.qos.logback:logback-classic:1.2.11 - http://logback.qos.ch/logback-classic)
+     (EPL 1.0) Logback Core Module (ch.qos.logback:logback-core:1.2.11 - http://logback.qos.ch/logback-core)
+     (EPL 1.0) h2 (com.h2database:h2:2.1.214 - https://h2database.com/)
+
+
+========================================================================
+CDDL License
+========================================================================
+
+The following components are provided under the CDDL License. See project link for details.
+The text of each license is also included at licenses/LICENSE-[project].txt.
+
+     
+     (CDDL) javax.annotation API (javax.annotation:javax.annotation-api:1.3.2 - http://jcp.org/en/jsr/detail?id=250)
+     
+========================================================================
+MIT License
+========================================================================
+
+The following components are provided under the MIT License. See project link for details.
+The text of each license is also included at licenses/LICENSE-[project].txt.
+
+     (MIT License) SLF4J API Module (org.slf4j:slf4j-api:1.7.25 - http://www.slf4j.org)
+     (MIT License) SLF4J LOG4J-12 Binding (org.slf4j:slf4j-log4j12:1.7.25 - http://www.slf4j.org)
+     (The MIT License) jsoup Java HTML Parser (org.jsoup:jsoup:1.14.3 - https://jsoup.org/)
+     (MIT License) JUL to SLF4J bridge (org.slf4j:jul-to-slf4j:1.7.36 - http://www.slf4j.org)     
+
+     
+     
\ No newline at end of file
diff --git a/seatunnel-web-dist/release-docs/binary/NOTICE b/seatunnel-web-dist/release-docs/binary/NOTICE
new file mode 100644
index 00000000..d4d6862e
--- /dev/null
+++ b/seatunnel-web-dist/release-docs/binary/NOTICE
@@ -0,0 +1,458 @@
+Apache SeaTunnel (incubating)
+Copyright 2021-2022 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+
+===============================================================================
+
+Apache Commons Codec NOTICE
+
+===============================================================================
+Apache Commons Codec
+Copyright 2002-2019 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (https://www.apache.org/).
+
+src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
+contains test data from http://aspell.net/test/orig/batch0.tab.
+Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)
+
+===============================================================================
+
+The content of package org.apache.commons.codec.language.bm has been translated
+from the original php source code available at http://stevemorse.org/phoneticinfo.htm
+with permission from the original authors.
+Original source copyright:
+Copyright (c) 2008 Alexander Beider & Stephen P. Morse.
+
+===============================================================================
+
+Apache Commons Collections NOTICE
+
+===============================================================================
... 2383 lines suppressed ...