ワンクリックで
在芋道 RuoYi-Vue-Pro 项目中设计跨模块 API 接口(Api 接口 + DTOs + MapStruct 转换器 + 实现类),遵循框架模块间通信约定
npx skills add https://github.com/AloneMou/claude-code-skills --skill ruoyi-apiこのコマンドをClaude Codeにコピー&ペーストしてスキルをインストール
在芋道 RuoYi-Vue-Pro 项目中设计跨模块 API 接口(Api 接口 + DTOs + MapStruct 转换器 + 实现类),遵循框架模块间通信约定
npx skills add https://github.com/AloneMou/claude-code-skills --skill ruoyi-apiこのコマンドをClaude Codeにコピー&ペーストしてスキルをインストール
在芋道 RuoYi-Vue-Pro 项目中进行架构设计、模块拆分、技术方案规划
为芋道 RuoYi-Vue-Pro 项目生成配置文件、Docker 部署配置和环境变量管理
审查芋道 RuoYi-Vue-Pro 项目代码,检查规范违反、缺失模式、安全问题和架构不一致性
对芋道 RuoYi-Vue-Pro 项目进行安全审计,检查权限、注入、敏感信息泄露等安全问题
为芋道 RuoYi-Vue-Pro 项目生成单元测试代码(Service/Mapper/Controller 层测试)
芋道 RuoYi-Vue-Pro 项目 MyBatis-Plus 数据访问模式指南:LambdaQueryWrapperX 条件查询、BaseMapperX 操作、分页、多表联查、类型处理器
| name | ruoyi-api |
| description | 在芋道 RuoYi-Vue-Pro 项目中设计跨模块 API 接口(Api 接口 + DTOs + MapStruct 转换器 + 实现类),遵循框架模块间通信约定 |
| trigger | 当用户需要创建跨模块调用、暴露模块服务给其他模块调用、设计模块间接口、或提到 "跨模块API"、"创建API接口"、"暴露服务"、"module API" |
在芋道 (Yudao) RuoYi-Vue-Pro 项目中生成跨模块 API 接口。
共享规范: 阅读 CLAUDE.md 获取项目级命名约定、技术栈和禁止事项。
当用户满足以下任一条件时激活此技能:
以下情况不使用此技能:
跨模块 API 使用直接服务调用(非 HTTP RPC)。调用方模块依赖被调用方模块的 api/ 包。
Module A
└── depends on ── yudao-module-system (API package only)
└── cn.iocoder.yudao.module.system.api
├── user/
│ ├── UserApi.java # API 接口
│ └── dto/
│ ├── UserRespDTO.java # 响应 DTO
│ └── UserReqDTO.java # 请求 DTO
└── dept/
├── DeptApi.java
└── dto/
└── DeptRespDTO.java
api/{submodule}/ 包下Path: yudao-module-{module}/src/main/java/cn/iocoder/yudao/module/{module}/api/{submodule}/{Name}Api.java
package cn.iocoder.yudao.module.{module}.api.{submodule};
import cn.iocoder.yudao.module.{module}.api.{submodule}.dto.{Name}RespDTO;
import java.util.Collection;
import java.util.List;
/**
* {业务名称} API 接口
*
* @author {author}
*/
public interface {Name}Api {
/**
* 获得{业务名称}
*
* @param id 编号
* @return {业务名称}
*/
{Name}RespDTO get{Name}(Long id);
/**
* 批量获得{业务名称}列表
*
* @param ids 编号列表
* @return {业务名称}列表
*/
List<{Name}RespDTO> get{Name}List(Collection<Long> ids);
}
Path: yudao-module-{module}/src/main/java/cn/iocoder/yudao/module/{module}/api/{submodule}/dto/{Name}RespDTO.java
package cn.iocoder.yudao.module.{module}.api.{submodule}.dto;
import lombok.Data;
/**
* {业务名称} Response DTO
*
* @author {author}
*/
@Data
public class {Name}RespDTO {
/**
* 编号
*/
private Long id;
/**
* 名称
*/
private String name;
// 仅暴露调用方需要的字段
}
Path: yudao-module-{module}/src/main/java/cn/iocoder/yudao/module/{module}/convert/{submodule}/{Name}Convert.java
package cn.iocoder.yudao.module.{module}.convert.{submodule};
import cn.iocoder.yudao.module.{module}.api.{submodule}.dto.{Name}RespDTO;
import cn.iocoder.yudao.module.{module}.dal.dataobject.{submodule}.{Name}DO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* {业务名称} 转换器
*
* @author {author}
*/
@Mapper
public interface {Name}Convert {
{Name}Convert INSTANCE = Mappers.getMapper({Name}Convert.class);
{Name}RespDTO convert({Name}DO bean);
List<{Name}RespDTO> convertList(List<{Name}DO> list);
}
Path: yudao-module-{module}/src/main/java/cn/iocoder/yudao/module/{module}/api/{submodule}/{Name}ApiImpl.java
package cn.iocoder.yudao.module.{module}.api.{submodule};
import cn.iocoder.yudao.module.{module}.convert.{submodule}.{Name}Convert;
import cn.iocoder.yudao.module.{module}.dal.dataobject.{submodule}.{Name}DO;
import cn.iocoder.yudao.module.{module}.service.{submodule}.{Name}Service;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import java.util.Collection;
import java.util.List;
/**
* {业务名称} API 实现类
*
* @author {author}
*/
@Service
public class {Name}ApiImpl implements {Name}Api {
@Resource
private {Name}Service {name}Service;
@Override
public {Name}RespDTO get{Name}(Long id) {
{Name}DO {name} = {name}Service.get{Name}(id);
return {Name}Convert.INSTANCE.convert({name});
}
@Override
public List<{Name}RespDTO> get{Name}List(Collection<Long> ids) {
List<{Name}DO> list = {name}Service.get{Name}List(ids);
return {Name}Convert.INSTANCE.convertList(list);
}
}
jakarta.annotation.Resource 而非 javax.annotation.Resource