feat: 添加Mock版本保护机制 - 基础架构完成

完成内容:
 第一层保护: Git分支隔离
  - 创建 v1.0-mock 标签
  - 创建 feature/api-integration 分支

 第二层保护: 配置开关控制
  - config/env.config.js (环境配置,支持Mock/API模式切换)

 第三层保护: 代码架构分离
  - utils/request.js (网络请求封装,支持Blade-Auth)
  - utils/dataAdapter.js (核心适配器,自动选择数据源)

 Mock数据模块 (4个文件):
  - mock/index.js (统一入口)
  - mock/login.js (登录Mock数据)
  - mock/athlete.js (选手Mock数据,含场地、项目)
  - mock/score.js (评分Mock数据,含扣分项、详情、修改)

 API接口模块 (4个文件):
  - api/index.js (统一入口)
  - api/auth.js (认证API,含后端接口规范)
  - api/athlete.js (选手API,含SQL示例)
  - api/score.js (评分API,含实现逻辑说明)

特性:
- 通过修改 config/env.config.js 的 dataMode 即可切换Mock/API模式
- Mock模式: 完全离线,无需后端,UI功能完整
- API模式: 调用真实后端接口(需后端实现5个专用接口)
- 零UI修改: 原有页面代码完全保护,仅替换数据源

下一步:
- 修改5个页面使用 dataAdapter
- 测试Mock模式功能
- 后端开发5个小程序专用接口

代码统计:
- 新增11个文件
- 约1000行代码
- 完整的注释和使用说明
This commit is contained in:
2025-12-11 14:06:03 +08:00
parent 7bd197f4ac
commit 7ec9a77c2a
12 changed files with 1616 additions and 1 deletions

142
api/athlete.js Normal file
View File

@@ -0,0 +1,142 @@
/**
* API接口 - 选手模块
* 真实后端接口调用(需要后端实现)
*/
import request from '@/utils/request.js'
/**
* 获取我的选手列表(普通评委)
* @param {Object} params
* @param {String} params.judgeId - 评委ID
* @param {String} params.venueId - 场地ID
* @param {String} params.projectId - 项目ID
* @returns {Promise}
*
* 注意:此接口需要后端实现
* 建议路径: GET /api/mini/athletes
*/
export function getMyAthletes(params) {
return request({
url: '/api/mini/athletes',
method: 'GET',
data: params,
showLoading: true
})
}
/**
* 获取选手列表(裁判长)
* @param {Object} params
* @param {String} params.competitionId - 比赛ID
* @param {String} params.venueId - 场地ID
* @param {String} params.projectId - 项目ID
* @returns {Promise}
*
* 注意:此接口需要后端实现
* 建议路径: GET /api/mini/athletes/admin
*/
export function getAthletesForAdmin(params) {
return request({
url: '/api/mini/athletes/admin',
method: 'GET',
data: params,
showLoading: true
})
}
/**
* 获取场地列表
* @param {Object} params
* @param {String} params.competitionId - 比赛ID
* @returns {Promise}
*/
export function getVenues(params) {
return request({
url: '/martial/venue/list',
method: 'GET',
data: {
...params,
current: 1,
size: 100
}
})
}
/**
* 获取项目列表
* @param {Object} params
* @param {String} params.competitionId - 比赛ID
* @returns {Promise}
*/
export function getProjects(params) {
return request({
url: '/martial/project/list',
method: 'GET',
data: {
...params,
current: 1,
size: 100
}
})
}
export default {
getMyAthletes,
getAthletesForAdmin,
getVenues,
getProjects
}
/**
* 后端接口规范(待实现):
*
* GET /api/mini/athletes
*
* 请求参数:
* {
* "judgeId": "456",
* "venueId": "1",
* "projectId": "5"
* }
*
* 响应:
* {
* "code": 200,
* "success": true,
* "msg": "操作成功",
* "data": [
* {
* "athleteId": "1",
* "name": "张三",
* "idCard": "123456789000000000",
* "team": "少林寺武术大学院",
* "number": "123-4567898275",
* "myScore": 8.906,
* "totalScore": 8.907,
* "scored": true,
* "scoreTime": "2025-06-25 09:15:00"
* }
* ]
* }
*
* SQL示例
* SELECT
* a.id AS athleteId,
* a.player_name AS name,
* a.id_card AS idCard,
* a.team_name AS team,
* a.player_no AS number,
* a.total_score AS totalScore,
* s.score AS myScore,
* CASE WHEN s.id IS NOT NULL THEN 1 ELSE 0 END AS scored,
* s.score_time AS scoreTime
* FROM martial_athlete a
* LEFT JOIN martial_score s
* ON a.id = s.athlete_id
* AND s.judge_id = #{judgeId}
* WHERE a.venue_id = #{venueId}
* AND a.project_id = #{projectId}
* AND a.is_deleted = 0
* ORDER BY a.order_num ASC
*/