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,170 @@
|
|
|
1
|
+
# 前端分区 — 状态管理方式
|
|
2
|
+
|
|
3
|
+
## 当前方案
|
|
4
|
+
|
|
5
|
+
本项目采用 **Pinia** 作为主要状态管理方案(Vue 官方推荐)。
|
|
6
|
+
|
|
7
|
+
### 为什么选择 Pinia
|
|
8
|
+
|
|
9
|
+
| 对比项 | Vuex 4 | Pinia | 选择原因 |
|
|
10
|
+
|--------|-------|-------|----------|
|
|
11
|
+
| 样板代码 | 多 (mutations/actions) | 极少(无 mutation) | 减少样板代码 |
|
|
12
|
+
| Bundle Size | ~5KB (gzip) | ~1KB (gzip) | 更小的包体积 |
|
|
13
|
+
| TypeScript 支持 | 需要额外装饰器 | 原生推断优秀 | 类型推断更自然 |
|
|
14
|
+
| DevTools | Vue DevTools 原生集成 | Vue DevTools 原生集成 | 足够用 |
|
|
15
|
+
| 学习曲线 | 较陡 | 平极低(与 Composition API 一致) | 降低上手门槛 |
|
|
16
|
+
| Vue3 组合式友好度 | ★★ | ★★★★★ | 与 `<script setup>` 风格一致 |
|
|
17
|
+
|
|
18
|
+
## Store 结构
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
stores/
|
|
22
|
+
├── modules/
|
|
23
|
+
│ ├── useAuthStore.ts # 认证状态(token, user info)
|
|
24
|
+
│ ├── useUIStore.ts # UI 状态(sidebar, theme, modals)
|
|
25
|
+
│ └── useUserStore.ts # 用户相关缓存
|
|
26
|
+
├── index.ts # Pinia 实例创建与统一导出
|
|
27
|
+
└── types.ts # Store 类型定义
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Store 编写规范
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// stores/modules/useAuthStore.ts
|
|
34
|
+
import { defineStore } from 'pinia';
|
|
35
|
+
import type { User } from '@/types/user';
|
|
36
|
+
import { authService } from '@/api/auth';
|
|
37
|
+
|
|
38
|
+
interface AuthState {
|
|
39
|
+
user: User | null;
|
|
40
|
+
token: string | null;
|
|
41
|
+
isAuthenticated: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const useAuthStore = defineStore('auth', {
|
|
45
|
+
state: (): AuthState => ({
|
|
46
|
+
user: null,
|
|
47
|
+
token: '',
|
|
48
|
+
isAuthenticated: false,
|
|
49
|
+
}),
|
|
50
|
+
|
|
51
|
+
getters: {
|
|
52
|
+
isLoggedIn: (state): boolean => !!state.token && !!state.user,
|
|
53
|
+
userName: (state): string => state.user?.name ?? '匿名用户',
|
|
54
|
+
userRoles: (state): string[] => state.user?.roles ?? [],
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
actions: {
|
|
58
|
+
async login(credentials: LoginCredentials) {
|
|
59
|
+
const result = await authService.login(credentials);
|
|
60
|
+
this.token = result.accessToken;
|
|
61
|
+
this.user = result.user;
|
|
62
|
+
this.isAuthenticated = true;
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
logout() {
|
|
66
|
+
this.$reset(); // Pinia 内置重置方法
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
updateUser(data: Partial<User>) {
|
|
70
|
+
if (this.user) {
|
|
71
|
+
Object.assign(this.user, data);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 数据获取策略
|
|
79
|
+
|
|
80
|
+
### 服务端状态管理 — Pinia + Composable 封装
|
|
81
|
+
|
|
82
|
+
Vue3 项目使用 **Pinia Store** 管理服务端状态,配合 **Composable** 封装数据获取逻辑:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
// composables/useUserList.ts
|
|
86
|
+
import { useAuthStore } from '@/stores/modules/useAuthStore';
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 用户列表 Composable
|
|
90
|
+
* 封装列表查询、分页、刷新等逻辑
|
|
91
|
+
*/
|
|
92
|
+
export function useUserList(params?: Ref<UserListParams>) {
|
|
93
|
+
const authStore = useAuthStore();
|
|
94
|
+
|
|
95
|
+
// 响应式数据
|
|
96
|
+
const loading = ref(false);
|
|
97
|
+
const error = ref<Error | null>(null);
|
|
98
|
+
|
|
99
|
+
// 使用 computed 自动追踪参数变化
|
|
100
|
+
const listParams = params || ref({ page: 1, pageSize: 20 });
|
|
101
|
+
|
|
102
|
+
const { data: userList, refresh } = useFetch('/api/v1/users', {
|
|
103
|
+
queryParams: listParams,
|
|
104
|
+
immediate: true,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const pagination = computed(() => ({
|
|
108
|
+
page: listParams.value.page,
|
|
109
|
+
pageSize: listParams.value.pageSize,
|
|
110
|
+
total: userList.value?.total ?? 0,
|
|
111
|
+
}));
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
userList: computed(() => userList.value?.list ?? []),
|
|
115
|
+
pagination,
|
|
116
|
+
loading,
|
|
117
|
+
error,
|
|
118
|
+
refresh,
|
|
119
|
+
changePage: (page: number) => { listParams.value.page = page; },
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Query Key 设计规范(Pinia Store 模块化)
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
// 标准:按业务域拆分 Store
|
|
128
|
+
stores/
|
|
129
|
+
├── modules/
|
|
130
|
+
│ ├── useUserStore.ts # 用户域
|
|
131
|
+
│ ├── useOrderStore.ts # 订单域
|
|
132
|
+
│ ├── useProductStore.ts # 商品域
|
|
133
|
+
│ └── useNotificationStore.ts # 通知域
|
|
134
|
+
|
|
135
|
+
// 层级关系:
|
|
136
|
+
// useUserStore → 管理用户相关所有状态(列表/详情/权限)
|
|
137
|
+
// useOrderStore → 管理订单相关所有状态(列表/详情/统计)
|
|
138
|
+
|
|
139
|
+
// 跨 Store 依赖:
|
|
140
|
+
// useOrderStore 可以调用 useUserStore 的 getter 获取用户信息
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 缓存策略
|
|
144
|
+
|
|
145
|
+
| 数据类型 | 缓存方式 | 过期策略 | 示例 |
|
|
146
|
+
|---------|---------|---------|------|
|
|
147
|
+
| 用户基本信息 | Pinia State + persist 插件 | 登录时刷新 / 手动 invalidate | 用户名、头像、角色 |
|
|
148
|
+
| 字典/枚举数据 | Pinia State + staleTime | 应用生命周期内有效(不频繁变化) | 性别选项、订单状态码 |
|
|
149
|
+
| 列表数据 | Composable (useFetch) | 组件卸载时释放 / 下拉刷新 | 订单列表、消息列表 |
|
|
150
|
+
| 表单临时状态 | `ref()` / `reactive()` 组件内 | 组件销毁即清除 | 表单输入、弹窗开关 |
|
|
151
|
+
|
|
152
|
+
## 状态流转图
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
┌─────────────┐ API 调用 ┌─────────────────┐ 写入 ┌──────────────┐
|
|
156
|
+
│ Server State │ ◄──────── │ Pinia Store │ ──────► │ Server │
|
|
157
|
+
│ (Pinia) │ 缓存 │ (defineStore) │ │ API │
|
|
158
|
+
└─────────────┘ └─────────────────┘ └──────────────┘
|
|
159
|
+
▲ │
|
|
160
|
+
│ 读取 │ action
|
|
161
|
+
┌──────┴──────┐ ▼
|
|
162
|
+
│ Component │ ┌─────────────────┐
|
|
163
|
+
│ (Vue3 SFC) │ ─────────► │ Local State │
|
|
164
|
+
└─────────────┘ 直接访问 │ (ref/reactive) │
|
|
165
|
+
┌───┴─────────────────┴───┐
|
|
166
|
+
│ URL Route (vue-router) │
|
|
167
|
+
│ DOM Ref │
|
|
168
|
+
│ Local component state │
|
|
169
|
+
└─────────────────────────┘
|
|
170
|
+
```
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# 前端分区 — 目录结构与路由约定
|
|
2
|
+
|
|
3
|
+
## 目录结构详情
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
src/
|
|
7
|
+
├── app/ # Next.js App Router(页面与布局)
|
|
8
|
+
│ ├── layout.tsx # 根布局(Header/Footer/Provider)
|
|
9
|
+
│ ├── page.tsx # 首页 (/)
|
|
10
|
+
│ ├── loading.tsx # 全局 Loading 态
|
|
11
|
+
│ ├── error.tsx # 全局错误边界
|
|
12
|
+
│ ├── not-found.tsx # 404 页面
|
|
13
|
+
│ │
|
|
14
|
+
│ ├── (auth)/ # 认证页面组(不含 Header)
|
|
15
|
+
│ │ ├── layout.tsx # Auth Layout(简洁版)
|
|
16
|
+
│ │ ├── login/page.tsx # 登录页 (/login)
|
|
17
|
+
│ │ ├── register/page.tsx # 注册页 (/register)
|
|
18
|
+
│ │ └── forgot-password/page.tsx # 忘记密码 (/forgot-password)
|
|
19
|
+
│ │
|
|
20
|
+
│ ├── (dashboard)/ # 看板页面组(含侧边栏)
|
|
21
|
+
│ │ ├── layout.tsx # Dashboard Layout
|
|
22
|
+
│ │ ├── page.tsx # 看板首页 (/dashboard)
|
|
23
|
+
│ │ ├── settings/page.tsx # 设置页 (/dashboard/settings)
|
|
24
|
+
│ │ └── profile/page.tsx # 个人资料 (/dashboard/profile)
|
|
25
|
+
│ │
|
|
26
|
+
│ └── api/ # API Routes
|
|
27
|
+
│ ├── auth/
|
|
28
|
+
│ │ └── [...nextauth]/route.ts # NextAuth 处理
|
|
29
|
+
│ ├── users/route.ts # 用户 API
|
|
30
|
+
│ └── [feature]/route.ts # 功能 API
|
|
31
|
+
│
|
|
32
|
+
├── components/
|
|
33
|
+
│ ├── ui/ # [通用 UI 组件](./components.md)
|
|
34
|
+
│ │ ├── button/
|
|
35
|
+
│ │ ├── input/
|
|
36
|
+
│ │ ├── modal/
|
|
37
|
+
│ │ ├── table/
|
|
38
|
+
│ │ └── index.ts # 统一导出
|
|
39
|
+
│ │
|
|
40
|
+
│ ├── features/ # [业务功能组件](./components.md)
|
|
41
|
+
│ │ ├── user-card/
|
|
42
|
+
│ │ ├── data-chart/
|
|
43
|
+
│ │ └── ...
|
|
44
|
+
│ │
|
|
45
|
+
│ └── layouts/ # 布局组件
|
|
46
|
+
│ ├── MainLayout.tsx
|
|
47
|
+
│ ├── AuthLayout.tsx
|
|
48
|
+
│ └── DashboardLayout.tsx
|
|
49
|
+
│
|
|
50
|
+
├── lib/ # 库级配置
|
|
51
|
+
│ ├── api-client.ts # [API 调用客户端](./api-integration.md)
|
|
52
|
+
│ ├── auth.ts # 认证工具
|
|
53
|
+
│ └── utils.ts # 通用工具函数
|
|
54
|
+
│
|
|
55
|
+
├── hooks/ # 自定义 Hooks
|
|
56
|
+
│ ├── use-auth.ts # 认证 Hook
|
|
57
|
+
│ ├── use-api.ts # API 请求 Hook
|
|
58
|
+
│ └── use-debounce.ts # 防抖 Hook
|
|
59
|
+
│
|
|
60
|
+
└── types/ # TypeScript 类型定义
|
|
61
|
+
├── user.ts
|
|
62
|
+
├── api.ts
|
|
63
|
+
└── index.ts
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 路由约定
|
|
67
|
+
|
|
68
|
+
### URL 格式规范
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
# 页面路由
|
|
72
|
+
/login → 登录
|
|
73
|
+
/dashboard → 看板首页
|
|
74
|
+
/dashboard/settings/:tab → 设置(带 Tab 参数)
|
|
75
|
+
/users/[id] → 用户详情(动态路由)
|
|
76
|
+
/users/[id]/edit → 编辑用户
|
|
77
|
+
|
|
78
|
+
# API 路由
|
|
79
|
+
/api/v1/users → 用户列表 (GET) / 创建用户 (POST)
|
|
80
|
+
/api/v1/users/:id → 用户详情 (GET) / 更新 (PUT) / 删除 (DELETE)
|
|
81
|
+
|
|
82
|
+
# 路径命名规则
|
|
83
|
+
- 使用 kebab-case: /user-profile, /order-history
|
|
84
|
+
- 动态参数使用方括号: /[id], /:slug
|
|
85
|
+
- 可选搜索参数用 ? 分隔: /orders?status=pending&page=1
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 路由分组规则
|
|
89
|
+
|
|
90
|
+
| 分组名 | 路由前缀 | 共享布局 | 特征 |
|
|
91
|
+
|--------|----------|----------|------|
|
|
92
|
+
| `(auth)` | `/login`, `/register`, ... | AuthLayout | 无导航栏,居中表单 |
|
|
93
|
+
| `(dashboard)` | `/dashboard/*` | DashboardLayout | 含侧边栏,需认证 |
|
|
94
|
+
| `(public)` | `/`, `/about`, ... | MainLayout | 公开访问,含导航栏 |
|
|
95
|
+
| `(admin)` | `/admin/*` | AdminLayout | 管理后台,需管理员权限 |
|
|
96
|
+
|
|
97
|
+
### 中间件顺序
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
请求进入 → i18n 检测 → 认证检查 → 权限校验 → 数据预取 → 页面渲染
|
|
101
|
+
↓ 不通过
|
|
102
|
+
重定向到登录/403
|
|
103
|
+
```
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# dev-map — 项目开发导航地图
|
|
2
|
+
|
|
3
|
+
> **维护原则:谁改代码谁更新地图。** 地图过期会导致 AI 引用错误信息,影响整体开发效率。
|
|
4
|
+
> **最后更新**: 2026-05-21 (对齐 java-backend.md + frontend-vue3.md 规则)
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 一句话描述
|
|
9
|
+
|
|
10
|
+
{项目名称} 是一个面向 {目标用户} 的 **Vue3 + Spring Boot(MyBatis-Plus)** 全栈应用,提供 {核心价值主张}。
|
|
11
|
+
|
|
12
|
+
## 技术栈速查
|
|
13
|
+
|
|
14
|
+
### 前端层
|
|
15
|
+
|
|
16
|
+
| 层 | 技术 | 版本 | 用途 |
|
|
17
|
+
|----|------|------|------|
|
|
18
|
+
| UI 框架 | Vue 3 + Composition API | ^3.4.x | 响应式渲染(强制 `<script setup>`) |
|
|
19
|
+
| 构建工具 | Vite | ^5.x | 开发服务器 / 打包 |
|
|
20
|
+
| 状态管理 | Pinia | ^2.x | 跨组件状态(官方推荐) |
|
|
21
|
+
| UI 组件库 | Element Plus | ^2.x | 企业级 UI 组件 |
|
|
22
|
+
| CSS 方案 | SCSS (scoped) | - | 样式系统 |
|
|
23
|
+
| HTTP 客户端 | Axios | ^1.x | API 调用(拦截器封装) |
|
|
24
|
+
| 路由管理 | Vue Router | ^4.x | 页面路由(懒加载) |
|
|
25
|
+
| 测试框架 | Vitest | ^1.x | 单元测试 |
|
|
26
|
+
| 包管理器 | pnpm | 9.x | 依赖管理 |
|
|
27
|
+
|
|
28
|
+
### 后端层 (Java — com.jieshun)
|
|
29
|
+
|
|
30
|
+
| 层 | 技术 | 版本 | 用途 |
|
|
31
|
+
|----|------|------|------|
|
|
32
|
+
| 运行时 | JDK (Virtual Threads) | 21 | Java 环境,虚拟线程并发 |
|
|
33
|
+
| 框架 | Spring Boot | 3.2.x | 服务端框架 |
|
|
34
|
+
| ORM / 数据访问 | **MyBatis-Plus** | 3.5.x | SQL 映射(Mapper 接口 + XML)|
|
|
35
|
+
| 数据库 | MySQL | 8.0+ | 主数据存储(utf8mb4)|
|
|
36
|
+
| 缓存 | Redis + Redisson | 5.x / 6.x | 缓存(仅缓存用途)/ 分布式锁 |
|
|
37
|
+
| 配置中心 / 注册中心 | **Nacos** | 2.x | 动态配置拉取 / 服务发现 |
|
|
38
|
+
| 认证 | JWT + Opaque Refresh Token | - | 身份验证 (Spring Security) |
|
|
39
|
+
| API 文档 | **Knife4j (Swagger/OpenAPI 3)** | - | 接口文档自动生成(@Tag/@Operation)|
|
|
40
|
+
| 工具简化 | Lombok | 1.18.x | @Data/@RequiredArgsConstructor 等 |
|
|
41
|
+
| 工具库 | Hutool | 5.x | 通用工具(按需引入)|
|
|
42
|
+
| 加密 | 国密 SM4 + bcrypt | - | 敏感数据加密 / 密码哈希 |
|
|
43
|
+
| 容器测试 | Testcontainers | - | MySQL/Redis 集成测试隔离 |
|
|
44
|
+
|
|
45
|
+
### 质量保障工具链
|
|
46
|
+
|
|
47
|
+
| 维度 | 工具 | 说明 |
|
|
48
|
+
|------|------|------|
|
|
49
|
+
| 单元测试 | JUnit 5 + Mockito 5 | Java 测试框架 + Mock |
|
|
50
|
+
| 覆盖率 | JaCoCo | Maven 插件集成,0% 文件告警,行覆盖率 ≥80% |
|
|
51
|
+
| 代码风格 | Checkstyle 10.x | Google/Sun 规则集(checkstyle.xml)|
|
|
52
|
+
| 复杂度扫描 | PMD 7.x | 圈复杂度 / 代码异味(pmd-ruleset.xml)|
|
|
53
|
+
| Bug 模式检测 | SpotBugs 4.8+ | NPE / 资源泄漏等 Bug 模式 |
|
|
54
|
+
| 持续质检 | SonarQube 9.9+ LTS | Quality Gate 阻断 + 技术债追踪 |
|
|
55
|
+
| API 测试 | REST Assured 5.x | DSL 风格接口测试(MockMvc 对接)|
|
|
56
|
+
| 服务端 Mock | WireMock 3.x | 下游依赖 Stub / 契约测试基础 |
|
|
57
|
+
| 分页插件 | MyBatis-Plus PageHelper | 分页拦截器自动追加 LIMIT |
|
|
58
|
+
| 前端 Lint | ESLint + Prettier | TS / 代码格式检查 |
|
|
59
|
+
| 前端构建 | TypeScript (tsc) | 类型严格检查(strict mode)|
|
|
60
|
+
|
|
61
|
+
### 基础设施
|
|
62
|
+
|
|
63
|
+
| 层 | 技术 | 用途 |
|
|
64
|
+
|----|------|------|
|
|
65
|
+
| CI/CD | Jenkins (Maven Pipeline) | 自动化构建部署 |
|
|
66
|
+
| 容器化 | Docker + Docker Compose | 本地开发(MySQL + Redis + App)|
|
|
67
|
+
| 编排 | Kubernetes (可选) | 生产环境运行时 |
|
|
68
|
+
| 制品库 | Nexus / Artifactory | Maven 依赖代理 |
|
|
69
|
+
|
|
70
|
+
## 目录结构概览
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
project-root/ # 项目根目录
|
|
74
|
+
│
|
|
75
|
+
├── backend/ # ══════ Java 后端微服务 ══════
|
|
76
|
+
│ ├── pom.xml # 父 POM(统一依赖版本管理)
|
|
77
|
+
│ │
|
|
78
|
+
│ ├── app/ # 启动入口模块
|
|
79
|
+
│ │ ├── pom.xml
|
|
80
|
+
│ │ └── src/main/java/com/jieshun/app/
|
|
81
|
+
│ │ ├── JscicdApplication.java # @SpringBootApplication
|
|
82
|
+
│ │ └── config/ # 启动级配置(WebMvcConfig 等)
|
|
83
|
+
│ │
|
|
84
|
+
│ ├── domain/ # 业务核心模块(最重)
|
|
85
|
+
│ │ ├── pom.xml
|
|
86
|
+
│ │ └── src/main/java/com/jieshun/domain/
|
|
87
|
+
│ │ ├── controller/ # Controller 层(只做路由+校验+权限)
|
|
88
|
+
│ │ │ ├── admin/ # 后台管理 Controller
|
|
89
|
+
│ │ │ │ └── UserController.java
|
|
90
|
+
│ │ │ └── app/ # 用户侧 Controller(C 端)
|
|
91
|
+
│ │ │ └── AppUserController.java
|
|
92
|
+
│ │ ├── service/ # Service 层(业务编排)
|
|
93
|
+
│ │ │ ├── UserService.java # 接口定义
|
|
94
|
+
│ │ │ └── impl/ # 实现类子包(禁止放接口)
|
|
95
|
+
│ │ │ └── UserServiceImpl.java
|
|
96
|
+
│ │ ├── mapper/ # Mapper 层(纯接口,SQL 在 XML)
|
|
97
|
+
│ │ │ ├── UserMapper.java # 不继承 BaseMapper
|
|
98
|
+
│ │ │ └── xml/ # MyBatis XML 映射文件
|
|
99
|
+
│ │ │ └── UserMapper.xml
|
|
100
|
+
│ │ ├── data/ # 数据对象层
|
|
101
|
+
│ │ │ ├── entity/ # DO(@TableName 映射)
|
|
102
|
+
│ │ │ │ └── UserDO.java
|
|
103
|
+
│ │ │ ├── vo/ # 视图对象
|
|
104
|
+
│ │ │ │ ├── UserRespVO.java # 响应对象(脱敏后返回前端)
|
|
105
|
+
│ │ │ │ └── UserCreateReqVO.java # 请求对象(JSR303 校验)
|
|
106
|
+
│ │ │ └── dto/ # 数据传输对象(跨层传递)
|
|
107
|
+
│ │ │ └── UserDTO.java
|
|
108
|
+
│ │ └── enums/ # 枚举定义
|
|
109
|
+
│ │ └── UserStatusEnum.java
|
|
110
|
+
│ │
|
|
111
|
+
│ ├── integration/ # 第三方集成模块
|
|
112
|
+
│ │ ├── pom.xml
|
|
113
|
+
│ │ └── src/main/java/com/jieshun/integration/
|
|
114
|
+
│ │ ├── client/ # 外部 API 客户端
|
|
115
|
+
│ │ │ └── sms/SmsClient.java
|
|
116
|
+
│ │ └── mq/ # 消息队列
|
|
117
|
+
│ │ └── producer/MqProducer.java
|
|
118
|
+
│ │
|
|
119
|
+
│ ├── common/ # 公共工具模块
|
|
120
|
+
│ │ ├── pom.xml
|
|
121
|
+
│ │ └── src/main/java/com/jieshun/common/
|
|
122
|
+
│ │ ├── constant/ # 常量
|
|
123
|
+
│ │ │ ├── ErrorCodeConstants.java # 错误码枚举(7 个段)
|
|
124
|
+
│ │ │ └── RedisKeyConstants.java # Redis Key + TTL 定义
|
|
125
|
+
│ │ ├── exception/ # 异常定义
|
|
126
|
+
│ │ │ └── JscicdBizException.java # 业务异常基类
|
|
127
|
+
│ │ ├── util/ # 工具类
|
|
128
|
+
│ │ └── enums/ # 通用枚举
|
|
129
|
+
│ │
|
|
130
|
+
│ ├── src/test/java/ # 单元测试 / 集成测试(JaCoCo 收集)
|
|
131
|
+
│ └── src/main/resources/ # 全局资源
|
|
132
|
+
│ ├── bootstrap.yml # 本地最小配置(仅 Nacos 地址)
|
|
133
|
+
│ ├── application.yml # 主配置
|
|
134
|
+
│ └── mapper/ # MyBatis XML
|
|
135
|
+
│ └── user/UserMapper.xml
|
|
136
|
+
│
|
|
137
|
+
├── frontend/ # ══════ Vue3 前端项目 ══════
|
|
138
|
+
│ ├── package.json
|
|
139
|
+
│ ├── vite.config.ts
|
|
140
|
+
│ ├── tsconfig.json
|
|
141
|
+
│ ├── index.html
|
|
142
|
+
│ │
|
|
143
|
+
│ └── src/
|
|
144
|
+
│ ├── api/ # API 接口封装层
|
|
145
|
+
│ │ ├── client.ts # Axios 实例(拦截器/Token注入/统一错误处理)
|
|
146
|
+
│ │ ├── modules/ # 按业务模块拆分的 API 调用
|
|
147
|
+
│ │ │ └── user.ts # UserAPI = { page(), create(), ... }
|
|
148
|
+
│ │ └── types/ # API TS 类型定义
|
|
149
|
+
│ │ └── user.d.ts # ReqVO / RespVO 类型
|
|
150
|
+
│ │
|
|
151
|
+
│ ├── assets/ # 静态资源
|
|
152
|
+
│ │ ├── styles/ # 全局样式(variables.css / reset.css / global.css)
|
|
153
|
+
│ │ └── images/ # 图片资源
|
|
154
|
+
│ │
|
|
155
|
+
│ ├── components/ # 可复用组件
|
|
156
|
+
│ │ ├── ui/ # 通用 UI 组件(无业务逻辑)
|
|
157
|
+
│ │ │ ├── Button/Button.vue
|
|
158
|
+
│ │ │ └── Modal/
|
|
159
|
+
│ │ └── business/ # 业务组件(含业务逻辑)
|
|
160
|
+
│ │ └── UserProfileCard/
|
|
161
|
+
│ │
|
|
162
|
+
│ ├── pages/ # 页面级组件(路由对应,懒加载)
|
|
163
|
+
│ │ ├── user/
|
|
164
|
+
│ │ │ ├── UserList.vue # 列表页
|
|
165
|
+
│ │ │ ├── UserDetail.vue # 详情页
|
|
166
|
+
│ │ │ └── UserCreate.vue # 创建/编辑页
|
|
167
|
+
│ │ └── dashboard/
|
|
168
|
+
│ │
|
|
169
|
+
│ ├── router/ # 路由配置
|
|
170
|
+
│ │ ├── index.ts # 路由实例 + 首屏
|
|
171
|
+
│ │ ├── routes/ # 按模块拆分的路由定义
|
|
172
|
+
│ │ │ ├── user.ts
|
|
173
|
+
│ │ │ └── dashboard.ts
|
|
174
|
+
│ │ └── guards/ # 导航守卫(权限校验/登录拦截)
|
|
175
|
+
│ │ └── auth.ts
|
|
176
|
+
│ │
|
|
177
|
+
│ ├── store/ # Pinia Store
|
|
178
|
+
│ │ ├── index.ts # Store 入口
|
|
179
|
+
│ │ └── modules/ # 按业务模块拆分
|
|
180
|
+
│ │ ├── user.ts # useUserStore
|
|
181
|
+
│ │ └── app.ts # useAppStore
|
|
182
|
+
│ │
|
|
183
|
+
│ ├── types/ # 全局共享 TS 类型
|
|
184
|
+
│ │ ├── user.d.ts
|
|
185
|
+
│ │ ├── api.d.ts
|
|
186
|
+
│ │ └── env.d.ts
|
|
187
|
+
│ │
|
|
188
|
+
│ ├── utils/ # 工具函数
|
|
189
|
+
│ │ ├── format.ts
|
|
190
|
+
│ │ ├── request.ts
|
|
191
|
+
│ │ └── storage.ts
|
|
192
|
+
│ │
|
|
193
|
+
│ ├── composables/ # 组合式函数(Vue3 Hooks)
|
|
194
|
+
│ │ ├── useAuth.ts
|
|
195
|
+
│ │ ├── usePagination.ts
|
|
196
|
+
│ │ └── usePermission.ts
|
|
197
|
+
│ │
|
|
198
|
+
│ ├── layouts/ # 布局组件
|
|
199
|
+
│ │ ├── DefaultLayout.vue # 默认布局(Header + Sidebar + Content)
|
|
200
|
+
│ │ └── BlankLayout.vue # 空白布局(登录页等)
|
|
201
|
+
│ │
|
|
202
|
+
│ └── App.vue # 根组件
|
|
203
|
+
│
|
|
204
|
+
├── checkstyle.xml # Checkstyle 规则集
|
|
205
|
+
├── pmd-ruleset.xml # PMD 规则集
|
|
206
|
+
│
|
|
207
|
+
├── .harness/ # ══════ Harness Engineering 规范体系 ══════
|
|
208
|
+
│ ├── gate/checks/ # 门禁(路由器 + build-gates-frontend.js + build-gates-java.js)
|
|
209
|
+
│ ├── skills/ # 技能文档(build/test-unit/lint-check/test-api/test-e2e 双章节)
|
|
210
|
+
│ ├── workflow/definition.yaml # 工作流定义(条件引用 java-build | vue-frontend-build)
|
|
211
|
+
│ ├── mcp/config.yaml # MCP 工具注册(SonarQube/Maven/Jenkins)
|
|
212
|
+
│ ├── agents/ # Agent 契约(输出含 .java / *Test.java)
|
|
213
|
+
│ ├── rules/project/ # 项目规则集
|
|
214
|
+
│ │ ├── java-backend.md # 后端规范(四层架构/Mapper/XML/SM4/Nacos/VT)
|
|
215
|
+
│ │ └── frontend-vue3.md # 前端规范(Composition API/Pinia/Element Plus/TS)
|
|
216
|
+
│ └── dev-map/ # 本文档所在位置
|
|
217
|
+
│
|
|
218
|
+
├── docker-compose.yml # 本地开发容器编排(MySQL 8 + Redis + App Server)
|
|
219
|
+
├── tests/ # E2E / 手动测试用例
|
|
220
|
+
└── files/ # 外部参考文档源
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
> **后端基础包名**: `com.jieshun`(禁止 `com.jscicd` 或 `com.example`)
|
|
224
|
+
> **后端依赖方向**: controller → service → mapper → database(禁止反向/跨层跳跃)
|
|
225
|
+
> **前端强制要求**: Composition API `<script setup lang="ts">`,禁止 Options API
|
|
226
|
+
|
|
227
|
+
## 功能域落点表
|
|
228
|
+
|
|
229
|
+
| 功能域 | 前端页面目录 | 后端模块路径 | 说明 |
|
|
230
|
+
|--------|-------------|------------|------|
|
|
231
|
+
| 用户管理 | `frontend/src/pages/user/` | `backend/domain/controller/app/` + `service/user/` | 注册 / 登录 / 个人信息 |
|
|
232
|
+
| 用户管理(后台) | `frontend/src/pages/admin/user/` | `backend/domain/controller/admin/user/` | 后台用户 CRUD / 分页 |
|
|
233
|
+
| 认证授权 | `frontend/src/pages/auth/` | `backend/domain/security/` + `integration/client/sms/` | JWT 双 Token / 短验证码 / OAuth |
|
|
234
|
+
| 核心业务 A | `frontend/src/pages/{domain-a}/` | `backend/domain/service/{domainA}/` + `mapper/{domainA}/` | 待填充 |
|
|
235
|
+
| 核心业务 B | `frontend/src/pages/{domain-b}/` | `backend/domain/service/{domainB}/` + `mapper/{domainB}/` | 待填充 |
|
|
236
|
+
| 系统管理 | `frontend/src/pages/admin/` | `backend/domain/controller/admin/` + `common/enums/` | 后台管理 / 字典 / 角色 |
|
|
237
|
+
| 公共基础 | `frontend/src/components/ui/` | `backend/common/(constant/exception/util)` | 通用组件 / 错误码 / 异常 / 工具 |
|
|
238
|
+
|
|
239
|
+
## 各分区入口指引
|
|
240
|
+
|
|
241
|
+
| 分区 | 文件路径 | 内容概要 |
|
|
242
|
+
|------|----------|----------|
|
|
243
|
+
| 🖥️ 前端分区 | [frontend/](./frontend/) | 目录结构、组件规范、状态管理(Pinia)、编码惯例([conventions.md](./frontend/conventions.md))、Vite配置、Element Plus用法 |
|
|
244
|
+
| 🔧 后端分区 (Java) | [backend/](./backend/) | Maven 四层模块(app/domain/integration/common)、MyBatis-Plus Mapper+XML、REST API 规范(@Tag/@Operation)、安全机制(SM4/脱敏)、Nacos 配置、JDK21 虚拟线程、Java 编码惯例([conventions-java.md](./backend/conventions-java.md)) |
|
|
245
|
+
| 🏗️ 基础设施分区 | [infra/](./infra/) | CI/CD (Jenkins Maven Pipeline)、Docker Compose、环境变量、监控 |
|
|
246
|
+
| 📝 决策记录 | [decisions.md](./decisions.md) | 技术决策 ADR(含双技术栈架构/Gate分流/Workflow去路由/Java工具链选型/Pinia选型等)|
|
|
247
|
+
|
|
248
|
+
### Harness 流程规范索引
|
|
249
|
+
|
|
250
|
+
| 规范层级 | 入口 | 与本项目的对应关系 |
|
|
251
|
+
|---------|------|-------------------|
|
|
252
|
+
| ⚡ Gate 门禁 | `.harness/gate/checks/` | 自动检测 pom.xml→Java门禁(build-gates-java.js: mvn compile/test/checkstyle/spotbugs/jacoco) / package.json→前端门禁(build-gates-frontend.js: tsc/npm/eslint/audit) |
|
|
253
|
+
| 📘 Skills 技能 | `.harness/skills/` | test-unit(JUnit5+Mockito+JaCoCo)/lint-check(Checkstyle+PMD+SpotBugs+SonarQube)/test-api(REST Assured+WireMock)/test-e2e(Testcontainers+Spring Profiles) 均含 Java 章节;build 已废弃→分流到 java-build / vue-frontend-build |
|
|
254
|
+
| 🔄 Workflow | `.harness/workflow/definition.yaml` | 条件引用 `java-build \| vue-frontend-build`;output_formats 含 .java;rules 引用 java-backend.md + frontend-vue3.md |
|
|
255
|
+
| 🤖 Agents | `.harness/agents/` | Developer contract 输出格式含 .java / *Test.java;编码流程含双技术栈说明;质量要求双列(前端标准/后端Java标准)|
|
|
256
|
+
| 🔌 MCP 工具 | `.harness/mcp/config.yaml` | 注册 SonarQube(metrics/quality_gate)、Maven(dependency_info/central_search)、Jenkins(maven_job_status) 工具定义 |
|
|
257
|
+
| 📋 Rules | `.harness/rules/project/` | **java-backend.md**(四层架构/9种类后缀/Mapper纯接口/SM4加密/Nacos/VT/22项审查清单) + **frontend-vue3.md**(Composition API强制/Pinia/Element Plus/TS类型安全/7项禁止清单) 双规则集 |
|
|
258
|
+
|
|
259
|
+
## 维护纪律
|
|
260
|
+
|
|
261
|
+
1. **新增功能域** → 更新「功能域落点表」+ 对应分区文档
|
|
262
|
+
2. **修改目录结构** → 同步更新「目录结构概览」和对应分区文档
|
|
263
|
+
3. **技术选型变更** → 在 decisions.md 中记录 ADR
|
|
264
|
+
4. **新增 Maven 插件** → 同步更新「质量保障工具链」表 + skills 相关章节
|
|
265
|
+
5. **Gate/Skill 变更** → 同步更新「Harness 流程规范索引」表
|
|
266
|
+
6. **每次版本发布** → 检查所有文档是否与代码一致
|
|
267
|
+
7. **Rules 规则修订** → 同步刷新 tech stack 表和目录结构中对应的描述
|