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 @@ + + + + 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