让AI更懂你,松哥教你一招!
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
AI 写的代码总是跑偏?今天我们来聊聊这个问题。
松哥最近在用 CodeBuddy 开发项目,发现了一个让人头疼的问题。
每次让 CodeBuddy 帮我写功能,我只是随口说了一句需求,结果 AI 理解的和我想要的不一样:
我说"帮我做个客户管理",AI 给我写了一个带 Redis 缓存的复杂系统,但我的项目根本没有 Redis 我说"加个跟进记录功能",AI 用了 MongoDB,但我的数据库是 MySQL 我说"做个销售漏斗",AI 给我写了一堆图表组件,但我只是想要一个简单的状态流转
每次都要反复沟通、反复修改,效率极低。
后来松哥发现了 OpenSpec 这个工具,专门解决这个问题。它的核心思想是:
先写规范,再写代码。让 AI 和你在动手之前就达成共识。
今天松哥就带大家用 OpenSpec + CodeBuddy,从零开发一个简易的 CRM(客户关系管理)系统,手把手教你怎么用规范驱动开发提升效率。
准备工作
技术栈说明
我们要开发的 CRM 系统,技术栈如下:
安装 Node.js
OpenSpec 是一个 Node.js 工具,需要先安装 Node.js(版本 20.19.0 或以上)。
去 Node.js 官网 下载安装即可。
安装完成后,验证:
node -v # 输出类似:v22.0.0 npm -v # 输出类似:10.0.0
安装 OpenSpec
npm install -g @fission-ai/openspec@latest
安装完成后,验证:
openspec --version # 输出类似:openspec/1.x.x
安装腾讯 CodeBuddy
安装完成后,用腾讯云账号登录即可。
创建项目并初始化 OpenSpec
创建 Spring Boot 项目
用 Spring Initializr 创建项目,配置如下:
Project: Maven Language: Java Spring Boot: 3.2.x Group: com.example Artifact: crm Java: 17 Dependencies: - Spring Web - Spring Data JPA(或 MyBatis-Plus) - MySQL Driver - Spring Security - Lombok - Validation
下载解压后,用 IDE 打开项目。
初始化 OpenSpec
在项目根目录打开终端,执行:
# 进入项目目录 cd /path/to/your/crm-project # 初始化 OpenSpec,指定 CodeBuddy 工具 openspec init --tools codebuddy
执行后,OpenSpec 会在项目中创建以下目录结构:
crm-project/ ├── openspec/ │ ├── specs/ # 系统规范(源代码真理) │ └── changes/ # 待开发的功能变更 ├── .codebuddy/ │ ├── skills/ # OpenSpec 注入的 AI 技能 │ └── commands/ # OpenSpec 注入的斜杠命令 └── src/ └── ...(Spring Boot 源码)
这时候 OpenSpec 已经把自己的"技能"注入到了 CodeBuddy 里,后续在 CodeBuddy 对话框里就可以直接使用 /opsx:propose 等命令了。
CRM 系统功能规划
在开始写代码之前,我们先梳理一下 CRM 系统要做哪些功能。
核心功能模块
一个基础的 CRM 系统,通常包含以下模块:
CRM 系统 ├── 用户管理 │ ├── 登录 / 登出 │ └── 用户信息管理 ├── 客户管理 │ ├── 客户列表 │ ├── 新增 / 编辑客户 │ ├── 客户详情 │ └── 客户搜索 ├── 跟进记录 │ ├── 添加跟进记录 │ ├── 查看跟进历史 │ └── 跟进提醒 └── 销售机会 ├── 机会列表 ├── 阶段管理(销售漏斗) └── 赢单 / 输单
开发顺序
我们按照以下顺序逐步开发:
第一步:用户认证(登录 / JWT) 第二步:客户管理(CRUD) 第三步:跟进记录 第四步:销售机会
每一步都用 OpenSpec 先写规范,再让 CodeBuddy 实现。
开发用户认证模块
用 OpenSpec 提议功能
打开 CodeBuddy 对话框,输入:
/opsx:propose add-user-auth
CodeBuddy 会自动创建以下文件:
openspec/changes/add-user-auth/ ├── proposal.md ← 为什么做、做什么 ├── specs/ │ └── auth/ │ └── spec.md ← 具体需求和场景 ├── design.md ← 技术方案 └── tasks.md ← 实现清单
查看并确认规范
OpenSpec 生成的 proposal.md 大概是这样的:
# 提议:用户认证模块 ## 意图 CRM 系统需要用户认证,确保只有授权用户才能访问系统数据。 ## 范围 - 用户登录接口(用户名 + 密码) - JWT Token 生成和验证 - 登出接口 - 当前用户信息查询 ## 方案 使用 Spring Security + JWT 实现无状态认证。 Token 存储在客户端,服务端不维护 Session。
specs/auth/spec.md 大概是这样的:
# 认证规范 ## 新增需求 ### 需求:用户登录 系统 SHALL 在用户提供正确的用户名和密码后,返回 JWT Token。 #### 场景:登录成功 - 给定:用户名 admin,密码正确 - 当:POST /api/auth/login - 那么:返回 200,包含 token 字段 - 并且:token 有效期为 24 小时 #### 场景:密码错误 - 给定:用户名 admin,密码错误 - 当:POST /api/auth/login - 那么:返回 401,包含错误信息 ### 需求:Token 验证 系统 SHALL 对所有非公开接口验证 JWT Token。 #### 场景:Token 有效 - 给定:请求头携带有效 Token - 当:访问任意受保护接口 - 那么:正常返回数据 #### 场景:Token 无效或过期 - 给定:请求头携带无效或过期 Token - 当:访问任意受保护接口 - 那么:返回 401
design.md 大概是这样的:
# 设计:用户认证 ## 技术方案 - Spring Security 配置白名单(/api/auth/** 不需要认证) - JWT 工具类:生成、解析、验证 Token - JwtAuthenticationFilter:每次请求验证 Token - UserDetailsService:从数据库加载用户信息 ## 数据库设计 表名:sys_user 字段: - id(主键) - username(用户名,唯一) - password(密码,BCrypt 加密) - real_name(真实姓名) - status(状态:0 禁用,1 启用) - create_time(创建时间) - update_time(更新时间) ## 接口设计 POST /api/auth/login → 登录 POST /api/auth/logout → 登出 GET /api/auth/me → 当前用户信息
tasks.md 大概是这样的:
# 任务 ## 1. 数据库 - [ ] 1.1 创建 sys_user 表 - [ ] 1.2 插入初始管理员账号(admin/123456) ## 2. 实体和 Mapper - [ ] 2.1 创建 SysUser 实体类 - [ ] 2.2 创建 SysUserMapper 接口 ## 3. JWT 工具 - [ ] 3.1 引入 jjwt 依赖 - [ ] 3.2 创建 JwtUtils 工具类 ## 4. Spring Security 配置 - [ ] 4.1 创建 SecurityConfig 配置类 - [ ] 4.2 创建 JwtAuthenticationFilter 过滤器 - [ ] 4.3 创建 UserDetailsServiceImpl 实现类 ## 5. 认证接口 - [ ] 5.1 创建 AuthController - [ ] 5.2 实现登录接口 - [ ] 5.3 实现登出接口 - [ ] 5.4 实现当前用户信息接口 ## 6. 测试 - [ ] 6.1 测试登录成功 - [ ] 6.2 测试密码错误 - [ ] 6.3 测试 Token 验证
:::success重要:在让 CodeBuddy 开始写代码之前,先仔细阅读这些规范文件,确认它们符合你的预期。如果有不对的地方,直接修改文件内容即可。
:::
让 CodeBuddy 实现代码
确认规范无误后,在 CodeBuddy 对话框输入:
/opsx:apply
CodeBuddy 会按照 tasks.md 的清单,逐个任务实现代码:
CodeBuddy:正在实现 add-user-auth... ✓ 1.1 创建 sys_user 表(src/main/resources/sql/init.sql) ✓ 1.2 插入初始管理员账号 ✓ 2.1 创建 SysUser 实体类 ✓ 2.2 创建 SysUserMapper 接口 ✓ 3.1 引入 jjwt 依赖(pom.xml) ✓ 3.2 创建 JwtUtils 工具类 ✓ 4.1 创建 SecurityConfig 配置类 ✓ 4.2 创建 JwtAuthenticationFilter 过滤器 ✓ 4.3 创建 UserDetailsServiceImpl 实现类 ✓ 5.1 创建 AuthController ✓ 5.2 实现登录接口 ✓ 5.3 实现登出接口 ✓ 5.4 实现当前用户信息接口 ✓ 6.1-6.3 编写测试用例 所有任务完成!
验证实现
/opsx:verify
CodeBuddy 会检查实现是否符合规范:
CodeBuddy:验证 add-user-auth... 完整性:✓ 所有任务完成 正确性:✓ 接口符合规范定义 一致性:✓ 代码风格与设计文档一致 可以归档!
归档并进入下一步
/opsx:archive
江南一点雨