- api/common/v1/tools.go 契约 + internal/controller/common 实现:uuid/md5/random/time/ip - cmd.go 注册 /api/common/v1 公开分组(无鉴权),复用 common/tools Go 包 - 修复 gtime v2.10.2 坑:Format 为 PHP 风格,Go layout 须用 Layout(),timex 封装为 Layout 语义 - 冒烟测试 5 端点全部通过;AGENTS.md / PROJECT_STRUCTURE.md / change-log 同步更新
5.7 KiB
5.7 KiB
AGENTS.md — 项目智能体说明书
本文件是给所有 AI 编程助手(CodeBuddy / WorkBuddy / Claude Code / Codex / Cursor 等)看的项目级上下文。 任何账号 clone 本仓库后,助手都应先读本文件与
docs/change-log/下最近的记录,即可无缝衔接。 请保持本文件长期稳定:只写「架构、规范、约定」,不要写一次性事项。
项目简介
service.xpcool.com:个人多客户端(mini / h5 / app)后端服务,GoFrame v2 单体应用。
核心业务:用户认证(JWT)、内容、收藏、站内消息;后台管理(RBAC + 操作审计)。
技术栈
| 项 | 值 |
|---|---|
| 语言 | Go 1.23.0 |
| 框架 | github.com/gogf/gf/v2 v2.10.2 |
| 数据库 | MySQL(ORM 由 gf 生成 dao/do/entity) |
| 认证 | JWT(internal/library/jwt),admin 另有 X-Permission 校验 |
目录结构
service.xpcool.com/
├── api/ # HTTP 契约与 Swagger 元数据
│ ├── user/v1/ # /api/v1 用户端 API(登录公开,其余走 UserAuth)
│ ├── admin/v1/ # /admin/v1 管理端 API(AdminAuth + X-Permission)
│ └── common/v1/ # /api/common/v1 公共接口(给前端调用,公开无鉴权)
├── common/ # 公共可复用模块(不依赖 internal,可独立抽取成库)
│ └── tools/ # 工具模块,按子功能分包(见下文)
├── internal/
│ ├── cmd/ # 启动引导(路由分组注册在此)
│ ├── consts/ # 错误码与常量
│ ├── controller/ # API→service 适配层(不写业务;含 common/ 公共接口实现)
│ ├── service/ # 领域用例(业务逻辑直接写这里,不用 logic/)
│ ├── dao/ # gf gen dao 生成,禁止手改
│ ├── model/ # entity/ do/ dto/ vo/(entity、do 生成,禁止手改)
│ ├── middleware/ # 路由中间件
│ ├── library/ # jwt / page / response 等内部基础件
│ └── table/ # 表列名常量
├── manifest/ # config.dev/test/prod.yaml、sql 迁移
├── docs/change-log/ # 每次请求与变更的记录(重要!见「上下文记忆」)
└── utility/ # (预留)跨切面辅助
公共接口(api/common/v1,前端调用)
- 路由前缀
/api/common/v1,公开、无鉴权(登录接口外的通用能力),实现于internal/controller/common。 - 当前端点:
GET/POST /tools/*(uuid、md5、random、time、ip),底层复用common/toolsGo 包。 - 新增公共接口:在
api/common/v1加 Req/Res(g.Meta 带 path/method),在internal/controller/common加方法,internal/cmd/cmd.go的/api/common/v1分组会自动绑定。
公共工具模块 common/tools
- 规则:不依赖 internal/,只薄封装 GoFrame 内置组件;新工具优先复用内置(gmd5/gaes/gdes/guid/grand/gtime/gconv/gstr/gfile...),避免重复造轮子。
- 子功能:
md5、cryptox(AES/DES)、uuid、random、timex、convertx、strx、slicex、ip、filex。 - 新增子功能:在
common/tools/下建子包,更新common/tools/doc.go的布局清单。
分层与调用规范(必须遵守)
- 调用链:
controller → service → dao → model(do);controller 不碰 dao。 - DTO/VO 边界:跨层出入参走
internal/model/dto与internal/model/vo,API 类型与 entity 不得越界。 - 数据库操作必须用 DO 对象(
internal/model/do),禁止g.Map;未赋值字段保持 nil 自动忽略:dao.Users.Ctx(ctx).Where(cols.Id, id).Data(do.User{Uid: uid}).Update() - 时间字段自动维护:
created_at/updated_at/deleted_at由 ORM 自动处理,禁止手动赋值;软删除用Delete(),禁止手写WhereNull(cols.DeletedAt)。 - 错误处理一律用 gerror(保留堆栈);响应统一走
internal/library/response。 - 生成代码(dao/do/entity)禁止手改,改表后跑
gf gen dao重新生成。 - 声明 ≥3 个相关变量时,用
var (...)块对齐。
常用命令
# 运行(dev)
GF_GCFG_FILE=config.dev.yaml DB_DSN="user:pass@tcp(127.0.0.1:3306)/db?loc=Local" JWT_SECRET=xxx go run main.go
# 数据库模型生成(唯一来源)
gf gen dao -p internal -g default -gt -c
# 构建 / 测试
go build ./...
go test ./...
上下文记忆(重要)
三层配合,保证「换个账号/换台机器也能无缝衔接」:
- 本文件(AGENTS.md):长期稳定的架构与规范。
docs/change-log/YYYY-MM-DD.md:每次对话的「请求 + 变更 + 决策」记录,随 git 提交。- 每次完成任务后,若
docs/change-log/已有当日文件则追加,否则新建; - 格式固定:
## 请求/## 变更(含文件清单)/## 决策与理由/## 待办与风险; - 助手开工前先读最近 1-2 篇,快速恢复上下文。
- 每次完成任务后,若
.workbuddy/memory/:WorkBuddy 桌面端本机记忆(每日日志 + MEMORY.md),已加入 .gitignore,不入库,仅本机增强。
注意事项
- ⚠️ gtime v2.10.2 格式化:
Time.Format("Y-m-d H:i:s")是 PHP 风格;传 Go layout(2006-01-02)要用Time.Layout(...)。工具包common/tools/timex已统一封装。 - ⚠️ gf v2.10.2 包名与旧版不同:AES/DES 在
crypto/gaes、crypto/gdes(无 gcrypto);UUID 在util/guid(无 guuid);无 gslicer(用标准库 slices)。 - 配置文件按
GF_GCFG_FILE切换;manifest/config/config.yaml不入库。 - 生产环境强密码:
JWT_SECRET、数据库口令。 - 变更涉及 API 时同步更新
api/下的 Swagger 元数据注释。