├── .gitattributes ├── .gitignore ├── Jenkinsfile ├── LICENSE.txt ├── README.md ├── doc ├── README_jdk.md ├── jeecg │ ├── LICENSE.txt │ └── README.md ├── mcms │ └── LICENSE ├── msp │ ├── README.md │ └── zlt │ │ ├── LICENSE.txt │ │ └── README.md ├── obpm │ └── README.md └── yudao │ ├── LICENSE │ ├── README.md │ ├── ruoyi-vue-pro-architecture.png │ ├── ruoyi-vue-pro-biz.png │ ├── 《芋道 Spring Boot API 接口文档 Swagger 入门》.md │ ├── 《芋道 Spring Boot Cache 入门》.md │ ├── 《芋道 Spring Boot Dubbo 入门》.md │ ├── 《芋道 Spring Boot MyBatis 入门》.md │ ├── 《芋道 Spring Boot Redis 入门》.md │ ├── 《芋道 Spring Boot SpringMVC 入门》.md │ ├── 《芋道 Spring Boot 单元测试 Test 入门》.md │ ├── 《芋道 Spring Boot 参数校验 Validation 入门》.md │ ├── 《芋道 Spring Boot 声明式调用 Feign 入门》.md │ ├── 《芋道 Spring Boot 多数据源(读写分离)入门》.md │ ├── 《芋道 Spring Boot 安全框架 Spring Security 入门》.md │ ├── 《芋道 Spring Boot 数据库连接池入门》.md │ ├── 《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》.md │ └── 《芋道 Spring Cloud 声明式调用 Feign 入门》.md ├── eap-biz-extend └── pom.xml ├── eoa-server ├── Dockerfile ├── pom.xml └── src │ └── main │ ├── java │ └── org │ │ └── openea │ │ └── eap │ │ └── server │ │ ├── EoaServerApplication.java │ │ └── controller │ │ └── DefaultController.java │ └── resources │ ├── application-dev.yaml │ ├── application-local.yaml │ ├── application-tenant.yaml │ ├── application.yaml │ ├── i18n │ └── eoa-msg.properties │ └── logback-spring.xml ├── lombok.config ├── pom.xml └── script ├── docker ├── Docker-HOWTO.md ├── build-eoa-obpm-docker.sh ├── build-eoa-server-docker.sh ├── docker-compose-eoa.yml ├── docker-compose.yml ├── docker.env ├── docker_clean.sh └── openea-docker-login.sh └── sql ├── db2 └── README.md ├── dm ├── flowable-patch │ └── src │ │ └── main │ │ ├── java │ │ ├── liquibase │ │ │ ├── database │ │ │ │ └── core │ │ │ │ │ └── DmDatabase.java │ │ │ └── datatype │ │ │ │ └── core │ │ │ │ └── BooleanType.java │ │ └── org │ │ │ └── flowable │ │ │ └── common │ │ │ └── engine │ │ │ └── impl │ │ │ └── AbstractEngineConfiguration.java │ │ └── resources │ │ └── META-INF │ │ ├── package-info.md │ │ └── services │ │ └── liquibase.database.Database └── ruoyi-vue-pro-dm8.sql ├── mysql └── ruoyi-vue-pro.sql ├── oracle └── ruoyi-vue-pro.sql ├── postgresql └── ruoyi-vue-pro.sql └── sqlserver └── ruoyi-vue-pro.sql /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=java 2 | *.css linguist-language=java 3 | *.html linguist-language=java -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | **/.idea 3 | 4 | **/.DS_Store 5 | 6 | # Compiled class file 7 | *.class 8 | # Log file 9 | *.log 10 | 11 | # BlueJ files 12 | *.ctxt 13 | 14 | # Mobile Tools for Java (J2ME) 15 | .mtj.tmp/ 16 | 17 | # Package Files # 18 | *.jar 19 | *.war 20 | *.ear 21 | *.zip 22 | *.tar.gz 23 | *.rar 24 | .idea 25 | *.iml 26 | 27 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 28 | hs_err_pid* 29 | /target/ 30 | /.classpath 31 | /.project 32 | /.settings/ 33 | 34 | **/target/ 35 | 36 | **/node_modules/ 37 | **/package-lock.json 38 | 39 | refer/** 40 | 41 | *-logs/ 42 | **/*-logs/ 43 | 44 | **/pom.xml.versionsBackup 45 | 46 | .flattened-pom.xml 47 | **/.flattened-pom.xml 48 | 49 | 50 | docker/openea-docker-login.sh 51 | 52 | # eoa will move 53 | #eoa-server/** 54 | 55 | 56 | eoa-server/src/main/resources/application-dev114.yaml -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | #!groovy 2 | pipeline { 3 | 4 | agent any 5 | 6 | parameters { 7 | string(name: 'TAG_NAME', defaultValue: '', description: '') 8 | } 9 | 10 | environment { 11 | // DockerHub 凭证 ID(登录您的 DockerHub) 12 | DOCKER_CREDENTIAL_ID = 'dockerhub-id' 13 | // GitHub 凭证 ID (推送 tag 到 GitHub 仓库) 14 | GITHUB_CREDENTIAL_ID = 'github-id' 15 | // kubeconfig 凭证 ID (访问接入正在运行的 Kubernetes 集群) 16 | KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig' 17 | // 镜像的推送 18 | REGISTRY = 'docker.io' 19 | // DockerHub 账号名 20 | DOCKERHUB_NAMESPACE = 'docker_username' 21 | // GitHub 账号名 22 | GITHUB_ACCOUNT = 'https://github.com/eaopen/openea-eap' 23 | // 应用名称 24 | APP_NAME = 'eap-server' 25 | // 应用部署路径 26 | APP_DEPLOY_BASE_DIR = '/media/pi/KINGTON/data/work/projects/' 27 | } 28 | 29 | stages { 30 | stage('检出') { 31 | steps { 32 | git url: "https://github.com/eaopen/openea-eap.git", 33 | branch: "devops" 34 | } 35 | } 36 | 37 | stage('构建') { 38 | steps { 39 | // TODO 解决多环境链接、密码不同配置临时方案 40 | sh 'if [ ! -d "' + "${env.HOME}" + '/resources" ];then\n' + 41 | ' echo "配置文件不存在无需修改"\n' + 42 | 'else\n' + 43 | ' cp -rf ' + "${env.HOME}" + '/resources/*.yaml ' + "${env.APP_NAME}" + '/src/main/resources\n' + 44 | ' echo "配置文件替换"\n' + 45 | 'fi' 46 | sh 'mvn clean package -Dmaven.test.skip=true' 47 | } 48 | } 49 | 50 | stage('部署') { 51 | steps { 52 | sh 'cp -f ' + ' bin/deploy.sh ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" 53 | sh 'cp -f ' + "${env.APP_NAME}" + '/target/*.jar ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" +'/build/' 54 | archiveArtifacts "${env.APP_NAME}" + '/target/*.jar' 55 | sh 'chmod +x ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' 56 | sh 'bash ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' 57 | } 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019- eap 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Open EAP 2 | This project is licensed under the terms of the MIT license. 3 | ## 概述 4 | 开放企业应用平台,整合各种开源项目作为企业应用快速开发的基础框架,支持i8n国际化。 5 | 6 | 本次改版以芋道开源 YunaiV/ruoyi-vue-pro (MIT许可)为基础改版,整合OBPM、MSP、Jeecg、MCMS等开源项目的部分模块。 7 | OpenEAP前后端分离,采用后端Spring boot 2.x单体多模块,前端vue2+element-UI 主流路线,预留无缝升级机制。 8 | 单体服务无缝切换为微服务(部分完成)。 9 | 10 | 11 | ## 🐯 平台简介 12 | 13 | ![架构图](https://raw.githubusercontent.com/eaopen/openea-eap/dev/doc/yudao/ruoyi-vue-pro-architecture.png) 14 | 15 | * 管理后台的电脑端:Vue2 提供 [element-ui] eap-ui-admin 版本 16 | * 管理后台的移动端:采用 [uni-app](https://github.com/dcloudio/uni-app) 方案,一份代码多终端适配,同时支持 APP、小程序、H5! 17 | * 后端采用 Spring Boot 多模块架构、MySQL + MyBatis Plus、Redis + Redisson 18 | * 数据库可使用 MySQL、Oracle、PostgreSQL、SQL Server、MariaDB、TiDB 等 19 | * 权限认证使用 Spring Security & Token & Redis,支持多终端、多种用户的认证系统,支持 SSO 单点登录 20 | * 支持加载动态权限菜单,按钮级别权限控制,本地缓存提升性能 21 | * 工作流使用 Activiti/Flowable,支持动态表单、在线设计流程、会签 / 或签、多种任务分配方式 22 | * 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验 23 | * 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务 24 | * 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏 25 | 26 | ## roadmap 27 | ### 技术架构 28 | - 单体或微服务 29 | - [X] 单体 Spring Boot 30 | - [ ] 微服务(预留无缝迁移) 31 | - 微服务架构 32 | - [ ] Spring Cloud + Alibaba Cloud 33 | - [ ] 定制版(网关apisix 配置nacos) 34 | - 用户终端 35 | - [X] PC(Chrome) 36 | - [ ] Mobile/PAD 37 | - 主要框架及组件默认配置 38 | - [X] Spring Boot 39 | - [X] Spring Security(OAuth2) / SA-Token 40 | - [X] MyBatis Plus 41 | - [X] Redis 42 | - [X] MySQL 43 | - [X] Docker 44 | 45 | 46 | ### 业务平台(面向业务人员) 47 | - [X] 顶部菜单 48 | - [X] 搜索菜单 49 | - [ ] 聊天 50 | - [ ] 聊天机器人(知识库, AI) 51 | - [X] 内部聊天 52 | - [ ] 消息/通知 53 | - [X] 站内消息 54 | - [X] 系统通知 55 | - [X] 切换语言 56 | - [X] 登录用户 57 | - [X] 个人信息 58 | - [X] 布局设置 59 | - [ ] 锁屏 60 | - [X] 退出登录 61 | - [X] 业务门户 62 | - [X] 工作流程 63 | - [X] 待办事宜 64 | - [X] 已办事宜 65 | - [X] 抄送事宜 66 | - [X] 我发起的 67 | - [X] 新建流程 68 | - [X] 流程委托 69 | - [ ] 扩展业务 70 | - [ ] 内容管理CMS/WCMS 71 | - [ ] 微信公众号管理 72 | - [ ] 网站内容管理,后台管理以及网站静态化 73 | - [ ] 企业知识库(集成AI大模型) 74 | - [ ] 客户关系管理CRM 75 | - [ ] 客户管理2B 76 | - [ ] 会员管理2C 77 | - [ ] 电商Mall(商品/订单/支付/物流) 78 | - [ ] 产品设计管理PLM 79 | - [ ] 社交工具/媒体集成 80 | 81 | 82 | ### 运营管理/系统管理(面向系统运行维护人员) 83 | - [ ] 人员组织 84 | - [X] 组织管理 85 | - [X] 用户管理 86 | - [ ] 在线用户 87 | - [ ] 权限管理 88 | - [X] 角色管理 89 | - [X] 菜单管理 90 | - [X] 系统公告 91 | - [X] 审计日志(登录/操作) 92 | - [ ] 系统模版 93 | - [ ] 审批常用语 94 | - [ ] 流程通知 95 | - [ ] 系统配置(基础信息) 96 | 97 | 98 | ### 低代码平台(面向开发实施人员/资深业务人员/资深运维人员) 99 | - 工作流引擎及设计 100 | - [ ] 流程引擎(Flowable) 101 | - [ ] 流程设计(Flowable) 102 | - [X] 流程引擎(OpenBPM,定制Activiti) 103 | - [X] 流程设计(OpenBPM) 104 | - [ ] 流程辅助(插件、脚本等) 105 | - [ ] 简化流程 106 | - [X] 流程监控 107 | - 数据应用设计开发 108 | - [X] 数据链接(开发) 109 | - [X] 系统分类 110 | - [ ] 数据建模 111 | - [X] 数据建模(OpenBPM) 112 | - [X] 业务实体设计 113 | - [X] 业务对象设计 114 | - [ ] 数据接口 115 | - [X] 数据字典 116 | - [ ] 数据同步 117 | - 在线表单设计开发 118 | - [ ] 表单设计(表单优先) 119 | - [X] 表单设计 120 | - [X] 列表设计 121 | - [X] 表单外链 122 | - [ ] 表单设计(模型优先,OpenBPM) 123 | - [X] 对象表单设计 124 | - [X] 对话框设计 125 | - [X] 对象表单模板 126 | - [ ] 在线展示设计开发 127 | - [ ] 列表/视图设计(定制SQL列表) 128 | - [ ] 报表设计 129 | - [ ] 大屏设计 130 | - [ ] 门户设计 131 | - [ ] 辅助功能 132 | - [ ] 单据流水号 133 | - [ ] 代码生成 134 | - [X] 基于功能设计(表单优先)生成代码 135 | - [X] 基于数据表生成代码 136 | - [X] 开发文档 137 | - [X] API文档(Swagger) 138 | - [X] 数据库表 139 | - [X] 国际化 140 | 141 | ### 平台管理(面向平台管理员/开发实施人员) 142 | - [ ] 平台配置 143 | - [ ] 平台特性 144 | - [X] 数据源配置 145 | - [ ] 应用及认证管理 146 | - [ ] 应用管理 147 | - [ ] 认证管理 148 | - [ ] 用户认证及同步管理 149 | - [ ] AD/LDAP配置及同步 150 | - [ ] OAuth2(JustAuth) 151 | - [ ] 企业微信配置及同步 152 | - [ ] 阿里钉钉配置及同步 153 | - [X] 系统调度 154 | - [ ] 系统配置 155 | - [ ] 安全配置(登录策略/密码策略) 156 | - [ ] 超管配置 157 | - [ ] 消息发送配置 158 | - [ ] 短信配置 159 | - [ ] 邮箱配置 160 | - [ ] 文件集成配置 161 | - 系统监控 162 | - [X] 系统日志(登录/请求/操作/异常) 163 | - [X] Java/Redis/MySQL监控 164 | - [ ] 监控集成 165 | 166 | 167 | ## 🐨 技术栈 168 | 169 | ### 项目 170 | 171 | * [openea-eap](https://github.com/eaopen/openea-eap) 综合版本 172 | * 分支dev为最新版 173 | 174 | * 后端项目(eap 后端源代码) 175 | * [eap-base](https://github.com/eaopen/eap-base) eap基础包 176 | * [eap-boot](https://github.com/eaopen/eap-boot) eap boot版本,多模块版本 177 | * [eap-cloud](https://github.com/eaopen/eap-cloud) eap cloud版本,微服务版本 178 | * [eap-saas](https://github.com/eaopen/eap-saas) eap saas版本,多租户版本 179 | * [eap-suite1](https://github.com/eaopen/eap-suite1) 功能扩展为主,包含单点登录sso、报表report、知识库kms、网站内容管理wcms等 180 | * [eap-suite2](https://github.com/eaopen/eap-suite2) 企业管理及2B为主,包含客户管理crm、企业资源计划管理erp等 181 | * [eap-suite3](https://github.com/eaopen/eap-suite3) 企业电商及2C为主,包含电商商城mall等 182 | 183 | 184 | * 前端项目(eap 前端源代码) 185 | * [eap-ui-admin](https://github.com/eaopen/eap-ui-admin) 管理前端模板template 186 | * eap-ui-admin-uniapp 187 | * eap-ui-app 188 | 189 | ### 模块 190 | 191 | | 大项 | 项目 | 说明 | 192 | |------------|----------------------|---------------------------------| 193 | | openea-eap | `eoa-server` | eap整合,OA + 管理后台 + 用户 APP 的服务端 | 194 | | eap-base | `eap-dependencies` | Maven 依赖版本管理 | 195 | | eap-base | `eap-framework` | Java 框架拓展 | 196 | | eap-boot | `eap-module-system` | 系统功能的 Module 模块 | 197 | | eap-boot | `eap-module-infra` | 基础设施的 Module 模块 | 198 | | eap-boot | `eap-module-lowcode` | 集成低代码平台 | 199 | | eap-boot | `eap-module-bpm` | 集成基于工作流平台 | 200 | | eap-boot | `eap-server` | 管理后台 + 用户 APP 的服务端 | 201 | | eap-cloud | `eap-cloud` | 微服务基础平台,包含网关APISIX/追踪Skywalking | 202 | | eap-saas | `eap-saas` | saas平台,多租户管理 | 203 | | eap-suite1 | `eap-report` | 报表模块 | 204 | | eap-suite1 | `eap-cms` | 网站及内容管理 | 205 | | eap-suite1 | `eap-ai` | AI大模型及知识库 | 206 | | eap-suite2 | `eap-crm` | 客户关系管理 | 207 | | eap-suite2 | `eap-erp` | 企业资源计划管理 | 208 | | eap-suite3 | `eap-mall` | 企业电商 | 209 | 210 | ### 框架 211 | 212 | | 框架 | 说明 | 版本 | 学习指南 | 213 | |---------------------------------------------------------------------------------------------|---------------|-------------|----------------------------------------------------------------| 214 | | [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.7.12 | [文档](https://github.com/YunaiV/SpringBoot-Labs) | 215 | | [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 / 8.0+ | | 216 | | [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.16 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?eap) | 217 | | [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.3.1 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?eap) | 218 | | [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.6.1 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?eap) | 219 | | [Redis](https://redis.io/) | key-value 数据库 | 5.0 / 6.0 | | 220 | | [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.18.0 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?eap) | 221 | | [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.24 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?eap) | 222 | | [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.7.6 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?eap) | 223 | | [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.5 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?eap) | 224 | | [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.8.0 | [文档](https://doc.iocoder.cn/bpm/) | 225 | | [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?eap) | 226 | | [Springdoc](https://springdoc.org/) | Swagger 文档 | 1.6.15 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?eap) | 227 | | [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?eap) | 228 | | [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.12.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?eap) | 229 | | [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.7.10 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?eap) | 230 | | [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | | 231 | | [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.5.5.Final | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?eap) | 232 | | [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.18.26 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?eap) | 233 | | [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.8.2 | - | 234 | | [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 4.8.0 | - | 235 | | [APISIX](https://github.com/apache/apisix) | API Gateway | 3.2.1 | - | 236 | | [Skywalking](https://github.com/apache/skywalking) | APM 日志追踪 | 9.5.0 | - | 237 | 238 | ## 🐼 内置功能 239 | 240 | 系统内置多种多种业务功能,可以用于快速你的业务系统: 241 | 242 | ![功能分层](https://raw.githubusercontent.com/eaopen/openea-eap/dev/doc/yudao/ruoyi-vue-pro-biz.png) 243 | 244 | * 系统功能 245 | * 基础设施 246 | * 低代码/工作流程 247 | * 业务系统 248 | 249 | ### 系统功能 250 | 251 | | | 功能 | 描述 | 252 | |-----|-------|---------------------------------| 253 | | | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 | 254 | | ⭐️ | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 | 255 | | | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | 256 | | | 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能 | 257 | | | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 | 258 | | | 岗位管理 | 配置系统用户所属担任职务 | 259 | | 🚀 | 国际化管理 | 国际化语言和词条翻译维护 | 260 | | | 国际化工具 | 前后端词条抽取工具,自动翻译集成 | 261 | | 🚀 | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 | 262 | | 🚀 | 租户套餐 | 配置租户套餐,自定每个租户的菜单、操作、按钮的权限 | 263 | | | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | 264 | | 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、腾讯云等主流短信平台 | 265 | | 🚀 | 邮件管理 | 邮箱账号、邮件模版、邮件发送日志,支持所有邮件平台 | 266 | | 🚀 | 站内信 | 系统内的消息通知,提供站内信模版、站内信消息 | 267 | | 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 | 268 | | ⭐️ | 登录日志 | 系统登录日志记录查询,包含登录异常 | 269 | | 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 | 270 | | | 通知公告 | 系统通知公告信息发布维护 | 271 | | 🚀 | 敏感词 | 配置系统敏感词,支持标签分组 | 272 | | 🚀 | 应用管理 | 管理 SSO 单点登录的应用,支持多种 OAuth2 授权方式 | 273 | | 🚀 | 地区管理 | 展示省份、城市、区镇等城市信息,支持 IP 对应城市 | 274 | 275 | 276 | ### 基础设施 277 | 278 | | | 功能 | 描述 | 279 | |-----|----------|----------------------------------------------| 280 | | 🚀 | 代码生成 | 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 | 281 | | 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 | 282 | | 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 | 283 | | | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 | 284 | | 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 | 285 | | ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 | 286 | | 🚀 | 文件服务 | 支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等 | 287 | | 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 | 288 | | | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 | 289 | | | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 | 290 | | 🚀 | 消息队列 | 基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费 | 291 | | 🚀 | Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 | 292 | | 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 | 293 | | 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 | 294 | | 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 | 295 | | 🚀 | 幂等组件 | 基于 Redis 实现幂等组件,解决重复请求问题 | 296 | | 🚀 | 服务保障 | 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 | 297 | | 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 | 298 | | 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 | 299 | 300 | 301 | # 参考 302 | ## 参考项目 refer 303 | 304 | 参考众多开源项目实现,一并表示感谢,部分项目列出如下: 305 | 306 | * yudao/ruoyi-vue-pro 307 | 308 | RuoYi-Vue 全新 Pro 版本,优化重构所有功能。 309 | 基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城等功能 310 | 311 | https://github.com/YunaiV/ruoyi-vue-pro 312 | 313 | * yudao/yudao-cloud 314 | 315 | Ruoyi-vue-pro 全新 Cloud 版本,优化重构所有功能。 316 | 基于 Spring Cloud Alibaba + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。 317 | 318 | https://github.com/YunaiV/yudao-cloud 319 | 320 | * jeecg 321 | 322 | 基于代码生成器的智能开发平台!采用前后端分离架构:SpringBoot 2.x,Mybatis,Shiro,JWT,Vue&Ant Design 323 | 324 | https://github.com/zhangdaiscott/jeecg-boot 325 | 326 | https://help.jeecg.com/ 327 | 328 | * RuoYi-Vue-CMS 329 | 330 | RuoYi-Vue-CMS是前后端分离的企业级内容管理系统。 331 | 项目基于RuoYi-Vue重构,集成SaToken用户权限,xxl-job任务调度。 332 | 支持站群管理、多平台静态化、元数据模型扩展、轻松组织各种复杂内容形态、多语言、全文检索。 333 | 334 | https://gitee.com/liweiyi/RuoYi-Vue-CMS 335 | 336 | * eladmin 337 | 338 | 基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue的前后端分离的后台管理系统 339 | 340 | https://github.com/elunez/eladmin 341 | 342 | * jeeSpringCloud 343 | 344 | https://gitee.com/JeeHuangBingGui/jeeSpringCloud 345 | 346 | * renren-fast 347 | 348 | 基于vue、element-ui构建开发,实现renren-fast后台管理前端功能,提供一套更优的前端解决方案。 349 | 350 | https://github.com/renrenio/renren-fast-vue 351 | 352 | https://github.com/renrenio/renren-security 353 | 354 | * RuoYi-Flowable-Plus 355 | 356 | 本项目基于 RuoYi-Vue-Plus 进行二次开发扩展Flowable工作流功能,支持在线表单设计和丰富的工作流程设计能力。 357 | 358 | http://rfp-doc.konbai.work/ 359 | 360 | https://github.com/KonBAI-Q/RuoYi-Flowable-Plus 361 | 362 | 363 | * vue-element-admin 364 | 365 | vue-element-admin 是一个后台前端解决方案,它基于 vue 和 element-ui实现。 366 | 367 | https://github.com/PanJiaChen/vue-element-admin 368 | 369 | 370 | ## 🐶 参考--芋道开源新手必读 371 | * 演示地址【Vue2 + element-ui】: 372 | * 启动文档: 373 | * 视频教程: 374 | -------------------------------------------------------------------------------- /doc/README_jdk.md: -------------------------------------------------------------------------------- 1 | ## JDK 选择 2 | 3 | 项目默认选择OpenJDK8, 可兼容OpenJDK11 4 | 5 | ### jdk8 6 | 7 | ### jdk11 8 | 从 http://jdk.java.net/11/ 下载适合你的操作系统的安装包并安装之。 9 | 安装之后还要设置环境变量,关于环境变量网上资料很多,请参考http://www.runoob.com/w3cnote/windows10-java-setup.html,或者自行按关键字"java环境变量"百度。 10 | 11 | 需要强调的是jdk11移除了部分模块,影响了本项目的功能。本项目中的pom.xml文件需要有以下依赖,不过您无需重复添加。 12 | ```xml 13 | 14 | 15 | org.glassfish.jaxb 16 | jaxb-runtime 17 | 2.3.0.1 18 | 19 | 20 | org.javassist 21 | javassist 22 | 3.23.1-GA 23 | 24 | 25 | ``` -------------------------------------------------------------------------------- /doc/jeecg/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright (c) 2019 Jeecg Boot All rights reserved. 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | In any case, you must not make any such use of this software as to develop software which may be considered competitive with this software. 204 | 205 | 开源协议补充 206 | JeecgBoot 是由 北京敲敲云科技有限公司 发行的软件。 总部位于北京,地址:中国·北京·朝阳区科荟前街1号院奥林佳泰大厦。邮箱:jeecgos@163.com 207 | 本软件受适用的国家软件著作权法(包括国际条约)和双重保护许可。 208 | 209 | 1.允许基于本平台软件开展业务系统开发。 210 | 2.不得基于该平台软件的基础,修改包装成一个与JeecgBoot平台软件功能类似的产品进行发布、销售,或与JeecgBoot参与同类软件产品市场的竞争。 211 | 违反此条款属于侵权行为,须赔偿侵权经济损失,同时立即停止著作权侵权行为。 212 | 解释权归:http://www.jeecg.com 213 | -------------------------------------------------------------------------------- /doc/jeecg/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ![JEECG](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/logov3.png "JeecgBoot低代码开发平台") 4 | 5 | 6 | 7 | JEECG BOOT 低代码开发平台 8 | =============== 9 | 10 | 当前最新版本: 3.5.2(发布日期:2023-06-12) 11 | 12 | 13 | [![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE) 14 | [![](https://img.shields.io/badge/Author-北京敲敲云科技-orange.svg)](http://www.jeecg.com) 15 | [![](https://img.shields.io/badge/Blog-官方博客-blue.svg)](https://jeecg.blog.csdn.net) 16 | [![](https://img.shields.io/badge/version-3.5.2-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot) 17 | [![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot) 18 | [![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot) 19 | 20 | 21 | 22 | 项目介绍 23 | ----------------------------------- 24 | 25 |

