@chenmk/superflow 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INSTALL.en.md +106 -0
- package/INSTALL.md +664 -0
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/README.zh-CN.md +117 -0
- package/assets/context-templates/business-rules.md +98 -0
- package/assets/context-templates/decisions.md +153 -0
- package/assets/context-templates/external-systems.md +166 -0
- package/assets/context-templates/incidents.md +89 -0
- package/assets/manifest.json +53 -0
- package/assets/prompts/superflow-archive.md +9 -0
- package/assets/prompts/superflow-clarify.md +10 -0
- package/assets/prompts/superflow-design.md +10 -0
- package/assets/prompts/superflow-docs.md +10 -0
- package/assets/prompts/superflow-implement.md +10 -0
- package/assets/prompts/superflow-pipeline.md +13 -0
- package/assets/prompts/superflow-verify.md +10 -0
- package/assets/rules/superflow-phase-guard.md +50 -0
- package/assets/scripts/claude-auto-backup-hook.sh +313 -0
- package/assets/scripts/codex-auto-backup-hook.sh +361 -0
- package/assets/scripts/install-sql-pre-commit.sh +44 -0
- package/assets/scripts/superflow-contract-hooks.sh +744 -0
- package/assets/scripts/superflow-delivery-check.sh +315 -0
- package/assets/scripts/superflow-dependency-update-hook.sh +161 -0
- package/assets/scripts/superflow-enforce-hook.sh +70 -0
- package/assets/scripts/superflow-hook-guard.sh +132 -0
- package/assets/scripts/superflow-integration-evidence-hook.sh +80 -0
- package/assets/scripts/superflow-sql-sync-hook.py +950 -0
- package/assets/scripts/superflow-test-report-lint.py +433 -0
- package/assets/scripts/superflow-verify-integration.sh +90 -0
- package/assets/scripts/sync-settings-json.py +52 -0
- package/assets/skills/api-doc-changelog/SKILL.md +193 -0
- package/assets/skills/openspec-apply-change/SKILL.md +156 -0
- package/assets/skills/openspec-archive-change/SKILL.md +114 -0
- package/assets/skills/openspec-explore/SKILL.md +288 -0
- package/assets/skills/openspec-propose/SKILL.md +110 -0
- package/assets/skills/superflow-archive/SKILL.md +61 -0
- package/assets/skills/superflow-clarify/SKILL.md +146 -0
- package/assets/skills/superflow-clarify/agents/openai.yaml +4 -0
- package/assets/skills/superflow-design/SKILL.md +83 -0
- package/assets/skills/superflow-design/agents/openai.yaml +4 -0
- package/assets/skills/superflow-docs/SKILL.md +316 -0
- package/assets/skills/superflow-docs/agents/openai.yaml +4 -0
- package/assets/skills/superflow-hotfix/SKILL.md +48 -0
- package/assets/skills/superflow-implement/SKILL.md +461 -0
- package/assets/skills/superflow-implement/agents/openai.yaml +4 -0
- package/assets/skills/superflow-pipeline/SKILL.md +844 -0
- package/assets/skills/superflow-pipeline/agents/openai.yaml +4 -0
- package/assets/skills/superflow-pipeline/references/api-design-template.md +431 -0
- package/assets/skills/superflow-pipeline/references/architecture-design-template.md +119 -0
- package/assets/skills/superflow-pipeline/references/batch-prompt-template.md +536 -0
- package/assets/skills/superflow-pipeline/references/batch-split-guide.md +140 -0
- package/assets/skills/superflow-pipeline/references/decision-point.md +30 -0
- package/assets/skills/superflow-pipeline/references/dirty-worktree.md +35 -0
- package/assets/skills/superflow-pipeline/references/document-templates.md +123 -0
- package/assets/skills/superflow-pipeline/references/feature-gated-workflow.md +124 -0
- package/assets/skills/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
- package/assets/skills/superflow-pipeline/references/mock-strategy-guide.md +86 -0
- package/assets/skills/superflow-pipeline/references/openspec-format.md +57 -0
- package/assets/skills/superflow-pipeline/references/orchestration.md +639 -0
- package/assets/skills/superflow-pipeline/references/p0-baseline-template.md +174 -0
- package/assets/skills/superflow-pipeline/references/project-config.md +40 -0
- package/assets/skills/superflow-pipeline/references/prompt-usage-template.md +152 -0
- package/assets/skills/superflow-pipeline/references/quality-gate.md +299 -0
- package/assets/skills/superflow-pipeline/references/quality-standards.md +190 -0
- package/assets/skills/superflow-pipeline/references/reviewer-checklist.md +154 -0
- package/assets/skills/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
- package/assets/skills/superflow-pipeline/references/subagent-progress.md +90 -0
- package/assets/skills/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
- package/assets/skills/superflow-pipeline/references/test-execution-template.md +220 -0
- package/assets/skills/superflow-pipeline/references/test-guide.md +30 -0
- package/assets/skills/superflow-pipeline/references/traceability-matrix.md +106 -0
- package/assets/skills/superflow-pipeline/references/validation-integrity.md +134 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-archive.sh +178 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-env.sh +118 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +428 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-state.sh +574 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-status.sh +172 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
- package/assets/skills/superflow-table-impact-analysis/SKILL.md +77 -0
- package/assets/skills/superflow-tweak/SKILL.md +46 -0
- package/assets/skills/superflow-verify/SKILL.md +112 -0
- package/assets/skills-en/api-doc-changelog/SKILL.md +193 -0
- package/assets/skills-en/openspec-apply-change/SKILL.md +156 -0
- package/assets/skills-en/openspec-archive-change/SKILL.md +114 -0
- package/assets/skills-en/openspec-explore/SKILL.md +288 -0
- package/assets/skills-en/openspec-propose/SKILL.md +110 -0
- package/assets/skills-en/superflow-archive/SKILL.md +61 -0
- package/assets/skills-en/superflow-clarify/SKILL.md +146 -0
- package/assets/skills-en/superflow-clarify/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-design/SKILL.md +83 -0
- package/assets/skills-en/superflow-design/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-docs/SKILL.md +316 -0
- package/assets/skills-en/superflow-docs/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-hotfix/SKILL.md +48 -0
- package/assets/skills-en/superflow-implement/SKILL.md +461 -0
- package/assets/skills-en/superflow-implement/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-pipeline/SKILL.md +844 -0
- package/assets/skills-en/superflow-pipeline/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-pipeline/references/api-design-template.md +431 -0
- package/assets/skills-en/superflow-pipeline/references/architecture-design-template.md +119 -0
- package/assets/skills-en/superflow-pipeline/references/batch-prompt-template.md +536 -0
- package/assets/skills-en/superflow-pipeline/references/batch-split-guide.md +140 -0
- package/assets/skills-en/superflow-pipeline/references/decision-point.md +30 -0
- package/assets/skills-en/superflow-pipeline/references/dirty-worktree.md +35 -0
- package/assets/skills-en/superflow-pipeline/references/document-templates.md +123 -0
- package/assets/skills-en/superflow-pipeline/references/feature-gated-workflow.md +124 -0
- package/assets/skills-en/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
- package/assets/skills-en/superflow-pipeline/references/mock-strategy-guide.md +86 -0
- package/assets/skills-en/superflow-pipeline/references/openspec-format.md +57 -0
- package/assets/skills-en/superflow-pipeline/references/orchestration.md +639 -0
- package/assets/skills-en/superflow-pipeline/references/p0-baseline-template.md +174 -0
- package/assets/skills-en/superflow-pipeline/references/project-config.md +40 -0
- package/assets/skills-en/superflow-pipeline/references/prompt-usage-template.md +152 -0
- package/assets/skills-en/superflow-pipeline/references/quality-gate.md +299 -0
- package/assets/skills-en/superflow-pipeline/references/quality-standards.md +190 -0
- package/assets/skills-en/superflow-pipeline/references/reviewer-checklist.md +154 -0
- package/assets/skills-en/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
- package/assets/skills-en/superflow-pipeline/references/subagent-progress.md +90 -0
- package/assets/skills-en/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
- package/assets/skills-en/superflow-pipeline/references/test-execution-template.md +220 -0
- package/assets/skills-en/superflow-pipeline/references/test-guide.md +30 -0
- package/assets/skills-en/superflow-pipeline/references/traceability-matrix.md +106 -0
- package/assets/skills-en/superflow-pipeline/references/validation-integrity.md +134 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-archive.sh +178 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-env.sh +118 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +428 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-state.sh +574 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-status.sh +172 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
- package/assets/skills-en/superflow-table-impact-analysis/SKILL.md +77 -0
- package/assets/skills-en/superflow-tweak/SKILL.md +46 -0
- package/assets/skills-en/superflow-verify/SKILL.md +112 -0
- package/dist/cli/index.js +186 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/archive.js +6 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/clarify.js +6 -0
- package/dist/commands/clarify.js.map +1 -0
- package/dist/commands/design.js +6 -0
- package/dist/commands/design.js.map +1 -0
- package/dist/commands/docs.js +6 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/doctor.js +473 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/implement.js +6 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/init.js +471 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pipeline.js +6 -0
- package/dist/commands/pipeline.js.map +1 -0
- package/dist/commands/scan.js +59 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.js +173 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.js +213 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.js +187 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.js +6 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/assets.js +27 -0
- package/dist/core/assets.js.map +1 -0
- package/dist/core/context.js +100 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/dependencies.js +146 -0
- package/dist/core/dependencies.js.map +1 -0
- package/dist/core/detect.js +71 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/i18n.js +103 -0
- package/dist/core/i18n.js.map +1 -0
- package/dist/core/integrity.js +46 -0
- package/dist/core/integrity.js.map +1 -0
- package/dist/core/manifest.js +18 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/prompts.js +20 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/registry.js +134 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/rules.js +17 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/scripts.js +40 -0
- package/dist/core/scripts.js.map +1 -0
- package/dist/core/skill-check.js +31 -0
- package/dist/core/skill-check.js.map +1 -0
- package/dist/core/skills.js +56 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/state.js +43 -0
- package/dist/core/state.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/path.js +11 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/shell.js +29 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
# 接口设计文档模板
|
|
2
|
+
|
|
3
|
+
独立于 tests.md 的接口规格说明,用于完整描述每个接口的契约。
|
|
4
|
+
|
|
5
|
+
## API 先行硬规则
|
|
6
|
+
|
|
7
|
+
- 涉及前后端联调时,必须先输出粗接口草案给编程人员确认,再生成正式 `api.md`。
|
|
8
|
+
- 正式 `api.md` 必须在 `design.md`、`tasks.md`、`tests.md` 和实现 prompt 之前冻结。
|
|
9
|
+
- `design.md` 必须引用已冻结 `api.md` 的字段和错误语义,不得另起一套字段口径。
|
|
10
|
+
- 页面、原型和产品文字都没有,且编程人员未确认的字段,不得设为 API 必填项。
|
|
11
|
+
- 后端必需但前端不提交的字段,必须在字段映射中标记为"后端默认"或"后端推导"。
|
|
12
|
+
|
|
13
|
+
## 文档结构
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
# API 设计文档:<模块名称>
|
|
17
|
+
|
|
18
|
+
## 0. 变更概览(本次提测变更)
|
|
19
|
+
|
|
20
|
+
> **本节为提测变更增量视图,完整历史见第 8 节。变更标注规则详见 `api-doc-changelog` 技能。**
|
|
21
|
+
|
|
22
|
+
首次版本:
|
|
23
|
+
```markdown
|
|
24
|
+
## 0. 变更概览(本次提测变更)
|
|
25
|
+
|
|
26
|
+
> 首个版本,全部接口为新增。详见接口列表。
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
迭代版本(更新时必须填写):
|
|
30
|
+
```markdown
|
|
31
|
+
## 0. 变更概览(本次提测变更)
|
|
32
|
+
|
|
33
|
+
> 基线版本:v1.0 | 当前版本:v1.1 | 变更日期:2026-05-22
|
|
34
|
+
|
|
35
|
+
### 新增接口
|
|
36
|
+
|
|
37
|
+
| 接口 | 说明 |
|
|
38
|
+
|------|------|
|
|
39
|
+
| `POST /api/xxx` | 新增 xxx 功能 |
|
|
40
|
+
|
|
41
|
+
### 修改接口
|
|
42
|
+
|
|
43
|
+
| 接口 | 变更摘要 |
|
|
44
|
+
|------|----------|
|
|
45
|
+
| `GET /api/yyy` | 新增 query 参数 `keyword`;响应增加 `tag` 字段 |
|
|
46
|
+
|
|
47
|
+
### 废弃接口
|
|
48
|
+
|
|
49
|
+
| 接口 | 替代方案 | 移除计划 |
|
|
50
|
+
|------|----------|----------|
|
|
51
|
+
| `GET /api/old` | 使用 `GET /api/new` | v2.0 移除 |
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**变更标注规则:**
|
|
55
|
+
- 变更接口标题后加标签:`[新增]` / `[修改]` / `[废弃]`
|
|
56
|
+
- 变更字段说明列末尾加标注:`【本次新增】` / `【本次变更:具体改了什么】` / `【本次废弃】`
|
|
57
|
+
- 下一轮提测时清除上一轮所有标签和标注
|
|
58
|
+
- 详细规则参见 `api-doc-changelog` 技能
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 1. 通用约定
|
|
63
|
+
|
|
64
|
+
### 1.0 参数命名约束
|
|
65
|
+
- 在填写接口参数前,**必须先检查目标仓库现有 Controller、Query DTO、分页基类、历史 `api.md`**,复用已有命名。
|
|
66
|
+
- 不得因为新文档是 AI 生成就擅自切换参数口径,例如已有代码主流使用 `pageNo/pageSize` 时,不得写成 `pageNum/pageSize`。
|
|
67
|
+
- 分页、排序、筛选字段优先跟随现有代码模型命名,而不是套用通用模板名。
|
|
68
|
+
|
|
69
|
+
### 1.0.1 前端契约对账约束
|
|
70
|
+
- 涉及页面、弹窗、列表、下拉框或前端联调时,先列出原始需求/原型字段,再映射到 API 字段、DTO/VO 字段和数据库字段。
|
|
71
|
+
- 字段名不一致时必须写明兼容策略:后端兼容前端字段、前端改字段、或双字段过渡。
|
|
72
|
+
- 字段被合并表达时必须写明规则,例如前端 `{limitType} + {limitValue}` 如果映射为后端 `{businessLimit}`,必须说明每个哨兵值和正数值的业务含义。
|
|
73
|
+
- 下拉框必须有数据来源接口。若复用既有接口,必须写原路径、请求参数、响应字段和鉴权方式;若需要新增 facade,必须写新增路径。
|
|
74
|
+
- 页面、原型和产品文字都没有的字段,默认不得作为必填入参;若后端确实需要,必须写明由后端默认或后端推导。
|
|
75
|
+
|
|
76
|
+
### 1.1 基础信息
|
|
77
|
+
- **Base URL**: `http://{host}:{port}{context-path}`
|
|
78
|
+
- **Content-Type**: `application/json`
|
|
79
|
+
- **字符编码**: UTF-8
|
|
80
|
+
- **时间格式**: `yyyy-MM-dd HH:mm:ss`
|
|
81
|
+
|
|
82
|
+
### 1.2 认证方式
|
|
83
|
+
- [ ] JWT Bearer Token(Header: `Authorization: Bearer {token}`)
|
|
84
|
+
- [ ] HMAC-SHA256 签名(Headers: `X-Timestamp`, `X-Nonce`, `X-Sign`)
|
|
85
|
+
- [ ] API Key(Header: `X-Api-Key`)
|
|
86
|
+
- [ ] 其他:____
|
|
87
|
+
|
|
88
|
+
### 1.3 通用响应格式
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"code": 0,
|
|
93
|
+
"message": "success",
|
|
94
|
+
"data": {}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 1.4 全局错误码
|
|
99
|
+
|
|
100
|
+
| 错误码 | 说明 | HTTP 状态码 |
|
|
101
|
+
|--------|------|-------------|
|
|
102
|
+
| 0 | 成功 | 200 |
|
|
103
|
+
| 400 | 请求参数错误 | 400 |
|
|
104
|
+
| 401 | 未授权 | 401 |
|
|
105
|
+
| 403 | 禁止访问 | 403 |
|
|
106
|
+
| 404 | 资源不存在 | 404 |
|
|
107
|
+
| 500 | 服务器内部错误 | 500 |
|
|
108
|
+
| 1001 | 业务错误:____ | 200 |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 2. 接口列表
|
|
113
|
+
|
|
114
|
+
### 2.1 接口名称
|
|
115
|
+
|
|
116
|
+
#### 基本信息
|
|
117
|
+
- **接口路径**: `POST /api/v1/xxx`
|
|
118
|
+
- **接口说明**: ____
|
|
119
|
+
- **调用方**: [前端 / 移动端 / 第三方 / 内部服务]
|
|
120
|
+
- **是否需要认证**: [是 / 否]
|
|
121
|
+
|
|
122
|
+
#### 请求参数
|
|
123
|
+
|
|
124
|
+
**Path 参数**
|
|
125
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
126
|
+
|--------|------|------|------|
|
|
127
|
+
| id | Long | 是 | 资源 ID |
|
|
128
|
+
|
|
129
|
+
**Query 参数**
|
|
130
|
+
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
|
131
|
+
|--------|------|------|------|------|
|
|
132
|
+
| pageNo | Integer | 否 | 页码,默认 1;若仓库已有分页对象使用其他命名,则必须以源码为准 | 1 |
|
|
133
|
+
| pageSize | Integer | 否 | 每页大小,默认 20;若仓库已有分页对象使用其他命名,则必须以源码为准 | 20 |
|
|
134
|
+
|
|
135
|
+
**请求体(Body)**
|
|
136
|
+
```json
|
|
137
|
+
{
|
|
138
|
+
"field1": "string", // 必填,说明
|
|
139
|
+
"field2": 0, // 可选,说明,默认 0
|
|
140
|
+
"field3": ["item"] // 可选,数组说明
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
| 字段 | 类型 | 必填 | 说明 | 校验规则 |
|
|
145
|
+
|------|------|------|------|----------|
|
|
146
|
+
| field1 | String | 是 | ____ | 长度 1-64 |
|
|
147
|
+
| field2 | Integer | 否 | ____ | 范围 0-100 |
|
|
148
|
+
| field3 | Array | 否 | ____ | 元素个数 0-10 |
|
|
149
|
+
|
|
150
|
+
#### 字段映射与兼容
|
|
151
|
+
|
|
152
|
+
| 原型/前端字段 | API 字段 | DTO/VO 字段 | DB 字段 | 取值/枚举 | 来源 | 策略 |
|
|
153
|
+
|---|---|---|---|---|---|---|
|
|
154
|
+
| ____ | ____ | ____ | ____ | ____ | PRD / 原型 / 源码 / 后端推导 | 前端提交 / 后端默认 / 后端推导 / 后端兼容 / 前端改名 / 双字段过渡 / 废弃 |
|
|
155
|
+
|
|
156
|
+
#### 条件必填与互斥
|
|
157
|
+
|
|
158
|
+
| 条件 | 必填字段 | 必须为空字段 | 失败提示 |
|
|
159
|
+
|---|---|---|---|
|
|
160
|
+
| ____ | ____ | ____ | ____ |
|
|
161
|
+
|
|
162
|
+
#### 响应示例
|
|
163
|
+
|
|
164
|
+
**成功(code = 0)**
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"code": 0,
|
|
168
|
+
"message": "success",
|
|
169
|
+
"data": {
|
|
170
|
+
"id": 1,
|
|
171
|
+
"field1": "value",
|
|
172
|
+
"createdAt": "2026-05-09 10:00:00"
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**失败(code ≠ 0)**
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"code": 1001,
|
|
181
|
+
"message": "参数错误:field1 不能为空",
|
|
182
|
+
"data": null
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### 边界说明
|
|
187
|
+
- 字段为 null 时的处理:____
|
|
188
|
+
- 数组为空时的处理:____
|
|
189
|
+
- 并发调用时的限制:____
|
|
190
|
+
- 参数命名与现有源码差异:____(若无差异,明确写“无,沿用现有命名”)
|
|
191
|
+
- 前端兼容策略:____(如无兼容需求,明确写“无,前后端字段名一致”)
|
|
192
|
+
|
|
193
|
+
#### 联调验收 curl
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
curl -s -X POST "http://localhost:{port}{context-path}/api/..." \
|
|
197
|
+
-H "Content-Type: application/json" \
|
|
198
|
+
-H "token: $TOKEN" \
|
|
199
|
+
-d '{...}'
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
断言:
|
|
203
|
+
- `message.code` / `code`: ____
|
|
204
|
+
- `data` 关键字段:____
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 3. 前端真实动作矩阵(强制)
|
|
210
|
+
|
|
211
|
+
每个页面的按钮/入口必须拆解为具体接口。不得只写"导出""导入""查询"等笼统描述。
|
|
212
|
+
|
|
213
|
+
```markdown
|
|
214
|
+
### 动作矩阵
|
|
215
|
+
|
|
216
|
+
| # | 页面/按钮/入口 | Method | URL | Content-Type | 参数位置 | 成功响应形态 | 失败响应形态 | 前端成功判定字段 | 相关角色 | 是否需要外部依赖 |
|
|
217
|
+
|---|---|---|---|---|---|---|---|---|---|---|
|
|
218
|
+
| 1 | {页面}-{按钮} | POST | /api/v1/xxx | application/json | body | JSON: {code:0,data:{}} | JSON: {code:1001,message:""} | code === 0 | 超管/运营商/子账号 | 否 |
|
|
219
|
+
| 2 | {页面}-{导出按钮} | GET | /api/v1/xxx/export | - | query | 文件流(application/octet-stream) | JSON: {code:1001,message:""} | Content-Disposition 存在 | 超管/运营商 | 否 |
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
参数位置可选项:`path` / `query` / `body` / `form-data` / `file`
|
|
223
|
+
|
|
224
|
+
### 动作矩阵红线
|
|
225
|
+
|
|
226
|
+
- 每个前端按钮必须对应一个 Controller mapping,不得一个接口对应多个前端动作。
|
|
227
|
+
- 批量操作(如批量开通/续费/退费)必须为每个动作单独定义接口,不得合并。
|
|
228
|
+
- 模板下载是独立接口,不得复用导入接口。
|
|
229
|
+
- 前端成功判定字段必须写明:JSON 响应用 `code`,文件响应用 `Content-Disposition`。
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 4. 文件接口契约(强制,涉及导出/下载/上传时必须填写)
|
|
234
|
+
|
|
235
|
+
凡是文件导出、文件下载、模板下载、文件上传相关接口,必须在本节明确契约。
|
|
236
|
+
|
|
237
|
+
```markdown
|
|
238
|
+
### 文件接口契约
|
|
239
|
+
|
|
240
|
+
| # | 接口 | 类型 | 成功 Content-Type | Content-Disposition | 文件名规则 | 失败响应 | 前端如何判断成功 | 复用列表筛选 | 受分页影响 |
|
|
241
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
242
|
+
| 1 | GET /api/v1/xxx/export | 导出 | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | attachment; filename="{name}.xlsx" | {模块}_{日期}.xlsx | JSON: {code:1001,message:""} | 响应头含 Content-Disposition | 是 | 否 |
|
|
243
|
+
| 2 | GET /api/v1/xxx/template | 模板下载 | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | attachment; filename="template.xlsx" | {功能}_导入模板.xlsx | JSON: {code:1001,message:""} | 响应头含 Content-Disposition | 否 | 否 |
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### 文件接口红线
|
|
247
|
+
|
|
248
|
+
- 文件流接口成功时不得被统一 JSON 响应包装。Controller 方法必须直接操作 `HttpServletResponse`,不得返回 `Response<T>`。
|
|
249
|
+
- 成功时必须设置 `Content-Type` 和 `Content-Disposition` 响应头。
|
|
250
|
+
- 失败时才返回 JSON 格式的错误信息。
|
|
251
|
+
- 导出接口复用列表筛选条件时,不得受分页参数影响(应导出全部符合条件的记录)。
|
|
252
|
+
- tests.md 必须验证:响应头 Content-Type、Content-Disposition,文件体非空且可打开。
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 5. Excel 导入/导出契约(强制,涉及 Excel 导入时必须填写)
|
|
257
|
+
|
|
258
|
+
```markdown
|
|
259
|
+
### Excel 导入契约
|
|
260
|
+
|
|
261
|
+
#### 模板定义
|
|
262
|
+
|
|
263
|
+
| 列序号 | 列头名称 | 对应 DTO 字段 | 必填 | 允许为空 | 数据校验规则 | 说明 |
|
|
264
|
+
|---|---|---|---|---|---|---|
|
|
265
|
+
| 1 | 站点名称 | siteName | 是 | 否 | 长度 1-64 | |
|
|
266
|
+
| 2 | 生效日期 | effectiveDate | 是 | 否 | 日期格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss | 只有日期时补 00:00:00 |
|
|
267
|
+
| 3 | 业务名称 | recordName | 否 | 是 | 长度 0-64 | |
|
|
268
|
+
|
|
269
|
+
#### 导入响应
|
|
270
|
+
|
|
271
|
+
成功导入全部行:
|
|
272
|
+
```json
|
|
273
|
+
{
|
|
274
|
+
"code": 0,
|
|
275
|
+
"message": "success",
|
|
276
|
+
"data": {
|
|
277
|
+
"totalCount": 10,
|
|
278
|
+
"successCount": 10,
|
|
279
|
+
"failureCount": 0,
|
|
280
|
+
"failureRows": []
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
部分失败:
|
|
286
|
+
```json
|
|
287
|
+
{
|
|
288
|
+
"code": 1002,
|
|
289
|
+
"message": "部分数据导入失败",
|
|
290
|
+
"data": {
|
|
291
|
+
"totalCount": 10,
|
|
292
|
+
"successCount": 8,
|
|
293
|
+
"failureCount": 2,
|
|
294
|
+
"failureRows": [
|
|
295
|
+
{"row": 3, "reason": "站点不存在"},
|
|
296
|
+
{"row": 7, "reason": "日期格式错误"}
|
|
297
|
+
]
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
#### 导入规则
|
|
303
|
+
- failureCount > 0 时,业务 code 必须为非 0(前端通过 code !== 0 判断失败)。
|
|
304
|
+
- 单次导入上限:____ 行。
|
|
305
|
+
- 是否允许同一文件包含多业务类型/多站点/多对象:____。
|
|
306
|
+
- 日期格式必须兼容 yyyy-MM-dd 和 yyyy-MM-dd HH:mm:ss。
|
|
307
|
+
- 行级错误必须保留具体行号和原因。
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Excel 导入红线
|
|
311
|
+
|
|
312
|
+
- 模板下载 DTO 的 @ExcelProperty 列头必须与导入解析 DTO 的列头完全一致。
|
|
313
|
+
- failureCount > 0 时,禁止使用 `Response.ok(result)` 返回 code=0。
|
|
314
|
+
- 日期字段必须至少覆盖 `yyyy-MM-dd`(Excel 默认短日期)和 `yyyy-MM-dd HH:mm:ss`。
|
|
315
|
+
- tests.md 必须包含短日期和完整时间两种格式的测试用例。
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## 6. 数据权限(强制,访问业务数据的接口必须填写)
|
|
320
|
+
|
|
321
|
+
凡是分页、列表、详情、导出、编辑、删除等访问业务数据的接口,都必须先判断是否需要数据权限约束。
|
|
322
|
+
如果需要,必须识别并复用当前仓库已有的数据权限模型和成熟实现,不得凭字段名猜测权限边界。
|
|
323
|
+
如果不确定是否需要,必须在需求/SDD 阶段主动询问用户,未确认前不得进入实现。
|
|
324
|
+
|
|
325
|
+
### 6.1 每个接口的数据权限字段
|
|
326
|
+
|
|
327
|
+
每个访问业务数据的接口必须增加以下字段:
|
|
328
|
+
|
|
329
|
+
```markdown
|
|
330
|
+
**数据权限:**
|
|
331
|
+
- 是否访问业务数据:是/否
|
|
332
|
+
- 是否需要数据权限:需要/不需要/不确定
|
|
333
|
+
- 判断依据:(参考哪个已有接口或需求说明)
|
|
334
|
+
- 权限边界:(当前仓库实际模型,不写死字段名)
|
|
335
|
+
- 复用实现:(参考哪个已有接口、工具类、注解或 AOP)
|
|
336
|
+
- 超管/平台管理员行为:
|
|
337
|
+
- 普通管理员行为:
|
|
338
|
+
- 子账号/普通用户行为:
|
|
339
|
+
- 详情越权响应:(返回"无权限"还是"数据不存在")
|
|
340
|
+
- 导出是否复用列表权限:是/否
|
|
341
|
+
- 待确认问题:(如有)
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
已确认示例:
|
|
345
|
+
```markdown
|
|
346
|
+
**数据权限:**
|
|
347
|
+
- 是否访问业务数据:是
|
|
348
|
+
- 是否需要数据权限:需要
|
|
349
|
+
- 判断依据:参考现有订单列表接口的数据范围处理
|
|
350
|
+
- 权限边界:复用当前仓库已有的组织/租户/业务主体数据范围模型
|
|
351
|
+
- 复用实现:参考 `OrderController#page` 和 `DataScopeUtil`
|
|
352
|
+
- 超管行为:不追加业务主体过滤,但保留基础状态/删除过滤
|
|
353
|
+
- 普通管理员行为:只能查看所属业务主体范围内的数据
|
|
354
|
+
- 子账号行为:复用当前仓库子账号授权范围
|
|
355
|
+
- 详情越权响应:返回稳定业务错误,不泄露敏感数据
|
|
356
|
+
- 导出是否复用列表权限:是
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
不确定示例:
|
|
360
|
+
```markdown
|
|
361
|
+
**数据权限:**
|
|
362
|
+
- 是否访问业务数据:是
|
|
363
|
+
- 是否需要数据权限:不确定
|
|
364
|
+
- 不确定原因:PRD 未说明该列表是否按组织/商户/运营主体隔离
|
|
365
|
+
- 待确认问题:超管、普通管理员、子账号分别能看到哪些数据?
|
|
366
|
+
- 状态:阻塞实现
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### 6.2 数据权限红线
|
|
370
|
+
|
|
371
|
+
- 不得凭字段名猜测权限边界(如看到 operatorId 就假设是权限字段)。
|
|
372
|
+
- 不得临时发明一套和当前仓库其他接口不一致的数据过滤逻辑。
|
|
373
|
+
- 列表和导出必须使用同一数据权限口径,除非需求明确不同。
|
|
374
|
+
- 详情/编辑/删除必须防止越权访问,不能只靠前端隐藏按钮。
|
|
375
|
+
- 如果无法判断是否需要数据权限,停止实现,向用户确认。
|
|
376
|
+
|
|
377
|
+
### 6.3 不做数据权限的说明
|
|
378
|
+
|
|
379
|
+
如果某个接口不做数据权限,必须说明原因,例如:
|
|
380
|
+
- 公开字典/枚举/配置接口
|
|
381
|
+
- 无业务敏感数据
|
|
382
|
+
- 只返回当前用户上下文
|
|
383
|
+
- 已由统一注解/AOP/网关控制
|
|
384
|
+
- 需求明确要求全局可见
|
|
385
|
+
|
|
386
|
+
### 6.4 待确认问题格式
|
|
387
|
+
|
|
388
|
+
如果存在不确定项,必须列出并询问用户:
|
|
389
|
+
|
|
390
|
+
```markdown
|
|
391
|
+
## 数据权限待确认
|
|
392
|
+
|
|
393
|
+
接口:`GET /xxx/page`
|
|
394
|
+
当前判断:不确定
|
|
395
|
+
不确定原因:该接口访问业务数据,但需求未说明不同角色的数据范围。
|
|
396
|
+
|
|
397
|
+
请确认以下选项:
|
|
398
|
+
A. 超管看全量,普通管理员/子账号看所属范围
|
|
399
|
+
B. 所有角色都只看所属范围
|
|
400
|
+
C. 这是公共数据,不做数据权限
|
|
401
|
+
D. 复用某个已有接口的数据权限规则,请指定参考接口
|
|
402
|
+
|
|
403
|
+
确认前该接口不进入实现。
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## 7. 外部依赖契约(强制,涉及 SDK/第三方/RPC/MQ 时必须填写)
|
|
409
|
+
|
|
410
|
+
```markdown
|
|
411
|
+
### 外部依赖契约
|
|
412
|
+
|
|
413
|
+
| # | 依赖名称 | 类型 | SDK 版本 | 参数来源 | 字段含义 | 成功响应样例 | 失败响应样例 | 阻塞时的处理 |
|
|
414
|
+
|---|---|---|---|---|---|---|---|---|
|
|
415
|
+
| 1 | XX SDK | Java SDK | 1.2.3 | 页面表单提交 -> DTO -> SDK Request | appId: 应用ID | {"code":0,"data":{...}} | {"code":500,"message":"timeout"} | 记录阻塞证据,标记外部阻塞 |
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### 外部依赖红线
|
|
419
|
+
|
|
420
|
+
- SDK 参数来源必须写明,不得凭字段名猜测含义。
|
|
421
|
+
- SDK 版本变更必须记录原因和影响范围。
|
|
422
|
+
- 真实环境可用时,不得仅用 mock 代替。必须在 tests.md 记录真实请求/响应。
|
|
423
|
+
- 外部服务不可用时,只能标记为"外部阻塞"或"Mock 验证",不得宣称真实链路通过。
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## 8. 接口变更记录
|
|
428
|
+
|
|
429
|
+
| 版本 | 日期 | 变更内容 | 影响范围 |
|
|
430
|
+
|------|------|----------|----------|
|
|
431
|
+
| v1.0 | 2026-05-09 | 初始版本 | 全部 |
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# 架构设计文档模板(0→1 全新系统)
|
|
2
|
+
|
|
3
|
+
用于从零开始构建系统的顶层设计文档。增量变更(1→1.1)不需要此文档,使用 design.md 的变更矩阵即可。
|
|
4
|
+
|
|
5
|
+
## 文档结构
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
# 架构设计:<系统名称>
|
|
9
|
+
|
|
10
|
+
## 1. 项目背景与目标
|
|
11
|
+
|
|
12
|
+
- 业务场景描述
|
|
13
|
+
- 核心目标(1-3 句话)
|
|
14
|
+
- 非目标(明确不做的事)
|
|
15
|
+
|
|
16
|
+
## 2. 技术选型
|
|
17
|
+
|
|
18
|
+
| 层级 | 技术 | 版本 | 选型理由 |
|
|
19
|
+
|------|------|------|----------|
|
|
20
|
+
| 后端框架 | Spring Boot | 3.x | 项目技术栈 |
|
|
21
|
+
| ORM | MyBatis / MyBatis-Plus | - | 复杂 SQL 可控 |
|
|
22
|
+
| 数据库 | MySQL | 8.0 | 关系型数据,事务支持 |
|
|
23
|
+
| 缓存 | Redis / Caffeine | - | 按需选择 |
|
|
24
|
+
| 前端 | Vue 3 + Vite | - | 项目前端技术栈 |
|
|
25
|
+
| 构建工具 | Maven / Gradle | - | 按项目约定 |
|
|
26
|
+
| 容器化 | Docker | - | 部署标准化 |
|
|
27
|
+
|
|
28
|
+
## 3. 系统架构
|
|
29
|
+
|
|
30
|
+
### 3.1 整体架构图(文字描述)
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
[前端] → [Nginx] → [Spring Boot 应用] → [MySQL]
|
|
34
|
+
↓
|
|
35
|
+
[Redis/缓存]
|
|
36
|
+
↓
|
|
37
|
+
[外部服务/Mock]
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 3.2 模块划分
|
|
41
|
+
|
|
42
|
+
| 模块 | 职责 | 对应包路径 |
|
|
43
|
+
|------|------|-----------|
|
|
44
|
+
| controller | HTTP 接口暴露 | `com.example.module.controller` |
|
|
45
|
+
| service | 业务逻辑编排 | `com.example.module.service` |
|
|
46
|
+
| mapper/dao | 数据访问 | `com.example.module.mapper` |
|
|
47
|
+
| model/entity | 实体定义 | `com.example.module.model` |
|
|
48
|
+
| config | 配置类 | `com.example.module.config` |
|
|
49
|
+
| client | 外部服务调用 | `com.example.module.client` |
|
|
50
|
+
|
|
51
|
+
## 4. 数据模型
|
|
52
|
+
|
|
53
|
+
### 4.1 核心实体关系
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
User 1:N Order
|
|
57
|
+
Order 1:N OrderItem
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 4.2 核心表结构
|
|
61
|
+
|
|
62
|
+
| 表名 | 说明 | 核心字段 |
|
|
63
|
+
|------|------|----------|
|
|
64
|
+
| `tb_user` | 用户表 | id, username, status, created_at |
|
|
65
|
+
| `tb_order` | 订单表 | id, user_id, status, amount |
|
|
66
|
+
|
|
67
|
+
## 5. 接口概览
|
|
68
|
+
|
|
69
|
+
| 接口 | 方法 | 路径 | 说明 |
|
|
70
|
+
|------|------|------|------|
|
|
71
|
+
| 用户注册 | POST | /api/v1/users | 创建用户 |
|
|
72
|
+
| 用户登录 | POST | /api/v1/auth/login | 返回 JWT |
|
|
73
|
+
|
|
74
|
+
详见 [api-design-template.md](api-design-template.md) 编写完整接口文档。
|
|
75
|
+
|
|
76
|
+
## 6. Mock 策略
|
|
77
|
+
|
|
78
|
+
外部依赖清单及 Mock 方案:
|
|
79
|
+
|
|
80
|
+
| 外部依赖 | 实际能力 | Mock 方式 | 替代验证方式 |
|
|
81
|
+
|----------|----------|-----------|-------------|
|
|
82
|
+
| 支付网关 | 真实支付 | Spring MockBean | 固定返回 success |
|
|
83
|
+
| 短信服务 | 真实发送 | WireMock | 验证调用次数 |
|
|
84
|
+
| 设备回调 | 硬件触发 | 本地模拟 HTTP 服务 | 手动调接口模拟 |
|
|
85
|
+
|
|
86
|
+
详见 [mock-strategy-guide.md](mock-strategy-guide.md)。
|
|
87
|
+
|
|
88
|
+
## 7. 部署架构
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
开发环境:本地 IDEA + H2/MySQL
|
|
92
|
+
测试环境:Docker Compose(MySQL + Redis + App)
|
|
93
|
+
生产环境:K8s / 物理机
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Dockerfile 示例
|
|
97
|
+
|
|
98
|
+
```dockerfile
|
|
99
|
+
FROM eclipse-temurin:17-jdk-alpine
|
|
100
|
+
COPY target/*.jar app.jar
|
|
101
|
+
ENTRYPOINT ["java", "-jar", "/app.jar"]
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 8. 安全设计
|
|
105
|
+
|
|
106
|
+
- 认证:JWT Bearer Token
|
|
107
|
+
- 鉴权:RBAC 角色权限
|
|
108
|
+
- 敏感数据:密码 BCrypt 加密
|
|
109
|
+
- 接口安全:防重放(timestamp + nonce + sign)
|
|
110
|
+
|
|
111
|
+
## 9. 非功能性设计
|
|
112
|
+
|
|
113
|
+
| 维度 | 方案 |
|
|
114
|
+
|------|------|
|
|
115
|
+
| 性能 | 数据库索引、缓存、分页 |
|
|
116
|
+
| 并发 | 乐观锁 / 分布式锁 |
|
|
117
|
+
| 日志 | SLF4J + Logback,结构化日志 |
|
|
118
|
+
| 监控 | Actuator + 自定义指标 |
|
|
119
|
+
| 异常 | 全局异常处理器,统一错误码 |
|