# 爱鉴花小程序API接口文档 ## 概述 本文档详细描述爱鉴花微信小程序后端RESTful API接口规范,基于OpenAPI 3.0标准。 ## 基础信息 - **Base URL**: `http://localhost:3200/api/v1` - **认证方式**: Bearer Token (JWT) - **响应格式**: JSON - **字符编码**: UTF-8 ## 通用响应格式 ### 成功响应 ```json { "code": 200, "message": "操作成功", "data": {} } ``` ### 错误响应 ```json { "code": 400, "message": "参数错误", "error": "详细错误信息" } ``` ## 错误码说明 | 错误码 | 说明 | |--------|------| | 200 | 成功 | | 400 | 参数错误 | | 401 | 未授权 | | 403 | 禁止访问 | | 404 | 资源不存在 | | 500 | 服务器内部错误 | ## 认证接口 ### 1. 用户注册 **POST** `/auth/register` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | username | string | 是 | 用户名(3-20字符) | "testuser" | | password | string | 是 | 密码(最少6位) | "123456" | | phone | string | 是 | 手机号 | "13800138000" | | email | string | 否 | 邮箱 | "user@example.com" | | user_type | string | 否 | 用户类型 | "farmer" | **响应示例**: ```json { "code": 201, "message": "注册成功", "data": { "user_id": 1, "username": "testuser", "phone": "13800138000", "email": "user@example.com", "user_type": "farmer", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } } ``` ### 2. 用户登录 **POST** `/auth/login` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | login | string | 是 | 用户名/手机号/邮箱 | "testuser" | | password | string | 是 | 密码 | "123456" | **响应示例**: ```json { "code": 200, "message": "登录成功", "data": { "user_id": 1, "username": "testuser", "phone": "13800138000", "email": "user@example.com", "user_type": "farmer", "avatar_url": "/uploads/avatars/avatar.jpg", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } } ``` ### 3. 获取当前用户信息 **GET** `/users/me` **请求头**: ``` Authorization: Bearer ``` **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "id": 1, "username": "testuser", "phone": "13800138000", "email": "user@example.com", "user_type": "farmer", "avatar_url": "/uploads/avatars/avatar.jpg", "created_at": "2023-01-01T00:00:00Z", "last_login": "2023-01-01T00:00:00Z" } } ``` ## 植物识别接口 ### 1. 植物识别 **POST** `/identifications/identify` **请求格式**: `multipart/form-data` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | image | file | 是 | 植物图片文件 | | user_id | integer | 否 | 用户ID(已登录用户) | **响应示例**: ```json { "code": 200, "message": "识别成功", "data": { "identification_id": 1, "plant_name": "玫瑰花", "scientific_name": "Rosa rugosa", "family": "蔷薇科", "confidence": 0.92, "description": "玫瑰花,蔷薇科蔷薇属植物,具有浓郁的香气...", "care_tips": "喜阳光,需要充足的水分和肥料...", "related_products": [ { "id": 1, "name": "玫瑰花束", "price": 29.9, "image": "/uploads/products/rose_bouquet.jpg" } ] } } ``` ### 2. 获取识别历史 **GET** `/identifications/history` **请求头**: ``` Authorization: Bearer ``` **查询参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | page | integer | 页码(默认1) | | limit | integer | 每页数量(默认10) | **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "identifications": [ { "id": 1, "plant_name": "玫瑰花", "image_url": "/uploads/identifications/rose_123.jpg", "confidence": 0.92, "created_at": "2023-01-01T10:00:00Z" } ], "pagination": { "page": 1, "limit": 10, "total": 15, "pages": 2 } } } ``` ## 商品接口 ### 1. 获取商品列表 **GET** `/products` **查询参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | page | integer | 页码(默认1) | 1 | | limit | integer | 每页数量(默认12) | 12 | | category_id | integer | 分类ID | 1 | | keyword | string | 搜索关键词 | "玫瑰" | | min_price | number | 最低价格 | 10 | | max_price | number | 最高价格 | 100 | | sort_by | string | 排序字段 | "price" | | sort_order | string | 排序方向 | "asc" | **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "products": [ { "id": 1, "name": "玫瑰花束", "category_id": 1, "price": 29.9, "original_price": 39.9, "stock": 100, "image": "/uploads/products/rose_bouquet.jpg", "description": "新鲜玫瑰花束,香气浓郁,适合送礼", "category_name": "鲜花", "sales_count": 150, "rating": 4.8, "review_count": 45 } ], "pagination": { "page": 1, "limit": 12, "total": 50, "pages": 5 } } } ``` ### 2. 获取商品详情 **GET** `/products/{id}` **路径参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | id | integer | 商品ID | 1 | **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "id": 1, "name": "玫瑰花束", "category_id": 1, "price": 29.9, "original_price": 39.9, "stock": 100, "images": [ "/uploads/products/rose_bouquet_1.jpg", "/uploads/products/rose_bouquet_2.jpg" ], "description": "新鲜玫瑰花束,包含12朵红玫瑰...", "details": "花材:红玫瑰12朵\n包装:精美礼盒包装\n配送:同城2小时配送", "care_instructions": "放置在阴凉处,定期换水...", "category_name": "鲜花", "sales_count": 150, "rating": 4.8, "review_count": 45, "reviews": [ { "user_name": "张*", "rating": 5, "content": "花很新鲜,包装精美", "created_at": "2023-01-01T10:00:00Z" } ] } } ``` ### 3. 获取商品分类 **GET** `/categories` **响应示例**: ```json { "code": 200, "message": "获取成功", "data": [ { "id": 1, "name": "鲜花", "icon": "/icons/flowers.png", "product_count": 25 }, { "id": 2, "name": "盆栽", "icon": "/icons/potted_plants.png", "product_count": 18 } ] } ``` ## 购物车接口 ### 1. 获取购物车 **GET** `/cart` **请求头**: ``` Authorization: Bearer ``` **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "items": [ { "id": 1, "product_id": 1, "product_name": "玫瑰花束", "product_image": "/uploads/products/rose_bouquet.jpg", "price": 29.9, "quantity": 2, "subtotal": 59.8, "stock": 100 } ], "total_amount": 59.8, "total_quantity": 2 } } ``` ### 2. 添加商品到购物车 **POST** `/cart/items` **请求头**: ``` Authorization: Bearer ``` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | product_id | integer | 是 | 商品ID | 1 | | quantity | integer | 是 | 数量 | 2 | **响应示例**: ```json { "code": 200, "message": "添加成功", "data": { "cart_item_id": 1 } } ``` ### 3. 更新购物车商品数量 **PUT** `/cart/items/{id}` **请求头**: ``` Authorization: Bearer ``` **路径参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | id | integer | 购物车项ID | 1 | **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | quantity | integer | 是 | 数量 | 3 | **响应示例**: ```json { "code": 200, "message": "更新成功" } ``` ### 4. 删除购物车商品 **DELETE** `/cart/items/{id}` **请求头**: ``` Authorization: Bearer ``` **路径参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | id | integer | 购物车项ID | 1 | **响应示例**: ```json { "code": 200, "message": "删除成功" } ``` ## 订单接口 ### 1. 创建订单 **POST** `/orders` **请求头**: ``` Authorization: Bearer ``` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | items | array | 是 | 商品列表 | - | | address_id | integer | 是 | 收货地址ID | 1 | | coupon_code | string | 否 | 优惠券代码 | "WELCOME10" | | remark | string | 否 | 订单备注 | "请下午配送" | **items数组结构**: ```json [ { "product_id": 1, "quantity": 2 } ] ``` **响应示例**: ```json { "code": 201, "message": "订单创建成功", "data": { "order_id": 1, "order_no": "ORDER202301010001", "total_amount": 59.8, "payment_amount": 59.8, "pay_url": "/pay/order/ORDER202301010001" } } ``` ### 2. 获取订单列表 **GET** `/orders` **请求头**: ``` Authorization: Bearer ``` **查询参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | page | integer | 页码(默认1) | 1 | | limit | integer | 每页数量(默认10) | 10 | | status | string | 订单状态 | "pending" | **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "orders": [ { "id": 1, "order_no": "ORDER202301010001", "total_amount": 59.8, "status": "pending", "status_text": "待支付", "created_at": "2023-01-01T10:00:00Z", "items": [ { "product_name": "玫瑰花束", "product_image": "/uploads/products/rose_bouquet.jpg", "quantity": 2, "price": 29.9 } ] } ], "pagination": { "page": 1, "limit": 10, "total": 5, "pages": 1 } } } ``` ### 3. 获取订单详情 **GET** `/orders/{id}` **请求头**: ``` Authorization: Bearer ``` **路径参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | id | integer | 订单ID | 1 | **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "id": 1, "order_no": "ORDER202301010001", "total_amount": 59.8, "payment_amount": 59.8, "status": "paid", "status_text": "已支付", "shipping_address": { "recipient": "张三", "phone": "13800138000", "address": "北京市海淀区中关村大街1号" }, "items": [ { "product_id": 1, "product_name": "玫瑰花束", "product_image": "/uploads/products/rose_bouquet.jpg", "quantity": 2, "price": 29.9, "subtotal": 59.8 } ], "payment_info": { "payment_method": "wechat", "payment_time": "2023-01-01T10:05:00Z", "transaction_id": "4200001234567890" }, "shipping_info": { "shipping_method": "express", "tracking_number": "SF1234567890", "estimated_delivery": "2023-01-01T14:00:00Z" }, "created_at": "2023-01-01T10:00:00Z", "paid_at": "2023-01-01T10:05:00Z" } } ``` ## 收货地址接口 ### 1. 获取收货地址列表 **GET** `/addresses` **请求头**: ``` Authorization: Bearer ``` **响应示例**: ```json { "code": 200, "message": "获取成功", "data": [ { "id": 1, "recipient": "张三", "phone": "13800138000", "province": "北京市", "city": "北京市", "district": "海淀区", "detail": "中关村大街1号", "is_default": true, "created_at": "2023-01-01T00:00:00Z" } ] } ``` ### 2. 添加收货地址 **POST** `/addresses` **请求头**: ``` Authorization: Bearer ``` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | recipient | string | 是 | 收货人 | "张三" | | phone | string | 是 | 手机号 | "13800138000" | | province | string | 是 | 省份 | "北京市" | | city | string | 是 | 城市 | "北京市" | | district | string | 是 | 区县 | "海淀区" | | detail | string | 是 | 详细地址 | "中关村大街1号" | | is_default | boolean | 否 | 是否默认 | true | **响应示例**: ```json { "code": 201, "message": "添加成功", "data": { "address_id": 1 } } ``` ### 3. 更新收货地址 **PUT** `/addresses/{id}` **请求头**: ``` Authorization: Bearer ``` **路径参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | id | integer | 地址ID | 1 | **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | recipient | string | 否 | 收货人 | "张三" | | phone | string | 否 | 手机号 | "13800138000" | | province | string | 否 | 省份 | "北京市" | | city | string | 否 | 城市 | "北京市" | | district | string | 否 | 区县 | "海淀区" | | detail | string | 否 | 详细地址 | "中关村大街1号" | | is_default | boolean | 否 | 是否默认 | true | **响应示例**: ```json { "code": 200, "message": "更新成功" } ``` ### 4. 删除收货地址 **DELETE** `/addresses/{id}` **请求头**: ``` Authorization: Bearer ``` **路径参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | id | integer | 地址ID | 1 | **响应示例**: ```json { "code": 200, "message": "删除成功" } ``` ## 推广奖励接口 ### 1. 获取推广信息 **GET** `/promotion/info` **请求头**: ``` Authorization: Bearer ``` **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "promotion_code": "PROMO123456", "qr_code_url": "/uploads/qrcodes/promo_123456.png", "promotion_url": "https://aijianhua.com/promo/PROMO123456", "total_invites": 15, "successful_orders": 8, "total_earnings": 120.5, "available_balance": 85.3, "withdrawn_amount": 35.2 } } ``` ### 2. 获取推广记录 **GET** `/promotion/records` **请求头**: ``` Authorization: Bearer ``` **查询参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | page | integer | 页码(默认1) | 1 | | limit | integer | 每页数量(默认10) | 10 | | type | string | 记录类型 | "invite" | **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "records": [ { "id": 1, "type": "invite", "user_name": "李*", "phone": "138****0000", "amount": 10.0, "status": "completed", "created_at": "2023-01-01T10:00:00Z" }, { "id": 2, "type": "order_commission", "user_name": "王*", "order_amount": 299.0, "amount": 29.9, "status": "pending", "created_at": "2023-01-02T14:30:00Z" } ], "pagination": { "page": 1, "limit": 10, "total": 25, "pages": 3 } } } ``` ### 3. 申请提现 **POST** `/promotion/withdraw` **请求头**: ``` Authorization: Bearer ``` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | amount | number | 是 | 提现金额 | 50.0 | | payment_method | string | 是 | 支付方式 | "wechat" | | account_info | string | 是 | 账户信息 | "wx_1234567890" | **响应示例**: ```json { "code": 200, "message": "提现申请已提交", "data": { "withdraw_id": 1, "amount": 50.0, "status": "processing", "estimated_arrival": "2023-01-03T10:00:00Z" } } ``` ### 4. 获取提现记录 **GET** `/promotion/withdrawals` **请求头**: ``` Authorization: Bearer ``` **查询参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | page | integer | 页码(默认1) | 1 | | limit | integer | 每页数量(默认10) | 10 | **响应示例**: ```json { "code": 200, "message": "获取成功", "data": { "withdrawals": [ { "id": 1, "amount": 50.0, "payment_method": "wechat", "status": "completed", "completed_at": "2023-01-03T10:00:00Z", "created_at": "2023-01-01T10:00:00Z" } ], "pagination": { "page": 1, "limit": 10, "total": 5, "pages": 1 } } } ``` ## 支付接口 ### 1. 发起支付 **POST** `/pay/orders/{order_no}` **请求头**: ``` Authorization: Bearer ``` **路径参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | order_no | string | 订单编号 | "ORDER202301010001" | **响应示例**: ```json { "code": 200, "message": "支付参数生成成功", "data": { "payment_params": { "timeStamp": "1672531200", "nonceStr": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS", "package": "prepay_id=wx201410272009395522fsd8f8f8f8f8f8", "signType": "MD5", "paySign": "C380BEC2BFD727A4B6845133519F3AD6" } } } ``` ### 2. 查询支付结果 **GET** `/pay/orders/{order_no}/status` **请求头**: ``` Authorization: Bearer ``` **路径参数**: | 参数名 | 类型 | 说明 | 示例 | |--------|------|------|------| | order_no | string | 订单编号 | "ORDER202301010001" | **响应示例**: ```json { "code": 200, "message": "查询成功", "data": { "order_no": "ORDER202301010001", "payment_status": "paid", "paid_amount": 59.8, "paid_at": "2023-01-01T10:05:00Z" } } ``` ## 文件上传接口 ### 1. 上传文件 **POST** `/upload` **请求格式**: `multipart/form-data` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | file | file | 是 | 上传文件 | - | | type | string | 否 | 文件类型 | "avatar" | **响应示例**: ```json { "code": 200, "message": "上传成功", "data": { "url": "/uploads/avatars/avatar_123.jpg", "filename": "avatar_123.jpg", "size": 102400, "mime_type": "image/jpeg" } } ``` --- *本文档最后更新: 2024-01-15* *API版本: v1.0*