con un clic
snail-ai-dev-guide
Snail AI 项目开发规范和最佳实践指南。提供代码风格、命名规范、架构设计、数据库操作等全方位的开发指导。
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Snail AI 项目开发规范和最佳实践指南。提供代码风格、命名规范、架构设计、数据库操作等全方位的开发指导。
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
| name | snail-ai-dev-guide |
| description | Snail AI 项目开发规范和最佳实践指南。提供代码风格、命名规范、架构设计、数据库操作等全方位的开发指导。 |
| license | MIT |
| homepage | https://github.com/aizuda/snail-ai |
| metadata | {"version":"1.0.0","author":"opensnail","tags":["development","coding-standards","best-practices","java","spring-boot"]} |
欢迎使用 Snail AI 开发规范 Skill!本指南提供完整的项目开发规范、最佳实践和代码示例。
Snail AI 是一个基于 Spring Boot 和 Spring AI 的智能对话应用平台,采用模块化架构设计。
当你需要了解开发规范时,可以:
本 Skill 包含以下详细文档:
❌ 不推荐:
if (status.equals(rawStatus)) {
// ...
}
✅ 推荐:
// 使用枚举
if (status == MemoryStatusEnum.ACTIVE) {
// ...
}
// 或使用常量
if (status.equals(StatusConstants.ACTIVE)) {
// ...
}
❌ 不推荐:
public void createMemory(Long agentId, Long userId, String content,
String type, BigDecimal score, LocalDateTime time) {
// ...
}
✅ 推荐:
public void createMemory(CreateMemoryRequest request) {
// request 包含所有参数
}
使用卫语句/提前返回:
// 不推荐
public void process(User user) {
if (user != null) {
if (user.isActive()) {
if (user.hasPermission()) {
// 业务逻辑
}
}
}
}
// 推荐
public void process(User user) {
if (user == null) return;
if (!user.isActive()) return;
if (!user.hasPermission()) return;
// 业务逻辑
}
Hutool 优先,Optional 只用于链式转换:
if (StrUtil.isBlank(userName)) {
return;
}
Optional.ofNullable(userMapper.selectById(id))
.map(UserPO::getEmail)
.ifPresent(this::sendEmail);
只在真正需要时使用设计模式,避免过度设计:
Snail AI 采用多模块 Maven 架构:
snail-ai/
├── snail-ai-common # 通用工具和基础类
├── snail-ai-persistence # 持久层(Mapper、PO)
├── snail-ai-model # AI 模型集成
├── snail-ai-memory # 记忆系统
├── snail-ai-features # 功能特性(RAG、Skill、Tool)
├── snail-ai-admin # 管理后端(Controller、Service、VO)
└── snail-ai-starter # 启动模块
snail-ai-starter
└── snail-ai-admin
├── snail-ai-features
│ ├── snail-ai-model
│ ├── snail-ai-memory
│ └── snail-ai-persistence
├── snail-ai-memory
│ └── snail-ai-persistence
└── snail-ai-persistence
└── snail-ai-common
依赖原则:
标准包结构:
com.aizuda.snail.ai.{module}/
├── controller/ # Web 控制器
├── service/ # 业务服务层
├── dto/ # 数据传输对象(跨模块)
├── vo/ # 视图对象(API 响应)
│ ├── {feature}/ # 按功能分类
├── po/ # 持久化对象(对应数据库表)
├── mapper/ # MyBatis Plus 数据访问层
├── enums/ # 枚举类型
├── constant/ # 常量定义
├── handler/ # 事件处理器、异常处理
├── config/ # 配置类
├── interceptor/ # 拦截器
├── security/ # 安全相关
└── util/ # 工具类
| 类型 | 命名规则 | 示例 |
|---|---|---|
| VO 类 | {Name}VO | UserInfoVO, MemoryStatsVO |
| DTO 类 | {Name}DTO | AudienceDTO, ChatCompletionDTO |
| PO 类 | {Name}PO | ConversationMemoryPO, UserPO |
| Mapper | {Name}Mapper | ConversationMemoryMapper |
| Service ⚠️ | {Name}Service | UserService (仅 admin 模块) |
| Handler ⚠️ | {Name}Handler | MemoryRetriever (其他模块) |
| Controller | {Name}Controller | AgentController |
| Enum | {Name}Enum | RoleEnum, MemoryStatusEnum |
| Exception | {Name}Exception | SnailAiCommonException |
| Constants | {Name}Constants | CommonConstants |
重要: Service 后缀仅用于 admin 模块,其他模块使用 Handler 后缀或特定名称
| 操作类型 | 前缀 | 示例 |
|---|---|---|
| 查询 | get, query, fetch, retrieve | getUserInfo(), queryMemories() |
| 创建 | create, add | createMemory(), addUser() |
| 更新 | update, set, modify | updateTitle(), setStatus() |
| 删除 | delete, remove | deleteMemory(), removeUser() |
| 判断 | is, has, check | isActive(), hasPermission() |
| 业务操作 | 具体动词 | login(), authorize(), archive() |
| 字段类型 | 命名规则 | 示例 |
|---|---|---|
| Boolean | is 前缀或现在分词 | isActive, autoExtract |
| 时间 | 后缀 Dt | createDt, updateDt |
| ID | 后缀 Id | userId, agentId |
| 状态/类型 | 枚举或英文名 | memoryType, status |
| 计数 | 后缀 Count | accessCount |
| 评分 | 后缀 Score | relevanceScore |
@RestController // Web 控制器
@RequestMapping("/api/users") // 路由映射
@Service // 服务层
@GetMapping("/{id}") // GET 请求
@PostMapping // POST 请求
@PutMapping("/{id}") // PUT 请求
@DeleteMapping("/{id}") // DELETE 请求
@PathVariable Long id // 路径变量
@RequestParam String keyword // 请求参数
@RequestBody UserVO vo // 请求体
@Validated // 参数验证
@Data // getter/setter/toString/equals/hashCode
@Builder // Builder 模式
@AllArgsConstructor // 全参构造
@NoArgsConstructor // 无参构造
@RequiredArgsConstructor // 必需字段构造(用于依赖注入)
@Slf4j // 日志
@TableName("snail_ai_user") // 表名映射
@TableId(type = IdType.AUTO) // 自增主键
@EnumValue // 枚举值映射
@LoginRequired // 需要登录
@LoginRequired(role = RoleEnum.ADMIN) // 需要管理员权限
BaseSnailAiException // 基类
├── SnailAiCommonException // 通用业务异常
├── SnailAiAuthenticationException (5001) // 认证异常
├── SnailAiAiException // AI 相关异常
├── ModelCallException // 模型调用异常
└── 特定模块异常
├── SearchEngineException // 搜索引擎异常
└── VectorStoreException // 向量库异常
// 抛出异常
throw new SnailAiCommonException("用户不存在");
throw new SnailAiAuthenticationException("认证失败");
// 支持格式化参数
throw new SnailAiCommonException("用户 {} 不存在", username);
使用 Lombok 的 @Slf4j 注解:
@Slf4j
@Service
public class UserService {
public void register(LoginRequestVO requestVO) {
// 业务逻辑
log.info("新用户注册成功: {}", requestVO.getUsername());
}
public void handleError(Exception e) {
log.error("处理失败", e);
}
}
日志级别:
info: 重要业务操作(登录、注册、更新等)error: 异常情况debug: 调试信息(生产环境通常关闭)warn: 警告信息id (Long 类型,自增)LocalDateTime,字段名后缀为 Dtrelevance_score、accessed_at)@TableName("snail_ai_user")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserPO {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String email;
@EnumValue
private RoleEnum role;
private LocalDateTime createDt;
private LocalDateTime updateDt;
}
public interface UserMapper extends BaseMapper<UserPO> {
// 继承 BaseMapper 自动获得 CRUD 功能
// 复杂查询使用 LambdaQueryWrapper
}
// Lambda 查询
LambdaQueryWrapper<UserPO> wrapper = new LambdaQueryWrapper<UserPO>()
.eq(UserPO::getUsername, username)
.eq(UserPO::getStatus, StatusEnum.ACTIVE);
UserPO user = userMapper.selectOne(wrapper);
// 分页查询
PageDTO<UserPO> pageDTO = new PageDTO<>(page, size);
PageDTO<UserPO> result = userMapper.selectPage(pageDTO, wrapper);
// 单个对象
Result<UserVO> result = Result.ok(userVO);
// 分页数据
PageResult<List<UserVO>> pageResult = new PageResult<>(total, list);
// 失败响应
Result<String> result = Result.fail("操作失败");
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/{id}")
@LoginRequired
public Result<UserVO> getUser(@PathVariable Long id) {
return Result.ok(userService.getUser(id));
}
@PostMapping
@LoginRequired
public Result<UserVO> createUser(@RequestBody @Validated UserCreateVO vo) {
return Result.ok(userService.createUser(vo));
}
@GetMapping("/page")
@LoginRequired
public PageResult<List<UserVO>> page(UserQueryVO queryVO) {
return userService.page(queryVO);
}
}
coding-standards.mdarchitecture.mddatabase-guide.mdapi-design.mdnaming-conventions.mdcommon-patterns.mdexamples/ 目录项目根目录的重要文档:
/docs/CODE_STYLE.md - 完整的代码规范文档/MEMORY_QUICK_START.md - 记忆系统快速开始/记忆系统实现总结.md - 记忆系统实现详细总结如果你需要:
请直接提问,我会根据本规范为你提供详细的指导和建议。
版本: 1.0.0
作者: opensnail
最后更新: 2026-04-01