feat(auth): 用户账户 - 完善个人资料与登录日志 (#752)
Co-authored-by: wuligao <1247662379@qq.com>
This commit is contained in:
@@ -5,6 +5,14 @@ description: 影策后端核心持久化表与状态边界
|
||||
|
||||
# 后端数据库
|
||||
|
||||
## 用户登录日志
|
||||
|
||||
Schema 53 新增 `login_logs`,新库初始化、既有库升级和 SQLite → PostgreSQL 迁移共用此表。字段:`id`、可空 `user_id`、用户快照 `username/display_name/account`、`event`(login/logout)、`method`(password/email/sms/linuxdo/verification/unknown)、`source`(login/registration/logout)、`result`(success/failed)、`ip`、`user_agent`、`session_ref`、`reason/message`、`created_at`。用户、事件、方式、结果、IP、关联会话和时间有查询索引。
|
||||
|
||||
日志时间统一保存为 UTC,筛选按实际时刻匹配,页面按当前设备时区显示。登录成功日志与会话签发、退出成功日志与有效会话撤销各自在同一事务提交;日志写入失败会回滚会话操作并向调用方报错。退出需匹配 Token 哈希和有效期,既有会话有效期在 Go 中按真实时刻判断,避免 SQLite 不同时区字符串误判;无会话、过期、伪造和重复退出不产生成功事件。会话引用是 ID 的单向哈希,不能用于认证。用户删除/改名、会话到期清理不会改写日志快照。
|
||||
|
||||
失败登录保留逐条事件,识别不了用户时 `user_id=null`;邮件/手机号尝试账号脱敏,内部错误只记固定分类。密码、验证码、OAuth state/code、Cookie、Token 不进入日志。请求校验/频控拒绝也尝试记录失败,记录失败会输出明确的服务端诊断;原请求仍维持失败状态。不把刷新、重新核验个人身份或自然过期当作登录/主动退出,不补造历史,不自动删除日志。
|
||||
|
||||
## 分片上传预留
|
||||
|
||||
Schema 45 新增 `upload_reservations`:`id`、`user_id`、`size`、`day`、`expires_at`。创建会话时在数据库事务内检查并行会话数、现有资源容量、未到期预留和每日上传用量,更新既有 `user_daily_upload_usages` 后插入预留。SQLite 先取得写锁,PostgreSQL 使用账号级事务 advisory lock。
|
||||
@@ -31,7 +39,13 @@ Schema 45 新增 `upload_reservations`:`id`、`user_id`、`size`、`day`、`ex
|
||||
|
||||
## 结构迁移与版本
|
||||
|
||||
当前结构版本为 50。版本 50 新增 `canvas_mutation_receipts`,按 `(user_id, canvas_id, mutation_id)` 唯一记录画布 operations 请求摘要、确定性结果和提交 revision,供响应丢失后的幂等重放使用;receipt 与画布内容、revision 在同一事务提交。版本 49 `banner_sort_order` 为 `banner_announcements` 增加可配置的 `sort_order` 展示顺序;版本 48 `channel_proxy_url` 为 `model_channels` 增加渠道级出站代理地址 `proxy_url`,支持 `socks5://`、`http://`、`https://`;留空时沿用全局代理。代理地址只返回管理员视图,普通用户目录不暴露渠道代理或其中的认证信息。版本 42 `cloud_agent_pi_sessions` 新增 `cloud_agent_pi_sessions` 表,按运行 ID 保存 Pi 原生 JSONL 会话快照、用户 ID、乐观并发 revision 和更新时间;会话正文由 Agent runtime 管理,Go 只将其作为不透明快照读写,不替代有界控制检查点、事件日志或任务记录。版本 41 `resource_thumbnail` 为 `resources` 增加缩略图元数据。版本 40 `builtin_skill_tombstones` 新增内置技能删除记录,管理员删除平台技能后,后续启动同步不会重新创建该技能;版本 39 `skill_library_categories` 新增 `skill_library_categories` 表,并为 `user_skill_states` 增加 `library_category_id`,保存个人技能库分类及每个用户对技能的归类;分类不改变 `skills.tag` 的技能广场共享分类。版本 38 `prefixed_id_sequence_reconcile` 创建(若缺失)并校准 `id_sequences`:`CHANNEL`、`MODEL`、`PTIER`、`ATTEMPT`、`LMODEL`、`REVISION`、`ROUTE` 按对应业务表的最大有效 ID 前移,包含软删除记录,不回退已有序列、不重写业务 ID。分配新 ID 时再次校准并检查冲突;SQLite → PostgreSQL 迁移完成后也校准序列。 `cloud_agent_gemini_cache` 创建 `cloud_agent_gemini_caches`,保存用户范围内的官方 Gemini 缓存元数据;版本 37 `cloud_agent_gemini_cache_identity` 将缓存标识约束修正为 `(user_id, cache_key)`,移除旧的全局 cache_key 唯一索引。版本 35 `auth_notifications` 为认证通知与组合验证补齐 `auth_verifications`、`notification_quotas`、`sms_channels`、`sms_records` 四张表,并为 `users` 增加 `phone`、`email_verified_at`、`phone_verified_at`,为 `email_verification_codes` 增加 `attempts`;同时创建非空手机号唯一索引。版本 34 `task_media_recovery` 为 `tasks` 增加 `media_recovery_json`(text)和 `media_stage`(最长 24 字)。版本 33 `oauth_state_accepted_terms` 为 `o_auth_states` 增加非空布尔列 `accepted_terms`,默认 `false`,不替历史流程补造同意记录。
|
||||
版本 52 `user_avatar_presets` 为 `users` 新增 `avatar_preset`,保存系统头像的稳定标识:`person`、`director`、`camera`、`cat`、`rabbit`、`robot`、`rocket`、`sparkles`。系统头像由前端共享组件渲染;选择时原子更新 default 模式、预设标识并清除上传图片。上传个人头像保留上次系统头像偏好,后续可以再次选择;未知标识被拒绝,不保存客户端提供的任意图片地址。
|
||||
|
||||
版本 51 `personal_profile_security` 增加个人信息与身份重新核验结构:`users.avatar_mode`(空字符串沿用第三方头像、`custom` 为个人上传、`default` 为系统头像)、`users.avatar_version`(仅用于头像地址,不作为用户 JSON 字段返回);新增 `user_avatars`(主键 `user_id`、标准化 PNG `data`、`updated_at`)。头像图片与用户选择在同一事务保存或清除,独立于创作素材资源;数据库备份同时包含头像。上传最大 5 MiB、1600 万像素,服务端居中裁剪并缩小到不超过 512×512。
|
||||
|
||||
`auth_sessions.reauthenticated_at` 记录当前会话的 Linux.do 重新核验时间,有效 5 分钟;`o_auth_states.reauth_user_id/reauth_session_id` 绑定发起重新核验的账号及会话。重新核验只允许原绑定的第三方身份,不创建账号或新登录会话。`auth_verifications.session_id/credential_hash` 将 `profile_email` 用途的验证码绑定到当前用户、当前会话和密码状态。密码、邮箱修改及旧会话撤销在同一事务提交;登录会话签发同时检查账号凭据,阻止并发旧密码登录在撤销之后再创建会话。升级执行 `migrate-schema up` / `verify`,禁止手工修改既有迁移记录。
|
||||
|
||||
当前结构版本为 53;版本 53 新增独立登录日志表 `login_logs`,详见本页“用户登录日志”。版本 50 新增 `canvas_mutation_receipts`,按 `(user_id, canvas_id, mutation_id)` 唯一记录画布 operations 请求摘要、确定性结果和提交 revision,供响应丢失后的幂等重放使用;receipt 与画布内容、revision 在同一事务提交。版本 49 `banner_sort_order` 为 `banner_announcements` 增加可配置的 `sort_order` 展示顺序;版本 48 `channel_proxy_url` 为 `model_channels` 增加渠道级出站代理地址 `proxy_url`,支持 `socks5://`、`http://`、`https://`;留空时沿用全局代理。代理地址只返回管理员视图,普通用户目录不暴露渠道代理或其中的认证信息。版本 42 `cloud_agent_pi_sessions` 新增 `cloud_agent_pi_sessions` 表,按运行 ID 保存 Pi 原生 JSONL 会话快照、用户 ID、乐观并发 revision 和更新时间;会话正文由 Agent runtime 管理,Go 只将其作为不透明快照读写,不替代有界控制检查点、事件日志或任务记录。版本 41 `resource_thumbnail` 为 `resources` 增加缩略图元数据。版本 40 `builtin_skill_tombstones` 新增内置技能删除记录,管理员删除平台技能后,后续启动同步不会重新创建该技能;版本 39 `skill_library_categories` 新增 `skill_library_categories` 表,并为 `user_skill_states` 增加 `library_category_id`,保存个人技能库分类及每个用户对技能的归类;分类不改变 `skills.tag` 的技能广场共享分类。版本 38 `prefixed_id_sequence_reconcile` 创建(若缺失)并校准 `id_sequences`:`CHANNEL`、`MODEL`、`PTIER`、`ATTEMPT`、`LMODEL`、`REVISION`、`ROUTE` 按对应业务表的最大有效 ID 前移,包含软删除记录,不回退已有序列、不重写业务 ID。分配新 ID 时再次校准并检查冲突;SQLite → PostgreSQL 迁移完成后也校准序列。 `cloud_agent_gemini_cache` 创建 `cloud_agent_gemini_caches`,保存用户范围内的官方 Gemini 缓存元数据;版本 37 `cloud_agent_gemini_cache_identity` 将缓存标识约束修正为 `(user_id, cache_key)`,移除旧的全局 cache_key 唯一索引。版本 35 `auth_notifications` 为认证通知与组合验证补齐 `auth_verifications`、`notification_quotas`、`sms_channels`、`sms_records` 四张表,并为 `users` 增加 `phone`、`email_verified_at`、`phone_verified_at`,为 `email_verification_codes` 增加 `attempts`;同时创建非空手机号唯一索引。版本 34 `task_media_recovery` 为 `tasks` 增加 `media_recovery_json`(text)和 `media_stage`(最长 24 字)。版本 33 `oauth_state_accepted_terms` 为 `o_auth_states` 增加非空布尔列 `accepted_terms`,默认 `false`,不替历史流程补造同意记录。
|
||||
|
||||
升级前备份,按既有流程执行 `migrate-schema up` 和 `verify` 后再启动新后端。旧版本二进制不支持版本 42,回退需恢复匹配的数据库备份,并评估备份之后的新写入;不能只切回旧镜像。关闭自动迁移的生产环境必须运行正式迁移;手工改表不能更新 `schema_migrations` 的版本与校验和记录。
|
||||
|
||||
|
||||
@@ -5,6 +5,14 @@ description: 从产品功能快速定位主要代码入口
|
||||
|
||||
# 代码功能地图
|
||||
|
||||
## 用户登录日志
|
||||
|
||||
- 持久化:`backend/internal/model/models_login_log.go`、`repository/login_logs.go`;会话与日志原子提交在 `repository/account.go`,schema v53 在 `database/migrations.go`。
|
||||
- 认证采集:`backend/internal/auth/login_logs.go`、`auth.go`、`verification.go`、`linuxdo.go`;HTTP 上下文和提前拒绝采集在 `handler/admin_login_log_routes.go`。
|
||||
- 管理员查询:`app/admin_login_logs.go` → `service/aliases_login_logs.go` → `handler/admin_login_log_routes.go`。
|
||||
- 前端:`web/src/services/api/login-logs.ts`、`pages/admin/login-logs/`;菜单和懒加载接入 `admin-shell.tsx`、`router.tsx`。
|
||||
- 回归:auth/handler/database 的 `login_logs*_test.go`,前端 `web/test/login-log-device.test.ts`。
|
||||
|
||||
## 可美 KM Seedream
|
||||
|
||||
- 声明式请求、响应与参数合同:`plugin-packages/km-kemei-seedream/manifest.json`、`docs/interface.md`;分发包:`plugin-packages/km-kemei-seedream.yingce-plugin`。
|
||||
@@ -29,6 +37,10 @@ description: 从产品功能快速定位主要代码入口
|
||||
|
||||
## 前端页面
|
||||
|
||||
头像裁剪复用 `components/image-crop-dialog.tsx`,原画布裁剪入口保留同一组件合同;`services/profile-avatar.ts` 校验 1:1 区域、导出有界 PNG,`lib/default-user-avatars.ts` 定义系统头像目录,`UserAvatar` 统一渲染系统预设或个人图片。schema v52 增加系统头像选择。
|
||||
|
||||
个人信息:`web/src/pages/settings/profile-pane.tsx` 协调头像、密码、邮箱和第三方重新核验,`profile-validation.ts` 提供密码、图片与过期校验,`services/api/profile.ts` 使用统一 `http` 调用。共享头像在 `components/layout/user-avatar.tsx`。后端 `handler/auth_profile.go` 接收鉴权和受限请求,`app/auth_profile.go` / `profile_avatar.go` 组合 auth 域,`auth/account.go` / `avatar.go` / `linuxdo.go` 校验身份与头像内容,`repository/account.go` / `user_avatar.go` 处理会话撤销、邮箱唯一性、验证码消费和头像的事务保存,schema v51 安装个人信息及重新核验字段。
|
||||
|
||||
云端 Agent:`web/src/components/canvas/canvas-cloud-agent-panel.tsx` 协调对话、Skills 和审批,`canvas-cloud-agent-settings.tsx` 编辑长期偏好与个人记忆,`services/api/agent.ts` 适配运行快照与事件流;画布手工编辑与引用同步共用 `web/src/lib/canvas/canvas-node-prompt.ts`,已有媒体结果只更新 `composerContent` 草稿,不覆盖生成结果和已提交提示词。后端 `handler/agent.go` 负责 HTTP 合同,`app/cloud_agent.go` 负责权限、幂等、可信历史,`app/cloud_agent_profile.go` / `repository/agent_profile.go` 管理用户、项目、画布偏好及 revision CAS,`app/cloud_agent_lessons.go` / `app/cloud_agent_memory_compact.go` / `repository/agent_lesson.go` / `handler/agent_lesson.go` 管理用户私有记忆的写入脱敏、召回注入、用户自审批与压缩优化,`web/src/pages/settings/agent-memory-pane.tsx` 是用户批准/添加/导入导出/压缩入口,`web/src/pages/admin/components/agent-lessons-panel.tsx` 是管理员按用户查看入口,`internal/prompts/agent-*-policy.md` 是随发布物编译、并在文档头声明 ID/版本的行为资源,`app/cloud_agent_policy.go` 编译本轮策略快照,`internal/canvas/capability/` 注册服务端节点能力和字段映射,`app/cloud_agent_canvas_state.go` 投影画布摘要和精读,`app/cloud_agent_runtime.go` / `app/cloud_agent_pi_coordinator.go` 负责可恢复编排,原生 Pi runtime 协议适配位于 `internal/agent/runtime/` 与 `agent-runtime/pi/agent-runtime.mjs`;`cloud_agent_pi_sessions` 独立保存原生 JSONL 会话,控制检查点仍由 Go 管理。工具根据能力定义生成 schema,并从固定技能快照渐进读取 `SKILL.md` / reference;`app/cloud_agent_media.go` 负责收费媒体任务适配,`app/task_creation.go` 执行预算 admission,运行沿用任务 Worker。节点新增需要能力描述符和真实画布实现;新生成模式还需任务适配器,不由偏好或技能 md 授权。协议见 HTTP API 专题,未确认的真实登录态与上游联调见待测试清单。
|
||||
|
||||
| 功能 | 页面入口 | 主要协作模块 |
|
||||
|
||||
@@ -5,6 +5,37 @@ description: 信封、错误码与 OpenAPI
|
||||
|
||||
# HTTP API 合同
|
||||
|
||||
## 用户登录日志
|
||||
|
||||
菜单“用户与运营 → 用户登录日志”,页面 `/admin/login-logs`。查询在 service 校验管理员权限:匿名 401、普通用户 403。
|
||||
|
||||
- `GET /api/admin/login-logs`:支持 `keyword`(用户名、昵称、脱敏账号或用户 ID)、`event=login|logout`、`method=password|email|sms|linuxdo|verification|unknown`、`result=success|failed`、精确 `ip`、RFC3339 `from/to`(含边界)、`page/pageSize`。开始时间不能晚于结束时间。默认每页 20 条、时间倒序;成功 `data={logs,total,page,pageSize}`,空结果 `logs=[]`。
|
||||
- `GET /api/admin/login-logs/:id`:成功 `data={log}`;不存在返回 404。包含用户快照、时间、事件、来源、方式、IP、UA、安全原因码/文案和非凭据的关联会话标识。
|
||||
|
||||
后端在密码、邮箱/短信验证码、Linux.do 登录、注册后自动登录及主动退出的真实认证路径记录,不提供客户端任意新增日志接口。`verification` 表示凭据/请求无效导致方式无法识别;`unknown` 表示上线前会话未保存方式。`source=registration` 标记注册自动登录。退出失败不清 Cookie,不再忽略撤销错误。刷新状态和会话自然过期不新增事件。浏览器/系统由页面根据 UA 展示,无法识别时明确标注;UA 是客户端自报信息。
|
||||
|
||||
## 个人信息
|
||||
|
||||
所有 `/auth/profile` 路径均要求当前活动用户的登录 Cookie,不能通过用户 ID 修改他人资料。
|
||||
|
||||
| 路径 | 入参与结果 |
|
||||
| --- | --- |
|
||||
| `GET /auth/profile` | 返回 `user`、`hasPassword`、`emailEnabled`、`linuxdoEnabled` 和可选 `reauthenticatedUntil`;密码散列、头像图片正文、内部缓存版本均不在用户 JSON 中 |
|
||||
| `PUT /auth/profile/avatar` | multipart `file`,只接受真实 PNG/JPEG、最大 5 MiB;返回 `{ user }`,包含带版本的头像地址 |
|
||||
| `DELETE /auth/profile/avatar` | 清除个人头像并明确选择系统默认头像;第三方重新登录不会覆盖该选择;返回 `{ user }` |
|
||||
| `POST /auth/profile/avatar/default` | `{ preset }`,只接受 `person/director/camera/cat/rabbit/robot/rocket/sparkles`;保存选择并清除个人图片,返回 `{ user }` |
|
||||
| `GET /auth/profile/avatar/:userId` | 只读取本账号的 PNG,`Cache-Control: private, no-store`;账号之间拒绝读取 |
|
||||
| `POST /auth/profile/password` | `{ currentPassword, newPassword }`;新密码至少 8 个 Unicode 字符、UTF-8 不超过 72 字节;返回 `{ changed: true }` 并清除 Cookie、撤销全部会话 |
|
||||
| `POST /auth/profile/email-code` | `{ email, currentPassword }`;向未占用的新邮箱发送验证码,返回 `{ ticket, expiresIn, retryAfter }` |
|
||||
| `POST /auth/profile/email` | `{ ticket, emailCode, currentPassword }`;验证后更新邮箱及验证时间、撤销全部会话并清除 Cookie;返回 `{ changed: true, notificationStatus }` |
|
||||
| `GET /auth/profile/linuxdo/start` | 纯第三方账号重新核验身份的入口;绑定原用户和原会话,成功回到 `/settings?section=profile&reauth=success`,失败回到该页的 `reauth=error` 状态 |
|
||||
|
||||
已有本地密码的账号必须验证当前密码。纯 Linux.do 账号设置密码或更换邮箱时,必须先完成同一会话内的重新授权,核验必须匹配原第三方用户标识;有效期为 5 分钟。邮箱验证码用途固定为 `profile_email`,绑定当前会话与凭据状态,6 位数字、10 分钟有效、最多 5 次核验;收件地址跨场景共享 60 秒发送冷却、每小时 5 次和每天 20 次额度。发送失败明确报错;邮件服务未启用时禁止更换邮箱。
|
||||
|
||||
新邮箱验证之前保留原绑定。更新及验证码消费、登录会话撤销一起提交,唯一性检查在事务内重复执行。更新后向原邮箱发通知,`notificationStatus` 为 `sent`、`failed` 或 `not_needed`;`failed` 表示邮箱已更新、原邮箱通知失败,不能把已成功更新显示成未保存。接口使用现有业务错误信封和限流规则,密码、验证码和 ticket 不进入 URL。
|
||||
|
||||
上传头像先通过共享裁剪弹窗选择 1:1 区域,支持拖动、缩放裁剪框、键盘调整与重置;确认后导出最大 512×512 的 PNG 到待保存预览,点击“保存头像”才上传。取消裁剪保留原头像;待保存图片可重新调整裁剪。选择系统头像使用现有 AppModal、Avatar 与主题 token,支持 8 个预设,确认后才写入服务端。
|
||||
|
||||
## Agent 画布权限与大事件
|
||||
|
||||
自由画布和项目关联画布均使用 `canvas_projects`。Agent 运行时按登录账号和画布 ID 查询归属,不能把所属项目 ID 当作画布 ID;画布不存在、属于其他账号或数据库读取失败时,不声明读写及导出权限。
|
||||
|
||||
@@ -5,6 +5,16 @@ description: 当前项目已实现的核心工作台能力与使用入口
|
||||
|
||||
# 功能清单
|
||||
|
||||
## 用户登录日志
|
||||
|
||||
管理员在“用户与运营 → 用户登录日志”查看密码、邮箱/短信验证码、Linux.do 的成功/失败登录、注册自动登录和主动退出。支持用户、事件、方式、结果、IP、时间范围筛选、分页、刷新、详情和失败重试;显示账号快照、设备信息和安全原因。成功记录与会话操作原子提交,重复/伪造/过期退出不产生成功事件;刷新和自然过期不计为登录/主动退出。普通用户不可访问,不记录密码或会话凭据,不补造历史。
|
||||
|
||||
## 个人信息
|
||||
|
||||
“更换头像”弹窗集中提供上传图片和系统头像两种方式。头像上传支持固定 1:1 裁剪:拖动裁剪框、调整大小、键盘移动和重置,确认裁剪后返回弹窗预览,在弹窗内保存。系统头像提供默认人像、导演、摄影师、小猫、小兔、机器人、探索者和灵感 8 款,在同一弹窗内选择并保存;保存后全局同步,刷新保持。
|
||||
|
||||
“账户与设置”新增“个人信息”,展示账号名称与绑定邮箱状态。用户可预览并保存个人头像或恢复系统默认头像,顶栏、侧栏、账户卡片与创作消息同步更新。密码修改与邮箱更换分别保存;修改密码需要当前密码,邮箱更换还需要新邮箱验证码,成功后退出所有登录会话。纯 Linux.do 账号可重新授权核验身份后设置本地密码或更换邮箱。沿用现有设置页、表单、按钮反馈与主题,未增加昵称、用户名或角色编辑。
|
||||
|
||||
## 可美 KM Seedream 图片
|
||||
|
||||
`km-kemei-seedream` 声明式插件接入 Seedream 5.0 Pro / Flash 的文生图与参考图编辑,支持 URL / Base64 响应并由宿主统一保存图片。精确模型 ID 与扩展参数见插件包内 `docs/interface.md`。
|
||||
|
||||
@@ -5,6 +5,29 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
|
||||
|
||||
# 待测试
|
||||
|
||||
## 用户登录日志
|
||||
|
||||
- 已实现:管理员菜单 `/admin/login-logs`、筛选分页详情、后端认证事件记录、schema v53、失败脱敏和会话/日志原子提交。
|
||||
- 已验证:Go 1.25.0 `go test ./...` 全量通过;认证、权限、脱敏、事务回滚、并发退出、UTC/北京时间边界和旧库迁移专项通过。Bun 1.3.9 前端 build、lint 通过,设备识别和后台密度相关专项 6 项通过。OpenAPI 新路径和模型解析通过。
|
||||
- 代码审查已修正渠道模型导入按钮的过期断言,以及启动和助手浮窗测试在中文目录中的路径解码;Bun 1.3.9 完整前端测试 2245 项通过,构建与 lint 通过。HTTP/认证测试使用隔离数据库和模拟 OAuth,不代表外部服务联调已完成。
|
||||
- 提交前完整检查:Go 1.25.0 全量测试通过,独立 PostgreSQL 与 Redis 的 5 项依赖测试全部执行并通过;Node 22.19.0 Agent 运行时参与测试。macOS 跳过 1 项仅适用 Linux errno 的支付程序启动分类测试。Chrome 预演 E2E 65 项断言通过,Go 格式检查通过。
|
||||
- 已按用户要求重启本地后端,保留原运行配置与开发数据目录;健康接口 200,新日志接口对匿名请求返回 401,schema 53 和 `login_logs` 表已确认。以上仅确认启动、迁移和鉴权入口,真实登录态页面与外部服务联调仍待验收。
|
||||
- 筛选布局已优化并通过真实登录态页面验证:1280px 视口两行、1600px 单行、390px 无页面横向溢出;IP 筛选与重置恢复正常。筛选区使用页面私有容器查询,不影响其他后台页面。
|
||||
- [ ] 真实管理员页面:明暗主题、窄屏横向滚动、时间筛选、分页/刷新、详情和读取失败重试;浏览器返回后 URL 筛选保留。
|
||||
- [ ] 真实 SMTP/短信/Linux.do:各方式成功及失败登录、注册自动登录、主动退出事件和设备/IP 展示。
|
||||
- [ ] PostgreSQL:旧库升级、并发登录/退出和 SQLite → PostgreSQL 数据迁移;部署反向代理须核对可信代理配置及日志 IP。
|
||||
|
||||
## 个人信息
|
||||
|
||||
- 已实现:“更换头像”弹窗内切换上传图片和 8 款系统头像;图片经 1:1 裁剪后回到弹窗预览,上传或系统头像都在弹窗内保存,确认后全局同步。
|
||||
- 已验证:裁剪几何(含极宽和极高图片)、像素边界、PNG 导出失败、系统头像标识校验和事务回滚、v51→v52 数据保持的专项测试;真实个人信息路由的弹窗切换、图片裁剪预览、取消不写入。
|
||||
|
||||
- 已实现:账户与设置的个人信息、PNG/JPEG 头像预览和系统默认、密码修改/设置、邮箱更换及 Linux.do 重新核验;沿用现有页面样式、表单交互与反馈。继续创作入口仍定位渠道或模型配置。
|
||||
- 已验证:认证、头像、会话撤销/并发签发、验证码归属与过期、迁移的专项测试;前端验证规则与共享头像测试、TypeScript 和 Vite 构建。运行验证记录以交付结果为准。
|
||||
- 代码审查已修正资料刷新未同步全局头像,以及 Linux.do 重新验证在会话时区变化时未保存验证状态的问题;覆盖取消请求、账户切换、错误响应归属、头像保存后迟到响应,以及 UTC−12/UTC+14 会话的回归测试通过。
|
||||
- [ ] 用户验收:真实页面明暗主题和窄屏,头像全局刷新与失败保留、原密码错误、新邮箱发送及通知失败状态。
|
||||
- [ ] 外部联调:真实 SMTP 发送新邮箱验证码/旧邮箱通知,真实 Linux.do 授权回调与不同账号拒绝,实际 PostgreSQL 并发事务。本地测试使用隔离数据与模拟上游,不等同于这些外部联调已完成。
|
||||
|
||||
## 系统模型「拉取模型」弹窗搜索
|
||||
|
||||
- 已实现:后台「模型与资源 → 系统模型」点「拉取模型」后的选择弹窗新增搜索框(按模型标识做大小写不敏感的子串匹配,自动聚焦、可一键清空),因为部分上游端点会返回几百个模型。
|
||||
|
||||
@@ -2,6 +2,22 @@
|
||||
|
||||
本文档是管理后台 UI 的追踪与回滚台账。后续每批 UI 调整都必须在实施时追加,不覆盖历史记录。
|
||||
|
||||
## 用户登录日志筛选布局收敛
|
||||
|
||||
- 问题:用户搜索与嵌套筛选容器分别换行,IP 输入被基础样式撑满一行,实际 1280px 视口占四排、工具栏高 168px。
|
||||
- 调整:所有控件改为页面私有响应式网格;筛选可用宽度至少 1080px 时单行,640px 以上安排为两行,窄屏双列分组;IP/日期宽度受网格约束,重置入口固定位置。保留原有 URL 参数、筛选请求和分页行为;下拉使用共享组件的 ariaLabel。
|
||||
- 文件:`web/src/pages/admin/login-logs/login-logs-page.tsx`、`login-logs-page.css`。不修改其他页面的共享工具栏或全局控件规则。
|
||||
- 修改前副本:`.local/ui-change-backups/login-log-filters/login-logs-page.tsx`;SHA-256 `9a7da4db4565763bfd787df678a33acbb27a95809325475b3da78f049f9a771d`。CSS 为新增文件。
|
||||
- 实页验证:1280×720 两行、工具栏 80px;1600×900 单行、工具栏 36px;390×844 不产生页面横向溢出。已检查控件无重叠、IP 筛选真实空结果与重置恢复。
|
||||
|
||||
## 用户登录日志菜单与查询页
|
||||
|
||||
- 目的:为管理员提供独立的登录、失败和主动退出事件查询。
|
||||
- 方向:复用现有请求明细的页面壳、筛选表格、分页和状态 token;详情使用 AppDrawer,无新全局覆盖或独立 HTML。
|
||||
- 文件:`web/src/pages/admin/login-logs/`、`web/src/services/api/login-logs.ts`;菜单 `admin-shell.tsx`、懒加载 `router.tsx`。
|
||||
- 原始基线:这两个既有文件在任务开始时无本地修改;通过 HEAD 保存到 `.local/ui-change-backups/login-logs/`。SHA-256:`admin-shell.tsx` 为 `3d287fdbac7642c318509a6724f9490ef646a06cbfb0feea50d7db11b51f27c1`;`router.tsx` 为 `66288193a703257e9e56c739fa044dc09e8b896168cbecfb0556f195db8dcf0a`。新增页面/API 无旧版本文件。
|
||||
- 验证:运行结果见本次交付;真实登录态明暗/窄屏验收列入 pending-test,不以 build 代替。
|
||||
|
||||
## 记录和回滚约定
|
||||
|
||||
- 项目实际已存在 Git 工作树(工作树根目录为项目根),本次不初始化、不提交、不改写任何 Git 历史。
|
||||
|
||||
Reference in New Issue
Block a user