view/app 架构约定(Atomic Design / Core-3)
本应用是 GitDataAI 工作台前端。分层只回答“放哪里、能不能依赖”, 业务契约写在 TypeScript props 里。
分层
| 层 | 目录 | 允许做 | 禁止做 |
|---|---|---|---|
| 基础控件 | src/ui | 渲染原生控件、暴露 variant/size/disabled/ref、焦点与键盘 | 读路由、读会话、发请求、做业务校验 |
| 展示组合 | src/components | 组合 ui,接收 label/error/slots/回调 | 发请求、判断权限、读全局 store |
| 页面区块 | src/blocks | 页面级布局(AppShell/顶栏),内容全部由 props 注入 | 自己取数据 |
| 业务域 | src/domains/* | 请求、缓存、校验、权限、域内组件 | 被 ui/components/blocks 反向依赖 |
| 页面 | src/pages/* | 路由页面装配 | 沉淀可复用组件 |
| 基础设施 | src/services/* | API 客户端与适配、实时、语音、存储 | 渲染 UI |
依赖方向固定为 ui → components → blocks 逐级组合,domains/pages 消费系统层;
系统层不得 import domains、pages、services、routing。
判定顺序
- 内部包含其他系统组件?是 → 不是
ui。 - 承载业务动作、数据请求、校验或权限?是 → 放
domains。 - 只服务单个页面?是 → 与该页面同域,不进系统层。
- 纯展示但被多处复用?→
components或blocks。
API 边界
- 生成客户端位于
packages/apiclient,由pnpm exec orval从仓库根openapi.json生成,不要手改。 - 统一经
src/services/api调用;响应信封为{ code, message, data, error, error_code, request_id },data: null表示成功但无内容,不是失败。 - 列表响应统一为
{ items, total, limit, offset };请求limit不得超过服务端上限(空间域 100)。 - 会话走同源 Cookie;401 跳
/auth/login?callback_url=<当前地址>,不做令牌刷新重放。
资源
src/vendor/livekit为第三方 vendored 代码(含 styles/dist 与许可证),保持原样,不参与格式化与 lint。