Skip to content

后端接口设计 - RESTful API

一、接口规范

1.1 基础信息

  • Base URL: http://localhost:7001/api
  • 认证方式: JWT Token
  • 请求格式: JSON
  • 响应格式: JSON
  • 字符编码: UTF-8

1.2 统一响应格式

json
{
  "code": 200,
  "message": "success",
  "data": {},
  "token": "新Token(仅在首次访问或Token更新时返回)"
}

状态码说明

Code说明场景
200成功请求成功
400参数错误缺少必填参数、参数格式错误
401未登录Token无效或过期
403无权限角色权限不足
404未找到资源不存在
500服务器错误服务器内部错误

1.3 Token传递方式

http
GET /api/properties
Authorization: Bearer {token}
Content-Type: application/json

1.4 分页参数

json
{
  "page": 1,
  "pageSize": 10,
  "total": 100,
  "list": []
}

二、委托单模块

2.1 发布委托(房东)

接口地址: POST /api/commissions

权限: 需登录(普通用户即可)

请求参数:

json
{
  "property_type": "residential",    // 房源类型: residential/shop/garage/other
  "community_id": 1,                 // 小区ID
  "title": "金隅和府 2室1厅 求租",
  "type": "rent",                    // 交易类型: sale/rent
  "price": 3500,                     // 期望价格(可选)
  "price_min": 3000,                 // 最低价格(可选)
  "price_max": 4000,                 // 最高价格(可选)
  "area": 67.00,                     // 面积
  "room": 2,                         // 室
  "hall": 1,                         // 厅
  "toilet": 1,                       // 卫
  "floor": 10,                       // 楼层
  "total_floor": 28,                 // 总楼层
  "orientation": "南北",             // 朝向
  "decoration": "精装修",            // 装修情况
  "is_short_term": 0,                // 是否短租
  "rent_unit": "month",              // 计价单位(短租时必填)
  "min_rent_period": 3,              // 最短租期(短租时必填)
  "images": ["url1", "url2"],        // 图片数组
  "description": "房源描述",
  "extra_fields": {                  // 动态字段(根据property_type)
    "elevator": true,
    "parking": 2
  },
  "district_ids": [1, 2]             // 商圈ID数组
}

响应:

json
{
  "code": 200,
  "message": "委托发布成功",
  "data": {
    "commission_id": 1,
    "commission_no": "WT202511010001"
  }
}

2.2 委托大厅列表(经纪人)

接口地址: GET /api/commissions

权限: 需经纪人角色

请求参数:

?page=1
&pageSize=10
&property_type=residential    // 筛选房源类型(可选)
&type=rent                    // 筛选交易类型(可选)
&is_short_term=1              // 筛选短租(可选)
&district_ids=1,2             // 筛选商圈(可选)
&sort=latest                  // 排序: latest-最新,price_asc-价格升序,price_desc-价格降序

响应:

json
{
  "code": 200,
  "data": {
    "total": 50,
    "page": 1,
    "pageSize": 10,
    "list": [
      {
        "id": 1,
        "commission_no": "WT202511010001",
        "property_type": "residential",
        "property_type_text": "住宅",
        "title": "金隅和府 2室1厅 求租",
        "type": "rent",
        "type_text": "租房",
        "price": 3500,
        "price_min": 3000,
        "price_max": 4000,
        "area": 67.00,
        "room": 2,
        "hall": 1,
        "toilet": 1,
        "is_short_term": 0,
        "images": ["url1", "url2"],
        "community": {
          "id": 1,
          "name": "金隅和府",
          "address": "青岛市北区..."
        },
        "districts": [
          {"id": 1, "name": "新都心"},
          {"id": 2, "name": "台东"}
        ],
        "landlord": {
          "id": 100,
          "nickname": "张三",
          "phone": "138****0000"    // 脱敏
        },
        "status": "pending",
        "create_time": "2025-11-01 10:00:00"
      }
    ]
  }
}

2.3 委托详情

接口地址: GET /api/commissions/:id

权限: 需经纪人角色

响应:

