SKILL.mdc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. ---
  2. name: dao-crud
  3. description: >-
  4. 创建对象或功能项的CRUD全链路脚手架。当用户需要为某个实体创建完整的数据库持久层、业务层和控制器层时使用本技能,包括:Table接口、SqlProvider、Mapper、DBService接口/实现类、BizFilter、BizHelper和Controller。触发场景如:"帮我创建一个XXX的CRUD"、"生成XXX的全套代码"、"生成XXX的增删查改"。
  5. ---
  6. # DAO CRUD 全链路脚手架生成
  7. 本技能用于快速生成一个对象或功能项的完整 CRUD 链路代码,包括数据库持久层、业务处理层和 API 控制器层。
  8. ## 工作流程
  9. ### 第一步:确认对象名称
  10. **必须先询问用户**要创建的对象/功能项名称(如:`DevEntity`、`PatrolTask` 等)。
  11. ### 第二步:生成代码骨架
  12. 按照以下顺序创建 **8** 个文件,**扩展函数和具体实现均可留空或抛出 `UnsupportedOperationException`,由用户自行补全**。
  13. #### 2.1 Table 接口
  14. **文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/tables/{EntityName}Table.java`
  15. **模板**:
  16. ```java
  17. package com.shkpr.service.alamdmaordertask.dbdao.tables;
  18. import java.util.HashSet;
  19. import java.util.Set;
  20. public interface {EntityName}Table {
  21. interface R_INFO{
  22. String TABLE = ""; // TODO: 填写查询表/视图名
  23. String PRIMARY_KEY = ""; // TODO: 填写主键字段
  24. String ALL_FILED = "*";
  25. String UNIQUE_ID = "";
  26. String DEFAULT_ORDER = "";
  27. Set<String> LIKE_SUPPORT_FILTER = new HashSet<String>(){{}};
  28. }
  29. interface W_INFO{
  30. String TABLE = ""; // TODO: 填写写入表名
  31. String PRIMARY_KEY = ""; // TODO: 填写主键字段
  32. String UNIQUE_ID = "";
  33. }
  34. }
  35. ```
  36. #### 2.2 SqlProvider
  37. **文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/providers/{EntityName}SqlProvider.java`
  38. **模板**:
  39. ```java
  40. package com.shkpr.service.alamdmaordertask.dbdao.providers;
  41. import com.shkpr.service.alamdmaordertask.dbdao.tables.{EntityName}Table;
  42. public class {EntityName}SqlProvider extends BaseSqlProvider implements {EntityName}Table {
  43. @Override
  44. public String getRTableName() {
  45. return R_INFO.TABLE;
  46. }
  47. @Override
  48. public String getWTableName() {
  49. return W_INFO.TABLE;
  50. }
  51. @Override
  52. public String getRUniqueId() {
  53. return R_INFO.UNIQUE_ID;
  54. }
  55. @Override
  56. public String getWUniqueId() {
  57. return W_INFO.UNIQUE_ID;
  58. }
  59. @Override
  60. public String getSAllFiled() {
  61. return R_INFO.ALL_FILED;
  62. }
  63. @Override
  64. public String getRPrimaryKey() {
  65. return R_INFO.PRIMARY_KEY;
  66. }
  67. @Override
  68. public String getWPrimaryKey() {
  69. return W_INFO.PRIMARY_KEY;
  70. }
  71. @Override
  72. public boolean isWJsonForFiled(String filedName) {
  73. return false;
  74. }
  75. // TODO: 根据业务需求扩展 SQL 方法
  76. }
  77. ```
  78. #### 2.3 Mapper 接口
  79. **文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/mapper/{EntityName}Mapper.java`
  80. **模板**:
  81. ```java
  82. package com.shkpr.service.alamdmaordertask.dbdao.mapper;
  83. import com.shkpr.service.alamdmaordertask.dbdao.BaseDBMapper;
  84. import com.shkpr.service.alamdmaordertask.dbdao.providers.{EntityName}SqlProvider;
  85. import org.apache.ibatis.annotations.InsertProvider;
  86. import org.apache.ibatis.annotations.Param;
  87. import org.apache.ibatis.annotations.SelectProvider;
  88. import org.apache.ibatis.annotations.UpdateProvider;
  89. import java.util.List;
  90. import java.util.Map;
  91. public interface {EntityName}Mapper extends BaseDBMapper{
  92. @Override
  93. @SelectProvider(type = {EntityName}SqlProvider.class, method = "totalCounts")
  94. int totalCounts(@Param("andWheres") Map<String, Object> andWheres
  95. , @Param("orWheres") Map<String, Object> orWheres
  96. , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
  97. , @Param("extend") String extend);
  98. @Override
  99. @SelectProvider(type = {EntityName}SqlProvider.class, method = "listAllWiths")
  100. List<Map<String, Object>> listAllWiths(@Param("table") String table
  101. , @Param("filed") String filed
  102. , @Param("limit") int limit
  103. , @Param("offset") int offset
  104. , @Param("andWheres") Map<String, Object> andWheres
  105. , @Param("orWheres") Map<String, Object> orWheres
  106. , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
  107. , @Param("extend") String extend
  108. , @Param("order") String order);
  109. @Override
  110. @SelectProvider(type = {EntityName}SqlProvider.class, method = "batchQueryWiths")
  111. List<Map<String, Object>> batchQueryWiths(@Param("table") String table
  112. , @Param("filed") String filed
  113. , @Param("andWheres") Map<String, Object> andWheres
  114. , @Param("orWheres") Map<String, Object> orWheres
  115. , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
  116. , @Param("extend") String extend
  117. , @Param("order") String order);
  118. @Override
  119. @SelectProvider(type = {EntityName}SqlProvider.class, method = "batchQueryIn")
  120. List<Map<String, Object>> batchQueryIn(@Param("table") String table
  121. , @Param("filed") String filed
  122. , @Param("ids") List<? extends Object> ids
  123. , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
  124. , @Param("extend") String extend
  125. , @Param("order") String order);
  126. @Override
  127. @SelectProvider(type = {EntityName}SqlProvider.class, method = "getOne")
  128. Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
  129. @Override
  130. @SelectProvider(type = {EntityName}SqlProvider.class, method = "existLine")
  131. boolean existLine(@Param("table") String table
  132. , @Param("andWheres") Map<String, Object> andWheres
  133. , @Param("orWheres") Map<String, Object> orWheres
  134. , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
  135. , @Param("extend") String extend);
  136. @Override
  137. @UpdateProvider(type = {EntityName}SqlProvider.class, method = "updateWiths")
  138. int updateWiths(@Param("datas") Map<String, Object> datas
  139. , @Param("andWheres") Map<String, Object> andWheres
  140. , @Param("orWheres") Map<String, Object> orWheres
  141. , @Param("extend") String extend);
  142. @Override
  143. @InsertProvider(type = {EntityName}SqlProvider.class, method = "inserts")
  144. int inserts(@Param("inserts") Map<String, Object> inserts);
  145. @Override
  146. @InsertProvider(type = {EntityName}SqlProvider.class, method = "batchInserts")
  147. int batchInserts(@Param("inserts") List<Map<String, Object>> inserts);
  148. @Override
  149. @InsertProvider(type = {EntityName}SqlProvider.class, method = "insertOrUpdate")
  150. int insertOrUpdate(@Param("inserts") Map<String, Object> inserts
  151. , @Param("uniques") List<Object> uniques
  152. , @Param("updates") List<Object> updates);
  153. // TODO: 根据业务需求扩展 Mapper 方法
  154. }
  155. ```
  156. #### 2.4 DBService 接口
  157. **文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/services/intef/{EntityName}DBService.java`
  158. **模板**:
  159. ```java
  160. package com.shkpr.service.alamdmaordertask.dbdao.services.intef;
  161. import com.shkpr.service.alamdmaordertask.dbdao.BaseDBFuncTemplate;
  162. import com.shkpr.service.alamdmaordertask.dbdao.mapper.{EntityName}Mapper;
  163. public abstract class {EntityName}DBService extends BaseDBFuncTemplate<{EntityName}Mapper> {
  164. // TODO: 根据业务需求扩展接口方法
  165. }
  166. ```
  167. #### 2.5 DBServiceImpl 实现类
  168. **文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/services/{EntityName}DBServiceImpl.java`
  169. **模板**:
  170. ```java
  171. package com.shkpr.service.alamdmaordertask.dbdao.services;
  172. import com.shkpr.service.alamdmaordertask.dbdao.mapper.{EntityName}Mapper;
  173. import com.shkpr.service.alamdmaordertask.dbdao.services.intef.{EntityName}DBService;
  174. import org.springframework.beans.factory.annotation.Autowired;
  175. import org.springframework.stereotype.Service;
  176. import javax.annotation.PostConstruct;
  177. @Service
  178. public class {EntityName}DBServiceImpl extends {EntityName}DBService {
  179. private String mStrClassName = "";
  180. private String mBusinessType = "";
  181. private String logTag = "";
  182. public {EntityName}DBServiceImpl() {
  183. mStrClassName = this.getClass().getSimpleName();
  184. mBusinessType = "";
  185. logTag = "{EntityName}";
  186. }
  187. @SuppressWarnings("all")
  188. @Autowired
  189. {EntityName}Mapper {entityName}Mapper;
  190. @PostConstruct
  191. public void postConstruct(){
  192. init({entityName}Mapper, mBusinessType, logTag);
  193. }
  194. // TODO: 根据业务需求扩展接口方法
  195. }
  196. ```
  197. #### 2.6 BizFilter 过滤器
  198. **文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/controllerfilter/third/ThirdJWT{EntityName}BizFilter.java`
  199. **模板**:
  200. ```java
  201. package com.shkpr.service.alamdmaordertask.controllerfilter.third;
  202. import com.shkpr.service.alamdmaordertask.controllercheck.ThirdCommTaskControllerCheck;
  203. import com.shkpr.service.alamdmaordertask.controllerfilter.JWTAuthenticationFilter;
  204. import org.springframework.security.authentication.AuthenticationManager;
  205. import org.springframework.security.web.util.matcher.RequestMatcher;
  206. import javax.servlet.FilterChain;
  207. import javax.servlet.ServletException;
  208. import javax.servlet.http.HttpServletRequest;
  209. import javax.servlet.http.HttpServletResponse;
  210. import java.io.IOException;
  211. import java.util.HashMap;
  212. import java.util.Map;
  213. public class ThirdJWT{EntityName}BizFilter extends JWTAuthenticationFilter {
  214. private RequestMatcher mRequestMatcher = null;
  215. private ThirdCommTaskControllerCheck mControllerCheck = null;
  216. private static final Map<String, String> msMapURI2Method;
  217. static {
  218. msMapURI2Method = new HashMap<String, String>();
  219. // TODO: 配置 API 路由映射,例如:
  220. // msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_XXX_H, ApiURI.URI_XXX_LIST), "POST");
  221. }
  222. public ThirdJWT{EntityName}BizFilter(AuthenticationManager authenticationManager) {
  223. super(authenticationManager);
  224. this.mStrThisSampleName = this.getClass().getSimpleName();
  225. this.mControllerCheck = new ThirdCommTaskControllerCheck(msMapURI2Method);
  226. setControllerCheck(this.mControllerCheck);
  227. }
  228. public ThirdJWT{EntityName}BizFilter(String url, AuthenticationManager authenticationManager) {
  229. super(url, authenticationManager);
  230. this.mStrThisSampleName = this.getClass().getSimpleName();
  231. this.mControllerCheck = new ThirdCommTaskControllerCheck(msMapURI2Method);
  232. setControllerCheck(this.mControllerCheck);
  233. }
  234. @Override
  235. public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
  236. super.doFilterInternal(request, response, chain);
  237. }
  238. }
  239. ```
  240. #### 2.7 BizHelper 业务处理类
  241. **文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/busihandler/{EntityName}BizHelper.java`
  242. **模板**:
  243. ```java
  244. package com.shkpr.service.alamdmaordertask.busihandler;
  245. import com.shkpr.service.alamdmaordertask.dbdao.DBMgrProxy;
  246. import com.shkpr.service.alamdmaordertask.dbdao.services.intef.{EntityName}DBService;
  247. import java.util.*;
  248. public class {EntityName}BizHelper {
  249. private final static String mStrClassName = "{EntityName}BizHelper";
  250. private static {EntityName}DBService getThisDBService(){
  251. return DBMgrProxy.getInstance().applyXXXApi({EntityName}DBService.class);
  252. }
  253. // TODO: 根据业务需求实现业务方法
  254. }
  255. ```
  256. #### 2.8 Controller 控制器
  257. **文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/controllerapi/Third{EntityName}Controller.java`
  258. **模板**:
  259. ```java
  260. package com.shkpr.service.alamdmaordertask.controllerapi;
  261. import com.shkpr.service.alamdmaordertask.constants.ApiURI;
  262. import org.springframework.util.StringUtils;
  263. import org.springframework.web.bind.annotation.*;
  264. import java.util.concurrent.atomic.AtomicInteger;
  265. @RequestMapping(ApiURI.URI_XXX_H) // TODO: 替换为实际的 API 路径
  266. @RestController
  267. public class Third{EntityName}Controller extends ThirdBaseController {
  268. final static String MSG_SUCCESS = "success.";
  269. final static String MSG_FAILED = "failed.";
  270. final static String mBusinessType = "";
  271. final static String mLogTag = "{EntityName}";
  272. private String mStrClassName = "";
  273. private AtomicInteger mSeqReq = null;
  274. public Third{EntityName}Controller() {
  275. super(mBusinessType, mLogTag);
  276. mStrClassName = this.getClass().getSimpleName();
  277. }
  278. // TODO: 实现具体的 API 处理方法
  279. }
  280. ```
  281. ### 第三步:输出总结
  282. 创建完成后,输出以下总结信息:
  283. ```
  284. ✓ CRUD 全链路脚手架已生成!
  285. 已创建以下文件:
  286. 1. Table 接口: {EntityName}Table.java
  287. 2. SqlProvider: {EntityName}SqlProvider.java
  288. 3. Mapper: {EntityName}Mapper.java
  289. 4. DBService 接口: {EntityName}DBService.java
  290. 5. DBServiceImpl: {EntityName}DBServiceImpl.java
  291. 6. BizFilter: ThirdJWT{EntityName}BizFilter.java
  292. 7. BizHelper: {EntityName}BizHelper.java
  293. 8. Controller: Third{EntityName}Controller.java
  294. 请注意:
  295. - 文件中的 TODO 项需要您自行补充完整
  296. ```
  297. ## 注意事项
  298. 1. **始终先询问对象名称**,不要在用户未提供名称时自行推断
  299. 2. **保持代码风格与现有项目一致**,使用项目已有的包结构和命名规范
  300. 3. **扩展方法均可留空**,框架代码只保证编译通过
  301. 4. **Mapper 中不使用实体对象**,只使用 `Map<String, Object>` 或 `List<Map<String, Object>>` 进行数据交互(遵循数据库持久层规范)