ai-engineering-init 1.4.3 → 1.6.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/.cursor/skills/bug-detective/SKILL.md +19 -19
- package/.cursor/skills/project-navigator/SKILL.md +164 -258
- package/README.md +20 -236
- package/bin/index.js +437 -7
- package/package.json +7 -1
- package/scripts/build-skills.js +180 -0
- package/src/platform-map.json +56 -0
- package/src/skills/add-skill/SKILL.md +488 -0
- package/src/skills/add-todo/SKILL.md +269 -0
- package/src/skills/api-development/SKILL.md +266 -0
- package/src/skills/architecture-design/SKILL.md +262 -0
- package/src/skills/backend-annotations/SKILL.md +302 -0
- package/src/skills/banana-image/CHANGELOG.md +37 -0
- package/src/skills/banana-image/README.md +146 -0
- package/src/skills/banana-image/SKILL.md +171 -0
- package/src/skills/banana-image/assets/logo.png +0 -0
- package/src/skills/banana-image/references/advanced-usage.md +189 -0
- package/src/skills/banana-image/scripts/apply_template.py +125 -0
- package/src/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/src/skills/banana-image/scripts/batch_prep.py +82 -0
- package/src/skills/banana-image/scripts/package-lock.json +1437 -0
- package/src/skills/banana-image/scripts/package.json +18 -0
- package/src/skills/banana-image/scripts/requirements.txt +10 -0
- package/src/skills/banana-image/templates/poster.json +22 -0
- package/src/skills/banana-image/templates/product.json +17 -0
- package/src/skills/banana-image/templates/social.json +22 -0
- package/src/skills/banana-image/templates/thumbnail.json +17 -0
- package/src/skills/brainstorm/SKILL.md +216 -0
- package/src/skills/bug-detective/SKILL.md +256 -0
- package/src/skills/bug-detective/references/error-patterns.md +242 -0
- package/src/skills/check/SKILL.md +367 -0
- package/src/skills/code-patterns/SKILL.md +280 -0
- package/src/skills/code-patterns/references/leniu-code-patterns.md +87 -0
- package/src/skills/codex-code-review/SKILL.md +135 -0
- package/src/skills/collaborating-with-codex/SKILL.md +174 -0
- package/src/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/src/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/src/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/src/skills/crud/SKILL.md +265 -0
- package/src/skills/crud-development/SKILL.md +409 -0
- package/src/skills/data-permission/SKILL.md +292 -0
- package/src/skills/data-permission/references/custom-data-scope.md +90 -0
- package/src/skills/database-ops/SKILL.md +407 -0
- package/src/skills/dev/SKILL.md +187 -0
- package/src/skills/error-handler/SKILL.md +371 -0
- package/src/skills/file-oss-management/SKILL.md +255 -0
- package/src/skills/file-oss-management/references/entities.md +105 -0
- package/src/skills/file-oss-management/references/service-impl.md +104 -0
- package/src/skills/git-workflow/SKILL.md +397 -0
- package/src/skills/init-docs/SKILL.md +194 -0
- package/src/skills/json-serialization/SKILL.md +357 -0
- package/src/skills/leniu-api-development/SKILL.md +319 -0
- package/src/skills/leniu-api-development/references/real-examples.md +273 -0
- package/src/skills/leniu-architecture-design/SKILL.md +383 -0
- package/src/skills/leniu-backend-annotations/SKILL.md +277 -0
- package/src/skills/leniu-brainstorm/SKILL.md +242 -0
- package/src/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
- package/src/skills/leniu-code-patterns/SKILL.md +411 -0
- package/src/skills/leniu-crud-development/SKILL.md +404 -0
- package/src/skills/leniu-crud-development/references/templates.md +597 -0
- package/src/skills/leniu-customization-location/SKILL.md +410 -0
- package/src/skills/leniu-data-permission/SKILL.md +341 -0
- package/src/skills/leniu-database-ops/SKILL.md +426 -0
- package/src/skills/leniu-error-handler/SKILL.md +462 -0
- package/src/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/src/skills/leniu-java-code-style/SKILL.md +510 -0
- package/src/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/src/skills/leniu-java-entity/SKILL.md +237 -0
- package/src/skills/leniu-java-entity/references/templates.md +237 -0
- package/src/skills/leniu-java-export/SKILL.md +570 -0
- package/src/skills/leniu-java-logging/SKILL.md +229 -0
- package/src/skills/leniu-java-logging/references/data-mask.md +46 -0
- package/src/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
- package/src/skills/leniu-java-mq/SKILL.md +338 -0
- package/src/skills/leniu-java-mybatis/SKILL.md +267 -0
- package/src/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
- package/src/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/src/skills/leniu-java-task/SKILL.md +367 -0
- package/src/skills/leniu-java-total-line/SKILL.md +196 -0
- package/src/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/src/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/src/skills/leniu-mealtime/SKILL.md +215 -0
- package/src/skills/leniu-redis-cache/SKILL.md +331 -0
- package/src/skills/leniu-report-customization/SKILL.md +335 -0
- package/src/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/src/skills/leniu-report-standard-customization/SKILL.md +328 -0
- package/src/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/src/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/src/skills/leniu-security-guard/SKILL.md +306 -0
- package/src/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/src/skills/mysql-debug/SKILL.md +364 -0
- package/src/skills/next/SKILL.md +137 -0
- package/src/skills/openspec-apply-change/SKILL.md +165 -0
- package/src/skills/openspec-archive-change/SKILL.md +122 -0
- package/src/skills/openspec-bulk-archive-change/SKILL.md +254 -0
- package/src/skills/openspec-continue-change/SKILL.md +126 -0
- package/src/skills/openspec-explore/SKILL.md +299 -0
- package/src/skills/openspec-ff-change/SKILL.md +109 -0
- package/src/skills/openspec-new-change/SKILL.md +82 -0
- package/src/skills/openspec-onboard/SKILL.md +414 -0
- package/src/skills/openspec-sync-specs/SKILL.md +146 -0
- package/src/skills/openspec-verify-change/SKILL.md +176 -0
- package/src/skills/performance-doctor/SKILL.md +303 -0
- package/src/skills/progress/SKILL.md +193 -0
- package/src/skills/project-navigator/SKILL.md +211 -0
- package/src/skills/redis-cache/SKILL.md +333 -0
- package/src/skills/redis-cache/references/listeners.md +23 -0
- package/src/skills/scheduled-jobs/SKILL.md +314 -0
- package/src/skills/security-guard/SKILL.md +353 -0
- package/src/skills/security-guard/references/encrypt-config.md +103 -0
- package/src/skills/security-guard/references/sensitive-strategies.md +42 -0
- package/src/skills/sms-mail/SKILL.md +308 -0
- package/src/skills/sms-mail/references/mail-config.md +88 -0
- package/src/skills/sms-mail/references/sms-config.md +74 -0
- package/src/skills/social-login/SKILL.md +266 -0
- package/src/skills/social-login/references/provider-configs.md +118 -0
- package/src/skills/start/SKILL.md +154 -0
- package/src/skills/store-pc/SKILL.md +366 -0
- package/src/skills/sync/SKILL.md +149 -0
- package/src/skills/task-tracker/SKILL.md +307 -0
- package/src/skills/tech-decision/SKILL.md +393 -0
- package/src/skills/tenant-management/SKILL.md +288 -0
- package/src/skills/tenant-management/references/tenant-scenarios.md +91 -0
- package/src/skills/test-development/SKILL.md +301 -0
- package/src/skills/test-development/references/parameterized-examples.md +119 -0
- package/src/skills/ui-pc/SKILL.md +438 -0
- package/src/skills/update-status/SKILL.md +159 -0
- package/src/skills/utils-toolkit/SKILL.md +362 -0
- package/src/skills/utils-toolkit/references/redis-utils-api.md +56 -0
- package/src/skills/websocket-sse/SKILL.md +271 -0
- package/src/skills/workflow-engine/SKILL.md +321 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# 参数化测试完整示例
|
|
2
|
+
|
|
3
|
+
## @ValueSource
|
|
4
|
+
|
|
5
|
+
```java
|
|
6
|
+
@ParameterizedTest
|
|
7
|
+
@ValueSource(strings = {"t1", "t2", "t3"})
|
|
8
|
+
public void testStringValues(String str) {
|
|
9
|
+
Assertions.assertNotNull(str);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
@ParameterizedTest
|
|
13
|
+
@ValueSource(ints = {1, 2, 3, 4, 5})
|
|
14
|
+
public void testIntValues(int num) {
|
|
15
|
+
Assertions.assertTrue(num > 0);
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## @NullSource / @NullAndEmptySource
|
|
20
|
+
|
|
21
|
+
```java
|
|
22
|
+
@ParameterizedTest
|
|
23
|
+
@NullSource
|
|
24
|
+
public void testNullSource(String str) {
|
|
25
|
+
Assertions.assertNull(str);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@ParameterizedTest
|
|
29
|
+
@NullAndEmptySource
|
|
30
|
+
@ValueSource(strings = {" ", "\t", "\n"})
|
|
31
|
+
public void testBlankStrings(String input) {
|
|
32
|
+
Assertions.assertTrue(input == null || input.isBlank());
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## @EnumSource
|
|
37
|
+
|
|
38
|
+
```java
|
|
39
|
+
@ParameterizedTest
|
|
40
|
+
@EnumSource(UserType.class)
|
|
41
|
+
public void testEnumSource(UserType type) {
|
|
42
|
+
Assertions.assertNotNull(type.getUserType());
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## @CsvSource
|
|
47
|
+
|
|
48
|
+
```java
|
|
49
|
+
@ParameterizedTest
|
|
50
|
+
@CsvSource({
|
|
51
|
+
"1, Banner, 横幅广告",
|
|
52
|
+
"2, Popup, 弹窗广告"
|
|
53
|
+
})
|
|
54
|
+
public void testCsvData(String code, String name, String desc) {
|
|
55
|
+
Assertions.assertNotNull(code);
|
|
56
|
+
Assertions.assertNotNull(name);
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## @MethodSource
|
|
61
|
+
|
|
62
|
+
```java
|
|
63
|
+
@ParameterizedTest
|
|
64
|
+
@MethodSource("getParam")
|
|
65
|
+
public void testMethodSource(String str) {
|
|
66
|
+
Assertions.assertNotNull(str);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public static Stream<String> getParam() {
|
|
70
|
+
return Stream.of("t1", "t2", "t3");
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 生命周期注解
|
|
75
|
+
|
|
76
|
+
```java
|
|
77
|
+
@BeforeAll static void beforeAll() { } // 所有测试前执行一次
|
|
78
|
+
@BeforeEach void beforeEach() { } // 每个测试前执行
|
|
79
|
+
@AfterEach void afterEach() { } // 每个测试后执行
|
|
80
|
+
@AfterAll static void afterAll() { } // 所有测试后执行一次
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 标签分组完整示例
|
|
84
|
+
|
|
85
|
+
```java
|
|
86
|
+
@SpringBootTest
|
|
87
|
+
@DisplayName("标签单元测试")
|
|
88
|
+
public class TagUnitTest {
|
|
89
|
+
|
|
90
|
+
@Test @Tag("dev")
|
|
91
|
+
@DisplayName("dev 环境测试")
|
|
92
|
+
public void testTagDev() { }
|
|
93
|
+
|
|
94
|
+
@Test @Tag("prod")
|
|
95
|
+
@DisplayName("prod 环境测试")
|
|
96
|
+
public void testTagProd() { }
|
|
97
|
+
|
|
98
|
+
@Test @Tag("local")
|
|
99
|
+
@DisplayName("local 环境测试")
|
|
100
|
+
public void testTagLocal() { }
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
运行指定标签:
|
|
105
|
+
```bash
|
|
106
|
+
mvn test -Dgroups=dev
|
|
107
|
+
mvn test -DexcludedGroups=exclude
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Spring 集成测试注解速查
|
|
111
|
+
|
|
112
|
+
```java
|
|
113
|
+
@SpringBootTest // 启动完整 Spring 容器
|
|
114
|
+
@Transactional // 测试后自动回滚
|
|
115
|
+
@AutoConfigureMockMvc // 自动配置 MockMvc
|
|
116
|
+
@Disabled // 禁用测试
|
|
117
|
+
@Timeout(value = 2, unit = SECONDS) // 超时限制
|
|
118
|
+
@RepeatedTest(3) // 重复执行 3 次
|
|
119
|
+
```
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-pc
|
|
3
|
+
description: |
|
|
4
|
+
前端组件库指南。包含公共组件、业务组件、Element UI 组件使用。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 开发前端后台管理页面
|
|
8
|
+
- 使用 Element UI 组件
|
|
9
|
+
- 表格、表单、弹窗、图表等前端 UI
|
|
10
|
+
- 使用 leniu-components 业务组件
|
|
11
|
+
- 前端权限控制、国际化
|
|
12
|
+
|
|
13
|
+
触发词:el-、el-table、el-form、el-dialog、leniu-page、leniu-table、前端组件、后台页面、v-hasPerm
|
|
14
|
+
|
|
15
|
+
适用目录:/Users/xujiajun/Developer/frontProj/web/src/**
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# 前端组件库指南
|
|
19
|
+
|
|
20
|
+
> **适用于**: 腾云智慧食堂管理系统前端项目(Vue 2.7.16 + Element UI 2.15.9)
|
|
21
|
+
>
|
|
22
|
+
> **前端项目路径**: `/Users/xujiajun/Developer/frontProj/web`
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 目录结构
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
src/
|
|
30
|
+
├── components/ # 公共组件(~87个)
|
|
31
|
+
├── leniu-components/ # 业务组件(10个核心组件)
|
|
32
|
+
├── layout/ # 布局组件(Navbar/Sidebar/AppMain)
|
|
33
|
+
├── directive/ # 自定义指令(11个)
|
|
34
|
+
└── mixins/ # 全局混入(5个)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 业务组件(leniu-components)
|
|
40
|
+
|
|
41
|
+
| 组件 | 路径 | 用途 |
|
|
42
|
+
|------|------|------|
|
|
43
|
+
| `leniu-page` | `leniu-components/leniu-page` | 页面布局容器(所有业务页面必用) |
|
|
44
|
+
| `leniu-search` | `leniu-components/leniu-search` | 搜索组件(列表页搜索) |
|
|
45
|
+
| `leniu-table` | `leniu-components/leniu-table` | 增强表格组件 |
|
|
46
|
+
| `leniu-form` | `leniu-components/leniu-form` | 表单组件 |
|
|
47
|
+
| `leniu-form-item` | `leniu-components/leniu-form-item` | 表单项组件 |
|
|
48
|
+
| `leniu-form-dialog` | `leniu-components/leniu-form-dialog` | 弹窗表单(新增/编辑) |
|
|
49
|
+
| `leniu-form-panel` | `leniu-components/leniu-form-panel` | 面板表单(详情展示) |
|
|
50
|
+
| `leniu-button-list` | `leniu-components/leniu-button-list` | 按钮组 |
|
|
51
|
+
| `leniu-table-toolbar` | `leniu-components/leniu-table-toolbar` | 表格工具栏 |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 常用公共组件(components)
|
|
56
|
+
|
|
57
|
+
| 组件 | 用途 |
|
|
58
|
+
|------|------|
|
|
59
|
+
| `Pagination` | 分页组件 |
|
|
60
|
+
| `CollapseSearch` | 折叠搜索区域 |
|
|
61
|
+
| `Breadcrumb` | 面包屑导航 |
|
|
62
|
+
| `Dropzone` | 文件拖拽上传 |
|
|
63
|
+
| `ImageCropper` | 图片裁剪 |
|
|
64
|
+
| `Tinymce` | 富文本编辑器 |
|
|
65
|
+
| `UploadImageList` | 图片上传列表 |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 全局原型方法(main.js 挂载)
|
|
70
|
+
|
|
71
|
+
在任意组件中可直接使用:
|
|
72
|
+
|
|
73
|
+
| 方法/属性 | 说明 | 示例 |
|
|
74
|
+
|----------|------|------|
|
|
75
|
+
| `this.money(fen)` | 分转元(保留2位小数) | `this.money(100)` → `'1.00'` |
|
|
76
|
+
| `this.accMul(val, 100)` | 精确乘法(元转分) | `this.accMul(1.5, 100)` → `150` |
|
|
77
|
+
| `this.parseTime(time, fmt)` | 格式化时间 | `this.parseTime(new Date(), '{y}-{m}-{d}')` |
|
|
78
|
+
| `this.$echarts` | ECharts 实例 | `this.$echarts.init(el)` |
|
|
79
|
+
| `this.$hasPerm(['xxx:add'])` | 权限判断(JS中) | 返回 true/false |
|
|
80
|
+
| `this.isDevEnv` | 是否纯本地开发环境 | true/false |
|
|
81
|
+
| `this.isDevTestEnv` | 是否开发测试环境 | 含 dev/test 域名 |
|
|
82
|
+
| `this._` | Lodash 工具库 | `this._.debounce(fn, 300)` |
|
|
83
|
+
| `this.validators` | 表单校验规则集 | `this.validators.required()` |
|
|
84
|
+
| `this.inputRules` | 输入过滤规则 | `this.inputRules.number(val)` |
|
|
85
|
+
| `this.CNEN` | 中英文拼接工具 | 根据 i18n 拼接 |
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 自定义指令(directive)
|
|
90
|
+
|
|
91
|
+
```vue
|
|
92
|
+
<!-- 按钮权限(最常用)-->
|
|
93
|
+
<el-button v-hasPerm="['xxx:add']">新增</el-button>
|
|
94
|
+
<el-button v-hasPerm="['xxx:edit']">修改</el-button>
|
|
95
|
+
<el-button v-hasPerm="['xxx:remove']">删除</el-button>
|
|
96
|
+
|
|
97
|
+
<!-- 角色权限 -->
|
|
98
|
+
<el-button v-hasRole="['admin']">管理员按钮</el-button>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 国际化(i18n)
|
|
104
|
+
|
|
105
|
+
```vue
|
|
106
|
+
<template>
|
|
107
|
+
<!-- 使用翻译 -->
|
|
108
|
+
<span>{{ $t('规则名称') }}</span>
|
|
109
|
+
<el-button>{{ $t('action.query') }}</el-button>
|
|
110
|
+
<el-button>{{ $t('新增') }}</el-button>
|
|
111
|
+
</template>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
> **注意**:语言文件在 `src/lang/` 目录,支持中文(zh)和英文(en)
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 全局 Mixin(mixins/index.js)
|
|
119
|
+
|
|
120
|
+
所有组件自动混入,提供以下方法:
|
|
121
|
+
|
|
122
|
+
```javascript
|
|
123
|
+
// 金额输入过滤(只允许数字和小数点)
|
|
124
|
+
this.oninput(value, decimalLimit, maxLength, maxValue)
|
|
125
|
+
|
|
126
|
+
// 只允许字母和数字
|
|
127
|
+
this.LetterAndNum(value, maxLength)
|
|
128
|
+
|
|
129
|
+
// 只允许数字
|
|
130
|
+
this.Num(value, maxLength)
|
|
131
|
+
|
|
132
|
+
// 获取当前时间戳字符串
|
|
133
|
+
this.getTimestamp()
|
|
134
|
+
|
|
135
|
+
// 获取图片完整URL
|
|
136
|
+
this.getUrl1(path) // 自动拼接 baseUrl
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 标准列表页结构
|
|
142
|
+
|
|
143
|
+
```vue
|
|
144
|
+
<template>
|
|
145
|
+
<page-slot>
|
|
146
|
+
<!-- 搜索区域 -->
|
|
147
|
+
<collapse-search slot="search">
|
|
148
|
+
<template v-slot:outerCol>
|
|
149
|
+
<el-col :span="6">
|
|
150
|
+
<el-form-item :label="$t('名称')">
|
|
151
|
+
<el-input v-model="listQuery.name" clearable />
|
|
152
|
+
</el-form-item>
|
|
153
|
+
</el-col>
|
|
154
|
+
<el-col :span="6">
|
|
155
|
+
<el-form-item :label="$t('状态')">
|
|
156
|
+
<el-select v-model="listQuery.status" clearable>
|
|
157
|
+
<el-option label="正常" value="1" />
|
|
158
|
+
<el-option label="停用" value="0" />
|
|
159
|
+
</el-select>
|
|
160
|
+
</el-form-item>
|
|
161
|
+
</el-col>
|
|
162
|
+
</template>
|
|
163
|
+
<el-button
|
|
164
|
+
slot="operate"
|
|
165
|
+
type="primary"
|
|
166
|
+
icon="el-icon-search"
|
|
167
|
+
@click="() => (page.current = 1) && getData()"
|
|
168
|
+
>
|
|
169
|
+
{{ $t('action.query') }}
|
|
170
|
+
</el-button>
|
|
171
|
+
</collapse-search>
|
|
172
|
+
|
|
173
|
+
<!-- 操作按钮 -->
|
|
174
|
+
<el-button
|
|
175
|
+
slot="tableTopLeft"
|
|
176
|
+
type="primary"
|
|
177
|
+
plain
|
|
178
|
+
icon="el-icon-plus"
|
|
179
|
+
v-hasPerm="['xxx:add']"
|
|
180
|
+
@click="handleAdd"
|
|
181
|
+
>
|
|
182
|
+
{{ $t('新增') }}
|
|
183
|
+
</el-button>
|
|
184
|
+
|
|
185
|
+
<!-- 表格 -->
|
|
186
|
+
<el-table
|
|
187
|
+
slot="table"
|
|
188
|
+
height="100%"
|
|
189
|
+
stripe
|
|
190
|
+
:data="tableData"
|
|
191
|
+
v-loading="loading"
|
|
192
|
+
>
|
|
193
|
+
<el-table-column prop="name" :label="$t('名称')" min-width="150" />
|
|
194
|
+
<el-table-column prop="status" :label="$t('状态')">
|
|
195
|
+
<template slot-scope="{ row }">
|
|
196
|
+
<el-tag :type="row.status === '1' ? 'success' : 'danger'">
|
|
197
|
+
{{ row.status === '1' ? '正常' : '停用' }}
|
|
198
|
+
</el-tag>
|
|
199
|
+
</template>
|
|
200
|
+
</el-table-column>
|
|
201
|
+
<el-table-column :label="$t('操作')" width="180" align="center">
|
|
202
|
+
<template slot-scope="{ row }">
|
|
203
|
+
<el-button type="text" @click="handleEdit(row)" v-hasPerm="['xxx:edit']">
|
|
204
|
+
{{ $t('修改') }}
|
|
205
|
+
</el-button>
|
|
206
|
+
<el-button type="text" @click="handleDelete(row)" v-hasPerm="['xxx:remove']">
|
|
207
|
+
{{ $t('删除') }}
|
|
208
|
+
</el-button>
|
|
209
|
+
</template>
|
|
210
|
+
</el-table-column>
|
|
211
|
+
</el-table>
|
|
212
|
+
</page-slot>
|
|
213
|
+
</template>
|
|
214
|
+
|
|
215
|
+
<script>
|
|
216
|
+
import { getList, del } from '@/api/xxx'
|
|
217
|
+
|
|
218
|
+
export default {
|
|
219
|
+
name: 'XxxList',
|
|
220
|
+
data() {
|
|
221
|
+
return {
|
|
222
|
+
loading: false,
|
|
223
|
+
tableData: [],
|
|
224
|
+
total: 0,
|
|
225
|
+
page: { current: 1, size: 20 },
|
|
226
|
+
listQuery: {
|
|
227
|
+
name: '',
|
|
228
|
+
status: ''
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
mounted() {
|
|
233
|
+
this.getData()
|
|
234
|
+
},
|
|
235
|
+
methods: {
|
|
236
|
+
async getData() {
|
|
237
|
+
this.loading = true
|
|
238
|
+
try {
|
|
239
|
+
const res = await getList({
|
|
240
|
+
page: this.page,
|
|
241
|
+
object: this.listQuery
|
|
242
|
+
})
|
|
243
|
+
this.tableData = res.records || []
|
|
244
|
+
this.total = res.total || 0
|
|
245
|
+
} finally {
|
|
246
|
+
this.loading = false
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
handleAdd() {
|
|
250
|
+
this.visible = true
|
|
251
|
+
this.form = {}
|
|
252
|
+
},
|
|
253
|
+
handleEdit(row) {
|
|
254
|
+
this.visible = true
|
|
255
|
+
this.form = { ...row }
|
|
256
|
+
},
|
|
257
|
+
handleDelete(row) {
|
|
258
|
+
this.$confirm('确定删除?', '提示', {
|
|
259
|
+
type: 'warning'
|
|
260
|
+
}).then(async () => {
|
|
261
|
+
await del(row.id)
|
|
262
|
+
this.$message.success('删除成功')
|
|
263
|
+
this.getData()
|
|
264
|
+
})
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
</script>
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 标准表单弹窗
|
|
274
|
+
|
|
275
|
+
```vue
|
|
276
|
+
<template>
|
|
277
|
+
<el-dialog
|
|
278
|
+
:title="form.id ? '编辑' : '新增'"
|
|
279
|
+
:visible.sync="visible"
|
|
280
|
+
width="600px"
|
|
281
|
+
@close="handleClose"
|
|
282
|
+
>
|
|
283
|
+
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
|
284
|
+
<el-form-item label="名称" prop="name">
|
|
285
|
+
<el-input v-model="form.name" placeholder="请输入名称" />
|
|
286
|
+
</el-form-item>
|
|
287
|
+
<el-form-item label="状态" prop="status">
|
|
288
|
+
<el-radio-group v-model="form.status">
|
|
289
|
+
<el-radio label="1">正常</el-radio>
|
|
290
|
+
<el-radio label="0">停用</el-radio>
|
|
291
|
+
</el-radio-group>
|
|
292
|
+
</el-form-item>
|
|
293
|
+
</el-form>
|
|
294
|
+
<div slot="footer">
|
|
295
|
+
<el-button @click="visible = false">取消</el-button>
|
|
296
|
+
<el-button type="primary" :loading="submitting" @click="handleSubmit">
|
|
297
|
+
确定
|
|
298
|
+
</el-button>
|
|
299
|
+
</div>
|
|
300
|
+
</el-dialog>
|
|
301
|
+
</template>
|
|
302
|
+
|
|
303
|
+
<script>
|
|
304
|
+
import { add, update } from '@/api/xxx'
|
|
305
|
+
|
|
306
|
+
export default {
|
|
307
|
+
name: 'XxxForm',
|
|
308
|
+
props: {
|
|
309
|
+
visible: Boolean,
|
|
310
|
+
data: Object
|
|
311
|
+
},
|
|
312
|
+
data() {
|
|
313
|
+
return {
|
|
314
|
+
form: {},
|
|
315
|
+
rules: {
|
|
316
|
+
name: [{ required: true, message: '请输入名称', trigger: 'blur' }]
|
|
317
|
+
},
|
|
318
|
+
submitting: false
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
watch: {
|
|
322
|
+
data: {
|
|
323
|
+
immediate: true,
|
|
324
|
+
handler(val) {
|
|
325
|
+
this.form = val ? { ...val } : {}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
methods: {
|
|
330
|
+
handleClose() {
|
|
331
|
+
this.$refs.form.resetFields()
|
|
332
|
+
this.$emit('update:visible', false)
|
|
333
|
+
},
|
|
334
|
+
async handleSubmit() {
|
|
335
|
+
this.$refs.form.validate(async (valid) => {
|
|
336
|
+
if (!valid) return
|
|
337
|
+
this.submitting = true
|
|
338
|
+
try {
|
|
339
|
+
const api = this.form.id ? update : add
|
|
340
|
+
await api(this.form)
|
|
341
|
+
this.$message.success('保存成功')
|
|
342
|
+
this.$emit('success')
|
|
343
|
+
this.handleClose()
|
|
344
|
+
} finally {
|
|
345
|
+
this.submitting = false
|
|
346
|
+
}
|
|
347
|
+
})
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
</script>
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## API 接口定义规范
|
|
357
|
+
|
|
358
|
+
所有 API 调用通过 `src/utils/request.js` 封装,请求格式有两种:
|
|
359
|
+
|
|
360
|
+
### 标准请求格式(带 content 包裹)
|
|
361
|
+
|
|
362
|
+
```javascript
|
|
363
|
+
// src/api/xxx.js
|
|
364
|
+
import request from '@/utils/request'
|
|
365
|
+
|
|
366
|
+
// 分页查询
|
|
367
|
+
export function getList(data) {
|
|
368
|
+
return request({
|
|
369
|
+
url: '/api/v1/xxx/list',
|
|
370
|
+
method: 'post',
|
|
371
|
+
data: {
|
|
372
|
+
version: '1.0',
|
|
373
|
+
nonceStr: '1212fsadf',
|
|
374
|
+
timestamp: '2020-4-21',
|
|
375
|
+
signType: 'md5',
|
|
376
|
+
content: data, // 业务数据放在 content 中
|
|
377
|
+
sign: 'xxx'
|
|
378
|
+
}
|
|
379
|
+
})
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// GET 请求
|
|
383
|
+
export function getDetail(id) {
|
|
384
|
+
return request({
|
|
385
|
+
url: `/api/v1/xxx/detail/${id}`,
|
|
386
|
+
method: 'get',
|
|
387
|
+
params: { version: '1.0', content: { id } }
|
|
388
|
+
})
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// 删除
|
|
392
|
+
export function del(id) {
|
|
393
|
+
return request({
|
|
394
|
+
url: `/api/v1/xxx/delete`,
|
|
395
|
+
method: 'post',
|
|
396
|
+
data: { version: '1.0', content: { id } }
|
|
397
|
+
})
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
> **注意**:
|
|
402
|
+
> - 请求拦截器会自动添加签名(MD5)
|
|
403
|
+
> - 所有接口都走 SM4 国密加密(`/security/` 前缀)
|
|
404
|
+
> - 响应 `code == 10000` 为成功,返回 `res.data`
|
|
405
|
+
> - 响应 `code == 20001` 为登录失效,自动跳转登录
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## 金额处理规范
|
|
410
|
+
|
|
411
|
+
```javascript
|
|
412
|
+
// ✅ 前端展示:分转元(使用全局 money 方法)
|
|
413
|
+
this.money(10000) // → '100.00'
|
|
414
|
+
this.money(null) // → ''
|
|
415
|
+
|
|
416
|
+
// ✅ 后端传参:元转分(使用全局 accMul 方法)
|
|
417
|
+
this.accMul(100, 100) // → 10000
|
|
418
|
+
|
|
419
|
+
// ❌ 禁止直接 / 100 或 * 100(精度问题)
|
|
420
|
+
amount / 100 // 禁止
|
|
421
|
+
amount * 100 // 禁止
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
---
|
|
425
|
+
|
|
426
|
+
## 参考文件位置
|
|
427
|
+
|
|
428
|
+
| 用途 | 路径 |
|
|
429
|
+
|------|------|
|
|
430
|
+
| 业务组件 | `/Users/xujiajun/Developer/frontProj/web/src/leniu-components/` |
|
|
431
|
+
| 公共组件 | `/Users/xujiajun/Developer/frontProj/web/src/components/` |
|
|
432
|
+
| 标准列表页 | `/Users/xujiajun/Developer/frontProj/web/src/leniuview/marketing/` |
|
|
433
|
+
| API 定义示例 | `/Users/xujiajun/Developer/frontProj/web/src/api/marketing.js` |
|
|
434
|
+
| 请求封装 | `/Users/xujiajun/Developer/frontProj/web/src/utils/request.js` |
|
|
435
|
+
| Token/租户工具 | `/Users/xujiajun/Developer/frontProj/web/src/utils/auth.js` |
|
|
436
|
+
| 全局工具函数 | `/Users/xujiajun/Developer/frontProj/web/src/utils/index.js` |
|
|
437
|
+
| 权限守卫 | `/Users/xujiajun/Developer/frontProj/web/src/permission.js` |
|
|
438
|
+
| 主入口 | `/Users/xujiajun/Developer/frontProj/web/src/main.js` |
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: update-status
|
|
3
|
+
description: |
|
|
4
|
+
当需要增量更新项目状态、同步最近代码变更时自动使用此 Skill。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 完成一个功能或任务后更新状态
|
|
8
|
+
- 每天开始或结束时同步代码变更
|
|
9
|
+
- 代码审查完成后更新文档
|
|
10
|
+
- 日常维护项目状态
|
|
11
|
+
|
|
12
|
+
触发词:更新状态、update-status、状态更新、增量更新、日常同步、更新进度
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# /update-status - 项目状态智能更新
|
|
16
|
+
|
|
17
|
+
日常使用的增量更新命令。自动扫描最近的代码变更,智能更新项目文档,保持文档与代码同步。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 🎯 适用场景
|
|
22
|
+
|
|
23
|
+
| 场景 | 说明 | 频率 |
|
|
24
|
+
|------|------|------|
|
|
25
|
+
| **功能完成** | 完成一个功能或任务后更新状态 | 实时 |
|
|
26
|
+
| **日常同步** | 每天开始或结束时同步代码变更 | 每天1-2次 |
|
|
27
|
+
| **代码审查后** | 审查完成后更新文档 | 按需 |
|
|
28
|
+
| **周期回顾** | 本周末更新本周的工作成果 | 每周1次 |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 📊 与 /sync 的区别
|
|
33
|
+
|
|
34
|
+
| 对比项 | `/update-status`(增量)| `/sync`(全量)|
|
|
35
|
+
|--------|----------------------|----------------|
|
|
36
|
+
| **执行速度** | ⚡ 快速 | 🐢 较慢 |
|
|
37
|
+
| **扫描范围** | 最近 N 条提交 | 整个项目 |
|
|
38
|
+
| **处理方式** | 增量更新 | 全量重建 |
|
|
39
|
+
| **使用频率** | 日常频繁使用 | 每周一次 |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 🚀 执行流程
|
|
44
|
+
|
|
45
|
+
### 第一步:检查和初始化文档(强制执行)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 检查文档目录
|
|
49
|
+
Glob pattern: "docs/*.md"
|
|
50
|
+
|
|
51
|
+
# 必要的文档文件
|
|
52
|
+
docs/README.md # 项目简介
|
|
53
|
+
docs/PROJECT_STATUS.md # 项目进度
|
|
54
|
+
docs/TODO.md # 待办清单
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 第二步:分析最近的代码变更
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# 获取最近 20 条提交
|
|
61
|
+
git log -20 --oneline --format="%h|%s|%aI" --all
|
|
62
|
+
|
|
63
|
+
# 扫描业务模块变更
|
|
64
|
+
Glob pattern: "ruoyi-modules/ruoyi-*/src/main/java/**/controller/*Controller.java"
|
|
65
|
+
|
|
66
|
+
# 扫描代码中的待办标记
|
|
67
|
+
Grep pattern: "TODO:|FIXME:|XXX:" path: ruoyi-modules/ glob: "*.java" output_mode: content -B 1
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 第三步:更新项目进度文档
|
|
71
|
+
|
|
72
|
+
分析功能完整性,更新 PROJECT_STATUS.md:
|
|
73
|
+
- 新增已完成功能
|
|
74
|
+
- 更新进行中功能的完成度
|
|
75
|
+
- 更新统计信息
|
|
76
|
+
|
|
77
|
+
### 第四步:更新待办清单文档
|
|
78
|
+
|
|
79
|
+
同步 TODO.md:
|
|
80
|
+
- 将完成的功能移到已完成区域
|
|
81
|
+
- 添加新发现的 TODO/FIXME
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 输出格式
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
# 📝 项目状态更新报告
|
|
89
|
+
|
|
90
|
+
**更新时间**:YYYY-MM-DD HH:mm
|
|
91
|
+
**扫描范围**:最近 20 条 Git 提交
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 📂 文档状态
|
|
96
|
+
|
|
97
|
+
| 文档 | 操作 | 状态 |
|
|
98
|
+
|------|------|------|
|
|
99
|
+
| PROJECT_STATUS.md | 已更新 | ✅ |
|
|
100
|
+
| TODO.md | 已同步 | ✅ |
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 📊 本次变更统计
|
|
105
|
+
|
|
106
|
+
### PROJECT_STATUS.md 更新
|
|
107
|
+
- ✅ 新增已完成:X 项
|
|
108
|
+
- 🔄 更新进行中:X 项
|
|
109
|
+
|
|
110
|
+
### TODO.md 联动更新
|
|
111
|
+
- ✅ 移至已完成:X 项
|
|
112
|
+
- 📋 新增待办:X 项
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 💡 下一步建议
|
|
117
|
+
|
|
118
|
+
### 立即处理
|
|
119
|
+
\`/check\` # 检查代码规范
|
|
120
|
+
\`/progress\` # 查看详细进度
|
|
121
|
+
|
|
122
|
+
### 日常操作
|
|
123
|
+
\`/dev 新功能名称\` # 继续开发新功能
|
|
124
|
+
\`/crud 表名\` # 为表生成代码
|
|
125
|
+
\`/add-todo 任务描述\` # 添加新的待办
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 🔗 相关命令
|
|
131
|
+
|
|
132
|
+
| 命令 | 用途 | 何时使用 |
|
|
133
|
+
|------|------|---------|
|
|
134
|
+
| `/update-status` | 增量更新(当前) | 功能完成后立即使用 |
|
|
135
|
+
| `/sync` | 全量同步 | 每周一次定期整理 |
|
|
136
|
+
| `/progress` | 项目进度分析 | 了解完成情况 |
|
|
137
|
+
| `/check` | 代码规范检查 | 代码审查前 |
|
|
138
|
+
| `/add-todo` | 添加单个待办 | 临时添加任务 |
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 📌 最佳实践
|
|
143
|
+
|
|
144
|
+
### ✅ 推荐做法
|
|
145
|
+
|
|
146
|
+
1. **功能完成后立即更新**
|
|
147
|
+
```bash
|
|
148
|
+
git push
|
|
149
|
+
/update-status
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
2. **利用每天的开始或结束**
|
|
153
|
+
- 早晨:`/update-status` 了解最新状态
|
|
154
|
+
- 下午:`/update-status` 汇总今天的工作
|
|
155
|
+
|
|
156
|
+
3. **每周末进行全量同步**
|
|
157
|
+
```bash
|
|
158
|
+
/sync
|
|
159
|
+
```
|