json
{
  "code": 200,
  "data": {
    "id": 1,
    "commission_no": "WT202511010001",
    "property_type": "residential",
    "title": "金隅和府 2室1厅 求租",
    "type": "rent",
    "price": 3500,
    "area": 67.00,
    "room": 2,
    "hall": 1,
    "toilet": 1,
    "floor": 10,
    "total_floor": 28,
    "orientation": "南北",
    "decoration": "精装修",
    "is_short_term": 0,
    "images": ["url1", "url2"],
    "description": "房源描述",
    "extra_fields": {
      "elevator": true,
      "parking": 2
    },
    "community": {...},
    "districts": [...],
    "landlord": {
      "id": 100,
      "nickname": "张三",
      "phone": "13800138000",    // 完整号码(经纪人可见)
      "avatar": "url"
    },
    "status": "pending",
    "create_time": "2025-11-01 10:00:00"
  }
}

2.4 抢单接单

接口地址: POST /api/commissions/:id/accept

权限: 需经纪人角色

请求参数: 无

响应:

json
{
  "code": 200,
  "message": "抢单成功",
  "data": {
    "commission_id": 1,
    "accept_time": "2025-11-01 11:00:00"
  }
}

错误响应:

json
{
  "code": 400,
  "message": "该委托已被其他经纪人接单"
}

2.5 我的委托列表(房东)

接口地址: GET /api/my/commissions

权限: 需登录

请求参数:

?page=1
&pageSize=10
&status=pending    // 筛选状态(可选)

响应: 同委托大厅列表

2.6 我接的委托(经纪人)

接口地址: GET /api/my/accepted-commissions

权限: 需经纪人角色

请求参数: 同上

响应: 同委托大厅列表

2.7 基于委托发布房源

接口地址: POST /api/commissions/:id/publish

权限: 需经纪人角色(且已接单)

请求参数:

json
{
  "title": "金隅和府 2室1厅 精装修",    // 可修改标题
  "price": 3500,                        // 确认价格
  "images": ["url1", "url2", "url3"],   // 补充图片
  "videos": [                           // 添加视频
    {
      "url": "/uploads/videos/xxx.mp4",
      "thumbnail": "/uploads/videos/xxx_thumb.jpg",
      "duration": 120,
      "size": 10485760
    }
  ],
  "description": "房源描述",            // 补充描述
  "extra_fields": {                     // 补充动态字段
    "elevator": true,
    "parking": 2
  },
  "district_ids": [1, 2],               // 确认商圈
  "owner_remark": "房东备注信息"        // 房东备注(前台不显示)
}

响应:

json
{
  "code": 200,
  "message": "房源发布成功",
  "data": {
    "property_id": 100,
    "property_no": "FY202511010001"
  }
}

2.8 取消委托

接口地址: PUT /api/commissions/:id/cancel

权限: 需登录(房东本人)

请求参数:

json
{
  "cancel_reason": "取消原因"
}

响应:

json
{
  "code": 200,
  "message": "委托已取消"
}

三、房源模块(扩展)

3.1 发布房源(经纪人直接发布)

接口地址: POST /api/properties

权限: 需经纪人角色

请求参数:

json
{
  "property_type": "residential",    // 房源类型
  "community_id": 1,
  "title": "金隅和府 2室1厅 精装修",
  "type": "rent",
  "price": 3500.00,
  "area": 67.00,
  "room": 2,
  "hall": 1,
  "toilet": 1,
  "floor": 10,
  "total_floor": 28,
  "orientation": "南北",
  "decoration": "精装修",
  "is_short_term": 0,
  "rent_unit": "month",
  "min_rent_period": 3,
  "images": ["url1", "url2"],
  "videos": [                        // 视频数组(最多10个)
    {
      "url": "/uploads/videos/xxx.mp4",
      "thumbnail": "/uploads/videos/xxx_thumb.jpg",
      "duration": 120,
      "size": 10485760,
      "sort": 1
    }
  ],
  "description": "房源描述",
  "extra_fields": {
    "elevator": true,
    "parking": 2
  },
  "district_ids": [1, 2]
}

响应:

json
{
  "code": 200,
  "message": "发布成功",
  "data": {
    "property_id": 100,
    "property_no": "FY202511010001"
  }
}

3.2 房源列表(增强)

