# Cursor 工作流程和规范 ## 目录结构说明 ### API 定义目录 (`app/main/api/desc/`) ``` desc/ ├── admin/ # 后台管理接口 │ ├── admin_user.api # 管理员用户相关接口 │ ├── platform_user.api # 平台用户相关接口 │ ├── order.api # 订单管理接口 │ ├── promotion.api # 促销活动接口 │ ├── menu.api # 菜单管理接口 │ ├── role.api # 角色权限接口 │ └── auth.api # 后台认证接口 │ ├── front/ # 前台业务接口 │ ├── user.api # 用户相关接口 │ ├── product.api # 产品相关接口 │ ├── pay.api # 支付相关接口 │ ├── query.api # 查询相关接口 │ ├── auth/ # 前台认证相关子模块 │ ├── product/ # 产品相关子模块 │ ├── query/ # 查询相关子模块 │ ├── user/ # 用户相关子模块 │ └── pay/ # 支付相关子模块 │ └── main.api # API 主入口文件,用于引入所有子模块 ``` ### 目录规范 1. 后台管理接口统一放在 `admin/` 目录下 - 所有后台管理相关的 API 定义文件都放在此目录 - 文件名应清晰表明模块功能,如 `order.api`、`user.api` 等 - 后台接口统一使用 `/api/v1/admin/` 前缀 2. 前台业务接口统一放在 `front/` 目录下 - 所有面向用户的 API 定义文件都放在此目录 - 可以根据业务模块创建子目录,如 `user/`、`product/` 等 - 前台接口统一使用 `/api/v1/` 前缀 3. 主入口文件 `main.api` - 用于引入所有子模块的 API 定义 - 保持清晰的模块分类和注释 ## API 开发流程 ### 1. API 定义 - 根据业务类型选择正确的目录: - 后台管理接口:`app/main/api/desc/admin/` 目录 - 前台业务接口:`app/main/api/desc/front/` 目录 - 创建新的 `.api` 文件,遵循以下命名规范: - 后台接口:`[模块名].api`,如 `order.api`、`user.api` - 前台接口:`[模块名].api`,如 `product.api`、`pay.api` - API 定义规范: - 使用 RESTful 风格 - 请求/响应结构体命名规范:`[模块名][操作名][Req/Resp]` - 字段类型使用 string 而不是 int64 来存储枚举值 - 添加必要的注释说明 - 请求/响应参数定义规范: ```go type ( // 创建类请求(必填字段) AdminCreateXXXReq { Field1 string `json:"field1"` // 字段1说明 Field2 int64 `json:"field2"` // 字段2说明 Field3 string `json:"field3"` // 字段3说明 } // 更新类请求(可选字段使用指针类型) AdminUpdateXXXReq { Id int64 `path:"id"` // ID(路径参数) Field1 *string `json:"field1,optional"` // 字段1说明(可选) Field2 *int64 `json:"field2,optional"` // 字段2说明(可选) Field3 *string `json:"field3,optional"` // 字段3说明(可选) } // 查询列表请求(分页参数 + 可选查询条件) AdminGetXXXListReq { Page int64 `form:"page"` // 页码 PageSize int64 `form:"pageSize"` // 每页数量 Field1 *string `form:"field1,optional"` // 查询条件1(可选) Field2 *int64 `form:"field2,optional"` // 查询条件2(可选) Field3 *string `form:"field3,optional"` // 查询条件3(可选) } // 列表项结构体(用于列表响应) XXXListItem { Id int64 `json:"id"` // ID Field1 string `json:"field1"` // 字段1 Field2 string `json:"field2"` // 字段2 Field3 string `json:"field3"` // 字段3 CreateTime string `json:"create_time"` // 创建时间 UpdateTime string `json:"update_time"` // 更新时间 } // 列表响应 AdminGetXXXListResp { Total int64 `json:"total"` // 总数 Items []XXXListItem `json:"items"` // 列表数据 } ) ``` - 参数定义注意事项: 1. 创建类请求(Create): - 所有字段都是必填的,使用普通类型(非指针) - 使用 `json` 标签,不需要 `optional` 标记 - 必须添加字段说明注释 2. 更新类请求(Update): - 除 ID 外的所有字段都是可选的,使用指针类型(如 `*string`、`*int64`) - 使用 `json` 标签,并添加 `optional` 标记 - ID 字段使用 `path` 标签,因为是路径参数 - 必须添加字段说明注释 3. 查询列表请求(GetList): - 分页参数(page、pageSize)使用普通类型 - 查询条件字段都是可选的,使用指针类型 - 使用 `form` 标签,并添加 `optional` 标记 - 必须添加字段说明注释 4. 响应结构体: - 列表响应使用 `Total` 和 `Items` 字段 - 列表项使用单独的结构体定义 - 时间字段统一使用 string 类型 - 必须添加字段说明注释 5. 标签使用规范: - 路径参数:`path:"id"` - JSON 参数:`json:"field_name"` - 表单参数:`form:"field_name"` - 可选字段:添加 `optional` 标记 - 所有字段必须添加说明注释 - 示例: ```go // 通知管理接口 @server( prefix: /api/v1/admin/notification group: admin_notification ) service main { // 创建通知 @handler AdminCreateNotification post /create (AdminCreateNotificationReq) returns (AdminCreateNotificationResp) // 更新通知 @handler AdminUpdateNotification put /update/:id (AdminUpdateNotificationReq) returns (AdminUpdateNotificationResp) // 获取通知列表 @handler AdminGetNotificationList get /list (AdminGetNotificationListReq) returns (AdminGetNotificationListResp) } ``` ### 2. 引入 API - 在 `app/main/api/main.api` 中引入新定义的 API 文件: ```go import "desc/order.api" ``` ### 3. 生成代码 - 在项目根目录运行 `gen_api.ps1` 脚本生成相关代码: ```powershell ./gen_api.ps1 ``` - 生成的文件包括: - `app/main/api/internal/handler/` - 处理器 - `app/main/api/internal/logic/` - 业务逻辑 - `app/main/api/internal/svc/` - 服务上下文 - `app/main/api/internal/types/` - 类型定义 ### 4. 实现业务逻辑 - 在 `app/main/api/internal/logic/` 目录下实现各个接口的业务逻辑 - 具体实现规范请参考 `logic.mdc` 文件 ## 注意事项 1. 所有枚举类型使用 string 而不是 int64 2. 错误处理必须使用 errors.Wrapf 和 xerr 包 3. 涉及多表操作时使用事务 4. 并发操作时注意使用互斥锁保护共享资源 5. 时间类型统一使用 "2006-01-02 15:04:05" 格式 6. 代码生成后需要检查并完善业务逻辑实现 7. 保持代码风格统一,添加必要的注释