feat: 添加 Bash 权限并创建问题清单文档
docs: 记录项目问题与改进建议清单 新增 ISSUES_TO_FIX.md 文档,详细列出当前项目中的问题、改进建议和修复优先级
Showing
2 changed files
with
400 additions
and
1 deletions
ISSUES_TO_FIX.md
0 → 100644
| 1 | +# 项目问题与改进建议清单 | ||
| 2 | + | ||
| 3 | +> 创建日期: 2026-01-18 | ||
| 4 | +> 此文档记录代码中发现的问题和改进建议,修复后请勾选对应的复选框 | ||
| 5 | + | ||
| 6 | +--- | ||
| 7 | + | ||
| 8 | +## 0. 当前已修改文件的问题 [高优先级] | ||
| 9 | + | ||
| 10 | +### 0.1 CompleteInfoPage.vue - API 响应检查错误 | ||
| 11 | +**文件**: `src/views/recall/CompleteInfoPage.vue:129` | ||
| 12 | +**问题**: 使用 `if (res.code)` 而非 `if (res.code === 1)` 检查 API 响应 | ||
| 13 | +```javascript | ||
| 14 | +// 当前代码(错误) | ||
| 15 | +if (res.code) { | ||
| 16 | + // 处理成功 | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +// 应改为 | ||
| 20 | +if (res.code === 1) { | ||
| 21 | + // 处理成功 | ||
| 22 | +} | ||
| 23 | +``` | ||
| 24 | +**影响**: 可能将 401/403 等错误响应误判为成功 | ||
| 25 | +**修复难度**: 简单 | ||
| 26 | +**状态**: ⬜ 未修复 | ||
| 27 | + | ||
| 28 | +### 0.2 IDQueryPage.vue - API 响应检查错误 | ||
| 29 | +**文件**: `src/views/recall/IDQueryPage.vue:164` | ||
| 30 | +**问题**: 使用 `if (res.code)` 而非 `if (res.code === 1)` 检查 API 响应 | ||
| 31 | +**影响**: 可能将 401/403 等错误响应误判为成功 | ||
| 32 | +**修复难度**: 简单 | ||
| 33 | +**状态**: ⬜ 未修复 | ||
| 34 | + | ||
| 35 | +### 0.3 CompleteInfoPage.vue - 手机号缺少校验 | ||
| 36 | +**文件**: `src/views/recall/CompleteInfoPage.vue` | ||
| 37 | +**问题**: 手机号只有非空校验,没有格式校验 | ||
| 38 | +```javascript | ||
| 39 | +// 当前只有 | ||
| 40 | +if (!form.phone) { | ||
| 41 | + showToast('请输入手机号') | ||
| 42 | + return | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | +// 建议添加 | ||
| 46 | +if (!/^1[3-9]\d{9}$/.test(form.phone)) { | ||
| 47 | + showToast('请输入正确的手机号') | ||
| 48 | + return | ||
| 49 | +} | ||
| 50 | +``` | ||
| 51 | +**影响**: 用户可能输入格式错误的手机号 | ||
| 52 | +**修复难度**: 简单 | ||
| 53 | +**状态**: ⬜ 未修复 | ||
| 54 | + | ||
| 55 | +### 0.4 身份证号校验不一致 | ||
| 56 | +**文件**: `src/views/recall/CompleteInfoPage.vue:118-122` 和 `src/views/recall/IDQueryPage.vue:154-157` | ||
| 57 | +**问题**: 两个文件都有注释掉的身份证号校验逻辑,且位置不一致 | ||
| 58 | +**建议**: 统一决定是否启用身份证号校验,如启用请提取为公共函数 | ||
| 59 | +**修复难度**: 简单 | ||
| 60 | +**状态**: ⬜ 未修复 | ||
| 61 | + | ||
| 62 | +--- | ||
| 63 | + | ||
| 64 | +## 1. API 响应检查问题 [高优先级 - 安全性] | ||
| 65 | + | ||
| 66 | +### 1.1 全局 API 响应检查不当 | ||
| 67 | +**影响文件**: | ||
| 68 | +- `src/contexts/auth.js` (第68、81、98行) | ||
| 69 | +- `src/composables/useCheckin.js` | ||
| 70 | +- `src/composables/useStudyComments.js` | ||
| 71 | +- `src/components/ui/CheckInList.vue` | ||
| 72 | + | ||
| 73 | +**问题**: 大量使用 `if (code)` 而非 `if (code === 1)` 检查 API 响应 | ||
| 74 | + | ||
| 75 | +**影响**: 可能将 401/403 等错误响应误判为成功,导致安全问题 | ||
| 76 | + | ||
| 77 | +**修复建议**: | ||
| 78 | +1. 全局搜索 `if (res\.code\b)` 和 `if (code\b)` (排除 `=== 1` 的情况) | ||
| 79 | +2. 统一改为 `if (res.code === 1)` 或 `if (code === 1)` | ||
| 80 | +3. 或创建工具函数: | ||
| 81 | +```javascript | ||
| 82 | +// src/utils/api.js | ||
| 83 | +export const isSuccess = (response) => { | ||
| 84 | + return response?.code === 1 | ||
| 85 | +} | ||
| 86 | +``` | ||
| 87 | + | ||
| 88 | +**修复难度**: 中等(需要全局修改) | ||
| 89 | +**状态**: ⬜ 未修复 | ||
| 90 | + | ||
| 91 | +--- | ||
| 92 | + | ||
| 93 | +## 2. 代码一致性问题 [中优先级] | ||
| 94 | + | ||
| 95 | +### 2.1 缩进风格不一致 | ||
| 96 | +**问题**: 项目中混合使用 2 空格和 4 空格缩进 | ||
| 97 | +- App.vue: 2 空格 | ||
| 98 | +- 路由文件: 4 空格 | ||
| 99 | +- 大部分组件: 2 空格 | ||
| 100 | + | ||
| 101 | +**修复建议**: 统一使用 2 空格缩进(Vue 社区标准) | ||
| 102 | + | ||
| 103 | +**状态**: ⬜ 未修复 | ||
| 104 | + | ||
| 105 | +### 2.2 分号使用不一致 | ||
| 106 | +**问题**: 大部分代码不使用分号,但部分文件使用分号 | ||
| 107 | +- App.vue (第9-22行): 使用分号 | ||
| 108 | +- API 文件: 不使用分号 | ||
| 109 | +- 组件文件: 不使用分号 | ||
| 110 | + | ||
| 111 | +**修复建议**: 统一不使用分号,配置 Prettier 自动格式化 | ||
| 112 | + | ||
| 113 | +**状态**: ⬜ 未修复 | ||
| 114 | + | ||
| 115 | +### 2.3 函数声明风格不一致 | ||
| 116 | +**问题**: 混合使用 function 关键字和箭头函数 | ||
| 117 | + | ||
| 118 | +**修复建议**: 统一使用箭头函数(更符合现代 JavaScript 风格) | ||
| 119 | + | ||
| 120 | +**状态**: ⬜ 未修复 | ||
| 121 | + | ||
| 122 | +### 2.4 注释语言不一致 | ||
| 123 | +**问题**: 混合使用中文和英文注释 | ||
| 124 | + | ||
| 125 | +**修复建议**: 统一使用中文注释(符合项目团队语言习惯) | ||
| 126 | + | ||
| 127 | +**状态**: ⬜ 未修复 | ||
| 128 | + | ||
| 129 | +--- | ||
| 130 | + | ||
| 131 | +## 3. 硬编码问题 [中优先级 - 可维护性] | ||
| 132 | + | ||
| 133 | +### 3.1 魔法数字和字符串 | ||
| 134 | +**问题文件及位置**: | ||
| 135 | +- `App.vue:61` - `time: 30000` (更新检查间隔) | ||
| 136 | +- `contexts/cart.js:29` - `24 * 60 * 60 * 1000` (一天的毫秒数) | ||
| 137 | +- `contexts/auth.js:44` - `24 * 60 * 60 * 1000` (一天的毫秒数) | ||
| 138 | +- `utils/versionUpdater.js:62` - `timing(time = 10000)` (默认超时) | ||
| 139 | +- `components/ui/SharePoster.vue:491` - `Math.max(800, timeout_ms || 2000)` (超时时间) | ||
| 140 | + | ||
| 141 | +**修复建议**: 创建 `src/common/constants.js` 统一管理常量 | ||
| 142 | +```javascript | ||
| 143 | +export const UPDATE_INTERVAL = 30000 // 30秒 | ||
| 144 | +export const ONE_DAY_MS = 24 * 60 * 60 * 1000 | ||
| 145 | +export const DEFAULT_TIMEOUT = 10000 | ||
| 146 | +export const MIN_TIMEOUT = 800 | ||
| 147 | +export const DEFAULT_FETCH_TIMEOUT = 2000 | ||
| 148 | +``` | ||
| 149 | + | ||
| 150 | +**状态**: ⬜ 未修复 | ||
| 151 | + | ||
| 152 | +--- | ||
| 153 | + | ||
| 154 | +## 4. 组件拆分问题 [中优先级 - 可维护性] | ||
| 155 | + | ||
| 156 | +### 4.1 大型组件需要拆分 | ||
| 157 | + | ||
| 158 | +**高优先级**: | ||
| 159 | +| 文件 | 行数 | 建议拆分为 | | ||
| 160 | +|------|------|------------| | ||
| 161 | +| `views/checkin/CheckinDetailPage.vue` | 1377行 | CheckinForm.vue, CheckinPreview.vue, CheckinHistory.vue, useCheckinForm.js | | ||
| 162 | +| `views/teacher/formPage.vue` | 1329行 | TeacherFormBase.vue, StudentList.vue, FormValidation.js | | ||
| 163 | +| `views/teacher/studentPage.vue` | 1013行 | StudentList.vue, StudentDetail.vue, useStudentData.js | | ||
| 164 | + | ||
| 165 | +**中优先级**: | ||
| 166 | +| 文件 | 行数 | 说明 | | ||
| 167 | +|------|------|------| | ||
| 168 | +| `views/checkin/IndexCheckInPage.vue` | 1000行 | 打卡首页,建议拆分 | | ||
| 169 | +| `views/study/StudyDetailPage.vue` | 962行 | 学习详情页,建议拆分 | | ||
| 170 | +| `views/HomePage.vue` | 多功能混合 | 建议拆分为 UserProfileSection.vue, CheckInSection.vue, SummerCampPromotion.vue, ContentTabs.vue | | ||
| 171 | + | ||
| 172 | +**状态**: ⬜ 未修复 | ||
| 173 | + | ||
| 174 | +--- | ||
| 175 | + | ||
| 176 | +## 5. 重复代码问题 [中优先级] | ||
| 177 | + | ||
| 178 | +### 5.1 图片加载错误处理 | ||
| 179 | +**问题**: 多个组件中存在相似的图片加载错误处理逻辑 | ||
| 180 | + | ||
| 181 | +**修复建议**: 创建通用 composable | ||
| 182 | +```javascript | ||
| 183 | +// src/composables/useImageLoader.js | ||
| 184 | +export const useImageLoader = () => { | ||
| 185 | + const handleImageError = (e) => { | ||
| 186 | + e.target.src = 'https://cdn.ipadbiz.cn/mlaj/images/default-avatar.jpeg' | ||
| 187 | + } | ||
| 188 | + return { handleImageError } | ||
| 189 | +} | ||
| 190 | +``` | ||
| 191 | + | ||
| 192 | +**状态**: ⬜ 未修复 | ||
| 193 | + | ||
| 194 | +### 5.2 用户信息获取逻辑 | ||
| 195 | +**问题**: 重复的用户信息获取逻辑分散在多处 | ||
| 196 | + | ||
| 197 | +**修复建议**: 创建用户信息 composable | ||
| 198 | +```javascript | ||
| 199 | +// src/composables/useUserInfo.js | ||
| 200 | +export const useUserInfo = () => { | ||
| 201 | + const refreshUserInfo = async () => { | ||
| 202 | + const { code, data } = await getUserInfoAPI() | ||
| 203 | + if (code === 1) { | ||
| 204 | + return data | ||
| 205 | + } | ||
| 206 | + throw new Error('获取用户信息失败') | ||
| 207 | + } | ||
| 208 | + return { refreshUserInfo } | ||
| 209 | +} | ||
| 210 | +``` | ||
| 211 | + | ||
| 212 | +**状态**: ⬜ 未修复 | ||
| 213 | + | ||
| 214 | +### 5.3 表单验证代码重复 | ||
| 215 | +**问题**: 相似的表单验证代码在多个组件中重复 | ||
| 216 | + | ||
| 217 | +**修复建议**: 创建表单验证工具 | ||
| 218 | +```javascript | ||
| 219 | +// src/utils/validators.js | ||
| 220 | +export const validators = { | ||
| 221 | + phone: (value) => /^1[3-9]\d{9}$/.test(value) || '请输入正确的手机号', | ||
| 222 | + idCard: (value) => /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(value) || '请输入正确的身份证号', | ||
| 223 | + required: (value) => !!value || '此项为必填项' | ||
| 224 | +} | ||
| 225 | +``` | ||
| 226 | + | ||
| 227 | +**状态**: ⬜ 未修复 | ||
| 228 | + | ||
| 229 | +--- | ||
| 230 | + | ||
| 231 | +## 6. 性能优化建议 [低优先级] | ||
| 232 | + | ||
| 233 | +### 6.1 不必要的重新渲染 | ||
| 234 | +**问题**: 部分组件使用了过多的 `v-if` 而非 `v-show` | ||
| 235 | + | ||
| 236 | +**修复建议**: 对于频繁切换的元素使用 `v-show` | ||
| 237 | + | ||
| 238 | +**状态**: ⬜ 未修复 | ||
| 239 | + | ||
| 240 | +### 6.2 教师端学生列表虚拟化 | ||
| 241 | +**问题**: `views/teacher/studentPage.vue` 学生列表可能很长,未使用虚拟滚动 | ||
| 242 | + | ||
| 243 | +**修复建议**: 实现虚拟列表或分页加载 | ||
| 244 | + | ||
| 245 | +**状态**: ⬜ 未修复 | ||
| 246 | + | ||
| 247 | +### 6.3 计算属性优化 | ||
| 248 | +**问题**: 部分计算属性可以使用记忆化优化 | ||
| 249 | + | ||
| 250 | +**状态**: ⬜ 未修复 | ||
| 251 | + | ||
| 252 | +--- | ||
| 253 | + | ||
| 254 | +## 7. 错误处理问题 [中优先级] | ||
| 255 | + | ||
| 256 | +### 7.1 缺少错误处理 | ||
| 257 | +**问题文件**: | ||
| 258 | +- `contexts/auth.js` (第69、81行): 缺少错误处理 | ||
| 259 | +- 多个 API 调用处缺少 try-catch | ||
| 260 | + | ||
| 261 | +**修复建议**: 统一错误处理机制 | ||
| 262 | +```javascript | ||
| 263 | +// 创建 src/composables/useErrorHandler.js | ||
| 264 | +export const useErrorHandler = () => { | ||
| 265 | + const handleError = (error, customMessage) => { | ||
| 266 | + console.error(error) | ||
| 267 | + showToast(customMessage || '操作失败,请稍后重试') | ||
| 268 | + } | ||
| 269 | + return { handleError } | ||
| 270 | +} | ||
| 271 | +``` | ||
| 272 | + | ||
| 273 | +**状态**: ⬜ 未修复 | ||
| 274 | + | ||
| 275 | +--- | ||
| 276 | + | ||
| 277 | +## 8. 组件命名不一致 [低优先级] | ||
| 278 | + | ||
| 279 | +### 8.1 组件命名风格不统一 | ||
| 280 | +**问题**: | ||
| 281 | +- 有些组件使用 PascalCase: `CheckInDialog` | ||
| 282 | +- 有些使用 camelCase: `checkinList` | ||
| 283 | +- 路由名称不统一 | ||
| 284 | + | ||
| 285 | +**修复建议**: 统一使用 PascalCase 命名组件,路由名称使用 kebab-case | ||
| 286 | + | ||
| 287 | +**状态**: ⬜ 未修复 | ||
| 288 | + | ||
| 289 | +--- | ||
| 290 | + | ||
| 291 | +## 9. TypeScript 迁移建议 [长期] | ||
| 292 | + | ||
| 293 | +### 9.1 缺少类型定义 | ||
| 294 | +**问题**: 项目使用纯 JavaScript,无 TypeScript 类型约束 | ||
| 295 | + | ||
| 296 | +**修复建议**: | ||
| 297 | + | ||
| 298 | +#### 阶段 1: 添加类型定义文件 | ||
| 299 | +```typescript | ||
| 300 | +// src/api/types.d.ts | ||
| 301 | +export interface ApiResponse<T = any> { | ||
| 302 | + code: number | ||
| 303 | + data: T | ||
| 304 | + msg: string | ||
| 305 | +} | ||
| 306 | + | ||
| 307 | +// src/views/types.d.ts | ||
| 308 | +export interface Course { | ||
| 309 | + id: string | ||
| 310 | + title: string | ||
| 311 | + price: string | ||
| 312 | + cover?: string | ||
| 313 | + course_type: 'video' | 'audio' | 'image' | 'file' | ||
| 314 | +} | ||
| 315 | +``` | ||
| 316 | + | ||
| 317 | +#### 阶段 2: 关键模块迁移 | ||
| 318 | +1. API 层 - 添加参数和返回值类型 | ||
| 319 | +2. 组件 props 和 emits 类型 | ||
| 320 | +3. 状态管理 Context | ||
| 321 | + | ||
| 322 | +**状态**: ⬜ 未修复 | ||
| 323 | + | ||
| 324 | +--- | ||
| 325 | + | ||
| 326 | +## 10. 工具链配置建议 [基础设施] | ||
| 327 | + | ||
| 328 | +### 10.1 ESLint 规则完善 | ||
| 329 | +**建议**: 添加强制 `code === 1` 检查的规则 | ||
| 330 | +```javascript | ||
| 331 | +// .eslintrc.js | ||
| 332 | +rules: { | ||
| 333 | + 'no-warning-comments': 'warn', | ||
| 334 | + // 其他规则... | ||
| 335 | +} | ||
| 336 | +``` | ||
| 337 | + | ||
| 338 | +**状态**: ⬜ 未修复 | ||
| 339 | + | ||
| 340 | +### 10.2 Prettier 配置 | ||
| 341 | +**建议**: 统一代码格式化规则 | ||
| 342 | +```json | ||
| 343 | +{ | ||
| 344 | + "semi": false, | ||
| 345 | + "singleQuote": true, | ||
| 346 | + "tabWidth": 2, | ||
| 347 | + "trailingComma": "es5" | ||
| 348 | +} | ||
| 349 | +``` | ||
| 350 | + | ||
| 351 | +**状态**: ⬜ 未修复 | ||
| 352 | + | ||
| 353 | +### 10.3 Husky Git Hooks | ||
| 354 | +**建议**: 添加提交前检查,防止提交不规范代码 | ||
| 355 | + | ||
| 356 | +**状态**: ⬜ 未修复 | ||
| 357 | + | ||
| 358 | +--- | ||
| 359 | + | ||
| 360 | +## 优先级总结 | ||
| 361 | + | ||
| 362 | +### 🔴 高优先级(1-2周内修复) | ||
| 363 | +1. API 响应检查问题(安全性) | ||
| 364 | +2. 当前已修改文件的问题(CompleteInfoPage.vue, IDQueryPage.vue) | ||
| 365 | + | ||
| 366 | +### 🟡 中优先级(1个月内修复) | ||
| 367 | +3. 硬编码常量提取 | ||
| 368 | +4. 大型组件拆分 | ||
| 369 | +5. 重复代码提取 | ||
| 370 | +6. 错误处理完善 | ||
| 371 | + | ||
| 372 | +### 🟢 低优先级(长期优化) | ||
| 373 | +7. 代码风格统一 | ||
| 374 | +8. 性能优化 | ||
| 375 | +9. 组件命名统一 | ||
| 376 | +10. TypeScript 迁移 | ||
| 377 | +11. 工具链配置完善 | ||
| 378 | + | ||
| 379 | +--- | ||
| 380 | + | ||
| 381 | +## 快速修复清单 | ||
| 382 | + | ||
| 383 | +请按照以下顺序快速修复最关键的问题: | ||
| 384 | + | ||
| 385 | +- [ ] 0.1 修复 CompleteInfoPage.vue 的 API 响应检查 | ||
| 386 | +- [ ] 0.2 修复 IDQueryPage.vue 的 API 响应检查 | ||
| 387 | +- [ ] 0.3 为 CompleteInfoPage.vue 添加手机号格式校验 | ||
| 388 | +- [ ] 0.4 统一身份证号校验逻辑 | ||
| 389 | +- [ ] 1.1 全局 API 响应检查(使用 `code === 1`) | ||
| 390 | +- [ ] 3.1 提取魔法数字为常量 | ||
| 391 | +- [ ] 4.1 拆分大型组件 | ||
| 392 | +- [ ] 5.1 提取图片加载错误处理逻辑 | ||
| 393 | +- [ ] 5.2 提取用户信息获取逻辑 | ||
| 394 | +- [ ] 5.3 提取表单验证逻辑 | ||
| 395 | +- [ ] 7.1 完善错误处理机制 | ||
| 396 | +- [ ] 10.1 配置 ESLint 规则 | ||
| 397 | +- [ ] 10.2 配置 Prettier |
-
Please register or login to post a comment