ai-engineering-init 1.12.1 → 1.13.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/.claude/agents/auto-test-generator.md +315 -0
- package/.claude/commands/auto-test.md +252 -0
- package/.claude/hooks/skill-forced-eval.js +2 -0
- package/.claude/settings.json +7 -0
- package/.claude/skills/auto-test/SKILL.md +453 -0
- package/.claude/skills/auto-test/references/api-conventions.md +260 -0
- package/.claude/skills/lanhu-design/SKILL.md +99 -0
- package/.codex/skills/auto-test/SKILL.md +453 -0
- package/.codex/skills/auto-test/references/api-conventions.md +260 -0
- package/.codex/skills/lanhu-design/SKILL.md +99 -0
- package/.cursor/hooks/cursor-skill-eval.js +8 -0
- package/.cursor/rules/skill-activation.mdc +2 -0
- package/.cursor/skills/auto-test/SKILL.md +453 -0
- package/.cursor/skills/auto-test/references/api-conventions.md +260 -0
- package/.cursor/skills/lanhu-design/SKILL.md +99 -0
- package/AGENTS.md +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# 系统接口请求响应规范(详细参考)
|
|
2
|
+
|
|
3
|
+
> 本文件定义了 leniu 系统的标准接口契约。生成测试用例时**必须严格匹配**这些模式。
|
|
4
|
+
> 安装框架后可直接使用,无需额外学习。
|
|
5
|
+
|
|
6
|
+
## 统一请求格式
|
|
7
|
+
|
|
8
|
+
所有 POST 接口使用 `LeRequest<T>` 封装,业务参数放在 `content` 字段内:
|
|
9
|
+
|
|
10
|
+
```json
|
|
11
|
+
{
|
|
12
|
+
"content": { /* 业务参数 */ }
|
|
13
|
+
}
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 统一响应格式
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"code": 10000, // 业务码:10000=成功,其他=失败
|
|
21
|
+
"msg": "操作成功", // 提示信息
|
|
22
|
+
"data": ... // 业务数据(类型取决于接口)
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 接口类型与响应模式速查
|
|
27
|
+
|
|
28
|
+
根据 Controller 方法返回值类型,确定 data 的结构和对应断言:
|
|
29
|
+
|
|
30
|
+
| Controller 返回类型 | data 类型 | 示例 | Hurl 断言模板 |
|
|
31
|
+
|---------------------|----------|------|--------------|
|
|
32
|
+
| `Long` | 雪花 ID | `$.data` = 1234567890 | `jsonpath "$.data" isInteger` |
|
|
33
|
+
| `void` | null | `$.data` = null | `jsonpath "$.code" == 10000` |
|
|
34
|
+
| `XxxVO` | 对象 | `$.data.id`, `$.data.name` | `jsonpath "$.data.id" exists` |
|
|
35
|
+
| `PageVO<XxxVO>` | 分页对象 | `$.data.records[0]` | 见「标准分页」 |
|
|
36
|
+
| `ReportBaseTotalVO<XxxVO>` | 分页+合计 | `$.data.resultPage` + `$.data.totalLine` | 见「报表分页」 |
|
|
37
|
+
|
|
38
|
+
## 标准分页响应(PageVO)
|
|
39
|
+
|
|
40
|
+
**适用于**:设置类 CRUD 分页查询(如凭证类型、凭证字)
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"code": 10000,
|
|
45
|
+
"data": {
|
|
46
|
+
"records": [ { "id": 1, "name": "..." }, ... ],
|
|
47
|
+
"current": 1,
|
|
48
|
+
"size": 10,
|
|
49
|
+
"total": 25
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Hurl 断言模板**:
|
|
55
|
+
|
|
56
|
+
```hurl
|
|
57
|
+
HTTP 200
|
|
58
|
+
[Asserts]
|
|
59
|
+
jsonpath "$.code" == 10000
|
|
60
|
+
jsonpath "$.data.records" isCollection
|
|
61
|
+
jsonpath "$.data.current" exists
|
|
62
|
+
jsonpath "$.data.size" exists
|
|
63
|
+
jsonpath "$.data.total" exists
|
|
64
|
+
# VO 字段逐一验证
|
|
65
|
+
jsonpath "$.data.records[0].id" exists
|
|
66
|
+
jsonpath "$.data.records[0].typeName" isString
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 报表分页响应(ReportBaseTotalVO)
|
|
70
|
+
|
|
71
|
+
**适用于**:报表类分页查询(凭证列表、科目明细、科目汇总),响应包含 `resultPage`(分页数据)+ `totalLine`(合计行)
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"code": 10000,
|
|
76
|
+
"data": {
|
|
77
|
+
"resultPage": {
|
|
78
|
+
"records": [ { ... }, ... ],
|
|
79
|
+
"current": 1,
|
|
80
|
+
"size": 10,
|
|
81
|
+
"total": 25
|
|
82
|
+
},
|
|
83
|
+
"totalLine": {
|
|
84
|
+
"debitAmount": 1285100,
|
|
85
|
+
"creditAmount": 1285000
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Hurl 断言模板**:
|
|
92
|
+
|
|
93
|
+
```hurl
|
|
94
|
+
HTTP 200
|
|
95
|
+
[Asserts]
|
|
96
|
+
jsonpath "$.code" == 10000
|
|
97
|
+
# 分页结构
|
|
98
|
+
jsonpath "$.data.resultPage" exists
|
|
99
|
+
jsonpath "$.data.resultPage.records" isCollection
|
|
100
|
+
jsonpath "$.data.resultPage.current" exists
|
|
101
|
+
jsonpath "$.data.resultPage.size" exists
|
|
102
|
+
jsonpath "$.data.resultPage.total" exists
|
|
103
|
+
# VO 字段逐一验证(首条记录)
|
|
104
|
+
jsonpath "$.data.resultPage.records[0].voucherDate" isString
|
|
105
|
+
jsonpath "$.data.resultPage.records[0].areaName" isString
|
|
106
|
+
jsonpath "$.data.resultPage.records[0].costTypeName" isString # 关联字段不能为 null
|
|
107
|
+
# 合计行(只有数值字段和方向字段,其余为 null 占位)
|
|
108
|
+
jsonpath "$.data.totalLine" exists
|
|
109
|
+
jsonpath "$.data.totalLine.debitAmount" exists
|
|
110
|
+
jsonpath "$.data.totalLine.creditAmount" exists
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 各操作类型的请求与响应模式
|
|
114
|
+
|
|
115
|
+
### 1. 新增(save)→ 返回 Long ID
|
|
116
|
+
|
|
117
|
+
```hurl
|
|
118
|
+
# Controller: Long save(LeRequest<XxxSaveParam>)
|
|
119
|
+
POST {{base_url}}/report/finance/voucher/save
|
|
120
|
+
Content-Type: application/json
|
|
121
|
+
X-Token: {{x_token}}
|
|
122
|
+
merchant-id: {{merchant_id}}
|
|
123
|
+
Merchant-Id: {{merchant_id_auth}}
|
|
124
|
+
{
|
|
125
|
+
"content": {
|
|
126
|
+
"areaId": {{area_id}},
|
|
127
|
+
"name": "auto-test数据,可删除",
|
|
128
|
+
"entries": [ ... ]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
HTTP 200
|
|
133
|
+
[Asserts]
|
|
134
|
+
jsonpath "$.code" == 10000
|
|
135
|
+
[Captures]
|
|
136
|
+
created_id: jsonpath "$.data" # 捕获返回的 ID 供后续使用
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 2. 编辑(save 带 id / update)→ 返回 void
|
|
140
|
+
|
|
141
|
+
```hurl
|
|
142
|
+
# 方式一:save 带 id(delete-insert 模式,常用于主子表)
|
|
143
|
+
POST {{base_url}}/report/finance/voucher/save
|
|
144
|
+
{ "content": { "id": {{created_id}}, "name": "修改后", ... } }
|
|
145
|
+
|
|
146
|
+
# 方式二:独立 update 接口
|
|
147
|
+
POST {{base_url}}/report/finance/setting/voucher-type/update
|
|
148
|
+
{ "content": { "id": {{type_id}}, "typeName": "修改后" } }
|
|
149
|
+
|
|
150
|
+
HTTP 200
|
|
151
|
+
[Asserts]
|
|
152
|
+
jsonpath "$.code" == 10000
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 3. 查详情(detail)→ 返回 XxxVO 对象
|
|
156
|
+
|
|
157
|
+
```hurl
|
|
158
|
+
# Controller: XxxDetailVO detail(LeRequest<Long>)
|
|
159
|
+
# 注意:content 直接传 ID 值(Long),不需要包装对象
|
|
160
|
+
POST {{base_url}}/report/finance/voucher/detail
|
|
161
|
+
{ "content": {{created_id}} }
|
|
162
|
+
|
|
163
|
+
HTTP 200
|
|
164
|
+
[Asserts]
|
|
165
|
+
jsonpath "$.code" == 10000
|
|
166
|
+
jsonpath "$.data.id" exists
|
|
167
|
+
jsonpath "$.data.areaName" isString
|
|
168
|
+
jsonpath "$.data.entries" isCollection # 子表数据
|
|
169
|
+
jsonpath "$.data.entries" count == 2
|
|
170
|
+
jsonpath "$.data.entries[0].id" exists
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 4. 删除(delete)→ 返回 void
|
|
174
|
+
|
|
175
|
+
```hurl
|
|
176
|
+
# Controller: void delete(LeRequest<Long>)
|
|
177
|
+
# 注意:content 直接传 ID 值(Long)
|
|
178
|
+
POST {{base_url}}/report/finance/voucher/delete
|
|
179
|
+
{ "content": {{created_id}} }
|
|
180
|
+
|
|
181
|
+
HTTP 200
|
|
182
|
+
[Asserts]
|
|
183
|
+
jsonpath "$.code" == 10000
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 5. 提交/审批等状态变更 → 返回 void
|
|
187
|
+
|
|
188
|
+
```hurl
|
|
189
|
+
# Controller: void submit(LeRequest<Long>)
|
|
190
|
+
POST {{base_url}}/report/finance/voucher/submit
|
|
191
|
+
{ "content": {{created_id}} }
|
|
192
|
+
|
|
193
|
+
HTTP 200
|
|
194
|
+
[Asserts]
|
|
195
|
+
jsonpath "$.code" == 10000
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 6. 分页查询(page)→ 返回 PageVO 或 ReportBaseTotalVO
|
|
199
|
+
|
|
200
|
+
```hurl
|
|
201
|
+
# 标准分页(设置类)
|
|
202
|
+
POST {{base_url}}/report/finance/setting/voucher-type/page
|
|
203
|
+
{
|
|
204
|
+
"content": {
|
|
205
|
+
"page": { "current": 1, "size": 10 }
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
# 报表分页(含合计行)
|
|
210
|
+
POST {{base_url}}/report/finance/voucher/page
|
|
211
|
+
{
|
|
212
|
+
"content": {
|
|
213
|
+
"page": { "current": 1, "size": 10 },
|
|
214
|
+
"startDate": "2026-03-01",
|
|
215
|
+
"endDate": "2026-03-31"
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### 7. 导出(export)→ 返回 void(异步)
|
|
221
|
+
|
|
222
|
+
```hurl
|
|
223
|
+
# Controller: void export(LeRequest<XxxPageParam>)
|
|
224
|
+
# 异步导出,仅验证接口不报错
|
|
225
|
+
POST {{base_url}}/report/finance/voucher/export
|
|
226
|
+
{
|
|
227
|
+
"content": {
|
|
228
|
+
"page": { "current": 1, "size": 10 },
|
|
229
|
+
"startDate": "2026-03-01",
|
|
230
|
+
"endDate": "2026-03-31"
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
HTTP 200
|
|
235
|
+
[Asserts]
|
|
236
|
+
jsonpath "$.code" == 10000
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### 8. 未授权测试 → 预期 HTTP 401
|
|
240
|
+
|
|
241
|
+
```hurl
|
|
242
|
+
# 去掉 X-Token 请求头
|
|
243
|
+
POST {{base_url}}/report/finance/voucher/page
|
|
244
|
+
Content-Type: application/json
|
|
245
|
+
merchant-id: {{merchant_id}}
|
|
246
|
+
Merchant-Id: {{merchant_id_auth}}
|
|
247
|
+
{ "content": { "page": { "current": 1, "size": 10 } } }
|
|
248
|
+
|
|
249
|
+
HTTP 401
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## content 传值类型总结
|
|
253
|
+
|
|
254
|
+
| 场景 | content 类型 | 示例 |
|
|
255
|
+
|------|-------------|------|
|
|
256
|
+
| 分页查询 | 对象(含 page + 查询条件) | `{"page":{"current":1,"size":10},"keyword":"xxx"}` |
|
|
257
|
+
| 新增/编辑 | 对象(业务字段) | `{"name":"xxx","entries":[...]}` |
|
|
258
|
+
| 查详情/删除/提交 | **裸 Long** | `{{id}}` (不是 `{"id": {{id}}}`) |
|
|
259
|
+
|
|
260
|
+
> **关键区别**:detail/delete/submit 的 content 是**直接传 ID 值**,不需要包装成对象。这是最常见的错误。
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lanhu-design
|
|
3
|
+
description: |
|
|
4
|
+
蓝湖设计稿与 Axure 原型分析。通过 lanhu MCP Server 直接读取蓝湖项目的原型页面、设计图、切图资源。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 需要从蓝湖获取 Axure 原型页面进行需求分析
|
|
8
|
+
- 需要查看蓝湖 UI 设计图和设计参数
|
|
9
|
+
- 需要提取蓝湖设计稿中的切图资源
|
|
10
|
+
- 需要通过蓝湖团队留言板协作
|
|
11
|
+
- 收到蓝湖邀请链接需要解析
|
|
12
|
+
|
|
13
|
+
触发词:蓝湖、lanhu、设计稿、原型图、蓝湖链接、设计图、切图
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# 蓝湖设计稿分析
|
|
17
|
+
|
|
18
|
+
## 前置条件
|
|
19
|
+
|
|
20
|
+
lanhu MCP Server 已注册在 `.claude/settings.json`。首次使用需配置蓝湖 Cookie:
|
|
21
|
+
|
|
22
|
+
1. 浏览器登录蓝湖 → F12 开发者工具 → Network → 复制请求头中的 Cookie
|
|
23
|
+
2. 填入 `.claude/settings.json` 的 `lanhu.env.LANHU_COOKIE`
|
|
24
|
+
|
|
25
|
+
## MCP 工具清单
|
|
26
|
+
|
|
27
|
+
| 工具 | 用途 | 输入 |
|
|
28
|
+
|------|------|------|
|
|
29
|
+
| `lanhu_resolve_invite_link` | 解析蓝湖邀请链接 | 邀请链接 URL |
|
|
30
|
+
| `lanhu_get_pages` | 获取原型文档页面列表+截图 | 含 docId 的蓝湖 URL |
|
|
31
|
+
| `lanhu_get_ai_analyze_page_result` | AI 分析原型页面(开发/测试/探索视角) | 含 docId 的 URL + 页面名 + 模式 |
|
|
32
|
+
| `lanhu_get_designs` | 获取 UI 设计图列表 | 不含 docId 的蓝湖 URL |
|
|
33
|
+
| `lanhu_get_ai_analyze_design_result` | AI 分析设计图(含尺寸/颜色/CSS) | 不含 docId 的 URL + 设计图名 |
|
|
34
|
+
| `lanhu_get_design_slices` | 提取设计稿切图资源 | 不含 docId 的 URL + 设计图名 |
|
|
35
|
+
| `lanhu_say` | 发送团队留言 | URL + 内容 |
|
|
36
|
+
| `lanhu_say_list` | 查询留言列表 | URL 或 'all' |
|
|
37
|
+
| `lanhu_say_detail` | 查看留言详情 | 消息 ID |
|
|
38
|
+
| `lanhu_say_edit` | 编辑留言 | URL + 消息 ID + 新内容 |
|
|
39
|
+
| `lanhu_say_delete` | 删除留言 | URL + 消息 ID |
|
|
40
|
+
| `lanhu_get_members` | 获取项目成员 | URL |
|
|
41
|
+
|
|
42
|
+
## URL 类型区分(重要)
|
|
43
|
+
|
|
44
|
+
| URL 类型 | 特征 | 用于 |
|
|
45
|
+
|---------|------|------|
|
|
46
|
+
| **原型文档 URL** | 含 `docId` 参数 | `lanhu_get_pages`、`lanhu_get_ai_analyze_page_result` |
|
|
47
|
+
| **设计项目 URL** | 不含 `docId` | `lanhu_get_designs`、`lanhu_get_design_slices` |
|
|
48
|
+
| **邀请链接** | `lanhuapp.com/link/#/invite?sid=xxx` | 先用 `lanhu_resolve_invite_link` 解析 |
|
|
49
|
+
|
|
50
|
+
## 典型工作流
|
|
51
|
+
|
|
52
|
+
### 1. 需求分析(与 analyze-requirements 联动)
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
收到蓝湖链接
|
|
56
|
+
│
|
|
57
|
+
├─ 邀请链接? → lanhu_resolve_invite_link → 获取真实 URL
|
|
58
|
+
│
|
|
59
|
+
├─ 含 docId?(原型文档)
|
|
60
|
+
│ ├─ lanhu_get_pages → 获取页面列表和截图
|
|
61
|
+
│ └─ lanhu_get_ai_analyze_page_result(mode="development") → 获取字段/逻辑/流程
|
|
62
|
+
│
|
|
63
|
+
└─ 不含 docId?(设计项目)
|
|
64
|
+
├─ lanhu_get_designs → 获取设计图列表
|
|
65
|
+
└─ lanhu_get_ai_analyze_design_result → 获取尺寸/颜色/CSS
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 2. 前端开发(获取设计参数)
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
lanhu_get_designs → 查看设计图列表
|
|
72
|
+
→ lanhu_get_ai_analyze_design_result → 获取精确设计参数(尺寸/间距/颜色/字体)+ HTML+CSS 代码
|
|
73
|
+
→ lanhu_get_design_slices → 提取切图/图标资源
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 3. 分析模式选择
|
|
77
|
+
|
|
78
|
+
`lanhu_get_ai_analyze_page_result` 支持 3 种模式:
|
|
79
|
+
|
|
80
|
+
| 模式 | 关注点 | 适用场景 |
|
|
81
|
+
|------|--------|---------|
|
|
82
|
+
| `development` | 字段规则、业务逻辑、全局流程图 | 后端/前端开发 |
|
|
83
|
+
| `testing` | 测试场景、用例、边界值、校验规则 | 测试编写 |
|
|
84
|
+
| `exploration` | 核心功能概览、模块依赖、评审要点 | 需求评审 |
|
|
85
|
+
|
|
86
|
+
## 与其他技能联动
|
|
87
|
+
|
|
88
|
+
| 场景 | 先用 lanhu-design | 再用 |
|
|
89
|
+
|------|-------------------|------|
|
|
90
|
+
| 需求分析 | 获取原型截图和页面结构 | `analyze-requirements` 输出开发任务清单 |
|
|
91
|
+
| 前端开发 | 获取设计参数和切图 | `ui-pc` 实现页面 |
|
|
92
|
+
| 接口开发 | 从原型推导接口字段 | `api-development` / `crud-development` |
|
|
93
|
+
|
|
94
|
+
## 注意
|
|
95
|
+
|
|
96
|
+
- 蓝湖 Cookie 有效期有限,过期需重新获取
|
|
97
|
+
- 原型文档和设计项目使用不同的 URL 格式,工具不能混用
|
|
98
|
+
- 大型原型建议分页面分析,避免单次请求过大
|
|
99
|
+
- 与 `analyze-requirements` 的区别:本技能负责**从蓝湖获取数据**,`analyze-requirements` 负责**分析数据输出任务**
|
|
@@ -218,6 +218,10 @@ const skillMap = [
|
|
|
218
218
|
},
|
|
219
219
|
|
|
220
220
|
// ========== 通用技能 ==========
|
|
221
|
+
{
|
|
222
|
+
name: 'auto-test',
|
|
223
|
+
keywords: ['自动测试', 'auto-test', '接口测试', 'API测试', 'Hurl', '测试报告', '回归测试']
|
|
224
|
+
},
|
|
221
225
|
{
|
|
222
226
|
name: 'crud-development',
|
|
223
227
|
keywords: ['CRUD', '增删改查', 'Entity', 'Service', 'Controller', '业务模块开发']
|
|
@@ -342,6 +346,10 @@ const skillMap = [
|
|
|
342
346
|
name: 'banana-image',
|
|
343
347
|
keywords: ['生成图片', 'AI图片', '产品图', '海报', '缩略图', '4K图片', '高清图', '制作图片', '/image']
|
|
344
348
|
},
|
|
349
|
+
{
|
|
350
|
+
name: 'lanhu-design',
|
|
351
|
+
keywords: ['蓝湖', 'lanhu', '设计稿', '蓝湖链接', '设计图', '切图', 'lanhuapp']
|
|
352
|
+
},
|
|
345
353
|
{
|
|
346
354
|
name: 'codex-code-review',
|
|
347
355
|
keywords: ['代码审查', 'code review', 'review代码', '代码检查', 'codex审查']
|
|
@@ -83,12 +83,14 @@ alwaysApply: true
|
|
|
83
83
|
| 头脑风暴/方案设计/怎么设计/有什么办法 | `.cursor/skills/brainstorm/SKILL.md` |
|
|
84
84
|
| 工作流/审批流/Flowable/WarmFlow | `.cursor/skills/workflow-engine/SKILL.md` |
|
|
85
85
|
| 单元测试/@Test/JUnit5/Mockito | `.cursor/skills/test-development/SKILL.md` |
|
|
86
|
+
| 自动测试/auto-test/接口测试/API测试/Hurl/测试报告/回归测试 | `.cursor/skills/auto-test/SKILL.md` |
|
|
86
87
|
| JSON/序列化/反序列化/JsonUtils/BigDecimal精度 | `.cursor/skills/json-serialization/SKILL.md` |
|
|
87
88
|
| Redis/缓存/@Cacheable/@CacheEvict/分布式锁/RLock | `.cursor/skills/redis-cache/SKILL.md` |
|
|
88
89
|
| 定时任务/SnailJob/@Scheduled/@JobExecutor | `.cursor/skills/scheduled-jobs/SKILL.md` |
|
|
89
90
|
| WebSocket/SSE/实时推送/消息通知/双向通信 | `.cursor/skills/websocket-sse/SKILL.md` |
|
|
90
91
|
| 短信/邮件/SMS/验证码/MailUtils | `.cursor/skills/sms-mail/SKILL.md` |
|
|
91
92
|
| 第三方登录/微信登录/OAuth/JustAuth/扫码登录 | `.cursor/skills/social-login/SKILL.md` |
|
|
93
|
+
| 蓝湖/lanhu/设计稿/蓝湖链接/设计图/切图 | `.cursor/skills/lanhu-design/SKILL.md` |
|
|
92
94
|
| 多租户/租户隔离/TenantEntity/tenantId/SaaS | `.cursor/skills/tenant-management/SKILL.md` |
|
|
93
95
|
| Element UI/前端组件/el-table/el-form/管理页面 | `.cursor/skills/ui-pc/SKILL.md` |
|
|
94
96
|
| Vuex/store/mapState/mapActions/状态管理 | `.cursor/skills/store-pc/SKILL.md` |
|