接口地址: GET /api/properties

权限: 可选认证(OptionalAuth)

请求参数:

?page=1
&pageSize=10
&type=rent                    // 交易类型
&property_type=residential    // 房源类型(新增)
&is_short_term=1              // 短租筛选(新增)
&district_ids=1,2             // 商圈筛选(新增)
&community_id=1               // 小区筛选
&price_min=3000               // 价格区间
&price_max=5000
&area_min=50                  // 面积区间
&area_max=100
&room=2                       // 户型筛选
&sort=latest                  // 排序

响应:

json
{
  "code": 200,
  "data": {
    "total": 100,
    "page": 1,
    "pageSize": 10,
    "list": [
      {
        "id": 100,
        "property_no": "FY202511010001",
        "property_type": "residential",
        "property_type_text": "住宅",
        "title": "金隅和府 2室1厅 精装修",
        "type": "rent",
        "price": 3500.00,
        "area": 67.00,
        "room": 2,
        "hall": 1,
        "toilet": 1,
        "floor": 10,
        "total_floor": 28,
        "orientation": "南北",
        "decoration": "精装修",
        "is_short_term": 0,
        "rent_unit": "month",
        "thumbnail": "url",          // 缩略图
        "first_video": {             // 第一个视频(新增)
          "url": "url",
          "thumbnail": "url",
          "duration": 120
        },
        "community": {
          "id": 1,
          "name": "金隅和府",
          "address": "青岛市北区..."
        },
        "districts": [               // 商圈列表(新增)
          {"id": 1, "name": "新都心"},
          {"id": 2, "name": "台东"}
        ],
        "agent": {
          "id": 2,
          "nickname": "张三",
          "avatar": "url",
          "phone": "138****0000"     // 脱敏
        },
        "views": 100,                // 浏览量
        "status": 1,
        "create_time": "2025-11-01 10:00:00"
      }
    ]
  }
}

3.3 房源详情(增强)

接口地址: GET /api/properties/:id

权限: 可选认证

响应:

json
{
  "code": 200,
  "data": {
    "id": 100,
    "property_no": "FY202511010001",
    "property_type": "residential",
    "property_type_text": "住宅",
    "title": "金隅和府 2室1厅 精装修",
    "type": "rent",
    "price": 3500.00,
    "area": 67.00,
    "room": 2,
    "hall": 1,
    "toilet": 1,
    "floor": 10,
    "total_floor": 28,
    "orientation": "南北",
    "decoration": "精装修",
    "is_short_term": 0,
    "rent_unit": "month",
    "min_rent_period": 3,
    "images": ["url1", "url2", "url3"],
    "videos": [                      // 视频列表(新增)
      {
        "id": 1,
        "url": "/uploads/videos/xxx.mp4",
        "thumbnail": "/uploads/videos/xxx_thumb.jpg",
        "duration": 120,
        "size": 10485760,
        "sort": 1
      },
      {
        "id": 2,
        "url": "/uploads/videos/yyy.mp4",
        "thumbnail": "/uploads/videos/yyy_thumb.jpg",
        "duration": 180,
        "size": 15728640,
        "sort": 2
      }
    ],
    "description": "房源描述",
    "extra_fields": {                // 动态字段(新增)
      "elevator": true,
      "parking": 2
    },
    "community": {
      "id": 1,
      "name": "金隅和府",
      "address": "青岛市北区...",
      "lat": 36.1081,
      "lng": 120.4037,
      "build_year": "2015",
      "property_fee": "2.5元/㎡/月",
      "facilities": {                // 周边配套
        "subway": [...],
        "school": [...],
        "shopping": [...]
      }
    },
    "districts": [                   // 商圈(新增)
      {"id": 1, "name": "新都心"},
      {"id": 2, "name": "台东"}
    ],
    "agent": {
      "id": 2,
      "nickname": "张三",
      "avatar": "url",
      "phone": "13800138000",        // 完整号码
      "property_count": 15           // 在售房源数
    },
    "commission": {                  // 关联委托信息(如果有)
      "commission_no": "WT202511010001",
      "landlord_phone": "138****0000"  // 经纪人可见房东电话(脱敏)
    },
    "views": 100,
    "status": 1,
    "create_time": "2025-11-01 10:00:00"
  }
}

