编辑 | blame | 历史 | 原始文档

硬编码问题分析报告

问题概述

经过全面检查,发现项目中存在多处硬编码问题,主要集中在比赛阶段名称的处理上。这些硬编码会导致系统在用户自定义阶段名称时出现功能异常。

发现的硬编码问题

1. 后端服务层硬编码(严重)

文件: backend/src/main/java/com/rongyichuang/player/service/PlayerApplicationService.java
位置: 第35行
问题代码:
java // 默认只显示海选阶段的数据,过滤掉复赛等后续阶段 whereClause.append("(stage.name NOT LIKE '%复赛%' AND stage.name NOT LIKE '%决赛%')");

问题分析:
- 硬编码了"复赛"和"决赛"字符串
- 如果用户自定义阶段名称(如"第二轮"、"半决赛"等),过滤逻辑将失效
- 这是最严重的硬编码问题,直接影响业务逻辑

2. 前端界面硬编码(中等)

文件: web/src/views/ActivityForm.vue
位置: 第668行
问题代码:
javascript const stageNames = ['', '海选', '复赛', '半决赛', '决赛', '总决赛']

问题分析:
- 硬编码了默认阶段名称数组
- 限制了用户的自定义能力
- 不够灵活,无法适应不同类型的比赛

3. 前端比赛晋级页面硬编码(中等)

文件: web/src/views/competition-promotion/index.vue
位置: 第300行、第310行、第430行
问题代码:
javascript stageName: '初赛', stageName: '决赛', currentStageName: '初赛'

问题分析:
- 模拟数据中硬编码了阶段名称
- 可能影响测试和开发环境的数据一致性

4. 数据库测试数据硬编码(轻微)

文件: db.sql
位置: 第39-45行
问题代码:
sql INSERT INTO `t_activity` (..., `name`, ...) VALUES (..., '海选', ...); INSERT INTO `t_activity` (..., `name`, ...) VALUES (..., '复赛', ...);

问题分析:
- 初始化数据中硬编码了阶段名称
- 虽然是测试数据,但可能误导开发者认为这是标准命名

根本原因分析

1. 缺乏阶段类型设计

  • 数据库表 t_activity 中只有 sort_order 字段表示阶段顺序
  • 缺少 stage_typestage_level 字段来标识阶段类型
  • 业务逻辑依赖阶段名称而非阶段类型

2. 过滤逻辑设计不当

  • 使用字符串匹配而非结构化字段进行过滤
  • 没有考虑用户自定义阶段名称的场景

修改建议

方案一:添加阶段类型字段(推荐)

  1. 数据库结构修改
    sql ALTER TABLE t_activity ADD COLUMN stage_type INT DEFAULT 1 COMMENT '阶段类型:1=初选阶段,2=中级阶段,3=高级阶段';

  2. 后端服务修改
    java // 替换硬编码的字符串匹配 // 原代码:whereClause.append("(stage.name NOT LIKE '%复赛%' AND stage.name NOT LIKE '%决赛%')"); // 新代码: whereClause.append("stage.stage_type = 1"); // 只显示初选阶段

  3. 前端界面修改

  • 在活动创建表单中添加阶段类型选择
  • 移除硬编码的阶段名称数组
  • 允许用户自定义阶段名称

方案二:基于排序顺序过滤(备选)

  1. 后端服务修改
    java // 基于sort_order过滤,只显示第一阶段 whereClause.append("stage.sort_order = 1");

  2. 优点: 无需修改数据库结构

  3. 缺点: 灵活性较差,无法支持复杂的阶段分类

方案三:配置化阶段管理(最佳)

  1. 创建阶段类型配置表
    sql CREATE TABLE t_stage_type ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL COMMENT '阶段类型名称', code VARCHAR(20) NOT NULL COMMENT '阶段类型代码', level INT NOT NULL COMMENT '阶段级别', is_initial BOOLEAN DEFAULT FALSE COMMENT '是否为初选阶段', description VARCHAR(255) COMMENT '描述' );

  2. 修改活动表
    sql ALTER TABLE t_activity ADD COLUMN stage_type_id BIGINT COMMENT '阶段类型ID';

  3. 业务逻辑修改
    java // 基于阶段类型配置进行过滤 whereClause.append("EXISTS (SELECT 1 FROM t_stage_type st WHERE st.id = stage.stage_type_id AND st.is_initial = true)");

实施优先级

  1. 高优先级: 修复 PlayerApplicationService.java 中的硬编码过滤逻辑
  2. 中优先级: 修改前端阶段名称硬编码
  3. 低优先级: 清理测试数据中的硬编码

风险评估

  • 高风险: 后端过滤逻辑修改可能影响现有数据查询
  • 中风险: 数据库结构修改需要数据迁移
  • 低风险: 前端界面修改相对安全

建议实施步骤

  1. 首先实施方案二(基于排序顺序),快速解决当前问题
  2. 然后逐步实施方案三(配置化管理),提供长期解决方案
  3. 最后清理所有相关的硬编码问题

总结

项目中的硬编码问题主要源于缺乏合理的阶段类型设计。建议采用配置化的方式管理阶段类型,既能解决当前的硬编码问题,又能为未来的功能扩展提供良好的基础。