简介:一份涵盖芋道ruoyi-vue-pro最新最全SQL的数据库脚本合集,面向基于Spring Boot与Vue开发的企业级应用开发者、数据库管理员及二次开发人员,用于快速解决系统初始化、数据表结构理解、业务模块部署等关键问题。合集共34个文件,包含12个sql脚本与22个zip压缩包,整体体积约143MB,覆盖bpm、crm、mall、erp、pay、member、ai等核心业务模块;sql文件用于创建业务表、视图及存储过程,压缩包则按模块归档历史版本与附属组件,便于按需选用。目前已有1065人学习下载,资源中既有按日期更新的模块脚本、ruoyi-vue-pro主库及quartz基础表,也体现了参数化查询、索引设计、命名规范等企业级SQL最佳实践,可直接对照业务逻辑搭建环境,减少建表与调优成本,帮助深入理解数据结构与项目架构。
1. 当你拿到这份 ruoyi-vue-pro 最新最全 SQL:它不是安装包,而是后台脚手架的底表合集
当你看到一份标题写着"宇道 ruoyi-vue-pro 最新最全 SQL"的数据库脚本时,先别急着把它当成应用安装包。它不是可执行程序,而是以 Spring Boot + Vue 为基础的权限后台脚手架需要的全套初始化数据:用户表、角色表、菜单表、部门表、字典表、定时任务表,一次给全。它解决的是这类项目最烦的前置问题——不同示例分支里的建表语句散落、字段对不上、导入即报错。有了这份整理好的脚本,你能从补底表的泥潭里抽身,直接进入二次开发。适合刚接手后台管理系统交付、或者正在评估这类脚手架成本的开发者。不过要提醒一句:SQL 导入通过只是第一步,后面的连接配置与版本匹配才是真正的拦路虎。
2. 拆开这套 SQL 看门道:系统表、业务演示表和定时任务表的职责边界
在动手导入之前,我建议先花十分钟把脚本按功能分类看一遍。很多人一上来就把整份 SQL 跑完,启动报错后不知道去哪张表排查,就是因为没弄清这份脚本里到底装了哪几类表。按我处理这类项目的经验,ruoyi-vue-pro 的脚本一般分三条线:权限体系线、业务脚手架线、运维支撑线。三条线经常混在同一个文件里,但你可以按这个思路去分段执行,排错会顺手很多。
2.1 权限与用户体系:sys_user、sys_role、sys_menu 如何串成一条鉴权链
权限体系是整个框架的地基。脚本开头一般会先建这几张表:sys_user(用户表)、sys_role(角色表)、sys_menu(菜单表)、sys_user_role(用户角色关联表)、sys_role_menu(角色菜单关联表)和 sys_dept(部门表)。其中 sys_user_role 和 sys_role_menu 是中间表,只存关联关系,不存业务数据,字段就那么两三个:一个指向用户或角色,另一个指向角色或菜单。
sys_user 表里最值得提前看的是 user_id、dept_id、status 三个字段。status 被初始化数据设成"1"时,账号就是停用状态,登录时会直接提示"账户已停用"。很多人以为密码错了,排查半天,其实是这一位的问题。sys_menu 表要重点看 path、component、perms 三个字段:path 控制前端路由地址,component 指向 Vue 页面组件在项目里的存放路径,perms 是后端接口的权限标识。登录成功后,框架会从 sys_menu 里把当前角色可见的菜单和可用的 perms 拼成一个集合,接口鉴权时拿注解上的标识去这个集合里比对。
sys_dept 表通过 dept_id 与 sys_user 关联,负责数据权限过滤。导入的演示数据通常是三层部门树,这棵树的层级一旦错乱,数据权限过滤就会翻车:后端在执行查询时会自动追加部门过滤条件,结果是你查到了数据但总感觉少几条,不同角色查出来的数据又互相串。这种问题在运行日志里很难定位,因为 SQL 是动态拼接的。
还有一类容易被当成业务表来看的配置表:sys_dict_type 和 sys_dict_data。它们维护全局字典,性别、状态、是否这类枚举值都在这里。页面上的下拉框、状态标签、查询条件里的选项,很多都来自这两张表。如果导入时漏了 sys_dict_data,页面上表单看起来正常,提交时字段校验却找不到字典解释,表现成莫名奇妙的参数报错。所以导入后,我会先确认这两张表里的数据量不是 0。
2.2 业务演示表:代码生成器的输入约定,COMMENT 里藏着生成质量
ruoyi-vue-pro 的"最全"很大程度体现在业务演示表上。这类表不是生产数据,是给你做二次开发用的样本。常见的有公告表 sys_notice、参数配置表 sys_config、岗位表 sys_post,以及若干张带商品、订单、客户之类字段的演示单据表。它们存在的真正意义,是让代码生成器有一份能直接当输入模板的建表语句。
代码生成器的逻辑是读取表结构和字段注释,按固定模板生成 Controller、Service、Mapper、前端 Vue 页面以及对应的菜单插入 SQL。所以建表语句里的 COMMENT 直接决定生成代码的质量。同一个字段,注释写成"状态(0正常 1停用)",生成器能自动把它识别成字典选项,生成下拉框;写成"状态",生成出来的就是裸输入框。我接手新需求建新表时,会完全照着这份 SQL 里演示表的注释风格去写,生成出来的代码几乎不用调。
另一个容易踩的约定是主键命名。框架默认主键字段必须叫 id 或 xxx_id,类型是整数自增或雪花 ID,否则生成器在生成 Mapper 的 selectByPrimaryKey 时找不到主键,代码生成到一半直接失败。这个问题很常见,因为很多开发者习惯了用 UUID 字符串做主键,但这类脚手架的通用代码对 UUID 主键支持不好,需要额外写类型处理器。我的建议是:跟框架走,别让框架跟你走。
这些演示表和权限表的关系是单向的:业务表通过 create_by、update_by 字段与 sys_user 产生弱关联,通过 dept_id 参与数据权限。建新业务表时,create_by、create_time、update_by、update_time 这四个审计字段是硬要求,少一个,通用 Mapper 在新增数据时就会报字段缺失。
2.3 定时任务与日志表:QRTZ_ 表和 sys_oper_log 为什么不要乱动
第三类运维支撑线,包括一套以 QRTZ_ 开头的定时任务表和 sys_oper_log、sys_logininfor 两张日志表。QRTZ_ 表是任务调度框架的存储底表,数量在十几张左右,分别存放触发器、任务详情、调度锁、日历和 misfire 记录。这些表相互之间有关联,不要手动删行或改字段类型。你在管理页面上新建一个定时任务,数据实际写入的是 QRTZ_JOB_DETAILS 和 QRTZ_TRIGGERS,而不是某张自定义的业务任务表。清理任务时,要用管理页面的删除接口,直接删库表记录会让调度器里残留句柄,出现任务停止但还在执行的诡异现象。
日志表是运行期增长最快的东西。sys_oper_log 记录模块标题、业务类型、操作人员、请求方法和耗时,sys_logininfor 记录登录者的 IP、浏览器和登录状态。这两张表初始数据很少,线上跑一个月可能就有几十万条。查询时直接全表扫,会把后端的慢查询数量拖上去。常见做法是写入前做异步落库,日志表按月分表或者定期归档。导入后先把归档计划设好,不然三个月后你会花大量时间在清数据上,而不是在写业务。
三类表的维护策略完全不同:权限体系改动要克制,业务演示表可以放开加,运维支撑表要提前规划生命周期。搞清楚这个边界,后面导入和调优就不会慌。
3. 把 SQL 落进 MySQL:建库、导入与核对三件事一步到位
导入这一步没有技术难度,但字符集、执行方式、验证这三个环节很容易出低级问题。环境不同,报错形式千奇百怪,根因往往就那么几个。下面按我自己的操作顺序来写。
3.1 建库先定字符集:utf8mb4 与排序规则为什么不能省
数据库连接串、库表字符集、脚本文件编码,三个地方不一致就会出现乱码。我习惯先建库再导数据,不在导入时随手让脚本建库。建库语句里把字符集和排序规则写死,避免使用服务器默认值,因为不同版本 MySQL 的默认排序规则不一样:5.7 默认是 utf8mb4_general_ci,8.0 默认是 utf8mb4_0900_ai_ci。两份 SQL 在大部分场景下行为一致,但联表查询时可能出现排序规则不一致导致的报错。
CREATE DATABASE IF NOT EXISTS ruoyi_vue_pro DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;IF NOT EXISTS是幂等保护,重复执行不会报错。DEFAULT CHARACTER SET指定库默认字符集,用 utf8mb4 而不是 utf8,是因为 utf8 在 MySQL 里实际是 utf8mb3,不支持 emoji 和部分四字节生僻字。COLLATE指定排序规则,我用 utf8mb4_general_ci 是为了在 MySQL 5.7 和 8.0 之间平滑切换。如果你确定只用 8.0,用 utf8mb4_0900_ai_ci 也行,但同事的旧客户端连上来可能会踩排序规则的坑。
建完库可以顺手确认一下当前库的字符集和排序规则:
SELECT default_character_set_name, default_collation_name FROM information_schema.schemata WHERE schema_name = 'ruoyi_vue_pro';看到结果里是 utf8mb4 和 utf8mb4_general_ci 再往下走。这一步三十秒能做完,能省掉后面查中文乱码的好几个小时。
3.2 命令行导入与 source 方式:两种最稳的导入姿势
导入方式我推荐命令行,尽量不要用图形客户端直接拖文件。图形客户端对大 SQL 文件经常在中间断掉,而且断点不提示,你看着是执行完了,其实后面几百行根本没跑。命令行有两种方式。
第一种是使用重定向:
mysql -uroot -p -h127.0.0.1 --default-character-set=utf8mb4 \ ruoyi_vue_pro < /path/to/ruoyi_vue_pro.sql这条命令把本地 SQL 文件重定向到 mysql 客户端执行。-u指定用户,-p在执行时提示输入密码,-h127.0.0.1连接本机,--default-character-set=utf8mb4声明客户端传输字符集,必须和库字符集一致,否则遇到中文注释和中文字段值会乱码。最后的ruoyi_vue_pro是库名,<做文件重定向。
第二种是进入客户端后用 source:
mysql -uroot -p进入交互环境后执行:
SOURCE /path/to/ruoyi_vue_pro.sql;SOURCE 是客户端内建命令,把文件内容按当前连接逐条执行。它的好处是执行结果逐条显示,哪条语句出错能立刻看到行号。缺点是慢,文件很大时要等。我的习惯是:生产库导入用重定向,测试库排查用 SOURCE,这样既快又能定位问题。
这里还有个多文件场景:如果脚本被拆成系统表、业务表、定时任务表三个文件,按顺序执行系统表 → 业务表 → 定时任务表。定时任务相关表放在最后一个执行,是因为它依赖系统表里的部分字典和参数配置。
3.3 导入后验证:用三条 SQL 确认这个库能用来启动
导入完成后不要急着启动项目,先花一分钟做核对。第一件事是看表数量:
SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema = 'ruoyi_vue_pro';以这类脚手架的常见体量,导入后表数量通常在几十张到上百张之间。如果只看到十几张,说明脚本在中间被中断过;如果数量多到你都不认识,可能是把多个版本的脚本重复导入了,部分表被重建,部分老表残留。这两种情况都要清理后重新导。
第二件事是看初始账号:
SELECT user_id, user_name, status, dept_id FROM sys_user ORDER BY user_id LIMIT 5;正常情况下第一条是 user_id=1 的 admin 超级管理员账号,status 为 0。如果查出来是空的,说明导入时漏了 INSERT 语句段,后面登录页面会一直报"用户不存在"。
第三件事是看菜单树:
SELECT menu_id, menu_name, parent_id FROM sys_menu WHERE parent_id = 0 ORDER BY menu_id;如果结果有完整的一级菜单目录,说明菜单数据齐了;如果只有零散几条,启动后左侧菜单大概率空白。三条验证 SQL 都正常,再到下一步去改配置。
4. 从 SQL 到系统跑起来:连接配置、启动顺序与前端联调对齐
SQL 导入成功只是让数据库就位,系统能不能起来,取决于配置文件改得对不对。很多开发者在导入后就急着 java -jar 启动,结果报连接失败、缓存连不上、日志目录不存在,其实大部分坑集中在配置文件上。
4.1 必改的三处配置:数据源、缓存、日志目录
后端配置一般集中在 application.yml 里,最小可用版本的数据源配置是这样:
spring: datasource: url: jdbc:mysql://127.0.0.1:3306/ruoyi_vue_pro?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true username: root password: "你的密码" driver-class-name: com.mysql.cj.jdbc.Driver连接串里几个参数都是踩坑踩出来的。useUnicode=true&characterEncoding=utf8 保证连接层字符集与库表一致,不写就会出现中文写入变问号。serverTimezone=Asia/Shanghai 解决 MySQL 8.x 的时区报错,不写的话启动会出现 server time zone 相关的乱码异常。allowPublicKeyRetrieval=true 是 MySQL 8.0 使用 caching_sha2_password 认证插件时客户端需要的,不加会报 Public Key Retrieval is not allowed。rewriteBatchedStatements=true 是批量插入优化,日志入库这种高频写场景建议加上。
第二块必改的是缓存配置。这类脚手架默认用 Redis 做会话和缓存,启动时会强连 Redis。至少要改 host 和 port,有密码的还要填 password。常见的坑是本地 Redis 没启动,后端启动时一直重试,日志刷屏。我会先把 Redis 启起来再启动后端,减少一次排查成本。配置写法一般是:
spring: redis: host: 127.0.0.1 port: 6379 password: "" database: 0 timeout: 10s lettuce: pool: max-active: 8 max-idle: 8host 和 port 不用多说,password 没有就留空字符串。database 默认 0,如果 Redis 实例里已经有其他业务的 key,建议单独用 database 2 或 3,避免 key 冲突。timeout 是连接超时,设太短会在高并发下频繁报连接超时,10 秒是比较稳的默认值。
第三块是日志目录。配置里日志默认写到 /data/logs 或项目根目录的 logs。Windows 环境经常因为目录不存在导致启动失败。启动前先确认日志文件配置里的路径,不存在就改为相对路径 ./logs。这一步很多新手忽略,启动日志刷了一半就中断,还以为是数据库问题。
4.2 后端启动前的自检清单:时区、SQL 模式、端口占用
启动前按顺序过一遍这四件事,能省去很多无头绪的报错。
第一,确认 MySQL 的 SQL 模式。这类脚手架生成的语句尽量兼容标准模式,但如果你把 ONLY_FULL_GROUP_BY 开着,部分统计查询会报分组字段问题。执行下面语句看当前模式:
SELECT @@sql_mode;如果包含 ONLY_FULL_GROUP_BY 且你遇到了分组查询报错,可以按项目需要去掉该模式,但我不建议全局关闭,只对当前库修改会安全一些。
第二,确认端口没被占用。后端默认端口一般是 8080,前端开发服务器常见 80 或 3000。启动前检查:
lsof -i:8080如果被占用,要么杀掉占用进程,要么在 application.yml 里改 server.port。
第三,确认 Redis 版本。脚本里用到的数据类型和命令对版本有要求,太老版本虽然能连上,但缓存序列化时可能报语法错误。一般建议用 5.x 及以上版本。
第四,确认 JDK 版本。这类 Spring Boot 项目的字节码版本和依赖决定 JDK 最低版本,常见是 JDK 8 或 JDK 17。启动前最好先 java -version 看一眼,版本过低会在加载类时抛 UnsupportedClassVersionError,过高则可能遇到某些老依赖的反射问题。
4.3 前端联调:接口地址、菜单权限和动态路由对齐
后端起来之后,前端还要把接口地址指向正确的后端。前端项目根目录下的 .env.development 或 vite.config.js 里会配代理或请求前缀,常见写法:
VITE_APP_BASE_API = '/dev-api' VITE_APP_PROXY_TARGET = 'http://127.0.0.1:8080'/dev-api是请求前缀,开发环境下由 Vite 代理转发到http://127.0.0.1:8080。你只需要把 VITE_APP_PROXY_TARGET 改成实际后端地址。如果不走代理直接部署,前端请求地址要写完整 URL,同时注意跨域配置,否则控制台会出现 Access-Control-Allow-Origin 的报错。
前端登录后菜单是从接口动态加载的,数据源就是 sys_menu 表。登录成功后左侧菜单只有首页一项,大概率是 SQL 里菜单数据没导入全,或者当前用户绑定的角色没分配菜单。先用 admin 账号验证,admin 在脚本里通常是超级管理员,能看全部菜单;如果 admin 也空白,问题就在菜单表数据上。
5. 避坑:导入和启动过程中最容易翻车的 5 个场景
下面这些坑是按出现频率排的,每条都按"现象 → 原因 → 解决"来写,操作顺序照着做就行。
5.1 现象:导入 SQL 报错,出现 syntax error 或 Unknown table 提示
现象:命令执行到某处中断,终端显示 ERROR 1064 (42000): You have an error in your SQL syntax,或者 ERROR 1146 (42S02): Table 'xxx' doesn't exist。
原因:最常见的有三种。第一种是脚本文件编码不对,文件是 GBK 或 UTF-8 带 BOM,里面中文注释被解析成乱码字符,语法结构被破坏。第二种是脚本里包含创建存储过程或触发器的语句,客户端没有先执行 DELIMITER 切换。第三种是多个 SQL 文件合在一起导,表创建顺序依赖不对,业务表先建,依赖的系统表反而在后面。
解决:确认文件编码为 UTF-8 无 BOM 后再导。非交互式导入时加上 --default-character-set=utf8mb4。如果脚本里有触发器或存储过程,先把它拆出来单独执行,开头确认有 DELIMITER 切换语句。多文件场景按系统表 → 业务表 → 定时任务表的顺序导。
5.2 现象:启动后登录页能打开,登录成功但菜单空白
现象:输入 admin 账号密码能登录,页面跳转后左侧菜单只有"首页"一项,或者完全空白,浏览器控制台没有明显报错。
原因:登录态是好的,问题在菜单加载接口返回的数据为空。常见原因是 sys_menu 里一级菜单的 parent_id 为 0 的记录没导入全,或者当前角色在 sys_role_menu 里没有匹配到菜单。另一个容易忽略的是 sys_menu 的 status 字段被初始化成"1"隐藏状态,菜单也不会返回。
解决:先用 SQL 查看当前角色关联了哪些菜单:
SELECT rm.role_id, rm.menu_id, m.menu_name, m.status FROM sys_role_menu rm LEFT JOIN sys_menu m ON rm.menu_id = m.menu_id WHERE rm.role_id = 1;如果结果里 menu_name 为 NULL,说明菜单表数据缺失,补上脚本里菜单相关的 INSERT 语句。如果 status 不是 0,把菜单状态改为 0 再重新登录。注意,前端动态路由是登录后读取的,改完数据库要重新登录或刷新 token,不然拿到的还是旧菜单快照。
5.3 现象:菜单显示正常,但点击后接口返回 401 或"无权限"
现象:左侧菜单渲染正常,点开页面后后端接口返回 401 或提示"无权限访问",admin 账号也一样。
原因:接口鉴权拿的是 sys_menu.perms 里的权限标识。如果菜单列表有 path 但 perms 为空,前端不会调对应操作接口;而接口注解要求的权限标识与菜单记录里的 perms 不匹配,就会拒掉。常见场景是 SQL 里的菜单数据来自旧版本,perms 字段名与代码注解不一致;或者是菜单记录被重复插入,同一权限标识出现两条,权限缓存加载时后一条覆盖前一条。
解决:定位到具体接口的权限注解,把注解里的标识和 sys_menu.perms 对齐。修改 SQL 后先清一次权限缓存,再重新登录。这类问题不是数据库连错,而是脚本版本和代码版本不配套导致的,排查时优先确认两者是不是同一套版本出来的。
5.4 现象:定时任务能添加,但到点不触发,或任务删了还在执行
现象:页面上新增一个 Cron 任务,设置每分钟执行一次,日志里一直没有执行记录。更诡异的是,从页面上删除任务后,任务还在后台跑。
原因:调度状态保存在 QRTZ_ 表里,包括调度器的实例信息、状态和锁。最常见的两个坑:一是导入 SQL 时 QRTZ_ 表建在了另一个库,应用配置的数据库指向当前库,调度器找不到表或锁;二是任务被删除时只删了业务表的记录,没走框架的删除接口,导致 QRTZ_TRIGGERS 里的状态还是 WAITING。
解决:先确认业务配置的数据库里确实有完整的 QRTZ_ 表,再确认调度日志里实例正常注册。删除任务一定要用管理接口,不要直接操作数据库。如果任务"删了还在跑",用框架提供的暂停接口先暂停触发器,再删任务,避免调度器黑匣子里残留句柄。
5.5 现象:页面显示正常,但查到中文全是问号或乱码
现象:页面上新增的数据带中文,存进数据库后变成 ??,或者查询结果显示乱码。
原因:字符集不统一。至少四个地方要一致:库表字符集、连接 URL 的 characterEncoding、MySQL 客户端连接默认字符集、前端请求的 Content-Type。其中任何一环断了,中文在写入或读出时就会被转成问号。
解决:把四个地方统一成 utf8mb4。库表改字符集:
ALTER DATABASE ruoyi_vue_pro CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;连接 URL 里已经带了 characterEncoding=utf8,确认没有其他参数覆盖它。MySQL 服务端配置文件 my.cnf 里把 character-set-server 设为 utf8mb4,然后重启 MySQL 服务。如果线上存量数据已经乱码,先确认底层字节是不是入库时就丢了,丢了的要用备份恢复,不能直接在库面上改字符集。这是所有字符集问题里最麻烦的一类,尽量按"先改配置、再测新增数据、最后修复存量"的顺序来。
6. 把这份"最新最全"变成自己的:增量更新、字段规范与底表健康检查
最后三个技巧做完,这份 SQL 才算真正变成你自己的东西。
第一,别整库重导。拿到新一版"最新最全 SQL"时,不要像第一次那样整库重导,这个动作会把你已经配好的菜单、字典和业务数据全部冲掉。我的习惯是拿新旧两版脚本做文本比对,找出新增表和新增字段,单独生成增量脚本执行。MySQL 8.0 里可以直接导当前表结构快照:
SELECT table_name, column_name, column_type, is_nullable, column_comment FROM information_schema.columns WHERE table_schema = 'ruoyi_vue_pro' ORDER BY table_name, ordinal_position;拿着这份快照跟新版建表语句对比,只执行新增和变更部分。对比时要把表名、字段名、类型和注释一起看,避免字段同名但类型不同,更新时隐式转换导致索引失效。
第二,新表按生成器的四条约定写。主键叫 id,类型用 BIGINT,自动递增;必带 create_by、create_time、update_by、update_time 四个审计字段;状态字段用 status,字典值在 sys_dict_data 里定义;字段注释里写清字典值含义。这四条都做到,生成的代码基本不用动。
第三,部署后定期跑三条健康检查 SQL。第一条查孤儿菜单:
SELECT m.menu_id, m.menu_name FROM sys_menu m LEFT JOIN sys_menu p ON m.parent_id = p.menu_id WHERE m.parent_id != 0 AND p.menu_id IS NULL;第二条查角色菜单断链:
SELECT role_id, COUNT(*) FROM sys_role_menu WHERE menu_id NOT IN (SELECT menu_id FROM sys_menu) GROUP BY role_id;第三条查日志表容量:
SELECT table_name, ROUND(data_length/1024/1024, 2) AS data_mb FROM information_schema.tables WHERE table_schema = 'ruoyi_vue_pro' AND table_name IN ('sys_oper_log', 'sys_logininfor');这套 SQL 最怕的不是导入失败,而是你把它当黑匣子,出问题就整库删掉重来。我的习惯是动任何系统表之前,先做一次 mysqldump 备份。多花几十秒,遇到难缠的权限问题时,你就知道这步有多值钱。希望帮到你。
本文还有配套的精品资源,点击获取