diff --git a/RuoYi-Vue/README.md b/RuoYi-Vue/README.md index e5a47b8..741a2c4 100644 --- a/RuoYi-Vue/README.md +++ b/RuoYi-Vue/README.md @@ -1,96 +1,243 @@ -

- logo -

-

RuoYi v3.8.8

-

基于SpringBoot+Vue前后端分离的Java快速开发框架

-

- - - -

+# RuoYi-Vue 代码生成平台 -## 平台简介 +基于 RuoYi-Vue v3.8.8 二次开发的前后端分离后台管理系统。项目保留若依的用户、角色、菜单、日志、监控、定时任务、代码生成等基础能力,并在 `ruoyi-generator` 与 `ruoyi-ui/src/views/generator` 下扩展了项目级代码生成平台能力。 -若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 +当前仓库更适合按“后台基础框架 + 可配置代码生成平台”来理解:先用若依提供认证、权限、菜单、数据权限、日志和基础运维能力,再围绕项目、数据源、模板、模块、代码片段和项目结构生成完整代码包。 -* 前端采用Vue、Element UI。 -* 后端采用Spring Boot、Spring Security、Redis & Jwt。 -* 权限认证使用Jwt,支持多终端认证系统。 -* 支持加载动态权限菜单,多方式轻松权限控制。 -* 高效率开发,使用代码生成器可以一键生成前后端代码。 -* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。 -* 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 -* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) -* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)   -* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)   +## 技术栈 -## 内置功能 +| 层级 | 技术 | +| --- | --- | +| 后端 | Java 8、Spring Boot 2.5.15、Spring Framework 5.3.39、Spring Security 5.7.12 | +| 数据访问 | MyBatis、PageHelper、Druid、MySQL | +| 缓存与任务 | Redis、Quartz | +| 接口与工具 | JWT、Swagger/Springfox 3、Velocity、Fastjson2、Apache POI、OSHI | +| 前端 | Vue 2.6.12、Vue CLI 4.4.6、Element UI 2.15.14、Vue Router、Vuex、Axios | +| 构建 | Maven、npm | -1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 -2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 -3. 岗位管理:配置系统用户所属担任职务。 -4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 -5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 -6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 -7. 参数管理:对系统动态配置常用参数。 -8. 通知公告:系统通知公告信息发布维护。 -9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 -10. 登录日志:系统登录日志记录查询包含登录异常。 -11. 在线用户:当前系统中活跃用户状态监控。 -12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 -13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 -14. 系统接口:根据业务代码自动生成相关的api接口文档。 -15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 -16. 缓存监控:对系统的缓存信息查询,命令统计等。 -17. 在线构建器:拖动表单元素生成相应的HTML代码。 -18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 +## 架构概览 -## 在线体验 +```mermaid +flowchart LR + A["浏览器 / ruoyi-ui"] --> B["Vue DevServer
/dev-api 代理"] + B --> C["ruoyi-admin
Spring Boot 入口"] + C --> D["ruoyi-framework
安全、配置、Web 基础设施"] + C --> E["ruoyi-system
用户、角色、菜单、字典等"] + C --> F["ruoyi-generator
代码生成与扩展平台"] + C --> G["ruoyi-quartz
定时任务"] + C --> H["MySQL"] + C --> I["Redis"] + F --> J["Velocity 模板"] + F --> K["代码预览 / ZIP 下载"] +``` -- admin/admin123 -- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 +## 目录结构 -演示地址:http://vue.ruoyi.vip -文档地址:http://doc.ruoyi.vip +| 路径 | 说明 | +| --- | --- | +| `ruoyi-admin` | 后端启动入口,打包为可执行 `war`;包含 Web Controller、配置文件和静态资源入口。 | +| `ruoyi-framework` | 若依框架层,承载安全认证、权限校验、数据源、Web 配置、拦截器、异步任务等基础能力。 | +| `ruoyi-system` | 系统管理业务模块,包括用户、角色、菜单、部门、岗位、字典、参数、通知公告、日志等。 | +| `ruoyi-quartz` | 定时任务模块,封装 Quartz 任务、任务日志和调度管理。 | +| `ruoyi-generator` | 代码生成模块;包含若依原生表驱动代码生成,以及本项目扩展的项目、模板、数据源、模块、代码片段、项目结构等功能。 | +| `ruoyi-common` | 通用工具、常量、注解、基础实体、响应对象、异常、工具类等公共代码。 | +| `ruoyi-ui` | Vue 2 + Element UI 前端工程。 | +| `sql` | 数据库初始化与扩展脚本。 | +| `doc` | 代码生成平台规划文档。 | +| `docs` | 部分扩展 Controller 的接口说明文档。 | +| `bin`、`ry.bat`、`ry.sh` | 启停脚本与辅助脚本。 | -## 演示图 +## 核心功能 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+### 若依基础能力 +- 用户、角色、菜单、部门、岗位管理。 +- 字典、参数、通知公告管理。 +- 登录日志、操作日志、在线用户管理。 +- 服务监控、缓存监控、Druid 连接池监控。 +- Quartz 定时任务与任务日志。 +- Swagger 接口文档、表单构建、若依原生代码生成。 -## 若依前后端分离交流群 +### 代码生成平台扩展 -QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/已满-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![加入QQ群](https://img.shields.io/badge/已满-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![加入QQ群](https://img.shields.io/badge/已满-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![加入QQ群](https://img.shields.io/badge/已满-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![加入QQ群](https://img.shields.io/badge/已满-138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [![加入QQ群](https://img.shields.io/badge/151450850-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) 点击按钮入群。 \ No newline at end of file +| 功能 | 后端接口前缀 | 前端位置 | +| --- | --- | --- | +| 数据源管理 | `/generator/datasource` | `ruoyi-ui/src/views/generator/datasource` | +| 项目管理 | `/generator/project` | `ruoyi-ui/src/views/generator/project` | +| 项目关联表 | `/generator/project/table` | `ProjectTableConfig.vue` | +| 项目关联模块 | `/generator/project/module` | `ProjectModuleConfig.vue` | +| 项目模板配置 | `/generator/project/template` | `ProjectTemplateConfig.vue` | +| 项目结构树 | `/generator/structure` | `ruoyi-ui/src/views/generator/structure` | +| 模板管理 | `/generator/template` | `ruoyi-ui/src/views/generator/template` | +| 模板文件管理 | `/generator/templateFile` | `templateFile.js` 与模板相关页面 | +| 功能模块管理 | `/generator/module` | `ruoyi-ui/src/views/generator/module` | +| 代码片段管理 | `/generator/snippet` | `ruoyi-ui/src/views/generator/snippet` | +| 原生表代码生成 | `/tool/gen` | `ruoyi-ui/src/views/tool/gen` | + +扩展生成链路大致为:维护数据源和数据表,配置项目基本信息、项目关联表、模块、模板和结构树,通过 `GenProjectController` 预览或下载项目结构与生成代码。 + +## 本地启动 + +### 1. 环境准备 + +- JDK 1.8 +- Maven 3.6+ +- MySQL 5.7/8.0 +- Redis 5+ +- Node.js:`package.json` 要求 `>=8.9`,实际开发建议使用 Node 14/16 LTS +- npm 6+ + +### 2. 初始化数据库 + +默认数据库配置在 `ruoyi-admin/src/main/resources/application-druid.yml`: + +```yaml +spring: + datasource: + druid: + master: + url: jdbc:mysql://localhost:3306/ry + username: root + password: 123456 +``` + +创建数据库: + +```sql +CREATE DATABASE ry DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +``` + +新库推荐直接导入完整脚本: + +```bash +mysql -uroot -p ry < sql/db.sql +``` + +`sql/db.sql` 已整合若依基础表、Quartz 调度表、代码生成平台扩展表、初始化数据、代码生成平台菜单和按钮权限。分散脚本仍可作为增量或排查参考: + +1. `sql/ry_20240629.sql`:若依基础表与基础数据。 +2. `sql/quartz.sql`:Quartz 调度表。 +3. `sql/gen_project.sql`:项目基础信息表 `gen_project`。 +4. `sql/module_management.sql`:功能模块、代码片段、项目模块关系表。 +5. `sql/gen_table_project_rel.sql`:项目与代码生成表关系。 +6. `sql/sys_project_structure.sql`:项目结构节点表与初始化结构。 +7. `sql/add_create_table_sql_field.sql`:给 `gen_table` 增加建表 SQL 字段。 +8. `ruoyi-generator/sql/template_file_update.sql`:模板文件表增量字段。 + +### 3. 配置后端 + +重点检查以下配置: + +| 文件 | 关键项 | +| --- | --- | +| `ruoyi-admin/src/main/resources/application.yml` | `server.port` 默认 `8080`,`server.servlet.context-path` 默认 `/`,Redis 地址,上传目录 `ruoyi.profile`,Swagger 开关。 | +| `ruoyi-admin/src/main/resources/application-druid.yml` | MySQL 地址、账号、密码、Druid 控制台账号。 | +| `ruoyi-generator/src/main/resources/generator.yml` | 代码生成默认作者、包名、表前缀策略。 | + +启动后端: + +```bash +mvn clean install -DskipTests +mvn -pl ruoyi-admin -am spring-boot:run +``` + +也可以打包后运行: + +```bash +mvn clean package -DskipTests +java -jar ruoyi-admin/target/ruoyi-admin.war +``` + +后端默认地址:`http://localhost:8080` + +### 4. 启动前端 + +```bash +cd ruoyi-ui +npm install --registry=https://registry.npmmirror.com +npm run dev +``` + +前端默认端口来自 `ruoyi-ui/vue.config.js`,为 `80`。开发环境的 `VUE_APP_BASE_API=/dev-api`,会代理到 `http://localhost:8080/`。 + +浏览器访问:`http://localhost:80` + +默认账号: + +```text +admin / admin123 +``` + +如果本机 80 端口被占用,可以临时指定端口: + +```bash +# Windows PowerShell +$env:port=81 +npm run dev +``` + +## 构建与发布 + +后端构建: + +```bash +mvn clean package -DskipTests +``` + +产物位于: + +```text +ruoyi-admin/target/ruoyi-admin.war +``` + +前端构建: + +```bash +cd ruoyi-ui +npm run build:prod +``` + +产物位于: + +```text +ruoyi-ui/dist +``` + +生产环境需要注意: + +- `ruoyi-ui/vue.config.js` 中生产 `publicPath` 为 `/yidaima`。 +- `ruoyi-ui/.env.production` 中接口前缀为 `/prod-api`。 +- 如果部署在子路径或网关后面,需要同步调整 Nginx、前端 `publicPath`、接口代理和后端 `context-path`。 + +## 常用入口 + +| 入口 | 地址 | +| --- | --- | +| 后端服务 | `http://localhost:8080` | +| 前端页面 | `http://localhost:80` | +| Swagger UI | `http://localhost:8080/swagger-ui/index.html` | +| Druid 控制台 | `http://localhost:8080/druid`,默认 `ruoyi / 123456` | + +## 开发约定 + +- 后端扩展 Controller 主要位于 `ruoyi-generator/src/main/java/com/ruoyi/generator/controller`。 +- 后端扩展实体、Mapper、Service 位于 `ruoyi-generator/src/main/java/com/ruoyi/generator/{domain,mapper,service}`。 +- MyBatis XML 位于 `ruoyi-generator/src/main/resources/mapper/generator`。 +- 前端接口封装位于 `ruoyi-ui/src/api/generator`。 +- 前端扩展页面位于 `ruoyi-ui/src/views/generator`。 +- 权限标识沿用若依格式,例如 `generator:project:list`、`generator:template:add`、`tool:gen:preview`。 +- 代码生成模板分为若依默认模板 `ruoyi-generator/src/main/resources/vm` 与扩展模板目录 `ruoyi-generator/src/main/resources/qing`。 + +## 文档索引 + +- `doc/code-generator-platform.md`:代码生成平台功能规划。 +- `docs/*.md`:扩展 Controller 的接口说明。 +- `ruoyi-ui/README.md`:前端工程原始启动说明。 +- 若依官方文档:`http://doc.ruoyi.vip` + +## 排查提示 + +- 后端启动失败优先检查 MySQL、Redis 是否启动,以及 `application-druid.yml` 中数据库账号密码是否正确。 +- 前端请求 404 或跨域异常时,检查 `.env.development` 的 `VUE_APP_BASE_API` 与 `vue.config.js` 的代理目标。 +- 使用生产构建部署到非根路径时,检查 `/yidaima`、`/prod-api` 与网关转发规则是否一致。 +- 生成平台页面报表不存在时,优先核对扩展 SQL 是否已导入,尤其是模板、数据源、项目结构和项目关联表。 diff --git a/RuoYi-Vue/ruoyi-generator/pom.xml b/RuoYi-Vue/ruoyi-generator/pom.xml index 8e47f0c..73ff35c 100644 --- a/RuoYi-Vue/ruoyi-generator/pom.xml +++ b/RuoYi-Vue/ruoyi-generator/pom.xml @@ -35,6 +35,18 @@ druid-spring-boot-starter + + junit + junit + test + + + + org.mockito + mockito-core + test + + - \ No newline at end of file + diff --git a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenProjectServiceImpl.java b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenProjectServiceImpl.java index 266f8ac..6b9c63b 100644 --- a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenProjectServiceImpl.java +++ b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenProjectServiceImpl.java @@ -117,10 +117,7 @@ public class GenProjectServiceImpl implements IGenProjectService { */ @Override public List> getProjectStructure(Long projectId, String type) { - GenProject project = genProjectMapper.selectGenProjectById(projectId); - if (project == null) { - return new ArrayList<>(); - } + GenProject project = getRequiredProject(projectId); List projectTables = genTableMapper.selectGenTablesByProjectId(projectId); project.setTables(projectTables); @@ -128,95 +125,39 @@ public class GenProjectServiceImpl implements IGenProjectService { List> structure = new ArrayList<>(); // 获取项目模板 - SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type); - if (projectTemplate == null) { - return structure; - } + SysProjectTemplate projectTemplate = getRequiredProjectTemplate(project, type); // 获取模板关联的项目结构节点 List structureNodes = sysProjectStructureService.selectProjectStructureListByModule(project.getProjectId(), projectTemplate.getTemplateId()); // 构建树形结构 - Map> nodeMap = new HashMap<>(); + Map sourceNodeMap = new HashMap<>(); + Map> nodeMap = new LinkedHashMap<>(); for (SysProjectStructure node : structureNodes) { - Map nodeData = new HashMap<>(); - String nodeName = node.getNodeName(); - if(nodeName.contains("{projectName}")){ - nodeName = nodeName.replace("{projectName}", project.getProjectFileName()); - } else if(nodeName.contains("{packageName}")){ - nodeName = nodeName.replace("{packageName}", project.getPackageName()); - } - Long tableId = node.getTableId(); - if(tableId != null && tableId == 0){ - for(GenTable table : projectTables){ - Map tableNodeData = new HashMap<>(); - String tableNodeName = nodeName; - if(tableNodeName.contains("{ClassName}")){ - tableNodeName = tableNodeName.replace("{ClassName}", table.getClassName()); - } - Long nodeId = node.getNodeId() * 1000 + table.getTableId(); - tableNodeData.put("id", nodeId); - tableNodeData.put("name", tableNodeName); - tableNodeData.put("type", node.getNodeType()); - tableNodeData.put("category", node.getCategory()); - tableNodeData.put("tableId", table.getTableId()); - nodeMap.put(nodeId, tableNodeData); + sourceNodeMap.put(node.getNodeId(), node); + if (isTableScopedNode(node)) { + for (GenTable table : projectTables) { + Map tableNodeData = createStructureNodeData(node, project, table); + nodeMap.put(getNodeKey(node.getNodeId(), table.getTableId()), tableNodeData); } - } else{ - nodeData.put("id", node.getNodeId()); - nodeData.put("name", nodeName); - nodeData.put("type", node.getNodeType()); - nodeData.put("category", node.getCategory()); - nodeData.put("tableId", tableId); - nodeMap.put(node.getNodeId(), nodeData); - } - - - if ("folder".equals(node.getNodeType())) { - nodeData.put("children", new ArrayList<>()); - nodeMap.put(node.getNodeId(), nodeData); + } else { + Map nodeData = createStructureNodeData(node, project, null); + nodeMap.put(getNodeKey(node.getNodeId(), null), nodeData); } } // 构建父子关系 for (SysProjectStructure node : structureNodes) { - if (node.getTableId() != null && node.getTableId() == 0) { + if (isTableScopedNode(node)) { // 处理表特定的节点 for (GenTable table : projectTables) { - Long nodeId = node.getNodeId() * 1000 + table.getTableId(); - Map nodeData = nodeMap.get(nodeId); - if (nodeData != null) { - if (node.getParentId() == 0) { - structure.add(nodeData); - } else { - Map parentNode = nodeMap.get(node.getParentId()); - if (parentNode != null) { - @SuppressWarnings("unchecked") - List> children = (List>) parentNode.get("children"); - if (children != null) { - children.add(nodeData); - } - } - } - } + Map nodeData = nodeMap.get(getNodeKey(node.getNodeId(), table.getTableId())); + addNodeToParent(structure, nodeData, node, nodeMap, sourceNodeMap, table); } } else { // 处理普通节点 - Map nodeData = nodeMap.get(node.getNodeId()); - if (nodeData != null) { - if (node.getParentId() == 0) { - structure.add(nodeData); - } else { - Map parentNode = nodeMap.get(node.getParentId()); - if (parentNode != null) { - @SuppressWarnings("unchecked") - List> children = (List>) parentNode.get("children"); - if (children != null) { - children.add(nodeData); - } - } - } - } + Map nodeData = nodeMap.get(getNodeKey(node.getNodeId(), null)); + addNodeToParent(structure, nodeData, node, nodeMap, sourceNodeMap, null); } } @@ -225,10 +166,7 @@ public class GenProjectServiceImpl implements IGenProjectService { @Override public byte[] downloadStructure(Long projectId, String type) { - GenProject project = genProjectMapper.selectGenProjectById(projectId); - if (project == null) { - throw new ServiceException("项目不存在"); - } + GenProject project = getRequiredProject(projectId); List projectTables = genTableMapper.selectGenTablesByProjectId(projectId); project.setTables(projectTables); @@ -296,7 +234,7 @@ public class GenProjectServiceImpl implements IGenProjectService { public Map previewCode(Long projectId, Long tableId, String keyword, String type) { Map dataMap = new LinkedHashMap<>(); - GenProject project = genProjectMapper.selectGenProjectById(projectId); + GenProject project = getRequiredProject(projectId); List projectTables = genTableMapper.selectGenTablesByProjectId(projectId); project.setTables(projectTables); @@ -305,38 +243,15 @@ public class GenProjectServiceImpl implements IGenProjectService { List modules = sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter); VelocityInitializer.initVelocity(); - VelocityContext context = null; - String tplCategory = ""; - - if(!Objects.isNull(tableId) && tableId != -1){ - // 查询表信息 - GenTable table = genTableMapper.selectGenTableById(tableId); - table.setModules(modules); - tplCategory = table.getTplCategory(); - table.setPackageName(project.getPackageName()); - // 设置主子表信息 - setSubTable(table); - // 设置主键列信息 - setPkColumn(table); - // 设置代码片段 - setCodeSnippet(table); - - context = VelocityUtils.prepareContext(table); - } else{ - context = VelocityUtils.prepareContextProject(project); - } // 获取模板列表 - SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type); - List templateFileList = templateFileService.selectTemplateFilesByTemplateId(projectTemplate.getTemplateId()); + SysProjectTemplate projectTemplate = getRequiredProjectTemplate(project, type); + List templateFileList = getRequiredTemplateFiles(projectTemplate.getTemplateId()); for (TemplateFile templateFile : templateFileList) { - if(templateFile.getFileName().contains(keyword)){ + if(matchesTemplateFile(templateFile, keyword)){ // 渲染模板 - StringWriter sw = new StringWriter(); - String tplContent = templateFile.getFileContent(); - Velocity.evaluate(context, sw, "", tplContent); - dataMap.put(templateFile.getFileName(), sw.toString()); + dataMap.put(templateFile.getFileName(), renderTemplate(project, tableId, modules, templateFile)); } } return dataMap; @@ -351,67 +266,219 @@ public class GenProjectServiceImpl implements IGenProjectService { List modules = sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter); VelocityInitializer.initVelocity(); - VelocityContext context = null; - String tplCategory = ""; - - if(!Objects.isNull(tableId) && tableId != -1){ - // 查询表信息 - GenTable table = genTableMapper.selectGenTableById(tableId); - table.setModules(modules); - tplCategory = table.getTplCategory(); - table.setPackageName(project.getPackageName()); - // 设置主子表信息 - setSubTable(table); - // 设置主键列信息 - setPkColumn(table); - // 设置代码片段 - setCodeSnippet(table); - - context = VelocityUtils.prepareContext(table); - } else { - context = VelocityUtils.prepareContextProject(project); - } // 获取模板列表 - SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type); - List templateFileList = templateFileService.selectTemplateFilesByTemplateId(projectTemplate.getTemplateId()); + SysProjectTemplate projectTemplate = getRequiredProjectTemplate(project, type); + List templateFileList = getRequiredTemplateFiles(projectTemplate.getTemplateId()); for (TemplateFile templateFile : templateFileList) { - if(templateFile.getFileName().contains(category)){ + if(matchesTemplateFile(templateFile, category)){ try { - StringWriter sw = new StringWriter(); - String tplContent = templateFile.getFileContent(); - Velocity.evaluate(context, sw, "", tplContent); - return sw.toString(); + return renderTemplate(project, tableId, modules, templateFile); } catch (Exception e) { e.printStackTrace(); throw new ServiceException("渲染模板失败,表名:" + tableId); } } } - return null; + throw new ServiceException("未找到模板文件:" + category); } - /** - * 设置代码片段 - * @param table - */ - private void setCodeSnippet(GenTable table) { + private GenProject getRequiredProject(Long projectId) { + GenProject project = genProjectMapper.selectGenProjectById(projectId); + if (project == null) { + throw new ServiceException("项目不存在"); + } + return project; + } + + private SysProjectTemplate getRequiredProjectTemplate(GenProject project, String type) { + SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type); + if (projectTemplate == null || projectTemplate.getTemplateId() == null) { + throw new ServiceException("项目未配置" + type + "模板"); + } + return projectTemplate; + } + + private List getRequiredTemplateFiles(Long templateId) { + List templateFileList = templateFileService.selectTemplateFilesByTemplateId(templateId); + if (StringUtils.isEmpty(templateFileList)) { + throw new ServiceException("模板未配置文件"); + } + return templateFileList; + } + + private boolean isTableScopedNode(SysProjectStructure node) { + return node.getTableId() != null && node.getTableId() == 0; + } + + private String getNodeKey(Long nodeId, Long tableId) { + return tableId == null ? String.valueOf(nodeId) : nodeId + "-" + tableId; + } + + private Map createStructureNodeData(SysProjectStructure node, GenProject project, GenTable table) { + Map nodeData = new LinkedHashMap<>(); + nodeData.put("id", table == null ? node.getNodeId() : getNodeKey(node.getNodeId(), table.getTableId())); + nodeData.put("name", replaceNodeName(node.getNodeName(), project, table)); + nodeData.put("type", node.getNodeType()); + nodeData.put("category", node.getCategory()); + nodeData.put("tableId", table == null ? node.getTableId() : table.getTableId()); + if ("folder".equals(node.getNodeType())) { + nodeData.put("children", new ArrayList<>()); + } + return nodeData; + } + + private String replaceNodeName(String nodeName, GenProject project, GenTable table) { + if (nodeName == null) { + return ""; + } + String result = nodeName; + result = result.replace("{projectName}", StringUtils.defaultString(project.getProjectFileName())); + result = result.replace("{packageName}", StringUtils.defaultString(project.getPackageName())); + if (table != null) { + result = result.replace("{ClassName}", StringUtils.defaultString(table.getClassName())); + result = result.replace("{className}", StringUtils.uncapitalize(StringUtils.defaultString(table.getClassName()))); + result = result.replace("{tableName}", StringUtils.defaultString(table.getTableName())); + result = result.replace("{businessName}", StringUtils.defaultString(table.getBusinessName())); + } + return result; + } + + private void addNodeToParent(List> roots, Map nodeData, + SysProjectStructure node, Map> nodeMap, + Map sourceNodeMap, GenTable table) { + if (nodeData == null) { + return; + } + if (node.getParentId() == null || node.getParentId() == 0) { + roots.add(nodeData); + return; + } + + SysProjectStructure parentSource = sourceNodeMap.get(node.getParentId()); + Long parentTableId = parentSource != null && isTableScopedNode(parentSource) && table != null ? table.getTableId() : null; + Map parentNode = nodeMap.get(getNodeKey(node.getParentId(), parentTableId)); + if (parentNode == null) { + return; + } + + @SuppressWarnings("unchecked") + List> children = (List>) parentNode.get("children"); + if (children != null) { + children.add(nodeData); + } + } + + private boolean matchesTemplateFile(TemplateFile templateFile, String templateFileName) { + if (templateFile == null || StringUtils.isEmpty(templateFileName)) { + return false; + } + return StringUtils.equals(templateFile.getFileName(), templateFileName) + || StringUtils.equals(templateFile.getFilePath(), templateFileName); + } + + private String renderTemplate(GenProject project, Long tableId, List modules, TemplateFile templateFile) { + VelocityContext context = prepareVelocityContext(project, tableId, modules, templateFile); + StringWriter sw = new StringWriter(); + Velocity.evaluate(context, sw, "", StringUtils.defaultString(templateFile.getFileContent())); + return sw.toString(); + } + + private VelocityContext prepareVelocityContext(GenProject project, Long tableId, List modules, TemplateFile templateFile) { + if (tableId != null && tableId != -1) { + GenTable table = getRequiredTable(tableId); + table.setModules(modules); + table.setPackageName(project.getPackageName()); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + VelocityContext context = VelocityUtils.prepareContext(table); + putSnippetVariables(context, table, modules, templateFile); + return context; + } + return VelocityUtils.prepareContextProject(project); + } + + private GenTable getRequiredTable(Long tableId) { + GenTable table = genTableMapper.selectGenTableById(tableId); + if (table == null) { + throw new ServiceException("业务表不存在:" + tableId); + } + if (StringUtils.isEmpty(table.getColumns())) { + throw new ServiceException("业务表未配置字段:" + table.getTableName()); + } + return table; + } + + private void putSnippetVariables(VelocityContext context, GenTable table, List modules, TemplateFile templateFile) { SysCodeSnippet codeSnippet = new SysCodeSnippet(); -// codeSnippet.setRelationTableName(table.getTableName()); + codeSnippet.setStatus("0"); List codeSnippetList = codeSnippetService.selectSysCodeSnippetList(codeSnippet); - table.setCodeSnippetList(codeSnippetList); + if (StringUtils.isEmpty(codeSnippetList)) { + return; + } + + Map snippetContentMap = new LinkedHashMap<>(); + for (SysCodeSnippet snippet : codeSnippetList) { + if (StringUtils.isNotEmpty(snippet.getInsertPoint())) { + snippetContentMap.putIfAbsent(snippet.getInsertPoint(), new StringBuilder()); + } + } + for (SysCodeSnippet snippet : codeSnippetList) { + if (matchesSnippet(snippet, table, modules, templateFile)) { + StringBuilder content = snippetContentMap.get(snippet.getInsertPoint()); + if (content.length() > 0) { + content.append(System.lineSeparator()); + } + content.append(snippet.getSnippetContent()); + } + } + for (Map.Entry entry : snippetContentMap.entrySet()) { + context.put(entry.getKey(), entry.getValue().toString()); + } } - /** - * 获取包前缀 - * - * @param packageName 包名称 - * @return 包前缀名称 - */ - private String getPackagePrefix(String packageName) { - int lastIndex = packageName.lastIndexOf("."); - return StringUtils.substring(packageName, 0, lastIndex); + private boolean matchesSnippet(SysCodeSnippet snippet, GenTable table, List modules, TemplateFile templateFile) { + return snippet != null + && StringUtils.isNotEmpty(snippet.getInsertPoint()) + && StringUtils.isNotEmpty(snippet.getSnippetContent()) + && isSnippetEnabled(snippet) + && matchesSnippetModule(snippet, modules) + && matchesSnippetTable(snippet, table) + && matchesSnippetTemplate(snippet, templateFile); + } + + private boolean isSnippetEnabled(SysCodeSnippet snippet) { + return (StringUtils.isEmpty(snippet.getStatus()) || "0".equals(snippet.getStatus())) + && (StringUtils.isEmpty(snippet.getDelFlag()) || "0".equals(snippet.getDelFlag())); + } + + private boolean matchesSnippetModule(SysCodeSnippet snippet, List modules) { + if (snippet.getModuleId() == null) { + return true; + } + if (StringUtils.isEmpty(modules)) { + return false; + } + for (SysProjectModule module : modules) { + if (snippet.getModuleId().equals(module.getModuleId()) + && (StringUtils.isEmpty(module.getStatus()) || "0".equals(module.getStatus()))) { + return true; + } + } + return false; + } + + private boolean matchesSnippetTable(SysCodeSnippet snippet, GenTable table) { + return StringUtils.isEmpty(snippet.getRelationTableName()) + || StringUtils.equals(snippet.getRelationTableName(), table.getTableName()); + } + + private boolean matchesSnippetTemplate(SysCodeSnippet snippet, TemplateFile templateFile) { + return StringUtils.isEmpty(snippet.getTemplateFileName()) + || matchesTemplateFile(templateFile, snippet.getTemplateFileName()); } /** @@ -442,4 +509,4 @@ public class GenProjectServiceImpl implements IGenProjectService { table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); } } -} \ No newline at end of file +} diff --git a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 751d612..e5fa9e9 100644 --- a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -78,17 +78,44 @@ public class VelocityUtils { List modules = genTable.getModules(); if (!Objects.isNull(codeList)) { for (SysCodeSnippet code : codeList) { - if (modules.stream().anyMatch(module -> module.getModuleId().equals(code.getModuleId())) - && code.getRelationTableName().equals(genTable.getTableName())) { - velocityContext.put(code.getInsertPoint(), code.getSnippetContent()); - } else { + if (StringUtils.isNotEmpty(code.getInsertPoint())) { velocityContext.put(code.getInsertPoint(), ""); } } + for (SysCodeSnippet code : codeList) { + if (matchesSnippet(code, modules, genTable)) { + String existing = StringUtils.defaultString((String) velocityContext.get(code.getInsertPoint())); + String value = StringUtils.isEmpty(existing) ? code.getSnippetContent() : existing + System.lineSeparator() + code.getSnippetContent(); + velocityContext.put(code.getInsertPoint(), value); + } + } } return velocityContext; } + private static boolean matchesSnippet(SysCodeSnippet code, List modules, GenTable genTable) { + if (code == null || StringUtils.isEmpty(code.getInsertPoint()) || StringUtils.isEmpty(code.getSnippetContent())) { + return false; + } + if (StringUtils.isNotEmpty(code.getStatus()) && !"0".equals(code.getStatus())) { + return false; + } + if (StringUtils.isNotEmpty(code.getDelFlag()) && !"0".equals(code.getDelFlag())) { + return false; + } + if (StringUtils.isNotEmpty(code.getRelationTableName()) && !code.getRelationTableName().equals(genTable.getTableName())) { + return false; + } + if (code.getModuleId() == null) { + return true; + } + if (StringUtils.isEmpty(modules)) { + return false; + } + return modules.stream().anyMatch(module -> code.getModuleId().equals(module.getModuleId()) + && (StringUtils.isEmpty(module.getStatus()) || "0".equals(module.getStatus()))); + } + /** * 设置模板变量信息 * diff --git a/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/GenProjectServiceImplTest.java b/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/GenProjectServiceImplTest.java new file mode 100644 index 0000000..dc6dbf6 --- /dev/null +++ b/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/GenProjectServiceImplTest.java @@ -0,0 +1,233 @@ +package com.ruoyi.generator.service; + +import com.ruoyi.generator.domain.GenProject; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; +import com.ruoyi.generator.domain.SysCodeSnippet; +import com.ruoyi.generator.domain.SysProjectModule; +import com.ruoyi.generator.domain.SysProjectStructure; +import com.ruoyi.generator.domain.SysProjectTemplate; +import com.ruoyi.generator.domain.TemplateFile; +import com.ruoyi.generator.mapper.GenProjectMapper; +import com.ruoyi.generator.mapper.GenTableMapper; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +public class GenProjectServiceImplTest { + private GenProjectServiceImpl service; + + @Mock + private GenProjectMapper genProjectMapper; + @Mock + private GenTableMapper genTableMapper; + @Mock + private ITemplateFileService templateFileService; + @Mock + private ISysCodeSnippetService codeSnippetService; + @Mock + private ISysProjectModuleService sysProjectModuleService; + @Mock + private ISysProjectTemplateService sysProjectTemplateService; + @Mock + private ISysProjectStructureService sysProjectStructureService; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + service = new GenProjectServiceImpl(); + setField("genProjectMapper", genProjectMapper); + setField("genTableMapper", genTableMapper); + setField("templateFileService", templateFileService); + setField("codeSnippetService", codeSnippetService); + setField("sysProjectModuleService", sysProjectModuleService); + setField("sysProjectTemplateService", sysProjectTemplateService); + setField("sysProjectStructureService", sysProjectStructureService); + } + + @Test + public void getProjectStructureAttachesTableScopedChildrenToEachGeneratedTableFolder() { + GenProject project = project(); + GenTable userTable = table(11L, "sys_user", "User"); + GenTable roleTable = table(12L, "sys_role", "Role"); + SysProjectTemplate projectTemplate = projectTemplate(100L); + + when(genProjectMapper.selectGenProjectById(1L)).thenReturn(project); + when(genTableMapper.selectGenTablesByProjectId(1L)).thenReturn(Arrays.asList(userTable, roleTable)); + when(sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(1L, "backend")).thenReturn(projectTemplate); + when(sysProjectStructureService.selectProjectStructureListByModule(1L, 100L)).thenReturn(Arrays.asList( + structure(1L, 0L, "{projectName}", "folder", null, null), + structure(2L, 1L, "src", "folder", null, null), + structure(3L, 2L, "{ClassName}", "folder", 0L, null), + structure(4L, 3L, "{ClassName}Controller.java", "file", 0L, "controller.java.vm") + )); + + List> structure = service.getProjectStructure(1L, "backend"); + + Map root = structure.get(0); + assertEquals("demo-app", root.get("name")); + Map src = child(root, 0); + Map userFolder = child(src, 0); + Map roleFolder = child(src, 1); + assertEquals("User", userFolder.get("name")); + assertEquals("Role", roleFolder.get("name")); + assertEquals("UserController.java", child(userFolder, 0).get("name")); + assertEquals("RoleController.java", child(roleFolder, 0).get("name")); + } + + @Test + public void previewCodeUsesExactTemplateFileNameMatch() { + GenProject project = project(); + GenTable table = table(11L, "sys_user", "User"); + + when(genProjectMapper.selectGenProjectById(1L)).thenReturn(project); + when(genTableMapper.selectGenTablesByProjectId(1L)).thenReturn(Arrays.asList(table)); + when(genTableMapper.selectGenTableById(11L)).thenReturn(table); + when(sysProjectModuleService.selectSysProjectModuleList(any(SysProjectModule.class))).thenReturn(Arrays.asList(projectModule(1L))); + when(codeSnippetService.selectSysCodeSnippetList(any(SysCodeSnippet.class))).thenReturn(Arrays.asList()); + when(sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(1L, "backend")).thenReturn(projectTemplate(100L)); + when(templateFileService.selectTemplateFilesByTemplateId(100L)).thenReturn(Arrays.asList( + templateFile("controller.java.vm", "controller"), + templateFile("my-controller.java.vm", "wrong") + )); + + Map preview = service.previewCode(1L, 11L, "controller.java.vm", "backend"); + + assertEquals(1, preview.size()); + assertTrue(preview.containsKey("controller.java.vm")); + assertFalse(preview.containsKey("my-controller.java.vm")); + } + + @Test + public void previewCodeAppliesOnlyMatchingActiveSnippetToTemplateInsertPoint() { + GenProject project = project(); + GenTable table = table(11L, "sys_user", "User"); + SysCodeSnippet matching = snippet(1L, "sys_user", "controller.java.vm", "controllerExtraMethods", "public void audit() {}"); + SysCodeSnippet unrelatedTable = snippet(1L, "sys_role", "controller.java.vm", "controllerExtraMethods", "public void wrong() {}"); + + when(genProjectMapper.selectGenProjectById(1L)).thenReturn(project); + when(genTableMapper.selectGenTablesByProjectId(1L)).thenReturn(Arrays.asList(table)); + when(genTableMapper.selectGenTableById(11L)).thenReturn(table); + when(sysProjectModuleService.selectSysProjectModuleList(any(SysProjectModule.class))).thenReturn(Arrays.asList(projectModule(1L))); + when(codeSnippetService.selectSysCodeSnippetList(any(SysCodeSnippet.class))).thenReturn(Arrays.asList(matching, unrelatedTable)); + when(sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(1L, "backend")).thenReturn(projectTemplate(100L)); + when(templateFileService.selectTemplateFilesByTemplateId(100L)).thenReturn(Arrays.asList( + templateFile("controller.java.vm", "class UserController { $controllerExtraMethods }") + )); + + Map preview = service.previewCode(1L, 11L, "controller.java.vm", "backend"); + + String content = preview.get("controller.java.vm"); + assertTrue(content.contains("public void audit() {}")); + assertFalse(content.contains("public void wrong() {}")); + } + + @SuppressWarnings("unchecked") + private Map child(Map node, int index) { + return ((List>) node.get("children")).get(index); + } + + private void setField(String name, Object value) throws Exception { + Field field = GenProjectServiceImpl.class.getDeclaredField(name); + field.setAccessible(true); + field.set(service, value); + } + + private GenProject project() { + GenProject project = new GenProject(); + project.setProjectId(1L); + project.setProjectName("Demo"); + project.setProjectFileName("demo-app"); + project.setPackageName("com.example.demo"); + project.setTables(Arrays.asList(table(11L, "sys_user", "User"))); + return project; + } + + private GenTable table(Long tableId, String tableName, String className) { + GenTable table = new GenTable(); + table.setTableId(tableId); + table.setTableName(tableName); + table.setTableComment(className); + table.setClassName(className); + table.setModuleName("system"); + table.setBusinessName(className.toLowerCase()); + table.setFunctionName(className); + table.setFunctionAuthor("tester"); + table.setTplCategory("crud"); + table.setOptions("{}"); + table.setColumns(Arrays.asList(pkColumn(tableId))); + return table; + } + + private GenTableColumn pkColumn(Long tableId) { + GenTableColumn column = new GenTableColumn(); + column.setTableId(tableId); + column.setColumnName("id"); + column.setColumnType("bigint"); + column.setJavaType("Long"); + column.setJavaField("id"); + column.setIsPk("1"); + return column; + } + + private SysProjectTemplate projectTemplate(Long templateId) { + SysProjectTemplate projectTemplate = new SysProjectTemplate(); + projectTemplate.setProjectId(1L); + projectTemplate.setTemplateId(templateId); + projectTemplate.setTemplateType("backend"); + return projectTemplate; + } + + private SysProjectModule projectModule(Long moduleId) { + SysProjectModule module = new SysProjectModule(); + module.setProjectId(1L); + module.setModuleId(moduleId); + module.setStatus("0"); + return module; + } + + private SysProjectStructure structure(Long nodeId, Long parentId, String name, String type, Long tableId, String category) { + SysProjectStructure structure = new SysProjectStructure(); + structure.setNodeId(nodeId); + structure.setParentId(parentId); + structure.setNodeName(name); + structure.setNodeType(type); + structure.setTemplateId(100L); + structure.setTableId(tableId); + structure.setCategory(category); + structure.setStatus("0"); + return structure; + } + + private TemplateFile templateFile(String fileName, String fileContent) { + TemplateFile templateFile = new TemplateFile(); + templateFile.setTemplateId(100L); + templateFile.setFileName(fileName); + templateFile.setFileContent(fileContent); + return templateFile; + } + + private SysCodeSnippet snippet(Long moduleId, String relationTableName, String templateFileName, String insertPoint, String content) { + SysCodeSnippet snippet = new SysCodeSnippet(); + snippet.setModuleId(moduleId); + snippet.setRelationTableName(relationTableName); + snippet.setTemplateFileName(templateFileName); + snippet.setInsertPoint(insertPoint); + snippet.setSnippetContent(content); + snippet.setStatus("0"); + snippet.setDelFlag("0"); + return snippet; + } +} diff --git a/RuoYi-Vue/ruoyi-ui/src/views/generator/project/index.vue b/RuoYi-Vue/ruoyi-ui/src/views/generator/project/index.vue index 0a34c02..6a29509 100644 --- a/RuoYi-Vue/ruoyi-ui/src/views/generator/project/index.vue +++ b/RuoYi-Vue/ruoyi-ui/src/views/generator/project/index.vue @@ -52,7 +52,7 @@ icon="el-icon-plus" size="mini" @click="handleAdd" - v-hasPermi="['system:project:add']" + v-hasPermi="['generator:project:add']" >新增 @@ -63,7 +63,7 @@ size="mini" :disabled="single" @click="handleUpdate" - v-hasPermi="['system:project:edit']" + v-hasPermi="['generator:project:edit']" >修改 @@ -74,7 +74,7 @@ size="mini" :disabled="multiple" @click="handleDelete" - v-hasPermi="['system:project:remove']" + v-hasPermi="['generator:project:remove']" >删除 @@ -84,7 +84,7 @@ icon="el-icon-download" size="mini" @click="handleExport" - v-hasPermi="['system:project:export']" + v-hasPermi="['generator:project:export']" >导出 @@ -117,7 +117,7 @@ type="text" icon="el-icon-notebook-2" @click="handleTableConfig(scope.row)" - v-hasPermi="['generator:table:list']" + v-hasPermi="['system:projectTable:list']" >数据表配置 @@ -128,7 +128,7 @@ type="text" icon="el-icon-files" @click="handleTemplateConfig(scope.row)" - v-hasPermi="['generator:template:config']" + v-hasPermi="['generator:template:list']" >代码模板配置 @@ -144,35 +144,35 @@ type="text" icon="el-icon-view" @click="handlePreview(scope.row)" - v-hasPermi="['system:project:preview']" + v-hasPermi="['generator:project:preview']" >预览后端项目 预览后台前端项目 预览前台前端项目 修改 删除 @@ -406,7 +406,7 @@ export default { }, /** 导出按钮操作 */ handleExport() { - this.download('system/project/export', { + this.download('generator/project/export', { ...this.queryParams }, `project_${new Date().getTime()}.xlsx`) }, diff --git a/RuoYi-Vue/ruoyi-ui/src/views/generator/project/structure.vue b/RuoYi-Vue/ruoyi-ui/src/views/generator/project/structure.vue index f91d84e..64c4c49 100644 --- a/RuoYi-Vue/ruoyi-ui/src/views/generator/project/structure.vue +++ b/RuoYi-Vue/ruoyi-ui/src/views/generator/project/structure.vue @@ -41,7 +41,11 @@ @@ -117,14 +121,14 @@ export default { highlightedCode(code, key) { const vmName = key.substring(key.lastIndexOf('/') + 1, key.indexOf('.vm')) var language = vmName.substring(vmName.indexOf('.') + 1, vmName.length) - + // 处理config.js文件,使用javascript语法高亮 if (key.includes('config.js')) { language = 'javascript' } if (key.includes('html')) { language = 'html' - } + } if (key.includes('vue')) { language = 'vue' } @@ -137,8 +141,7 @@ export default { if (key.includes('sql')) { language = 'sql' } - - + const result = hljs.highlight(language, code || '', true) return result.value || ' ' }, diff --git a/RuoYi-Vue/sql/db.sql b/RuoYi-Vue/sql/db.sql new file mode 100644 index 0000000..a409a26 --- /dev/null +++ b/RuoYi-Vue/sql/db.sql @@ -0,0 +1,1240 @@ +-- ------------------------------------------------- +-- RuoYi-Vue complete database script +-- Generated for this repository by merging sql/ base scripts +-- and adding generator-platform extension tables required by current Mapper files. +-- ------------------------------------------------- + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ================================================= +-- RuoYi base tables and seed data +-- Source: sql/ry_20240629.sql +-- ================================================= +-- ---------------------------- +-- 1、部门表 +-- ---------------------------- +drop table if exists sys_dept; +create table sys_dept ( + dept_id bigint(20) not null auto_increment comment '部门id', + parent_id bigint(20) default 0 comment '父部门id', + ancestors varchar(50) default '' comment '祖级列表', + dept_name varchar(30) default '' comment '部门名称', + order_num int(4) default 0 comment '显示顺序', + leader varchar(20) default null comment '负责人', + phone varchar(11) default null comment '联系电话', + email varchar(50) default null comment '邮箱', + status char(1) default '0' comment '部门状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + primary key (dept_id) +) engine=innodb auto_increment=200 comment = '部门表'; + +-- ---------------------------- +-- 初始化-部门表数据 +-- ---------------------------- +insert into sys_dept values(100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); + + +-- ---------------------------- +-- 2、用户信息表 +-- ---------------------------- +drop table if exists sys_user; +create table sys_user ( + user_id bigint(20) not null auto_increment comment '用户ID', + dept_id bigint(20) default null comment '部门ID', + user_name varchar(30) not null comment '用户账号', + nick_name varchar(30) not null comment '用户昵称', + user_type varchar(2) default '00' comment '用户类型(00系统用户)', + email varchar(50) default '' comment '用户邮箱', + phonenumber varchar(11) default '' comment '手机号码', + sex char(1) default '0' comment '用户性别(0男 1女 2未知)', + avatar varchar(100) default '' comment '头像地址', + password varchar(100) default '' comment '密码', + status char(1) default '0' comment '帐号状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + login_ip varchar(128) default '' comment '最后登录IP', + login_date datetime comment '最后登录时间', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (user_id) +) engine=innodb auto_increment=100 comment = '用户信息表'; + +-- ---------------------------- +-- 初始化-用户信息表数据 +-- ---------------------------- +insert into sys_user values(1, 103, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '管理员'); +insert into sys_user values(2, 105, 'ry', '若依', '00', 'ry@qq.com', '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '测试员'); + + +-- ---------------------------- +-- 3、岗位信息表 +-- ---------------------------- +drop table if exists sys_post; +create table sys_post +( + post_id bigint(20) not null auto_increment comment '岗位ID', + post_code varchar(64) not null comment '岗位编码', + post_name varchar(50) not null comment '岗位名称', + post_sort int(4) not null comment '显示顺序', + status char(1) not null comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (post_id) +) engine=innodb comment = '岗位信息表'; + +-- ---------------------------- +-- 初始化-岗位信息表数据 +-- ---------------------------- +insert into sys_post values(1, 'ceo', '董事长', 1, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(2, 'se', '项目经理', 2, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(3, 'hr', '人力资源', 3, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(4, 'user', '普通员工', 4, '0', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 4、角色信息表 +-- ---------------------------- +drop table if exists sys_role; +create table sys_role ( + role_id bigint(20) not null auto_increment comment '角色ID', + role_name varchar(30) not null comment '角色名称', + role_key varchar(100) not null comment '角色权限字符串', + role_sort int(4) not null comment '显示顺序', + data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示', + dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示', + status char(1) not null comment '角色状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (role_id) +) engine=innodb auto_increment=100 comment = '角色信息表'; + +-- ---------------------------- +-- 初始化-角色信息表数据 +-- ---------------------------- +insert into sys_role values('1', '超级管理员', 'admin', 1, 1, 1, 1, '0', '0', 'admin', sysdate(), '', null, '超级管理员'); +insert into sys_role values('2', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 'admin', sysdate(), '', null, '普通角色'); + + +-- ---------------------------- +-- 5、菜单权限表 +-- ---------------------------- +drop table if exists sys_menu; +create table sys_menu ( + menu_id bigint(20) not null auto_increment comment '菜单ID', + menu_name varchar(50) not null comment '菜单名称', + parent_id bigint(20) default 0 comment '父菜单ID', + order_num int(4) default 0 comment '显示顺序', + path varchar(200) default '' comment '路由地址', + component varchar(255) default null comment '组件路径', + query varchar(255) default null comment '路由参数', + route_name varchar(50) default '' comment '路由名称', + is_frame int(1) default 1 comment '是否为外链(0是 1否)', + is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)', + menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)', + visible char(1) default 0 comment '菜单状态(0显示 1隐藏)', + status char(1) default 0 comment '菜单状态(0正常 1停用)', + perms varchar(100) default null comment '权限标识', + icon varchar(100) default '#' comment '菜单图标', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default '' comment '备注', + primary key (menu_id) +) engine=innodb auto_increment=2000 comment = '菜单权限表'; + +-- ---------------------------- +-- 初始化-菜单信息表数据 +-- ---------------------------- +-- 一级菜单 +insert into sys_menu values('1', '系统管理', '0', '1', 'system', null, '', '', 1, 0, 'M', '0', '0', '', 'system', 'admin', sysdate(), '', null, '系统管理目录'); +insert into sys_menu values('2', '系统监控', '0', '2', 'monitor', null, '', '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', sysdate(), '', null, '系统监控目录'); +insert into sys_menu values('3', '系统工具', '0', '3', 'tool', null, '', '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', sysdate(), '', null, '系统工具目录'); +insert into sys_menu values('4', '若依官网', '0', '4', 'http://ruoyi.vip', null, '', '', 0, 0, 'M', '0', '0', '', 'guide', 'admin', sysdate(), '', null, '若依官网地址'); +-- 二级菜单 +insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', sysdate(), '', null, '用户管理菜单'); +insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', sysdate(), '', null, '角色管理菜单'); +insert into sys_menu values('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', '', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', sysdate(), '', null, '菜单管理菜单'); +insert into sys_menu values('103', '部门管理', '1', '4', 'dept', 'system/dept/index', '', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', sysdate(), '', null, '部门管理菜单'); +insert into sys_menu values('104', '岗位管理', '1', '5', 'post', 'system/post/index', '', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', sysdate(), '', null, '岗位管理菜单'); +insert into sys_menu values('105', '字典管理', '1', '6', 'dict', 'system/dict/index', '', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', sysdate(), '', null, '字典管理菜单'); +insert into sys_menu values('106', '参数设置', '1', '7', 'config', 'system/config/index', '', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', sysdate(), '', null, '参数设置菜单'); +insert into sys_menu values('107', '通知公告', '1', '8', 'notice', 'system/notice/index', '', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', sysdate(), '', null, '通知公告菜单'); +insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', sysdate(), '', null, '日志管理菜单'); +insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', sysdate(), '', null, '在线用户菜单'); +insert into sys_menu values('110', '定时任务', '2', '2', 'job', 'monitor/job/index', '', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', sysdate(), '', null, '定时任务菜单'); +insert into sys_menu values('111', '数据监控', '2', '3', 'druid', 'monitor/druid/index', '', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', sysdate(), '', null, '数据监控菜单'); +insert into sys_menu values('112', '服务监控', '2', '4', 'server', 'monitor/server/index', '', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', sysdate(), '', null, '服务监控菜单'); +insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', sysdate(), '', null, '缓存监控菜单'); +insert into sys_menu values('114', '缓存列表', '2', '6', 'cacheList', 'monitor/cache/list', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis-list', 'admin', sysdate(), '', null, '缓存列表菜单'); +insert into sys_menu values('115', '表单构建', '3', '1', 'build', 'tool/build/index', '', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', sysdate(), '', null, '表单构建菜单'); +insert into sys_menu values('116', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', sysdate(), '', null, '代码生成菜单'); +insert into sys_menu values('117', '系统接口', '3', '3', 'swagger', 'tool/swagger/index', '', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', sysdate(), '', null, '系统接口菜单'); +insert into sys_menu values('118', '代码生成平台', '0', '5', 'generator', null, '', '', 1, 0, 'M', '0', '0', '', 'code', 'admin', sysdate(), '', null, '代码生成平台目录'); +insert into sys_menu values('119', '项目管理', '118', '1', 'project', 'generator/project/index', '', '', 1, 0, 'C', '0', '0', 'generator:project:list', 'project', 'admin', sysdate(), '', null, '项目管理菜单'); +insert into sys_menu values('120', '数据源管理', '118', '2', 'datasource', 'generator/datasource/index','', '', 1, 0, 'C', '0', '0', 'generator:datasource:list', 'druid', 'admin', sysdate(), '', null, '数据源管理菜单'); +insert into sys_menu values('121', '模板管理', '118', '3', 'template', 'generator/template/index', '', '', 1, 0, 'C', '0', '0', 'generator:template:list', 'code', 'admin', sysdate(), '', null, '模板管理菜单'); +insert into sys_menu values('122', '项目结构', '118', '4', 'structure', 'generator/structure/index', '', '', 1, 0, 'C', '0', '0', 'generator:structure:list', 'tree', 'admin', sysdate(), '', null, '项目结构菜单'); +insert into sys_menu values('123', '功能模块', '118', '5', 'module', 'generator/module/index', '', '', 1, 0, 'C', '0', '0', 'generator:module:list', 'tree-table', 'admin', sysdate(), '', null, '功能模块菜单'); +insert into sys_menu values('124', '代码片段', '118', '6', 'snippet', 'generator/snippet/index', '', '', 1, 0, 'C', '0', '0', 'generator:snippet:list', 'list', 'admin', sysdate(), '', null, '代码片段菜单'); +-- 三级菜单 +insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', sysdate(), '', null, '操作日志菜单'); +insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', sysdate(), '', null, '登录日志菜单'); +-- 用户管理按钮 +insert into sys_menu values('1000', '用户查询', '100', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1001', '用户新增', '100', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1002', '用户修改', '100', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1003', '用户删除', '100', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1004', '用户导出', '100', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1005', '用户导入', '100', '6', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1006', '重置密码', '100', '7', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', sysdate(), '', null, ''); +-- 角色管理按钮 +insert into sys_menu values('1007', '角色查询', '101', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1008', '角色新增', '101', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1009', '角色修改', '101', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1010', '角色删除', '101', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1011', '角色导出', '101', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', sysdate(), '', null, ''); +-- 菜单管理按钮 +insert into sys_menu values('1012', '菜单查询', '102', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1013', '菜单新增', '102', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1014', '菜单修改', '102', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1015', '菜单删除', '102', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', sysdate(), '', null, ''); +-- 部门管理按钮 +insert into sys_menu values('1016', '部门查询', '103', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1017', '部门新增', '103', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1018', '部门修改', '103', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1019', '部门删除', '103', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', sysdate(), '', null, ''); +-- 岗位管理按钮 +insert into sys_menu values('1020', '岗位查询', '104', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1021', '岗位新增', '104', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1022', '岗位修改', '104', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1023', '岗位删除', '104', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1024', '岗位导出', '104', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', sysdate(), '', null, ''); +-- 字典管理按钮 +insert into sys_menu values('1025', '字典查询', '105', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1026', '字典新增', '105', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1027', '字典修改', '105', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1028', '字典删除', '105', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1029', '字典导出', '105', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', sysdate(), '', null, ''); +-- 参数设置按钮 +insert into sys_menu values('1030', '参数查询', '106', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1031', '参数新增', '106', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1032', '参数修改', '106', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1033', '参数删除', '106', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1034', '参数导出', '106', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', sysdate(), '', null, ''); +-- 通知公告按钮 +insert into sys_menu values('1035', '公告查询', '107', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1036', '公告新增', '107', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1037', '公告修改', '107', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1038', '公告删除', '107', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', sysdate(), '', null, ''); +-- 操作日志按钮 +insert into sys_menu values('1039', '操作查询', '500', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1040', '操作删除', '500', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1041', '日志导出', '500', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', sysdate(), '', null, ''); +-- 登录日志按钮 +insert into sys_menu values('1042', '登录查询', '501', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1043', '登录删除', '501', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1044', '日志导出', '501', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1045', '账户解锁', '501', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', sysdate(), '', null, ''); +-- 在线用户按钮 +insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', sysdate(), '', null, ''); +-- 定时任务按钮 +insert into sys_menu values('1049', '任务查询', '110', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1050', '任务新增', '110', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1051', '任务修改', '110', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1054', '任务导出', '110', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成按钮 +insert into sys_menu values('1055', '生成查询', '116', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1056', '生成修改', '116', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1057', '生成删除', '116', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1058', '导入代码', '116', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1059', '预览代码', '116', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1060', '生成代码', '116', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成平台-项目管理按钮 +insert into sys_menu values('1061', '项目查询', '119', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:project:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1062', '项目新增', '119', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:project:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1063', '项目修改', '119', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:project:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1064', '项目删除', '119', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:project:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1065', '项目导出', '119', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:project:export', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1066', '代码预览', '119', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:project:preview', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1067', '代码下载', '119', '7', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:project:download', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1068', '项目表查询', '119', '8', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:projectTable:list', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1069', '项目表详情', '119', '9', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:projectTable:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1070', '项目表新增', '119', '10', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:projectTable:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1071', '项目表修改', '119', '11', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:projectTable:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1072', '项目表删除', '119', '12', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:projectTable:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1073', '按项目移除表', '119', '13', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:projectTable:removeByProjectId', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1074', '按表移除项目', '119', '14', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:projectTable:removeByTableId', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成平台-数据源管理按钮 +insert into sys_menu values('1075', '数据源查询', '120', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:datasource:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1076', '数据源新增', '120', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:datasource:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1077', '数据源修改', '120', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:datasource:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1078', '数据源删除', '120', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:datasource:remove','#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1079', '数据源导出', '120', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:datasource:export','#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1080', '连接测试', '120', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:datasource:test', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成平台-模板管理按钮 +insert into sys_menu values('1081', '模板查询', '121', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:template:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1082', '模板新增', '121', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:template:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1083', '模板修改', '121', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:template:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1084', '模板删除', '121', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:template:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1085', '模板导出', '121', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:template:export', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成平台-项目结构按钮 +insert into sys_menu values('1086', '结构查询', '122', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:structure:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1087', '结构新增', '122', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:structure:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1088', '结构修改', '122', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:structure:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1089', '结构删除', '122', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:structure:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1090', '结构导出', '122', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:structure:export', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成平台-功能模块按钮 +insert into sys_menu values('1091', '模块查询', '123', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:module:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1092', '模块新增', '123', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:module:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1093', '模块修改', '123', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:module:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1094', '模块删除', '123', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:module:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1095', '模块导出', '123', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:module:export', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成平台-代码片段按钮 +insert into sys_menu values('1096', '片段查询', '124', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:snippet:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1097', '片段新增', '124', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:snippet:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1098', '片段修改', '124', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:snippet:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1099', '片段删除', '124', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:snippet:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1100', '片段导出', '124', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'generator:snippet:export', '#', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 6、用户和角色关联表 用户N-1角色 +-- ---------------------------- +drop table if exists sys_user_role; +create table sys_user_role ( + user_id bigint(20) not null comment '用户ID', + role_id bigint(20) not null comment '角色ID', + primary key(user_id, role_id) +) engine=innodb comment = '用户和角色关联表'; + +-- ---------------------------- +-- 初始化-用户和角色关联表数据 +-- ---------------------------- +insert into sys_user_role values ('1', '1'); +insert into sys_user_role values ('2', '2'); + + +-- ---------------------------- +-- 7、角色和菜单关联表 角色1-N菜单 +-- ---------------------------- +drop table if exists sys_role_menu; +create table sys_role_menu ( + role_id bigint(20) not null comment '角色ID', + menu_id bigint(20) not null comment '菜单ID', + primary key(role_id, menu_id) +) engine=innodb comment = '角色和菜单关联表'; + +-- ---------------------------- +-- 初始化-角色和菜单关联表数据 +-- ---------------------------- +insert into sys_role_menu values ('2', '1'); +insert into sys_role_menu values ('2', '2'); +insert into sys_role_menu values ('2', '3'); +insert into sys_role_menu values ('2', '4'); +insert into sys_role_menu values ('2', '100'); +insert into sys_role_menu values ('2', '101'); +insert into sys_role_menu values ('2', '102'); +insert into sys_role_menu values ('2', '103'); +insert into sys_role_menu values ('2', '104'); +insert into sys_role_menu values ('2', '105'); +insert into sys_role_menu values ('2', '106'); +insert into sys_role_menu values ('2', '107'); +insert into sys_role_menu values ('2', '108'); +insert into sys_role_menu values ('2', '109'); +insert into sys_role_menu values ('2', '110'); +insert into sys_role_menu values ('2', '111'); +insert into sys_role_menu values ('2', '112'); +insert into sys_role_menu values ('2', '113'); +insert into sys_role_menu values ('2', '114'); +insert into sys_role_menu values ('2', '115'); +insert into sys_role_menu values ('2', '116'); +insert into sys_role_menu values ('2', '117'); +insert into sys_role_menu values ('2', '118'); +insert into sys_role_menu values ('2', '119'); +insert into sys_role_menu values ('2', '120'); +insert into sys_role_menu values ('2', '121'); +insert into sys_role_menu values ('2', '122'); +insert into sys_role_menu values ('2', '123'); +insert into sys_role_menu values ('2', '124'); +insert into sys_role_menu values ('2', '500'); +insert into sys_role_menu values ('2', '501'); +insert into sys_role_menu values ('2', '1000'); +insert into sys_role_menu values ('2', '1001'); +insert into sys_role_menu values ('2', '1002'); +insert into sys_role_menu values ('2', '1003'); +insert into sys_role_menu values ('2', '1004'); +insert into sys_role_menu values ('2', '1005'); +insert into sys_role_menu values ('2', '1006'); +insert into sys_role_menu values ('2', '1007'); +insert into sys_role_menu values ('2', '1008'); +insert into sys_role_menu values ('2', '1009'); +insert into sys_role_menu values ('2', '1010'); +insert into sys_role_menu values ('2', '1011'); +insert into sys_role_menu values ('2', '1012'); +insert into sys_role_menu values ('2', '1013'); +insert into sys_role_menu values ('2', '1014'); +insert into sys_role_menu values ('2', '1015'); +insert into sys_role_menu values ('2', '1016'); +insert into sys_role_menu values ('2', '1017'); +insert into sys_role_menu values ('2', '1018'); +insert into sys_role_menu values ('2', '1019'); +insert into sys_role_menu values ('2', '1020'); +insert into sys_role_menu values ('2', '1021'); +insert into sys_role_menu values ('2', '1022'); +insert into sys_role_menu values ('2', '1023'); +insert into sys_role_menu values ('2', '1024'); +insert into sys_role_menu values ('2', '1025'); +insert into sys_role_menu values ('2', '1026'); +insert into sys_role_menu values ('2', '1027'); +insert into sys_role_menu values ('2', '1028'); +insert into sys_role_menu values ('2', '1029'); +insert into sys_role_menu values ('2', '1030'); +insert into sys_role_menu values ('2', '1031'); +insert into sys_role_menu values ('2', '1032'); +insert into sys_role_menu values ('2', '1033'); +insert into sys_role_menu values ('2', '1034'); +insert into sys_role_menu values ('2', '1035'); +insert into sys_role_menu values ('2', '1036'); +insert into sys_role_menu values ('2', '1037'); +insert into sys_role_menu values ('2', '1038'); +insert into sys_role_menu values ('2', '1039'); +insert into sys_role_menu values ('2', '1040'); +insert into sys_role_menu values ('2', '1041'); +insert into sys_role_menu values ('2', '1042'); +insert into sys_role_menu values ('2', '1043'); +insert into sys_role_menu values ('2', '1044'); +insert into sys_role_menu values ('2', '1045'); +insert into sys_role_menu values ('2', '1046'); +insert into sys_role_menu values ('2', '1047'); +insert into sys_role_menu values ('2', '1048'); +insert into sys_role_menu values ('2', '1049'); +insert into sys_role_menu values ('2', '1050'); +insert into sys_role_menu values ('2', '1051'); +insert into sys_role_menu values ('2', '1052'); +insert into sys_role_menu values ('2', '1053'); +insert into sys_role_menu values ('2', '1054'); +insert into sys_role_menu values ('2', '1055'); +insert into sys_role_menu values ('2', '1056'); +insert into sys_role_menu values ('2', '1057'); +insert into sys_role_menu values ('2', '1058'); +insert into sys_role_menu values ('2', '1059'); +insert into sys_role_menu values ('2', '1060'); +insert into sys_role_menu values ('2', '1061'); +insert into sys_role_menu values ('2', '1062'); +insert into sys_role_menu values ('2', '1063'); +insert into sys_role_menu values ('2', '1064'); +insert into sys_role_menu values ('2', '1065'); +insert into sys_role_menu values ('2', '1066'); +insert into sys_role_menu values ('2', '1067'); +insert into sys_role_menu values ('2', '1068'); +insert into sys_role_menu values ('2', '1069'); +insert into sys_role_menu values ('2', '1070'); +insert into sys_role_menu values ('2', '1071'); +insert into sys_role_menu values ('2', '1072'); +insert into sys_role_menu values ('2', '1073'); +insert into sys_role_menu values ('2', '1074'); +insert into sys_role_menu values ('2', '1075'); +insert into sys_role_menu values ('2', '1076'); +insert into sys_role_menu values ('2', '1077'); +insert into sys_role_menu values ('2', '1078'); +insert into sys_role_menu values ('2', '1079'); +insert into sys_role_menu values ('2', '1080'); +insert into sys_role_menu values ('2', '1081'); +insert into sys_role_menu values ('2', '1082'); +insert into sys_role_menu values ('2', '1083'); +insert into sys_role_menu values ('2', '1084'); +insert into sys_role_menu values ('2', '1085'); +insert into sys_role_menu values ('2', '1086'); +insert into sys_role_menu values ('2', '1087'); +insert into sys_role_menu values ('2', '1088'); +insert into sys_role_menu values ('2', '1089'); +insert into sys_role_menu values ('2', '1090'); +insert into sys_role_menu values ('2', '1091'); +insert into sys_role_menu values ('2', '1092'); +insert into sys_role_menu values ('2', '1093'); +insert into sys_role_menu values ('2', '1094'); +insert into sys_role_menu values ('2', '1095'); +insert into sys_role_menu values ('2', '1096'); +insert into sys_role_menu values ('2', '1097'); +insert into sys_role_menu values ('2', '1098'); +insert into sys_role_menu values ('2', '1099'); +insert into sys_role_menu values ('2', '1100'); + +-- ---------------------------- +-- 8、角色和部门关联表 角色1-N部门 +-- ---------------------------- +drop table if exists sys_role_dept; +create table sys_role_dept ( + role_id bigint(20) not null comment '角色ID', + dept_id bigint(20) not null comment '部门ID', + primary key(role_id, dept_id) +) engine=innodb comment = '角色和部门关联表'; + +-- ---------------------------- +-- 初始化-角色和部门关联表数据 +-- ---------------------------- +insert into sys_role_dept values ('2', '100'); +insert into sys_role_dept values ('2', '101'); +insert into sys_role_dept values ('2', '105'); + + +-- ---------------------------- +-- 9、用户与岗位关联表 用户1-N岗位 +-- ---------------------------- +drop table if exists sys_user_post; +create table sys_user_post +( + user_id bigint(20) not null comment '用户ID', + post_id bigint(20) not null comment '岗位ID', + primary key (user_id, post_id) +) engine=innodb comment = '用户与岗位关联表'; + +-- ---------------------------- +-- 初始化-用户与岗位关联表数据 +-- ---------------------------- +insert into sys_user_post values ('1', '1'); +insert into sys_user_post values ('2', '2'); + + +-- ---------------------------- +-- 10、操作日志记录 +-- ---------------------------- +drop table if exists sys_oper_log; +create table sys_oper_log ( + oper_id bigint(20) not null auto_increment comment '日志主键', + title varchar(50) default '' comment '模块标题', + business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)', + method varchar(200) default '' comment '方法名称', + request_method varchar(10) default '' comment '请求方式', + operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)', + oper_name varchar(50) default '' comment '操作人员', + dept_name varchar(50) default '' comment '部门名称', + oper_url varchar(255) default '' comment '请求URL', + oper_ip varchar(128) default '' comment '主机地址', + oper_location varchar(255) default '' comment '操作地点', + oper_param varchar(2000) default '' comment '请求参数', + json_result varchar(2000) default '' comment '返回参数', + status int(1) default 0 comment '操作状态(0正常 1异常)', + error_msg varchar(2000) default '' comment '错误消息', + oper_time datetime comment '操作时间', + cost_time bigint(20) default 0 comment '消耗时间', + primary key (oper_id), + key idx_sys_oper_log_bt (business_type), + key idx_sys_oper_log_s (status), + key idx_sys_oper_log_ot (oper_time) +) engine=innodb auto_increment=100 comment = '操作日志记录'; + + +-- ---------------------------- +-- 11、字典类型表 +-- ---------------------------- +drop table if exists sys_dict_type; +create table sys_dict_type +( + dict_id bigint(20) not null auto_increment comment '字典主键', + dict_name varchar(100) default '' comment '字典名称', + dict_type varchar(100) default '' comment '字典类型', + status char(1) default '0' comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (dict_id), + unique (dict_type) +) engine=innodb auto_increment=100 comment = '字典类型表'; + +insert into sys_dict_type values(1, '用户性别', 'sys_user_sex', '0', 'admin', sysdate(), '', null, '用户性别列表'); +insert into sys_dict_type values(2, '菜单状态', 'sys_show_hide', '0', 'admin', sysdate(), '', null, '菜单状态列表'); +insert into sys_dict_type values(3, '系统开关', 'sys_normal_disable', '0', 'admin', sysdate(), '', null, '系统开关列表'); +insert into sys_dict_type values(4, '任务状态', 'sys_job_status', '0', 'admin', sysdate(), '', null, '任务状态列表'); +insert into sys_dict_type values(5, '任务分组', 'sys_job_group', '0', 'admin', sysdate(), '', null, '任务分组列表'); +insert into sys_dict_type values(6, '系统是否', 'sys_yes_no', '0', 'admin', sysdate(), '', null, '系统是否列表'); +insert into sys_dict_type values(7, '通知类型', 'sys_notice_type', '0', 'admin', sysdate(), '', null, '通知类型列表'); +insert into sys_dict_type values(8, '通知状态', 'sys_notice_status', '0', 'admin', sysdate(), '', null, '通知状态列表'); +insert into sys_dict_type values(9, '操作类型', 'sys_oper_type', '0', 'admin', sysdate(), '', null, '操作类型列表'); +insert into sys_dict_type values(10, '系统状态', 'sys_common_status', '0', 'admin', sysdate(), '', null, '登录状态列表'); + + +-- ---------------------------- +-- 12、字典数据表 +-- ---------------------------- +drop table if exists sys_dict_data; +create table sys_dict_data +( + dict_code bigint(20) not null auto_increment comment '字典编码', + dict_sort int(4) default 0 comment '字典排序', + dict_label varchar(100) default '' comment '字典标签', + dict_value varchar(100) default '' comment '字典键值', + dict_type varchar(100) default '' comment '字典类型', + css_class varchar(100) default null comment '样式属性(其他样式扩展)', + list_class varchar(100) default null comment '表格回显样式', + is_default char(1) default 'N' comment '是否默认(Y是 N否)', + status char(1) default '0' comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (dict_code) +) engine=innodb auto_increment=100 comment = '字典数据表'; + +insert into sys_dict_data values(1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', sysdate(), '', null, '性别男'); +insert into sys_dict_data values(2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别女'); +insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别未知'); +insert into sys_dict_data values(4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '显示菜单'); +insert into sys_dict_data values(5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '隐藏菜单'); +insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); +insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); +insert into sys_dict_data values(10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', sysdate(), '', null, '默认分组'); +insert into sys_dict_data values(11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, '系统分组'); +insert into sys_dict_data values(12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '系统默认是'); +insert into sys_dict_data values(13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '系统默认否'); +insert into sys_dict_data values(14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', sysdate(), '', null, '通知'); +insert into sys_dict_data values(15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, '公告'); +insert into sys_dict_data values(16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '关闭状态'); +insert into sys_dict_data values(18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '其他操作'); +insert into sys_dict_data values(19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '新增操作'); +insert into sys_dict_data values(20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '修改操作'); +insert into sys_dict_data values(21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '删除操作'); +insert into sys_dict_data values(22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '授权操作'); +insert into sys_dict_data values(23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导出操作'); +insert into sys_dict_data values(24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导入操作'); +insert into sys_dict_data values(25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '强退操作'); +insert into sys_dict_data values(26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '生成操作'); +insert into sys_dict_data values(27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '清空操作'); +insert into sys_dict_data values(28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); + + +-- ---------------------------- +-- 13、参数配置表 +-- ---------------------------- +drop table if exists sys_config; +create table sys_config ( + config_id int(5) not null auto_increment comment '参数主键', + config_name varchar(100) default '' comment '参数名称', + config_key varchar(100) default '' comment '参数键名', + config_value varchar(500) default '' comment '参数键值', + config_type char(1) default 'N' comment '系统内置(Y是 N否)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (config_id) +) engine=innodb auto_increment=100 comment = '参数配置表'; + +insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' ); +insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' ); +insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' ); +insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)'); +insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)'); +insert into sys_config values(6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', sysdate(), '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); + + +-- ---------------------------- +-- 14、系统访问记录 +-- ---------------------------- +drop table if exists sys_logininfor; +create table sys_logininfor ( + info_id bigint(20) not null auto_increment comment '访问ID', + user_name varchar(50) default '' comment '用户账号', + ipaddr varchar(128) default '' comment '登录IP地址', + login_location varchar(255) default '' comment '登录地点', + browser varchar(50) default '' comment '浏览器类型', + os varchar(50) default '' comment '操作系统', + status char(1) default '0' comment '登录状态(0成功 1失败)', + msg varchar(255) default '' comment '提示消息', + login_time datetime comment '访问时间', + primary key (info_id), + key idx_sys_logininfor_s (status), + key idx_sys_logininfor_lt (login_time) +) engine=innodb auto_increment=100 comment = '系统访问记录'; + + +-- ---------------------------- +-- 15、定时任务调度表 +-- ---------------------------- +drop table if exists sys_job; +create table sys_job ( + job_id bigint(20) not null auto_increment comment '任务ID', + job_name varchar(64) default '' comment '任务名称', + job_group varchar(64) default 'DEFAULT' comment '任务组名', + invoke_target varchar(500) not null comment '调用目标字符串', + cron_expression varchar(255) default '' comment 'cron执行表达式', + misfire_policy varchar(20) default '3' comment '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + concurrent char(1) default '1' comment '是否并发执行(0允许 1禁止)', + status char(1) default '0' comment '状态(0正常 1暂停)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default '' comment '备注信息', + primary key (job_id, job_name, job_group) +) engine=innodb auto_increment=100 comment = '定时任务调度表'; + +insert into sys_job values(1, '系统默认(无参)', 'DEFAULT', 'ryTask.ryNoParams', '0/10 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); +insert into sys_job values(2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); +insert into sys_job values(3, '系统默认(多参)', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 16、定时任务调度日志表 +-- ---------------------------- +drop table if exists sys_job_log; +create table sys_job_log ( + job_log_id bigint(20) not null auto_increment comment '任务日志ID', + job_name varchar(64) not null comment '任务名称', + job_group varchar(64) not null comment '任务组名', + invoke_target varchar(500) not null comment '调用目标字符串', + job_message varchar(500) comment '日志信息', + status char(1) default '0' comment '执行状态(0正常 1失败)', + exception_info varchar(2000) default '' comment '异常信息', + create_time datetime comment '创建时间', + primary key (job_log_id) +) engine=innodb comment = '定时任务调度日志表'; + + +-- ---------------------------- +-- 17、通知公告表 +-- ---------------------------- +drop table if exists sys_notice; +create table sys_notice ( + notice_id int(4) not null auto_increment comment '公告ID', + notice_title varchar(50) not null comment '公告标题', + notice_type char(1) not null comment '公告类型(1通知 2公告)', + notice_content longblob default null comment '公告内容', + status char(1) default '0' comment '公告状态(0正常 1关闭)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(255) default null comment '备注', + primary key (notice_id) +) engine=innodb auto_increment=10 comment = '通知公告表'; + +-- ---------------------------- +-- 初始化-公告信息表数据 +-- ---------------------------- +insert into sys_notice values('1', '温馨提醒:2018-07-01 若依新版本发布啦', '2', '新版本内容', '0', 'admin', sysdate(), '', null, '管理员'); +insert into sys_notice values('2', '维护通知:2018-07-01 若依系统凌晨维护', '1', '维护内容', '0', 'admin', sysdate(), '', null, '管理员'); + + +-- ---------------------------- +-- 18、代码生成业务表 +-- ---------------------------- +drop table if exists gen_table; +create table gen_table ( + table_id bigint(20) not null auto_increment comment '编号', + table_name varchar(200) default '' comment '表名称', + table_comment varchar(500) default '' comment '表描述', + sub_table_name varchar(64) default null comment '关联子表的表名', + sub_table_fk_name varchar(64) default null comment '子表关联的外键名', + class_name varchar(100) default '' comment '实体类名称', + tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)', + tpl_web_type varchar(30) default '' comment '前端模板类型(element-ui模版 element-plus模版)', + package_name varchar(100) comment '生成包路径', + module_name varchar(30) comment '生成模块名', + business_name varchar(30) comment '生成业务名', + function_name varchar(50) comment '生成功能名', + function_author varchar(50) comment '生成功能作者', + gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)', + gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)', + options varchar(1000) comment '其它生成选项', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (table_id) +) engine=innodb auto_increment=1 comment = '代码生成业务表'; + + +-- ---------------------------- +-- 19、代码生成业务表字段 +-- ---------------------------- +drop table if exists gen_table_column; +create table gen_table_column ( + column_id bigint(20) not null auto_increment comment '编号', + table_id bigint(20) comment '归属表编号', + column_name varchar(200) comment '列名称', + column_comment varchar(500) comment '列描述', + column_type varchar(100) comment '列类型', + java_type varchar(500) comment 'JAVA类型', + java_field varchar(200) comment 'JAVA字段名', + is_pk char(1) comment '是否主键(1是)', + is_increment char(1) comment '是否自增(1是)', + is_required char(1) comment '是否必填(1是)', + is_insert char(1) comment '是否为插入字段(1是)', + is_edit char(1) comment '是否编辑字段(1是)', + is_list char(1) comment '是否列表字段(1是)', + is_query char(1) comment '是否查询字段(1是)', + query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)', + html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + dict_type varchar(200) default '' comment '字典类型', + sort int comment '排序', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + primary key (column_id) +) engine=innodb auto_increment=1 comment = '代码生成业务表字段'; + +-- ================================================= +-- Quartz scheduler tables +-- Source: sql/quartz.sql +-- ================================================= +DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; +DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; +DROP TABLE IF EXISTS QRTZ_LOCKS; +DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; +DROP TABLE IF EXISTS QRTZ_CALENDARS; + +-- ---------------------------- +-- 1、存储每一个已配置的 jobDetail 的详细信息 +-- ---------------------------- +create table QRTZ_JOB_DETAILS ( + sched_name varchar(120) not null comment '调度名称', + job_name varchar(200) not null comment '任务名称', + job_group varchar(200) not null comment '任务组名', + description varchar(250) null comment '相关介绍', + job_class_name varchar(250) not null comment '执行任务类名称', + is_durable varchar(1) not null comment '是否持久化', + is_nonconcurrent varchar(1) not null comment '是否并发', + is_update_data varchar(1) not null comment '是否更新数据', + requests_recovery varchar(1) not null comment '是否接受恢复执行', + job_data blob null comment '存放持久化job对象', + primary key (sched_name, job_name, job_group) +) engine=innodb comment = '任务详细信息表'; + +-- ---------------------------- +-- 2、 存储已配置的 Trigger 的信息 +-- ---------------------------- +create table QRTZ_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment '触发器的名字', + trigger_group varchar(200) not null comment '触发器所属组的名字', + job_name varchar(200) not null comment 'qrtz_job_details表job_name的外键', + job_group varchar(200) not null comment 'qrtz_job_details表job_group的外键', + description varchar(250) null comment '相关介绍', + next_fire_time bigint(13) null comment '上一次触发时间(毫秒)', + prev_fire_time bigint(13) null comment '下一次触发时间(默认为-1表示不触发)', + priority integer null comment '优先级', + trigger_state varchar(16) not null comment '触发器状态', + trigger_type varchar(8) not null comment '触发器的类型', + start_time bigint(13) not null comment '开始时间', + end_time bigint(13) null comment '结束时间', + calendar_name varchar(200) null comment '日程表名称', + misfire_instr smallint(2) null comment '补偿执行的策略', + job_data blob null comment '存放持久化job对象', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, job_name, job_group) references QRTZ_JOB_DETAILS(sched_name, job_name, job_group) +) engine=innodb comment = '触发器详细信息表'; + +-- ---------------------------- +-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数 +-- ---------------------------- +create table QRTZ_SIMPLE_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + repeat_count bigint(7) not null comment '重复的次数统计', + repeat_interval bigint(12) not null comment '重复的间隔时间', + times_triggered bigint(10) not null comment '已经触发的次数', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = '简单触发器的信息表'; + +-- ---------------------------- +-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息 +-- ---------------------------- +create table QRTZ_CRON_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + cron_expression varchar(200) not null comment 'cron表达式', + time_zone_id varchar(80) comment '时区', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = 'Cron类型的触发器表'; + +-- ---------------------------- +-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候) +-- ---------------------------- +create table QRTZ_BLOB_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + blob_data blob null comment '存放持久化Trigger对象', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = 'Blob类型的触发器表'; + +-- ---------------------------- +-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围 +-- ---------------------------- +create table QRTZ_CALENDARS ( + sched_name varchar(120) not null comment '调度名称', + calendar_name varchar(200) not null comment '日历名称', + calendar blob not null comment '存放持久化calendar对象', + primary key (sched_name, calendar_name) +) engine=innodb comment = '日历信息表'; + +-- ---------------------------- +-- 7、 存储已暂停的 Trigger 组的信息 +-- ---------------------------- +create table QRTZ_PAUSED_TRIGGER_GRPS ( + sched_name varchar(120) not null comment '调度名称', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + primary key (sched_name, trigger_group) +) engine=innodb comment = '暂停的触发器表'; + +-- ---------------------------- +-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息 +-- ---------------------------- +create table QRTZ_FIRED_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + entry_id varchar(95) not null comment '调度器实例id', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + instance_name varchar(200) not null comment '调度器实例名', + fired_time bigint(13) not null comment '触发的时间', + sched_time bigint(13) not null comment '定时器制定的时间', + priority integer not null comment '优先级', + state varchar(16) not null comment '状态', + job_name varchar(200) null comment '任务名称', + job_group varchar(200) null comment '任务组名', + is_nonconcurrent varchar(1) null comment '是否并发', + requests_recovery varchar(1) null comment '是否接受恢复执行', + primary key (sched_name, entry_id) +) engine=innodb comment = '已触发的触发器表'; + +-- ---------------------------- +-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例 +-- ---------------------------- +create table QRTZ_SCHEDULER_STATE ( + sched_name varchar(120) not null comment '调度名称', + instance_name varchar(200) not null comment '实例名称', + last_checkin_time bigint(13) not null comment '上次检查时间', + checkin_interval bigint(13) not null comment '检查间隔时间', + primary key (sched_name, instance_name) +) engine=innodb comment = '调度器状态表'; + +-- ---------------------------- +-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁) +-- ---------------------------- +create table QRTZ_LOCKS ( + sched_name varchar(120) not null comment '调度名称', + lock_name varchar(40) not null comment '悲观锁名称', + primary key (sched_name, lock_name) +) engine=innodb comment = '存储的悲观锁信息表'; + +-- ---------------------------- +-- 11、 Quartz集群实现同步机制的行锁表 +-- ---------------------------- +create table QRTZ_SIMPROP_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + str_prop_1 varchar(512) null comment 'String类型的trigger的第一个参数', + str_prop_2 varchar(512) null comment 'String类型的trigger的第二个参数', + str_prop_3 varchar(512) null comment 'String类型的trigger的第三个参数', + int_prop_1 int null comment 'int类型的trigger的第一个参数', + int_prop_2 int null comment 'int类型的trigger的第二个参数', + long_prop_1 bigint null comment 'long类型的trigger的第一个参数', + long_prop_2 bigint null comment 'long类型的trigger的第二个参数', + dec_prop_1 numeric(13,4) null comment 'decimal类型的trigger的第一个参数', + dec_prop_2 numeric(13,4) null comment 'decimal类型的trigger的第二个参数', + bool_prop_1 varchar(1) null comment 'Boolean类型的trigger的第一个参数', + bool_prop_2 varchar(1) null comment 'Boolean类型的trigger的第二个参数', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = '同步机制的行锁表'; + +commit; + +-- ================================================= +-- Generator-platform extension tables +-- ================================================= + +-- ---------------------------- +-- 代码生成扩展表 +-- ---------------------------- + +-- 给若依原生 gen_table 补充建表 SQL 字段,GenTableMapper 会读取 create_table_sql +alter table gen_table add column create_table_sql longtext comment '建表SQL语句'; + +-- ---------------------------- +-- 1、项目表 +-- ---------------------------- +drop table if exists gen_project; +create table gen_project ( + project_id bigint(20) not null auto_increment comment '项目ID', + project_name varchar(50) not null comment '项目名称', + project_file_name varchar(100) default '' comment '项目文件名称', + package_name varchar(100) not null comment '包名', + version varchar(20) not null comment '版本号', + project_desc varchar(500) default null comment '项目描述', + author varchar(50) not null comment '作者', + front_framework varchar(50) not null comment '前端框架', + back_framework varchar(50) not null comment '后端框架', + status char(1) default '0' comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (project_id) +) engine=innodb auto_increment=100 comment = '项目表'; + +-- ---------------------------- +-- 2、数据源信息表 +-- ---------------------------- +drop table if exists sys_datasource; +create table sys_datasource ( + datasource_id bigint(20) not null auto_increment comment '数据源ID', + datasource_name varchar(100) not null comment '数据源名称', + driver varchar(255) default 'com.mysql.cj.jdbc.Driver' comment '数据库驱动', + url varchar(1000) not null comment '数据源URL', + user varchar(100) not null comment '用户名', + password varchar(255) default null comment '密码', + primary key (datasource_id) +) engine=innodb auto_increment=100 comment = '数据源信息表'; + +-- ---------------------------- +-- 3、功能模块表 +-- ---------------------------- +drop table if exists sys_module; +create table sys_module ( + module_id bigint(20) not null auto_increment comment '模块ID', + module_name varchar(50) not null comment '模块名称', + module_alias varchar(50) default '' comment '模块别名', + module_desc varchar(500) default '' comment '模块描述', + status char(1) default '0' comment '状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (module_id) +) engine=innodb auto_increment=100 comment = '功能模块表'; + +-- ---------------------------- +-- 4、代码模板表 +-- ---------------------------- +drop table if exists sys_template; +create table sys_template ( + template_id bigint(20) not null auto_increment comment '模板ID', + template_name varchar(100) not null comment '模板名称', + template_path varchar(255) default '' comment '模板路径', + template_desc varchar(500) default null comment '模板描述', + template_type varchar(50) default '' comment '模板类型', + template_status bigint(20) default 0 comment '模板状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (template_id) +) engine=innodb auto_increment=100 comment = '代码模板表'; + +-- ---------------------------- +-- 5、代码模板文件表 +-- ---------------------------- +drop table if exists sys_template_file; +create table sys_template_file ( + template_file_id bigint(20) not null auto_increment comment '模板文件ID', + template_id bigint(20) not null comment '模板ID', + file_name varchar(255) not null comment '文件名称', + module_id bigint(20) default null comment '功能模块ID', + file_path varchar(500) default '' comment '文件路径', + file_content longtext comment '文件内容', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + primary key (template_file_id), + key idx_template_file_template_id (template_id), + key idx_template_file_module_id (module_id), + constraint fk_template_file_template foreign key (template_id) references sys_template(template_id), + constraint fk_template_file_module foreign key (module_id) references sys_module(module_id) +) engine=innodb auto_increment=100 comment = '代码模板文件表'; + +-- ---------------------------- +-- 6、代码片段管理表 +-- ---------------------------- +drop table if exists sys_code_snippet; +create table sys_code_snippet ( + snippet_id bigint(20) not null auto_increment comment '代码片段ID', + module_id bigint(20) default null comment '功能模块ID', + snippet_content text not null comment '代码片段内容', + insert_point varchar(255) default '' comment '插入点', + param1 varchar(255) default null comment '参数1', + param2 varchar(255) default null comment '参数2', + param3 varchar(255) default null comment '参数3', + param4 varchar(255) default null comment '参数4', + param5 varchar(255) default null comment '参数5', + template_file_name varchar(255) default '' comment '模板文件名称', + relation_table_name varchar(255) default '' comment '关联表名称', + status char(1) default '0' comment '状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (snippet_id), + key idx_code_snippet_module_id (module_id), + constraint fk_code_snippet_module foreign key (module_id) references sys_module(module_id) +) engine=innodb auto_increment=100 comment = '代码片段管理表'; + +-- ---------------------------- +-- 7、代码片段与功能模块关系表 +-- ---------------------------- +drop table if exists sys_code_snippet_module; +create table sys_code_snippet_module ( + snippet_id bigint(20) not null comment '代码片段ID', + module_id bigint(20) not null comment '功能模块ID', + primary key (snippet_id, module_id), + key idx_snippet_module_module_id (module_id), + constraint fk_snippet_module_snippet foreign key (snippet_id) references sys_code_snippet(snippet_id), + constraint fk_snippet_module_module foreign key (module_id) references sys_module(module_id) +) engine=innodb comment = '代码片段与功能模块关系表'; + +-- ---------------------------- +-- 8、项目与功能模块关系表 +-- ---------------------------- +drop table if exists sys_project_module; +create table sys_project_module ( + id bigint(20) not null auto_increment comment 'ID', + project_id bigint(20) not null comment '项目ID', + module_id bigint(20) not null comment '功能模块ID', + status char(1) default '0' comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (id), + unique key idx_project_module (project_id, module_id), + key idx_project_module_module_id (module_id), + constraint fk_project_module_project foreign key (project_id) references gen_project(project_id), + constraint fk_project_module_module foreign key (module_id) references sys_module(module_id) +) engine=innodb auto_increment=100 comment = '项目与功能模块关系表'; + +-- ---------------------------- +-- 9、项目与生成表关系表 +-- ---------------------------- +drop table if exists sys_project_table; +create table sys_project_table ( + id bigint(20) not null auto_increment comment 'ID', + table_id bigint(20) not null comment '表ID', + project_id bigint(20) not null comment '项目ID', + primary key (id), + unique key idx_project_table (project_id, table_id), + key idx_project_table_table_id (table_id), + constraint fk_project_table_project foreign key (project_id) references gen_project(project_id), + constraint fk_project_table_table foreign key (table_id) references gen_table(table_id) +) engine=innodb auto_increment=100 comment = '项目与生成表关系表'; + +-- 兼容旧脚本 gen_table_project_rel.sql;当前源码实际使用 sys_project_table +drop table if exists gen_table_project_rel; +create table gen_table_project_rel ( + id bigint(20) not null auto_increment comment 'ID', + table_id bigint(20) not null comment '表ID', + project_id bigint(20) not null comment '项目ID', + primary key (id), + unique key idx_gen_table_project_rel (project_id, table_id) +) engine=innodb auto_increment=100 comment = '项目与生成表关系表(旧版兼容)'; + +-- ---------------------------- +-- 10、项目模板配置表 +-- ---------------------------- +drop table if exists sys_project_template; +create table sys_project_template ( + id bigint(20) not null auto_increment comment 'ID', + project_id bigint(20) not null comment '项目ID', + template_id bigint(20) not null comment '模板ID', + template_type varchar(50) default '' comment '模板类型', + primary key (id), + unique key idx_project_template_type (project_id, template_type), + key idx_project_template_template_id (template_id), + constraint fk_project_template_project foreign key (project_id) references gen_project(project_id), + constraint fk_project_template_template foreign key (template_id) references sys_template(template_id) +) engine=innodb auto_increment=100 comment = '项目模板配置表'; + +-- ---------------------------- +-- 11、项目结构节点表 +-- ---------------------------- +drop table if exists sys_project_structure; +create table sys_project_structure ( + node_id bigint(20) not null auto_increment comment '节点ID', + parent_id bigint(20) default 0 comment '父节点ID', + node_name varchar(50) not null comment '节点名称', + node_type varchar(20) not null comment '节点类型(folder/file)', + module varchar(100) default '' comment '功能模块', + template_id bigint(20) default null comment '模板ID', + table_id bigint(20) default null comment '关联表ID', + category varchar(50) default null comment '文件类别', + sort_order int(4) default 0 comment '显示顺序', + status char(1) default '0' comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + primary key (node_id), + key idx_project_structure_parent_id (parent_id), + key idx_project_structure_template_id (template_id), + key idx_project_structure_table_id (table_id) +) engine=innodb auto_increment=100 comment = '项目结构节点表'; + +insert into sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) values +(1, 0, '项目根目录', 'folder', '根模块', null, null, null, 1, '0', 'admin', sysdate(), '', null), +(2, 1, 'src', 'folder', '源码', null, null, null, 1, '0', 'admin', sysdate(), '', null), +(3, 2, 'main', 'folder', '主目录', null, null, null, 1, '0', 'admin', sysdate(), '', null), +(4, 3, 'java', 'folder', '源代码', null, null, null, 1, '0', 'admin', sysdate(), '', null), +(5, 3, 'resources', 'folder', '资源', null, null, null, 2, '0', 'admin', sysdate(), '', null), +(6, 1, 'pom.xml', 'file', '依赖管理', null, null, 'xml', 2, '0', 'admin', sysdate(), '', null), +(7, 1, 'README.md', 'file', '说明文档', null, null, 'markdown', 3, '0', 'admin', sysdate(), '', null); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/RuoYi-Vue/sql/generator_test_data.sql b/RuoYi-Vue/sql/generator_test_data.sql new file mode 100644 index 0000000..694dd73 --- /dev/null +++ b/RuoYi-Vue/sql/generator_test_data.sql @@ -0,0 +1,379 @@ +-- ================================================= +-- 代码生成平台测试数据 +-- 使用方式: +-- 1. 先导入 sql/db.sql +-- 2. 再导入本文件:mysql -uroot -p ry < sql/generator_test_data.sql +-- 3. 登录 admin/admin123,进入「代码生成平台 -> 项目管理」 +-- 4. 打开「演示生成项目」,可直接预览/下载 backend、admin_frontend、frontend 三类项目 +-- ================================================= + +SET FOREIGN_KEY_CHECKS = 0; + +-- 清理同一批测试数据,方便重复导入 +DELETE FROM sys_project_structure WHERE template_id IN (9001, 9002, 9003) OR node_id BETWEEN 900100 AND 900399; +DELETE FROM sys_code_snippet_module WHERE snippet_id BETWEEN 9001 AND 9099; +DELETE FROM sys_code_snippet WHERE snippet_id BETWEEN 9001 AND 9099; +DELETE FROM sys_project_template WHERE project_id = 9001 OR template_id IN (9001, 9002, 9003); +DELETE FROM sys_project_table WHERE project_id = 9001 OR table_id = 9001; +DELETE FROM gen_table_project_rel WHERE project_id = 9001 OR table_id = 9001; +DELETE FROM sys_project_module WHERE project_id = 9001 OR module_id = 9001; +DELETE FROM sys_template_file WHERE template_id IN (9001, 9002, 9003) OR template_file_id BETWEEN 900100 AND 900399; +DELETE FROM sys_template WHERE template_id IN (9001, 9002, 9003); +DELETE FROM gen_table_column WHERE table_id = 9001 OR column_id BETWEEN 900100 AND 900199; +DELETE FROM gen_table WHERE table_id = 9001; +DELETE FROM gen_project WHERE project_id = 9001; +DELETE FROM sys_module WHERE module_id = 9001; +DROP TABLE IF EXISTS demo_product; + +-- 示例业务表:不是生成逻辑必须项,但方便和 gen_table 元数据对照 +CREATE TABLE demo_product ( + product_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '商品ID', + product_name varchar(100) NOT NULL COMMENT '商品名称', + product_code varchar(64) NOT NULL COMMENT '商品编码', + price decimal(10,2) DEFAULT 0.00 COMMENT '商品价格', + status char(1) DEFAULT '0' COMMENT '状态', + create_time datetime DEFAULT NULL COMMENT '创建时间', + remark varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (product_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='演示商品表'; + +INSERT INTO demo_product (product_id, product_name, product_code, price, status, create_time, remark) VALUES +(1, '测试商品A', 'DEMO-A', 19.90, '0', sysdate(), '用于代码生成预览'), +(2, '测试商品B', 'DEMO-B', 29.90, '0', sysdate(), '用于代码生成下载'); + +-- 测试项目 +INSERT INTO gen_project (project_id, project_name, project_file_name, package_name, version, project_desc, author, front_framework, back_framework, status, create_by, create_time, remark) VALUES +(9001, '演示生成项目', 'demo-generated-app', 'com.example.demo', '1.0.0', '代码生成平台测试项目,可直接预览和下载生成结果', 'Codex', 'Vue2 + Element UI', 'Spring Boot + MyBatis', '0', 'admin', sysdate(), '测试数据,可重复导入'); + +-- 测试功能模块,用于验证代码片段按项目模块生效 +INSERT INTO sys_module (module_id, module_name, module_alias, module_desc, status, del_flag, create_by, create_time, remark) VALUES +(9001, '审计增强', 'audit', '演示代码片段模块,给 Controller 注入 ping 方法', '0', '0', 'admin', sysdate(), '测试数据'); + +INSERT INTO sys_project_module (id, project_id, module_id, status, create_by, create_time, remark) VALUES +(9001, 9001, 9001, '0', 'admin', sysdate(), '演示项目启用审计增强模块'); + +-- 示例生成表元数据 +INSERT INTO gen_table (table_id, table_name, table_comment, class_name, tpl_category, tpl_web_type, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, remark, create_table_sql) VALUES +(9001, 'demo_product', '演示商品', 'DemoProduct', 'crud', 'element-ui', 'com.example.demo', 'demo', 'product', '演示商品', 'Codex', '0', '/', '{"parentMenuId":"3"}', 'admin', sysdate(), '测试数据', +'CREATE TABLE `demo_product` ( + `product_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ''商品ID'', + `product_name` varchar(100) NOT NULL COMMENT ''商品名称'', + `product_code` varchar(64) NOT NULL COMMENT ''商品编码'', + `price` decimal(10,2) DEFAULT 0.00 COMMENT ''商品价格'', + `status` char(1) DEFAULT ''0'' COMMENT ''状态'', + `create_time` datetime DEFAULT NULL COMMENT ''创建时间'', + `remark` varchar(500) DEFAULT NULL COMMENT ''备注'', + PRIMARY KEY (`product_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=''演示商品表'';'); + +INSERT INTO gen_table_column (column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time) VALUES +(900101, 9001, 'product_id', '商品ID', 'bigint(20)', 'Long', 'productId', '1', '1', '1', '0', '0', '0', '0', 'EQ', 'input', '', 1, 'admin', sysdate()), +(900102, 9001, 'product_name', '商品名称', 'varchar(100)', 'String', 'productName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 2, 'admin', sysdate()), +(900103, 9001, 'product_code', '商品编码', 'varchar(64)', 'String', 'productCode', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 3, 'admin', sysdate()), +(900104, 9001, 'price', '商品价格', 'decimal(10,2)', 'BigDecimal', 'price', '0', '0', '0', '1', '1', '1', '0', 'EQ', 'input', '', 4, 'admin', sysdate()), +(900105, 9001, 'status', '状态', 'char(1)', 'String', 'status', '0', '0', '0', '1', '1', '1', '1', 'EQ', 'select', 'sys_normal_disable', 5, 'admin', sysdate()), +(900106, 9001, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', '0', '0', '0', '1', '1', 'BETWEEN', 'datetime', '', 6, 'admin', sysdate()), +(900107, 9001, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '0', '1', '1', '0', '0', 'EQ', 'textarea', '', 7, 'admin', sysdate()); + +INSERT INTO sys_project_table (id, table_id, project_id) VALUES +(9001, 9001, 9001); + +INSERT INTO gen_table_project_rel (id, table_id, project_id) VALUES +(9001, 9001, 9001); + +-- 三类模板 +INSERT INTO sys_template (template_id, template_name, template_path, template_desc, template_type, template_status, create_by, create_time, remark) VALUES +(9001, '测试后端模板', '/test/backend', '生成 Spring Boot + MyBatis 后端项目骨架', 'backend', 0, 'admin', sysdate(), '测试模板'), +(9002, '测试后台前端模板', '/test/admin_frontend', '生成后台前端 API 和列表页骨架', 'admin_frontend', 0, 'admin', sysdate(), '测试模板'), +(9003, '测试前台前端模板', '/test/frontend', '生成最小前台前端项目骨架', 'frontend', 0, 'admin', sysdate(), '测试模板'); + +INSERT INTO sys_project_template (id, project_id, template_id, template_type) VALUES +(9001, 9001, 9001, 'backend'), +(9002, 9001, 9002, 'admin_frontend'), +(9003, 9001, 9003, 'frontend'); + +-- 后端模板文件 +INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES +(900101, 9001, 'pom.xml.vm', NULL, 'pom.xml.vm', +' + 4.0.0 + ${packageName} + ${projectFileName} + 1.0.0 + ${projectName} + +', 'admin', sysdate()), +(900102, 9001, 'application.yml.vm', NULL, 'application.yml.vm', +'server: + port: 8080 +spring: + application: + name: ${projectFileName} +', 'admin', sysdate()), +(900103, 9001, 'README.md.vm', NULL, 'README.md.vm', +'# ${projectName} + +包名:`${packageName}` + +## 建表 SQL + +```sql +${createTableSql} +``` +', 'admin', sysdate()), +(900104, 9001, 'entity.java.vm', NULL, 'entity.java.vm', +'package ${packageName}.domain; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * ${functionName}实体 + */ +public class ${ClassName} { +#foreach($column in $columns) + /** ${column.columnComment} */ + private ${column.javaType} ${column.javaField}; + +#end +#foreach($column in $columns) + public ${column.javaType} get${column.capJavaField}() { + return ${column.javaField}; + } + + public void set${column.capJavaField}(${column.javaType} ${column.javaField}) { + this.${column.javaField} = ${column.javaField}; + } + +#end +} +', 'admin', sysdate()), +(900105, 9001, 'mapper.java.vm', NULL, 'mapper.java.vm', +'package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; + +public interface ${ClassName}Mapper { + List<${ClassName}> select${ClassName}List(${ClassName} ${className}); +} +', 'admin', sysdate()), +(900106, 9001, 'service.java.vm', NULL, 'service.java.vm', +'package ${packageName}.service; + +import java.util.List; +import ${packageName}.domain.${ClassName}; + +public interface I${ClassName}Service { + List<${ClassName}> select${ClassName}List(${ClassName} ${className}); +} +', 'admin', sysdate()), +(900107, 9001, 'serviceImpl.java.vm', NULL, 'serviceImpl.java.vm', +'package ${packageName}.service.impl; + +import java.util.List; +import javax.annotation.Resource; +import org.springframework.stereotype.Service; +import ${packageName}.domain.${ClassName}; +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.service.I${ClassName}Service; + +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service { + @Resource + private ${ClassName}Mapper ${className}Mapper; + + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) { + return ${className}Mapper.select${ClassName}List(${className}); + } +} +', 'admin', sysdate()), +(900108, 9001, 'controller.java.vm', NULL, 'controller.java.vm', +'package ${packageName}.controller; + +import java.util.List; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; + +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller { + @Resource + private I${ClassName}Service ${className}Service; + + @GetMapping("/list") + public List<${ClassName}> list(${ClassName} query) { + return ${className}Service.select${ClassName}List(query); + } + +$!controllerExtraMethods +} +', 'admin', sysdate()), +(900109, 9001, 'mapper.xml.vm', NULL, 'mapper.xml.vm', +' + + + + +', 'admin', sysdate()); + +-- 后台前端模板文件 +INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES +(900201, 9002, 'package.json.vm', NULL, 'package.json.vm', +'{ + "name": "${projectFileName}-admin", + "version": "1.0.0", + "scripts": { + "dev": "vue-cli-service serve" + } +} +', 'admin', sysdate()), +(900202, 9002, 'api.js.vm', NULL, 'api.js.vm', +'import request from "@/utils/request" + +export function list${ClassName}(query) { + return request({ + url: "/${moduleName}/${businessName}/list", + method: "get", + params: query + }) +} +', 'admin', sysdate()), +(900203, 9002, 'index.vue.vm', NULL, 'index.vue.vm', +' + + +', 'admin', sysdate()); + +-- 前台前端模板文件 +INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES +(900301, 9003, 'package.json.vm', NULL, 'package.json.vm', +'{ + "name": "${projectFileName}-web", + "version": "1.0.0", + "scripts": { + "dev": "vite --host 0.0.0.0" + } +} +', 'admin', sysdate()), +(900302, 9003, 'README.md.vm', NULL, 'README.md.vm', +'# ${projectName} 前台演示 + +这是代码生成平台的 frontend 类型测试模板。 +', 'admin', sysdate()), +(900303, 9003, 'index.html.vm', NULL, 'index.html.vm', +' + + + + ${projectName} + + +
+