四、视频管理模块

4.1 上传单个视频

接口地址: POST /api/upload/video

权限: 需经纪人角色

请求格式: multipart/form-data

请求参数:

file: 视频文件

响应:

json
{
  "code": 200,
  "message": "上传成功",
  "data": {
    "url": "/uploads/videos/2025/11/xxx.mp4",
    "thumbnail": "/uploads/videos/2025/11/xxx_thumb.jpg",
    "duration": 120,
    "size": 10485760,
    "filename": "xxx.mp4"
  }
}

错误响应:

json
{
  "code": 400,
  "message": "视频大小超过50MB限制"
}

4.2 批量上传视频

接口地址: POST /api/upload/videos

权限: 需经纪人角色

请求格式: multipart/form-data

请求参数:

files[]: 视频文件数组(最多10个)

响应:

json
{
  "code": 200,
  "message": "上传成功",
  "data": {
    "success": [
      {
        "url": "/uploads/videos/2025/11/xxx.mp4",
        "thumbnail": "/uploads/videos/2025/11/xxx_thumb.jpg",
        "duration": 120,
        "size": 10485760
      }
    ],
    "failed": [
      {
        "filename": "yyy.mp4",
        "error": "视频时长超过30分钟限制"
      }
    ]
  }
}

4.3 删除视频

接口地址: DELETE /api/videos/:id

权限: 需经纪人角色(且为房源发布者)

响应:

json
{
  "code": 200,
  "message": "删除成功"
}

4.4 调整视频排序

接口地址: PUT /api/properties/:id/videos/sort

权限: 需经纪人角色(且为房源发布者)

请求参数:

json
{
  "video_ids": [2, 1, 3]    // 视频ID数组,按新顺序排列
}

响应:

json
{
  "code": 200,
  "message": "排序成功"
}

五、商圈模块

5.1 商圈列表

接口地址: GET /api/districts

权限: 无需认证

请求参数:

?status=1    // 筛选状态(可选)

响应:

json
{
  "code": 200,
  "data": [
    {
      "id": 1,
      "name": "新都心",
      "lat": 36.1081,
      "lng": 120.4037,
      "address": "青岛市市北区新都心商圈",
      "property_count": 150
    },
    {
      "id": 2,
      "name": "台东",
      "lat": 36.0858,
      "lng": 120.3964,
      "address": "青岛市市北区台东商圈",
      "property_count": 200
    }
  ]
}

5.2 搜索商圈

接口地址: GET /api/districts/search

权限: 无需认证

请求参数:

?keyword=新都心

响应: 同商圈列表

5.3 按商圈查询房源

接口地址: GET /api/districts/:id/properties

权限: 可选认证

请求参数: 同房源列表

响应: 同房源列表

六、爬虫工具模块

6.1 解析房源URL

接口地址: POST /api/crawler/parse

权限: 需经纪人角色

请求参数:

json
{
  "url": "https://qd.zu.ke.com/zufang/QD2081263756268011520.html"
}

响应:

json
{
  "code": 200,
  "message": "解析成功",
  "data": {
    "source": "beike",              // 来源: beike/anjuke
    "title": "金隅和府 2室1厅 精装修",
    "price": 3500,
    "area": 67.00,
    "room": 2,
    "hall": 1,
    "toilet": 1,
    "floor": 10,
    "total_floor": 28,
    "orientation": "南北",
    "decoration": "精装修",
    "images": [                     // 已下载到本地的图片URL
      "/uploads/images/2025/11/xxx.jpg",
      "/uploads/images/2025/11/yyy.jpg"
    ],
    "description": "房源描述",
    "community_name": "金隅和府",
    "address": "青岛市市北区..."
  }
}

错误响应:

json
{
  "code": 400,
  "message": "解析失败:无法访问该页面,可能已删除或需要登录"
}
json
{
  "code": 400,
  "message": "不支持的URL,仅支持贝壳和安居客租房链接"
}

七、电子合同模块

7.1 创建合同

接口地址: POST /api/contracts

权限: 需经纪人角色

请求参数:

