diff --git a/.trae/specs/implement-wujie-microfrontend-demo/checklist.md b/.trae/specs/implement-wujie-microfrontend-demo/checklist.md
new file mode 100644
index 0000000..f1c28ed
--- /dev/null
+++ b/.trae/specs/implement-wujie-microfrontend-demo/checklist.md
@@ -0,0 +1,6 @@
+- [x] Host 已集成 Wujie,且可挂载名为 `process` 的子应用
+- [x] 子应用 `frontend-process` 可独立启动并访问 `/process/antd-demo`
+- [x] Host 访问 `/process/antd-demo` 时能显示子应用 Demo 内容
+- [x] Host 开发代理 `/process/**` 已配置并可正常加载子应用资源
+- [x] Demo 页面可从 Host 菜单访问(至少静态路由可见)
+- [x] 本次变更未引入任何敏感信息(密码、私钥、token)到仓库
diff --git a/.trae/specs/implement-wujie-microfrontend-demo/spec.md b/.trae/specs/implement-wujie-microfrontend-demo/spec.md
new file mode 100644
index 0000000..bc5c5c9
--- /dev/null
+++ b/.trae/specs/implement-wujie-microfrontend-demo/spec.md
@@ -0,0 +1,60 @@
+# Wujie 微前端双栈并存接入 Spec
+
+## Why
+现有系统前端(Element Plus)已稳定具备登录、菜单与权限管理能力,但后续业务模块计划采用 Ant Design Vue。需要通过微前端方式实现双栈并存,避免一次性迁移带来的回归风险,并支持业务模块按菜单集成展示。
+
+## What Changes
+- 明确采用 Wujie 作为微前端方案(Host=Element Plus,SubApp=Ant Design Vue)。
+- 新增 `frontend-process` 子应用:提供 `AntD Demo` 页面与 `manifest.json`(路由、权限码、入口信息)。
+- 在 `front-system`(当前仓库 `frontend`)集成 Wujie:新增一个 Host 页面(`/process/antd-demo`)用于挂载子应用。
+- Host 开发代理:本地将 `/process/**` 代理到子应用 dev server,实现“同域路径”联调。
+- **BREAKING**:无(仅新增能力与页面)。
+
+## Impact
+- Affected specs:
+ - 微前端集成(Host + SubApp)
+ - 路由与菜单展示
+ - 本地联调与部署路径约定(同域 `/process/`)
+- Affected code:
+ - Host:`frontend/src/main.ts`、`frontend/src/router/index.ts`、`frontend/vite.config.ts`、新增 `frontend/src/views/process/antd-demo.vue`
+ - SubApp:新增 `frontend-process/**`
+ - 文档基线:`系统前端框架及集成方案.md`(不在本变更中修改其内容,仅作为实现依据)
+
+## ADDED Requirements
+
+### Requirement: Wujie Host 集成
+系统 SHALL 在 Host(front-system)中集成 Wujie,并提供可通过路由访问的挂载页面,用于展示 `front-process` 子应用内容。
+
+#### Scenario: 打开 AntD Demo(开发态)
+- **GIVEN** Host 与 SubApp 均在本地启动
+- **WHEN** 用户在 Host 中访问 `/process/antd-demo`
+- **THEN** Host 页面中出现 Wujie 容器并成功加载子应用入口 `/process/`
+- **AND** 子应用展示 Ant Design Vue 组件示例(按钮、表格等)
+
+### Requirement: 子应用 Demo 页面
+系统 SHALL 提供 `frontend-process` 子应用,并包含一个可访问的 Demo 页面(`/process/antd-demo`)用于验证 Ant Design Vue 在微前端容器中正常渲染。
+
+#### Scenario: 子应用独立运行(开发态)
+- **WHEN** 直接访问 `http://localhost:5174/process/antd-demo`(或等价本地地址)
+- **THEN** 能看到 “Ant Design Vue Demo(front-process)” 标题与示例组件
+
+### Requirement: 本地同域联调代理
+系统 SHALL 在 Host Vite dev server 中提供 `/process/**` 的代理转发到子应用 dev server,以实现同域路径加载。
+
+#### Scenario: Host 以同域路径加载子应用
+- **WHEN** Host 页面请求 `/process/` 及其静态资源
+- **THEN** 请求被代理到子应用 dev server(端口 5174)
+
+### Requirement: 菜单可集成展示(Demo 级别)
+系统 SHALL 使 Demo 页面可在 Host 菜单体系中被访问(可先以静态路由方式呈现,后续再与后端动态菜单配置联动)。
+
+#### Scenario: 菜单访问
+- **WHEN** 用户在 Host 菜单点击“AntD Demo”
+- **THEN** 跳转到 `/process/antd-demo` 并展示子应用内容
+
+## MODIFIED Requirements
+无。
+
+## REMOVED Requirements
+无。
+
diff --git a/.trae/specs/implement-wujie-microfrontend-demo/tasks.md b/.trae/specs/implement-wujie-microfrontend-demo/tasks.md
new file mode 100644
index 0000000..a403c06
--- /dev/null
+++ b/.trae/specs/implement-wujie-microfrontend-demo/tasks.md
@@ -0,0 +1,26 @@
+# Tasks
+- [x] Task 1: 对齐方案与现状代码
+ - [x] 核对 Host 与 SubApp 的目录结构、路由前缀 `/process/`、端口约定(5173/5174)
+ - [x] 核对 `系统前端框架及集成方案.md` 与实现差异并记录需要补齐项
+
+- [x] Task 2: 完成 frontend-process 子应用 Demo
+ - [x] 初始化 `frontend-process`(Vite + Vue3)
+ - [x] 引入 Ant Design Vue 并提供 `/process/antd-demo` Demo 页面
+ - [x] 添加 `public/manifest.json`,声明 `entry/routeBase/routes`
+
+- [x] Task 3: 在 Host(frontend)集成 Wujie 并提供挂载页
+ - [x] 安装并注册 `wujie` / `wujie-vue3`
+ - [x] 新增 Host 页面 `/process/antd-demo`:使用 Wujie 挂载子应用入口
+ - [x] 为 Host 路由与菜单增加 Demo 入口(最小可用:静态路由显示在侧边栏)
+
+- [x] Task 4: 开发态同域代理与联调验证
+ - [x] Host Vite dev server 增加 `/process/**` → `http://localhost:5174` 代理
+ - [x] 启动 Host 与 SubApp 并验证 Demo 页面渲染、按钮可交互
+
+- [x] Task 5: 最小化回归与文档补齐
+ - [x] 记录“运行方式/端口/访问路径”的操作说明
+ - [x] 确认不引入敏感信息与硬编码密钥
+
+# Task Dependencies
+- Task 3 depends on Task 2
+- Task 4 depends on Task 2 and Task 3
diff --git a/.vscode/launch.json b/.vscode/launch.json
index caa3cd9..1cc9739 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -16,6 +16,12 @@
"${workspaceFolder}/backend/target/classes",
"${workspaceFolder}/backend/target/dependency/*"
],
+ "env": {
+ "DB_MASTER_PASSWORD": "Dm123456",
+ "DB_SLAVE_PASSWORD": "Dm123456",
+ "JASYPT_PASSWORD": "salt",
+ "RSA_PRIVATE_KEY": "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A=="
+ },
"args": [
"--spring.profiles.active=dev"
],
diff --git a/backend/db-init/scripts/export.ps1 b/backend/db-init/scripts/export.ps1
index 4fae615..5141086 100644
--- a/backend/db-init/scripts/export.ps1
+++ b/backend/db-init/scripts/export.ps1
@@ -3,7 +3,7 @@ param(
[int]$DB_PORT = 3306,
[string]$DB_NAME = 'frameworkdb2023',
[string]$DB_USER = 'root',
- [string]$DB_PASSWORD = 'ylfw20230626@'
+ [string]$DB_PASSWORD = $env:DB_PASSWORD
)
# 确保输出目录存在
@@ -97,4 +97,4 @@ if (Test-Path $schemaFile) {
if (Test-Path $dataFile) {
$dataSize = (Get-Item $dataFile).Length
Write-Host "数据文件大小: $([math]::Round($dataSize/1KB, 2)) KB"
-}
\ No newline at end of file
+}
diff --git a/backend/db-init/scripts/imp_exp_20260325172625.dmp b/backend/db-init/scripts/imp_exp_20260325172625.dmp
new file mode 100644
index 0000000..1bc4221
Binary files /dev/null and b/backend/db-init/scripts/imp_exp_20260325172625.dmp differ
diff --git a/backend/db-init/scripts/import.ps1 b/backend/db-init/scripts/import.ps1
index 131efcd..5d9280e 100644
--- a/backend/db-init/scripts/import.ps1
+++ b/backend/db-init/scripts/import.ps1
@@ -3,7 +3,7 @@ param(
[int]$DB_PORT = 3306,
[string]$DB_NAME = 'frameworkdb2025',
[string]$DB_USER = 'root',
- [string]$DB_PASSWORD = 'ylfw20230626@'
+ [string]$DB_PASSWORD = $env:DB_PASSWORD
)
$ErrorActionPreference = 'Stop'
@@ -43,4 +43,4 @@ function Invoke-MySqlFile([string]$filePath) {
Invoke-MySqlFile $schemaPath
Invoke-MySqlFile $dataPath
-Write-Host 'Import completed'
\ No newline at end of file
+Write-Host 'Import completed'
diff --git a/backend/docs/数据库初始方案.md b/backend/docs/数据库初始方案.md
index 4720576..dca6785 100644
--- a/backend/docs/数据库初始方案.md
+++ b/backend/docs/数据库初始方案.md
@@ -77,7 +77,7 @@ param(
[int]$DB_PORT = 3306,
[string]$DB_NAME = "frameworkdb2025",
[string]$DB_USER = "root",
- [string]$DB_PASSWORD = "ylfw20230626@"
+ [string]$DB_PASSWORD = $env:DB_PASSWORD
)
$env:MYSQL_PWD = $DB_PASSWORD
@@ -97,7 +97,7 @@ param(
[int]$DB_PORT = 3306,
[string]$DB_NAME = "platform",
[string]$DB_USER = "root",
- [string]$DB_PASSWORD = "root"
+ [string]$DB_PASSWORD = $env:DB_PASSWORD
)
$env:MYSQL_PWD = $DB_PASSWORD
@@ -131,4 +131,4 @@ Write-Host "Import completed"
- 我可以为你:
- 搭建 `framework/db-init` 目录与示例脚本、README。
- 在后端新增 `DataInitializer` 组件与配置项,支持 `dev/server` 下自动初始化。
- - 可选集成 `Flyway`,将初始化脚本迁移为 `V1__base.sql` 并接入 CI。
\ No newline at end of file
+ - 可选集成 `Flyway`,将初始化脚本迁移为 `V1__base.sql` 并接入 CI。
diff --git a/backend/pom.xml b/backend/pom.xml
index cbe7af1..b0f45a3 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -157,6 +157,14 @@
runtime
+
+
+ com.dameng
+ DmJdbcDriver18
+ 8.1.2.79
+ runtime
+
+
org.xerial
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/Dictionary.java b/backend/src/main/java/com/yfd/platform/system/domain/Dictionary.java
index df234e3..9abb146 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/Dictionary.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/Dictionary.java
@@ -18,7 +18,7 @@ import java.io.Serializable;
*/
@Data
@EqualsAndHashCode(callSuper = false)
-@TableName("rca_dictionary")
+@TableName("RCA_DICTIONARY")
public class Dictionary implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/Message.java b/backend/src/main/java/com/yfd/platform/system/domain/Message.java
index 54578e5..759819e 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/Message.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/Message.java
@@ -23,7 +23,7 @@ import lombok.EqualsAndHashCode;
*/
@Data
@EqualsAndHashCode(callSuper = false)
-@TableName("sys_message")
+@TableName("SYS_MESSAGE")
public class Message implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/QuartzJob.java b/backend/src/main/java/com/yfd/platform/system/domain/QuartzJob.java
index e3504ce..d513514 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/QuartzJob.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/QuartzJob.java
@@ -23,7 +23,7 @@ import lombok.EqualsAndHashCode;
*/
@Data
@EqualsAndHashCode(callSuper = false)
-@TableName("sys_quartz_job")
+@TableName("SYS_QUARTZ_JOB")
public class QuartzJob implements Serializable {
public static final String JOB_KEY = "JOB_KEY";
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysConfig.java b/backend/src/main/java/com/yfd/platform/system/domain/SysConfig.java
index 3bef030..3830d97 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/SysConfig.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/SysConfig.java
@@ -17,7 +17,7 @@ import java.sql.Timestamp;
*/
@Data
@EqualsAndHashCode(callSuper = false)
-@TableName("sys_config")
+@TableName("SYS_CONFIG")
public class SysConfig implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysDictionary.java b/backend/src/main/java/com/yfd/platform/system/domain/SysDictionary.java
index ca1fb9c..e57a13e 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/SysDictionary.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/SysDictionary.java
@@ -3,6 +3,7 @@ package com.yfd.platform.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -18,6 +19,7 @@ import java.io.Serializable;
*/
@Data
@EqualsAndHashCode(callSuper = false)
+@TableName("SYS_DICTIONARY")
public class SysDictionary implements Serializable {
private static final long serialVersionUID = 1L;
@@ -31,25 +33,25 @@ public class SysDictionary implements Serializable {
/**
* 字典类型 00-系统内置 01-用户配置
*/
- @TableField("dicttype")
+ @TableField("DICTTYPE")
private String dictType;
/**
* 顺序号
*/
- @TableField("orderno")
+ @TableField("ORDERNO")
private Integer orderNo;
/**
* 字典编码
*/
- @TableField("dictcode")
+ @TableField("DICTCODE")
private String dictCode;
/**
* 字典名称
*/
- @TableField("dictname")
+ @TableField("DICTNAME")
private String dictName;
/**
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysDictionaryItems.java b/backend/src/main/java/com/yfd/platform/system/domain/SysDictionaryItems.java
index 431bfda..59a7c56 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/SysDictionaryItems.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/SysDictionaryItems.java
@@ -3,6 +3,7 @@ package com.yfd.platform.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -18,6 +19,7 @@ import java.io.Serializable;
*/
@Data
@EqualsAndHashCode(callSuper = false)
+@TableName("SYS_DICTIONARY_ITEMS")
public class SysDictionaryItems implements Serializable {
private static final long serialVersionUID = 1L;
@@ -31,31 +33,31 @@ public class SysDictionaryItems implements Serializable {
/**
* 对应字典ID
*/
- @TableField("dictid")
+ @TableField("DICTID")
private String dictId;
/**
* 顺序号
*/
- @TableField("orderno")
+ @TableField("ORDERNO")
private Integer orderNo;
/**
* 项编码
*/
- @TableField("itemcode")
+ @TableField("ITEMCODE")
private String itemCode;
/**
* 项名称
*/
- @TableField("dictname")
+ @TableField("DICTNAME")
private String dictName;
/**
* 父项编码
*/
- @TableField("parentcode")
+ @TableField("PARENTCODE")
private String parentCode;
/**
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java b/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java
index dfe091d..1818365 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java
@@ -3,6 +3,7 @@ package com.yfd.platform.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@@ -22,6 +23,7 @@ import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
+@TableName("SYS_LOG")
public class SysLog implements Serializable {
private static final long serialVersionUID = 1L;
@@ -29,13 +31,13 @@ public class SysLog implements Serializable {
/**
* ID
*/
- @TableId(value = "id", type = IdType.AUTO)
+ @TableId(value = "ID", type = IdType.AUTO)
private Long id;
/**
* 用户账号
*/
- @TableField("usercode")
+ @TableField("USERCODE")
private String usercode;
/**
@@ -46,7 +48,7 @@ public class SysLog implements Serializable {
/**
* 操作类型 00-登录 01-新增 02-修改 03-删除 06-查询 09其他
*/
- @TableField("opttype")
+ @TableField("OPTTYPE")
private String opttype;
/**
@@ -72,13 +74,13 @@ public class SysLog implements Serializable {
/**
* 创建时间
*/
- @TableField("logtime")
+ @TableField("LOGTIME")
private Timestamp logtime;
/**
* 请求IP
*/
- @TableField("requestip")
+ @TableField("REQUESTIP")
private String requestip;
/**
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysMenu.java b/backend/src/main/java/com/yfd/platform/system/domain/SysMenu.java
index 18802d7..8392ce6 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/SysMenu.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/SysMenu.java
@@ -19,7 +19,7 @@ import java.util.List;
*/
@Data
@EqualsAndHashCode(callSuper = false)
-@TableName("sys_menu")
+@TableName("SYS_MENU")
public class SysMenu implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysOrganization.java b/backend/src/main/java/com/yfd/platform/system/domain/SysOrganization.java
index cc7f711..0f9a719 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/SysOrganization.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/SysOrganization.java
@@ -17,7 +17,7 @@ import java.sql.Timestamp;
*/
@Data
@EqualsAndHashCode(callSuper = false)
-@TableName("sys_organization")
+@TableName("SYS_ORGANIZATION")
public class SysOrganization implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysRole.java b/backend/src/main/java/com/yfd/platform/system/domain/SysRole.java
index 1b21e76..1c5c5f1 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/SysRole.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/SysRole.java
@@ -17,7 +17,7 @@ import java.sql.Timestamp;
*/
@Data
@EqualsAndHashCode(callSuper = false)
-@TableName("sys_role")
+@TableName("SYS_ROLE")
public class SysRole implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java
index 0e01f4a..4aeaca7 100644
--- a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java
+++ b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java
@@ -18,7 +18,7 @@ import java.sql.Timestamp;
@Data
@EqualsAndHashCode(callSuper = false)
-@TableName("sys_user")
+@TableName("SYS_USER")
public class SysUser implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/backend/src/main/resources/application-dev.yml b/backend/src/main/resources/application-dev.yml
index 3576152..37c1cdd 100644
--- a/backend/src/main/resources/application-dev.yml
+++ b/backend/src/main/resources/application-dev.yml
@@ -9,14 +9,14 @@ spring:
type: com.alibaba.druid.pool.DruidDataSource
druid:
master:
- driverClassName: com.mysql.cj.jdbc.Driver
- url: "${DB_MASTER_URL:jdbc:mysql://localhost:3306/wppdb?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true}"
- username: "${DB_MASTER_USERNAME:root}"
+ driverClassName: dm.jdbc.driver.DmDriver
+ url: "${DB_MASTER_URL:jdbc:dm://localhost:5236/WPPDB}"
+ username: "${DB_MASTER_USERNAME:WPPDB}"
password: "${DB_MASTER_PASSWORD:}"
slave:
- driverClassName: com.mysql.cj.jdbc.Driver
- url: "${DB_SLAVE_URL:jdbc:mysql://localhost:3306/wppdb?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true}"
- username: "${DB_SLAVE_USERNAME:root}"
+ driverClassName: dm.jdbc.driver.DmDriver
+ url: "${DB_SLAVE_URL:jdbc:dm://localhost:5236/WPPDB}"
+ username: "${DB_SLAVE_USERNAME:WPPDB}"
password: "${DB_SLAVE_PASSWORD:}"
mvc:
diff --git a/db.sql b/db.sql
new file mode 100644
index 0000000..a4680b9
--- /dev/null
+++ b/db.sql
@@ -0,0 +1,390 @@
+CREATE TABLE WPPDB.PROJECT
+(
+PROJECT_ID CHAR(36 CHAR) NOT NULL,
+CODE VARCHAR(20 CHAR) NOT NULL,
+NAME VARCHAR(200 CHAR) NOT NULL,
+DESCRIPTION TEXT,
+TOPOLOGY CLOB,
+CREATED_AT TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(),
+UPDATED_AT TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(),
+MODIFIER VARCHAR(40 CHAR),
+NOT CLUSTER PRIMARY KEY(PROJECT_ID),
+CONSTRAINT CODE UNIQUE(CODE)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON COLUMN WPPDB.PROJECT.CODE IS '项目编号';
+COMMENT ON COLUMN WPPDB.PROJECT.CREATED_AT IS '创建时间';
+COMMENT ON COLUMN WPPDB.PROJECT.DESCRIPTION IS '项目描述';
+COMMENT ON COLUMN WPPDB.PROJECT.MODIFIER IS '最近修改者';
+COMMENT ON COLUMN WPPDB.PROJECT.NAME IS '项目名称';
+COMMENT ON COLUMN WPPDB.PROJECT.PROJECT_ID IS '项目主键';
+COMMENT ON COLUMN WPPDB.PROJECT.TOPOLOGY IS '项目拓扑关系';
+COMMENT ON COLUMN WPPDB.PROJECT.UPDATED_AT IS '修改时间';
+
+
+CREATE TABLE WPPDB.SYS_CONFIG
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+SYSNAME VARCHAR(200 CHAR),
+WELCOME VARCHAR(500 CHAR),
+FUNCATION CLOB,
+REMARK CLOB,
+VERSIONINFO CLOB,
+LASTMODIFYDATE TIMESTAMP(0),
+CUSTOM1 VARCHAR(100 CHAR),
+CUSTOM2 VARCHAR(100 CHAR),
+CUSTOM3 VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_CONFIG IS '系统全局配置';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.CUSTOM1 IS '备用1';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.CUSTOM2 IS '备用2';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.CUSTOM3 IS '备用3';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.FUNCATION IS '系统功能介绍';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.ID IS 'id';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.LASTMODIFYDATE IS '最近修改日期';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.REMARK IS '备注';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.SYSNAME IS '系统名称';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.VERSIONINFO IS '版本信息';
+COMMENT ON COLUMN WPPDB.SYS_CONFIG.WELCOME IS '欢迎词';
+
+
+CREATE TABLE WPPDB.SYS_DICTIONARY
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+DICTTYPE VARCHAR(20 CHAR) DEFAULT '00' NOT NULL,
+ORDERNO INT NOT NULL,
+DICTCODE VARCHAR(40 CHAR) NOT NULL,
+DICTNAME VARCHAR(100 CHAR) NOT NULL,
+CUSTOM1 VARCHAR(1000 CHAR),
+CUSTOM2 VARCHAR(100 CHAR),
+CUSTOM3 CLOB,
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_DICTIONARY IS '数据字典表';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY.CUSTOM1 IS '备用1';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY.CUSTOM2 IS '备用2';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY.CUSTOM3 IS '备用3';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY.DICTCODE IS '字典编码';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY.DICTNAME IS '字典名称';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY.DICTTYPE IS '字典类型 00-系统内置 01-用户配置';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY.ID IS 'id';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY.ORDERNO IS '顺序号';
+
+
+CREATE TABLE WPPDB.SYS_DICTIONARY_ITEMS
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+DICTID VARCHAR(40 CHAR) NOT NULL,
+ORDERNO INT NOT NULL,
+ITEMCODE VARCHAR(40 CHAR) NOT NULL,
+DICTNAME VARCHAR(100 CHAR) NOT NULL,
+PARENTCODE VARCHAR(40 CHAR) DEFAULT '',
+CUSTOM1 VARCHAR(1000 CHAR),
+CUSTOM2 VARCHAR(100 CHAR),
+CUSTOM3 CLOB,
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_DICTIONARY_ITEMS IS '数据字典明细';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY_ITEMS.CUSTOM1 IS '备用1';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY_ITEMS.CUSTOM2 IS '备用2';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY_ITEMS.CUSTOM3 IS '备用3';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY_ITEMS.DICTID IS '对应字典ID';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY_ITEMS.DICTNAME IS '项名称';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY_ITEMS.ID IS 'id';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY_ITEMS.ITEMCODE IS '项编码';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY_ITEMS.ORDERNO IS '顺序号';
+COMMENT ON COLUMN WPPDB.SYS_DICTIONARY_ITEMS.PARENTCODE IS '父项编码';
+
+
+CREATE TABLE WPPDB.SYS_LOG
+(
+ID BIGINT AUTO_INCREMENT NOT NULL,
+USERCODE VARCHAR(200 CHAR),
+USERNAME VARCHAR(200 CHAR),
+OPTTYPE VARCHAR(20 CHAR),
+MODULE VARCHAR(200 CHAR),
+DESCRIPTION VARCHAR(400 CHAR),
+METHOD VARCHAR(200 CHAR),
+PARAMS TEXT,
+LOGTIME TIMESTAMP(0),
+REQUESTIP VARCHAR(200 CHAR),
+BROWSER VARCHAR(200 CHAR),
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) AUTO_INCREMENT = 3455487;
+
+COMMENT ON TABLE WPPDB.SYS_LOG IS '系统操作日志';
+COMMENT ON COLUMN WPPDB.SYS_LOG.BROWSER IS '浏览器类型';
+COMMENT ON COLUMN WPPDB.SYS_LOG.DESCRIPTION IS '日志描述';
+COMMENT ON COLUMN WPPDB.SYS_LOG.ID IS 'ID';
+COMMENT ON COLUMN WPPDB.SYS_LOG.LOGTIME IS '创建时间';
+COMMENT ON COLUMN WPPDB.SYS_LOG.METHOD IS '操作方法';
+COMMENT ON COLUMN WPPDB.SYS_LOG.MODULE IS '模块名称';
+COMMENT ON COLUMN WPPDB.SYS_LOG.OPTTYPE IS '操作类型 00-登录 01-新增 02-修改 03-删除 06-查询 09其他';
+COMMENT ON COLUMN WPPDB.SYS_LOG.PARAMS IS '方法参数';
+COMMENT ON COLUMN WPPDB.SYS_LOG.REQUESTIP IS '请求IP';
+COMMENT ON COLUMN WPPDB.SYS_LOG.USERCODE IS '用户账号';
+COMMENT ON COLUMN WPPDB.SYS_LOG.USERNAME IS '用户名称';
+
+
+CREATE OR REPLACE INDEX WPPDB.LOG_CREATE_TIME_INDEX ON WPPDB.SYS_LOG(LOGTIME ASC) STORAGE(ON MAIN, CLUSTERBTR) WITHOUT CLU_REC_ADDR ;
+CREATE OR REPLACE INDEX WPPDB.INX_LOG_TYPE ON WPPDB.SYS_LOG(OPTTYPE ASC) STORAGE(ON MAIN, CLUSTERBTR) WITHOUT CLU_REC_ADDR ;
+
+CREATE TABLE WPPDB.SYS_MENU
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+SYSTEMCODE VARCHAR(2 CHAR) NOT NULL,
+TYPE VARCHAR(2 CHAR) NOT NULL,
+CODE VARCHAR(20 CHAR) NOT NULL,
+NAME VARCHAR(100 CHAR) NOT NULL,
+ICON VARCHAR(100 CHAR),
+ISLINK VARCHAR(2 CHAR),
+OPTURL VARCHAR(200 CHAR),
+PERMISSION VARCHAR(100 CHAR),
+PARENTID VARCHAR(40 CHAR),
+ORDERNO INT,
+ISDISPLAY VARCHAR(2 CHAR),
+LASTMODIFIER VARCHAR(40 CHAR),
+LASTMODIFYDATE TIMESTAMP(0),
+CUSTOM1 VARCHAR(100 CHAR),
+CUSTOM2 VARCHAR(100 CHAR),
+CUSTOM3 VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_MENU IS '菜单及按钮';
+COMMENT ON COLUMN WPPDB.SYS_MENU.CODE IS '在系统内自动生成';
+COMMENT ON COLUMN WPPDB.SYS_MENU.CUSTOM1 IS '备用1';
+COMMENT ON COLUMN WPPDB.SYS_MENU.CUSTOM2 IS '备用2';
+COMMENT ON COLUMN WPPDB.SYS_MENU.CUSTOM3 IS '备用3';
+COMMENT ON COLUMN WPPDB.SYS_MENU.ICON IS '图标地址';
+COMMENT ON COLUMN WPPDB.SYS_MENU.ID IS 'id';
+COMMENT ON COLUMN WPPDB.SYS_MENU.ISDISPLAY IS '0-不显示 1-显示';
+COMMENT ON COLUMN WPPDB.SYS_MENU.ISLINK IS '是否外链';
+COMMENT ON COLUMN WPPDB.SYS_MENU.LASTMODIFIER IS '最近修改者';
+COMMENT ON COLUMN WPPDB.SYS_MENU.LASTMODIFYDATE IS '最近修改日期';
+COMMENT ON COLUMN WPPDB.SYS_MENU.NAME IS '名称';
+COMMENT ON COLUMN WPPDB.SYS_MENU.OPTURL IS '内部模块路径或者外链地址';
+COMMENT ON COLUMN WPPDB.SYS_MENU.ORDERNO IS '排序号';
+COMMENT ON COLUMN WPPDB.SYS_MENU.PARENTID IS '顶级为0';
+COMMENT ON COLUMN WPPDB.SYS_MENU.PERMISSION IS '权限控制标识';
+COMMENT ON COLUMN WPPDB.SYS_MENU.SYSTEMCODE IS '1-web 2-pad 3-mobile';
+COMMENT ON COLUMN WPPDB.SYS_MENU.TYPE IS '0-目录 1-菜单 2-按钮';
+
+
+CREATE TABLE WPPDB.SYS_MESSAGE
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+CREATETIME TIMESTAMP(0) NOT NULL,
+TYPE VARCHAR(2 CHAR) NOT NULL,
+TITLE VARCHAR(100 CHAR) NOT NULL,
+CONTENT VARCHAR(400 CHAR) NOT NULL,
+SENDER_NAME VARCHAR(40 CHAR),
+RECEIVER_CODES VARCHAR(1000 CHAR),
+RECEIVER_NAMES VARCHAR(1000 CHAR),
+STATUS VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+VALIDPERIOD INT DEFAULT 24,
+READTIME TIMESTAMP(0),
+CUSTOM1 VARCHAR(100 CHAR),
+CUSTOM2 VARCHAR(100 CHAR),
+CUSTOM3 VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_MESSAGE IS '消息通知';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.CONTENT IS '消息内容';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.CREATETIME IS '创建时间:排序';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.CUSTOM1 IS '备用1';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.CUSTOM2 IS '备用2';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.CUSTOM3 IS '备用3';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.ID IS 'ID';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.READTIME IS '已阅时间';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.RECEIVER_CODES IS '接收者代码 人员账号列表';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.RECEIVER_NAMES IS '接收者名称:为空 即为所有人,人员名称列表';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.SENDER_NAME IS '发送者名称,定时器,人员';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.STATUS IS '状态:1、初始创建 2-消息已阅 9-消息过期';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.TITLE IS '消息标题';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.TYPE IS '消息类型:1-定时任务 2-工作流触发 3-人工触发';
+COMMENT ON COLUMN WPPDB.SYS_MESSAGE.VALIDPERIOD IS '有效期:小时';
+
+
+CREATE TABLE WPPDB.SYS_ORGANIZATION
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+ORGTYPE VARCHAR(2 CHAR) NOT NULL,
+ORGCODE VARCHAR(20 CHAR) NOT NULL,
+ORGNAME VARCHAR(100 CHAR) NOT NULL,
+PARENTID VARCHAR(40 CHAR),
+MANAGER VARCHAR(40 CHAR),
+ISVAILD VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+DESCRIPTION VARCHAR(1000 CHAR),
+LASTMODIFIER VARCHAR(40 CHAR),
+LASTMODIFYDATE TIMESTAMP(0),
+CUSTOM1 VARCHAR(100 CHAR),
+CUSTOM2 VARCHAR(100 CHAR),
+CUSTOM3 VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_ORGANIZATION IS '系统组织框架';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.CUSTOM1 IS '备用1';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.CUSTOM2 IS '备用2';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.CUSTOM3 IS '备用3';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.DESCRIPTION IS '描述';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.ID IS 'id';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.ISVAILD IS '1-是 0-否';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.LASTMODIFIER IS '最近修改者';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.LASTMODIFYDATE IS '最近修改日期';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.MANAGER IS '组织负责人';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.ORGCODE IS '两位一级';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.ORGNAME IS '组织名称';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.ORGTYPE IS '1-公司 -2-部门';
+COMMENT ON COLUMN WPPDB.SYS_ORGANIZATION.PARENTID IS '上级id';
+
+
+CREATE TABLE WPPDB.SYS_QUARTZ_JOB
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+ORDERNO INT NOT NULL,
+JOB_NAME VARCHAR(200 CHAR) NOT NULL,
+JOB_CLASS VARCHAR(200 CHAR) NOT NULL,
+JOB_METHOD VARCHAR(200 CHAR),
+JOB_CRON VARCHAR(300 CHAR),
+JOB_PARAMS VARCHAR(200 CHAR),
+DESCRIPTION VARCHAR(400 CHAR),
+STATUS VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+LASTMODIFIER VARCHAR(40 CHAR) NOT NULL,
+LASTMODIFYDATE TIMESTAMP(0) NOT NULL,
+CUSTOM1 VARCHAR(100 CHAR),
+CUSTOM2 VARCHAR(100 CHAR),
+CUSTOM3 VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_QUARTZ_JOB IS '定时任务';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.CUSTOM1 IS '备用1';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.CUSTOM2 IS '备用2';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.CUSTOM3 IS '备用3';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.DESCRIPTION IS '任务描述';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.ID IS 'ID';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.JOB_CLASS IS '执行类名称';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.JOB_CRON IS '时间周期表达式';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.JOB_METHOD IS '执行方法名称';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.JOB_NAME IS '任务名称';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.JOB_PARAMS IS '方法参数';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.LASTMODIFIER IS '最近修改者';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.LASTMODIFYDATE IS '最近修改日期';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.ORDERNO IS '排序号';
+COMMENT ON COLUMN WPPDB.SYS_QUARTZ_JOB.STATUS IS '状态:0-暂停、1-启用';
+
+
+CREATE TABLE WPPDB.SYS_ROLE
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+ROLECODE VARCHAR(3 CHAR) NOT NULL,
+ROLENAME VARCHAR(100 CHAR) NOT NULL,
+LEVEL VARCHAR(2 CHAR) NOT NULL,
+DESCRIPTION VARCHAR(1000 CHAR),
+ORGSCOPE VARCHAR(1000 CHAR),
+OPTSCOPE VARCHAR(2000 CHAR),
+BUSSCOPE VARCHAR(2000 CHAR),
+ISVAILD VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+LASTMODIFIER VARCHAR(40 CHAR),
+LASTMODIFYDATE TIMESTAMP(0),
+CUSTOM1 VARCHAR(100 CHAR),
+CUSTOM2 VARCHAR(100 CHAR),
+CUSTOM3 VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_ROLE IS '系统角色';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.BUSSCOPE IS 'json格式自定义业务范围';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.CUSTOM1 IS '备用1';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.CUSTOM2 IS '备用2';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.CUSTOM3 IS '备用3';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.DESCRIPTION IS '描述';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.ID IS 'id';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.ISVAILD IS '1-是 0-否';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.LASTMODIFIER IS '最近修改者';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.LASTMODIFYDATE IS '最近修改日期';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.LEVEL IS '1-超级管理员 2-单位管理员 3-普通用户';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.OPTSCOPE IS '多个操作代码(菜单、按钮)';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.ORGSCOPE IS 'org1,org2';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.ROLECODE IS '系统生成,三位编号';
+COMMENT ON COLUMN WPPDB.SYS_ROLE.ROLENAME IS '角色名称';
+
+
+CREATE TABLE WPPDB.SYS_ROLE_MENU
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+ROLEID VARCHAR(40 CHAR) NOT NULL,
+MENUID VARCHAR(40 CHAR) NOT NULL,
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_ROLE_MENU IS '系统角色权限对照';
+COMMENT ON COLUMN WPPDB.SYS_ROLE_MENU.ID IS 'id';
+COMMENT ON COLUMN WPPDB.SYS_ROLE_MENU.MENUID IS '权限id';
+COMMENT ON COLUMN WPPDB.SYS_ROLE_MENU.ROLEID IS '角色id';
+
+
+CREATE TABLE WPPDB.SYS_ROLE_USERS
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+ROLEID VARCHAR(40 CHAR) NOT NULL,
+USERID VARCHAR(40 CHAR) NOT NULL,
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_ROLE_USERS IS '系统角色用户对照';
+COMMENT ON COLUMN WPPDB.SYS_ROLE_USERS.ID IS 'id';
+COMMENT ON COLUMN WPPDB.SYS_ROLE_USERS.ROLEID IS '角色id';
+COMMENT ON COLUMN WPPDB.SYS_ROLE_USERS.USERID IS '用户id';
+
+
+CREATE TABLE WPPDB.SYS_USER
+(
+ID VARCHAR(40 CHAR) NOT NULL,
+USERTYPE VARCHAR(20 CHAR) DEFAULT '' NOT NULL,
+USERNAME VARCHAR(100 CHAR) NOT NULL,
+NICKNAME VARCHAR(255 CHAR) NOT NULL,
+PASSWORD VARCHAR(200 CHAR),
+SEX VARCHAR(2 CHAR),
+EMAIL VARCHAR(100 CHAR),
+PHONE VARCHAR(20 CHAR),
+AVATAR VARCHAR(100 CHAR),
+ORGID VARCHAR(40 CHAR) NOT NULL,
+STATUS VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+PWDRESETTIME TIMESTAMP(0),
+LASTMODIFIER VARCHAR(40 CHAR),
+LASTMODIFYDATE TIMESTAMP(0),
+CUSTOM1 VARCHAR(100 CHAR),
+CUSTOM2 VARCHAR(100 CHAR),
+CUSTOM3 VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY(ID)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB.SYS_USER IS '系统用户';
+COMMENT ON COLUMN WPPDB.SYS_USER.AVATAR IS '用户头像';
+COMMENT ON COLUMN WPPDB.SYS_USER.CUSTOM1 IS '备用1';
+COMMENT ON COLUMN WPPDB.SYS_USER.CUSTOM2 IS '备用2';
+COMMENT ON COLUMN WPPDB.SYS_USER.CUSTOM3 IS '备用3';
+COMMENT ON COLUMN WPPDB.SYS_USER.EMAIL IS '邮箱';
+COMMENT ON COLUMN WPPDB.SYS_USER.ID IS 'id';
+COMMENT ON COLUMN WPPDB.SYS_USER.LASTMODIFIER IS '最近修改者';
+COMMENT ON COLUMN WPPDB.SYS_USER.LASTMODIFYDATE IS '最近修改日期';
+COMMENT ON COLUMN WPPDB.SYS_USER.NICKNAME IS '用户昵称(中文)';
+COMMENT ON COLUMN WPPDB.SYS_USER.ORGID IS '所属组织';
+COMMENT ON COLUMN WPPDB.SYS_USER.PASSWORD IS '登录密码';
+COMMENT ON COLUMN WPPDB.SYS_USER.PHONE IS '手机号';
+COMMENT ON COLUMN WPPDB.SYS_USER.PWDRESETTIME IS '密码修改时间';
+COMMENT ON COLUMN WPPDB.SYS_USER.SEX IS '性别 0-男 1-女';
+COMMENT ON COLUMN WPPDB.SYS_USER.STATUS IS '1-有效 0-停用';
+COMMENT ON COLUMN WPPDB.SYS_USER.USERNAME IS '用户名称(账号)';
+COMMENT ON COLUMN WPPDB.SYS_USER.USERTYPE IS '用户类型 0-管理员 1-普通用户';
+
+
+CREATE TABLE WPPDB.SYS_USER_MENU
+(
+USERID VARCHAR(40 CHAR) NOT NULL,
+MENUID VARCHAR(40 CHAR),
+ORDERNO INT,
+OPTURL VARCHAR(200 CHAR)) STORAGE(ON MAIN, CLUSTERBTR) ;
+
+COMMENT ON COLUMN WPPDB.SYS_USER_MENU.MENUID IS '权限id';
+COMMENT ON COLUMN WPPDB.SYS_USER_MENU.OPTURL IS '内部模块路径或者外链地址';
+COMMENT ON COLUMN WPPDB.SYS_USER_MENU.ORDERNO IS '排序号';
+COMMENT ON COLUMN WPPDB.SYS_USER_MENU.USERID IS '用户id';
+
+
+
diff --git a/db.sql.bak b/db.sql.bak
new file mode 100644
index 0000000..299235d
--- /dev/null
+++ b/db.sql.bak
@@ -0,0 +1,389 @@
+CREATE TABLE "WPPDB"."project"
+(
+"project_id" CHAR(36 CHAR) NOT NULL,
+"code" VARCHAR(20 CHAR) NOT NULL,
+"name" VARCHAR(200 CHAR) NOT NULL,
+"description" TEXT,
+"topology" CLOB,
+"created_at" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(),
+"updated_at" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(),
+"modifier" VARCHAR(40 CHAR),
+NOT CLUSTER PRIMARY KEY("project_id"),
+CONSTRAINT "code" UNIQUE("code")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON COLUMN WPPDB."project"."code" IS '项目编号';
+COMMENT ON COLUMN WPPDB."project"."created_at" IS '创建时间';
+COMMENT ON COLUMN WPPDB."project"."description" IS '项目描述';
+COMMENT ON COLUMN WPPDB."project"."modifier" IS '最近修改者';
+COMMENT ON COLUMN WPPDB."project"."name" IS '项目名称';
+COMMENT ON COLUMN WPPDB."project"."project_id" IS '项目主键';
+COMMENT ON COLUMN WPPDB."project"."topology" IS '项目拓扑关系';
+COMMENT ON COLUMN WPPDB."project"."updated_at" IS '修改时间';
+
+
+CREATE TABLE "WPPDB"."sys_config"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"sysname" VARCHAR(200 CHAR),
+"welcome" VARCHAR(500 CHAR),
+"funcation" CLOB,
+"remark" CLOB,
+"versioninfo" CLOB,
+"lastmodifydate" TIMESTAMP(0),
+"custom1" VARCHAR(100 CHAR),
+"custom2" VARCHAR(100 CHAR),
+"custom3" VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_config" IS '系统全局配置';
+COMMENT ON COLUMN WPPDB."sys_config"."custom1" IS '备用1';
+COMMENT ON COLUMN WPPDB."sys_config"."custom2" IS '备用2';
+COMMENT ON COLUMN WPPDB."sys_config"."custom3" IS '备用3';
+COMMENT ON COLUMN WPPDB."sys_config"."funcation" IS '系统功能介绍';
+COMMENT ON COLUMN WPPDB."sys_config"."id" IS 'id';
+COMMENT ON COLUMN WPPDB."sys_config"."lastmodifydate" IS '最近修改日期';
+COMMENT ON COLUMN WPPDB."sys_config"."remark" IS '备注';
+COMMENT ON COLUMN WPPDB."sys_config"."sysname" IS '系统名称';
+COMMENT ON COLUMN WPPDB."sys_config"."versioninfo" IS '版本信息';
+COMMENT ON COLUMN WPPDB."sys_config"."welcome" IS '欢迎词';
+
+
+CREATE TABLE "WPPDB"."sys_dictionary"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"dicttype" VARCHAR(20 CHAR) DEFAULT '00' NOT NULL,
+"orderno" INT NOT NULL,
+"dictcode" VARCHAR(40 CHAR) NOT NULL,
+"dictname" VARCHAR(100 CHAR) NOT NULL,
+"custom1" VARCHAR(1000 CHAR),
+"custom2" VARCHAR(100 CHAR),
+"custom3" CLOB,
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_dictionary" IS '数据字典表';
+COMMENT ON COLUMN WPPDB."sys_dictionary"."custom1" IS '备用1';
+COMMENT ON COLUMN WPPDB."sys_dictionary"."custom2" IS '备用2';
+COMMENT ON COLUMN WPPDB."sys_dictionary"."custom3" IS '备用3';
+COMMENT ON COLUMN WPPDB."sys_dictionary"."dictcode" IS '字典编码';
+COMMENT ON COLUMN WPPDB."sys_dictionary"."dictname" IS '字典名称';
+COMMENT ON COLUMN WPPDB."sys_dictionary"."dicttype" IS '字典类型 00-系统内置 01-用户配置';
+COMMENT ON COLUMN WPPDB."sys_dictionary"."id" IS 'id';
+COMMENT ON COLUMN WPPDB."sys_dictionary"."orderno" IS '顺序号';
+
+
+CREATE TABLE "WPPDB"."sys_dictionary_items"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"dictid" VARCHAR(40 CHAR) NOT NULL,
+"orderno" INT NOT NULL,
+"itemcode" VARCHAR(40 CHAR) NOT NULL,
+"dictname" VARCHAR(100 CHAR) NOT NULL,
+"parentcode" VARCHAR(40 CHAR) DEFAULT '',
+"custom1" VARCHAR(1000 CHAR),
+"custom2" VARCHAR(100 CHAR),
+"custom3" CLOB,
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_dictionary_items" IS '数据字典明细';
+COMMENT ON COLUMN WPPDB."sys_dictionary_items"."custom1" IS '备用1';
+COMMENT ON COLUMN WPPDB."sys_dictionary_items"."custom2" IS '备用2';
+COMMENT ON COLUMN WPPDB."sys_dictionary_items"."custom3" IS '备用3';
+COMMENT ON COLUMN WPPDB."sys_dictionary_items"."dictid" IS '对应字典ID';
+COMMENT ON COLUMN WPPDB."sys_dictionary_items"."dictname" IS '项名称';
+COMMENT ON COLUMN WPPDB."sys_dictionary_items"."id" IS 'id';
+COMMENT ON COLUMN WPPDB."sys_dictionary_items"."itemcode" IS '项编码';
+COMMENT ON COLUMN WPPDB."sys_dictionary_items"."orderno" IS '顺序号';
+COMMENT ON COLUMN WPPDB."sys_dictionary_items"."parentcode" IS '父项编码';
+
+
+CREATE TABLE "WPPDB"."sys_log"
+(
+"id" BIGINT AUTO_INCREMENT NOT NULL,
+"usercode" VARCHAR(200 CHAR),
+"username" VARCHAR(200 CHAR),
+"opttype" VARCHAR(20 CHAR),
+"module" VARCHAR(200 CHAR),
+"description" VARCHAR(400 CHAR),
+"method" VARCHAR(200 CHAR),
+"params" TEXT,
+"logtime" TIMESTAMP(0),
+"requestip" VARCHAR(200 CHAR),
+"browser" VARCHAR(200 CHAR),
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) AUTO_INCREMENT = 3455487;
+
+COMMENT ON TABLE WPPDB."sys_log" IS '系统操作日志';
+COMMENT ON COLUMN WPPDB."sys_log"."browser" IS '浏览器类型';
+COMMENT ON COLUMN WPPDB."sys_log"."description" IS '日志描述';
+COMMENT ON COLUMN WPPDB."sys_log"."id" IS 'ID';
+COMMENT ON COLUMN WPPDB."sys_log"."logtime" IS '创建时间';
+COMMENT ON COLUMN WPPDB."sys_log"."method" IS '操作方法';
+COMMENT ON COLUMN WPPDB."sys_log"."module" IS '模块名称';
+COMMENT ON COLUMN WPPDB."sys_log"."opttype" IS '操作类型 00-登录 01-新增 02-修改 03-删除 06-查询 09其他';
+COMMENT ON COLUMN WPPDB."sys_log"."params" IS '方法参数';
+COMMENT ON COLUMN WPPDB."sys_log"."requestip" IS '请求IP';
+COMMENT ON COLUMN WPPDB."sys_log"."usercode" IS '用户账号';
+COMMENT ON COLUMN WPPDB."sys_log"."username" IS '用户名称';
+
+
+CREATE OR REPLACE INDEX "WPPDB"."log_create_time_index" ON "WPPDB"."sys_log"("logtime" ASC) STORAGE(ON "MAIN", CLUSTERBTR) WITHOUT CLU_REC_ADDR ;
+CREATE OR REPLACE INDEX "WPPDB"."inx_log_type" ON "WPPDB"."sys_log"("opttype" ASC) STORAGE(ON "MAIN", CLUSTERBTR) WITHOUT CLU_REC_ADDR ;
+
+CREATE TABLE "WPPDB"."sys_menu"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"systemcode" VARCHAR(2 CHAR) NOT NULL,
+"type" VARCHAR(2 CHAR) NOT NULL,
+"code" VARCHAR(20 CHAR) NOT NULL,
+"name" VARCHAR(100 CHAR) NOT NULL,
+"icon" VARCHAR(100 CHAR),
+"islink" VARCHAR(2 CHAR),
+"opturl" VARCHAR(200 CHAR),
+"permission" VARCHAR(100 CHAR),
+"parentid" VARCHAR(40 CHAR),
+"orderno" INT,
+"isdisplay" VARCHAR(2 CHAR),
+"lastmodifier" VARCHAR(40 CHAR),
+"lastmodifydate" TIMESTAMP(0),
+"custom1" VARCHAR(100 CHAR),
+"custom2" VARCHAR(100 CHAR),
+"custom3" VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_menu" IS '菜单及按钮';
+COMMENT ON COLUMN WPPDB."sys_menu"."code" IS '在系统内自动生成';
+COMMENT ON COLUMN WPPDB."sys_menu"."custom1" IS '备用1';
+COMMENT ON COLUMN WPPDB."sys_menu"."custom2" IS '备用2';
+COMMENT ON COLUMN WPPDB."sys_menu"."custom3" IS '备用3';
+COMMENT ON COLUMN WPPDB."sys_menu"."icon" IS '图标地址';
+COMMENT ON COLUMN WPPDB."sys_menu"."id" IS 'id';
+COMMENT ON COLUMN WPPDB."sys_menu"."isdisplay" IS '0-不显示 1-显示';
+COMMENT ON COLUMN WPPDB."sys_menu"."islink" IS '是否外链';
+COMMENT ON COLUMN WPPDB."sys_menu"."lastmodifier" IS '最近修改者';
+COMMENT ON COLUMN WPPDB."sys_menu"."lastmodifydate" IS '最近修改日期';
+COMMENT ON COLUMN WPPDB."sys_menu"."name" IS '名称';
+COMMENT ON COLUMN WPPDB."sys_menu"."opturl" IS '内部模块路径或者外链地址';
+COMMENT ON COLUMN WPPDB."sys_menu"."orderno" IS '排序号';
+COMMENT ON COLUMN WPPDB."sys_menu"."parentid" IS '顶级为0';
+COMMENT ON COLUMN WPPDB."sys_menu"."permission" IS '权限控制标识';
+COMMENT ON COLUMN WPPDB."sys_menu"."systemcode" IS '1-web 2-pad 3-mobile';
+COMMENT ON COLUMN WPPDB."sys_menu"."type" IS '0-目录 1-菜单 2-按钮';
+
+
+CREATE TABLE "WPPDB"."sys_message"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"createtime" TIMESTAMP(0) NOT NULL,
+"type" VARCHAR(2 CHAR) NOT NULL,
+"title" VARCHAR(100 CHAR) NOT NULL,
+"content" VARCHAR(400 CHAR) NOT NULL,
+"sender_name" VARCHAR(40 CHAR),
+"receiver_codes" VARCHAR(1000 CHAR),
+"receiver_names" VARCHAR(1000 CHAR),
+"status" VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+"validperiod" INT DEFAULT 24,
+"readtime" TIMESTAMP(0),
+"custom1" VARCHAR(100 CHAR),
+"custom2" VARCHAR(100 CHAR),
+"custom3" VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_message" IS '消息通知';
+COMMENT ON COLUMN WPPDB."sys_message"."content" IS '消息内容';
+COMMENT ON COLUMN WPPDB."sys_message"."createtime" IS '创建时间:排序';
+COMMENT ON COLUMN WPPDB."sys_message"."custom1" IS '备用1';
+COMMENT ON COLUMN WPPDB."sys_message"."custom2" IS '备用2';
+COMMENT ON COLUMN WPPDB."sys_message"."custom3" IS '备用3';
+COMMENT ON COLUMN WPPDB."sys_message"."id" IS 'ID';
+COMMENT ON COLUMN WPPDB."sys_message"."readtime" IS '已阅时间';
+COMMENT ON COLUMN WPPDB."sys_message"."receiver_codes" IS '接收者代码 人员账号列表';
+COMMENT ON COLUMN WPPDB."sys_message"."receiver_names" IS '接收者名称:为空 即为所有人,人员名称列表';
+COMMENT ON COLUMN WPPDB."sys_message"."sender_name" IS '发送者名称,定时器,人员';
+COMMENT ON COLUMN WPPDB."sys_message"."status" IS '状态:1、初始创建 2-消息已阅 9-消息过期';
+COMMENT ON COLUMN WPPDB."sys_message"."title" IS '消息标题';
+COMMENT ON COLUMN WPPDB."sys_message"."type" IS '消息类型:1-定时任务 2-工作流触发 3-人工触发';
+COMMENT ON COLUMN WPPDB."sys_message"."validperiod" IS '有效期:小时';
+
+
+CREATE TABLE "WPPDB"."sys_organization"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"orgtype" VARCHAR(2 CHAR) NOT NULL,
+"orgcode" VARCHAR(20 CHAR) NOT NULL,
+"orgname" VARCHAR(100 CHAR) NOT NULL,
+"parentid" VARCHAR(40 CHAR),
+"manager" VARCHAR(40 CHAR),
+"isvaild" VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+"description" VARCHAR(1000 CHAR),
+"lastmodifier" VARCHAR(40 CHAR),
+"lastmodifydate" TIMESTAMP(0),
+"custom1" VARCHAR(100 CHAR),
+"custom2" VARCHAR(100 CHAR),
+"custom3" VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_organization" IS '系统组织框架';
+COMMENT ON COLUMN WPPDB."sys_organization"."custom1" IS '备用1';
+COMMENT ON COLUMN WPPDB."sys_organization"."custom2" IS '备用2';
+COMMENT ON COLUMN WPPDB."sys_organization"."custom3" IS '备用3';
+COMMENT ON COLUMN WPPDB."sys_organization"."description" IS '描述';
+COMMENT ON COLUMN WPPDB."sys_organization"."id" IS 'id';
+COMMENT ON COLUMN WPPDB."sys_organization"."isvaild" IS '1-是 0-否';
+COMMENT ON COLUMN WPPDB."sys_organization"."lastmodifier" IS '最近修改者';
+COMMENT ON COLUMN WPPDB."sys_organization"."lastmodifydate" IS '最近修改日期';
+COMMENT ON COLUMN WPPDB."sys_organization"."manager" IS '组织负责人';
+COMMENT ON COLUMN WPPDB."sys_organization"."orgcode" IS '两位一级';
+COMMENT ON COLUMN WPPDB."sys_organization"."orgname" IS '组织名称';
+COMMENT ON COLUMN WPPDB."sys_organization"."orgtype" IS '1-公司 -2-部门';
+COMMENT ON COLUMN WPPDB."sys_organization"."parentid" IS '上级id';
+
+
+CREATE TABLE "WPPDB"."sys_quartz_job"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"orderno" INT NOT NULL,
+"job_name" VARCHAR(200 CHAR) NOT NULL,
+"job_class" VARCHAR(200 CHAR) NOT NULL,
+"job_method" VARCHAR(200 CHAR),
+"job_cron" VARCHAR(300 CHAR),
+"job_params" VARCHAR(200 CHAR),
+"description" VARCHAR(400 CHAR),
+"status" VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+"lastmodifier" VARCHAR(40 CHAR) NOT NULL,
+"lastmodifydate" TIMESTAMP(0) NOT NULL,
+"custom1" VARCHAR(100 CHAR),
+"custom2" VARCHAR(100 CHAR),
+"custom3" VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_quartz_job" IS '定时任务';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."custom1" IS '备用1';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."custom2" IS '备用2';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."custom3" IS '备用3';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."description" IS '任务描述';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."id" IS 'ID';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."job_class" IS '执行类名称';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."job_cron" IS '时间周期表达式';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."job_method" IS '执行方法名称';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."job_name" IS '任务名称';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."job_params" IS '方法参数';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."lastmodifier" IS '最近修改者';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."lastmodifydate" IS '最近修改日期';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."orderno" IS '排序号';
+COMMENT ON COLUMN WPPDB."sys_quartz_job"."status" IS '状态:0-暂停、1-启用';
+
+
+CREATE TABLE "WPPDB"."sys_role"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"rolecode" VARCHAR(3 CHAR) NOT NULL,
+"rolename" VARCHAR(100 CHAR) NOT NULL,
+"level" VARCHAR(2 CHAR) NOT NULL,
+"description" VARCHAR(1000 CHAR),
+"orgscope" VARCHAR(1000 CHAR),
+"optscope" VARCHAR(2000 CHAR),
+"busscope" VARCHAR(2000 CHAR),
+"isvaild" VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+"lastmodifier" VARCHAR(40 CHAR),
+"lastmodifydate" TIMESTAMP(0),
+"custom1" VARCHAR(100 CHAR),
+"custom2" VARCHAR(100 CHAR),
+"custom3" VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_role" IS '系统角色';
+COMMENT ON COLUMN WPPDB."sys_role"."busscope" IS 'json格式自定义业务范围';
+COMMENT ON COLUMN WPPDB."sys_role"."custom1" IS '备用1';
+COMMENT ON COLUMN WPPDB."sys_role"."custom2" IS '备用2';
+COMMENT ON COLUMN WPPDB."sys_role"."custom3" IS '备用3';
+COMMENT ON COLUMN WPPDB."sys_role"."description" IS '描述';
+COMMENT ON COLUMN WPPDB."sys_role"."id" IS 'id';
+COMMENT ON COLUMN WPPDB."sys_role"."isvaild" IS '1-是 0-否';
+COMMENT ON COLUMN WPPDB."sys_role"."lastmodifier" IS '最近修改者';
+COMMENT ON COLUMN WPPDB."sys_role"."lastmodifydate" IS '最近修改日期';
+COMMENT ON COLUMN WPPDB."sys_role"."level" IS '1-超级管理员 2-单位管理员 3-普通用户';
+COMMENT ON COLUMN WPPDB."sys_role"."optscope" IS '多个操作代码(菜单、按钮)';
+COMMENT ON COLUMN WPPDB."sys_role"."orgscope" IS 'org1,org2';
+COMMENT ON COLUMN WPPDB."sys_role"."rolecode" IS '系统生成,三位编号';
+COMMENT ON COLUMN WPPDB."sys_role"."rolename" IS '角色名称';
+
+
+CREATE TABLE "WPPDB"."sys_role_menu"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"roleid" VARCHAR(40 CHAR) NOT NULL,
+"menuid" VARCHAR(40 CHAR) NOT NULL,
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_role_menu" IS '系统角色权限对照';
+COMMENT ON COLUMN WPPDB."sys_role_menu"."id" IS 'id';
+COMMENT ON COLUMN WPPDB."sys_role_menu"."menuid" IS '权限id';
+COMMENT ON COLUMN WPPDB."sys_role_menu"."roleid" IS '角色id';
+
+
+CREATE TABLE "WPPDB"."sys_role_users"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"roleid" VARCHAR(40 CHAR) NOT NULL,
+"userid" VARCHAR(40 CHAR) NOT NULL,
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_role_users" IS '系统角色用户对照';
+COMMENT ON COLUMN WPPDB."sys_role_users"."id" IS 'id';
+COMMENT ON COLUMN WPPDB."sys_role_users"."roleid" IS '角色id';
+COMMENT ON COLUMN WPPDB."sys_role_users"."userid" IS '用户id';
+
+
+CREATE TABLE "WPPDB"."sys_user"
+(
+"id" VARCHAR(40 CHAR) NOT NULL,
+"usertype" VARCHAR(20 CHAR) DEFAULT '' NOT NULL,
+"username" VARCHAR(100 CHAR) NOT NULL,
+"nickname" VARCHAR(255 CHAR) NOT NULL,
+"password" VARCHAR(200 CHAR),
+"sex" VARCHAR(2 CHAR),
+"email" VARCHAR(100 CHAR),
+"phone" VARCHAR(20 CHAR),
+"avatar" VARCHAR(100 CHAR),
+"orgid" VARCHAR(40 CHAR) NOT NULL,
+"status" VARCHAR(2 CHAR) DEFAULT '1' NOT NULL,
+"pwdresettime" TIMESTAMP(0),
+"lastmodifier" VARCHAR(40 CHAR),
+"lastmodifydate" TIMESTAMP(0),
+"custom1" VARCHAR(100 CHAR),
+"custom2" VARCHAR(100 CHAR),
+"custom3" VARCHAR(100 CHAR),
+NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE WPPDB."sys_user" IS '系统用户';
+COMMENT ON COLUMN WPPDB."sys_user"."avatar" IS '用户头像';
+COMMENT ON COLUMN WPPDB."sys_user"."custom1" IS '备用1';
+COMMENT ON COLUMN WPPDB."sys_user"."custom2" IS '备用2';
+COMMENT ON COLUMN WPPDB."sys_user"."custom3" IS '备用3';
+COMMENT ON COLUMN WPPDB."sys_user"."email" IS '邮箱';
+COMMENT ON COLUMN WPPDB."sys_user"."id" IS 'id';
+COMMENT ON COLUMN WPPDB."sys_user"."lastmodifier" IS '最近修改者';
+COMMENT ON COLUMN WPPDB."sys_user"."lastmodifydate" IS '最近修改日期';
+COMMENT ON COLUMN WPPDB."sys_user"."nickname" IS '用户昵称(中文)';
+COMMENT ON COLUMN WPPDB."sys_user"."orgid" IS '所属组织';
+COMMENT ON COLUMN WPPDB."sys_user"."password" IS '登录密码';
+COMMENT ON COLUMN WPPDB."sys_user"."phone" IS '手机号';
+COMMENT ON COLUMN WPPDB."sys_user"."pwdresettime" IS '密码修改时间';
+COMMENT ON COLUMN WPPDB."sys_user"."sex" IS '性别 0-男 1-女';
+COMMENT ON COLUMN WPPDB."sys_user"."status" IS '1-有效 0-停用';
+COMMENT ON COLUMN WPPDB."sys_user"."username" IS '用户名称(账号)';
+COMMENT ON COLUMN WPPDB."sys_user"."usertype" IS '用户类型 0-管理员 1-普通用户';
+
+
+CREATE TABLE "WPPDB"."sys_user_menu"
+(
+"userid" VARCHAR(40 CHAR) NOT NULL,
+"menuid" VARCHAR(40 CHAR),
+"orderno" INT,
+"opturl" VARCHAR(200 CHAR)) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON COLUMN WPPDB."sys_user_menu"."menuid" IS '权限id';
+COMMENT ON COLUMN WPPDB."sys_user_menu"."opturl" IS '内部模块路径或者外链地址';
+COMMENT ON COLUMN WPPDB."sys_user_menu"."orderno" IS '排序号';
+COMMENT ON COLUMN WPPDB."sys_user_menu"."userid" IS '用户id';
+
+
diff --git a/frontend-process/.npmrc b/frontend-process/.npmrc
new file mode 100644
index 0000000..d71de57
--- /dev/null
+++ b/frontend-process/.npmrc
@@ -0,0 +1,3 @@
+registry=https://registry.npmmirror.com
+fetch-retries=5
+strict-peer-dependencies=false
diff --git a/frontend-process/index.html b/frontend-process/index.html
new file mode 100644
index 0000000..95160dc
--- /dev/null
+++ b/frontend-process/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+ front-process
+
+
+
+
+
+
+
diff --git a/frontend-process/package.json b/frontend-process/package.json
new file mode 100644
index 0000000..c9cef7c
--- /dev/null
+++ b/frontend-process/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "front-process",
+ "private": true,
+ "version": "0.1.0",
+ "scripts": {
+ "dev": "vite --port 5174 --strictPort",
+ "build": "vue-tsc --noEmit && vite build",
+ "preview": "vite preview --port 5174 --strictPort"
+ },
+ "dependencies": {
+ "ant-design-vue": "^4.2.6",
+ "vue": "^3.2.40",
+ "vue-router": "^4.1.6"
+ },
+ "devDependencies": {
+ "@types/node": "^16.11.7",
+ "@vitejs/plugin-vue": "^4.0.0",
+ "typescript": "^4.7.4",
+ "vite": "^4.0.3",
+ "vue-tsc": "^0.35.0"
+ }
+}
diff --git a/frontend-process/pnpm-lock.yaml b/frontend-process/pnpm-lock.yaml
new file mode 100644
index 0000000..15a4ecd
--- /dev/null
+++ b/frontend-process/pnpm-lock.yaml
@@ -0,0 +1,794 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ ant-design-vue:
+ specifier: ^4.2.6
+ version: 4.2.6(vue@3.5.30(typescript@4.9.5))
+ vue:
+ specifier: ^3.2.40
+ version: 3.5.30(typescript@4.9.5)
+ vue-router:
+ specifier: ^4.1.6
+ version: 4.6.4(vue@3.5.30(typescript@4.9.5))
+ devDependencies:
+ '@types/node':
+ specifier: ^16.11.7
+ version: 16.18.126
+ '@vitejs/plugin-vue':
+ specifier: ^4.0.0
+ version: 4.6.2(vite@4.5.14(@types/node@16.18.126))(vue@3.5.30(typescript@4.9.5))
+ typescript:
+ specifier: ^4.7.4
+ version: 4.9.5
+ vite:
+ specifier: ^4.0.3
+ version: 4.5.14(@types/node@16.18.126)
+ vue-tsc:
+ specifier: ^0.35.0
+ version: 0.35.2(typescript@4.9.5)
+
+packages:
+
+ '@ant-design/colors@6.0.0':
+ resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==}
+
+ '@ant-design/icons-svg@4.4.2':
+ resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==}
+
+ '@ant-design/icons-vue@7.0.1':
+ resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==}
+ peerDependencies:
+ vue: '>=3.0.3'
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.2':
+ resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/runtime@7.29.2':
+ resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@ctrl/tinycolor@3.6.1':
+ resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+ engines: {node: '>=10'}
+
+ '@emotion/hash@0.9.2':
+ resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
+
+ '@emotion/unitless@0.8.1':
+ resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
+
+ '@esbuild/android-arm64@0.18.20':
+ resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.18.20':
+ resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.18.20':
+ resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.18.20':
+ resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.18.20':
+ resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.18.20':
+ resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.18.20':
+ resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.18.20':
+ resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.18.20':
+ resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.18.20':
+ resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.18.20':
+ resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.18.20':
+ resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.18.20':
+ resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.18.20':
+ resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.18.20':
+ resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.18.20':
+ resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.18.20':
+ resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-x64@0.18.20':
+ resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.18.20':
+ resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.18.20':
+ resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.18.20':
+ resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.18.20':
+ resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@simonwep/pickr@1.8.2':
+ resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==}
+
+ '@types/node@16.18.126':
+ resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==}
+
+ '@vitejs/plugin-vue@4.6.2':
+ resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.0.0 || ^5.0.0
+ vue: ^3.2.25
+
+ '@volar/code-gen@0.35.2':
+ resolution: {integrity: sha512-MoZHuNnPfUWnCNkQUI5+U+gvLTxrU+XlCTusdNOTFYUUAa+M68MH0RxFIS9Ybj4uAUWTcZx0Ow1q5t/PZozo+Q==}
+
+ '@volar/source-map@0.35.2':
+ resolution: {integrity: sha512-PFHh9wN/qMkOWYyvmB8ckvIzolrpNOvK5EBdxxdTpiPJhfYjW82rMDBnYf6RxCe7yQxrUrmve6BWVO7flxWNVQ==}
+
+ '@volar/vue-code-gen@0.35.2':
+ resolution: {integrity: sha512-8H6P8EtN06eSVGjtcJhGqZzFIg6/nWoHVOlnhc5vKqC7tXwpqPbyMQae0tO7pLBd5qSb/dYU5GQcBAHsi2jgyA==}
+ deprecated: 'WARNING: This project has been renamed to @vue/language-core. Install using @vue/language-core instead.'
+
+ '@volar/vue-typescript@0.35.2':
+ resolution: {integrity: sha512-PZI6Urb+Vr5Dvgf9xysM8X7TP09inWDy1wjDtprBoBhxS7r0Dg3V0qZuJa7sSGz7M0QMa5R/CBaZPhlxFCfJBw==}
+ deprecated: 'WARNING: This project has been renamed to @vue/typescript. Install using @vue/typescript instead.'
+
+ '@vue/compiler-core@3.5.30':
+ resolution: {integrity: sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==}
+
+ '@vue/compiler-dom@3.5.30':
+ resolution: {integrity: sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==}
+
+ '@vue/compiler-sfc@3.5.30':
+ resolution: {integrity: sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==}
+
+ '@vue/compiler-ssr@3.5.30':
+ resolution: {integrity: sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==}
+
+ '@vue/devtools-api@6.6.4':
+ resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+ '@vue/reactivity@3.5.30':
+ resolution: {integrity: sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==}
+
+ '@vue/runtime-core@3.5.30':
+ resolution: {integrity: sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==}
+
+ '@vue/runtime-dom@3.5.30':
+ resolution: {integrity: sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==}
+
+ '@vue/server-renderer@3.5.30':
+ resolution: {integrity: sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==}
+ peerDependencies:
+ vue: 3.5.30
+
+ '@vue/shared@3.5.30':
+ resolution: {integrity: sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==}
+
+ ant-design-vue@4.2.6:
+ resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==}
+ engines: {node: '>=12.22.0'}
+ peerDependencies:
+ vue: '>=3.2.0'
+
+ array-tree-filter@2.1.0:
+ resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==}
+
+ async-validator@4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+ compute-scroll-into-view@1.0.20:
+ resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
+
+ core-js@3.49.0:
+ resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==}
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ dayjs@1.11.20:
+ resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==}
+
+ dom-align@1.12.4:
+ resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==}
+
+ dom-scroll-into-view@2.0.1:
+ resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==}
+
+ entities@7.0.1:
+ resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
+ engines: {node: '>=0.12'}
+
+ esbuild@0.18.20:
+ resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ is-plain-object@3.0.1:
+ resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==}
+ engines: {node: '>=0.10.0'}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ lodash-es@4.17.23:
+ resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==}
+
+ lodash@4.17.23:
+ resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ nanopop@2.4.2:
+ resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ postcss@8.5.8:
+ resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ resize-observer-polyfill@1.5.1:
+ resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+
+ rollup@3.30.0:
+ resolution: {integrity: sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ scroll-into-view-if-needed@2.2.31:
+ resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
+
+ shallow-equal@1.2.1:
+ resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ stylis@4.3.6:
+ resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
+
+ throttle-debounce@5.0.2:
+ resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
+ engines: {node: '>=12.22'}
+
+ typescript@4.9.5:
+ resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+
+ vite@4.5.14:
+ resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ vue-router@4.6.4:
+ resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==}
+ peerDependencies:
+ vue: ^3.5.0
+
+ vue-tsc@0.35.2:
+ resolution: {integrity: sha512-aqY16VlODHzqtKGUkqdumNpH+s5ABCkufRyvMKQlL/mua+N2DfSVnHufzSNNUMr7vmOO0YsNg27jsspBMq4iGA==}
+ hasBin: true
+ peerDependencies:
+ typescript: '*'
+
+ vue-types@3.0.2:
+ resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==}
+ engines: {node: '>=10.15.0'}
+ peerDependencies:
+ vue: ^3.0.0
+
+ vue@3.5.30:
+ resolution: {integrity: sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ warning@4.0.3:
+ resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
+
+snapshots:
+
+ '@ant-design/colors@6.0.0':
+ dependencies:
+ '@ctrl/tinycolor': 3.6.1
+
+ '@ant-design/icons-svg@4.4.2': {}
+
+ '@ant-design/icons-vue@7.0.1(vue@3.5.30(typescript@4.9.5))':
+ dependencies:
+ '@ant-design/colors': 6.0.0
+ '@ant-design/icons-svg': 4.4.2
+ vue: 3.5.30(typescript@4.9.5)
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@babel/parser@7.29.2':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/runtime@7.29.2': {}
+
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@ctrl/tinycolor@3.6.1': {}
+
+ '@emotion/hash@0.9.2': {}
+
+ '@emotion/unitless@0.8.1': {}
+
+ '@esbuild/android-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/android-arm@0.18.20':
+ optional: true
+
+ '@esbuild/android-x64@0.18.20':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/darwin-x64@0.18.20':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-arm@0.18.20':
+ optional: true
+
+ '@esbuild/linux-ia32@0.18.20':
+ optional: true
+
+ '@esbuild/linux-loong64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.18.20':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-s390x@0.18.20':
+ optional: true
+
+ '@esbuild/linux-x64@0.18.20':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.18.20':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.18.20':
+ optional: true
+
+ '@esbuild/sunos-x64@0.18.20':
+ optional: true
+
+ '@esbuild/win32-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/win32-ia32@0.18.20':
+ optional: true
+
+ '@esbuild/win32-x64@0.18.20':
+ optional: true
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@simonwep/pickr@1.8.2':
+ dependencies:
+ core-js: 3.49.0
+ nanopop: 2.4.2
+
+ '@types/node@16.18.126': {}
+
+ '@vitejs/plugin-vue@4.6.2(vite@4.5.14(@types/node@16.18.126))(vue@3.5.30(typescript@4.9.5))':
+ dependencies:
+ vite: 4.5.14(@types/node@16.18.126)
+ vue: 3.5.30(typescript@4.9.5)
+
+ '@volar/code-gen@0.35.2':
+ dependencies:
+ '@volar/source-map': 0.35.2
+
+ '@volar/source-map@0.35.2': {}
+
+ '@volar/vue-code-gen@0.35.2':
+ dependencies:
+ '@volar/code-gen': 0.35.2
+ '@volar/source-map': 0.35.2
+ '@vue/compiler-core': 3.5.30
+ '@vue/compiler-dom': 3.5.30
+ '@vue/shared': 3.5.30
+
+ '@volar/vue-typescript@0.35.2':
+ dependencies:
+ '@volar/code-gen': 0.35.2
+ '@volar/source-map': 0.35.2
+ '@volar/vue-code-gen': 0.35.2
+ '@vue/compiler-sfc': 3.5.30
+ '@vue/reactivity': 3.5.30
+
+ '@vue/compiler-core@3.5.30':
+ dependencies:
+ '@babel/parser': 7.29.2
+ '@vue/shared': 3.5.30
+ entities: 7.0.1
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.30':
+ dependencies:
+ '@vue/compiler-core': 3.5.30
+ '@vue/shared': 3.5.30
+
+ '@vue/compiler-sfc@3.5.30':
+ dependencies:
+ '@babel/parser': 7.29.2
+ '@vue/compiler-core': 3.5.30
+ '@vue/compiler-dom': 3.5.30
+ '@vue/compiler-ssr': 3.5.30
+ '@vue/shared': 3.5.30
+ estree-walker: 2.0.2
+ magic-string: 0.30.21
+ postcss: 8.5.8
+ source-map-js: 1.2.1
+
+ '@vue/compiler-ssr@3.5.30':
+ dependencies:
+ '@vue/compiler-dom': 3.5.30
+ '@vue/shared': 3.5.30
+
+ '@vue/devtools-api@6.6.4': {}
+
+ '@vue/reactivity@3.5.30':
+ dependencies:
+ '@vue/shared': 3.5.30
+
+ '@vue/runtime-core@3.5.30':
+ dependencies:
+ '@vue/reactivity': 3.5.30
+ '@vue/shared': 3.5.30
+
+ '@vue/runtime-dom@3.5.30':
+ dependencies:
+ '@vue/reactivity': 3.5.30
+ '@vue/runtime-core': 3.5.30
+ '@vue/shared': 3.5.30
+ csstype: 3.2.3
+
+ '@vue/server-renderer@3.5.30(vue@3.5.30(typescript@4.9.5))':
+ dependencies:
+ '@vue/compiler-ssr': 3.5.30
+ '@vue/shared': 3.5.30
+ vue: 3.5.30(typescript@4.9.5)
+
+ '@vue/shared@3.5.30': {}
+
+ ant-design-vue@4.2.6(vue@3.5.30(typescript@4.9.5)):
+ dependencies:
+ '@ant-design/colors': 6.0.0
+ '@ant-design/icons-vue': 7.0.1(vue@3.5.30(typescript@4.9.5))
+ '@babel/runtime': 7.29.2
+ '@ctrl/tinycolor': 3.6.1
+ '@emotion/hash': 0.9.2
+ '@emotion/unitless': 0.8.1
+ '@simonwep/pickr': 1.8.2
+ array-tree-filter: 2.1.0
+ async-validator: 4.2.5
+ csstype: 3.2.3
+ dayjs: 1.11.20
+ dom-align: 1.12.4
+ dom-scroll-into-view: 2.0.1
+ lodash: 4.17.23
+ lodash-es: 4.17.23
+ resize-observer-polyfill: 1.5.1
+ scroll-into-view-if-needed: 2.2.31
+ shallow-equal: 1.2.1
+ stylis: 4.3.6
+ throttle-debounce: 5.0.2
+ vue: 3.5.30(typescript@4.9.5)
+ vue-types: 3.0.2(vue@3.5.30(typescript@4.9.5))
+ warning: 4.0.3
+
+ array-tree-filter@2.1.0: {}
+
+ async-validator@4.2.5: {}
+
+ compute-scroll-into-view@1.0.20: {}
+
+ core-js@3.49.0: {}
+
+ csstype@3.2.3: {}
+
+ dayjs@1.11.20: {}
+
+ dom-align@1.12.4: {}
+
+ dom-scroll-into-view@2.0.1: {}
+
+ entities@7.0.1: {}
+
+ esbuild@0.18.20:
+ optionalDependencies:
+ '@esbuild/android-arm': 0.18.20
+ '@esbuild/android-arm64': 0.18.20
+ '@esbuild/android-x64': 0.18.20
+ '@esbuild/darwin-arm64': 0.18.20
+ '@esbuild/darwin-x64': 0.18.20
+ '@esbuild/freebsd-arm64': 0.18.20
+ '@esbuild/freebsd-x64': 0.18.20
+ '@esbuild/linux-arm': 0.18.20
+ '@esbuild/linux-arm64': 0.18.20
+ '@esbuild/linux-ia32': 0.18.20
+ '@esbuild/linux-loong64': 0.18.20
+ '@esbuild/linux-mips64el': 0.18.20
+ '@esbuild/linux-ppc64': 0.18.20
+ '@esbuild/linux-riscv64': 0.18.20
+ '@esbuild/linux-s390x': 0.18.20
+ '@esbuild/linux-x64': 0.18.20
+ '@esbuild/netbsd-x64': 0.18.20
+ '@esbuild/openbsd-x64': 0.18.20
+ '@esbuild/sunos-x64': 0.18.20
+ '@esbuild/win32-arm64': 0.18.20
+ '@esbuild/win32-ia32': 0.18.20
+ '@esbuild/win32-x64': 0.18.20
+
+ estree-walker@2.0.2: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ is-plain-object@3.0.1: {}
+
+ js-tokens@4.0.0: {}
+
+ lodash-es@4.17.23: {}
+
+ lodash@4.17.23: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ nanoid@3.3.11: {}
+
+ nanopop@2.4.2: {}
+
+ picocolors@1.1.1: {}
+
+ postcss@8.5.8:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ resize-observer-polyfill@1.5.1: {}
+
+ rollup@3.30.0:
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ scroll-into-view-if-needed@2.2.31:
+ dependencies:
+ compute-scroll-into-view: 1.0.20
+
+ shallow-equal@1.2.1: {}
+
+ source-map-js@1.2.1: {}
+
+ stylis@4.3.6: {}
+
+ throttle-debounce@5.0.2: {}
+
+ typescript@4.9.5: {}
+
+ vite@4.5.14(@types/node@16.18.126):
+ dependencies:
+ esbuild: 0.18.20
+ postcss: 8.5.8
+ rollup: 3.30.0
+ optionalDependencies:
+ '@types/node': 16.18.126
+ fsevents: 2.3.3
+
+ vue-router@4.6.4(vue@3.5.30(typescript@4.9.5)):
+ dependencies:
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.30(typescript@4.9.5)
+
+ vue-tsc@0.35.2(typescript@4.9.5):
+ dependencies:
+ '@volar/vue-typescript': 0.35.2
+ typescript: 4.9.5
+
+ vue-types@3.0.2(vue@3.5.30(typescript@4.9.5)):
+ dependencies:
+ is-plain-object: 3.0.1
+ vue: 3.5.30(typescript@4.9.5)
+
+ vue@3.5.30(typescript@4.9.5):
+ dependencies:
+ '@vue/compiler-dom': 3.5.30
+ '@vue/compiler-sfc': 3.5.30
+ '@vue/runtime-dom': 3.5.30
+ '@vue/server-renderer': 3.5.30(vue@3.5.30(typescript@4.9.5))
+ '@vue/shared': 3.5.30
+ optionalDependencies:
+ typescript: 4.9.5
+
+ warning@4.0.3:
+ dependencies:
+ loose-envify: 1.4.0
diff --git a/frontend-process/public/manifest.json b/frontend-process/public/manifest.json
new file mode 100644
index 0000000..5a9de83
--- /dev/null
+++ b/frontend-process/public/manifest.json
@@ -0,0 +1,14 @@
+{
+ "name": "process",
+ "version": "0.1.0",
+ "entry": "/process/",
+ "routeBase": "/process",
+ "routes": [
+ {
+ "path": "/process/antd-demo",
+ "title": "AntD Demo",
+ "perm": "process:demo:view"
+ }
+ ]
+}
+
diff --git a/frontend-process/src/App.vue b/frontend-process/src/App.vue
new file mode 100644
index 0000000..c2549a1
--- /dev/null
+++ b/frontend-process/src/App.vue
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/frontend-process/src/main.ts b/frontend-process/src/main.ts
new file mode 100644
index 0000000..a394f44
--- /dev/null
+++ b/frontend-process/src/main.ts
@@ -0,0 +1,8 @@
+import { createApp } from 'vue';
+import App from './App.vue';
+import router from './router';
+import Antd from 'ant-design-vue';
+import 'ant-design-vue/dist/reset.css';
+
+createApp(App).use(router).use(Antd).mount('#app');
+
diff --git a/frontend-process/src/router/index.ts b/frontend-process/src/router/index.ts
new file mode 100644
index 0000000..e083d66
--- /dev/null
+++ b/frontend-process/src/router/index.ts
@@ -0,0 +1,19 @@
+import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
+import Demo from '../views/Demo.vue';
+
+const routes: RouteRecordRaw[] = [
+ {
+ path: '/',
+ redirect: '/antd-demo'
+ },
+ {
+ path: '/antd-demo',
+ component: Demo
+ }
+];
+
+export default createRouter({
+ history: createWebHistory('/process/'),
+ routes
+});
+
diff --git a/frontend-process/src/views/Demo.vue b/frontend-process/src/views/Demo.vue
new file mode 100644
index 0000000..7169d8c
--- /dev/null
+++ b/frontend-process/src/views/Demo.vue
@@ -0,0 +1,49 @@
+
+
+
+ Ant Design Vue Demo(front-process)
+
+
+
+
+
+ AntD 按钮
+ Vue3 + Vite
+ Ant Design Vue
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend-process/tsconfig.json b/frontend-process/tsconfig.json
new file mode 100644
index 0000000..5126e88
--- /dev/null
+++ b/frontend-process/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "strict": true,
+ "jsx": "preserve",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "skipLibCheck": true,
+ "types": ["vite/client"],
+ "noEmit": true
+ },
+ "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
+}
+
diff --git a/frontend-process/vite.config.ts b/frontend-process/vite.config.ts
new file mode 100644
index 0000000..ab346c3
--- /dev/null
+++ b/frontend-process/vite.config.ts
@@ -0,0 +1,13 @@
+import { defineConfig } from 'vite';
+import vue from '@vitejs/plugin-vue';
+
+export default defineConfig({
+ base: '/process/',
+ plugins: [vue()],
+ server: {
+ host: '0.0.0.0',
+ port: 5174,
+ strictPort: true
+ }
+});
+
diff --git a/frontend/.npmrc b/frontend/.npmrc
index b3db441..d71de57 100644
--- a/frontend/.npmrc
+++ b/frontend/.npmrc
@@ -1,3 +1,3 @@
-registry=https://registry.npmjs.org
+registry=https://registry.npmmirror.com
fetch-retries=5
-strict-peer-dependencies=false
\ No newline at end of file
+strict-peer-dependencies=false
diff --git a/frontend/package.json b/frontend/package.json
index 7b20367..1c64d98 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -32,7 +32,9 @@
"vue": "^3.2.40",
"vue-i18n": "^9.1.9",
"vue-router": "^4.1.6",
- "vuedraggable": "^2.24.3"
+ "vuedraggable": "^2.24.3",
+ "wujie": "^1.0.24",
+ "wujie-vue3": "^1.0.24"
},
"devDependencies": {
"@commitlint/cli": "^16.2.3",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index f2b2b91..d7f8134 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -77,6 +77,12 @@ importers:
vuedraggable:
specifier: ^2.24.3
version: 2.24.3
+ wujie:
+ specifier: ^1.0.24
+ version: 1.0.29
+ wujie-vue3:
+ specifier: ^1.0.24
+ version: 1.0.29(vue@3.5.24(typescript@4.9.5))
devDependencies:
'@commitlint/cli':
specifier: ^16.2.3
@@ -3286,6 +3292,14 @@ packages:
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ wujie-vue3@1.0.29:
+ resolution: {integrity: sha512-OGt5Veyq/DtmFzHQCANmv8nZgu877u7ZjS5qjFpSrtKARKhLjID3x99D40a4pb3Kj5UmRatkV5Gn5hqOWpziZQ==}
+ peerDependencies:
+ vue: ^3.0.0
+
+ wujie@1.0.29:
+ resolution: {integrity: sha512-u7PmBT4l5ov7ciwmZNG8DLIRKrYrnXDa0LnAFgRQikJ/ZrVZYzzSNz6duzEJoj8/o46dnMy/g9Hh/PBYGbgFUw==}
+
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@@ -6747,6 +6761,15 @@ snapshots:
wrappy@1.0.2: {}
+ wujie-vue3@1.0.29(vue@3.5.24(typescript@4.9.5)):
+ dependencies:
+ vue: 3.5.24(typescript@4.9.5)
+ wujie: 1.0.29
+
+ wujie@1.0.29:
+ dependencies:
+ '@babel/runtime': 7.28.4
+
y18n@5.0.8: {}
yallist@4.0.0: {}
diff --git a/frontend/src/main.ts b/frontend/src/main.ts
index b3a9a56..b4c4059 100644
--- a/frontend/src/main.ts
+++ b/frontend/src/main.ts
@@ -17,6 +17,7 @@ import i18n from '@/lang/index';
import '@/styles/index.scss';
import 'element-plus/theme-chalk/index.css';
//import 'element-plus/theme-chalk/dark/css-vars.css';
+import WujieVue from 'wujie-vue3';
const app = createApp(App);
// 自定义指令
@@ -38,5 +39,6 @@ app
.component('Pagination', Pagination)
.use(router)
.use(ElementPlus)
+ .use(WujieVue)
.use(i18n)
.mount('#app');
diff --git a/frontend/src/permission.ts b/frontend/src/permission.ts
index 467c7af..9be434e 100644
--- a/frontend/src/permission.ts
+++ b/frontend/src/permission.ts
@@ -12,6 +12,10 @@ const permissionStore = usePermissionStoreHook();
// 白名单路由
const whiteList = ['/login'];
+if (import.meta.env.DEV) {
+ whiteList.push('/process/antd-demo');
+}
+
router.beforeEach(async (to, from, next) => {
NProgress.start();
const userStore = useUserStoreHook();
diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts
index d45a4cf..9ba4531 100644
--- a/frontend/src/router/index.ts
+++ b/frontend/src/router/index.ts
@@ -52,6 +52,21 @@ export const constantRoutes: RouteRecordRaw[] = [
meta: { hidden: true }
},
]
+ },
+ {
+ path: '/process',
+ opturl: '/process',
+ component: Layout,
+ redirect: '/process/antd-demo',
+ children: [
+ {
+ path: 'antd-demo',
+ opturl: '/process/antd-demo',
+ component: () => import('@/views/process/antd-demo.vue'),
+ name: 'AntD Demo',
+ meta: { title: 'AntD Demo' }
+ }
+ ]
}
];
diff --git a/frontend/src/views/process/antd-demo.vue b/frontend/src/views/process/antd-demo.vue
new file mode 100644
index 0000000..3b26af0
--- /dev/null
+++ b/frontend/src/views/process/antd-demo.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index e458fbb..fa30c50 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -31,6 +31,10 @@ export default ({ mode }: ConfigEnv): UserConfig => {
changeOrigin: true,
rewrite: path =>
path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')
+ },
+ '/process': {
+ target: 'http://localhost:5174',
+ changeOrigin: true
}
}
},
@@ -49,4 +53,4 @@ export default ({ mode }: ConfigEnv): UserConfig => {
}
}
};
-};
\ No newline at end of file
+};
diff --git a/系统前端框架及集成方案.md b/系统前端框架及集成方案.md
new file mode 100644
index 0000000..bc737dd
--- /dev/null
+++ b/系统前端框架及集成方案.md
@@ -0,0 +1,225 @@
+# 系统前端框架及集成方案(微前端:Wujie,双栈并存)
+
+## 1. 背景与目标
+
+### 1.1 背景
+- 现有 `front-system`:基于 Vue3 + Vite + Element Plus,已完成登录、首页布局、菜单框架、权限管理配置等平台能力。
+- 计划新增 `front-process`:基于 Vue3 + Vite + Ant Design Vue,承载“全过程平台”的业务模块开发。
+- 诉求:业务模块页面能够被集成到 `front-system` 的菜单体系中,在同一系统壳内统一展示与导航。
+- 约束:不要求子应用独立部署到不同域名(允许同域名不同路径)。
+
+### 1.2 总体目标
+- 双栈并存:`front-system` 使用 Element Plus;`front-process` 使用 Ant Design Vue。
+- 平台壳统一:登录、鉴权、菜单、导航、用户态由 `front-system` 统一提供。
+- 业务独立迭代:`front-process` 可独立开发、独立构建、独立发布(至少独立产物与版本),但最终可同域名部署。
+- 集成稳定:支持深链接/刷新不 404;支持主/子应用通信;支持权限控制与菜单动态加载。
+
+### 1.3 非目标(明确不做)
+- 不在同一个页面/同一个组件树内混用 Element Plus 与 Ant Design Vue 的核心表单/表格/弹窗(避免样式与交互冲突)。
+- 不追求主/子应用“运行时共享同一个 Vue 实例”这一类高复杂度共享(除非后续明确要求并引入更强的共享机制)。
+
+## 2. 总体架构
+
+### 2.1 角色划分
+- Host(主应用):`front-system`
+ - 职责:登录、token 生命周期、用户信息、权限与菜单、系统配置、统一布局(header/sidebar/tabs)、全局路由守卫。
+ - 职责:提供微前端容器,负责挂载/卸载子应用。
+- SubApp(子应用):`front-process`
+ - 职责:全过程业务模块页面与路由、业务页面内的权限展示(按钮/菜单项可见性)以及业务接口调用。
+ - 约束:不自行实现登录与 token 刷新;不与 Host 的存储策略强耦合(通过 Host SDK 读取)。
+
+### 2.2 路由策略(同域名)
+- 约定统一路由前缀:
+ - Host 自己页面:`/login`、`/system/**`、`/`(首页等)
+ - SubApp 页面前缀:`/process/**`
+- Host 在路由命中 `/process/**` 时:
+ - 渲染“微前端容器页”(仅保留壳:菜单/页签/面包屑等)
+ - 将当前路径转发给子应用(由子应用 router 接管内部视图)
+
+### 2.3 菜单与权限模型
+- 菜单数据由 Host 统一维护(系统权限管理模块)。
+- Host 菜单支持两类节点:
+ - Host 页面:`type=host`,如 `/system/role`
+ - 子应用页面:`type=micro`,如 `/process/order/list`,并包含 `app=process`
+- 权限判断:
+ - Host:用于决定“菜单是否出现/路由是否允许进入”。
+ - SubApp:用于按钮/页面内部功能点可见性(通过 Host SDK 获取权限集合)。
+
+## 3. 技术选型:Wujie(已选定)
+
+### 3.1 选型结论
+- 本方案明确选用:Wujie(Vue3 + Vite 场景)。
+- 目标:在 `front-system`(Element Plus)不大改动的前提下,接入 `front-process`(Ant Design Vue)并进行样式隔离与生命周期治理。
+
+### 3.2 选型理由
+- 接入路径更直接:同域名、路由前缀、容器挂载属于 Wujie 的典型场景。
+- 隔离能力更容易落地:可选 Shadow DOM/样式隔离能力,更适配现有 Host 中 Tailwind 与 Element Plus 全局样式覆盖的现状。
+
+### 3.3 统一要求
+- 明确“接入协议”(路由、菜单、鉴权、通信)并版本化。
+- 子应用必须在容器内可重复 mount/unmount,不泄露全局事件、定时器、全局样式。
+
+## 4. 仓库与工程结构建议
+
+### 4.1 当前仓库结构(建议演进)
+建议把前端拆为两个目录(可在同仓库内):
+```
+WholeProcessPlatform/
+ frontend-system/ # Host:Element Plus
+ frontend-process/ # SubApp:Ant Design Vue
+ backend/ # Spring Boot
+```
+
+如果短期不希望移动目录,也可以先在现有 `frontend/` 基础上复制一份 `frontend-process/`,逐步迁移到标准结构。
+
+### 4.2 子应用产物与路径约定(同域名)
+- Host 发布到:`/`(例如 `https://example.com/`)
+- SubApp 发布到:`/process/`(例如 `https://example.com/process/`)
+- 子应用构建时必须配置:
+ - `base: '/process/'`
+ - 资源路径、路由刷新策略与后端 rewrite 一致
+
+## 5. 接入协议(核心:可迭代)
+
+### 5.1 子应用 Manifest(推荐)
+Host 通过一个标准 manifest 获取子应用信息,避免硬编码:
+`GET /process/manifest.json`(同域名静态文件或接口均可)
+
+示例:
+```json
+{
+ "name": "process",
+ "version": "1.0.0",
+ "entry": "/process/",
+ "routeBase": "/process",
+ "routes": [
+ { "path": "/process/order/list", "title": "订单列表", "perm": "process:order:list" }
+ ]
+}
+```
+
+Host 使用方式:
+- 菜单配置模块把 `perm/path/title/app` 写入系统菜单表。
+- 或者 Host 启动时拉取 manifest,生成“可选菜单项”供管理员配置。
+
+### 5.2 Host SDK(推荐:共享通信与鉴权)
+提供一个统一 SDK(同仓库内共享文件或独立包),子应用只能通过 SDK 获取宿主能力。
+
+接口建议(最小闭环):
+- `getToken(): string | null`
+- `getUser(): { id: string; username: string; roles: string[]; perms: string[] } | null`
+- `hasPerm(code: string): boolean`
+- `onAuthChanged(cb): () => void`
+- `navigate(path: string): void`(由 Host 控制主路由)
+- `getAppConfig(): Record`
+
+通信方式建议:
+- 同窗口同域名:优先使用自定义事件(`window.dispatchEvent(new CustomEvent(...))`)或轻量事件总线。
+- 避免子应用直接读写 Host 的 pinia/vuex store(强耦合)。
+
+### 5.3 鉴权约定
+- token 统一由 Host 管理:登录、刷新、退出、失效重登。
+- 子应用请求后端 API 的 token 获取:
+ - `Authorization: Bearer ` 由子应用拦截器从 Host SDK 注入。
+- 子应用不得自行实现登录页面与 token 刷新逻辑(避免双重刷新与状态打架)。
+
+## 6. 样式隔离与 UI 共存策略(关键风险治理)
+
+### 6.1 原则
+- Host(Element Plus)与 SubApp(AntD)在同一 DOM 上下文时,必须最小化全局样式污染。
+- 禁止在子应用里全局覆盖宿主样式(也不建议在宿主覆盖子应用)。
+
+### 6.2 治理手段
+- 选择 wujie 时:
+ - 优先开启样式隔离能力(根据实际接入方式选择 Shadow DOM 或样式沙箱)。
+- Tailwind 风险:
+ - Host 当前使用 Tailwind 全局注入时,会影响子应用的基础样式(尤其 preflight/base)。
+ - 建议后续收敛:对子应用范围做隔离,或在 Host 中通过约定限制 tailwind base 的影响范围。
+- 弹层与 z-index:
+ - AntD 与 Element Plus 都有 modal/message/notification。
+ - 约定:子应用弹层仅覆盖子应用容器;宿主弹层覆盖全局;避免跨应用调用对方 UI 弹层。
+
+## 7. 本地开发联调模式(Dev)
+
+### 7.1 端口约定(示例)
+- backend:`8093`
+- Host(front-system):`5173`
+- SubApp(front-process):`5174`
+
+### 7.2 代理与同域策略
+由于“不要求独立域名”,本地开发仍建议通过代理实现“看起来同域”:
+- Host dev server 代理:
+ - `/api` → `http://localhost:8093`
+ - `/process/` → `http://localhost:5174/`(子应用 dev server)
+
+这样 Host 在开发态加载子应用时仍以 `/process/` 作为 entry,最大程度贴近生产路径。
+
+## 7.3 Demo 联调(本仓库)
+- Host(system)菜单项:`/process/antd-demo`
+- 子应用(process)入口:`/process/`(由 Host 通过 Wujie 挂载)
+- 本地启动顺序:
+ - 前置:Node.js 建议 18+(推荐 20+),pnpm 建议 9+(若本机 pnpm 版本过旧,可使用 `npx -y pnpm@9.15.4 ...` 代替 `pnpm ...`)
+ - 启动 `frontend-process`(子应用,端口 5174):
+ - `cd frontend-process && pnpm install && pnpm dev`
+ - 启动 `front-system`(Host,当前仓库的 `frontend`,端口 5173/自动找可用端口):
+ - `cd frontend && pnpm install && pnpm dev`
+ - 在 Host 菜单中进入“AntD Demo”页面进行验证
+
+## 8. 生产部署方案(同域名)
+
+### 8.1 Nginx(推荐)
+- Host 静态文件:`/` 指向 host dist
+- SubApp 静态文件:`/process/` 指向 subapp dist
+- 后端接口:`/api/` 反向代理到 Spring Boot
+- 路由刷新:对 `/` 和 `/process/` 分别做 fallback 到对应的 `index.html`
+
+### 8.2 Spring Boot 静态资源(可行但需约束)
+如果用 Spring Boot 统一承载静态资源:
+- Host 构建产物放入 `backend/src/main/resources/static/`
+- SubApp 构建产物放入 `backend/src/main/resources/static/process/`
+- 需确保:
+ - Host 与 SubApp 的资源路径不冲突
+ - Spring MVC 对前端路由做 rewrite(尤其 `/process/**` 刷新)
+
+## 9. 迭代计划(按里程碑)
+
+### M1:微前端骨架(1 条链路跑通)
+- Host 增加微前端容器页 `/process/**`
+- SubApp 实现最小页面(例如 `/process/health`)
+- Host 菜单可配置一个子应用菜单项并打开该页面
+- Host SDK:实现 `getToken/getUser/hasPerm/navigate`
+
+### M2:权限与菜单联动
+- 菜单管理支持 `type=micro` 与 `app=process`
+- 子应用按 `perm` 做按钮级展示
+- 深链接与刷新校验通过(直接打开 `/process/**`)
+
+### M3:工程治理
+- 样式隔离策略固化(shadow dom / css sandbox)
+- 错误边界:子应用加载失败时 Host 给出可恢复提示
+- 性能优化:按路由懒加载子应用、预加载关键模块
+
+## 10. 风险清单与应对
+
+### 10.1 路由刷新 404
+- 风险:/process/** 刷新时服务端不 rewrite 到 index.html。
+- 应对:Nginx 或 Spring Boot rewrite 规则必须补齐,并对 Host/SubApp 各自生效。
+
+### 10.2 鉴权状态不一致
+- 风险:子应用自行刷新 token 或自行维护登录态。
+- 应对:只允许 Host 管理 token;子应用通过 SDK 读取并订阅变更。
+
+### 10.3 样式污染与弹层冲突
+- 风险:Tailwind base、全局 reset、z-index。
+- 应对:隔离策略 + 约定弹层边界 + 视觉回归检查。
+
+### 10.4 版本错配
+- 风险:Host 菜单/协议升级,子应用未同步。
+- 应对:manifest 版本化;Host 对协议做兼容或强制版本一致发布。
+
+## 11. 最小验收标准(可作为迭代验收)
+- 登录成功后,Host 菜单可进入 `/process/**` 页面并正常展示子应用内容。
+- 浏览器刷新 `/process/**` 不 404。
+- 子应用通过 Host SDK 获取 token 调用后端 API 成功。
+- Host 退出登录后,子应用自动感知并回到登录页(由 Host 控制导航)。
+- 子应用异常(加载失败/运行时错误)不会导致 Host 白屏,Host 能提示并支持重试。
diff --git a/系统前端框架及集成方案.pdf b/系统前端框架及集成方案.pdf
new file mode 100644
index 0000000..f453e09
Binary files /dev/null and b/系统前端框架及集成方案.pdf differ