Files
OpenFlare/docs/frontend-development-guidelines.md
T

590 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ATSFlare 前端开发规范(Next.js + Tailwind CSS)
## 1. 文档定位
本文档用于约束 ATSFlare 新前端的工程结构、编码方式、组件设计、请求层、样式体系与交付标准。
适用范围:
* `atsf_server/web` 新版前端工程
* 基于 Next.js + Tailwind CSS 的管理端页面、组件、状态、测试与构建代码
说明:
* 本文档为前端专项规范。
* 当改造方案正式落地后,应将其中稳定约束同步回写到 [docs/development-guidelines.md](./development-guidelines.md)。
---
## 2. 技术栈规范
前端默认技术基线如下:
* Next.js 15(App Router)
* React 19
* TypeScript 5.x
* Tailwind CSS 4.x
* NextUI
* pnpm
* ESLint + Prettier
* TanStack Query
* React Hook Form + Zod
* Zustand(仅限轻量客户端状态)
* Vitest + Testing Library
要求:
* 默认使用 TypeScript,不再新增 JS 页面模块
* 默认使用函数组件,不新增 class 组件
* 默认使用 App Router,不新建 Pages Router 结构
* 默认使用 Tailwind CSS,不再引入新的大型样式框架
* 默认使用 NextUI 作为统一视觉组件基础
* 前端必须支持亮色 / 暗色模式切换,且主题切换能力应作为基础能力贯穿布局、组件与页面实现
禁止:
* 新增 Semantic UI 依赖
* 混用多套大型组件库造成视觉与交互割裂
* 在新模块中继续使用 jQuery 风格 DOM 操作
* 将页面逻辑继续堆积为单个超大组件
---
## 3. 目录与分层规范
推荐目录:
```text
app/
components/
features/
lib/
hooks/
store/
types/
styles/
tests/
```
### 3.1 `app/`
职责:
* 定义路由
* 组织页面级布局
* 组合业务模块
禁止:
* 在 `app/` 中堆积复杂请求逻辑
* 在 `app/` 页面文件内直接写大段业务处理代码
### 3.2 `features/`
职责:
* 按业务域组织模块
* 管理该模块的视图、表单、schema、query、action、类型定义
建议:
* 一个核心业务对象对应一个 feature
* feature 内部可包含 `components`、`api`、`hooks`、`schema`、`types`
### 3.3 `components/`
职责:
* 放置跨 feature 复用组件
分层建议:
* `components/ui/`:基于 NextUI 封装的按钮、表格、对话框、标签、输入框等基础组件
* `components/layout/`:侧边栏、导航栏、页面容器、内容区
* `components/feedback/`:加载、空态、错误态、确认框、消息提示
* `components/forms/`:复用型表单片段
### 3.4 `lib/`
职责:
* 公共能力沉淀
建议子目录:
* `lib/api/`:请求客户端、资源接口、错误映射
* `lib/auth/`:登录态工具、鉴权辅助
* `lib/env/`:环境变量读取与校验
* `lib/utils/`:纯工具函数
* `lib/constants/`:常量定义
### 3.5 `store/`
职责:
* 存储少量需要跨页面共享的客户端 UI 状态
禁止:
* 把服务端资源数据塞进 Zustand 作为主数据源
* 用全局 store 代替正常的 props 或 query 缓存
---
## 4. 路由与页面规范
### 4.1 路由命名
要求:
* 使用英文小写复数资源名
* 使用语义清晰的层级结构
示例:
* `/nodes`
* `/proxy-routes`
* `/config-versions`
* `/tls-certificates`
* `/managed-domains`
### 4.2 页面职责
页面文件应只负责:
* 获取路由参数
* 组织页面结构
* 调用 feature 组件
页面不应负责:
* 编写复杂表单校验逻辑
* 手写 API 细节
* 维护大量局部状态机
### 4.3 页面结构建议
后台页面优先采用统一结构:
1. 页面标题区
2. 页面说明区(可选)
3. 操作区
4. 筛选区
5. 内容区(表格 / 卡片 / 表单)
6. 详情区或侧栏(可选)
---
## 5. Server Component / Client Component 规范
### 5.1 默认原则
在当前 ATSFlare 管理端场景下,优先使用以下原则:
* 路由层、布局层可优先使用 Server Component
* 表单、交互、列表操作类组件使用 Client Component
* 涉及浏览器 API、事件处理、弹窗状态的模块必须显式声明 `'use client'`
### 5.2 使用约束
禁止:
* 为了省事,将整个应用顶层都改成 Client Component
* 将仅用于展示的静态内容一律写成客户端组件
建议:
* 以“最小客户端边界”为目标组织组件
* 明确区分展示组件与交互组件
---
## 6. TypeScript 与类型规范
### 6.1 总体要求
* 开启严格模式
* 禁止滥用 `any`
* 接口响应、表单输入、业务实体必须有明确类型
### 6.2 命名建议
* 接口返回:`ProxyRoute`, `NodeItem`, `ConfigVersionItem`
* 表单值:`ProxyRouteFormValues`
* 查询参数:`NodeListQuery`
* Schema:`proxyRouteSchema`
### 6.3 类型边界
要求:
* API 响应类型定义在资源模块或 `types/` 中
* 组件 props 明确声明,不使用隐式结构
* 日期、状态、枚举类字段应在前端建立明确字面量或枚举类型
---
## 7. 数据请求规范
### 7.1 请求入口
所有 API 请求必须统一经过 `lib/api/`。
禁止:
* 在页面组件中直接调用 `fetch('/api/...')`
* 在多个组件中重复拼接相同接口路径
### 7.2 请求封装
要求:
* 提供统一请求客户端
* 统一处理:
* `success/message/data` 响应结构
* 鉴权失效
* 通用错误提示
* 网络异常
### 7.3 Query 使用规范
适用场景:
* 列表查询
* 详情查询
* 配置读取
* 依赖后端的分页、筛选、刷新操作
要求:
* 使用稳定的 query key
* 变更操作完成后按资源粒度失效缓存
* 列表刷新不要依赖手工多处 setState
---
## 8. 表单规范
### 8.1 表单栈
统一使用:
* React Hook Form
* Zod
### 8.2 校验原则
* 输入校验尽量前置
* 与后端约束一致
* 错误信息清晰可读
### 8.3 交互要求
* 必填项明确标识
* 提交中状态不可重复点击
* 保存成功要有明确反馈
* 服务端错误要映射到表单或全局提示
### 8.4 高风险表单
适用场景:
* 发布配置
* 激活版本
* 删除节点
* 删除证书
* 重置 Token
要求:
* 必须有二次确认
* 必须展示操作对象名称
* 必须明确成功与失败反馈
---
## 9. 样式与 UI 规范
### 9.1 样式原则
* NextUI 为统一视觉组件基线
* Tailwind CSS 为布局、间距、响应式与业务样式扩展的基础方案
* 样式通过设计 token、NextUI 主题能力与语义类组合实现
* 页面视觉风格统一、留白一致、层级清晰
* 所有新页面与基础组件必须同时兼容亮色与暗色主题,禁止只实现单一主题
* 主题切换必须可由用户主动触发,并在路由切换和刷新后保持一致
### 9.2 设计 token
至少抽象以下语义:
* 主色、成功色、警告色、危险色
* 边框色、背景色、弱文本色、强文本色
* 圆角、阴影、间距、层级
* 亮色 / 暗色两套语义 token 映射,以及主题切换所需的前景色、表面色、分隔色
### 9.3 组件外观要求
* 按钮尺寸、输入框高度、表格密度、弹窗圆角保持统一
* 状态标签颜色语义固定,不允许每页自定义一套颜色
* 表格、卡片、表单容器使用统一布局间距
### 9.4 禁止项
* 大量硬编码颜色值
* 在 JSX 中堆砌不可读的超长类名且不抽组件
* 同一个状态在不同页面使用不同颜色语义
* 仅在暗色或仅在亮色模式下校验视觉效果后直接交付
---
## 10. 组件设计规范
### 10.1 组件分类
组件分为三类:
1. 基础组件:基于 NextUI 二次封装的按钮、输入框、表格、对话框、标签
2. 业务组件:节点状态卡、版本激活按钮、证书上传表单
3. 页面组合组件:页面头部、筛选面板、详情抽屉
### 10.2 复用原则
* 先抽象稳定结构,再抽象复杂行为
* 不为单次使用过度设计通用组件
* 业务组件优先放在 feature 内,确认跨域复用后再上移
### 10.3 Props 规范
* props 命名语义化
* 布尔值 props 使用肯定式命名
* 事件 props 使用 `onXxx`
示例:
* `isLoading`
* `isDanger`
* `onSubmit`
* `onConfirm`
---
## 11. 状态管理规范
### 11.1 状态分类
* 服务端状态:放 Query
* 页面临时交互状态:放组件内部 `useState`
* 跨页面 UI 状态:放 Zustand
### 11.2 不推荐做法
* 用 Zustand 保存服务端列表数据
* 用 Context 替代完整的数据层方案
* 页面里堆叠过多彼此耦合的本地状态
### 11.3 推荐做法
* 将筛选条件、对话框开关、当前编辑对象保持最小化
* 复杂交互优先拆成自定义 hook 或 feature action
---
## 12. 反馈与异常处理规范
### 12.1 基础反馈
每个页面必须具备:
* 加载态
* 空态
* 错误态
* 成功反馈
### 12.2 错误处理
要求:
* 请求失败时给出用户可理解的信息
* 后端返回 `message` 时优先展示可读消息
* 非预期错误需要统一兜底文案
### 12.3 长耗时操作
适用场景:
* 发布配置
* 激活版本
* 上传证书
* 节点触发更新
要求:
* 需要展示明确 loading 状态
* 完成后要主动刷新相关资源
---
## 13. 可访问性与国际化规范
### 13.1 可访问性
要求:
* 表单控件必须有关联标签
* 按钮文案清晰,不只依赖图标表达语义
* 弹窗支持键盘关闭与焦点管理
* 状态颜色不能作为唯一信息来源
### 13.2 国际化
当前管理端以中文为主,但要求:
* 文案集中管理,避免散落硬编码
* 状态、按钮、提示信息尽量收敛到常量或文案文件
---
## 14. 测试规范
### 14.1 单元与组件测试
适用内容:
* 工具函数
* schema 校验
* 基础组件
* 关键业务组件
### 14.2 集成测试
适用内容:
* 列表加载与筛选
* 表单提交与错误反馈
* 对话框确认流程
### 14.3 E2E 测试
至少覆盖以下主链路:
* 登录
* 新增反代规则
* 发布并查看配置版本
* 节点列表查看
* 证书导入
* 运维设置修改
---
## 15. 性能规范
要求:
* 避免不必要的大型客户端依赖
* 避免页面级重复请求
* 大表格页面优先考虑分页而非一次性全量加载
* 图标、日期格式化、富文本等能力优先按需引入
建议:
* 公共重型组件按需加载
* 详情弹窗、复杂编辑器、Diff 预览支持懒加载
---
## 16. 安全规范
要求:
* 不在前端持久化敏感 Token
* 不在日志中输出敏感配置、证书私钥、完整凭证
* 富文本或 Markdown 渲染必须经过安全处理
* 上传、下载、外链跳转必须有明确来源控制
禁止:
* 在本地存储中缓存高敏感服务端数据
* 为图方便绕过后端鉴权逻辑
---
## 17. 命名与代码风格规范
### 17.1 文件命名
* 组件:`PascalCase.tsx`
* hook:`useXxx.ts`
* 工具:`camelCase.ts` 或按职责命名
* schema:`xxx.schema.ts`
* 类型:`xxx.types.ts`
### 17.2 符号命名
* 组件名使用名词或名词短语
* hook 使用 `use` 前缀
* 布尔值使用 `is`、`has`、`can` 前缀
* 事件处理使用 `handle` 前缀
### 17.3 代码风格
* 保持单文件职责清晰
* 优先早返回减少嵌套
* 删除废弃代码与无意义注释
* 不在 JSX 中堆积复杂表达式,提取到变量或 hook
---
## 18. 提交与评审要求
### 18.1 提交粒度
要求:
* 一次提交聚焦一个明确目标
* 不把样式重构、功能新增、目录调整混在同一提交中
### 18.2 代码评审关注点
评审时重点检查:
1. 是否符合目录分层
2. 是否复用了统一请求层
3. 是否破坏现有 API 兼容性
4. 是否存在过度客户端化问题
5. 是否符合 UI 一致性与状态反馈规范
6. 是否补充必要测试
---
## 19. 文档维护要求
以下内容变化时,必须同步更新本文档:
* 技术栈调整
* 目录结构调整
* 请求层约定变化
* 状态管理方案变化
* 测试基线变化
* 样式体系变化
当专项方案正式实施后,还应同步更新:
* [docs/design.md](./design.md)
* [docs/development-guidelines.md](./development-guidelines.md)
* [docs/deployment.md](./deployment.md)
---
## 20. 最低执行标准
新前端代码提交前,至少满足:
1. 通过类型检查
2. 通过 lint
3. 核心路径具备基础测试
4. 页面具备加载态、空态、错误态
5. API 请求不散落在页面 JSX 中
6. 未新增 Semantic UI 依赖
7. 未破坏当前后端主链路和部署约束