在 Manus 中运行任何 Skill
一键导入
一键导入
一键在 Manus 中运行任何 Skill
开始使用api-code-generator
星标33
分支15
更新时间2026年2月9日 08:12
generator code SpringBoot CRUD Controller
安装
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
SKILL.md
readonly菜单
generator code SpringBoot CRUD Controller
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | api-code-generator |
| description | generator code SpringBoot CRUD Controller |
{{project-model}}/src/main/java/com/zja/
├── controller/ # 控制层
├── service/ # 服务层
├── impl/ # 服务实现层
├── dao/ # 数据访问层
├── entity/ # 实体类
├── model/ # 数据模型
│ ├── base/ # 基础模型
│ ├── dto/ # 数据传输对象
│ └── request/ # 请求参数
└── mapper/ # 映射器
com.zja.controllercom.zja.servicecom.zja.service.implcom.zja.daocom.zja.entitycom.zja.modelcom.zja.mapper@Entity
@Table(name = "t_{entity}_info")
@EntityListeners(value = AuditingEntityListener.class)
@Data
/**
* {实体中文名} 实体类
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
/**
* {字段中文名}
*/
@Column(name = "{fieldName}", nullable = false)
private {FieldType} {fieldName};
/**
* 创建时间
*/
@Column(name = "create_time", nullable = false)
@CreatedDate
private LocalDateTime createTime;
/**
* 最后一次修改时间
*/
@Column(name = "last_modified_date")
@LastModifiedDate
private LocalDateTime lastModifiedDate;
import lombok.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.time.LocalDateTime;
/**
* {实体中文名} 实体类
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
@Getter
@Setter
@Entity
@Table(name = "t_{entity}_info")
@EntityListeners(value = AuditingEntityListener.class)
public class {Entity} {
@Id
private String id;
/**
* {字段中文名}
*/
@Column(name = "name", nullable = false)
private String name;
/**
* {字段中文名}
*/
@Column(name = "address")
private String address;
/**
* {字段中文名}
*/
@Column(name = "email")
private String email;
/**
* {字段中文名}
*/
@Column(name = "age")
private Integer age;
/**
* 创建时间
*/
@Column(name = "create_time", nullable = false)
@CreatedDate
private LocalDateTime createTime;
/**
* 最后一次修改时间
*/
@Column(name = "last_modified_date")
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
@Repository
public interface {Entity}Dao extends JpaRepository<{Entity}, String>, CrudRepository<{Entity}, String>, JpaSpecificationExecutor<{Entity}> {
Optional<{Entity}> findByName(String name);
}
Dao 或 Repository 结尾UserDao、ProductRepositoryJpaRepository 提供基本的CRUD操作JpaSpecificationExecutor 支持动态查询CrudRepository 扩展基本操作@Repository 注解标记数据访问层@Query 注解// 根据名称查询
Optional<{Entity}> findByName(String name);
// 根据其他字段查询
Optional<{Entity}> findByCode(String code);
// 根据条件查询列表
List<{Entity}> findByStatus(Integer status);
// 根据多个条件查询
List<{Entity}> findByNameAndStatus(String name, Integer status);
// 使用JPQL查询
@Query("SELECT e FROM {Entity} e WHERE e.name = :name AND e.status = :status")
Optional<{Entity}> findByNameAndStatusCustom(@Param("name") String name, @Param("status") Integer status);
// 原生SQL查询
@Query(value = "SELECT * FROM t_{entity}_info WHERE name LIKE %:keyword%", nativeQuery = true)
List<{Entity}> findByNameContaining(@Param("keyword") String keyword);
import com.zja.entity.{Entity};
import org.springframework.data.jpa.repository.*;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
/**
* {实体中文名} 数据访问层
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
@Repository
public interface {Entity}Dao extends JpaRepository<{Entity}, String>, CrudRepository<{Entity}, String>, JpaSpecificationExecutor<{Entity}> {
/**
* 根据{实体}名称查询{实体}
*
* @param name {实体}名称
* @return Optional<{Entity}>
*/
Optional<{Entity}> findByName(String name);
/**
* 根据{实体}编号查询{实体}
*
* @param code {实体}编号
* @return Optional<{Entity}>
*/
Optional<{Entity}> findByCode(String code);
/**
* 根据状态查询{实体}列表
* @param status 状态
* @return List<{Entity}>
*/
List<{Entity}> findByStatus(Integer status);
/**
* 根据名称和状态查询{实体}
* @param name {实体}名称
* @param status 状态
* @return Optional<{Entity}>
*/
Optional<{Entity}> findByNameAndStatus(String name, Integer status);
}
/**
* {Entity} 数据传输
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
@Data
@ApiModel("{Entity}DTO")
public class {Entity}DTO implements Serializable {
@ApiModelProperty("id")
private String id;
@ApiModelProperty("{字段中文名}")
private {FieldType} {fieldName};
// ... 其他字段
}
/**
* {实体} 请求参数
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
@Data
@ApiModel("{Entity}Request 新增 或 更新 {实体}信息")
public class {Entity}Request implements Serializable {
@ApiModelProperty("{字段中文名}")
private {FieldType} {fieldName};
// ... 其他字段
}
/**
* {实体} 更新请求参数
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
@Data
@ApiModel("{Entity}UpdateRequest 更新 {实体}信息")
public class {Entity}UpdateRequest implements Serializable {
@ApiModelProperty("{字段中文名}")
private {FieldType} {fieldName};
// ... 其他字段
}
/**
* {实体} 分页参数
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
@Getter
@Setter
@ApiModel("{Entity} 分页参数")
public class {Entity}PageRequest extends BasePageRequest {
@ApiModelProperty("{字段中文名}")
private {FieldType} {fieldName};
// ... 其他查询条件字段
}
/**
* 分页请求(通用的)
*
* @author: {{author}}
* @since: 2024/09/27 9:31
*/
@Setter
@ApiModel("BasePageRequest")
public class BasePageRequest implements Serializable {
@ApiModelProperty("页码 从第1页开始")
private Integer page = 1;
@Getter
@ApiModelProperty("每页数量 默认 10")
private Integer size = 10;
public Integer getPage() {
return page - 1; // 注:jpa page 从 0 开始
}
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.domain.Page;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.function.Function;
/**
* 分页数据传输
*
* @author: {{author}}
* @since: 2024/09/27 9:31
*/
@Data
@ApiModel("PageData")
public final class PageData<T> implements Serializable {
@ApiModelProperty("数据")
private List<T> data;
@ApiModelProperty("当前页号")
private int index;
@ApiModelProperty("页大小")
private int size;
@ApiModelProperty("查询到的数据量")
private int length;
@ApiModelProperty("总数据量")
private long count;
@ApiModelProperty("总页数")
private int pages;
@ApiModelProperty("是否第一页")
private boolean first;
@ApiModelProperty("是否最后一页")
private boolean last;
@ApiModelProperty("是否有下一页")
private boolean hasNext;
@ApiModelProperty("是否有上一页")
private boolean hasPrev;
public static <T> PageData<T> of(Page<T> page) {
return of(page.getContent(), page.getNumber(), page.getSize(), page.getTotalElements());
}
public static <T> PageData<T> of(List<T> data, int pageIndex, int pageSize, long totalSize) {
PageData<T> dp = new PageData<>();
dp.data = data;
dp.index = pageIndex;
dp.size = pageSize;
dp.length = data.size();
dp.count = totalSize;
dp.pages = BigDecimal.valueOf(totalSize).divide(BigDecimal.valueOf(pageSize), RoundingMode.UP).intValue();
dp.first = pageIndex == 0;
dp.hasPrev = !dp.first;
dp.hasNext = (dp.pages - dp.index) > 1;
dp.last = !dp.hasNext;
return dp;
}
public <R> PageData<R> map(Function<List<T>, List<R>> mapper) {
return of(mapper.apply(this.getData()), this.getIndex(), this.getSize(), this.getCount());
}
}
代码生成器应当具备自动检测和创建基础类的能力:
com.zja.model.base 包下是否存在 BasePageRequest 和 PageData 类/**
* {实体中文名} 服务层
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
public interface {Entity}Service {
/**
* 查询{实体}
*
* @param id {实体}id
*/
{Entity}DTO queryById(String id);
/**
* 查询{实体}列表
*/
List<{Entity}DTO> list();
/**
* 分页查询{实体}
*/
PageData<{Entity}DTO> pageList({Entity}PageRequest request);
/**
* 校验{实体}名称是否可用
*
* @param name {实体}名称
* @return Boolean
*/
Boolean existName(String name);
/**
* 新增{实体}
*/
{Entity}DTO add({Entity}Request request);
/**
* 批量添加{实体}
*/
List<{Entity}DTO> addBatch(List<{Entity}Request> requests);
/**
* 更新{实体}
*
* @param id {实体}id
*/
{Entity}DTO update(String id, {Entity}UpdateRequest request);
/**
* 删除{实体}
*
* @param id {实体}id
*/
boolean deleteById(String id);
/**
* 批量删除{实体}
*
* @param ids {实体}ids
*/
void deleteBatch(List<String> ids);
}
ServiceImpl层是服务层的具体实现,负责业务逻辑处理和数据访问。
@Slf4j
@Service
@Transactional
/**
* {实体中文名} 业务处理服务实现层
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
@Autowired
{Entity}Dao dao;
@Autowired
{Entity}Mapper mapper;
private {Entity} get{Entity}ById(String id) {
return dao.findById(id).orElseThrow(() -> new RuntimeException(String.format("传入的 id=%s 有误!", id)));
}
@Override
public {Entity}DTO queryById(String id) {
{Entity} entity = this.get{Entity}ById(id);
return mapper.toDto(entity);
}
@Override
public List<{Entity}DTO> list() {
List<{Entity}> list = dao.findAll();
return mapper.toDtoList(list);
}
@Override
public PageData<{Entity}DTO> pageList({Entity}PageRequest request) {
int page = request.getPage();
int size = request.getSize();
Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
// 查询条件
Specification<{Entity}> spec = buildQuery(request);
// 分页查询
Page<{Entity}> sourcePage = dao.findAll(spec, PageRequest.of(page, size, sort));
return PageData.of(sourcePage);
}
private Specification<{Entity}> buildQuery({Entity}PageRequest request) {
// 构建查询条件
return (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
// 关键词
if (!StringUtils.isEmpty(request.getName())) {
predicates.add(cb.like(root.get("name"), request.getName() + "%"));
}
if (request.get{FieldName}() != null) {
predicates.add(cb.equal(root.get("{fieldName}"), request.get{FieldName}()));
}
// 将条件连接在一起
return query.where(predicates.toArray(new Predicate[0])).getRestriction();
};
}
@Override
public Boolean existName(String name) {
Optional<{Entity}> byName = dao.findByName(name);
return byName.isPresent();
}
@Override
@Transactional
public {Entity}DTO add({Entity}Request request) {
// 检验名字已存在
if (existName(request.getName())) {
throw new UnsupportedOperationException("名称不能重复");
}
{Entity} entity = mapper.toEntity(request);
entity = dao.save(entity);
return mapper.toDto(entity);
}
@Override
@Transactional
public List<{Entity}DTO> addBatch(List<{Entity}Request> requests) {
return requests.stream().map(this::add).collect(Collectors.toList());
}
@Override
@Transactional
public {Entity}DTO update(String id, {Entity}UpdateRequest request) {
// 校验存在
{Entity} entity = this.get{Entity}ById(id);
// 更新
BeanUtils.copyProperties(request, entity, "id", "createTime");
entity = dao.save(entity);
return mapper.toDto(entity);
}
@Override
@Transactional
public boolean deleteById(String id) {
try {
if (dao.findById(id).isPresent()) {
dao.deleteById(id);
}
return true;
} catch (Exception e) {
log.error("Failed to delete entity with ID: {}", id, e);
return false;
}
}
@Override
@Transactional
public void deleteBatch(List<String> ids) {
ids.forEach(this::deleteById);
}
@CrossOrigin
@Validated
@RestController
@RequestMapping("/rest/{entity}")
@Api(tags = {"{实体}管理页面"})
/**
* {实体中文名} 接口层(一般与页面、功能对应)
*
* @author: {{author}}
* @since: {当前日期} {当前时间}
*/
@Autowired
{Entity}Service service;
@GetMapping("/query/{id}")
@ApiOperation("{操作描述}")
public {Entity}DTO queryById(@NotBlank @PathVariable("id") String id) {
return service.queryById(id);
}
@GetMapping("/list")
@ApiOperation("查询{实体}列表")
public List<{Entity}DTO> list() {
return service.list();
}
@GetMapping("/page/list")
@ApiOperation("分页查询{实体}列表")
public PageData<{Entity}DTO> pageList(@Valid {Entity}PageRequest pageRequest) {
return service.pageList(pageRequest);
}
@PostMapping("/add")
@ApiOperation("添加{实体}")
public {Entity}DTO add(@Valid @RequestBody {Entity}Request request) {
return service.add(request);
}
@PostMapping("/add/batch")
@ApiOperation("批量添加{实体}")
public List<{Entity}DTO> add(@Valid @RequestBody List<{Entity}Request> requests) {
return service.addBatch(requests);
}
@PutMapping("/update/{id}")
@ApiOperation("更新{实体}")
public {Entity}DTO update(@NotBlank @PathVariable("id") String id,
@Valid @RequestBody {Entity}UpdateRequest updateRequest) {
return service.update(id, updateRequest);
}
@DeleteMapping("/delete/{id}")
@ApiOperation("删除{实体}")
public boolean deleteById(@NotBlank @PathVariable("id") String id) {
return service.deleteById(id);
}
@DeleteMapping("/delete/batch")
@ApiOperation("批量删除{实体}")
public void deleteBatch(@RequestBody List<String> ids) {
service.deleteBatch(ids);
}
{Entity}: 实体类名(如User){entity}: 实体类名小写(如user){实体}: 实体中文名(如用户){实体中文名}: 实体完整中文描述{字段中文名}: 字段中文描述{FieldType}: 字段类型{fieldName}: 字段名{操作描述}: 具体操作描述{当前日期}: 当前日期(格式:yyyy/MM/dd){当前时间}: 当前时间(格式:HH:mm)@ApiModelProperty("id")
private String id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("最后一次修改时间")
private LocalDateTime lastModifiedDate;
{Entity} -> User
{entity} -> user
{实体} -> 用户
{实体中文名} -> 用户
{操作描述} -> 查询单个用户详情
@Transactional 注解确保数据一致性@Transactional(readOnly = true) 提高性能@ControllerAdvice 和 @ExceptionHandler 处理全局异常@Valid 和 @Validated 进行参数校验@Cacheable、@CacheEvict 等注解