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,90 @@
|
|
|
1
|
+
# 扩展自定义数据权限类型 - 完整指南
|
|
2
|
+
|
|
3
|
+
## 步骤 1:修改 DataScopeType 枚举
|
|
4
|
+
|
|
5
|
+
位置:`ruoyi-common-mybatis/.../enums/DataScopeType.java`
|
|
6
|
+
|
|
7
|
+
```java
|
|
8
|
+
public enum DataScopeType {
|
|
9
|
+
|
|
10
|
+
// ... 现有类型 ...
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 按区域过滤(自定义类型示例)
|
|
14
|
+
*/
|
|
15
|
+
REGION("7", "按区域", "#{#regionName} IN ( #{@sdss.getUserRegions( #user.userId )} )"),
|
|
16
|
+
;
|
|
17
|
+
|
|
18
|
+
// ... 其他代码 ...
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 步骤 2:在 ISysDataScopeService 中添加方法
|
|
23
|
+
|
|
24
|
+
```java
|
|
25
|
+
// 接口
|
|
26
|
+
public interface ISysDataScopeService {
|
|
27
|
+
// ... 现有方法 ...
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 获取用户关联的区域ID列表
|
|
31
|
+
*/
|
|
32
|
+
String getUserRegions(Long userId);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 实现
|
|
36
|
+
@Service("sdss")
|
|
37
|
+
public class SysDataScopeServiceImpl implements ISysDataScopeService {
|
|
38
|
+
|
|
39
|
+
@Override
|
|
40
|
+
@Cacheable(cacheNames = CacheNames.SYS_USER_REGIONS, key = "#userId")
|
|
41
|
+
public String getUserRegions(Long userId) {
|
|
42
|
+
List<Long> regionIds = userRegionMapper.selectRegionIdsByUserId(userId);
|
|
43
|
+
if (CollUtil.isEmpty(regionIds)) {
|
|
44
|
+
return "-1"; // 返回 -1 表示无权限
|
|
45
|
+
}
|
|
46
|
+
return StringUtils.join(regionIds, ",");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 步骤 3:使用新权限类型
|
|
52
|
+
|
|
53
|
+
```java
|
|
54
|
+
@DataPermission({
|
|
55
|
+
@DataColumn(key = "regionName", value = "region_id")
|
|
56
|
+
})
|
|
57
|
+
@Override
|
|
58
|
+
public List<Store> listByRegion(StoreBo bo) {
|
|
59
|
+
return list(buildQueryWrapper(bo));
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 添加自定义变量
|
|
64
|
+
|
|
65
|
+
通过 `DataPermissionHelper` 设置自定义变量供 SpEL 表达式使用。
|
|
66
|
+
|
|
67
|
+
```java
|
|
68
|
+
@Service
|
|
69
|
+
@RequiredArgsConstructor
|
|
70
|
+
public class OrderServiceImpl implements IOrderService {
|
|
71
|
+
|
|
72
|
+
private final OrderMapper baseMapper;
|
|
73
|
+
|
|
74
|
+
@Override
|
|
75
|
+
public TableDataInfo<OrderVo> pageByShop(Long shopId, OrderBo bo, PageQuery pageQuery) {
|
|
76
|
+
// 设置自定义变量(请求结束后 SaStorage 自动清理,无需手动移除)
|
|
77
|
+
DataPermissionHelper.setVariable("shopId", shopId);
|
|
78
|
+
return pageWithPermission(bo, pageQuery);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@DataPermission({
|
|
82
|
+
@DataColumn(key = "shopId", value = "shop_id")
|
|
83
|
+
})
|
|
84
|
+
private TableDataInfo<OrderVo> pageWithPermission(OrderBo bo, PageQuery pageQuery) {
|
|
85
|
+
LambdaQueryWrapper<Order> lqw = buildQueryWrapper(bo);
|
|
86
|
+
Page<OrderVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
87
|
+
return TableDataInfo.build(result);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: database-ops
|
|
3
|
+
description: |
|
|
4
|
+
数据库操作规范。包含建表模板、Entity 实体类模板、八大数据库设计模式、多数据库兼容。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 创建数据库表(MySQL/PostgreSQL/Oracle/SQL Server)
|
|
8
|
+
- 设计 Entity 实体类(TenantEntity、@TableLogic、@Version)
|
|
9
|
+
- 配置逻辑删除、乐观锁、审计字段
|
|
10
|
+
- 树结构表设计(祖先路径法/父子法)
|
|
11
|
+
- 字典数据和菜单 SQL 配置
|
|
12
|
+
|
|
13
|
+
触发词:数据库、SQL、建表、CREATE TABLE、Entity、TenantEntity、@TableLogic、del_flag、逻辑删除、字典、菜单SQL、表设计、字段设计、数据库设计
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# 数据库操作规范(RuoYi-Vue-Plus 三层架构版)
|
|
17
|
+
|
|
18
|
+
> **⚠️ 重要声明**: 本项目是 **RuoYi-Vue-Plus 纯后端项目**,采用三层架构!
|
|
19
|
+
> 本文档规范基于 **TestDemo 模块**的真实实现。
|
|
20
|
+
|
|
21
|
+
## 核心架构特征
|
|
22
|
+
|
|
23
|
+
| 对比项 | 本项目 (RuoYi-Vue-Plus) |
|
|
24
|
+
|--------|----------------------|
|
|
25
|
+
| **包名前缀** | `org.dromara.*` |
|
|
26
|
+
| **架构** | 三层:Controller → Service → Mapper |
|
|
27
|
+
| **Entity基类** | `TenantEntity`(多租户) |
|
|
28
|
+
| **主键策略** | 雪花 ID(不用 AUTO_INCREMENT) |
|
|
29
|
+
| **逻辑删除** | `@TableLogic private Long delFlag;`(Long 类型) |
|
|
30
|
+
| **乐观锁** | `@Version private Long version;` |
|
|
31
|
+
| **对象转换** | `MapstructUtils.convert()` |
|
|
32
|
+
| **表前缀** | 按模块区分:sys_/test_/flow_ 等 |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 1. Entity 实体类模板(带逻辑删除)
|
|
37
|
+
|
|
38
|
+
```java
|
|
39
|
+
package org.dromara.demo.domain;
|
|
40
|
+
|
|
41
|
+
import org.dromara.common.tenant.core.TenantEntity;
|
|
42
|
+
import com.baomidou.mybatisplus.annotation.*;
|
|
43
|
+
import lombok.Data;
|
|
44
|
+
import lombok.EqualsAndHashCode;
|
|
45
|
+
import java.io.Serial;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* XXX 对象
|
|
49
|
+
*
|
|
50
|
+
* @author Lion Li
|
|
51
|
+
*/
|
|
52
|
+
@Data
|
|
53
|
+
@EqualsAndHashCode(callSuper = true)
|
|
54
|
+
@TableName("demo_xxx")
|
|
55
|
+
public class Xxx extends TenantEntity {
|
|
56
|
+
|
|
57
|
+
@Serial
|
|
58
|
+
private static final long serialVersionUID = 1L;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* 主键 ID
|
|
62
|
+
*/
|
|
63
|
+
@TableId(value = "id")
|
|
64
|
+
private Long id;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 名称
|
|
68
|
+
*/
|
|
69
|
+
private String xxxName;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* 状态(0正常 1停用)
|
|
73
|
+
*/
|
|
74
|
+
private String status;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 版本号(乐观锁)
|
|
78
|
+
*/
|
|
79
|
+
@Version
|
|
80
|
+
private Long version;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* 删除标志(0正常 1已删除)
|
|
84
|
+
* ✅ 使用 @TableLogic 标记,MyBatis-Plus 自动处理逻辑删除
|
|
85
|
+
* ✅ 类型必须是 Long(自动映射到数据库 del_flag BIGINT)
|
|
86
|
+
*/
|
|
87
|
+
@TableLogic
|
|
88
|
+
private Long delFlag;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 2. MySQL CREATE TABLE 模板
|
|
95
|
+
|
|
96
|
+
```sql
|
|
97
|
+
CREATE TABLE `demo_xxx` (
|
|
98
|
+
-- 主键和租户
|
|
99
|
+
`id` BIGINT(20) NOT NULL COMMENT '主键 ID',
|
|
100
|
+
`tenant_id` VARCHAR(20) DEFAULT '000000' COMMENT '租户 ID',
|
|
101
|
+
|
|
102
|
+
-- 业务字段
|
|
103
|
+
`xxx_name` VARCHAR(100) NOT NULL COMMENT '名称',
|
|
104
|
+
`status` CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
|
|
105
|
+
|
|
106
|
+
-- 版本和删除
|
|
107
|
+
`version` INT(0) DEFAULT 0 COMMENT '版本号',
|
|
108
|
+
`del_flag` BIGINT(20) DEFAULT 0 COMMENT '删除标志(0正常 1已删除)',
|
|
109
|
+
|
|
110
|
+
-- 审计字段(必须)
|
|
111
|
+
`create_dept` BIGINT(20) DEFAULT NULL COMMENT '创建部门',
|
|
112
|
+
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建人',
|
|
113
|
+
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
114
|
+
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新人',
|
|
115
|
+
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
116
|
+
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注(可选业务字段,不在 BaseEntity 中)',
|
|
117
|
+
|
|
118
|
+
PRIMARY KEY (`id`)
|
|
119
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='XXX表';
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 3. PostgreSQL CREATE TABLE 模板
|
|
125
|
+
|
|
126
|
+
```sql
|
|
127
|
+
CREATE TABLE demo_xxx (
|
|
128
|
+
-- 主键和租户
|
|
129
|
+
id BIGINT NOT NULL,
|
|
130
|
+
tenant_id VARCHAR(20) DEFAULT '000000',
|
|
131
|
+
|
|
132
|
+
-- 业务字段
|
|
133
|
+
xxx_name VARCHAR(100) NOT NULL,
|
|
134
|
+
status CHAR(1) DEFAULT '0',
|
|
135
|
+
|
|
136
|
+
-- 版本和删除
|
|
137
|
+
version INT DEFAULT 0,
|
|
138
|
+
del_flag BIGINT DEFAULT 0,
|
|
139
|
+
|
|
140
|
+
-- 审计字段
|
|
141
|
+
create_dept BIGINT DEFAULT NULL,
|
|
142
|
+
create_by BIGINT DEFAULT NULL,
|
|
143
|
+
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
144
|
+
update_by BIGINT DEFAULT NULL,
|
|
145
|
+
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
146
|
+
remark VARCHAR(500) DEFAULT NULL,
|
|
147
|
+
|
|
148
|
+
PRIMARY KEY (id)
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
COMMENT ON TABLE demo_xxx IS 'XXX表';
|
|
152
|
+
COMMENT ON COLUMN demo_xxx.id IS '主键 ID';
|
|
153
|
+
COMMENT ON COLUMN demo_xxx.tenant_id IS '租户 ID';
|
|
154
|
+
COMMENT ON COLUMN demo_xxx.xxx_name IS '名称';
|
|
155
|
+
COMMENT ON COLUMN demo_xxx.del_flag IS '删除标志(0正常 1已删除)';
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 4. 八大数据库设计模式
|
|
161
|
+
|
|
162
|
+
### 模式一:多租户隔离
|
|
163
|
+
|
|
164
|
+
```java
|
|
165
|
+
// 自动处理:TenantEntity 已包含
|
|
166
|
+
private String tenantId; // 自动填充为当前租户 ID
|
|
167
|
+
|
|
168
|
+
// SQL 查询自动添加租户过滤:
|
|
169
|
+
// WHERE tenant_id = ?
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**使用场景**:所有需要租户隔离的业务表
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
### 模式二:树结构 - 祖先路径法(推荐)
|
|
177
|
+
|
|
178
|
+
```sql
|
|
179
|
+
CREATE TABLE demo_tree (
|
|
180
|
+
id BIGINT NOT NULL,
|
|
181
|
+
parent_id BIGINT,
|
|
182
|
+
ancestors VARCHAR(500), -- 祖先路径:0,1,2,3
|
|
183
|
+
name VARCHAR(100),
|
|
184
|
+
del_flag BIGINT DEFAULT 0,
|
|
185
|
+
PRIMARY KEY (id),
|
|
186
|
+
INDEX idx_ancestors (ancestors)
|
|
187
|
+
) COMMENT='树形表';
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**优势**:快速查询所有祖先和子孙节点(无需递归)
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
### 模式三:树结构 - 简单父子法
|
|
195
|
+
|
|
196
|
+
```sql
|
|
197
|
+
CREATE TABLE demo_tree_simple (
|
|
198
|
+
id BIGINT NOT NULL,
|
|
199
|
+
parent_id BIGINT,
|
|
200
|
+
name VARCHAR(100),
|
|
201
|
+
del_flag BIGINT DEFAULT 0,
|
|
202
|
+
PRIMARY KEY (id),
|
|
203
|
+
FOREIGN KEY (parent_id) REFERENCES demo_tree_simple(id)
|
|
204
|
+
) COMMENT='简单树形表';
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**适用**:二级分类、简单层级
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
### 模式四:软删除(逻辑删除)
|
|
212
|
+
|
|
213
|
+
```java
|
|
214
|
+
// Java Entity 中
|
|
215
|
+
@TableLogic
|
|
216
|
+
private Long delFlag; // 0=正常,1=已删除
|
|
217
|
+
|
|
218
|
+
// MyBatis-Plus 自动处理
|
|
219
|
+
// INSERT/UPDATE: 业务代码不变
|
|
220
|
+
// SELECT: 自动添加 WHERE del_flag = 0
|
|
221
|
+
// DELETE: 转换为 UPDATE del_flag = 1
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**优势**:数据可恢复,审计日志完整
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
### 模式五:审计追踪(自动填充)
|
|
229
|
+
|
|
230
|
+
```sql
|
|
231
|
+
CREATE TABLE demo_audit (
|
|
232
|
+
id BIGINT NOT NULL,
|
|
233
|
+
create_dept BIGINT, -- 创建部门(自动填充)
|
|
234
|
+
create_by BIGINT, -- 创建人(自动填充)
|
|
235
|
+
create_time DATETIME, -- 创建时间(自动填充)
|
|
236
|
+
update_by BIGINT, -- 更新人(自动填充)
|
|
237
|
+
update_time DATETIME, -- 更新时间(自动填充)
|
|
238
|
+
PRIMARY KEY (id)
|
|
239
|
+
) COMMENT='带审计的表';
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**TenantEntity 已包含所有审计字段**
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
### 模式六:状态字段(字典驱动)
|
|
247
|
+
|
|
248
|
+
```java
|
|
249
|
+
@ExcelProperty(value = "状态")
|
|
250
|
+
@ExcelDictFormat(dictType = "sys_normal_disable")
|
|
251
|
+
private String status; // 0=正常,1=停用
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**配合字典表**:不硬编码状态值,支持动态扩展
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
### 模式七:数据权限控制
|
|
259
|
+
|
|
260
|
+
```java
|
|
261
|
+
// ✅ 在 Mapper 接口上标注(类级别或方法级别均可)
|
|
262
|
+
@DataPermission({
|
|
263
|
+
@DataColumn(key = "deptName", value = "dept_id"),
|
|
264
|
+
@DataColumn(key = "userName", value = "user_id")
|
|
265
|
+
})
|
|
266
|
+
public interface XxxMapper extends BaseMapperPlus<Xxx, XxxVo> {
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**权限类型**(通过 `sys_role.data_scope` 配置):
|
|
271
|
+
- 1=全部数据权限、2=自定义数据权限、3=本部门数据权限
|
|
272
|
+
- 4=本部门及以下数据权限、5=仅本人数据权限
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
### 模式八:跨数据库兼容
|
|
277
|
+
|
|
278
|
+
| 场景 | MySQL | PostgreSQL | Oracle | SQL Server |
|
|
279
|
+
|------|-------|-----------|--------|------------|
|
|
280
|
+
| 查询 Long 字段 | `LIKE` | `CAST AS VARCHAR)` | `TO_CHAR()` | `CAST` |
|
|
281
|
+
| 自增ID | MyBatis-Plus 雪花ID | 同 | 同 | 同 |
|
|
282
|
+
| 日期函数 | `CURRENT_TIMESTAMP` | `NOW()` | `SYSDATE` | `GETDATE()` |
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 5. 模块表前缀参考
|
|
287
|
+
|
|
288
|
+
| 模块 | 前缀 | 包路径 | 示例表 |
|
|
289
|
+
|------|------|--------|---------|
|
|
290
|
+
| system | `sys_` | `org.dromara.system` | sys_user, sys_menu |
|
|
291
|
+
| demo | `test_` | `org.dromara.demo` | test_demo, test_tree |
|
|
292
|
+
| workflow | `flow_` | `org.dromara.workflow` | flow_xxx |
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## 6. 常见错误对比
|
|
297
|
+
|
|
298
|
+
### ❌ 不要做
|
|
299
|
+
|
|
300
|
+
```sql
|
|
301
|
+
-- 错误1: 使用自增 ID
|
|
302
|
+
id INT AUTO_INCREMENT
|
|
303
|
+
|
|
304
|
+
-- 错误2: 使用 TINYINT 存储删除标志
|
|
305
|
+
del_flag TINYINT(1) -- ❌ 应该用 BIGINT
|
|
306
|
+
|
|
307
|
+
-- 错误3: 软删除字段缺少注释
|
|
308
|
+
del_flag BIGINT -- ❌ 应添加注释说明用途
|
|
309
|
+
|
|
310
|
+
-- 错误4: 缺少审计字段
|
|
311
|
+
CREATE TABLE xxx (id BIGINT) -- ❌ 缺少 create_by, update_by 等
|
|
312
|
+
|
|
313
|
+
-- 错误5: 字段名不规范
|
|
314
|
+
userName VARCHAR(50) -- ❌ 应该是 user_name
|
|
315
|
+
|
|
316
|
+
-- 错误6: COMMENT 使用英文(⚠️ 高频错误,尤其 Codex 协作时)
|
|
317
|
+
`user_name` VARCHAR(50) COMMENT 'user name' -- ❌ 禁止英文!
|
|
318
|
+
`status` CHAR(1) COMMENT 'status(0=normal 1=off)' -- ❌ 禁止英文!
|
|
319
|
+
COMMENT='user table' -- ❌ 表注释也禁止英文!
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### ✅ 正确做法
|
|
323
|
+
|
|
324
|
+
```sql
|
|
325
|
+
-- 正确1: 使用雪花 ID(MyBatis-Plus 自动生成)
|
|
326
|
+
id BIGINT(20) NOT NULL
|
|
327
|
+
|
|
328
|
+
-- 正确2: 逻辑删除字段用 BIGINT
|
|
329
|
+
del_flag BIGINT(20) DEFAULT 0 COMMENT '删除标志'
|
|
330
|
+
|
|
331
|
+
-- 正确3: 添加完整注释
|
|
332
|
+
del_flag BIGINT(20) DEFAULT 0 COMMENT '删除标志(0正常 1已删除)'
|
|
333
|
+
|
|
334
|
+
-- 正确4: 包含所有审计字段(TenantEntity 提供)
|
|
335
|
+
CREATE TABLE xxx (
|
|
336
|
+
create_by BIGINT,
|
|
337
|
+
create_time DATETIME,
|
|
338
|
+
update_by BIGINT,
|
|
339
|
+
update_time DATETIME
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
-- 正确5: 字段名使用蛇形命名法
|
|
343
|
+
user_name VARCHAR(50)
|
|
344
|
+
|
|
345
|
+
-- 正确6: COMMENT 必须使用中文
|
|
346
|
+
`user_name` VARCHAR(50) COMMENT '用户名' -- ✅ 中文
|
|
347
|
+
`status` CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)' -- ✅ 中文
|
|
348
|
+
COMMENT='用户表' -- ✅ 表注释中文
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 7. 检查清单
|
|
354
|
+
|
|
355
|
+
生成表前必须检查:
|
|
356
|
+
|
|
357
|
+
- [ ] **主键是否是 BIGINT(20)?**(使用雪花 ID)
|
|
358
|
+
- [ ] **是否有 tenant_id 字段?**(多租户隔离)
|
|
359
|
+
- [ ] **是否有 del_flag BIGINT 字段?**(逻辑删除)
|
|
360
|
+
- [ ] **是否有 version BIGINT 字段?**(乐观锁)
|
|
361
|
+
- [ ] **是否有完整的审计字段?**(create_by, create_time, update_by, update_time)
|
|
362
|
+
- [ ] **字段名是否全部使用蛇形命名法?**(xxx_name 而非 xxxName)
|
|
363
|
+
- [ ] **所有字段是否有注释?**
|
|
364
|
+
- [ ] **所有 COMMENT 是否使用中文?**(禁止英文 COMMENT,包括字段注释和表注释)
|
|
365
|
+
- [ ] **Entity 是否继承 TenantEntity?**
|
|
366
|
+
- [ ] **@TableLogic 注解是否应用到 delFlag?**
|
|
367
|
+
- [ ] **SQL 脚本是否保存到正确目录?**(script/sql/ry_vue_5.X.sql)
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## 8. SQL 文件位置
|
|
372
|
+
|
|
373
|
+
| 数据库 | 脚本位置 |
|
|
374
|
+
|--------|---------|
|
|
375
|
+
| MySQL | `script/sql/ry_vue_5.X.sql` |
|
|
376
|
+
| PostgreSQL | `script/sql/postgres/postgres_ry_vue_5.X.sql` |
|
|
377
|
+
| Oracle | `script/sql/oracle/oracle_ry_vue_5.X.sql` |
|
|
378
|
+
| SQL Server | `script/sql/sqlserver/sqlserver_ry_vue_5.X.sql` |
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## 参考实现
|
|
383
|
+
|
|
384
|
+
查看已有的完整实现:
|
|
385
|
+
|
|
386
|
+
- **Entity 参考**: `org.dromara.demo.domain.TestDemo`
|
|
387
|
+
- **表结构参考**: `script/sql/ry_vue_5.X.sql` 中的 test_demo 表
|
|
388
|
+
|
|
389
|
+
**特别注意**:
|
|
390
|
+
- ✅ 软删除字段类型是 `Long delFlag`(不是 CHAR(1))
|
|
391
|
+
- ✅ MyBatis-Plus 自动将 Java `delFlag` 映射到数据库 `del_flag`
|
|
392
|
+
- ✅ `@TableLogic` 注解自动处理查询和删除操作
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## 参考实现
|
|
397
|
+
|
|
398
|
+
查看已有的完整实现:
|
|
399
|
+
|
|
400
|
+
- **Entity 参考**: `org.dromara.demo.domain.TestDemo`
|
|
401
|
+
- **表结构参考**: `script/sql/ry_vue_5.X.sql` 中的 test_demo 表
|
|
402
|
+
|
|
403
|
+
**特别注意**:
|
|
404
|
+
- ✅ 软删除字段类型是 `Long delFlag`(不是 CHAR(1))
|
|
405
|
+
- ✅ MyBatis-Plus 自动将 Java `delFlag` 映射到数据库 `del_flag`
|
|
406
|
+
- ✅ `@TableLogic` 注解自动处理查询和删除操作
|
|
407
|
+
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dev
|
|
3
|
+
description: |
|
|
4
|
+
当需要从零开始开发新功能、完整开发流程时自动使用此 Skill。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 需要从零开始开发一个新功能
|
|
8
|
+
- 需要设计数据库表并生成代码
|
|
9
|
+
- 需要完整的开发流程引导
|
|
10
|
+
- 需要配置代码生成器并生成后端代码
|
|
11
|
+
|
|
12
|
+
触发词:开发功能、dev、新功能、功能开发、从零开发、完整开发、开发新模块
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# /dev - 开发新功能(RuoYi-Vue-Plus 纯后端版)
|
|
16
|
+
|
|
17
|
+
智能代码生成器配置助手,专为 RuoYi-Vue-Plus 三层架构(Controller→Service→Mapper)设计。
|
|
18
|
+
|
|
19
|
+
## 🎯 核心优势
|
|
20
|
+
- ✅ **纯后端专注**:无前端,专注后端 CRUD 代码生成
|
|
21
|
+
- ✅ **包名适配**:`org.dromara.*`
|
|
22
|
+
- ✅ **智能推断**:模块 → 表前缀 → 包名 → 图标自动识别
|
|
23
|
+
- ✅ **全自动配置**:代码生成器配置完整(gen_table + gen_table_column)
|
|
24
|
+
- ✅ **菜单权限**:自动生成完整的菜单和权限配置
|
|
25
|
+
|
|
26
|
+
## 🚀 执行流程
|
|
27
|
+
|
|
28
|
+
### 第一步:需求确认
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
请告诉我要开发的功能:
|
|
32
|
+
|
|
33
|
+
1. **功能名称**?(如:广告管理、反馈管理)
|
|
34
|
+
2. **所属模块**?(system/business/其他)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**自动推断**:
|
|
38
|
+
|
|
39
|
+
| 模块 | 表前缀 | 包名 | 上级菜单 |
|
|
40
|
+
|------|--------|------|---------|
|
|
41
|
+
| system | `sys_` | `org.dromara.system` | 系统管理 |
|
|
42
|
+
| business | `b_` | `org.dromara.business` | 业务管理 |
|
|
43
|
+
| 其他(如 demo) | `demo_` | `org.dromara.demo` | [模块]管理 |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
### 第二步:功能重复检查(强制执行)⭐⭐⭐⭐⭐
|
|
48
|
+
|
|
49
|
+
**⚠️ 重要**:检查功能是否已存在,避免重复开发
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 1. 检查后端代码
|
|
53
|
+
Grep pattern: "[功能名]Service" path: ruoyi-modules/ output_mode: files_with_matches
|
|
54
|
+
Grep pattern: "[功能名]Controller" path: ruoyi-modules/ output_mode: files_with_matches
|
|
55
|
+
|
|
56
|
+
# 2. 检查数据库表
|
|
57
|
+
SHOW TABLES LIKE '[表前缀]%';
|
|
58
|
+
|
|
59
|
+
# 3. 检查菜单
|
|
60
|
+
SELECT menu_name FROM sys_menu WHERE menu_name LIKE '%[功能名]%';
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
### 第三步:数据库现状分析(自动执行)
|
|
66
|
+
|
|
67
|
+
从 `ruoyi-admin/src/main/resources/application-dev.yml` 动态读取数据库配置。
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
### 第四步:智能表结构设计
|
|
72
|
+
|
|
73
|
+
#### 智能字段命名和推断
|
|
74
|
+
|
|
75
|
+
| 字段后缀 | 推断结果 | 控件类型 | 查询方式 |
|
|
76
|
+
|---------|---------|---------|---------|
|
|
77
|
+
| `xxx_name` | 名称 | input | LIKE |
|
|
78
|
+
| `xxx_title` | 标题 | input | LIKE |
|
|
79
|
+
| `xxx_content` | 内容 | editor | 富文本 |
|
|
80
|
+
| `status` | 状态 | select | EQ + sys_normal_disable |
|
|
81
|
+
| `xxx_type` | 分类 | select | EQ + 自定义字典 |
|
|
82
|
+
| `is_xxx` | 是否 | radio | EQ + sys_boolean_flag |
|
|
83
|
+
| `xxx_amount` / `xxx_price` | 金额 | numberInput | EQ |
|
|
84
|
+
| `xxx_time` / `xxx_date` | 时间 | datetime | BETWEEN |
|
|
85
|
+
|
|
86
|
+
#### 标准表结构模板
|
|
87
|
+
|
|
88
|
+
```sql
|
|
89
|
+
CREATE TABLE [表前缀]_[功能名] (
|
|
90
|
+
id BIGINT(20) NOT NULL COMMENT '主键ID',
|
|
91
|
+
tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
|
|
92
|
+
|
|
93
|
+
-- 业务字段
|
|
94
|
+
xxx_name VARCHAR(100) NOT NULL COMMENT '名称',
|
|
95
|
+
xxx_type CHAR(1) DEFAULT '1' COMMENT '类型',
|
|
96
|
+
status CHAR(1) DEFAULT '1' COMMENT '状态(0停用 1正常)',
|
|
97
|
+
|
|
98
|
+
-- 审计字段
|
|
99
|
+
create_by BIGINT(20) DEFAULT NULL COMMENT '创建人',
|
|
100
|
+
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
101
|
+
update_by BIGINT(20) DEFAULT NULL COMMENT '更新人',
|
|
102
|
+
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
103
|
+
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
|
104
|
+
del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志',
|
|
105
|
+
|
|
106
|
+
PRIMARY KEY (id)
|
|
107
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx表';
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
### 第五步:生成方案并确认(仅此一次确认)
|
|
113
|
+
|
|
114
|
+
```markdown
|
|
115
|
+
## 📋 代码生成方案
|
|
116
|
+
|
|
117
|
+
### 基本配置
|
|
118
|
+
- **功能名称**:广告管理
|
|
119
|
+
- **模块**:business
|
|
120
|
+
- **表名**:b_ad
|
|
121
|
+
- **Java类名**:Ad
|
|
122
|
+
- **包名**:org.dromara.business
|
|
123
|
+
- **接口路径**:/business/ad
|
|
124
|
+
|
|
125
|
+
### 菜单配置
|
|
126
|
+
- **上级菜单**:业务管理 (menu_id: 1001)
|
|
127
|
+
- **菜单顺序**:20
|
|
128
|
+
- **菜单图标**:ad (自动匹配)
|
|
129
|
+
|
|
130
|
+
**确认开始生成?**
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
### 第六步:自动执行生成(无需确认)
|
|
136
|
+
|
|
137
|
+
用户确认后,AI 自动执行:
|
|
138
|
+
1. 建表 SQL
|
|
139
|
+
2. 创建字典(如需要)
|
|
140
|
+
3. 生成代码生成器配置 SQL
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### 第七步:完成报告
|
|
145
|
+
|
|
146
|
+
```markdown
|
|
147
|
+
## 🎉 代码生成方案配置完成!
|
|
148
|
+
|
|
149
|
+
### 已完成
|
|
150
|
+
- ✅ 数据库表创建:b_ad
|
|
151
|
+
- ✅ 业务字典创建:b_ad_type(3 个字典项)
|
|
152
|
+
- ✅ 菜单配置:广告管理(自动导入启用)
|
|
153
|
+
- ✅ 代码生成配置:表 + 11 个字段
|
|
154
|
+
|
|
155
|
+
## 🚀 下一步:前往代码生成器生成代码
|
|
156
|
+
|
|
157
|
+
1. **登录系统后台**:http://localhost:8080
|
|
158
|
+
2. **导航**:系统工具 → 代码生成
|
|
159
|
+
3. **查找表**:找到 `b_ad` 表
|
|
160
|
+
4. **生成代码**:点击【生成代码】按钮
|
|
161
|
+
5. **重启服务**:代码生成后需重启后端服务
|
|
162
|
+
|
|
163
|
+
### 生成后的文件结构
|
|
164
|
+
|
|
165
|
+
\`\`\`
|
|
166
|
+
ruoyi-system/
|
|
167
|
+
├── controller/business/AdController.java
|
|
168
|
+
├── domain/Ad.java
|
|
169
|
+
├── domain/bo/AdBo.java
|
|
170
|
+
├── domain/vo/AdVo.java
|
|
171
|
+
├── mapper/AdMapper.java
|
|
172
|
+
├── service/IAdService.java
|
|
173
|
+
└── service/impl/AdServiceImpl.java
|
|
174
|
+
\`\`\`
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## ⚠️ AI 执行规则
|
|
180
|
+
|
|
181
|
+
1. ✅ **仅后端**:三层架构(Controller→Service→Mapper)
|
|
182
|
+
2. ✅ **包名**:必须是 `org.dromara.*`
|
|
183
|
+
3. ✅ **一次确认**:第五步确认后全自动执行
|
|
184
|
+
4. ✅ **tenant_id**:框架自动处理,所有权限配置为 0
|
|
185
|
+
5. ✅ **检查功能重复**:禁止重复开发相同功能
|
|
186
|
+
6. ✅ **智能字段推断**:根据字段名后缀自动推断控件和查询方式
|
|
187
|
+
7. ✅ **字典智能处理**:检查字典存在性,不存在则创建
|