# 使用平台创建工单的方法 > 平台:Gitea 1.25.2 · 仓库:admin/aiagent · 地址:http://101.43.95.130:3001 --- ## 前置准备 ### 账号信息 | 项 | 值 | |----|-----| | 地址 | http://101.43.95.130:3001 | | 用户名 | admin | | 密码 | 123456 | | 仓库 | admin/aiagent | | 分支 | rjb_win_dev | ### 获取 API Token ```bash curl -s -X POST "http://101.43.95.130:3001/api/v1/users/admin/tokens" \ -u "admin:123456" \ -H "Content-Type: application/json" \ -d '{"name":"claude-code-api","scopes":["write:issue","write:repository","read:repository","read:user"]}' ``` 返回示例: ```json { "id": 3, "name": "claude-code-api", "sha1": "fbc9ee7f96635793f4844187eac5c0e573480721", "token_last_eight": "73480721", "scopes": ["write:issue", "write:repository", "read:user"] } ``` **Token**:`fbc9ee7f96635793f4844187eac5c0e573480721` ### Token 管理 - 查看已有 Token:登录 Gitea → 头像 → 设置 → 应用 → 管理 Access Token - 权限最小化原则:创建工单只需要 `write:issue` + `read:repository` --- ## 工单 CRUD ### 1. 创建工单 **端点**:`POST /api/v1/repos/{owner}/{repo}/issues` **JSON 模板**: ```json { "title": "[类别] 标题", "body": "## 背景\n\n...\n\n## 需求\n\n1. ...\n2. ...\n\n## 涉及模块\n\n- 文件路径\n\n## 优先级\n\n高/中/低", "assignee": "admin", "milestone": null } ``` **curl 命令**: ```bash TOKEN="fbc9ee7f96635793f4844187eac5c0e573480721" # 方式一:直接传 JSON(仅英文/简单内容) curl -s -X POST "http://101.43.95.130:3001/api/v1/repos/admin/aiagent/issues" \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ -d '{"title":"测试工单","body":"内容","assignee":"admin"}' # 方式二:从文件读取(推荐,支持中文/长文本) curl -s -X POST "http://101.43.95.130:3001/api/v1/repos/admin/aiagent/issues" \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ --data-binary @/tmp/issue.json ``` **返回值**: ```json { "id": 19, "url": "http://101.43.95.130:3001/api/v1/repos/admin/aiagent/issues/1", "html_url": "http://101.43.95.130:3001/admin/aiagent/issues/1", "number": 1, "title": "...", "state": "open", "assignee": { "login": "admin" }, "created_at": "2026-05-04T22:44:20+08:00" } ``` ### 2. 查询工单 ```bash # 查看所有开放工单 curl -s "http://101.43.95.130:3001/api/v1/repos/admin/aiagent/issues?state=open" \ -H "Authorization: token $TOKEN" # 查看单个工单 curl -s "http://101.43.95.130:3001/api/v1/repos/admin/aiagent/issues/1" \ -H "Authorization: token $TOKEN" ``` ### 3. 修改工单 ```bash # 修改标题、内容、指派人 curl -s -X PATCH "http://101.43.95.130:3001/api/v1/repos/admin/aiagent/issues/1" \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ -d '{"title":"新标题","body":"新内容","assignee":"admin"}' ``` ### 4. 关闭工单 ```bash curl -s -X PATCH "http://101.43.95.130:3001/api/v1/repos/admin/aiagent/issues/1" \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ -d '{"state":"closed"}' ``` ### 5. 添加评论 ```bash curl -s -X POST "http://101.43.95.130:3001/api/v1/repos/admin/aiagent/issues/1/comments" \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ -d '{"body":"已修复,请验证。"}' ``` --- ## 工单标题规范 建议使用 `[类别]` 前缀区分工单类型: | 前缀 | 用途 | 示例 | |------|------|------| | `[Bug]` | 缺陷修复 | `[Bug] SSE 流式降级导致重复空消息` | | `[Phase N]` | 按阶段规划 | `[Phase 4] 降级/回退链` | | `[监控]` | 监控告警 | `[监控] 系统监控面板` | | `[DevOps]` | 运维基础设施 | `[DevOps] Docker 生产环境配置` | | `[UX]` | 用户体验 | `[UX] 工作流画布自动布局` | | `[高级]` | 差异化功能 | `[高级] 插件系统` | | `[质量]` | 测试与安全 | `[质量] 单元测试覆盖率提升` | | `[Agent]` | Agent 能力 | `[Agent] 多模态 Agent` | --- ## 踩坑记录 ### 坑1:中文 JSON 编码异常 **现象**:curl 的 `-d` 参数直接写中文 JSON 返回 `json: slice unexpected end of JSON input` **原因**:shell 对中文和特殊字符的处理不一致 **解决**:改用 `--data-binary @文件路径`,将 JSON 先写入文件 ```bash # 错误写法 curl -d '{"title":"中文标题",...}' ... # 正确写法 echo '{"title":"中文标题",...}' > /tmp/issue.json curl --data-binary @/tmp/issue.json ... ``` ### 坑2:labels 参数格式 Gitea 的 labels 必须传数字 ID(如 `[1, 2]`),不能传字符串名(如 `["bug"]`)。如果不确定 label ID,先查或不传 labels。 ```bash # 先查有哪些 labels curl -s "http://101.43.95.130:3001/api/v1/repos/admin/aiagent/labels" \ -H "Authorization: token $TOKEN" ``` ### 坑3:body 中的特殊字符 JSON body 中不要使用: - 中文双引号 `""` → 改用书名号 `「」` 或省略 - 反引号 `` ` `` → JSON 中需要转义为 `\`` - 未转义的换行 → JSON 中换行用 `\n` --- ## 批量创建脚本 ```bash #!/bin/bash TOKEN="你的token" REPO_URL="http://101.43.95.130:3001/api/v1/repos/admin/aiagent/issues" # 准备多个 JSON 文件 # /tmp/issues/01.json, /tmp/issues/02.json, ... for f in /tmp/issues/*.json; do num=$(basename "$f" .json) result=$(curl -s -X POST "$REPO_URL" \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ --data-binary @"$f" | grep -o '"number":[0-9]*') echo " $num → $result" done ``` --- ## API 参考 | 操作 | 方法 | 路径 | |------|------|------| | 创建 | POST | `/api/v1/repos/{owner}/{repo}/issues` | | 列表 | GET | `/api/v1/repos/{owner}/{repo}/issues?state=open` | | 详情 | GET | `/api/v1/repos/{owner}/{repo}/issues/{id}` | | 修改 | PATCH | `/api/v1/repos/{owner}/{repo}/issues/{id}` | | 评论 | POST | `/api/v1/repos/{owner}/{repo}/issues/{id}/comments` | 完整 API 文档:[http://101.43.95.130:3001/api/swagger](http://101.43.95.130:3001/api/swagger)