${projectName}

+

Generated by RuoYi-Vue code generator.

+
+ + +', 'admin', sysdate()); + +-- 代码片段:只对 demo_product + controller.java.vm 生效 +INSERT INTO sys_code_snippet (snippet_id, module_id, snippet_content, insert_point, template_file_name, relation_table_name, status, del_flag, create_by, create_time, remark) VALUES +(9001, 9001, +' @GetMapping("/ping") + public String ping() { + return "demo-product-ok"; + }', +'controllerExtraMethods', 'controller.java.vm', 'demo_product', '0', '0', 'admin', sysdate(), '演示 Controller 插入点'); + +INSERT INTO sys_code_snippet_module (snippet_id, module_id) VALUES +(9001, 9001); + +-- 后端项目结构 +INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES +(900100, 0, '{projectName}', 'folder', NULL, 9001, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900101, 900100, 'pom.xml', 'file', NULL, 9001, -1, 'pom.xml.vm', 1, '0', 'admin', sysdate(), '', NULL), +(900102, 900100, 'README.md', 'file', NULL, 9001, -1, 'README.md.vm', 2, '0', 'admin', sysdate(), '', NULL), +(900103, 900100, 'src', 'folder', NULL, 9001, NULL, NULL, 3, '0', 'admin', sysdate(), '', NULL), +(900104, 900103, 'main', 'folder', NULL, 9001, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900105, 900104, 'java', 'folder', NULL, 9001, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900106, 900105, 'com', 'folder', NULL, 9001, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900107, 900106, 'example', 'folder', NULL, 9001, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900108, 900107, 'demo', 'folder', NULL, 9001, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900109, 900108, 'domain', 'folder', NULL, 9001, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900110, 900108, 'mapper', 'folder', NULL, 9001, NULL, NULL, 2, '0', 'admin', sysdate(), '', NULL), +(900111, 900108, 'service', 'folder', NULL, 9001, NULL, NULL, 3, '0', 'admin', sysdate(), '', NULL), +(900112, 900111, 'impl', 'folder', NULL, 9001, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900113, 900108, 'controller', 'folder', NULL, 9001, NULL, NULL, 4, '0', 'admin', sysdate(), '', NULL), +(900114, 900104, 'resources', 'folder', NULL, 9001, NULL, NULL, 2, '0', 'admin', sysdate(), '', NULL), +(900115, 900114, 'mapper', 'folder', NULL, 9001, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900116, 900114, 'application.yml', 'file', NULL, 9001, -1, 'application.yml.vm', 2, '0', 'admin', sysdate(), '', NULL), +(900117, 900109, '{ClassName}.java', 'file', NULL, 9001, 0, 'entity.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(900118, 900110, '{ClassName}Mapper.java', 'file', NULL, 9001, 0, 'mapper.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(900119, 900111, 'I{ClassName}Service.java', 'file', NULL, 9001, 0, 'service.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(900120, 900112, '{ClassName}ServiceImpl.java', 'file', NULL, 9001, 0, 'serviceImpl.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(900121, 900113, '{ClassName}Controller.java', 'file', NULL, 9001, 0, 'controller.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(900122, 900115, '{ClassName}Mapper.xml', 'file', NULL, 9001, 0, 'mapper.xml.vm', 1, '0', 'admin', sysdate(), '', NULL); + +-- 后台前端项目结构 +INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES +(900200, 0, '{projectName}-admin', 'folder', NULL, 9002, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900201, 900200, 'package.json', 'file', NULL, 9002, -1, 'package.json.vm', 1, '0', 'admin', sysdate(), '', NULL), +(900202, 900200, 'src', 'folder', NULL, 9002, NULL, NULL, 2, '0', 'admin', sysdate(), '', NULL), +(900203, 900202, 'api', 'folder', NULL, 9002, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900204, 900203, 'demo', 'folder', NULL, 9002, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900205, 900202, 'views', 'folder', NULL, 9002, NULL, NULL, 2, '0', 'admin', sysdate(), '', NULL), +(900206, 900205, 'demo', 'folder', NULL, 9002, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900207, 900206, '{businessName}', 'folder', NULL, 9002, 0, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900208, 900204, '{businessName}.js', 'file', NULL, 9002, 0, 'api.js.vm', 1, '0', 'admin', sysdate(), '', NULL), +(900209, 900207, 'index.vue', 'file', NULL, 9002, 0, 'index.vue.vm', 1, '0', 'admin', sysdate(), '', NULL); + +-- 前台前端项目结构 +INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES +(900300, 0, '{projectName}-web', 'folder', NULL, 9003, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(900301, 900300, 'package.json', 'file', NULL, 9003, -1, 'package.json.vm', 1, '0', 'admin', sysdate(), '', NULL), +(900302, 900300, 'README.md', 'file', NULL, 9003, -1, 'README.md.vm', 2, '0', 'admin', sysdate(), '', NULL), +(900303, 900300, 'index.html', 'file', NULL, 9003, -1, 'index.html.vm', 3, '0', 'admin', sysdate(), '', NULL); + +SET FOREIGN_KEY_CHECKS = 1;