jsharness 1.0.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/.harness/README.md +199 -0
- package/.harness/agents/code-reviewer/contract.yaml +64 -0
- package/.harness/agents/developer/contract.yaml +72 -0
- package/.harness/agents/gate-controller/contract.yaml +64 -0
- package/.harness/agents/project-manager/contract.yaml +77 -0
- package/.harness/agents/prompt-templates.md +352 -0
- package/.harness/agents/requirements-analyst/contract.yaml +64 -0
- package/.harness/agents/solution-designer/contract.yaml +75 -0
- package/.harness/agents/tester/contract.yaml +92 -0
- package/.harness/config/models.yaml +67 -0
- package/.harness/dev-map/backend/api-definition.md +131 -0
- package/.harness/dev-map/backend/auth-security.md +131 -0
- package/.harness/dev-map/backend/conventions-java.md +471 -0
- package/.harness/dev-map/backend/conventions.md +192 -0
- package/.harness/dev-map/backend/database.md +106 -0
- package/.harness/dev-map/backend/structure.md +140 -0
- package/.harness/dev-map/decisions.md +275 -0
- package/.harness/dev-map/frontend/api-integration.md +139 -0
- package/.harness/dev-map/frontend/components.md +178 -0
- package/.harness/dev-map/frontend/conventions.md +416 -0
- package/.harness/dev-map/frontend/state-management.md +170 -0
- package/.harness/dev-map/frontend/structure.md +103 -0
- package/.harness/dev-map/overview.md +267 -0
- package/.harness/docs/integration-test-plan.md +248 -0
- package/.harness/docs/team-guidelines/README.md +161 -0
- package/.harness/docs/team-guidelines/arch-team.md +811 -0
- package/.harness/docs/team-guidelines/collaboration.md +556 -0
- package/.harness/docs/team-guidelines/pm-team.md +337 -0
- package/.harness/docs/team-guidelines/qa-team.md +562 -0
- package/.harness/docs/team-guidelines/rd-team.md +714 -0
- package/.harness/docs/training-materials.md +280 -0
- package/.harness/gate/baseline.js +220 -0
- package/.harness/gate/checks/build-gates-frontend.js +152 -0
- package/.harness/gate/checks/build-gates-java.js +155 -0
- package/.harness/gate/checks/build-gates.js +119 -0
- package/.harness/gate/checks/engineering-consistency.js +138 -0
- package/.harness/gate/checks/security-quality.js +129 -0
- package/.harness/gate/checks/static-compliance.js +313 -0
- package/.harness/gate/checks/test-compliance.js +114 -0
- package/.harness/gate/index.js +315 -0
- package/.harness/mcp/config.yaml +435 -0
- package/.harness/rules/global/coding-standard.md +232 -0
- package/.harness/rules/global/commit-convention.md +165 -0
- package/.harness/rules/global/process-discipline.md +192 -0
- package/.harness/rules/global/security-baseline.md +306 -0
- package/.harness/rules/project/frontend-vue3.md +293 -0
- package/.harness/rules/project/java-backend.md +460 -0
- package/.harness/rules/project/web-specific.md +231 -0
- package/.harness/skills/build.md +192 -0
- package/.harness/skills/code-review.md +251 -0
- package/.harness/skills/docker-build.md +227 -0
- package/.harness/skills/docs-update.md +164 -0
- package/.harness/skills/java-build.md +261 -0
- package/.harness/skills/lint-check.md +482 -0
- package/.harness/skills/task-board-maintenance.md +105 -0
- package/.harness/skills/test-api.md +461 -0
- package/.harness/skills/test-e2e.md +431 -0
- package/.harness/skills/test-unit.md +649 -0
- package/.harness/skills/vue-frontend-build.md +344 -0
- package/.harness/specs/quality-feedback/implementation-guide.md +350 -0
- package/.harness/task-board.md +121 -0
- package/.harness/workflow/definition.yaml +504 -0
- package/.harness/workflow/validate.js +320 -0
- package/.harness/workflow/variants.yaml +253 -0
- package/README.md +237 -0
- package/bin/jsharness.js +53 -0
- package/lib/index.mjs +778 -0
- package/package.json +1 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# 后端分区 — API 设计规范
|
|
2
|
+
|
|
3
|
+
## RESTful API 设计原则
|
|
4
|
+
|
|
5
|
+
### URL 设计
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
# 基础路径
|
|
9
|
+
/api/v1/{resource}
|
|
10
|
+
|
|
11
|
+
# 资源命名:名词复数
|
|
12
|
+
GET /api/v1/users # 用户列表
|
|
13
|
+
GET /api/v1/users/:id # 单个用户
|
|
14
|
+
POST /api/v1/users # 创建用户
|
|
15
|
+
PUT /api/v1/users/:id # 全量更新
|
|
16
|
+
PATCH /api/v1/users/:id # 部分更新
|
|
17
|
+
DELETE /api/v1/users/:id # 删除用户
|
|
18
|
+
|
|
19
|
+
# 子资源
|
|
20
|
+
GET /api/v1/users/:id/orders # 用户的订单列表
|
|
21
|
+
|
|
22
|
+
# 动作(非 CRUD 操作用动词)
|
|
23
|
+
POST /api/v1/users/:id/activate # 激活用户
|
|
24
|
+
POST /api/v1/orders/:id/cancel # 取消订单
|
|
25
|
+
POST /api/v1/auth/refresh # 刷新 Token
|
|
26
|
+
|
|
27
|
+
# 过滤/排序/分页
|
|
28
|
+
GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 统一响应格式
|
|
32
|
+
|
|
33
|
+
#### 成功响应
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"code": 0,
|
|
38
|
+
"data": { ... },
|
|
39
|
+
"message": "success",
|
|
40
|
+
"timestamp": 1700000000000
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
#### 列表响应(含分页)
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"code": 0,
|
|
49
|
+
"data": {
|
|
50
|
+
"items": [ ... ],
|
|
51
|
+
"pagination": {
|
|
52
|
+
"page": 1,
|
|
53
|
+
"pageSize": 20,
|
|
54
|
+
"total": 150,
|
|
55
|
+
"totalPages": 8
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"message": "success",
|
|
59
|
+
"timestamp": 1700000000000
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
#### 错误响应
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"code": 20001,
|
|
68
|
+
"message": "参数校验失败",
|
|
69
|
+
"details": [
|
|
70
|
+
{
|
|
71
|
+
"field": "email",
|
|
72
|
+
"message": "邮箱格式无效",
|
|
73
|
+
"code": "INVALID_EMAIL"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"timestamp": 1700000000000
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### HTTP 状态码使用
|
|
81
|
+
|
|
82
|
+
| 场景 | Status Code | 说明 |
|
|
83
|
+
|------|-------------|------|
|
|
84
|
+
| 成功 GET | 200 | 正常返回 |
|
|
85
|
+
| 成功创建 | 201 | Created(返回新资源的 Location header)|
|
|
86
|
+
| 成功删除 | 204 | No Content |
|
|
87
|
+
| 参数错误 | 400 | Bad Request(附详细错误信息)|
|
|
88
|
+
| 未认证 | 401 | Unauthorized(Token 缺失或过期)|
|
|
89
|
+
| 无权限 | 403 | Forbidden(已认证但权限不足)|
|
|
90
|
+
| 资源不存在 | 404 | Not Found |
|
|
91
|
+
| 方法不允许 | 405 | Method Not Allowed |
|
|
92
|
+
| 冲突 | 409 | Conflict(如唯一键冲突)|
|
|
93
|
+
| 未验证 | 422 | Unprocessable Entity(校验失败)|
|
|
94
|
+
| 太多请求 | 429 | Too Many Requests(限流)|
|
|
95
|
+
| 服务器错误 | 500 | Internal Server Error |
|
|
96
|
+
| 未实现 | 501 | Not Implemented |
|
|
97
|
+
|
|
98
|
+
### 分页标准参数
|
|
99
|
+
|
|
100
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
101
|
+
|------|------|--------|------|
|
|
102
|
+
| `page` | integer | 1 | 页码(从 1 开始)|
|
|
103
|
+
| `pageSize` | integer | 20 | 每页数量(最大 100)|
|
|
104
|
+
| `sort` | string | `-createdAt` | 排序字段(`-` 表示降序)|
|
|
105
|
+
|
|
106
|
+
### 过滤参数
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
GET /api/v1/users?role=admin&status=active&q=keyword&createdAfter=2026-01-01
|
|
110
|
+
|
|
111
|
+
常用过滤参数:
|
|
112
|
+
- q / keyword 关键词搜索
|
|
113
|
+
- status 状态过滤
|
|
114
|
+
- {fieldName} 字段精确匹配
|
|
115
|
+
- {fieldFrom}/{fieldTo} 范围查询
|
|
116
|
+
- createdAfter/Before 时间范围
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## API 版本控制
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
URL 版本化策略:
|
|
123
|
+
/api/v1/... → 当前稳定版本
|
|
124
|
+
/api/v2/... → 未来新版本
|
|
125
|
+
|
|
126
|
+
兼容性承诺:
|
|
127
|
+
- v1 API 至少维护 2 个大版本周期
|
|
128
|
+
- 新增字段不影响旧版 client
|
|
129
|
+
- 废弃接口在 Response Header 中标注 Deprecated
|
|
130
|
+
- 移除接口至少提前 30 天通知
|
|
131
|
+
```
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# 后端分区 — 认证与安全机制
|
|
2
|
+
|
|
3
|
+
## 认证方案:JWT 双 Token 机制
|
|
4
|
+
|
|
5
|
+
### Token 结构
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌─────────────────────────────────────────────────┐
|
|
9
|
+
│ Access Token │
|
|
10
|
+
│ 类型: JWT (HS256) │
|
|
11
|
+
│ 有效期: 15 分钟 │
|
|
12
|
+
│ Payload: { sub, role, iat, exp, jti } │
|
|
13
|
+
│ 存储: 内存 (前端) / Cookie HttpOnly (可选) │
|
|
14
|
+
└─────────────────────────────────────────────────┘
|
|
15
|
+
+
|
|
16
|
+
│ (access_token 过期时使用)
|
|
17
|
+
▼
|
|
18
|
+
┌─────────────────────────────────────────────────┐
|
|
19
|
+
│ Refresh Token │
|
|
20
|
+
│ 类型: Opaque Random String (64 bytes) │
|
|
21
|
+
│ 有效期: 7 天 │
|
|
22
|
+
│ 存储: DB sessions 表 + HttpOnly Secure Cookie │
|
|
23
|
+
│ 用途: 获取新的 Access Token │
|
|
24
|
+
│ 轮转: 每次使用后生成新的 Refresh Token │
|
|
25
|
+
└─────────────────────────────────────────────────┘
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 认证流程
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
1. 登录
|
|
32
|
+
POST /api/v1/auth/login
|
|
33
|
+
→ { access_token, refresh_token (HttpOnly cookie), expires_in }
|
|
34
|
+
|
|
35
|
+
2. 正常请求
|
|
36
|
+
GET /api/v1/profile
|
|
37
|
+
Header: Authorization: Bearer <access_token>
|
|
38
|
+
|
|
39
|
+
3. Access Token 过期
|
|
40
|
+
GET /api/v1/profile → 401 Unauthorized
|
|
41
|
+
|
|
42
|
+
4. 自动刷新
|
|
43
|
+
POST /api/v1/auth/refresh
|
|
44
|
+
Body: { refresh_token } 或从 Cookie 读取
|
|
45
|
+
→ { new_access_token, new_refresh_token }
|
|
46
|
+
|
|
47
|
+
5. 重新发起请求
|
|
48
|
+
GET /api/v1/profile
|
|
49
|
+
Header: Authorization: Bearer <new_access_token>
|
|
50
|
+
→ 200 OK
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 授权机制:RBAC(基于角色的访问控制)
|
|
54
|
+
|
|
55
|
+
### 角色定义
|
|
56
|
+
|
|
57
|
+
| 角色 | 权限范围 | 典型用户 |
|
|
58
|
+
|------|----------|----------|
|
|
59
|
+
| `super_admin` | 全部权限 | 系统管理员 |
|
|
60
|
+
| `admin` | 管理后台全部 | 业务管理员 |
|
|
61
|
+
| `editor` | 内容增删改 | 内容运营 |
|
|
62
|
+
| `viewer` | 只读访问 | 只读用户 |
|
|
63
|
+
| `user` | 自身数据的读写 | 普通注册用户 |
|
|
64
|
+
|
|
65
|
+
### 权限守卫实现
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
@UseGuards(JwtAuthGuard)
|
|
69
|
+
@Roles(Role.ADMIN, Role.EDITOR)
|
|
70
|
+
@Controller('admin/posts')
|
|
71
|
+
export class AdminPostController {
|
|
72
|
+
// 只有 admin 和 editor 才能访问
|
|
73
|
+
@Post()
|
|
74
|
+
createPost() {}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@Roles(Role.ADMIN) // 只有 admin
|
|
78
|
+
@Delete(':id')
|
|
79
|
+
deletePost() {}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 权限矩阵
|
|
83
|
+
|
|
84
|
+
| 资源/操作 | super_admin | admin | editor | viewer | user |
|
|
85
|
+
|-----------|:-----------:|:-----:|:------:|:------:|:----:|
|
|
86
|
+
| 用户管理 CRUD | ✅ | ✅ | ❌ | ❌ | 自身 |
|
|
87
|
+
| 内容发布 | ✅ | ✅ | ✅ | ❌ | ❌ |
|
|
88
|
+
| 内容编辑 | ✅ | ✅ | 自身 | ❌ | ❌ |
|
|
89
|
+
| 内容删除 | ✅ | ✅ | ❌ | ❌ | ❌ |
|
|
90
|
+
| 数据查看 | ✅ | ✅ | ✅ | ✅ | 自身 |
|
|
91
|
+
| 系统配置 | ✅ | ❌ | ❌ | ❌ | ❌ |
|
|
92
|
+
|
|
93
|
+
## 安全中间件链
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
请求进入
|
|
97
|
+
│
|
|
98
|
+
├── Helmet (安全头设置)
|
|
99
|
+
│ ├── X-Frame-Options: DENY
|
|
100
|
+
│ ├── X-Content-Type-Options: nosniff
|
|
101
|
+
│ └── X-XSS-Protection: 1; mode=block
|
|
102
|
+
│
|
|
103
|
+
├── Rate Limiter (速率限制)
|
|
104
|
+
│ ├── 全局: 100 req/min
|
|
105
|
+
│ ├── 登录: 5 req/min (同一 IP)
|
|
106
|
+
│ └── API: 60 req/min (同一用户)
|
|
107
|
+
│
|
|
108
|
+
├── CORS (跨域控制)
|
|
109
|
+
│ ├── Allow-Origin: [白名单]
|
|
110
|
+
│ ├── Allow-Methods: GET,POST,PUT,DELETE
|
|
111
|
+
│ └── Credentials: true
|
|
112
|
+
│
|
|
113
|
+
├── JwtAuthGuard (JWT 认证)
|
|
114
|
+
│ ├── 白名单路径跳过: /health, /public/*
|
|
115
|
+
│ └── 提取 payload → 注入 request.user
|
|
116
|
+
│
|
|
117
|
+
└── RolesGuard (角色鉴权)
|
|
118
|
+
├── 检查用户角色是否匹配 @Roles()
|
|
119
|
+
└── 不匹配 → 403 Forbidden
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## 安全 Checklist
|
|
123
|
+
|
|
124
|
+
- [ ] 所有敏感接口都有认证保护
|
|
125
|
+
- [ ] Password 使用 bcrypt (cost ≥ 12) 哈希存储
|
|
126
|
+
- [ ] Refresh Token 支持吊销(logout 时失效)
|
|
127
|
+
- [ ] 登录限制:连续 5 次失败锁定 15 分钟
|
|
128
|
+
- [ ] CSRF Token 保护写操作(如果使用 Cookie)
|
|
129
|
+
- [ ] SQL 注入防护:全部参数化查询
|
|
130
|
+
- [ ] XSS 防护:输出转义、CSP 策略
|
|
131
|
+
- [ ] 日志脱敏:不记录 password/token 等敏感字段
|