# API统一接口使用示例
## 概述
为了简化API接口,我们将原来的两个计算接口合并为一个统一的 `/api/order/calculate` 接口,通过 `type` 参数区分计算模式。
## 统一的计算接口
### 接口地址
`POST /api/order/calculate`
### 参数说明
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| type | string | 是 | 计算类型:`cart`(购物车模式)或 `goods`(商品规格模式) |
| address_id | int | 是 | 收货地址ID |
| user_coupon_id | int | 否 | 优惠券ID |
| cart_ids | array | 条件必填 | 购物车ID列表(当 type=cart 时必填) |
| goods_list | array | 条件必填 | 商品列表(当 type=goods 时必填) |
## 使用示例
### 1. 商品规格模式计算
**前端请求:**
```javascript
// 立即购买场景:用户在商品详情页选择规格后点击"立即购买"
const calculateByGoods = async (goodsId, skuId, nums, addressId) => {
const response = await fetch('/api/order/calculate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'goods', // 商品规格模式
goods_list: [
{
goods_id: goodsId,
goods_sku_id: skuId,
nums: nums
}
],
address_id: addressId,
user_coupon_id: 0 // 暂不使用优惠券
})
});
const result = await response.json();
console.log('订单预览信息:', result.data);
return result.data;
};
// 调用示例
calculateByGoods(1, 5, 2, 10);
```
**后端响应:**
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"coupons": [],
"goods_list": [
{
"goods_id": 1,
"goods_sku_id": 5,
"nums": 2,
"goods": {
"id": 1,
"title": "测试商品",
"image": "/uploads/goods/1.jpg",
"price": "99.00"
},
"sku": {
"id": 5,
"price": "99.00"
},
"sku_attr": "颜色:红色,尺寸:XL"
}
],
"order_info": {
"goodsprice": "198.00",
"shippingfee": "10.00",
"discount": "0.00",
"amount": "208.00",
"saleamount": "208.00"
},
"couponTotalPrice": 198.00
}
}
```
### 2. 购物车模式计算
**前端请求:**
```javascript
// 购物车结算场景:用户在购物车页面选择商品后点击"去结算"
const calculateByCart = async (cartIds, addressId, couponId) => {
const response = await fetch('/api/order/calculate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'cart', // 购物车模式
cart_ids: cartIds,
address_id: addressId,
user_coupon_id: couponId || 0
})
});
const result = await response.json();
console.log('订单预览信息:', result.data);
return result.data;
};
// 调用示例
calculateByCart([1, 2, 3], 10, 5);
```
**后端响应:**
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"coupons": [
{
"id": 5,
"title": "满200减20",
"condition": 200,
"money": 20
}
],
"goods_list": [
{
"goods_id": 1,
"nums": 2,
"goods": {
"title": "商品A",
"price": "99.00"
}
},
{
"goods_id": 2,
"nums": 1,
"goods": {
"title": "商品B",
"price": "150.00"
}
}
],
"order_info": {
"goodsprice": "348.00",
"shippingfee": "15.00",
"discount": "20.00",
"amount": "363.00",
"saleamount": "343.00"
},
"couponTotalPrice": 348.00
}
}
```
### 3. 批量购买模式计算
**前端请求:**
```javascript
// 批量购买场景:用户选择多个商品进行批量购买
const calculateBatch = async (goodsList, addressId) => {
const response = await fetch('/api/order/calculate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'goods', // 商品规格模式
goods_list: goodsList, // 多个商品
address_id: addressId,
user_coupon_id: 0
})
});
return await response.json();
};
// 调用示例:购买3个不同商品
const batchGoods = [
{ goods_id: 1, goods_sku_id: 5, nums: 2 }, // 商品A,红色XL,2件
{ goods_id: 2, goods_sku_id: 0, nums: 1 }, // 商品B,单规格,1件
{ goods_id: 3, goods_sku_id: 8, nums: 3 } // 商品C,蓝色L,3件
];
calculateBatch(batchGoods, 10);
```
## 错误处理
### 1. 参数验证错误
```json
{
"code": 0,
"msg": "计算类型只能是cart或goods",
"data": null
}
```
### 2. 商品不存在错误
```json
{
"code": 0,
"msg": "商品已下架",
"data": null
}
```
### 3. 库存不足错误
```json
{
"code": 0,
"msg": "商品库存不足,请重新修改数量",
"data": null
}
```
### 4. 购物车为空错误
```json
{
"code": 0,
"msg": "购物车ID列表不能为空",
"data": null
}
```
## 前端集成指南
### Vue.js 组件示例
```vue
商品金额:¥{{ orderInfo.goodsprice }} 运费:¥{{ orderInfo.shippingfee }} 优惠:-¥{{ orderInfo.discount }} 应付:¥{{ orderInfo.saleamount }}
商品金额:¥{orderInfo.goodsprice}
运费:¥{orderInfo.shippingfee}
优惠:-¥{orderInfo.discount}
应付:¥{orderInfo.saleamount}