完成内容: ✅ 第一层保护: 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行代码 - 完整的注释和使用说明
143 lines
2.9 KiB
JavaScript
143 lines
2.9 KiB
JavaScript
/**
|
||
* 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
|
||
*/
|