hookehuyr

feat: 添加 Bash 权限并创建问题清单文档

docs: 记录项目问题与改进建议清单
新增 ISSUES_TO_FIX.md 文档,详细列出当前项目中的问题、改进建议和修复优先级
1 { 1 {
2 "permissions": { 2 "permissions": {
3 "allow": [ 3 "allow": [
4 - "Bash(tree:*)" 4 + "Bash(tree:*)",
5 + "Bash(xargs awk:*)",
6 + "Bash(find:*)"
5 ] 7 ]
6 } 8 }
7 } 9 }
......
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