json
{
  "property_id": 100,
  "tenant_id": 201,              // 租客用户ID
  "contract_type": "rent",       // rent/sale
  "template_id": 1               // 合同模板ID
}

响应:

json
{
  "code": 200,
  "message": "合同创建成功",
  "data": {
    "contract_id": 1,
    "contract_no": "HT202511010001",
    "esign_flow_id": "xxx"       // e签宝流程ID
  }
}

7.2 合同详情

接口地址: GET /api/contracts/:id

权限: 需登录(且为合同相关方)

响应:

json
{
  "code": 200,
  "data": {
    "id": 1,
    "contract_no": "HT202511010001",
    "contract_type": "rent",
    "property": {
      "id": 100,
      "title": "金隅和府 2室1厅",
      "address": "..."
    },
    "landlord": {
      "id": 100,
      "name": "张三",
      "phone": "13800138000",
      "signed": true,
      "sign_time": "2025-11-01 10:00:00"
    },
    "tenant": {
      "id": 201,
      "name": "李四",
      "phone": "13900139000",
      "signed": false,
      "sign_time": null
    },
    "agent": {
      "id": 2,
      "name": "王五",
      "phone": "13700137000",
      "signed": false,
      "sign_time": null
    },
    "status": "signing",
    "contract_content": "合同内容...",
    "contract_url": null,          // 已签署合同PDF地址(完成后)
    "create_time": "2025-11-01 09:00:00",
    "complete_time": null
  }
}

7.3 获取签署链接

接口地址: GET /api/contracts/:id/sign-url

权限: 需登录(且为合同相关方)

响应:

json
{
  "code": 200,
  "data": {
    "sign_url": "https://h5sign.esign.cn/sign?token=xxx",
    "expire_time": "2025-11-02 10:00:00"
  }
}

7.4 合同签署回调

接口地址: POST /api/contracts/callback

权限: 无需认证(e签宝回调)

请求参数:

json
{
  "flowId": "xxx",
  "signatory": "xxx",
  "signResult": "success"
}

响应:

json
{
  "code": 200,
  "message": "回调处理成功"
}

7.5 我的合同列表

接口地址: GET /api/my/contracts

权限: 需登录

请求参数:

?page=1
&pageSize=10
&status=signing    // 筛选状态(可选)
&role=tenant       // 筛选角色: landlord/tenant/agent(可选)

响应:

json
{
  "code": 200,
  "data": {
    "total": 10,
    "list": [
      {
        "id": 1,
        "contract_no": "HT202511010001",
        "contract_type": "rent",
        "property_title": "金隅和府 2室1厅",
        "my_role": "tenant",         // 我的角色
        "sign_progress": "1/3",      // 签署进度
        "status": "signing",
        "create_time": "2025-11-01 09:00:00"
      }
    ]
  }
}

7.6 下载已签署合同

接口地址: GET /api/contracts/:id/download

权限: 需登录(且为合同相关方,且合同已完成)

响应: PDF文件流

八、地图服务模块

8.1 POI搜索(小区)

接口地址: GET /api/map/poi

权限: 无需认证

请求参数:

?keyword=金隅和府
&region=青岛市北区

响应:

json
{
  "code": 200,
  "data": [
    {
      "id": "xxx",
      "title": "金隅和府",
      "address": "青岛市市北区...",
      "location": {
        "lat": 36.1081,
        "lng": 120.4037
      },
      "category": "房地产:住宅区"
    }
  ]
}

8.2 搜索商圈(腾讯地图)

接口地址: GET /api/map/districts

权限: 无需认证

请求参数:

?keyword=商圈
&region=青岛市北区

响应: 同POI搜索

8.3 周边搜索

接口地址: GET /api/map/nearby

权限: 无需认证

请求参数:

?lat=36.1081
&lng=120.4037
&keyword=地铁站
&radius=1000    // 半径(米)

响应:

json
{
  "code": 200,
  "data": [
    {
      "title": "3号线五四广场站",
      "address": "...",
      "distance": 500,
      "location": {
        "lat": 36.1085,
        "lng": 120.4042
      }
    }
  ]
}

九、管理后台接口

9.1 商圈管理

从腾讯地图同步商圈

