# 客户端开发计划 (todo) > 实现顺序:题目模块 → 比赛模块。提交/判题模块本期不实现:题目详情页暂不加代码编辑器;比赛排名接口数据为空(待提交模块)。后端每完成一批接口先 `npm run api:gen`。 ## Phase 0 路由与权限扩展 - [x] router 新增 `meta.requiresCoach`(admin | coach 可访问),保留 `requiresAdmin`(仅 admin,用户管理) - [x] AdminLayout:菜单按角色过滤;UserLayout:后台管理入口对 admin 和 coach 均显示 - Commit(ui): `# feat: 路由与布局支持coach后台入口` ## Phase 1 题目模块 · API生成 + 用户浏览页 - [x] `npm run api:gen` → problem-controller.ts / category-controller.ts + models - [x] `view/problem/ProblemListView.vue`(/problems):标题/难度/分类搜索、分页、难度与公开状态标签 - [x] `view/problem/ProblemDetailView.vue`(/problems/:id):描述、时间/内存限制、提交/通过数、样例、分类标签 - [x] 注册 userRoutes + 顶部导航菜单 - Commit(ui): `# feat: 题目列表与详情页` ## Phase 2 题目模块 · 管理后台页 - [x] `view/admin/ProblemManageView.vue`(/admin/problems):仿 UserView,搜索卡+表格+弹窗;编辑时维护分类勾选;详情弹窗管理样例与评测用例(含隐藏标记) - [x] `view/admin/CategoryManageView.vue`(/admin/categories):分类 CRUD - [x] 注册 adminRoutes + 侧边菜单 - Commit(ui): `# feat: 题目管理与分类管理后台页面` ## Phase 3 比赛模块 · API生成 + 用户浏览页 - [x] `npm run api:gen` → contest-controller.ts + models - [x] `view/contest/ContestListView.vue`(/contests):标题/状态搜索、类型标签、起止时间、分页 - [x] `view/contest/ContestDetailView.vue`(/contests/:id):基本信息、题目列表(题号/分值)、报名(password 型先弹密码框再拉取)、已报名/比赛状态判断 - [x] `view/contest/ContestRankingView.vue`(/contests/:id/ranking):排名表格(名次/用户/总分/AC最大耗时) - [x] 注册 userRoutes + 导航菜单 - Commit(ui): `# feat: 比赛列表、详情与排名页面` ## Phase 4 比赛模块 · 管理后台页 - [ ] `view/admin/ContestManageView.vue`(/admin/contests):比赛 CRUD、题目配置弹窗(多选题目+displayOrder+score)、报名名单 - [ ] 注册 adminRoutes + 侧边菜单 - Commit(ui): `# feat: 比赛管理后台页面` ## Phase 5 验证 - [ ] `npm run build`(vue-tsc 严格模式) - [ ] `npm run dev` 手工联调:游客浏览公开题 → 登录 → 教练建题/配样例/配用例/建比赛 → 用户报名 → 排名页空列表正常显示