19 KiB
运维管理平台模块化开发规范
依据:
目标:建立一套可长期维护的开发规范,让第一版能快速落地,同时避免后续接入真实 Kubernetes、日志、监控、数据库资源、审批流时推倒重来。
1. 技术方向
第一版默认按前后端分离设计,前端先使用 Mock 数据完成完整业务闭环,后端接口后续按相同契约接入。
推荐前端技术栈:
| 类型 | 推荐 |
|---|---|
| 语言 | TypeScript |
| UI 框架 | React |
| 构建工具 | Vite |
| 路由 | React Router |
| 服务端状态 | TanStack Query |
| 客户端状态 | Zustand 或 React Context |
| 表单 | React Hook Form |
| 校验 | Zod |
| Mock | MSW |
| 单元测试 | Vitest |
| 组件测试 | Testing Library |
| E2E | Playwright |
| 样式 | CSS Variables + CSS Modules |
| 图标 | lucide-react |
| 图表 | Recharts 或 ECharts |
技术选择原则:
- 服务端数据用 Query 管理,不放进全局 Store。
- 项目、环境、集群这类 UI 上下文可以放全局 Store。
- UI Token 必须通过 CSS 变量统一管理。
- Mock 层必须和真实 API 共用类型定义。
- 业务模块优先纵向切分,不按文件类型横向堆叠。
2. 模块化架构
推荐使用“业务垂直切片 + 分层依赖”的结构。
目录结构:
src/
app/
App.tsx
router.tsx
providers/
QueryProvider.tsx
AppStateProvider.tsx
styles/
tokens.css
glass.css
layout.css
components.css
pages/
overview/
services/
service-detail/
releases/
resources/
logs-events/
audit/
widgets/
app-shell/
top-context-bar/
service-table/
release-drawer/
restart-dialog/
metric-dashboard/
event-timeline/
features/
switch-project-context/
filter-services/
release-service/
restart-service/
search-logs/
filter-audits/
entities/
project/
cluster/
service/
release/
resource/
event/
audit/
user/
shared/
api/
config/
constants/
lib/
types/
ui/
hooks/
mocks/
assets/
分层职责:
| 层级 | 职责 | 示例 |
|---|---|---|
app |
应用启动、路由、全局 Provider、全局样式 | router.tsx、QueryProvider |
pages |
页面编排,只组合 widgets/features/entities | OverviewPage |
widgets |
页面级业务区块,可包含多个 feature | ServiceTable、ReleaseDrawer |
features |
用户可执行的业务动作 | 发布服务、重启服务、筛选服务 |
entities |
业务实体模型、实体 API、实体展示组件 | service、release |
shared |
无业务含义的通用能力 | Button、Table、fetcher、formatDate |
依赖方向:
app -> pages -> widgets -> features -> entities -> shared
规则:
- 下层不能 import 上层。
shared不能 import 任何业务模块。entities之间尽量不直接互相 import,跨实体组合放在features或widgets。- 页面不能直接写复杂业务逻辑,页面只做布局和组合。
- 同一业务动作只允许有一个入口模块,例如发布服务统一放在
features/release-service。
3. 模块目录规范
每个业务模块使用相同结构,便于查找。
features/release-service/
api/
createRelease.ts
model/
schema.ts
types.ts
useReleaseService.ts
ui/
ReleaseForm.tsx
ReleaseSteps.tsx
lib/
buildReleasePayload.ts
index.ts
index.ts 只导出模块的公开 API。
允许导出:
- 页面或组件需要使用的 UI。
- Hook。
- 类型。
- 纯工具函数。
禁止导出:
- 内部私有组件。
- 临时常量。
- Mock 实现细节。
- 只为绕过依赖规则而暴露的对象。
4. 命名规范
文件命名:
| 类型 | 规范 | 示例 |
|---|---|---|
| React 组件 | PascalCase | ServiceTable.tsx |
| Hook | camelCase,以 use 开头 |
useServicesQuery.ts |
| 工具函数 | camelCase | formatDuration.ts |
| 类型文件 | types.ts |
entities/service/model/types.ts |
| Schema | schema.ts |
release/model/schema.ts |
| 常量 | constants.ts |
shared/constants/status.ts |
| 样式模块 | 同组件名 | ServiceTable.module.css |
| 测试 | 同文件名 + .test |
formatDuration.test.ts |
类型命名:
- 业务实体:
Service、ReleaseRecord、DataResource。 - API 请求:
CreateReleaseRequest。 - API 响应:
ServiceListResponse。 - 表单值:
ReleaseFormValues。 - 组件 Props:
ServiceTableProps。
状态枚举:
- TypeScript 使用字符串联合类型优先。
- 后端返回值必须稳定,不使用中文作为状态码。
示例:
export type ServiceStatus = "healthy" | "warning" | "critical" | "unknown" | "running";
5. TypeScript 规范
必须开启:
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true
}
}
规则:
- 禁止使用
any,确实无法确定时使用unknown并收窄。 - API 返回值必须有类型。
- 表单提交值必须有 Zod Schema 校验。
- 组件 Props 必须显式定义。
- 复杂类型放在
model/types.ts。 - 跨模块共享类型只能从模块
index.ts导入。 - 不在组件里直接拼接后端数据结构,使用 mapper 转成前端 ViewModel。
推荐:
type ServiceTableRow = {
id: string;
name: string;
status: ServiceStatus;
version: string;
instanceText: string;
cpuUsage: number;
memoryUsage: number;
owner: string;
};
6. API 层规范
统一入口:
shared/api/
httpClient.ts
queryKeys.ts
errors.ts
实体 API:
entities/service/api/
getServices.ts
getServiceDetail.ts
getServiceInstances.ts
getServiceMetrics.ts
规则:
- 所有请求必须经过
shared/api/httpClient.ts。 - API 函数只负责请求和数据转换,不处理 UI Toast。
- 请求参数统一使用对象,不使用多个位置参数。
- 列表接口必须支持
projectId、environment、clusterId。 - 写操作必须返回可用于刷新缓存的业务 ID。
- API 错误统一转成标准错误对象。
标准错误:
type ApiError = {
code: string;
message: string;
requestId?: string;
details?: unknown;
};
Query Key 规范:
export const queryKeys = {
services: (params: ServiceListParams) => ["services", params] as const,
serviceDetail: (id: string) => ["service", id] as const,
releases: (params: ReleaseListParams) => ["releases", params] as const,
};
7. 状态管理规范
状态分三类:
| 类型 | 管理方式 | 示例 |
|---|---|---|
| 服务端状态 | TanStack Query | 服务列表、发布记录、数据资源 |
| 全局 UI 上下文 | Zustand / Context | 项目、环境、集群、当前用户 |
| 局部 UI 状态 | React useState |
抽屉开关、当前 Tab、表单中间态 |
全局 Store 只放:
- 当前项目。
- 当前环境。
- 当前集群。
- 当前用户和角色。
- 全局布局状态。
禁止放入全局 Store:
- 服务列表。
- 发布记录。
- 日志列表。
- 监控图表数据。
- 临时表单值。
原因:这些数据属于服务端状态,应该由 Query 缓存、刷新和失效控制。
8. UI 组件规范
组件分三类:
| 类型 | 目录 | 说明 |
|---|---|---|
| 通用 UI | shared/ui |
Button、Table、Badge、Drawer |
| 实体组件 | entities/*/ui |
ServiceStatusBadge、ResourceTypeIcon |
| 业务组件 | features / widgets |
ReleaseDrawer、ServiceTable |
通用 UI 规则:
- 不包含业务字段。
- 不直接请求接口。
- 不读取全局业务 Store。
- 通过 Props 接收数据。
- 支持
className。 - 支持键盘焦点。
- 支持 disabled、loading、error 状态。
业务组件规则:
- 可以组合实体组件和通用 UI。
- 可以调用 feature 内 Hook。
- 不直接写全局样式。
- 危险操作必须显式传入
environment。
组件文件结构:
Button/
Button.tsx
Button.module.css
Button.test.tsx
index.ts
9. 样式规范
样式分层:
app/styles/
tokens.css
glass.css
layout.css
components.css
规则:
- 颜色、圆角、阴影、字号、间距必须使用 Token。
- 组件局部样式使用 CSS Modules。
- 禁止在业务组件里硬编码主色和状态色。
- 禁止使用行内样式写核心布局。
- 不使用负字距。
- 不使用大面积单色主题覆盖液态玻璃风格。
- 图表颜色从 Token 或统一常量中读取。
CSS 命名:
.root {}
.header {}
.body {}
.footer {}
.title {}
.meta {}
.actions {}
.isActive {}
.isDisabled {}
玻璃样式统一使用类:
.glass-surface.glass-surface-strong.glass-subtle
不要在每个组件里重复实现玻璃效果。
10. 页面开发规范
页面只做三件事:
- 读取路由参数。
- 组合 widgets/features。
- 控制页面级布局。
页面不做:
- 直接调用底层 HTTP。
- 写复杂数据转换。
- 处理发布和重启流程细节。
- 写超过 80 行的业务逻辑。
页面示例:
export function ServicesPage() {
return (
<PageLayout title="微服务">
<ServiceFilters />
<ServiceTable />
</PageLayout>
);
}
11. 业务模块规范
11.1 服务模块
目录:
entities/service/
api/
model/
ui/
lib/
index.ts
职责:
- 服务类型定义。
- 服务列表接口。
- 服务详情接口。
- 服务状态展示。
- 服务数据格式化。
不负责:
- 发布服务。
- 重启服务。
- 服务筛选表单。
11.2 发布模块
目录:
features/release-service/
api/
model/
ui/
lib/
index.ts
职责:
- 版本选择。
- 发布策略选择。
- 预检查展示。
- 发布提交。
- 发布状态反馈。
规则:
prod必须要求二次确认。- 发布完成后必须刷新服务详情和发布记录。
- 发布成功或失败都必须生成事件和审计记录。
11.3 重启模块
职责:
- 单实例重启。
- 全部实例重启。
- 滚动重启和立即重启。
- 影响范围展示。
规则:
prod默认滚动重启。- 立即重启必须二次确认。
- 操作完成后必须生成事件和审计记录。
11.4 数据资源模块
职责:
- 展示 MySQL、MongoDB、Redis、Kafka 状态。
- 展示容量、连接数、备份、关联服务。
- 展示异常事件。
规则:
- 第一版不开放查询入口。
- 第一版不开放恢复入口。
- 生产环境不显示任何直接执行数据库命令的能力。
12. 表单规范
所有表单必须:
- 使用 Schema 校验。
- 提交前做客户端校验。
- 提交中禁用提交按钮。
- 提交失败展示错误原因。
- 危险操作展示影响范围。
发布表单必须校验:
- 目标版本不能为空。
- 发布策略不能为空。
prod环境必须勾选确认。
重启表单必须校验:
- 重启范围不能为空。
- 立即重启必须二次确认。
- 单实例重启必须有实例 ID。
13. 权限规范
前端权限用于控制体验,后端权限用于保证安全。第一版即使没有真实后端,也要按这个结构设计。
权限点:
type Permission =
| "service:read"
| "service:release"
| "service:restart"
| "release:read"
| "resource:read"
| "logs:read"
| "audit:read";
规则:
- 权限不足的危险操作显示禁用态,不直接隐藏。
- 禁用态必须说明原因。
- 生产环境操作必须额外判断角色和确认状态。
- 审计页面只对有
audit:read权限的角色开放。
14. Mock 规范
Mock 使用 MSW 或等价方案。
目录:
shared/mocks/
browser.ts
handlers.ts
data/
projects.ts
services.ts
releases.ts
resources.ts
events.ts
audits.ts
规则:
- Mock 数据结构必须复用实体类型。
- Mock 行为要模拟真实写操作。
- 发布成功后更新服务版本。
- 重启成功后新增事件和审计。
- 支持模拟失败场景。
- 支持模拟空状态。
必须覆盖:
- Healthy、Warning、Critical 服务。
- 发布成功、失败、执行中。
- MySQL、MongoDB、Redis、Kafka 多种状态。
prod环境二次确认。- 权限不足禁用操作。
15. 错误处理规范
错误分三层:
| 层级 | 处理 |
|---|---|
| API 层 | 转换为 ApiError |
| 业务层 | 判断是否可重试、是否需要刷新 |
| UI 层 | 展示错误状态、Toast、下一步操作 |
页面错误态必须提供:
- 错误原因。
- 重试按钮。
- 可选的查看事件入口。
写操作失败必须提供:
- 失败原因。
- requestId,如果有。
- 是否可以重试。
- 是否需要查看事件。
禁止:
- 只显示“操作失败”。
- 把原始异常对象直接渲染到页面。
- 静默吞掉接口错误。
16. 日志和审计规范
前端事件日志用于排查,审计记录用于追责。
发布、重启、回滚必须产生审计记录。
审计记录字段:
- 操作时间。
- 操作人。
- 角色。
- 操作对象。
- 操作类型。
- 环境。
- 集群。
- 执行结果。
- 关联记录 ID。
生产环境操作必须有明显标识。
17. 测试规范
测试分层:
| 类型 | 工具 | 覆盖内容 |
|---|---|---|
| 单元测试 | Vitest | 工具函数、mapper、权限判断、表单校验 |
| 组件测试 | Testing Library | Button、Table、Badge、ReleaseDrawer |
| 集成测试 | Testing Library + MSW | 发布流程、重启流程、筛选流程 |
| E2E | Playwright | 核心用户路径 |
必须测试:
- 服务状态 Badge 文案和颜色类。
- 服务搜索和筛选。
prod发布确认。- 发布成功后版本更新。
- 发布失败后错误反馈。
- 重启成功后事件和审计新增。
- 权限不足时按钮禁用。
- Secret 不显示明文。
E2E 核心路径:
- 进入总览页。
- 切换到
prod。 - 打开
user-service详情。 - 打开发版抽屉。
- 选择目标版本。
- 勾选生产确认。
- 执行发布。
- 验证发布记录和审计记录。
18. 代码质量规范
必须配置:
- ESLint。
- Prettier。
- TypeScript strict。
- lint-staged。
- 单元测试命令。
- 构建命令。
建议脚本:
{
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"preview": "vite preview",
"lint": "eslint .",
"format": "prettier --write .",
"test": "vitest run",
"test:watch": "vitest",
"e2e": "playwright test",
"check": "npm run lint && npm run test && npm run build"
}
}
提交前最低要求:
- TypeScript 无错误。
- ESLint 无错误。
- 单元测试通过。
- 构建通过。
涉及 UI 的改动还要:
- 浏览器预览。
- 检查桌面宽度 1280px。
- 检查表格文字不重叠。
- 检查抽屉内容可滚动。
- 检查
prod危险操作二次确认。
19. Git 和提交规范
分支命名:
feature/overview-page
feature/release-drawer
fix/prod-release-confirm
chore/setup-eslint
提交信息:
feat: add service release drawer
fix: require confirmation before prod restart
chore: setup testing pipeline
docs: add modular development guideline
提交类型:
| 类型 | 含义 |
|---|---|
feat |
新功能 |
fix |
修复 |
docs |
文档 |
style |
格式和样式调整 |
refactor |
重构 |
test |
测试 |
chore |
工程配置 |
规则:
- 一个提交只做一类事情。
- 不把大范围格式化混进功能提交。
- 不提交本地环境文件。
- 不提交密钥、Token、数据库连接串。
20. 环境变量规范
命名:
VITE_API_BASE_URL=
VITE_ENABLE_MOCK=
VITE_APP_ENV=
规则:
- 前端环境变量必须以
VITE_开头。 .env.example必须维护。.env.local不提交。- 不在前端存储真实密钥。
- 生产环境配置由部署平台注入。
21. 性能规范
第一版性能目标:
- 首屏可交互时间控制在合理范围。
- 表格 100 条数据内交互不卡顿。
- 路由页面按需加载。
- 图表组件按页面懒加载。
- 日志列表避免一次渲染过多行。
规则:
- 路由级代码分割。
- 大图表库懒加载。
- 表格筛选优先使用 memoized selector。
- 不在 render 中做重型计算。
- 日志列表超过 500 行时考虑虚拟列表。
22. 安全规范
第一版必须遵守:
- 不展示 Secret 明文。
- 不在 localStorage 存储敏感 Token。
- 所有危险操作必须检查权限。
- 所有生产环境操作必须二次确认。
- 后端接入后必须校验权限,不能只依赖前端。
- 日志内容渲染要避免 XSS。
- 用户输入不能直接拼接到 URL path,必须 encode。
数据库资源限制:
- 第一版不做 SQL 查询。
- 第一版不做 Mongo 查询。
- 第一版不做备份恢复。
- 生产环境不显示直接执行命令入口。
23. 可访问性规范
最低要求:
- 所有按钮可键盘访问。
- 抽屉和弹窗可按 Esc 关闭。
- 菜单可键盘导航。
- 状态 Badge 必须有文字。
- 表单错误信息和字段绑定。
- 点击目标不小于 32px x 32px。
- 颜色不能作为唯一状态表达。
24. 开发顺序
推荐顺序:
- 初始化项目和质量工具。
- 建立 Token、玻璃样式、App Shell。
- 建立 Mock 数据和 API 适配层。
- 开发通用 UI 组件。
- 开发实体模块:service、release、resource、event、audit。
- 开发首页和微服务列表。
- 开发服务详情页。
- 开发发布抽屉和重启流程。
- 开发发布记录、数据资源、日志事件、审计页。
- 补齐测试、空状态、错误状态。
- 浏览器视觉验收。
- 构建验收。
25. Definition of Done
一个功能完成必须满足:
- 代码按模块边界放置。
- 类型完整,无
any。 - 样式使用全局 Token。
- Loading、Empty、Error 状态完整。
- 权限不足有禁用态和原因。
prod危险操作有二次确认。- 写操作成功和失败都有反馈。
- 相关事件和审计记录更新。
- 单元测试或集成测试覆盖关键逻辑。
lint、test、build通过。- 浏览器中验证 UI 不重叠、不溢出、抽屉可滚动。
26. 禁止项
- 禁止页面直接调用
fetch。 - 禁止在页面里堆业务逻辑。
- 禁止业务模块跨层反向依赖。
- 禁止在组件里硬编码设计 Token。
- 禁止把服务端状态放进全局 Store。
- 禁止生产环境危险操作绕过确认。
- 禁止展示 Secret 明文。
- 禁止生产数据库直接查询入口。
- 禁止只做成功态,不做失败态和空状态。
- 禁止没有审计记录的发布、重启、回滚。
27. 第一版推荐任务拆分
基础工程
- 初始化 Vite + React + TypeScript。
- 配置 ESLint、Prettier、Vitest。
- 配置路由和 Query Provider。
- 建立
src分层目录。 - 建立全局样式 Token。
UI 基础
- Button。
- IconButton。
- StatusBadge。
- GlassSurface。
- Table。
- Select。
- Tabs。
- Drawer。
- Dialog。
- Toast。
- EmptyState。
业务闭环
- Mock 数据。
- 总览页。
- 微服务页。
- 服务详情页。
- 发布抽屉。
- 重启确认。
- 发布记录页。
- 数据资源页。
- 日志与事件页。
- 权限与审计页。
验收
- 单元测试。
- 发布流程集成测试。
- 重启流程集成测试。
- Playwright 核心路径。
- 构建验证。
- 视觉检查。