用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/wujun728/jun_java_plugin --skill crud命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | crud |
| description | 一键生成完整业务模块代码(SQL/Entity/DAO/XML/Repository/Service/Controller/Mapper/POJO),用于创建新的业务功能 |
根据用户提供的需求描述,一键生成完整的业务模块代码,包括:SQL建表语句 -> MyBatis XML -> Entity -> DAO -> Repository -> Service -> Controller -> MapStruct Mapper -> POJO (DTO/VO/QO)。
当用户的输入符合以下任一情况时,应自动应用此技能(无需用户明确输入 /crud):
在生成代码之前,必须先完成以下检测:
检测方法:
src/main/java 目录下的Java文件package 声明处理规则:
询问示例:
检测到这是一个新项目,请确认项目的基础包名:
- 例如:com.example.demo
- 例如:net.company.project
检测方法:
@author 注释处理规则:
询问示例:
请确认代码注释中的作者名(@author):
- 可以是您的名字、工号或团队名称
- 例如:zhangsan、张三、dev-team
s_ 前缀命名规范)按以下顺序依次生成:
s_ 前缀 + 蛇形命名,如 s_user_infocreate_timeid,类型为 BIGINTid、tenant_id、create_time、update_time、is_deleted@ApiModelProperty 注解说明使用 {basePackage} 表示检测到的或用户确认的基础包名:
{basePackage}
├── domain
│ ├── dao/{实体名}Dao.java # MyBatis Mapper接口
│ ├── entity/{实体名}.java # 数据库实体
│ └── pojo/{模块名}/ # 业务对象
│ ├── {实体名}DTO.java # 数据传输对象
│ ├── {实体名}VO.java # 视图对象
│ └── {实体名}SearchQO.java # 查询对象
├── mapping/{模块名}/{实体名}Mapper.java # MapStruct映射器
├── repository/{模块名}/{实体名}Repository.java # 数据仓储
├── service/{模块名}/{实体名}Service.java # 业务服务
└── web/admin/{模块名}/{实体名}Controller.java # 控制器
注意:以下模板中的
{basePackage}和{author}为动态变量,需要在生成前通过检测或询问用户确定。
package {basePackage}.domain.entity;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
import lombok.Data;
/**
* {实体描述} 实体类
*
* @author {author}
*/
@Data
public class {实体名} {
@ApiModelProperty("主键ID")
private Long id;
@ApiModelProperty("商户ID")
private Long tenantId;
// 业务字段...
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("修改时间")
private LocalDateTime updateTime;
@ApiModelProperty("是否删除 0否 1是")
private Integer isDeleted;
}
package {basePackage}.domain.dao;
import java.util.List;
import {basePackage}.domain.entity.{实体名};
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* {实体描述} Mapper接口
*
* @author {author}
*/
@Mapper
public interface {实体名}Dao {
int insert({实体名} row);
int insertSelective({实体名} row);
int batchInsert(@Param(value = "rows") List<{实体名}> rows);
{实体名} selectByPrimaryKey(Long id);
List<{实体名}> selectByIds(@Param(value = "ids") List<Long> ids);
int updateByPrimaryKeySelective({实体名} row);
int deleteByPrimaryKey(Long id);
int removeByPrimaryKey(Long id);
List<{实体名}> selectByQo(@Param(value = "qo") {实体名}SearchQO qo);
}
package {basePackage}.repository.{模块名};
import lombok.RequiredArgsConstructor;
import net.trueland.framework.core.ServiceException;
import {basePackage}.common.ErrorCode;
import {basePackage}.domain.dao.{实体名}Dao;
import {basePackage}.domain.entity.{实体名};
import {basePackage}.domain.pojo.{模块名}.{实体名}SearchQO;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
/**
* {实体描述} Repository
*
* @author {author}
*/
@Repository
@RequiredArgsConstructor
public class {实体名}Repository {
private final {实体名}Dao {实体名小写}Dao;
/**
* 新增
*/
public void addEntity({实体名} row) {
{实体名小写}Dao.insertSelective(row);
}
/**
* 编辑
*/
public void updateEntity({实体名} row) {
row.setUpdateTime(LocalDateTime.now());
{实体名小写}Dao.updateByPrimaryKeySelective(row);
}
/**
* 根据id查找数据(不存在则抛异常)
*/
public {实体名} exist(Long id) {
{实体名} data = {实体名小写}Dao.selectByPrimaryKey(id);
if (Objects.isNull(data)) {
throw new ServiceException(ErrorCode.DATA_NOT_EXISTS);
}
return data;
}
/**
* 根据id查找数据
*/
public {实体名} getById(Long id) {
return {实体名小写}Dao.selectByPrimaryKey(id);
}
/**
* 根据ids批量查询
*/
List<{实体名}> selectByIds(List<Long> ids) {
{实体名小写}Dao.selectByIds(ids);
}
List<{实体名}> getList({实体名}SearchQO qo) {
{实体名小写}Dao.selectByQo(qo);
}
{
{实体名小写}Dao.removeByPrimaryKey(id);
}
}
package {basePackage}.service.{模块名};
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import {basePackage}.domain.entity.{实体名};
import {basePackage}.domain.pojo.{模块名}.{实体名}DTO;
import {basePackage}.domain.pojo.{模块名}.{实体名}VO;
import {basePackage}.domain.pojo.{模块名}.{实体名}SearchQO;
import {basePackage}.mapping.{模块名}.{实体名}Mapper;
import {basePackage}.repository.{模块名}.{实体名}Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* {实体描述} Service
*
* @author {author}
*/
@Service
@AllArgsConstructor
@Slf4j
public class {实体名}Service {
private final {实体名}Mapper {实体名小写}Mapper;
private final {实体名}Repository {实体名小写}Repository;
/**
* 新增
*/
public Long add({实体名}DTO dto) {
{实体名} entity = {实体名小写}Mapper.toEntity(dto);
{实体名小写}Repository.addEntity(entity);
return entity.getId();
}
/**
* 编辑
*/
public void update(Long id, {实体名}DTO dto) {
{实体名} entity = {实体名小写}Repository.exist(id);
{实体名小写}Mapper.updateEntity(dto, entity);
{实体名小写}Repository.updateEntity(entity);
}
/**
* 详情
*/
public {实体名}VO getInfo(Long id) {
{实体名} entity = {实体名小写}Repository.exist(id);
return {实体名小写}Mapper.toVO(entity);
}
/**
* 列表查询
*/
List<{实体名}VO> getList({实体名}SearchQO qo) {
List<{实体名}> list = {实体名小写}Repository.getList(qo);
{实体名小写}Mapper.toVOList(list);
}
{
{实体名小写}Repository.exist(id);
{实体名小写}Repository.removeById(id);
}
}
package {basePackage}.web.admin.{模块名};
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import net.trueland.framework.web.result.ApiResult;
import {basePackage}.domain.pojo.{模块名}.{实体名}DTO;
import {basePackage}.domain.pojo.{模块名}.{实体名}VO;
import {basePackage}.domain.pojo.{模块名}.{实体名}SearchQO;
import {basePackage}.service.{模块名}.{实体名}Service;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* {实体描述} Controller
*
* @author {author}
*/
@Api(tags = "{实体描述}")
@RestController
@RequiredArgsConstructor
@RequestMapping("/{模块路径}")
public class {实体名}Controller {
private final {实体名}Service {实体名小写}Service;
@PostMapping
@ApiOperation(value = "新增")
public ApiResult<Long> add(@Validated @RequestBody {实体名}DTO dto) {
return ApiResult.ok({实体名小写}Service.add(dto));
}
@PostMapping("{id}")
@ApiOperation(value = "编辑")
public ApiResult<Void> update(@PathVariable Long id, @Validated @RequestBody {实体名}DTO dto) {
{实体名小写}Service.update(id, dto);
return ApiResult.ok();
}
@GetMapping("{id}")
@ApiOperation(value = "详情")
ApiResult<{实体名}VO> getInfo( Long id) {
ApiResult.ok({实体名小写}Service.getInfo(id));
}
ApiResult<List<{实体名}VO>> getList( {实体名}SearchQO qo) {
ApiResult.ok({实体名小写}Service.getList(qo));
}
ApiResult<Void> {
{实体名小写}Service.removeById(id);
ApiResult.ok();
}
}
package {basePackage}.mapping.{模块名};
import {basePackage}.domain.entity.{实体名};
import {basePackage}.domain.pojo.{模块名}.{实体名}DTO;
import {basePackage}.domain.pojo.{模块名}.{实体名}VO;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import java.util.List;
/**
* {实体描述} MapStruct映射器
*
* @author {author}
*/
@Mapper(componentModel = "spring")
public interface {实体名}Mapper {
{实体名} toEntity({实体名}DTO dto);
void updateEntity({实体名}DTO dto, @MappingTarget {实体名} entity);
{实体名}VO toVO({实体名} entity);
List<{实体名}VO> toVOList(List<{实体名}> list);
}
生成完成后,请列出所有生成的文件路径(使用检测到的 {basePackage} 转换为路径):
src/main/java/{basePackagePath}/domain/entity/{实体名}.javasrc/main/java/{basePackagePath}/domain/dao/{实体名}Dao.javasrc/main/resources/mybatis/mapper/{实体名}Dao.xmlsrc/main/java/{basePackagePath}/repository/{模块名}/{实体名}Repository.javasrc/main/java/{basePackagePath}/domain/pojo/{模块名}/src/main/java/{basePackagePath}/mapping/{模块名}/{实体名}Mapper.javasrc/main/java/{basePackagePath}/service/{模块名}/{实体名}Service.javasrc/main/java/{basePackagePath}/web/admin/{模块名}/{实体名}Controller.java| 变量 | 说明 | 获取方式 |
|---|---|---|
{basePackage} | 项目基础包名 | 检测项目或询问用户 |
{basePackagePath} | 包名转路径 | 将 . 替换为 / |
{author} | 代码作者 | 检测项目或询问用户 |
{实体名} | 实体类名(大驼峰) | 根据需求分析 |
{实体名小写} | 实体变量名(小驼峰) | 首字母小写 |
{实体描述} | 实体中文描述 | 根据需求分析 |
{模块名} | 模块包名(小写) | 根据需求分析 |
{模块路径} | API路径(短横线分隔) | 根据模块名转换 |