10 KiB
10 KiB
动物认领系统API文档
概述
动物认领系统提供了完整的动物认领申请、审核、管理功能,支持用户申请认领动物、管理员审核申请、认领续期等功能。
基础信息
- 基础URL:
/api/v1/animal-claims - 认证方式: Bearer Token
- 数据格式: JSON
- 字符编码: UTF-8
数据模型
认领申请 (AnimalClaim)
{
"id": 1,
"claim_no": "CLAIM20241201001",
"animal_id": 1,
"animal_name": "小白",
"animal_type": "狗",
"animal_image": "/uploads/animals/dog1.jpg",
"user_id": 2,
"username": "张三",
"user_phone": "13800138001",
"claim_reason": "我很喜欢这只小狗",
"claim_duration": 12,
"total_amount": 1200.00,
"contact_info": "手机:13800138001,微信:user001",
"status": "pending",
"start_date": "2024-12-01T11:30:00.000Z",
"end_date": "2025-12-01T11:30:00.000Z",
"reviewed_by": 1,
"reviewer_name": "管理员",
"review_remark": "申请材料完整,同意认领",
"reviewed_at": "2024-12-01T11:30:00.000Z",
"approved_at": "2024-12-01T11:30:00.000Z",
"cancelled_at": null,
"cancel_reason": null,
"created_at": "2024-12-01T10:00:00.000Z",
"updated_at": "2024-12-01T11:30:00.000Z"
}
认领统计 (ClaimStatistics)
{
"basic": {
"total_claims": 100,
"pending_claims": 10,
"approved_claims": 80,
"rejected_claims": 8,
"cancelled_claims": 2,
"total_amount": 120000.00,
"avg_duration": 12.5
},
"by_type": [
{
"type": "狗",
"claim_count": 50,
"approved_count": 45,
"total_amount": 60000.00
}
],
"by_month": [
{
"month": "2024-12",
"claim_count": 20,
"approved_count": 18,
"total_amount": 24000.00
}
]
}
API接口
1. 申请认领动物
接口地址: POST /api/v1/animal-claims
请求头:
Authorization: Bearer {token}
Content-Type: application/json
请求参数:
{
"animal_id": 1,
"claim_reason": "我很喜欢这只小狗,希望能够认领它",
"claim_duration": 12,
"contact_info": "手机:13800138001,微信:user001"
}
参数说明:
animal_id(必填): 动物IDclaim_reason(可选): 认领理由claim_duration(可选): 认领时长(月),默认12个月,范围1-60contact_info(必填): 联系方式
响应示例:
{
"success": true,
"message": "认领申请提交成功",
"data": {
"id": 1,
"claim_no": "CLAIM20241201001",
"animal_id": 1,
"user_id": 2,
"status": "pending",
"total_amount": 1200.00
}
}
2. 获取我的认领申请列表
接口地址: GET /api/v1/animal-claims/my
请求参数:
page(可选): 页码,默认1limit(可选): 每页数量,默认10,最大100status(可选): 申请状态 (pending/approved/rejected/cancelled)animal_type(可选): 动物类型start_date(可选): 开始日期 (YYYY-MM-DD)end_date(可选): 结束日期 (YYYY-MM-DD)
响应示例:
{
"success": true,
"message": "获取认领申请列表成功",
"data": [
{
"id": 1,
"claim_no": "CLAIM20241201001",
"animal_name": "小白",
"status": "pending"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"pages": 1
}
}
3. 取消认领申请
接口地址: PUT /api/v1/animal-claims/{id}/cancel
路径参数:
id: 认领申请ID
响应示例:
{
"success": true,
"message": "认领申请已取消",
"data": {
"id": 1,
"status": "cancelled",
"cancelled_at": "2024-12-01T15:00:00.000Z",
"cancel_reason": "用户主动取消"
}
}
4. 审核认领申请(管理员)
接口地址: PUT /api/v1/animal-claims/{id}/review
权限要求: 管理员或经理
请求参数:
{
"status": "approved",
"review_remark": "申请材料完整,同意认领"
}
参数说明:
status(必填): 审核状态 (approved/rejected)review_remark(可选): 审核备注
响应示例:
{
"success": true,
"message": "认领申请审核通过",
"data": {
"id": 1,
"status": "approved",
"reviewed_at": "2024-12-01T11:30:00.000Z",
"start_date": "2024-12-01T11:30:00.000Z",
"end_date": "2025-12-01T11:30:00.000Z"
}
}
5. 获取所有认领申请列表(管理员)
接口地址: GET /api/v1/animal-claims
权限要求: 管理员或经理
请求参数:
page(可选): 页码,默认1limit(可选): 每页数量,默认10,最大100status(可选): 申请状态animal_type(可选): 动物类型user_id(可选): 用户IDstart_date(可选): 开始日期end_date(可选): 结束日期keyword(可选): 关键词搜索(订单号、动物名称、用户名)
6. 获取动物的认领申请列表(管理员)
接口地址: GET /api/v1/animal-claims/animal/{animal_id}
权限要求: 管理员或经理
路径参数:
animal_id: 动物ID
7. 检查认领权限
接口地址: GET /api/v1/animal-claims/check-permission/{animal_id}
路径参数:
animal_id: 动物ID
响应示例:
{
"success": true,
"message": "检查认领权限成功",
"data": {
"can_claim": true
}
}
8. 续期认领
接口地址: POST /api/v1/animal-claims/{id}/renew
请求参数:
{
"duration": 6,
"payment_method": "wechat"
}
参数说明:
duration(必填): 续期时长(月),范围1-60payment_method(必填): 支付方式 (wechat/alipay/bank_transfer)
响应示例:
{
"success": true,
"message": "续期申请已提交,请完成支付",
"data": {
"renewal": {
"id": 1,
"claim_id": 1,
"duration": 6,
"amount": 600.00,
"status": "pending"
},
"amount": 600.00,
"message": "续期申请已提交,请完成支付"
}
}
9. 获取认领统计信息(管理员)
接口地址: GET /api/v1/animal-claims/statistics
权限要求: 管理员或经理
请求参数:
start_date(可选): 开始日期end_date(可选): 结束日期animal_type(可选): 动物类型
响应示例:
{
"success": true,
"message": "获取认领统计信息成功",
"data": {
"basic": {
"total_claims": 100,
"pending_claims": 10,
"approved_claims": 80,
"rejected_claims": 8,
"cancelled_claims": 2,
"total_amount": 120000.00,
"avg_duration": 12.5
},
"by_type": [...],
"by_month": [...]
}
}
状态说明
认领申请状态
pending: 待审核approved: 已通过rejected: 已拒绝cancelled: 已取消expired: 已过期(系统自动设置)
续期状态
pending: 待支付paid: 已支付cancelled: 已取消
支付方式
wechat: 微信支付alipay: 支付宝bank_transfer: 银行转账
错误码说明
| 错误码 | 说明 |
|---|---|
| 400 | 请求参数错误 |
| 401 | 未授权,需要登录 |
| 403 | 权限不足 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
| 503 | 服务不可用(无数据库模式) |
业务规则
认领申请规则
- 每个用户对同一动物只能有一个有效的认领申请
- 只有状态为"可认领"的动物才能被申请认领
- 认领时长范围为1-60个月
- 认领申请通过后,动物状态自动变为"已认领"
审核规则
- 只有待审核状态的申请才能被审核
- 审核通过后自动设置开始和结束时间
- 审核拒绝后动物状态保持不变
续期规则
- 只有已通过的认领申请才能续期
- 距离到期30天内才能申请续期
- 续期需要完成支付才能生效
取消规则
- 待审核和已通过的申请可以取消
- 取消已通过的申请会恢复动物为可认领状态
注意事项
- 所有时间字段均为UTC时间,前端需要根据时区进行转换
- 金额字段为浮点数,建议前端使用专门的货币处理库
- 图片路径为相对路径,需要拼接完整的URL
- 分页查询建议设置合理的limit值,避免一次性查询过多数据
- 关键词搜索支持模糊匹配,会搜索订单号、动物名称、用户名
集成示例
JavaScript示例
// 申请认领动物
async function claimAnimal(animalId, claimData) {
const response = await fetch('/api/v1/animal-claims', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
animal_id: animalId,
...claimData
})
});
return await response.json();
}
// 获取我的认领申请列表
async function getMyClaimList(params = {}) {
const queryString = new URLSearchParams(params).toString();
const response = await fetch(`/api/v1/animal-claims/my?${queryString}`, {
headers: {
'Authorization': `Bearer ${token}`
}
});
return await response.json();
}
// 取消认领申请
async function cancelClaim(claimId) {
const response = await fetch(`/api/v1/animal-claims/${claimId}/cancel`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${token}`
}
});
return await response.json();
}
前端状态管理示例
// 认领申请状态管理
const claimStore = {
state: {
myClaimList: [],
currentClaim: null,
loading: false
},
mutations: {
SET_CLAIM_LIST(state, list) {
state.myClaimList = list;
},
SET_CURRENT_CLAIM(state, claim) {
state.currentClaim = claim;
},
UPDATE_CLAIM_STATUS(state, { claimId, status }) {
const claim = state.myClaimList.find(c => c.id === claimId);
if (claim) {
claim.status = status;
}
}
},
actions: {
async fetchMyClaimList({ commit }, params) {
commit('SET_LOADING', true);
try {
const result = await getMyClaimList(params);
if (result.success) {
commit('SET_CLAIM_LIST', result.data);
}
} finally {
commit('SET_LOADING', false);
}
}
}
};