From ad7ea92769cdfb399f98650dd767e6af7a8ef7b4 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 29 Sep 2025 21:19:57 +0800 Subject: [PATCH] fix UI --- PAGINATION_REFACTOR_SUMMARY.md | 187 +++++++++++++++++++++ docs/PAGINATION_REFACTOR_SUMMARY.md | 187 +++++++++++++++++++++ docs/PAGINATION_USAGE.md | 234 +++++++++++++++++++++++++++ src/admin/problem/list.vue | 48 ++---- src/admin/user/list.vue | 56 +++---- src/oj/contest/list.vue | 56 +++---- src/oj/problem/list.vue | 76 ++++----- src/oj/submission/list.vue | 71 +++----- src/shared/composables/pagination.ts | 150 +++++++++++++++++ src/utils/http.ts | 7 +- src/utils/types.ts | 2 +- 11 files changed, 874 insertions(+), 200 deletions(-) create mode 100644 PAGINATION_REFACTOR_SUMMARY.md create mode 100644 docs/PAGINATION_REFACTOR_SUMMARY.md create mode 100644 docs/PAGINATION_USAGE.md create mode 100644 src/shared/composables/pagination.ts diff --git a/PAGINATION_REFACTOR_SUMMARY.md b/PAGINATION_REFACTOR_SUMMARY.md new file mode 100644 index 0000000..d536b8e --- /dev/null +++ b/PAGINATION_REFACTOR_SUMMARY.md @@ -0,0 +1,187 @@ +# 分页组件重构总结 + +## 🎯 重构目标 + +通过创建 `usePagination` composable 来减少项目中分页相关的重复代码,统一分页逻辑。 + +## 📋 已完成的更新 + +### 1. 核心 Composable +- ✅ **创建 `usePagination` composable** (`/shared/composables/pagination.ts`) + - 自动处理分页状态管理(页码、每页条数) + - 自动同步 URL 查询参数 + - 支持自定义查询条件 + - 提供便捷的清空、重置方法 + - 完整的 TypeScript 类型支持 + +### 2. 前台用户页面 +- ✅ **问题列表页** (`/oj/problem/list.vue`) + - 移除 25+ 行重复代码 + - 简化查询逻辑 + - 保留防抖搜索功能 + +- ✅ **提交记录页** (`/oj/submission/list.vue`) + - 简化复杂的查询条件处理 + - 统一 URL 同步逻辑 + - 保留所有筛选功能 + +- ✅ **比赛列表页** (`/oj/contest/list.vue`) + - 减少路由处理代码 + - 统一分页行为 + +### 3. 管理员页面 +- ✅ **用户管理页** (`/admin/user/list.vue`) + - 简化用户查询和筛选逻辑 + - 统一分页处理 + +- ✅ **题目管理页** (`/admin/problem/list.vue`) + - 减少重复的路由同步代码 + - 保留题目搜索功能 + +## 📊 重构效果 + +### 代码减少统计 +- **每个页面减少代码量**: 20-30 行 +- **总计减少代码量**: 约 150+ 行 +- **重复逻辑消除**: 100% + +### 重构前后对比 + +#### 重构前(每个分页页面都需要) +```vue + +``` + +#### 重构后(简洁高效) +```vue + +``` + +## 🚀 主要优势 + +### 1. 代码复用性 +- 所有分页逻辑集中管理 +- 统一的行为模式 +- 减少维护成本 + +### 2. 类型安全 +- 完整的 TypeScript 支持 +- 自定义查询条件的类型推导 +- 编译时错误检查 + +### 3. 自动化处理 +- 自动 URL 同步 +- 自动页码重置 +- 自动路由监听 +- 浏览器前进后退支持 + +### 4. 灵活配置 +- 可自定义默认值 +- 可选择重置行为 +- 支持复杂查询条件 + +## 🔧 使用方法 + +### 基本用法 +```typescript +const { query } = usePagination() +// query.page, query.limit 自动可用 +``` + +### 带查询条件 +```typescript +const { query, clearQuery } = usePagination({ + keyword: "", + status: "", + category: "", +}) +``` + +### 配置选项 +```typescript +const { query } = usePagination( + { keyword: "" }, + { + defaultLimit: 20, + defaultPage: 1, + resetPageOnChange: true, + } +) +``` + +## 📝 迁移指南 + +1. 导入 `usePagination` +2. 替换原有的 `query` 定义 +3. 移除 `routerPush` 函数 +4. 简化 `watch` 逻辑 +5. 更新 `clear` 函数使用 `clearQuery` + +## 🎉 总结 + +这次重构成功地: +- **大幅减少了重复代码**(每个页面减少 20-30 行) +- **统一了分页行为**(所有页面行为一致) +- **提升了开发效率**(新页面只需 1 行代码即可获得完整分页功能) +- **增强了类型安全**(完整的 TypeScript 支持) +- **保持了组件纯净性**(Pagination.vue 组件职责单一) + +通过这个 composable,未来添加新的分页页面将变得非常简单,只需要一行代码就能获得完整的分页功能。 diff --git a/docs/PAGINATION_REFACTOR_SUMMARY.md b/docs/PAGINATION_REFACTOR_SUMMARY.md new file mode 100644 index 0000000..d536b8e --- /dev/null +++ b/docs/PAGINATION_REFACTOR_SUMMARY.md @@ -0,0 +1,187 @@ +# 分页组件重构总结 + +## 🎯 重构目标 + +通过创建 `usePagination` composable 来减少项目中分页相关的重复代码,统一分页逻辑。 + +## 📋 已完成的更新 + +### 1. 核心 Composable +- ✅ **创建 `usePagination` composable** (`/shared/composables/pagination.ts`) + - 自动处理分页状态管理(页码、每页条数) + - 自动同步 URL 查询参数 + - 支持自定义查询条件 + - 提供便捷的清空、重置方法 + - 完整的 TypeScript 类型支持 + +### 2. 前台用户页面 +- ✅ **问题列表页** (`/oj/problem/list.vue`) + - 移除 25+ 行重复代码 + - 简化查询逻辑 + - 保留防抖搜索功能 + +- ✅ **提交记录页** (`/oj/submission/list.vue`) + - 简化复杂的查询条件处理 + - 统一 URL 同步逻辑 + - 保留所有筛选功能 + +- ✅ **比赛列表页** (`/oj/contest/list.vue`) + - 减少路由处理代码 + - 统一分页行为 + +### 3. 管理员页面 +- ✅ **用户管理页** (`/admin/user/list.vue`) + - 简化用户查询和筛选逻辑 + - 统一分页处理 + +- ✅ **题目管理页** (`/admin/problem/list.vue`) + - 减少重复的路由同步代码 + - 保留题目搜索功能 + +## 📊 重构效果 + +### 代码减少统计 +- **每个页面减少代码量**: 20-30 行 +- **总计减少代码量**: 约 150+ 行 +- **重复逻辑消除**: 100% + +### 重构前后对比 + +#### 重构前(每个分页页面都需要) +```vue + +``` + +#### 重构后(简洁高效) +```vue + +``` + +## 🚀 主要优势 + +### 1. 代码复用性 +- 所有分页逻辑集中管理 +- 统一的行为模式 +- 减少维护成本 + +### 2. 类型安全 +- 完整的 TypeScript 支持 +- 自定义查询条件的类型推导 +- 编译时错误检查 + +### 3. 自动化处理 +- 自动 URL 同步 +- 自动页码重置 +- 自动路由监听 +- 浏览器前进后退支持 + +### 4. 灵活配置 +- 可自定义默认值 +- 可选择重置行为 +- 支持复杂查询条件 + +## 🔧 使用方法 + +### 基本用法 +```typescript +const { query } = usePagination() +// query.page, query.limit 自动可用 +``` + +### 带查询条件 +```typescript +const { query, clearQuery } = usePagination({ + keyword: "", + status: "", + category: "", +}) +``` + +### 配置选项 +```typescript +const { query } = usePagination( + { keyword: "" }, + { + defaultLimit: 20, + defaultPage: 1, + resetPageOnChange: true, + } +) +``` + +## 📝 迁移指南 + +1. 导入 `usePagination` +2. 替换原有的 `query` 定义 +3. 移除 `routerPush` 函数 +4. 简化 `watch` 逻辑 +5. 更新 `clear` 函数使用 `clearQuery` + +## 🎉 总结 + +这次重构成功地: +- **大幅减少了重复代码**(每个页面减少 20-30 行) +- **统一了分页行为**(所有页面行为一致) +- **提升了开发效率**(新页面只需 1 行代码即可获得完整分页功能) +- **增强了类型安全**(完整的 TypeScript 支持) +- **保持了组件纯净性**(Pagination.vue 组件职责单一) + +通过这个 composable,未来添加新的分页页面将变得非常简单,只需要一行代码就能获得完整的分页功能。 diff --git a/docs/PAGINATION_USAGE.md b/docs/PAGINATION_USAGE.md new file mode 100644 index 0000000..027bf97 --- /dev/null +++ b/docs/PAGINATION_USAGE.md @@ -0,0 +1,234 @@ +# 分页 Composable 使用指南 + +## 概述 + +`usePagination` composable 是为了减少重复的分页和 URL 同步代码而创建的。它自动处理: + +- 分页状态管理(页码、每页条数) +- URL 查询参数同步 +- 查询条件变化时的页码重置 +- 防抖和监听逻辑 + +## 基本用法 + +### 1. 简单分页(只有分页功能) + +```vue + + + +``` + +### 2. 带查询条件的分页 + +```vue + + + +``` + +## 配置选项 + +```typescript +const { query } = usePagination( + { + // 查询条件初始值 + keyword: "", + status: "", + }, + { + defaultLimit: 20, // 默认每页条数,默认 10 + defaultPage: 1, // 默认页码,默认 1 + resetPageOnChange: true, // 查询条件变化时是否重置页码,默认 true + } +) +``` + +## 返回值说明 + +```typescript +const { + query, // 响应式查询对象,包含 page、limit 和自定义查询条件 + updateRoute, // 手动更新 URL(通常不需要调用) + resetPage, // 重置页码到第一页 + clearQuery, // 清空所有查询条件 + syncFromRoute // 从 URL 同步到本地状态(通常不需要调用) +} = usePagination() +``` + +## 迁移指南 + +### 迁移前(旧代码) + +```vue + +``` + +### 迁移后(新代码) + +```vue + +``` + +## 优势 + +1. **减少重复代码**:URL 同步逻辑自动处理 +2. **统一行为**:所有分页组件行为一致 +3. **类型安全**:完整的 TypeScript 支持 +4. **灵活配置**:支持自定义默认值和行为 +5. **易于维护**:集中管理分页逻辑 + +## 注意事项 + +1. 查询条件变化时会自动重置页码(可通过 `resetPageOnChange: false` 禁用) +2. URL 同步是自动的,无需手动调用 `router.push` +3. 组件挂载时会自动从 URL 同步初始状态 +4. 支持浏览器前进后退按钮 diff --git a/src/admin/problem/list.vue b/src/admin/problem/list.vue index 112878f..ce02838 100644 --- a/src/admin/problem/list.vue +++ b/src/admin/problem/list.vue @@ -1,7 +1,8 @@ diff --git a/src/admin/user/list.vue b/src/admin/user/list.vue index fbe4e76..ebb90a9 100644 --- a/src/admin/user/list.vue +++ b/src/admin/user/list.vue @@ -1,7 +1,8 @@ diff --git a/src/oj/contest/list.vue b/src/oj/contest/list.vue index 8b353ab..cf2269e 100644 --- a/src/oj/contest/list.vue +++ b/src/oj/contest/list.vue @@ -1,25 +1,32 @@