docs(ui05,ui06): admin analysis+HTML preview, app-preview evidence, UI06 unified visual plan
- admin-preview-2026-09-22/ 20页新版后台HTML原型+截图+validation(UI05 交付) - app-preview-2026-09-22/ 截图/validation/check 脚本入库及小改 - admin-redesign-concept 概念图 - UI05 管理后台分析与新版设计说明、用户列表分页计划文档 - UI06 全端视觉统一实施方案(以两个 HTML 预览为唯一视觉基准) - services/api g4-sync-once 手动同步脚本 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
# UI-05:管理后台现状分析与新版设计说明
|
||||
|
||||
日期:2026-09-22。交付类型:代码静态分析、概念效果图、可运行离线 HTML 原型。**未修改管理后台业务源码,未连接真实账号、数据库、OSS 或生产接口。**
|
||||
|
||||
## 1. 交付入口
|
||||
|
||||
- [新版后台 HTML 入口](../designs/admin-preview-2026-09-22/index.html)
|
||||
- [后台概念效果图](../designs/admin-redesign-concept-2026-09-22.png)
|
||||
- [HTML 使用说明与页面索引](../designs/admin-preview-2026-09-22/README.md)
|
||||
- [HTML 实际截图](../designs/admin-preview-2026-09-22/screenshots/)
|
||||
- [自动检查记录](../designs/admin-preview-2026-09-22/validation.json)
|
||||
- [前一项 App 20 页原型](../designs/app-preview-2026-09-22/index.html)
|
||||
|
||||
双击 HTML 入口即可离线查看。左侧“全部页面目录”可直达20个页面与关键状态;相册、成员、分类、水印、账号等按钮可在示例状态中操作。图片、二维码和脚本均保存在本地目录,不依赖 CDN。
|
||||
|
||||
## 2. 分析依据与结论
|
||||
|
||||
### 2.1 实际框架
|
||||
|
||||
`apps/admin/package.json` 明确记录 Art Design Pro **v3.0.2** 裁剪版,实际使用 Vue 3、Element Plus、Pinia、vue-i18n、Tailwind、Vite。模板的演示视图和图表等依赖已裁剪。
|
||||
|
||||
布局保留 `ArtSidebarMenu`、`ArtHeaderBar`、`ArtPageContent` 和 `ArtGlobalComponent`。因此本次设计适合通过模板主题 token、业务组件及页面布局改造实现,无须换后台框架,也不应重新安装完整演示模板覆盖已有代码。
|
||||
|
||||
### 2.2 已核对的入口
|
||||
|
||||
| 当前入口 | 已有业务 | 设计处理 |
|
||||
|---|---|---|
|
||||
| `router/modules/albums.ts` | 相册管理、隐藏的相册详情路由 | 保留相册为主要工作入口,详情保持所属菜单高亮 |
|
||||
| `views/albums/manage/index.vue` | 文字表格、公开 token、状态、开关、游标加载 | 默认摄影封面卡片,可切换表格;token收敛到分享/高级资料 |
|
||||
| `views/albums/detail/index.vue` | 资料描述表、宣传图上传、照片/成员/分类/水印/分享页签 | 紧凑活动摘要在上,照片区成为主内容;资产编辑独立页签 |
|
||||
| `AlbumPhotos.vue` | 处理/可见性状态表格、点赞副本、批量隐藏、软删除 | 增加照片网格和管理大图,保留表格、筛选、部分成功语义 |
|
||||
| `AlbumMembers.vue` / `AlbumTransferDialog.vue` | 内部账号邀请、成员管理、所有者交接 | 成员列表简洁化,交接独立确认,不改权限 |
|
||||
| `AlbumCategories.vue` | 分类多语言 CRUD | 双语同屏编辑,避免另一个语言被全量替换丢失 |
|
||||
| `AlbumWatermark.vue` | 文本水印配置、示意预览、生成任务与重生成 | 参数与摄影预览双栏,任务记录保持独立 |
|
||||
| `system/users` | 搜索、角色/凭据/来源/本地锁定、密码重置与激活 | 状态分列,治理操作更清楚,保留自身账号保护 |
|
||||
| `system/user-sync` | 定时拉取状态、手动补拉、批次历史、失败明细 | 状态摘要、历史表格、失败详情弹层 |
|
||||
| `system/usage` | 原图/变体/合计、相册用量、阈值与告警 | 单位一致的汇总卡、资产构成、告警优先级 |
|
||||
| `system/embed-slots` | 展示位、绑定、启停、配置版本、接入代码、预览 | 列表与独立配置页,保留v1并突出v2固定小窗 |
|
||||
| `auth/login` / `exception` | 账号密码登录、403/404/500 | 统一品牌与回退路径,不增加注册、飞书 |
|
||||
|
||||
本次是静态代码和契约核查;没有以生产运行截图作为现状证据,没有宣称测试了当前后台的真实登录、权限和 API 链路。`views/index/index.vue` 是布局壳,不是已有业务仪表盘。
|
||||
|
||||
## 3. 当前值得调整的地方
|
||||
|
||||
### 3.1 照片业务却以信息表格为第一视觉
|
||||
|
||||
相册列表首先呈现标题、token和多个开关标签,活动识别需要读文字。详情的大型 `ElDescriptions` 和宣传图上传占据照片之前的区域。摄影业务应先让工作人员认出活动和照片,再进入参数编辑。
|
||||
|
||||
调整:相册封面卡片默认、表格备选;详情摘要高度受控,日期地点、创建者与访问状态简洁排列;编辑、分享为固定主操作;照片网格可切回信息表格。
|
||||
|
||||
### 3.2 技术信息与高频操作没有分层
|
||||
|
||||
公开 token、内部ownerId和配置信息不应成为主视觉字段。操作人员常用的是进入相册、查看照片、管理成员、分享与关闭公开访问。
|
||||
|
||||
调整:token保留在链接和代码生成流程;内部ID按需展开;保留处理状态和可见性差异,不能把照片处理完成等同于已公开。
|
||||
|
||||
### 3.3 状态很多,需要保持语义独立
|
||||
|
||||
公开/未公开、上传允许、相册active/offline、处理ready/failed、账号sourceStatus/credentialStatus/localLocked不可合并为一个“启用”标签。
|
||||
|
||||
调整:相册主卡只放主要状态;详情与表格提供完整事实。账号治理分列。用量阈值是告警而非硬配额;“用户同步”是企业账号目录同步,不能画成已验证的跨境照片同步监控。
|
||||
|
||||
### 3.4 局部页面已经具备保护,重做样式不能损失
|
||||
|
||||
- `useCursorList` 已为游标API设计,不要换成要求总数和随机页码的通用分页。
|
||||
- 批量隐藏已有逐项成功/失败结果,不要用全成功动画掩盖局部失败。
|
||||
- 账号来源状态只读,自己的角色/锁定存在保护。
|
||||
- 水印为异步任务,受理不等于全部生成成功。
|
||||
- 展示位无删除端点;停用、解绑、收起含义不同。
|
||||
- 同步手动补拉的受理、运行、最终结果是不同状态。
|
||||
|
||||
## 4. 已确认的契约对齐项
|
||||
|
||||
### 4.1 相册封面:契约存在,管理端类型尚未对齐
|
||||
|
||||
`packages/contracts/openapi.yaml` 的 Album 定义已有可空 `cover` 短期签名URL摘要,明确按页批量组装。所读 `apps/admin/src/types/api/album.d.ts` 的 `Summary` 还未声明 `cover`。
|
||||
|
||||
正式实施先核查服务实际响应,再对齐管理端类型和展示组件;不需要凭空发明封面服务,也不应为了卡片每个相册额外请求一次详情。无封面用中性占位,不偷用另一个活动图片。
|
||||
|
||||
### 4.2 管理照片预览:契约已有权限约束,不能绕过
|
||||
|
||||
OpenAPI 的 `AdminPhoto.preview` 已提供 `thumb/browse` 签名URL,可为null;隐藏照片预览仅admin/owner签发。当前管理端 `AdminPhoto` 类型还未声明此字段,现有 `AlbumPhotos.vue` 以资料表为主。
|
||||
|
||||
正式实现:补齐可空类型,使用该预览字段;为空呈现无预览/处理中/无权限的真实状态;签名过期经受控重取刷新。不能用公开原图URL、猜OSS对象键或匿名观众接口绕过管理权限。
|
||||
|
||||
### 4.3 搜索与相册创建不能按原型直接照搬API
|
||||
|
||||
- `fetchAlbumList` 当前参数仅cursor/limit,没有全局标题搜索和任意排序。原型明确写“搜索当前已加载相册”;生产若要全局搜索,应兼容扩展API再上线。
|
||||
- `fetchAlbumPhotos` 当前支持visibility/categoryId/cursor/limit,没有按文件名全局搜索。原型文件名是示例,正式无文件名时显示可用安全回退,不强行编造原文件名。
|
||||
- 相册列表只有ownerId,没有直接提供owner显示名;生产需评估批量显示名投影/缓存,不能N+1查人。
|
||||
- `CreatePayload` 当前只接受下载相关开关,公开/上传开关在更新载荷中。原型创建表单展示完整视觉模型,正式新建页应按契约禁用或解释这些字段,不能直接把UI字段塞进创建请求;也不能静默创建后再自动多次PATCH。
|
||||
- 生产只要求默认语言内容满足真实校验;原型为展示双语同时要求填写两列,不构成新增产品必填政策。
|
||||
- `translations` 为全量替换,修改单语言必须合并保留其他语言。
|
||||
|
||||
### 4.4 展示位v2类型已有,配置表单应复核调用链
|
||||
|
||||
此次读取的 `types/api/embedSlot.d.ts` 已有 `displayMode/scrollSpeed/reactionsEnabled`,但同次读取的 `SlotFormDialog.vue` 仍主要呈现size/intervalMs/imageFit等旧配置。工作树存在其他进行中的UI04改动,实施前必须重新核对最新版本。
|
||||
|
||||
正式新版明确区分v1与v2:v2固定195×280,不让size恢复320px;v1保留旧字段;settings整体替换时保留全部字段。后台最终应复用真正的展示组件,不能把此HTML中的简化预览当生产组件。
|
||||
|
||||
## 5. 新版视觉规范
|
||||
|
||||
| 项目 | 规格 |
|
||||
|---|---|
|
||||
| 布局 | 左侧216px固定导航,顶部64px,内容最大宽1660px |
|
||||
| 工作区 | 背景#F5F7FA,常规左右30px,卡片间距20–22px |
|
||||
| 主色 | #1A73E8;蓝色主操作,白色次级操作 |
|
||||
| 字体 | 系统无衬线,Windows中文优先Microsoft YaHei |
|
||||
| 标题 | 页面27px;卡片17px;表单/正文12–13px;辅助10–11px |
|
||||
| 边框与圆角 | #E5EAF1,卡片12px、控件8px,不使用重阴影 |
|
||||
| 相册列表 | 1440宽下三列封面卡;可切换表格;无假全局总数 |
|
||||
| 相册详情 | 300×144封面+简洁资料,页签承载管理功能 |
|
||||
| 照片网格 | 桌面四列,选择框、状态、文件回退名、上传者;无公众点赞按钮 |
|
||||
| 治理表格 | 表头浅底、轻分隔、长内容局部横滚,不能撑破整个页面 |
|
||||
| 状态 | 绿成功/公开,橙待处理,红危险/失败,灰非活跃;同时提供文字 |
|
||||
| 窄屏 | 侧栏抽屉、主栏换行、表格局部滚动;不把桌面整页缩成缩略图 |
|
||||
| 动态 | 减少无意义动效;焦点可见、弹窗限制焦点、Escape可关闭 |
|
||||
|
||||
概念效果图中的“246 uploads”等数字只是图像生成的示例,不是新的数据口径。HTML采用“可上传/上传关闭”及已有数据语义;正式实现不照抄概念图中的数量、人员、文件名和统计。
|
||||
|
||||
## 6. 20页与关键交互覆盖
|
||||
|
||||
01登录;02相册卡片/表格;03相册照片网格/表格;04成员;05分类;06水印;07分享;08新建;09编辑;10账号治理;11用户同步;12存储用量;13展示位列表;14展示位配置;15宣传图资产;16照片大图;17/18/19对应403/404/500;20同步批次详情。
|
||||
|
||||
同时提供可操作弹层:邀请/移除成员、所有者交接、分类增改删、照片隐藏/恢复/软删除、批量隐藏、账号编辑/重置/激活/锁定、阈值设置、展示位绑定及接入代码。
|
||||
|
||||
入口的菜单重组是展示层优化:相册和展示位归工作空间;账号、用户同步、用量归组织治理。可以保留真实 `system/embed-slots` 路由,不必为导航名称改数据库或路由权限体系。
|
||||
|
||||
## 7. Art Design Pro 实施映射
|
||||
|
||||
1. 在主题层增加或对齐主色、背景、圆角、边框与字号,不引入另一套UI框架。
|
||||
2. `ArtSidebarMenu/ArtHeaderBar` 保留菜单权限、响应式、语言、账号与原有导航行为;重排必要展示元素。
|
||||
3. `albums/manage` 提取 AlbumCoverCard 与列表/表格切换组件,保留游标数据源。
|
||||
4. `albums/detail` 提取 AlbumSummaryHeader,删除重复描述区;把现有BannerUpload收进资产页签。
|
||||
5. `AlbumPhotos` 共用一份照片序列,添加PhotoGrid/PhotoPreview,不复制新的状态存储;保留现有表格和批量结果处理。
|
||||
6. 成员、分类和分享复用现有API;统一表单footer、危险操作确认和错误定位。
|
||||
7. 治理页面继续复用Element Plus Table/Dialog/Drawer/Switch;保持账号保护与任务轮询清理。
|
||||
8. 展示位页面对齐UI04最终实现,参数与预览使用同一来源,不维护两个不同逻辑的“漂亮预览”。
|
||||
|
||||
## 8. 原型与生产实现的边界
|
||||
|
||||
- 本HTML没有引入Art Design Pro运行依赖,是供确认视觉与交互的独立原型,不是替代模板的生产实现。
|
||||
- 示例数据仅存在当前文档内存。刷新或独立打开另页会重置;无真实写请求。
|
||||
- 默认以公司管理员视角展示全部页面;员工/协作者角色的正式权限验收未实现于此原型。
|
||||
- 摄影来自已有/本次生成图的局部,适用于说明布局。不得当成公司真实活动素材。
|
||||
- 二维码编码的是example.com演示地址;复制链接和“打开观众页”指向本机观众页原型。
|
||||
- 展示位配置内的CSS上滚只用于说明样式,不声明是生产有限队列、真实气泡或严格速度实现;精确滚动可另开此前组件HTML查看。
|
||||
- 没有实现生产背景任务、密码重置、真实目录同步、OSS上传、海外复制、真实错误恢复或全套系统深色主题。
|
||||
- 统计由样例构成;不添加尚不存在的营业额、趋势、在线人数等仪表盘指标。
|
||||
|
||||
## 9. 检查结果与落地验收建议
|
||||
|
||||
HTML检查通过:20页在1440×1000渲染,无页面JS异常、图片加载失败或文档横向溢出;390宽代表页检查通过。已验证相册搜索、批量隐藏、可见性筛选、账号搜索、语言切换、展示位195×280尺寸/收起/v1配置、水印预览。
|
||||
|
||||
原生App原型亦已补完:20页390×844渲染;5类320宽代表页;登录→相册→拍摄模拟入队、隐藏→恢复、语言提交均通过。两套结果均只代表HTML,不代表真实Flutter或管理后台上线验收。
|
||||
|
||||
正式后台实施仍需补:角色矩阵、真实API响应、签名过期、403/404/断网、批处理部分失败、水印异步任务、账号自保护、settings全量替换、真实v1/v2预览一致性。保留当前所有已有测试,在隔离环境验证,不自动部署或操作真实云资源。
|
||||
|
||||
## 10. 生成方式
|
||||
|
||||
概念图使用内置 image_gen(imagegen 技能),非CLI。完整提示词随设计资产保存于 `../designs/admin-preview-2026-09-22/image-prompt.txt`。HTML与截图由本地实现和Playwright生成。生成图与运行截图分别保留,不互相冒充。
|
||||
@@ -0,0 +1,219 @@
|
||||
# UI-06:全端视觉统一实施方案(管理后台 + App,以 HTML 示例为唯一视觉基准)
|
||||
|
||||
版本:1.0
|
||||
日期:2026-09-22
|
||||
状态:待执行。本文只规划,不代表页面已还原。
|
||||
目标:把 `apps/admin`(Vue3 + Element Plus / Art Design Pro 裁剪版)与 `apps/mobile`(Flutter)的实际界面,逐页还原到两个 HTML 示例的视觉效果,并以截图对照 + 测试服务器部署作为验收证据。
|
||||
|
||||
## 0. 给执行者的强制说明
|
||||
|
||||
**两个 HTML 预览目录是唯一视觉真相源。** 用户已明确:「要以示例 HTML 效果为主」。任何规格表、旧方案、设计板、组件库默认值与示例冲突时,一律以示例为准。
|
||||
|
||||
- [管理后台示例](../designs/admin-preview-2026-09-22/index.html)(20 页,`screenshots/01.png`–`20.png` 为渲染证据)
|
||||
- [App 示例](../designs/app-preview-2026-09-22/index.html)(20 页,`screenshots/01.png`–`20.png` 为渲染证据)
|
||||
|
||||
裁决优先级(高→低):
|
||||
|
||||
1. HTML 示例的实际渲染效果(以 `screenshots/` 与浏览器打开实物为准)
|
||||
2. UI-05(后台)/ UI-03R(App)中与示例一致的数值规格、契约对齐项、保护项
|
||||
3. 组件库(Element Plus / Material)默认值——**不得作为不还原的理由**
|
||||
|
||||
还原 = 修改真实代码。两个预览目录本身只读,不得为迁就实现反向修改示例。
|
||||
|
||||
其他强制项:
|
||||
|
||||
- 不得用「测试/类型检查通过」代替视觉验收;每页必须真实截图并对照示例。
|
||||
- 不得只换颜色不改结构:示例中相册封面卡、照片网格、整页表单、菜单分组均为结构性改动,必须落地。
|
||||
- 不得覆盖用户当前未提交改动;每批开工前核对 `git status`,异常先停下确认。
|
||||
- 不自动提交推送打标签;每批完成提交需用户可见信息。不自动部署生产、不操作云资源;测试服务器部署按 §4.3 既有流程。
|
||||
- 示例中的样例数据(人数、文件名、"82 uploaded"、演示二维码)不得抄进生产默认值。
|
||||
|
||||
## 1. 基线与前置
|
||||
|
||||
### 1.1 基线提交
|
||||
|
||||
开工前把工作树中未入库的成果先提交(属上一阶段产物,不属本方案改动):
|
||||
|
||||
- `docs/designs/admin-preview-2026-09-22/`(含 screenshots、validation.json、image-prompt.txt)
|
||||
- `docs/designs/app-preview-2026-09-22/`(含 screenshots、validation.json、check-preview.cjs 及 app.js/styles.css 未提交小改)
|
||||
- `docs/designs/admin-redesign-concept-2026-09-22.png`
|
||||
- `docs/plans/2026-09-22-UI05-管理后台分析与新版设计说明.md`
|
||||
- `docs/plans/2026-09-22-用户列表分页与同步信息展示-实施计划.md`
|
||||
- `services/api/src/scripts/g4-sync-once.ts`
|
||||
|
||||
基线提交后新建 `docs/plans/progress/UI06-验收记录.md` 骨架。
|
||||
|
||||
### 1.2 Before 截图
|
||||
|
||||
本地起 admin(`pnpm --filter @photo/admin dev`,接口指向测试服务器 cn API),用 Playwright 对现有页面截图存入 `docs/designs/ui06-implementation/before/`,命名与示例编号对齐(`02-albums.png` 等)。App 侧 before 不直接复用 UI-03 截图作为证据(仅覆盖 10/20 页且为 540×960 设备分辨率)——A0 阶段在固定 390×844 画布对全部 20 页补拍当前态。
|
||||
|
||||
## 2. 管理后台线(先行)
|
||||
|
||||
视觉规范依据示例与 UI-05 §5:主色 `#1A73E8`;工作区背景 `#F5F7FA`;边框 `#E5EAF1`;卡片圆角 12、控件 8;左侧导航 216px、顶部 64px、内容最大宽 1660px、常规左右边距 30px、卡间距 20–22px;页面标题 27px、卡片标题 17px、正文 12–13px、辅助 10–11px;字体为系统无衬线栈、Windows 中文优先 Microsoft YaHei;状态色绿=成功/公开、橙=待处理、红=危险/失败、灰=非活跃,且必须同时有文字。
|
||||
|
||||
### 2.1 二十页映射与结构性改动
|
||||
|
||||
| # | 示例页 | 代码入口 | 结构性改动(以示例为准) |
|
||||
|---|---|---|---|
|
||||
| 01 | 登录 | `views/auth/login/index.vue` | 整页重做:摄影拼贴主视觉 + 居中表单;摄影素材先以示例 assets 概念图裁片作占位入库,**标记为占位**,待用户提供正式品牌素材后替换 |
|
||||
| 02 | 相册列表 | `views/albums/manage/index.vue` | **默认封面卡片三列**(1440 宽),可切表格;搜索按当前已加载过滤(契约无全局搜索,UI-05 §4.3);token 收敛进分享/高级区 |
|
||||
| 03 | 照片网格 | `views/albums/detail/AlbumPhotos.vue` | 新增照片**网格视图 + 管理大图**,保留表格/筛选/批量语义切换 |
|
||||
| 04 | 成员 | `detail/AlbumMembers.vue` + `AlbumTransferDialog.vue` | 列表视觉简化;交接独立确认步骤 |
|
||||
| 05 | 分类 | `detail/AlbumCategories.vue` | 双语同屏编辑,禁止全量替换丢语言 |
|
||||
| 06 | 水印 | `detail/AlbumWatermark.vue` | 参数左、摄影预览右双栏;即时预览 |
|
||||
| 07 | 分享 | `detail/AlbumShareCard.vue` | 分享卡视觉对齐:封面、二维码、复制链接布局 |
|
||||
| 08 | 新建表单 | `manage/AlbumFormDialog.vue` → **改为整页表单路由** | 从对话框改整页(示例 08);新增隐藏路由(沿用相册详情隐藏路由先例,保持父菜单高亮);字段分组、footer 按钮对齐;`manage/index.vue` 与 `detail/index.vue` 两处消费入口一并改造 |
|
||||
| 09 | 编辑表单 | 同上(edit 模式,含 `detail/index.vue:153` 编辑入口重接) | 整页 + 资料/访问分区;`translations` 合并保留其他语言 |
|
||||
| 10 | 账号治理 | `system/users/` | 状态分列(凭据/来源/锁定);**保留 2026-09-22 刚上线的分页 + 同步档案列**,仅重排视觉 |
|
||||
| 11 | 用户同步 | `system/user-sync/` | 状态摘要卡 + 历史 + 失败明细弹层视觉对齐 |
|
||||
| 12 | 用量 | `system/usage/` | 汇总卡单位一致、资产构成、阈值对话框对齐 |
|
||||
| 13 | 展示位列表 | `system/embed-slots/index.vue` | 列表视觉对齐;启停/绑定/收起语义不变 |
|
||||
| 14 | 展示位配置 | `SlotFormDialog.vue` 等 | **参数与预览复用 UI-04 真实组件**(v2 固定 195×280);不搬示例里的简化 CSS 预览(UI-05 §4.4) |
|
||||
| 15 | 品牌资产 | `detail/AlbumBannerUpload.vue` | 收进相册详情资产页签,独立视觉区 |
|
||||
| 16 | 照片大图 | AlbumPhotos 新增 PhotoPreview | 深色舞台 + 元信息 + 隐藏/恢复/软删除动作条 |
|
||||
| 17–19 | 403/404/500 | `views/exception/` | 品牌统一、回退路径视觉对齐 |
|
||||
| 20 | 同步批次详情 | `system/user-sync/index.vue` 失败明细抽屉(:165 ElDrawer) | 抽屉视觉对齐示例 20 |
|
||||
|
||||
菜单分组(仅展示层重排,路由与权限不动,UI-05 §6):工作空间(相册管理、网站展示位)/ 组织与治理(账号管理、用户同步、存储与用量)。
|
||||
|
||||
### 2.2 契约核对(B0 内完成,结论写进验收记录)
|
||||
|
||||
对测试服务器实际响应核对,不得凭空发明:
|
||||
|
||||
- Album `cover`(可空签名 URL 摘要):核对测试服务器 `fetchAlbumList` 实际响应 → 补 `apps/admin/src/types/api/album.d.ts` `Summary.cover` → 卡片使用。**分支处理**:(a) 服务端已返回、仅部分相册无封面 → 中性占位验收;(b) 服务端响应根本无此字段(未实现)→ 属服务端补齐(OpenAPI 已定义、超出纯前端范围),**停下向用户确认**后再做,不得假造封面或 N+1 拉详情。
|
||||
- `AdminPhoto.preview`(thumb/browse 可空):核对响应 → 补类型 → 网格/大图使用;为空呈现真实空态;签名过期经受控重取。
|
||||
- 相册创建载荷仅下载开关;公开/上传开关属更新载荷:整页表单按契约禁用或解释,不得塞进创建请求。
|
||||
- 展示位 v2 `displayMode/scrollSpeed/reactionsEnabled` 已有类型;实施前重核 `SlotFormDialog.vue` 最新版本(工作树 UI-04 改动已提交,以 HEAD 为准)。
|
||||
|
||||
### 2.3 任务清单
|
||||
|
||||
### B0 基线(半天)
|
||||
- [ ] §1.1 基线提交;`git status` 干净后开工。
|
||||
- [ ] 编写可复用 Playwright 截图脚本(登录 → 逐页 capture → 存 `docs/designs/ui06-implementation/`),后续 before/comparisons 全部用它;需有效测试服务器管理员账号(向用户获取,凭据不写入仓库)。
|
||||
- [ ] before 截图(admin dev + 测试服务器 API)。
|
||||
- [ ] 契约核对 §2.2 四项,结论记入验收记录。
|
||||
- [ ] 核对 Element Plus 主题变量入口(`assets/styles/core/el-light.scss`、`el-ui.scss`)与 Art 布局组件(`components/core/layouts/`)现状。
|
||||
- 出口:偏差清单 + 契约结论齐,才进 B1。
|
||||
|
||||
### B1 主题 + 布局壳(1 天)
|
||||
- [ ] token 落地:以 admin-preview `styles.css` 的 `:root` CSS 变量块为对照来源,映射到 Element Plus 主题变量(`--el-color-primary` 等)与 Art token;字体按 §2(系统无衬线栈,Windows 中文优先 Microsoft YaHei);同库双部署不受影响。
|
||||
- [ ] `ArtSidebarMenu` 216px + 菜单分组标题;`ArtHeaderBar` 64px;保留权限、响应式抽屉、语言切换、账号菜单行为。菜单分组实现 = 调整 `router/modules` 的 meta(标题/分组/顺序),路径与权限标识不变。
|
||||
- [ ] 全部新增文案(菜单分组名、状态标签、表单字段等)走 vue-i18n zh/en 双语 key,不得硬编码中文或英文。
|
||||
- [ ] 深色模式(Art 模板自带)保持可用不重设计——示例仅浅色;token 改动后在深色下做可用性抽查,偏差登记验收记录。
|
||||
- [ ] 全局卡片/表格/按钮/输入/开关/标签视觉对齐示例(状态色 + 文字)。
|
||||
- [ ] 01 登录页重做(摄影拼贴素材以示例概念图裁片占位入库,验收记录登记"素材为占位")。
|
||||
- [ ] 抽查截图:布局壳 + 登录页 vs `screenshots/01.png`。
|
||||
- 出口:全局壳一致;未动业务数据流。
|
||||
|
||||
### B2 共享业务组件(1–2 天)
|
||||
- [ ] `AlbumCoverCard`:封面 16:9 区域、标题、日期地点、状态行(Public/Uploads on 语义分开)、主操作(进入相册/分享);无封面中性占位;不显示 owner 显示名(契约无投影、避免 N+1,UI-05 §4.3)。
|
||||
- [ ] 列表/表格视图切换(保留游标 `useCursorList` 数据源,不换随机分页)。
|
||||
- [ ] `PhotoGrid`(桌面四列、选择框、状态角标、文件回退名、上传者)+ `PhotoPreview` 大图(签名 URL、隐藏/恢复/软删除入口)。
|
||||
- [ ] `AlbumSummaryHeader`(300×144 封面 + 紧凑资料,编辑/分享固定主操作)。
|
||||
- [ ] 统一状态标签、表单 footer、危险操作确认、错误定位样式。
|
||||
- 出口:组件级截图核对;AlbumPhotos 仍共用一份照片序列,无重复状态存储。
|
||||
|
||||
### B3 页面批次(每批:完成 → lint/test 绿 → **本地提交(不推送)** → 构建部署测试服务器 → 用户 32005 验收 → 通过后进下一批;不通过则修复后重新提交部署)
|
||||
|
||||
> 部署构建用 `git archive HEAD`,只含已提交内容——所以**必须先提交再部署**。B1/B2 为本地截图验收,不部署服务器;部署从 B3 批次开始。
|
||||
- **B3a 核心批**:02 相册列表 + 03 照片网格/表格(含 16 大图)+ **详情页壳(AlbumSummaryHeader 落地 detail/index.vue、页签重组)**——页签宿主先改好,B3b/c 的各页签内容才有稳定挂载点。
|
||||
- **B3b 管理批**:04 成员 + 05 分类 + 06 水印 + 07 分享。
|
||||
- **B3c 表单批**:08 新建 + 09 编辑(整页表单路由,含 15 资产页签收纳)。
|
||||
- **B3d 治理批**:10 账号 + 11 同步(含 20 批次明细)+ 12 用量。
|
||||
- **B3e 收尾批**:13/14 展示位(对齐 UI-04 组件)+ 17/18/19 异常页。
|
||||
- 每批出口:该批页面 1440×1000 截图与示例并排对照入 `docs/designs/ui06-implementation/comparisons/`;窄屏 390 抽查一页;`pnpm --filter @photo/admin lint typecheck test` 绿;admin 相关 e2e 保持绿(UI-04 已于 8c4906c 全绿收尾,无"既有失败"豁免——本方案改动若致 e2e 失败须当批修复或登记偏差,不得沿用旧豁免说法)。
|
||||
|
||||
### B4 回归与验收(半天)
|
||||
- [ ] 全 20 页截图对照齐;`pnpm --filter @photo/admin lint typecheck test` 全绿。
|
||||
- [ ] 部署测试服务器全量复核(§4.3);真实账号登录、相册卡片、照片大图、账号治理冒烟。
|
||||
- [ ] UI06 验收记录(后台部分)完成;偏差逐条列出(已修/接受+原因)。
|
||||
|
||||
## 3. App 线(管理后台验收后启动)
|
||||
|
||||
工程框架沿用 UI-03R(素材清单、固定 390×844 fixture、双轨证据、可量化阈值 ≤4dp、逐页截图流程);**视觉参考从五张设计板切换为 app-preview HTML(20 页实物)**,两者同源,冲突以 HTML 为准。五张设计板降级为辅助参考。
|
||||
|
||||
页面映射沿用 UI-03 验收记录 §2(20 页 → `lib/pages/` 各入口),不重复列出。
|
||||
|
||||
### A0 复核基线
|
||||
- [ ] 固定 390×844 画布补拍当前 App 全部 20 页 before 截图(UI-03 截图仅 10/20 页且分辨率不符,只作历史参考)。
|
||||
- [ ] 逐页对照 app-preview `screenshots/` 与补拍 before,重建「参考/当前/偏差/目标」表(UI-03R §1.2 表更新为 HTML 基准)。
|
||||
- [ ] 确认 Flutter(仓库固定版本)、字体、素材、截图工具可用。
|
||||
- 出口:不沿用 UI-03 全通过结论;新偏差表入库。
|
||||
|
||||
### A1 素材与 fixture
|
||||
- [ ] 按 UI-03R §4/§7 建 `docs/designs/ui03r-assets-manifest.md`。**素材分两轨**:测试/fixture 素材可复用 app-preview `assets/`(低分辨率局部裁片,仅限固定画布验收);**生产素材(登录拼贴、相册封面 ≥720px)必须另行准备合规资源**——app-preview README 明确其素材"不作为生产图片素材",UI-03R §4.1 要求生产拼贴随包合规资源。生产素材未落实时在清单中列为阻塞项,不得以低清裁片顶替上线。
|
||||
- [ ] 固定英文数据、12 张照片、正常/异常状态 fixture 注入真实组件;生产隔离。
|
||||
|
||||
### A2 公共组件
|
||||
- [ ] theme/tokens 显式化。**注意 UI-03R §5.1 色板与 app-preview CSS 存在五处色值差异**(softBlue #EEF5FF↔#EDF4FF、textSecondary #647084↔#69778E、successText #16794B↔#279966、errorText #B42318↔#E74E58、waitingText #996300↔#D89020)——按 §0 优先级**以 HTML 示例实测值为准**,不得以"两处一致"为由跳过核对;无胶囊根导航、两种分段、输入、按钮、Sheet、封面卡按示例重核。
|
||||
|
||||
### A3 三个样板页
|
||||
- [ ] 01 登录、05 相册列表、14 上传中心对照 app-preview 达 UI-03R §8.1 阈值后推广。
|
||||
|
||||
### A4–A6 其余 17 页
|
||||
- 按 UI-03R R04(02/03/04/06/07/08)、R05(09–12)、R06(13/15/16)、R07(17–20)分组推进,每页固定画布截图 + 对照 + 测量。
|
||||
|
||||
### A7 全量验收
|
||||
- 视口矩阵(390 全量;320/430/横屏/平板/大字体/zh-CN/dark 抽查按 UI-03R §10.1)。
|
||||
- `flutter analyze` / `flutter test` 全绿(执行前 `source scripts/flutter-env.sh`)。
|
||||
- UI06 验收记录(App 部分)+ UI-03R 记录衔接说明。
|
||||
|
||||
## 4. 验收方法
|
||||
|
||||
### 4.1 后台逐页对照
|
||||
|
||||
1. 打开示例对应页(HTML 实物)与本页实现,1440×1000 截图并排存 `docs/designs/ui06-implementation/comparisons/`。
|
||||
2. 核对项:布局结构、色彩、字号层级、卡片/控件形态、状态语义、操作入口位置。
|
||||
3. 允许偏差:真实数据与示例样例数据的差异(如实际封面图不同);须记录,不得借「数据不同」掩饰布局偏差。
|
||||
4. 窄屏:每批抽 1 页 390 宽检查(侧栏抽屉、表格横滚,不整页缩略)。
|
||||
|
||||
### 4.2 App 逐页对照
|
||||
|
||||
UI-03R §8 流程不变(参考裁片等比 390、固定画布截图、左右对照、几何测量表),参考来源换为 app-preview 截图;§8.1 阈值(≤4dp、字号 ≤1sp 等)继续有效。
|
||||
|
||||
### 4.3 测试服务器部署(每批后台改动后)
|
||||
|
||||
**后台前端产物在 web 镜像(`docker/web.Dockerfile`,nginx 承载 viewer + /admin/),不在 server 镜像**(server.Dockerfile 不构建 apps/admin)。后台视觉批次的部署流程:
|
||||
|
||||
1. `git archive HEAD | docker build -f docker/web.Dockerfile -t photo-live-web:ui06-<sha>-<日期> -`(`git archive HEAD` 只含已提交内容,**部署前必须已提交该批改动**;VITE_* 构建参数集见 `docs/plans/2026-09-21-测试服务器部署方案.md`)。
|
||||
2. save/gzip → scp → docker load(与既有流程相同)。
|
||||
3. `SERVER_IMAGE=<保持当前 server tag> WEB_IMAGE=photo-live-web:ui06-<sha>-<日期> docker compose -f docker-compose.cn.yml up -d`(WEB_IMAGE 须带完整 `photo-live-web:` 仓库名——compose 默认值 `photo-live-web:latest` 同格式)→ **restart web 容器**(否则 nginx 缓存旧上游 IP 502)。
|
||||
4. 验证入口 `http://219.157.255.213:32005/admin/`;仅当本批同时改了 API/服务端才重建 server 镜像。
|
||||
5. 回滚 = 用上一批 WEB_IMAGE tag 重复步骤 3(镜像均在服务器本地保留)。
|
||||
|
||||
App 线无服务器部署,走本地固定画布 + 模拟器双轨证据。
|
||||
|
||||
## 5. 红线与保护项(两端通用,违反即回退)
|
||||
|
||||
- 游标分页 `useCursorList` 语义保留;后台用户页 page/pageSize 新分页不回退。
|
||||
- 批量操作逐项成功/失败结果保留,不得全成功动画掩盖。
|
||||
- 账号自保护(自身角色/锁定不可改)、来源状态只读。
|
||||
- 水印/同步等异步任务「受理≠完成」语义保留。
|
||||
- 展示位 settings 整体替换时保留全部字段;v1/v2 区分,v2 固定 195×280。
|
||||
- `translations` 全量替换时合并保留其他语言。
|
||||
- App 上传引擎、权限契约、凭证续签零语义改动(`lib/features` 不动,样式工程如触及控制逻辑须补测试并登记)。
|
||||
- 同步账本(outbox/sync_inbox/sync_state)任何情况不清理不重置。
|
||||
- viewer/embed(UI-02/UI-04 线)不在本方案范围。
|
||||
|
||||
## 6. 交付物
|
||||
|
||||
```text
|
||||
docs/plans/2026-09-22-UI06-全端视觉统一实施方案.md (本文)
|
||||
docs/plans/progress/UI06-验收记录.md
|
||||
docs/designs/ui06-implementation/
|
||||
before/ 后台改动前截图
|
||||
comparisons/ 每页示例 vs 实现并排对照
|
||||
README.md 索引与复现命令
|
||||
docs/designs/ui03r-assets-manifest.md (App 线,沿用 UI-03R 要求)
|
||||
```
|
||||
|
||||
完成门槛:
|
||||
|
||||
- 后台 20 页对照证据齐 + 测试服务器部署复核通过;App 20 页固定画布截图与结论齐(双轨)。
|
||||
- 无本方案列明的默认样式残留(紫胶囊、黑框分段、灰占位主视觉、ID 裸露等)。
|
||||
- 全部测试与类型检查绿;保护项回归通过。
|
||||
- 素材/真机等外部关口未完成时如实标注「部分完成」,不得宣称 100%。
|
||||
|
||||
## 7. 给 Claude 的执行指令
|
||||
|
||||
> 请执行 docs/plans/2026-09-22-UI06-全端视觉统一实施方案.md。视觉唯一基准是 docs/designs/admin-preview-2026-09-22 与 app-preview-2026-09-22 两个 HTML 示例,冲突一律以示例为准。先做 §1.1 基线提交与 B0(截图脚本 + before 截图 + 契约核对),再按 B1→B2→B3a–B3e 顺序推进管理后台(B1/B2 本地验收;B3 每批:lint/test 绿 → 本地提交不推送 → 按 §4.3 构建部署 web 镜像(restart web 容器)→ 用户在 32005 验收 → 通过后进下一批)。后台 B4 验收后启动 App 线 A0–A7(继承 UI-03R 工程标准,参考换 HTML)。每页必须截图对照,不得以测试通过代替视觉验收;保护项(§5)零损失;不覆盖用户未提交改动,不自动部署生产。
|
||||
@@ -0,0 +1,123 @@
|
||||
# 用户列表分页与同步信息展示 实施计划
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 管理后台用户列表换成标准页码分页(页码/每页条数/总数),并把同步源带来的工号/邮箱/公司/头像等档案信息落库展示。
|
||||
|
||||
**Architecture:** 同步快照存 `external_user_mappings.profile`(新增 nullable JSON 列——守「users 表不加源身份列」红线,源数据隔离在映射表);端口 `ExternalUserRecord` 增可选 `sourceProfile`,引擎建/更映射时随版本写入。`listAdminUsers` 管理列表模式新增 `page/pageSize` 偏移分页并返回 `total`(游标模式原样保留,契约只增不改);`AdminUser` 增可选 `synced` 对象。前端用户列表换 `ElPagination` 页码分页 + 新列(工号/邮箱/公司,头像并入姓名列)。
|
||||
|
||||
**Tech Stack:** Prisma 手写迁移(utf8mb4_090_bin 约定)、openapi.yaml + `pnpm gen`、NestJS、Vue3 + Element Plus、i18n(apps/admin/src/locales/langs/{zh,en}.json)。
|
||||
|
||||
**红线遵循:** users 表零改动;同步决策绝不依赖 profile(纯展示快照,坏 profile 不影响行应用);契约字段全部 optional/nullable(旧客户端零 break);ov 栈不涉及(用户域 cn 单域)。
|
||||
|
||||
## 文件结构
|
||||
|
||||
| 文件 | 动作 |
|
||||
|---|---|
|
||||
| `packages/db-cn/prisma/schema.prisma` + 新迁移目录 | external_user_mappings += `profile Json?` |
|
||||
| `services/api/src/user-sync/user-source.port.ts` | `ExternalUserProfile` + `sourceProfile?` |
|
||||
| `services/api/src/user-sync/http-user-source.ts` | 填充 sourceProfile |
|
||||
| `services/api/src/user-sync/mock-user-source.ts` | MockExternalRecord += sourceProfile?(透传) |
|
||||
| `services/api/src/user-sync/user-sync.service.ts` | 映射 create/update 写 profile |
|
||||
| `packages/contracts/openapi.yaml` + gen | AdminUser.synced、AdminUserList.total、page/pageSize |
|
||||
| `services/api/src/admin/admin-users.service.ts` | page 模式(COUNT+OFFSET)+ synced 合并 helper;治理回显带 synced |
|
||||
| `services/api/src/admin/users-lookup.controller.ts` | page/pageSize 解析透传 |
|
||||
| `services/api/test/user-sync.e2e-spec.ts` | profile 落库/随版本刷新断言 |
|
||||
| `services/api/test/admin-users.e2e-spec.ts`(或 users-lookup) | page 分页 + synced 展示断言 |
|
||||
| `apps/admin/src/types/api/adminUser.d.ts`、`api/adminUsers.ts` | 类型与参数 |
|
||||
| `apps/admin/src/views/system/users/index.vue` | ElPagination + 新列 |
|
||||
| `apps/admin/src/locales/langs/{zh,en}.json` | 新文案 |
|
||||
|
||||
---
|
||||
|
||||
### Task 1: DB 迁移 + 端口/引擎/适配器写入 profile
|
||||
|
||||
- [ ] schema.prisma `external_user_mappings` 加 `profile Json?`(注释:同步源档案快照,纯展示,不参与同步决策)
|
||||
- [ ] 新迁移 `packages/db-cn/prisma/migrations/20260922<HHMMSS>_mapping_profile/migration.sql`(手写,格式对齐 20260920114149 先例):
|
||||
|
||||
```sql
|
||||
-- G4 后续:映射表增 profile JSON 列——同步源档案快照(工号/邮箱/公司/头像),
|
||||
-- 纯展示维度:不参与同步决策(引擎幂等仍只看 sourceVersion),users 表零改动
|
||||
--(源身份隔离红线)。nullable:mock 源/历史行无快照。
|
||||
ALTER TABLE `external_user_mappings` ADD COLUMN `profile` JSON NULL;
|
||||
```
|
||||
|
||||
- [ ] user-source.port.ts:
|
||||
|
||||
```ts
|
||||
/** 同步源档案快照(纯展示,不参与同步决策;http 源填充,mock 可不填)。 */
|
||||
export interface ExternalUserProfile {
|
||||
/** 工号。 */
|
||||
sn?: string;
|
||||
/** 企业邮箱。 */
|
||||
email?: string;
|
||||
/** 公司全称。 */
|
||||
companyName?: string;
|
||||
/** 公司简称。 */
|
||||
companyAbbr?: string;
|
||||
/** 头像 URL。 */
|
||||
avatar?: string;
|
||||
}
|
||||
```
|
||||
|
||||
`ExternalUserRecord` 加 `sourceProfile?: ExternalUserProfile;`(注释:引擎原样落 mapping.profile,绝不据此做同步决策)。
|
||||
|
||||
- [ ] http-user-source.ts records 映射加:
|
||||
|
||||
```ts
|
||||
sourceProfile: {
|
||||
sn: raw.sn || undefined,
|
||||
email: raw.email || undefined,
|
||||
companyName: raw.company_name || undefined,
|
||||
companyAbbr: raw.company_abbr || undefined,
|
||||
avatar: raw.avatar || undefined,
|
||||
},
|
||||
```
|
||||
|
||||
- [ ] mock-user-source.ts:`MockExternalRecord` 加 `sourceProfile?: ExternalUserProfile`;items 映射透传 `sourceProfile: user.sourceProfile`。
|
||||
- [ ] user-sync.service.ts **四处**映射写入(新建关联 / 既有更新 / 重建改指 / 全新用户建映射)统一加 `profile: item.sourceProfile ?? undefined`(undefined=Prisma 不改列)。
|
||||
- [ ] **幂等跳过路径的 profile 回填**(存量 230 用户已处于当前版本,版本门直接 return——不补写则 profile 永远 NULL):`validated.version <= mapping.sourceVersion` 分支内,若 `item.sourceProfile` 非空且与 `mapping.profile` 深比较不同 → 仅 `external_user_mappings.update({ profile })`(**不动 sourceVersion/users 行/会话/counts,bucket 仍 null**——展示维度补偿写,不违反「同步决策不依赖 profile」红线);文件头登记。
|
||||
- [ ] 验证:`pnpm --filter @photo/api-cn typecheck`;本地库应用迁移(prisma migrate dev 或 db push 对齐项目流程后跑 user-sync e2e)。
|
||||
- [ ] Commit: `feat(api,db-cn): persist synced source profile snapshot on mappings`
|
||||
|
||||
### Task 2: 契约扩展 + 服务端 page 分页与 synced 合并
|
||||
|
||||
- [ ] openapi.yaml:
|
||||
- `AdminUser.properties` 加 `synced`(`type: [object, 'null']`,readOnly,字段 sn/email/companyName/companyAbbr/avatar 均 string;描述:同步源档案快照,非同步用户为 null)。
|
||||
- `AdminUserList` allOf 内对象加 `total`(`type: [integer, 'null']`,描述:仅 page 模式返回的总数;游标模式为 null)。
|
||||
- `listAdminUsers` parameters 加 `page`(integer ≥1)与 `pageSize`(integer 1..100)均 optional;描述注明:提供 cursor 走游标模式(忽略 page);提供 page(无 cursor)走偏移分页并返回 total(此时 nextCursor=null 且 hasMore=false——守 CursorPageMeta「hasMore⟺nextCursor≠null」不变式,翻页由 total 驱动)。
|
||||
- `pnpm --filter @photo/contracts gen` 重新生成类型(根上无 gen 脚本)。
|
||||
- [ ] users-lookup.controller.ts:`parsePage`(**未提供 → undefined**,提供则 ≥1)/`parsePageSize`(未提供 → undefined,提供则 1..100);page 模式内的缺省值(1/20)在服务层 page 模式选定后才应用——保证「未带 page 的旧客户端仍走游标模式」。
|
||||
- [ ] admin-users.service.ts:
|
||||
- `list(user, query, status, cursor, limit, page?: number, pageSize?: number)`:`page !== undefined && cursor === undefined` → page 模式:同一 WHERE(去游标条件)`COUNT(*)` + `LIMIT pageSize OFFSET (page-1)*pageSize`,`nextCursor=null`、`hasMore=false`、`total`;否则原游标逻辑(total=null)。
|
||||
- 导出 `attachSyncedProfiles(items: AdminUserItem[]): Promise<AdminUserItem[]>`:按 id 批查 `external_user_mappings`(`userId IN`),每用户取 `sourceVersion` 最大行,`profile` → `synced`(无映射/profile → `synced: null`);list 两种模式与治理回显(update/activate/deactivate)统一套用;前缀 lookup 模式不套(邀请候选无需档案,文件头注明)。
|
||||
- [ ] e2e:admin-users/users-lookup spec 增用例——直种 2 用户 + 1 映射带 profile → `?page=1&pageSize=1` 返回 total=2、单条且 `synced` 字段正确;`?page=2` 返回第二条、`hasMore=false`;游标模式(不带 page)`total` 为 null;无映射用户 `synced` null;前缀模式(accountPrefix)响应干净不含 synced/total。user-sync e2e:U2 场景行加 `sourceProfile` → ① 断言 mapping.profile 落库;② 改名场景换 companyAbbr → 断言 profile 随版本刷新;③ **同版本重跑(版本门跳过)+ profile 此前为空 → profile 被回填且 counts 全 0**(存量用户回填路径)。
|
||||
- [ ] 验证:typecheck + `test -- http-user-source` + `test:e2e -- user-sync admin-users users-lookup`。
|
||||
- [ ] Commit: `feat(contracts,api): page-mode pagination + synced profile on admin users list`
|
||||
|
||||
### Task 3: 管理后台前端(分页器 + 新列)
|
||||
|
||||
- [ ] types/api/adminUser.d.ts:`Item` 加 `synced?: {...} | null`;`ListResponse` 加 `total?: number | null`;`ListParams` 加 `page?/pageSize?`。
|
||||
- [ ] api/adminUsers.ts:params 直传(类型已覆盖)。
|
||||
- [ ] views/system/users/index.vue:
|
||||
- 去 `useCursorList`/loadMore,改 `items/total/page/pageSize/loading/error` + `loadPage()`;`search()/resetFilters()` 重置 page=1;分页器 `ElPagination`(layout `total, sizes, prev, pager, next`,sizes [20,50,100])。
|
||||
- 列调整:姓名列并入头像(ElAvatar src=synced?.avatar,无则首字符);新增 工号(synced.sn)、邮箱(synced.email)、公司(companyAbbr || companyName)三列;「—」占位非同步用户。
|
||||
- 行内治理操作(编辑/重置/激活/停用/解锁)原样保留,回显 replaceItem 兼容。
|
||||
- [ ] locales zh/en:`usersManage.list.colSn/colEmail/colCompany`、分页相关沿用 Element 内建文案。
|
||||
- [ ] 验证:admin 前端 typecheck/build(`pnpm --filter admin build` 或项目等价脚本)。
|
||||
- [ ] Commit: `feat(admin): standard pagination + synced profile columns on users list`
|
||||
|
||||
### Task 4: 部署测试服务器(server + cn web 双镜像 + 迁移)
|
||||
|
||||
- [ ] server 镜像 `git archive HEAD | docker build -f docker/server.Dockerfile`,tag `<sha>-20260922b`;web 镜像同法 `docker/web.Dockerfile`,tag `admin-<sha>-20260922b`(ov 栈 web 保持 viewer-fix 不动——本任务无 viewer 改动,避免吞掉未提交 viewer 工作)。
|
||||
- [ ] save/gzip → scp → load。
|
||||
- [ ] 服务器**先迁移**:`docker run --rm --network 1panel-network --env-file .env.production-cn photo-live-server:<tag> migrate-deploy all`。
|
||||
- [ ] cn 栈 `SERVER_IMAGE=<新> WEB_IMAGE=photo-live-web:admin-<sha>-20260922b up -d`;ov 栈仅换 SERVER_IMAGE(WEB_IMAGE=viewer-fix)。
|
||||
- [ ] 验证:`http://219.157.255.213:32005/admin/` 用户列表分页可翻页、工号/邮箱/公司/头像显示(230 真实用户);`/v1/admin/users?page=1&pageSize=2` 带 total;user-sync status 正常(下一 cron 批不因 profile 列失败)。
|
||||
- [ ] 补验收记录(G4 记录追加或新条目),Commit:`docs: ...`
|
||||
|
||||
## 明确不做(YAGNI)
|
||||
|
||||
- 相册等其他列表的分页交互改造(同为游标"加载更多"模式)——用户列表先行,需要再说。
|
||||
- synced 信息进用户编辑弹窗(列表展示已覆盖诉求)。
|
||||
- ov 栈/观众页任何改动。
|
||||
Reference in New Issue
Block a user