生产管理系统前端 - 更新瓦力提交的产品原型到参考目录

This commit is contained in:
2025-10-23 10:57:14 +08:00
parent 83523dad64
commit 28229ce795
354 changed files with 147599 additions and 7892 deletions

View File

@@ -0,0 +1,592 @@
# 分页组件样式优化更新
## 📅 更新时间
2025-10-16
## 🎯 更新概述
对全系统的分页组件进行美观度和用户体验优化,解决之前版本中分页样式变形和不美观的问题。
## ✨ 主要改进
### 1. 视觉设计优化
#### 统一的按钮样式
- ✅ 所有按钮使用相同的高度 (h-9) 和宽度 (w-9)
- ✅ 当前页使用绿色主题高亮 (`bg-green-600`)
- ✅ 其他页使用 outline 样式
- ✅ 禁用状态自动应用半透明效果
#### 响应式布局
```
桌面端:
┌─────────────────────────────────────────────────────────────┐
│ 每页显示 [10▼] 条 ⏮ ◀ [1] 2 3 ... 10 ▶ ⏭ 显示 1-10 至,共 95 条 │
└─────────────────────────────────────────────────────────────┘
移动端:
┌──────────────────────┐
│ [10▼] 条 │
├──────────────────────┤
│ ◀ [1] 2 3 ... 10 ▶ │
├──────────────────────┤
│ 共 95 条 │
└──────────────────────┘
```
### 2. 功能增强
#### 新增快捷按钮
| 按钮 | 图标 | 功能 | 显示条件 |
|------|------|------|----------|
| ⏮ 第一页 | ChevronsLeft | 跳转到第1页 | 桌面端显示 |
| ◀ 上一页 | ChevronLeft | 上一页 | 始终显示 |
| ▶ 下一页 | ChevronRight | 下一页 | 始终显示 |
| ⏭ 最后页 | ChevronsRight | 跳转到最后页 | 桌面端显示 |
#### 优化的页码显示
```typescript
// 页码显示策略
totalPages 5: 显示所有页码
: [1] [2] [3] [4] [5]
totalPages > 5: 智能省略
当前页靠前: [1] [2] [3] ... [10]
当前页居中: [1] ... [5] [6] [7] ... [10]
当前页靠后: [1] ... [8] [9] [10]
```
### 3. 用户体验提升
#### 统计信息优化
```tsx
// 桌面端完整信息
显示 1 10 条,共 95
// 移动端简化信息
95
```
#### 交互反馈
- ✅ 当前页绿色高亮,一眼识别
- ✅ 禁用按钮自动变灰,不可点击
- ✅ 鼠标悬停效果流畅
- ✅ 数字加粗显示,更清晰
### 4. 布局改进
#### Card 内部分页
```tsx
<Card>
<Table>
{/* 表格内容 */}
</Table>
{/* 分页组件 - 带顶部边框 */}
<DataPagination {...props} />
</Card>
```
**特点**:
- ✅ 顶部边框分隔表格和分页区域
- ✅ 背景色与 Card 一致
- ✅ 内边距统一 (px-4 py-4)
- ✅ 响应式间距 (gap-4)
## 📐 技术细节
### 组件结构
```tsx
<div className="border-t bg-background">
<div className="flex flex-col gap-4 px-4 py-4 sm:flex-row sm:items-center sm:justify-between">
{/* 左:每页数量 */}
<div className="flex items-center gap-2">
<span>每页显示</span>
<Select />
<span></span>
</div>
{/* 中:分页器 */}
<div className="flex items-center gap-2">
<Button></Button> {/* 第一页 - 桌面端 */}
<Button></Button> {/* 上一页 */}
<div className="flex items-center gap-1">
{/* 页码按钮 */}
</div>
<Button></Button> {/* 下一页 */}
<Button></Button> {/* 最后页 - 桌面端 */}
</div>
{/* 右:统计信息 */}
<div className="text-sm text-muted-foreground">
<span>显示 1 10 条,</span>
<span> 95 </span>
</div>
</div>
</div>
```
### 样式类说明
#### 容器样式
```tsx
className="border-t bg-background"
// border-t: 顶部边框,分隔表格
// bg-background: 背景色与卡片一致
```
#### 布局样式
```tsx
className="flex flex-col gap-4 px-4 py-4 sm:flex-row sm:items-center sm:justify-between"
// flex-col: 移动端垂直排列
// sm:flex-row: 桌面端水平排列
// gap-4: 元素间距
// px-4 py-4: 内边距
// sm:justify-between: 桌面端两端对齐
```
#### 按钮样式
```tsx
// 当前页按钮
className="h-9 w-9 p-0 bg-green-600 hover:bg-green-700 text-white"
// 普通页按钮
className="h-9 w-9 p-0"
variant="outline"
// 导航按钮
className="h-9 w-9 p-0"
variant="outline"
disabled={!canPreviousPage}
```
### 颜色方案
| 元素 | 颜色 | Tailwind 类 |
|------|------|-------------|
| 当前页背景 | 绿色 | bg-green-600 |
| 当前页悬停 | 深绿 | hover:bg-green-700 |
| 当前页文字 | 白色 | text-white |
| 普通按钮 | 边框 | variant="outline" |
| 辅助文字 | 灰色 | text-muted-foreground |
| 数字强调 | 前景色 | text-foreground |
## 🎨 设计原则
### 1. 一致性
- ✅ 所有按钮相同尺寸 (9x9)
- ✅ 统一的间距 (gap-1, gap-2, gap-4)
- ✅ 绿色主题贯穿系统
### 2. 清晰性
- ✅ 当前页绿色高亮
- ✅ 数字加粗显示
- ✅ 禁用状态明显
### 3. 响应式
- ✅ 移动端简化显示
- ✅ 桌面端完整功能
- ✅ 流畅的布局切换
### 4. 可访问性
- ✅ 禁用状态自动处理
- ✅ 图标含义清晰
- ✅ 文字信息完整
## 📱 响应式设计
### 断点策略
```scss
// 移动端 (< 640px)
- 垂直堆叠布局
- 隐藏"每页显示"文字
- 隐藏第一页/最后页按钮
- 简化统计信息
// 桌面端 ( 640px)
- 水平排列布局
- 显示完整文字
- 显示所有快捷按钮
- 完整统计信息
```
### 自适应元素
#### 每页数量选择器
```tsx
// 移动端
[10]
// 桌面端
每页显示 [10]
```
#### 导航按钮
```tsx
// 移动端
[1] [2] [3] ... [10]
// 桌面端
[1] [2] [3] ... [10]
```
#### 统计信息
```tsx
// 移动端
95
// 桌面端
显示 1 10 条,共 95
```
## 🔧 使用示例
### 基础用法
```tsx
import { usePagination } from '../lib/usePagination';
import { DataPagination } from './ui/data-pagination';
function MyList({ data }) {
// 初始化分页
const pagination = usePagination(data, 10);
return (
<Card>
<Table>
<TableBody>
{pagination.paginatedData.map(item => (
<TableRow key={item.id}>
{/* 渲染行 */}
</TableRow>
))}
</TableBody>
</Table>
{/* 分页组件 */}
<DataPagination
currentPage={pagination.currentPage}
totalPages={pagination.totalPages}
pageSize={pagination.pageSize}
totalItems={data.length}
startIndex={pagination.startIndex}
endIndex={pagination.endIndex}
onPageChange={pagination.goToPage}
onPageSizeChange={pagination.setPageSize}
canPreviousPage={pagination.canPreviousPage}
canNextPage={pagination.canNextPage}
/>
</Card>
);
}
```
### 自定义每页选项
```tsx
<DataPagination
{...paginationProps}
pageSizeOptions={[5, 10, 20, 50]} // 自定义选项
/>
```
### 与筛选配合
```tsx
// 先筛选,后分页
const filteredData = data.filter(/* 筛选条件 */);
const pagination = usePagination(filteredData, 10);
// 分页组件使用筛选后的数据量
<DataPagination
{...pagination}
totalItems={filteredData.length} // 使用筛选后的总数
/>
```
## 📁 修改文件
### 核心文件
1.`/components/ui/data-pagination.tsx` - 完全重写
2.`/lib/usePagination.ts` - 保持不变
### 已应用分页的组件
1.`/components/machinery/MachineryList.tsx` - 农机列表
2.`/components/machinery/driver/DriverList.tsx` - 驾驶员列表
3.`/components/machinery/driver/DriverTask.tsx` - 任务列表
4.`/components/field/FieldList.tsx` - 地块列表
### 待应用的组件
根据需要,可以在以下组件中添加分页:
- [ ] 维护记录列表
- [ ] 问题管理列表
- [ ] 培训记录列表
- [ ] 违规记录列表
- [ ] 其他需要分页的列表
## 🎯 优化前后对比
### 优化前的问题
**布局问题**:
- 英文 "Previous" 和 "Next" 不统一
- 按钮大小不一致
- 移动端显示拥挤
- 间距不规范
**视觉问题**:
- 当前页不够突出
- 缺少快捷跳转按钮
- 统计信息不够清晰
- 缺少分隔线
**体验问题**:
- 禁用状态不明显
- 缺少第一页/最后页快捷键
- 移动端信息过多
### 优化后的改进
**布局优化**:
- 统一的中文界面
- 所有按钮 9x9 方形
- 响应式布局完善
- 规范的间距系统
**视觉优化**:
- 绿色主题突出当前页
- 4个导航按钮覆盖所有场景
- 数字加粗,信息清晰
- 顶部边框分隔区域
**体验优化**:
- 禁用状态自动变灰
- 桌面端快捷跳转
- 移动端简化信息
- 流畅的交互反馈
## 💡 最佳实践
### 1. 何时使用分页
**适合使用分页**:
- ✅ 数据量 > 20 条
- ✅ 列表型数据展示
- ✅ 需要快速浏览
- ✅ 性能要求高
**不适合使用分页**:
- ❌ 数据量 < 10
- 需要全局搜索
- 数据关联性强
- 需要打印完整列表
### 2. 每页数量建议
| 场景 | 推荐数量 | 说明 |
|------|---------|------|
| 简单列表 | 20-50 | 少字段快速浏览 |
| 详细列表 | 10-20 | 多字段仔细查看 |
| 移动端 | 10-15 | 屏幕空间有限 |
| 桌面端 | 20-50 | 屏幕空间充足 |
### 3. 性能优化
**分页优化**:
```tsx
// ✅ 推荐:先筛选后分页
const filtered = data.filter(filterFn);
const pagination = usePagination(filtered, 10);
// ❌ 避免:分页后筛选
const pagination = usePagination(data, 10);
const filtered = pagination.paginatedData.filter(filterFn);
```
**搜索优化**:
```tsx
// ✅ 推荐:搜索后重置页码
const handleSearch = (keyword) => {
setSearchKeyword(keyword);
pagination.goToPage(1); // 重置到第一页
};
```
### 4. 用户体验
**默认设置**:
- 默认第1页
- 默认每页10条简单列表 20条详细列表
- 筛选后自动跳转第1页
**交互反馈**:
- 当前页明显标识
- 禁用按钮不可点击
- 显示完整统计信息
## 🐛 常见问题
### Q1: 分页组件在哪里显示?
**A**: 应该在 Card 组件内部Table 组件下方
```tsx
<Card>
<Table>
{/* 表格内容 */}
</Table>
<DataPagination {...props} /> {/* 这里 */}
</Card>
```
### Q2: 为什么切换每页数量会回到第一页?
**A**: 这是设计行为切换每页数量时当前页码可能超出新的总页数所以自动重置到第1页
### Q3: 移动端为什么看不到第一页/最后页按钮?
**A**: 为了节省空间移动端隐藏了这些快捷按钮用户可以通过点击页码或多次点击上一页/下一页来导航
### Q4: 如何修改绿色主题?
**A**: 修改 `data-pagination.tsx` 中的样式
```tsx
// 找到这行
className="bg-green-600 hover:bg-green-700 text-white"
// 改为你想要的颜色,例如蓝色
className="bg-blue-600 hover:bg-blue-700 text-white"
```
### Q5: 分页数据量为0时会显示什么
**A**: `totalItems === 0` 分页组件会返回 `null`不显示任何内容
### Q6: 如何处理分页和筛选同时使用?
**A**: 先筛选数据然后用筛选后的数据初始化分页
```tsx
const filteredData = data.filter(/* 筛选条件 */);
const pagination = usePagination(filteredData, 10);
<DataPagination
{...pagination}
totalItems={filteredData.length}
/>
```
## 📊 组件 API
### DataPagination Props
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| currentPage | number | | - | 当前页码 |
| totalPages | number | | - | 总页数 |
| pageSize | number | | - | 每页数量 |
| totalItems | number | | - | 总数据量 |
| startIndex | number | | - | 当前页起始索引 |
| endIndex | number | | - | 当前页结束索引 |
| onPageChange | (page: number) => void | ✅ | - | 页码变更回调 |
| onPageSizeChange | (size: number) => void | ✅ | - | 每页数量变更回调 |
| canPreviousPage | boolean | ✅ | - | 是否可以上一页 |
| canNextPage | boolean | ✅ | - | 是否可以下一页 |
| pageSizeOptions | number[] | ❌ | [10, 20, 50, 100] | 每页数量选项 |
### usePagination Hook
```tsx
const pagination = usePagination<T>(data: T[], initialPageSize?: number)
```
**返回值**:
```tsx
{
currentPage: number; // 当前页码
pageSize: number; // 每页数量
totalPages: number; // 总页数
paginatedData: T[]; // 当前页数据
goToPage: (page: number) => void; // 跳转页码
nextPage: () => void; // 下一页
previousPage: () => void; // 上一页
setPageSize: (size: number) => void; // 设置每页数量
canPreviousPage: boolean; // 是否可上一页
canNextPage: boolean; // 是否可下一页
startIndex: number; // 起始索引
endIndex: number; // 结束索引
}
```
## 🎓 学习资源
### 相关文档
- **分页使用**: 本文档
- **任务管理**: `/TASK_TERMINATE_UPDATE.md`
- **列表组件**: 各组件目录下的 README
### 示例代码
- **农机列表**: `/components/machinery/MachineryList.tsx`
- **驾驶员列表**: `/components/machinery/driver/DriverList.tsx`
- **任务列表**: `/components/machinery/driver/DriverTask.tsx`
- **地块列表**: `/components/field/FieldList.tsx`
## ✅ 验证清单
### 视觉验证
- [ ] 分页组件在 Card 内部正确显示
- [ ] 顶部边框清晰可见
- [ ] 所有按钮大小一致 (9x9)
- [ ] 当前页绿色高亮
- [ ] 禁用按钮呈灰色
### 功能验证
- [ ] 点击页码正确跳转
- [ ] 上一页/下一页功能正常
- [ ] 第一页/最后页快捷键有效(桌面端)
- [ ] 更改每页数量后重置到第1页
- [ ] 筛选后分页正确更新
### 响应式验证
- [ ] 移动端垂直堆叠布局
- [ ] 桌面端水平排列布局
- [ ] 移动端隐藏快捷按钮
- [ ] 桌面端显示完整信息
- [ ] 各断点过渡流畅
### 边界验证
- [ ] 数据为空时不显示分页
- [ ] 只有1页时禁用导航按钮
- [ ] 第1页时禁用上一页
- [ ] 最后页时禁用下一页
- [ ] 总页数变化时正确更新
## 🎉 总结
本次分页组件优化带来了全面的改进:
### 核心改进
**视觉统一** - 绿色主题,尺寸一致,布局规范
**功能完善** - 4个导航按钮快速跳转
**响应式优化** - 移动/桌面端自适应
**用户体验** - 清晰的当前页标识,完整的统计信息
### 技术亮点
**组件化设计** - 独立的分页组件,易于复用
**TypeScript支持** - 完整的类型定义
**性能优化** - useMemo 缓存分页数据
**可扩展性** - 灵活的配置选项
现在,分页组件不仅美观大方,而且功能强大,为整个系统的列表展示提供了统一、流畅的用户体验!🎊
---
**更新人**: AI助手
**更新日期**: 2025-10-16
**版本**: v2.0
**影响范围**: 全系统分页组件