with one click
snail-ai-dev-guide
Snail AI 项目开发规范和最佳实践指南。提供代码风格、命名规范、架构设计、数据库操作等全方位的开发指导。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Snail AI 项目开发规范和最佳实践指南。提供代码风格、命名规范、架构设计、数据库操作等全方位的开发指导。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| 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