feat: 迁移sku组件

This commit is contained in:
niunai
2017-09-08 16:25:07 +08:00
parent 0c69e70a12
commit 8f4122f8ad
20 changed files with 1890 additions and 216 deletions

204
docs/examples-docs/sku.md Normal file
View File

@@ -0,0 +1,204 @@
## Sku 商品购买组件
<script>
import data from '../mock/sku';
const goods = data.goods_info;
goods.picture = goods.picture[0];
export default {
data() {
return {
showBase: false,
showCustomAction: false,
sku: data.sku,
goods: goods,
quota: data.quota,
quotaUsed: data.quota_used,
}
},
methods: {
handleBuyClicked(data) {
alert(JSON.stringify(data));
},
handleAddCartClicked(data) {
alert(JSON.stringify(data));
},
handlePointClicked() {
alert('积分兑换');
}
}
}
</script>
<style>
.sku-container {
padding: 0 15px;
}
</style>
### 使用指南
```javascript
import { Sku } from 'vant';
Vue.component(Sku.name, Sku);
```
### 代码演示
#### 基础用法
:::demo
```html
<template>
<div class="sku-container">
<van-sku
v-model="showBase"
:sku="sku"
:goods="goods"
:goods-id="goodsId"
:hide-stock="sku.hide_stock"
:show-add-cart-btn="true"
:quota="quota"
:quota-used="quotaUsed"
:reset-quantity-on-hide="true"
@buy-clicked="handleBuyClicked"
@add-cart="handleAddCartClicked"
>
</van-sku>
<van-button type="primary" @click="showBase = true" block>基础用法</van-button>
</d>
</template>
```
:::
#### 自定义部分sku子组件
:::demo
```html
<template>
<div class="sku-container">
<van-sku
v-model="showCustomAction"
:sku="sku"
:goods="goods"
:goods-id="goodsId"
:hide-stock="sku.hide_stock"
:show-add-cart-btn="true"
:quota="quota"
:quota-used="quotaUsed"
:reset-quantity-on-hide="true"
@buy-clicked="handleBuyClicked"
@add-cart="handleAddCartClicked"
>
<!-- 隐藏sku messages -->
<template slot="sku-messages"></template>
<!-- 自定义sku actions -->
<template slot="sku-actions" scope="props">
<div class="van-sku-actions">
<button class="van-sku__add-cart-btn" @click="handlePointClicked">
积分兑换
</button>
<!-- 直接触发sku内部事件通过内部事件执行handleBuyClicked回调 -->
<button class="van-sku__buy-btn" @click="props.skuEventBus.$emit('sku:buy')">
买买买
</button>
</div>
</template>
</van-sku>
<van-button type="primary" @click="showCustomAction = true" block>自定义sku actions</van-button>
</d>
</template>
```
:::
### API
| 参数 | 说明 | 类型 | 默认值 | 必须 |
|-----------|-----------|-----------|-------------|-------------|
| v-model | 是否显示sku | Boolean | false | 是 |
| sku | 商品sku数据 | Object | - | 是 |
| goods | 商品信息 | Object | - | 是 |
| goodsId | 商品id | String | - | 是 |
| hideStock | 是否显示商品剩余库存 | Boolean | false | 否 |
| showAddCartBtn | 是否显示加入购物车按钮 | Boolean | true | 否 |
| quota | 限购数(0表示不限购) | Number | 0 | 否 |
| quotaUsed | 已经购买过的数量 | Number | 0 | 否 |
| add-cart | 点击添加购物车回调 | Function(skuData: Object) | - | 否 |
| buy-clicked | 点击购买回调 | Function(skuData: Object) | - | 否 |
### 数据结构
#### sku对象结构
```javascript
"sku": {
// 所有sku规格类目与其值的从属关系比如商品有颜色和尺码两大类规格颜色下面又有红色和蓝色两个规格值。
// 可以理解为一个商品可以有多个规格类目,一个规格类目下可以有多个规格值。
"tree": [{
"k": "颜色", // skuKeyName规格类目名称
"v": [{
"id": "30349", // skuValueId规格值id
"name": "红色", // skuValueName规格值名称
"imgUrl": "upload_files\/2017\/02\/21\/FjKTOxjVgnUuPmHJRdunvYky9OHP.jpg" // 规格类目图片,暂时只能第一个规格类目可以定义图片
}, {
"id": "1215",
"name": "蓝色",
"imgUrl": "upload_files\/2017\/03\/16\/Fs_OMbSFPa183sBwvG_94llUYiLa.jpeg"
}],
"k_s": "s1" // skuKeyStrsku组合列表下方list中当前类目对应的key值value值会是从属于当前类目的一个规格值id
}, ...],
// 所有sku的组合列表比如红色、M码为一个sku组合红色、S码为另一个组合
"list": [{
"id": 2259, // skuId下单时后端需要
"price": 100, // 价格(单位分)
"s1": "1215", // 规格类目k_s为s1的对应规格值id
"s2": "1193", // 规格类目k_s为s2的对应规格值id
"s3": "0", // 最多包含3个规格值为0表示不存在该规格
"stock_num": 110 // 当前sku组合对应的库存
}, ...],
"price": "1.00", // 默认价格(单位元)后端单位暂时有点不统一
"stock_num": 227, // 商品总库存
"collection_id": 2261, // 无规格商品skuId取collection_id否则取所选sku组合对应的id
"none_sku": false, // 是否无规格商品
"messages": [{ // 商品留言
"datetime": "0", // 留言类型为time时是否含日期。“1”表示包含
"multiple": "0", // 留言类型为text时是否多行文本。“1”表示多行
"name": "留言", // 留言名称
"type": "text", // 留言类型可选id_no身份证, text, tel, date, time, email
"required": "1" // 是否必填 “1”表示必填
}, ...],
"hide_stock": false // 是否隐藏剩余库存
},
```
#### goods对象结构
```javascript
"goods": {
// 商品标题
"title": "测试商品",
// 默认商品sku缩略图
"picture": "https:\/\/img.yzcdn.cn\/upload_files\/2017\/03\/16\/Fs_OMbSFPa183sBwvG_94llUYiLa.jpeg?imageView2\/2\/w\/100\/h\/100\/q\/75\/format\/webp"
},
```
#### 添加购物车和点击购买回调函数接收的skuData对象结构
```javascript
skuData: {
// 商品id
goodsId:"946755",
// 留言信息
messages: {
message_0:"12",
message_1:"",
... // 有几个留言就有几条
},
// 选择的商品数量
selectedNum:1,
// 选择的sku组合
selectedSkuComb: {
id:2257,
price:100,
s1:"30349",
s2:"1193",
s3:"0",
stock_num:111
}
}
```

