diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4b83fbd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,76 @@
+# For Java
+*.lck
+target/
+*.json
+log/
+logback-test.xml
+
+
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+# Image snapshot diff
+__diff_output__/
+/jest-stare
+
+*.iml
+.idea/
+.ipr
+.iws
+*~
+~*
+*.diff
+*.patch
+*.bak
+.DS_Store
+Thumbs.db
+.project
+.*proj
+.svn/
+*.swp
+*.swo
+*.log
+*.log.*
+*.json.gzip
+node_modules/
+.buildpath
+.settings
+dist
+npm-debug.log
+nohup.out
+_site
+_data
+report.html
+/lib
+/es
+elasticsearch-*
+config/base.yaml
+/.vscode/
+/coverage
+/.history
+*.tmp
+!**/nacos/target
+**/nacos/data/*
+**/nacos/logs/*
+**/seata/bin/*
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..a53e5e2
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,26 @@
+# 基础镜像
+FROM bellsoft/liberica-openjre-rocky:21
+# FROM bellsoft/liberica-openjre-rocky:17
+# FROM bellsoft/liberica-openjre-rocky:11
+# FROM bellsoft/liberica-openjre-rocky:8
+LABEL maintainer=yunzhupaas-team
+
+# 设置时区
+ENV TZ=Asia/Shanghai
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+# 解决连接SQLServer安全错误
+# 如您使用SQLServer数据库,把以下注释取消
+# COPY security/java.security /opt/java/openjdk/lib/security
+
+# 指定运行时的工作目录
+WORKDIR /data/yunzhupaassoft/javaApi
+
+# 将构建产物jar包拷贝到运行时目录中
+COPY yunzhupaas-admin/target/*.jar ./yunzhupaas-admin.jar
+
+# 指定容器内运行端口
+EXPOSE 30000
+
+# 指定容器启动时要运行的命令
+ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar yunzhupaas-admin.jar"]
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..395fa93
--- /dev/null
+++ b/README.md
@@ -0,0 +1,481 @@
+> 特别说明:源码、JDK、数据库、Redis等安装或存放路径禁止包含中文、空格、特殊字符等
+
+## 一 技术栈
+
+- 编辑语言:`Java8/11`、`Java17/21`
+- 主框架:`Spring Boot 2.7/3.2` + `Spring Framework`
+- 持久层框架:`MyBatis-Plus`
+- 数据库连接池:`Alibaba Druid`
+- 多数据源:`Dynamic-Datasource`
+- 数据库兼容: `MySQL`(默认)、`SQLServer`、`Oracle`、`PostgreSQL`、`达数据库`、`人大金仓数据库`
+- 分库分表解决方案:`Apache ShardingSphere`
+- 权限认证框架:`Sa-Token`+`JWT`
+- 代码生成器:`MyBatis-Plus-Generator`
+- 流程引擎:`Flowable 6.7`
+- 模板引擎:`Velocity`
+- 任务调度:`XXL-JOB`
+- 分布式锁:`Lock4j`
+- JSON序列化: `Jackson`&`Fastjson`
+- 缓存数据库:`Redis`
+- 校验框架:`Validation`
+- 分布式文件存储:兼容`MinIO`及多个云对象存储,如阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS等
+- 工具类框架:`Hutool`、`Lombok`
+- 接口文档:`Knife4j`
+- 项目构建:`Maven`
+
+## 二 环境要求
+
+### 2.1 开发环境
+
+| 类目 | 版本说明或建议 |
+| --- |------------------|
+| 硬件 | 开发电脑建议使用I3及以上CPU,16G及以上内存 |
+| 操作系统 | Windows 10/11,MacOS |
+| JDK | 默认使用JDK 21,如需要切换JDK 8/11/17版本请参考文档调整代码,推荐使用 `OpenJDK`,如 `Liberica JDK`、`Eclipse Temurin`、`Alibaba Dragonwell`、`BiSheng` 等发行版; |
+| Maven | 依赖管理工具,推荐使用 `3.6.3` 及以上版本 |
+| Redis | 数据缓存,推荐使用 `5.0` 及以上版本 |
+| 数据库 | 兼容 `MySQL 5.7.x/8.x`、`SQLServer 2012+`、`Oracle 11g`、`PostgreSQL 12+`、`达梦数据库(DM8)`、`人大金仓数据库(KingbaseES_V8R6)` |
+| IDE | 代码集成开发环境,推荐使用 `IDEA2024` 及以上版本,兼容 `Eclipse`、 `Spring Tool Suite` 等IDE工具 |
+| 文件存储 | 默认使用本地存储,兼容 `MinIO` 及多个云对象存储,如 `阿里云 OSS`、`华为云 OBS`、`七牛云 Kodo`、`腾讯云 COS` 等; |
+
+### 2.2 运行环境
+
+> 适用于测试或生产环境
+
+| 类目 | 版本说明或建议 |
+| --- |--------------|
+| 服务器配置 | 建议至少在 `4C/16G/50G` 的机器配置下运行; |
+| 操作系统 | 建议使用 `Windows Server 2019` 及以上版本或主流 `Linux` 发行版本,推荐使用 `Linux` 环境;兼容 `统信UOS`,`OpenEuler`,`麒麟服务器版` 等信创环境; |
+| JRE | 默认使用JRE 21,如需要切换JRE 8/11/17版本请参考文档调整代码;推荐使用 `OpenJDK`,如 `Liberica JDK`、`Eclipse Temurin`、`Alibaba Dragonwell`、`BiSheng` 等发行版; |
+| Redis | 数据缓存,推荐使用 `5.0` 及以上版本 |
+| 数据库 | 兼容 `MySQL 5.7.x/8.x`、`SQLServer 2012+`、`Oracle 11g`、`PostgreSQL 12+`、`达梦数据库(DM8)`、`人大金仓数据库(KingbaseES_V8R6)` |
+| 中间件(兼容)) | 东方通 `Tong-web`、金蝶天燕-应用服务器`AAS` v10; |
+| 文件存储 | 默认使用本地存储,兼容 `MinIO` 及多个云对象存储,如 `阿里云 OSS`、`华为云 OBS`、`七牛云 Kodo`、`腾讯云 COS` 等; |
+
+## 三 IDEA插件
+
+- `Lombok`(必须)
+- `Alibaba Java Coding Guidelines`
+- `MybatisX`
+
+## 四 Maven私服配置
+
+> 建议使用 Apache Maven 3.6.3 及以上版本
以解决依赖无法从公共Maven仓库下载的问题
通过官方私服下载依赖完成后,由于IDEA的缓存可能会出现部分报红,重启IDEA即可
+
+打开Maven安装目录中的 `conf/settings.xml` 文件,
+在 `` 中添加如下内容
+
+```xml
+
+ maven-releases
+ admin
+ admin123
+
+```
+
+在 `` 中添加
+
+```xml
+
+ maven-releases
+ *
+ maven-releases
+ http://127.0.0.1:7777/repository/maven-public/
+
+```
+
+## 五 配套项目
+
+| 项目 | 分支 | 说明 |
+| --- |---------------|-------------------|
+| **后端** | | |
+| yunzhupaas-common | v5.2.x-stable | java基础依赖项目源码 |
+| yunzhupaas-datareport | v5.2.x-stable | 报表后端项目源码 |
+| yunzhupaas-file-core-starter | v5.2.x-stable | 文件基础依赖项目源码 |
+| yunzhupaas-file-preview | v5.1.xstable | 本地文档预览项目源码 |
+| yunzhupaas-java-datareport-univer | v5.2.x-stable | Java Univer报表源码 |
+| yunzhupaas-java-datareport-univer-core | v5.2.x-stable | Java Univer报表核心依赖源码,不同销售版本交付有所差异,具体实际交付为准 |
+| yunzhupaas-java-tenant | v5.2.x-stable | 多租户后端源码,不同销售版本交付有所差异,具体实际交付为准 |
+| yunzhupaas-scheduletask | v5.2.x-stable | 任务调度客户端依赖及服务端项目源码 |
+| yunzhupaas-workflow | v1.0.0-stable | 流程引擎后端项目 |
+| yunzhupaas-workflow-core | v1.0.0-stable | Flowable流程引擎基础依赖,不同销售版本交付有所差异,具体实际交付为准 |
+| **前端** | | |
+| yunzhupaas-web-datareport | v5.2.x-stable | 报表前端项目源码 |
+| yunzhupaas-web-datascreen-vue3 | v5.2.x-stable | 前端大屏项目源码(Vue3) |
+| yunzhupaas-web-tenant-vue3 | v5.2.x-stable | 多租户前端项目源码(Vue3),不同销售版本交付有所差异,具体实际交付为准 |
+| yunzhupaas-web-vue3 | v5.2.x-stable | 前端主项目源码(Vue3) |
+| **移动端** | | | |
+| yunzhupaas-app-vue3 | v5.2.x-stable | 移动端项目源码(Vue3) |
+| **静态资源** | | | |
+| yunzhupaas-resources | v5.2.x-stable | 静态资源 |
+| **数据库** | | |
+| yunzhupaas-database | v5.2.x-stable | 数据库脚本或文件 |
+
+## 六 开发环境
+
+### 6.1 导入数据库脚本
+
+> 以 MySQL数据库为例
字符集:`utf8mb4`
排序规则:`utf8mb4_general_ci`
+
+#### 6.1.1 创建平台数据库
+
+在MySQL中创建 `yunzhupaas_init` 数据库,并将 `yunzhupaas-database/MySQL/yunzhupaas_db_init.sql` 方式导入。
+若需要使用纯净数据库(不含Demo示例),则以【新建查询】方式导入 `yunzhupaas_dbnull_init.sql` 。
+若有更新脚本(Update目录下),按日期顺序执行更新
+
+#### 6.1.2 创建系统调度数据库
+
+在MySQL创建 `yunzhupaas_xxjob` 数据库,并将 `yunzhupaas-database/MySQL/yunzhupaas_xxjob_init.sql` 导入;
+
+#### 6.1.3 创建流程数据库
+
+在MySQL创建 `yunzhupaas_flow` 数据库,并将 `yunzhupaas-database/MySQL/yunzhupaas_flow_init.sql` 导入;
+
+### 6.2 导入依赖
+
+#### 6.2.1 基础依赖
+
+详见 `yunzhupaas-common` 项目中的 `README.md` 文档说明
+
+#### 6.2.2 文件基础依赖
+
+详见 `yunzhupaas-file-starter` 项目中的 `README.md` 文档说明
+
+#### 6.2.3 导入系统调度服务端
+
+详见 `yunzhupaas-scheduletask` 项目中的 `README.md` 文档说明
+
+### 6.3 配套项目
+
+#### 6.3.1 yunzhupaas-datareport 报表后端项目
+
+详见 `yunzhupaas-datareport` 项目中的 `README.md` 文档说明
+
+#### 6.3.2 yunzhupaas-java-datareport-univer Java Univer报表后端项目
+
+详见 `yunzhupaas-java-datareport-univer` 项目中的 `README.md` 文档说明
+
+#### 6.3.3 yunzhupaas-workflow 工作流引擎后端项目
+
+详见 `yunzhupaas-workflow` 项目中的 `README.md` 文档说明
+
+### 6.4 项目配置
+
+打开编辑 `yunzhupaas-admin/src/main/resources/application.yml`
+
+#### 6.4.1 指定环境配置
+
+环境说明:
+
+- `application-dev.yml` 开发环境(默认)
+- `application-test.yml` 测试环境
+- `application-preview.yml` 预发布环境
+- `application-prod.yml` 生产环境
+
+> 以开发环境为例,根据实际需求修改
+
+```yaml
+# application.yml第6行,可选值:dev(开发环境-默认)、test(测试环境)、preview(预生产)、prod(生产环境)
+active: dev
+```
+
+#### 6.4.2 配置域名
+
+打开编辑 `yunzhupaas-admin/src/main/resources/application.yml` ,修改以下配置
+
+```yaml
+ PreviewType: kkfile #文件预览方式 (1.yozo 2.kkfile)默认使用kkfile
+ kkFileUrl: http://127.0.0.1:30090/FileServer/ #kkfile文件预览服务地址
+ ApiDomain: http://127.0.0.1:30000 #后端域名(文档预览中使用)
+ FrontDomain: http://127.0.0.1:3000 #前端域名(文档预览中使用)
+ AppDomain: http://127.0.0.1:8080 #app/h5端域名配置(文档预览中使用)
+ FlowDomain: http://127.0.0.1:31000 #流程引擎接口地址
+```
+
+#### 6.4.3 数据源配置
+
+配置参数说明:
+
+- `db-type`:数据库类型(可选值:`MySQL`、`SQLServer`、`Oracle`、`PostgreSQL`、`DM`、`KingbaseES`)
+- `host`:数据库主机地址
+- `port`:数据库端口
+- `dbname`:平台初始库
+- `username`:数据库用户名
+- `password`:数据库密码
+- `db-schema`:数据库模式
+- `prepare-url`:自定义JDBC连接配置
+
+打开编辑 `yunzhupaas-admin/src/main/resources/application-dev.yml`,修改以下配置
+
+##### 6.4.3.1 MySQL数据库
+
+```yaml
+ datasource:
+ db-type: MySQL
+ host: 127.0.0.1
+ port: 3306
+ db-name: yunzhupaas_init
+ username: dbuser
+ password: dbpasswd
+ db-schema:
+ prepare-url:
+```
+
+##### 6.4.3.2 SQLServer数据库
+
+```yaml
+ datasource:
+ db-type: SQLServer
+ host: 127.0.0.1
+ port: 1433
+ db-name: yunzhupaas_init
+ username: dbuser
+ password: dbpasswd
+ db-schema:
+ prepare-url:
+```
+
+##### 6.4.3.3 Oracle数据库
+
+```yaml
+ datasource:
+ db-type: Oracle
+ host: 127.0.0.1
+ port: 1521
+ db-name:
+ username: YUNZHUPAAS_INIT
+ password: dbpasswd
+ db-schema:
+ prepare-url: jdbc:oracle:thin:@127.0.0.1:1521:ORCL
+```
+
+##### 6.4.3.4 PostgreSQL数据库配置
+
+```yaml
+ datasource:
+ db-type: PostgreSQL
+ host: 127.0.0.1
+ port: 5432
+ db-name: yunzhupaas_init
+ username: dbuser
+ password: dbpasswd
+ db-schema: public
+ prepare-url:
+```
+
+##### 6.4.3.5 达梦(DM8)数据库
+
+```yaml
+ datasource:
+ db-type: DM
+ host: 127.0.0.1
+ port: 5236
+ db-name: YUNZHUPAAS_INIT
+ username: DBUSER
+ password: dbpasswd
+ db-schema:
+ prepare-url:
+ tablespace: MAIN
+```
+
+##### 6.4.3.6 人大金仓(KingbaseES_V8R6)数据库
+
+```yaml
+ datasource:
+ db-type: KingbaseES
+ host: 127.0.0.1
+ port: 54321
+ db-name: yunzhupaas_init
+ username: dbuser
+ password: dbpasswd
+ db-schema:
+ prepare-url:
+```
+
+#### 6.4.4 Redis配置
+
+打开编辑 `yunzhupaas-admin/src/main/resources/application-dev.yml`,修改以下配置
+> 支持单机模式和集群模式,配置默认为单机模式
+
+**若使用Redis单机模式**
+
+```yaml
+ redis:
+ database: 1 #缓存库编号
+ host: 127.0.0.1
+ port: 6379
+ password: 123456 # 密码为空时,请将本行注释
+ timeout: 3000 #超时时间(单位:秒)
+ lettuce: #Lettuce为Redis的Java驱动包
+ pool:
+ max-active: 8 # 连接池最大连接数
+ max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ min-idle: 0 # 连接池中的最小空闲连接
+ max-idle: 8 # 连接池中的最大空闲连接
+```
+
+**若使用Redis集群模式**
+
+```yaml
+ redis:
+ cluster:
+ nodes:
+ - 192.168.0.225:6380
+ - 192.168.0.225:6381
+ - 192.168.0.225:6382
+ - 192.168.0.225:6383
+ - 192.168.0.225:6384
+ - 192.168.0.225:6385
+ password: 123456 # 密码为空时,请将本行注释
+ timeout: 3000 # 超时时间(单位:秒)
+ lettuce: #Lettuce为Redis的Java驱动包
+ pool:
+ max-active: 8 # 连接池最大连接数
+ max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ min-idle: 0 # 连接池中的最小空闲连接
+ max-idle: 8 # 连接池中的最大空闲连接
+```
+
+#### 6.4.5 静态资源配置
+
+打开编辑 `yunzhupaas-admin/src/main/resources/application-dev.yml` ,修改以下配置
+> 默认使用本地存储,兼容 `MinIO` 及多个云对象存储,如阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS等
+
+```yaml
+ # ===================== 文件存储配置 =====================
+ file-storage: #文件存储配置,不使用的情况下可以不写
+ default-platform: local-plus-1 #默认使用的存储平台
+ thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】
+ local-plus: # 本地存储升级版
+ - platform: local-plus-1 # 存储平台标识
+ enable-storage: true #启用存储
+ enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高)
+ domain: "" # 访问域名,例如:“http://127.0.0.1:8030/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名
+ base-path: D:/project/yunzhupaas-resources/ # 基础路径
+ path-patterns: /** # 访问路径
+ storage-path: # 存储路径
+ aliyun-oss: # 阿里云 OSS ,不使用的情况下可以不写
+ - platform: aliyun-oss-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ end-point: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/
+ base-path: hy/ # 基础路径
+ qiniu-kodo: # 七牛云 kodo ,不使用的情况下可以不写
+ - platform: qiniu-kodo-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:http://abc.hn-bkt.clouddn.com/
+ base-path: base/ # 基础路径
+ tencent-cos: # 腾讯云 COS
+ - platform: tencent-cos-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ secret-id: ??
+ secret-key: ??
+ region: ?? #存仓库所在地域
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.cos.ap-nanjing.myqcloud.com/
+ base-path: hy/ # 基础路径
+ minio: # MinIO,由于 MinIO SDK 支持 AWS S3,其它兼容 AWS S3 协议的存储平台也都可配置在这里
+ - platform: minio-1 # 存储平台标识
+ enable-storage: true # 启用存储
+ access-key: Q9jJs2b6Tv
+ secret-key: Thj2WkpLu9DhmJyJ
+ end-point: http://192.168.0.207:9000/
+ bucket-name: yunzhupaassoftoss
+ domain: # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
+ base-path: # 基础路径
+```
+
+#### 6.4.6 第三方登录配置
+
+打开编辑 `yunzhupaas-admin/src/main/resources/application-dev.yml` ,修改以下配置
+> 配置默认关闭
+
+```yaml
+socials:
+ # 第三方登录功能开关(false-关闭,true-开启)
+ socials-enabled: false
+ config:
+ - # 微信
+ provider: wechat_open
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # qq
+ provider: qq
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 企业微信
+ provider: wechat_enterprise
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 钉钉
+ provider: dingtalk
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 飞书
+ provider: feishu
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 小程序
+ provider: wechat_applets
+ client-id: your-client-id
+ client-secret: your-client-secret
+```
+#### 6.4.7 任务调度配置
+
+打开编辑 `yunzhupaas-admin/src/main/resources/application-dev.yml` ,修改以下配置,调整 xxl.job.admin.addresses 地址
+
+```yaml
+xxl:
+ job:
+ accessToken: '432e62f3b488bc861d91b0e274e850cc'
+ i18n: zh_CN
+ logretentiondays: 30
+ triggerpool:
+ fast:
+ max: 200
+ slow:
+ max: 100
+ # xxl-job服务端地址
+ admin:
+ addresses: http://127.0.0.1:30020/xxl-job-admin/
+ executor:
+ address: ''
+ appname: xxl-job-executor-sample1
+ ip: ''
+ logpath: /data/applogs/xxl-job/jobhandler
+ logretentiondays: 30
+ port: 9999
+ # rest调用xxl-job接口地址
+ admin:
+ register:
+ handle-query-address: ${xxl.job.admin.addresses}api/handler/queryList
+ job-info-address: ${xxl.job.admin.addresses}api/jobinfo
+ log-query-address: ${xxl.job.admin.addresses}api/log
+ task-list-address: ${xxl.job.admin.addresses}api/ScheduleTask/List
+ task-info-address: ${xxl.job.admin.addresses}api/ScheduleTask/getInfo
+ task-save-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-update-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/remove
+ task-start-or-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/updateTask
+```
+## 七 启动项目
+
+找到`yunzhupaas-admin/src/main/java/YunzhupaasAdminApplication.java`,右击运行即可。
+
+## 八 项目发布
+
+- 在IDEA中,双击右侧Maven中 `yunzhupaas-java-boot` > `Lifecycle` > `clean` 清理项目
+- 在IDEA中,双击右侧Maven中 `yunzhupaas-java-boot` > `Lifecycle` > `package` 打包项目
+- 打开 `yunzhupaas-java-boot\yunzhupaas-admin\target`,将 `yunzhupaas-admin-5.2.0-RELEASE.jar` 上传至服务器
+
+## 九 接口文档
+
+- `http://localhost:30000/doc.html`
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..cd9e41e
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,55 @@
+
+
+
+ com.yunzhupaas
+ yunzhupaas-common
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ com.yunzhupaas
+ yunzhupaas-java-boot
+ pom
+ 5.2.0-RELEASE
+
+
+ yunzhupaas-admin
+ yunzhupaas-oauth
+ yunzhupaas-system
+ yunzhupaas-public/yunzhupaas-common-all
+ yunzhupaas-example
+ yunzhupaas-extend
+ yunzhupaas-visualdev
+
+ yunzhupaas-file
+ yunzhupaas-exception
+ yunzhupaas-visualdata
+ yunzhupaas-app
+ yunzhupaas-permission
+ yunzhupaas-scheduletask
+ yunzhupaas-message
+ yunzhupaas-public/yunzhupaas-provider
+ yunzhupaas-public/yunzhupaas-generater-base
+ yunzhupaas-flowable
+ yunzhupaas-train
+ yunzhupaas-mdm
+ yunzhupaas-crm
+ yunzhupaas-pcm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/security/java.security b/security/java.security
new file mode 100644
index 0000000..5c1d5ce
--- /dev/null
+++ b/security/java.security
@@ -0,0 +1,1304 @@
+#
+# This is the "master security properties file".
+#
+# An alternate java.security properties file may be specified
+# from the command line via the system property
+#
+# -Djava.security.properties=
+#
+# This properties file appends to the master security properties file.
+# If both properties files specify values for the same key, the value
+# from the command-line properties file is selected, as it is the last
+# one loaded.
+#
+# Also, if you specify
+#
+# -Djava.security.properties== (2 equals),
+#
+# then that properties file completely overrides the master security
+# properties file.
+#
+# To disable the ability to specify an additional properties file from
+# the command line, set the key security.overridePropertiesFile
+# to false in the master security properties file. It is set to true
+# by default.
+
+# In this file, various security properties are set for use by
+# java.security classes. This is where users can statically register
+# Cryptography Package Providers ("providers" for short). The term
+# "provider" refers to a package or set of packages that supply a
+# concrete implementation of a subset of the cryptography aspects of
+# the Java Security API. A provider may, for example, implement one or
+# more digital signature algorithms or message digest algorithms.
+#
+# Each provider must implement a subclass of the Provider class.
+# To register a provider in this master security properties file,
+# specify the Provider subclass name and priority in the format
+#
+# security.provider.=
+#
+# This declares a provider, and specifies its preference
+# order n. The preference order is the order in which providers are
+# searched for requested algorithms (when no specific provider is
+# requested). The order is 1-based; 1 is the most preferred, followed
+# by 2, and so on.
+#
+# must specify the subclass of the Provider class whose
+# constructor sets the values of various properties that are required
+# for the Java Security API to look up the algorithms or other
+# facilities implemented by the provider.
+#
+# There must be at least one provider specification in java.security.
+# There is a default provider that comes standard with the JDK. It
+# is called the "SUN" provider, and its Provider subclass
+# named Sun appears in the sun.security.provider package. Thus, the
+# "SUN" provider is registered via the following:
+#
+# security.provider.1=sun.security.provider.Sun
+#
+# (The number 1 is used for the default provider.)
+#
+# Note: Providers can be dynamically registered instead by calls to
+# either the addProvider or insertProviderAt method in the Security
+# class.
+
+#
+# List of providers and their preference orders (see above):
+#
+security.provider.1=sun.security.provider.Sun
+security.provider.2=sun.security.rsa.SunRsaSign
+security.provider.3=sun.security.ec.SunEC
+security.provider.4=com.sun.net.ssl.internal.ssl.Provider
+security.provider.5=com.sun.crypto.provider.SunJCE
+security.provider.6=sun.security.jgss.SunProvider
+security.provider.7=com.sun.security.sasl.Provider
+security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
+security.provider.9=sun.security.smartcardio.SunPCSC
+
+#
+# Sun Provider SecureRandom seed source.
+#
+# Select the primary source of seed data for the "SHA1PRNG" and
+# "NativePRNG" SecureRandom implementations in the "Sun" provider.
+# (Other SecureRandom implementations might also use this property.)
+#
+# On Unix-like systems (for example, Solaris/Linux/MacOS), the
+# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from
+# special device files such as file:/dev/random.
+#
+# On Windows systems, specifying the URLs "file:/dev/random" or
+# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding
+# mechanism for SHA1PRNG.
+#
+# By default, an attempt is made to use the entropy gathering device
+# specified by the "securerandom.source" Security property. If an
+# exception occurs while accessing the specified URL:
+#
+# SHA1PRNG:
+# the traditional system/thread activity algorithm will be used.
+#
+# NativePRNG:
+# a default value of /dev/random will be used. If neither
+# are available, the implementation will be disabled.
+# "file" is the only currently supported protocol type.
+#
+# The entropy gathering device can also be specified with the System
+# property "java.security.egd". For example:
+#
+# % java -Djava.security.egd=file:/dev/random MainClass
+#
+# Specifying this System property will override the
+# "securerandom.source" Security property.
+#
+# In addition, if "file:/dev/random" or "file:/dev/urandom" is
+# specified, the "NativePRNG" implementation will be more preferred than
+# SHA1PRNG in the Sun provider.
+#
+securerandom.source=file:/dev/random
+
+#
+# A list of known strong SecureRandom implementations.
+#
+# To help guide applications in selecting a suitable strong
+# java.security.SecureRandom implementation, Java distributions should
+# indicate a list of known strong implementations using the property.
+#
+# This is a comma-separated list of algorithm and/or algorithm:provider
+# entries.
+#
+securerandom.strongAlgorithms=NativePRNGBlocking:SUN
+
+#
+# Class to instantiate as the javax.security.auth.login.Configuration
+# provider.
+#
+login.configuration.provider=sun.security.provider.ConfigFile
+
+#
+# Default login configuration file
+#
+#login.config.url.1=file:${user.home}/.java.login.config
+
+#
+# Class to instantiate as the system Policy. This is the name of the class
+# that will be used as the Policy object.
+#
+policy.provider=sun.security.provider.PolicyFile
+
+# The default is to have a single system-wide policy file,
+# and a policy file in the user's home directory.
+policy.url.1=file:${java.home}/lib/security/java.policy
+policy.url.2=file:${user.home}/.java.policy
+
+# whether or not we expand properties in the policy file
+# if this is set to false, properties (${...}) will not be expanded in policy
+# files.
+policy.expandProperties=true
+
+# whether or not we allow an extra policy to be passed on the command line
+# with -Djava.security.policy=somefile. Comment out this line to disable
+# this feature.
+policy.allowSystemProperty=true
+
+# whether or not we look into the IdentityScope for trusted Identities
+# when encountering a 1.1 signed JAR file. If the identity is found
+# and is trusted, we grant it AllPermission.
+policy.ignoreIdentityScope=false
+
+#
+# Default keystore type.
+#
+keystore.type=jks
+
+#
+# Controls compatibility mode for the JKS keystore type.
+#
+# When set to 'true', the JKS keystore type supports loading
+# keystore files in either JKS or PKCS12 format. When set to 'false'
+# it supports loading only JKS keystore files.
+#
+keystore.type.compat=true
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageAccess unless the
+# corresponding RuntimePermission ("accessClassInPackage."+package) has
+# been granted.
+package.access=sun.,\
+ com.sun.xml.internal.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+ com.sun.media.sound.,\
+ com.sun.naming.internal.,\
+ com.sun.proxy.,\
+ com.sun.corba.se.,\
+ com.sun.org.apache.bcel.internal.,\
+ com.sun.org.apache.regexp.internal.,\
+ com.sun.org.apache.xerces.internal.,\
+ com.sun.org.apache.xpath.internal.,\
+ com.sun.org.apache.xalan.internal.extensions.,\
+ com.sun.org.apache.xalan.internal.lib.,\
+ com.sun.org.apache.xalan.internal.res.,\
+ com.sun.org.apache.xalan.internal.templates.,\
+ com.sun.org.apache.xalan.internal.utils.,\
+ com.sun.org.apache.xalan.internal.xslt.,\
+ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
+ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
+ com.sun.org.apache.xalan.internal.xsltc.trax.,\
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.resolver.helpers.,\
+ com.sun.org.apache.xml.internal.resolver.readers.,\
+ com.sun.org.apache.xml.internal.security.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+ com.sun.org.apache.xml.internal.utils.,\
+ com.sun.org.glassfish.,\
+ com.oracle.xmlns.internal.,\
+ com.oracle.webservices.internal.,\
+ oracle.jrockit.jfr.,\
+ org.jcp.xml.dsig.internal.,\
+ jdk.internal.,\
+ jdk.nashorn.internal.,\
+ jdk.nashorn.tools.,\
+ jdk.xml.internal.,\
+ com.sun.activation.registries.,\
+ jdk.jfr.events.,\
+ jdk.jfr.internal.,\
+ jdk.management.jfr.internal.
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageDefinition unless the
+# corresponding RuntimePermission ("defineClassInPackage."+package) has
+# been granted.
+#
+# by default, none of the class loaders supplied with the JDK call
+# checkPackageDefinition.
+#
+package.definition=sun.,\
+ com.sun.xml.internal.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+ com.sun.media.sound.,\
+ com.sun.naming.internal.,\
+ com.sun.proxy.,\
+ com.sun.corba.se.,\
+ com.sun.org.apache.bcel.internal.,\
+ com.sun.org.apache.regexp.internal.,\
+ com.sun.org.apache.xerces.internal.,\
+ com.sun.org.apache.xpath.internal.,\
+ com.sun.org.apache.xalan.internal.extensions.,\
+ com.sun.org.apache.xalan.internal.lib.,\
+ com.sun.org.apache.xalan.internal.res.,\
+ com.sun.org.apache.xalan.internal.templates.,\
+ com.sun.org.apache.xalan.internal.utils.,\
+ com.sun.org.apache.xalan.internal.xslt.,\
+ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
+ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
+ com.sun.org.apache.xalan.internal.xsltc.trax.,\
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.resolver.helpers.,\
+ com.sun.org.apache.xml.internal.resolver.readers.,\
+ com.sun.org.apache.xml.internal.security.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+ com.sun.org.apache.xml.internal.utils.,\
+ com.sun.org.glassfish.,\
+ com.oracle.xmlns.internal.,\
+ com.oracle.webservices.internal.,\
+ oracle.jrockit.jfr.,\
+ org.jcp.xml.dsig.internal.,\
+ jdk.internal.,\
+ jdk.nashorn.internal.,\
+ jdk.nashorn.tools.,\
+ jdk.xml.internal.,\
+ com.sun.activation.registries.,\
+ jdk.jfr.events.,\
+ jdk.jfr.internal.,\
+ jdk.management.jfr.internal.
+
+#
+# Determines whether this properties file can be appended to
+# or overridden on the command line via -Djava.security.properties
+#
+security.overridePropertiesFile=true
+
+#
+# Determines the default key and trust manager factory algorithms for
+# the javax.net.ssl package.
+#
+ssl.KeyManagerFactory.algorithm=SunX509
+ssl.TrustManagerFactory.algorithm=PKIX
+
+#
+# The Java-level namelookup cache policy for successful lookups:
+#
+# any negative value: caching forever
+# any positive value: the number of seconds to cache an address for
+# yunzhupaas: do not cache
+#
+# default value is forever (FOREVER). For security reasons, this
+# caching is made forever when a security manager is set. When a security
+# manager is not set, the default behavior in this implementation
+# is to cache for 30 seconds.
+#
+# NOTE: setting this to anything other than the default value can have
+# serious security implications. Do not set it unless
+# you are sure you are not exposed to DNS spoofing attack.
+#
+#networkaddress.cache.ttl=-1
+
+# The Java-level namelookup cache policy for failed lookups:
+#
+# any negative value: cache forever
+# any positive value: the number of seconds to cache negative lookup results
+# yunzhupaas: do not cache
+#
+# In some Microsoft Windows networking environments that employ
+# the WINS name service in addition to DNS, name service lookups
+# that fail may take a noticeably long time to return (approx. 5 seconds).
+# For this reason the default caching policy is to maintain these
+# results for 10 seconds.
+#
+#
+networkaddress.cache.negative.ttl=10
+
+#
+# Properties to configure OCSP for certificate revocation checking
+#
+
+# Enable OCSP
+#
+# By default, OCSP is not used for certificate revocation checking.
+# This property enables the use of OCSP when set to the value "true".
+#
+# NOTE: SocketPermission is required to connect to an OCSP responder.
+#
+# Example,
+# ocsp.enable=true
+
+#
+# Location of the OCSP responder
+#
+# By default, the location of the OCSP responder is determined implicitly
+# from the certificate being validated. This property explicitly specifies
+# the location of the OCSP responder. The property is used when the
+# Authority Information Access extension (defined in RFC 5280) is absent
+# from the certificate or when it requires overriding.
+#
+# Example,
+# ocsp.responderURL=http://ocsp.example.net:80
+
+#
+# Subject name of the OCSP responder's certificate
+#
+# By default, the certificate of the OCSP responder is that of the issuer
+# of the certificate being validated. This property identifies the certificate
+# of the OCSP responder when the default does not apply. Its value is a string
+# distinguished name (defined in RFC 2253) which identifies a certificate in
+# the set of certificates supplied during cert path validation. In cases where
+# the subject name alone is not sufficient to uniquely identify the certificate
+# then both the "ocsp.responderCertIssuerName" and
+# "ocsp.responderCertSerialNumber" properties must be used instead. When this
+# property is set then those two properties are ignored.
+#
+# Example,
+# ocsp.responderCertSubjectName="CN=OCSP Responder, O=XYZ Corp"
+
+#
+# Issuer name of the OCSP responder's certificate
+#
+# By default, the certificate of the OCSP responder is that of the issuer
+# of the certificate being validated. This property identifies the certificate
+# of the OCSP responder when the default does not apply. Its value is a string
+# distinguished name (defined in RFC 2253) which identifies a certificate in
+# the set of certificates supplied during cert path validation. When this
+# property is set then the "ocsp.responderCertSerialNumber" property must also
+# be set. When the "ocsp.responderCertSubjectName" property is set then this
+# property is ignored.
+#
+# Example,
+# ocsp.responderCertIssuerName="CN=Enterprise CA, O=XYZ Corp"
+
+#
+# Serial number of the OCSP responder's certificate
+#
+# By default, the certificate of the OCSP responder is that of the issuer
+# of the certificate being validated. This property identifies the certificate
+# of the OCSP responder when the default does not apply. Its value is a string
+# of hexadecimal digits (colon or space separators may be present) which
+# identifies a certificate in the set of certificates supplied during cert path
+# validation. When this property is set then the "ocsp.responderCertIssuerName"
+# property must also be set. When the "ocsp.responderCertSubjectName" property
+# is set then this property is ignored.
+#
+# Example,
+# ocsp.responderCertSerialNumber=2A:FF:00
+
+#
+# Policy for failed Kerberos KDC lookups:
+#
+# When a KDC is unavailable (network error, service failure, etc), it is
+# put inside a blacklist and accessed less often for future requests. The
+# value (case-insensitive) for this policy can be:
+#
+# tryLast
+# KDCs in the blacklist are always tried after those not on the list.
+#
+# tryLess[:max_retries,timeout]
+# KDCs in the blacklist are still tried by their order in the configuration,
+# but with smaller max_retries and timeout values. max_retries and timeout
+# are optional numerical parameters (default 1 and 5000, which means once
+# and 5 seconds). Please notes that if any of the values defined here is
+# more than what is defined in krb5.conf, it will be ignored.
+#
+# Whenever a KDC is detected as available, it is removed from the blacklist.
+# The blacklist is reset when krb5.conf is reloaded. You can add
+# refreshKrb5Config=true to a JAAS configuration file so that krb5.conf is
+# reloaded whenever a JAAS authentication is attempted.
+#
+# Example,
+# krb5.kdc.bad.policy = tryLast
+# krb5.kdc.bad.policy = tryLess:2,2000
+krb5.kdc.bad.policy = tryLast
+
+#
+# Kerberos cross-realm referrals (RFC 6806)
+#
+# OpenJDK's Kerberos client supports cross-realm referrals as defined in
+# RFC 6806. This allows to setup more dynamic environments in which clients
+# do not need to know in advance how to reach the realm of a target principal
+# (either a user or service).
+#
+# When a client issues an AS or a TGS request, the "canonicalize" option
+# is set to announce support of this feature. A KDC server may fulfill the
+# request or reply referring the client to a different one. If referred,
+# the client will issue a new request and the cycle repeats.
+#
+# In addition to referrals, the "canonicalize" option allows the KDC server
+# to change the client name in response to an AS request. For security reasons,
+# RFC 6806 (section 11) FAST scheme is enforced.
+#
+# Disable Kerberos cross-realm referrals. Value may be overwritten with a
+# System property (-Dsun.security.krb5.disableReferrals).
+sun.security.krb5.disableReferrals=false
+
+# Maximum number of AS or TGS referrals to avoid infinite loops. Value may
+# be overwritten with a System property (-Dsun.security.krb5.maxReferrals).
+sun.security.krb5.maxReferrals=5
+
+#
+# This property contains a list of disabled EC Named Curves that can be included
+# in the jdk.[tls|certpath|jar].disabledAlgorithms properties. To include this
+# list in any of the disabledAlgorithms properties, add the property name as
+# an entry.
+jdk.disabled.namedCurves = secp112r1, secp112r2, secp128r1, secp128r2, \
+ secp160k1, secp160r1, secp160r2, secp192k1, secp192r1, secp224k1, \
+ secp224r1, secp256k1, sect113r1, sect113r2, sect131r1, sect131r2, \
+ sect163k1, sect163r1, sect163r2, sect193r1, sect193r2, sect233k1, \
+ sect233r1, sect239k1, sect283k1, sect283r1, sect409k1, sect409r1, \
+ sect571k1, sect571r1, X9.62 c2tnb191v1, X9.62 c2tnb191v2, \
+ X9.62 c2tnb191v3, X9.62 c2tnb239v1, X9.62 c2tnb239v2, X9.62 c2tnb239v3, \
+ X9.62 c2tnb359v1, X9.62 c2tnb431r1, X9.62 prime192v2, X9.62 prime192v3, \
+ X9.62 prime239v1, X9.62 prime239v2, X9.62 prime239v3, brainpoolP256r1, \
+ brainpoolP320r1, brainpoolP384r1, brainpoolP512r1
+
+#
+# Algorithm restrictions for certification path (CertPath) processing
+#
+# In some environments, certain algorithms or key lengths may be undesirable
+# for certification path building and validation. For example, "MD2" is
+# generally no longer considered to be a secure hash algorithm. This section
+# describes the mechanism for disabling algorithms based on algorithm name
+# and/or key length. This includes algorithms used in certificates, as well
+# as revocation information such as CRLs and signed OCSP Responses.
+# The syntax of the disabled algorithm string is described as follows:
+# DisabledAlgorithms:
+# " DisabledAlgorithm { , DisabledAlgorithm } "
+#
+# DisabledAlgorithm:
+# AlgorithmName [Constraint] { '&' Constraint } | IncludeProperty
+#
+# AlgorithmName:
+# (see below)
+#
+# Constraint:
+# KeySizeConstraint | CAConstraint | DenyAfterConstraint |
+# UsageConstraint
+#
+# KeySizeConstraint:
+# keySize Operator KeyLength
+#
+# Operator:
+# <= | < | == | != | >= | >
+#
+# KeyLength:
+# Integer value of the algorithm's key length in bits
+#
+# CAConstraint:
+# jdkCA
+#
+# DenyAfterConstraint:
+# denyAfter YYYY-MM-DD
+#
+# UsageConstraint:
+# usage [TLSServer] [TLSClient] [SignedJAR]
+#
+# IncludeProperty:
+# include
+#
+# The "AlgorithmName" is the standard algorithm name of the disabled
+# algorithm. See "Java Cryptography Architecture Standard Algorithm Name
+# Documentation" for information about Standard Algorithm Names. Matching
+# is performed using a case-insensitive sub-element matching rule. (For
+# example, in "SHA1withECDSA" the sub-elements are "SHA1" for hashing and
+# "ECDSA" for signatures.) If the assertion "AlgorithmName" is a
+# sub-element of the certificate algorithm name, the algorithm will be
+# rejected during certification path building and validation. For example,
+# the assertion algorithm name "DSA" will disable all certificate algorithms
+# that rely on DSA, such as NONEwithDSA, SHA1withDSA. However, the assertion
+# will not disable algorithms related to "ECDSA".
+#
+# The "IncludeProperty" allows a implementation-defined security property that
+# can be included in the disabledAlgorithms properties. These properties are
+# to help manage common actions easier across multiple disabledAlgorithm
+# properties.
+# There is one defined security property: jdk.disabled.namedCurves
+# See the property for more specific details.
+#
+#
+# A "Constraint" defines restrictions on the keys and/or certificates for
+# a specified AlgorithmName:
+#
+# KeySizeConstraint:
+# keySize Operator KeyLength
+# The constraint requires a key of a valid size range if the
+# "AlgorithmName" is of a key algorithm. The "KeyLength" indicates
+# the key size specified in number of bits. For example,
+# "RSA keySize <= 1024" indicates that any RSA key with key size less
+# than or equal to 1024 bits should be disabled, and
+# "RSA keySize < 1024, RSA keySize > 2048" indicates that any RSA key
+# with key size less than 1024 or greater than 2048 should be disabled.
+# This constraint is only used on algorithms that have a key size.
+#
+# CAConstraint:
+# jdkCA
+# This constraint prohibits the specified algorithm only if the
+# algorithm is used in a certificate chain that terminates at a marked
+# trust anchor in the lib/security/cacerts keystore. If the jdkCA
+# constraint is not set, then all chains using the specified algorithm
+# are restricted. jdkCA may only be used once in a DisabledAlgorithm
+# expression.
+# Example: To apply this constraint to SHA-1 certificates, include
+# the following: "SHA1 jdkCA"
+#
+# DenyAfterConstraint:
+# denyAfter YYYY-MM-DD
+# This constraint prohibits a certificate with the specified algorithm
+# from being used after the date regardless of the certificate's
+# validity. JAR files that are signed and timestamped before the
+# constraint date with certificates containing the disabled algorithm
+# will not be restricted. The date is processed in the UTC timezone.
+# This constraint can only be used once in a DisabledAlgorithm
+# expression.
+# Example: To deny usage of RSA 2048 bit certificates after Feb 3 2020,
+# use the following: "RSA keySize == 2048 & denyAfter 2020-02-03"
+#
+# UsageConstraint:
+# usage [TLSServer] [TLSClient] [SignedJAR]
+# This constraint prohibits the specified algorithm for
+# a specified usage. This should be used when disabling an algorithm
+# for all usages is not practical. 'TLSServer' restricts the algorithm
+# in TLS server certificate chains when server authentication is
+# performed. 'TLSClient' restricts the algorithm in TLS client
+# certificate chains when client authentication is performed.
+# 'SignedJAR' constrains use of certificates in signed jar files.
+# The usage type follows the keyword and more than one usage type can
+# be specified with a whitespace delimiter.
+# Example: "SHA1 usage TLSServer TLSClient"
+#
+# When an algorithm must satisfy more than one constraint, it must be
+# delimited by an ampersand '&'. For example, to restrict certificates in a
+# chain that terminate at a distribution provided trust anchor and contain
+# RSA keys that are less than or equal to 1024 bits, add the following
+# constraint: "RSA keySize <= 1024 & jdkCA".
+#
+# All DisabledAlgorithms expressions are processed in the order defined in the
+# property. This requires lower keysize constraints to be specified
+# before larger keysize constraints of the same algorithm. For example:
+# "RSA keySize < 1024 & jdkCA, RSA keySize < 2048".
+#
+# Note: The algorithm restrictions do not apply to trust anchors or
+# self-signed certificates.
+#
+# Note: This property is currently used by Oracle's PKIX implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.certpath.disabledAlgorithms=MD2, DSA, RSA keySize < 2048
+#
+#
+jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \
+ RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224, \
+ SHA1 usage SignedJAR & denyAfter 2019-01-01, \
+ include jdk.disabled.namedCurves
+
+#
+# Legacy algorithms for certification path (CertPath) processing and
+# signed JAR files.
+#
+# In some environments, a certain algorithm or key length may be undesirable
+# but is not yet disabled.
+#
+# Tools such as keytool and jarsigner may emit warnings when these legacy
+# algorithms are used. See the man pages for those tools for more information.
+#
+# The syntax is the same as the "jdk.certpath.disabledAlgorithms" and
+# "jdk.jar.disabledAlgorithms" security properties.
+#
+# Note: This property is currently used by the JDK Reference
+# implementation. It is not guaranteed to be examined and used by other
+# implementations.
+
+jdk.security.legacyAlgorithms=SHA1, \
+ RSA keySize < 2048, DSA keySize < 2048
+
+#
+# Algorithm restrictions for signed JAR files
+#
+# In some environments, certain algorithms or key lengths may be undesirable
+# for signed JAR validation. For example, "MD2" is generally no longer
+# considered to be a secure hash algorithm. This section describes the
+# mechanism for disabling algorithms based on algorithm name and/or key length.
+# JARs signed with any of the disabled algorithms or key sizes will be treated
+# as unsigned.
+#
+# The syntax of the disabled algorithm string is described as follows:
+# DisabledAlgorithms:
+# " DisabledAlgorithm { , DisabledAlgorithm } "
+#
+# DisabledAlgorithm:
+# AlgorithmName [Constraint] { '&' Constraint }
+#
+# AlgorithmName:
+# (see below)
+#
+# Constraint:
+# KeySizeConstraint | DenyAfterConstraint
+#
+# KeySizeConstraint:
+# keySize Operator KeyLength
+#
+# DenyAfterConstraint:
+# denyAfter YYYY-MM-DD
+#
+# Operator:
+# <= | < | == | != | >= | >
+#
+# KeyLength:
+# Integer value of the algorithm's key length in bits
+#
+# Note: This property is currently used by the JDK Reference
+# implementation. It is not guaranteed to be examined and used by other
+# implementations.
+#
+# See "jdk.certpath.disabledAlgorithms" for syntax descriptions.
+#
+jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
+ DSA keySize < 1024, SHA1 denyAfter 2019-01-01, \
+ include jdk.disabled.namedCurves
+
+#
+# Algorithm restrictions for Secure Socket Layer/Transport Layer Security
+# (SSL/TLS) processing
+#
+# In some environments, certain algorithms or key lengths may be undesirable
+# when using SSL/TLS. This section describes the mechanism for disabling
+# algorithms during SSL/TLS security parameters negotiation, including
+# protocol version negotiation, cipher suites selection, peer authentication
+# and key exchange mechanisms.
+#
+# Disabled algorithms will not be negotiated for SSL/TLS connections, even
+# if they are enabled explicitly in an application.
+#
+# For PKI-based peer authentication and key exchange mechanisms, this list
+# of disabled algorithms will also be checked during certification path
+# building and validation, including algorithms used in certificates, as
+# well as revocation information such as CRLs and signed OCSP Responses.
+# This is in addition to the jdk.certpath.disabledAlgorithms property above.
+#
+# See the specification of "jdk.certpath.disabledAlgorithms" for the
+# syntax of the disabled algorithm string.
+#
+# Note: The algorithm restrictions do not apply to trust anchors or
+# self-signed certificates.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
+jdk.tls.disabledAlgorithms=RC4, DES, MD5withRSA, \
+ DH keySize < 1024, EC keySize < 224, anon, NULL, \
+ include jdk.disabled.namedCurves
+
+# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
+# processing in JSSE implementation.
+#
+# In some environments, a certain algorithm may be undesirable but it
+# cannot be disabled because of its use in legacy applications. Legacy
+# algorithms may still be supported, but applications should not use them
+# as the security strength of legacy algorithms are usually not strong enough
+# in practice.
+#
+# During SSL/TLS security parameters negotiation, legacy algorithms will
+# not be negotiated unless there are no other candidates.
+#
+# The syntax of the legacy algorithms string is described as this Java
+# BNF-style:
+# LegacyAlgorithms:
+# " LegacyAlgorithm { , LegacyAlgorithm } "
+#
+# LegacyAlgorithm:
+# AlgorithmName (standard JSSE algorithm name)
+#
+# See the specification of security property "jdk.certpath.disabledAlgorithms"
+# for the syntax and description of the "AlgorithmName" notation.
+#
+# Per SSL/TLS specifications, cipher suites have the form:
+# SSL_KeyExchangeAlg_WITH_CipherAlg_MacAlg
+# or
+# TLS_KeyExchangeAlg_WITH_CipherAlg_MacAlg
+#
+# For example, the cipher suite TLS_RSA_WITH_AES_128_CBC_SHA uses RSA as the
+# key exchange algorithm, AES_128_CBC (128 bits AES cipher algorithm in CBC
+# mode) as the cipher (encryption) algorithm, and SHA-1 as the message digest
+# algorithm for HMAC.
+#
+# The LegacyAlgorithm can be one of the following standard algorithm names:
+# 1. JSSE cipher suite name, e.g., TLS_RSA_WITH_AES_128_CBC_SHA
+# 2. JSSE key exchange algorithm name, e.g., RSA
+# 3. JSSE cipher (encryption) algorithm name, e.g., AES_128_CBC
+# 4. JSSE message digest algorithm name, e.g., SHA
+#
+# See SSL/TLS specifications and "Java Cryptography Architecture Standard
+# Algorithm Name Documentation" for information about the algorithm names.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+# There is no guarantee the property will continue to exist or be of the
+# same syntax in future releases.
+#
+# Example:
+# jdk.tls.legacyAlgorithms=DH_anon, DES_CBC, SSL_RSA_WITH_RC4_128_MD5
+#
+jdk.tls.legacyAlgorithms= \
+ K_NULL, C_NULL, M_NULL, \
+ DH_anon, ECDH_anon, \
+ RC4_128, RC4_40
+
+# The pre-defined default finite field Diffie-Hellman ephemeral (DHE)
+# parameters for Transport Layer Security (SSL/TLS/DTLS) processing.
+#
+# In traditional SSL/TLS/DTLS connections where finite field DHE parameters
+# negotiation mechanism is not used, the server offers the client group
+# parameters, base generator g and prime modulus p, for DHE key exchange.
+# It is recommended to use dynamic group parameters. This property defines
+# a mechanism that allows you to specify custom group parameters.
+#
+# The syntax of this property string is described as this Java BNF-style:
+# DefaultDHEParameters:
+# DefinedDHEParameters { , DefinedDHEParameters }
+#
+# DefinedDHEParameters:
+# "{" DHEPrimeModulus , DHEBaseGenerator "}"
+#
+# DHEPrimeModulus:
+# HexadecimalDigits
+#
+# DHEBaseGenerator:
+# HexadecimalDigits
+#
+# HexadecimalDigits:
+# HexadecimalDigit { HexadecimalDigit }
+#
+# HexadecimalDigit: one of
+# 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
+#
+# Whitespace characters are ignored.
+#
+# The "DefinedDHEParameters" defines the custom group parameters, prime
+# modulus p and base generator g, for a particular size of prime modulus p.
+# The "DHEPrimeModulus" defines the hexadecimal prime modulus p, and the
+# "DHEBaseGenerator" defines the hexadecimal base generator g of a group
+# parameter. It is recommended to use safe primes for the custom group
+# parameters.
+#
+# If this property is not defined or the value is empty, the underlying JSSE
+# provider's default group parameter is used for each connection.
+#
+# If the property value does not follow the grammar, or a particular group
+# parameter is not valid, the connection will fall back and use the
+# underlying JSSE provider's default group parameter.
+#
+# Note: This property is currently used by OpenJDK's JSSE implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.tls.server.defaultDHEParameters=
+# { \
+# FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 \
+# 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD \
+# EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 \
+# E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED \
+# EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 \
+# FFFFFFFF FFFFFFFF, 2}
+
+#
+# TLS key limits on symmetric cryptographic algorithms
+#
+# This security property sets limits on algorithms key usage in TLS 1.3.
+# When the amount of data encrypted exceeds the algorithm value listed below,
+# a KeyUpdate message will trigger a key change. This is for symmetric ciphers
+# with TLS 1.3 only.
+#
+# The syntax for the property is described below:
+# KeyLimits:
+# " KeyLimit { , KeyLimit } "
+#
+# WeakKeyLimit:
+# AlgorithmName Action Length
+#
+# AlgorithmName:
+# A full algorithm transformation.
+#
+# Action:
+# KeyUpdate
+#
+# Length:
+# The amount of encrypted data in a session before the Action occurs
+# This value may be an integer value in bytes, or as a power of two, 2^29.
+#
+# KeyUpdate:
+# The TLS 1.3 KeyUpdate handshake process begins when the Length amount
+# is fulfilled.
+#
+# Note: This property is currently used by OpenJDK's JSSE implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+jdk.tls.keyLimits=AES/GCM/NoPadding KeyUpdate 2^37
+
+# Cryptographic Jurisdiction Policy defaults
+#
+# Import and export control rules on cryptographic software vary from
+# country to country. By default, the JDK provides two different sets of
+# cryptographic policy files:
+#
+# unlimited: These policy files contain no restrictions on cryptographic
+# strengths or algorithms.
+#
+# limited: These policy files contain more restricted cryptographic
+# strengths, and are still available if your country or
+# usage requires the traditional restrictive policy.
+#
+# The JDK JCE framework uses the unlimited policy files by default.
+# However the user may explicitly choose a set either by defining the
+# "crypto.policy" Security property or by installing valid JCE policy
+# jar files into the traditional JDK installation location. To better
+# support older JDK Update releases, the "crypto.policy" property is not
+# defined by default. See below for more information.
+#
+# The following logic determines which policy files are used:
+#
+# refers to the directory where the JRE was
+# installed and may be determined using the "java.home"
+# System property.
+#
+# 1. If the Security property "crypto.policy" has been defined,
+# then the following mechanism is used:
+#
+# The policy files are stored as jar files in subdirectories of
+# /lib/security/policy. Each directory contains a complete
+# set of policy files.
+#
+# The "crypto.policy" Security property controls the directory
+# selection, and thus the effective cryptographic policy.
+#
+# The default set of directories is:
+#
+# limited | unlimited
+#
+# 2. If the "crypto.policy" property is not set and the traditional
+# US_export_policy.jar and local_policy.jar files
+# (e.g. limited/unlimited) are found in the legacy
+# /lib/security directory, then the rules embedded within
+# those jar files will be used. This helps preserve compatibility
+# for users upgrading from an older installation.
+#
+# 3. If the jar files are not present in the legacy location
+# and the "crypto.policy" Security property is not defined,
+# then the JDK will use the unlimited settings (equivalent to
+# crypto.policy=unlimited)
+#
+# Please see the JCA documentation for additional information on these
+# files and formats.
+#
+# YOU ARE ADVISED TO CONSULT YOUR EXPORT/IMPORT CONTROL COUNSEL OR ATTORNEY
+# TO DETERMINE THE EXACT REQUIREMENTS.
+#
+# Please note that the JCE for Java SE, including the JCE framework,
+# cryptographic policy files, and standard JCE providers provided with
+# the Java SE, have been reviewed and approved for export as mass market
+# encryption item by the US Bureau of Industry and Security.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+#crypto.policy=unlimited
+
+#
+# The policy for the XML Signature secure validation mode. The mode is
+# enabled by setting the property "org.jcp.xml.dsig.secureValidation" to
+# true with the javax.xml.crypto.XMLCryptoContext.setProperty() method,
+# or by running the code with a SecurityManager.
+#
+# Policy:
+# Constraint {"," Constraint }
+# Constraint:
+# AlgConstraint | MaxTransformsConstraint | MaxReferencesConstraint |
+# ReferenceUriSchemeConstraint | KeySizeConstraint | OtherConstraint
+# AlgConstraint
+# "disallowAlg" Uri
+# MaxTransformsConstraint:
+# "maxTransforms" Integer
+# MaxReferencesConstraint:
+# "maxReferences" Integer
+# ReferenceUriSchemeConstraint:
+# "disallowReferenceUriSchemes" String { String }
+# KeySizeConstraint:
+# "minKeySize" KeyAlg Integer
+# OtherConstraint:
+# "noDuplicateIds" | "noRetrievalMethodLoops"
+#
+# For AlgConstraint, Uri is the algorithm URI String that is not allowed.
+# See the XML Signature Recommendation for more information on algorithm
+# URI Identifiers. For KeySizeConstraint, KeyAlg is the standard algorithm
+# name of the key type (ex: "RSA"). If the MaxTransformsConstraint,
+# MaxReferencesConstraint or KeySizeConstraint (for the same key type) is
+# specified more than once, only the last entry is enforced.
+#
+# Note: This property is currently used by the JDK Reference implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+jdk.xml.dsig.secureValidationPolicy=\
+ disallowAlg http://www.w3.org/TR/1999/REC-xslt-19991116,\
+ disallowAlg http://www.w3.org/2001/04/xmldsig-more#rsa-md5,\
+ disallowAlg http://www.w3.org/2001/04/xmldsig-more#hmac-md5,\
+ disallowAlg http://www.w3.org/2001/04/xmldsig-more#md5,\
+ maxTransforms 5,\
+ maxReferences 30,\
+ disallowReferenceUriSchemes file http https,\
+ minKeySize RSA 1024,\
+ minKeySize DSA 1024,\
+ minKeySize EC 224,\
+ noDuplicateIds,\
+ noRetrievalMethodLoops
+
+#
+# Serialization process-wide filter
+#
+# A filter, if configured, is used by java.io.ObjectInputStream during
+# deserialization to check the contents of the stream.
+# A filter is configured as a sequence of patterns, each pattern is either
+# matched against the name of a class in the stream or defines a limit.
+# Patterns are separated by ";" (semicolon).
+# Whitespace is significant and is considered part of the pattern.
+#
+# If the system property jdk.serialFilter is also specified on the command
+# line, it supersedes the security property value defined here.
+#
+# If a pattern includes a "=", it sets a limit.
+# If a limit appears more than once the last value is used.
+# Limits are checked before classes regardless of the order in the sequence of patterns.
+# If any of the limits are exceeded, the filter status is REJECTED.
+#
+# maxdepth=value - the maximum depth of a graph
+# maxrefs=value - the maximum number of internal references
+# maxbytes=value - the maximum number of bytes in the input stream
+# maxarray=value - the maximum array length allowed
+#
+# Other patterns, from left to right, match the class or package name as
+# returned from Class.getName.
+# If the class is an array type, the class or package to be matched is the element type.
+# Arrays of any number of dimensions are treated the same as the element type.
+# For example, a pattern of "!example.Foo", rejects creation of any instance or
+# array of example.Foo.
+#
+# If the pattern starts with "!", the status is REJECTED if the remaining pattern
+# is matched; otherwise the status is ALLOWED if the pattern matches.
+# If the pattern ends with ".**" it matches any class in the package and all subpackages.
+# If the pattern ends with ".*" it matches any class in the package.
+# If the pattern ends with "*", it matches any class with the pattern as a prefix.
+# If the pattern is equal to the class name, it matches.
+# Otherwise, the status is UNDECIDED.
+#
+# Primitive types are not configurable with this filter.
+#
+#jdk.serialFilter=pattern;pattern
+
+#
+# RMI Registry Serial Filter
+#
+# The filter pattern uses the same format as jdk.serialFilter.
+# This filter can override the builtin filter if additional types need to be
+# allowed or rejected from the RMI Registry or to decrease limits but not
+# to increase limits.
+# If the limits (maxdepth, maxrefs, or maxbytes) are exceeded, the object is rejected.
+#
+# The maxdepth of any array passed to the RMI Registry is set to
+# 10000. The maximum depth of the graph is set to 20.
+# These limits can be reduced via the maxarray, maxdepth limits.
+#
+#sun.rmi.registry.registryFilter=pattern;pattern
+
+#
+# Array construction of any component type, including subarrays and arrays of
+# primitives, are allowed unless the length is greater than the maxarray limit.
+# The filter is applied to each array element.
+#
+# The built-in filter allows subclasses of allowed classes and
+# can approximately be represented as the pattern:
+#
+#sun.rmi.registry.registryFilter=\
+# maxarray=1000000;\
+# maxdepth=20;\
+# java.lang.String;\
+# java.lang.Number;\
+# java.lang.reflect.Proxy;\
+# java.rmi.Remote;\
+# sun.rmi.server.UnicastRef;\
+# sun.rmi.server.RMIClientSocketFactory;\
+# sun.rmi.server.RMIServerSocketFactory;\
+# java.rmi.activation.ActivationID;\
+# java.rmi.server.UID
+#
+# RMI Distributed Garbage Collector (DGC) Serial Filter
+#
+# The filter pattern uses the same format as jdk.serialFilter.
+# This filter can override the builtin filter if additional types need to be
+# allowed or rejected from the RMI DGC.
+#
+# The builtin DGC filter can approximately be represented as the filter pattern:
+#
+#sun.rmi.transport.dgcFilter=\
+# java.rmi.server.ObjID;\
+# java.rmi.server.UID;\
+# java.rmi.dgc.VMID;\
+# java.rmi.dgc.Lease;\
+# maxdepth=5;maxarray=10000
+
+# CORBA ORBIorTypeCheckRegistryFilter
+# Type check enhancement for ORB::string_to_object processing
+#
+# An IOR type check filter, if configured, is used by an ORB during
+# an ORB::string_to_object invocation to check the veracity of the type encoded
+# in the ior string.
+#
+# The filter pattern consists of a semi-colon separated list of class names.
+# The configured list contains the binary class names of the IDL interface types
+# corresponding to the IDL stub class to be instantiated.
+# As such, a filter specifies a list of IDL stub classes that will be
+# allowed by an ORB when an ORB::string_to_object is invoked.
+# It is used to specify a white list configuration of acceptable
+# IDL stub types which may be contained in a stringified IOR
+# parameter passed as input to an ORB::string_to_object method.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+#com.sun.CORBA.ORBIorTypeCheckRegistryFilter=binary_class_name;binary_class_name
+
+#
+# JCEKS Encrypted Key Serial Filter
+#
+# This filter, if configured, is used by the JCEKS KeyStore during the
+# deserialization of the encrypted Key object stored inside a key entry.
+# If not configured or the filter result is UNDECIDED (i.e. none of the patterns
+# matches), the filter configured by jdk.serialFilter will be consulted.
+#
+# If the system property jceks.key.serialFilter is also specified, it supersedes
+# the security property value defined here.
+#
+# The filter pattern uses the same format as jdk.serialFilter. The default
+# pattern allows java.lang.Enum, java.security.KeyRep, java.security.KeyRep$Type,
+# and javax.crypto.spec.SecretKeySpec and rejects all the others.
+jceks.key.serialFilter = java.lang.Enum;java.security.KeyRep;\
+ java.security.KeyRep$Type;javax.crypto.spec.SecretKeySpec;!*
+
+#
+# PKCS12 KeyStore properties
+#
+# The following properties, if configured, are used by the PKCS12 KeyStore
+# implementation during the creation of a new keystore. Several of the
+# properties may also be used when modifying an existing keystore. The
+# properties can be overridden by a KeyStore API that specifies its own
+# algorithms and parameters.
+#
+# If an existing PKCS12 keystore is loaded and then stored, the algorithm and
+# parameter used to generate the existing Mac will be reused. If the existing
+# keystore does not have a Mac, no Mac will be created while storing. If there
+# is at least one certificate in the existing keystore, the algorithm and
+# parameters used to encrypt the last certificate in the existing keystore will
+# be reused to encrypt all certificates while storing. If the last certificate
+# in the existing keystore is not encrypted, all certificates will be stored
+# unencrypted. If there is no certificate in the existing keystore, any newly
+# added certificate will be encrypted (or stored unencrypted if algorithm
+# value is "NONE") using the "keystore.pkcs12.certProtectionAlgorithm" and
+# "keystore.pkcs12.certPbeIterationCount" values defined here. Existing private
+# and secret key(s) are not changed. Newly set private and secret key(s) will
+# be encrypted using the "keystore.pkcs12.keyProtectionAlgorithm" and
+# "keystore.pkcs12.keyPbeIterationCount" values defined here.
+#
+# In order to apply new algorithms and parameters to all entries in an
+# existing keystore, one can create a new keystore and add entries in the
+# existing keystore into the new keystore. This can be achieved by calling the
+# "keytool -importkeystore" command.
+#
+# If a system property of the same name is also specified, it supersedes the
+# security property value defined here.
+#
+# If the property is set to an illegal value,
+# an iteration count that is not a positive integer, or an unknown algorithm
+# name, an exception will be thrown when the property is used.
+# If the property is not set or empty, a default value will be used.
+#
+# Note: These properties are currently used by the JDK Reference implementation.
+# They are not guaranteed to be examined and used by other implementations.
+
+# The algorithm used to encrypt a certificate. This can be any non-Hmac PBE
+# algorithm defined in the Cipher section of the Java Security Standard
+# Algorithm Names Specification. When set to "NONE", the certificate
+# is not encrypted. The default value is "PBEWithSHA1AndRC2_40".
+#keystore.pkcs12.certProtectionAlgorithm = PBEWithSHA1AndRC2_40
+
+# The iteration count used by the PBE algorithm when encrypting a certificate.
+# This value must be a positive integer. The default value is 50000.
+#keystore.pkcs12.certPbeIterationCount = 50000
+
+# The algorithm used to encrypt a private key or secret key. This can be
+# any non-Hmac PBE algorithm defined in the Cipher section of the Java
+# Security Standard Algorithm Names Specification. The value must not be "NONE".
+# The default value is "PBEWithSHA1AndDESede".
+#keystore.pkcs12.keyProtectionAlgorithm = PBEWithSHA1AndDESede
+
+# The iteration count used by the PBE algorithm when encrypting a private key
+# or a secret key. This value must be a positive integer. The default value
+# is 50000.
+#keystore.pkcs12.keyPbeIterationCount = 50000
+
+# The algorithm used to calculate the optional MacData at the end of a PKCS12
+# file. This can be any HmacPBE algorithm defined in the Mac section of the
+# Java Security Standard Algorithm Names Specification. When set to "NONE",
+# no Mac is generated. The default value is "HmacPBESHA1".
+#keystore.pkcs12.macAlgorithm = HmacPBESHA1
+
+# The iteration count used by the MacData algorithm. This value must be a
+# positive integer. The default value is 100000.
+#keystore.pkcs12.macIterationCount = 100000
+
+# The iteration count used for password-based encryption (PBE) in JCEKS
+# keystores. Values in the range 10000 to 5000000 are considered valid.
+# If the value is out of this range, or is not a number, or is unspecified;
+# a default of 200000 is used.
+#
+# If the system property jdk.jceks.iterationCount is also specified, it
+# supersedes the security property value defined here.
+#
+#jdk.jceks.iterationCount = 200000
+
+#
+# Disabled mechanisms for the Simple Authentication and Security Layer (SASL)
+#
+# Disabled mechanisms will not be negotiated by both SASL clients and servers.
+# These mechanisms will be ignored if they are specified in the "mechanisms"
+# argument of "Sasl.createSaslClient" or the "mechanism" argument of
+# "Sasl.createSaslServer".
+#
+# The value of this property is a comma-separated list of SASL mechanisms.
+# The mechanisms are case-sensitive. Whitespaces around the commas are ignored.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.sasl.disabledMechanisms=PLAIN, CRAM-MD5, DIGEST-MD5
+jdk.sasl.disabledMechanisms=
+
+#
+# Policies for distrusting Certificate Authorities (CAs).
+#
+# This is a comma separated value of one or more case-sensitive strings, each
+# of which represents a policy for determining if a CA should be distrusted.
+# The supported values are:
+#
+#
+# SYMANTEC_TLS : Distrust TLS Server certificates anchored by a Symantec
+# root CA and issued after April 16, 2019 unless issued by one of the
+# following subordinate CAs which have a later distrust date:
+# 1. Apple IST CA 2 - G1, SHA-256 fingerprint:
+# AC2B922ECFD5E01711772FEA8ED372DE9D1E2245FCE3F57A9CDBEC77296A424B
+# Distrust after December 31, 2019.
+# 2. Apple IST CA 8 - G1, SHA-256 fingerprint:
+# A4FE7C7F15155F3F0AEF7AAA83CF6E06DEB97CA3F909DF920AC1490882D488ED
+# Distrust after December 31, 2019.
+# Leading and trailing whitespace surrounding each value are ignored.
+# Unknown values are ignored. If the property is commented out or set to the
+# empty String, no policies are enforced.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be supported by other SE implementations. Also, this
+# property does not override other security properties which can restrict
+# certificates such as jdk.tls.disabledAlgorithms or
+# jdk.certpath.disabledAlgorithms; those restrictions are still enforced even
+# if this property is not enabled.
+#
+jdk.security.caDistrustPolicies=SYMANTEC_TLS
+
+#
+# Policies for the proxy_impersonator Kerberos ccache configuration entry
+#
+# The proxy_impersonator ccache configuration entry indicates that the ccache
+# is a synthetic delegated credential for use with S4U2Proxy by an intermediate
+# server. The ccache file should also contain the TGT of this server and
+# an evidence ticket from the default principal of the ccache to this server.
+#
+# This security property determines how Java uses this configuration entry.
+# There are 3 possible values:
+#
+# no-impersonate - Ignore this configuration entry, and always act as
+# the owner of the TGT (if it exists).
+#
+# try-impersonate - Try impersonation when this configuration entry exists.
+# If no matching TGT or evidence ticket is found,
+# fallback to no-impersonate.
+#
+# always-impersonate - Always impersonate when this configuration entry exists.
+# If no matching TGT or evidence ticket is found,
+# no initial credential is read from the ccache.
+#
+# The default value is "always-impersonate".
+#
+# If a system property of the same name is also specified, it supersedes the
+# security property value defined here.
+#
+#jdk.security.krb5.default.initiate.credential=always-impersonate
+
+#
+# Trust Anchor Certificates - CA Basic Constraint check
+#
+# X.509 v3 certificates used as Trust Anchors (to validate signed code or TLS
+# connections) must have the cA Basic Constraint field set to 'true'. Also, if
+# they include a Key Usage extension, the keyCertSign bit must be set. These
+# checks, enabled by default, can be disabled for backward-compatibility
+# purposes with the jdk.security.allowNonCaAnchor System and Security
+# properties. In the case that both properties are simultaneously set, the
+# System value prevails. The default value of the property is "false".
+#
+#jdk.security.allowNonCaAnchor=true
+
+#
+# The default Character set name (java.nio.charset.Charset.forName())
+# for converting TLS ALPN values between byte arrays and Strings.
+# Prior versions of the JDK may use UTF-8 as the default charset. If
+# you experience interoperability issues, setting this property to UTF-8
+# may help.
+#
+# jdk.tls.alpnCharset=UTF-8
+jdk.tls.alpnCharset=ISO_8859_1
+
+#
+# JNDI Object Factories Filter
+#
+# This filter is used by the JNDI runtime to control the set of object factory classes
+# which will be allowed to instantiate objects from object references returned by
+# naming/directory systems. The factory class named by the reference instance will be
+# matched against this filter. The filter property supports pattern-based filter syntax
+# with the same format as jdk.serialFilter.
+#
+# Each pattern is matched against the factory class name to allow or disallow it's
+# instantiation. The access to a factory class is allowed unless the filter returns
+# REJECTED.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+# If the system property jdk.jndi.object.factoriesFilter is also specified, it supersedes
+# the security property value defined here. The default value of the property is "*".
+#
+# The default pattern value allows any object factory class specified by the reference
+# instance to recreate the referenced object.
+#jdk.jndi.object.factoriesFilter=*
diff --git a/yunzhupaas-admin/pom.xml b/yunzhupaas-admin/pom.xml
new file mode 100644
index 0000000..3e87752
--- /dev/null
+++ b/yunzhupaas-admin/pom.xml
@@ -0,0 +1,205 @@
+
+
+
+ yunzhupaas-java-boot
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+
+ 4.0.0
+ yunzhupaas-admin
+ jar
+
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+ com.yunzhupaas
+ yunzhupaas-file-controller
+ ${project.version}
+
+
+
+ com.yunzhupaas
+ yunzhupaas-extend-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-system-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-scheduletask-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-message-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-permission-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-visualdev-base-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-visualdev-onlinedev-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-visualdev-generater-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-visualdev-portal-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-visualdata-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-exception
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-oauth-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-example-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-app-controller
+ ${project.version}
+
+
+
+
+ com.yunzhupaas
+ yunzhupaas-mdm-controller
+ ${project.version}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.yunzhupaas
+ yunzhupaas-visualdev-integrate-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-flowable-controller
+ ${project.version}
+
+
+
+ com.yunzhupaas
+ yunzhupaas-train-controller
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-common-i18n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+ provided
+
+
+
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ com.yunzhupaas.AdminApplication
+ ZIP
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/AdminApplication.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/AdminApplication.java
new file mode 100644
index 0000000..b2c54e4
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/AdminApplication.java
@@ -0,0 +1,28 @@
+package com.yunzhupaas;
+
+import cn.xuyanwu.spring.file.storage.EnableFileStorage;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/15 17:12
+ */
+@SpringBootApplication(scanBasePackages = { "com.yunzhupaas" }, exclude = { DataSourceAutoConfiguration.class })
+@EnableFileStorage
+public class AdminApplication extends SpringBootServletInitializer {
+
+ public static void main(String[] args) {
+ SpringApplication springApplication = new SpringApplication(AdminApplication.class);
+ // 添加监听器
+ // springApplication.addListeners(new YunzhupaasListener());
+ springApplication.run(args);
+ System.out.println("YunzhuPaasAdmin启动完成");
+ }
+
+}
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/DataSourceBindAspect.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/DataSourceBindAspect.java
new file mode 100644
index 0000000..5d1d559
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/DataSourceBindAspect.java
@@ -0,0 +1,88 @@
+package com.yunzhupaas.aop;
+
+import cn.dev33.satoken.context.SaHolder;
+import com.yunzhupaas.base.UserInfo;
+import com.yunzhupaas.config.ConfigValueUtil;
+import com.yunzhupaas.database.util.NotTenantPluginHolder;
+import com.yunzhupaas.database.util.TenantDataSourceUtil;
+import com.yunzhupaas.util.TenantHolder;
+import com.yunzhupaas.util.StringUtil;
+import com.yunzhupaas.util.UserProvider;
+import com.yunzhupaas.util.data.DataSourceContextHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/15 17:12
+ */
+@Slf4j
+@Aspect
+@Component
+@Order(1)
+public class DataSourceBindAspect {
+
+ @Autowired
+ private ConfigValueUtil configValueUtil;
+
+ @Pointcut("within(com.yunzhupaas.*.controller.* || com.yunzhupaas.controller.*)")
+ public void bindDataSource() {
+
+ }
+
+ /**
+ * NoDataSourceBind 不需要绑定数据库的注解
+ *
+ * @param pjp
+ * @return
+ * @throws Throwable
+ */
+ @Around("bindDataSource() && !@annotation(com.yunzhupaas.util.NoDataSourceBind)")
+ public Object doAroundService(ProceedingJoinPoint pjp) throws Throwable {
+// System.out.println(SaHolder.getRequest().getRequestPath());
+ if (configValueUtil.isMultiTenancy()) {
+ if(StringUtil.isEmpty(TenantHolder.getDatasourceId())){
+ UserInfo userInfo = UserProvider.getUser();
+ String url = null;
+ try{
+ url = SaHolder.getRequest().getRequestPath();
+ }catch (Exception ee){ }
+ log.error("租户" + userInfo.getTenantId() + "数据库不存在, URL: {}, TOKEN: {}", url, userInfo.getToken());
+ return null;
+ }
+ return pjp.proceed();
+ }
+ Object obj = pjp.proceed();
+ return obj;
+ }
+
+
+ /**
+ * NoDataSourceBind 不需要绑定数据库的注解 加入不切租户库标记
+ *
+ * @param pjp
+ * @return
+ * @throws Throwable
+ */
+ @Around("bindDataSource() && @annotation(com.yunzhupaas.util.NoDataSourceBind)")
+ public Object doAroundService2(ProceedingJoinPoint pjp) throws Throwable {
+ try{
+ NotTenantPluginHolder.setNotSwitchAlwaysFlag();
+ //Filter中提前设置租户信息, 不需要切库的方法进行清除切库
+ TenantDataSourceUtil.clearLocalTenantInfo();
+ return pjp.proceed();
+ }finally {
+ NotTenantPluginHolder.clearNotSwitchAlwaysFlag();
+ }
+ }
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/MyFileAspect.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/MyFileAspect.java
new file mode 100644
index 0000000..966c959
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/MyFileAspect.java
@@ -0,0 +1,77 @@
+package com.yunzhupaas.aop;
+
+import cn.xuyanwu.spring.file.storage.FileInfo;
+import cn.xuyanwu.spring.file.storage.UploadPretreatment;
+import cn.xuyanwu.spring.file.storage.aspect.*;
+import cn.xuyanwu.spring.file.storage.platform.FileStorage;
+import cn.xuyanwu.spring.file.storage.recorder.FileRecorder;
+import com.yunzhupaas.config.ConfigValueUtil;
+import com.yunzhupaas.constant.MsgCode;
+import com.yunzhupaas.exception.DataException;
+import com.yunzhupaas.util.PdfUtil;
+import com.yunzhupaas.util.XSSEscape;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.function.Consumer;
+
+@Slf4j
+@Component
+public class MyFileAspect implements FileStorageAspect {
+
+ @Autowired
+ private ConfigValueUtil configValueUtil;
+
+ @Override
+ public FileInfo uploadAround(UploadAspectChain chain, FileInfo fileInfo, UploadPretreatment pre, FileStorage fileStorage, FileRecorder fileRecorder) {
+ checkFilePath(fileInfo);
+ if(configValueUtil.isCheckFilePdf()) {
+ try {
+ String ext = fileInfo.getExt();
+ if("pdf".equalsIgnoreCase(ext)) {
+ log.error("检测PDF文件");
+ if (PdfUtil.containsJavaScript(pre.getFileWrapper().getBytes())) {
+ throw new DataException(MsgCode.FA053.get());
+ }
+ }
+ } catch (IOException e) {
+ log.error("PDF文档解析失败: {}", e.getMessage());
+ }
+ }
+ return FileStorageAspect.super.uploadAround(chain, fileInfo, pre, fileStorage, fileRecorder);
+ }
+
+ @Override
+ public boolean deleteAround(DeleteAspectChain chain, FileInfo fileInfo, FileStorage fileStorage, FileRecorder fileRecorder) {
+ checkFilePath(fileInfo);
+ return FileStorageAspect.super.deleteAround(chain, fileInfo, fileStorage, fileRecorder);
+ }
+
+ @Override
+ public boolean existsAround(ExistsAspectChain chain, FileInfo fileInfo, FileStorage fileStorage) {
+ checkFilePath(fileInfo);
+ return FileStorageAspect.super.existsAround(chain, fileInfo, fileStorage);
+ }
+
+ @Override
+ public void downloadAround(DownloadAspectChain chain, FileInfo fileInfo, FileStorage fileStorage, Consumer consumer) {
+ checkFilePath(fileInfo);
+ FileStorageAspect.super.downloadAround(chain, fileInfo, fileStorage, consumer);
+ }
+
+ @Override
+ public void downloadThAround(DownloadThAspectChain chain, FileInfo fileInfo, FileStorage fileStorage, Consumer consumer) {
+ checkFilePath(fileInfo);
+ FileStorageAspect.super.downloadThAround(chain, fileInfo, fileStorage, consumer);
+ }
+
+ private void checkFilePath(FileInfo fileInfo){
+ //处理特殊文件名
+ fileInfo.setPath(XSSEscape.escapePath(fileInfo.getPath()));
+ fileInfo.setFilename(XSSEscape.escapePath(fileInfo.getFilename()));
+ }
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionAdminAspect.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionAdminAspect.java
new file mode 100644
index 0000000..6577da5
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionAdminAspect.java
@@ -0,0 +1,69 @@
+package com.yunzhupaas.aop;
+
+import com.yunzhupaas.constant.PermissionConstant;
+import com.yunzhupaas.permission.entity.OrganizeRelationEntity;
+import com.yunzhupaas.permission.model.authorize.SaveBatchForm;
+import com.yunzhupaas.permission.service.OrganizeRelationService;
+import com.yunzhupaas.util.PermissionAspectUtil;
+import com.yunzhupaas.util.UserProvider;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/15 17:12
+ */
+@Slf4j
+@Aspect
+@Component
+public class PermissionAdminAspect implements PermissionAdminBase{
+
+
+ /**
+ * 分级管理切点
+ */
+ @Pointcut("within(com.yunzhupaas.*.controller.*) && @annotation(com.yunzhupaas.annotation.OrganizeAdminIsTrator)")
+ public void pointcut() {
+ }
+
+ /**
+ * 分级管理切点
+ *
+ * @param pjp
+ * @return
+ * @throws Throwable
+ */
+ @Around("pointcut()")
+ public Object around(ProceedingJoinPoint pjp) throws Throwable {
+ return PermissionAdminBase.permissionCommon(pjp, this);
+ }
+
+ @Override
+ public Boolean detailPermission(ProceedingJoinPoint pjp, String operatorUserId, String methodName){
+ switch (methodName) {
+ case PermissionConstant.METHOD_SAVE:
+ case PermissionConstant.METHOD_SAVE_BATCH:
+ return true;
+ case PermissionConstant.METHOD_UPDATE:
+ //判断是否有当前组织的修改权限
+ String organizeId = String.valueOf(pjp.getArgs()[0]);
+ return PermissionAspectUtil.containPermission(organizeId, operatorUserId, methodName);
+ default:
+ return false;
+ }
+ }
+
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionAdminBase.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionAdminBase.java
new file mode 100644
index 0000000..cf067ba
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionAdminBase.java
@@ -0,0 +1,40 @@
+package com.yunzhupaas.aop;
+
+import com.yunzhupaas.base.ActionResult;
+import com.yunzhupaas.base.UserInfo;
+import com.yunzhupaas.constant.MsgCode;
+import com.yunzhupaas.util.UserProvider;
+import org.aspectj.lang.ProceedingJoinPoint;
+
+public interface PermissionAdminBase{
+
+ /**
+ * 详细的权限判断
+ * @param pjp AOP切点参数
+ * @param operatorUserId 操作者对象
+ */
+ Boolean detailPermission(ProceedingJoinPoint pjp, String operatorUserId, String methodName);
+
+ /**
+ * 管理者权限判断
+ *
+ */
+ static Object permissionCommon(ProceedingJoinPoint pjp, PermissionAdminBase permissionAdminBase) throws Throwable {
+ // 获取用户信息
+ UserInfo operatorUser = UserProvider.getUser();
+ // 是否是管理员
+ if(operatorUser.getIsAdministrator()){
+ return pjp.proceed();
+ }else {
+ // 获取方法名
+ String methodName = pjp.getSignature().getName();
+ // 具体方法权限
+ if(permissionAdminBase.detailPermission(pjp, operatorUser.getUserId(),methodName)){
+ return pjp.proceed();
+ }
+ }
+ return ActionResult.fail(MsgCode.FA021.get());
+ }
+
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionOrgAspect.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionOrgAspect.java
new file mode 100644
index 0000000..d6f12e1
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionOrgAspect.java
@@ -0,0 +1,120 @@
+package com.yunzhupaas.aop;
+
+import com.yunzhupaas.constant.PermissionConstant;
+import com.yunzhupaas.permission.entity.OrganizeEntity;
+import com.yunzhupaas.permission.model.organize.OrganizeCrForm;
+import com.yunzhupaas.permission.model.organize.OrganizeDepartCrForm;
+import com.yunzhupaas.permission.model.organize.OrganizeDepartUpForm;
+import com.yunzhupaas.permission.model.organize.OrganizeUpForm;
+import com.yunzhupaas.permission.service.OrganizeService;
+import com.yunzhupaas.util.PermissionAspectUtil;
+import com.yunzhupaas.util.UserProvider;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.StringJoiner;
+
+/**
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/15 17:12
+ */
+@Slf4j
+@Aspect
+@Component
+public class PermissionOrgAspect implements PermissionAdminBase {
+
+ @Autowired
+ private OrganizeService organizeService;
+
+ /**
+ * 分级管理切点
+ */
+ @Pointcut("within(com.yunzhupaas.*.controller.*) && @annotation(com.yunzhupaas.annotation.OrganizePermission)")
+ public void pointcut() {
+ }
+
+ /**
+ * 分级管理切点
+ *
+ * @param pjp
+ * @return
+ * @throws Throwable
+ */
+ @Around("pointcut()")
+ public Object around(ProceedingJoinPoint pjp) throws Throwable {
+ return PermissionAdminBase.permissionCommon(pjp, this);
+ }
+
+ @Override
+ public Boolean detailPermission(ProceedingJoinPoint pjp, String operatorUserId, String methodName) {
+ switch (methodName) {
+ case PermissionConstant.METHOD_CREATE:
+ return PermissionAspectUtil.getPermitByOrgIds(
+ // 操作目标对象表单对象
+ ((OrganizeCrForm) pjp.getArgs()[0]).getParentId(),
+ operatorUserId,
+ PermissionConstant.METHOD_CREATE);
+ case PermissionConstant.METHOD_CREATE_DEPARTMENT:
+ return PermissionAspectUtil.getPermitByOrgIds(
+ // 操作目标对象表单对象
+ ((OrganizeDepartCrForm) pjp.getArgs()[0]).getParentId(),
+ operatorUserId,
+ PermissionConstant.METHOD_CREATE);
+ case PermissionConstant.METHOD_UPDATE:
+ // 当前组织id
+ String orgId = (String) pjp.getArgs()[0];
+ // 当前组织父级id
+ OrganizeEntity info = organizeService.getInfo(orgId);
+ // 修改后的id
+ OrganizeUpForm organizeUpForm = (OrganizeUpForm) pjp.getArgs()[1];
+ StringJoiner stringJoiner = new StringJoiner(",");
+ stringJoiner.add(orgId);
+ if (!organizeUpForm.getParentId().equals(info.getParentId()) && !"-1".equals(info.getParentId())) {
+ stringJoiner.add(info.getParentId());
+ }
+ if (!organizeUpForm.getParentId().equals(info.getParentId()) && !"-1".equals(organizeUpForm.getParentId())) {
+ stringJoiner.add(organizeUpForm.getParentId());
+ }
+ return PermissionAspectUtil.getPermitByOrgIds(
+ // 操作目标对象ID
+ stringJoiner.toString(),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE);
+ case PermissionConstant.METHOD_UPDATE_DEPARTMENT:
+ // 当前组织id
+ String orgIds = (String) pjp.getArgs()[0];
+ // 当前组织父级id
+ OrganizeEntity infos = organizeService.getInfo(orgIds);
+ // 修改后的id
+ OrganizeDepartUpForm organizeDepartUpForm = (OrganizeDepartUpForm) pjp.getArgs()[1];
+ StringJoiner stringJoiners = new StringJoiner(",");
+ stringJoiners.add(orgIds);
+ if (!organizeDepartUpForm.getParentId().equals(infos.getParentId())) {
+ stringJoiners.add(infos.getParentId());
+ stringJoiners.add(organizeDepartUpForm.getParentId());
+ }
+ return PermissionAspectUtil.getPermitByOrgIds(
+ // 操作目标对象ID
+ stringJoiners.toString(),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE);
+ case PermissionConstant.METHOD_DELETE:
+ case PermissionConstant.METHOD_DELETE_DEPARTMENT:
+ return PermissionAspectUtil.getPermitByOrgIds(
+ // 操作目标对象ID
+ pjp.getArgs()[0].toString(),
+ operatorUserId,
+ PermissionConstant.METHOD_DELETE);
+ default:
+ return false;
+ }
+ }
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionPositionAspect.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionPositionAspect.java
new file mode 100644
index 0000000..5675f07
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionPositionAspect.java
@@ -0,0 +1,92 @@
+package com.yunzhupaas.aop;
+
+import com.yunzhupaas.constant.PermissionConstant;
+import com.yunzhupaas.permission.entity.PositionEntity;
+import com.yunzhupaas.permission.model.position.PositionCrForm;
+import com.yunzhupaas.permission.model.position.PositionUpForm;
+import com.yunzhupaas.permission.service.OrganizeService;
+import com.yunzhupaas.permission.service.PositionService;
+import com.yunzhupaas.util.PermissionAspectUtil;
+import com.yunzhupaas.util.UserProvider;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/15 17:12
+ */
+@Slf4j
+@Aspect
+@Component
+public class PermissionPositionAspect implements PermissionAdminBase{
+
+ @Autowired
+ private PositionService positionService;
+ @Autowired
+ private OrganizeService organizeService;
+
+ /**
+ * 分级管理切点
+ */
+ @Pointcut("within(com.yunzhupaas.*.controller.*) && @annotation(com.yunzhupaas.annotation.PositionPermission)")
+ public void pointcut() {
+ }
+
+ /**
+ * 分级管理切点
+ *
+ * @param pjp
+ * @return
+ * @throws Throwable
+ */
+ @Around("pointcut()")
+ public Object around(ProceedingJoinPoint pjp) throws Throwable {
+ return PermissionAdminBase.permissionCommon(pjp, this);
+ }
+
+ @Override
+ public Boolean detailPermission(ProceedingJoinPoint pjp, String operatorUserId, String methodName) {
+ switch (methodName){
+ case PermissionConstant.METHOD_CREATE:
+ return PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ ((PositionCrForm) pjp.getArgs()[0]).getOrganizeId(),
+ operatorUserId,
+ methodName);
+ case PermissionConstant.METHOD_UPDATE:
+ // 得到岗位信息后,判断是否有修改前的权限
+ PositionEntity info = positionService.getInfo(((String) pjp.getArgs()[0]));
+ if (PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ info.getOrganizeId(),
+ operatorUserId,
+ methodName)) {
+ return PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ ((PositionUpForm) pjp.getArgs()[1]).getOrganizeId(),
+ operatorUserId,
+ methodName);
+ }
+ return false;
+ case PermissionConstant.METHOD_DELETE:
+ // 获取岗位所关联的组织ID字符串
+ String positionId = String.valueOf(pjp.getArgs()[0]);
+ String orgIds = organizeService.getInfo(positionService.getInfo(positionId).getOrganizeId()).getId();
+ return PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ orgIds,
+ operatorUserId,
+ PermissionConstant.METHOD_DELETE);
+ default:
+ return false;
+ }
+ }
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionRoleAspect.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionRoleAspect.java
new file mode 100644
index 0000000..1562e0a
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionRoleAspect.java
@@ -0,0 +1,153 @@
+package com.yunzhupaas.aop;
+
+import com.yunzhupaas.constant.PermissionConstant;
+import com.yunzhupaas.permission.entity.OrganizeRelationEntity;
+import com.yunzhupaas.permission.entity.RoleEntity;
+import com.yunzhupaas.permission.model.role.RoleCrForm;
+import com.yunzhupaas.permission.model.role.RoleUpForm;
+import com.yunzhupaas.permission.service.OrganizeRelationService;
+import com.yunzhupaas.permission.service.PositionService;
+import com.yunzhupaas.permission.service.RoleService;
+import com.yunzhupaas.util.PermissionAspectUtil;
+import com.yunzhupaas.util.UserProvider;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+ * 角色操作权限
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.2.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/2/10
+ */
+@Slf4j
+@Aspect
+@Component
+public class PermissionRoleAspect implements PermissionAdminBase {
+
+ @Autowired
+ private RoleService roleService;
+ @Autowired
+ private OrganizeRelationService organizeRelationService;
+
+ /**
+ * 分级管理切点
+ */
+ @Pointcut("within(com.yunzhupaas.*.controller.*) && @annotation(com.yunzhupaas.annotation.RolePermission)")
+ public void pointcut() {
+ }
+
+ /**
+ * 分级管理切点
+ *
+ * @param pjp
+ * @return
+ * @throws Throwable
+ */
+ @Around("pointcut()")
+ public Object around(ProceedingJoinPoint pjp) throws Throwable {
+ return PermissionAdminBase.permissionCommon(pjp, this);
+ }
+
+ @Override
+ public Boolean detailPermission(ProceedingJoinPoint pjp, String operatorUserId, String methodName) {
+ boolean flag = false;
+ switch (methodName) {
+ case PermissionConstant.METHOD_CREATE:
+ RoleCrForm roleCrForm = (RoleCrForm) pjp.getArgs()[0];
+ if (!checkAdminGlobal(roleCrForm.getGlobalMark())) {
+ return PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ getOrganize(roleCrForm.getOrganizeIdsTree()),
+ operatorUserId,
+ PermissionConstant.METHOD_CREATE);
+ }
+ return true;
+ case PermissionConstant.METHOD_UPDATE:
+ RoleUpForm roleUpForm = (RoleUpForm) pjp.getArgs()[0];
+ // 非管理员情况下
+ if (!checkAdminGlobal(roleUpForm.getGlobalMark())) {
+ // 得到以前的组织id
+ String roleId = (String) pjp.getArgs()[1];
+ List relationListByRoleId = organizeRelationService.getRelationListByRoleId(roleId).stream().map(OrganizeRelationEntity::getOrganizeId).collect(Collectors.toList());
+ StringJoiner stringJoiners = new StringJoiner(",");
+ relationListByRoleId.forEach(t -> {
+ stringJoiners.add(t);
+ });
+ if (PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ stringJoiners.toString(),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE)) {
+ return PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ getOrganize(roleUpForm.getOrganizeIdsTree()),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE);
+ }
+ return false;
+ }
+ return true;
+ case PermissionConstant.METHOD_DELETE:
+ String roleId = pjp.getArgs()[0].toString();
+ RoleEntity roleEntity = roleService.getInfo(roleId);
+ // 获取角色关联的组织信息
+ List relationListByRoleId = organizeRelationService.getRelationListByRoleId(roleId);
+ StringBuilder orgId = new StringBuilder();
+ relationListByRoleId.stream().forEach(t->{
+ orgId.append(t.getOrganizeId() + ",");
+ });
+ if (roleEntity != null && !checkAdminGlobal(roleEntity.getGlobalMark())) {
+ return PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ orgId.toString(),
+ operatorUserId,
+ PermissionConstant.METHOD_DELETE);
+ }
+ return true;
+ default:
+ break;
+ }
+ return true;
+ }
+
+ /**
+ * 转成组织id字符串
+ * @param orgIdsTree
+ * @return
+ */
+ private String getOrganize(List> orgIdsTree) {
+ StringBuilder orgIds = new StringBuilder();
+ for (List list : orgIdsTree) {
+ if (list.size() > 0) {
+ String orgId = list.get(list.size() - 1);
+ orgIds.append(orgId + ",");
+ }
+ }
+ return orgIds.toString();
+ }
+
+ /**
+ * 全局角色只能超管来操作
+ *
+ * @param globalMark 全局标识 1:全局 0: 非全局
+ */
+ private Boolean checkAdminGlobal(Integer globalMark) {
+ if (globalMark != null && globalMark == 1) {
+ return UserProvider.getUser().getIsAdministrator();
+ }
+ return false;
+ }
+
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionUserAspect.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionUserAspect.java
new file mode 100644
index 0000000..64ff963
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/PermissionUserAspect.java
@@ -0,0 +1,150 @@
+package com.yunzhupaas.aop;
+
+import com.yunzhupaas.constant.PermissionConst;
+import com.yunzhupaas.constant.PermissionConstant;
+import com.yunzhupaas.permission.entity.OrganizeRelationEntity;
+import com.yunzhupaas.permission.entity.UserRelationEntity;
+import com.yunzhupaas.permission.model.user.form.UserCrForm;
+import com.yunzhupaas.permission.model.user.form.UserUpForm;
+import com.yunzhupaas.permission.model.userrelation.UserRelationForm;
+import com.yunzhupaas.permission.service.*;
+import com.yunzhupaas.util.PermissionAspectUtil;
+import com.yunzhupaas.util.UserProvider;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/15 17:12
+ */
+@Slf4j
+@Aspect
+@Component
+public class PermissionUserAspect implements PermissionAdminBase{
+
+ @Autowired
+ private OrganizeRelationService organizeRelationService;
+ @Autowired
+ private PositionService positionService;
+ @Autowired
+ private UserRelationService userRelationService;
+
+ /**
+ * 分级管理切点
+ */
+ @Pointcut("within(com.yunzhupaas.*.controller.*) && @annotation(com.yunzhupaas.annotation.UserPermission)")
+ public void pointcut() {
+ }
+
+ /**
+ * 分级管理切点
+ *
+ * @param pjp
+ * @return
+ * @throws Throwable
+ */
+ @Around("pointcut()")
+ public Object around(ProceedingJoinPoint pjp) throws Throwable {
+ return PermissionAdminBase.permissionCommon(pjp, this);
+ }
+
+ @Override
+ public Boolean detailPermission(ProceedingJoinPoint pjp, String operatorUserId, String methodName) {
+ switch (methodName){
+ case PermissionConstant.METHOD_CREATE:
+ UserCrForm userCrForm = (UserCrForm) pjp.getArgs()[0];
+ return PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ userCrForm.getOrganizeId(),
+ operatorUserId,
+ PermissionConstant.METHOD_CREATE);
+ case PermissionConstant.METHOD_UPDATE:
+ // 得到修改的用户以前的信息
+ String userId = (String) pjp.getArgs()[0];
+ List collect = userRelationService.getListByUserId(userId, PermissionConst.ORGANIZE).stream().map(UserRelationEntity::getObjectId).collect(Collectors.toList());
+ StringJoiner stringJoiner = new StringJoiner(",");
+ collect.forEach(t -> {
+ stringJoiner.add(t);
+ });
+ if (PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ stringJoiner.toString(),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE)) {
+ return PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ ((UserUpForm) pjp.getArgs()[1]).getOrganizeId(),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE);
+ }
+ return false;
+ case PermissionConstant.METHOD_MODIFY_PW:
+ return PermissionAspectUtil.getPermitByUserId(
+ // 操作目标对象的ID
+ String.valueOf(pjp.getArgs()[0]),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE);
+ case PermissionConstant.METHOD_DELETE:
+ return PermissionAspectUtil.getPermitByUserId(
+ // 操作目标对象的ID
+ pjp.getArgs()[0].toString(),
+ operatorUserId,
+ PermissionConstant.METHOD_DELETE);
+ case PermissionConstant.METHOD_SAVE:
+ String objId = pjp.getArgs()[0].toString();
+ UserRelationForm userRelationForm = (UserRelationForm)pjp.getArgs()[1];
+
+ List orgIds = new ArrayList<>();
+ if(userRelationForm.getObjectType().equals(PermissionConst.ROLE)){
+ // 角色目前修改为只有超管才能够修改
+ if(UserProvider.getUser().getIsAdministrator()){
+ return true;
+ }
+ orgIds.addAll(organizeRelationService.getRelationListByRoleId(objId).stream().map(OrganizeRelationEntity::getOrganizeId).collect(Collectors.toList()));
+ return PermissionAspectUtil.getPermitByOrgId(
+ // 操作目标对象组织ID集合
+ String.join(",", orgIds),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE);
+ }else {
+ if(userRelationForm.getObjectType().equals(PermissionConst.GROUP)) {
+ return true;
+ }
+ if(userRelationForm.getObjectType().equals(PermissionConst.POSITION)) {
+ orgIds.add(positionService.getInfo(objId).getOrganizeId());
+ }
+ return PermissionAspectUtil.getPermitByOrgId(
+ String.join(",", orgIds),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE);
+ }
+ case PermissionConstant.METHOD_DELETE_SOCIALS:
+ if(pjp.getArgs()[0].toString().equals(operatorUserId)){return true;}
+ return PermissionAspectUtil.getPermitByUserId(
+ // 操作目标对象的ID
+ pjp.getArgs()[0].toString(),
+ operatorUserId,
+ PermissionConstant.METHOD_UPDATE);
+ default:
+ return false;
+ }
+ }
+
+
+
+
+
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/RequestLogAspect.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/RequestLogAspect.java
new file mode 100644
index 0000000..6751797
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/RequestLogAspect.java
@@ -0,0 +1,239 @@
+package com.yunzhupaas.aop;
+
+import cn.hutool.http.useragent.UserAgent;
+import cn.hutool.http.useragent.UserAgentUtil;
+import com.yunzhupaas.base.LogSortEnum;
+import com.yunzhupaas.base.UserInfo;
+import com.yunzhupaas.config.ConfigValueUtil;
+import com.yunzhupaas.entity.LogEntity;
+import com.yunzhupaas.service.LogService;
+import com.yunzhupaas.util.*;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import com.yunzhupaas.annotation.HandleLog;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.lang.reflect.Method;
+import java.util.Date;
+
+/**
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/15 17:12
+ */
+@Slf4j
+@Aspect
+@Component
+@Order(2)
+public class RequestLogAspect {
+
+ @Autowired
+ private ConfigValueUtil configValueUtil;
+ @Autowired
+ private LogService logService;
+
+ @Pointcut("within(com.yunzhupaas.*.controller.* || com.yunzhupaas.controller.*)")// && !within(com.yunzhupaas.controller.UtilsController)
+ public void requestLog() {
+
+ }
+
+ @Around("requestLog()")
+ public Object doAroundService(ProceedingJoinPoint pjp) throws Throwable {
+ long startTime = System.currentTimeMillis();
+ Object obj = pjp.proceed();
+ if(ServletUtil.getRequest() == null){
+ return obj;
+ }
+ long costTime = System.currentTimeMillis() - startTime;
+ UserInfo userInfo = UserProvider.getUser();
+ if(userInfo.getUserId() != null && (!configValueUtil.isMultiTenancy() || TenantHolder.getLocalTenantCache() != null)) {
+ // 得到请求参数
+ Object[] args = pjp.getArgs();
+ Signature signature = pjp.getSignature();
+ printLog(userInfo, costTime, obj, args, signature);
+ try {
+ // 判断是否需要操作日志
+ MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
+ // 得到请求方法
+ Method method = methodSignature.getMethod();
+ HandleLog methodAnnotation = method.getAnnotation(HandleLog.class);
+ if (methodAnnotation != null) {
+ String moduleName = methodAnnotation.moduleName();
+ String requestMethod = methodAnnotation.requestMethod();
+ handleLog(userInfo, costTime, obj, moduleName, requestMethod, args, signature);
+ }
+ } catch (Exception e) {
+ log.error("记录操作日志发生错误:" + e.getMessage());
+ }
+ }
+ return obj;
+ }
+
+ /**
+ * 请求日志
+ *
+ * @param userInfo
+ * @param costTime
+ */
+ private void printLog(UserInfo userInfo, long costTime, Object obj, Object[] args, Signature signature) {
+ LogEntity entity = new LogEntity();
+ entity.setId(RandomUtil.uuId());
+ entity.setType(LogSortEnum.Request.getCode());
+ entity.setUserId(userInfo.getUserId());
+ entity.setUserName(userInfo.getUserName() + "/" + userInfo.getUserAccount());
+ //请求耗时
+ entity.setRequestDuration((int) costTime);
+ entity.setRequestUrl(ServletUtil.getRequest().getServletPath());
+ entity.setRequestMethod(ServletUtil.getRequest().getMethod());
+ String ipAddr = IpUtil.getIpAddr();
+ entity.setIpAddress(ipAddr);
+ entity.setIpAddressName(IpUtil.getIpCity(ipAddr));
+ entity.setCreatorTime(new Date());
+ UserAgent userAgent = UserAgentUtil.parse(ServletUtil.getUserAgent());
+ if (userAgent != null) {
+ entity.setPlatForm(userAgent.getPlatform().getName() + " " + userAgent.getOsVersion());
+ entity.setBrowser(userAgent.getBrowser().getName() + " " + userAgent.getVersion());
+ }
+ String declaringTypeName = signature.getDeclaringTypeName();
+ String name = signature.getName();
+ entity.setRequestTarget(declaringTypeName + "." + name);
+ entity.setJsons(obj + "");
+ StringBuilder stringBuilder = new StringBuilder();
+ for (Object o : args) {
+ // 如果是MultipartFile则为导入
+ if (o instanceof MultipartFile) {
+ stringBuilder.append("{\"originalFilename\":\"" + ((MultipartFile) o).getOriginalFilename() + "\",");
+ stringBuilder.append("\"contentType\":\"" + ((MultipartFile) o).getContentType() + "\",");
+ stringBuilder.append("\"name\":\"" + ((MultipartFile) o).getName() + "\",");
+ stringBuilder.append("\"resource\":\"" + ((MultipartFile) o).getResource() + "\",");
+ stringBuilder.append("\"size\":\"" + ((MultipartFile) o).getSize() + "\"}");
+ }
+ }
+ if (stringBuilder.length() > 0) {
+ entity.setRequestParam(stringBuilder.toString());
+ } else {
+ entity.setRequestParam(JsonUtil.getObjectToString(args));
+ }
+ ThreadPoolExecutorUtil.getExecutor().execute(()->{
+ logService.save(entity);
+ });
+ }
+
+ /**
+ * 添加操作日志
+ *
+ * @param userInfo 用户信息
+ * @param costTime 操作耗时
+ * @param obj 请求结果
+ * @param moduleName 模块名称
+ * @param requestMethod 请求方法
+ * @param args 请求参数
+ */
+ private void handleLog(UserInfo userInfo, long costTime, Object obj, String moduleName, String requestMethod, Object[] args, Signature signature) {
+ LogEntity entity = new LogEntity();
+ entity.setId(RandomUtil.uuId());
+ entity.setType(LogSortEnum.Operate.getCode());
+ entity.setUserId(userInfo.getUserId());
+ entity.setUserName(userInfo.getUserName() + "/" + userInfo.getUserAccount());
+ //请求耗时
+ entity.setRequestDuration((int) costTime);
+ entity.setRequestMethod(ServletUtil.getRequest().getMethod());
+ entity.setRequestUrl(ServletUtil.getRequest().getServletPath());
+ String ipAddr = IpUtil.getIpAddr();
+ entity.setIpAddress(ipAddr);
+ entity.setIpAddressName(IpUtil.getIpCity(ipAddr));
+ entity.setCreatorTime(new Date());
+ // 请求设备
+ UserAgent userAgent = UserAgentUtil.parse(ServletUtil.getUserAgent());
+ if (userAgent != null) {
+ entity.setPlatForm(userAgent.getPlatform().getName() + " " + userAgent.getOsVersion());
+ entity.setBrowser(userAgent.getBrowser().getName() + " " + userAgent.getVersion());
+ }
+ // 操作模块
+ entity.setModuleName(moduleName);
+ String declaringTypeName = signature.getDeclaringTypeName();
+ String name = signature.getName();
+ entity.setRequestTarget(declaringTypeName + "." + name);
+ // 操作记录
+ StringBuilder stringBuilder = new StringBuilder();
+ for (Object o : args) {
+ // 如果是MultipartFile则为导入
+ if (o instanceof MultipartFile) {
+ stringBuilder.append("{\"originalFilename\":\"" + ((MultipartFile) o).getOriginalFilename() + "\",");
+ stringBuilder.append("\"contentType\":\"" + ((MultipartFile) o).getContentType() + "\",");
+ stringBuilder.append("\"name\":\"" + ((MultipartFile) o).getName() + "\",");
+ stringBuilder.append("\"resource\":\"" + ((MultipartFile) o).getResource() + "\",");
+ stringBuilder.append("\"size\":\"" + ((MultipartFile) o).getSize() + "\"}");
+ }
+ }
+ if (stringBuilder.length() > 0) {
+ entity.setRequestParam(stringBuilder.toString());
+ } else {
+ entity.setRequestParam(JsonUtil.getObjectToString(args));
+ }
+ entity.setJsons(obj + "");
+ ThreadPoolExecutorUtil.getExecutor().execute(()->{
+ logService.save(entity);
+ });
+ }
+
+/// 后面可能会用
+// /**
+// * 判断是否为导入导出
+// *
+// * @return
+// */
+// private String getRequestMethod() {
+// //得到请求方式
+// String methodType = ServletUtil.getRequest().getMethod();
+// // 得到当前请求的尾缀
+// String endWith = null;
+// String servletPath = ServletUtil.getServletPath();
+// if (StringUtil.isNotEmpty(servletPath)) {
+// String[] path = servletPath.split("/");
+// int length = path.length;
+// if (length > 5) {
+// endWith = path[length - 2] + "/" + path[length - 1];
+// }
+// }
+// // 如果是GET请求且请求后缀是'/Action/Export'则判定为导出
+// if (HandleMethodEnum.GET.getRequestType().equals(methodType)) {
+// methodType = "Action/Export".equals(endWith) ? "EXPORT" : "GET";
+// } else if (HandleMethodEnum.POST.getRequestType().equals(methodType)) {
+// methodType = "Action/Import".equals(endWith) ? "IMPORT" : "GET";
+// }
+// return methodType;
+// }
+// /**
+// * 判断是否为导入导出
+// *
+// * @return
+// */
+// private String getRequestModuleName() {
+// //得到Url
+// String requestURI = ServletUtil.getRequest().getRequestURI();
+// // 取模块名
+// if (StringUtil.isNotEmpty(requestURI)) {
+// String[] split = requestURI.split("/");
+// if (split.length > 2) {
+// String url = split[1];
+// // 得到所在模块
+// String moduleName = HandleModuleEnum.getModuleByURL(url);
+// return moduleName;
+// }
+// }
+// return "";
+// }
+///
+
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/VisiualOpaAspect.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/VisiualOpaAspect.java
new file mode 100644
index 0000000..6890e0a
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/aop/VisiualOpaAspect.java
@@ -0,0 +1,47 @@
+package com.yunzhupaas.aop;
+
+import com.yunzhupaas.util.RedisUtil;
+import com.yunzhupaas.util.ServletUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 可视化开发缓存数据处理
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/15 17:12
+ */
+@Slf4j
+//@Aspect
+//@Component
+public class VisiualOpaAspect {
+
+ @Autowired
+ private RedisUtil redisUtil;
+ @Pointcut("(execution(* com.yunzhupaas.onlinedev.controller.VisualdevModelDataController.*(..))) || execution(* com.yunzhupaas.onlinedev.controller.VisualdevModelAppController.*(..)))" +
+ "|| execution(* com.yunzhupaas.generater.controller.VisualdevGenController.*(..)))")
+ public void visiualOpa() {
+
+ }
+
+ @After("visiualOpa()")
+ public void doAroundService(){
+ String method=ServletUtil.getRequest().getMethod().toLowerCase();
+ if("put".equals(method)||"delete".equals(method)||"post".equals(method)){
+ Set allKey=new HashSet<>(16);
+ allKey.addAll(redisUtil.getAllVisiualKeys());
+ for(String key:allKey){
+ redisUtil.remove(key);
+ }
+ }
+ }
+ }
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/constant/PermissionConstant.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/constant/PermissionConstant.java
new file mode 100644
index 0000000..c28131a
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/constant/PermissionConstant.java
@@ -0,0 +1,74 @@
+package com.yunzhupaas.constant;
+
+/**
+ * 分级管理常量
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * @date 2024-11-01
+ */
+public class PermissionConstant {
+
+ /**
+ * 创建方法
+ */
+ public static final String METHOD_CREATE = "create";
+
+ /**
+ * 编辑方法
+ */
+ public static final String METHOD_UPDATE = "update";
+
+ /**
+ * 删除方法
+ */
+ public static final String METHOD_DELETE = "delete";
+
+ /**
+ * 更新状态
+ */
+ public static final String METHOD_DISABLE = "disable";
+
+ /**
+ * 创建方法
+ */
+ public static final String METHOD_CREATE_DEPARTMENT = "createDepartment";
+
+ /**
+ * 编辑方法
+ */
+ public static final String METHOD_UPDATE_DEPARTMENT = "updateDepartment";
+
+ /**
+ * 删除方法
+ */
+ public static final String METHOD_DELETE_DEPARTMENT = "deleteDepartment";
+
+ /**
+ * 保存方法
+ */
+ public static final String METHOD_SAVE = "save";
+ public static final String METHOD_SAVE_BATCH = "saveBatch";
+ /**
+ * 修改用户密码
+ */
+ public static final String METHOD_MODIFY_PW = "modifyPassword";
+
+ /**
+ * 拼接方法名
+ */
+ public static final String GET_METHOD_CREATE = "Add";
+ public static final String GET_METHOD_UPDATE = "Edit";
+ public static final String GET_METHOD_DELETE = "Delete";
+ public static final String GET_METHOD_SELECT = "Select";
+ public static final String GET_METHOD_THIS = "getThisLayer";
+ public static final String GET_METHOD_SUB = "getSubLayer";
+
+ /**
+ * 解除绑定方法
+ */
+ public static final String METHOD_DELETE_SOCIALS = "deleteSocials";
+
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/filter/AuthFilter.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/filter/AuthFilter.java
new file mode 100644
index 0000000..595763d
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/filter/AuthFilter.java
@@ -0,0 +1,102 @@
+package com.yunzhupaas.filter;
+
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.filter.SaFilterAuthStrategy;
+import cn.dev33.satoken.filter.SaServletFilter;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.dev33.satoken.util.SaResult;
+import com.yunzhupaas.base.ActionResultCode;
+import com.yunzhupaas.constant.MsgCode;
+import com.yunzhupaas.consts.AuthConsts;
+import com.yunzhupaas.properties.GatewayWhite;
+import com.yunzhupaas.util.IpUtil;
+import com.yunzhupaas.util.UserProvider;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+/**
+ * 网关验证token
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * @date 2024-03-24
+ */
+@Slf4j
+@Configuration
+public class AuthFilter {
+
+
+ @Autowired
+ private GatewayWhite gatewayWhite;
+
+ @Autowired
+ private SaFilterAuthStrategy defaultBeforeAuthStrategy;
+
+ // 注册 Sa-Token全局过滤器
+ @Bean
+ public SaServletFilter getSaReactorFilter() {
+ return new SaServletFilter()
+ // 拦截地址
+ .addInclude("/**")
+ .setExcludeList(gatewayWhite.excludeUrl)
+ // 鉴权方法:每次访问进入
+ .setAuth(obj -> {
+ if(log.isInfoEnabled()){
+ log.info("请求路径: {}", SaHolder.getRequest().getRequestPath());
+ }
+ //拦截路径
+ SaRouter.match(gatewayWhite.blockUrl).match(o -> {
+ //禁止访问URL 排除白名单
+ String ip = getIpAddr();
+ for (String o1 : gatewayWhite.whiteIp) {
+ if(ip.startsWith(o1)){
+ return false;
+ }
+ }
+ log.info("非白名单IP访问限制接口:{}, {}", SaHolder.getRequest().getRequestPath(), ip);
+ return true;
+ }).back(MsgCode.AD101.get());
+ //测试不验证 鉴权服务重启测试模式不清除Token就够了
+ //SaRouter.match((r)->"true".equals(configValueUtil.getTestVersion())).stop();
+ //白名单不拦截
+ SaRouter.match(gatewayWhite.whiteUrl).stop();
+ //内部请求不拦截
+ SaRouter.match(t->{
+ String innerToken = SaHolder.getRequest().getHeader(AuthConsts.INNER_TOKEN_KEY);
+ return UserProvider.isValidInnerToken(innerToken);
+ }).stop();
+ // 登录校验 -- 校验多租户管理模块TOKEN
+ //SaRouter.match("/api/tenant/**", r -> {
+ // SaManager.getStpLogic(AuthConsts.ACCOUNT_TYPE_TENANT).checkLogin();
+ //}).stop();
+ // 登录校验 -- 拦截所有路由
+ SaRouter.match("/**", r -> {
+ StpUtil.checkLogin();
+ }).stop();
+ }).setError(e -> {
+ SaHolder.getResponse().addHeader("Content-Type","application/json; charset=utf-8");
+ if(e instanceof NotLoginException){
+ return SaResult.error(ActionResultCode.SessionOverdue.getMessage()).setCode(ActionResultCode.SessionOverdue.getCode());
+ }
+ log.error(e.getMessage(), e);
+ return SaResult.error(MsgCode.AD102.get()).setCode(ActionResultCode.Exception.getCode());
+ })
+ // 前置函数:在每次认证函数之前执行
+ .setBeforeAuth(defaultBeforeAuthStrategy);
+ }
+
+
+
+ public static String getIpAddr() {
+ return IpUtil.getIpAddr();
+ }
+
+
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/filter/MvcSecurityConfig.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/filter/MvcSecurityConfig.java
new file mode 100644
index 0000000..52f1a72
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/filter/MvcSecurityConfig.java
@@ -0,0 +1,114 @@
+package com.yunzhupaas.filter;
+
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.context.model.SaRequest;
+import cn.dev33.satoken.context.model.SaResponse;
+import cn.dev33.satoken.filter.SaFilterAuthStrategy;
+import cn.dev33.satoken.router.SaRouter;
+import com.yunzhupaas.properties.MvcSecurityProperties;
+import com.yunzhupaas.util.Constants;
+import com.yunzhupaas.util.IpUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpStatus;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.CorsConfigurationSource;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+import java.net.URI;
+
+/**
+ * mvc配置
+ *
+ * @author 云筑产品开发平台组
+ * @version V5.2.0
+ * @copyright 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * @date 2025-01-21
+ */
+@Slf4j
+@Configuration(proxyBeanMethods = false)
+public class MvcSecurityConfig {
+
+ private static final String DOMAIN_FORMAT = "%s://%s";
+
+ @Autowired
+ private MvcSecurityProperties mvcSecurityProperties;
+
+
+ @Bean
+ public CorsFilter corsFilter() {
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ CorsConfiguration config = new CorsConfiguration();
+ // 允许发送凭据
+ config.setAllowCredentials(true);
+ //允许任意域名跨域访问接口
+ config.setAllowedOrigins(mvcSecurityProperties.getCors().getAllowedOrigins());
+ config.setAllowedOriginPatterns(mvcSecurityProperties.getCors().getAllowedOriginPatterns());
+ // 允许所有头部信息
+ config.setAllowedHeaders(mvcSecurityProperties.getCors().getAllowedHeaders());
+ // 允许所有请求方法
+ config.setAllowedMethods(mvcSecurityProperties.getCors().getAllowedMethods());
+ // 应用于所有路径
+ source.registerCorsConfiguration("/**", config);
+ return new MyCorsFilter(source);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public SaFilterAuthStrategy defaultBeforeAuthStrategy() {
+ CorsConfiguration csrfConfiguration;
+ if(!mvcSecurityProperties.getCsrfOrigins().isEmpty() || !mvcSecurityProperties.getCsrfOriginsPatterns().isEmpty()) {
+ csrfConfiguration = new CorsConfiguration();
+ csrfConfiguration.setAllowedOrigins(mvcSecurityProperties.getCsrfOrigins());
+ csrfConfiguration.setAllowedOriginPatterns(mvcSecurityProperties.getCsrfOriginsPatterns());
+ } else {
+ csrfConfiguration = null;
+ }
+ return obj -> {
+ SaRequest request = SaHolder.getRequest();
+ // ---------- 设置跨域响应头 ----------
+ SaResponse response = SaHolder.getResponse();
+ if(!ObjectUtils.isEmpty(mvcSecurityProperties.getHeaders().getServerName())){
+ response.setServer(mvcSecurityProperties.getHeaders().getServerName());
+ }
+ if(!ObjectUtils.isEmpty(mvcSecurityProperties.getHeaders().getXFrameOptions()) && !MvcSecurityProperties.XFrameOptionsMode.DISABLED.equals(mvcSecurityProperties.getHeaders().getXFrameOptions())){
+ response.setHeader(MvcSecurityProperties.HEADER_XFRAME_OPTIONS, mvcSecurityProperties.getHeaders().getXFrameOptions().getMode());
+ }
+ if(!ObjectUtils.isEmpty(mvcSecurityProperties.getHeaders().getXXssProtection()) && !MvcSecurityProperties.XXssProtectionMode.DISABLED.equals(mvcSecurityProperties.getHeaders().getXXssProtection())){
+ response.setHeader(MvcSecurityProperties.HEADER_XSS_PROTECTION, mvcSecurityProperties.getHeaders().getXXssProtection().getMode());
+ }
+ if(!ObjectUtils.isEmpty(mvcSecurityProperties.getHeaders().getXContentTypeOptions()) && !MvcSecurityProperties.XContentTypeOptions.DISABLED.equals(mvcSecurityProperties.getHeaders().getXContentTypeOptions())){
+ response.setHeader(MvcSecurityProperties.HEADER_Content_Type_Options, mvcSecurityProperties.getHeaders().getXContentTypeOptions().getMode());
+ }
+
+ if(csrfConfiguration != null){
+ String referer = request.getHeader("referer");
+ if(!ObjectUtils.isEmpty(referer)) {
+ URI uri = URI.create(referer);
+ String refererDomain = String.format(DOMAIN_FORMAT, uri.getScheme(), uri.getAuthority());
+ String allowOrign = csrfConfiguration.checkOrigin(refererDomain);
+ if(ObjectUtils.isEmpty(allowOrign)){
+ log.error("Reject CSRF Request: {}, {}, {}, {}", request.getRequestPath(), referer, IpUtil.getIpAddr(), request.getHeader(Constants.AUTHORIZATION));
+ response.setStatus(HttpStatus.FORBIDDEN.value());
+ SaRouter.back("Invalid CSRF Request");
+ }
+ }
+ }
+ };
+ }
+
+
+ @Order(-110)
+ public static class MyCorsFilter extends CorsFilter {
+ public MyCorsFilter(CorsConfigurationSource configSource) {
+ super(configSource);
+ }
+ }
+}
+
diff --git a/yunzhupaas-admin/src/main/java/com/yunzhupaas/util/PermissionAspectUtil.java b/yunzhupaas-admin/src/main/java/com/yunzhupaas/util/PermissionAspectUtil.java
new file mode 100644
index 0000000..0e4e290
--- /dev/null
+++ b/yunzhupaas-admin/src/main/java/com/yunzhupaas/util/PermissionAspectUtil.java
@@ -0,0 +1,166 @@
+package com.yunzhupaas.util;
+
+import com.yunzhupaas.constant.PermissionConstant;
+import com.yunzhupaas.permission.entity.OrganizeAdministratorEntity;
+import com.yunzhupaas.permission.entity.OrganizeEntity;
+import com.yunzhupaas.permission.service.OrganizeAdministratorService;
+import com.yunzhupaas.permission.service.OrganizeService;
+import com.yunzhupaas.util.context.SpringContext;
+
+/**
+ * 分级管理工具类
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * @date 2024-11-01
+ */
+public class PermissionAspectUtil {
+
+ private static final OrganizeService organizeService;
+ private static final OrganizeAdministratorService organizeAdministratorService;
+
+ static {
+ organizeService = SpringContext.getBean(OrganizeService.class);
+ organizeAdministratorService = SpringContext.getBean(OrganizeAdministratorService.class);
+ }
+
+ /**
+ * 判断是否存在修改前所在的组织的操作
+ *
+ * @param targetUserId 被操作目标对象ID
+ * @param operatorUsrId 操作者ID
+ * @param methodName 操作方法
+ */
+ public static Boolean getPermitByUserId(String targetUserId, String operatorUsrId, String methodName) {
+ for(OrganizeEntity organizeEntity : organizeService.getAllOrgByUserId(targetUserId)){
+ if (PermissionAspectUtil.containPermission(organizeEntity.getId(), operatorUsrId, methodName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 判断 操作者是否含有该组织的操作权限
+ *
+ * @param organizeId 被操作者所在组织ID
+ * @param operatorUserId 当前操作者用户对象ID
+ * @param methodName 操作类型:创建、编辑、删除
+ */
+ public static boolean containPermission(String organizeId, String operatorUserId, String methodName) {
+ OrganizeEntity organizeEntity = organizeService.getInfo(organizeId);
+ if (organizeEntity != null) {
+ // 当前用户的所有分级权限
+ OrganizeAdministratorEntity adminEntity = organizeAdministratorService.getOne(operatorUserId, organizeId);
+ if(permissionFlag(adminEntity, methodName, true)){
+ return true;
+ }
+ // 查看父级的组织权限是否含有子集权限
+ return parentPermission(organizeEntity.getParentId(), methodName, operatorUserId);
+ }
+ return false;
+ }
+
+ /**
+ * 判断是否存在修改前所在的组织的操作(拥有所有的组织权限才能操作)
+ *
+ * @param organizeIds 组织ID集合字符串
+ * @param operatorUsrId 操作者ID
+ * @param methodName 操作方法
+ */
+ public static Boolean getPermitByOrgIds(String organizeIds, String operatorUsrId, String methodName) {
+ boolean flag = true;
+ for (String organizeId : organizeIds.split(",")) {
+ flag = true;
+ flag = PermissionAspectUtil.containPermission(organizeId, operatorUsrId, methodName);
+ if (!flag) {
+ break;
+ }
+ }
+ return flag;
+ }
+
+ /**
+ * 判断是否可修改所在的组织的操作(只要有一个权限即可操作)
+ *
+ * @param organizeIds 组织ID集合字符串
+ * @param operatorUsrId 操作者ID
+ * @param methodName 操作方法
+ */
+ public static Boolean getPermitByOrgId(String organizeIds, String operatorUsrId, String methodName) {
+ for (String organizeId : organizeIds.split(",")) {
+ if (PermissionAspectUtil.containPermission(organizeId,operatorUsrId, methodName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 判断组织新建权限(从父级给的子集新建操作权限)
+ *
+ * @param organizeParentId
+ * @param methodName
+ * @param userId
+ * @return
+ */
+ private static boolean parentPermission(String organizeParentId, String methodName, String userId) {
+ // 得到父级组织
+ OrganizeEntity parentOrganizeEntity = organizeService.getInfo(organizeParentId);
+
+ if (parentOrganizeEntity != null) {
+ // 得到父级的权限
+ if(permissionFlag(organizeAdministratorService.getOne(userId, parentOrganizeEntity.getId()), methodName, false)){
+ return true;
+ }
+ // 当前正在判断的组织已经是顶级则无需递归
+ if (!"-1".equals(parentOrganizeEntity.getParentId())) {
+ return parentPermission(parentOrganizeEntity.getParentId(), methodName, userId);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 判断是否具有权限
+ * @param adminEntity 分级管理对象
+ * @param methodName 操作类型:创建、编辑、删除
+ * @param thisFlag true:当前组织 false:子组织
+ */
+ private static boolean permissionFlag(OrganizeAdministratorEntity adminEntity, String methodName, Boolean thisFlag) {
+ if (adminEntity != null) {
+ String methodType = "";
+ // 存在则验证是否有当前组织分级管理
+ try {
+ switch (methodName) {
+ case PermissionConstant.METHOD_CREATE:
+ // 创建权限
+ methodType = PermissionConstant.GET_METHOD_CREATE;
+ break;
+ case PermissionConstant.METHOD_UPDATE:
+ // 编辑权限
+ methodType = PermissionConstant.GET_METHOD_UPDATE;
+ break;
+ case PermissionConstant.METHOD_DELETE:
+ // 删除权限
+ methodType = PermissionConstant.GET_METHOD_DELETE;
+ break;
+ default:
+ break;
+ }
+ // 拼接方法名
+ String method = (thisFlag ? PermissionConstant.GET_METHOD_THIS : PermissionConstant.GET_METHOD_SUB) + methodType;
+ String selectMethod = (thisFlag ? PermissionConstant.GET_METHOD_THIS : PermissionConstant.GET_METHOD_SUB) + PermissionConstant.GET_METHOD_SELECT;
+ if ((int)OrganizeAdministratorEntity.class.getMethod(method).invoke(adminEntity) == 1 && (int)OrganizeAdministratorEntity.class.getMethod(selectMethod).invoke(adminEntity) == 1) {
+ return true;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+
+}
+
diff --git a/yunzhupaas-admin/src/main/resources/AntiSamy_zh_CN.properties b/yunzhupaas-admin/src/main/resources/AntiSamy_zh_CN.properties
new file mode 100644
index 0000000..fb19076
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/AntiSamy_zh_CN.properties
@@ -0,0 +1,34 @@
+# General
+error.size.toolarge=\u8F93\u5165\u592A\u5927\u3002\u5B9E\u9645\u7684\u8F93\u5165\u4E3A{0}\u5B57\u8282\u3002\u5141\u8BB8\u7684\u6700\u5927\u8F93\u5165\u4E3A{1}\u5B57\u8282\u3002
+error.comment.removed=\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6CE8\u91CA\u57DF\u5DF2\u88AB\u8FC7\u6EE4\u3002\u6CE8\u91CA\u57DF\u7684\u503C\u4E3A{0}
+# Tag related
+error.tag.notfound=\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6807\u8BB0{0}\u5DF2\u88AB\u8FC7\u6EE4\u3002\u6807\u8BB0\u7684\u5185\u5BB9\u4FDD\u5B58\u4E0D\u53D8\u3002
+error.tag.removed=\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6807\u8BB0{0}\u4E0D\u88AB\u5141\u8BB8\u3002\u6B64\u6807\u8BB0\u4E0D\u5E94\u8BE5\u5F71\u54CD\u8F93\u5165\u7684\u663E\u793A\u3002
+error.tag.filtered=\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6807\u8BB0{0}\u5DF2\u88AB\u8FC7\u6EE4\u3002\u6807\u8BB0\u7684\u5185\u5BB9\u4FDD\u5B58\u4E0D\u53D8\u3002
+error.tag.encoded=The {0} tag has been encoded for security reasons. The contents of the tag will remain in place.
+error.tag.empty=\u5728{0}\u7684\u6807\u7B7E\u662F\u7A7A\u7684\uFF0C\u56E0\u6B64\u6211\u4EEC\u65E0\u6CD5\u5904\u7406\u5B83\u3002\u8BE5\u90AE\u4EF6\u7684\u5176\u4F59\u90E8\u5206\u662F\u5B8C\u6574\u7684\uFF0C\u5176\u642C\u8FC1\u5E94\u8BE5\u6CA1\u6709\u4EFB\u4F55\u526F\u4F5C\u7528\u3002
+error.cdata.found=\u4E00\u4E2ACDATA\u90E8\u5206\u88AB\u53D1\u73B0\uFF0C\u8FD9\u662F\u4E0D\u5141\u8BB8\u7684\u3002\u8BE5\u90AE\u4EF6\u7684\u5176\u4F59\u90E8\u5206\u662F\u5B8C\u6574\u7684\uFF0C\u5176\u642C\u8FC1\u4E0D\u5E94\u8BE5\u6709\u4EFB\u4F55\u526F\u4F5C\u7528\u3002\u5728CDATA\u7684\u5185\u5BB9\u662F \"{0}\"\u3002
+error.pi.found=XML\u5904\u7406\u6307\u4EE4\u88AB\u53D1\u73B0\uFF0C\u8FD9\u662F\u4E0D\u5141\u8BB8\u7684\u3002\u6D88\u606F\u7684\u5176\u4F59\u90E8\u5206\u662F\u5B8C\u6574\u7684\uFF0C\u5176\u642C\u8FC1\u5E94\u8BE5\u4E0D\u4F1A\u6709\u4EFB\u4F55\u526F\u4F5C\u7528\u3002\u8BE5\u6307\u4EE4\u7684\u5185\u5BB9\u4E3A \"{0}\"\u3002
+# Attribute related
+error.attribute.notfound=\u6807\u8BB0{0}\u5305\u542B\u4E00\u4E2A\u6CA1\u6CD5\u5904\u7406\u7684\u5C5E\u6027\u3002\u5C5E\u6027{1}\u5DF2\u88AB\u8FC7\u6EE4\uFF0C\u4F46\u6807\u8BB0\u4FDD\u5B58\u4E0D\u53D8\u3002
+error.attribute.invalid=\u6807\u8BB0{0}\u5305\u542B\u4E00\u4E2A\u6CA1\u6CD5\u5904\u7406\u7684\u5C5E\u6027\u3002\u5C5E\u6027{1}\u5305\u542B\u4E00\u4E2A\u503C\"{2}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u8FD9\u4E2A\u503C\u6CA1\u6CD5\u88AB\u63A5\u53D7\u3002\u4E3A\u4E86\u5904\u7406\u8FD9\u4E2A\u8F93\u5165\uFF0C\u8FD9\u4E2A\u5C5E\u6027\u5DF2\u88AB\u4ECE\u8FD9\u4E2A\u6807\u8BB0\u4E2D\u53BB\u6389\uFF0C\u6807\u8BB0\u5176\u4ED6\u90E8\u5206\u4FDD\u6301\u4E0D\u53D8\u3002
+error.attribute.invalid.filtered=\u6807\u8BB0{0}\u5305\u542B\u4E00\u4E2A\u6CA1\u6CD5\u5904\u7406\u7684\u5C5E\u3002\u5C5E\u6027{1}\u5305\u542B\u4E00\u4E2A\u503C\"{2}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u8FD9\u4E2A\u503C\u6CA1\u6CD5\u88AB\u63A5\u53D7\u3002\u4E3A\u4E86\u8FDB\u4E00\u6B65\u5904\u7406\u8FD9\u4E2A\u8F93\u5165\uFF0C\u6807\u8BB0{0}\u5DF2\u88AB\u8FC7\u6EE4\u3002
+error.attribute.invalid.encoded=The {0} tag contained an attribute that we could not process. The {1} attribute had a value of \"{2}\". This value could not be accepted for security reasons. We have chosen to encode the {0} tag in order to continue processing the input.
+error.attribute.invalid.removed=\u6807\u8BB0{0}\u5305\u542B\u4E00\u4E2A\u6CA1\u6CD5\u5904\u7406\u7684\u5C5E\u6027\u3002\u5C5E\u6027{1}\u5305\u542B\u4E00\u4E2A\u503C\"{2}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u8FD9\u4E2A\u503C\u6CA1\u6CD5\u88AB\u63A5\u53D7\u3002\u4E3A\u4E86\u8FDB\u4E00\u6B65\u5904\u7406\u8FD9\u4E2A\u8F93\u5165\uFF0C\u6574\u4E2A\u6807\u8BB0{0}\u5DF2\u88AB\u53BB\u6389\u3002
+# CSS related
+error.css.tag.malformed=The stylesheet code \"{0}\" could not be parsed.
+error.css.import.disabled=\u6837\u5F0F\u8868\u7684\u5BFC\u5165\u8FD8\u6CA1\u6709\u88AB\u6FC0\u6D3B\u3002
+error.css.import.exceeded=\u4F4D\u4E8E{0}\u7684\u6837\u5F0F\u8868\u8D85\u8FC7\u5141\u8BB8\u5BFC\u5165\u7684\u6837\u5F0F\u8868\u7684\u603B\u6570\uFF0C\u56E0\u6B64\u8BE5\u6837\u5F0F\u8868\u6CA1\u6709\u88AB\u8BFB\u53D6\u3002\u5141\u8BB8\u5BFC\u5165\u7684\u6837\u5F0F\u8868\u7684\u6700\u5927\u6570\u76EE\u4E3A{1}\u3002
+error.css.import.failure=\u8F93\u5165\u4E2D\u542B\u6709\u7684\u8FDC\u7A0B\u6837\u5F0F\u8868\u4F4D\u4E8E{0}\uFF0C\u6B64\u6837\u5F0F\u8868\u6CA1\u6CD5\u88AB\u8BFB\u53D6\u3002\u7F51\u7AD9\u53EF\u80FD\u5173\u95ED\u6216\u8005\u4E3B\u673A\u6CA1\u6CD5\u88AB\u8BBF\u95EE\u3002\u8FD9\u4E0D\u5E94\u8BE5\u5F71\u54CD\u8F93\u5165\u7684\u683C\u5F0F\u3002
+error.css.import.toolarge=\u4F4D\u4E8E{0}\u7684\u6837\u5F0F\u8868\u4F7F\u5F97\u603B\u8F93\u5165\u592A\u5927\uFF0C\u56E0\u6B64\u6CA1\u6709\u88AB\u5BFC\u5165\u3002\u5141\u8BB8\u7684\u6700\u5927\u8F93\u5165\u4E3A{1}\u5B57\u8282\u3002
+error.css.import.url.invalid=\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u7528\u4E8E\u5BFC\u5165\u6837\u5F0F\u8868\u7684url\u6CA1\u6CD5\u88AB\u63A5\u53D7\u3002\u6B64url\u662F{1}\u3002
+error.css.stylesheet.relative=\u6837\u5F0F\u8868\u5F15\u7528\u4E86\u4E00\u4E2A\u6CA1\u6CD5\u8BFB\u53D6\u7684\u76F8\u5BF9\u6837\u5F0F\u8868\"{0}\"\u3002
+error.css.tag.relative=\u6807\u8BB0{0}\u4E2D\u7684\u4E00\u4E2A\u6837\u5F0F\u5C5E\u6027\u6307\u5B9A\u4E86\u4E00\u4E2A\u6CA1\u6CD5\u8BFB\u53D6\u7684\u76F8\u5BF9\u6837\u5F0F\u8868\u5E94\u7528\"{0}\"\u3002
+error.css.stylesheet.rule.notfound=\u6837\u5F0F\u8868\u4F7F\u7528\u4E86\u4E00\u4E2A\u4E0D\u88AB\u652F\u6301\u7684\u89C4\u5219\"{0}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6B64\u89C4\u5219\u5DF2\u88AB\u53BB\u6389\u3002
+error.css.tag.rule.notfound=\u6807\u8BB0{0}\u4E2D\u7684\u4E00\u4E2A\u6837\u5F0F\u5C5E\u6027\u4F7F\u7528\u4E86\u4E00\u4E2A\u4E0D\u88AB\u652F\u6301\u7684\u89C4\u5219\"{0}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6B64\u89C4\u5219\u5DF2\u88AB\u53BB\u6389\u3002
+error.css.stylesheet.selector.notfound=\u6837\u5F0F\u8868\u4F7F\u7528\u4E86\u4E00\u4E2A\u6CA1\u6CD5\u5904\u7406\u7684\u9009\u62E9\u5668\"{0}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6B64\u9009\u62E9\u5668\u5DF2\u88AB\u53BB\u6389\u3002
+error.css.tag.selector.notfound=\u6807\u8BB0{0}\u4E2D\u7684\u4E00\u4E2A\u6837\u5F0F\u5C5E\u6027\u4F7F\u7528\u4E86\u4E00\u4E2A\u6CA1\u6CD5\u5904\u7406\u7684\u9009\u62E9\u5668\"{0}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6B64\u89C4\u5219\u5DF2\u88AB\u53BB\u6389\u3002
+error.css.stylesheet.selector.disallowed=\u6837\u5F0F\u8868\u4F7F\u7528\u4E86\u4E00\u4E2A\u9009\u62E9\u5668\"{0}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6B64\u9009\u62E9\u5668\u4E0D\u88AB\u5141\u8BB8\u3002
+error.css.tag.selector.disallowed=\u6807\u8BB0{0}\u4E2D\u7684\u4E00\u4E2A\u6837\u5F0F\u5C5E\u6027\u4F7F\u7528\u4E86\u4E00\u4E2A\u9009\u62E9\u5668\"{1}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6B64\u9009\u62E9\u5668\u4E0D\u88AB\u5141\u8BB8\u3002
+error.css.stylesheet.property.invalid=\u6837\u5F0F\u8868\u542B\u6709\u4E00\u4E2A\u5C5E\uFF08property)\"{0}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6B64\u5C5E\u6027\u4E0D\u88AB\u5141\u8BB8\u3002
+error.css.tag.property.invalid=\u6807\u8BB0{0}\u4E2D\u542B\u6709\u4E00\u4E2A\u6837\u5F0F\u5C5E\u6027\"{1}\"\u3002\u51FA\u4E8E\u5B89\u5168\u7684\u539F\u56E0\uFF0C\u6B64\u5C5E\u6027\u4E0D\u88AB\u5141\u8BB8\u3002
diff --git a/yunzhupaas-admin/src/main/resources/antisamy-ebay-imgonlybase64.xml b/yunzhupaas-admin/src/main/resources/antisamy-ebay-imgonlybase64.xml
new file mode 100644
index 0000000..50ba288
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/antisamy-ebay-imgonlybase64.xml
@@ -0,0 +1,2453 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ g
+ grin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/antisamy-ebay.xml b/yunzhupaas-admin/src/main/resources/antisamy-ebay.xml
new file mode 100644
index 0000000..6df3a7a
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/antisamy-ebay.xml
@@ -0,0 +1,2455 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ g
+ grin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/antisamy-empty.xml b/yunzhupaas-admin/src/main/resources/antisamy-empty.xml
new file mode 100644
index 0000000..24f851c
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/antisamy-empty.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/application-dev.yml b/yunzhupaas-admin/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..c4dd5e2
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/application-dev.yml
@@ -0,0 +1,370 @@
+# 应用服务器
+server:
+ tomcat:
+ uri-encoding: UTF-8 #tomcat编码
+ port: 40000 #tomcat端口
+
+spring:
+ messages:
+ basename: i18n/message
+ # 一天刷新一次
+ cache-duration: 24H
+ devtools: #spring开发者工具模块
+ restart:
+ enabled: true #热部署开关
+ freemarker:
+ cache: false #spring内置freemarker缓存
+ thymeleaf:
+ cache: false #spring内置thymeleaf缓存
+
+ # ===================== 数据源配置 =====================
+ exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure #排除自动配置,手动配置druid
+ datasource:
+ db-type: MySQL #数据库类型(可选值 MySQL、SQLServer、Oracle、DM8、KingbaseES、PostgreSQL,请严格按可选值填写)
+ # host: aliyun.szlecheng.cn
+ host: mysql.szlecheng.cn
+ port: 13306
+ username: jnpfsoft
+ password: ZtRmzjij4CiaXpSE
+ db-name: jnpfsoft_dev
+ db-schema: #金仓达梦选填
+ prepare-url: #自定义url
+
+ # ===================== 动态多数据源 =====================
+ dynamic:
+ primary: master #设置默认的数据源或者数据源组,默认值即为master
+ strict: true #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
+ druid:
+ # 空闲时执行连接测试
+ test-while-idle: true
+ # 连接测试最小间隔
+ time-between-eviction-runs-millis: 60000
+ # 获取连接等待3秒 根据网络情况设定
+ max-wait: 3000
+ # 初始化4个连接
+ initial-size: 4
+ # 最大20个连接
+ max-active: 20
+ # 最少保持4个空闲连接
+ min-idle: 4
+ # 空闲连接保活, 超过配置的空闲时间会进行连接检查完成保活操作(数据库自身会断开达到空闲时间的连接, 程序使用断开的连接会报错)
+ keep-alive: true
+ # 连接超时
+ connect-timeout: 10000
+ # 连接超时
+ socket-timeout: 10000
+ # 查询超时
+ query-timeout: 90000
+ # 事务查询超时
+ transaction-query-timeout: 90000
+ # 解除注释后Druid连接池打印SQL语句 忽略日志等级配置
+ # filters: slf4j
+ slf4j:
+ statementLogEnabled: true
+ resultSetLogEnabled: false
+ connectionLogEnabled: false
+ dataSourceLogEnabled: false
+ statementCreateAfterLogEnabled: false
+ statementCloseAfterLogEnabled: false
+ statementExecuteAfterLogEnabled: false
+ #打印SQL替换参数
+ statementExecutableSqlLogEnable: true
+ statementPrepareAfterLogEnabled: false
+ statementPrepareCallAfterLogEnabled: false
+ statementParameterSetLogEnabled: false
+ # datasource:
+ # master:
+ # url: jdbc:mysql://${spring.datasource.host}:${spring.datasource.port}/${spring.datasource.dbname}?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
+ # username: ${spring.datasource.username}
+ # password: ${spring.datasource.password}
+ # driver-class-name: com.mysql.cj.jdbc.Driver
+
+ # ===================== Redis配置 =====================
+ # redis单机模式
+ data:
+ redis:
+ database: 10
+ host: 127.0.0.1
+ port: 6379
+ # password: redis_JtjYRD # 密码为空时,请将本行注释
+ timeout: 3000 #超时时间(单位:秒)
+ lettuce: #Lettuce为Redis的Java驱动包
+ pool:
+ max-active: 8 # 连接池最大连接数
+ max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ min-idle: 0 # 连接池中的最小空闲连接
+ max-idle: 8 # 连接池中的最大空闲连接
+
+ # redis集群模式
+ # redis:
+ # cluster:
+ # nodes:
+ # - 192.168.0.225:6380
+ # - 192.168.0.225:6381
+ # - 192.168.0.225:6382
+ # - 192.168.0.225:6383
+ # - 192.168.0.225:6384
+ # - 192.168.0.225:6385
+ # password: 123456 # 密码为空时,请将本行注释
+ # timeout: 3000 # 超时时间(单位:秒)
+ # lettuce: #Lettuce为Redis的Java驱动包
+ # pool:
+ # max-active: 8 # 连接池最大连接数
+ # max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ # min-idle: 0 # 连接池中的最小空闲连接
+ # max-idle: 8 # 连接池中的最大空闲连接
+ # ===================== Redis配置-End =====================
+ # ===================== 单点登录(用户信息同步)配置-Start =====================
+ cloud:
+ stream:
+ # 若使用RocketMQ-Start
+ rocketmq:
+ binder:
+ name-server: 192.168.10.6:30094
+ group: maxkey_identity
+ # 若使用RocketMQ-End
+ # 若使用RabbitMQ-Start
+ # binders:
+ # defaultRabbit: # 表示定义的名称,用于binding整合
+ # type: rabbit # 消息组件类型
+ # environment: # 设置rabbitmq的相关环境配置
+ # spring:
+ # rabbitmq:
+ # host: 192.168.10.6
+ # port: 5672
+ # username: rabbitmq
+ # password: rabbitmq
+ # 若使用RabbitMQ-End
+ # 若使用Kafka-Start
+ # kafka:
+ # # KafkaBinderConfigurationProperties
+ # binder:
+ # brokers: 192.168.10.6:9092
+ # 若使用Kafka-End
+ bindings:
+ ssoEventReceiver-in-0:
+ content-type: text/json
+ destination: MXK_IDENTITY_MAIN_TOPIC
+ group: maxkey_identity
+ # ===================== 单点登录(用户信息同步)配置-End =====================
+ # ===================== AI配置-Start =====================
+ ai:
+ openai:
+ enabled: true
+ # 超时时间, 秒, 根据AI平台性能调整超时时间
+ timeout: 300
+
+ # 阿里百联平台
+ api-host: https://dashscope.aliyuncs.com/compatible-mode/
+ api-key: sk-def0e6d9d0f8497cb5bcfff8c0c19935
+ chat:
+ mode: qwen-max
+
+ # GPT转发平台
+ # api-host: https://api.chatanywhere.tech/
+ # api-key:
+ # chat:
+ # mode: gpt-3.5-turbo
+
+ # DeepSeek
+ # api-host: https://api.deepseek.com/v1/
+ # api-key:
+ # chat:
+ # mode: deepseek-chat
+
+ # ===================== AI配置-End =====================
+# SpringDoc接口文档 访问地址:http://127.0.0.1:30000/doc.html
+springdoc:
+ default-flat-param-object: true
+ api-docs:
+ enabled: true
+#SpringDoc增强
+#knife4j:
+# enable: true
+# basic: #接口文档访问鉴权
+# enable: true
+# username: yunzhupaas
+# password: 123456
+
+lock4j:
+ aop:
+ # Lock4j注解是否启用
+ enabled: false
+
+config:
+ # ===================== 是否开启测试环境 =====================
+ TestVersion: false
+ # ===================== ApacheShardingSphere 配置开关 =====================
+ sharding-sphere-enabled: false
+ # ===================== 文件存储配置-Start =====================
+ file-storage: #文件存储配置,不使用的情况下可以不写
+ default-platform: local-plus-1 #默认使用的存储平台
+ thumbnail-suffix: ".thumb.jpg" #缩略图后缀,例如【.min.jpg】【.png】
+ local-plus: # 本地存储升级版
+ - platform: local-plus-1 # 存储平台标识
+ enable-storage: true #启用存储
+ enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高)
+ domain: "" # 访问域名,例如:“http://127.0.0.1:8030/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名
+ # base-path: /data/work-data/upload/jnpfsoft/yunzhupaas-resources/ # 基础路径
+ base-path: E:/XiangMu/yunzhu/zero-resources/ # 基础路径
+ path-patterns: /** # 访问路径
+ storage-path: # 存储路径
+ aliyun-oss: # 阿里云 OSS ,不使用的情况下可以不写
+ - platform: aliyun-oss-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ end-point: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/
+ base-path: hy/ # 基础路径
+ qiniu-kodo: # 七牛云 kodo ,不使用的情况下可以不写
+ - platform: qiniu-kodo-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:http://abc.hn-bkt.clouddn.com/
+ base-path: base/ # 基础路径
+ tencent-cos: # 腾讯云 COS
+ - platform: tencent-cos-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ secret-id: ??
+ secret-key: ??
+ region: ?? #存仓库所在地域
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.cos.ap-nanjing.myqcloud.com/
+ base-path: hy/ # 基础路径
+ minio: # MinIO,由于 MinIO SDK 支持 AWS S3,其它兼容 AWS S3 协议的存储平台也都可配置在这里
+ - platform: minio-1 # 存储平台标识
+ enable-storage: true # 启用存储
+ access-key: 9Y3sjaDWgbxKjXjm
+ secret-key: Bs2GyJwmOLpqNsQwbDjdinyUJQHtM0rc
+ end-point: http://192.168.0.207:9000/
+ bucket-name: v350
+ domain: ${config.file-storage.minio[0].end-point} # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
+ base-path: # 基础路径
+ # ===================== 文件存储配置-End =====================
+# ===================== 第三方登录配置-Start =====================
+socials:
+ # 第三方登录功能开关(false-关闭,true-开启)
+ socials-enabled: false
+ config:
+ - # 微信
+ provider: wechat_open
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # qq
+ provider: qq
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 企业微信
+ provider: wechat_enterprise
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 钉钉
+ provider: dingtalk
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 飞书
+ provider: feishu
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 小程序
+ provider: wechat_applets
+ client-id: your-client-id
+ client-secret: your-client-secret
+# ===================== 第三方登录配置-End =====================
+# ===================== 任务调度配置-Start =====================
+xxl:
+ job:
+ accessToken: '432e62f3b488bc861d91b0e274e850cc'
+ i18n: zh_CN
+ logretentiondays: 30
+ triggerpool:
+ fast:
+ max: 200
+ slow:
+ max: 100
+ # xxl-job服务端地址
+ admin:
+ addresses: http://127.0.0.1:30020/xxl-job-admin/
+ executor:
+ address: ''
+ appname: xxl-job-executor-sample1
+ ip: ''
+ logpath: /data/applogs/xxl-job/jobhandler
+ logretentiondays: 30
+ port: 39999
+ # rest调用xxl-job接口地址
+ admin:
+ register:
+ handle-query-address: ${xxl.job.admin.addresses}api/handler/queryList
+ job-info-address: ${xxl.job.admin.addresses}api/jobinfo
+ log-query-address: ${xxl.job.admin.addresses}api/log
+ task-list-address: ${xxl.job.admin.addresses}api/ScheduleTask/List
+ task-info-address: ${xxl.job.admin.addresses}api/ScheduleTask/getInfo
+ task-save-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-update-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/remove
+ task-start-or-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/updateTask
+# ===================== 任务调度配置-End =====================
+# ===================== 单点登录(SSO)配置-Start =====================
+yunzhupaas:
+ sso:
+ # ===================== 单点登录(用户信息拉取)配置-Start =====================
+ connector:
+ # 是否开启用户信息拉取
+ enabled: false
+ # ===================== 单点登录(用户信息拉取)配置-End =====================
+ # ===================== 单点登录(用户信息推送)配置-Start =====================
+ pull:
+ # 是否开启用户信息推送
+ enabled: false
+ create-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ replace-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ change-password-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account/changePassword
+ delete-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ credential-type: Basic
+ user-name: 747887288041603072
+ password: MYgMMjIwNzIwMjIxNTU4MTAxNzQlKQ
+ # ===================== 单点登录(用户信息推送)配置-End =====================
+oauth:
+ #启用单点登录, 普通登录不可用
+ ssoEnabled: false
+ #轮询票据有效期
+ ticketTimeout: 120
+ #默认单点登录协议
+ defaultSSO: cas
+ #后端登录接口地址
+ loginPath: http://127.0.0.1:30000/api/oauth/Login
+ #login:
+ #JWT生成秘钥 不填写为默认值
+ #jwtSecretKey: WviMjFNC72VKwGqm5LPoheQo5XN9iN4d
+ sso:
+ #单点登录系统地址
+ baseUrl: http://127.0.0.1:8527
+ #登录成功后跳转到前端的页面
+ sucessFrontUrl: http://127.0.0.1:3100/sso
+ #错误信息是否输出到页面
+ ticketOutMessage: false
+ #logoutFrontUrl: http://sso.maxkey.top:8527/maxkey
+ #单点注销后端接口地址, 配置启用后YUNZHUPAAS退出会请求单点系统退出, 触发单点注销退出全部应用
+ #ssoLogoutApiUrl: ${oauth.sso.baseUrl}/sign/logout
+ auth2:
+ enabled: true
+ clientId: 747887288041603072
+ clientSecret: MYgMMjIwNzIwMjIxNTU4MTAxNzQlKQ
+ baseUrl: ${oauth.sso.baseUrl}
+ authorizeUrl: ${oauth.sso.auth2.baseUrl}/sign/authz/oauth/v20/authorize
+ accessTokenUrl: ${oauth.sso.auth2.baseUrl}/sign/authz/oauth/v20/token
+ userInfoUrl: ${oauth.sso.auth2.baseUrl}/sign/api/oauth/v20/me
+ cas:
+ enabled: true
+ baseUrl: ${oauth.sso.baseUrl}
+ serverLoginUrl: ${oauth.sso.cas.baseUrl}/sign/authz/cas/login
+ serverValidateUrl: ${oauth.sso.cas.baseUrl}/sign/authz/cas
+# ===================== 单点登录(SSO)配置-End =====================
+userUrl: http://192.168.3.31:8000/api-web/sys/user/save
\ No newline at end of file
diff --git a/yunzhupaas-admin/src/main/resources/application-preview.yml b/yunzhupaas-admin/src/main/resources/application-preview.yml
new file mode 100644
index 0000000..67c211f
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/application-preview.yml
@@ -0,0 +1,336 @@
+# 应用服务器
+server:
+ tomcat:
+ uri-encoding: UTF-8 #tomcat编码
+ port: 30000 #tomcat端口
+
+spring:
+ messages:
+ basename: i18n/message
+ # 一天刷新一次
+ cache-duration: 24H
+ devtools: #spring开发者工具模块
+ restart:
+ enabled: true #热部署开关
+ freemarker:
+ cache: false #spring内置freemarker缓存
+ thymeleaf:
+ cache: false #spring内置thymeleaf缓存
+
+ # ===================== 数据源配置 =====================
+ exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure #排除自动配置,手动配置druid
+ datasource:
+ db-type: MySQL #数据库类型(可选值 MySQL、SQLServer、Oracle、DM、KingbaseES、PostgreSQL,请严格按可选值填写)
+ host: 127.0.0.1
+ port: 3306
+ username: root
+ password: 123456
+ db-name: yunzhupaas_init
+ db-schema: #金仓达梦选填
+ prepare-url: #自定义url
+
+ # ===================== 动态多数据源 =====================
+ dynamic:
+ primary: master #设置默认的数据源或者数据源组,默认值即为master
+ strict: true #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
+ druid:
+ # 空闲时执行连接测试
+ test-while-idle: true
+ # 连接测试最小间隔
+ time-between-eviction-runs-millis: 60000
+ # 获取连接等待3秒 根据网络情况设定
+ max-wait: 3000
+ # 初始化4个连接
+ initial-size: 4
+ # 最大20个连接
+ max-active: 20
+ # 最少保持4个空闲连接
+ min-idle: 4
+ # 空闲连接保活, 超过配置的空闲时间会进行连接检查完成保活操作(数据库自身会断开达到空闲时间的连接, 程序使用断开的连接会报错)
+ keep-alive: true
+ # 连接超时
+ connect-timeout: 10000
+ # 连接超时
+ socket-timeout: 10000
+ # 查询超时
+ query-timeout: 90000
+ # 事务查询超时
+ transaction-query-timeout: 90000
+ # 解除注释后Druid连接池打印SQL语句 忽略日志等级配置
+ # filters: slf4j
+ slf4j:
+ statementLogEnabled: true
+ resultSetLogEnabled: false
+ connectionLogEnabled: false
+ dataSourceLogEnabled: false
+ statementCreateAfterLogEnabled: false
+ statementCloseAfterLogEnabled: false
+ statementExecuteAfterLogEnabled: false
+ #打印SQL替换参数
+ statementExecutableSqlLogEnable: true
+ statementPrepareAfterLogEnabled: false
+ statementPrepareCallAfterLogEnabled: false
+ statementParameterSetLogEnabled: false
+ # datasource:
+ # master:
+ # url: jdbc:mysql://${spring.datasource.host}:${spring.datasource.port}/${spring.datasource.dbname}?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
+ # username: ${spring.datasource.username}
+ # password: ${spring.datasource.password}
+ # driver-class-name: com.mysql.cj.jdbc.Driver
+
+ # ===================== Redis配置-Start =====================
+ # redis单机模式
+ redis:
+ database: 1 #缓存库编号
+ host: 127.0.0.1
+ port: 6379
+ password: 123456 # 密码为空时,请将本行注释
+ timeout: 3000 #超时时间(单位:秒)
+ lettuce: #Lettuce为Redis的Java驱动包
+ pool:
+ max-active: 8 # 连接池最大连接数
+ max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ min-idle: 0 # 连接池中的最小空闲连接
+ max-idle: 8 # 连接池中的最大空闲连接
+
+ # redis集群模式
+ # redis:
+ # cluster:
+ # nodes:
+ # - 192.168.0.225:6380
+ # - 192.168.0.225:6381
+ # - 192.168.0.225:6382
+ # - 192.168.0.225:6383
+ # - 192.168.0.225:6384
+ # - 192.168.0.225:6385
+ # password: 123456 # 密码为空时,请将本行注释
+ # timeout: 3000 # 超时时间(单位:秒)
+ # lettuce: #Lettuce为Redis的Java驱动包
+ # pool:
+ # max-active: 8 # 连接池最大连接数
+ # max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ # min-idle: 0 # 连接池中的最小空闲连接
+ # max-idle: 8 # 连接池中的最大空闲连接
+ # ===================== Redis配置-End =====================
+ # ===================== 单点登录(用户信息同步)配置-Start =====================
+ cloud:
+ stream:
+ # 若使用RocketMQ-Start
+ rocketmq:
+ binder:
+ name-server: 192.168.10.6:30094
+ group: maxkey_identity
+ # 若使用RocketMQ-End
+ # 若使用RabbitMQ-Start
+ # binders:
+ # defaultRabbit: # 表示定义的名称,用于binding整合
+ # type: rabbit # 消息组件类型
+ # environment: # 设置rabbitmq的相关环境配置
+ # spring:
+ # rabbitmq:
+ # host: 192.168.10.6
+ # port: 5672
+ # username: rabbitmq
+ # password: rabbitmq
+ # 若使用RabbitMQ-End
+ # 若使用Kafka-Start
+ # kafka:
+ # # KafkaBinderConfigurationProperties
+ # binder:
+ # brokers: 192.168.10.6:9092
+ # 若使用Kafka-End
+ bindings:
+ ssoEventReceiver-in-0:
+ content-type: text/json
+ destination: MXK_IDENTITY_MAIN_TOPIC
+ group: maxkey_identity
+ # ===================== 单点登录(用户信息同步)配置-End =====================
+# SpringDoc接口文档 访问地址:http://127.0.0.1:30000/doc.html
+springdoc:
+ default-flat-param-object: true
+ api-docs:
+ enabled: true
+#SpringDoc增强
+#knife4j:
+# enable: true
+# basic: #接口文档访问鉴权
+# enable: true
+# username: yunzhupaas
+# password: 123456
+
+lock4j:
+ aop:
+ # Lock4j注解是否启用
+ enabled: false
+
+config:
+ # ===================== 是否开启测试环境 =====================
+ TestVersion: false
+ # ===================== ApacheShardingSphere 配置开关 =====================
+ sharding-sphere-enabled: false
+ # ===================== 文件存储配置-Start =====================
+ file-storage: #文件存储配置,不使用的情况下可以不写
+ default-platform: local-plus-1 #默认使用的存储平台
+ thumbnail-suffix: ".thumb.jpg" #缩略图后缀,例如【.min.jpg】【.png】
+ local-plus: # 本地存储升级版
+ - platform: local-plus-1 # 存储平台标识
+ enable-storage: true #启用存储
+ enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高)
+ domain: "" # 访问域名,例如:“http://127.0.0.1:8030/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名
+ base-path: D:/project/yunzhupaas-resources/ # 基础路径
+ path-patterns: /** # 访问路径
+ storage-path: # 存储路径
+ aliyun-oss: # 阿里云 OSS ,不使用的情况下可以不写
+ - platform: aliyun-oss-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ end-point: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/
+ base-path: hy/ # 基础路径
+ qiniu-kodo: # 七牛云 kodo ,不使用的情况下可以不写
+ - platform: qiniu-kodo-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:http://abc.hn-bkt.clouddn.com/
+ base-path: base/ # 基础路径
+ tencent-cos: # 腾讯云 COS
+ - platform: tencent-cos-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ secret-id: ??
+ secret-key: ??
+ region: ?? #存仓库所在地域
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.cos.ap-nanjing.myqcloud.com/
+ base-path: hy/ # 基础路径
+ minio: # MinIO,由于 MinIO SDK 支持 AWS S3,其它兼容 AWS S3 协议的存储平台也都可配置在这里
+ - platform: minio-1 # 存储平台标识
+ enable-storage: true # 启用存储
+ access-key: 9Y3sjaDWgbxKjXjm
+ secret-key: Bs2GyJwmOLpqNsQwbDjdinyUJQHtM0rc
+ end-point: http://192.168.0.207:9000/
+ bucket-name: v350
+ domain: ${config.file-storage.minio[0].end-point} # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
+ base-path: # 基础路径
+ # ===================== 文件存储配置-End =====================
+# ===================== 第三方登录配置-Start =====================
+socials:
+ # 第三方登录功能开关(false-关闭,true-开启)
+ socials-enabled: false
+ config:
+ - # 微信
+ provider: wechat_open
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # qq
+ provider: qq
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 企业微信
+ provider: wechat_enterprise
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 钉钉
+ provider: dingtalk
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 飞书
+ provider: feishu
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 小程序
+ provider: wechat_applets
+ client-id: your-client-id
+ client-secret: your-client-secret
+# ===================== 第三方登录配置-End =====================
+# ===================== 任务调度配置-Start =====================
+xxl:
+ job:
+ accessToken: '432e62f3b488bc861d91b0e274e850cc'
+ i18n: zh_CN
+ logretentiondays: 30
+ triggerpool:
+ fast:
+ max: 200
+ slow:
+ max: 100
+ # xxl-job服务端地址
+ admin:
+ addresses: http://127.0.0.1:30020/xxl-job-admin/
+ executor:
+ address: ''
+ appname: xxl-job-executor-sample1
+ ip: ''
+ logpath: /data/applogs/xxl-job/jobhandler
+ logretentiondays: 30
+ port: 39999
+ # rest调用xxl-job接口地址
+ admin:
+ register:
+ handle-query-address: ${xxl.job.admin.addresses}api/handler/queryList
+ job-info-address: ${xxl.job.admin.addresses}api/jobinfo
+ log-query-address: ${xxl.job.admin.addresses}api/log
+ task-list-address: ${xxl.job.admin.addresses}api/ScheduleTask/List
+ task-info-address: ${xxl.job.admin.addresses}api/ScheduleTask/getInfo
+ task-save-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-update-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/remove
+ task-start-or-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/updateTask
+# ===================== 任务调度配置-End =====================
+# ===================== 单点登录(SSO)配置-Start =====================
+yunzhupaas:
+ sso:
+ # ===================== 单点登录(用户信息拉取)配置-Start =====================
+ connector:
+ # 是否开启用户信息拉取
+ enabled: false
+ # ===================== 单点登录(用户信息拉取)配置-End =====================
+ # ===================== 单点登录(用户信息推送)配置-Start =====================
+ pull:
+ # 是否开启用户信息推送
+ enabled: false
+ create-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ replace-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ change-password-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account/changePassword
+ delete-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ credential-type: Basic
+ user-name: 747887288041603072
+ password: MYgMMjIwNzIwMjIxNTU4MTAxNzQlKQ
+ # ===================== 单点登录(用户信息推送)配置-End =====================
+oauth:
+ #启用单点登录, 普通登录不可用
+ ssoEnabled: false
+ #轮询票据有效期
+ ticketTimeout: 120
+ #默认单点登录协议
+ defaultSSO: cas
+ #后端登录接口地址
+ loginPath: http://127.0.0.1:30000/api/oauth/Login
+ #轮询登录模式是否输出结果
+ ticketOutMessage: false
+ login:
+ #JWT生成秘钥 不填写为默认值
+ #jwtSecretKey: WviMjFNC72VKwGqm5LPoheQo5XN9iN4d
+ sso:
+ #登录成功后跳转到前端的页面
+ sucessFrontUrl: http://127.0.0.1:3000/sso
+ #logoutFrontUrl: http://sso.maxkey.top:8527/maxkey
+ auth2:
+ enabled: true
+ clientId: 747887288041603072
+ clientSecret: MYgMMjIwNzIwMjIxNTU4MTAxNzQlKQ
+ baseUrl: http://127.0.0.1:8527
+ authorizeUrl: ${oauth.sso.auth2.baseUrl}/sign/authz/oauth/v20/authorize
+ accessTokenUrl: ${oauth.sso.auth2.baseUrl}/sign/authz/oauth/v20/token
+ userInfoUrl: ${oauth.sso.auth2.baseUrl}/sign/api/oauth/v20/me
+ cas:
+ enabled: true
+ baseUrl: ${oauth.sso.auth2.baseUrl}
+ serverLoginUrl: ${oauth.sso.cas.baseUrl}/sign/authz/cas/login
+ serverValidateUrl: ${oauth.sso.cas.baseUrl}/sign/authz/cas
+# ===================== 单点登录(SSO)配置-End =====================
diff --git a/yunzhupaas-admin/src/main/resources/application-prod.yml b/yunzhupaas-admin/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..8bc68ed
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/application-prod.yml
@@ -0,0 +1,370 @@
+# 应用服务器
+server:
+ tomcat:
+ uri-encoding: UTF-8 #tomcat编码
+ port: 40001 #tomcat端口
+
+spring:
+ messages:
+ basename: i18n/message
+ # 一天刷新一次
+ cache-duration: 24H
+ devtools: #spring开发者工具模块
+ restart:
+ enabled: true #热部署开关
+ freemarker:
+ cache: false #spring内置freemarker缓存
+ thymeleaf:
+ cache: false #spring内置thymeleaf缓存
+
+ # ===================== 数据源配置 =====================
+ exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure #排除自动配置,手动配置druid
+ datasource:
+ db-type: MySQL #数据库类型(可选值 MySQL、SQLServer、Oracle、DM8、KingbaseES、PostgreSQL,请严格按可选值填写)
+ # host: aliyun.szlecheng.cn
+ host: mysql.szlecheng.cn
+ port: 13306
+ username: yunzhupass
+ password: '@yunzhupass'
+ db-name: pord_yunzhupass
+ db-schema: #金仓达梦选填
+ prepare-url: #自定义url
+
+ # ===================== 动态多数据源 =====================
+ dynamic:
+ primary: master #设置默认的数据源或者数据源组,默认值即为master
+ strict: true #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
+ druid:
+ # 空闲时执行连接测试
+ test-while-idle: true
+ # 连接测试最小间隔
+ time-between-eviction-runs-millis: 60000
+ # 获取连接等待3秒 根据网络情况设定
+ max-wait: 3000
+ # 初始化4个连接
+ initial-size: 4
+ # 最大20个连接
+ max-active: 20
+ # 最少保持4个空闲连接
+ min-idle: 4
+ # 空闲连接保活, 超过配置的空闲时间会进行连接检查完成保活操作(数据库自身会断开达到空闲时间的连接, 程序使用断开的连接会报错)
+ keep-alive: true
+ # 连接超时
+ connect-timeout: 10000
+ # 连接超时
+ socket-timeout: 10000
+ # 查询超时
+ query-timeout: 90000
+ # 事务查询超时
+ transaction-query-timeout: 90000
+ # 解除注释后Druid连接池打印SQL语句 忽略日志等级配置
+ # filters: slf4j
+ slf4j:
+ statementLogEnabled: true
+ resultSetLogEnabled: false
+ connectionLogEnabled: false
+ dataSourceLogEnabled: false
+ statementCreateAfterLogEnabled: false
+ statementCloseAfterLogEnabled: false
+ statementExecuteAfterLogEnabled: false
+ #打印SQL替换参数
+ statementExecutableSqlLogEnable: true
+ statementPrepareAfterLogEnabled: false
+ statementPrepareCallAfterLogEnabled: false
+ statementParameterSetLogEnabled: false
+ # datasource:
+ # master:
+ # url: jdbc:mysql://${spring.datasource.host}:${spring.datasource.port}/${spring.datasource.dbname}?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
+ # username: ${spring.datasource.username}
+ # password: ${spring.datasource.password}
+ # driver-class-name: com.mysql.cj.jdbc.Driver
+
+ # ===================== Redis配置 =====================
+ # redis单机模式
+ data:
+ redis:
+ database: 10
+ host: 127.0.0.1
+ port: 6379
+ # password: redis_JtjYRD # 密码为空时,请将本行注释
+ timeout: 3000 #超时时间(单位:秒)
+ lettuce: #Lettuce为Redis的Java驱动包
+ pool:
+ max-active: 8 # 连接池最大连接数
+ max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ min-idle: 0 # 连接池中的最小空闲连接
+ max-idle: 8 # 连接池中的最大空闲连接
+
+ # redis集群模式
+ # redis:
+ # cluster:
+ # nodes:
+ # - 192.168.0.225:6380
+ # - 192.168.0.225:6381
+ # - 192.168.0.225:6382
+ # - 192.168.0.225:6383
+ # - 192.168.0.225:6384
+ # - 192.168.0.225:6385
+ # password: 123456 # 密码为空时,请将本行注释
+ # timeout: 3000 # 超时时间(单位:秒)
+ # lettuce: #Lettuce为Redis的Java驱动包
+ # pool:
+ # max-active: 8 # 连接池最大连接数
+ # max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ # min-idle: 0 # 连接池中的最小空闲连接
+ # max-idle: 8 # 连接池中的最大空闲连接
+ # ===================== Redis配置-End =====================
+ # ===================== 单点登录(用户信息同步)配置-Start =====================
+ cloud:
+ stream:
+ # 若使用RocketMQ-Start
+ rocketmq:
+ binder:
+ name-server: 192.168.10.6:30094
+ group: maxkey_identity
+ # 若使用RocketMQ-End
+ # 若使用RabbitMQ-Start
+ # binders:
+ # defaultRabbit: # 表示定义的名称,用于binding整合
+ # type: rabbit # 消息组件类型
+ # environment: # 设置rabbitmq的相关环境配置
+ # spring:
+ # rabbitmq:
+ # host: 192.168.10.6
+ # port: 5672
+ # username: rabbitmq
+ # password: rabbitmq
+ # 若使用RabbitMQ-End
+ # 若使用Kafka-Start
+ # kafka:
+ # # KafkaBinderConfigurationProperties
+ # binder:
+ # brokers: 192.168.10.6:9092
+ # 若使用Kafka-End
+ bindings:
+ ssoEventReceiver-in-0:
+ content-type: text/json
+ destination: MXK_IDENTITY_MAIN_TOPIC
+ group: maxkey_identity
+ # ===================== 单点登录(用户信息同步)配置-End =====================
+ # ===================== AI配置-Start =====================
+ ai:
+ openai:
+ enabled: true
+ # 超时时间, 秒, 根据AI平台性能调整超时时间
+ timeout: 300
+
+ # 阿里百联平台
+ api-host: https://dashscope.aliyuncs.com/compatible-mode/
+ api-key: sk-def0e6d9d0f8497cb5bcfff8c0c19935
+ chat:
+ mode: qwen-max
+
+ # GPT转发平台
+ # api-host: https://api.chatanywhere.tech/
+ # api-key:
+ # chat:
+ # mode: gpt-3.5-turbo
+
+ # DeepSeek
+ # api-host: https://api.deepseek.com/v1/
+ # api-key:
+ # chat:
+ # mode: deepseek-chat
+
+ # ===================== AI配置-End =====================
+# SpringDoc接口文档 访问地址:http://127.0.0.1:30000/doc.html
+springdoc:
+ default-flat-param-object: true
+ api-docs:
+ enabled: true
+#SpringDoc增强
+#knife4j:
+# enable: true
+# basic: #接口文档访问鉴权
+# enable: true
+# username: yunzhupaas
+# password: 123456
+
+lock4j:
+ aop:
+ # Lock4j注解是否启用
+ enabled: false
+
+config:
+ # ===================== 是否开启测试环境 =====================
+ TestVersion: false
+ # ===================== ApacheShardingSphere 配置开关 =====================
+ sharding-sphere-enabled: false
+ # ===================== 文件存储配置-Start =====================
+ file-storage: #文件存储配置,不使用的情况下可以不写
+ default-platform: local-plus-1 #默认使用的存储平台
+ thumbnail-suffix: ".thumb.jpg" #缩略图后缀,例如【.min.jpg】【.png】
+ local-plus: # 本地存储升级版
+ - platform: local-plus-1 # 存储平台标识
+ enable-storage: true #启用存储
+ enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高)
+ domain: "" # 访问域名,例如:“http://127.0.0.1:8030/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名
+ # base-path: /data/work-data/upload/jnpfsoft/yunzhupaas-resources/ # 基础路径
+ base-path: E:/XiangMu/yunzhu/zero-resources/ # 基础路径
+ path-patterns: /** # 访问路径
+ storage-path: # 存储路径
+ aliyun-oss: # 阿里云 OSS ,不使用的情况下可以不写
+ - platform: aliyun-oss-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ end-point: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/
+ base-path: hy/ # 基础路径
+ qiniu-kodo: # 七牛云 kodo ,不使用的情况下可以不写
+ - platform: qiniu-kodo-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:http://abc.hn-bkt.clouddn.com/
+ base-path: base/ # 基础路径
+ tencent-cos: # 腾讯云 COS
+ - platform: tencent-cos-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ secret-id: ??
+ secret-key: ??
+ region: ?? #存仓库所在地域
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.cos.ap-nanjing.myqcloud.com/
+ base-path: hy/ # 基础路径
+ minio: # MinIO,由于 MinIO SDK 支持 AWS S3,其它兼容 AWS S3 协议的存储平台也都可配置在这里
+ - platform: minio-1 # 存储平台标识
+ enable-storage: true # 启用存储
+ access-key: 9Y3sjaDWgbxKjXjm
+ secret-key: Bs2GyJwmOLpqNsQwbDjdinyUJQHtM0rc
+ end-point: http://192.168.0.207:9000/
+ bucket-name: v350
+ domain: ${config.file-storage.minio[0].end-point} # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
+ base-path: # 基础路径
+ # ===================== 文件存储配置-End =====================
+# ===================== 第三方登录配置-Start =====================
+socials:
+ # 第三方登录功能开关(false-关闭,true-开启)
+ socials-enabled: false
+ config:
+ - # 微信
+ provider: wechat_open
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # qq
+ provider: qq
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 企业微信
+ provider: wechat_enterprise
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 钉钉
+ provider: dingtalk
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 飞书
+ provider: feishu
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 小程序
+ provider: wechat_applets
+ client-id: your-client-id
+ client-secret: your-client-secret
+# ===================== 第三方登录配置-End =====================
+# ===================== 任务调度配置-Start =====================
+xxl:
+ job:
+ accessToken: '432e62f3b488bc861d91b0e274e850cc'
+ i18n: zh_CN
+ logretentiondays: 30
+ triggerpool:
+ fast:
+ max: 200
+ slow:
+ max: 100
+ # xxl-job服务端地址
+ admin:
+ addresses: http://127.0.0.1:30020/xxl-job-admin/
+ executor:
+ address: ''
+ appname: xxl-job-executor-sample1
+ ip: ''
+ logpath: /data/applogs/xxl-job/jobhandler
+ logretentiondays: 30
+ port: 39999
+ # rest调用xxl-job接口地址
+ admin:
+ register:
+ handle-query-address: ${xxl.job.admin.addresses}api/handler/queryList
+ job-info-address: ${xxl.job.admin.addresses}api/jobinfo
+ log-query-address: ${xxl.job.admin.addresses}api/log
+ task-list-address: ${xxl.job.admin.addresses}api/ScheduleTask/List
+ task-info-address: ${xxl.job.admin.addresses}api/ScheduleTask/getInfo
+ task-save-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-update-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/remove
+ task-start-or-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/updateTask
+# ===================== 任务调度配置-End =====================
+# ===================== 单点登录(SSO)配置-Start =====================
+yunzhupaas:
+ sso:
+ # ===================== 单点登录(用户信息拉取)配置-Start =====================
+ connector:
+ # 是否开启用户信息拉取
+ enabled: false
+ # ===================== 单点登录(用户信息拉取)配置-End =====================
+ # ===================== 单点登录(用户信息推送)配置-Start =====================
+ pull:
+ # 是否开启用户信息推送
+ enabled: false
+ create-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ replace-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ change-password-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account/changePassword
+ delete-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ credential-type: Basic
+ user-name: 747887288041603072
+ password: MYgMMjIwNzIwMjIxNTU4MTAxNzQlKQ
+ # ===================== 单点登录(用户信息推送)配置-End =====================
+oauth:
+ #启用单点登录, 普通登录不可用
+ ssoEnabled: false
+ #轮询票据有效期
+ ticketTimeout: 120
+ #默认单点登录协议
+ defaultSSO: cas
+ #后端登录接口地址
+ loginPath: http://127.0.0.1:30000/api/oauth/Login
+ #login:
+ #JWT生成秘钥 不填写为默认值
+ #jwtSecretKey: WviMjFNC72VKwGqm5LPoheQo5XN9iN4d
+ sso:
+ #单点登录系统地址
+ baseUrl: http://127.0.0.1:8527
+ #登录成功后跳转到前端的页面
+ sucessFrontUrl: http://127.0.0.1:3100/sso
+ #错误信息是否输出到页面
+ ticketOutMessage: false
+ #logoutFrontUrl: http://sso.maxkey.top:8527/maxkey
+ #单点注销后端接口地址, 配置启用后YUNZHUPAAS退出会请求单点系统退出, 触发单点注销退出全部应用
+ #ssoLogoutApiUrl: ${oauth.sso.baseUrl}/sign/logout
+ auth2:
+ enabled: true
+ clientId: 747887288041603072
+ clientSecret: MYgMMjIwNzIwMjIxNTU4MTAxNzQlKQ
+ baseUrl: ${oauth.sso.baseUrl}
+ authorizeUrl: ${oauth.sso.auth2.baseUrl}/sign/authz/oauth/v20/authorize
+ accessTokenUrl: ${oauth.sso.auth2.baseUrl}/sign/authz/oauth/v20/token
+ userInfoUrl: ${oauth.sso.auth2.baseUrl}/sign/api/oauth/v20/me
+ cas:
+ enabled: true
+ baseUrl: ${oauth.sso.baseUrl}
+ serverLoginUrl: ${oauth.sso.cas.baseUrl}/sign/authz/cas/login
+ serverValidateUrl: ${oauth.sso.cas.baseUrl}/sign/authz/cas
+# ===================== 单点登录(SSO)配置-End =====================
+userUrl: http://192.168.3.31:8000/api-web/sys/user/save
\ No newline at end of file
diff --git a/yunzhupaas-admin/src/main/resources/application-test.yml b/yunzhupaas-admin/src/main/resources/application-test.yml
new file mode 100644
index 0000000..c068f11
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/application-test.yml
@@ -0,0 +1,370 @@
+# 应用服务器
+server:
+ tomcat:
+ uri-encoding: UTF-8 #tomcat编码
+ port: 40001 #tomcat端口
+
+spring:
+ messages:
+ basename: i18n/message
+ # 一天刷新一次
+ cache-duration: 24H
+ devtools: #spring开发者工具模块
+ restart:
+ enabled: true #热部署开关
+ freemarker:
+ cache: false #spring内置freemarker缓存
+ thymeleaf:
+ cache: false #spring内置thymeleaf缓存
+
+ # ===================== 数据源配置 =====================
+ exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure #排除自动配置,手动配置druid
+ datasource:
+ db-type: MySQL #数据库类型(可选值 MySQL、SQLServer、Oracle、DM8、KingbaseES、PostgreSQL,请严格按可选值填写)
+ # host: aliyun.szlecheng.cn
+ host: mysql.szlecheng.cn
+ port: 13306
+ username: oa_yunzhupaas
+ password: OAYUNZHUPAAS
+ db-name: oa_yunzhupass
+ db-schema: #金仓达梦选填
+ prepare-url: #自定义url
+
+ # ===================== 动态多数据源 =====================
+ dynamic:
+ primary: master #设置默认的数据源或者数据源组,默认值即为master
+ strict: true #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
+ druid:
+ # 空闲时执行连接测试
+ test-while-idle: true
+ # 连接测试最小间隔
+ time-between-eviction-runs-millis: 60000
+ # 获取连接等待3秒 根据网络情况设定
+ max-wait: 3000
+ # 初始化4个连接
+ initial-size: 4
+ # 最大20个连接
+ max-active: 20
+ # 最少保持4个空闲连接
+ min-idle: 4
+ # 空闲连接保活, 超过配置的空闲时间会进行连接检查完成保活操作(数据库自身会断开达到空闲时间的连接, 程序使用断开的连接会报错)
+ keep-alive: true
+ # 连接超时
+ connect-timeout: 10000
+ # 连接超时
+ socket-timeout: 10000
+ # 查询超时
+ query-timeout: 90000
+ # 事务查询超时
+ transaction-query-timeout: 90000
+ # 解除注释后Druid连接池打印SQL语句 忽略日志等级配置
+ # filters: slf4j
+ slf4j:
+ statementLogEnabled: true
+ resultSetLogEnabled: false
+ connectionLogEnabled: false
+ dataSourceLogEnabled: false
+ statementCreateAfterLogEnabled: false
+ statementCloseAfterLogEnabled: false
+ statementExecuteAfterLogEnabled: false
+ #打印SQL替换参数
+ statementExecutableSqlLogEnable: true
+ statementPrepareAfterLogEnabled: false
+ statementPrepareCallAfterLogEnabled: false
+ statementParameterSetLogEnabled: false
+ # datasource:
+ # master:
+ # url: jdbc:mysql://${spring.datasource.host}:${spring.datasource.port}/${spring.datasource.dbname}?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
+ # username: ${spring.datasource.username}
+ # password: ${spring.datasource.password}
+ # driver-class-name: com.mysql.cj.jdbc.Driver
+
+ # ===================== Redis配置 =====================
+ # redis单机模式
+ data:
+ redis:
+ database: 10
+ host: 127.0.0.1
+ port: 6379
+ # password: redis_JtjYRD # 密码为空时,请将本行注释
+ timeout: 3000 #超时时间(单位:秒)
+ lettuce: #Lettuce为Redis的Java驱动包
+ pool:
+ max-active: 8 # 连接池最大连接数
+ max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ min-idle: 0 # 连接池中的最小空闲连接
+ max-idle: 8 # 连接池中的最大空闲连接
+
+ # redis集群模式
+ # redis:
+ # cluster:
+ # nodes:
+ # - 192.168.0.225:6380
+ # - 192.168.0.225:6381
+ # - 192.168.0.225:6382
+ # - 192.168.0.225:6383
+ # - 192.168.0.225:6384
+ # - 192.168.0.225:6385
+ # password: 123456 # 密码为空时,请将本行注释
+ # timeout: 3000 # 超时时间(单位:秒)
+ # lettuce: #Lettuce为Redis的Java驱动包
+ # pool:
+ # max-active: 8 # 连接池最大连接数
+ # max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ # min-idle: 0 # 连接池中的最小空闲连接
+ # max-idle: 8 # 连接池中的最大空闲连接
+ # ===================== Redis配置-End =====================
+ # ===================== 单点登录(用户信息同步)配置-Start =====================
+ cloud:
+ stream:
+ # 若使用RocketMQ-Start
+ rocketmq:
+ binder:
+ name-server: 192.168.10.6:30094
+ group: maxkey_identity
+ # 若使用RocketMQ-End
+ # 若使用RabbitMQ-Start
+ # binders:
+ # defaultRabbit: # 表示定义的名称,用于binding整合
+ # type: rabbit # 消息组件类型
+ # environment: # 设置rabbitmq的相关环境配置
+ # spring:
+ # rabbitmq:
+ # host: 192.168.10.6
+ # port: 5672
+ # username: rabbitmq
+ # password: rabbitmq
+ # 若使用RabbitMQ-End
+ # 若使用Kafka-Start
+ # kafka:
+ # # KafkaBinderConfigurationProperties
+ # binder:
+ # brokers: 192.168.10.6:9092
+ # 若使用Kafka-End
+ bindings:
+ ssoEventReceiver-in-0:
+ content-type: text/json
+ destination: MXK_IDENTITY_MAIN_TOPIC
+ group: maxkey_identity
+ # ===================== 单点登录(用户信息同步)配置-End =====================
+ # ===================== AI配置-Start =====================
+ ai:
+ openai:
+ enabled: true
+ # 超时时间, 秒, 根据AI平台性能调整超时时间
+ timeout: 300
+
+ # 阿里百联平台
+ api-host: https://dashscope.aliyuncs.com/compatible-mode/
+ api-key: sk-def0e6d9d0f8497cb5bcfff8c0c19935
+ chat:
+ mode: qwen-max
+
+ # GPT转发平台
+ # api-host: https://api.chatanywhere.tech/
+ # api-key:
+ # chat:
+ # mode: gpt-3.5-turbo
+
+ # DeepSeek
+ # api-host: https://api.deepseek.com/v1/
+ # api-key:
+ # chat:
+ # mode: deepseek-chat
+
+ # ===================== AI配置-End =====================
+# SpringDoc接口文档 访问地址:http://127.0.0.1:30000/doc.html
+springdoc:
+ default-flat-param-object: true
+ api-docs:
+ enabled: true
+#SpringDoc增强
+#knife4j:
+# enable: true
+# basic: #接口文档访问鉴权
+# enable: true
+# username: yunzhupaas
+# password: 123456
+
+lock4j:
+ aop:
+ # Lock4j注解是否启用
+ enabled: false
+
+config:
+ # ===================== 是否开启测试环境 =====================
+ TestVersion: false
+ # ===================== ApacheShardingSphere 配置开关 =====================
+ sharding-sphere-enabled: false
+ # ===================== 文件存储配置-Start =====================
+ file-storage: #文件存储配置,不使用的情况下可以不写
+ default-platform: local-plus-1 #默认使用的存储平台
+ thumbnail-suffix: ".thumb.jpg" #缩略图后缀,例如【.min.jpg】【.png】
+ local-plus: # 本地存储升级版
+ - platform: local-plus-1 # 存储平台标识
+ enable-storage: true #启用存储
+ enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高)
+ domain: "" # 访问域名,例如:“http://127.0.0.1:8030/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名
+ # base-path: /data/work-data/upload/jnpfsoft/yunzhupaas-resources/ # 基础路径
+ base-path: E:/XiangMu/yunzhu/zero-resources/ # 基础路径
+ path-patterns: /** # 访问路径
+ storage-path: # 存储路径
+ aliyun-oss: # 阿里云 OSS ,不使用的情况下可以不写
+ - platform: aliyun-oss-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ end-point: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/
+ base-path: hy/ # 基础路径
+ qiniu-kodo: # 七牛云 kodo ,不使用的情况下可以不写
+ - platform: qiniu-kodo-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ access-key: ??
+ secret-key: ??
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:http://abc.hn-bkt.clouddn.com/
+ base-path: base/ # 基础路径
+ tencent-cos: # 腾讯云 COS
+ - platform: tencent-cos-1 # 存储平台标识
+ enable-storage: false # 启用存储
+ secret-id: ??
+ secret-key: ??
+ region: ?? #存仓库所在地域
+ bucket-name: ??
+ domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.cos.ap-nanjing.myqcloud.com/
+ base-path: hy/ # 基础路径
+ minio: # MinIO,由于 MinIO SDK 支持 AWS S3,其它兼容 AWS S3 协议的存储平台也都可配置在这里
+ - platform: minio-1 # 存储平台标识
+ enable-storage: true # 启用存储
+ access-key: 9Y3sjaDWgbxKjXjm
+ secret-key: Bs2GyJwmOLpqNsQwbDjdinyUJQHtM0rc
+ end-point: http://192.168.0.207:9000/
+ bucket-name: v350
+ domain: ${config.file-storage.minio[0].end-point} # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
+ base-path: # 基础路径
+ # ===================== 文件存储配置-End =====================
+# ===================== 第三方登录配置-Start =====================
+socials:
+ # 第三方登录功能开关(false-关闭,true-开启)
+ socials-enabled: false
+ config:
+ - # 微信
+ provider: wechat_open
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # qq
+ provider: qq
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 企业微信
+ provider: wechat_enterprise
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 钉钉
+ provider: dingtalk
+ client-id: your-client-id
+ client-secret: your-client-secret
+ agentId: your-agentId
+ - # 飞书
+ provider: feishu
+ client-id: your-client-id
+ client-secret: your-client-secret
+ - # 小程序
+ provider: wechat_applets
+ client-id: your-client-id
+ client-secret: your-client-secret
+# ===================== 第三方登录配置-End =====================
+# ===================== 任务调度配置-Start =====================
+xxl:
+ job:
+ accessToken: '432e62f3b488bc861d91b0e274e850cc'
+ i18n: zh_CN
+ logretentiondays: 30
+ triggerpool:
+ fast:
+ max: 200
+ slow:
+ max: 100
+ # xxl-job服务端地址
+ admin:
+ addresses: http://127.0.0.1:30020/xxl-job-admin/
+ executor:
+ address: ''
+ appname: xxl-job-executor-sample1
+ ip: ''
+ logpath: /data/applogs/xxl-job/jobhandler
+ logretentiondays: 30
+ port: 39999
+ # rest调用xxl-job接口地址
+ admin:
+ register:
+ handle-query-address: ${xxl.job.admin.addresses}api/handler/queryList
+ job-info-address: ${xxl.job.admin.addresses}api/jobinfo
+ log-query-address: ${xxl.job.admin.addresses}api/log
+ task-list-address: ${xxl.job.admin.addresses}api/ScheduleTask/List
+ task-info-address: ${xxl.job.admin.addresses}api/ScheduleTask/getInfo
+ task-save-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-update-address: ${xxl.job.admin.addresses}api/ScheduleTask
+ task-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/remove
+ task-start-or-remove-address: ${xxl.job.admin.addresses}api/ScheduleTask/updateTask
+# ===================== 任务调度配置-End =====================
+# ===================== 单点登录(SSO)配置-Start =====================
+yunzhupaas:
+ sso:
+ # ===================== 单点登录(用户信息拉取)配置-Start =====================
+ connector:
+ # 是否开启用户信息拉取
+ enabled: false
+ # ===================== 单点登录(用户信息拉取)配置-End =====================
+ # ===================== 单点登录(用户信息推送)配置-Start =====================
+ pull:
+ # 是否开启用户信息推送
+ enabled: false
+ create-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ replace-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ change-password-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account/changePassword
+ delete-rest-address: http://localhost:9526/sso-mgt-api/api/idm/Account
+ credential-type: Basic
+ user-name: 747887288041603072
+ password: MYgMMjIwNzIwMjIxNTU4MTAxNzQlKQ
+ # ===================== 单点登录(用户信息推送)配置-End =====================
+oauth:
+ #启用单点登录, 普通登录不可用
+ ssoEnabled: false
+ #轮询票据有效期
+ ticketTimeout: 120
+ #默认单点登录协议
+ defaultSSO: cas
+ #后端登录接口地址
+ loginPath: http://127.0.0.1:30000/api/oauth/Login
+ #login:
+ #JWT生成秘钥 不填写为默认值
+ #jwtSecretKey: WviMjFNC72VKwGqm5LPoheQo5XN9iN4d
+ sso:
+ #单点登录系统地址
+ baseUrl: http://127.0.0.1:8527
+ #登录成功后跳转到前端的页面
+ sucessFrontUrl: http://127.0.0.1:3100/sso
+ #错误信息是否输出到页面
+ ticketOutMessage: false
+ #logoutFrontUrl: http://sso.maxkey.top:8527/maxkey
+ #单点注销后端接口地址, 配置启用后YUNZHUPAAS退出会请求单点系统退出, 触发单点注销退出全部应用
+ #ssoLogoutApiUrl: ${oauth.sso.baseUrl}/sign/logout
+ auth2:
+ enabled: true
+ clientId: 747887288041603072
+ clientSecret: MYgMMjIwNzIwMjIxNTU4MTAxNzQlKQ
+ baseUrl: ${oauth.sso.baseUrl}
+ authorizeUrl: ${oauth.sso.auth2.baseUrl}/sign/authz/oauth/v20/authorize
+ accessTokenUrl: ${oauth.sso.auth2.baseUrl}/sign/authz/oauth/v20/token
+ userInfoUrl: ${oauth.sso.auth2.baseUrl}/sign/api/oauth/v20/me
+ cas:
+ enabled: true
+ baseUrl: ${oauth.sso.baseUrl}
+ serverLoginUrl: ${oauth.sso.cas.baseUrl}/sign/authz/cas/login
+ serverValidateUrl: ${oauth.sso.cas.baseUrl}/sign/authz/cas
+# ===================== 单点登录(SSO)配置-End =====================
+userUrl: http://192.168.3.31:8000/api-web/sys/user/save
\ No newline at end of file
diff --git a/yunzhupaas-admin/src/main/resources/application.yml b/yunzhupaas-admin/src/main/resources/application.yml
new file mode 100644
index 0000000..ede0f11
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/application.yml
@@ -0,0 +1,163 @@
+spring:
+ application:
+ name: yunzhupaas-boot
+ profiles:
+ # 指定环境配置 dev(开发环境-默认)、test(测试环境)、preview(预生产)、prod(生产环境)
+ active: test
+ servlet:
+ multipart: #文件传输配置
+ max-file-size: 100MB #单个数据大小限制
+ max-request-size: 100MB #请求总数据大小限制
+ enabled: true #是否启用分段上传支持
+ mvc:
+ #csrf-origins: ${config.FrontDomain}
+ cors:
+ # 允许跨域的域名
+ #allowed-origins: ${config.FrontDomain}
+ # 允许跨域的域名正则匹配 如需全部匹配设置为 '**', 因为包含凭据的请求不允许直接写* 这个写法可以直接返回当前请求域名
+ allowed-origin-patterns: '**'
+ # 允许跨域的请求方法 GET, POST, PUT, DELETE
+ allowed-methods: "*"
+ # 允许跨域的头部信息 Content-Type, Authorization
+ allowed-headers: "*"
+ options-max-age: 18000
+ headers:
+ server-name: ''
+ x-frame-options: sameorigin
+ x-content-type-options: disabled
+ x-xss-protection: enabled_mode_block
+ hiddenmethod: #隐式方法过滤器
+ filter:
+ enabled: true #默认开启。开启以支持:PUT,DELETE表单提交方法
+ jackson: #序列化和反序列化json框架
+ serialization:
+ write-dates-as-timestamps: true #是否写入日期时间时间戳格式
+ time-zone: GMT+8 #指定日期格式化时区
+ main:
+ allow-bean-definition-overriding: true #允许同名bean后者覆盖,默认:true
+ allow-circular-references: true #允许Bean相互引用,默认:false
+config:
+ # ===============静态资源目录映射==================
+ WebAnnexFilePath: WebAnnexFile
+ DataBackupFilePath: DataBackupFile
+ TemporaryFilePath: TemporaryFile
+ SystemFilePath: SystemFile
+ TemplateFilePath: TemplateFile
+ EmailFilePath: EmailFile
+ DocumentFilePath: DocumentFile
+ DocumentPreviewPath: DocumentPreview
+ UserAvatarFilePath: UserAvatar
+ IMContentFilePath: IMContentFile
+ MPMaterialFilePath: MPMaterial
+ TemplateCodePath: TemplateCode
+ BiVisualPath: BiVisualPath
+ # ===============功能格式限制==================
+ MPUploadFileType: bmp,png,jpeg,jpg,gif,mp3,wma,wav,amr,mp4
+ WeChatUploadFileType: jpg,png,doc,docx,ppt,pptx,xls,xlsx,pdf,txt,rar,zip,csv,amr,mp4
+
+ AllowUploadImageType: jpg,gif,png,bmp,jpeg,tiff,psd,swf,svg,pcx,dxf,wmf,emf,lic,eps,tga #允许上传图片类型
+ AllowUploadFileType: jpg,gif,png,bmp,jpeg,doc,docx,ppt,pptx,xls,xlsx,pdf,txt,rar,zip,csv,mp3,aac #允许上传文件类型
+ AllowPreviewFileType: doc,docx,xls,xlsx,ppt,pptx,pdf,jpg,gif,png,bmp,jpeg #允许预览文件类型
+ PreviewType: kkfile #文件预览方式 (1.yozo 2.kkfile)默认使用kkfile
+ kkFileUrl: http://127.0.0.1:30090/FileServer/ #kkfile文件预览服务地址
+ ApiDomain: http://127.0.0.1:30000 #后端域名(文档预览中使用)
+ FrontDomain: http://127.0.0.1:3100 #前端域名(文档预览中使用)
+ AppDomain: http://127.0.0.1:8080 #app/h5端域名配置(文档预览中使用)
+ FlowDomain: http://127.0.0.1:31000 #流程引擎接口地址
+
+ CodeAreasName: example #代码生成器模块命名
+
+ #===================== unipush =====================
+ AppPushUrl: https://8e84eea8-6922-4033-8e86-67ad7442e692.bspapp.com/unipush
+
+ #===================== 多租户配置 =====================
+ MultiTenancy: false #是否开启
+ MultiTenancyUrl: http://127.0.0.1:30006/api/tenant/DbName/ #多租户项目地址
+
+ #===================== 系统及错误报告反馈相关 =====================
+ SoftName: yunzhupaas-java-boot #项目名
+ SoftFullName: 集团信息化平台 #项目全名
+ SoftVersion: v5.2.0 #版本号
+
+ RecordLog: true #系统日志启用
+ ErrorReport: false #软件错误报告
+ ErrorReportTo: surrpot@yunzhupaas.com #软件错误报告接收者
+ IgexinEnabled: true #推送启动
+
+ #===================== APP =====================
+ AppVersion: v5.2.0 #APP版本号
+ IgexinAppid: HLFY9T2d1z7MySY8hwGwh4 #APPID:应用的唯一标识
+ IgexinAppkey: 6Uiduugq648YDChhCjAt59 #APPKEY:公匙(相当于账号)
+ IgexinMastersecret: pEyQm156SJ9iS7PbyjLCZ6 #Mastersecret:私匙(相当于密码)
+ AppUpdateContent: ; #APP更新内容
+
+ #===================== 永中office在线预览配置 =====================
+ YozoDomain: //dcsapi.com/ #永中api域名
+ YozoDomainKey: 57462250284462899305150 #域名key
+ YozoCloudDomain: //dmc.yozocloud.cn #云预览
+ YozoAppId: yozoAgR41jgC0062 #appid
+ YozoAppKey: fc3134a9ba8bc6f4c69d635f9adf #app秘钥
+ YozoEditDomain: //eic.yozocloud.cn #云编辑
+
+ #===================== 系统功能配置 =====================
+ EnableLogicDelete: false #是否开启逻辑删除
+ CodeCertificateTimeout: 180 # 秒
+ check-file-pdf: false #检查上传的PDF文件安全
+
+security:
+ # AES加密秘钥
+ security-key: EY8WePvjM5GGwQzn
+ # 是否开启接口鉴权
+ enable-pre-auth: true
+ # 接口加密
+ enable-rest-encrypt: true
+
+# 事件配置
+event:
+ # 默认时间发布、监听渠道: redis, mq
+ event-publish-type: redis
+ # Redis监听模式:current, all
+ redis-publish-type: current
+
+# 接口放行地址 与GatewayWhite中的默认URL合并
+gateway:
+ # 禁止访问接口
+ block-url:
+ ## 配置示例
+ #- /api/message/Notice
+ #- /api/permission/Users/*
+ # 不验证Token, 放行接口(默认记录日志)
+ white-url:
+ # # 配置示例
+ #- /api/message/Notice
+ #- /api/permission/Users/*
+ # 放行接口(不记录日志)
+ exclude-url:
+ # # 配置示例
+ #- /api/message/Notice
+ #- /api/permission/Users/*
+ # 入站IP(禁止配置以外的IP访问block-url配置的接口)
+ white-ip:
+ #- 192.168.0.10
+ #- 192.168.0.20
+
+# 日志配置
+logging:
+ config: classpath:logback-spring.xml
+ level:
+ #自定义第三方包名日志等级
+ # 解除注释后Druid连接池打印SQL语句
+ druid.sql.Statement: debug
+# druid.sql.DataSource: debug
+# druid.sql.Connection: debug
+# druid.sql.ResultSet: debug
+log:
+ level:
+ # 等级 TRACE,DEBUG,INFO,WARN,ERROR(不区分大小写)
+ root: info
+ path: log/${spring.application.name}
+mybatis:
+ mapper-locations: classpath*:com/**/mapper/**/*.xml
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
diff --git a/yunzhupaas-admin/src/main/resources/i18n/message.properties b/yunzhupaas-admin/src/main/resources/i18n/message.properties
new file mode 100644
index 0000000..4e52c82
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/i18n/message.properties
@@ -0,0 +1,1236 @@
+AD101=接口无法访问
+AD102=系统异常
+AD103=操作过于频繁
+AD104=没有访问权限,请联系管理员授权
+AD105=认证失败,无法访问系统资源
+AD106=无效内部认证,无法访问系统资源
+COD001=集合条件过滤获得目标为空
+COPY001=复制名称长度超过了限制长度
+DB001=数据类型编码不符合标准(请注意大小写)。MySQL , SQLServer , Oracle , DM , KingbaseES , PostgreSQL
+DB002=请检查 1、连接信息 2、网络通信 3、数据库服务启动状态。 详情:{0}
+DB003=通过url找不到对应数据库
+DB004=查询结果集为空。
+DB005=未找到对应数据库类型:{0}({1})
+DB006=未找到对应数据类型转换
+DB007=导入表名存在重复
+DB008=建表数据与当前操作数据库不匹配: {0} -> {1}
+DB009=未找到表信息: {0}
+DB010=数据库{0},未找到此表:{1}
+DB011=联合主键类缺少“{0}”字段值
+DB012=表示对应获取数值失败
+DB013=目前还未支持{0}数据类型:{1}
+DB014=表 "{0}"中字段 "{1}" 为主键,不允许数据类型 "{2}"
+DB015=未找到字段SQL语句
+DB016=没有初始字段
+DB017=sql异常:{0}
+DB018=请在数据库中添加对应的数据表
+DB019=添加失败
+DB101=系统自带表,不允许被删除
+DB102=系统自带表,不允许被编辑
+DB201=表已经被使用,不允许被删除
+DB202=表已经被使用,不允许被编辑
+DB301=数据库连接成功
+DB302=数据库连接失败
+ETD101=操作失败,原文件不存在
+ETD102=找不到父级
+ETD103=不能移动到自己的文件夹
+ETD104=未能找到此订单
+ETD105=新建成功10000条数据
+ETD106=获取失败
+ETD107=账户认证错误
+ETD108=你还没有设置邮件的帐户
+ETD109=文件导出失败
+ETD110=文件格式不正确
+ETD111=文件找不到
+ETD112=此记录被关联引用,不允许被删除
+ETD113=防止恶意创建过多数据
+ETD114=保存失败,请重新登陆
+ETD115=请输入预览的url
+ETD116=请选择正确的预览方式
+ETD117=数据超过1000条
+EXIST001=名称不能重复
+EXIST002=编码不能重复
+EXIST003=模板名已存在
+EXIST004=文件夹名称不能重复
+EXIST005=模板名称超过了限制长度
+EXIST101=名称重复,请重新输入
+EXIST102=编码重复,请重新输入
+EXIST103=不能重复
+FA001=数据不存在
+FA002=更新失败,数据不存在
+FA003=删除失败,数据不存在
+FA004=复制失败,数据不存在
+FA005=发送失败,数据不存在
+FA006=下载失败,数据不存在
+FA007=操作失败,数据不存在
+FA008=停止失败,数据不存在
+FA009=终止失败,数据不存在
+FA010=还原失败,数据不存在
+FA011=发布失败,数据不存在
+FA012=获取失败,数据不存在
+FA013=接口修改失败,数据不存在
+FA014=更新接口状态失败,数据不存在
+FA015=预览失败,数据不存在
+FA016=删除失败,该文件夹存在数据
+FA017=文件格式不正确
+FA018=文件不存在
+FA019=已失效
+FA020=未查到信息
+FA021=操作失败!您没有权限操作
+FA022=更新失败!您没有权限操作 (角色只有超级管理员才能够操作)
+FA023=更新失败!已绑定用户,无法切换组织
+FA024=删除失败!已绑定用户
+FA025=该组织内权限为空,组织切换失败!
+FA026=更新失败,关联组织不存在,请重新登录,或者刷新页面
+FA027=该系统下菜单为空,系统切换失败
+FA028=新增数据失败
+FA029=修改数据失败
+FA030=更新失败!已绑定用户,无法修改状态
+FA031=该组织无本应用权限,切换失败
+FA032=上传文件不能为空
+FA033=文件上传失败!
+FA034=非法请求, 缺少认证信息
+FA035=未获取到租户指定数据源信息
+FA036=常用数据已存在
+FA037=接口请求失败
+FA038=文件存储路径错误
+FA039=链接已失效
+FA040=预览失败,请检查文件类型是否规范
+FA041=预览失败,请重新上传文件
+FA042=请输入正确的文件格式
+FA043=存在同名文件!
+FA044=不存在该文件
+FA045=删除文件:{0}失败
+FA046=文件读取失败
+FA047=未发现文件
+FA048=微信公众号原始id不能重复
+FA049=此记录与“消息发送配置”关联引用,不允许被禁用
+FA050=此记录与“消息发送配置”关联引用,不允许被删除
+FA051=接口已配置加密, 数据解密失败.
+FA052=该身份未分配权限
+FA101=保存失败
+FA102=更新失败
+FA103=删除失败
+FA104=获取失败
+FA105=预览失败,请先保存在预览数据
+FA106=预览失败,单元格配置出现死循环
+FM001=未找到接口
+FM002=表单信息不存在
+FM003=子表重复
+FM004=已到达该模板复制上限,请复制源模板!
+FM005=该表单已被流程引用,无法删除!
+FM006=该表单未发布,无法回滚表单内容
+FM007=该模板内表单内容为空,无法发布
+FM008=该功能未导入流程表单
+FM009=流程未设计,请先设计流程!
+FM010=该功能流程处于停用状态!
+FM011=表[{0}]无主键!
+FM012=主键策略:{0},与表[{1}]主键策略不一致!
+FM013=表新增错误:{0}
+GT101=成功
+GT102=失败
+GT103=验证错误
+GT104=异常
+GT105=登录过期,请重新登录
+GT106=您的帐号在其他地方已登录,被强制踢出
+GT107=Token验证失败
+GT108=请求超过最大数
+IMP001=导入成功
+IMP002=导入失败,文件格式错误
+IMP003=导入失败,数据已存在
+IMP004=导入失败,数据有误
+IMP005=导出失败
+IMP006=导入数据格式不正确
+IMP007=重复
+IMP008=名称
+IMP009=编码
+IMP010=导入失败,查询不到上级分类
+IMP011=请选择导出字段
+LOG001=账户异常
+LOG002=注销成功
+LOG004=账号异常,请联系管理员修改所属组织信息
+LOG005=账号未被激活
+LOG006=账号已被禁用
+LOG007=账号已被删除
+LOG010=此IP未在白名单中
+LOG011=登录失败,用户暂未绑定角色
+LOG012=账号已被锁定,请联系管理员解除锁定
+LOG101=账号或密码错误
+LOG102=账号有误,请重新输入
+LOG103=请输入验证码
+LOG104=验证码错误
+LOG105=连接租户服务失败,请稍后再试
+LOG106=短信验证码错误
+LOG107=验证码已失效
+LOG108=请等待{0}分钟后再进行登录,或联系管理员解除锁定
+LOG109=租户登录失败,请用手机验证码登录
+LOG110=数据库异常,请联系管理员处理
+LOG111=已开启单点登录, 不支持此登录方式
+LOG112=不支持此登录方式
+LOG113=未设置租户信息
+LOG114=租户编码不允许为空
+LOG115=租户信息获取失败
+LOG116=不支持此验证
+LOG117=短信验证码验证失败:{0}
+LOG118=租户库名为空
+LOG201=旧密码错误
+LOG202=修改成功,请牢记新密码
+LOG203=修改失败,账号不存在
+LOG204=修改失败,新建密码不能与旧密码一样
+LOG205=重置密码成功
+LOG206=重置密码失败
+MSERR101=发送失败,失败原因:SMTP服务为空
+MSERR102=发送失败,失败原因:发件人邮箱为空
+MSERR103=发送失败,失败原因:发件人密码为空
+MSERR104=发送失败,失败原因:接收人为空
+MSERR105=发送失败。失败原因:{0}的邮箱账号格式有误!
+MSERR106=发送失败。失败原因:{0}的邮箱账号为空!
+MSERR107=发送失败。失败原因:接收人对应的邮箱全部为空
+MSERR108=发送失败。失败原因:{0}
+MSERR109=连接成功
+MSERR110=连接失败。失败原因:{0}
+MSERR111=已发送
+MSERR112=内容不能包含<符号
+MSERR113=暂无未读消息
+MSERR114=自定义模板编码不能使用系统模板编码规则
+MSERR115=创建失败,存在多个标题参数
+MSERR116=创建失败,不存在标题参数
+MSERR117=更新失败,存在多个标题参数
+MSERR118=更新失败,不存在标题参数
+MSERR119=请先前往系统同步设置,配置钉钉账号
+MSERR120=请先前往系统同步设置,配置企业微信账号
+MSERR121=配置模板无数据,无法测试
+OA001=用户登录
+OA002=设备
+OA003=TOKEN
+OA004=用户退出
+OA005=用户踢出
+OA006=用户顶替
+OA007=登录异常
+OA008=登录获取系统配置失败
+OA009=该用户未分配权限
+OA010=仅支持pc端访问,APP端不支持
+OA011=应用不存在
+OA012=当前应用已被禁用
+OA013=登录密码解密失败
+OA014=注销成功
+OA015=登录成功
+OA016=登录票据已失效
+OA017=第三方未绑定账号
+OA018=不允许访问此登录接口
+OA019=账号不存在
+OA020=账户或密码错误,请重新输入
+OA021=验证成功
+OA022=限制会话, 不允许访问系统
+OA023=管理员不能注销
+OA024=登录失败
+OA025=超级管理员
+OA026=普通管理员
+OA027=普通用户
+OA028=未知来源
+PRI001=打印模板不存在
+PRI002=数字字典不存在printDev的字典分类
+PRI003=第1条SQL语句:查询出多条表头信息
+PRI004=第1条SQL语句:未查出表头信息
+PRI005=第{index}条SQL语句:
+PRI006=已到达该模板复制上限,请复制源模板
+PRI007=Sql语法错误
+PRI008=该报表已删除
+PS001=此记录与"{0}"关联引用,不允许被删除
+PS003=组织
+PS004=岗位
+PS005=用户
+PS006=角色
+PS007=账号不能为空
+PS008=姓名不能为空
+PS009=用户额度已达到上限
+PS010=权限已变更,请重新登录
+PS011=密码已变更,请重新登录
+PS012=类型不能为空
+PS013=当前机构Id不能与父机构Id相同
+PS014=该应用已禁用
+PS015=无法设置当前用户为分级管理员
+PS016=无法设置超管为分级管理员
+PS017=无法设置当前用户操作权限
+PS018=解绑失败
+PS019=第三方登录未配置
+PS020=性别不能为空
+PS021=无法禁用管理员用户
+PS022=管理员只能修改自己,不能修改其他管理员
+PS023=无法修改管理员账户
+PS024=直属主管不能是自己
+PS025=直属主管不能是我的下属用户
+PS026=无法删除管理员账户
+PS027=此用户为某部门主管,无法删除
+PS028=此用户有下属,无法删除
+PS029=无法修改管理员账户状态
+PS030=用户信息已变更,请重新登录
+PS031=该应用已删除
+PS032=该组织无本应用权限,切换失败
+PS033=工作交接成功!
+PS034=工作交接无法转移给管理员
+PS035=工作交接无法转移给本人
+SC001=操作失败,任务不存在
+SU000=Success
+SU001=新建成功
+SU002=保存成功
+SU003=删除成功
+SU004=更新成功
+SU005=操作成功
+SU006=提交成功,请耐心等待
+SU007=复制成功
+SU008=停止成功
+SU009=终止成功
+SU010=还原成功
+SU011=发布成功
+SU012=发送成功
+SU013=接口修改成功
+SU014=更新接口状态成功
+SU015=上传成功
+SU016=设置成功
+SU017=验证成功
+SU018=添加成功
+SU019=获取成功
+SU020=回滚成功
+SU021=移除成功
+SU022=查询成功
+SYS001=区域编码不能重复
+SYS002=删除失败,当前有子节点数据
+SYS003=单据已经被使用,不允许被删除
+SYS004=清理成功
+SYS005=接口创建成功
+SYS006=当前SQL含有敏感字:{0}
+SYS007=接口请求成功
+SYS008=接口不符合规范
+SYS009=变量名不能包含敏感字符
+SYS010=变量名已存在
+SYS011=数据库连接不能相同
+SYS012=请检查,同一数据库下无法同步数据
+SYS013=同步失败:{0}
+SYS014=字典类型下面有字典值禁止删除
+SYS015=模板不存在
+SYS016=当前目录存在数据,不能修改类型
+SYS017=删除失败,请先删除子菜单
+SYS018=当前导入菜单为{0}端菜单,请在对应模块下导入!
+SYS019=请在顶级节点下创建目录后再进行菜单导入
+SYS020=该字段在方案{0}中已被使用
+SYS021=修改失败,该方案不允许编辑
+SYS022=编码错误
+SYS023=请求发生错误!
+SYS024=获取不到数据!
+SYS025=获取企业微信access_token失败
+SYS026=正在进行同步,请稍后再试
+SYS027=请先从企业微信同步部门到本地
+SYS028=请先从钉钉同步部门到本地
+SYS029=验证码位数不能大于6
+SYS030=验证码位数不能小于3
+SYS031=测试发送消息的连接失败:{0}
+SYS032=测试发送消息连接成功
+SYS033=测试组织同步的连接失败:{0}
+SYS034=测试组织同步连接成功
+SYS035=测试连接类型错误
+SYS036=测试钉钉连接失败:
+SYS037=测试连接成功
+SYS038=表信息抽取异常
+SYS039=删除失败,请先删除该应用下的菜单和门户
+SYS040=删除失败,请先删除该应用下的菜单
+SYS041=删除失败,请先删除该应用下的门户
+SYS042=该日程已被删除
+SYS043=最后一条数据不能删除
+SYS044=启用版本不能删除
+SYS045=归档版本不能删除
+SYS046=数据集不能重名
+SYS047=SQL语句仅支持查询语句
+SYS048=SQL语句需带上@formId条件
+SYS049=正在进行同步,请稍等
+SYS050=只能输入字母、数字、点、横线和下划线,且以字母开头
+SYS051=翻译标记不能重复
+SYS052=翻译语言至少填写一项
+SYS053=获取钉钉access_token失败
+SYS101=更新失败,主系统不允许禁用
+SYS102=主系统不允许删除
+SYS103=系统在审批常用语中被使用,不允许删除
+SYS104=更新失败,主系统不允许修改编码
+SYS105=常用语已存在
+SYS121=接口暂只支持HTTP和HTTPS方式
+SYS122=接口请求失败
+SYS123=接口请求失败, JS调用失败,错误:{0}
+SYS124=验证请求超时
+SYS125=appSecret错误
+SYS126=appId使用期限已到期
+SYS127=appId参数错误
+SYS128={0}不能使用系统、开发语言及数据库关键字命名
+SYS129=当前数据源不支持全连接
+SYS130=标题不能为空
+SYS131=结束时间必须晚于开始时间
+SYS132=结束重复必须晚于开始时间
+VS001=同步到流程时,{0}
+VS002=发布失败,流程未设计!
+VS003=无表生成有表失败
+VS004=发布
+VS005=预览
+VS006=下载
+VS007=同步成功
+VS008=回滚失败,暂无线上版本
+VS009=参数解析错误!
+VS010=无效链接
+VS011=密码错误
+VS012=未找到该功能表单
+VS013=未开启表单外链!
+VS014=下载链接已失效
+VS015=字段不能为空
+VS016=路径错误
+VS017=集成助手被禁用
+VS018=表规范名称不能重复
+VS019=规范名称不能使用系统关键字或JAVA关键字
+VS020=字段规范名称不能重复
+VS021=“{0}”命名不符合规范
+VS022=主键策略:[雪花ID],表[ {0} ]主键设置不支持!
+VS023=主键策略:[自增ID],表[ {0} ]主键设置不支持!
+VS024=表单不存在或者未发布!
+VS025=未获取到流程发起人
+VS026=规范名称前两字母必须小写
+VS027=自动生成的【{0}】超出长度,提交失败!
+VS028=视图最多新建5个
+VS401=该模板内表单内容为空,无法
+VS402=该模板内列表内容为空,无法
+VS403=该功能未配置流程不可用
+VS404=单行输入不能重复
+VS405=当前表单原数据已被调整,请重新进入该页面编辑并提交数据
+VS406=该功能配置的流程处于停用
+VS407=表头名称不可更改,表头行不能删除
+VS408=请至少选择一个数据表
+VS409=未找到主表信息
+VS410=请导入对应功能的json文件
+VS411=已存在相同功能
+VS412=该表单已删除
+VS413=应用不能为空
+VS414=门户数据信息存在重复
+VS415=该门户已删除
+WF001=审核成功
+WF002=退回成功
+WF003=转办成功
+WF004=加签成功
+WF005=当前流程被退回,无法撤回流程
+WF006=流程已撤回,不能重复操作
+WF007=撤回失败,转向数据无法撤回
+WF008=撤回成功
+WF009=功能流程不能终止
+WF010=指派成功
+WF011=批量操作完成
+WF012=该流程不能操作
+WF013=复活成功
+WF014=变更成功
+WF015=挂起成功
+WF016=恢复成功
+WF017=委托人和被委托人相同,委托失败
+WF018=操作失败,同一时间内有相同流程的委托
+WF019=操作失败,同一时间内有相同流程,不能相互委托
+WF020=功能流程不能删除
+WF021=不能删除
+WF022=催办成功
+WF023=未找到催办人
+WF024=该功能已被流程引用,请重新选择关联功能
+WF025=启用失败,流程未设计
+WF026=启用成功
+WF027=禁用成功
+WF028=该版本内有工单任务流转,无法删除
+WF029=您没有发起该流程的权限
+WF030=表单未找到
+WF031=已审核完成
+WF032=冻结不能操作
+WF033=转向节点不存在或配置错误
+WF034=转向失败,转向节点未审批
+WF035=退回至您的审批,不能再发起退回
+WF036=流程已处理,无法撤回
+WF037=当前流程包含子流程,无法撤回
+WF038=子流程无法撤回
+WF039=下一节点为选择分支无法批量审批
+WF040=条件流程包含候选人无法批量通过
+WF041=该流程工单已终止
+WF042=该流程工单已撤回
+WF043=该节点没有数据,无法复活
+WF044=此流程不支持变更
+WF045=当前节点有子流程无法变更
+WF046=退回节点包含子流程,退回失败
+WF047=当前节点未审批,不能退回
+WF048=流程处于挂起状态,不可操作
+WF049=当前流程正在运行不能删除
+WF050=已被挂起不能删除
+WF051=没有删除权限
+WF052=主版本没有内容
+WF053=流程没有启用
+WF054=流程编码不能重复
+WF055=流程表单不一致,请重新选择
+WF056=该流程由在线开发生成的,无法直接删除,请在功能设计中删除相关功能
+WF057=该流程内工单任务流转未结束,无法删除
+WF058=当前流程正在运行不能重复提交
+WF059=流程自动发起审批失败
+WF060=驳回节点不能是子流程
+WF061=下一节点无审批人员请联系管理员
+WF062=表单已被引用,请重新选择
+WF063=流程已发起,无法删除
+WF064=任务不存在,或者已处理
+WF065=拒绝成功
+WF066=同意成功
+WF067=协办成功
+WF068=协办保存成功
+WF069=减签成功
+WF070=撤销成功
+WF071=最后一条数据不能删除
+WF072=启用版本不能删除
+WF073=归档版本不能删除
+WF074=暂停成功
+WF075=条件不满足无法流转
+WF076=节点不存在
+WF077=流程无法撤回
+WF078=流程未同意,无法撤销
+WF079=归档异常
+WF080=选择的数据不能退签
+WF081=无法加签
+WF082=无法减签
+WF083=无法退回
+WF084=无法转审
+WF085=无法协办
+WF086=无法批量审批
+WF087=经办未签收
+WF088=经办未开始办理
+WF089=流程发布失败
+WF090=流程发布失败
+WF091=流程提交失败
+WF092=获取引擎当前任务失败
+WF093=流程删除失败
+WF094=获取出线集合失败
+WF095=获取线之后的任务节点失败
+WF096=获取下一级任务节点集合失败
+WF097=获取上一级任务节点集合失败
+WF098=任务完成失败
+WF099=获取流程实例失败
+WF100=获取未经过的节点失败
+WF101=获取节点的后续节点失败
+WF102=获取可回退的节点失败
+WF103=退回失败
+WF104=节点跳转失败
+WF105=补偿失败
+WF106=不能加签给自己
+WF107=不能转审给自己
+WF108=不能协办给自己
+WF109=必须保留一名加签人员
+WF110=审批异常无法撤销
+WF111=所选流程包含条件候选人
+WF112=选择的数据对应流程已暂停
+WF113=已被暂停不能删除
+WF114=流程处于暂停状态,不可操作
+WF115=流程已受理,无法删除
+WF116=不能加签给委托人
+WF117=不能转审给委托人
+WF118=不能协办给委托人
+WF119=设置了流转条件,无法批量审批
+WF120=下一节点审批异常,无法批量审批
+WF121=子流程自动发起审批失败
+WF122=流程不存在
+WF123=流程处于终止状态,不可操作
+WF124=该流程已发起数据,无法删除!
+WF125=您没有发起委托流程
+WF126=撤销流程不能转审
+WF127=撤销流程不能退回
+WF128=该用户已审批,请重新打开界面
+WF129=委托人已无该流程权限
+WF130=管理员不能新建委托/代理
+WF131=不能选择admin
+WF132=已有人接受,不可编辑
+WF133=流转条件不满足,无法自动发起审批
+WF134=第一个审批节点设置候选人,无法自动发起审批
+WF135=第一个审批节点异常,无法自动发起审批
+WF136=找不到发起人,发起失败
+WF137=代理人和被代理人相同,代理失败
+WF138=存在未签收的数据,无法关闭
+WF139=该流程已触发了任务,无法删除
+WF144=操作失败,同一时间内有相同流程的代理
+WF145=操作失败,同一时间内有相同流程,不能相互代理
+app.apply.expandData=展开数据
+app.apply.location.location=添加定位
+app.apply.location.modalTitle=选择位置
+app.apply.location.relocation=重新定位
+app.apply.noMoreData=没有更多数据
+app.apply.pleaseKeyword=请输入关键字搜索
+app.apply.screen=筛选
+app.apply.sort=排序
+app.my.accountSecurity=账号安全
+app.my.agencyMe=代理给我
+app.my.allFlow=全部流程
+app.my.entrustedAgency=委托代理
+app.my.entrustMe=委托给我
+app.my.flowSelect=流程选择
+app.my.logOut=退出登录
+app.my.myAgency=我的代理
+app.my.myEntrust=我的委托
+app.my.organization=我的组织
+app.my.position=我的岗位
+app.my.scanCode=扫一扫
+app.my.setting=设置
+app.my.settings.About=关于平台
+app.my.settings.changePassword=修改密码
+app.my.settings.contact=联系我们
+app.my.settings.language=多语言
+app.my.settings.privacyPolicy=隐私政策
+app.my.settings.userAgreement=用户协议
+app.my.sto=终止
+app.my.subordinates=我的下属
+app.my.switchIdentity=切换身份
+common.add1Text=添加
+common.add2Text=新增
+common.addText=新建
+common.back=返回
+common.batchDelText=批量删除
+common.batchDelTip=您确定要删除这些数据吗, 是否继续?
+common.batchPrintText=批量打印
+common.cancelText=取消
+common.chooseText=请选择
+common.chooseTextPrefix=请选择
+common.cleanText=清空
+common.closeList=关闭列表
+common.closeText=关闭
+common.collapseAll=折叠
+common.continueAndAddText=确定并新增
+common.continueText=确定并继续
+common.copyText=复制
+common.dark=黑暗主题
+common.delText=删除
+common.delTip=此操作将永久删除该数据, 是否继续?
+common.detailText=详情
+common.drawerSearchText=请输入关键词
+common.editText=编辑
+common.enterKeyword=请输入关键词
+common.expandAll=展开
+common.exportText=导出
+common.importText=导入
+common.inputPlaceholder=请输入
+common.inputText=请输入
+common.inputTextPrefix=请输入
+common.keyword=关键词
+common.leftTreeSearchText=请输入关键词
+common.light=亮色主题
+common.loadingText=加载中...
+common.moreText=更多
+common.next=下一步
+common.nextRecord=下一条
+common.noData=暂无数据
+common.okText=确定
+common.prev=上一步
+common.previewText=预览
+common.prevRecord=上一条
+common.printText=打印
+common.queryText=查询
+common.redo=刷新
+common.redoText=重做
+common.resetText=重置
+common.saveText=保存
+common.searchText=搜索
+common.selectDataTip=请选择一条数据
+common.selectI18nCode=选择翻译标记
+common.selectPlaceholder=请选择
+common.submitText=提交
+common.superQuery=高级查询
+common.syncText=第三方同步
+common.tipTitle=提示
+common.undoText=撤销
+component.app.searchNotData=暂无搜索结果
+component.app.toNavigate=切换
+component.app.toSearch=确认
+component.countdown.normalText=获取验证码
+component.countdown.sendText={0}秒后重新获取
+component.cropper.btn_reset=重置
+component.cropper.btn_rotate_left=逆时针旋转
+component.cropper.btn_rotate_right=顺时针旋转
+component.cropper.btn_scale_x=水平翻转
+component.cropper.btn_scale_y=垂直翻转
+component.cropper.btn_zoom_in=放大
+component.cropper.btn_zoom_out=缩小
+component.cropper.modalTitle=头像上传
+component.cropper.okText=确认并上传
+component.cropper.preview=预览
+component.cropper.selectImage=选择图片
+component.cropper.uploadSuccess=上传成功
+component.drawer.cancelText=关闭
+component.drawer.loadingText=加载中...
+component.drawer.okText=确认
+component.excel.exportModalTitle=导出数据
+component.excel.fileName=文件名
+component.excel.fileType=文件类型
+component.form.apiSelectNotFound=请等待数据加载完成...
+component.form.fold=收起
+component.form.maxTip=字符数应小于{0}位
+component.form.unfold=展开
+component.icon.copy=复制图标成功!
+component.icon.placeholder=点击选择图标
+component.icon.search=搜索图标
+component.com.yunzhupaas.areaSelect.modalTitle=省市区
+component.com.yunzhupaas.calculate.storage=用于展示计算结果,且数据同时会保存入库
+component.com.yunzhupaas.calculate.unStorage=用于展示计算结果,且数据不会保存
+component.com.yunzhupaas.common.allData=全部数据
+component.com.yunzhupaas.common.autoGenerate=系统自动生成
+component.com.yunzhupaas.common.clearAll=清空列表
+component.com.yunzhupaas.common.selected=已选
+component.com.yunzhupaas.dateRange.endPlaceholder=结束日期
+component.com.yunzhupaas.dateRange.startPlaceholder=开始日期
+component.com.yunzhupaas.depSelect.modalTitle=选择部门
+component.com.yunzhupaas.groupSelect.modalTitle=选择分组
+component.com.yunzhupaas.iconPicker.modalTitle=图标选择
+component.com.yunzhupaas.iconPicker.searchPlaceholder=请输入关键词
+component.com.yunzhupaas.iconPicker.select=选择
+component.com.yunzhupaas.iconPicker.ymCustom=ymCustom图标
+component.com.yunzhupaas.iconPicker.ymIcon=ymIcon图标
+component.com.yunzhupaas.location.location=添加定位
+component.com.yunzhupaas.location.modalTitle=选择位置
+component.com.yunzhupaas.location.relocation=重新定位
+component.com.yunzhupaas.location.searchPlaceholder=搜索或直接在地图上点选
+component.com.yunzhupaas.numberRange.max=最大值
+component.com.yunzhupaas.numberRange.min=最小值
+component.com.yunzhupaas.organizeSelect.modalTitle=选择组织
+component.com.yunzhupaas.popupAttr.storage=用于展示关联弹窗的属性,且数据同时会保存入库
+component.com.yunzhupaas.popupAttr.unStorage=用于展示关联弹窗的属性,且数据不会保存
+component.com.yunzhupaas.popupSelect.modalTitle=选择数据
+component.com.yunzhupaas.posSelect.modalTitle=选择岗位
+component.com.yunzhupaas.relationFormAttr.storage=用于展示关联表单的属性,且数据同时会保存入库
+component.com.yunzhupaas.relationFormAttr.unStorage=用于展示关联表单的属性,且数据不会保存
+component.com.yunzhupaas.roleSelect.modalTitle=选择角色
+component.com.yunzhupaas.sign.operateTip=请在此区域使用鼠标手写签名
+component.com.yunzhupaas.sign.signPlaceholder=请签名
+component.com.yunzhupaas.sign.signTip=手写签名
+component.com.yunzhupaas.timeRange.endPlaceholder=结束时间
+component.com.yunzhupaas.timeRange.startPlaceholder=开始时间
+component.com.yunzhupaas.userSelect.modalTitle=选择用户
+component.menu.search=菜单搜索
+component.modal.cancelText=关闭
+component.modal.close=关闭
+component.modal.maximize=最大化
+component.modal.okText=确认
+component.modal.restore=还原
+component.table.action=操作
+component.table.index=序号
+component.table.settingColumn=列设置
+component.table.settingColumnShow=列展示
+component.table.settingDens=密度
+component.table.settingDensDefault=默认
+component.table.settingDensMiddle=中等
+component.table.settingDensSmall=紧凑
+component.table.settingFixedLeft=固定到左侧
+component.table.settingFixedRight=固定到右侧
+component.table.settingFullScreen=全屏
+component.table.settingIndexColumnShow=序号列
+component.table.settingSelectColumnShow=勾选列
+component.table.status=状态
+component.table.summary=合计
+component.table.total=共 {total} 条数据
+component.time.after=后
+component.time.before=前
+component.time.days=天
+component.time.hours=小时
+component.time.just=刚刚
+component.time.minutes=分钟
+component.time.seconds=秒
+component.tree.checkStrictly=层级关联
+component.tree.checkUnStrictly=层级独立
+component.tree.expandAll=展开全部
+component.tree.reload=刷新数据
+component.tree.selectAll=选择全部
+component.tree.unExpandAll=折叠全部
+component.tree.unSelectAll=取消选择
+component.upload.accept=支持{0}格式
+component.upload.acceptUpload=只能上传{0}格式文件
+component.upload.audio=音频
+component.upload.buttonText=点击上传
+component.upload.checking=文件校验中
+component.upload.choose=选择文件
+component.upload.del=删除
+component.upload.download=下载
+component.upload.downloadAll=全部下载
+component.upload.fileMaxNumber=最多可以上传{0}个文件
+component.upload.fileMaxSize=文件大小超过{size}{unit}
+component.upload.fileName=文件名
+component.upload.fileReadError=文件{0}读取出错,请检查该文件
+component.upload.fileSize=文件大小
+component.upload.fileStatue=状态
+component.upload.fileTypeCheck=请选择{0}类型的文件
+component.upload.image=图片
+component.upload.imageMaxNumber=最多可以上传{0}张图片
+component.upload.imageMaxSize=图片大小超过{size}{unit}
+component.upload.imgUpload=图片上传
+component.upload.legend=略缩图
+component.upload.maxNumber=最多只能上传{0}个文件
+component.upload.maxSize=单个文件不超过{0}MB
+component.upload.maxSizeMultiple=只能上传不超过{0}MB的文件!
+component.upload.operating=操作
+component.upload.paused=暂停中
+component.upload.preview=预览
+component.upload.reUploadFailed=重新上传失败文件
+component.upload.save=保存
+component.upload.saveError=没有上传成功的文件,无法保存!
+component.upload.saveWarn=请等待文件上传后,保存!
+component.upload.startUpload=开始上传
+component.upload.upload=上传
+component.upload.uploaded=已上传
+component.upload.uploadError=上传失败
+component.upload.uploadImg=请上传图片
+component.upload.uploading=上传中
+component.upload.uploadSuccess=上传成功
+component.upload.uploadWait=请等待文件上传结束后操作
+component.upload.video=视频
+component.upload.videoNoPreview=音视频文件不能预览
+component.upload.view=查看
+component.upload.viewImage=查看图片
+component.upload.waiting=等待中
+component.upload.zipNoPreview=压缩包不能预览
+component.verify.dragText=请按住滑块拖动
+component.verify.error=验证失败!
+component.verify.redoTip=点击图片可刷新
+component.verify.successText=验证通过
+component.verify.time=验证校验成功,耗时{time}秒!
+formGenerator.cleanComponentTip=确定要清空所有组件吗?
+formGenerator.component.alert=提示
+formGenerator.component.areaSelect=省市区域
+formGenerator.component.autoComplete=下拉补全
+formGenerator.component.barcode=条形码
+formGenerator.component.billRule=单据组件
+formGenerator.component.button=按钮
+formGenerator.component.calculate=计算公式
+formGenerator.component.card=卡片容器
+formGenerator.component.cascader=级联选择
+formGenerator.component.checkbox=多选框组
+formGenerator.component.collapse=折叠面板
+formGenerator.component.colorPicker=颜色选择
+formGenerator.component.createTime=创建时间
+formGenerator.component.createUser=创建人员
+formGenerator.component.currOrganize=所属组织
+formGenerator.component.currPosition=所属岗位
+formGenerator.component.datePicker=日期选择
+formGenerator.component.depSelect=部门选择
+formGenerator.component.divider=分割线
+formGenerator.component.editor=富文本
+formGenerator.component.groupSelect=分组选择
+formGenerator.component.groupTitle=分组标题
+formGenerator.component.iframe=Iframe
+formGenerator.component.input=单行输入
+formGenerator.component.inputNumber=数字输入
+formGenerator.component.link=链接
+formGenerator.component.location=定位
+formGenerator.component.modifyTime=修改时间
+formGenerator.component.modifyUser=修改人员
+formGenerator.component.organizeSelect=组织选择
+formGenerator.component.popupAttr=弹窗选择属性
+formGenerator.component.popupSelect=弹窗选择
+formGenerator.component.popupTableSelect=下拉表格
+formGenerator.component.posSelect=岗位选择
+formGenerator.component.qrcode=二维码
+formGenerator.component.radio=单选框组
+formGenerator.component.rate=评分
+formGenerator.component.relationForm=关联表单
+formGenerator.component.relationFormAttr=关联表单属性
+formGenerator.component.roleSelect=角色选择
+formGenerator.component.row=栅格容器
+formGenerator.component.select=下拉选择
+formGenerator.component.sign=手写签名
+formGenerator.component.slider=滑块
+formGenerator.component.switch=开关
+formGenerator.component.tab=标签面板
+formGenerator.component.table=设计子表
+formGenerator.component.tableGrid=表格容器
+formGenerator.component.text=文本
+formGenerator.component.textarea=多行输入
+formGenerator.component.timePicker=时间选择
+formGenerator.component.treeSelect=下拉树形
+formGenerator.component.uploadFile=文件上传
+formGenerator.component.uploadImg=图片上传
+formGenerator.component.userSelect=用户选择
+formGenerator.component.usersSelect=用户组件
+formGenerator.copyComponentTip=确定复制该组件?
+formGenerator.delComponentTip=确定删除该组件?
+layout.footer.onlineDocument=在线文档
+layout.footer.onlinePreview=在线预览
+layout.header.about=关于平台
+layout.header.commonMenus=常用菜单
+layout.header.dropdownItemDoc=文档
+layout.header.dropdownItemLoginOut=退出系统
+layout.header.feedback=反馈问题
+layout.header.home=首页
+layout.header.lockScreen=锁定屏幕
+layout.header.lockScreenBtn=锁定
+layout.header.lockScreenPassword=锁屏密码
+layout.header.profile=个人信息
+layout.header.setting=设置
+layout.header.standingChange=切换身份
+layout.header.statement=官方声明
+layout.header.systemChange=应用切换
+layout.header.tooltipChat=聊天
+layout.header.tooltipEntryFull=全屏
+layout.header.tooltipErrorLog=错误日志
+layout.header.tooltipExitFull=退出全屏
+layout.header.tooltipLock=锁定屏幕
+layout.header.tooltipNotify=消息
+layout.multipleTab.close=关闭标签页
+layout.multipleTab.closeAll=关闭全部标签页
+layout.multipleTab.closeLeft=关闭左侧标签页
+layout.multipleTab.closeOther=关闭其它标签页
+layout.multipleTab.closeRight=关闭右侧标签页
+layout.multipleTab.reload=重新加载
+layout.multipleTab.setCommon=设为常用菜单
+layout.setting.animation=动画
+layout.setting.animationType=动画类型
+layout.setting.autoScreenLock=自动锁屏
+layout.setting.blueBg=蔚蓝星辰
+layout.setting.breadcrumb=面包屑
+layout.setting.breadcrumbIcon=面包屑图标
+layout.setting.cachePage=缓存页面
+layout.setting.clearBtn=清空缓存并返回登录页
+layout.setting.closeMixSidebarOnChange=切换页面关闭菜单
+layout.setting.collapseMenuDisplayName=折叠菜单显示名称
+layout.setting.colorWeak=色弱模式
+layout.setting.contentMode=内容区域宽度
+layout.setting.contentModeFixed=定宽
+layout.setting.contentModeFull=流式
+layout.setting.copyBtn=拷贝
+layout.setting.darkMode=主题
+layout.setting.defaultBg=经典主题
+layout.setting.drawerTitle=配置
+layout.setting.expandedMenuWidth=菜单展开宽度
+layout.setting.fixedHeader=固定header
+layout.setting.fixedSideBar=固定Sidebar
+layout.setting.footer=页脚
+layout.setting.fullContent=全屏内容
+layout.setting.grayMode=灰色模式
+layout.setting.greenBg=碧绿翠风
+layout.setting.header=顶栏
+layout.setting.headerTheme=顶栏主题
+layout.setting.interfaceDisplay=界面显示
+layout.setting.interfaceFunction=界面功能
+layout.setting.menuAccordion=侧边菜单手风琴模式
+layout.setting.menuCollapse=折叠菜单
+layout.setting.menuCollapseButton=菜单折叠按钮
+layout.setting.menuDrag=侧边菜单拖拽
+layout.setting.menuSearch=菜单搜索
+layout.setting.menuTriggerBottom=底部
+layout.setting.menuTriggerNone=不显示
+layout.setting.menuTriggerTop=顶部
+layout.setting.menuTypeMix=顶部混合模式
+layout.setting.menuTypeMixSidebar=左侧混合模式
+layout.setting.menuTypeSidebar=左侧菜单模式
+layout.setting.menuTypeTopMenu=顶部菜单模式
+layout.setting.minute=分钟
+layout.setting.mixSidebarFixed=固定展开菜单
+layout.setting.mixSidebarTrigger=混合菜单触发方式
+layout.setting.navMode=导航栏模式
+layout.setting.notAutoScreenLock=不自动锁屏
+layout.setting.off=关
+layout.setting.on=开
+layout.setting.operatingContent=复制成功,请到 src/settings/projectSetting.ts 中修改配置!
+layout.setting.operatingTitle=操作成功
+layout.setting.progress=顶部进度条
+layout.setting.purpleBg=紫藤萝兰
+layout.setting.resetSuccess=重置成功!
+layout.setting.sidebar=左侧菜单
+layout.setting.sidebarTheme=菜单主题
+layout.setting.splitMenu=分割菜单
+layout.setting.switchAnimation=切换动画
+layout.setting.switchLoading=切换loading
+layout.setting.systemBackground=系统背景
+layout.setting.sysTheme=系统主题
+layout.setting.tabDetail=标签详情页
+layout.setting.tabs=标签页
+layout.setting.tabsFoldBtn=标签页折叠按钮
+layout.setting.tabsIcon=标签图标
+layout.setting.tabsQuickBtn=标签页快捷按钮
+layout.setting.tabsRedoBtn=标签页刷新按钮
+layout.setting.toggleLocale=语言切换
+layout.setting.topMenuAlignCenter=居右
+layout.setting.topMenuAlignLeft=居左
+layout.setting.topMenuAlignRight=居中
+layout.setting.topMenuLayout=顶部菜单布局
+layout.setting.triggerClick=点击
+layout.setting.triggerHover=悬停
+routes.basic.emailDetail=查看邮件
+routes.basic.errorLogList=错误日志列表
+routes.basic.externalLink=链接
+routes.basic.home=首页
+routes.basic.login=登录
+routes.basic.previewModel=功能预览
+routes.basic.workFlowDetail=流程详情
+routes.commonWords=审批常用语
+routes.dataReport=报表示例(原)
+routes.extend=开发示例
+routes.extend-barCode=条码示例
+routes.extend-bigData=百万数据
+routes.extend-documentPreview=文档示例
+routes.extend-email=邮件收发
+routes.extend-formDemo=表单示例
+routes.extend-formDemo-fieldForm1=表单字段1
+routes.extend-formDemo-fieldForm2=表单字段2
+routes.extend-formDemo-fieldForm3=表单字段3
+routes.extend-formDemo-fieldForm4=表单字段4
+routes.extend-formDemo-fieldForm5=表单字段5
+routes.extend-formDemo-fieldForm6=表单字段6
+routes.extend-formDemo-verifyForm=表单验证
+routes.extend-formDemo-verifyForm1=表单验证1
+routes.extend-functionDemo=功能示例
+routes.extend-graphDemo=图表示例
+routes.extend-graphDemo-echartsBar=E-柱状图
+routes.extend-graphDemo-echartsBarAcross=E-横状条形图
+routes.extend-graphDemo-echartsCandlestick=E-K线图
+routes.extend-graphDemo-echartsFunnel=E-漏斗图
+routes.extend-graphDemo-echartsGauge=E-仪表图
+routes.extend-graphDemo-echartsLineArea=E-线形图
+routes.extend-graphDemo-echartsLineBar=E-折柱混合图
+routes.extend-graphDemo-echartsPie=E-饼状图
+routes.extend-graphDemo-echartsScatter=E-散点图
+routes.extend-graphDemo-echartsTree=E-树形图
+routes.extend-graphDemo-highchartsArea=H-面积图
+routes.extend-graphDemo-highchartsBellcurve=H-贝尔曲线
+routes.extend-graphDemo-highchartsBullet=H-子弹图
+routes.extend-graphDemo-highchartsColumn=H-柱状图
+routes.extend-graphDemo-highchartsFunnel=H-漏斗图
+routes.extend-graphDemo-highchartsGauge=H-仪表图
+routes.extend-graphDemo-highchartsLine=H-线性图
+routes.extend-graphDemo-highchartsPie=H-饼状图
+routes.extend-graphDemo-highchartsScatter=H-散点图
+routes.extend-graphDemo-highchartsWordcloud=H-词云图
+routes.extend-importAndExport=导入导出
+routes.extend-map=地图示例
+routes.extend-order=订单管理
+routes.extend-orderDemo=订单示例
+routes.extend-portalDemo=门户示例
+routes.extend-printData=打印示例
+routes.extend-projectGantt=项目管理
+routes.extend-schedule=日程安排
+routes.extend-signature=电子签名
+routes.extend-signet=电子签章
+routes.extend-tableDemo=表格示例
+routes.extend-tableDemo-commonTable=普通表格
+routes.extend-tableDemo-complexHeader=复杂表头
+routes.extend-tableDemo-extension=延伸扩展
+routes.extend-tableDemo-groupingTable=表格分组
+routes.extend-tableDemo-lockTable=表格锁定
+routes.extend-tableDemo-mergeTable=表格合并
+routes.extend-tableDemo-postilTable=表格批注
+routes.extend-tableDemo-printTable=表格打印
+routes.extend-tableDemo-redactTable=表格编辑
+routes.extend-tableDemo-signTable=表格标记
+routes.extend-tableDemo-statisticsTable=表格统计
+routes.extend-tableDemo-tableTree=表格树形
+routes.extend-tableDemo-treeTable=树形表格
+routes.flowEngine=流程引擎
+routes.formDesign=系统表单
+routes.generator=代码生成
+routes.generator-appForm=移动表单
+routes.generator-flowForm=发起表单
+routes.generator-webForm=功能表单
+routes.lioui=流程示例
+routes.mainSystem=开发平台
+routes.moreMenu=更多...
+routes.msgCenter=消息中心
+routes.msgCenter-accountConfig=账号配置
+routes.msgCenter-accountConfig-ding=钉钉配置
+routes.msgCenter-accountConfig-mail=邮箱配置
+routes.msgCenter-accountConfig-mp=微信公众号配置
+routes.msgCenter-accountConfig-shortMsg=短信配置
+routes.msgCenter-accountConfig-webhook=webhook配置
+routes.msgCenter-accountConfig-weCom=企业微信配置
+routes.msgCenter-msgMonitor=消息监控
+routes.msgCenter-msgTemplate=消息模板
+routes.msgCenter-sendConfig=发送配置
+routes.onlineDev=在线开发
+routes.onlineDev-appDesign=移动设计
+routes.onlineDev-dataReport=报表设计(原)
+routes.onlineDev-dataScreen=大屏设计
+routes.onlineDev-integration=集成助手
+routes.onlineDev-printDev=打印设计
+routes.onlineDev-report=报表设计
+routes.onlineDev-visualPortal=门户设计
+routes.onlineDev-webDesign=表单设计
+routes.permission=组织权限
+routes.permission-auth=权限管理
+routes.permission-authorize=权限组
+routes.permission-department=部门管理
+routes.permission-grade=管理员
+routes.permission-group=分组管理
+routes.permission-organize=组织管理
+routes.permission-position=岗位管理
+routes.permission-role=角色管理
+routes.permission-user=用户管理
+routes.permission-userOnline=在线用户
+routes.printDemo=打印示例
+routes.report=报表示例
+routes.reportBI=大屏示例
+routes.system=系统管理
+routes.system-area=行政区划
+routes.system-billRule=单据模板
+routes.system-cache=系统缓存
+routes.system-icons=系统图标
+routes.system-kit=表单模板
+routes.system-language=翻译管理
+routes.system-log=系统日志
+routes.system-menu=应用菜单
+routes.system-messageTemplate=消息模板
+routes.system-monitor=系统监控
+routes.system-notice=系统公告
+routes.system-signature=签章管理
+routes.system-smsTemplate=短信模板
+routes.system-sysConfig=系统配置
+routes.system-systemTemplate=系统模板
+routes.system-task=系统调度
+routes.systemData=数据应用
+routes.systemData-dataBackup=数据备份
+routes.systemData-dataInterface=数据接口
+routes.systemData-dataModel=数据建模
+routes.systemData-dataSource=数据连接
+routes.systemData-dataSync=数据同步
+routes.systemData-dictionary=数据字典
+routes.systemData-interfaceAuth=接口认证
+routes.systemData-map=数据地图
+routes.weChat=微信配置
+routes.weChat-mpConfig=公众号配置
+routes.weChat-mpMaterial=公众号素材
+routes.weChat-mpMenu=公众号菜单
+routes.weChat-mpMessage=公众号消息
+routes.weChat-mpUser=公众号用户
+routes.weChat-qyDepartment=企业号组织
+routes.weChat-qyhConfig=企业号配置
+routes.weChat-qyMessage=企业号消息
+routes.weChat-qyUser=企业号用户
+routes.workFlow=协同办公
+routes.workFlow-addFlow=发起流程
+routes.workFlow-document=文档中心
+routes.workFlow-entrust=流程委托
+routes.workFlow-flowCirculate=抄送我的
+routes.workFlow-flowDoing=我的在办
+routes.workFlow-flowDone=我的已办
+routes.workFlow-flowEngine=流程设计
+routes.workFlow-flowLaunch=我发起的
+routes.workFlow-flowMonitor=流程监控
+routes.workFlow-flowTodo=我的待办
+routes.workFlow-flowToSign=我的待签
+routes.workFlow-form=表单设计
+routes.workFlow-printTemplate=打印模板
+routes.workFlow-schedule=日程安排
+routes.workSystem=业务平台
+sys.api.apiRequestFailed=请求出错,请稍候重试
+sys.api.apiTimeoutMessage=接口请求超时,请刷新页面重试!
+sys.api.errMsg401=用户没有权限(令牌、用户名、密码错误)!
+sys.api.errMsg403=用户得到授权,但是访问是被禁止的。!
+sys.api.errMsg404=网络请求错误,未找到该资源!
+sys.api.errMsg405=网络请求错误,请求方法未允许!
+sys.api.errMsg408=网络请求超时!
+sys.api.errMsg500=服务器错误,请联系管理员!
+sys.api.errMsg501=网络未实现!
+sys.api.errMsg502=网络错误!
+sys.api.errMsg503=服务不可用,服务器暂时过载或维护!
+sys.api.errMsg504=网络超时!
+sys.api.errMsg505=http版本不支持该请求!
+sys.api.errorMessage=操作失败,系统异常!
+sys.api.errorTip=错误提示
+sys.api.networkException=网络异常
+sys.api.networkExceptionMsg=网络异常,请检查您的网络连接是否正常!
+sys.api.operationFailed=操作失败
+sys.api.timeoutMessage=登录超时,请重新登录!
+sys.app.logoutMessage=是否确认退出系统?
+sys.app.logoutTip=温馨提醒
+sys.app.menuLoading=菜单加载中...
+sys.errorLog.enableMessage=只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效.
+sys.errorLog.fireAjaxError=点击触发ajax错误
+sys.errorLog.fireResourceError=点击触发资源加载错误
+sys.errorLog.fireVueError=点击触发vue错误
+sys.errorLog.modalTitle=错误详情
+sys.errorLog.tableActionDesc=详情
+sys.errorLog.tableColumnDate=时间
+sys.errorLog.tableColumnFile=文件
+sys.errorLog.tableColumnMsg=错误信息
+sys.errorLog.tableColumnStackMsg=stack信息
+sys.errorLog.tableColumnType=类型
+sys.errorLog.tableTitle=错误日志列表
+sys.exception.backHome=返回首页
+sys.exception.backLogin=返回登录
+sys.exception.networkErrorSubTitle=抱歉,您的网络连接已断开,请检查您的网络!
+sys.exception.networkErrorTitle=网络错误
+sys.exception.noDataTitle=当前页无数据
+sys.exception.subTitle403=抱歉,您无权访问此页面。
+sys.exception.subTitle404=抱歉,您访问的页面不存在。
+sys.exception.subTitle500=抱歉,服务器报告错误。
+sys.lock.alert=锁屏密码错误
+sys.lock.backToLogin=返回登录
+sys.lock.entry=进入系统
+sys.lock.placeholder=请输入登录密码
+sys.lock.unlock=点击解锁
+sys.login.accountPlaceholder=请输入账号
+sys.login.accountTip=请输入账号
+sys.login.backSignIn=返回
+sys.login.changeCode=点击切换验证码
+sys.login.codeTip=请输入验证码
+sys.login.codeTitle=手机验证登录
+sys.login.company=请输入公司名
+sys.login.confirmLogin=请在手机端确认登录
+sys.login.confirmPassword=确认密码
+sys.login.contacts=请输入联系人
+sys.login.diffPwd=两次输入密码不一致
+sys.login.email=邮箱
+sys.login.expired=二维码已失效
+sys.login.forgetFormTitle=重置密码
+sys.login.forgetPassword=忘记密码?
+sys.login.getCode=获取验证码
+sys.login.lastLoginInfo=上次登录信息
+sys.login.logIn=登录
+sys.login.loginButton=登录
+sys.login.mobile=请输入手机号
+sys.login.mobilePlaceholder=请输入手机号码
+sys.login.mobileSignInFormTitle=手机验证码登录
+sys.login.otherLogin=其他登录方式
+sys.login.otherSignIn=其他登录方式
+sys.login.password=请输入密码
+sys.login.passwordPlaceholder=请输入密码
+sys.login.passwordTip=请输入密码
+sys.login.policy=我同意xxx隐私政策
+sys.login.policyPlaceholder=勾选后才能注册
+sys.login.qrCodeTip=请使用APP扫描二维码登录,180秒后二维码失效
+sys.login.qrSignInFormTitle=扫码登录
+sys.login.recoverCode=取消登录
+sys.login.refreshCode=点击刷新
+sys.login.registerButton=注册
+sys.login.rememberMe=记住我
+sys.login.reSend=重新发送
+sys.login.rightMobile=请输入正确的手机号
+sys.login.rule=租户子账户规则:租户号{'@'}账户 例:18577778888{'@'}101001
+sys.login.scanSign=扫码后点击"确认",即可完成登录
+sys.login.scanSuccessful=扫码成功
+sys.login.scanTip=扫码登录
+sys.login.scanTitle=扫码登录
+sys.login.signInDesc=输入您的个人详细信息开始使用!
+sys.login.signInFormTitle=账号密码登录
+sys.login.signInTitle=开箱即用的中后台管理系统
+sys.login.signUpFormTitle=注册
+sys.login.smsCode=请输入验证码
+sys.login.smsPlaceholder=请输入验证码
+sys.login.subTitle=通过账号密码登录
+sys.login.subTitle1=通过手机验证码登录,或者切换为
+sys.login.subTitle2=通过账号密码登录,或者切换为
+sys.login.subTitle3=通过扫码登录,或者切换为
+sys.login.title=账户密码登录
+sys.login.upper=大写已锁定
+sys.login.username=请输入账号
+sys.login.version=版本
+sys.login.welcome=欢迎使用
+sys.validate.arrayRequiredPrefix=请至少选择一个
+sys.validate.date=请输入正确的日期
+sys.validate.email=请输入正确的邮箱
+sys.validate.idCard=请输入正确的身份证号码
+sys.validate.mobilePhone=请输入正确的手机号码
+sys.validate.money=请输入正确的金额
+sys.validate.number=请输入正确的数字
+sys.validate.phone=请输入正确的联系方式
+sys.validate.telephone=请输入正确的电话号码
+sys.validate.textRequiredSuffix=不能为空
+sys.validate.url=请输入正确的网址
+views.dynamicModel.hideSome=隐藏部分
+views.dynamicModel.passwordPlaceholder=请输入密码
+views.dynamicModel.scanAndShare=扫描二维码,分享此链接
+views.dynamicModel.showMore=加载更多
+views.http404.goBackBtn=返回首页
+views.http404.subTips=请检查您输入的URL是否正确,或单击按钮返回首页。
+views.http404.tips=抱歉,你访问的页面不存在或无权访问!
diff --git a/yunzhupaas-admin/src/main/resources/i18n/message_en.properties b/yunzhupaas-admin/src/main/resources/i18n/message_en.properties
new file mode 100644
index 0000000..c35db30
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/i18n/message_en.properties
@@ -0,0 +1,1236 @@
+AD101=Interface cannot be accessed
+AD102=System exception
+AD103=Frequent operations
+AD104=No access permission, please contact the administrator for authorization
+AD105=Authentication failed, unable to access system resources
+AD106=Invalid internal authentication, unable to access system resources
+COD001=Set condition filtering to obtain an empty target
+COPY001=The length of the copied name exceeds the limit length
+DB001=The data type encoding does not comply with the standard (please pay attention to capitalization). MySQL , SQLServer , Oracle , DM , KingbaseES , PostgreSQL
+DB002=Please check 1. Connection information 2. Network communication 3. Database service startup status. Details: {0}
+DB003=Unable to find the corresponding database through URL
+DB004=The query result set is empty.
+DB005=Corresponding database type not found: {0} ({1})
+DB006=No corresponding data type conversion found
+DB007=There are duplicate import table names
+DB008=The table data does not match the current operation database: {0} ->{1}
+DB009=Table information not found: {0}
+DB010=Database {0}, table not found: {1}
+DB011=The joint primary key class is missing the '{0}' field value
+DB012=Indicates that obtaining the corresponding numerical value has failed
+DB013=Currently, the {0} data type: {1} is not supported
+DB014=Field '{1}' in table '{0}' is the primary key and does not allow data type '{2}'
+DB015=Field SQL statement not found
+DB016=No initial fields
+DB017=SQL exception: {0}
+DB018=Please add the corresponding data table to the database
+DB019=Add failed
+DB101=The system comes with a table that cannot be deleted
+DB102=The system comes with a table that cannot be edited
+DB201=The table has already been used and cannot be deleted
+DB202=The table has been used and cannot be edited
+DB301=Database connection successful
+DB302=Database connection failed
+ETD101=Operation failed, original file does not exist
+ETD102=Cannot find parent level
+ETD103=Cannot move to one's own folder
+ETD104=Unable to find this order
+ETD105=Successfully created 10000 pieces of data
+ETD106=Acquisition failed
+ETD107=Account authentication error
+ETD108=You haven't set up an email account yet
+ETD109=File export failed
+ETD110=The file format is incorrect
+ETD111=File not found
+ETD112=This record is associated with a reference and cannot be deleted
+ETD113=Prevent malicious creation of excessive data
+ETD114=Save failed, please log in again
+ETD115=Please enter the preview URL
+ETD116=Please choose the correct preview method
+ETD117=More than 1000 pieces of data
+EXIST001=The name cannot be repeated
+EXIST002=Encoding cannot be repeated
+EXIST003=The original name already exists
+EXIST004=Folder names cannot be duplicated
+EXIST005=Template name exceeds the limit length
+EXIST101=Duplicate name, please re-enter
+EXIST102=Duplicate code, please re-enter
+EXIST103=Cannot be repeated
+FA001=Data does not exist
+FA002=Update failed, data does not exist
+FA003=Delete failed, data does not exist
+FA004=Copy failed, data does not exist
+FA005=Sending failed, data does not exist
+FA006=Download failed, data does not exist
+FA007=Operation failed, data does not exist
+FA008=Stop failed, data does not exist
+FA009=Termination failed, data does not exist
+FA010=Restoration failed, data does not exist
+FA011=Publication failed, data does not exist
+FA012=Acquisition failed, data does not exist
+FA013=Interface modification failed, data does not exist
+FA014=Failed to update interface status, data does not exist
+FA015=Preview failed, data does not exist
+FA016=Delete failed, the folder contains data
+FA017=The file format is incorrect
+FA018=file does not exist
+FA019=Invalid
+FA020=No information found
+FA021=Operation failed! You do not have permission to operate
+FA022=Update failed! You do not have permission to operate (roles can only be operated by super administrators)
+FA023=Update failed! User already bound, unable to switch organizations
+FA024=Delete failed! User bound
+FA025=The permission within the organization is empty, and the organization switch has failed!
+FA026=Update failed, associated organization does not exist, please log in again or refresh the page
+FA027=The menu under this system is empty, and the system switch has failed
+FA028=Failed to add data
+FA029=Data modification failed
+FA030=Update failed! User bound, unable to modify status
+FA031=The organization does not have permission for this application, and the switch has failed
+FA032=The uploaded file cannot be empty
+FA033=File upload failed!
+FA034=Illegal request, lack of authentication information
+FA035=Failed to obtain tenant specified data source information
+FA036=Common data already exists
+FA037=Interface request failed
+FA038=File storage path error
+FA039=The link has expired
+FA040=Preview failed, please check if the file type is standardized
+FA041=Preview failed, please upload the file again
+FA042=Please enter the correct file format
+FA043=There is a file with the same name!
+FA044=The file does not exist
+FA045=Deleting file: {0} failed
+FA046=File read failed
+FA047=No files found
+FA048=The original ID of WeChat official account cannot be duplicated
+FA049=This record is associated with the 'Message Sending Configuration' reference and cannot be disabled
+FA050=This record is associated with the 'Message Sending Configuration' reference and cannot be deleted
+FA051=The interface has been configured with encryption, but data decryption has failed
+FA052=This identity has not been assigned permissions
+FA101=Save failed
+FA102=Update failed
+FA103=Delete failed
+FA104=Acquisition failed
+FA105=Preview failed, please save in preview data first
+FA106=Preview failed, dead loop in cell configuration
+FM001=Interface not found
+FM002=The form information does not exist
+FM003=Duplicate sub table
+FM004=The maximum limit for copying this template has been reached. Please copy the source template!
+FM005=This form has been referenced by the process and cannot be deleted!
+FM006=This form has not been published, and the form content cannot be rolled back
+FM007=The form content in this template is empty and cannot be published
+FM008=This feature has not imported the process form
+FM009=Process not designed, please design the process first!
+FM010=This function process is in a disabled state!
+FM011=Table [{0}] has no primary key!
+FM012=Primary key policy: {0}, inconsistent with the primary key policy of table [{1}]!
+FM013=Table addition error: {0}
+GT101=success
+GT102=fail
+GT103=Verification error
+GT104=abnormal
+GT105=Login expired, please log in again
+GT106=Your account has been logged in elsewhere and has been forcibly kicked out
+GT107=Token verification failed
+GT108=Request exceeds the maximum number
+IMP001=Import successful
+IMP002=Import failed, file format error
+IMP003=Import failed, data already exists
+IMP004=Import failed, data error
+IMP005=Export failed
+IMP006=The imported data format is incorrect
+IMP007=Repeat
+IMP008=Name
+IMP009=Encoding
+IMP010=Import failed, unable to query superior classification
+IMP011=Please select the export field
+LOG001=Account abnormality
+LOG002=Cancellation successful
+LOG004=Account exception, please contact the administrator to modify the organization information
+LOG005=Account not activated
+LOG006=Account has been disabled
+LOG007=The account has been deleted
+LOG010=This IP is not on the whitelist
+LOG011=Login failed, user has not yet bound role
+LOG012=The account has been locked. Please contact the administrator to unlock it
+LOG101=Account or password error
+LOG102=Account error, please re-enter
+LOG103=Please enter the verification code
+LOG104=Verification code error
+LOG105=Failed to connect to tenant service, please try again later
+LOG106=SMS verification code error
+LOG107=The verification code has expired
+LOG108=Please wait {0} minutes before logging in, or contact the administrator to unlock
+LOG109=Tenant login failed, please use mobile verification code to log in
+LOG110=Database exception, please contact the administrator for handling
+LOG111=Single sign on has been enabled, this login method is not supported
+LOG112=This login method is not supported
+LOG113=Tenant information not set
+LOG114=Tenant code cannot be empty
+LOG115=Tenant information acquisition failed
+LOG116=This verification is not supported
+LOG117=SMS verification code verification failed: {0}
+LOG118=Tenant library name is empty
+LOG201=Old password incorrect
+LOG202=Modified successfully, please remember the new password
+LOG203=Modification failed, account does not exist
+LOG204=Modification failed, new password cannot be the same as old password
+LOG205=Password reset successful
+LOG206=Password reset failed
+MSERR101=Sending failed, reason for failure: SMTP service is empty
+MSERR102=Sending failed, reason for failure: sender email is empty
+MSERR103=Sending failed, reason for failure: sender password is empty
+MSERR104=Sending failed, reason for failure: recipient is empty
+MSERR105=Sending failed. Reason for failure: The format of the email account for {0} is incorrect!
+MSERR106=Sending failed. Reason for failure: The email account for {0} is empty!
+MSERR107=Sending failed. Reason for failure: All email addresses corresponding to the recipient are empty
+MSERR108=Sending failed. Reason for failure: {0}
+MSERR109=Connection successful
+MSERR110=Connection failed. Reason for failure: {0}
+MSERR111=has been sent
+MSERR112=The content cannot contain {1}
+DB009=未找到表信息: {0}
+DB010=数据库{0},未找到此表:{1}
+DB011=联合主键类缺少“{0}”字段值
+DB012=表示对应获取数值失败
+DB013=目前还未支持{0}数据类型:{1}
+DB014=表 "{0}"中字段 "{1}" 为主键,不允许数据类型 "{2}"
+DB015=未找到字段SQL语句
+DB016=没有初始字段
+DB017=sql异常:{0}
+DB018=请在数据库中添加对应的数据表
+DB019=添加失败
+DB101=系统自带表,不允许被删除
+DB102=系统自带表,不允许被编辑
+DB201=表已经被使用,不允许被删除
+DB202=表已经被使用,不允许被编辑
+DB301=数据库连接成功
+DB302=数据库连接失败
+ETD101=操作失败,原文件不存在
+ETD102=找不到父级
+ETD103=不能移动到自己的文件夹
+ETD104=未能找到此订单
+ETD105=新建成功10000条数据
+ETD106=获取失败
+ETD107=账户认证错误
+ETD108=你还没有设置邮件的帐户
+ETD109=文件导出失败
+ETD110=文件格式不正确
+ETD111=文件找不到
+ETD112=此记录被关联引用,不允许被删除
+ETD113=防止恶意创建过多数据
+ETD114=保存失败,请重新登陆
+ETD115=请输入预览的url
+ETD116=请选择正确的预览方式
+ETD117=数据超过1000条
+EXIST001=名称不能重复
+EXIST002=编码不能重复
+EXIST003=模板名已存在
+EXIST004=文件夹名称不能重复
+EXIST005=模板名称超过了限制长度
+EXIST101=名称重复,请重新输入
+EXIST102=编码重复,请重新输入
+EXIST103=不能重复
+FA001=数据不存在
+FA002=更新失败,数据不存在
+FA003=删除失败,数据不存在
+FA004=复制失败,数据不存在
+FA005=发送失败,数据不存在
+FA006=下载失败,数据不存在
+FA007=操作失败,数据不存在
+FA008=停止失败,数据不存在
+FA009=终止失败,数据不存在
+FA010=还原失败,数据不存在
+FA011=发布失败,数据不存在
+FA012=获取失败,数据不存在
+FA013=接口修改失败,数据不存在
+FA014=更新接口状态失败,数据不存在
+FA015=预览失败,数据不存在
+FA016=删除失败,该文件夹存在数据
+FA017=文件格式不正确
+FA018=文件不存在
+FA019=已失效
+FA020=未查到信息
+FA021=操作失败!您没有权限操作
+FA022=更新失败!您没有权限操作 (角色只有超级管理员才能够操作)
+FA023=更新失败!已绑定用户,无法切换组织
+FA024=删除失败!已绑定用户
+FA025=该组织内权限为空,组织切换失败!
+FA026=更新失败,关联组织不存在,请重新登录,或者刷新页面
+FA027=该系统下菜单为空,系统切换失败
+FA028=新增数据失败
+FA029=修改数据失败
+FA030=更新失败!已绑定用户,无法修改状态
+FA031=该组织无本应用权限,切换失败
+FA032=上传文件不能为空
+FA033=文件上传失败!
+FA034=非法请求, 缺少认证信息
+FA035=未获取到租户指定数据源信息
+FA036=常用数据已存在
+FA037=接口请求失败
+FA038=文件存储路径错误
+FA039=链接已失效
+FA040=预览失败,请检查文件类型是否规范
+FA041=预览失败,请重新上传文件
+FA042=请输入正确的文件格式
+FA043=存在同名文件!
+FA044=不存在该文件
+FA045=删除文件:{0}失败
+FA046=文件读取失败
+FA047=未发现文件
+FA048=微信公众号原始id不能重复
+FA049=此记录与“消息发送配置”关联引用,不允许被禁用
+FA050=此记录与“消息发送配置”关联引用,不允许被删除
+FA051=接口已配置加密, 数据解密失败.
+FA052=该身份未分配权限
+FA101=保存失败
+FA102=更新失败
+FA103=删除失败
+FA104=获取失败
+FA105=预览失败,请先保存在预览数据
+FA106=预览失败,单元格配置出现死循环
+FM001=未找到接口
+FM002=表单信息不存在
+FM003=子表重复
+FM004=已到达该模板复制上限,请复制源模板!
+FM005=该表单已被流程引用,无法删除!
+FM006=该表单未发布,无法回滚表单内容
+FM007=该模板内表单内容为空,无法发布
+FM008=该功能未导入流程表单
+FM009=流程未设计,请先设计流程!
+FM010=该功能流程处于停用状态!
+FM011=表[{0}]无主键!
+FM012=主键策略:{0},与表[{1}]主键策略不一致!
+FM013=表新增错误:{0}
+GT101=成功
+GT102=失败
+GT103=验证错误
+GT104=异常
+GT105=登录过期,请重新登录
+GT106=您的帐号在其他地方已登录,被强制踢出
+GT107=Token验证失败
+GT108=请求超过最大数
+IMP001=导入成功
+IMP002=导入失败,文件格式错误
+IMP003=导入失败,数据已存在
+IMP004=导入失败,数据有误
+IMP005=导出失败
+IMP006=导入数据格式不正确
+IMP007=重复
+IMP008=名称
+IMP009=编码
+IMP010=导入失败,查询不到上级分类
+IMP011=请选择导出字段
+LOG001=账户异常
+LOG002=注销成功
+LOG004=账号异常,请联系管理员修改所属组织信息
+LOG005=账号未被激活
+LOG006=账号已被禁用
+LOG007=账号已被删除
+LOG010=此IP未在白名单中
+LOG011=登录失败,用户暂未绑定角色
+LOG012=账号已被锁定,请联系管理员解除锁定
+LOG101=账号或密码错误
+LOG102=账号有误,请重新输入
+LOG103=请输入验证码
+LOG104=验证码错误
+LOG105=连接租户服务失败,请稍后再试
+LOG106=短信验证码错误
+LOG107=验证码已失效
+LOG108=请等待{0}分钟后再进行登录,或联系管理员解除锁定
+LOG109=租户登录失败,请用手机验证码登录
+LOG110=数据库异常,请联系管理员处理
+LOG111=已开启单点登录, 不支持此登录方式
+LOG112=不支持此登录方式
+LOG113=未设置租户信息
+LOG114=租户编码不允许为空
+LOG115=租户信息获取失败
+LOG116=不支持此验证
+LOG117=短信验证码验证失败:{0}
+LOG118=租户库名为空
+LOG201=旧密码错误
+LOG202=修改成功,请牢记新密码
+LOG203=修改失败,账号不存在
+LOG204=修改失败,新建密码不能与旧密码一样
+LOG205=重置密码成功
+LOG206=重置密码失败
+MSERR101=发送失败,失败原因:SMTP服务为空
+MSERR102=发送失败,失败原因:发件人邮箱为空
+MSERR103=发送失败,失败原因:发件人密码为空
+MSERR104=发送失败,失败原因:接收人为空
+MSERR105=发送失败。失败原因:{0}的邮箱账号格式有误!
+MSERR106=发送失败。失败原因:{0}的邮箱账号为空!
+MSERR107=发送失败。失败原因:接收人对应的邮箱全部为空
+MSERR108=发送失败。失败原因:{0}
+MSERR109=连接成功
+MSERR110=连接失败。失败原因:{0}
+MSERR111=已发送
+MSERR112=内容不能包含<符号
+MSERR113=暂无未读消息
+MSERR114=自定义模板编码不能使用系统模板编码规则
+MSERR115=创建失败,存在多个标题参数
+MSERR116=创建失败,不存在标题参数
+MSERR117=更新失败,存在多个标题参数
+MSERR118=更新失败,不存在标题参数
+MSERR119=请先前往系统同步设置,配置钉钉账号
+MSERR120=请先前往系统同步设置,配置企业微信账号
+MSERR121=配置模板无数据,无法测试
+OA001=用户登录
+OA002=设备
+OA003=TOKEN
+OA004=用户退出
+OA005=用户踢出
+OA006=用户顶替
+OA007=登录异常
+OA008=登录获取系统配置失败
+OA009=该用户未分配权限
+OA010=仅支持pc端访问,APP端不支持
+OA011=应用不存在
+OA012=当前应用已被禁用
+OA013=登录密码解密失败
+OA014=注销成功
+OA015=登录成功
+OA016=登录票据已失效
+OA017=第三方未绑定账号
+OA018=不允许访问此登录接口
+OA019=账号不存在
+OA020=账户或密码错误,请重新输入
+OA021=验证成功
+OA022=限制会话, 不允许访问系统
+OA023=管理员不能注销
+OA024=登录失败
+OA025=超级管理员
+OA026=普通管理员
+OA027=普通用户
+OA028=未知来源
+PRI001=打印模板不存在
+PRI002=数字字典不存在printDev的字典分类
+PRI003=第1条SQL语句:查询出多条表头信息
+PRI004=第1条SQL语句:未查出表头信息
+PRI005=第{index}条SQL语句:
+PRI006=已到达该模板复制上限,请复制源模板
+PRI007=Sql语法错误
+PRI008=该报表已删除
+PS001=此记录与"{0}"关联引用,不允许被删除
+PS003=组织
+PS004=岗位
+PS005=用户
+PS006=角色
+PS007=账号不能为空
+PS008=姓名不能为空
+PS009=用户额度已达到上限
+PS010=权限已变更,请重新登录
+PS011=密码已变更,请重新登录
+PS012=类型不能为空
+PS013=当前机构Id不能与父机构Id相同
+PS014=该应用已禁用
+PS015=无法设置当前用户为分级管理员
+PS016=无法设置超管为分级管理员
+PS017=无法设置当前用户操作权限
+PS018=解绑失败
+PS019=第三方登录未配置
+PS020=性别不能为空
+PS021=无法禁用管理员用户
+PS022=管理员只能修改自己,不能修改其他管理员
+PS023=无法修改管理员账户
+PS024=直属主管不能是自己
+PS025=直属主管不能是我的下属用户
+PS026=无法删除管理员账户
+PS027=此用户为某部门主管,无法删除
+PS028=此用户有下属,无法删除
+PS029=无法修改管理员账户状态
+PS030=用户信息已变更,请重新登录
+PS031=该应用已删除
+PS032=该组织无本应用权限,切换失败
+PS033=工作交接成功!
+PS034=工作交接无法转移给管理员
+PS035=工作交接无法转移给本人
+SC001=操作失败,任务不存在
+SU000=Success
+SU001=新建成功
+SU002=保存成功
+SU003=删除成功
+SU004=更新成功
+SU005=操作成功
+SU006=提交成功,请耐心等待
+SU007=复制成功
+SU008=停止成功
+SU009=终止成功
+SU010=还原成功
+SU011=发布成功
+SU012=发送成功
+SU013=接口修改成功
+SU014=更新接口状态成功
+SU015=上传成功
+SU016=设置成功
+SU017=验证成功
+SU018=添加成功
+SU019=获取成功
+SU020=回滚成功
+SU021=移除成功
+SU022=查询成功
+SYS001=区域编码不能重复
+SYS002=删除失败,当前有子节点数据
+SYS003=单据已经被使用,不允许被删除
+SYS004=清理成功
+SYS005=接口创建成功
+SYS006=当前SQL含有敏感字:{0}
+SYS007=接口请求成功
+SYS008=接口不符合规范
+SYS009=变量名不能包含敏感字符
+SYS010=变量名已存在
+SYS011=数据库连接不能相同
+SYS012=请检查,同一数据库下无法同步数据
+SYS013=同步失败:{0}
+SYS014=字典类型下面有字典值禁止删除
+SYS015=模板不存在
+SYS016=当前目录存在数据,不能修改类型
+SYS017=删除失败,请先删除子菜单
+SYS018=当前导入菜单为{0}端菜单,请在对应模块下导入!
+SYS019=请在顶级节点下创建目录后再进行菜单导入
+SYS020=该字段在方案{0}中已被使用
+SYS021=修改失败,该方案不允许编辑
+SYS022=编码错误
+SYS023=请求发生错误!
+SYS024=获取不到数据!
+SYS025=获取企业微信access_token失败
+SYS026=正在进行同步,请稍后再试
+SYS027=请先从企业微信同步部门到本地
+SYS028=请先从钉钉同步部门到本地
+SYS029=验证码位数不能大于6
+SYS030=验证码位数不能小于3
+SYS031=测试发送消息的连接失败:{0}
+SYS032=测试发送消息连接成功
+SYS033=测试组织同步的连接失败:{0}
+SYS034=测试组织同步连接成功
+SYS035=测试连接类型错误
+SYS036=测试钉钉连接失败:
+SYS037=测试连接成功
+SYS038=表信息抽取异常
+SYS039=删除失败,请先删除该应用下的菜单和门户
+SYS040=删除失败,请先删除该应用下的菜单
+SYS041=删除失败,请先删除该应用下的门户
+SYS042=该日程已被删除
+SYS043=最后一条数据不能删除
+SYS044=启用版本不能删除
+SYS045=归档版本不能删除
+SYS046=数据集不能重名
+SYS047=SQL语句仅支持查询语句
+SYS048=SQL语句需带上@formId条件
+SYS049=正在进行同步,请稍等
+SYS050=只能输入字母、数字、点、横线和下划线,且以字母开头
+SYS051=翻译标记不能重复
+SYS052=翻译语言至少填写一项
+SYS053=获取钉钉access_token失败
+SYS101=更新失败,主系统不允许禁用
+SYS102=主系统不允许删除
+SYS103=系统在审批常用语中被使用,不允许删除
+SYS104=更新失败,主系统不允许修改编码
+SYS105=常用语已存在
+SYS121=接口暂只支持HTTP和HTTPS方式
+SYS122=接口请求失败
+SYS123=接口请求失败, JS调用失败,错误:{0}
+SYS124=验证请求超时
+SYS125=appSecret错误
+SYS126=appId使用期限已到期
+SYS127=appId参数错误
+SYS128={0}不能使用系统、开发语言及数据库关键字命名
+SYS129=当前数据源不支持全连接
+SYS130=标题不能为空
+SYS131=结束时间必须晚于开始时间
+SYS132=结束重复必须晚于开始时间
+VS001=同步到流程时,{0}
+VS002=发布失败,流程未设计!
+VS003=无表生成有表失败
+VS004=发布
+VS005=预览
+VS006=下载
+VS007=同步成功
+VS008=回滚失败,暂无线上版本
+VS009=参数解析错误!
+VS010=无效链接
+VS011=密码错误
+VS012=未找到该功能表单
+VS013=未开启表单外链!
+VS014=下载链接已失效
+VS015=字段不能为空
+VS016=路径错误
+VS017=集成助手被禁用
+VS018=表规范名称不能重复
+VS019=规范名称不能使用系统关键字或JAVA关键字
+VS020=字段规范名称不能重复
+VS021=“{0}”命名不符合规范
+VS022=主键策略:[雪花ID],表[ {0} ]主键设置不支持!
+VS023=主键策略:[自增ID],表[ {0} ]主键设置不支持!
+VS024=表单不存在或者未发布!
+VS025=未获取到流程发起人
+VS026=规范名称前两字母必须小写
+VS027=自动生成的【{0}】超出长度,提交失败!
+VS028=视图最多新建5个
+VS401=该模板内表单内容为空,无法
+VS402=该模板内列表内容为空,无法
+VS403=该功能未配置流程不可用
+VS404=单行输入不能重复
+VS405=当前表单原数据已被调整,请重新进入该页面编辑并提交数据
+VS406=该功能配置的流程处于停用
+VS407=表头名称不可更改,表头行不能删除
+VS408=请至少选择一个数据表
+VS409=未找到主表信息
+VS410=请导入对应功能的json文件
+VS411=已存在相同功能
+VS412=该表单已删除
+VS413=应用不能为空
+VS414=门户数据信息存在重复
+VS415=该门户已删除
+WF001=审核成功
+WF002=退回成功
+WF003=转办成功
+WF004=加签成功
+WF005=当前流程被退回,无法撤回流程
+WF006=流程已撤回,不能重复操作
+WF007=撤回失败,转向数据无法撤回
+WF008=撤回成功
+WF009=功能流程不能终止
+WF010=指派成功
+WF011=批量操作完成
+WF012=该流程不能操作
+WF013=复活成功
+WF014=变更成功
+WF015=挂起成功
+WF016=恢复成功
+WF017=委托人和被委托人相同,委托失败
+WF018=操作失败,同一时间内有相同流程的委托
+WF019=操作失败,同一时间内有相同流程,不能相互委托
+WF020=功能流程不能删除
+WF021=不能删除
+WF022=催办成功
+WF023=未找到催办人
+WF024=该功能已被流程引用,请重新选择关联功能
+WF025=启用失败,流程未设计
+WF026=启用成功
+WF027=禁用成功
+WF028=该版本内有工单任务流转,无法删除
+WF029=您没有发起该流程的权限
+WF030=表单未找到
+WF031=已审核完成
+WF032=冻结不能操作
+WF033=转向节点不存在或配置错误
+WF034=转向失败,转向节点未审批
+WF035=退回至您的审批,不能再发起退回
+WF036=流程已处理,无法撤回
+WF037=当前流程包含子流程,无法撤回
+WF038=子流程无法撤回
+WF039=下一节点为选择分支无法批量审批
+WF040=条件流程包含候选人无法批量通过
+WF041=该流程工单已终止
+WF042=该流程工单已撤回
+WF043=该节点没有数据,无法复活
+WF044=此流程不支持变更
+WF045=当前节点有子流程无法变更
+WF046=退回节点包含子流程,退回失败
+WF047=当前节点未审批,不能退回
+WF048=流程处于挂起状态,不可操作
+WF049=当前流程正在运行不能删除
+WF050=已被挂起不能删除
+WF051=没有删除权限
+WF052=主版本没有内容
+WF053=流程没有启用
+WF054=流程编码不能重复
+WF055=流程表单不一致,请重新选择
+WF056=该流程由在线开发生成的,无法直接删除,请在功能设计中删除相关功能
+WF057=该流程内工单任务流转未结束,无法删除
+WF058=当前流程正在运行不能重复提交
+WF059=流程自动发起审批失败
+WF060=驳回节点不能是子流程
+WF061=下一节点无审批人员请联系管理员
+WF062=表单已被引用,请重新选择
+WF063=流程已发起,无法删除
+WF064=任务不存在,或者已处理
+WF065=拒绝成功
+WF066=同意成功
+WF067=协办成功
+WF068=协办保存成功
+WF069=减签成功
+WF070=撤销成功
+WF071=最后一条数据不能删除
+WF072=启用版本不能删除
+WF073=归档版本不能删除
+WF074=暂停成功
+WF075=条件不满足无法流转
+WF076=节点不存在
+WF077=流程无法撤回
+WF078=流程未同意,无法撤销
+WF079=归档异常
+WF080=选择的数据不能退签
+WF081=无法加签
+WF082=无法减签
+WF083=无法退回
+WF084=无法转审
+WF085=无法协办
+WF086=无法批量审批
+WF087=经办未签收
+WF088=经办未开始办理
+WF089=流程发布失败
+WF090=流程发布失败
+WF091=流程提交失败
+WF092=获取引擎当前任务失败
+WF093=流程删除失败
+WF094=获取出线集合失败
+WF095=获取线之后的任务节点失败
+WF096=获取下一级任务节点集合失败
+WF097=获取上一级任务节点集合失败
+WF098=任务完成失败
+WF099=获取流程实例失败
+WF100=获取未经过的节点失败
+WF101=获取节点的后续节点失败
+WF102=获取可回退的节点失败
+WF103=退回失败
+WF104=节点跳转失败
+WF105=补偿失败
+WF106=不能加签给自己
+WF107=不能转审给自己
+WF108=不能协办给自己
+WF109=必须保留一名加签人员
+WF110=审批异常无法撤销
+WF111=所选流程包含条件候选人
+WF112=选择的数据对应流程已暂停
+WF113=已被暂停不能删除
+WF114=流程处于暂停状态,不可操作
+WF115=流程已受理,无法删除
+WF116=不能加签给委托人
+WF117=不能转审给委托人
+WF118=不能协办给委托人
+WF119=设置了流转条件,无法批量审批
+WF120=下一节点审批异常,无法批量审批
+WF121=子流程自动发起审批失败
+WF122=流程不存在
+WF123=流程处于终止状态,不可操作
+WF124=该流程已发起数据,无法删除!
+WF125=您没有发起委托流程
+WF126=撤销流程不能转审
+WF127=撤销流程不能退回
+WF128=该用户已审批,请重新打开界面
+WF129=委托人已无该流程权限
+WF130=管理员不能新建委托/代理
+WF131=不能选择admin
+WF132=已有人接受,不可编辑
+WF133=流转条件不满足,无法自动发起审批
+WF134=第一个审批节点设置候选人,无法自动发起审批
+WF135=第一个审批节点异常,无法自动发起审批
+WF136=找不到发起人,发起失败
+WF137=代理人和被代理人相同,代理失败
+WF138=存在未签收的数据,无法关闭
+WF139=该流程已触发了任务,无法删除
+WF144=操作失败,同一时间内有相同流程的代理
+WF145=操作失败,同一时间内有相同流程,不能相互代理
+app.apply.expandData=展开数据
+app.apply.location.location=添加定位
+app.apply.location.modalTitle=选择位置
+app.apply.location.relocation=重新定位
+app.apply.noMoreData=没有更多数据
+app.apply.pleaseKeyword=请输入关键字搜索
+app.apply.screen=筛选
+app.apply.sort=排序
+app.my.accountSecurity=账号安全
+app.my.agencyMe=代理给我
+app.my.allFlow=全部流程
+app.my.entrustedAgency=委托代理
+app.my.entrustMe=委托给我
+app.my.flowSelect=流程选择
+app.my.logOut=退出登录
+app.my.myAgency=我的代理
+app.my.myEntrust=我的委托
+app.my.organization=我的组织
+app.my.position=我的岗位
+app.my.scanCode=扫一扫
+app.my.setting=设置
+app.my.settings.About=关于平台
+app.my.settings.changePassword=修改密码
+app.my.settings.contact=联系我们
+app.my.settings.language=多语言
+app.my.settings.privacyPolicy=隐私政策
+app.my.settings.userAgreement=用户协议
+app.my.sto=终止
+app.my.subordinates=我的下属
+app.my.switchIdentity=切换身份
+common.add1Text=添加
+common.add2Text=新增
+common.addText=新建
+common.back=返回
+common.batchDelText=批量删除
+common.batchDelTip=您确定要删除这些数据吗, 是否继续?
+common.batchPrintText=批量打印
+common.cancelText=取消
+common.chooseText=请选择
+common.chooseTextPrefix=请选择
+common.cleanText=清空
+common.closeList=关闭列表
+common.closeText=关闭
+common.collapseAll=折叠
+common.continueAndAddText=确定并新增
+common.continueText=确定并继续
+common.copyText=复制
+common.dark=黑暗主题
+common.delText=删除
+common.delTip=此操作将永久删除该数据, 是否继续?
+common.detailText=详情
+common.drawerSearchText=请输入关键词
+common.editText=编辑
+common.enterKeyword=请输入关键词
+common.expandAll=展开
+common.exportText=导出
+common.importText=导入
+common.inputPlaceholder=请输入
+common.inputText=请输入
+common.inputTextPrefix=请输入
+common.keyword=关键词
+common.leftTreeSearchText=请输入关键词
+common.light=亮色主题
+common.loadingText=加载中...
+common.moreText=更多
+common.next=下一步
+common.nextRecord=下一条
+common.noData=暂无数据
+common.okText=确定
+common.prev=上一步
+common.previewText=预览
+common.prevRecord=上一条
+common.printText=打印
+common.queryText=查询
+common.redo=刷新
+common.redoText=重做
+common.resetText=重置
+common.saveText=保存
+common.searchText=搜索
+common.selectDataTip=请选择一条数据
+common.selectI18nCode=选择翻译标记
+common.selectPlaceholder=请选择
+common.submitText=提交
+common.superQuery=高级查询
+common.syncText=第三方同步
+common.tipTitle=提示
+common.undoText=撤销
+component.app.searchNotData=暂无搜索结果
+component.app.toNavigate=切换
+component.app.toSearch=确认
+component.countdown.normalText=获取验证码
+component.countdown.sendText={0}秒后重新获取
+component.cropper.btn_reset=重置
+component.cropper.btn_rotate_left=逆时针旋转
+component.cropper.btn_rotate_right=顺时针旋转
+component.cropper.btn_scale_x=水平翻转
+component.cropper.btn_scale_y=垂直翻转
+component.cropper.btn_zoom_in=放大
+component.cropper.btn_zoom_out=缩小
+component.cropper.modalTitle=头像上传
+component.cropper.okText=确认并上传
+component.cropper.preview=预览
+component.cropper.selectImage=选择图片
+component.cropper.uploadSuccess=上传成功
+component.drawer.cancelText=关闭
+component.drawer.loadingText=加载中...
+component.drawer.okText=确认
+component.excel.exportModalTitle=导出数据
+component.excel.fileName=文件名
+component.excel.fileType=文件类型
+component.form.apiSelectNotFound=请等待数据加载完成...
+component.form.fold=收起
+component.form.maxTip=字符数应小于{0}位
+component.form.unfold=展开
+component.icon.copy=复制图标成功!
+component.icon.placeholder=点击选择图标
+component.icon.search=搜索图标
+component.com.yunzhupaas.areaSelect.modalTitle=省市区
+component.com.yunzhupaas.calculate.storage=用于展示计算结果,且数据同时会保存入库
+component.com.yunzhupaas.calculate.unStorage=用于展示计算结果,且数据不会保存
+component.com.yunzhupaas.common.allData=全部数据
+component.com.yunzhupaas.common.autoGenerate=系统自动生成
+component.com.yunzhupaas.common.clearAll=清空列表
+component.com.yunzhupaas.common.selected=已选
+component.com.yunzhupaas.dateRange.endPlaceholder=结束日期
+component.com.yunzhupaas.dateRange.startPlaceholder=开始日期
+component.com.yunzhupaas.depSelect.modalTitle=选择部门
+component.com.yunzhupaas.groupSelect.modalTitle=选择分组
+component.com.yunzhupaas.iconPicker.modalTitle=图标选择
+component.com.yunzhupaas.iconPicker.searchPlaceholder=请输入关键词
+component.com.yunzhupaas.iconPicker.select=选择
+component.com.yunzhupaas.iconPicker.ymCustom=ymCustom图标
+component.com.yunzhupaas.iconPicker.ymIcon=ymIcon图标
+component.com.yunzhupaas.location.location=添加定位
+component.com.yunzhupaas.location.modalTitle=选择位置
+component.com.yunzhupaas.location.relocation=重新定位
+component.com.yunzhupaas.location.searchPlaceholder=搜索或直接在地图上点选
+component.com.yunzhupaas.numberRange.max=最大值
+component.com.yunzhupaas.numberRange.min=最小值
+component.com.yunzhupaas.organizeSelect.modalTitle=选择组织
+component.com.yunzhupaas.popupAttr.storage=用于展示关联弹窗的属性,且数据同时会保存入库
+component.com.yunzhupaas.popupAttr.unStorage=用于展示关联弹窗的属性,且数据不会保存
+component.com.yunzhupaas.popupSelect.modalTitle=选择数据
+component.com.yunzhupaas.posSelect.modalTitle=选择岗位
+component.com.yunzhupaas.relationFormAttr.storage=用于展示关联表单的属性,且数据同时会保存入库
+component.com.yunzhupaas.relationFormAttr.unStorage=用于展示关联表单的属性,且数据不会保存
+component.com.yunzhupaas.roleSelect.modalTitle=选择角色
+component.com.yunzhupaas.sign.operateTip=请在此区域使用鼠标手写签名
+component.com.yunzhupaas.sign.signPlaceholder=请签名
+component.com.yunzhupaas.sign.signTip=手写签名
+component.com.yunzhupaas.timeRange.endPlaceholder=结束时间
+component.com.yunzhupaas.timeRange.startPlaceholder=开始时间
+component.com.yunzhupaas.userSelect.modalTitle=选择用户
+component.menu.search=菜单搜索
+component.modal.cancelText=关闭
+component.modal.close=关闭
+component.modal.maximize=最大化
+component.modal.okText=确认
+component.modal.restore=还原
+component.table.action=操作
+component.table.index=序号
+component.table.settingColumn=列设置
+component.table.settingColumnShow=列展示
+component.table.settingDens=密度
+component.table.settingDensDefault=默认
+component.table.settingDensMiddle=中等
+component.table.settingDensSmall=紧凑
+component.table.settingFixedLeft=固定到左侧
+component.table.settingFixedRight=固定到右侧
+component.table.settingFullScreen=全屏
+component.table.settingIndexColumnShow=序号列
+component.table.settingSelectColumnShow=勾选列
+component.table.status=状态
+component.table.summary=合计
+component.table.total=共 {total} 条数据
+component.time.after=后
+component.time.before=前
+component.time.days=天
+component.time.hours=小时
+component.time.just=刚刚
+component.time.minutes=分钟
+component.time.seconds=秒
+component.tree.checkStrictly=层级关联
+component.tree.checkUnStrictly=层级独立
+component.tree.expandAll=展开全部
+component.tree.reload=刷新数据
+component.tree.selectAll=选择全部
+component.tree.unExpandAll=折叠全部
+component.tree.unSelectAll=取消选择
+component.upload.accept=支持{0}格式
+component.upload.acceptUpload=只能上传{0}格式文件
+component.upload.audio=音频
+component.upload.buttonText=点击上传
+component.upload.checking=文件校验中
+component.upload.choose=选择文件
+component.upload.del=删除
+component.upload.download=下载
+component.upload.downloadAll=全部下载
+component.upload.fileMaxNumber=最多可以上传{0}个文件
+component.upload.fileMaxSize=文件大小超过{size}{unit}
+component.upload.fileName=文件名
+component.upload.fileReadError=文件{0}读取出错,请检查该文件
+component.upload.fileSize=文件大小
+component.upload.fileStatue=状态
+component.upload.fileTypeCheck=请选择{0}类型的文件
+component.upload.image=图片
+component.upload.imageMaxNumber=最多可以上传{0}张图片
+component.upload.imageMaxSize=图片大小超过{size}{unit}
+component.upload.imgUpload=图片上传
+component.upload.legend=略缩图
+component.upload.maxNumber=最多只能上传{0}个文件
+component.upload.maxSize=单个文件不超过{0}MB
+component.upload.maxSizeMultiple=只能上传不超过{0}MB的文件!
+component.upload.operating=操作
+component.upload.paused=暂停中
+component.upload.preview=预览
+component.upload.reUploadFailed=重新上传失败文件
+component.upload.save=保存
+component.upload.saveError=没有上传成功的文件,无法保存!
+component.upload.saveWarn=请等待文件上传后,保存!
+component.upload.startUpload=开始上传
+component.upload.upload=上传
+component.upload.uploaded=已上传
+component.upload.uploadError=上传失败
+component.upload.uploadImg=请上传图片
+component.upload.uploading=上传中
+component.upload.uploadSuccess=上传成功
+component.upload.uploadWait=请等待文件上传结束后操作
+component.upload.video=视频
+component.upload.videoNoPreview=音视频文件不能预览
+component.upload.view=查看
+component.upload.viewImage=查看图片
+component.upload.waiting=等待中
+component.upload.zipNoPreview=压缩包不能预览
+component.verify.dragText=请按住滑块拖动
+component.verify.error=验证失败!
+component.verify.redoTip=点击图片可刷新
+component.verify.successText=验证通过
+component.verify.time=验证校验成功,耗时{time}秒!
+formGenerator.cleanComponentTip=确定要清空所有组件吗?
+formGenerator.component.alert=提示
+formGenerator.component.areaSelect=省市区域
+formGenerator.component.autoComplete=下拉补全
+formGenerator.component.barcode=条形码
+formGenerator.component.billRule=单据组件
+formGenerator.component.button=按钮
+formGenerator.component.calculate=计算公式
+formGenerator.component.card=卡片容器
+formGenerator.component.cascader=级联选择
+formGenerator.component.checkbox=多选框组
+formGenerator.component.collapse=折叠面板
+formGenerator.component.colorPicker=颜色选择
+formGenerator.component.createTime=创建时间
+formGenerator.component.createUser=创建人员
+formGenerator.component.currOrganize=所属组织
+formGenerator.component.currPosition=所属岗位
+formGenerator.component.datePicker=日期选择
+formGenerator.component.depSelect=部门选择
+formGenerator.component.divider=分割线
+formGenerator.component.editor=富文本
+formGenerator.component.groupSelect=分组选择
+formGenerator.component.groupTitle=分组标题
+formGenerator.component.iframe=Iframe
+formGenerator.component.input=单行输入
+formGenerator.component.inputNumber=数字输入
+formGenerator.component.link=链接
+formGenerator.component.location=定位
+formGenerator.component.modifyTime=修改时间
+formGenerator.component.modifyUser=修改人员
+formGenerator.component.organizeSelect=组织选择
+formGenerator.component.popupAttr=弹窗选择属性
+formGenerator.component.popupSelect=弹窗选择
+formGenerator.component.popupTableSelect=下拉表格
+formGenerator.component.posSelect=岗位选择
+formGenerator.component.qrcode=二维码
+formGenerator.component.radio=单选框组
+formGenerator.component.rate=评分
+formGenerator.component.relationForm=关联表单
+formGenerator.component.relationFormAttr=关联表单属性
+formGenerator.component.roleSelect=角色选择
+formGenerator.component.row=栅格容器
+formGenerator.component.select=下拉选择
+formGenerator.component.sign=手写签名
+formGenerator.component.slider=滑块
+formGenerator.component.switch=开关
+formGenerator.component.tab=标签面板
+formGenerator.component.table=设计子表
+formGenerator.component.tableGrid=表格容器
+formGenerator.component.text=文本
+formGenerator.component.textarea=多行输入
+formGenerator.component.timePicker=时间选择
+formGenerator.component.treeSelect=下拉树形
+formGenerator.component.uploadFile=文件上传
+formGenerator.component.uploadImg=图片上传
+formGenerator.component.userSelect=用户选择
+formGenerator.component.usersSelect=用户组件
+formGenerator.copyComponentTip=确定复制该组件?
+formGenerator.delComponentTip=确定删除该组件?
+layout.footer.onlineDocument=在线文档
+layout.footer.onlinePreview=在线预览
+layout.header.about=关于平台
+layout.header.commonMenus=常用菜单
+layout.header.dropdownItemDoc=文档
+layout.header.dropdownItemLoginOut=退出系统
+layout.header.feedback=反馈问题
+layout.header.home=首页
+layout.header.lockScreen=锁定屏幕
+layout.header.lockScreenBtn=锁定
+layout.header.lockScreenPassword=锁屏密码
+layout.header.profile=个人信息
+layout.header.setting=设置
+layout.header.standingChange=切换身份
+layout.header.statement=官方声明
+layout.header.systemChange=应用切换
+layout.header.tooltipChat=聊天
+layout.header.tooltipEntryFull=全屏
+layout.header.tooltipErrorLog=错误日志
+layout.header.tooltipExitFull=退出全屏
+layout.header.tooltipLock=锁定屏幕
+layout.header.tooltipNotify=消息
+layout.multipleTab.close=关闭标签页
+layout.multipleTab.closeAll=关闭全部标签页
+layout.multipleTab.closeLeft=关闭左侧标签页
+layout.multipleTab.closeOther=关闭其它标签页
+layout.multipleTab.closeRight=关闭右侧标签页
+layout.multipleTab.reload=重新加载
+layout.multipleTab.setCommon=设为常用菜单
+layout.setting.animation=动画
+layout.setting.animationType=动画类型
+layout.setting.autoScreenLock=自动锁屏
+layout.setting.blueBg=蔚蓝星辰
+layout.setting.breadcrumb=面包屑
+layout.setting.breadcrumbIcon=面包屑图标
+layout.setting.cachePage=缓存页面
+layout.setting.clearBtn=清空缓存并返回登录页
+layout.setting.closeMixSidebarOnChange=切换页面关闭菜单
+layout.setting.collapseMenuDisplayName=折叠菜单显示名称
+layout.setting.colorWeak=色弱模式
+layout.setting.contentMode=内容区域宽度
+layout.setting.contentModeFixed=定宽
+layout.setting.contentModeFull=流式
+layout.setting.copyBtn=拷贝
+layout.setting.darkMode=主题
+layout.setting.defaultBg=经典主题
+layout.setting.drawerTitle=配置
+layout.setting.expandedMenuWidth=菜单展开宽度
+layout.setting.fixedHeader=固定header
+layout.setting.fixedSideBar=固定Sidebar
+layout.setting.footer=页脚
+layout.setting.fullContent=全屏内容
+layout.setting.grayMode=灰色模式
+layout.setting.greenBg=碧绿翠风
+layout.setting.header=顶栏
+layout.setting.headerTheme=顶栏主题
+layout.setting.interfaceDisplay=界面显示
+layout.setting.interfaceFunction=界面功能
+layout.setting.menuAccordion=侧边菜单手风琴模式
+layout.setting.menuCollapse=折叠菜单
+layout.setting.menuCollapseButton=菜单折叠按钮
+layout.setting.menuDrag=侧边菜单拖拽
+layout.setting.menuSearch=菜单搜索
+layout.setting.menuTriggerBottom=底部
+layout.setting.menuTriggerNone=不显示
+layout.setting.menuTriggerTop=顶部
+layout.setting.menuTypeMix=顶部混合模式
+layout.setting.menuTypeMixSidebar=左侧混合模式
+layout.setting.menuTypeSidebar=左侧菜单模式
+layout.setting.menuTypeTopMenu=顶部菜单模式
+layout.setting.minute=分钟
+layout.setting.mixSidebarFixed=固定展开菜单
+layout.setting.mixSidebarTrigger=混合菜单触发方式
+layout.setting.navMode=导航栏模式
+layout.setting.notAutoScreenLock=不自动锁屏
+layout.setting.off=关
+layout.setting.on=开
+layout.setting.operatingContent=复制成功,请到 src/settings/projectSetting.ts 中修改配置!
+layout.setting.operatingTitle=操作成功
+layout.setting.progress=顶部进度条
+layout.setting.purpleBg=紫藤萝兰
+layout.setting.resetSuccess=重置成功!
+layout.setting.sidebar=左侧菜单
+layout.setting.sidebarTheme=菜单主题
+layout.setting.splitMenu=分割菜单
+layout.setting.switchAnimation=切换动画
+layout.setting.switchLoading=切换loading
+layout.setting.systemBackground=系统背景
+layout.setting.sysTheme=系统主题
+layout.setting.tabDetail=标签详情页
+layout.setting.tabs=标签页
+layout.setting.tabsFoldBtn=标签页折叠按钮
+layout.setting.tabsIcon=标签图标
+layout.setting.tabsQuickBtn=标签页快捷按钮
+layout.setting.tabsRedoBtn=标签页刷新按钮
+layout.setting.toggleLocale=语言切换
+layout.setting.topMenuAlignCenter=居右
+layout.setting.topMenuAlignLeft=居左
+layout.setting.topMenuAlignRight=居中
+layout.setting.topMenuLayout=顶部菜单布局
+layout.setting.triggerClick=点击
+layout.setting.triggerHover=悬停
+routes.basic.emailDetail=查看邮件
+routes.basic.errorLogList=错误日志列表
+routes.basic.externalLink=链接
+routes.basic.home=首页
+routes.basic.login=登录
+routes.basic.previewModel=功能预览
+routes.basic.workFlowDetail=流程详情
+routes.commonWords=审批常用语
+routes.dataReport=报表示例(原)
+routes.extend=开发示例
+routes.extend-barCode=条码示例
+routes.extend-bigData=百万数据
+routes.extend-documentPreview=文档示例
+routes.extend-email=邮件收发
+routes.extend-formDemo=表单示例
+routes.extend-formDemo-fieldForm1=表单字段1
+routes.extend-formDemo-fieldForm2=表单字段2
+routes.extend-formDemo-fieldForm3=表单字段3
+routes.extend-formDemo-fieldForm4=表单字段4
+routes.extend-formDemo-fieldForm5=表单字段5
+routes.extend-formDemo-fieldForm6=表单字段6
+routes.extend-formDemo-verifyForm=表单验证
+routes.extend-formDemo-verifyForm1=表单验证1
+routes.extend-functionDemo=功能示例
+routes.extend-graphDemo=图表示例
+routes.extend-graphDemo-echartsBar=E-柱状图
+routes.extend-graphDemo-echartsBarAcross=E-横状条形图
+routes.extend-graphDemo-echartsCandlestick=E-K线图
+routes.extend-graphDemo-echartsFunnel=E-漏斗图
+routes.extend-graphDemo-echartsGauge=E-仪表图
+routes.extend-graphDemo-echartsLineArea=E-线形图
+routes.extend-graphDemo-echartsLineBar=E-折柱混合图
+routes.extend-graphDemo-echartsPie=E-饼状图
+routes.extend-graphDemo-echartsScatter=E-散点图
+routes.extend-graphDemo-echartsTree=E-树形图
+routes.extend-graphDemo-highchartsArea=H-面积图
+routes.extend-graphDemo-highchartsBellcurve=H-贝尔曲线
+routes.extend-graphDemo-highchartsBullet=H-子弹图
+routes.extend-graphDemo-highchartsColumn=H-柱状图
+routes.extend-graphDemo-highchartsFunnel=H-漏斗图
+routes.extend-graphDemo-highchartsGauge=H-仪表图
+routes.extend-graphDemo-highchartsLine=H-线性图
+routes.extend-graphDemo-highchartsPie=H-饼状图
+routes.extend-graphDemo-highchartsScatter=H-散点图
+routes.extend-graphDemo-highchartsWordcloud=H-词云图
+routes.extend-importAndExport=导入导出
+routes.extend-map=地图示例
+routes.extend-order=订单管理
+routes.extend-orderDemo=订单示例
+routes.extend-portalDemo=门户示例
+routes.extend-printData=打印示例
+routes.extend-projectGantt=项目管理
+routes.extend-schedule=日程安排
+routes.extend-signature=电子签名
+routes.extend-signet=电子签章
+routes.extend-tableDemo=表格示例
+routes.extend-tableDemo-commonTable=普通表格
+routes.extend-tableDemo-complexHeader=复杂表头
+routes.extend-tableDemo-extension=延伸扩展
+routes.extend-tableDemo-groupingTable=表格分组
+routes.extend-tableDemo-lockTable=表格锁定
+routes.extend-tableDemo-mergeTable=表格合并
+routes.extend-tableDemo-postilTable=表格批注
+routes.extend-tableDemo-printTable=表格打印
+routes.extend-tableDemo-redactTable=表格编辑
+routes.extend-tableDemo-signTable=表格标记
+routes.extend-tableDemo-statisticsTable=表格统计
+routes.extend-tableDemo-tableTree=表格树形
+routes.extend-tableDemo-treeTable=树形表格
+routes.flowEngine=流程引擎
+routes.formDesign=系统表单
+routes.generator=代码生成
+routes.generator-appForm=移动表单
+routes.generator-flowForm=发起表单
+routes.generator-webForm=功能表单
+routes.lioui=流程示例
+routes.mainSystem=开发平台
+routes.moreMenu=更多...
+routes.msgCenter=消息中心
+routes.msgCenter-accountConfig=账号配置
+routes.msgCenter-accountConfig-ding=钉钉配置
+routes.msgCenter-accountConfig-mail=邮箱配置
+routes.msgCenter-accountConfig-mp=微信公众号配置
+routes.msgCenter-accountConfig-shortMsg=短信配置
+routes.msgCenter-accountConfig-webhook=webhook配置
+routes.msgCenter-accountConfig-weCom=企业微信配置
+routes.msgCenter-msgMonitor=消息监控
+routes.msgCenter-msgTemplate=消息模板
+routes.msgCenter-sendConfig=发送配置
+routes.onlineDev=在线开发
+routes.onlineDev-appDesign=移动设计
+routes.onlineDev-dataReport=报表设计(原)
+routes.onlineDev-dataScreen=大屏设计
+routes.onlineDev-integration=集成助手
+routes.onlineDev-printDev=打印设计
+routes.onlineDev-report=报表设计
+routes.onlineDev-visualPortal=门户设计
+routes.onlineDev-webDesign=表单设计
+routes.permission=组织权限
+routes.permission-auth=权限管理
+routes.permission-authorize=权限组
+routes.permission-department=部门管理
+routes.permission-grade=管理员
+routes.permission-group=分组管理
+routes.permission-organize=组织管理
+routes.permission-position=岗位管理
+routes.permission-role=角色管理
+routes.permission-user=用户管理
+routes.permission-userOnline=在线用户
+routes.printDemo=打印示例
+routes.report=报表示例
+routes.reportBI=大屏示例
+routes.system=系统管理
+routes.system-area=行政区划
+routes.system-billRule=单据模板
+routes.system-cache=系统缓存
+routes.system-icons=系统图标
+routes.system-kit=表单模板
+routes.system-language=翻译管理
+routes.system-log=系统日志
+routes.system-menu=应用菜单
+routes.system-messageTemplate=消息模板
+routes.system-monitor=系统监控
+routes.system-notice=系统公告
+routes.system-signature=签章管理
+routes.system-smsTemplate=短信模板
+routes.system-sysConfig=系统配置
+routes.system-systemTemplate=系统模板
+routes.system-task=系统调度
+routes.systemData=数据应用
+routes.systemData-dataBackup=数据备份
+routes.systemData-dataInterface=数据接口
+routes.systemData-dataModel=数据建模
+routes.systemData-dataSource=数据连接
+routes.systemData-dataSync=数据同步
+routes.systemData-dictionary=数据字典
+routes.systemData-interfaceAuth=接口认证
+routes.systemData-map=数据地图
+routes.weChat=微信配置
+routes.weChat-mpConfig=公众号配置
+routes.weChat-mpMaterial=公众号素材
+routes.weChat-mpMenu=公众号菜单
+routes.weChat-mpMessage=公众号消息
+routes.weChat-mpUser=公众号用户
+routes.weChat-qyDepartment=企业号组织
+routes.weChat-qyhConfig=企业号配置
+routes.weChat-qyMessage=企业号消息
+routes.weChat-qyUser=企业号用户
+routes.workFlow=协同办公
+routes.workFlow-addFlow=发起流程
+routes.workFlow-document=文档中心
+routes.workFlow-entrust=流程委托
+routes.workFlow-flowCirculate=抄送我的
+routes.workFlow-flowDoing=我的在办
+routes.workFlow-flowDone=我的已办
+routes.workFlow-flowEngine=流程设计
+routes.workFlow-flowLaunch=我发起的
+routes.workFlow-flowMonitor=流程监控
+routes.workFlow-flowTodo=我的待办
+routes.workFlow-flowToSign=我的待签
+routes.workFlow-form=表单设计
+routes.workFlow-printTemplate=打印模板
+routes.workFlow-schedule=日程安排
+routes.workSystem=业务平台
+sys.api.apiRequestFailed=请求出错,请稍候重试
+sys.api.apiTimeoutMessage=接口请求超时,请刷新页面重试!
+sys.api.errMsg401=用户没有权限(令牌、用户名、密码错误)!
+sys.api.errMsg403=用户得到授权,但是访问是被禁止的。!
+sys.api.errMsg404=网络请求错误,未找到该资源!
+sys.api.errMsg405=网络请求错误,请求方法未允许!
+sys.api.errMsg408=网络请求超时!
+sys.api.errMsg500=服务器错误,请联系管理员!
+sys.api.errMsg501=网络未实现!
+sys.api.errMsg502=网络错误!
+sys.api.errMsg503=服务不可用,服务器暂时过载或维护!
+sys.api.errMsg504=网络超时!
+sys.api.errMsg505=http版本不支持该请求!
+sys.api.errorMessage=操作失败,系统异常!
+sys.api.errorTip=错误提示
+sys.api.networkException=网络异常
+sys.api.networkExceptionMsg=网络异常,请检查您的网络连接是否正常!
+sys.api.operationFailed=操作失败
+sys.api.timeoutMessage=登录超时,请重新登录!
+sys.app.logoutMessage=是否确认退出系统?
+sys.app.logoutTip=温馨提醒
+sys.app.menuLoading=菜单加载中...
+sys.errorLog.enableMessage=只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效.
+sys.errorLog.fireAjaxError=点击触发ajax错误
+sys.errorLog.fireResourceError=点击触发资源加载错误
+sys.errorLog.fireVueError=点击触发vue错误
+sys.errorLog.modalTitle=错误详情
+sys.errorLog.tableActionDesc=详情
+sys.errorLog.tableColumnDate=时间
+sys.errorLog.tableColumnFile=文件
+sys.errorLog.tableColumnMsg=错误信息
+sys.errorLog.tableColumnStackMsg=stack信息
+sys.errorLog.tableColumnType=类型
+sys.errorLog.tableTitle=错误日志列表
+sys.exception.backHome=返回首页
+sys.exception.backLogin=返回登录
+sys.exception.networkErrorSubTitle=抱歉,您的网络连接已断开,请检查您的网络!
+sys.exception.networkErrorTitle=网络错误
+sys.exception.noDataTitle=当前页无数据
+sys.exception.subTitle403=抱歉,您无权访问此页面。
+sys.exception.subTitle404=抱歉,您访问的页面不存在。
+sys.exception.subTitle500=抱歉,服务器报告错误。
+sys.lock.alert=锁屏密码错误
+sys.lock.backToLogin=返回登录
+sys.lock.entry=进入系统
+sys.lock.placeholder=请输入登录密码
+sys.lock.unlock=点击解锁
+sys.login.accountPlaceholder=请输入账号
+sys.login.accountTip=请输入账号
+sys.login.backSignIn=返回
+sys.login.changeCode=点击切换验证码
+sys.login.codeTip=请输入验证码
+sys.login.codeTitle=手机验证登录
+sys.login.company=请输入公司名
+sys.login.confirmLogin=请在手机端确认登录
+sys.login.confirmPassword=确认密码
+sys.login.contacts=请输入联系人
+sys.login.diffPwd=两次输入密码不一致
+sys.login.email=邮箱
+sys.login.expired=二维码已失效
+sys.login.forgetFormTitle=重置密码
+sys.login.forgetPassword=忘记密码?
+sys.login.getCode=获取验证码
+sys.login.lastLoginInfo=上次登录信息
+sys.login.logIn=登录
+sys.login.loginButton=登录
+sys.login.mobile=请输入手机号
+sys.login.mobilePlaceholder=请输入手机号码
+sys.login.mobileSignInFormTitle=手机验证码登录
+sys.login.otherLogin=其他登录方式
+sys.login.otherSignIn=其他登录方式
+sys.login.password=请输入密码
+sys.login.passwordPlaceholder=请输入密码
+sys.login.passwordTip=请输入密码
+sys.login.policy=我同意xxx隐私政策
+sys.login.policyPlaceholder=勾选后才能注册
+sys.login.qrCodeTip=请使用APP扫描二维码登录,180秒后二维码失效
+sys.login.qrSignInFormTitle=扫码登录
+sys.login.recoverCode=取消登录
+sys.login.refreshCode=点击刷新
+sys.login.registerButton=注册
+sys.login.rememberMe=记住我
+sys.login.reSend=重新发送
+sys.login.rightMobile=请输入正确的手机号
+sys.login.rule=租户子账户规则:租户号{'@'}账户 例:18577778888{'@'}101001
+sys.login.scanSign=扫码后点击"确认",即可完成登录
+sys.login.scanSuccessful=扫码成功
+sys.login.scanTip=扫码登录
+sys.login.scanTitle=扫码登录
+sys.login.signInDesc=输入您的个人详细信息开始使用!
+sys.login.signInFormTitle=账号密码登录
+sys.login.signInTitle=开箱即用的中后台管理系统
+sys.login.signUpFormTitle=注册
+sys.login.smsCode=请输入验证码
+sys.login.smsPlaceholder=请输入验证码
+sys.login.subTitle=通过账号密码登录
+sys.login.subTitle1=通过手机验证码登录,或者切换为
+sys.login.subTitle2=通过账号密码登录,或者切换为
+sys.login.subTitle3=通过扫码登录,或者切换为
+sys.login.title=账户密码登录
+sys.login.upper=大写已锁定
+sys.login.username=请输入账号
+sys.login.version=版本
+sys.login.welcome=欢迎使用
+sys.validate.arrayRequiredPrefix=请至少选择一个
+sys.validate.date=请输入正确的日期
+sys.validate.email=请输入正确的邮箱
+sys.validate.idCard=请输入正确的身份证号码
+sys.validate.mobilePhone=请输入正确的手机号码
+sys.validate.money=请输入正确的金额
+sys.validate.number=请输入正确的数字
+sys.validate.phone=请输入正确的联系方式
+sys.validate.telephone=请输入正确的电话号码
+sys.validate.textRequiredSuffix=不能为空
+sys.validate.url=请输入正确的网址
+views.dynamicModel.hideSome=隐藏部分
+views.dynamicModel.passwordPlaceholder=请输入密码
+views.dynamicModel.scanAndShare=扫描二维码,分享此链接
+views.dynamicModel.showMore=加载更多
+views.http404.goBackBtn=返回首页
+views.http404.subTips=请检查您输入的URL是否正确,或单击按钮返回首页。
+views.http404.tips=抱歉,你访问的页面不存在或无权访问!
diff --git a/yunzhupaas-admin/src/main/resources/i18n/message_zh_TW.properties b/yunzhupaas-admin/src/main/resources/i18n/message_zh_TW.properties
new file mode 100644
index 0000000..f1d75e8
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/i18n/message_zh_TW.properties
@@ -0,0 +1,1236 @@
+AD101=介面無法訪問
+AD102=系統異常
+AD103=操作過於頻繁
+AD104=沒有訪問許可權,請聯繫管理員授權
+AD105=認證失敗,無法訪問系統資源
+AD106=無效內部認證,無法訪問系統資源
+COD001=集合條件過濾獲得目標為空
+COPY001=複製名稱長度超過了限制長度
+DB001=數據類型編碼不符合標準(請注意大小寫)。MySQL , SQLServer , Oracle , DM , KingbaseES , PostgreSQL
+DB002=請檢查 1、連接資訊 2、網路通信 3、資料庫服務啟動狀態。 詳情:{0}
+DB003=通過url找不到對應資料庫
+DB004=查詢結果集為空。
+DB005=未找到對應資料庫類型:{0}({1})
+DB006=未找到對應數據類型轉換
+DB007=導入表名存在重複
+DB008=建表數據與當前運算元據庫不匹配: {0} -> {1}
+DB009=未找到表資訊: {0}
+DB010=資料庫{0},未找到此表:{1}
+DB011=聯合主鍵類缺少“{0}”字段值
+DB012=表示對應獲取數值失敗
+DB013=目前還未支持{0}數據類型:{1}
+DB014=表 "{0}"中字段 "{1}" 為主鍵,不允許數據類型 "{2}"
+DB015=未找到字段SQL語句
+DB016=沒有初始字段
+DB017=sql異常:{0}
+DB018=請在資料庫中添加對應的數據表
+DB019=添加失敗
+DB101=系統自帶表,不允許被刪除
+DB102=系統自帶表,不允許被編輯
+DB201=表已經被使用,不允許被刪除
+DB202=表已經被使用,不允許被編輯
+DB301=資料庫連接成功
+DB302=資料庫連接失敗
+ETD101=操作失敗,原文件不存在
+ETD102=找不到父級
+ETD103=不能移動到自己的文件夾
+ETD104=未能找到此訂單
+ETD105=新建成功10000條數據
+ETD106=獲取失敗
+ETD107=帳戶認證錯誤
+ETD108=你還沒有設置郵件的帳戶
+ETD109=文件導出失敗
+ETD110=文件格式不正確
+ETD111=文件找不到
+ETD112=此記錄被關聯引用,不允許被刪除
+ETD113=防止惡意創建過多數據
+ETD114=保存失敗,請重新登陸
+ETD115=請輸入預覽的url
+ETD116=請選擇正確的預覽方式
+ETD117=數據超過1000條
+EXIST001=名稱不能重複
+EXIST002=編碼不能重複
+EXIST003=範本名已存在
+EXIST004=文件夾名稱不能重複
+EXIST005=範本名稱超過了限制長度
+EXIST101=名稱重複,請重新輸入
+EXIST102=編碼重複,請重新輸入
+EXIST103=不能重複
+FA001=數據不存在
+FA002=更新失敗,數據不存在
+FA003=刪除失敗,數據不存在
+FA004=複製失敗,數據不存在
+FA005=發送失敗,數據不存在
+FA006=下載失敗,數據不存在
+FA007=操作失敗,數據不存在
+FA008=停止失敗,數據不存在
+FA009=終止失敗,數據不存在
+FA010=還原失敗,數據不存在
+FA011=發佈失敗,數據不存在
+FA012=獲取失敗,數據不存在
+FA013=介面修改失敗,數據不存在
+FA014=更新介面狀態失敗,數據不存在
+FA015=預覽失敗,數據不存在
+FA016=刪除失敗,該文件夾存在數據
+FA017=文件格式不正確
+FA018=文件不存在
+FA019=已失效
+FA020=未查到資訊
+FA021=操作失敗!您沒有許可權操作
+FA022=更新失敗!您沒有許可權操作 (角色只有超級管理員才能夠操作)
+FA023=更新失敗!已綁定用戶,無法切換組織
+FA024=刪除失敗!已綁定用戶
+FA025=該組織內許可權為空,組織切換失敗!
+FA026=更新失敗,關聯組織不存在,請重新登錄,或者刷新頁面
+FA027=該系統下菜單為空,系統切換失敗
+FA028=新增數據失敗
+FA029=修改數據失敗
+FA030=更新失敗!已綁定用戶,無法修改狀態
+FA031=該組織無本應用許可權,切換失敗
+FA032=上傳文件不能為空
+FA033=文件上傳失敗!
+FA034=非法請求, 缺少認證資訊
+FA035=未獲取到租戶指定數據源資訊
+FA036=常用數據已存在
+FA037=介面請求失敗
+FA038=文件存儲路徑錯誤
+FA039=鏈接已失效
+FA040=預覽失敗,請檢查文件類型是否規範
+FA041=預覽失敗,請重新上傳文件
+FA042=請輸入正確的文件格式
+FA043=存在同名文件!
+FA044=不存在該文件
+FA045=刪除文件:{0}失敗
+FA046=文件讀取失敗
+FA047=未發現文件
+FA048=微信公眾號原始id不能重複
+FA049=此記錄與“消息發送配置”關聯引用,不允許被禁用
+FA050=此記錄與“消息發送配置”關聯引用,不允許被刪除
+FA051=介面已配置加密, 數據解密失敗.
+FA052=該身份未分配權限
+FA101=保存失敗
+FA102=更新失敗
+FA103=刪除失敗
+FA104=獲取失敗
+FA105=預覽失敗,請先保存在預覽數據
+FA106=預覽失敗,單元格配置出現死迴圈
+FM001=未找到介面
+FM002=表單資訊不存在
+FM003=子表重複
+FM004=已到達該範本複製上限,請複製源範本!
+FM005=該表單已被流程引用,無法刪除!
+FM006=該表單未發佈,無法回滾表單內容
+FM007=該範本內表單內容為空,無法發佈
+FM008=該功能未導入流程表單
+FM009=流程未設計,請先設計流程!
+FM010=該功能流程處於停用狀態!
+FM011=表[{0}]無主鍵!
+FM012=主鍵策略:{0},與表[{1}]主鍵策略不一致!
+FM013=表新增錯誤:{0}
+GT101=成功
+GT102=失敗
+GT103=驗證錯誤
+GT104=異常
+GT105=登錄過期,請重新登錄
+GT106=您的帳號在其他地方已登錄,被強制踢出
+GT107=Token驗證失敗
+GT108=請求超過最大數
+IMP001=導入成功
+IMP002=導入失敗,文件格式錯誤
+IMP003=導入失敗,數據已存在
+IMP004=導入失敗,數據有誤
+IMP005=導出失敗
+IMP006=導入數據格式不正確
+IMP007=重複
+IMP008=名稱
+IMP009=編碼
+IMP010=導入失敗,查詢不到上級分類
+IMP011=請選擇導出字段
+LOG001=帳戶異常
+LOG002=註銷成功
+LOG004=帳號異常,請聯繫管理員修改所屬組織資訊
+LOG005=帳號未被啟動
+LOG006=帳號已被禁用
+LOG007=帳號已被刪除
+LOG010=此IP未在白名單中
+LOG011=登錄失敗,用戶暫未綁定角色
+LOG012=帳號已被鎖定,請聯繫管理員解除鎖定
+LOG101=帳號或密碼錯誤
+LOG102=帳號有誤,請重新輸入
+LOG103=請輸入驗證碼
+LOG104=驗證碼錯誤
+LOG105=連接租戶服務失敗,請稍後再試
+LOG106=短信驗證碼錯誤
+LOG107=驗證碼已失效
+LOG108=請等待{0}分鐘後再進行登錄,或聯繫管理員解除鎖定
+LOG109=租戶登錄失敗,請用手機驗證碼登錄
+LOG110=資料庫異常,請聯繫管理員處理
+LOG111=已開啟單點登錄, 不支持此登錄方式
+LOG112=不支持此登錄方式
+LOG113=未設置租戶資訊
+LOG114=租戶編碼不允許為空
+LOG115=租戶資訊獲取失敗
+LOG116=不支持此驗證
+LOG117=短信驗證碼驗證失敗:{0}
+LOG118=租戶庫名為空
+LOG201=舊密碼錯誤
+LOG202=修改成功,請牢記新密碼
+LOG203=修改失敗,帳號不存在
+LOG204=修改失敗,新建密碼不能與舊密碼一樣
+LOG205=重置密碼成功
+LOG206=重置密碼失敗
+MSERR101=發送失敗,失敗原因:SMTP服務為空
+MSERR102=發送失敗,失敗原因:發件人郵箱為空
+MSERR103=發送失敗,失敗原因:發件人密碼為空
+MSERR104=發送失敗,失敗原因:接收人為空
+MSERR105=發送失敗。失敗原因:{0}的郵箱帳號格式有誤!
+MSERR106=發送失敗。失敗原因:{0}的郵箱帳號為空!
+MSERR107=發送失敗。失敗原因:接收人對應的郵箱全部為空
+MSERR108=發送失敗。失敗原因:{0}
+MSERR109=連接成功
+MSERR110=連接失敗。失敗原因:{0}
+MSERR111=已發送
+MSERR112=內容不能包含<符號
+MSERR113=暫無未讀消息
+MSERR114=自定義範本編碼不能使用系統範本編碼規則
+MSERR115=創建失敗,存在多個標題參數
+MSERR116=創建失敗,不存在標題參數
+MSERR117=更新失敗,存在多個標題參數
+MSERR118=更新失敗,不存在標題參數
+MSERR119=請先前往系統同步設置,配置釘釘帳號
+MSERR120=請先前往系統同步設置,配置企業微信帳號
+MSERR121=配置範本無數據,無法測試
+OA001=用戶登錄
+OA002=設備
+OA003=TOKEN
+OA004=用戶退出
+OA005=用戶踢出
+OA006=用戶頂替
+OA007=登錄異常
+OA008=登錄獲取系統配置失敗
+OA009=該用戶未分配權限
+OA010=僅支持pc端訪問,APP端不支持
+OA011=應用不存在
+OA012=當前應用已被禁用
+OA013=登錄密碼解密失敗
+OA014=注销成功
+OA015=登錄成功
+OA016=登錄票據已失效
+OA017=第三方未綁定帳號
+OA018=不允許訪問此登錄介面
+OA019=帳號不存在
+OA020=帳戶或密碼錯誤,請重新輸入
+OA021=驗證成功
+OA022=限制會話, 不允許訪問系統
+OA023=管理員不能註銷
+OA024=登錄失敗
+OA025=超級管理員
+OA026=普通管理員
+OA027=普通用戶
+OA028=未知來源
+PRI001=列印範本不存在
+PRI002=數字字典不存在printDev的字典分類
+PRI003=第1條SQL語句:查詢出多條表頭資訊
+PRI004=第1條SQL語句:未查出表頭資訊
+PRI005=第{index}條SQL語句:
+PRI006=已到達該範本複製上限,請複製源範本
+PRI007=Sql語法錯誤
+PRI008=該報表已刪除
+PS001=此記錄與"{0}"關聯引用,不允許被刪除
+PS003=組織
+PS004=崗位
+PS005=用戶
+PS006=角色
+PS007=帳號不能為空
+PS008=姓名不能為空
+PS009=用戶額度已達到上限
+PS010=許可權已變更,請重新登錄
+PS011=密碼已變更,請重新登錄
+PS012=類型不能為空
+PS013=當前機構Id不能與父機構Id相同
+PS014=該應用已禁用
+PS015=無法設置當前用戶為分級管理員
+PS016=無法設置超管為分級管理員
+PS017=無法設置當前用戶操作許可權
+PS018=解綁失敗
+PS019=第三方登錄未配置
+PS020=性別不能為空
+PS021=無法禁用管理員用戶
+PS022=管理員只能修改自己,不能修改其他管理員
+PS023=無法修改管理員帳戶
+PS024=直屬主管不能是自己
+PS025=直屬主管不能是我的下屬用戶
+PS026=無法刪除管理員帳戶
+PS027=此用戶為某部門主管,無法刪除
+PS028=此用戶有下屬,無法刪除
+PS029=無法修改管理員帳戶狀態
+PS030=用戶資訊已變更,請重新登錄
+PS031=該應用已刪除
+PS032=該組織無本應用許可權,切換失敗
+PS033=工作交接成功!
+PS034=工作交接無法轉移給管理員
+PS035=工作交接無法轉移給本人
+SC001=操作失敗,任務不存在
+SU000=Success
+SU001=新建成功
+SU002=保存成功
+SU003=刪除成功
+SU004=更新成功
+SU005=操作成功
+SU006=提交成功,請耐心等待
+SU007=複製成功
+SU008=停止成功
+SU009=終止成功
+SU010=還原成功
+SU011=發佈成功
+SU012=發送成功
+SU013=介面修改成功
+SU014=更新介面狀態成功
+SU015=上傳成功
+SU016=設置成功
+SU017=驗證成功
+SU018=添加成功
+SU019=獲取成功
+SU020=回滾成功
+SU021=移除成功
+SU022=查詢成功
+SYS001=區域編碼不能重複
+SYS002=刪除失敗,當前有子節點數據
+SYS003=單據已經被使用,不允許被刪除
+SYS004=清理成功
+SYS005=介面創建成功
+SYS006=當前SQL含有敏感字:{0}
+SYS007=介面請求成功
+SYS008=介面不符合規範
+SYS009=變數名不能包含敏感字元
+SYS010=變數名已存在
+SYS011=資料庫連接不能相同
+SYS012=請檢查,同一資料庫下無法同步數據
+SYS013=同步失敗:{0}
+SYS014=字典類型下麵有字典值禁止刪除
+SYS015=範本不存在
+SYS016=當前目錄存在數據,不能修改類型
+SYS017=刪除失敗,請先刪除子菜單
+SYS018=當前導入菜單為{0}端菜單,請在對應模組下導入!
+SYS019=請在頂級節點下創建目錄後再進行菜單導入
+SYS020=該字段在方案{0}中已被使用
+SYS021=修改失敗,該方案不允許編輯
+SYS022=編碼錯誤
+SYS023=請求發生錯誤!
+SYS024=獲取不到數據!
+SYS025=獲取企業微信access_token失敗
+SYS026=正在進行同步,請稍後再試
+SYS027=請先從企業微信同步部門到本地
+SYS028=請先從釘釘同步部門到本地
+SYS029=驗證碼位數不能大於6
+SYS030=驗證碼位數不能小於3
+SYS031=測試發送消息的連接失敗:{0}
+SYS032=測試發送消息連接成功
+SYS033=測試組織同步的連接失敗:{0}
+SYS034=測試組織同步連接成功
+SYS035=測試連接類型錯誤
+SYS036=測試釘釘連接失敗:
+SYS037=測試連接成功
+SYS038=表資訊抽取異常
+SYS039=刪除失敗,請先刪除該應用下的菜單和門戶
+SYS040=刪除失敗,請先刪除該應用下的菜單
+SYS041=刪除失敗,請先刪除該應用下的門戶
+SYS042=該日程已被刪除
+SYS043=最後一條數據不能刪除
+SYS044=啟用版本不能刪除
+SYS045=歸檔版本不能刪除
+SYS046=數據集不能重名
+SYS047=SQL語句僅支持查詢語句
+SYS048=SQL語句需帶上@formId條件
+SYS049=正在進行同步,請稍等
+SYS050=只能輸入字母、數字、點、橫線和下劃線,且以字母開頭
+SYS051=翻譯標記不能重複
+SYS052=翻譯語言至少填寫一項
+SYS053=獲取釘釘access_token失敗
+SYS101=更新失敗,主系統不允許禁用
+SYS102=主系統不允許刪除
+SYS103=系統在審批常用語中被使用,不允許刪除
+SYS104=更新失敗,主系統不允許修改編碼
+SYS105=常用語已存在
+SYS121=介面暫只支持HTTP和HTTPS方式
+SYS122=介面請求失敗
+SYS123=介面請求失敗, JS調用失敗,錯誤:{0}
+SYS124=驗證請求超時
+SYS125=appSecret錯誤
+SYS126=appId使用期限已到期
+SYS127=appId參數錯誤
+SYS128={0}不能使用系統、開發語言及資料庫關鍵字命名
+SYS129=當前數據源不支持全連接
+SYS130=標題不能為空
+SYS131=結束時間必須晚於開始時間
+SYS132=結束重複必須晚於開始時間
+VS001=同步到流程時,{0}
+VS002=發佈失敗,流程未設計!
+VS003=無表生成有表失敗
+VS004=發佈
+VS005=預覽
+VS006=下載
+VS007=同步成功
+VS008=回滾失敗,暫無線上版本
+VS009=參數解析錯誤!
+VS010=無效鏈接
+VS011=密碼錯誤
+VS012=未找到該功能表單
+VS013=未開啟表單外鏈!
+VS014=下載鏈接已失效
+VS015=字段不能為空
+VS016=路徑錯誤
+VS017=集成助手被禁用
+VS018=表規範名稱不能重複
+VS019=規範名稱不能使用系統關鍵字或JAVA關鍵字
+VS020=字段規範名稱不能重複
+VS021=“{0}”命名不符合規範
+VS022=主鍵策略:[雪花ID],表[ {0} ]主鍵設置不支持!
+VS023=主鍵策略:[自增ID],表[ {0} ]主鍵設置不支持!
+VS024=表單不存在或者未發佈!
+VS025=未獲取到流程發起人
+VS026=規範名稱前兩字母必須小寫
+VS027=自動生成的【{0}】超出長度,提交失敗!
+VS028=視圖最多新建5個
+VS401=該範本內表單內容為空,無法
+VS402=該範本內列表內容為空,無法
+VS403=該功能未配置流程不可用
+VS404=單行輸入不能重複
+VS405=當前表單原數據已被調整,請重新進入該頁面編輯並提交數據
+VS406=該功能配置的流程處於停用
+VS407=表頭名稱不可更改,表頭行不能刪除
+VS408=請至少選擇一個數據表
+VS409=未找到主表資訊
+VS410=請導入對應功能的json文件
+VS411=已存在相同功能
+VS412=該表單已刪除
+VS413=應用不能為空
+VS414=門戶數據資訊存在重複
+VS415=該門戶已刪除
+WF001=審核成功
+WF002=退回成功
+WF003=轉辦成功
+WF004=加簽成功
+WF005=當前流程被退回,無法撤回流程
+WF006=流程已撤回,不能重複操作
+WF007=撤回失敗,轉向數據無法撤回
+WF008=撤回成功
+WF009=功能流程不能終止
+WF010=指派成功
+WF011=批量操作完成
+WF012=該流程不能操作
+WF013=復活成功
+WF014=變更成功
+WF015=掛起成功
+WF016=恢復成功
+WF017=委託人和被委託人相同,委託失敗
+WF018=操作失敗,同一時間內有相同流程的委託
+WF019=操作失敗,同一時間內有相同流程,不能相互委託
+WF020=功能流程不能刪除
+WF021=不能刪除
+WF022=催辦成功
+WF023=未找到催辦人
+WF024=該功能已被流程引用,請重新選擇關聯功能
+WF025=啟用失敗,流程未設計
+WF026=啟用成功
+WF027=禁用成功
+WF028=該版本內有工單任務流轉,無法刪除
+WF029=您沒有發起該流程的許可權
+WF030=表單未找到
+WF031=已審核完成
+WF032=凍結不能操作
+WF033=轉向節點不存在或配置錯誤
+WF034=轉向失敗,轉向節點未審批
+WF035=退回至您的審批,不能再發起退回
+WF036=流程已處理,無法撤回
+WF037=當前流程包含子流程,無法撤回
+WF038=子流程無法撤回
+WF039=下一節點為選擇分支無法批量審批
+WF040=條件流程包含候選人無法批量通過
+WF041=該流程工單已終止
+WF042=該流程工單已撤回
+WF043=該節點沒有數據,無法復活
+WF044=此流程不支持變更
+WF045=當前節點有子流程無法變更
+WF046=退回節點包含子流程,退回失敗
+WF047=當前節點未審批,不能退回
+WF048=流程處於掛起狀態,不可操作
+WF049=當前流程正在運行不能刪除
+WF050=已被掛起不能刪除
+WF051=沒有刪除許可權
+WF052=主版本沒有內容
+WF053=流程沒有啟用
+WF054=流程編碼不能重複
+WF055=流程表單不一致,請重新選擇
+WF056=該流程由線上開發生成的,無法直接刪除,請在功能設計中刪除相關功能
+WF057=該流程內工單任務流轉未結束,無法刪除
+WF058=當前流程正在運行不能重複提交
+WF059=流程自動發起審批失敗
+WF060=駁回節點不能是子流程
+WF061=下一節點無審批人員請聯繫管理員
+WF062=表單已被引用,請重新選擇
+WF063=流程已發起,無法刪除
+WF064=任務不存在,或者已處理
+WF065=拒絕成功
+WF066=同意成功
+WF067=協辦成功
+WF068=協辦保存成功
+WF069=減簽成功
+WF070=撤銷成功
+WF071=最後一條數據不能刪除
+WF072=啟用版本不能刪除
+WF073=歸檔版本不能刪除
+WF074=暫停成功
+WF075=條件不滿足無法流轉
+WF076=節點不存在
+WF077=流程無法撤回
+WF078=流程未同意,無法撤銷
+WF079=歸檔異常
+WF080=選擇的數據不能退簽
+WF081=無法加簽
+WF082=無法減簽
+WF083=無法退回
+WF084=無法轉審
+WF085=無法協辦
+WF086=無法批量審批
+WF087=經辦未簽收
+WF088=經辦未開始辦理
+WF089=流程發佈失敗
+WF090=流程發佈失敗
+WF091=流程提交失敗
+WF092=獲取引擎當前任務失敗
+WF093=流程刪除失敗
+WF094=獲取出線集合失敗
+WF095=獲取線之後的任務節點失敗
+WF096=獲取下一級任務節點集合失敗
+WF097=獲取上一級任務節點集合失敗
+WF098=任務完成失敗
+WF099=獲取流程實例失敗
+WF100=獲取未經過的節點失敗
+WF101=獲取節點的後續節點失敗
+WF102=獲取可回退的節點失敗
+WF103=退回失敗
+WF104=節點跳轉失敗
+WF105=補償失敗
+WF106=不能加簽給自己
+WF107=不能轉審給自己
+WF108=不能協辦給自己
+WF109=必須保留一名加簽人員
+WF110=審批異常無法撤銷
+WF111=所選流程包含條件候選人
+WF112=選擇的數據對應流程已暫停
+WF113=已被暫停不能刪除
+WF114=流程處於暫停狀態,不可操作
+WF115=流程已受理,無法刪除
+WF116=不能加簽給委託人
+WF117=不能轉審給委託人
+WF118=不能協辦給委託人
+WF119=設置了流轉條件,無法批量審批
+WF120=下一節點審批異常,無法批量審批
+WF121=子流程自動發起審批失敗
+WF122=流程不存在
+WF123=流程處於終止狀態,不可操作
+WF124=該流程已發起數據,無法刪除!
+WF125=您沒有發起委託流程
+WF126=撤銷流程不能轉審
+WF127=撤銷流程不能退回
+WF128=該用戶已審批,請重新打開介面
+WF129=委託人已無該流程許可權
+WF130=管理員不能新建委託/代理
+WF131=不能選擇admin
+WF132=已有人接受,不可編輯
+WF133=流轉條件不滿足,無法自動發起審批
+WF134=第一個審批節點設定候選人,無法自動發起審批
+WF135=第一個審批節點异常,無法自動發起審批
+WF136=找不到發起人,發起失敗
+WF137=代理人和被代理人相同,代理失敗
+WF138=存在未簽收的數據,無法關閉
+WF139=該流程已觸發了任務,無法删除
+WF144=操作失敗,同一時間內有相同流程的代理
+WF145=操作失敗,同一時間內有相同流程,不能相互代理
+app.apply.expandData=展開數據
+app.apply.location.location=添加定位
+app.apply.location.modalTitle=選擇位置
+app.apply.location.relocation=重新定位
+app.apply.noMoreData=沒有更多數據
+app.apply.pleaseKeyword=請輸入關鍵詞搜索
+app.apply.screen=篩選
+app.apply.sort=排序
+app.my.accountSecurity=帳號安全
+app.my.agencyMe=代理給我
+app.my.allFlow=全部流程
+app.my.entrustedAgency=委託代理
+app.my.entrustMe=委託給我
+app.my.flowSelect=流程選擇
+app.my.logOut=登出
+app.my.myAgency=我的代理
+app.my.myEntrust=我的委託
+app.my.organization=我的組織
+app.my.position=我的崗位
+app.my.scanCode=掃一掃
+app.my.setting=設定
+app.my.settings.About=關於平臺
+app.my.settings.changePassword=修改密碼
+app.my.settings.contact=聯繫我們
+app.my.settings.language=多語言
+app.my.settings.privacyPolicy=隱私政策
+app.my.settings.userAgreement=使用者協定
+app.my.sto=終止
+app.my.subordinates=我的下屬
+app.my.switchIdentity=切換身份
+common.add1Text=添加
+common.add2Text=新增
+common.addText=新建
+common.back=返回
+common.batchDelText=批量刪除
+common.batchDelTip=您確定要删除這些數據嗎,是否繼續?
+common.batchPrintText=批量打印
+common.cancelText=取消
+common.chooseText=請選擇
+common.chooseTextPrefix=請選擇
+common.cleanText=清空
+common.closeList=關閉列表
+common.closeText=關閉
+common.collapseAll=折疊
+common.continueAndAddText=確定並新增
+common.continueText=確定並繼續
+common.copyText=復製
+common.dark=黑暗主題
+common.delText=刪除
+common.delTip=此操作將永久刪除該數據, 是否繼續?
+common.detailText=詳情
+common.drawerSearchText=請輸入關鍵詞
+common.editText=編輯
+common.enterKeyword=請輸入關鍵詞
+common.expandAll=展開
+common.exportText=導出
+common.importText=導入
+common.inputPlaceholder=請輸入
+common.inputText=請輸入
+common.inputTextPrefix=請輸入
+common.keyword=關鍵詞
+common.leftTreeSearchText=請輸入關鍵詞
+common.light=亮色主題
+common.loadingText=加載中...
+common.moreText=更多
+common.next=下一步
+common.nextRecord=下一條
+common.noData=暫無數據
+common.okText=確定
+common.prev=上一步
+common.previewText=預覽
+common.prevRecord=上一條
+common.printText=打印
+common.queryText=查詢
+common.redo=刷新
+common.redoText=重做
+common.resetText=重置
+common.saveText=保存
+common.searchText=搜索
+common.selectDataTip=請選擇一條數據
+common.selectI18nCode=選擇翻譯標記
+common.selectPlaceholder=請選擇
+common.submitText=提交
+common.superQuery=高級查詢
+common.syncText=第三方同步
+common.tipTitle=提示
+common.undoText=撤銷
+component.app.searchNotData=暫無搜索結果
+component.app.toNavigate=切換
+component.app.toSearch=確認
+component.countdown.normalText=獲取驗證碼
+component.countdown.sendText={0}秒後重新獲取
+component.cropper.btn_reset=重置
+component.cropper.btn_rotate_left=逆時針旋轉
+component.cropper.btn_rotate_right=順時針旋轉
+component.cropper.btn_scale_x=水平翻轉
+component.cropper.btn_scale_y=垂直翻轉
+component.cropper.btn_zoom_in=放大
+component.cropper.btn_zoom_out=縮小
+component.cropper.modalTitle=頭像上傳
+component.cropper.okText=確認並上傳
+component.cropper.preview=預覽
+component.cropper.selectImage=選擇圖片
+component.cropper.uploadSuccess=上傳成功
+component.drawer.cancelText=關閉
+component.drawer.loadingText=加載中...
+component.drawer.okText=確認
+component.excel.exportModalTitle=導出數據
+component.excel.fileName=文件名
+component.excel.fileType=文件類型
+component.form.apiSelectNotFound=請等待數據加載完成...
+component.form.fold=收起
+component.form.maxTip=字符數應小於{0}位
+component.form.unfold=展開
+component.icon.copy=復製圖標成功!
+component.icon.placeholder=點擊選擇圖標
+component.icon.search=搜索圖標
+component.com.yunzhupaas.areaSelect.modalTitle=省市區
+component.com.yunzhupaas.calculate.storage=用於展示計算結果,且數據同時會保存入庫
+component.com.yunzhupaas.calculate.unStorage=用於展示計算結果,且數據不會保存
+component.com.yunzhupaas.common.allData=全部數據
+component.com.yunzhupaas.common.autoGenerate=系統自動生成
+component.com.yunzhupaas.common.clearAll=清空列表
+component.com.yunzhupaas.common.selected=已選
+component.com.yunzhupaas.dateRange.endPlaceholder=結束日期
+component.com.yunzhupaas.dateRange.startPlaceholder=開始日期
+component.com.yunzhupaas.depSelect.modalTitle=選擇部門
+component.com.yunzhupaas.groupSelect.modalTitle=選擇分組
+component.com.yunzhupaas.iconPicker.modalTitle=圖標選擇
+component.com.yunzhupaas.iconPicker.searchPlaceholder=請輸入關鍵詞
+component.com.yunzhupaas.iconPicker.select=選擇
+component.com.yunzhupaas.iconPicker.ymCustom=ymCustom圖標
+component.com.yunzhupaas.iconPicker.ymIcon=ymIcon圖標
+component.com.yunzhupaas.location.location=添加定位
+component.com.yunzhupaas.location.modalTitle=選擇位置
+component.com.yunzhupaas.location.relocation=重新定位
+component.com.yunzhupaas.location.searchPlaceholder=搜索或直接在地圖上點選
+component.com.yunzhupaas.numberRange.max=最大值
+component.com.yunzhupaas.numberRange.min=最小值
+component.com.yunzhupaas.organizeSelect.modalTitle=選擇組織
+component.com.yunzhupaas.popupAttr.storage=用於展示關聯彈窗的屬性,且數據同時會保存入庫
+component.com.yunzhupaas.popupAttr.unStorage=用於展示關聯彈窗的屬性,且數據不會保存
+component.com.yunzhupaas.popupSelect.modalTitle=選擇數據
+component.com.yunzhupaas.posSelect.modalTitle=選擇崗位
+component.com.yunzhupaas.relationFormAttr.storage=用於展示關聯表單的屬性,且數據同時會保存入庫
+component.com.yunzhupaas.relationFormAttr.unStorage=用於展示關聯表單的屬性,且數據不會保存
+component.com.yunzhupaas.roleSelect.modalTitle=選擇角色
+component.com.yunzhupaas.sign.operateTip=請在此區域使用鼠標手寫簽名
+component.com.yunzhupaas.sign.signPlaceholder=請簽名
+component.com.yunzhupaas.sign.signTip=手寫簽名
+component.com.yunzhupaas.timeRange.endPlaceholder=結束時間
+component.com.yunzhupaas.timeRange.startPlaceholder=開始時間
+component.com.yunzhupaas.userSelect.modalTitle=選擇用戶
+component.menu.search=菜單搜索
+component.modal.cancelText=關閉
+component.modal.close=關閉
+component.modal.maximize=最大化
+component.modal.okText=確認
+component.modal.restore=還原
+component.table.action=操作
+component.table.index=序號
+component.table.settingColumn=列設置
+component.table.settingColumnShow=列展示
+component.table.settingDens=密度
+component.table.settingDensDefault=默認
+component.table.settingDensMiddle=中等
+component.table.settingDensSmall=緊湊
+component.table.settingFixedLeft=固定到左側
+component.table.settingFixedRight=固定到右側
+component.table.settingFullScreen=全屏
+component.table.settingIndexColumnShow=序號列
+component.table.settingSelectColumnShow=勾選列
+component.table.status=狀態
+component.table.summary=合計
+component.table.total=共 {total} 條數據
+component.time.after=後
+component.time.before=前
+component.time.days=天
+component.time.hours=小時
+component.time.just=剛剛
+component.time.minutes=分鐘
+component.time.seconds=秒
+component.tree.checkStrictly=層級關聯
+component.tree.checkUnStrictly=層級獨立
+component.tree.expandAll=展開全部
+component.tree.reload=刷新數據
+component.tree.selectAll=選擇全部
+component.tree.unExpandAll=折疊全部
+component.tree.unSelectAll=取消選擇
+component.upload.accept=支持{0}格式
+component.upload.acceptUpload=只能上傳{0}格式文件
+component.upload.audio=音頻
+component.upload.buttonText=點擊上傳
+component.upload.checking=文件校驗中
+component.upload.choose=選擇文件
+component.upload.del=刪除
+component.upload.download=下載
+component.upload.downloadAll=全部下載
+component.upload.fileMaxNumber=最多可以上傳{0}個文件
+component.upload.fileMaxSize=文件大小超過{size}{unit}
+component.upload.fileName=文件名
+component.upload.fileReadError=文件{0}讀取出錯,請檢查該文件
+component.upload.fileSize=文件大小
+component.upload.fileStatue=狀態
+component.upload.fileTypeCheck=請選擇{0}類型的文件
+component.upload.image=圖片
+component.upload.imageMaxNumber=最多可以上傳{0}張圖片
+component.upload.imageMaxSize=圖片大小超過{size}{unit}
+component.upload.imgUpload=圖片上傳
+component.upload.legend=略縮圖
+component.upload.maxNumber=最多只能上傳{0}個文件
+component.upload.maxSize=單個文件不超過{0}MB
+component.upload.maxSizeMultiple=只能上傳不超過{0}MB的文件!
+component.upload.operating=操作
+component.upload.paused=暫停中
+component.upload.preview=預覽
+component.upload.reUploadFailed=重新上傳失敗文件
+component.upload.save=保存
+component.upload.saveError=沒有上傳成功的文件,無法保存!
+component.upload.saveWarn=請等待文件上傳後,保存!
+component.upload.startUpload=開始上傳
+component.upload.upload=上傳
+component.upload.uploaded=已上傳
+component.upload.uploadError=上傳失敗
+component.upload.uploadImg=請上傳圖片
+component.upload.uploading=上傳中
+component.upload.uploadSuccess=上傳成功
+component.upload.uploadWait=請等待文件上傳結束後操作
+component.upload.video=視頻
+component.upload.videoNoPreview=音視頻文件不能預覽
+component.upload.view=查看
+component.upload.viewImage=查看圖片
+component.upload.waiting=等待中
+component.upload.zipNoPreview=壓縮包不能預覽
+component.verify.dragText=請按住滑塊拖動
+component.verify.error=驗證失敗!
+component.verify.redoTip=點擊圖片可刷新
+component.verify.successText=驗證通過
+component.verify.time=驗證校驗成功,耗時{time}秒!
+formGenerator.cleanComponentTip=確定要清空所有組件嗎?
+formGenerator.component.alert=提示
+formGenerator.component.areaSelect=省市區域
+formGenerator.component.autoComplete=下拉補全
+formGenerator.component.barcode=條形碼
+formGenerator.component.billRule=單據組件
+formGenerator.component.button=按鈕
+formGenerator.component.calculate=計算公式
+formGenerator.component.card=卡片容器
+formGenerator.component.cascader=級聯選擇
+formGenerator.component.checkbox=多選框組
+formGenerator.component.collapse=折疊面板
+formGenerator.component.colorPicker=顏色選擇
+formGenerator.component.createTime=創建時間
+formGenerator.component.createUser=創建人員
+formGenerator.component.currOrganize=所屬組織
+formGenerator.component.currPosition=所屬崗位
+formGenerator.component.datePicker=日期選擇
+formGenerator.component.depSelect=部門選擇
+formGenerator.component.divider=分割線
+formGenerator.component.editor=富文本
+formGenerator.component.groupSelect=分組選擇
+formGenerator.component.groupTitle=分組標題
+formGenerator.component.iframe=Iframe
+formGenerator.component.input=單行輸入
+formGenerator.component.inputNumber=數字輸入
+formGenerator.component.link=鏈接
+formGenerator.component.location=定位
+formGenerator.component.modifyTime=修改時間
+formGenerator.component.modifyUser=修改人員
+formGenerator.component.organizeSelect=組織選擇
+formGenerator.component.popupAttr=彈窗選擇屬性
+formGenerator.component.popupSelect=彈窗選擇
+formGenerator.component.popupTableSelect=下拉表格
+formGenerator.component.posSelect=崗位選擇
+formGenerator.component.qrcode=二維碼
+formGenerator.component.radio=單選框組
+formGenerator.component.rate=評分
+formGenerator.component.relationForm=關聯表單
+formGenerator.component.relationFormAttr=關聯表單屬性
+formGenerator.component.roleSelect=角色選擇
+formGenerator.component.row=柵格容器
+formGenerator.component.select=下拉選擇
+formGenerator.component.sign=手寫簽名
+formGenerator.component.slider=滑塊
+formGenerator.component.switch=開關
+formGenerator.component.tab=標簽面板
+formGenerator.component.table=設計子表
+formGenerator.component.tableGrid=表格容器
+formGenerator.component.text=文本
+formGenerator.component.textarea=多行輸入
+formGenerator.component.timePicker=時間選擇
+formGenerator.component.treeSelect=下拉樹形
+formGenerator.component.uploadFile=文件上傳
+formGenerator.component.uploadImg=圖片上傳
+formGenerator.component.userSelect=用戶選擇
+formGenerator.component.usersSelect=用戶組件
+formGenerator.copyComponentTip=確定復製該組件?
+formGenerator.delComponentTip=確定刪除該組件?
+layout.footer.onlineDocument=在線文檔
+layout.footer.onlinePreview=在線預覽
+layout.header.about=關於平臺
+layout.header.commonMenus=常用菜單
+layout.header.dropdownItemDoc=文檔
+layout.header.dropdownItemLoginOut=退出系統
+layout.header.feedback=反饋問題
+layout.header.home=首頁
+layout.header.lockScreen=鎖定屏幕
+layout.header.lockScreenBtn=鎖定
+layout.header.lockScreenPassword=鎖屏密碼
+layout.header.profile=個人信息
+layout.header.setting=設置
+layout.header.standingChange=切換身份
+layout.header.statement=官方聲明
+layout.header.systemChange=應用切換
+layout.header.tooltipChat=聊天
+layout.header.tooltipEntryFull=全屏
+layout.header.tooltipErrorLog=錯誤日誌
+layout.header.tooltipExitFull=退出全屏
+layout.header.tooltipLock=鎖定屏幕
+layout.header.tooltipNotify=消息
+layout.multipleTab.close=關閉標簽頁
+layout.multipleTab.closeAll=關閉全部標簽頁
+layout.multipleTab.closeLeft=關閉左側標簽頁
+layout.multipleTab.closeOther=關閉其它標簽頁
+layout.multipleTab.closeRight=關閉右側標簽頁
+layout.multipleTab.reload=重新加載
+layout.multipleTab.setCommon=設為常用菜單
+layout.setting.animation=動畫
+layout.setting.animationType=動畫類型
+layout.setting.autoScreenLock=自動鎖屏
+layout.setting.blueBg=蔚藍星辰
+layout.setting.breadcrumb=面包屑
+layout.setting.breadcrumbIcon=面包屑圖標
+layout.setting.cachePage=緩存頁面
+layout.setting.clearBtn=清空緩存並返回登錄頁
+layout.setting.closeMixSidebarOnChange=切換頁面關閉菜單
+layout.setting.collapseMenuDisplayName=折疊菜單顯示名稱
+layout.setting.colorWeak=色弱模式
+layout.setting.contentMode=內容區域寬度
+layout.setting.contentModeFixed=定寬
+layout.setting.contentModeFull=流式
+layout.setting.copyBtn=拷貝
+layout.setting.darkMode=主題
+layout.setting.defaultBg=經典主題
+layout.setting.drawerTitle=配置
+layout.setting.expandedMenuWidth=菜單展開寬度
+layout.setting.fixedHeader=固定header
+layout.setting.fixedSideBar=固定Sidebar
+layout.setting.footer=頁腳
+layout.setting.fullContent=全屏內容
+layout.setting.grayMode=灰色模式
+layout.setting.greenBg=碧綠翠風
+layout.setting.header=頂欄
+layout.setting.headerTheme=頂欄主題
+layout.setting.interfaceDisplay=界面顯示
+layout.setting.interfaceFunction=界面功能
+layout.setting.menuAccordion=側邊菜單手風琴模式
+layout.setting.menuCollapse=折疊菜單
+layout.setting.menuCollapseButton=菜單折疊按鈕
+layout.setting.menuDrag=側邊菜單拖拽
+layout.setting.menuSearch=菜單搜索
+layout.setting.menuTriggerBottom=底部
+layout.setting.menuTriggerNone=不顯示
+layout.setting.menuTriggerTop=頂部
+layout.setting.menuTypeMix=頂部混合模式
+layout.setting.menuTypeMixSidebar=左側混合模式
+layout.setting.menuTypeSidebar=左側菜單模式
+layout.setting.menuTypeTopMenu=頂部菜單模式
+layout.setting.minute=分鐘
+layout.setting.mixSidebarFixed=固定展開菜單
+layout.setting.mixSidebarTrigger=混合菜單觸發方式
+layout.setting.navMode=導航欄模式
+layout.setting.notAutoScreenLock=不自動鎖屏
+layout.setting.off=關
+layout.setting.on=開
+layout.setting.operatingContent=復製成功,請到 src/settings/projectSetting.ts 中修改配置!
+layout.setting.operatingTitle=操作成功
+layout.setting.progress=頂部進度條
+layout.setting.purpleBg=紫藤蘿蘭
+layout.setting.resetSuccess=重置成功!
+layout.setting.sidebar=左側菜單
+layout.setting.sidebarTheme=菜單主題
+layout.setting.splitMenu=分割菜單
+layout.setting.switchAnimation=切換動畫
+layout.setting.switchLoading=切換loading
+layout.setting.systemBackground=系統背景
+layout.setting.sysTheme=系統主題
+layout.setting.tabDetail=標簽詳情頁
+layout.setting.tabs=標簽頁
+layout.setting.tabsFoldBtn=標簽頁折疊按鈕
+layout.setting.tabsIcon=標簽圖標
+layout.setting.tabsQuickBtn=標簽頁快捷按鈕
+layout.setting.tabsRedoBtn=標簽頁刷新按鈕
+layout.setting.toggleLocale=語言切換
+layout.setting.topMenuAlignCenter=居右
+layout.setting.topMenuAlignLeft=居左
+layout.setting.topMenuAlignRight=居中
+layout.setting.topMenuLayout=頂部菜單布局
+layout.setting.triggerClick=點擊
+layout.setting.triggerHover=懸停
+routes.basic.emailDetail=查看郵件
+routes.basic.errorLogList=錯誤日誌列表
+routes.basic.externalLink=鏈接
+routes.basic.home=首頁
+routes.basic.login=登錄
+routes.basic.previewModel=功能預覽
+routes.basic.workFlowDetail=流程詳情
+routes.commonWords=審批常用語
+routes.dataReport=報表示例(原)
+routes.extend=開發示例
+routes.extend-barCode=條碼示例
+routes.extend-bigData=百萬數據
+routes.extend-documentPreview=文檔示例
+routes.extend-email=郵件收發
+routes.extend-formDemo=表單示例
+routes.extend-formDemo-fieldForm1=表單字段1
+routes.extend-formDemo-fieldForm2=表單字段2
+routes.extend-formDemo-fieldForm3=表單字段3
+routes.extend-formDemo-fieldForm4=表單字段4
+routes.extend-formDemo-fieldForm5=表單字段5
+routes.extend-formDemo-fieldForm6=表單字段6
+routes.extend-formDemo-verifyForm=表單驗證
+routes.extend-formDemo-verifyForm1=表單驗證1
+routes.extend-functionDemo=功能示例
+routes.extend-graphDemo=圖表示例
+routes.extend-graphDemo-echartsBar=E-柱狀圖
+routes.extend-graphDemo-echartsBarAcross=E-橫狀條形圖
+routes.extend-graphDemo-echartsCandlestick=E-K線圖
+routes.extend-graphDemo-echartsFunnel=E-漏鬥圖
+routes.extend-graphDemo-echartsGauge=E-儀表圖
+routes.extend-graphDemo-echartsLineArea=E-線形圖
+routes.extend-graphDemo-echartsLineBar=E-折柱混合圖
+routes.extend-graphDemo-echartsPie=E-餅狀圖
+routes.extend-graphDemo-echartsScatter=E-散點圖
+routes.extend-graphDemo-echartsTree=E-樹形圖
+routes.extend-graphDemo-highchartsArea=H-面積圖
+routes.extend-graphDemo-highchartsBellcurve=H-貝爾曲線
+routes.extend-graphDemo-highchartsBullet=H-子彈圖
+routes.extend-graphDemo-highchartsColumn=H-柱狀圖
+routes.extend-graphDemo-highchartsFunnel=H-漏鬥圖
+routes.extend-graphDemo-highchartsGauge=H-儀表圖
+routes.extend-graphDemo-highchartsLine=H-線性圖
+routes.extend-graphDemo-highchartsPie=H-餅狀圖
+routes.extend-graphDemo-highchartsScatter=H-散點圖
+routes.extend-graphDemo-highchartsWordcloud=H-詞雲圖
+routes.extend-importAndExport=導入導出
+routes.extend-map=地圖示例
+routes.extend-order=訂單管理
+routes.extend-orderDemo=訂單示例
+routes.extend-portalDemo=門戶示例
+routes.extend-printData=打印示例
+routes.extend-projectGantt=項目管理
+routes.extend-schedule=日程安排
+routes.extend-signature=電子簽名
+routes.extend-signet=電子簽章
+routes.extend-tableDemo=表格示例
+routes.extend-tableDemo-commonTable=普通表格
+routes.extend-tableDemo-complexHeader=復雜表頭
+routes.extend-tableDemo-extension=延伸擴展
+routes.extend-tableDemo-groupingTable=表格分組
+routes.extend-tableDemo-lockTable=表格鎖定
+routes.extend-tableDemo-mergeTable=表格合並
+routes.extend-tableDemo-postilTable=表格批註
+routes.extend-tableDemo-printTable=表格打印
+routes.extend-tableDemo-redactTable=表格編輯
+routes.extend-tableDemo-signTable=表格標記
+routes.extend-tableDemo-statisticsTable=表格統計
+routes.extend-tableDemo-tableTree=表格樹形
+routes.extend-tableDemo-treeTable=樹形表格
+routes.flowEngine=流程引擎
+routes.formDesign=系統表單
+routes.generator=代碼生成
+routes.generator-appForm=移動表單
+routes.generator-flowForm=發起表單
+routes.generator-webForm=功能表單
+routes.lioui=流程示例
+routes.mainSystem=開發平臺
+routes.moreMenu=更多...
+routes.msgCenter=消息中心
+routes.msgCenter-accountConfig=賬號配置
+routes.msgCenter-accountConfig-ding=釘釘配置
+routes.msgCenter-accountConfig-mail=郵箱配置
+routes.msgCenter-accountConfig-mp=微信公眾號配置
+routes.msgCenter-accountConfig-shortMsg=短信配置
+routes.msgCenter-accountConfig-webhook=webhook配置
+routes.msgCenter-accountConfig-weCom=企業微信配置
+routes.msgCenter-msgMonitor=消息監控
+routes.msgCenter-msgTemplate=消息模板
+routes.msgCenter-sendConfig=發送配置
+routes.onlineDev=在線開發
+routes.onlineDev-appDesign=移動設計
+routes.onlineDev-dataReport=報表設計(原)
+routes.onlineDev-dataScreen=大屏設計
+routes.onlineDev-integration=集成助手
+routes.onlineDev-printDev=打印設計
+routes.onlineDev-report=報表設計
+routes.onlineDev-visualPortal=門戶設計
+routes.onlineDev-webDesign=表單設計
+routes.permission=組織權限
+routes.permission-auth=權限管理
+routes.permission-authorize=權限組
+routes.permission-department=部門管理
+routes.permission-grade=管理員
+routes.permission-group=分組管理
+routes.permission-organize=組織管理
+routes.permission-position=崗位管理
+routes.permission-role=角色管理
+routes.permission-user=用戶管理
+routes.permission-userOnline=在線用戶
+routes.printDemo=打印示例
+routes.report=報表示例
+routes.reportBI=大屏示例
+routes.system=系統管理
+routes.system-area=行政區劃
+routes.system-billRule=單據模板
+routes.system-cache=系統緩存
+routes.system-icons=系統圖標
+routes.system-kit=表單範本
+routes.system-language=翻譯管理
+routes.system-log=系統日誌
+routes.system-menu=應用菜單
+routes.system-messageTemplate=消息模板
+routes.system-monitor=系統監控
+routes.system-notice=系統公告
+routes.system-signature=簽章管理
+routes.system-smsTemplate=短信模板
+routes.system-sysConfig=系統配置
+routes.system-systemTemplate=系統模板
+routes.system-task=系統調度
+routes.systemData=數據應用
+routes.systemData-dataBackup=數據備份
+routes.systemData-dataInterface=數據接口
+routes.systemData-dataModel=數據建模
+routes.systemData-dataSource=數據連接
+routes.systemData-dataSync=數據同步
+routes.systemData-dictionary=數據字典
+routes.systemData-interfaceAuth=接口認證
+routes.systemData-map=數據地圖
+routes.weChat=微信配置
+routes.weChat-mpConfig=公眾號配置
+routes.weChat-mpMaterial=公眾號素材
+routes.weChat-mpMenu=公眾號菜單
+routes.weChat-mpMessage=公眾號消息
+routes.weChat-mpUser=公眾號用戶
+routes.weChat-qyDepartment=企業號組織
+routes.weChat-qyhConfig=企業號配置
+routes.weChat-qyMessage=企業號消息
+routes.weChat-qyUser=企業號用戶
+routes.workFlow=協同辦公
+routes.workFlow-addFlow=發起流程
+routes.workFlow-document=文檔中心
+routes.workFlow-entrust=流程委托
+routes.workFlow-flowCirculate=抄送我的
+routes.workFlow-flowDoing=我的在辦
+routes.workFlow-flowDone=我的已辦
+routes.workFlow-flowEngine=流程設計
+routes.workFlow-flowLaunch=我發起的
+routes.workFlow-flowMonitor=流程監控
+routes.workFlow-flowTodo=我的待辦
+routes.workFlow-flowToSign=我的待簽
+routes.workFlow-form=表單設計
+routes.workFlow-printTemplate=打印模板
+routes.workFlow-schedule=日程安排
+routes.workSystem=業務平臺
+sys.api.apiRequestFailed=請求出錯,請稍候重試
+sys.api.apiTimeoutMessage=接口請求超時,請刷新頁面重試!
+sys.api.errMsg401=用戶沒有權限(令牌、用戶名、密碼錯誤)!
+sys.api.errMsg403=用戶得到授權,但是訪問是被禁止的。!
+sys.api.errMsg404=網絡請求錯誤,未找到該資源!
+sys.api.errMsg405=網絡請求錯誤,請求方法未允許!
+sys.api.errMsg408=網絡請求超時!
+sys.api.errMsg500=服務器錯誤,請聯系管理員!
+sys.api.errMsg501=網絡未實現!
+sys.api.errMsg502=網絡錯誤!
+sys.api.errMsg503=服務不可用,服務器暫時過載或維護!
+sys.api.errMsg504=網絡超時!
+sys.api.errMsg505=http版本不支持該請求!
+sys.api.errorMessage=操作失敗,系統異常!
+sys.api.errorTip=錯誤提示
+sys.api.networkException=網絡異常
+sys.api.networkExceptionMsg=網絡異常,請檢查您的網絡連接是否正常!
+sys.api.operationFailed=操作失敗
+sys.api.timeoutMessage=登錄超時,請重新登錄!
+sys.app.logoutMessage=是否確認退出系統?
+sys.app.logoutTip=溫馨提醒
+sys.app.menuLoading=菜單加載中...
+sys.errorLog.enableMessage=只在`/src/settings/projectSetting.ts` 內的useErrorHandle=true時生效.
+sys.errorLog.fireAjaxError=點擊觸發ajax錯誤
+sys.errorLog.fireResourceError=點擊觸發資源加載錯誤
+sys.errorLog.fireVueError=點擊觸發vue錯誤
+sys.errorLog.modalTitle=錯誤詳情
+sys.errorLog.tableActionDesc=詳情
+sys.errorLog.tableColumnDate=時間
+sys.errorLog.tableColumnFile=文件
+sys.errorLog.tableColumnMsg=錯誤信息
+sys.errorLog.tableColumnStackMsg=stack信息
+sys.errorLog.tableColumnType=類型
+sys.errorLog.tableTitle=錯誤日誌列表
+sys.exception.backHome=返回首頁
+sys.exception.backLogin=返回登錄
+sys.exception.networkErrorSubTitle=抱歉,您的網絡連接已斷開,請檢查您的網絡!
+sys.exception.networkErrorTitle=網絡錯誤
+sys.exception.noDataTitle=當前頁無數據
+sys.exception.subTitle403=抱歉,您無權訪問此頁面。
+sys.exception.subTitle404=抱歉,您訪問的頁面不存在。
+sys.exception.subTitle500=抱歉,服務器報告錯誤。
+sys.lock.alert=鎖屏密碼錯誤
+sys.lock.backToLogin=返回登錄
+sys.lock.entry=進入系統
+sys.lock.placeholder=請輸入登錄密碼
+sys.lock.unlock=點擊解鎖
+sys.login.accountPlaceholder=請輸入賬號
+sys.login.accountTip=請輸入賬號
+sys.login.backSignIn=返回
+sys.login.changeCode=點擊切換驗證碼
+sys.login.codeTip=請輸入驗證碼
+sys.login.codeTitle=手機驗證登錄
+sys.login.company=請輸入公司名
+sys.login.confirmLogin=請在手機端確認登錄
+sys.login.confirmPassword=確認密碼
+sys.login.contacts=請輸入聯系人
+sys.login.diffPwd=兩次輸入密碼不一致
+sys.login.email=郵箱
+sys.login.expired=二維碼已失效
+sys.login.forgetFormTitle=重置密碼
+sys.login.forgetPassword=忘記密碼?
+sys.login.getCode=獲取驗證碼
+sys.login.lastLoginInfo=上次登錄信息
+sys.login.logIn=登錄
+sys.login.loginButton=登錄
+sys.login.mobile=請輸入手機號
+sys.login.mobilePlaceholder=請輸入手機號碼
+sys.login.mobileSignInFormTitle=手機驗證碼登錄
+sys.login.otherLogin=其他登錄方式
+sys.login.otherSignIn=其他登錄方式
+sys.login.password=請輸入密碼
+sys.login.passwordPlaceholder=請輸入密碼
+sys.login.passwordTip=請輸入密碼
+sys.login.policy=我同意xxx隱私政策
+sys.login.policyPlaceholder=勾選後才能註冊
+sys.login.qrCodeTip=請使用APP掃描二維碼登錄,180秒後二維碼失效
+sys.login.qrSignInFormTitle=掃碼登錄
+sys.login.recoverCode=取消登錄
+sys.login.refreshCode=點擊刷新
+sys.login.registerButton=註冊
+sys.login.rememberMe=記住我
+sys.login.reSend=重新發送
+sys.login.rightMobile=請輸入正確的手機號
+sys.login.rule=租戶子賬戶規則:租戶號{'@'}賬戶 例:18577778888{'@'}101001
+sys.login.scanSign=掃碼後點擊"確認",即可完成登錄
+sys.login.scanSuccessful=掃碼成功
+sys.login.scanTip=掃碼登錄
+sys.login.scanTitle=掃碼登錄
+sys.login.signInDesc=輸入您的個人詳細信息開始使用!
+sys.login.signInFormTitle=賬號密碼登錄
+sys.login.signInTitle=開箱即用的中後臺管理系統
+sys.login.signUpFormTitle=註冊
+sys.login.smsCode=請輸入驗證碼
+sys.login.smsPlaceholder=請輸入驗證碼
+sys.login.subTitle=通過帳號密碼登錄
+sys.login.subTitle1=通過手機驗證碼登錄,或者切換為
+sys.login.subTitle2=通過帳號密碼登錄,或者切換為
+sys.login.subTitle3=通過掃碼登錄,或者切換為
+sys.login.title=賬戶密碼登錄
+sys.login.upper=大寫已鎖定
+sys.login.username=請輸入賬號
+sys.login.version=版本
+sys.login.welcome=歡迎使用
+sys.validate.arrayRequiredPrefix=請至少選擇一個
+sys.validate.date=請輸入正確的日期
+sys.validate.email=請輸入正確的郵箱
+sys.validate.idCard=請輸入正確的身份證號碼
+sys.validate.mobilePhone=請輸入正確的手機號碼
+sys.validate.money=請輸入正確的金額
+sys.validate.number=請輸入正確的數字
+sys.validate.phone=請輸入正確的聯系方式
+sys.validate.telephone=請輸入正確的電話號碼
+sys.validate.textRequiredSuffix=不能為空
+sys.validate.url=請輸入正確的網址
+views.dynamicModel.hideSome=隱藏部分
+views.dynamicModel.passwordPlaceholder=請輸入密碼
+views.dynamicModel.scanAndShare=掃描二維碼,分享此鏈接
+views.dynamicModel.showMore=加載更多
+views.http404.goBackBtn=返回首頁
+views.http404.subTips=請檢查您輸入的URL是否正確,或單擊按鈕返回首頁。
+views.http404.tips=抱歉,你訪問的頁面不存在或無權訪問!
diff --git a/yunzhupaas-admin/src/main/resources/ip2region/ip2region.xdb b/yunzhupaas-admin/src/main/resources/ip2region/ip2region.xdb
new file mode 100644
index 0000000..e31b685
Binary files /dev/null and b/yunzhupaas-admin/src/main/resources/ip2region/ip2region.xdb differ
diff --git a/yunzhupaas-admin/src/main/resources/logback-spring.xml b/yunzhupaas-admin/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..6da9c9b
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/logback-spring.xml
@@ -0,0 +1,335 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_error.log
+
+
+
+
+
+ ${LOG_PATH}/error/%d{yyyy-MM-dd,aux}/log-error-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+ 10MB
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ error
+ ACCEPT
+ DENY
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_info.log
+
+
+
+
+
+ ${LOG_PATH}/info/%d{yyyy-MM-dd,aux}/log-info-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+ 10MB
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ info
+ ACCEPT
+ DENY
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_warn.log
+
+
+
+
+
+ ${LOG_PATH}/warn/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+ 10MB
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ warn
+ ACCEPT
+ DENY
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_debug.log
+
+
+
+
+
+ ${LOG_PATH}/debug/%d{yyyy-MM-dd,aux}/log-debug-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+ 10MB
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ debug
+ ACCEPT
+ DENY
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_total.log
+
+
+
+
+
+ ${LOG_PATH}/total/%d{yyyy-MM-dd,aux}/log-total-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+ 10MB
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_release.log
+
+
+
+
+
+ ${LOG_PATH}/release/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+ 10MB
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ ${LOG_LEVEL}
+ ACCEPT
+ DENY
+
+
+
+
+ 0
+ 256
+
+
+
+
+ 0
+ 256
+
+
+
+
+ 0
+ 256
+
+
+
+
+ 0
+ 256
+
+
+
+
+ 0
+ 256
+
+
+
+
+
+
+ ${CONSOLE_LOG_PATTERN}
+ utf-8
+
+
+
+
+
+
+ 0
+ 256
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/extend/BigDataMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/extend/BigDataMapper.xml
new file mode 100644
index 0000000..fb8c894
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/extend/BigDataMapper.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/form/FormMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/form/FormMapper.xml
new file mode 100644
index 0000000..a9f2f12
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/form/FormMapper.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/mdm/CompanyBankMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/mdm/CompanyBankMapper.xml
new file mode 100644
index 0000000..dec6879
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/mdm/CompanyBankMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/mdm/CompanyInvoiceMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/mdm/CompanyInvoiceMapper.xml
new file mode 100644
index 0000000..4c4badd
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/mdm/CompanyInvoiceMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/mdm/CompanyMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/mdm/CompanyMapper.xml
new file mode 100644
index 0000000..b5a1158
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/mdm/CompanyMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/mdm/CorporationMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/mdm/CorporationMapper.xml
new file mode 100644
index 0000000..8e60f3a
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/mdm/CorporationMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/mdm/CustomersMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/mdm/CustomersMapper.xml
new file mode 100644
index 0000000..6b8a13e
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/mdm/CustomersMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/mdm/MaterialMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/mdm/MaterialMapper.xml
new file mode 100644
index 0000000..6e5cd98
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/mdm/MaterialMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/mdm/PanyInvoiceMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/mdm/PanyInvoiceMapper.xml
new file mode 100644
index 0000000..ec4488b
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/mdm/PanyInvoiceMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/mdm/ProductsMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/mdm/ProductsMapper.xml
new file mode 100644
index 0000000..9842846
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/mdm/ProductsMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/mdm/SupplierMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/mdm/SupplierMapper.xml
new file mode 100644
index 0000000..7e210bc
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/mdm/SupplierMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/system/AuthorizeMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/system/AuthorizeMapper.xml
new file mode 100644
index 0000000..2a88cd1
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/system/AuthorizeMapper.xml
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/system/ImContentMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/system/ImContentMapper.xml
new file mode 100644
index 0000000..bf51c94
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/system/ImContentMapper.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+ UPDATE base_im_content SET f_enabled_mark = 1, f_receive_time = #{map.receiveTime} WHERE 1 = 1 AND f_enabled_mark = 0 AND f_send_user_id = #{map.sendUserId} AND f_receive_user_id = #{map.receiveUserId}
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/system/ImReplyMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/system/ImReplyMapper.xml
new file mode 100644
index 0000000..59226bb
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/system/ImReplyMapper.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/system/MessageMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/system/MessageMapper.xml
new file mode 100644
index 0000000..06c235d
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/system/MessageMapper.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/system/PortalManageMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/system/PortalManageMapper.xml
new file mode 100644
index 0000000..8fe1455
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/system/PortalManageMapper.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+ SELECT
+
+ bpm.f_id id,
+ bpm.f_enabled_mark enabledMark,
+ bpm.f_platform platform,
+ bpm.f_description description,
+ bpm.F_Tenant_Id tenantId,
+ bpm.f_sort_code sortCode,
+ bpm.f_system_id systemId,
+ bpm.f_portal_id portalId,
+ bpm.f_creator_time creatorTime,
+ bpm.f_last_modify_time lastModifyTime,
+
+ bp.f_category categoryId,
+ bp.f_full_name portalName,
+ bd.f_full_name categoryName,
+
+ us.F_Real_Name createUserName,
+ us.F_Account createUserAccount,
+ us2.F_Real_Name modifyUserName,
+ us2.F_Account modifyUserAccount
+ FROM
+ base_portal_manage bpm
+ LEFT JOIN
+ base_portal bp
+ ON
+ bpm.f_portal_id = bp.f_id
+ LEFT JOIN
+ base_user us
+ ON
+ bpm.F_Creator_User_Id = us.f_id
+ LEFT JOIN
+ base_user us2
+ ON
+ bpm.F_Last_Modify_User_Id = us2.f_id
+ LEFT JOIN
+ base_dictionary_data bd
+ ON bp.f_category = bd.f_id
+ WHERE 1 = 1
+
+ AND (bp.f_full_name LIKE #{pmPage.keyword} OR bpm.f_description LIKE #{pmPage.keyword})
+
+
+ AND
+ bp.f_category = #{pmPage.category}
+
+
+ AND
+ bpm.f_enabled_mark = #{pmPage.enabledMark}
+
+
+
+ AND
+ bpm.f_platform LIKE #{pmPage.platform}
+
+
+ AND
+ bpm.f_system_id = #{pmPage.systemId}
+
+
+ AND
+ bp.F_state != #{pmPage.state}
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/system/PositionMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/system/PositionMapper.xml
new file mode 100644
index 0000000..0a7fec2
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/system/PositionMapper.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/system/RoleMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/system/RoleMapper.xml
new file mode 100644
index 0000000..48e623e
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/system/RoleMapper.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/system/SysconfigMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/system/SysconfigMapper.xml
new file mode 100644
index 0000000..d953017
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/system/SysconfigMapper.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ delete from base_sys_config where F_Category ='SysConfig'
+
+
+ delete from base_sys_config where F_Category='MPConfig'
+
+
+ delete from base_sys_config where F_Category='QYHConfig'
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/system/UserMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/system/UserMapper.xml
new file mode 100644
index 0000000..46ee468
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/system/UserMapper.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/train/TrainExamRecordsMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/train/TrainExamRecordsMapper.xml
new file mode 100644
index 0000000..b46667c
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/train/TrainExamRecordsMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibraryEssayQuestionMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibraryEssayQuestionMapper.xml
new file mode 100644
index 0000000..3c5b6fc
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibraryEssayQuestionMapper.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+ update make_train_library_essay_question
+ set f_result = #{item.result}
+ where f_id = #{item.id}
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibraryJudgmentMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibraryJudgmentMapper.xml
new file mode 100644
index 0000000..f6054b7
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibraryJudgmentMapper.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibraryMoreMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibraryMoreMapper.xml
new file mode 100644
index 0000000..b7ca342
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibraryMoreMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibrarySingleMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibrarySingleMapper.xml
new file mode 100644
index 0000000..780ab97
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/train/TrainLibrarySingleMapper.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/yunzhupaas-admin/src/main/resources/mapper/train/TrainTestPaperLibraryMapper.xml b/yunzhupaas-admin/src/main/resources/mapper/train/TrainTestPaperLibraryMapper.xml
new file mode 100644
index 0000000..32acd95
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/mapper/train/TrainTestPaperLibraryMapper.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ INSERT INTO make_train_exam_records
+ (f_id, f_number,f_library_id, f_examiners, f_full_name, f_sort, f_mark, f_result_score, f_basic_score, f_question_flag,
+ f_question_status, f_question_score, f_enabled_mark, f_sort_code, f_organize_id, f_creator_time,
+ f_creator_user_id,f_question_num,f_per_question)
+ VALUE (#{id}, #{fnumber},#{flibraryId} ,#{fexaminers}, #{ffullName}, #{fsort}, #{fmark}, #{fresultScore}, #{fbasicScore},
+ #{fquestionFlag},
+ #{fquestionStatus}, #{fquestionScore}, #{fenabledMark}, #{fsortCode}, #{forganizeId}, #{fcreatorTime},
+ #{fcreatorUserId},#{fquestionNum},#{fperQuestion})
+
+
diff --git a/yunzhupaas-admin/src/main/resources/sharding-sphere.yml b/yunzhupaas-admin/src/main/resources/sharding-sphere.yml
new file mode 100644
index 0000000..014bb20
--- /dev/null
+++ b/yunzhupaas-admin/src/main/resources/sharding-sphere.yml
@@ -0,0 +1,52 @@
+databaseName: myshardingsphere
+dataSources: # 数据源配置 =============
+ # <数据源_0>: # 自定义数据源名称
+ # dataSourceClassName: com.zaxxer.hikari.HikariDataSource # 连接池提供方完整类名(Spring默认Hikari)
+ # driverClassName: com.mysql.jdbc.Driver # JDBC驱动
+ # jdbcUrl: jdbc:mysql://{host}:{port}/{dbName}?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8 # 数据库连接URL
+ # username: {username} # 用户
+ # password: {password} # 密码
+ ds0: # 自定义数据源名称
+ dataSourceClassName: com.alibaba.druid.pool.DruidDataSource # 连接池提供方完整类名(Spring默认Hikari)
+ driverClassName: com.mysql.jdbc.Driver # JDBC驱动
+ url: jdbc:mysql://127.0.0.1:3306/sharding1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8 # 数据库连接URL
+ username: root # 用户
+ password: 123456 # 密码
+ ds1: # 自定义数据源名称
+ dataSourceClassName: com.alibaba.druid.pool.DruidDataSource # 连接池提供方完整类名(Spring默认Hikari)
+ driverClassName: com.mysql.jdbc.Driver # JDBC驱动
+ url: jdbc:mysql://127.0.0.1:3306/sharding2?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8 # 数据库连接URL
+ username: root # 用户
+ password: 123456 # 密码
+rules: # 规则 =============
+ - !SHARDING # 注意类似“- !SHARDING”标识不能省略
+ tables:
+ ext_bigdata: # 自定义逻辑表名
+ actualDataNodes: ds${0..1}.ext_bigdata_$->{0..1} # 由数据源名 + 表名组成(参考 Inline 语法规则)
+ databaseStrategy:
+ standard:
+ shardingColumn: F_Id # 分表依据字段
+ shardingAlgorithmName: myDataSourceAlgorithm
+ tableStrategy: # 表策略 -------
+ standard:
+ shardingColumn: F_Id # 分表依据字段
+ shardingAlgorithmName: myTableAlgorithm
+
+ # defaultDatabaseStrategy: # 库策略 -------
+ # standard:
+ # shardingColumn: F_Id
+ # shardingAlgorithmName: myDataSourceAlgorithm
+ shardingAlgorithms: # 分片算法 -------
+ myDataSourceAlgorithm: # 自定义算法名
+ type: INLINE
+ props:
+ algorithm-expression: ds${(long)(Long.parseLong(F_Id)/10) % 2}
+ myTableAlgorithm: # 自定义算法名
+ type: INLINE
+ props:
+ algorithm-expression: ext_bigdata_${(long)(Long.parseLong(F_Id)/10 / 2) % 2}
+# keyGenerators:
+# dsKey: # 自定义主键策略名
+# type: SNOWFLAKE
+props:
+ sql-show: true
diff --git a/yunzhupaas-app/pom.xml b/yunzhupaas-app/pom.xml
new file mode 100644
index 0000000..229d3ed
--- /dev/null
+++ b/yunzhupaas-app/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ yunzhupaas-java-boot
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-app
+ pom
+
+ yunzhupaas-app-entity
+ yunzhupaas-app-biz
+ yunzhupaas-app-controller
+
+
+
diff --git a/yunzhupaas-app/yunzhupaas-app-biz/pom.xml b/yunzhupaas-app/yunzhupaas-app-biz/pom.xml
new file mode 100644
index 0000000..50235c2
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-biz/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ yunzhupaas-app
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-app-biz
+
+
+
+ com.yunzhupaas
+ yunzhupaas-app-entity
+ ${project.version}
+ compile
+
+
+ com.yunzhupaas
+ yunzhupaas-permission-biz
+ ${project.version}
+ compile
+
+
+ com.yunzhupaas
+ yunzhupaas-system-biz
+ ${project.version}
+ compile
+
+
+
+
diff --git a/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/mapper/AppDataMapper.java b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/mapper/AppDataMapper.java
new file mode 100644
index 0000000..97de131
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/mapper/AppDataMapper.java
@@ -0,0 +1,17 @@
+package com.yunzhupaas.mapper;
+
+import com.yunzhupaas.base.mapper.SuperMapper;
+import com.yunzhupaas.entity.AppDataEntity;
+
+/**
+ * app常用数据
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-07-08
+ */
+public interface AppDataMapper extends SuperMapper {
+
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/AppDataService.java b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/AppDataService.java
new file mode 100644
index 0000000..5538466
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/AppDataService.java
@@ -0,0 +1,57 @@
+package com.yunzhupaas.service;
+
+import com.yunzhupaas.base.service.SuperService;
+import com.yunzhupaas.entity.AppDataEntity;
+
+import java.util.List;
+
+/**
+ * app常用数据
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-08-08
+ */
+public interface AppDataService extends SuperService {
+
+
+ /**
+ * 列表
+ *
+ * @return
+ */
+ List getList();
+
+ /**
+ * 信息
+ *
+ * @param objectId 对象主键
+ * @return
+ */
+ AppDataEntity getInfo(String objectId);
+
+ /**
+ * 验证名称
+ *
+ * @param objectId 对象主键
+ * @return
+ */
+ boolean isExistByObjectId(String objectId, String systemId);
+
+ /**
+ * 创建
+ *
+ * @param entity 实体对象
+ */
+ void create(AppDataEntity entity);
+
+ /**
+ * 删除
+ *
+ * @param entity 实体对象
+ */
+ void delete(AppDataEntity entity);
+
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/AppService.java b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/AppService.java
new file mode 100644
index 0000000..ccc3635
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/AppService.java
@@ -0,0 +1,29 @@
+package com.yunzhupaas.service;
+
+import com.yunzhupaas.model.AppUserInfoVO;
+import com.yunzhupaas.model.AppUsersVO;
+
+/**
+ * app用户信息
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-08-08
+ */
+public interface AppService {
+
+ /**
+ * app用户信息
+ * @return
+ */
+ AppUsersVO userInfo();
+
+ /**
+ * 通讯录
+ * @return
+ */
+ AppUserInfoVO getInfo(String id);
+
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/impl/AppDataServiceImpl.java b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/impl/AppDataServiceImpl.java
new file mode 100644
index 0000000..6ca80bf
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/impl/AppDataServiceImpl.java
@@ -0,0 +1,72 @@
+package com.yunzhupaas.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.yunzhupaas.base.UserInfo;
+import com.yunzhupaas.base.service.SuperServiceImpl;
+import com.yunzhupaas.entity.AppDataEntity;
+import com.yunzhupaas.mapper.AppDataMapper;
+import com.yunzhupaas.service.AppDataService;
+import com.yunzhupaas.util.RandomUtil;
+import com.yunzhupaas.util.UserProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * app常用数据
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-08-08
+ */
+@Service
+public class AppDataServiceImpl extends SuperServiceImpl implements AppDataService {
+
+
+
+ @Override
+ public List getList() {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ return this.list(queryWrapper);
+ }
+
+ @Override
+ public AppDataEntity getInfo(String objectId) {
+ UserInfo userInfo = UserProvider.getUser();
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.lambda().eq(AppDataEntity::getObjectId, objectId).eq(AppDataEntity::getCreatorUserId, userInfo.getUserId());
+ return this.getOne(queryWrapper);
+ }
+
+ @Override
+ public boolean isExistByObjectId(String objectId, String systemId) {
+ UserInfo userInfo = UserProvider.getUser();
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.lambda().eq(AppDataEntity::getObjectId, objectId)
+ .eq(AppDataEntity::getCreatorUserId, userInfo.getUserId())
+ .eq(AppDataEntity::getSystemId, systemId);
+ return this.count(queryWrapper) > 0 ? true : false;
+ }
+
+ @Override
+ public void create(AppDataEntity entity) {
+ UserInfo userInfo = UserProvider.getUser();
+ entity.setId(RandomUtil.uuId());
+ entity.setCreatorUserId(userInfo.getUserId());
+ entity.setCreatorTime(new Date());
+ entity.setEnabledMark(1);
+ entity.setSystemId(userInfo.getAppSystemId());
+ this.save(entity);
+ }
+
+ @Override
+ public void delete(AppDataEntity entity) {
+ this.removeById(entity.getId());
+ }
+
+
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/impl/AppServiceImpl.java b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/impl/AppServiceImpl.java
new file mode 100644
index 0000000..e8db75e
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-biz/src/main/java/com/yunzhupaas/service/impl/AppServiceImpl.java
@@ -0,0 +1,163 @@
+package com.yunzhupaas.service.impl;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.yunzhupaas.base.UserInfo;
+import com.yunzhupaas.base.entity.DictionaryDataEntity;
+import com.yunzhupaas.base.service.DictionaryDataService;
+import com.yunzhupaas.model.AppPositionVO;
+import com.yunzhupaas.model.AppUserInfoVO;
+import com.yunzhupaas.model.AppUsersVO;
+import com.yunzhupaas.permission.entity.*;
+import com.yunzhupaas.permission.service.*;
+import com.yunzhupaas.service.AppService;
+import com.yunzhupaas.util.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * app用户信息
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-08-08
+ */
+@Service
+public class AppServiceImpl implements AppService {
+
+ @Autowired
+ private UserService userService;
+ @Autowired
+ private PositionService positionService;
+ @Autowired
+ private OrganizeService organizeService;
+ @Autowired
+ private RoleService roleService;
+ @Autowired
+ private RedisUtil redisUtil;
+ @Autowired
+ private UserRelationService userRelationService;
+ @Autowired
+ private DictionaryDataService dictionaryDataService;
+
+ @Override
+ public AppUsersVO userInfo() {
+ UserInfo userInfo = UserProvider.getUser();
+ UserEntity userEntity = userService.getInfo(userInfo.getUserId());
+ AppUsersVO usersVO = new AppUsersVO();
+ usersVO.setBirthday(userEntity.getBirthday() != null ? userEntity.getBirthday().getTime() : null);
+ usersVO.setEmail(userEntity.getEmail());
+ List dataServiceList4 = dictionaryDataService.getListByTypeDataCode("sex");
+ Map dataServiceMap4 = dataServiceList4.stream().filter(t -> ObjectUtil.equal(t.getEnabledMark(), 1)).collect(Collectors.toMap(DictionaryDataEntity::getEnCode, DictionaryDataEntity::getFullName));
+ usersVO.setGender(dataServiceMap4.get(userEntity.getGender()));
+ usersVO.setMobilePhone(userEntity.getMobilePhone());
+ this.data(usersVO, userEntity, userInfo);
+ this.userInfo(usersVO, userInfo);
+ //岗位
+ PositionEntity position = positionService.getInfo(userEntity.getPositionId());
+ AppPositionVO positionVO = new AppPositionVO();
+ if(position != null){
+ positionVO.setId(position.getId());
+ positionVO.setName(position.getFullName());
+ usersVO.setPositionIds(ListUtil.toList(positionVO));
+ }
+ //直属主管
+ if(StringUtil.isNotEmpty(userEntity.getManagerId())){
+ UserEntity menager = userService.getInfo(userEntity.getManagerId());
+ usersVO.setManager(menager != null ? menager.getRealName() + "/" + menager.getAccount() : "");
+ }
+ //角色
+ List roles = roleService.getAllRoleIdsByUserIdAndOrgId(userInfo.getUserId(), usersVO.getOrganizeId());
+ List roleList = roleService.getListByIds(roles, null, false);
+ usersVO.setRoleName(String.join(",", roleList.stream().map(RoleEntity::getFullName).collect(Collectors.toList())));
+ usersVO.setRoleId(String.join(".", roleList.stream().map(RoleEntity::getId).collect(Collectors.toList())));
+ return usersVO;
+ }
+
+ @Override
+ public AppUserInfoVO getInfo(String id) {
+ AppUserInfoVO userInfoVO = new AppUserInfoVO();
+ UserEntity entity = userService.getInfo(id);
+ if (entity != null) {
+ userInfoVO = JsonUtil.getJsonToBean(entity, AppUserInfoVO.class);
+ List positionIds = StringUtil.isNotEmpty(entity.getPositionId()) ? Arrays.asList(entity.getPositionId().split(",")) : new ArrayList<>();
+ List positionName = positionService.getPositionName(positionIds, false).stream().map(t -> t.getFullName()).collect(Collectors.toList());
+ userInfoVO.setPositionName(String.join(",", positionName));
+ OrganizeEntity info = organizeService.getInfo(entity.getOrganizeId());
+ userInfoVO.setOrganizeName(info != null ? info.getFullName() : "");
+ userInfoVO.setHeadIcon(UploaderUtil.uploaderImg(userInfoVO.getHeadIcon()));
+ }
+ return userInfoVO;
+ }
+ /**
+ * 赋值
+ *
+ * @param userInfo
+ * @param userId
+ * @param isAdmin
+ */
+ private void userInfo(UserInfo userInfo, String userId, boolean isAdmin, UserEntity userEntity) {
+ List userIdList = new ArrayList(){{add(userId);}};
+ List data = userRelationService.getListByUserIdAll(userIdList);
+ //获取一个字段的值
+ List positionList = data.stream().filter(m -> "Position".equals(m.getObjectType())).map(t -> t.getObjectId()).collect(Collectors.toList());
+ Set id = new LinkedHashSet<>();
+ String[] position = StringUtil.isNotEmpty(userEntity.getPositionId()) ? userEntity.getPositionId().split(",") : new String[]{};
+ List positions = positionList.stream().filter(t->Arrays.asList(position).contains(t)).collect(Collectors.toList());
+ id.addAll(positions);
+ id.addAll(positionList);
+ userInfo.setPositionIds(id.toArray(new String[id.size()]));
+ if (!isAdmin) {
+ data = data.stream().filter(m -> "Role".equals(m.getObjectType())).collect(Collectors.toList());
+ }
+ List roleList = data.stream().map(t -> t.getObjectId()).collect(Collectors.toList());
+ userInfo.setRoleIds(roleList);
+ }
+
+ private void data(AppUsersVO usersVO, UserEntity userEntity, UserInfo userInfo) {
+ //组织
+ usersVO.setOrganizeId(userEntity.getOrganizeId());
+ List organizeIdList = new ArrayList<>();
+ organizeService.getOrganizeId(userEntity.getOrganizeId(),organizeIdList);
+ Collections.reverse(organizeIdList);
+ usersVO.setOrganizeName(organizeIdList.stream().map(OrganizeEntity::getFullName).collect(Collectors.joining("/")));
+ OrganizeEntity organizeEntity = organizeIdList.stream().filter(t->t.getId().equals(userEntity.getOrganizeId())).findFirst().orElse(null);
+ if (organizeEntity != null) {
+ String[] organizeId = StringUtil.isNotEmpty(organizeEntity.getOrganizeIdTree()) ? organizeEntity.getOrganizeIdTree().split(",") : new String[]{};
+ if (organizeId.length > 0) {
+ userInfo.setOrganizeId(organizeId[0]);
+ userInfo.setDepartmentId(organizeId[organizeId.length - 1]);
+ }
+ }
+ userInfo.setManagerId(userInfo.getManagerId());
+ boolean b = userInfo.getIsAdministrator();
+ List subordinateIdsList = userService.getListByManagerId(userInfo.getUserId(),null).stream().map(UserEntity::getId).collect(Collectors.toList());
+ userInfo.setSubordinateIds(subordinateIdsList);
+ this.userInfo(userInfo, userInfo.getUserId(), b,userEntity);
+// userInfo.setSubOrganizeIds(new String[]{});
+ //redisUtil.insert(userInfo.getId(), userInfo, DateUtil.getTime(userInfo.getOverdueTime()) - DateUtil.getTime(new Date()));
+ UserProvider.setLoginUser(userInfo);
+ UserProvider.setLocalLoginUser(userInfo);
+ }
+
+ /**
+ * 登录信息
+ *
+ * @param appUsersVO 返回对象
+ * @param userInfo 回话信息
+ * @return
+ */
+ private void userInfo(AppUsersVO appUsersVO, UserInfo userInfo) {
+ appUsersVO.setUserId(userInfo.getUserId());
+ appUsersVO.setHeadIcon(UploaderUtil.uploaderImg(userInfo.getUserIcon()));
+ appUsersVO.setUserName(userInfo.getUserName());
+ appUsersVO.setUserAccount(userInfo.getUserAccount());
+ }
+
+
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-controller/pom.xml b/yunzhupaas-app/yunzhupaas-app-controller/pom.xml
new file mode 100644
index 0000000..38414de
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-controller/pom.xml
@@ -0,0 +1,23 @@
+
+
+
+ yunzhupaas-app
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-app-controller
+
+
+
+ com.yunzhupaas
+ yunzhupaas-app-biz
+ ${project.version}
+ compile
+
+
+
+
diff --git a/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppDataController.java b/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppDataController.java
new file mode 100644
index 0000000..c18a0e1
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppDataController.java
@@ -0,0 +1,76 @@
+package com.yunzhupaas.controller;
+
+import com.yunzhupaas.base.controller.SuperController;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.Operation;
+import com.yunzhupaas.base.ActionResult;
+import com.yunzhupaas.constant.MsgCode;
+import com.yunzhupaas.entity.AppDataEntity;
+import com.yunzhupaas.model.AppDataCrForm;
+import com.yunzhupaas.service.AppDataService;
+import com.yunzhupaas.util.JsonUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.validation.Valid;
+
+/**
+ * app常用数据
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * @date 2024-07-08
+ */
+@Tag(name = "app常用数据", description = "data")
+@RestController
+@RequestMapping("/api/app/Data")
+public class AppDataController extends SuperController {
+
+ @Autowired
+ private AppDataService appDataService;
+
+ /**
+ * 新建
+ *
+ * @param appDataCrForm 新建模型
+ * @return
+ */
+ @PostMapping
+ @Operation(summary = "新建")
+ @Parameters({
+ @Parameter(name = "appDataCrForm", description = "常用模型",required = true),
+ })
+ public ActionResult create(@RequestBody @Valid AppDataCrForm appDataCrForm) {
+ AppDataEntity entity = JsonUtil.getJsonToBean(appDataCrForm, AppDataEntity.class);
+ if (appDataService.isExistByObjectId(entity.getObjectId(),appDataCrForm.getSystemId())) {
+ return ActionResult.fail(MsgCode.FA036.get());
+ }
+ appDataService.create(entity);
+ return ActionResult.success(MsgCode.SU001.get());
+ }
+
+ /**
+ * 删除
+ *
+ * @param objectId 主键
+ * @return
+ */
+ @Operation(summary = "删除")
+ @DeleteMapping("/{objectId}")
+ @Parameters({
+ @Parameter(name = "objectId", description = "主键", required = true),
+ })
+ public ActionResult create(@PathVariable("objectId") String objectId) {
+ AppDataEntity entity = appDataService.getInfo(objectId);
+ if (entity != null) {
+ appDataService.delete(entity);
+ return ActionResult.success(MsgCode.SU003.get());
+ }
+ return ActionResult.fail(MsgCode.FA003.get());
+ }
+
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppMenuController.java b/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppMenuController.java
new file mode 100644
index 0000000..fe3bbc0
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppMenuController.java
@@ -0,0 +1,96 @@
+package com.yunzhupaas.controller;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import com.yunzhupaas.base.ActionResult;
+import com.yunzhupaas.base.Page;
+import com.yunzhupaas.base.model.module.ModuleModel;
+import com.yunzhupaas.base.vo.ListVO;
+import com.yunzhupaas.model.AppMenuListVO;
+import com.yunzhupaas.model.UserMenuModel;
+import com.yunzhupaas.permission.model.authorize.AuthorizeVO;
+import com.yunzhupaas.permission.service.AuthorizeService;
+import com.yunzhupaas.util.JsonUtil;
+import com.yunzhupaas.util.StringUtil;
+import com.yunzhupaas.util.UserProvider;
+import com.yunzhupaas.util.treeutil.ListToTreeUtil;
+import com.yunzhupaas.util.treeutil.SumTree;
+import com.yunzhupaas.util.treeutil.newtreeutil.TreeDotUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * app应用
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * @date 2024-07-08
+ */
+@Tag(name = "app应用", description = "Menu")
+@RestController
+@RequestMapping("/api/app/Menu")
+public class AppMenuController {
+ @Autowired
+ private AuthorizeService authorizeService;
+
+ /**
+ * 获取菜单列表
+ *
+ * @param page 分页模型
+ * @return
+ */
+ @Operation(summary = "获取菜单列表")
+ @GetMapping
+ public ActionResult> list(Page page) {
+ AuthorizeVO authorizeModel = authorizeService.getAuthorize(false, false);
+ List buttonListAll = authorizeModel.getModuleList().stream().filter(t -> "App".equals(t.getCategory())).collect(Collectors.toList());
+ // 通过系统id捞取相应的菜单
+ buttonListAll = buttonListAll.stream().filter(t -> UserProvider.getUser().getAppSystemId() != null && UserProvider.getUser().getAppSystemId().equals(t.getSystemId())).collect(Collectors.toList());
+ List buttonList = buttonListAll;
+ if (StringUtil.isNotEmpty(page.getKeyword())) {
+ buttonList = buttonListAll.stream().filter(t -> t.getFullName().contains(page.getKeyword())).collect(Collectors.toList());
+ }
+ List list = JsonUtil.getJsonToList(ListToTreeUtil.treeWhere(buttonList, buttonListAll), UserMenuModel.class);
+ List> menuAll = TreeDotUtils.convertListToTreeDot(list, "-1");
+ List data = JsonUtil.getJsonToList(menuAll, AppMenuListVO.class);
+ ListVO listVO = new ListVO();
+ listVO.setList(data);
+ return ActionResult.success(listVO);
+ }
+
+ /**
+ * 获取子集菜单
+ *
+ * @return
+ */
+ @Operation(summary = "获取子集菜单")
+ @GetMapping("/getChildList/{id}")
+ public ActionResult> getChildList(@PathVariable("id") String id) {
+ AuthorizeVO authorizeModel = authorizeService.getAuthorize(false, false);
+ List buttonListAll = authorizeModel.getModuleList().stream().filter(t -> "App".equals(t.getCategory())).collect(Collectors.toList());
+ // 通过系统id捞取相应的菜单
+ buttonListAll = buttonListAll.stream().filter(t -> UserProvider.getUser().getAppSystemId() != null && UserProvider.getUser().getAppSystemId().equals(t.getSystemId())).collect(Collectors.toList());
+ Set models = new HashSet<>();
+ next(buttonListAll,id,models);
+ List list = JsonUtil.getJsonToList(models, UserMenuModel.class);
+ List> menuAll = TreeDotUtils.convertListToTreeDot(list);
+ List data = JsonUtil.getJsonToList(menuAll, AppMenuListVO.class);
+ return ActionResult.success(data);
+ }
+
+ private void next(List buttonListAll,String parentId,Set list){
+ List menuList = buttonListAll.stream().filter(t -> t.getId().equals(parentId) || t.getParentId().equals(parentId)).collect(Collectors.toList());
+ for (ModuleModel model : menuList) {
+ if(!list.contains(model)){
+ list.add(model);
+ next(buttonListAll,model.getId(),list);
+ }
+ }
+ }
+
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppUserController.java b/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppUserController.java
new file mode 100644
index 0000000..8837035
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppUserController.java
@@ -0,0 +1,62 @@
+package com.yunzhupaas.controller;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.Operation;
+import com.yunzhupaas.base.ActionResult;
+import com.yunzhupaas.model.AppUserInfoVO;
+import com.yunzhupaas.model.AppUsersVO;
+import com.yunzhupaas.service.AppService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 用户信息
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * @date 2024-07-08
+ */
+@Tag(name = "app用户信息", description = "User")
+@RestController
+@RequestMapping("/api/app/User")
+public class AppUserController {
+
+ @Autowired
+ private AppService appService;
+
+ /**
+ * 用户信息
+ *
+ * @return
+ */
+ @Operation(summary = "用户信息")
+ @GetMapping
+ public ActionResult getInfo() {
+ AppUsersVO userAllVO = appService.userInfo();
+ return ActionResult.success(userAllVO);
+ }
+
+ /**
+ * 通讯录详情
+ *
+ * @param id 主键
+ * @return
+ */
+ @Operation(summary = "通讯录详情")
+ @GetMapping("/{id}")
+ @Parameters({
+ @Parameter(name = "id", description = "主键", required = true),
+ })
+ public ActionResult userInfo(@PathVariable("id") String id) {
+ AppUserInfoVO userInfoVO = appService.getInfo(id);
+ return ActionResult.success(userInfoVO);
+ }
+
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppVersionController.java b/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppVersionController.java
new file mode 100644
index 0000000..cd3a385
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-controller/src/main/java/com/yunzhupaas/controller/AppVersionController.java
@@ -0,0 +1,45 @@
+package com.yunzhupaas.controller;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import com.yunzhupaas.base.ActionResult;
+import com.yunzhupaas.config.ConfigValueUtil;
+import com.yunzhupaas.util.NoDataSourceBind;
+import org.apache.commons.collections4.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * 获取AppVersion
+ *
+ * @author :云筑产品开发平台组
+ * @version: V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date :2022/3/31 11:26
+ */
+@Tag(name = "获取APP版本号", description = "AppVersion")
+@RestController
+@RequestMapping("/api/app")
+public class AppVersionController {
+ @Autowired
+ private ConfigValueUtil configValueUtil;
+
+ /**
+ * 判断是否需要验证码
+ *
+ * @return
+ */
+ @NoDataSourceBind()
+ @Operation(summary = "判断是否需要验证码")
+ @GetMapping("/Version")
+ public ActionResult getAppVersion() {
+ Map map = new HashedMap<>();
+ map.put("sysVersion", configValueUtil.getAppVersion());
+ return ActionResult.success(map);
+ }
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/pom.xml b/yunzhupaas-app/yunzhupaas-app-entity/pom.xml
new file mode 100644
index 0000000..c79dd3a
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ yunzhupaas-app
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-app-entity
+
+
+
+ com.yunzhupaas
+ yunzhupaas-common-all
+ ${project.version}
+
+
+
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/entity/AppDataEntity.java b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/entity/AppDataEntity.java
new file mode 100644
index 0000000..100127c
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/entity/AppDataEntity.java
@@ -0,0 +1,47 @@
+package com.yunzhupaas.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yunzhupaas.base.entity.SuperExtendEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * app常用数据
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-08-08
+ */
+@Data
+@TableName("base_app_data")
+public class AppDataEntity extends SuperExtendEntity.SuperExtendDEEntity {
+
+ /**
+ * 对象类型
+ */
+ @TableField("f_object_type")
+ private String objectType;
+
+ /**
+ * 对象主键
+ */
+ @TableField("f_object_id")
+ private String objectId;
+
+ /**
+ * 数据
+ */
+ @TableField("f_object_data")
+ private String objectData;
+
+ /**
+ * 关联系统id
+ */
+ @TableField("f_system_id")
+ private String systemId;
+
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppDataCrForm.java b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppDataCrForm.java
new file mode 100644
index 0000000..f1bc8ca
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppDataCrForm.java
@@ -0,0 +1,31 @@
+package com.yunzhupaas.model;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * app常用数据
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-07-08
+ */
+@Data
+@Schema(description = "常用模型")
+public class AppDataCrForm {
+ @NotBlank(message = "必填")
+ @Schema(description = "应用类型")
+ private String objectType;
+ @NotBlank(message = "必填")
+ @Schema(description = "应用主键")
+ private String objectId;
+ @Schema(description = "数据")
+ private String objectData;
+ @Schema(description = "系统主键")
+ private String systemId;
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppDataListAllVO.java b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppDataListAllVO.java
new file mode 100644
index 0000000..5409f92
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppDataListAllVO.java
@@ -0,0 +1,47 @@
+package com.yunzhupaas.model;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * app常用数据
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-07-08
+ */
+@Data
+@Schema(description = "常用模型")
+public class AppDataListAllVO {
+ @Schema(description = "主键")
+ private String id;
+ @Schema(description = "是否有下级菜单")
+ private Boolean hasChildren;
+ @Schema(description = "菜单名称")
+ private String fullName;
+ @Schema(description = " 图标")
+ private String icon;
+ @Schema(description = "链接地址")
+ private String urlAddress;
+ @Schema(description = "父级id")
+ private String parentId;
+ @Schema(description = "菜单类型",example = "1")
+ private Integer type;
+ @Schema(description = "扩展字段")
+ private String propertyJson;
+ @Schema(description = "图标背景色")
+ private String iconBackground;
+ @Schema(description = "是否常用")
+ private Boolean isData;
+ @Schema(description = "排序")
+ private Long sortCode;
+ @Schema(description = "分类")
+ private String category;
+ @Schema(description = "下级菜单列表")
+ private List children;
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppDataListVO.java b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppDataListVO.java
new file mode 100644
index 0000000..ffed200
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppDataListVO.java
@@ -0,0 +1,25 @@
+package com.yunzhupaas.model;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * app常用数据
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-07-08
+ */
+@Data
+@Schema(description = "常用模型")
+public class AppDataListVO {
+ @Schema(description = "主键")
+ private String id;
+ @Schema(description = "应用主键")
+ private String objectId;
+ @Schema(description = "数据")
+ private String objectData;
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppFlowListAllVO.java b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppFlowListAllVO.java
new file mode 100644
index 0000000..eb59927
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppFlowListAllVO.java
@@ -0,0 +1,31 @@
+package com.yunzhupaas.model;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * app常用数据
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-07-08
+ */
+@Data
+@Schema(description = "常用模型")
+public class AppFlowListAllVO {
+ @Schema(description = "主键")
+ private String id;
+ @Schema(description = "名称")
+ private String fullName;
+ @Schema(description = "图标")
+ private String icon;
+ @Schema(description = "图标背景色")
+ private String iconBackground;
+ @Schema(description = "编码")
+ private String enCode;
+ @Schema(description = "是否常用")
+ private Boolean isData;
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppMenuListVO.java b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppMenuListVO.java
new file mode 100644
index 0000000..a3876ae
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppMenuListVO.java
@@ -0,0 +1,43 @@
+package com.yunzhupaas.model;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * app应用
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-07-08
+ */
+@Data
+@Schema(description = "常用模型")
+public class AppMenuListVO {
+ @Schema(description = "主键")
+ private String id;
+ @Schema(description = "是否有下级菜单")
+ private Boolean hasChildren;
+ @Schema(description = "父级id")
+ private String parentId;
+ @Schema(description = "菜单编码")
+ private String enCode;
+ @Schema(description = "菜单名称")
+ private String fullName;
+ @Schema(description = " 图标")
+ private String icon;
+ @Schema(description = "是否常用")
+ private Boolean isData;
+ @Schema(description = "链接地址")
+ private String urlAddress;
+ @Schema(description = "菜单类型",example = "1")
+ private Integer type;
+ @Schema(description = "扩展字段")
+ private String propertyJson;
+ @Schema(description = "下级菜单列表")
+ private List children;
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppPositionVO.java b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppPositionVO.java
new file mode 100644
index 0000000..77bf482
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppPositionVO.java
@@ -0,0 +1,23 @@
+package com.yunzhupaas.model;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * app应用
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-08-08
+ */
+@Data
+@Schema(description = "常用模型")
+public class AppPositionVO {
+ @Schema(description = "岗位id")
+ private String id;
+ @Schema(description = "岗位名称")
+ private String name;
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppUserInfoVO.java b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppUserInfoVO.java
new file mode 100644
index 0000000..02e7f20
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppUserInfoVO.java
@@ -0,0 +1,38 @@
+package com.yunzhupaas.model;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/12 15:31
+ */
+@Data
+@Schema(description = "常用模型")
+public class AppUserInfoVO {
+ @Schema(description = "主键")
+ private String id;
+ @Schema(description = "户名")
+ private String realName;
+ @Schema(description = "部门名称")
+ private String organizeName;
+ @Schema(description = "账号")
+ private String account;
+ @Schema(description = "岗位名称")
+ private String positionName;
+ @Schema(description = "办公电话")
+ private String telePhone;
+ @Schema(description = "办公座机")
+ private String landline;
+ @Schema(description = "手机号码")
+ private String mobilePhone;
+ @Schema(description = "用户头像")
+ private String headIcon;
+ @Schema(description = "邮箱")
+ private String email;
+}
+
diff --git a/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppUsersVO.java b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppUsersVO.java
new file mode 100644
index 0000000..f1462df
--- /dev/null
+++ b/yunzhupaas-app/yunzhupaas-app-entity/src/main/java/com/yunzhupaas/model/AppUsersVO.java
@@ -0,0 +1,51 @@
+package com.yunzhupaas.model;
+
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 用户
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024-07-08
+ */
+@Data
+@Schema(description = "常用模型")
+public class AppUsersVO {
+ @Schema(description = "用户id")
+ private String userId;
+ @Schema(description = "用户账号")
+ private String userAccount;
+ @Schema(description = "用户姓名")
+ private String userName;
+ @Schema(description = "用户头像")
+ private String headIcon;
+ @Schema(description = "组织主键")
+ private String organizeId;
+ @Schema(description = "组织名称")
+ private String organizeName;
+ @Schema(description = "角色主键")
+ private String roleId;
+ @Schema(description = "角色名称")
+ private String roleName;
+ @Schema(description = "性别")
+ private String gender;
+ @Schema(description = "岗位")
+ private List positionIds;
+ @Schema(description = "生日")
+ private Long birthday;
+ @Schema(description = "手机")
+ private String mobilePhone;
+ @Schema(description = "邮箱")
+ private String email;
+ @Schema(description = "直属主管")
+ private String manager;
+
+}
+
diff --git a/yunzhupaas-crm/pom.xml b/yunzhupaas-crm/pom.xml
new file mode 100644
index 0000000..ebe6241
--- /dev/null
+++ b/yunzhupaas-crm/pom.xml
@@ -0,0 +1,50 @@
+
+
+
+ yunzhupaas-java-boot
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-crm
+ pom
+
+ yunzhupaas-crm-entity
+ yunzhupaas-crm-biz
+ yunzhupaas-crm-controller
+
+
+
+
+ org.apache.poi
+ poi
+ 4.1.2
+
+
+ org.apache.xmlbeans
+ xmlbeans
+ 3.1.0
+
+
+
+ org.apache.poi
+ poi-ooxml
+ 4.1.2
+
+
+ org.apache.poi
+ poi-ooxml-schemas
+ 4.1.2
+
+
+
+ org.apache.poi
+ poi-scratchpad
+ 4.1.2
+
+
+
+
diff --git a/yunzhupaas-crm/yunzhupaas-crm-biz/pom.xml b/yunzhupaas-crm/yunzhupaas-crm-biz/pom.xml
new file mode 100644
index 0000000..7fa6361
--- /dev/null
+++ b/yunzhupaas-crm/yunzhupaas-crm-biz/pom.xml
@@ -0,0 +1,31 @@
+
+
+
+ yunzhupaas-crm
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-crm-biz
+
+
+
+ com.yunzhupaas
+ yunzhupaas-crm-entity
+ ${project.version}
+
+
+
+
+ com.yunzhupaas
+ yunzhupaas-generater-base
+ 5.2.0-RELEASE
+
+
+
+
+
+
diff --git a/yunzhupaas-crm/yunzhupaas-crm-controller/pom.xml b/yunzhupaas-crm/yunzhupaas-crm-controller/pom.xml
new file mode 100644
index 0000000..c75610c
--- /dev/null
+++ b/yunzhupaas-crm/yunzhupaas-crm-controller/pom.xml
@@ -0,0 +1,23 @@
+
+
+
+ yunzhupaas-crm
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-crm-controller
+
+
+
+ com.yunzhupaas
+ yunzhupaas-crm-biz
+ ${project.version}
+
+
+
+
+
diff --git a/yunzhupaas-crm/yunzhupaas-crm-entity/pom.xml b/yunzhupaas-crm/yunzhupaas-crm-entity/pom.xml
new file mode 100644
index 0000000..aba2bbe
--- /dev/null
+++ b/yunzhupaas-crm/yunzhupaas-crm-entity/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ yunzhupaas-crm
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-crm-entity
+
+
+
+ com.yunzhupaas
+ yunzhupaas-common-all
+ ${project.version}
+
+
+
+
diff --git a/yunzhupaas-example/pom.xml b/yunzhupaas-example/pom.xml
new file mode 100644
index 0000000..a9e41bb
--- /dev/null
+++ b/yunzhupaas-example/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ yunzhupaas-java-boot
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-example
+ pom
+
+ yunzhupaas-example-entity
+ yunzhupaas-example-biz
+ yunzhupaas-example-controller
+
+
+
diff --git a/yunzhupaas-example/yunzhupaas-example-biz/pom.xml b/yunzhupaas-example/yunzhupaas-example-biz/pom.xml
new file mode 100644
index 0000000..42f1d92
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-biz/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ yunzhupaas-example
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-example-biz
+
+
+
+ com.yunzhupaas
+ yunzhupaas-example-entity
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-generater-base
+ ${project.version}
+
+
+
+
diff --git a/yunzhupaas-example/yunzhupaas-example-biz/src/main/java/com/yunzhupaas/mapper/ContractMapper.java b/yunzhupaas-example/yunzhupaas-example-biz/src/main/java/com/yunzhupaas/mapper/ContractMapper.java
new file mode 100644
index 0000000..dbb0a4d
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-biz/src/main/java/com/yunzhupaas/mapper/ContractMapper.java
@@ -0,0 +1,17 @@
+package com.yunzhupaas.mapper;
+
+import com.yunzhupaas.base.mapper.SuperMapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yunzhupaas.entity.ContractEntity;
+
+/**
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/16 9:47
+ */
+public interface ContractMapper extends SuperMapper {
+
+}
+
diff --git a/yunzhupaas-example/yunzhupaas-example-biz/src/main/java/com/yunzhupaas/service/ContractService.java b/yunzhupaas-example/yunzhupaas-example-biz/src/main/java/com/yunzhupaas/service/ContractService.java
new file mode 100644
index 0000000..50aa447
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-biz/src/main/java/com/yunzhupaas/service/ContractService.java
@@ -0,0 +1,29 @@
+package com.yunzhupaas.service;
+
+import com.yunzhupaas.base.service.SuperService;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yunzhupaas.base.Pagination;
+import com.yunzhupaas.entity.ContractEntity;
+
+import java.util.List;
+
+/**
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/16 9:47
+ */
+public interface ContractService extends SuperService {
+
+ List getlist(Pagination pagination);
+
+ ContractEntity getInfo(String id);
+
+ void create(ContractEntity entity);
+
+ void update(String id, ContractEntity entity);
+
+ void delete(ContractEntity entity);
+}
+
diff --git a/yunzhupaas-example/yunzhupaas-example-biz/src/main/java/com/yunzhupaas/service/impl/ContractServiceImpl.java b/yunzhupaas-example/yunzhupaas-example-biz/src/main/java/com/yunzhupaas/service/impl/ContractServiceImpl.java
new file mode 100644
index 0000000..af9767e
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-biz/src/main/java/com/yunzhupaas/service/impl/ContractServiceImpl.java
@@ -0,0 +1,81 @@
+package com.yunzhupaas.service.impl;
+
+import com.yunzhupaas.base.service.SuperServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yunzhupaas.base.Pagination;
+import com.yunzhupaas.base.UserInfo;
+import com.yunzhupaas.mapper.ContractMapper;
+import com.yunzhupaas.service.ContractService;
+import com.yunzhupaas.entity.ContractEntity;
+import com.yunzhupaas.util.RandomUtil;
+import com.yunzhupaas.util.StringUtil;
+import com.yunzhupaas.util.UserProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+
+import java.util.List;
+
+/**
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2024/3/16 9:47
+ */
+@Service
+public class ContractServiceImpl extends SuperServiceImpl implements ContractService {
+
+
+ @Override
+ public List getlist(Pagination pagination){
+ //通过UserProvider获取用户信息
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ if (!StringUtil.isEmpty(pagination.getKeyword())) {
+ queryWrapper.lambda().and(
+ t -> t.like(ContractEntity::getContractName, pagination.getKeyword())
+ .or().like(ContractEntity::getMytelePhone, pagination.getKeyword())
+ );
+ }
+ //排序
+ if (StringUtil.isEmpty(pagination.getSidx())) {
+ } else {
+ queryWrapper = "asc".equals(pagination.getSort().toLowerCase()) ? queryWrapper.orderByAsc(pagination.getSidx()) : queryWrapper.orderByDesc(pagination.getSidx());
+ }
+ Page page = new Page<>(pagination.getCurrentPage(), pagination.getPageSize());
+ IPage userPage = this.page(page, queryWrapper);
+ return pagination.setData(userPage.getRecords(), page.getTotal());
+ }
+
+ @Override
+ public ContractEntity getInfo(String id){
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.lambda().eq(ContractEntity::getId, id);
+ return this.getOne(queryWrapper);
+ }
+
+ @Override
+ @DSTransactional
+ public void create(ContractEntity entity){
+ entity.setId(RandomUtil.uuId());
+ this.save(entity);
+ }
+
+ @Override
+ @DSTransactional
+ public void update(String id, ContractEntity entity){
+ entity.setId(id);
+ this.updateById(entity);
+ }
+
+ @Override
+ public void delete(ContractEntity entity) {
+ if (entity != null) {
+ this.removeById(entity.getId());
+ }
+ }
+}
+
diff --git a/yunzhupaas-example/yunzhupaas-example-controller/pom.xml b/yunzhupaas-example/yunzhupaas-example-controller/pom.xml
new file mode 100644
index 0000000..c193185
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-controller/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ yunzhupaas-example
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-example-controller
+
+
+
+ com.yunzhupaas
+ yunzhupaas-example-biz
+ ${project.version}
+
+
+
+
diff --git a/yunzhupaas-example/yunzhupaas-example-controller/src/main/java/com/yunzhupaas/controller/ContractController.java b/yunzhupaas-example/yunzhupaas-example-controller/src/main/java/com/yunzhupaas/controller/ContractController.java
new file mode 100644
index 0000000..3640f41
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-controller/src/main/java/com/yunzhupaas/controller/ContractController.java
@@ -0,0 +1,125 @@
+package com.yunzhupaas.controller;
+
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.Operation;
+import com.yunzhupaas.base.ActionResult;
+import com.yunzhupaas.base.Pagination;
+import com.yunzhupaas.base.controller.SuperController;
+import com.yunzhupaas.base.vo.PageListVO;
+import com.yunzhupaas.base.vo.PaginationVO;
+import com.yunzhupaas.constant.MsgCode;
+import com.yunzhupaas.entity.ContractEntity;
+import com.yunzhupaas.model.ContractForm;
+import com.yunzhupaas.model.ContractInfoVO;
+import com.yunzhupaas.model.ContractListVO;
+import com.yunzhupaas.service.ContractService;
+import com.yunzhupaas.util.JsonUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.validation.Valid;
+import java.util.List;
+
+/**
+ * Contract
+ * 版本: V3.0.0
+ * 版权: 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * 作者: 云筑产品开发平台组
+ * 日期: 2020-12-31
+ */
+@RestController
+@Tag(name = "示例接口", description = "Contract")
+@RequestMapping("/Contract")
+public class ContractController extends SuperController {
+
+ @Autowired
+ private ContractService contractService;
+
+ /**
+ * 获取列表
+ *
+ * @param pagination 分页模型
+ * @return
+ */
+ @Operation(summary = "获取列表")
+ @GetMapping("/List")
+ public ActionResult> list(Pagination pagination) {
+ List entity = contractService.getlist(pagination);
+ List listVo = JsonUtil.getJsonToList(JsonUtil.getObjectToStringDateFormat(entity, "yyyy-MM-dd HH:mm:ss"), ContractListVO.class);
+ PaginationVO vo = JsonUtil.getJsonToBean(pagination, PaginationVO.class);
+ return ActionResult.page(listVo, vo);
+ }
+
+ /**
+ * 获取详情
+ *
+ * @param id 主键
+ * @return
+ */
+ @Operation(summary = "获取详情")
+ @GetMapping("/{id}")
+ @Parameters({
+ @Parameter(name = "id", description = "主键", required = true),
+ })
+ public ActionResult info(@PathVariable("id") String id) {
+ ContractEntity entity = contractService.getInfo(id);
+ ContractInfoVO vo = JsonUtil.getJsonToBean(entity, ContractInfoVO.class);
+ return ActionResult.success(vo);
+ }
+
+ /**
+ * 新建
+ *
+ * @param contractForm 新建模型
+ * @return
+ */
+ @Operation(summary = "新建")
+ @PostMapping
+ @Parameters({
+ @Parameter(name = "contractForm", description = "示例模型",required = true),
+ })
+ public ActionResult create(@RequestBody @Valid ContractForm contractForm) {
+ ContractEntity entity = JsonUtil.getJsonToBean(contractForm, ContractEntity.class);
+ contractService.create(entity);
+ return ActionResult.success(MsgCode.SU002.get());
+ }
+
+ /**
+ * @param id 主键
+ * @param contractForm 修改模型
+ * @return
+ */
+ @Operation(summary = "修改")
+ @PutMapping("/{id}")
+ @Parameters({
+ @Parameter(name = "contractForm", description = "示例模型",required = true),
+ @Parameter(name = "id", description = "主键", required = true),
+ })
+ public ActionResult update(@PathVariable("id") String id, @RequestBody @Valid ContractForm contractForm) {
+ ContractEntity entity = JsonUtil.getJsonToBean(contractForm, ContractEntity.class);
+ contractService.update(id, entity);
+ return ActionResult.success(MsgCode.SU004.get());
+ }
+
+ /**
+ * 删除
+ *
+ * @param id 主键
+ * @return
+ */
+ @Operation(summary = "删除")
+ @DeleteMapping("/{id}")
+ @Parameters({
+ @Parameter(name = "id", description = "主键", required = true),
+ })
+ public ActionResult delete(@PathVariable("id") String id) {
+ ContractEntity entity = contractService.getInfo(id);
+ contractService.delete(entity);
+ return ActionResult.success(MsgCode.SU003.get());
+ }
+
+}
+
diff --git a/yunzhupaas-example/yunzhupaas-example-entity/pom.xml b/yunzhupaas-example/yunzhupaas-example-entity/pom.xml
new file mode 100644
index 0000000..e9e92ea
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-entity/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ yunzhupaas-example
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-example-entity
+
+
+
+ com.yunzhupaas
+ yunzhupaas-common-all
+ ${project.version}
+
+
+
+
diff --git a/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/entity/ContractEntity.java b/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/entity/ContractEntity.java
new file mode 100644
index 0000000..8a6e6ec
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/entity/ContractEntity.java
@@ -0,0 +1,34 @@
+package com.yunzhupaas.entity;
+
+import com.yunzhupaas.base.entity.SuperBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * Contract
+ * 版本: V3.0.0
+ * 版权: 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * 作者: 云筑产品开发平台组
+ * 日期: 2020-12-31
+ */
+@Data
+@TableName("test_contract")
+public class ContractEntity extends SuperBaseEntity.SuperTBaseEntity implements Serializable {
+
+ @TableField("F_CONTRACTNAME")
+ private String contractName;
+
+ @TableField("F_MYTELEPHONE")
+ private String mytelePhone;
+
+ @TableField("F_FILEJSON")
+ private String fileJson;
+
+}
+
diff --git a/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/model/ContractForm.java b/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/model/ContractForm.java
new file mode 100644
index 0000000..b795c93
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/model/ContractForm.java
@@ -0,0 +1,27 @@
+package com.yunzhupaas.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ *
+ *
+ * 版本: V3.0.0
+ * 版权: 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * 作者: 云筑产品开发平台组
+ * 日期: 2020-12-31
+ */
+@Data
+public class ContractForm {
+
+ @Schema(description = "姓名")
+ private String contractName;
+
+ @Schema(description = "手机号")
+ private String mytelePhone;
+
+ @Schema(description = "文件")
+ private String fileJson;
+
+}
+
diff --git a/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/model/ContractInfoVO.java b/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/model/ContractInfoVO.java
new file mode 100644
index 0000000..0b86df0
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/model/ContractInfoVO.java
@@ -0,0 +1,28 @@
+package com.yunzhupaas.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ *
+ *
+ * 版本: V3.0.0
+ * 版权: 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * 作者: 云筑产品开发平台组
+ * 日期: 2020-12-31
+ */
+@Data
+public class ContractInfoVO {
+ @Schema(description = "主键")
+ private String id;
+
+ @Schema(description = "姓名")
+ private String contractName;
+
+ @Schema(description = "手机号")
+ private String mytelePhone;
+
+ @Schema(description = "文件")
+ private String fileJson;
+}
+
diff --git a/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/model/ContractListVO.java b/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/model/ContractListVO.java
new file mode 100644
index 0000000..2cc5c89
--- /dev/null
+++ b/yunzhupaas-example/yunzhupaas-example-entity/src/main/java/com/yunzhupaas/model/ContractListVO.java
@@ -0,0 +1,17 @@
+package com.yunzhupaas.model;
+
+import lombok.Data;
+
+/**
+ *
+ *
+ * 版本: V3.0.0
+ * 版权: 深圳市乐程软件有限公司(http://www.szlecheng.cn)
+ * 作者: 云筑产品开发平台组
+ * 日期: 2020-12-31
+ */
+@Data
+public class ContractListVO extends ContractInfoVO {
+
+}
+
diff --git a/yunzhupaas-exception/pom.xml b/yunzhupaas-exception/pom.xml
new file mode 100644
index 0000000..7476ad3
--- /dev/null
+++ b/yunzhupaas-exception/pom.xml
@@ -0,0 +1,31 @@
+
+
+
+ yunzhupaas-java-boot
+ com.yunzhupaas
+ 5.2.0-RELEASE
+
+ 4.0.0
+
+ yunzhupaas-exception
+
+
+ com.yunzhupaas
+ yunzhupaas-common-auth
+
+
+ com.yunzhupaas
+ yunzhupaas-common-all
+ ${project.version}
+
+
+ com.yunzhupaas
+ yunzhupaas-oauth-entity
+ ${project.version}
+
+
+
+
+
diff --git a/yunzhupaas-exception/src/main/java/com/yunzhupaas/controller/LogController.java b/yunzhupaas-exception/src/main/java/com/yunzhupaas/controller/LogController.java
new file mode 100644
index 0000000..6050e16
--- /dev/null
+++ b/yunzhupaas-exception/src/main/java/com/yunzhupaas/controller/LogController.java
@@ -0,0 +1,169 @@
+package com.yunzhupaas.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import com.yunzhupaas.base.controller.SuperController;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import com.yunzhupaas.base.ActionResult;
+import com.yunzhupaas.base.vo.PaginationVO;
+import com.yunzhupaas.constant.MsgCode;
+import com.yunzhupaas.entity.LogEntity;
+import com.yunzhupaas.model.*;
+import com.yunzhupaas.service.LogService;
+import com.yunzhupaas.util.JsonUtil;
+import org.apache.commons.collections4.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 系统日志
+ *
+ * @author 云筑产品开发平台组
+ * @version V3.1.0
+ * @copyright 深圳市乐程软件有限公司
+ * @date 2023/09/27
+ */
+@Tag(name = "系统日志", description = "Log")
+@RestController
+@RequestMapping("/api/system/Log")
+public class LogController extends SuperController {
+
+ @Autowired
+ private LogService logService;
+
+
+ /**
+ * 获取系统日志信息
+ *
+ * @param pagination category 主键值分类 1:登录日志,2.访问日志,3.操作日志,4.异常日志,5.请求日志
+ * @return
+ */
+ @Operation(summary = "获取系统日志列表")
+ @Parameters({
+ @Parameter(name = "category", description = "分类", required = true)
+ })
+ @SaCheckPermission("system.log")
+ @GetMapping
+ public ActionResult getInfoList(PaginationLogModel pagination) {
+ List list = logService.getList(pagination.getCategory(), pagination);
+ PaginationVO paginationVO = JsonUtil.getJsonToBean(pagination, PaginationVO.class);
+ switch (pagination.getCategory()) {
+ case 1:
+ List loginLogVOList = JsonUtil.getJsonToList(list, LoginLogVO.class);
+ for (int i = 0; i < loginLogVOList.size(); i++) {
+ loginLogVOList.get(i).setAbstracts(list.get(i).getDescription());
+ }
+ return ActionResult.page(loginLogVOList, paginationVO);
+ case 3:
+ List handleLogVOList = JsonUtil.getJsonToList(list, HandleLogVO.class);
+ return ActionResult.page(handleLogVOList, paginationVO);
+ case 4:
+ List errorLogVOList = JsonUtil.getJsonToList(list, ErrorLogVO.class);
+ return ActionResult.page(errorLogVOList, paginationVO);
+ case 5:
+ List requestLogVOList = JsonUtil.getJsonToList(list, RequestLogVO.class);
+ return ActionResult.page(requestLogVOList, paginationVO);
+ default:
+ return ActionResult.fail(MsgCode.FA012.get());
+ }
+ }
+
+ /**
+ * 获取系统日志信息
+ *
+ * @param id 主键值
+ * @return
+ */
+ @Operation(summary = "获取系统日志信息")
+ @Parameters({
+ @Parameter(name = "category", description = "分类", required = true)
+ })
+ @SaCheckPermission("system.log")
+ @GetMapping("/{id}")
+ public ActionResult getInfoList(@PathVariable("id") String id) {
+ LogEntity entity = logService.getInfo(id);
+ if (entity == null) {
+ return ActionResult.fail(MsgCode.FA001.get());
+ }
+ LogInfoVO vo = JsonUtil.getJsonToBean(entity, LogInfoVO.class);
+ return ActionResult.success(vo);
+ }
+
+ /**
+ * 批量删除系统日志
+ *
+ * @param logDelForm 批量删除日志模型
+ * @return
+ */
+ @Operation(summary = "批量删除系统日志")
+ @Parameters({
+ @Parameter(name = "logDelForm", description = "批量删除日志模型", required = true)
+ })
+ @SaCheckPermission("system.log")
+ @DeleteMapping
+ public ActionResult delete(@RequestBody LogDelForm logDelForm) {
+ boolean flag = logService.delete(logDelForm.getIds());
+ if (!flag) {
+ return ActionResult.fail(MsgCode.FA003.get());
+ }
+ return ActionResult.success(MsgCode.SU003.get());
+ }
+
+ /**
+ * 一键清空操作日志
+ *
+ * @param type 分类
+ * @return
+ */
+ @Operation(summary = "一键清空操作日志")
+ @Parameters({
+ @Parameter(name = "type", description = "分类", required = true)
+ })
+ @SaCheckPermission("system.log")
+ @DeleteMapping("/{type}")
+ public ActionResult deleteHandelLog(@PathVariable("type") String type) {
+ logService.deleteHandleLog(type, null);
+ return ActionResult.success(MsgCode.SU005.get());
+ }
+
+ /**
+ * 一键清空登陆日志
+ *
+ * @return
+ */
+ @Operation(summary = "一键清空登陆日志")
+ @SaCheckPermission("system.log")
+ @DeleteMapping("/deleteLoginLog")
+ public ActionResult deleteLoginLog() {
+ logService.deleteHandleLog("1", 1);
+ return ActionResult.success(MsgCode.SU005.get());
+ }
+
+ /**
+ * 获取菜单名
+ *
+ * @return
+ */
+ @Operation(summary = "获取菜单名")
+ @SaCheckPermission("system.log")
+ @GetMapping("/ModuleName")
+ public ActionResult>> moduleName() {
+ List