Java Low Code Platform for Enterprise web applications

26 | 27 | JeecgBoot 是一款基于代码生成器的`低代码开发平台`!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发! JeecgBoot 引领新的低代码开发模式(OnlineCoding-> 代码生成器-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省研发成本,同时又不失灵活性! 28 | 29 | JeecgBoot 提供了一系列`低代码模块`,实现在线开发`真正的零代码`:Online表单开发、Online报表、报表配置能力、在线图表设计、大屏设计、移动配置能力、表单设计器、在线设计流程、流程自动化配置、插件能力(可插拔)等等! 30 | 31 | 32 | `JEECG宗旨是:` 简单功能由OnlineCoding配置实现,做到`零代码开发`;复杂功能由代码生成器生成进行手工Merge 实现`低代码开发`,既保证了`智能`又兼顾`灵活`;实现了低代码开发的同时又支持灵活编码,解决了当前低代码产品普遍不灵活的弊端! 33 | 34 | `JEECG业务流程:` 采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。 35 | 36 | 适用项目 37 | ----------------------------------- 38 | Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,尤其适合SAAS项目、企业信息管理系统(MIS)、内部办公系统(OA)、企业资源计划系统(ERP)、客户关系管理系统(CRM)等,其半智能手工Merge的开发方式,可以显著提高开发效率70%以上,极大降低开发成本。 39 | 40 | 41 | 42 | 源码下载 43 | ----------------------------------- 44 | 45 | | 源码 | 源码地址 | 46 | |--------------------|------------------------| 47 | | 后台源码 JAVA | https://github.com/jeecgboot/jeecg-boot | 48 | | 前端源码 `Vue3版` | https://github.com/jeecgboot/jeecgboot-vue3 | 49 | | APP配套框架 | https://github.com/jeecgboot/jeecg-uniapp | 50 | 51 | ##### 快速搭建开发环境 52 | 53 | - [通过IDEA启动前后端项目](https://help.jeecg.com/java/setup/idea/startup.html) 54 | - [Vue3前端项目快速启动](http://help.jeecg.com/setup/startup.html) 55 | - [单体快速切换为微服务版](https://help.jeecg.com/java/springcloud/switchcloud/monomer.html) 56 | 57 | ##### 项目说明 58 | 59 | | 项目名 | 说明 | 60 | |--------------------|------------------------| 61 | | `jeecg-boot` | SpringBoot后台源码(支持微服务) | 62 | | `jeecgboot-vue3` | Vue3+TS 新版前端源码 | 63 | | `jeecg-uniapp` | APP开发框架,一份代码多终端适配,同时支持APP、小程序、H5 | 64 | | `jeecg-boot-starter` | [Stater依赖项目单独维护,点击下载](https://gitee.com/jeecg/jeecg-boot-starter) | 65 | | `更多开源插件` | [更多源码下载](https://github.com/jeecgboot) | 66 | 67 | 68 | 69 | 技术支持 70 | ----------------------------------- 71 | 72 | 关闭gitee的issue通道,使用中遇到问题或者BUG可以在 [Github上提Issues](https://github.com/jeecgboot/jeecg-boot/issues/new) 73 | 74 | 官方支持: [http://jeecg.com/doc/help](http://jeecg.com/doc/help) 75 | 76 | 77 | 技术文档 78 | ----------------------------------- 79 | 80 | - 项目官网: [http://www.jeecg.com](http://www.jeecg.com) 81 | 82 | - 在线演示 : [低代码演示](http://boot3.jeecg.com) | [零代码体验](http://app.qiaoqiaoyun.com) 83 | 84 | - 开发文档: [http://help.jeecg.com](http://help.jeecg.com) 85 | 86 | - 新手指南: [快速入门](http://www.jeecg.com/doc/quickstart) | [常见问题 ](http://www.jeecg.com/doc/qa) | [视频教程](https://space.bilibili.com/454617261/channel/series) | [1分钟低代码体验](https://my.oschina.net/jeecg/blog/3083313) 87 | 88 | - QQ交流群 : ⑦791696430、⑥730954414、VUE3群683903138、⑤860162132(满)、④774126647(满)、③816531124(满)、②769925425(满)、①284271917(满) 89 | > ` 提醒:【QQ群是自助服务群,建议给帮助您解决问题的同学发送指定红包,表示感谢!】 ` 90 | 91 | 92 | 93 | 94 | 95 | Docker启动项目 96 | ----------------------------------- 97 | 98 | - [Docker启动单体后台](https://help.jeecg.com/java/setup/docker/up.html) 99 | - [Docker启动Vue3前端](http://help.jeecg.com/publish/docker.html) 100 | - [Docker启动微服务后台](https://help.jeecg.com/java/springcloud/docker.html) 101 | 102 | 103 | 104 | =======【VUE2版本专题介绍】============================================ 105 | 106 | VUE2版本专题介绍 107 | ----------------------------------- 108 | #### 项目介绍 109 | - 项目名称:ant-design-vue-jeecg 110 | - 说明:JeecgBoot前端提供两套解决方案,一套VUE2和一套VUE3版本,目前vue2版本最新代码只支持到jeecgboot 3.4.3版本,一定注意。 111 | - 更多介绍:[Vue2版演示](http://boot.jeecg.com) |[开发文档](http://doc.jeecg.com) 112 | - [快速启动——Vue2前端](http://doc.jeecg.com/2678320) 113 | - [Docker启动——Vue2前端](http://doc.jeecg.com/3043612) 114 | 115 | 116 | #### Vue2与Vue3版本区别 117 | > - VUE3版本彻底抛弃IE兼容,不兼容IE和低版本浏览器,只适配高版本谷歌和Edge 118 | (政府、事业类单位项目需要谨慎选择——国产化迁移是一个漫长的过程,万一过程中要求IE兼容,这个不可逆) 119 | > - 所以如果对浏览器有要求的项目,请选择VUE2版本。 120 | > - VUE3版是全新的技术栈,紧跟主流(前端重写),各个功能都做了优化,拥有更好的体验效果 121 | 122 | 123 | #### 源码下载 124 | | 源码 | 源码地址 | 125 | |--------------------|------------------------| 126 | | 后端源码 `Vue2版` |https://gitee.com/jeecg/jeecg-boot/tree/v3.4.3last | 127 | | 前端源码 `Vue2版` |https://gitee.com/jeecg/ant-design-vue-jeecg | 128 | 129 | =========【VUE2版本专题介绍】========================================= 130 | 131 | 132 | 133 | 134 | 135 | 136 | ##### Star走势图 137 | 138 | [![Star History Chart](https://api.star-history.com/svg?repos=jeecgboot/jeecg-boot&type=Date)](https://star-history.com/#jeecgboot/jeecg-boot) 139 | 140 | 141 | 142 | 143 | 后台目录结构 144 | ----------------------------------- 145 | ``` 146 | 项目结构 147 | ├─jeecg-boot-parent(父POM: 项目依赖、modules组织) 148 | │ ├─jeecg-boot-base-core(共通模块: 工具类、config、权限、查询过滤器、注解等) 149 | │ ├─jeecg-module-demo 示例代码 150 | │ ├─jeecg-module-system System系统管理目录 151 | │ │ ├─jeecg-system-biz System系统管理权限等功能 152 | │ │ ├─jeecg-system-start System单体启动项目(8080) 153 | │ │ ├─jeecg-system-api System系统管理模块对外api 154 | │ │ │ ├─jeecg-system-cloud-api System模块对外提供的微服务接口 155 | │ │ │ ├─jeecg-system-local-api System模块对外提供的单体接口 156 | │ ├─jeecg-server-cloud --微服务模块 157 | ├─jeecg-cloud-gateway --微服务网关模块(9999) 158 | ├─jeecg-cloud-nacos --Nacos服务模块(8848) 159 | ├─jeecg-system-cloud-start --System微服务启动项目(7001) 160 | ├─jeecg-demo-cloud-start --Demo微服务启动项目(7002) 161 | ├─jeecg-visual 162 | ├─jeecg-cloud-monitor --微服务监控模块 (9111) 163 | ├─jeecg-cloud-xxljob --微服务xxljob定时任务服务端 (9080) 164 | ├─jeecg-cloud-sentinel --sentinel服务端 (9000) 165 | ├─jeecg-cloud-test -- 微服务测试示例(各种例子) 166 | ├─jeecg-cloud-test-more -- 微服务测试示例(feign、熔断降级、xxljob、分布式锁) 167 | ├─jeecg-cloud-test-rabbitmq -- 微服务测试示例(rabbitmq) 168 | ├─jeecg-cloud-test-seata -- 微服务测试示例(seata分布式事务) 169 | ├─jeecg-cloud-test-shardingsphere -- 微服务测试示例(分库分表) 170 | ``` 171 | 172 | 173 | 174 | 175 | 为什么选择JeecgBoot? 176 | ----------------------------------- 177 | * 1.采用最新主流前后分离框架(Springboot+Mybatis+antd),容易上手; 代码生成器依赖性低,灵活的扩展能力,可快速实现二次开发; 178 | * 2.支持微服务SpringCloud Alibaba(Nacos、Gateway、Sentinel、Skywalking),提供切换机制支持单体和微服务自由切换 179 | * 3.开发效率高,采用代码生成器,单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用; 180 | * 4.代码生成器提供强大模板机制,支持自定义模板,目前提供四套风格模板(单表两套、树模型一套、一对多三套) 181 | * 5.代码生成器非常智能,在线业务建模、在线配置、所见即所得支持23种类控件,一键生成前后端代码,大幅度提升开发效率,不再为重复工作发愁。 182 | * 6.低代码能力:Online在线表单(无需编码,通过在线配置表单,实现表单的增删改查,支持单表、树、一对多、一对一等模型,实现人人皆可编码) 183 | * 7.低代码能力:Online在线报表(无需编码,通过在线配置方式,实现数据报表,可以快速抽取数据,减轻开发压力,实现人人皆可编码) 184 | * 8.低代码能力:Online在线图表(无需编码,通过在线配置方式,实现曲线图,柱状图,数据报表等,支持自定义排版布局,实现人人皆可编码) 185 | * 9.封装完善的用户、角色、菜单、组织机构、数据字典、在线定时任务等基础功能,支持访问授权、按钮权限、数据权限等功能 186 | * 10.常用共通封装,各种工具类(定时任务,短信接口,邮件发送,Excel导入导出等),基本满足80%项目需求 187 | * 11.简易Excel导入导出,支持单表导出和一对多表模式导出,生成的代码自带导入导出功能 188 | * 12.集成简易报表工具,图像报表和数据导出非常方便,可极其方便的生成图形报表、pdf、excel、word等报表; 189 | * 13.采用前后分离技术,页面UI风格精美,针对常用组件做了封装:时间、行表格控件、截取显示控件、报表组件,编辑器等等 190 | * 14.查询过滤器:查询功能自动生成,后台动态拼SQL追加查询条件;支持多种匹配方式(全匹配/模糊查询/包含查询/不匹配查询); 191 | * 15.数据权限(精细化数据权限控制,控制到行级,列表级,表单字段级,实现不同人看不同数据,不同人对同一个页面操作不同字段 192 | * 16.页面校验自动生成(必须输入、数字校验、金额校验、时间空间等); 193 | * 17.支持SAAS服务模式,提供SaaS多租户架构方案。 194 | * 18.分布式文件服务,集成minio、阿里OSS等优秀的第三方,提供便捷的文件上传与管理,同时也支持本地存储。 195 | * 19.主流数据库兼容,一套代码完全兼容Mysql、Postgresql、Oracle、Sqlserver、MariaDB、达梦等主流数据库。 196 | * 20.集成工作流activiti、flowable,并实现了只需在页面配置流程转向,可极大的简化bpm工作流的开发;用bpm的流程设计器画出了流程走向,一个工作流基本就完成了,只需写很少量的java代码; 197 | * 21.低代码能力:在线流程设计,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂靠,业务流转 198 | * 22.多数据源:及其简易的使用方式,在线配置数据源配置,便捷的从其他数据抓取数据; 199 | * 23.提供单点登录CAS集成方案,项目中已经提供完善的对接代码 200 | * 24.低代码能力:表单设计器,支持用户自定义表单布局,支持单表,一对多表单、支持select、radio、checkbox、textarea、date、popup、列表、宏等控件 201 | * 25.专业接口对接机制,统一采用restful接口方式,集成swagger-ui在线接口文档,Jwt token安全验证,方便客户端对接 202 | * 26.接口安全机制,可细化控制接口授权,非常简便实现不同客户端只看自己数据等控制 203 | * 27.高级组合查询功能,在线配置支持主子表关联查询,可保存查询历史 204 | * 28.提供各种系统监控,实时跟踪系统运行情况(监控 Redis、Tomcat、jvm、服务器信息、请求追踪、SQL监控) 205 | * 29.消息中心(支持短信、邮件、微信推送等等) 206 | * 30.集成Websocket消息通知机制 207 | * 31.移动自适应效果优秀,提供APP发布方案: 208 | * 32.支持多语言,提供国际化方案; 209 | * 33.数据变更记录日志,可记录数据每次变更内容,通过版本对比功能查看历史变化 210 | * 34.平台UI强大,实现了移动自适应 211 | * 35.平台首页风格,提供多种组合模式,支持自定义风格 212 | * 36.提供简单易用的打印插件,支持谷歌、火狐、IE11+ 等各种浏览器 213 | * 37.示例代码丰富,提供很多学习案例参考 214 | * 38.采用maven分模块开发方式 215 | * 39.支持菜单动态路由 216 | * 40.权限控制采用 RBAC(Role-Based Access Control,基于角色的访问控制) 217 | * 41.提供新行编辑表格JVXETable,轻松满足各种复杂ERP布局,拥有更高的性能、更灵活的扩展、更强大的功能 218 | 219 | 220 | 221 | 222 | 技术架构: 223 | ----------------------------------- 224 | #### 开发环境 225 | 226 | - 语言:Java 8+ (小于17) 227 | 228 | - IDE(JAVA): IDEA (必须安装lombok插件 ) 229 | 230 | - IDE(前端): Vscode、WebStorm、IDEA 231 | 232 | - 依赖管理:Maven 233 | 234 | - 缓存:Redis 235 | 236 | - 数据库脚本:MySQL5.7+ & Oracle 11g & Sqlserver2017(其他数据库,[需要自己转](https://my.oschina.net/jeecg/blog/4905722)) 237 | 238 | 239 | #### 后端 240 | 241 | - 基础框架:Spring Boot 2.6.14 242 | 243 | - 微服务框架: Spring Cloud Alibaba 2021.0.1.0 244 | 245 | - 持久层框架:MybatisPlus 3.5.1 246 | 247 | - 报表工具: JimuReport 1.5.8 248 | 249 | - 安全框架:Apache Shiro 1.10.0,Jwt 3.11.0 250 | 251 | - 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking 252 | 253 | - 数据库连接池:阿里巴巴Druid 1.1.22 254 | 255 | - 日志打印:logback 256 | 257 | - 其他:autopoi, fastjson,poi,Swagger-ui,quartz, lombok(简化代码)等。 258 | 259 | 260 | #### 前端 261 | 262 | - Vue2版本:`Vue2.6+@vue/cli+AntDesignVue+Viser-vue+Vuex等` [详细查看](https://github.com/jeecgboot/ant-design-vue-jeecg) 263 | - Vue3版本:`Vue3.0+TypeScript+Vite+AntDesignVue+pinia+echarts等新方案` [详细查看](https://github.com/jeecgboot/jeecgboot-vue3) 264 | 265 | #### 支持库 266 | 267 | | 数据库 | 支持 | 268 | | --- | --- | 269 | | MySQL | √ | 270 | | Oracle11g | √ | 271 | | Sqlserver2017 | √ | 272 | | PostgreSQL | √ | 273 | | MariaDB | √ | 274 | | 达梦、人大金仓 | √ | 275 | 276 | 277 | 278 | ## 微服务解决方案 279 | 280 | 281 | 1、服务注册和发现 Nacos √ 282 | 283 | 2、统一配置中心 Nacos √ 284 | 285 | 3、路由网关 gateway(三种加载方式) √ 286 | 287 | 4、分布式 http feign √ 288 | 289 | 5、熔断降级限流 Sentinel √ 290 | 291 | 6、分布式文件 Minio、阿里OSS √ 292 | 293 | 7、统一权限控制 JWT + Shiro √ 294 | 295 | 8、服务监控 SpringBootAdmin√ 296 | 297 | 9、链路跟踪 Skywalking [参考文档](https://help.jeecg.com/java/springcloud/super/skywarking.html) 298 | 299 | 10、消息中间件 RabbitMQ √ 300 | 301 | 11、分布式任务 xxl-job √ 302 | 303 | 12、分布式事务 Seata 304 | 305 | 13、分布式日志 elk + kafka 306 | 307 | 14、支持 docker-compose、k8s、jenkins 308 | 309 | 15、CAS 单点登录 √ 310 | 311 | 16、路由限流 √ 312 | 313 | 314 | #### 微服务架构图 315 | ![微服务架构图](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/jeecgboot_springcloud2022.png "在这里输入图片标题") 316 | 317 | ### Jeecg Boot 产品功能蓝图 318 | ![功能蓝图](https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/Jeecg-Boot-lantu202005_1590912449914.jpg "在这里输入图片标题") 319 | 320 | 321 | 322 | 323 | ### 功能模块 324 | ``` 325 | ├─系统管理 326 | │ ├─用户管理 327 | │ ├─角色管理 328 | │ ├─菜单管理 329 | │ ├─权限设置(支持按钮权限、数据权限) 330 | │ ├─表单权限(控制字段禁用、隐藏) 331 | │ ├─部门管理 332 | │ ├─我的部门(二级管理员) 333 | │ └─字典管理 334 | │ └─分类字典 335 | │ └─系统公告 336 | │ └─职务管理 337 | │ └─通讯录 338 | │ └─多租户管理 339 | ├─消息中心 340 | │ ├─消息管理 341 | │ ├─模板管理 342 | ├─代码生成器(低代码) 343 | │ ├─代码生成器功能(一键生成前后端代码,生成后无需修改直接用,绝对是后端开发福音) 344 | │ ├─代码生成器模板(提供4套模板,分别支持单表和一对多模型,不同风格选择) 345 | │ ├─代码生成器模板(生成代码,自带excel导入导出) 346 | │ ├─查询过滤器(查询逻辑无需编码,系统根据页面配置自动生成) 347 | │ ├─高级查询器(弹窗自动组合查询条件) 348 | │ ├─Excel导入导出工具集成(支持单表,一对多 导入导出) 349 | │ ├─平台移动自适应支持 350 | ├─系统监控 351 | │ ├─Gateway路由网关 352 | │ ├─性能扫描监控 353 | │ │ ├─监控 Redis 354 | │ │ ├─Tomcat 355 | │ │ ├─jvm 356 | │ │ ├─服务器信息 357 | │ │ ├─请求追踪 358 | │ │ ├─磁盘监控 359 | │ ├─定时任务 360 | │ ├─系统日志 361 | │ ├─消息中心(支持短信、邮件、微信推送等等) 362 | │ ├─数据日志(记录数据快照,可对比快照,查看数据变更情况) 363 | │ ├─系统通知 364 | │ ├─SQL监控 365 | │ ├─swagger-ui(在线接口文档) 366 | │─报表示例 367 | │ ├─曲线图 368 | │ └─饼状图 369 | │ └─柱状图 370 | │ └─折线图 371 | │ └─面积图 372 | │ └─雷达图 373 | │ └─仪表图 374 | │ └─进度条 375 | │ └─排名列表 376 | │ └─等等 377 | │─大屏模板 378 | │ ├─作战指挥中心大屏 379 | │ └─物流服务中心大屏 380 | │─常用示例 381 | │ ├─自定义组件 382 | │ ├─对象存储(对接阿里云) 383 | │ ├─JVXETable示例(各种复杂ERP布局示例) 384 | │ ├─单表模型例子 385 | │ └─一对多模型例子 386 | │ └─打印例子 387 | │ └─一对多TAB例子 388 | │ └─内嵌table例子 389 | │ └─常用选择组件 390 | │ └─异步树table 391 | │ └─接口模拟测试 392 | │ └─表格合计示例 393 | │ └─异步树列表示例 394 | │ └─一对多JEditable 395 | │ └─JEditable组件示例 396 | │ └─图片拖拽排序 397 | │ └─图片翻页 398 | │ └─图片预览 399 | │ └─PDF预览 400 | │ └─分屏功能 401 | │─封装通用组件 402 | │ ├─行编辑表格JEditableTable 403 | │ └─省略显示组件 404 | │ └─时间控件 405 | │ └─高级查询 406 | │ └─用户选择组件 407 | │ └─报表组件封装 408 | │ └─字典组件 409 | │ └─下拉多选组件 410 | │ └─选人组件 411 | │ └─选部门组件 412 | │ └─通过部门选人组件 413 | │ └─封装曲线、柱状图、饼状图、折线图等等报表的组件(经过封装,使用简单) 414 | │ └─在线code编辑器 415 | │ └─上传文件组件 416 | │ └─验证码组件 417 | │ └─树列表组件 418 | │ └─表单禁用组件 419 | │ └─等等 420 | │─更多页面模板 421 | │ ├─各种高级表单 422 | │ ├─各种列表效果 423 | │ └─结果页面 424 | │ └─异常页面 425 | │ └─个人页面 426 | ├─高级功能 427 | │ ├─系统编码规则 428 | │ ├─提供单点登录CAS集成方案 429 | │ ├─提供APP发布方案 430 | │ ├─集成Websocket消息通知机制 431 | ├─Online在线开发(低代码) 432 | │ ├─Online在线表单 - 功能已开放 433 | │ ├─Online代码生成器 - 功能已开放 434 | │ ├─Online在线报表 - 功能已开放 435 | │ ├─Online在线图表(未开源) 436 | │ ├─Online图表模板配置(未开源) 437 | │ ├─Online布局设计(未开源) 438 | │ ├─多数据源管理 - 功能已开放 439 | ├─积木报表设计器(低代码) 440 | │ ├─打印设计器 441 | │ ├─数据报表设计 442 | │ ├─图形报表设计(支持echart) 443 | │ ├─大屏设计器(未开源) 444 | │─更多商业功能 (未开源) 445 | │ ├─流程设计器 446 | │ ├─表单设计器 447 | ├─大屏设计器 448 | ├─门户设计/仪表盘设计器 449 | │ └─我的任务 450 | │ └─历史流程 451 | │ └─历史流程 452 | │ └─流程实例管理 453 | │ └─流程监听管理 454 | │ └─流程表达式 455 | │ └─我发起的流程 456 | │ └─我的抄送 457 | │ └─流程委派、抄送、跳转 458 | │ └─。。。 459 | │─OA办公组件 (未开源) 460 | │ ├─更多功能 461 | │ └─。。。 462 | └─其他模块 463 | └─更多功能开发中。。 464 | 465 | ``` 466 | 467 | 468 | 469 | 470 | 471 | ### 系统效果 472 | 473 | 474 | 475 | ##### PC端 476 | ![](https://oscimg.oschina.net/oscnet/up-000530d95df337b43089ac77e562494f454.png) 477 | 478 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14155402_AmlV.png "在这里输入图片标题") 479 | 480 | ![](https://oscimg.oschina.net/oscnet/up-9d6f36f251e71a0b515a01323474b03004c.png) 481 | 482 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14160813_KmXS.png "在这里输入图片标题") 483 | 484 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14160935_Nibs.png "在这里输入图片标题") 485 | 486 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14161004_bxQ4.png "在这里输入图片标题") 487 | 488 | ##### 系统交互 489 | ![](https://oscimg.oschina.net/oscnet/up-78b151fc888d4319377bf1cc311fe826871.png) 490 | 491 | ![](https://oscimg.oschina.net/oscnet/up-16c07e000278329b69b228ae3189814b8e9.png) 492 | 493 | 494 | ##### 流程设计 495 | ![](https://oscimg.oschina.net/oscnet/up-981ce174e4fbb48c8a2ce4ccfd7372e2994.png) 496 | 497 | ![输入图片说明](https://static.oschina.net/uploads/img/201907/05165142_yyQ7.png "在这里输入图片标题") 498 | 499 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14160917_9Ftz.png "在这里输入图片标题") 500 | 501 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14160633_u59G.png "在这里输入图片标题") 502 | 503 | ##### 简版流程设计 504 | 505 | ![](https://oscimg.oschina.net/oscnet/up-1dc0d052149ec675f3e4fad632b82b48add.png) 506 | 507 | ![](https://oscimg.oschina.net/oscnet/up-de31bc2f9d9b8332c554b0954cc73d79593.png) 508 | 509 | ![](https://oscimg.oschina.net/oscnet/up-7f83b25159663686d67ed080eb16068c3b4.png) 510 | 511 | ##### 仪表盘设计器 512 | ![](https://oscimg.oschina.net/oscnet/up-9c9d41288c31398d76b390bdd400f13a582.png) 513 | 514 | ![](https://oscimg.oschina.net/oscnet/up-fad98d42b2cf92f92a903c9cff7579f18ec.png) 515 | 516 | ##### 报表设计器 517 | ![](https://oscimg.oschina.net/oscnet/up-64648de000851f15f6c7b9573d107ebb5f8.png) 518 | 519 | ![](https://oscimg.oschina.net/oscnet/up-fa52b44445db281c51d3f267dce7450d21b.gif) 520 | 521 | ![](https://oscimg.oschina.net/oscnet/up-68a19149d640f1646c8ed89ed4375e3326c.png) 522 | 523 | ![](https://oscimg.oschina.net/oscnet/up-f7e9cb2e3740f2d19ff63b40ec2dd554f96.png) 524 | 525 | ##### 表单设计器 526 | ![](https://oscimg.oschina.net/oscnet/up-5f8cb657615714b02190b355e59f60c5937.png) 527 | 528 | ![](https://oscimg.oschina.net/oscnet/up-d9659b2f324e33218476ec98c9b400e6508.png) 529 | 530 | ![](https://oscimg.oschina.net/oscnet/up-4868615395272d3206dbb960ade02dbc291.png) 531 | 532 | ##### 大屏设计器 533 | ![](https://oscimg.oschina.net/oscnet/up-402a6034124474bfef8dfc5b4b2bac1ce5c.png) 534 | 535 | ![](https://oscimg.oschina.net/oscnet/up-6f7ba2e2ebbeea0d203db8d69fd87644c9f.png) 536 | 537 | ![](https://oscimg.oschina.net/oscnet/up-ee8d34f318da466b8a6070a6e3111d12ce7.png) 538 | 539 | ![](https://oscimg.oschina.net/oscnet/up-6b81781b43086819049c4421206810667c5.png) 540 | 541 | ##### UNIAPP效果 542 | 543 | ![](https://oscimg.oschina.net/oscnet/up-aac943fbd26561879c57a41f7a406edf274.png) 544 | 545 | ![](https://oscimg.oschina.net/oscnet/up-9a44ba2e82b09c750629d12fafd7f60f553.png) 546 | 547 | ##### 零代码应用 548 | ![](https://oscimg.oschina.net/oscnet/up-4be29ae761b2615c8c54b3f668cd8432d9b.png) 549 | 550 | ![](https://oscimg.oschina.net/oscnet/up-787e76bc24b38ecc7ed19f338808d128255.png) 551 | 552 | ![](https://oscimg.oschina.net/oscnet/up-99d24a236c483362868523ad0d90f611487.png) 553 | 554 | ![](https://oscimg.oschina.net/oscnet/up-339a0f29d10449abc7724e3bcda802761c1.png) 555 | 556 | ![](https://oscimg.oschina.net/oscnet/up-b356670cdc14c609958c7619a537397c4b9.png) 557 | 558 | ##### 手机端 559 | ![](https://oscimg.oschina.net/oscnet/da543c5d0d57baab0cecaa4670c8b68c521.jpg) 560 | ![](https://oscimg.oschina.net/oscnet/fda4bd82cab9d682de1c1fbf2060bf14fa6.jpg) 561 | 562 | ##### PAD端 563 | ![](https://oscimg.oschina.net/oscnet/e90fef970a8c33790ab03ffd6c4c7cec225.jpg) 564 | ![](https://oscimg.oschina.net/oscnet/d78218803a9e856a0aa82b45efc49849a0c.jpg) 565 | ![](https://oscimg.oschina.net/oscnet/59c23b230f52384e588ee16309b44fa20de.jpg) 566 | 567 | 568 | ##### 图表示例 569 | ![](https://oscimg.oschina.net/oscnet/up-218bc6a1669496b241ebb23506440c0083e.png) 570 | 571 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14160834_Lo23.png "在这里输入图片标题") 572 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14160842_QK7B.png "在这里输入图片标题") 573 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14160849_GBm5.png "在这里输入图片标题") 574 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14160858_6RAM.png "在这里输入图片标题") 575 | 576 | ##### 在线接口文档 577 | ![输入图片说明](https://static.oschina.net/uploads/img/201908/27095258_M2Xq.png "在这里输入图片标题") 578 | ![输入图片说明](https://static.oschina.net/uploads/img/201904/14160957_hN3X.png "在这里输入图片标题") 579 | ## 捐赠 580 | 581 | 如果觉得还不错,请作者喝杯咖啡吧 ☺ 582 | 583 | ![](https://static.oschina.net/uploads/img/201903/08155608_0EFX.png) -------------------------------------------------------------------------------- /doc/mcms/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012 铭飞科技 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /doc/msp/README.md: -------------------------------------------------------------------------------- 1 | # microservices-platform 2 | 3 | 基于以下开源项目改造: 4 | - [microservices-platform](https://gitee.com/zlt2000/microservices-platform) 5 | - [open-capacity-platform](https://gitee.com/owenwangwen/open-capacity-platform) 6 | - [open-cloud/open-cloud-pro](https://github.com/liuyadu/open-cloud) 7 | 8 | ## 1. 项目介绍 9 | 10 | * 前后端分离的企业级微服务架构 11 | * 主要针对解决微服务和业务开发时常见的**非功能性需求** 12 | * 深度定制`Spring Security`真正实现了基于`RBAC`、`jwt`和`oauth2`的无状态统一权限认证的解决方案 13 | * 提供应用管理,方便第三方系统接入,**支持多租户(应用隔离)** 14 | * 引入组件化的思想实现高内聚低耦合并且高度可配置化 15 | * 注重代码规范,严格控制包依赖,每个工程基本都是最小依赖 16 | 17 | ### 快速启动 18 | 19 | 必要启动模块 20 | - 启动认证中心uaa 21 | - 运行 UaaServerApp 22 | - 启动用户中心bussiness/user-center 23 | - 运行 UserCenterApp 24 | - 启动网关gateway/sc-gateway 25 | - 运行 sc-gateway的org.openea.SCGatewayApp 26 | - 启动前端工程web/back-web 27 | - 运行 BackWebApplication 28 | http://127.0.0.1:8066 29 | 30 | - Demo账号 31 | * 账号密码:admin/admin 32 | * 配置中心:nacos/nacos 33 | * APM监控账号密码:admin/admin 34 | * Grafana账号:zlt/zlt123 35 | * txlcn事务管理器密码:admin 36 | * 任务管理账号密码:admin/123456 37 | * Sentinel:sentinel/sentinel 38 | 39 | - 单点登录demo (demo/sso-demo) 40 | * **ss-sso**:使用springSecurity来实现自动单点登录,非前后端分离 41 | * **web-sso**:前后端分离的单点登录 42 | 43 | ## 2. 项目总体架构图 44 | ![mark](doc/img/zlt-arch.jpg) 45 | 46 |   47 | 48 | ## 3. 功能介绍 49 | ![mark](doc/img/zlt-func.jpg) 50 | 51 |   52 | 53 | ## 4. 模块说明 54 | 55 | ```lua 56 | ea-msp(MicroService Platform) -- 父项目,公共依赖 57 | │ ├─business -- 业务模块一级工程 58 | │ │ ├─user-center -- 用户中心[7000] 59 | │ │ ├─file-center -- 文件中心[5000] 60 | │ │ ├─code-generator -- 代码生成器[7300] 61 | │ │ ├─search-center -- 搜索中心 62 | │ │ │ ├─search-client -- 搜索中心客户端 63 | │ │ │ ├─search-server -- 搜索中心服务端[7100] 64 | │ │─commons -- 通用工具一级工程 65 | │ │ ├─auth-client-spring-boot-starter -- 封装spring security client端的通用操作逻辑 66 | │ │ ├─common-core -- 封装通用操作逻辑 67 | │ │ ├─common-spring-boot-starter -- 封装通用操作逻辑 68 | │ │ ├─db-spring-boot-starter -- 封装数据库通用操作逻辑 69 | │ │ ├─log-spring-boot-starter -- 封装log通用操作逻辑 70 | │ │ ├─redis-spring-boot-starter -- 封装Redis通用操作逻辑 71 | │ │ ├─ribbon-spring-boot-starter -- 封装Ribbon和Feign的通用操作逻辑 72 | │ │ ├─sentinel-spring-boot-starter -- 封装Sentinel的通用操作逻辑 73 | │ │ ├─swagger2-spring-boot-starter -- 封装Swagger通用操作逻辑 74 | │ ├─config -- 配置中心 75 | │ ├─doc -- 项目文档 76 | │ ├─gateway -- api网关一级工程 77 | │ │ ├─sc-gateway -- spring-cloud-gateway[9900] 78 | │ │ ├─zuul-gateway -- netflix-zuul[9900] 79 | │ ├─job -- 分布式任务调度一级工程 80 | │ │ ├─job-admin -- 任务管理器[8081] 81 | │ │ ├─job-core -- 任务调度核心代码 82 | │ │ ├─job-executor-samples -- 任务执行者executor样例[8082] 83 | │ ├─monitor -- 监控一级工程 84 | │ │ ├─sc-admin -- 应用监控[6500] 85 | │ │ ├─log-center -- 日志中心[6200] 86 | │ ├─uaa -- spring-security认证中心[8000] 87 | │ ├─register -- 注册中心Nacos[8848] 88 | │ ├─web -- 前端一级工程 89 | │ │ ├─back-web -- 后台前端[8066] 90 | │ ├─transaction -- 事务一级工程 91 | │ │ ├─txlcn-tm -- tx-lcn事务管理器[7970] 92 | │ ├─demo -- demo一级工程 93 | │ │ ├─txlcn-demo -- txlcn分布式事务demo 94 | │ │ ├─seata-demo -- seata分布式事务demo 95 | │ │ ├─sharding-jdbc-demo -- sharding-jdbc分库分表demo 96 | │ │ ├─rocketmq-demo -- rocketmq和mq事务demo 97 | │ │ ├─sso-demo -- 单点登录demo 98 | ``` 99 | 100 | 5. 相关知识 101 | 102 | - ZLT微服务框架文档 103 | https://www.kancloud.cn/zlt2000/microservices-platform/919414 104 | -------------------------------------------------------------------------------- /doc/msp/zlt/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, and 10 | distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by the copyright 13 | owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all other entities 16 | that control, are controlled by, or are under common control with that entity. 17 | For the purposes of this definition, "control" means (i) the power, direct or 18 | indirect, to cause the direction or management of such entity, whether by 19 | contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the 20 | outstanding shares, or (iii) beneficial ownership of such entity. 21 | 22 | "You" (or "Your") shall mean an individual or Legal Entity exercising 23 | permissions granted by this License. 24 | 25 | "Source" form shall mean the preferred form for making modifications, including 26 | but not limited to software source code, documentation source, and configuration 27 | files. 28 | 29 | "Object" form shall mean any form resulting from mechanical transformation or 30 | translation of a Source form, including but not limited to compiled object code, 31 | generated documentation, and conversions to other media types. 32 | 33 | "Work" shall mean the work of authorship, whether in Source or Object form, made 34 | available under the License, as indicated by a copyright notice that is included 35 | in or attached to the work (an example is provided in the Appendix below). 36 | 37 | "Derivative Works" shall mean any work, whether in Source or Object form, that 38 | is based on (or derived from) the Work and for which the editorial revisions, 39 | annotations, elaborations, or other modifications represent, as a whole, an 40 | original work of authorship. For the purposes of this License, Derivative Works 41 | shall not include works that remain separable from, or merely link (or bind by 42 | name) to the interfaces of, the Work and Derivative Works thereof. 43 | 44 | "Contribution" shall mean any work of authorship, including the original version 45 | of the Work and any modifications or additions to that Work or Derivative Works 46 | thereof, that is intentionally submitted to Licensor for inclusion in the Work 47 | by the copyright owner or by an individual or Legal Entity authorized to submit 48 | on behalf of the copyright owner. For the purposes of this definition, 49 | "submitted" means any form of electronic, verbal, or written communication sent 50 | to the Licensor or its representatives, including but not limited to 51 | communication on electronic mailing lists, source code control systems, and 52 | issue tracking systems that are managed by, or on behalf of, the Licensor for 53 | the purpose of discussing and improving the Work, but excluding communication 54 | that is conspicuously marked or otherwise designated in writing by the copyright 55 | owner as "Not a Contribution." 56 | 57 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf 58 | of whom a Contribution has been received by Licensor and subsequently 59 | incorporated within the Work. 60 | 61 | 2. Grant of Copyright License. 62 | 63 | Subject to the terms and conditions of this License, each Contributor hereby 64 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, 65 | irrevocable copyright license to reproduce, prepare Derivative Works of, 66 | publicly display, publicly perform, sublicense, and distribute the Work and such 67 | Derivative Works in Source or Object form. 68 | 69 | 3. Grant of Patent License. 70 | 71 | Subject to the terms and conditions of this License, each Contributor hereby 72 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, 73 | irrevocable (except as stated in this section) patent license to make, have 74 | made, use, offer to sell, sell, import, and otherwise transfer the Work, where 75 | such license applies only to those patent claims licensable by such Contributor 76 | that are necessarily infringed by their Contribution(s) alone or by combination 77 | of their Contribution(s) with the Work to which such Contribution(s) was 78 | submitted. If You institute patent litigation against any entity (including a 79 | cross-claim or counterclaim in a lawsuit) alleging that the Work or a 80 | Contribution incorporated within the Work constitutes direct or contributory 81 | patent infringement, then any patent licenses granted to You under this License 82 | for that Work shall terminate as of the date such litigation is filed. 83 | 84 | 4. Redistribution. 85 | 86 | You may reproduce and distribute copies of the Work or Derivative Works thereof 87 | in any medium, with or without modifications, and in Source or Object form, 88 | provided that You meet the following conditions: 89 | 90 | You must give any other recipients of the Work or Derivative Works a copy of 91 | this License; and 92 | You must cause any modified files to carry prominent notices stating that You 93 | changed the files; and 94 | You must retain, in the Source form of any Derivative Works that You distribute, 95 | all copyright, patent, trademark, and attribution notices from the Source form 96 | of the Work, excluding those notices that do not pertain to any part of the 97 | Derivative Works; and 98 | If the Work includes a "NOTICE" text file as part of its distribution, then any 99 | Derivative Works that You distribute must include a readable copy of the 100 | attribution notices contained within such NOTICE file, excluding those notices 101 | that do not pertain to any part of the Derivative Works, in at least one of the 102 | following places: within a NOTICE text file distributed as part of the 103 | Derivative Works; within the Source form or documentation, if provided along 104 | with the Derivative Works; or, within a display generated by the Derivative 105 | Works, if and wherever such third-party notices normally appear. The contents of 106 | the NOTICE file are for informational purposes only and do not modify the 107 | License. You may add Your own attribution notices within Derivative Works that 108 | You distribute, alongside or as an addendum to the NOTICE text from the Work, 109 | provided that such additional attribution notices cannot be construed as 110 | modifying the License. 111 | You may add Your own copyright statement to Your modifications and may provide 112 | additional or different license terms and conditions for use, reproduction, or 113 | distribution of Your modifications, or for any such Derivative Works as a whole, 114 | provided Your use, reproduction, and distribution of the Work otherwise complies 115 | with the conditions stated in this License. 116 | 117 | 5. Submission of Contributions. 118 | 119 | Unless You explicitly state otherwise, any Contribution intentionally submitted 120 | for inclusion in the Work by You to the Licensor shall be under the terms and 121 | conditions of this License, without any additional terms or conditions. 122 | Notwithstanding the above, nothing herein shall supersede or modify the terms of 123 | any separate license agreement you may have executed with Licensor regarding 124 | such Contributions. 125 | 126 | 6. Trademarks. 127 | 128 | This License does not grant permission to use the trade names, trademarks, 129 | service marks, or product names of the Licensor, except as required for 130 | reasonable and customary use in describing the origin of the Work and 131 | reproducing the content of the NOTICE file. 132 | 133 | 7. Disclaimer of Warranty. 134 | 135 | Unless required by applicable law or agreed to in writing, Licensor provides the 136 | Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, 137 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, 138 | including, without limitation, any warranties or conditions of TITLE, 139 | NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are 140 | solely responsible for determining the appropriateness of using or 141 | redistributing the Work and assume any risks associated with Your exercise of 142 | permissions under this License. 143 | 144 | 8. Limitation of Liability. 145 | 146 | In no event and under no legal theory, whether in tort (including negligence), 147 | contract, or otherwise, unless required by applicable law (such as deliberate 148 | and grossly negligent acts) or agreed to in writing, shall any Contributor be 149 | liable to You for damages, including any direct, indirect, special, incidental, 150 | or consequential damages of any character arising as a result of this License or 151 | out of the use or inability to use the Work (including but not limited to 152 | damages for loss of goodwill, work stoppage, computer failure or malfunction, or 153 | any and all other commercial damages or losses), even if such Contributor has 154 | been advised of the possibility of such damages. 155 | 156 | 9. Accepting Warranty or Additional Liability. 157 | 158 | While redistributing the Work or Derivative Works thereof, You may choose to 159 | offer, and charge a fee for, acceptance of support, warranty, indemnity, or 160 | other liability obligations and/or rights consistent with this License. However, 161 | in accepting such obligations, You may act only on Your own behalf and on Your 162 | sole responsibility, not on behalf of any other Contributor, and only if You 163 | agree to indemnify, defend, and hold each Contributor harmless for any liability 164 | incurred by, or claims asserted against, such Contributor by reason of your 165 | accepting any such warranty or additional liability. 166 | 167 | END OF TERMS AND CONDITIONS 168 | 169 | APPENDIX: How to apply the Apache License to your work 170 | 171 | To apply the Apache License to your work, attach the following boilerplate 172 | notice, with the fields enclosed by brackets "{}" replaced with your own 173 | identifying information. (Don't include the brackets!) The text should be 174 | enclosed in the appropriate comment syntax for the file format. We also 175 | recommend that a file or class name and description of purpose be included on 176 | the same "printed page" as the copyright notice for easier identification within 177 | third-party archives. 178 | 179 | Copyright 2019 zlt2000 180 | 181 | Licensed under the Apache License, Version 2.0 (the "License"); 182 | you may not use this file except in compliance with the License. 183 | You may obtain a copy of the License at 184 | 185 | http://www.apache.org/licenses/LICENSE-2.0 186 | 187 | Unless required by applicable law or agreed to in writing, software 188 | distributed under the License is distributed on an "AS IS" BASIS, 189 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 190 | See the License for the specific language governing permissions and 191 | limitations under the License. -------------------------------------------------------------------------------- /doc/msp/zlt/README.md: -------------------------------------------------------------------------------- 1 | # zlt-microservices-platform 2 | 3 |

4 | Downloads 5 | Downloads 6 | Downloads 7 | Downloads 8 | Downloads 9 | Downloads 10 | 11 | star 12 | 13 | 14 | github star 15 | 16 |

17 | 18 | 19 | 20 | 21 | 22 | ## 如果您觉得有帮助,请点右上角 "Star" 支持一下谢谢 23 |   24 | ## 1. 总体架构图 25 | ![mark](https://gitee.com/zlt2000/images/raw/master/springcloud%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E5%9B%BE.jpg) 26 | 27 |   28 | ## 2. 功能介绍 29 | ![mark](https://gitee.com/zlt2000/images/raw/master/ZLT-MP%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%B9%B3%E5%8F%B0%E5%8A%9F%E8%83%BD%E5%9B%BE.jpg) 30 | 31 |   32 | ## 3. 项目介绍 33 | * **技术交流群** 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 |
交流三群
交流三群
42 | 43 | 44 | * **详细在线文档** :https://www.kancloud.cn/zlt2000/microservices-platform/919418 45 | * **[项目更新日志](https://www.kancloud.cn/zlt2000/microservices-platform/936235)** 46 | * **[文档更新日志](https://www.kancloud.cn/zlt2000/microservices-platform/936236)** 47 | * **演示环境地址**: [http://zlt2000.cn](http://zlt2000.cn/) 48 | * 账号密码:admin/admin 49 | * APM监控账号密码:admin/admin 50 | * Grafana账号:zlt/zlt123 51 | * 任务管理账号密码:admin/123456 52 | * **演示环境有全方位的监控示例:日志系统 + APM系统 + GPE系统** 53 | * Gitee地址:https://gitee.com/zlt2000/microservices-platform 54 | * Github地址:https://github.com/zlt2000/microservices-platform 55 | * 前后端分离的企业级微服务架构 56 | * 主要针对解决微服务和业务开发时常见的**非功能性需求** 57 | * 深度定制`Spring Security`真正实现了基于`RBAC`、`jwt`和`oauth2`的无状态统一权限认证的解决方案 58 | * 提供应用管理,方便第三方系统接入,**支持多租户(应用隔离)** 59 | * 引入组件化的思想实现高内聚低耦合并且高度可配置化 60 | * 注重代码规范,严格控制包依赖,每个工程基本都是最小依赖 61 | * 非常适合学习和企业中使用 62 | >重构于开源项目OCP&cp:https://gitee.com/owenwangwen/open-capacity-platform 63 | 64 |   65 | ## 4. 模块说明 66 | ```lua 67 | central-platform -- 父项目,公共依赖 68 | │ ├─zlt-business -- 业务模块一级工程 69 | │ │ ├─user-center -- 用户中心[7000] 70 | │ │ ├─file-center -- 文件中心[5000] 71 | │ │ ├─code-generator -- 代码生成器[7300] 72 | │ │ ├─search-center -- 搜索中心 73 | │ │ │ ├─search-client -- 搜索中心客户端 74 | │ │ │ ├─search-server -- 搜索中心服务端[7100] 75 | │ │─zlt-commons -- 通用工具一级工程 76 | │ │ ├─zlt-auth-client-spring-boot-starter -- 封装spring security client端的通用操作逻辑 77 | │ │ ├─zlt-common-core -- 封装通用操作逻辑 78 | │ │ ├─zlt-common-spring-boot-starter -- 封装通用操作逻辑 79 | │ │ ├─zlt-db-spring-boot-starter -- 封装数据库通用操作逻辑 80 | │ │ ├─zlt-log-spring-boot-starter -- 封装log通用操作逻辑 81 | │ │ ├─zlt-redis-spring-boot-starter -- 封装Redis通用操作逻辑 82 | │ │ ├─zlt-loadbalancer-spring-boot-starter -- 封装Loadbalancer和Feign的通用操作逻辑 83 | │ │ ├─zlt-sentinel-spring-boot-starter -- 封装Sentinel的通用操作逻辑 84 | │ │ ├─zlt-swagger2-spring-boot-starter -- 封装Swagger通用操作逻辑 85 | │ │ ├─zlt-elasticsearch-spring-boot-starter -- 封装Elasticsearch通用操作逻辑 86 | │ │ ├─zlt-oss-spring-boot-starter -- 封装对象存储通用操作逻辑 87 | │ │ ├─zlt-zookeeper-spring-boot-starter -- 封装Zookeeper通用操作逻辑 88 | │ ├─zlt-config -- 配置中心 89 | │ ├─zlt-doc -- 项目文档 90 | │ ├─zlt-gateway -- api网关一级工程 91 | │ │ ├─sc-gateway -- spring-cloud-gateway[9900] 92 | │ ├─zlt-monitor -- 监控一级工程 93 | │ │ ├─sc-admin -- 应用监控[6500] 94 | │ │ ├─log-center -- 日志中心[7200] 95 | │ ├─zlt-uaa -- spring-security认证中心[8000] 96 | │ ├─zlt-register -- 注册中心Nacos[8848] 97 | │ ├─zlt-web -- 前端一级工程 98 | │ │ ├─layui-web -- layui前端[8066] 99 | │ │ ├─react-web -- react前端[8066] 100 | │ ├─zlt-demo -- demo一级工程 101 | │ │ ├─txlcn-demo -- txlcn分布式事务demo 102 | │ │ ├─seata-demo -- seata分布式事务demo 103 | │ │ ├─sharding-jdbc-demo -- sharding-jdbc分库分表demo 104 | │ │ ├─rocketmq-demo -- rocketmq和mq事务demo 105 | │ │ ├─sso-demo -- 单点登录demo 106 | ``` 107 | 108 | 109 | 110 | 111 | 112 | 113 |
阿里云腾讯云
114 | 115 | 116 | ## 5. 交流反馈 117 | * 有问题先看看 [F&Q](https://www.kancloud.cn/zlt2000/microservices-platform/981382) 中有没有相关的回答 118 | * 欢迎提交`ISSUS`,请写清楚问题的具体原因,重现步骤和环境(上下文) 119 | * 项目/微服务交流请进群: 120 | * 一群:[250883130(已满)](https://shang.qq.com/wpa/qunwpa?idkey=17544199255998bda0d938fb72b08d076c40c52c9904520b76eb5eb0585da71e) 121 | * 二群:[1041797659(已满)](https://shang.qq.com/wpa/qunwpa?idkey=41988facbc02f678942a7ee7ae03122f2ef0a10c948b3d07319f070bfb0d3a98) 122 | * 三群:[512637767](https://qm.qq.com/cgi-bin/qm/qr?k=HntAHTirZwCEjF8PQpjDYkw37Zx5rJg8&jump_from=webapi) 123 | * 个人博客:[https://zlt2000.gitee.io](https://zlt2000.gitee.io) 124 | * 个人邮箱:zltdiablo@163.com 125 | * 个人公众号:[陶陶技术笔记](http://qiniu.zlt2000.cn/blog/20190902/M56cWjw7uNsc.png?imageslim) 126 | * GitChat:[https://gitbook.cn/gitchat/author/5b2362320398d50d7b7ab29e](https://gitbook.cn/gitchat/author/5b2362320398d50d7b7ab29e) 127 | 128 |   129 | ## 6. 截图(点击可大图预览) 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 |
首页用户搜索
日志系统日志链路
server_metricsapplication_metrics
skywalking首页.pngskywalking应用拓扑图
elk任务中心
日志中心02慢查询sql
nacos-discovery应用吞吐量监控
-------------------------------------------------------------------------------- /doc/obpm/README.md: -------------------------------------------------------------------------------- 1 | # Open BPM 2 | ## 概述 3 | 基于开源工作流引擎的BPM套装,整合各种开源项目或组件,实现企业应用快速集成工作流能力。 4 | 5 | 6 | # OpenBPM 应用方案 7 | ## solution 解决方案 8 | 迁移到bpm-quickstart和eap相关的项目 9 | 10 | # OpenBPM 服务接口 11 | 12 | ## starter 13 | * 基于spring-boot封装bpm-starter 14 | * spring自动配置(base/security/sys/wf) 15 | 16 | ## bpm-rest 17 | 基于bpm-start封装bpm-rest应用 18 | 19 | ***bpm-rest***为OpenBPM后端服务应用,可作为工作流平台的后台基础版本。 20 | 21 | ## bpm-allinone 22 | 23 | 快速demo展示(需要安装docker和docker-compose) 24 | ``` 25 | cd openbpm/bpm-allinone 26 | docker-compose up -d 27 | ``` 28 | * web端访问地址 http://localhost:7080 29 | 30 | * mobile端访问地址 http://localhost:7082 31 | 32 | * 后台服务API http://localhost:7080/api/swagger-ui.hmtl 33 | 34 | 用户名和密码为admin/admin 35 | 36 | 37 | # OpenBPM 平台模块 38 | 39 | ## bpm-common 通用功能 40 | * base 通用技术组件,包含api,core, rest, db。 41 | 42 | ## bpm-core 核心功能 43 | bpm包含业务对象bus,表单form和流程wf 44 | * bus 业务对象模块 45 | * form 表单模块 46 | * wf 流程模块 47 | 48 | ## bpm-support 支持功能 49 | support包含base, auth,org以及sys 50 | * org 内建组织权限功能 51 | * sys 内建后台基础服务功能 52 | 53 | ## bpm-ui 前端UI相关功能 54 | ui包含web前端explorer-ng和web打包工程以及mobile-vue 移动端APP 55 | 56 | * explorer BPM Web端UI 57 | 58 | 基于VUE和angular(activiti model采用angular) 59 | 60 | * mobile BPM移动端UI 61 | 62 | 基于VUE开发 63 | 64 | 65 | # 开发及调试 66 | 67 | ## bpm-dev 开发调试 68 | 69 | 启动bpm-rest服务 70 | 71 | ``` 72 | mvn clean install 73 | cd openbpm/bpm-rest 74 | mvn spring-boot:run 75 | ``` 76 | 查看BPM Rest提供服务API 77 | 78 | http://localhost:8080/api/swagger-ui.html 79 | 80 | 前端开发调试 81 | ``` 82 | cd bpm-ui/explorer-ng 83 | ## 需要后端服务地址为 http://localhost:8080/ 84 | npm install 85 | npm run dev 86 | ``` 87 | http://localhost:8001/ 88 | 89 | 90 | # 参考项目 refer 91 | 参考众多开源项目实现,一并表示感谢,部分项目列出如下: 92 | * activiti 开源工作流引擎 93 | https://github.com/Activiti/Activiti 94 | 95 | * spring boot 后端基础框架 96 | https://github.com/spring-projects/spring-boot 97 | 98 | * jeeSpringCloud 企业开发平台(包含基于Activiti工作流) 99 | https://gitee.com/JeeHuangBingGui/jeeSpringCloud 100 | 101 | * agile bpm 企业工作流管理(基于Activiti) 102 | https://github.com/AgileBPM/agile-bpm-basic 103 | 104 | * sz BPM 企业工作流管理(基于Activiti) -------------------------------------------------------------------------------- /doc/yudao/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 ruoyi-vue-pro 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /doc/yudao/README.md: -------------------------------------------------------------------------------- 1 | **严肃声明:现在、未来都不会有商业版本,所有代码全部开源!!** 2 | 3 | **「我喜欢写代码,乐此不疲」** 4 | **「我喜欢做开源,以此为乐」** 5 | 6 | 我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献。 7 | 8 | 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 9 | 10 | ## 🐶 新手必读 11 | 12 | * 演示地址【Vue3 + element-plus】: 13 | * 演示地址【Vue3 + vben(ant-design-vue)】: 14 | * 演示地址【Vue2 + element-ui】: 15 | * 启动文档: 16 | * 视频教程: 17 | 18 | ## 🐯 平台简介 19 | 20 | **芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。 21 | 22 | > 有任何问题,或者想要的功能,可以在 _Issues_ 中提给艿艿。 23 | > 24 | > 😜 给项目点点 Star 吧,这对我们真的很重要! 25 | 26 | ![架构图](https://static.iocoder.cn/ruoyi-vue-pro-architecture.png?imageView2/2/format/webp) 27 | 28 | * 管理后台的电脑端:Vue3 提供 [element-plus](https://gitee.com/eapcode/eap-ui-admin-vue3)、[vben(ant-design-vue)](https://gitee.com/eapcode/eap-ui-admin-vben) 两个版本,Vue2 提供 [element-ui](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/eap-ui-admin) 版本 29 | * 管理后台的移动端:采用 [uni-app](https://github.com/dcloudio/uni-app) 方案,一份代码多终端适配,同时支持 APP、小程序、H5! 30 | * 后端采用 Spring Boot 多模块架构、MySQL + MyBatis Plus、Redis + Redisson 31 | * 数据库可使用 MySQL、Oracle、PostgreSQL、SQL Server、MariaDB、国产达梦 DM、TiDB 等 32 | * 权限认证使用 Spring Security & Token & Redis,支持多终端、多种用户的认证系统,支持 SSO 单点登录 33 | * 支持加载动态权限菜单,按钮级别权限控制,本地缓存提升性能 34 | * 支持 SaaS 多租户,可自定义每个租户的权限,提供透明化的多租户底层封装 35 | * 工作流使用 Flowable,支持动态表单、在线设计流程、会签 / 或签、多种任务分配方式 36 | * 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验 37 | * 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款 38 | * 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务 39 | * 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏 40 | 41 | ## 🐳 项目关系 42 | 43 | ![架构演进](https://static.iocoder.cn/eap-roadmap.png?imageView2/2/format/webp) 44 | 45 | 三个项目的功能对比,可见社区共同整理的 [国产开源项目对比](https://www.yuque.com/xiatian-bsgny/lm0ec1/wqf8mn) 表格。 46 | 47 | ### 后端项目 48 | 49 | 50 | | 项目 | Star | 简介 | 51 | |-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------| 52 | | [ruoyi-vue-pro](https://gitee.com/zhijiantianya/ruoyi-vue-pro) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro) | 基于 Spring Boot 多模块架构 | 53 | | [eap-cloud](https://gitee.com/zhijiantianya/eap-cloud) | [![Gitee star](https://gitee.com/zhijiantianya/eap-cloud/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/eap-cloud) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/eap-cloud.svg?style=social&label=Stars)](https://github.com/YunaiV/eap-cloud) | 基于 Spring Cloud 微服务架构 | 54 | | [Spring-Boot-Labs](https://gitee.com/eapcode/SpringBoot-Labs) | [![Gitee star](https://gitee.com/eapcode/SpringBoot-Labs/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/eap-cloud) [![GitHub stars](https://img.shields.io/github/stars/eapcode/SpringBoot-Labs.svg?style=social&label=Stars)](https://github.com/eapcode/SpringBoot-Labs) | 系统学习 Spring Boot & Cloud 专栏 | 55 | 56 | ### 前端项目 57 | 58 | | 项目 | Star | 简介 | 59 | |----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------| 60 | | [eap-ui-admin-vue3](https://gitee.com/eapcode/eap-ui-admin-vue3) | [![Gitee star](https://gitee.com/eapcode/eap-ui-admin-vue3/badge/star.svg?theme=white)](https://gitee.com/eapcode/eap-ui-admin-vue3) [![GitHub stars](https://img.shields.io/github/stars/eapcode/eap-ui-admin-vue3.svg?style=social&label=Stars)](https://github.com/eapcode/eap-ui-admin-vue3) | 基于 Vue3 + element-plus 实现的管理后台 | 61 | | [eap-ui-admin-vben](https://gitee.com/eapcode/eap-ui-admin-vben) | [![Gitee star](https://gitee.com/eapcode/eap-ui-admin-vben/badge/star.svg?theme=white)](https://gitee.com/eapcode/eap-ui-admin-vben) [![GitHub stars](https://img.shields.io/github/stars/eapcode/eap-ui-admin-vben.svg?style=social&label=Stars)](https://github.com/eapcode/eap-ui-admin-vben) | 基于 Vue3 + vben(ant-design-vue) 实现的管理后台 | 62 | | [eap-ui-admin](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/eap-ui-admin) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/eap-ui-admin) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro/tree/master/eap-ui-admin) | 基于 Vue2 + element-ui 实现的管理后台 | 63 | | [eap-ui-admin-uniapp](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/eap-ui-admin-uniapp) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/eap-ui-admin-uniapp) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro/tree/master/eap-ui-admin-uniapp) | 基于 uni-app + uni-ui 实现的管理后台的小程序 | 64 | | [eap-ui-go-view](https://gitee.com/eapcode/eap-ui-go-view) | [![Gitee star](https://gitee.com/eapcode/eap-ui-go-view/badge/star.svg?theme=white)](https://gitee.com/eapcode/eap-ui-go-view) [![GitHub stars](https://img.shields.io/github/stars/eapcode/eap-ui-go-view.svg?style=social&label=Stars)](https://github.com/eapcode/eap-ui-go-view) | 基于 Vue3 + naive-ui 实现的大屏报表 | 65 | | [eap-ui-app](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/eap-ui-app) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/eap-ui-app) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro/tree/master/eap-ui-app) | 基于 uni-app + uview 实现的用户 App | 66 | 67 | ## 🐰 分支说明 68 | 69 | | | JDK 8 完整版 | JDK 8 精简版 | JDK 17 完整版 | 70 | |-------|-----------------------------------------------------------|--------------------------------------------------------------------|-----------------------------------------------------------------------------| 71 | | 分支 | [`master`](https://gitee.com/zhijiantianya/ruoyi-vue-pro) | [`mini`](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/mini/) | [`boot-dev`](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/boot3-dev/) | 72 | | 说明 | 包括所有功能 | 只保留核心功能 | 适配 Spring Boot 3.X | 73 | | 系统功能 | √ | √ | √ | 74 | | 基础设施 | √ | √ | √ | 75 | | 会员中心 | √ | √ | √ | 76 | | 工作流程 | √ | x | 适配中 | 77 | | 数据报表 | √ | x | 适配中 | 78 | | 商城系统 | √ | x | √ | 79 | | 微信公众号 | √ | x | √ | 80 | 81 | ## 😎 开源协议 82 | 83 | **为什么推荐使用本项目?** 84 | 85 | ① 本项目采用比 Apache 2.0 更宽松的 [MIT License](https://gitee.com/zhijiantianya/ruoyi-vue-pro/blob/master/LICENSE) 开源协议,个人与企业可 100% 免费使用,不用保留类作者、Copyright 信息。 86 | 87 | ② 代码全部开源,不会像其他项目一样,只开源部分代码,让你无法了解整个项目的架构设计。[国产开源项目对比](https://www.yuque.com/xiatian-bsgny/lm0ec1/wqf8mn) 88 | 89 | ![开源项目对比](https://static.iocoder.cn/project-vs.png?imageView2/2/format/webp/w/1280) 90 | 91 | ③ 代码整洁、架构整洁,遵循《阿里巴巴 Java 开发手册》规范,代码注释详细,57000 行 Java 代码,22000 行代码注释。 92 | 93 | ## 🤝 项目外包 94 | 95 | 我们也是接外包滴,如果你有项目想要外包,可以微信联系【**Aix9975**】。 96 | 97 | 团队包含专业的项目经理、架构师、前端工程师、后端工程师、测试工程师、运维工程师,可以提供全流程的外包服务。 98 | 99 | 项目可以是商城、SCRM 系统、OA 系统、物流系统、ERP 系统、CMS 系统、HIS 系统、支付系统、IM 聊天、微信公众号、微信小程序等等。 100 | 101 | ## 🐼 内置功能 102 | 103 | 系统内置多种多种业务功能,可以用于快速你的业务系统: 104 | 105 | ![功能分层](https://static.iocoder.cn/ruoyi-vue-pro-biz.png) 106 | 107 | * 系统功能 108 | * 基础设施 109 | * 工作流程 110 | * 支付系统 111 | * 会员中心 112 | * 数据报表 113 | * 商城系统 114 | * 微信公众号 115 | 116 | > 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面。 117 | > 118 | > * 额外新增的功能,我们使用 🚀 标记。 119 | > * 重新实现的功能,我们使用 ⭐️ 标记。 120 | 121 | 🙂 所有功能,都通过 **单元测试** 保证高质量。 122 | 123 | ### 系统功能 124 | 125 | | | 功能 | 描述 | 126 | |-----|-------|---------------------------------| 127 | | | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 | 128 | | ⭐️ | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 | 129 | | | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | 130 | | | 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能 | 131 | | | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 | 132 | | | 岗位管理 | 配置系统用户所属担任职务 | 133 | | 🚀 | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 | 134 | | 🚀 | 租户套餐 | 配置租户套餐,自定每个租户的菜单、操作、按钮的权限 | 135 | | | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | 136 | | 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、腾讯云等主流短信平台 | 137 | | 🚀 | 邮件管理 | 邮箱账号、邮件模版、邮件发送日志,支持所有邮件平台 | 138 | | 🚀 | 站内信 | 系统内的消息通知,提供站内信模版、站内信消息 | 139 | | 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 | 140 | | ⭐️ | 登录日志 | 系统登录日志记录查询,包含登录异常 | 141 | | 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 | 142 | | | 通知公告 | 系统通知公告信息发布维护 | 143 | | 🚀 | 敏感词 | 配置系统敏感词,支持标签分组 | 144 | | 🚀 | 应用管理 | 管理 SSO 单点登录的应用,支持多种 OAuth2 授权方式 | 145 | | 🚀 | 地区管理 | 展示省份、城市、区镇等城市信息,支持 IP 对应城市 | 146 | 147 | ### 工作流程 148 | 149 | | | 功能 | 描述 | 150 | |-----|-------|----------------------------------------| 151 | | 🚀 | 流程模型 | 配置工作流的流程模型,支持文件导入与在线设计流程图,提供 7 种任务分配规则 | 152 | | 🚀 | 流程表单 | 拖动表单元素生成相应的工作流表单,覆盖 Element UI 所有的表单组件 | 153 | | 🚀 | 用户分组 | 自定义用户分组,可用于工作流的审批分组 | 154 | | 🚀 | 我的流程 | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线 | 155 | | 🚀 | 待办任务 | 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作 | 156 | | 🚀 | 已办任务 | 查看自己【已】审批的工作任务,未来会支持回退操作 | 157 | | 🚀 | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 | 158 | 159 | ### 支付系统 160 | 161 | | | 功能 | 描述 | 162 | |-----|------|---------------------------| 163 | | 🚀 | 商户信息 | 管理商户信息,支持 Saas 场景下的多商户功能 | 164 | | 🚀 | 应用信息 | 配置商户的应用信息,对接支付宝、微信等多个支付渠道 | 165 | | 🚀 | 支付订单 | 查看用户发起的支付宝、微信等的【支付】订单 | 166 | | 🚀 | 退款订单 | 查看用户发起的支付宝、微信等的【退款】订单 | 167 | 168 | ps:核心功能已经实现,正在对接微信小程序中... 169 | 170 | ### 基础设施 171 | 172 | | | 功能 | 描述 | 173 | |-----|----------|----------------------------------------------| 174 | | 🚀 | 代码生成 | 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 | 175 | | 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 | 176 | | 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 | 177 | | | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 | 178 | | 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 | 179 | | ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 | 180 | | 🚀 | 文件服务 | 支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等 | 181 | | 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 | 182 | | | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 | 183 | | | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 | 184 | | 🚀 | 消息队列 | 基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费 | 185 | | 🚀 | Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 | 186 | | 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 | 187 | | 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 | 188 | | 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 | 189 | | 🚀 | 幂等组件 | 基于 Redis 实现幂等组件,解决重复请求问题 | 190 | | 🚀 | 服务保障 | 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 | 191 | | 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 | 192 | | 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 | 193 | 194 | ### 数据报表 195 | 196 | | | 功能 | 描述 | 197 | |-----|-------|--------------------| 198 | | 🚀 | 报表设计器 | 支持数据报表、图形报表、打印设计等 | 199 | | 🚀 | 大屏设计器 | 拖拽生成数据大屏,内置几十种图表组件 | 200 | 201 | ### 微信公众号 202 | 203 | | | 功能 | 描述 | 204 | |-----|--------|-------------------------------| 205 | | 🚀 | 账号管理 | 配置接入的微信公众号,可支持多个公众号 | 206 | | 🚀 | 数据统计 | 统计公众号的用户增减、累计用户、消息概况、接口分析等数据 | 207 | | 🚀 | 粉丝管理 | 查看已关注、取关的粉丝列表,可对粉丝进行同步、打标签等操作 | 208 | | 🚀 | 消息管理 | 查看粉丝发送的消息列表,可主动回复粉丝消息 | 209 | | 🚀 | 自动回复 | 自动回复粉丝发送的消息,支持关注回复、消息回复、关键字回复 | 210 | | 🚀 | 标签管理 | 对公众号的标签进行创建、查询、修改、删除等操作 | 211 | | 🚀 | 菜单管理 | 自定义公众号的菜单,也可以从公众号同步菜单 | 212 | | 🚀 | 素材管理 | 管理公众号的图片、语音、视频等素材,支持在线播放语音、视频 | 213 | | 🚀 | 图文草稿箱 | 新增常用的图文素材到草稿箱,可发布到公众号 | 214 | | 🚀 | 图文发表记录 | 查看已发布成功的图文素材,支持删除操作 | 215 | 216 | ### 商城系统 217 | 218 | 建设中... 219 | 220 | ![功能图](http://static.iocoder.cn/mall%20%E5%8A%9F%E8%83%BD%E5%9B%BE-min.png) 221 | 222 | ![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-admin-min.gif) 223 | 224 | ![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-h5-min.gif) 225 | 226 | ### 会员中心 227 | 228 | 和「商城系统」一起开发 229 | 230 | ## 🐨 技术栈 231 | 232 | ### 模块 233 | 234 | | 项目 | 说明 | 235 | |--------------------------------------------------------------------------|--------------------| 236 | | `eap-dependencies` | Maven 依赖版本管理 | 237 | | `eap-framework` | Java 框架拓展 | 238 | | `eap-server` | 管理后台 + 用户 APP 的服务端 | 239 | | `eap-module-system` | 系统功能的 Module 模块 | 240 | | `eap-module-member` | 会员中心的 Module 模块 | 241 | | `eap-module-infra` | 基础设施的 Module 模块 | 242 | | `eap-module-bpm` | 工作流程的 Module 模块 | 243 | | `eap-module-pay` | 支付系统的 Module 模块 | 244 | | `eap-module-mall` | 商城系统的 Module 模块 | 245 | | `eap-module-mp` | 微信公众号的 Module 模块 | 246 | | `eap-module-report` | 大屏报表 Module 模块 | 247 | 248 | ### 框架 249 | 250 | | 框架 | 说明 | 版本 | 学习指南 | 251 | |---------------------------------------------------------------------------------------------|------------------|-------------|----------------------------------------------------------------| 252 | | [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.7.12 | [文档](https://github.com/YunaiV/SpringBoot-Labs) | 253 | | [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 / 8.0+ | | 254 | | [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.16 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?eap) | 255 | | [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.3.1 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?eap) | 256 | | [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.6.1 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?eap) | 257 | | [Redis](https://redis.io/) | key-value 数据库 | 5.0 / 6.0 | | 258 | | [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.18.0 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?eap) | 259 | | [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.24 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?eap) | 260 | | [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.7.6 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?eap) | 261 | | [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.5 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?eap) | 262 | | [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.8.0 | [文档](https://doc.iocoder.cn/bpm/) | 263 | | [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?eap) | 264 | | [Springdoc](https://springdoc.org/) | Swagger 文档 | 1.6.15 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?eap) | 265 | | [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?eap) | 266 | | [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.12.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?eap) | 267 | | [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.7.10 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?eap) | 268 | | [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | | 269 | | [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.5.5.Final | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?eap) | 270 | | [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.18.26 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?eap) | 271 | | [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.8.2 | - | 272 | | [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 4.8.0 | - | 273 | 274 | ## 🐷 演示图 275 | 276 | ### 系统功能 277 | 278 | | 模块 | biu | biu | biu | 279 | |------------|--------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------| 280 | | 登录 & 首页 | ![登录](https://static.iocoder.cn/images/ruoyi-vue-pro/登录.jpg?imageView2/2/format/webp/w/1280) | ![首页](https://static.iocoder.cn/images/ruoyi-vue-pro/首页.jpg?imageView2/2/format/webp/w/1280) | ![个人中心](https://static.iocoder.cn/images/ruoyi-vue-pro/个人中心.jpg?imageView2/2/format/webp/w/1280) | 281 | | 用户 & 应用 | ![用户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/用户管理.jpg?imageView2/2/format/webp/w/1280) | ![令牌管理](https://static.iocoder.cn/images/ruoyi-vue-pro/令牌管理.jpg?imageView2/2/format/webp/w/1280) | ![应用管理](https://static.iocoder.cn/images/ruoyi-vue-pro/应用管理.jpg?imageView2/2/format/webp/w/1280) | 282 | | 租户 & 套餐 | ![租户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/租户管理.jpg?imageView2/2/format/webp/w/1280) | ![租户套餐](https://static.iocoder.cn/images/ruoyi-vue-pro/租户套餐.png) | - | 283 | | 部门 & 岗位 | ![部门管理](https://static.iocoder.cn/images/ruoyi-vue-pro/部门管理.jpg?imageView2/2/format/webp/w/1280) | ![岗位管理](https://static.iocoder.cn/images/ruoyi-vue-pro/岗位管理.jpg?imageView2/2/format/webp/w/1280) | - | 284 | | 菜单 & 角色 | ![菜单管理](https://static.iocoder.cn/images/ruoyi-vue-pro/菜单管理.jpg?imageView2/2/format/webp/w/1280) | ![角色管理](https://static.iocoder.cn/images/ruoyi-vue-pro/角色管理.jpg?imageView2/2/format/webp/w/1280) | - | 285 | | 审计日志 | ![操作日志](https://static.iocoder.cn/images/ruoyi-vue-pro/操作日志.jpg?imageView2/2/format/webp/w/1280) | ![登录日志](https://static.iocoder.cn/images/ruoyi-vue-pro/登录日志.jpg?imageView2/2/format/webp/w/1280) | - | 286 | | 短信 | ![短信渠道](https://static.iocoder.cn/images/ruoyi-vue-pro/短信渠道.jpg?imageView2/2/format/webp/w/1280) | ![短信模板](https://static.iocoder.cn/images/ruoyi-vue-pro/短信模板.jpg?imageView2/2/format/webp/w/1280) | ![短信日志](https://static.iocoder.cn/images/ruoyi-vue-pro/短信日志.jpg?imageView2/2/format/webp/w/1280) | 287 | | 字典 & 敏感词 | ![字典类型](https://static.iocoder.cn/images/ruoyi-vue-pro/字典类型.jpg?imageView2/2/format/webp/w/1280) | ![字典数据](https://static.iocoder.cn/images/ruoyi-vue-pro/字典数据.jpg?imageView2/2/format/webp/w/1280) | ![敏感词](https://static.iocoder.cn/images/ruoyi-vue-pro/敏感词.jpg?imageView2/2/format/webp/w/1280) | 288 | | 错误码 & 通知 | ![错误码管理](https://static.iocoder.cn/images/ruoyi-vue-pro/错误码管理.jpg?imageView2/2/format/webp/w/1280) | ![通知公告](https://static.iocoder.cn/images/ruoyi-vue-pro/通知公告.jpg?imageView2/2/format/webp/w/1280) | - | 289 | 290 | ### 工作流程 291 | 292 | | 模块 | biu | biu | biu | 293 | |---------|------------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------| 294 | | 流程模型 | ![流程模型-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-列表.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-设计](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-设计.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-定义](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-定义.jpg?imageView2/2/format/webp/w/1280) | 295 | | 表单 & 分组 | ![流程表单](https://static.iocoder.cn/images/ruoyi-vue-pro/流程表单.jpg?imageView2/2/format/webp/w/1280) | ![用户分组](https://static.iocoder.cn/images/ruoyi-vue-pro/用户分组.jpg?imageView2/2/format/webp/w/1280) | - | 296 | | 我的流程 | ![我的流程-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-列表.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-发起.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-详情.jpg?imageView2/2/format/webp/w/1280) | 297 | | 待办 & 已办 | ![任务列表-审批](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-审批.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-待办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-待办.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-已办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-已办.jpg?imageView2/2/format/webp/w/1280) | 298 | | OA 请假 | ![OA请假-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-列表.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-发起.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-详情.jpg?imageView2/2/format/webp/w/1280) | 299 | 300 | ### 基础设施 301 | 302 | | 模块 | biu | biu | biu | 303 | |---------------|----------------------------------------------------------------------|--------------------------------------------------------------------|------------------------------------------------------------------| 304 | | 代码生成 | ![代码生成](https://static.iocoder.cn/images/ruoyi-vue-pro/代码生成.jpg?imageView2/2/format/webp/w/1280) | ![生成效果](https://static.iocoder.cn/images/ruoyi-vue-pro/生成效果.jpg?imageView2/2/format/webp/w/1280) | - | 305 | | 文档 | ![系统接口](https://static.iocoder.cn/images/ruoyi-vue-pro/系统接口.jpg?imageView2/2/format/webp/w/1280) | ![数据库文档](https://static.iocoder.cn/images/ruoyi-vue-pro/数据库文档.jpg?imageView2/2/format/webp/w/1280) | - | 306 | | 文件 & 配置 | ![文件配置](https://static.iocoder.cn/images/ruoyi-vue-pro/文件配置.jpg?imageView2/2/format/webp/w/1280) | ![文件管理](https://static.iocoder.cn/images/ruoyi-vue-pro/文件管理2.jpg?imageView2/2/format/webp/w/1280) | ![配置管理](https://static.iocoder.cn/images/ruoyi-vue-pro/配置管理.jpg?imageView2/2/format/webp/w/1280) | 307 | | 定时任务 | ![定时任务](https://static.iocoder.cn/images/ruoyi-vue-pro/定时任务.jpg?imageView2/2/format/webp/w/1280) | ![任务日志](https://static.iocoder.cn/images/ruoyi-vue-pro/任务日志.jpg?imageView2/2/format/webp/w/1280) | - | 308 | | API 日志 | ![访问日志](https://static.iocoder.cn/images/ruoyi-vue-pro/访问日志.jpg?imageView2/2/format/webp/w/1280) | ![错误日志](https://static.iocoder.cn/images/ruoyi-vue-pro/错误日志.jpg?imageView2/2/format/webp/w/1280) | - | 309 | | MySQL & Redis | ![MySQL](https://static.iocoder.cn/images/ruoyi-vue-pro/MySQL.jpg?imageView2/2/format/webp/w/1280) | ![Redis](https://static.iocoder.cn/images/ruoyi-vue-pro/Redis.jpg?imageView2/2/format/webp/w/1280) | - | 310 | | 监控平台 | ![Java监控](https://static.iocoder.cn/images/ruoyi-vue-pro/Java监控.jpg?imageView2/2/format/webp/w/1280) | ![链路追踪](https://static.iocoder.cn/images/ruoyi-vue-pro/链路追踪.jpg?imageView2/2/format/webp/w/1280) | ![日志中心](https://static.iocoder.cn/images/ruoyi-vue-pro/日志中心.jpg?imageView2/2/format/webp/w/1280) | 311 | 312 | ### 支付系统 313 | 314 | | 模块 | biu | biu | biu | 315 | |---------|------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------| 316 | | 商家 & 应用 | ![商户信息](https://static.iocoder.cn/images/ruoyi-vue-pro/商户信息.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-列表.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-编辑.jpg?imageView2/2/format/webp/w/1280) | 317 | | 支付 & 退款 | ![支付订单](https://static.iocoder.cn/images/ruoyi-vue-pro/支付订单.jpg?imageView2/2/format/webp/w/1280) | ![退款订单](https://static.iocoder.cn/images/ruoyi-vue-pro/退款订单.jpg?imageView2/2/format/webp/w/1280) | --- | 318 | 319 | ### 数据报表 320 | 321 | | 模块 | biu | biu | biu | 322 | |-------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| 323 | | 报表设计器 | ![数据报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-数据报表.jpg?imageView2/2/format/webp/w/1280) | ![图形报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-图形报表.jpg?imageView2/2/format/webp/w/1280) | ![报表设计器-打印设计](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-打印设计.jpg?imageView2/2/format/webp/w/1280) | 324 | | 大屏设计器 | ![大屏列表](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-列表.jpg?imageView2/2/format/webp/w/1280) | ![大屏预览](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-预览.jpg?imageView2/2/format/webp/w/1280) | ![大屏编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-编辑.jpg?imageView2/2/format/webp/w/1280) | 325 | 326 | ### 移动端(管理后台) 327 | 328 | | biu | biu | biu | 329 | |------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------| 330 | | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/01.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/02.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/03.png?imageView2/2/format/webp) | 331 | | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/04.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/05.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/06.png?imageView2/2/format/webp) | 332 | | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/07.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/08.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/09.png?imageView2/2/format/webp) | 333 | 334 | 目前已经实现登录、我的、工作台、编辑资料、头像修改、密码修改、常见问题、关于我们等基础功能。 335 | -------------------------------------------------------------------------------- /doc/yudao/ruoyi-vue-pro-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eaopen/openea-eap/d9d7a08ac67b96daf77cfde07a4ced6dc8e805cf/doc/yudao/ruoyi-vue-pro-architecture.png -------------------------------------------------------------------------------- /doc/yudao/ruoyi-vue-pro-biz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eaopen/openea-eap/d9d7a08ac67b96daf77cfde07a4ced6dc8e805cf/doc/yudao/ruoyi-vue-pro-biz.png -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot API 接口文档 Swagger 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot Cache 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot Dubbo 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot MyBatis 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot Redis 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot SpringMVC 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot 单元测试 Test 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot 参数校验 Validation 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot 声明式调用 Feign 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot 多数据源(读写分离)入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot 安全框架 Spring Security 入门》.md: -------------------------------------------------------------------------------- 1 | * 芋道 Spring Security 入门: 2 | * Spring Security 基本概念: 3 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Boot 数据库连接池入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/yudao/《芋道 Spring Cloud 声明式调用 Feign 入门》.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /eap-biz-extend/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.openea.eap 8 | eap 9 | ${revision} 10 | 11 | 12 | io.github.eaopen 13 | eap-biz-extend 14 | pom 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /eoa-server/Dockerfile: -------------------------------------------------------------------------------- 1 | #FROM eclipse-temurin:8 as builder 2 | FROM szopen/openjdk:8-jdk-cn as builder 3 | 4 | WORKDIR application 5 | 6 | ARG JAR_FILE=target/*.jar 7 | COPY ${JAR_FILE} application.jar 8 | RUN java -Djarmode=layertools -jar application.jar extract 9 | 10 | #FROM eclipse-temurin:8 11 | FROM szopen/openjdk:8-jdk-cn 12 | 13 | ## 设置 TZ 时区 14 | ENV TZ=Asia/Shanghai 15 | ## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 16 | ENV JAVA_OPTS="-Xms1024m -Xmx4096m -Djava.security.egd=file:/dev/./urandom" 17 | 18 | WORKDIR application 19 | COPY --from=builder application/dependencies/ ./ 20 | COPY --from=builder application/spring-boot-loader/ ./ 21 | #COPY --from=builder application/internal-dependencies/ ./ 22 | COPY --from=builder application/snapshot-dependencies/ ./ 23 | COPY --from=builder application/application/ ./ 24 | 25 | ## 应用参数 26 | ENV ARGS="" 27 | 28 | ## 暴露后端项目的 48080 端口 29 | EXPOSE 48080 30 | 31 | ## 启动后端项目 32 | #CMD java ${JAVA_OPTS} -jar app.jar $ARGS 33 | #ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher","$ARGS"] 34 | CMD java ${JAVA_OPTS} org.springframework.boot.loader.JarLauncher $ARGS 35 | -------------------------------------------------------------------------------- /eoa-server/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | org.openea.eap 7 | eap 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | eoa-server 13 | jar 14 | ${revision} 15 | 16 | ${project.artifactId} 17 | 18 | 后端 Server 的主项目,通过引入需要 eap-module-xxx 的依赖, 19 | 从而实现提供 RESTful API 给 eap-ui-admin、eap-ui-user 等前端项目。 20 | 定制整合企业内部系统的统一入口。 21 | 22 | https://github.com/eaopen/openea-eap 23 | 24 | 25 | 26 | io.github.eaopen 27 | eap-module-system-rest 28 | ${eap.version} 29 | 30 | 31 | 32 | io.github.eaopen 33 | eap-module-infra-rest 34 | ${eap.version} 35 | 36 | 37 | 38 | io.github.eaopen 39 | eap-module-lowcode-rest 40 | ${eap.version} 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | io.github.eaopen 53 | eap-spring-boot-starter-biz-error-code 54 | 55 | 56 | 57 | io.github.eaopen 58 | eap-spring-boot-starter-biz-i18n 59 | 60 | 61 | 62 | 63 | 64 | org.springframework.boot 65 | spring-boot-configuration-processor 66 | true 67 | 68 | 69 | io.github.eaopen 70 | eap-spring-boot-starter-banner 71 | 72 | 73 | 74 | 75 | io.github.eaopen 76 | eap-spring-boot-starter-protection 77 | 78 | 79 | 80 | 81 | 82 | 83 | ${project.artifactId} 84 | 85 | 86 | 87 | org.springframework.boot 88 | spring-boot-maven-plugin 89 | 2.7.14 90 | 91 | true 92 | 93 | 94 | 95 | 96 | repackage 97 | 98 | 99 | 100 | 101 | 102 | org.apache.maven.plugins 103 | maven-deploy-plugin 104 | 2.8.2 105 | 106 | true 107 | 108 | 109 | 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /eoa-server/src/main/java/org/openea/eap/server/EoaServerApplication.java: -------------------------------------------------------------------------------- 1 | package org.openea.eap.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.context.annotation.ComponentScan; 6 | import org.springframework.context.annotation.FilterType; 7 | import org.springframework.scheduling.annotation.EnableAsync; 8 | import org.springframework.web.socket.config.annotation.EnableWebSocket; 9 | 10 | /** 11 | * 项目的启动类 12 | * 13 | */ 14 | @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${eap.info.base-package} 15 | @ComponentScan(basePackages={"org.openea.eap" 16 | //,"org.openbpm", 17 | //,"${eap.info.base-package}.server", "${eap.info.base-package}.module" 18 | }, 19 | excludeFilters={ 20 | @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = { 21 | //org.openbpm.base.autoconfiguration.DataSourceAutoConfiguration.class, 22 | //org.openbpm.base.autoconfiguration.TransactionAdviceConfig.class 23 | }) 24 | }) 25 | @SpringBootApplication() 26 | @EnableAsync 27 | @EnableWebSocket 28 | public class EoaServerApplication { 29 | 30 | public static void main(String[] args) { 31 | 32 | SpringApplication.run(EoaServerApplication.class, args); 33 | // new SpringApplicationBuilder(EoaServerApplication.class) 34 | // .applicationStartup(new BufferingApplicationStartup(20480)) 35 | // .run(args); 36 | 37 | // 参考yudao 38 | // 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /eoa-server/src/main/java/org/openea/eap/server/controller/DefaultController.java: -------------------------------------------------------------------------------- 1 | package org.openea.eap.server.controller; 2 | 3 | import org.springframework.web.bind.annotation.RestController; 4 | 5 | /** 6 | * 默认 Controller,解决部分 module 未开启时的 404 提示。 7 | * 例如说,/bpm/** 路径,工作流 8 | * 9 | */ 10 | @RestController 11 | public class DefaultController { 12 | 13 | // @RequestMapping("/admin-api/bpm/**") 14 | // public CommonResult bpm404() { 15 | // return CommonResult.error(NOT_IMPLEMENTED.getCode(), 16 | // "[工作流模块 eap-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]"); 17 | // } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /eoa-server/src/main/resources/application-dev.yaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | --- #################### 数据库相关配置 #################### 4 | 5 | spring: 6 | autoconfigure: 7 | exclude: 8 | - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 9 | - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置 10 | - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置 11 | - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置 12 | - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置 13 | - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置 14 | # 数据源配置项 15 | datasource: 16 | druid: # Druid 【监控】相关的全局配置 17 | web-stat-filter: 18 | enabled: true 19 | stat-view-servlet: 20 | enabled: true 21 | allow: # 设置白名单,不填则允许所有访问 22 | url-pattern: /druid/* 23 | login-username: # 控制台管理用户名和密码 24 | login-password: 25 | filter: 26 | stat: 27 | enabled: true 28 | log-slow-sql: true # 慢 SQL 记录 29 | slow-sql-millis: 100 30 | merge-sql: true 31 | wall: 32 | config: 33 | multi-statement-allow: true 34 | dynamic: # 多数据源配置 35 | druid: # Druid 【连接池】相关的全局配置 36 | initial-size: 5 # 初始连接数 37 | min-idle: 10 # 最小连接池数量 38 | max-active: 20 # 最大连接池数量 39 | max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 40 | time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 41 | min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 42 | max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 43 | validation-query: SELECT 1 # 配置检测连接是否有效 44 | test-while-idle: true 45 | test-on-borrow: false 46 | test-on-return: false 47 | primary: master 48 | datasource: 49 | master: 50 | name: ${jdbc_db:eoa-db} 51 | url: jdbc:mysql://${jdbc_host:sh-cynosdbmysql-grp-1cn2v14s.sql.tencentcdb.com:21188}/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true 52 | driver-class-name: com.mysql.cj.jdbc.Driver 53 | username: ${jdbc_user:eoa} 54 | password: ${jdbc_password:eoa} 55 | slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 56 | name: ${jdbc_db:eoa-db} 57 | url: jdbc:mysql://${jdbc_host:sh-cynosdbmysql-grp-1cn2v14s.sql.tencentcdb.com:21188}/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true 58 | driver-class-name: com.mysql.cj.jdbc.Driver 59 | username: ${jdbc_user:eoa} 60 | password: ${jdbc_password:eoa} 61 | # obpm: 62 | # name: ${obpm_jdbc_db:bpm-db} 63 | # driver-class-name: ${jdbc_driver:com.mysql.cj.jdbc.Driver} 64 | # #url: ${obpm_jdbc_url:jdbc:mysql://mysql:3306/bpm-db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&nullCatalogMeansCurrent=true} 65 | # url: jdbc:mysql://${obpm_jdbc_host:sh-cynosdbmysql-grp-1cn2v14s.sql.tencentcdb.com:21188}/${spring.datasource.dynamic.datasource.obpm.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true 66 | # username: ${obpm_jdbc_user:bpm} 67 | # password: ${obpm_jdbc_password:bpm} 68 | 69 | # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 70 | redis: 71 | host: ${redis_host:124.223.81.114} # 地址 72 | port: ${redis_port:6378} # 端口 73 | database: ${redis_db:4} # 数据库索引 74 | password: ${redis_password:nopass} # 密码,建议生产环境开启 75 | 76 | quartz: 77 | auto-startup: false # 本地开发环境,尽量不要开启 Job 78 | 79 | 80 | --- #################### 监控相关配置 #################### 81 | 82 | # Actuator 监控端点的配置项 83 | management: 84 | endpoints: 85 | web: 86 | base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator 87 | exposure: 88 | include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 89 | 90 | # Spring Boot Admin 配置项 91 | spring: 92 | boot: 93 | admin: 94 | # Spring Boot Admin Client 客户端的相关配置 95 | client: 96 | url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址 97 | instance: 98 | service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] 99 | # Spring Boot Admin Server 服务端的相关配置 100 | context-path: /admin # 配置 Spring 101 | 102 | # 日志文件配置 103 | logging: 104 | file: 105 | name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 106 | 107 | 108 | 109 | --- #################### eap相关配置 #################### 110 | 111 | # 配置项,设置当前项目所有自定义的配置 112 | eap: 113 | captcha: 114 | enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试; 115 | security: 116 | mock-enable: true 117 | xss: 118 | enable: false 119 | exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 120 | - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 121 | - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 122 | pay: 123 | callback-url: http://yunai.natapp1.cc/admin-api/pay/notify/callback 124 | return-url: http://yunai.natapp1.cc/admin-api/pay/notify/return 125 | access-log: # 访问日志的配置项 126 | enable: false 127 | error-code: # 错误码相关配置项 128 | enable: false 129 | demo: false # 关闭演示模式 130 | enableOpenBpm: true 131 | userDataType: default 132 | obpm: 133 | proxy: true 134 | apiBaseUrl: ${obpm_api_baseurl:http://124.223.81.114:6330} 135 | webBaseUrl: ${obpm_web_baseurl:http://localhost:3002} 136 | adminBaseUrl: ${obpm_admin_baseurl:http://localhost:3002} 137 | 138 | flowable: 139 | database-schema-update: true 140 | 141 | chatgpt: 142 | token: ${chatgpt_token:sk-xxxxxxxxxxxxxxxxxxxx} #必填 143 | proxy-host: 127.0.0.1 #需要代理时必填 144 | proxy-port: 7890 #需要代理时必填 145 | # model: text-davinci-003 #可选 146 | # chat-model: gpt-3.5-turbo #可选 147 | # retries: 10 #可选,默认为5 148 | # session-expiration-time: 30 #可选,不填则会话永不过期 149 | 150 | justauth: 151 | enabled: true 152 | type: 153 | DINGTALK: # 钉钉 154 | client-id: dingvrnreaje3yqvzhxg 155 | client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI 156 | ignore-check-redirect-uri: true 157 | WECHAT_ENTERPRISE: # 企业微信 158 | client-id: wwd411c69a39ad2e54 159 | client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw 160 | agent-id: 1000004 161 | ignore-check-redirect-uri: true 162 | WECHAT_MINI_APP: # 微信小程序 163 | client-id: ${wx.miniapp.appid} 164 | client-secret: ${wx.miniapp.secret} 165 | ignore-check-redirect-uri: true 166 | ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验 167 | 168 | cache: 169 | type: REDIS 170 | prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: 171 | timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 172 | 173 | 174 | logging: 175 | level: 176 | org.openea.eap: DEBUG -------------------------------------------------------------------------------- /eoa-server/src/main/resources/application-local.yaml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 48080 3 | 4 | --- #################### 数据库相关配置 #################### 5 | 6 | spring: 7 | # 数据源配置项 8 | datasource: 9 | dynamic: # 多数据源配置 10 | druid: # Druid 【连接池】相关的全局配置 11 | max-active: 200 # 最大连接池数量 12 | primary: master 13 | datasource: 14 | master: 15 | name: eoa-db 16 | url: jdbc:mysql://${jdbc_host:127.0.0.1:3306}/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 17 | # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 18 | # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 19 | # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 20 | # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 21 | username: ${jdbc_user:root} 22 | password: ${jdbc_password:root} 23 | # username: sa 24 | # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W 25 | slave: # 模拟从库,可根据自己需要修改 26 | name: eoa-db 27 | url: jdbc:mysql://${jdbc_host:127.0.0.1:3306}/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 28 | # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 29 | # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 30 | # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 31 | # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 32 | username: ${jdbc_user:root} 33 | password: ${jdbc_password:root} 34 | # username: sa 35 | # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W 36 | 37 | # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 38 | redis: 39 | host: ${redis_host:127.0.0.1} # 地址 40 | port: ${redis_port:6379} # 端口 41 | database: ${redis_db:4} # 数据库索引 42 | password: ${redis_password:nopass} 43 | # password: dev # 密码,建议生产环境开启 44 | 45 | --- #################### eap相关配置 #################### 46 | 47 | # 配置项,设置当前项目所有自定义的配置 48 | eap: 49 | captcha: 50 | enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试; 51 | security: 52 | mock-enable: true 53 | xss: 54 | enable: false 55 | exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 56 | - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 57 | - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 58 | pay: 59 | callback-url: http://yunai.natapp1.cc/admin-api/pay/notify/callback 60 | return-url: http://yunai.natapp1.cc/admin-api/pay/notify/return 61 | access-log: # 访问日志的配置项 62 | enable: false 63 | error-code: # 错误码相关配置项 64 | enable: false 65 | demo: false # 关闭演示模式 66 | 67 | justauth: 68 | enabled: true 69 | type: 70 | DINGTALK: # 钉钉 71 | client-id: dingvrnreaje3yqvzhxg 72 | client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI 73 | ignore-check-redirect-uri: true 74 | WECHAT_ENTERPRISE: # 企业微信 75 | client-id: wwd411c69a39ad2e54 76 | client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw 77 | agent-id: 1000004 78 | ignore-check-redirect-uri: true 79 | WECHAT_MINI_APP: # 微信小程序 80 | client-id: ${wx.miniapp.appid} 81 | client-secret: ${wx.miniapp.secret} 82 | ignore-check-redirect-uri: true 83 | ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验 84 | 85 | cache: 86 | type: REDIS 87 | prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: 88 | timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 -------------------------------------------------------------------------------- /eoa-server/src/main/resources/application-tenant.yaml: -------------------------------------------------------------------------------- 1 | 2 | # 多租户相关配置项 3 | # 需要maven启用profile tenant 4 | 5 | eap: 6 | tenant: # 多租户相关配置项 7 | enable: false 8 | ignore-urls: 9 | - /admin-api/system/tenant/get-id-by-name # 基于名字获取租户,不许带租户编号 10 | - /admin-api/system/captcha/get # 获取图片验证码,和租户无关 11 | - /admin-api/system/captcha/check # 校验图片验证码,和租户无关 12 | - /admin-api/infra/file/*/get/** # 获取图片,和租户无关 13 | - /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号 14 | - /admin-api/pay/notify/callback/* # 支付回调通知,不携带租户编号 15 | - /jmreport/* # 积木报表,无法携带租户编号 16 | - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号 17 | ignore-tables: 18 | - system_tenant 19 | - system_tenant_package 20 | - system_dict_data 21 | - system_dict_type 22 | - system_error_code 23 | - system_menu 24 | - system_sms_channel 25 | - system_sms_template 26 | - system_sms_log 27 | - system_sensitive_word 28 | - system_oauth2_client 29 | - system_mail_account 30 | - system_mail_template 31 | - system_mail_log 32 | - system_notify_template 33 | - infra_codegen_column 34 | - infra_codegen_table 35 | - infra_test_demo 36 | - infra_config 37 | - infra_file_config 38 | - infra_file 39 | - infra_file_content 40 | - infra_job 41 | - infra_job_log 42 | - infra_job_log 43 | - infra_data_source_config 44 | - jimu_dict 45 | - jimu_dict_item 46 | - jimu_report 47 | - jimu_report_data_source 48 | - jimu_report_db 49 | - jimu_report_db_field 50 | - jimu_report_db_param 51 | - jimu_report_link 52 | - jimu_report_map 53 | - jimu_report_share 54 | - rep_demo_dxtj 55 | - rep_demo_employee 56 | - rep_demo_gongsi 57 | - rep_demo_jianpiao 58 | - tmp_report_data_1 59 | - tmp_report_data_income -------------------------------------------------------------------------------- /eoa-server/src/main/resources/application.yaml: -------------------------------------------------------------------------------- 1 | server: 2 | port: ${server_port:48080} 3 | shutdown: graceful #开启优雅停机 4 | 5 | spring: 6 | application: 7 | name: eoa-server 8 | 9 | lifecycle: 10 | timeout-per-shutdown-phase: 180s #设置缓冲时间 默认30s 11 | 12 | main: 13 | allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 14 | allow-bean-definition-overriding: true 15 | # Servlet 配置 16 | servlet: 17 | # 文件上传相关配置项 18 | multipart: 19 | max-file-size: ${max-file-size:1073741824} #单个文件大小 1GB=1073741824 20 | max-request-size: ${max-request-size:1073741824} # 设置总上传的文件大小 21 | freemarker: 22 | template-loader-path: classpath*:/templates/ 23 | mvc: 24 | pathmatch: 25 | matching-strategy: ANT_PATH_MATCHER # 解决 SpringFox 与 SpringBoot 2.6.x 不兼容的问题,参见 SpringFoxHandlerProviderBeanPostProcessor 类 26 | # throw-exception-if-no-handler-found: true # 404 错误时抛出异常,方便统一处理 27 | # static-path-pattern: /static/** # 静态资源路径; 注意:如果不配置,则 throw-exception-if-no-handler-found 不生效!!! TODO 芋艿:不能配置,会导致 swagger 不生效 28 | 29 | # Jackson 配置项 30 | jackson: 31 | serialization: 32 | write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 33 | write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 34 | write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 35 | fail-on-empty-beans: false # 允许序列化无属性的 Bean 36 | 37 | # Cache 配置项 38 | cache: 39 | type: REDIS 40 | redis: 41 | time-to-live: 1h # 设置过期时间为 1 小时 42 | 43 | messages: 44 | basename: i18n/messages,i18n/eoa-msg 45 | encoding: UTF-8 46 | 47 | --- #################### 数据库相关配置 #################### 48 | 49 | spring: 50 | # 数据源配置项 51 | autoconfigure: 52 | exclude: 53 | - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 54 | - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置 55 | datasource: 56 | druid: # Druid 【监控】相关的全局配置 57 | web-stat-filter: 58 | enabled: true 59 | stat-view-servlet: 60 | enabled: ${druid_stat_view_enable:true} 61 | allow: ${druid_stat_view_allow:} # 设置白名单,不填则允许所有访问 62 | url-pattern: /druid/* 63 | login-username: ${druid_stat_view_username:admin} # 控制台管理用户名和密码 64 | login-password: ${druid_stat_view_password:druid} 65 | filter: 66 | stat: 67 | enabled: true 68 | log-slow-sql: true # 慢 SQL 记录 69 | slow-sql-millis: 100 70 | merge-sql: true 71 | wall: 72 | config: 73 | multi-statement-allow: true 74 | dynamic: # 多数据源配置 75 | druid: # Druid 【连接池】相关的全局配置 76 | initial-size: 2 # 初始连接数 77 | min-idle: 10 # 最小连接池数量 78 | max-active: 20 # 最大连接池数量 79 | max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 80 | time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 81 | min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 82 | max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 83 | validation-query: SELECT 1 # 配置检测连接是否有效 84 | test-while-idle: true 85 | test-on-borrow: false 86 | test-on-return: false 87 | primary: master 88 | datasource: 89 | master: 90 | name: ${jdbc_db:eoa-db} 91 | url: jdbc:mysql://${jdbc_host:10.0.4.13:3306}/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true 92 | driver-class-name: com.mysql.cj.jdbc.Driver 93 | username: ${jdbc_user:eoa} 94 | password: ${jdbc_password:eoa} 95 | slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 96 | name: ${jdbc_db:eoa-db} 97 | lazy: true # 开启懒加载,保证启动速度 98 | url: jdbc:mysql://${jdbc_host:10.0.4.13:3306}/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true 99 | driver-class-name: com.mysql.cj.jdbc.Driver 100 | username: ${jdbc_user:eoa} 101 | password: ${jdbc_password:eoa} 102 | 103 | # obpm: # 集成OpenBPM使用 104 | # name: ${obpm_jdbc_db:bpm-db} 105 | # driver-class-name: ${jdbc_driver:com.mysql.cj.jdbc.Driver} 106 | # url: jdbc:mysql://${obpm_jdbc_host:10.0.4.13:3306}/${spring.datasource.dynamic.datasource.obpm.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true 107 | # #url: ${obpm_jdbc_url:jdbc:mysql://mysql:3306/bpm-db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&nullCatalogMeansCurrent=true} 108 | # username: ${obpm_jdbc_user:bpm} 109 | # password: ${obpm_jdbc_password:bpm} 110 | # liquibase (openBpm) 111 | liquibase: 112 | enabled: ${liquibase_enabled:false} 113 | 114 | # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 115 | redis: 116 | host: ${redis_host:127.0.0.1} # 地址 117 | port: ${redis_port:6378} # 端口 118 | database: ${redis_db:4} # 数据库索引 119 | password: ${redis_password:nopass} # 密码,建议生产环境开启 120 | 121 | data: 122 | redis: 123 | repositories: 124 | enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度 125 | 126 | 127 | --- #################### 接口文档配置 #################### 128 | 129 | springdoc: 130 | api-docs: 131 | enabled: true 132 | path: /v3/api-docs 133 | swagger-ui: 134 | enabled: true 135 | path: /swagger-ui 136 | default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档 137 | 138 | knife4j: 139 | enable: true 140 | setting: 141 | language: zh_cn 142 | 143 | --- # 工作流 Flowable 配置 144 | flowable: 145 | # 关闭定时任务 job 146 | async-executor-activate: false 147 | # 1. false: 默认值,Flowable 启动时,对比数据库表中保存的版本,如果不匹配。将抛出异常 148 | # 2. true: 启动时会对数据库中所有表进行更新操作,如果表存在,不做处理,反之,自动创建表 149 | # 3. create_drop: 启动时自动创建表,关闭时自动删除表 150 | # 4. drop_create: 启动时,删除旧表,再创建新表 151 | database-schema-update: false # 设置为 false,可通过 https://github.com/flowable/flowable-sql 初始化 152 | idm: 153 | # 关闭idm引擎 数据库不会创建act_id_*表,流程流转不会使用act_id_*相关的表 154 | enabled: false 155 | db-history-used: true # flowable6 默认 true 生成信息表,无需手动设置 156 | history-level: full # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数 157 | # 关闭流程定义文件自动检查 158 | check-process-definitions: false # 设置为 false,禁用 /resources/processes 自动部署 BPMN XML 流程 159 | # 关闭历史任务定时任务job 160 | async-history-executor-activate: false 161 | 162 | 163 | # MyBatis Plus 的配置项 164 | mybatis-plus: 165 | configuration: 166 | map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 167 | global-config: 168 | db-config: 169 | id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。 170 | # id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库 171 | # id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 172 | # id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解 173 | logic-delete-value: 1 # 逻辑已删除值(默认为 1) 174 | logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) 175 | banner: false # 关闭控制台的 Banner 打印 176 | type-handlers-package: classpath*:org.openbpm.base.db.model.typehandler #obpm 177 | type-aliases-package: ${eap.info.base-package}.module.*.dal.dataobject, classpath*:**/dao #eap,obpm 178 | encryptor: 179 | password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成 180 | mapper-locations: classpath*:mapper/**/*.xml 181 | 182 | mybatis-plus-join: 183 | banner: false # 关闭控制台的 Banner 打印 184 | 185 | --- #################### 验证码相关配置 #################### 186 | 187 | aj: 188 | captcha: 189 | jigsaw: classpath:images/jigsaw # 滑动验证,底图路径,不配置将使用默认图片;以 classpath: 开头,取 resource 目录下路径 190 | pic-click: classpath:images/pic-click # 滑动验证,底图路径,不配置将使用默认图片;以 classpath: 开头,取 resource 目录下路径 191 | cache-type: redis # 缓存 local/redis... 192 | cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存 193 | timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行 194 | type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选 195 | water-mark: openEAP # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode 196 | interference-options: 0 # 滑动干扰项(0/1/2) 197 | req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false 198 | req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定 199 | req-get-lock-seconds: 10 # 验证失败后,锁定时间间隔 200 | req-get-minute-limit: 30 # get 接口一分钟内请求数限制 201 | req-check-minute-limit: 60 # check 接口一分钟内请求数限制 202 | req-verify-minute-limit: 60 # verify 接口一分钟内请求数限制 203 | 204 | --- #################### eap相关配置 #################### 205 | 206 | eap: 207 | info: 208 | version: 1.0.0 209 | base-package: org.openea.eap 210 | enableOpenBpm: ${obpm_enable:false} 211 | userDataType: ${eap_userDataType:} 212 | obpm: 213 | proxy: ${obpm_proxy:true} 214 | apiBaseUrl: ${obpm_api_baseurl:/obpm-server} 215 | webBaseUrl: ${obpm_web_baseurl:/obpm-web1} 216 | adminBaseUrl: ${obpm_admin_baseurl:/obpm-admin} 217 | web: 218 | admin-ui: 219 | url: http://dashboard.eap.openea.org # Admin 管理后台 UI 的地址 220 | security: 221 | permit-all_urls: 222 | - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录 223 | - /admin-api/obpm-admin/** 224 | - /obpm-admin/** 225 | - /admin-api/obpm-web1/** 226 | - /obpm-web1/** 227 | websocket: 228 | enable: true # websocket的开关 229 | path: /websocket/message # 路径 230 | maxOnlineCount: 0 # 最大连接人数 231 | sessionMap: true # 保存sessionMap 232 | swagger: 233 | title: EAP快速开发平台 234 | description: 提供管理后台、用户 App 的所有功能 235 | version: ${eap.info.version} 236 | url: ${eap.web.admin-ui.url} 237 | email: admin@openea.org 238 | license: MIT 239 | license-url: https://raw.githubusercontent.com/eaopen/openea-eap/dev/doc/yudao/LICENSE 240 | captcha: 241 | enable: false # 验证码的开关,默认为 true 242 | codegen: 243 | base-package: ${eap.info.base-package:org.openea.eap} 244 | db-schemas: ${spring.datasource.dynamic.datasource.master.name} 245 | front-type: 10 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 246 | error-code: # 错误码相关配置项 247 | constants-class-list: 248 | - org.openea.eap.module.bpm.enums.ErrorCodeConstants 249 | - org.openea.eap.module.infra.enums.ErrorCodeConstants 250 | - org.openea.eap.module.member.enums.ErrorCodeConstants 251 | - org.openea.eap.module.system.enums.ErrorCodeConstants 252 | i18n: 253 | enable: true 254 | mq: 255 | redis: 256 | pubsub: 257 | enable: false # 是否开启 Redis pubsub 广播消费,默认为 true。这里设置成 false,可以按需开启 258 | stream: 259 | enable: false # 是否开启 Redis stream 集群消费,默认为 true。这里设置成 false,可以按需开启 260 | 261 | xss: 262 | enable: false 263 | exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 264 | - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 265 | - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 266 | 267 | sms-code: # 短信验证码相关的配置项 268 | expire-times: 10m 269 | send-frequency: 1m 270 | send-maximum-quantity-per-day: 10 271 | begin-code: 9999 # 这里配置 9999 的原因是,测试方便。 272 | end-code: 9999 # 这里配置 9999 的原因是,测试方便。 273 | cache: # spring cache 相关配置 274 | redis-scan-batch-size: 30 # redis scan 一次返回数量 275 | demo: false # 开启演示模式 276 | 277 | --- #################### eap相关配置2 #################### 278 | 279 | debug: false 280 | 281 | chatgpt: 282 | token: ${chatgpt_token:sk-xxxxxxxxxxxxxxxxxxxx} #必填 283 | # proxy-host: 127.0.0.1 #需要代理时必填 284 | # proxy-port: 7890 #需要代理时必填 285 | # model: text-davinci-003 #可选 286 | # chat-model: gpt-3.5-turbo #可选 287 | # retries: 10 #可选,默认为5 288 | # session-expiration-time: 30 #可选,不填则会话永不过期 289 | 290 | #积木报表配置 291 | minidao : 292 | base-package: org.jeecg.modules.jmreport.desreport.dao* 293 | db-type: mysql 294 | 295 | 296 | justauth: 297 | ## bug when enabled = false 298 | ## Consider defining a bean of type 'org.openea.eap.framework.social.core.EapAuthRequestFactory' in your configuration 299 | enabled: ${justauth_enable:true} 300 | type: 301 | DINGTALK: # 钉钉 302 | client-id: dingvrnreaje3yqvzhxg 303 | client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI 304 | ignore-check-redirect-uri: true 305 | WECHAT_ENTERPRISE: # 企业微信 306 | client-id: wwd411c69a39ad2e54 307 | client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw 308 | agent-id: 1000004 309 | ignore-check-redirect-uri: true 310 | cache: 311 | type: REDIS 312 | prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: 313 | timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 314 | 315 | --- #################### 微信公众号相关配置 #################### 316 | wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 317 | mp: 318 | # 公众号配置(必填) 319 | app-id: ${wx_mp_appid:wx041349c6f39b268b} 320 | secret: ${wx_mp_secret:5abee519483bc9f8cb37ce280e814bd0} 321 | # 存储配置,解决 AccessToken 的跨节点的共享 322 | config-storage: 323 | type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 324 | key-prefix: wx # Redis Key 的前缀 TODO 芋艿:解决下 Redis key 管理的配置 325 | http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 326 | miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 327 | appid: ${wx_mini_appid:wx63c280fe3248a3e7} 328 | secret: ${wx_mini_secret:6f270509224a7ae1296bbf1c8cb97aed} 329 | config-storage: 330 | type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 331 | key-prefix: wa # Redis Key 的前缀 TODO 芋艿:解决下 Redis key 管理的配置 332 | http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 333 | 334 | 335 | --- #################### 定时任务相关配置 #################### 336 | 337 | # Quartz 配置项,对应 QuartzProperties 配置类 338 | spring: 339 | quartz: 340 | auto-startup: true # 测试环境,需要开启 Job 341 | scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName 342 | job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 343 | wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true 344 | properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 345 | org: 346 | quartz: 347 | # Scheduler 相关配置 348 | scheduler: 349 | instanceName: schedulerName 350 | instanceId: AUTO # 自动生成 instance ID 351 | # JobStore 相关配置 352 | jobStore: 353 | # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162 354 | class: org.springframework.scheduling.quartz.LocalDataSourceJobStore 355 | isClustered: true # 是集群模式 356 | clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒 357 | misfireThreshold: 60000 # misfire 阀值,单位:毫秒。 358 | # 线程池相关配置 359 | threadPool: 360 | threadCount: 25 # 线程池大小。默认为 10 。 361 | threadPriority: 5 # 线程优先级 362 | class: org.quartz.simpl.SimpleThreadPool # 线程池类型 363 | jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 364 | initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 365 | 366 | --- #################### 服务保障相关配置 #################### 367 | 368 | # Lock4j 配置项 369 | lock4j: 370 | acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 371 | expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 372 | 373 | # Resilience4j 配置项 374 | resilience4j: 375 | ratelimiter: 376 | instances: 377 | backendA: 378 | limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 379 | limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 380 | timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s 381 | register-health-indicator: true # 是否注册到健康监测 382 | 383 | --- #################### 监控相关配置 #################### 384 | 385 | # Actuator 监控端点的配置项 386 | management: 387 | endpoints: 388 | web: 389 | base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator 390 | exposure: 391 | include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 392 | 393 | # Spring Boot Admin 配置项 394 | spring: 395 | boot: 396 | admin: 397 | # Spring Boot Admin Client 客户端的相关配置 398 | client: 399 | url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址 400 | instance: 401 | service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] 402 | # Spring Boot Admin Server 服务端的相关配置 403 | context-path: /admin # 配置 Spring 404 | 405 | # 日志文件配置 406 | logging: 407 | level: 408 | root: ${logging_level_root:INFO} 409 | org.openea.eap: WARN 410 | org.openbpm: WARN 411 | org.openbpm.base.db: INFO 412 | org.openbpm.base.db.transaction: INFO 413 | org.springframework: WARN 414 | org.springframework.boot.autoconfigure: ERROR 415 | org.springframework.data.redis: WARN 416 | org.springframework.jdbc.core.StatementCreatorUtils: WARN 417 | org.springframework.web.servlet.mvc.support: ERROR 418 | org.mybatis.spring.mapper.ClassPathMapperScanner: ERROR 419 | springfox.documentation.builders.FormParameterSpecificationProvider: ERROR 420 | springfox.documentation.swagger.readers.operation.OperationImplicitParameterReader: ERROR 421 | org.openea.eap.framework.i18n.core.I18nUtil: ERROR 422 | org.openea.eap.framework.i18n.core.EapMessageResource: ERROR 423 | file: 424 | name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 425 | 426 | 427 | --- #################### extj相关配置 #################### 428 | ## todo , will remove extj config 429 | config: 430 | # ===============静态资源目录映射================== 431 | WebAnnexFilePath: WebAnnexFile 432 | DataBackupFilePath: DataBackupFile 433 | TemporaryFilePath: TemporaryFile 434 | SystemFilePath: SystemFile 435 | TemplateFilePath: TemplateFile 436 | EmailFilePath: EmailFile 437 | DocumentFilePath: DocumentFile 438 | DocumentPreviewPath: DocumentPreview 439 | UserAvatarFilePath: UserAvatar 440 | IMContentFilePath: IMContentFile 441 | MPMaterialFilePath: MPMaterial 442 | TemplateCodePath: TemplateCode 443 | BiVisualPath: BiVisualPath 444 | # ===============功能格式限制================== 445 | MPUploadFileType: bmp,png,jpeg,jpg,gif,mp3,wma,wav,amr,mp4 446 | WeChatUploadFileType: jpg,png,doc,docx,ppt,pptx,xls,xlsx,pdf,txt,rar,zip,csv,amr,mp4 447 | 448 | AllowUploadImageType: jpg,gif,png,bmp,jpeg,tiff,psd,swf,svg,pcx,dxf,wmf,emf,lic,eps,tga #允许上传图片类型 449 | AllowUploadFileType: jpg,gif,png,bmp,jpeg,doc,docx,ppt,pptx,xls,xlsx,pdf,txt,rar,zip,csv,mp3 #允许上传文件类型 450 | AllowPreviewFileType: doc,docx,xls,xlsx,ppt,pptx,pdf,jpg,gif,png,bmp,jpeg #允许预览文件类型 451 | PreviewType: kkfile #文件预览方式 (1.yozo 2.kkfile)默认使用kkfile 452 | kkFileUrl: http://127.0.0.1:30090/FileServer/ #kkfile文件预览服务地址 453 | ApiDomain: http://127.0.0.1:30000 #后端域名(文档预览中使用) 454 | FrontDomain: http://127.0.0.1:3000 #前端域名(文档预览中使用) 455 | AppDomain: http://127.0.0.1:8080 #app/h5端域名配置(文档预览中使用) 456 | 457 | CodeAreasName: example #代码生成器模块命名 458 | 459 | 460 | #===================== unipush ===================== 461 | AppPushUrl: https://11111.bspapp.com/unipush 462 | 463 | #===================== 多租户 ===================== 464 | MultiTenancy: false #是否开启 465 | 466 | #===================== 系统及错误报告反馈相关 ===================== 467 | SoftName: java-boot #项目名 468 | SoftFullName: 快速开发平台 #项目全名 469 | SoftVersion: v3.4.0 #版本号 470 | 471 | RecordLog: false #系统日志启用 472 | ErrorReport: false #软件错误报告 473 | ErrorReportTo: surrpot@xxx.com #软件错误报告接收者 474 | IgexinEnabled: false #推送启动 475 | 476 | #===================== APP ===================== 477 | AppVersion: V3.4.0 #APP版本号 478 | IgexinAppid: 11HLFY9T2d1z7MySY8hwGwh4 #APPID:应用的唯一标识 479 | IgexinAppkey: 116Uiduugq648YDChhCjAt59 #APPKEY:公匙(相当于账号) 480 | IgexinMastersecret: 11pEyQm156SJ9iS7PbyjLCZ6 #Mastersecret:私匙(相当于密码) 481 | AppUpdateContent: ; #APP更新内容 482 | 483 | #===================== 系统功能配置 ===================== 484 | EnablePreAuth: false #是否开启接口鉴权 485 | EnableLogicDelete: false #是否开启逻辑删除 -------------------------------------------------------------------------------- /eoa-server/src/main/resources/i18n/eoa-msg.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eaopen/openea-eap/d9d7a08ac67b96daf77cfde07a4ced6dc8e805cf/eoa-server/src/main/resources/i18n/eoa-msg.properties -------------------------------------------------------------------------------- /eoa-server/src/main/resources/logback-spring.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |       11 | 12 | 13 | ${PATTERN_DEFAULT} 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | ${PATTERN_DEFAULT} 24 | 25 | 26 | 27 | ${LOG_FILE} 28 | 29 | 30 | ${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz} 31 | 32 | ${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false} 33 | 34 | ${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB} 35 | 36 | ${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0} 37 | 38 | ${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30} 39 | 40 | 41 | 42 | 43 | 44 | 0 45 | 46 | 256 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | ${PATTERN_DEFAULT} 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /lombok.config: -------------------------------------------------------------------------------- 1 | config.stopBubbling = true 2 | lombok.tostring.callsuper=CALL 3 | lombok.equalsandhashcode.callsuper=CALL 4 | lombok.accessors.chain=true 5 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | org.openea.eap 7 | eap 8 | ${revision} 9 | pom 10 | 11 | 12 | eoa-server 13 | 14 | 15 | eap-biz-extend 16 | 17 | 18 | 19 | ${project.artifactId} 20 | openEAP项目基础脚手架 21 | https://github.com/eaopen/openea-eap 22 | 23 | 24 | 2.6.0-SNAPSHOT 25 | 2.6.0-SNAPSHOT 26 | 2.7.18 27 | 28 | 29 | 30 | 2.6.0-SNAPSHOT 31 | 2.6.0-SNAPSHOT 32 | 33 | 2.6.0-SNAPSHOT 34 | 2.6.0-SNAPSHOT 35 | 36 | 2.6.0-SNAPSHOT 37 | 38 | 39 | 1.8 40 | ${java.version} 41 | ${java.version} 42 | 3.0.0-M5 43 | 3.8.1 44 | 1.5.0 45 | 1.18.30 46 | 1.5.5.Final 47 | UTF-8 48 | 49 | 50 | 51 | 52 | The Apache Software License, Version 2.0 53 | http://www.apache.org/licenses/LICENSE-2.0.txt 54 | repo 55 | 56 | 57 | 58 | https://github.com/eaopen/openea-eap 59 | https://github.com/eaopen/openea-eap.git 60 | https://github.com/eaopen 61 | 62 | 63 | 64 | openea 65 | github@eaopen.github.io 66 | https://github.com/eaopen 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | io.github.eaopen 75 | eap-dependencies 76 | ${eap-boot.version} 77 | pom 78 | import 79 | 80 | 81 | 82 | io.github.eaopen 83 | eap-boot-starter 84 | ${eap-boot.version} 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | openea-reps-mvn 95 | mvn 96 | https://openea-maven.pkg.coding.net/repository/reps/mvn/ 97 | 98 | 99 | 100 | 101 | 102 | 103 | ossrh 104 | https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ 105 | 106 | 107 | 108 | 109 | 110 | 111 | aliyunmaven 112 | aliyun 113 | https://maven.aliyun.com/repository/public 114 | 115 | 116 | openea-reps-mvn 117 | mvn 118 | https://openea-maven.pkg.coding.net/repository/reps/mvn/ 119 | 120 | true 121 | 122 | 123 | true 124 | always 125 | 126 | 127 | 128 | 129 | 130 | aliyun-plugin 131 | https://maven.aliyun.com/repository/public 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | org.apache.maven.plugins 142 | maven-surefire-plugin 143 | ${maven-surefire-plugin.version} 144 | 145 | 146 | 147 | 148 | org.apache.maven.plugins 149 | maven-compiler-plugin 150 | ${maven-compiler-plugin.version} 151 | 152 | 153 | 154 | org.springframework.boot 155 | spring-boot-configuration-processor 156 | ${spring.boot.version} 157 | 158 | 159 | org.projectlombok 160 | lombok 161 | ${lombok.version} 162 | 163 | 164 | org.mapstruct 165 | mapstruct-processor 166 | ${mapstruct.version} 167 | 168 | 169 | 170 | 171 | 172 | org.codehaus.mojo 173 | flatten-maven-plugin 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | org.codehaus.mojo 182 | flatten-maven-plugin 183 | ${flatten-maven-plugin.version} 184 | 185 | resolveCiFriendliesOnly 186 | true 187 | 188 | 189 | 190 | 191 | flatten 192 | 193 | flatten 194 | process-resources 195 | 196 | 197 | 198 | clean 199 | 200 | flatten.clean 201 | clean 202 | 203 | 204 | 205 | 206 | org.apache.maven.plugins 207 | maven-source-plugin 208 | 2.2.1 209 | 210 | false 211 | 212 | 213 | 214 | attach-sources 215 | 216 | jar-no-fork 217 | 218 | 219 | 220 | 221 | 222 | org.apache.maven.plugins 223 | maven-javadoc-plugin 224 | 3.5.0 225 | 226 | none 227 | false 228 | false 229 | 230 | 231 | 232 | attach-javadocs 233 | 234 | jar 235 | 236 | 237 | 238 | 239 | 240 | org.apache.maven.plugins 241 | maven-gpg-plugin 242 | 1.6 243 | 244 | 245 | sign-artifacts 246 | verify 247 | 248 | sign 249 | 250 | 251 | CFE1227A 252 | CFE1227A 253 | 254 | --pinentry-mode 255 | loopback 256 | 257 | 258 | 259 | 260 | 261 | 262 | org.sonatype.plugins 263 | nexus-staging-maven-plugin 264 | 1.6.8 265 | true 266 | 267 | ossrh 268 | https://s01.oss.sonatype.org/ 269 | true 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | -------------------------------------------------------------------------------- /script/docker/Docker-HOWTO.md: -------------------------------------------------------------------------------- 1 | # Docker Build & Up 2 | 3 | 目标: 快速部署体验系统,帮助了解系统之间的依赖关系。 4 | 5 | ## 功能文件列表 6 | 7 | ```text 8 | . 9 | ├── docker 10 | │ ├── Docker-HOWTO.md 11 | │ ├── docker-compose.yml #eap单体版本 12 | │ ├── docker-compose-eoa.yml #eoa单体版本 13 | │ ├── docker-compose-cloud.yml #eoa cloud版本 14 | │ └── docker.env 15 | ├── eap-server 16 | │ ├── Dockerfile 17 | │ └── nginx.conf 18 | ├── eoa-server 19 | │ ├── Dockerfile 20 | │ └── nginx.conf 21 | └── eap-aui/eap-ui-admin(将用eoa-web代替) 22 | ├── .dockerignore 23 | └── Dockerfile 24 | ``` 25 | 26 | ## Maven build (Optional) 27 | 28 | ```shell 29 | # 创建maven缓存volume 30 | docker volume create --name eap-maven-repo 31 | 32 | docker run -it --rm --name eap-maven \ 33 | -v eap-maven-repo:/root/.m2 \ 34 | -v $PWD:/usr/src/mymaven \ 35 | -w /usr/src/mymaven \ 36 | maven mvn clean install package '-Dmaven.test.skip=true' 37 | ``` 38 | 39 | ## Docker Compose Build 40 | 41 | ```shell 42 | docker compose --env-file docker.env build 43 | ``` 44 | 45 | ## Docker Compose Up 46 | 47 | ```shell 48 | docker compose --env-file docker.env up -d 49 | ``` 50 | 51 | 第一次执行,由于数据库未初始化,因此eap-server容器会运行失败。执行如下命令初始化数据库: 52 | 53 | ```shell 54 | docker exec -i eap-mysql \ 55 | sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" --default-character-set=utf8mb4 ruoyi-vue-pro' \ 56 | < ./sql/mysql/eap-db.sql 57 | ``` 58 | 59 | 注意:这里用docker compose exec 会出现 `the input device is not a TTY` 报错 60 | 61 | ## Server:Port 62 | 63 | - admin: http://localhost:8080 64 | - API: http://localhost:48080 65 | - mysql: root/123456, port: 3306 66 | - redis: port: 6379 67 | -------------------------------------------------------------------------------- /script/docker/build-eoa-obpm-docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 3 | 4 | # change to top dir 5 | cd ${DIR}/.. 6 | 7 | # 1 maven(project dir) 8 | #mvn clean install -DskipTests=true 9 | 10 | # change to eoa dir 11 | APPDIR=${DIR}/../eap-module-obpm 12 | cd ${APPDIR} 13 | 14 | # 2 maven in eoa dir 15 | mvn clean 16 | mvn install -DskipTests=true -PobpmServer 17 | 18 | # 3 docker build 19 | # docker image vars 20 | artifactId=eoa-obpm 21 | version=2.0-snapshot 22 | 23 | cd ./eap-obpm-server 24 | docker build . --tag ${artifactId}:${version} 25 | docker tag ${artifactId}:${version} ${artifactId}:latest 26 | 27 | # 4 docker push 28 | ## !!!请更改的docker registry以及执行docker login 29 | # docker login -u [user] -p [password] [docker registry] 30 | LOGIN_FILE_PATH="${DIR}/openea-docker-login.sh" 31 | 32 | if [ -f "$LOGIN_FILE_PATH" ]; then 33 | sh $LOGIN_FILE_PATH 34 | fi 35 | 36 | repsBase=openea-docker.pkg.coding.net/reps/docker 37 | docker tag ${artifactId}:${version} ${repsBase}/${artifactId}:latest 38 | docker push ${repsBase}/${artifactId}:latest 39 | 40 | -------------------------------------------------------------------------------- /script/docker/build-eoa-server-docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 3 | 4 | EAP_PROJ_DIR=${DIR}/../.. 5 | 6 | # check eap-base 7 | if [ -d "${EAP_PROJ_DIR}/eap-base" ]; then 8 | cd "${EAP_PROJ_DIR}/eap-base" 9 | git checkout . 10 | git pull 11 | mvn clean install -DskipTests=true 12 | else 13 | echo "${EAP_PROJ_DIR}/eap-base not exist." 14 | fi 15 | 16 | # check eap-boot 17 | if [ -d "${EAP_PROJ_DIR}/eap-boot" ]; then 18 | cd "${EAP_PROJ_DIR}/eap-boot" 19 | git checkout . 20 | git pull 21 | mvn clean install -DskipTests=true 22 | else 23 | echo "${EAP_PROJ_DIR}/eap-boot not exist." 24 | fi 25 | 26 | # change to top dir 27 | cd ${DIR}/.. 28 | 29 | # 1 maven(project dir) 30 | mvn clean install -DskipTests=true 31 | 32 | # change to eoa dir 33 | APPDIR=${DIR}/../eoa-server 34 | cd ${APPDIR} 35 | 36 | # 2 maven in eoa dir 37 | mvn clean 38 | mvn install -DskipTests=true 39 | 40 | # 3 docker build 41 | # docker image vars 42 | artifactId=eoa-server 43 | version=2.0-snapshot 44 | docker build . --tag ${artifactId}:${version} 45 | docker tag ${artifactId}:${version} ${artifactId}:latest 46 | 47 | # 4 docker push 48 | ## !!!请更改的docker registry以及执行docker login 49 | # docker login -u [user] -p [password] [docker registry] 50 | LOGIN_FILE_PATH="${DIR}/openea-docker-login.sh" 51 | 52 | if [ -f "$LOGIN_FILE_PATH" ]; then 53 | sh $LOGIN_FILE_PATH 54 | fi 55 | 56 | repsBase=openea-docker.pkg.coding.net/reps/docker 57 | docker tag ${artifactId}:${version} ${repsBase}/${artifactId}:latest 58 | docker push ${repsBase}/${artifactId}:latest 59 | 60 | -------------------------------------------------------------------------------- /script/docker/docker-compose-eoa.yml: -------------------------------------------------------------------------------- 1 | version: "3.4" 2 | 3 | #name: eoa-system 4 | 5 | services: 6 | 7 | eoa-obpm: 8 | image: openea-docker.pkg.coding.net/reps/docker/eoa-obpm:latest 9 | container_name: eoa-obpm 10 | restart: unless-stopped 11 | ports: 12 | - 8120:8080 13 | environment: 14 | SPRING_PROFILES_ACTIVE: prod 15 | JAVA_OPTS: 16 | ${JAVA_OPTS:- 17 | -Xms512m 18 | -Xmx2049m 19 | -Djava.security.egd=file:/dev/./urandom 20 | } 21 | ARGS: 22 | --spring.datasource.url=jdbc:mysql://10.0.4.13:3306/eoa-db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true 23 | --spring.datasource.username=eoa 24 | --spring.datasource.password=${JDBC_PASSWORD:-eap} 25 | --spring.redis.host=10.0.4.4 26 | --spring.redis.port=6378 27 | --spring.redis.password=nopass 28 | 29 | eoa-server: 30 | image: openea-docker.pkg.coding.net/reps/docker/eoa-server:latest 31 | container_name: eoa-server 32 | restart: unless-stopped 33 | ports: 34 | - 48080:48080 35 | environment: 36 | # https://github.com/polovyivan/docker-pass-configs-to-container 37 | SPRING_PROFILES_ACTIVE: prod 38 | JAVA_OPTS: 39 | ${JAVA_OPTS:- 40 | -Xms512m 41 | -Xmx2049m 42 | -Djava.security.egd=file:/dev/./urandom 43 | } 44 | ARGS: 45 | --spring.datasource.dynamic.datasource.master.url=jdbc:mysql://10.0.4.13:3306/eoa-db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true 46 | --spring.datasource.dynamic.datasource.master.username=eoa 47 | --spring.datasource.dynamic.datasource.master.password=${JDBC_PASSWORD:-eap} 48 | --spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://10.0.4.13:3306/eoa-db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true 49 | --spring.datasource.dynamic.datasource.slave.username=eoa 50 | --spring.datasource.dynamic.datasource.slave.password=${JDBC_PASSWORD:-eap} 51 | --spring.redis.host=10.0.4.4 52 | --spring.redis.port=6378 53 | --spring.redis.password=nopass 54 | --eap.enableOpenBpm=true 55 | --eap.userDataType=obpm 56 | --eap.obpm.apiBaseUrl=http://eoa-obpm:8080 57 | depends_on: 58 | - eoa-obpm 59 | 60 | eoa-web: 61 | image: openea-docker.pkg.coding.net/reps/docker/eoa-web:latest 62 | container_name: eoa-web 63 | restart: unless-stopped 64 | ports: 65 | - 7080:80 66 | depends_on: 67 | - eoa-server 68 | 69 | minio: 70 | image: quay.io/minio/minio 71 | container_name: eoa-minio 72 | ports: 73 | - 7900:9000 74 | - 7901:9001 75 | volumes: 76 | - "./minio/data1:/data1" 77 | - "./minio/data2:/data2" 78 | command: server --console-address ":9001" http://minio/data{1...2} 79 | environment: 80 | - MINIO_ROOT_USER=admin 81 | - MINIO_ROOT_PASSWORD=admin321 -------------------------------------------------------------------------------- /script/docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.4" 2 | 3 | name: eap-system 4 | 5 | services: 6 | mysql: 7 | container_name: eap-mysql 8 | image: mysql:8 9 | restart: unless-stopped 10 | tty: true 11 | ports: 12 | - 3306:3306 13 | environment: 14 | MYSQL_DATABASE: ${MYSQL_DATABASE:-eap-db} 15 | MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456} 16 | volumes: 17 | - mysql:/var/lib/mysql/ 18 | - ./sql/mysql/eap-db.sql:/docker-entrypoint-initdb.d/eap-db.sql:ro 19 | 20 | redis: 21 | container_name: eap-redis 22 | image: redis:6-alpine 23 | restart: unless-stopped 24 | ports: 25 | - 6379:6379 26 | volumes: 27 | - redis:/data 28 | 29 | server: 30 | container_name: eap-server 31 | build: 32 | context: ../eap-server 33 | image: eap-server 34 | restart: unless-stopped 35 | ports: 36 | - 48080:48080 37 | environment: 38 | # https://github.com/polovyivan/docker-pass-configs-to-container 39 | SPRING_PROFILES_ACTIVE: local 40 | JAVA_OPTS: 41 | ${JAVA_OPTS:- 42 | -Xms512m 43 | -Xmx512m 44 | -Djava.security.egd=file:/dev/./urandom 45 | } 46 | ARGS: 47 | --spring.datasource.dynamic.datasource.master.url=${MASTER_DATASOURCE_URL:-jdbc:mysql://eap-mysql:3306/eap-db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} 48 | --spring.datasource.dynamic.datasource.master.username=${MASTER_DATASOURCE_USERNAME:-root} 49 | --spring.datasource.dynamic.datasource.master.password=${MASTER_DATASOURCE_PASSWORD:-123456} 50 | --spring.datasource.dynamic.datasource.slave.url=${SLAVE_DATASOURCE_URL:-jdbc:mysql://eap-mysql:3306/eap-db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} 51 | --spring.datasource.dynamic.datasource.slave.username=${SLAVE_DATASOURCE_USERNAME:-root} 52 | --spring.datasource.dynamic.datasource.slave.password=${SLAVE_DATASOURCE_PASSWORD:-123456} 53 | --spring.redis.host=${REDIS_HOST:-eap-redis} 54 | depends_on: 55 | - mysql 56 | - redis 57 | 58 | admin: 59 | container_name: eap-admin 60 | build: 61 | context: ../eap-ui/eap-ui-admin 62 | args: 63 | NODE_ENV: 64 | ENV=${NODE_ENV:-production} 65 | PUBLIC_PATH=${PUBLIC_PATH:-/} 66 | VUE_APP_TITLE=${VUE_APP_TITLE:-企业应用框架} 67 | VUE_APP_BASE_API=${VUE_APP_BASE_API:-/prod-api} 68 | VUE_APP_APP_NAME=${VUE_APP_APP_NAME:-/} 69 | VUE_APP_TENANT_ENABLE=${VUE_APP_TENANT_ENABLE:-true} 70 | VUE_APP_CAPTCHA_ENABLE=${VUE_APP_CAPTCHA_ENABLE:-true} 71 | VUE_APP_DOC_ENABLE=${VUE_APP_DOC_ENABLE:-true} 72 | VUE_APP_BAIDU_CODE=${VUE_APP_BAIDU_CODE:-0000} 73 | image: eap-admin 74 | restart: unless-stopped 75 | ports: 76 | - 8080:80 77 | depends_on: 78 | - server 79 | 80 | volumes: 81 | mysql: 82 | driver: local 83 | redis: 84 | driver: local 85 | -------------------------------------------------------------------------------- /script/docker/docker.env: -------------------------------------------------------------------------------- 1 | ## mysql 2 | MYSQL_DATABASE=eap-db 3 | MYSQL_ROOT_PASSWORD=123456 4 | 5 | ## server 6 | JAVA_OPTS=-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom 7 | 8 | MASTER_DATASOURCE_URL=jdbc:mysql://eap-db:3306/${MYSQL_DATABASE}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true 9 | MASTER_DATASOURCE_USERNAME=root 10 | MASTER_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD} 11 | SLAVE_DATASOURCE_URL=${MASTER_DATASOURCE_URL} 12 | SLAVE_DATASOURCE_USERNAME=${MASTER_DATASOURCE_USERNAME} 13 | SLAVE_DATASOURCE_PASSWORD=${MASTER_DATASOURCE_PASSWORD} 14 | REDIS_HOST=eap-redis 15 | 16 | ## admin 17 | NODE_ENV=production 18 | PUBLIC_PATH=/ 19 | VUE_APP_TITLE=企业应用框架 20 | VUE_APP_BASE_API=/prod-api 21 | VUE_APP_APP_NAME=/ 22 | VUE_APP_TENANT_ENABLE=false 23 | VUE_APP_CAPTCHA_ENABLE=true 24 | VUE_APP_DOC_ENABLE=false 25 | VUE_APP_BAIDU_CODE=0000 26 | -------------------------------------------------------------------------------- /script/docker/docker_clean.sh: -------------------------------------------------------------------------------- 1 | # view 2 | docker images -f "dangling=true" 3 | # remove 4 | docker rmi $(docker images -f "dangling=true" -q) -------------------------------------------------------------------------------- /script/docker/openea-docker-login.sh: -------------------------------------------------------------------------------- 1 | docker login -u docker-1655366065315 -p 78404fb214a59224b212e3f22969b3916054c60f openea-docker.pkg.coding.net -------------------------------------------------------------------------------- /script/sql/db2/README.md: -------------------------------------------------------------------------------- 1 | 暂未适配 IBM DB2 数据库,如果你有需要,可以微信联系 wangwenbin-server 一起建设。 2 | 3 | 你需要把表结构与数据导入到 DM 数据库,我来测试与适配代码。 4 | -------------------------------------------------------------------------------- /script/sql/dm/flowable-patch/src/main/java/liquibase/database/core/DmDatabase.java: -------------------------------------------------------------------------------- 1 | package liquibase.database.core; 2 | 3 | import java.lang.reflect.Method; 4 | import java.sql.Connection; 5 | import java.sql.ResultSet; 6 | import java.sql.SQLException; 7 | import java.sql.Statement; 8 | import java.util.ArrayList; 9 | import java.util.Arrays; 10 | import java.util.HashSet; 11 | import java.util.List; 12 | import java.util.Locale; 13 | import java.util.Map; 14 | import java.util.Properties; 15 | import java.util.Set; 16 | import java.util.regex.Matcher; 17 | import java.util.regex.Pattern; 18 | import liquibase.CatalogAndSchema; 19 | import liquibase.Scope; 20 | import liquibase.database.AbstractJdbcDatabase; 21 | import liquibase.database.DatabaseConnection; 22 | import liquibase.database.OfflineConnection; 23 | import liquibase.database.jvm.JdbcConnection; 24 | import liquibase.exception.DatabaseException; 25 | import liquibase.exception.UnexpectedLiquibaseException; 26 | import liquibase.exception.ValidationErrors; 27 | import liquibase.executor.ExecutorService; 28 | import liquibase.statement.DatabaseFunction; 29 | import liquibase.statement.SequenceCurrentValueFunction; 30 | import liquibase.statement.SequenceNextValueFunction; 31 | import liquibase.statement.core.RawCallStatement; 32 | import liquibase.statement.core.RawSqlStatement; 33 | import liquibase.structure.DatabaseObject; 34 | import liquibase.structure.core.Catalog; 35 | import liquibase.structure.core.Index; 36 | import liquibase.structure.core.PrimaryKey; 37 | import liquibase.structure.core.Schema; 38 | import liquibase.util.JdbcUtils; 39 | import liquibase.util.StringUtil; 40 | 41 | public class DmDatabase extends AbstractJdbcDatabase { 42 | private static final String PRODUCT_NAME = "DM DBMS"; 43 | 44 | @Override 45 | protected String getDefaultDatabaseProductName() { 46 | return PRODUCT_NAME; 47 | } 48 | 49 | /** 50 | * Is this AbstractDatabase subclass the correct one to use for the given connection. 51 | * 52 | * @param conn 53 | */ 54 | @Override 55 | public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException { 56 | return PRODUCT_NAME.equalsIgnoreCase(conn.getDatabaseProductName()); 57 | } 58 | 59 | /** 60 | * If this database understands the given url, return the default driver class name. Otherwise return null. 61 | * 62 | * @param url 63 | */ 64 | @Override 65 | public String getDefaultDriver(String url) { 66 | if(url.startsWith("jdbc:dm")) { 67 | return "dm.jdbc.driver.DmDriver"; 68 | } 69 | 70 | return null; 71 | } 72 | 73 | /** 74 | * Returns an all-lower-case short name of the product. Used for end-user selecting of database type 75 | * such as the DBMS precondition. 76 | */ 77 | @Override 78 | public String getShortName() { 79 | return "dm"; 80 | } 81 | 82 | @Override 83 | public Integer getDefaultPort() { 84 | return 5236; 85 | } 86 | 87 | /** 88 | * Returns whether this database support initially deferrable columns. 89 | */ 90 | @Override 91 | public boolean supportsInitiallyDeferrableColumns() { 92 | return true; 93 | } 94 | 95 | @Override 96 | public boolean supportsTablespaces() { 97 | return true; 98 | } 99 | 100 | @Override 101 | public int getPriority() { 102 | return PRIORITY_DEFAULT; 103 | } 104 | 105 | private static final Pattern PROXY_USER = Pattern.compile(".*(?:thin|oci)\\:(.+)/@.*"); 106 | 107 | protected final int SHORT_IDENTIFIERS_LENGTH = 30; 108 | protected final int LONG_IDENTIFIERS_LEGNTH = 128; 109 | public static final int ORACLE_12C_MAJOR_VERSION = 12; 110 | 111 | private Set reservedWords = new HashSet<>(); 112 | private Set userDefinedTypes; 113 | private Map savedSessionNlsSettings; 114 | 115 | private Boolean canAccessDbaRecycleBin; 116 | private Integer databaseMajorVersion; 117 | private Integer databaseMinorVersion; 118 | 119 | /** 120 | * Default constructor for an object that represents the Oracle Database DBMS. 121 | */ 122 | public DmDatabase() { 123 | super.unquotedObjectsAreUppercased = true; 124 | //noinspection HardCodedStringLiteral 125 | super.setCurrentDateTimeFunction("SYSTIMESTAMP"); 126 | // Setting list of Oracle's native functions 127 | //noinspection HardCodedStringLiteral 128 | dateFunctions.add(new DatabaseFunction("SYSDATE")); 129 | //noinspection HardCodedStringLiteral 130 | dateFunctions.add(new DatabaseFunction("SYSTIMESTAMP")); 131 | //noinspection HardCodedStringLiteral 132 | dateFunctions.add(new DatabaseFunction("CURRENT_TIMESTAMP")); 133 | //noinspection HardCodedStringLiteral 134 | super.sequenceNextValueFunction = "%s.nextval"; 135 | //noinspection HardCodedStringLiteral 136 | super.sequenceCurrentValueFunction = "%s.currval"; 137 | } 138 | 139 | private void tryProxySession(final String url, final Connection con) { 140 | Matcher m = PROXY_USER.matcher(url); 141 | if (m.matches()) { 142 | Properties props = new Properties(); 143 | props.put("PROXY_USER_NAME", m.group(1)); 144 | try { 145 | Method method = con.getClass().getMethod("openProxySession", int.class, Properties.class); 146 | method.setAccessible(true); 147 | method.invoke(con, 1, props); 148 | } catch (Exception e) { 149 | Scope.getCurrentScope().getLog(getClass()).info("Could not open proxy session on OracleDatabase: " + e.getCause().getMessage()); 150 | } 151 | } 152 | } 153 | 154 | @Override 155 | public int getDatabaseMajorVersion() throws DatabaseException { 156 | if (databaseMajorVersion == null) { 157 | return super.getDatabaseMajorVersion(); 158 | } else { 159 | return databaseMajorVersion; 160 | } 161 | } 162 | 163 | @Override 164 | public int getDatabaseMinorVersion() throws DatabaseException { 165 | if (databaseMinorVersion == null) { 166 | return super.getDatabaseMinorVersion(); 167 | } else { 168 | return databaseMinorVersion; 169 | } 170 | } 171 | 172 | @Override 173 | public String getJdbcCatalogName(CatalogAndSchema schema) { 174 | return null; 175 | } 176 | 177 | @Override 178 | public String getJdbcSchemaName(CatalogAndSchema schema) { 179 | return correctObjectName((schema.getCatalogName() == null) ? schema.getSchemaName() : schema.getCatalogName(), Schema.class); 180 | } 181 | 182 | @Override 183 | protected String getAutoIncrementClause(final String generationType, final Boolean defaultOnNull) { 184 | if (StringUtil.isEmpty(generationType)) { 185 | return super.getAutoIncrementClause(); 186 | } 187 | 188 | String autoIncrementClause = "GENERATED %s AS IDENTITY"; // %s -- [ ALWAYS | BY DEFAULT [ ON NULL ] ] 189 | String generationStrategy = generationType; 190 | if (Boolean.TRUE.equals(defaultOnNull) && generationType.toUpperCase().equals("BY DEFAULT")) { 191 | generationStrategy += " ON NULL"; 192 | } 193 | return String.format(autoIncrementClause, generationStrategy); 194 | } 195 | 196 | @Override 197 | public String generatePrimaryKeyName(String tableName) { 198 | if (tableName.length() > 27) { 199 | //noinspection HardCodedStringLiteral 200 | return "PK_" + tableName.toUpperCase(Locale.US).substring(0, 27); 201 | } else { 202 | //noinspection HardCodedStringLiteral 203 | return "PK_" + tableName.toUpperCase(Locale.US); 204 | } 205 | } 206 | 207 | @Override 208 | public boolean isReservedWord(String objectName) { 209 | return reservedWords.contains(objectName.toUpperCase()); 210 | } 211 | 212 | @Override 213 | public boolean supportsSequences() { 214 | return true; 215 | } 216 | 217 | /** 218 | * Oracle supports catalogs in liquibase terms 219 | * 220 | * @return false 221 | */ 222 | @Override 223 | public boolean supportsSchemas() { 224 | return false; 225 | } 226 | 227 | @Override 228 | protected String getConnectionCatalogName() throws DatabaseException { 229 | if (getConnection() instanceof OfflineConnection) { 230 | return getConnection().getCatalog(); 231 | } 232 | try { 233 | //noinspection HardCodedStringLiteral 234 | return Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", this).queryForObject(new RawCallStatement("select sys_context( 'userenv', 'current_schema' ) from dual"), String.class); 235 | } catch (Exception e) { 236 | //noinspection HardCodedStringLiteral 237 | Scope.getCurrentScope().getLog(getClass()).info("Error getting default schema", e); 238 | } 239 | return null; 240 | } 241 | 242 | @Override 243 | public String getDefaultCatalogName() {//NOPMD 244 | return (super.getDefaultCatalogName() == null) ? null : super.getDefaultCatalogName().toUpperCase(Locale.US); 245 | } 246 | 247 | /** 248 | *

Returns an Oracle date literal with the same value as a string formatted using ISO 8601.

249 | * 250 | *

Convert an ISO8601 date string to one of the following results: 251 | * to_date('1995-05-23', 'YYYY-MM-DD') 252 | * to_date('1995-05-23 09:23:59', 'YYYY-MM-DD HH24:MI:SS')

253 | *

254 | * Implementation restriction:
255 | * Currently, only the following subsets of ISO8601 are supported:
256 | *

    257 | *
  • YYYY-MM-DD
  • 258 | *
  • YYYY-MM-DDThh:mm:ss
  • 259 | *
260 | */ 261 | @Override 262 | public String getDateLiteral(String isoDate) { 263 | String normalLiteral = super.getDateLiteral(isoDate); 264 | 265 | if (isDateOnly(isoDate)) { 266 | return "TO_DATE(" + normalLiteral + ", 'YYYY-MM-DD')"; 267 | } else if (isTimeOnly(isoDate)) { 268 | return "TO_DATE(" + normalLiteral + ", 'HH24:MI:SS')"; 269 | } else if (isTimestamp(isoDate)) { 270 | return "TO_TIMESTAMP(" + normalLiteral + ", 'YYYY-MM-DD HH24:MI:SS.FF')"; 271 | } else if (isDateTime(isoDate)) { 272 | int seppos = normalLiteral.lastIndexOf('.'); 273 | if (seppos != -1) { 274 | normalLiteral = normalLiteral.substring(0, seppos) + "'"; 275 | } 276 | return "TO_DATE(" + normalLiteral + ", 'YYYY-MM-DD HH24:MI:SS')"; 277 | } 278 | return "UNSUPPORTED:" + isoDate; 279 | } 280 | 281 | @Override 282 | public boolean isSystemObject(DatabaseObject example) { 283 | if (example == null) { 284 | return false; 285 | } 286 | 287 | if (this.isLiquibaseObject(example)) { 288 | return false; 289 | } 290 | 291 | if (example instanceof Schema) { 292 | //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral 293 | if ("SYSTEM".equals(example.getName()) || "SYS".equals(example.getName()) || "CTXSYS".equals(example.getName()) || "XDB".equals(example.getName())) { 294 | return true; 295 | } 296 | //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral 297 | if ("SYSTEM".equals(example.getSchema().getCatalogName()) || "SYS".equals(example.getSchema().getCatalogName()) || "CTXSYS".equals(example.getSchema().getCatalogName()) || "XDB".equals(example.getSchema().getCatalogName())) { 298 | return true; 299 | } 300 | } else if (isSystemObject(example.getSchema())) { 301 | return true; 302 | } 303 | if (example instanceof Catalog) { 304 | //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral 305 | if (("SYSTEM".equals(example.getName()) || "SYS".equals(example.getName()) || "CTXSYS".equals(example.getName()) || "XDB".equals(example.getName()))) { 306 | return true; 307 | } 308 | } else if (example.getName() != null) { 309 | //noinspection HardCodedStringLiteral 310 | if (example.getName().startsWith("BIN$")) { //oracle deleted table 311 | boolean filteredInOriginalQuery = this.canAccessDbaRecycleBin(); 312 | if (!filteredInOriginalQuery) { 313 | filteredInOriginalQuery = StringUtil.trimToEmpty(example.getSchema().getName()).equalsIgnoreCase(this.getConnection().getConnectionUserName()); 314 | } 315 | 316 | if (filteredInOriginalQuery) { 317 | return !((example instanceof PrimaryKey) || (example instanceof Index) || (example instanceof 318 | liquibase.statement.UniqueConstraint)); 319 | } else { 320 | return true; 321 | } 322 | } else //noinspection HardCodedStringLiteral 323 | if (example.getName().startsWith("AQ$")) { //oracle AQ tables 324 | return true; 325 | } else //noinspection HardCodedStringLiteral 326 | if (example.getName().startsWith("DR$")) { //oracle index tables 327 | return true; 328 | } else //noinspection HardCodedStringLiteral 329 | if (example.getName().startsWith("SYS_IOT_OVER")) { //oracle system table 330 | return true; 331 | } else //noinspection HardCodedStringLiteral,HardCodedStringLiteral 332 | if ((example.getName().startsWith("MDRT_") || example.getName().startsWith("MDRS_")) && example.getName().endsWith("$")) { 333 | // CORE-1768 - Oracle creates these for spatial indices and will remove them when the index is removed. 334 | return true; 335 | } else //noinspection HardCodedStringLiteral 336 | if (example.getName().startsWith("MLOG$_")) { //Created by materliaized view logs for every table that is part of a materialized view. Not available for DDL operations. 337 | return true; 338 | } else //noinspection HardCodedStringLiteral 339 | if (example.getName().startsWith("RUPD$_")) { //Created by materialized view log tables using primary keys. Not available for DDL operations. 340 | return true; 341 | } else //noinspection HardCodedStringLiteral 342 | if (example.getName().startsWith("WM$_")) { //Workspace Manager backup tables. 343 | return true; 344 | } else //noinspection HardCodedStringLiteral 345 | if ("CREATE$JAVA$LOB$TABLE".equals(example.getName())) { //This table contains the name of the Java object, the date it was loaded, and has a BLOB column to store the Java object. 346 | return true; 347 | } else //noinspection HardCodedStringLiteral 348 | if ("JAVA$CLASS$MD5$TABLE".equals(example.getName())) { //This is a hash table that tracks the loading of Java objects into a schema. 349 | return true; 350 | } else //noinspection HardCodedStringLiteral 351 | if (example.getName().startsWith("ISEQ$$_")) { //System-generated sequence 352 | return true; 353 | } else //noinspection HardCodedStringLiteral 354 | if (example.getName().startsWith("USLOG$")) { //for update materialized view 355 | return true; 356 | } else if (example.getName().startsWith("SYS_FBA")) { //for Flashback tables 357 | return true; 358 | } 359 | } 360 | 361 | return super.isSystemObject(example); 362 | } 363 | 364 | @Override 365 | public boolean supportsAutoIncrement() { 366 | // Oracle supports Identity beginning with version 12c 367 | boolean isAutoIncrementSupported = false; 368 | 369 | try { 370 | if (getDatabaseMajorVersion() >= 12) { 371 | isAutoIncrementSupported = true; 372 | } 373 | 374 | // Returning true will generate create table command with 'IDENTITY' clause, example: 375 | // CREATE TABLE AutoIncTest (IDPrimaryKey NUMBER(19) GENERATED BY DEFAULT AS IDENTITY NOT NULL, TypeID NUMBER(3) NOT NULL, Description NVARCHAR2(50), CONSTRAINT PK_AutoIncTest PRIMARY KEY (IDPrimaryKey)); 376 | 377 | // While returning false will continue to generate create table command without 'IDENTITY' clause, example: 378 | // CREATE TABLE AutoIncTest (IDPrimaryKey NUMBER(19) NOT NULL, TypeID NUMBER(3) NOT NULL, Description NVARCHAR2(50), CONSTRAINT PK_AutoIncTest PRIMARY KEY (IDPrimaryKey)); 379 | 380 | } catch (DatabaseException ex) { 381 | isAutoIncrementSupported = false; 382 | } 383 | 384 | return isAutoIncrementSupported; 385 | } 386 | 387 | 388 | // public Set findUniqueConstraints(String schema) throws DatabaseException { 389 | // Set returnSet = new HashSet(); 390 | // 391 | // List maps = new Executor(this).queryForList(new RawSqlStatement("SELECT UC.CONSTRAINT_NAME, UCC.TABLE_NAME, UCC.COLUMN_NAME FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC WHERE UC.CONSTRAINT_NAME=UCC.CONSTRAINT_NAME AND CONSTRAINT_TYPE='U' ORDER BY UC.CONSTRAINT_NAME")); 392 | // 393 | // UniqueConstraint constraint = null; 394 | // for (Map map : maps) { 395 | // if (constraint == null || !constraint.getName().equals(constraint.getName())) { 396 | // returnSet.add(constraint); 397 | // Table table = new Table((String) map.get("TABLE_NAME")); 398 | // constraint = new UniqueConstraint(map.get("CONSTRAINT_NAME").toString(), table); 399 | // } 400 | // } 401 | // if (constraint != null) { 402 | // returnSet.add(constraint); 403 | // } 404 | // 405 | // return returnSet; 406 | // } 407 | 408 | @Override 409 | public boolean supportsRestrictForeignKeys() { 410 | return false; 411 | } 412 | 413 | @Override 414 | public int getDataTypeMaxParameters(String dataTypeName) { 415 | //noinspection HardCodedStringLiteral 416 | if ("BINARY_FLOAT".equals(dataTypeName.toUpperCase())) { 417 | return 0; 418 | } 419 | //noinspection HardCodedStringLiteral 420 | if ("BINARY_DOUBLE".equals(dataTypeName.toUpperCase())) { 421 | return 0; 422 | } 423 | return super.getDataTypeMaxParameters(dataTypeName); 424 | } 425 | 426 | public String getSystemTableWhereClause(String tableNameColumn) { 427 | List clauses = new ArrayList(Arrays.asList("BIN$", 428 | "AQ$", 429 | "DR$", 430 | "SYS_IOT_OVER", 431 | "MLOG$_", 432 | "RUPD$_", 433 | "WM$_", 434 | "ISEQ$$_", 435 | "USLOG$", 436 | "SYS_FBA")); 437 | 438 | for (int i = 0;i getUserDefinedTypes() { 450 | if (userDefinedTypes == null) { 451 | userDefinedTypes = new HashSet<>(); 452 | if ((getConnection() != null) && !(getConnection() instanceof OfflineConnection)) { 453 | try { 454 | try { 455 | //noinspection HardCodedStringLiteral 456 | userDefinedTypes.addAll(Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", this).queryForList(new RawSqlStatement("SELECT DISTINCT TYPE_NAME FROM ALL_TYPES"), String.class)); 457 | } catch (DatabaseException e) { //fall back to USER_TYPES if the user cannot see ALL_TYPES 458 | //noinspection HardCodedStringLiteral 459 | userDefinedTypes.addAll(Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", this).queryForList(new RawSqlStatement("SELECT TYPE_NAME FROM USER_TYPES"), String.class)); 460 | } 461 | } catch (DatabaseException e) { 462 | //ignore error 463 | } 464 | } 465 | } 466 | 467 | return userDefinedTypes; 468 | } 469 | 470 | @Override 471 | public String generateDatabaseFunctionValue(DatabaseFunction databaseFunction) { 472 | //noinspection HardCodedStringLiteral 473 | if ((databaseFunction != null) && "current_timestamp".equalsIgnoreCase(databaseFunction.toString())) { 474 | return databaseFunction.toString(); 475 | } 476 | if ((databaseFunction instanceof SequenceNextValueFunction) || (databaseFunction instanceof 477 | SequenceCurrentValueFunction)) { 478 | String quotedSeq = super.generateDatabaseFunctionValue(databaseFunction); 479 | // replace "myschema.my_seq".nextval with "myschema"."my_seq".nextval 480 | return quotedSeq.replaceFirst("\"([^\\.\"]+)\\.([^\\.\"]+)\"", "\"$1\".\"$2\""); 481 | 482 | } 483 | 484 | return super.generateDatabaseFunctionValue(databaseFunction); 485 | } 486 | 487 | @Override 488 | public ValidationErrors validate() { 489 | ValidationErrors errors = super.validate(); 490 | DatabaseConnection connection = getConnection(); 491 | if ((connection == null) || (connection instanceof OfflineConnection)) { 492 | //noinspection HardCodedStringLiteral 493 | Scope.getCurrentScope().getLog(getClass()).info("Cannot validate offline database"); 494 | return errors; 495 | } 496 | 497 | if (!canAccessDbaRecycleBin()) { 498 | errors.addWarning(getDbaRecycleBinWarning()); 499 | } 500 | 501 | return errors; 502 | 503 | } 504 | 505 | public String getDbaRecycleBinWarning() { 506 | //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral, 507 | // HardCodedStringLiteral 508 | //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral 509 | return "Liquibase needs to access the DBA_RECYCLEBIN table so we can automatically handle the case where " + 510 | "constraints are deleted and restored. Since Oracle doesn't properly restore the original table names " + 511 | "referenced in the constraint, we use the information from the DBA_RECYCLEBIN to automatically correct this" + 512 | " issue.\n" + 513 | "\n" + 514 | "The user you used to connect to the database (" + getConnection().getConnectionUserName() + 515 | ") needs to have \"SELECT ON SYS.DBA_RECYCLEBIN\" permissions set before we can perform this operation. " + 516 | "Please run the following SQL to set the appropriate permissions, and try running the command again.\n" + 517 | "\n" + 518 | " GRANT SELECT ON SYS.DBA_RECYCLEBIN TO " + getConnection().getConnectionUserName() + ";"; 519 | } 520 | 521 | public boolean canAccessDbaRecycleBin() { 522 | if (canAccessDbaRecycleBin == null) { 523 | DatabaseConnection connection = getConnection(); 524 | if ((connection == null) || (connection instanceof OfflineConnection)) { 525 | return false; 526 | } 527 | 528 | Statement statement = null; 529 | try { 530 | statement = ((JdbcConnection) connection).createStatement(); 531 | @SuppressWarnings("HardCodedStringLiteral") ResultSet resultSet = statement.executeQuery("select 1 from dba_recyclebin where 0=1"); 532 | resultSet.close(); //don't need to do anything with the result set, just make sure statement ran. 533 | this.canAccessDbaRecycleBin = true; 534 | } catch (Exception e) { 535 | //noinspection HardCodedStringLiteral 536 | if ((e instanceof SQLException) && e.getMessage().startsWith("ORA-00942")) { //ORA-00942: table or view does not exist 537 | this.canAccessDbaRecycleBin = false; 538 | } else { 539 | //noinspection HardCodedStringLiteral 540 | Scope.getCurrentScope().getLog(getClass()).warning("Cannot check dba_recyclebin access", e); 541 | this.canAccessDbaRecycleBin = false; 542 | } 543 | } finally { 544 | JdbcUtils.close(null, statement); 545 | } 546 | } 547 | 548 | return canAccessDbaRecycleBin; 549 | } 550 | 551 | @Override 552 | public boolean supportsNotNullConstraintNames() { 553 | return true; 554 | } 555 | 556 | /** 557 | * Tests if the given String would be a valid identifier in Oracle DBMS. In Oracle, a valid identifier has 558 | * the following form (case-insensitive comparison): 559 | * 1st character: A-Z 560 | * 2..n characters: A-Z0-9$_# 561 | * The maximum length of an identifier differs by Oracle version and object type. 562 | */ 563 | public boolean isValidOracleIdentifier(String identifier, Class type) { 564 | if ((identifier == null) || (identifier.length() < 1)) 565 | return false; 566 | 567 | if (!identifier.matches("^(i?)[A-Z][A-Z0-9\\$\\_\\#]*$")) 568 | return false; 569 | 570 | /* 571 | * @todo It seems we currently do not have a class for tablespace identifiers, and all other classes 572 | * we do know seem to be supported as 12cR2 long identifiers, so: 573 | */ 574 | return (identifier.length() <= LONG_IDENTIFIERS_LEGNTH); 575 | } 576 | 577 | /** 578 | * Returns the maximum number of bytes (NOT: characters) for an identifier. For Oracle <=12c Release 20, this 579 | * is 30 bytes, and starting from 12cR2, up to 128 (except for tablespaces, PDB names and some other rather rare 580 | * object types). 581 | * 582 | * @return the maximum length of an object identifier, in bytes 583 | */ 584 | public int getIdentifierMaximumLength() { 585 | try { 586 | if (getDatabaseMajorVersion() < ORACLE_12C_MAJOR_VERSION) { 587 | return SHORT_IDENTIFIERS_LENGTH; 588 | } else if ((getDatabaseMajorVersion() == ORACLE_12C_MAJOR_VERSION) && (getDatabaseMinorVersion() <= 1)) { 589 | return SHORT_IDENTIFIERS_LENGTH; 590 | } else { 591 | return LONG_IDENTIFIERS_LEGNTH; 592 | } 593 | } catch (DatabaseException ex) { 594 | throw new UnexpectedLiquibaseException("Cannot determine the Oracle database version number", ex); 595 | } 596 | 597 | } 598 | } 599 | -------------------------------------------------------------------------------- /script/sql/dm/flowable-patch/src/main/java/liquibase/datatype/core/BooleanType.java: -------------------------------------------------------------------------------- 1 | package liquibase.datatype.core; 2 | 3 | import liquibase.change.core.LoadDataChange; 4 | import liquibase.database.Database; 5 | import liquibase.database.core.*; 6 | import liquibase.datatype.DataTypeInfo; 7 | import liquibase.datatype.DatabaseDataType; 8 | import liquibase.datatype.LiquibaseDataType; 9 | import liquibase.exception.UnexpectedLiquibaseException; 10 | import liquibase.statement.DatabaseFunction; 11 | import liquibase.util.StringUtil; 12 | 13 | import java.util.Locale; 14 | import java.util.regex.Pattern; 15 | 16 | @DataTypeInfo(name = "boolean", aliases = {"java.sql.Types.BOOLEAN", "java.lang.Boolean", "bit", "bool"}, minParameters = 0, maxParameters = 0, priority = LiquibaseDataType.PRIORITY_DEFAULT) 17 | public class BooleanType extends LiquibaseDataType { 18 | 19 | @Override 20 | public DatabaseDataType toDatabaseDataType(Database database) { 21 | String originalDefinition = StringUtil.trimToEmpty(getRawDefinition()); 22 | if ((database instanceof Firebird3Database)) { 23 | return new DatabaseDataType("BOOLEAN"); 24 | } 25 | 26 | if ((database instanceof Db2zDatabase) || (database instanceof FirebirdDatabase)) { 27 | return new DatabaseDataType("SMALLINT"); 28 | } else if (database instanceof MSSQLDatabase) { 29 | return new DatabaseDataType(database.escapeDataTypeName("bit")); 30 | } else if (database instanceof MySQLDatabase) { 31 | if (originalDefinition.toLowerCase(Locale.US).startsWith("bit")) { 32 | return new DatabaseDataType("BIT", getParameters()); 33 | } 34 | return new DatabaseDataType("BIT", 1); 35 | } else if (database instanceof OracleDatabase) { 36 | return new DatabaseDataType("NUMBER", 1); 37 | } else if ((database instanceof SybaseASADatabase) || (database instanceof SybaseDatabase)) { 38 | return new DatabaseDataType("BIT"); 39 | } else if (database instanceof DerbyDatabase) { 40 | if (((DerbyDatabase) database).supportsBooleanDataType()) { 41 | return new DatabaseDataType("BOOLEAN"); 42 | } else { 43 | return new DatabaseDataType("SMALLINT"); 44 | } 45 | } else if (database instanceof DB2Database) { 46 | if (((DB2Database) database).supportsBooleanDataType()) 47 | return new DatabaseDataType("BOOLEAN"); 48 | else 49 | return new DatabaseDataType("SMALLINT"); 50 | } else if (database instanceof HsqlDatabase) { 51 | return new DatabaseDataType("BOOLEAN"); 52 | } else if (database instanceof PostgresDatabase) { 53 | if (originalDefinition.toLowerCase(Locale.US).startsWith("bit")) { 54 | return new DatabaseDataType("BIT", getParameters()); 55 | } 56 | } else if (database instanceof DmDatabase) { // dhb52: DM Support 57 | return new DatabaseDataType("bit"); 58 | } 59 | 60 | return super.toDatabaseDataType(database); 61 | } 62 | 63 | @Override 64 | public String objectToSql(Object value, Database database) { 65 | if ((value == null) || "null".equals(value.toString().toLowerCase(Locale.US))) { 66 | return null; 67 | } 68 | 69 | String returnValue; 70 | if (value instanceof String) { 71 | value = ((String) value).replaceAll("'", ""); 72 | if ("true".equals(((String) value).toLowerCase(Locale.US)) || "1".equals(value) || "b'1'".equals(((String) value).toLowerCase(Locale.US)) || "t".equals(((String) value).toLowerCase(Locale.US)) || ((String) value).toLowerCase(Locale.US).equals(this.getTrueBooleanValue(database).toLowerCase(Locale.US))) { 73 | returnValue = this.getTrueBooleanValue(database); 74 | } else if ("false".equals(((String) value).toLowerCase(Locale.US)) || "0".equals(value) || "b'0'".equals( 75 | ((String) value).toLowerCase(Locale.US)) || "f".equals(((String) value).toLowerCase(Locale.US)) || ((String) value).toLowerCase(Locale.US).equals(this.getFalseBooleanValue(database).toLowerCase(Locale.US))) { 76 | returnValue = this.getFalseBooleanValue(database); 77 | } else if (database instanceof PostgresDatabase && Pattern.matches("b?([01])\\1*(::bit|::\"bit\")?", (String) value)) { 78 | returnValue = "b'" 79 | + value.toString() 80 | .replace("b", "") 81 | .replace("\"", "") 82 | .replace("::it", "") 83 | + "'::\"bit\""; 84 | } else { 85 | throw new UnexpectedLiquibaseException("Unknown boolean value: " + value); 86 | } 87 | } else if (value instanceof Long) { 88 | if (Long.valueOf(1).equals(value)) { 89 | returnValue = this.getTrueBooleanValue(database); 90 | } else { 91 | returnValue = this.getFalseBooleanValue(database); 92 | } 93 | } else if (value instanceof Number) { 94 | if (value.equals(1) || "1".equals(value.toString()) || "1.0".equals(value.toString())) { 95 | returnValue = this.getTrueBooleanValue(database); 96 | } else { 97 | returnValue = this.getFalseBooleanValue(database); 98 | } 99 | } else if (value instanceof DatabaseFunction) { 100 | return value.toString(); 101 | } else if (value instanceof Boolean) { 102 | if (((Boolean) value)) { 103 | returnValue = this.getTrueBooleanValue(database); 104 | } else { 105 | returnValue = this.getFalseBooleanValue(database); 106 | } 107 | } else { 108 | throw new UnexpectedLiquibaseException("Cannot convert type " + value.getClass() + " to a boolean value"); 109 | } 110 | 111 | return returnValue; 112 | } 113 | 114 | protected boolean isNumericBoolean(Database database) { 115 | if (database instanceof Firebird3Database) { 116 | return false; 117 | } 118 | if (database instanceof DerbyDatabase) { 119 | return !((DerbyDatabase) database).supportsBooleanDataType(); 120 | } else if (database instanceof DB2Database) { 121 | return !((DB2Database) database).supportsBooleanDataType(); 122 | } 123 | return (database instanceof Db2zDatabase) 124 | || (database instanceof FirebirdDatabase) 125 | || (database instanceof MSSQLDatabase) 126 | || (database instanceof MySQLDatabase) 127 | || (database instanceof OracleDatabase) 128 | || (database instanceof SQLiteDatabase) 129 | || (database instanceof SybaseASADatabase) 130 | || (database instanceof SybaseDatabase) 131 | || (database instanceof DmDatabase); // dhb52: DM Support 132 | } 133 | 134 | /** 135 | * The database-specific value to use for "false" "boolean" columns. 136 | */ 137 | public String getFalseBooleanValue(Database database) { 138 | if (isNumericBoolean(database)) { 139 | return "0"; 140 | } 141 | if (database instanceof InformixDatabase) { 142 | return "'f'"; 143 | } 144 | return "FALSE"; 145 | } 146 | 147 | /** 148 | * The database-specific value to use for "true" "boolean" columns. 149 | */ 150 | public String getTrueBooleanValue(Database database) { 151 | if (isNumericBoolean(database)) { 152 | return "1"; 153 | } 154 | if (database instanceof InformixDatabase) { 155 | return "'t'"; 156 | } 157 | return "TRUE"; 158 | } 159 | 160 | @Override 161 | public LoadDataChange.LOAD_DATA_TYPE getLoadTypeName() { 162 | return LoadDataChange.LOAD_DATA_TYPE.BOOLEAN; 163 | } 164 | 165 | } 166 | -------------------------------------------------------------------------------- /script/sql/dm/flowable-patch/src/main/resources/META-INF/package-info.md: -------------------------------------------------------------------------------- 1 | 防止IDEA将`.`和`/`混为一谈 -------------------------------------------------------------------------------- /script/sql/dm/flowable-patch/src/main/resources/META-INF/services/liquibase.database.Database: -------------------------------------------------------------------------------- 1 | liquibase.database.core.CockroachDatabase 2 | liquibase.database.core.DB2Database 3 | liquibase.database.core.Db2zDatabase 4 | liquibase.database.core.DerbyDatabase 5 | liquibase.database.core.Firebird3Database 6 | liquibase.database.core.FirebirdDatabase 7 | liquibase.database.core.H2Database 8 | liquibase.database.core.HsqlDatabase 9 | liquibase.database.core.InformixDatabase 10 | liquibase.database.core.Ingres9Database 11 | liquibase.database.core.MSSQLDatabase 12 | liquibase.database.core.MariaDBDatabase 13 | liquibase.database.core.MockDatabase 14 | liquibase.database.core.MySQLDatabase 15 | liquibase.database.core.OracleDatabase 16 | liquibase.database.core.PostgresDatabase 17 | liquibase.database.core.SQLiteDatabase 18 | liquibase.database.core.SybaseASADatabase 19 | liquibase.database.core.SybaseDatabase 20 | liquibase.database.core.DmDatabase 21 | liquibase.database.core.UnsupportedDatabase 22 | --------------------------------------------------------------------------------