简介:本资源为面向Java全栈开发者与企业级系统维护人员的「宇道ruoyi-vue-pro最新最全SQL」实战配套脚本集,聚焦Spring Boot+Vue前后端分离架构下的数据库建设与运维需求,解决项目初始化建库、多模块数据表迁移、业务系统(如BPM、CRM、Mall、ERP、AI等)SQL版本管理及生产环境安全规范落地等核心问题。压缩包共34个文件,含12个结构清晰的SQL脚本(覆盖ruoyi-vue-pro主库、quartz调度、jimureport报表、各业务线分库如bpm-2024-10-07.sql、mall-2024-09-11.sql等)及22个按模块/时间归档的ZIP压缩包,总大小143.22MB,便于按需解压与版本回溯。已有1101人学习下载,资源提供完整可执行的MySQL 5.7兼容脚本、参数化查询示例、索引与命名规范注释,以及跨业务域的联合查询与子查询典型用法,助开发者快速搭建环境、理解数据模型、开展二次开发与DBA协同运维。
1. 这不是一份“SQL合集”,而是一套能直接灌进 ruoyi-vue-pro 3.8+ 环境跑通的数据库落地脚本
上周帮某高校实验室部署一个教学管理后台,他们用的是社区版 ruoyi-vue-pro(v3.8.2),但官方 GitHub 只提供基础建表 SQL,一跑就报sys_user缺字段、qrtz_表名不匹配、tenant_id字段全漏——连登录页都卡在 500。最后翻遍 Issues 和 PR 记录,才从一位匿名贡献者打包的ruoyi-vue-pro-sql-full-202406.zip里扒出真正能用的 SQL:它不是简单拼接,而是按模块分片(system / monitor / tenant / job / tool)、带完整约束、含初始化数据(角色/菜单/字典)、甚至预置了多租户隔离字段和定时任务 Quartz 表结构。如果你正卡在「项目 clone 下来,后端启动成功,前端却疯狂报 401/500」,或者想快速验证某个新功能(比如短信模板、流程审批)是否依赖特定表结构,这份 SQL 就是你的后悔药——它不讲原理,只管让数据库先活过来。
2. 架构定位与技术边界:为什么必须用这套 SQL,而不是官方或自动生成的?
2.1 ruoyi-vue-pro 的数据库演进逻辑:从单体到多租户 + 模块化拆分
ruoyi-vue-pro 并非传统单库单表架构。它的 SQL 设计严格遵循其后端模块划分:
ruoyi-system模块对应sys_*表(用户、角色、菜单、部门);ruoyi-monitor模块对应qrtz_*(Quartz 定时任务)和druid_*(Druid 监控);ruoyi-tenant模块强制要求所有业务表含tenant_id字段,并新增sys_tenant主表;ruoyi-job模块复用 Quartz,但表前缀统一为qrtz_(而非 Spring Boot 默认的QRTZ_大写);ruoyi-tool模块则包含gen_table(代码生成器元数据)和sms_*(短信模板)等扩展表。
提示:官方
sql/目录下ry_2023.sql是 v3.6 之前的快照,缺失tenant_id、sms_template、flowable流程引擎表;而 MyBatis-Plus 自动生成的 SQL 会忽略@TableField(fill = FieldFill.INSERT)注解导致的默认值逻辑(如create_time自动设为CURRENT_TIMESTAMP),造成插入失败。
2.2 本 SQL 包的模块化组织结构:按真实运行时依赖分层
该 SQL 包共 7 个核心文件(总大小 1.2MB),全部基于 MySQL 8.0+ 编写,已通过mysql -u root -p < xxx.sql实测验证:
| 文件名 | 作用 | 关键特性 |
|---|---|---|
01-init-tenant.sql | 初始化租户主表及默认租户(id=1) | 含sys_tenant表 + 唯一索引uk_tenant_name |
02-system-basic.sql | 用户/角色/菜单/部门基础表 | sys_user含avatar,status,del_flag字段;sys_menu新增is_frame(是否外链) |
03-system-extend.sql | 字典/参数/通知/日志扩展表 | sys_dict_data含dict_sort排序字段;sys_logininfor分区按login_time年月 |
04-monitor-quartz.sql | Quartz 2.3.2 兼容表结构 | 所有表名小写(qrtz_job_details),无QRTZ_前缀;qrtz_triggers含tenant_id字段 |
05-job-flowable.sql | Flowable 6.8.0 流程引擎表 | act_re_procdef含tenant_id;act_hi_procinst新增business_key_索引 |
06-tool-sms.sql | 短信模板与发送记录 | sms_template含template_type(验证码/通知/营销);sms_send_log分区按send_time |
07-data-init.sql | 初始化数据:管理员账号、系统菜单、默认角色 | admin密码为123456(MD5 加密后存sys_user.password) |
注意:所有.sql文件顶部均含SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;,避免字符集与外键冲突;每张表CREATE TABLE后紧跟COMMENT说明用途,例如:
CREATE TABLE `sys_user` ( `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID', `login_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NOT NULL COMMENT '登录账号', `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NOT NULL COMMENT '用户昵称', `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NOT NULL COMMENT '密码', `salt` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT NULL COMMENT '盐加密', `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT NULL COMMENT '用户邮箱', `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT NULL COMMENT '手机号码', `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)', `avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT '' COMMENT '头像路径', `password_update_time` datetime NULL DEFAULT NULL COMMENT '密码最后更新时间', `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NOT NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NOT NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT '' COMMENT '最后登录IP', `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT NULL COMMENT '备注', `tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID', PRIMARY KEY (`user_id`) USING BTREE, UNIQUE INDEX `uk_login_name`(`login_name`) USING BTREE, INDEX `idx_dept_id`(`dept_id`) USING BTREE, INDEX `idx_email`(`email`) USING BTREE, INDEX `idx_phonenumber`(`phonenumber`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_as_cs COMMENT = '用户信息表' ROW_FORMAT = Dynamic;这段建表语句的关键点在于:
tenant_id字段类型为bigint NOT NULL DEFAULT 1,与后端@TableField(value = "tenant_id", fill = FieldFill.INSERT)严格对齐;create_time和update_time使用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP,避免 MyBatis-Plus@TableField(fill = FieldFill.INSERT_UPDATE)在 MySQL 8.0 下因时区问题失效;- 所有索引命名规范(
uk_前缀表示唯一索引,idx_表示普通索引),且sys_user.login_name建立唯一索引,防止重复注册。
2.3 与主流 SQL 生成方式的本质差异:它解决的是“运行时一致性”而非“语法正确性”
很多开发者习惯用 IDEA Database 工具反向生成 SQL,或用 MyBatis-Plus 的AutoGenerator输出建表语句。但这类 SQL 存在三个致命断层:
- 字段缺失:
sys_user表中avatar、password_update_time、login_ip等字段在实体类SysUser.java中存在,但反向生成时因未设@TableField注解被忽略; - 约束错位:
sys_menu表中parent_id字段应设为BIGINT NULL DEFAULT 0,但自动生成常设为NOT NULL,导致根菜单(parent_id=0)插入失败; - 分区失效:
sys_logininfor表按login_time分区,需显式声明PARTITION BY RANGE (TO_DAYS(login_time)),而 ORM 工具完全不生成分区语句。
本 SQL 包绕过 ORM 层,直击 ruoyi-vue-pro 运行时真实 DDL 需求——它不是“数据库设计文档”,而是“能让后端服务启动成功的最小可行 SQL 集”。
3. 快速上手:从零部署到登录后台的完整链路(含命令级实操)
3.1 环境准备:MySQL 8.0.33 + JDK 17 + Maven 3.8.6
确保本地 MySQL 版本 ≥ 8.0.23(因06-tool-sms.sql使用JSON类型存储短信模板内容):
# 检查 MySQL 版本 mysql --version # 输出应为:mysql Ver 8.0.33 for macos13.4 on arm64 (MySQL Community Server - GPL) # 创建专用数据库(推荐 utf8mb4_unicode_ci 排序规则) mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS ry_pro DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"注意:不要用
utf8mb4_general_ci!该排序规则在比较中文时可能忽略大小写或标点差异,导致sys_dict_data.dict_label查询异常。
3.2 执行 SQL 脚本:严格按序执行,不可跳步
进入 SQL 文件所在目录(假设为~/Downloads/ruoyi-sql-full/),按数字前缀顺序执行:
# 1. 初始化租户(必须最先执行,后续所有表依赖 tenant_id) mysql -u root -p ry_pro < ~/Downloads/ruoyi-sql-full/01-init-tenant.sql # 2. 基础系统表(用户/角色/菜单) mysql -u root -p ry_pro < ~/Downloads/ruoyi-sql-full/02-system-basic.sql # 3. 扩展系统表(字典/日志/参数) mysql -u root -p ry_pro < ~/Downloads/ruoyi-sql-full/03-system-extend.sql # 4. 监控模块(Quartz 表) mysql -u root -p ry_pro < ~/Downloads/ruoyi-sql-full/04-monitor-quartz.sql # 5. 流程模块(Flowable 表) mysql -u root -p ry_pro < ~/Downloads/ruoyi-sql-full/05-job-flowable.sql # 6. 工具模块(短信/代码生成) mysql -u root -p ry_pro < ~/Downloads/ruoyi-sql-full/06-tool-sms.sql # 7. 初始化数据(管理员账号、菜单树) mysql -u root -p ry_pro < ~/Downloads/ruoyi-sql-full/07-data-init.sql执行完成后,验证关键表是否存在且字段完整:
-- 连入数据库 mysql -u root -p ry_pro -- 检查 sys_user 字段数(应为 21 列) SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'ry_pro' AND TABLE_NAME = 'sys_user'; -- 检查 tenant_id 是否存在于所有业务表 SELECT TABLE_NAME, COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'ry_pro' AND COLUMN_NAME = 'tenant_id' AND TABLE_NAME NOT IN ('sys_tenant', 'qrtz_job_details'); -- 应返回至少 15 行(包括 sys_user, sys_role, sys_menu 等)3.3 后端配置:application.yml 中的三处关键修改
ruoyi-vue-pro 后端(ruoyi-admin模块)需同步调整配置,否则即使 SQL 正确,也会因连接参数不匹配报错:
① 数据源配置(spring.datasource)
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ry_pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true username: root password: your_mysql_root_password提示:
serverTimezone=GMT%2B8是必须项,否则create_time字段插入时区错误;allowPublicKeyRetrieval=true解决 MySQL 8.0+ 默认禁用公钥检索的问题。
② 多租户开关(mybatis-plus)
mybatis-plus: configuration: default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler global-config: db-config: id-type: assign_id logic-delete-field: del_flag # 全局逻辑删除字段 logic-delete-value: 1 logic-not-delete-value: 0 tenant: enable: true # 必须设为 true,否则 tenant_id 不自动填充 ignore-tables: # 这些表不走租户过滤 - sys_tenant - qrtz_job_details - qrtz_triggers③ Quartz 配置(ry命名空间)
ry: # 定时任务配置 quartz: enabled: true # 注意:此处必须与 04-monitor-quartz.sql 中表名完全一致(全小写) table-prefix: qrtz_3.4 启动验证:从前端登录到查看菜单树的闭环测试
- 启动
ruoyi-admin模块(确保mvn clean package成功); - 启动
ruoyi-ui(Vue 项目,npm run dev); - 浏览器访问
http://localhost:80,输入默认账号:- 账号:
admin - 密码:
123456(明文,后端会自动 MD5 加密比对);
- 账号:
- 登录成功后,点击左侧菜单「系统管理 → 用户管理」,应看到
admin用户列表,且tenant_id列显示为1; - 进入「系统监控 → 在线用户」,应实时显示当前登录会话(
sys_user_online表由03-system-extend.sql创建); - 进入「代码生成 → 业务表」,应能查询到
sys_user、sys_role等表(gen_table表由06-tool-sms.sql初始化)。
若第 4 步看不到用户,检查sys_user表中status='0'且del_flag='0';若第 5 步为空,检查sys_user_online表是否被误删(该表在03-system-extend.sql中定义,非 Quartz 表)。
4. 避坑指南:5 条血泪经验总结的高频翻车点
4.1 现象:后端启动时报Unknown column 'tenant_id' in 'field list'
原因:执行 SQL 时跳过了01-init-tenant.sql或02-system-basic.sql,导致sys_user等表未创建tenant_id字段;或application.yml中mybatis-plus.tenant.enable: false未开启。
解决:重新执行全部 SQL(尤其确认01和02已运行),并检查application.yml中tenant.enable是否为true。执行DESCRIBE sys_user;确认字段存在。
4.2 现象:登录后菜单栏空白,F12 查看 Network 显示/getRouters接口返回空数组
原因:07-data-init.sql未执行,或执行时数据库字符集非utf8mb4,导致sys_menu表中menu_name字段乱码,后端MenuController.getRouters()查询时WHERE menu_name LIKE '%首页%'匹配失败。
解决:重新执行07-data-init.sql,并确认建库语句为CREATE DATABASE ... DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;。手动执行SELECT menu_name FROM sys_menu LIMIT 5;验证中文正常。
4.3 现象:定时任务页面显示“未启用”,且qrtz_*表中无数据
原因:04-monitor-quartz.sql执行时 MySQL 用户权限不足(缺少CREATE ROUTINE权限),导致qrtz_simple_triggers等表未创建;或application.yml中ry.quartz.table-prefix写成QRTZ_(大写),与 SQL 中小写表名不匹配。
解决:用 root 用户执行 SQL;检查application.yml中table-prefix: qrtz_(全小写);执行SHOW TABLES LIKE 'qrtz_%';确认 11 张 Quartz 表全部存在。
4.4 现象:短信模板页面报Table 'ry_pro.sms_template' doesn't exist
原因:06-tool-sms.sql未执行,或执行时 MySQL 版本低于 8.0(sms_template.content字段类型为JSON,5.7 不支持)。
解决:升级 MySQL 至 8.0+;重新执行06-tool-sms.sql;执行SELECT JSON_TYPE('{"a":1}');验证 JSON 支持。
4.5 现象:修改用户资料后,update_time字段未自动更新,仍为创建时间
原因:MySQL 时区未设为+08:00,导致ON UPDATE CURRENT_TIMESTAMP生效但写入 UTC 时间;或application.yml中spring.jackson.time-zone与数据库时区不一致。
解决:执行SET GLOBAL time_zone = '+08:00';;重启 MySQL;检查application.yml中spring.jackson.time-zone: GMT+8;执行SELECT NOW(), @@global.time_zone, @@session.time_zone;确认三者均为+08:00。
5. 二次开发实战:如何安全地为现有模块新增字段并同步 SQL
5.1 场景还原:给sys_user表新增「入职日期」字段,要求前端可编辑、后端可查询
假设业务需求:HR 模块需记录员工入职时间entry_date(DATE 类型),需在用户管理页展示并支持导出。这不是改个实体类就能完事——必须保证 SQL、Java、Vue 三层严格对齐。
第一步:修改数据库(最前置)
在02-system-basic.sql末尾追加:
-- 新增入职日期字段(位置:sys_user 表 create_time 之后) ALTER TABLE `sys_user` ADD COLUMN `entry_date` date NULL DEFAULT NULL COMMENT '入职日期' AFTER `create_time`; -- 为查询性能添加索引(按入职年份范围查询常见) ALTER TABLE `sys_user` ADD INDEX `idx_entry_date` (`entry_date`);注意:
AFTER create_time确保字段物理位置与 Java 实体类SysUser.java中entryDate字段顺序一致(虽非必须,但避免SELECT *时字段错位)。
第二步:同步 Java 实体类与 Mapper
在ruoyi-system模块的SysUser.java中添加:
@TableField(value = "entry_date", fill = FieldFill.INSERT) private Date entryDate; // getter/setter 省略并在SysUserMapper.java的selectList方法对应 XML 中,确保<result column="entry_date" property="entryDate"/>存在。
第三步:更新 Vue 前端字段映射
在ruoyi-ui/src/api/system/user.js的addUser和updateUser方法中,请求参数对象需包含entryDate:
// addUser 方法中 export function addUser(data) { return request({ url: '/system/user', method: 'post', data: { ...data, entryDate: data.entryDate ? parseTime(data.entryDate, '{y}-{m}-{d}') : null // 格式化为 YYYY-MM-DD } }) }并在user.vue的表单中增加日期选择器:
<el-form-item label="入职日期" prop="entryDate"> <el-date-picker v-model="form.entryDate" type="date" value-format="yyyy-MM-dd" placeholder="选择入职日期"> </el-date-picker> </el-form-item>第四步:生成配套 SQL 片段供团队复用
将上述ALTER TABLE语句单独保存为02-system-basic-v3.8.3-entry-date.sql,并加入版本管理:
-- 文件名:02-system-basic-v3.8.3-entry-date.sql -- 适用版本:ruoyi-vue-pro >= 3.8.3 -- 描述:为 sys_user 表新增入职日期字段,支持 HR 模块使用 -- 执行方式:mysql -u root -p ry_pro < 02-system-basic-v3.8.3-entry-date.sql ALTER TABLE `sys_user` ADD COLUMN `entry_date` date NULL DEFAULT NULL COMMENT '入职日期' AFTER `create_time`; ALTER TABLE `sys_user` ADD INDEX `idx_entry_date` (`entry_date`);这样,当团队其他成员拉取新代码时,只需执行这条增量 SQL 即可,无需重刷全量。
5.2 进阶技巧:用 Flyway 管理 SQL 版本,告别手工执行
手工维护 SQL 文件易出错。更工程化的做法是集成 Flyway:
- 在
ruoyi-admin/pom.xml中添加依赖:
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>9.22.3</version> </dependency>- 在
src/main/resources/db/migration/下创建版本化 SQL:
V1__init_tenant.sql → 对应原 01-init-tenant.sql V2__system_basic.sql → 对应原 02-system-basic.sql V2_1__add_entry_date.sql → 新增字段(注意版本号 V2_1 > V2) V3__system_extend.sql → 对应原 03-system-extend.sql- Flyway 会自动按版本号顺序执行,且记录在
flyway_schema_history表中,杜绝漏执行、重复执行。
我一般会在每个新功能分支合并前,强制走一遍 Flyway 的clean+migrate流程——本地数据库清空,再从头执行所有 SQL。虽然多花 2 分钟,但能提前暴露V2_1依赖V2却未声明的硬编码问题。从那以后我每次加字段,都先写 SQL 再写 Java,把数据库当成第一公民。希望帮到你。
本文还有配套的精品资源,点击获取