☰
Ruoyi-Vue-Pro 3.8+ 全模块可运行数据库SQL脚本
2026/10/31 5:40:26 网站建设 项目流程

简介:本资源为面向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.sqlQuartz 2.3.2 兼容表结构所有表名小写(qrtz_job_details),无QRTZ_前缀;qrtz_triggers含tenant_id字段
05-job-flowable.sqlFlowable 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 存在三个致命断层:

  1. 字段缺失:sys_user表中avatar、password_update_time、login_ip等字段在实体类SysUser.java中存在,但反向生成时因未设@TableField注解被忽略;
  2. 约束错位:sys_menu表中parent_id字段应设为BIGINT NULL DEFAULT 0,但自动生成常设为NOT NULL,导致根菜单(parent_id=0)插入失败;
  3. 分区失效: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 启动验证:从前端登录到查看菜单树的闭环测试

  1. 启动ruoyi-admin模块(确保mvn clean package成功);
  2. 启动ruoyi-ui(Vue 项目,npm run dev);
  3. 浏览器访问http://localhost:80,输入默认账号:
    • 账号:admin
    • 密码:123456(明文,后端会自动 MD5 加密比对);
  4. 登录成功后,点击左侧菜单「系统管理 → 用户管理」,应看到admin用户列表,且tenant_id列显示为1;
  5. 进入「系统监控 → 在线用户」,应实时显示当前登录会话(sys_user_online表由03-system-extend.sql创建);
  6. 进入「代码生成 → 业务表」,应能查询到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:

  1. 在ruoyi-admin/pom.xml中添加依赖:
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>9.22.3</version> </dependency>
  1. 在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
  1. Flyway 会自动按版本号顺序执行,且记录在flyway_schema_history表中,杜绝漏执行、重复执行。

我一般会在每个新功能分支合并前,强制走一遍 Flyway 的clean+migrate流程——本地数据库清空,再从头执行所有 SQL。虽然多花 2 分钟,但能提前暴露V2_1依赖V2却未声明的硬编码问题。从那以后我每次加字段,都先写 SQL 再写 Java,把数据库当成第一公民。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询