# RuoYi-Vue 优化建议清单 > 文档版本:v1.0 | 生成日期:2026-06-28 > 数据来源:前端架构分析、后端架构分析、前后端交互规范、数据库结构分析 > 问题总数:36 条(前端 8 条、后端 8 条、交互 10 条、数据库 10 条) --- ## P0 - 高优先级(立即实施) > 影响安全、稳定性、核心功能,建议在 1-2 周内完成。 ### 1. fastjson 版本存在已知安全漏洞 - **问题描述**: 项目使用 fastjson 1.2.79,该版本存在多个已知 CVE 漏洞(如 CVE-2022-25845),攻击者可利用反序列化漏洞执行远程代码。 - **影响范围**: 全系统所有使用 JSON 序列化/反序列化的接口,包括登录、CRUD 操作、文件上传等。 - **推荐方案**: 升级至 fastjson2(2.x 系列)或替换为 Jackson/Gson。fastjson2 API 兼容性好,迁移成本较低。 - **实施优先级**: P0 - **实施步骤**: 1. 在根 `pom.xml` 中将 fastjson 版本改为 fastjson2 依赖 2. 全局搜索 `com.alibaba.fastjson` 导入,替换为 `com.alibaba.fastjson2` 3. 重点检查 `AjaxResult`、`TokenService`、`LogAspect` 中的 JSON 操作 4. 运行全量回归测试,确保序列化行为一致 5. 安全扫描验证漏洞已修复 ### 2. 业务表主键使用 double 类型 - **问题描述**: 所有业务表(stocks、account、operations、statistics 等)的主键使用 `double` 类型,浮点数作为主键可能导致精度丢失、索引效率低下、比较运算异常。 - **影响范围**: 股票业务表(8 万+ 记录)、账户记账表等所有业务模块的数据查询和关联操作。 - **推荐方案**: 将所有业务表主键改为 `bigint(20) NOT NULL AUTO_INCREMENT`。 - **实施优先级**: P0 - **实施步骤**: 1. 备份 `nstocks` 和 `ry` 数据库中涉及的业务表 2. 按依赖顺序执行 `ALTER TABLE` 语句修改主键类型(先子表后父表) 3. 更新对应的 Domain 实体类,将 `id` 字段类型从 `Double` 改为 `Long` 4. 更新 Mapper XML 中的主键引用 5. 验证数据完整性,运行全量测试 ### 3. trade_dates 表无主键 - **问题描述**: `trade_dates` 表(交易日历)没有任何主键或唯一索引,无法保证数据唯一性,数据库复制和备份可能出错。 - **影响范围**: 所有依赖交易日历的业务查询,包括股票行情、涨跌停板等模块。 - **推荐方案**: 将日期字段设为主键。 - **实施优先级**: P0 - **实施步骤**: 1. 检查 `trade_dates` 表结构,确认日期字段名称 2. 清理可能存在的重复日期记录 3. 执行 `ALTER TABLE trade_dates ADD PRIMARY KEY (date);` 4. 验证查询功能正常 ### 4. 核心业务表缺少必要索引 - **问题描述**: `stocks`(8 万+ 记录)、`stock_index`、`stock_financial`、`operations` 等大表仅有主键索引,高频查询字段(code、trade_day、user_id)完全无索引,导致全表扫描。 - **影响范围**: 所有股票行情查询、操作记录查询、持仓统计查询,数据量增长后性能急剧下降。 - **推荐方案**: 为高频查询字段添加复合索引和单列索引。 - **实施优先级**: P0 - **实施步骤**: 1. 分析慢查询日志,确认高频查询模式 2. 为 `stocks` 表添加 `idx_code_trade(code, trade_day)` 和 `idx_trade_day(trade_day)` 3. 为 `stock_index` 表添加 `idx_code_trade(code, trade_day)` 4. 为 `operations` 表添加 `idx_code_trade(code, trade_day)` 和 `idx_user_id(user_id)` 5. 为 `statistics_remain` 表添加 `idx_code_trade(code, trade_day)` 和 `idx_user_id(user_id)` 6. 使用 `EXPLAIN` 验证索引生效 ### 5. 排序字段存在 SQL 注入风险 - **问题描述**: 分页排序参数直接从请求参数读取并拼接到 SQL ORDER BY 子句中,虽使用 `SqlUtil.escapeOrderBySql()` 正则过滤,但正则表达式级别的防护存在被绕过的可能。 - **影响范围**: 所有使用分页排序的列表接口(约 50+ 个),攻击者可能通过精心构造的排序参数执行 SQL 注入。 - **推荐方案**: 使用白名单机制替代正则过滤,仅允许传入已知的合法字段名。 - **实施优先级**: P0 - **实施步骤**: 1. 在 `TableSupport` 或 `SqlUtil` 中实现排序字段白名单校验 2. 为每个实体定义允许排序的字段列表 3. 在 `startPage()` 方法中增加白名单校验逻辑 4. 非法排序参数直接拒绝并记录安全日志 5. 使用 SQL 注入扫描工具验证修复效果 ### 6. 响应格式不统一 - **问题描述**: `AjaxResult`(普通 CRUD 接口)使用 `data` 字段返回数据,而 `TableDataInfo`(分页列表接口)使用 `rows` + `total` 字段,前端需要分别处理两种完全不同的响应结构。 - **影响范围**: 前端所有 API 调用,180+ 个接口涉及两种响应格式处理,增加认知负担和维护成本。 - **推荐方案**: 统一响应结构,推荐在 `TableDataInfo` 中也使用 `data` 字段包裹分页数据,或引入统一的 `ApiResponse` 泛型响应体。 - **实施优先级**: P0 - **实施步骤**: 1. 定义统一响应基类 `ApiResponse`,包含 `code`、`msg`、`data` 2. 分页响应改为 `data: { list: [], total: 0 }` 结构 3. 前端 `request.js` 响应拦截器统一处理单一结构 4. 逐步迁移现有接口(可先从新接口开始) 5. 更新前端所有列表页面的数据提取逻辑 ### 7. ${params.dataScope} SQL 拼接注入风险 - **问题描述**: MyBatis XML 中使用 `${params.dataScope}` 直接拼接 SQL 片段,虽然 `DataScopeAspect` 在执行前会清空参数,但若切面执行顺序被改变或绕过,将直接导致 SQL 注入。 - **影响范围**: 所有使用 `@DataScope` 注解的 Service 方法,涉及用户、角色、部门等核心数据查询。 - **推荐方案**: 使用参数化方案替代直接 SQL 拼接,或在切面层进行严格的 SQL 片段校验。 - **实施优先级**: P0 - **实施步骤**: 1. 在 `DataScopeAspect` 中增加 SQL 片段合法性校验(仅允许特定模式) 2. 考虑将数据权限过滤改为 MyBatis 插件方式,在 SQL 解析阶段注入 3. 为关键查询添加安全审计日志 4. 进行安全渗透测试验证 --- ## P1 - 中优先级(近期实施) > 影响开发效率、可维护性,建议在 1-2 个月内完成。 ### 8. 使用已废弃的 WebSecurityConfigurerAdapter - **问题描述**: Spring Security 5.7+ 已废弃 `WebSecurityConfigurerAdapter`,项目当前继承该类进行安全配置,未来升级 Spring Boot 时将无法兼容。 - **影响范围**: `SecurityConfig.java` 安全配置模块,影响所有认证和授权流程。 - **推荐方案**: 改用 `SecurityFilterChain` Bean 配置方式。 - **实施优先级**: P1 - **实施步骤**: 1. 移除 `WebSecurityConfigurerAdapter` 继承 2. 将 `configure(HttpSecurity http)` 方法改为 `@Bean SecurityFilterChain` 方法 3. 将 `configure(WebSecurity web)` 方法改为 `WebSecurityCustomizer` Bean 4. 使用 `Lambda DSL` 风格编写安全规则(`.authorizeHttpRequests()` 替代 `.authorizeRequests()`) 5. 验证登录、权限校验、匿名访问等功能正常 ### 9. Token 解析异常被静默吞没 - **问题描述**: `TokenService.getLoginUser()` 方法中(第 72-74 行),catch 块为空,JWT Token 解析异常被完全忽略,导致问题难以排查。 - **影响范围**: 认证模块,所有 Token 验证失败的场景(过期、篡改、格式错误等)均无日志记录。 - **推荐方案**: 至少记录 WARN 级别日志,包含异常信息和请求上下文。 - **实施优先级**: P1 - **实施步骤**: 1. 在 `TokenService` 中注入 Logger 2. 在 catch 块中添加 `log.warn("Token 解析失败: {}", e.getMessage())` 3. 可选:记录请求 IP 和 User-Agent 便于安全审计 4. 验证日志输出正常 ### 10. 缺少统一 DTO/VO 分层 - **问题描述**: Domain 实体直接暴露给 Controller 层(如 `SysUser` 同时用于数据库映射和接口响应),密码等敏感字段需额外处理,字段暴露风险高。 - **影响范围**: 全系统所有 Controller 接口,特别是用户管理、角色管理等敏感模块。 - **推荐方案**: 引入独立的 DTO(数据传输对象)和 VO(视图对象),使用 MapStruct 或手动转换器进行映射。 - **实施优先级**: P1 - **实施步骤**: 1. 在 `ruoyi-common` 中创建 `dto/` 和 `vo/` 包 2. 为敏感实体(SysUser、SysRole 等)创建对应的 DTO/VO 3. Controller 层使用 DTO 接收请求、VO 返回响应 4. 使用 `@JsonIgnore` 或字段排除确保敏感字段不暴露 5. 逐步迁移现有接口 ### 11. Vue 2 + Vue CLI 技术栈老化 - **问题描述**: Vue 2 已于 2023 年底停止官方维护,Vue Router 3、Vuex 3、Vue CLI 4 均为旧版本,存在安全风险且无法使用 Composition API、`