Files
JobRadar/.craftkit/designs/engineering-baseline/frontend-design.md
T

222 lines
8.3 KiB
Markdown

---
reviewStatus: pending
reviewedAt: null
replacedBy: null
---
# 第一阶段工程基线前端落地设计
## 1. 文档定位
本文档定义第一阶段 Django 服务端页面的页面结构、路由、交互、状态、权限与可访问性边界。当前项目没有独立前端框架或组件库,因此本阶段使用 Django Templates、Django Forms 和少量原生 CSS,不引入 Vue、React、前端状态库或前后端分离架构。
关联设计:
- [后端落地设计](backend-design.md)
- [数据库设计](database-design.md)
- [接口与页面契约设计](interface-design.md)
- [第一阶段工程基线开发计划](../../../docs/engineering-baseline/dev-plan.md)
## 2. 用户角色与核心场景
### 2.1 未登录访问者
- 可以进入登录页。
- 访问个人资料和运行页面时跳转登录页。
- 不提供公开注册入口。
### 2.2 普通用户
- 登录和退出系统。
- 查看、修改自己的基础资料。
- 查看自己的 Agent Run 列表。
- 查看自己的 Agent Run 详情、事件和工具调用摘要。
- 不能查看其他用户的数据,也不能从页面执行真实 Agent 任务。
### 2.3 管理员
- 使用 Django Admin 创建和停用用户。
- 查看全部用户资料和 Agent 运行记录。
- 创建用于验证持久化链路的最小 Run。
- 在 Admin 中处理待确认记录。
## 3. 页面与路由
| 页面 | 路由 | 访问角色 | 主要操作 |
| --- | --- | --- | --- |
| 登录 | `/accounts/login/` | 未登录用户 | 提交用户名和密码 |
| 退出 | `/accounts/logout/` | 已登录用户 | POST 确认退出 |
| 个人资料 | `/accounts/profile/` | 普通用户、管理员 | 查看和修改自己的资料 |
| 运行列表 | `/runs/` | 普通用户、管理员 | 查看当前用户的运行记录 |
| 运行详情 | `/runs/<uuid>/` | 记录所属用户、管理员 | 查看状态、事件和工具调用摘要 |
| API 服务商 | `/runs/providers/` | 普通用户、管理员 | 搜索、筛选并配置自己的模型服务商 |
| 管理后台 | `/admin/` | 管理员 | 管理用户和审计记录 |
登录成功默认进入运行列表;退出成功返回登录页。详情页返回列表时保留原分页参数,非法或越权的运行编号统一展示 404 页面。
## 4. 页面结构
### 4.1 全局布局
建立一个全局基础模板,结构包括:
- 跳转到主要内容的无障碍链接。
- 产品名称和主导航。
- 当前用户标识。
- 运行列表、个人资料和退出入口。
- 页面级消息区域。
- 主内容区域。
退出必须使用 POST 表单,不使用可被预加载或误触发的 GET 链接。
### 4.2 登录页
页面内容:
- 用户名输入框。
- 密码输入框。
- 登录按钮。
- 表单级错误和字段级错误。
登录失败时不区分“用户不存在”和“密码错误”,避免泄露账户信息。密码字段不得回显。
### 4.3 个人资料页
字段:
- 用户名:只读。
- 显示名:可编辑。
- 时区:第一阶段使用受控选择项,默认 `Asia/Shanghai`。
提交成功后采用 POST/Redirect/GET,刷新页面不会重复提交。并发更新暂不提供复杂冲突合并,后端仍必须校验当前用户归属。
### 4.4 Agent Run 列表页
每条记录展示:
- 标题或简短运行标识。
- 当前状态。
- Agent 名称和版本摘要。
- 创建、开始和结束时间。
- 运行耗时。
- 是否存在待处理人工确认。
列表按创建时间倒序分页。第一阶段没有运行记录时展示明确空状态,不显示“创建任务”按钮,避免暗示真实 Agent 功能已开放。
### 4.5 Agent Run 详情页
页面分为:
1. 运行概览:状态、标题、版本、开始和结束时间、用量摘要。
2. 结果摘要:只展示已脱敏的结构化摘要。
3. 运行时间线:按事件序号升序展示。
4. 工具调用:名称、状态、耗时、参数摘要、结果或错误摘要。
5. 人工确认:只读展示当前状态;第一阶段由 Admin 处理。
详情页不展示 API Key、Cookie、密码、完整工具参数或原始模型敏感内容。
### 4.6 API 服务商页
- 使用服务商卡片目录展示官方直连、国内平台、聚合平台和云平台。
- 卡片明确区分“仅 API Key”和“需要额外配置”,未完成专用适配的平台不开放保存操作。
- 配置抽屉只接收 API Key、可选模型标识和是否设为默认服务商;Base URL 与协议由服务端预设。
- 页面只显示密钥末四位提示,保存后不可读取完整密钥。
- 连接测试通过后才替换已有配置;失败输入不得破坏原有可用密钥。
- 搜索与分类使用 GET 查询参数,保存和移除使用 POST、CSRF 与重定向。
## 5. 模板复用边界
建议模板层级:
```text
templates/
├── base.html
├── registration/
│ └── login.html
├── accounts/
│ └── profile.html
├── agent_runtime/
│ ├── run_list.html
│ └── run_detail.html
└── errors/
├── 403.html
├── 404.html
└── 500.html
```
复用片段仅在存在稳定复用时抽取:
- 状态徽标。
- 分页导航。
- 表单错误摘要。
- 时间线事件项。
第一阶段不建立通用组件系统,也不为了文件数量提前抽象宏或模板标签库。
## 6. 状态与数据所有权
服务端拥有所有业务和权限状态,页面不保存跨请求客户端状态。
| 状态类型 | 所有者 | 页面行为 |
| --- | --- | --- |
| 登录状态 | Django Session | 未登录时跳转登录 |
| 用户资料 | `accounts` 服务 | GET 回显,POST 校验和保存 |
| Run 列表与详情 | `agent_runtime` 查询服务 | 仅返回当前用户范围 |
| 分页状态 | URL 查询参数 | 可复制、可返回 |
| 表单错误 | Django Form | 同页字段级与全局提示 |
| 消息反馈 | Django Messages | 重定向后展示一次 |
页面只接收格式化后的视图模型,不在模板中执行权限判断、状态转换或复杂数据加工。
## 7. 加载、空、错误和权限状态
- 服务端页面首屏不引入异步加载骨架。
- 空列表显示原因和当前阶段说明。
- 表单校验失败保留非敏感输入并聚焦错误摘要。
- 资源不存在和跨用户访问统一显示 404。
- 服务端异常显示通用错误页,并提供返回安全页面的入口。
- SDK 配置缺失不能阻止登录、资料和历史 Run 查询。
- 页面不得把后端异常堆栈直接呈现给用户。
## 8. 响应式和可访问性
- 页面以单列内容为主,在宽屏下限制最大阅读宽度。
- Run 详情中的宽表格在窄屏改为定义列表或允许局部横向滚动。
- 所有表单字段必须具有可关联的 `label`、帮助文本和错误描述。
- 当前导航项提供可感知状态,不只依赖颜色区分。
- 状态徽标同时包含文本。
- 焦点样式不可移除,键盘可以访问所有操作。
- 标题层级连续,每页只有一个主标题。
- 时间使用语义化 `<time>` 并提供完整时间值。
## 9. 安全与隐私
- 所有写操作使用 POST 和 CSRF 防护。
- 登录后重定向参数只允许站内安全地址。
- 模板启用默认转义,不使用未经审查的 `safe` 输出。
- 页面只显示脱敏摘要。
- 不在 URL、HTML 注释或前端脚本中包含密钥和敏感参数。
- 跨用户访问由查询层限制,模板隐藏按钮不能替代后端权限校验。
## 10. 验证清单
- 登录成功、登录失败和安全重定向。
- 未登录访问受保护页面。
- 个人资料成功保存和校验失败。
- 两个普通用户之间的资料和 Run 隔离。
- 运行列表空状态、单页和多页数据。
- 运行详情事件顺序及敏感字段不展示。
- 管理员后台访问边界。
- CSRF 拒绝路径。
- 键盘导航、焦点、标签和错误关联。
- 常见桌面和窄屏宽度下的真实浏览器检查。
未执行真实浏览器和辅助技术测试前,不得宣称前端交互验收通过。
## 11. 待确认项
- 产品视觉标识、颜色和字体尚未确定;第一阶段使用简洁系统字体和高对比度基础样式。
- 是否允许普通用户处理人工确认留到第二阶段决定。
- 运行列表默认分页大小应在实现时结合样例数据确定。
- 时区候选范围需在表单实现前明确,不能接受任意未校验字符串。