# OPS API v1 使用手册 ## 概述 OPS (Operations 运营管理系统) 是一个前后端分离的工作流/运营管理系统。本文档详细描述了后端API的接口规范和使用方法。 **当前版本**: v1 **基础URL**: `http://localhost:8080/api/v1/` **响应格式**: JSON --- ## 目录 1. [快速开始](#快速开始) 2. [认证系统](#认证系统) 3. [用户管理](#用户管理) 4. [文件管理](#文件管理) 5. [采购管理](#采购管理) 6. [系统管理](#系统管理) 7. [错误码说明](#错误码说明) 8. [请求示例](#请求示例) --- ## 快速开始 ### 安装与运行 ```bash # 进入后端目录 cd backend # 安装依赖 go mod download # 运行服务器 go run cmd/ops-server/main.go # 或使用编译版本 go build -o ops-server cmd/ops-server/main.go ./ops-server ``` ### 环境配置 默认配置位于 `./data/config.yaml`,模板配置在 `./defConfig/configTemp.yaml` ```yaml # 默认配置示例 server: host: "localhost" port: 8080 tls_enable: false database: driver: "sqlite" path: "./data/db.db" file: paths: image: "./data/images" max_size: 5242880 # 5MB ``` ### 首次使用 1. 启动后端服务器 2. 访问前端界面:`http://localhost:8080` 3. 注册新用户或使用默认账户 4. 开始使用API --- ## 认证系统 OPS系统支持多种认证方式,确保与现有前端的兼容性。 ### 认证方式 **1. Authorization Header (推荐)** ```http Authorization: Bearer ``` **2. Cookie Header** ```http Cookie: ops_session= ``` **3. POST Body (兼容现有前端)** ```json { "userCookieValue": "", "otherField": "value" } ``` ### 响应格式 所有API响应都遵循统一格式: ```json { "code": "0", // 错误码,0表示成功 "message": "Success", // 人类可读的消息 "data": {} // 实际数据,根据接口不同而变化 } ``` --- ## 用户管理 ### 用户注册 **注册新用户** ```http POST /api/v1/users/register Content-Type: application/json ``` **请求体**: ```json { "name": "username", "password": "password123", "password_confirm": "password123", "email": "user@example.com" } ``` **响应**: ```json { "code": "0", "message": "注册成功", "data": { "user_id": 1, "name": "username", "email": "user@example.com" } } ``` ### 用户登录 **用户登录获取令牌** ```http POST /api/v1/users/login Content-Type: application/json ``` **请求体**: ```json { "name": "username", "password": "password123" } ``` **响应**: ```json { "code": "0", "message": "登录成功", "data": { "user_id": 1, "name": "username", "cookie_value": "session_token_here", "expires_at": "2026-04-01T10:00:00Z" } } ``` ### 忘记密码 **请求密码重置** ```http POST /api/v1/users/forgot-password Content-Type: application/json ``` **请求体**: ```json { "email": "user@example.com" } ``` **响应**: ```json { "code": "0", "message": "重置邮件已发送", "data": null } ``` ### 重置密码 **使用重置令牌设置新密码** ```http POST /api/v1/users/reset-password Content-Type: application/json ``` **请求体**: ```json { "token": "reset_token", "new_password": "newpassword123", "new_password_confirm": "newpassword123" } ``` ### 获取用户资料 **获取当前用户信息** ```http GET /api/v1/users/profile Authorization: Bearer ``` **响应**: ```json { "code": "0", "message": "Success", "data": { "user_id": 1, "name": "username", "email": "user@example.com", "avatar": "/files/get/avatar_hash", "gender": "male", "language": "zh-CN", "created_at": "2026-03-31T10:00:00Z", "last_login": "2026-03-31T18:00:00Z" } } ``` ### 更新用户资料 **更新用户个人信息** ```http PUT /api/v1/users/profile Authorization: Bearer Content-Type: application/json ``` **请求体**: ```json { "email": "newemail@example.com", "avatar_hash": "new_avatar_hash", "gender": "female", "language": "en-US" } ``` ### 用户登出 **注销当前会话** ```http POST /api/v1/users/logout Authorization: Bearer ``` --- ## 文件管理 ### 上传文件 **上传图片文件** ```http POST /api/v1/files/upload Authorization: Bearer Content-Type: multipart/form-data ``` **表单字段**: - `file`: 文件内容 (图片文件,支持PNG、JPEG、GIF、WebP) - `type`: 文件类型 (可选,默认: "image") - `description`: 文件描述 (可选) **响应**: ```json { "code": "0", "message": "文件上传成功", "data": { "file_id": 1, "name": "example.png", "sha256": "abc123...", "mime": "image/png", "size": 123456, "download_url": "/api/v1/files/download/abc123...", "preview_url": "/api/v1/files/get/abc123...", "created_at": "2026-03-31T18:15:00Z" } } ``` ### 获取文件列表 **获取用户上传的文件列表** ```http GET /api/v1/files/list Authorization: Bearer ``` **查询参数**: - `type`: 文件类型过滤 (可选) - `page`: 页码 (默认: 1) - `entries`: 每页数量 (默认: 20, 最大: 100) **响应**: ```json { "code": "0", "message": "Success", "data": { "files": [ { "file_id": 1, "name": "example.png", "sha256": "abc123...", "mime": "image/png", "size": 123456, "type": "image", "created_at": "2026-03-31T18:15:00Z" } ], "total": 10, "page": 1, "pages": 1 } } ``` ### 获取文件信息 **获取单个文件详情** ```http GET /api/v1/files/{file_id} Authorization: Bearer ``` **路径参数**: - `file_id`: 文件ID ### 下载文件 **下载文件内容** ```http GET /api/v1/files/download/{hash} ``` **路径参数**: - `hash`: 文件SHA256哈希值 ### 预览文件 **预览文件(浏览器直接显示)** ```http GET /api/v1/files/get/{hash} ``` **路径参数**: - `hash`: 文件SHA256哈希值 ### 删除文件 **删除用户文件** ```http DELETE /api/v1/files/{file_id} Authorization: Bearer ``` --- ## 采购管理 ### 获取采购订单列表 **方式1: POST方式(兼容现有前端)** ```http POST /api/v1/purchase/getorders Authorization: Bearer Content-Type: application/json ``` **请求体**: ```json { "search": "keyword", "page": 1, "entries": 20 } ``` **方式2: GET方式(RESTful API)** ```http GET /api/v1/purchase/orders Authorization: Bearer ``` **查询参数**: - `search`: 搜索关键词 (可选) - `page`: 页码 (默认: 1) - `entries`: 每页数量 (默认: 20, 最大: 300) **响应**: ```json { "code": "0", "message": "Success", "data": { "all_count": 150, "all_orders": [ { "id": 1, "user_id": 1, "title": "服务器硬件采购", "part_name": "服务器", "order_status": "pending", "tracking_number": "TN123456789", "photos": ["hash1", "hash2"], "created_at": "2026-03-30T10:00:00Z", "update_time": "2026-03-31T15:00:00Z" } ] } } ``` ### 创建采购订单 **方式1: POST方式(兼容现有前端)** ```http POST /api/v1/purchase/addorder Authorization: Bearer Content-Type: application/json ``` **方式2: POST方式(RESTful API)** ```http POST /api/v1/purchase/orders Authorization: Bearer Content-Type: application/json ``` **请求体**: ```json { "costs": [ { "cost": 1200, "costt": 1200, "currencytype": "CNY", "int": 2, "type": "服务器" }, { "cost": 300, "costt": 300, "currencytype": "CNY", "int": 1, "type": "内存条" } ], "title": "服务器硬件采购", "order_status": "pending", "part_name": "服务器配件", "remark": "需要尽快发货", "link": "https://example.com/product/123", "photos": ["image_hash_1", "image_hash_2"], "styles": "{\"priority\": \"high\"}", "tracking_number": "TN123456789", "update_time": "2026-03-31T18:00:00" } ``` **响应**: ```json { "code": "0", "message": "订单创建成功", "data": { "order_id": 1, "total_cost": 2700, "created_at": "2026-03-31T18:17:00Z" } } ``` ### 获取订单详情 **获取单个订单的详细信息** ```http GET /api/v1/purchase/orders/{order_id} Authorization: Bearer ``` **路径参数**: - `order_id`: 订单ID **响应**: ```json { "code": "0", "message": "Success", "data": { "order": { "id": 1, "user_id": 1, "title": "服务器硬件采购", "remark": "需要尽快发货", "photos": ["hash1", "hash2"], "link": "https://example.com/product/123", "part_name": "服务器配件", "styles": "{\"priority\": \"high\"}", "update_time": "2026-03-31T18:00:00Z", "tracking_number": "TN123456789", "order_status": "pending", "created_at": "2026-03-31T18:17:00Z" }, "costs": [ { "id": 1, "order_id": 1, "user_id": 1, "price": 1200, "quantity": 2, "created_at": "2026-03-31T18:17:00Z" }, { "id": 2, "order_id": 1, "user_id": 1, "price": 300, "quantity": 1, "created_at": "2026-03-31T18:17:00Z" } ] } } ``` --- ## 系统管理 ### 系统状态 **获取系统运行状态** ```http GET /api/v1/system/status ``` **响应**: ```json { "code": "0", "message": "系统运行正常", "data": { "version": "1.0.0", "uptime": "10h30m", "database": "connected", "memory_usage": "45%", "active_sessions": 5, "total_users": 50, "server_time": "2026-03-31T18:17:30Z" } } ``` ### 获取系统配置 **获取系统配置(需要管理员权限)** ```http GET /api/v1/system/config Authorization: Bearer ``` ### 更新系统配置 **更新系统配置(需要管理员权限)** ```http PUT /api/v1/system/config Authorization: Bearer Content-Type: application/json ``` --- ## 错误码说明 ### 核心错误码 | 错误码 | 含义 | HTTP状态码 | |--------|------|-----------| | `0` | 成功 | 200 | | `-1` | 内部服务器错误 | 500 | | `-2` | 参数错误 | 400 | | `-3` | 用户未登录 | 401 | | `-4` | 用户已存在 | 409 | | `-5` | 用户不存在 | 404 | | `-42` | 用户名或密码错误 | 401 | ### 文件相关错误码 | 错误码 | 含义 | HTTP状态码 | |--------|------|-----------| | `-100` | 文件不存在 | 404 | | `-101` | 文件类型不支持 | 415 | | `-102` | 文件大小超出限制 | 413 | | `-103` | 文件上传失败 | 500 | | `-104` | 文件哈希计算失败 | 500 | ### 采购订单相关错误码 | 错误码 | 含义 | HTTP状态码 | |--------|------|-----------| | `-200` | 订单不存在 | 404 | | `-201` | 订单创建失败 | 500 | | `-202` | 费用明细错误 | 400 | | `-203` | 订单状态无效 | 400 | --- ## 请求示例 ### 使用cURL **用户登录**: ```bash curl -X POST http://localhost:8080/api/v1/users/login \ -H "Content-Type: application/json" \ -d '{"name": "admin", "password": "password123"}' ``` **获取采购订单**: ```bash curl -X GET "http://localhost:8080/api/v1/purchase/orders?page=1&entries=20" \ -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." ``` **上传文件**: ```bash curl -X POST http://localhost:8080/api/v1/files/upload \ -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \ -F "file=@/path/to/image.png" \ -F "type=image" \ -F "description=产品图片" ``` ### 使用JavaScript (Fetch API) **用户注册**: ```javascript async function registerUser(username, password, email) { const response = await fetch('http://localhost:8080/api/v1/users/register', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name: username, password: password, password_confirm: password, email: email }) }); const result = await response.json(); if (result.code === '0') { console.log('注册成功:', result.data); return result.data.cookie_value; } else { console.error('注册失败:', result.message); throw new Error(result.message); } } ``` **创建采购订单**: ```javascript async function createPurchaseOrder(token, orderData) { const response = await fetch('http://localhost:8080/api/v1/purchase/orders', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify(orderData) }); const result = await response.json(); if (result.code === '0') { console.log('订单创建成功:', result.data); return result.data.order_id; } else { console.error('订单创建失败:', result.message); throw new Error(result.message); } } ``` ### 使用Python (Requests) **获取用户资料**: ```python import requests def get_user_profile(token): url = "http://localhost:8080/api/v1/users/profile" headers = { "Authorization": f"Bearer {token}" } response = requests.get(url, headers=headers) result = response.json() if result["code"] == "0": return result["data"] else: raise Exception(result["message"]) # 使用示例 try: token = "your_token_here" profile = get_user_profile(token) print(f"用户ID: {profile['user_id']}") print(f"用户名: {profile['name']}") except Exception as e: print(f"错误: {e}") ``` --- ## 附录 ### 数据模型说明 **用户表 (TabUser_)** ```go type TabUser_ struct { ID uint `gorm:"primarykey"` // 用户ID Name string `gorm:"unique"` // 用户名(唯一) PasswordHash string // 密码哈希 Email string // 邮箱 CreatedAt time.Time // 创建时间 } ``` **文件信息表 (TabFileInfo_)** ```go type TabFileInfo_ struct { ID uint `gorm:"primaryKey"` // 文件ID Name string `gorm:"not null"` // 文件名 Path string `gorm:"not null"` // 文件路径 Sha256 string `gorm:"not null;index"` // SHA256哈希 Mime string `gorm:"index"` // MIME类型 Type string `gorm:"index"` // 文件类型 UserID uint `gorm:"not null;index"` // 用户ID Date time.Time // 上传时间 } ``` **采购订单表 (TabPurchaseOrder)** ```go type TabPurchaseOrder struct { ID uint `gorm:"primarykey"` // 订单ID UserID uint `gorm:"not null"` // 用户ID Title string `gorm:"size:200"` // 标题 Remark string `gorm:"type:text"` // 备注 Photos datatypes.JSON `gorm:"type:json"` // 照片哈希数组 Link string `gorm:"size:1000"` // 链接 PartName string `gorm:"size:200;not null"` // 物品名称 Styles string `gorm:"type:text"` // 样式数组 TrackingNumber string `gorm:"size:100;Index"` // 快递单号 OrderStatus string `gorm:"default:1"` // 订单状态 CreatedAt *time.Time `gorm:"type:datetime"` // 创建时间 UpdateTime *time.Time `gorm:"type:datetime"` // 更新时间 } ``` ### 版本历史 | 版本 | 日期 | 变更说明 | |------|------|----------| | v1.0 | 2026-03-31 | 初始版本发布,包含完整的API文档 | | v1.1 | 2026-04-01 | 添加文件管理API,优化错误处理 | | v1.2 | 2026-04-02 | 增加采购订单管理功能 | ### 支持与反馈 如需技术支持或有任何建议,请联系: - **GitHub仓库**: https://github.com/yourusername/ops - **邮箱**: support@example.com - **文档更新**: 定期查看本文档获取最新API信息 --- *文档最后更新: 2026-03-31* *OPS系统开发团队 版权所有 © 2026*