266
docs/mock/sku.js Normal file
View File

@@ -0,0 +1,266 @@
/* eslint-disable */
var _global = {
"kdt_id": 55,
"user_id": 4674509,
"offline_id": 0,
"activity_alias": "",
"sku": {
"tree": [{
"k": "\u989c\u8272",
"k_id": "1",
"v": [{
"id": "30349",
"name": "\u5929\u84dd\u8272",
"imgUrl": "upload_files\/2017\/02\/21\/FjKTOxjVgnUuPmHJRdunvYky9OHP.jpg"
}],
"k_s": "s1",
"count": 2
}, {
"k": "\u5c3a\u5bf8",
"k_id": "2",
"v": [{
"id": "1193",
"name": "1"
}, {
"id": "1194",
"name": "2"
}],
"k_s": "s2",
"count": 2
}],
"list": [{
"id": 2259,
"price": 100,
"discount": 100,
"code": "",
"s1": "1215",
"s2": "1193",
"s3": "0",
"s4": "0",
"s5": "0",
"extend": null,
"kdt_id": 55,
"discount_price": 0,
"stock_num": 110,
"stock_mode": 0,
"is_sell": null,
"combin_sku": false,
"goods_id": 946755
}, {
"id": 2260,
"price": 100,
"discount": 100,
"code": "",
"s1": "1215",
"s2": "1194",
"s3": "0",
"s4": "0",
"s5": "0",
"extend": null,
"kdt_id": 55,
"discount_price": 0,
"stock_num": 0,
"stock_mode": 0,
"is_sell": null,
"combin_sku": false,
"goods_id": 946755
}, {
"id": 2257,
"price": 100,
"discount": 100,
"code": "",
"s1": "30349",
"s2": "1193",
"s3": "0",
"s4": "0",
"s5": "0",
"extend": null,
"kdt_id": 55,
"discount_price": 0,
"stock_num": 111,
"stock_mode": 0,
"is_sell": null,
"combin_sku": false,
"goods_id": 946755
}, {
"id": 2258,
"price": 100,
"discount": 100,
"code": "",
"s1": "30349",
"s2": "1194",
"s3": "0",
"s4": "0",
"s5": "0",
"extend": null,
"kdt_id": 55,
"discount_price": 0,
"stock_num": 6,
"stock_mode": 0,
"is_sell": null,
"combin_sku": false,
"goods_id": 946755
}],
"price": "1.00",
"stock_num": 227,
"collection_id": 2261,
"collection_price": 0,
"none_sku": false,
"sold_num": 0,
"min_price": "1.00",
"max_price": "1.00",
"messages": [{
"datetime": "0",
"disable_multiple": false,
"disable": false,
"multiple": "0",
"name": "\u7559\u8a001",
"disable_required": false,
"disable_edit_name": false,
"type": "text",
"disable_delete": false,
"disable_type": false,
"required": "1"
}, {
"datetime": "0",
"disable_multiple": false,
"disable": false,
"multiple": 0,
"name": "\u7559\u8a002",
"disable_required": false,
"disable_edit_name": false,
"type": "id_no",
"disable_delete": false,
"disable_type": false,
"required": 0
}, {
"datetime": "0",
"disable_multiple": false,
"disable": false,
"multiple": 0,
"name": "\u7559\u8a003",
"disable_required": false,
"disable_edit_name": false,
"type": "image",
"disable_delete": false,
"disable_type": false,
"required": 0
}, {
"datetime": "0",
"disable_multiple": false,
"disable": false,
"multiple": 1,
"name": "\u7559\u8a004",
"disable_required": false,
"disable_edit_name": false,
"type": "text",
"disable_delete": false,
"disable_type": false,
"required": 0
}, {
"datetime": "0",
"disable_multiple": false,
"disable": false,
"name": "\u6570\u5b57",
"multiple": 0,
"disable_required": false,
"disable_edit_name": false,
"type": "tel",
"disable_delete": false,
"disable_type": false,
"required": 0
}, {
"datetime": "0",
"disable_multiple": false,
"disable": false,
"name": "\u90ae\u4ef6",
"multiple": 0,
"disable_required": false,
"disable_edit_name": false,
"type": "email",
"disable_delete": false,
"disable_type": false,
"required": 0
}, {
"datetime": "0",
"disable_multiple": false,
"disable": false,
"name": "\u65e5\u671f",
"multiple": 0,
"disable_required": false,
"disable_edit_name": false,
"type": "date",
"disable_delete": false,
"disable_type": false,
"required": 0
}, {
"datetime": "0",
"disable_multiple": false,
"disable": false,
"name": "\u65f6\u95f4\u542b\u65e5\u671f",
"multiple": 0,
"disable_required": false,
"disable_edit_name": false,
"type": "time",
"disable_delete": false,
"disable_type": false,
"required": 0
}, {
"datetime": "0",
"disable_multiple": false,
"disable": false,
"name": "\u65f6\u95f4",
"multiple": 0,
"disable_required": false,
"disable_edit_name": false,
"type": "time",
"disable_delete": false,
"disable_type": false,
"required": 0
}],
"hide_stock": false
},
"goods_id": "946755",
"alias": "2oml0r0n5vytj",
"quota": 15,
"is_virtual": "0",
"quota_used": 0,
"goods_info": {
"title": "\u725b\u5976\u6d4b\u8bd5",
"picture": ["https:\/\/img.yzcdn.cn\/upload_files\/2017\/03\/16\/Fs_OMbSFPa183sBwvG_94llUYiLa.jpeg?imageView2\/2\/w\/100\/h\/100\/q\/75\/format\/webp"],
"price": 1,
"origin": ""
},
"url": {
"base": "https:\/\/www.youzan.com",
"bbs": "http:\/\/bbs.youzan.com",
"cdn": "https:\/\/b.yzcdn.cn\/",
"cdn_static": "https:\/\/b.yzcdn.cn\/v2",
"daxue": "http:\/\/xuetang.youzan.com",
"fenxiao": "\/\/fx.youzan.com",
"fuwu": "http:\/\/fuwu.youzan.com",
"img": "http:\/\/img.youzan.com",
"imgqn": "https:\/\/img.yzcdn.cn",
"login": "http:\/\/login.youzan.com",
"open": "\/\/open.youzan.com",
"static": "\/\/static.youzan.com\/v2",
"trade": "https:\/\/trade.koudaitong.com",
"v1": "https:\/\/www.youzan.com\/v1",
"v1_static": "https:\/\/b.yzcdn.cn\/v1",
"v2": "https:\/\/www.youzan.com\/v2",
"wap": "https:\/\/h5.youzan.com\/v2",
"ws": "ws:\/\/im.youzan.com:8080",
"www": "\/\/www.youzan.com\/v2",
"youzan": "http:\/\/www.youzan.com",
"cloud": "https:\/\/dl.yzcdn.cn",
"pf": "http:\/\/pifa.youzan.com",
"uic": "\/\/uic.youzan.com",
"store": "\/\/store.youzan.com",
"market": "http:\/\/pfmarket.youzan.com",
"im": "http:\/\/b-im.youzan.com",
"help": "\/\/help.youzan.com",
"materials": "\/\/materials.youzan.com"
}
};
export default _global;

View File

@@ -201,6 +201,10 @@ module.exports = {
"path": "/goods-action",
"title": "GoodsAction 商品操作"
},
{
"path": "/sku",
"title": "Sku 商品规格弹层"
},
{
"path": "/invalid-goods",
"title": "InvalidGoods 不可用商品列表"