# 代码审查报告 - Taiji Pad v0 ## 📋 执行摘要 本报告详细分析了项目中存在的问题、代码重复和可优化的地方。 --- ## 🔴 严重问题 ### 1. 重复文件(需要立即删除) #### 1.1 `use-toast.ts` 重复 - **位置**: - `hooks/use-toast.ts` ✅ (正在使用) - `components/ui/use-toast.ts` ❌ (未使用,应删除) - **状态**: 所有文件都从 `@/hooks/use-toast` 导入,`components/ui/use-toast.ts` 未被引用 - **建议**: 删除 `components/ui/use-toast.ts` #### 1.2 `use-mobile.ts` 重复 - **位置**: - `hooks/use-mobile.ts` ✅ (正在使用) - `components/ui/use-mobile.tsx` ❌ (未使用,应删除) - **状态**: 所有文件都从 `@/hooks/use-mobile` 导入,`components/ui/use-mobile.tsx` 未被引用 - **建议**: 删除 `components/ui/use-mobile.tsx` --- ## 🟡 代码重复问题 ### 2. 函数重复定义 #### 2.1 `getAuthToken()` 函数重复 - **位置**: - `lib/auth.ts` (第3-13行) - `lib/api-client.ts` (第11-21行) - **问题**: 两个文件定义了完全相同的函数 - **建议**: - 保留 `lib/auth.ts` 中的版本 - 在 `lib/api-client.ts` 中导入: `import { getAuthToken } from '@/lib/auth'` - 删除 `api-client.ts` 中的重复定义 ### 3. 登录页面代码重复 #### 3.1 三个登录页面高度重复 - **文件**: - `app/login/page.tsx` - `app/admin/login/page.tsx` - `app/channel/login/page.tsx` - **重复内容**: - 表单结构(邮箱、密码输入框) - 密码显示/隐藏切换逻辑 - 语言切换组件 - localStorage token 清除逻辑(第60-68行几乎完全相同) - 错误处理逻辑 - Toast 通知逻辑 - **建议**: - 创建共享组件 `components/auth/LoginForm.tsx` - 创建共享 hook `hooks/use-login.ts` - 三个页面只保留布局和角色特定的配置 ### 4. localStorage 操作重复 #### 4.1 Token 清除逻辑重复 在以下文件中重复出现相同的 token 清除代码: - `lib/api-client.ts` (第123-128行, 第192-197行) - `app/admin/login/page.tsx` (第63-68行) - `app/channel/login/page.tsx` (第60-65行) - `app/admin/dashboard/page.tsx` (第602-607行) - `app/channel/dashboard/page.tsx` (第573-578行) **建议**: 在 `lib/auth.ts` 中添加统一函数: ```typescript export function clearAllTokens(): void { if (typeof window !== "undefined") { localStorage.removeItem("auth_token") localStorage.removeItem("channel_token") localStorage.removeItem("admin_token") localStorage.removeItem("refresh_token") localStorage.removeItem("user") localStorage.removeItem("api_key") } } ``` #### 4.2 直接使用 localStorage 而非工具函数 多个文件直接使用 `localStorage.getItem()` 而不是通过 `lib/auth.ts` 的工具函数: - `app/admin/dashboard/page.tsx` (多处) - `app/channel/dashboard/page.tsx` (多处) - `app/admin/dashboard/components/ChannelsTab.tsx` (多处) **建议**: 统一使用 `lib/auth.ts` 中的工具函数 --- ## 🟢 可优化项 ### 5. 配置和依赖问题 #### 5.1 包管理器锁定文件重复 - **问题**: 同时存在 `package-lock.json` 和 `pnpm-lock.yaml` - **建议**: - 如果使用 pnpm,删除 `package-lock.json` - 如果使用 npm,删除 `pnpm-lock.yaml` - 在 `.gitignore` 中明确忽略不使用的锁定文件 #### 5.2 TypeScript 配置过时 - **问题**: `tsconfig.json` 中 `target: "ES6"` 过于保守 - **建议**: 更新为 `"ES2020"` 或 `"ES2022"` 以使用现代 JavaScript 特性 #### 5.3 Next.js 配置问题 - **问题**: `next.config.mjs` 中 `ignoreBuildErrors: true` 隐藏了类型错误 - **建议**: 修复类型错误,移除该选项(或仅在开发环境使用) #### 5.4 Toast 延迟时间异常 - **问题**: `hooks/use-toast.ts` 中 `TOAST_REMOVE_DELAY = 1000000` (约16分钟) - **建议**: 改为合理的值,如 `5000` (5秒) ### 6. 代码组织优化 #### 6.1 API Client 文件过大 - **问题**: `lib/api-client.ts` 有 1464 行,包含所有 API 方法 - **建议**: - 按模块拆分:`lib/api/auth.ts`, `lib/api/user.ts`, `lib/api/admin.ts`, `lib/api/channel.ts` - 创建统一的 API 客户端基类 - 使用命名空间或类继承组织代码 #### 6.2 未使用的依赖 - **问题**: `package.json` 中包含大量 Radix UI 组件,可能未全部使用 - **建议**: - 运行 `npx depcheck` 检查未使用的依赖 - 移除未使用的包以减少 bundle 大小 ### 7. 类型安全 #### 7.1 缺少类型定义 - **问题**: 多处使用 `any` 类型 - **建议**: - 为 API 响应创建明确的类型定义 - 在 `lib/api-client.ts` 中定义 `APIResponse` 的泛型使用 #### 7.2 类型文件位置 - **问题**: `app/admin/dashboard/types.ts` 类型定义分散 - **建议**: 创建统一的 `types/` 目录组织类型定义 --- ## 📊 统计数据 - **重复文件**: 2 个 - **重复函数**: 1 个 (`getAuthToken`) - **重复代码块**: - 登录页面: ~150 行重复代码 - Token 清除逻辑: ~30 行重复代码 - localStorage 直接访问: ~20 处 - **可优化文件**: - `lib/api-client.ts`: 1464 行(建议拆分) - 3 个登录页面(建议抽取组件) --- ## 🎯 优先级建议 ### 高优先级(立即处理) 1. ✅ 删除重复文件 (`components/ui/use-toast.ts`, `components/ui/use-mobile.tsx`) 2. ✅ 统一 `getAuthToken()` 函数(删除 `api-client.ts` 中的重复) 3. ✅ 创建 `clearAllTokens()` 工具函数 4. ✅ 修复 Toast 延迟时间 ### 中优先级(近期处理) 5. ⚠️ 抽取登录页面公共组件 6. ⚠️ 统一 localStorage 访问(使用工具函数) 7. ⚠️ 选择并保留单一包管理器锁定文件 8. ⚠️ 更新 TypeScript 配置 ### 低优先级(长期优化) 9. 📝 拆分 `api-client.ts` 为多个模块 10. 📝 移除未使用的依赖 11. 📝 改进类型定义 12. 📝 修复 Next.js 配置中的类型错误忽略 --- ## 📝 实施建议 ### 第一步:清理重复文件 ```bash # 删除未使用的重复文件 rm components/ui/use-toast.ts rm components/ui/use-mobile.tsx ``` ### 第二步:统一认证工具函数 在 `lib/auth.ts` 中添加: - `clearAllTokens()` 函数 - 确保 `getAuthToken()` 被正确导出 在 `lib/api-client.ts` 中: - 导入 `getAuthToken` 和 `clearAllTokens` 从 `@/lib/auth` - 删除重复定义 ### 第三步:重构登录页面 创建共享组件和 hook,减少重复代码。 --- ## ✅ 检查清单 - [x] 删除 `components/ui/use-toast.ts` ✅ 已完成 - [x] 删除 `components/ui/use-mobile.tsx` ✅ 已完成 - [x] 统一 `getAuthToken()` 函数 ✅ 已完成 - [x] 创建 `clearAllTokens()` 函数 ✅ 已完成 - [x] 修复 Toast 延迟时间 ✅ 已完成(从 1000000ms 改为 5000ms) - [ ] 统一 localStorage 访问 - [ ] 抽取登录页面公共代码 - [ ] 选择单一包管理器 - [ ] 更新 TypeScript 配置 - [ ] 拆分 API Client - [ ] 检查并移除未使用依赖 --- ## 🎉 已完成的修复 ### 2025-01-27 修复记录 1. ✅ **删除重复文件** - 删除了 `components/ui/use-mobile.tsx`(保留 `hooks/use-mobile.ts`) - `components/ui/use-toast.ts` 已不存在(可能之前已删除) 2. ✅ **统一 `getAuthToken()` 函数** - 在 `lib/api-client.ts` 中导入 `getAuthToken` 和 `clearAllTokens` 从 `@/lib/auth` - 删除了 `api-client.ts` 中重复的 `getAuthToken()` 定义(第 11-21 行) 3. ✅ **创建 `clearAllTokens()` 工具函数** - 在 `lib/auth.ts` 中添加了 `clearAllTokens()` 函数 - 在 `lib/api-client.ts` 的 `login()` 和 `logout()` 方法中使用该函数替换重复代码 4. ✅ **修复 Toast 延迟时间** - 将 `hooks/use-toast.ts` 中的 `TOAST_REMOVE_DELAY` 从 1000000ms(约16分钟)改为 5000ms(5秒) --- *报告生成时间: 2025-01-27*