接口地址: POST /api/admin/districts/sync-from-map

权限: 需管理员角色

请求参数: 无

响应:

json
{
  "code": 200,
  "message": "同步成功",
  "data": {
    "total": 15,              // 搜索到的商圈总数
    "imported": 12,           // 成功导入数量
    "skipped": 3              // 跳过数量(已存在)
  }
}

手动添加商圈

接口地址: POST /api/admin/districts

权限: 需管理员角色

请求参数:

json
{
  "name": "新都心",
  "address": "青岛市市北区新都心商圈",
  "lat": 36.1081,
  "lng": 120.4037,
  "source": "manual"
}

响应:

json
{
  "code": 200,
  "message": "添加成功",
  "data": {
    "district_id": 1
  }
}

9.2 委托管理

委托列表

接口地址: GET /api/admin/commissions

权限: 需管理员角色

请求参数:

?page=1
&pageSize=10
&status=pending
&property_type=residential

响应: 同委托大厅列表

9.3 视频管理

视频列表

接口地址: GET /api/admin/videos

权限: 需管理员角色

请求参数:

?page=1
&pageSize=20
&property_id=100    // 筛选房源(可选)

响应:

json
{
  "code": 200,
  "data": {
    "total": 500,
    "list": [
      {
        "id": 1,
        "url": "/uploads/videos/2025/11/xxx.mp4",
        "thumbnail": "/uploads/videos/2025/11/xxx_thumb.jpg",
        "duration": 120,
        "size": 10485760,
        "property": {
          "id": 100,
          "title": "金隅和府 2室1厅"
        },
        "agent": {
          "id": 2,
          "nickname": "张三"
        },
        "create_time": "2025-11-01 10:00:00"
      }
    ]
  }
}

删除视频

接口地址: DELETE /api/admin/videos/:id

权限: 需管理员角色

响应:

json
{
  "code": 200,
  "message": "删除成功"
}

9.4 合同模板管理

模板列表

接口地址: GET /api/admin/contract-templates

权限: 需管理员角色

响应:

json
{
  "code": 200,
  "data": [
    {
      "id": 1,
      "name": "标准租房合同",
      "type": "rent",
      "esign_template_id": "xxx",
      "status": 1,
      "is_default": 1,
      "create_time": "2025-11-01 10:00:00"
    }
  ]
}

创建模板

接口地址: POST /api/admin/contract-templates

权限: 需管理员角色

请求参数:

json
{
  "name": "标准租房合同",
  "type": "rent",
  "content": "合同内容,支持变量:{{landlord_name}}...",
  "esign_template_id": "xxx",
  "is_default": 1
}

响应:

json
{
  "code": 200,
  "message": "创建成功",
  "data": {
    "template_id": 1
  }
}

9.5 系统配置管理

获取配置

接口地址: GET /api/admin/configs

权限: 需管理员角色

请求参数:

?keys=video_max_count,video_max_size    // 多个key用逗号分隔

响应:

json
{
  "code": 200,
  "data": {
    "video_max_count": "10",
    "video_max_size": "52428800",
    "video_max_duration": "1800"
  }
}

更新配置

接口地址: PUT /api/admin/configs

权限: 需管理员角色

请求参数:

json
{
  "video_max_count": "15",
  "video_max_size": "104857600"
}

响应:

json
{
  "code": 200,
  "message": "配置更新成功"
}

9.6 爬虫日志

日志列表

接口地址: GET /api/admin/crawler-logs

权限: 需管理员角色

请求参数:

?page=1
&pageSize=20
&status=failed      // 筛选状态(可选)
&source_type=beike  // 筛选来源(可选)

响应:

json
{
  "code": 200,
  "data": {
    "total": 100,
    "list": [
      {
        "id": 1,
        "source_url": "https://qd.zu.ke.com/zufang/xxx.html",
        "source_type": "beike",
        "status": "success",
        "error_msg": null,
        "user": {
          "id": 2,
          "nickname": "张三"
        },
        "create_time": "2025-11-01 10:00:00"
      }
    ]
  }
}

文档版本:v1.0
更新日期:2025年11月3日

最后更新于:

基于 MIT 许可发布