├── docs
├── favicon.ico
├── fonts
│ ├── element-icons.535877f5.woff
│ └── element-icons.732389de.ttf
├── index.html
├── css
│ └── app.22cf5f00.css
└── js
│ └── app.889ab56d.js
├── babel.config.js
├── public
├── favicon.ico
└── index.html
├── src
├── assets
│ └── logo.png
├── main.js
├── utils
│ ├── index.js
│ ├── sku.js
│ └── README.md
├── components
│ ├── sku-select.vue
│ └── sku-table.vue
└── App.vue
├── static
├── fonts
│ ├── element-icons.732389de.ttf
│ └── element-icons.535877f5.woff
├── css
│ └── app.b9dbb8b5.css
└── js
│ ├── app.a38f66be.js
│ └── app.a38f66be.js.map
├── vue.config.js
├── .gitignore
├── index.html
├── package.json
└── README.md
/docs/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kele59/vue-sku/HEAD/docs/favicon.ico
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/app'
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kele59/vue-sku/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kele59/vue-sku/HEAD/src/assets/logo.png
--------------------------------------------------------------------------------
/docs/fonts/element-icons.535877f5.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kele59/vue-sku/HEAD/docs/fonts/element-icons.535877f5.woff
--------------------------------------------------------------------------------
/docs/fonts/element-icons.732389de.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kele59/vue-sku/HEAD/docs/fonts/element-icons.732389de.ttf
--------------------------------------------------------------------------------
/static/fonts/element-icons.732389de.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kele59/vue-sku/HEAD/static/fonts/element-icons.732389de.ttf
--------------------------------------------------------------------------------
/static/fonts/element-icons.535877f5.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kele59/vue-sku/HEAD/static/fonts/element-icons.535877f5.woff
--------------------------------------------------------------------------------
/vue.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | publicPath: './',
3 | outputDir: 'docs',
4 | assetsDir: '',
5 | productionSourceMap: false,
6 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 |
4 | # local env files
5 | .env.local
6 | .env.*.local
7 |
8 | # Log files
9 | npm-debug.log*
10 | yarn-debug.log*
11 | yarn-error.log*
12 |
13 | # Editor directories and files
14 | .idea
15 | .vscode
16 | *.suo
17 | *.ntvs*
18 | *.njsproj
19 | *.sln
20 | *.sw?
21 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 | import Egrid from 'egrid'
4 | import ElementUI from 'element-ui'
5 | import 'element-ui/lib/theme-chalk/index.css';
6 |
7 | Vue.use(ElementUI, { size: 'small' })
8 | Vue.use(Egrid)
9 |
10 | Vue.config.productionTip = false
11 |
12 | new Vue({
13 | render: h => h(App),
14 | }).$mount('#app')
15 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | vue-sku
9 |
10 |
11 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/utils/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @returns {string}
3 | */
4 | export function createUniqueString() {
5 | const timestamp = +new Date() + ''
6 | const randomNum = parseInt((1 + Math.random()) * 65536) + ''
7 | return (+(randomNum + timestamp)).toString(32)
8 | }
9 |
10 | /**
11 | * @param {Array} arr
12 | * @returns {Array}
13 | */
14 | export function uniqueArr(arr) {
15 | return Array.from(new Set(arr))
16 | }
17 |
18 | /**
19 | * @param {Array} arr1
20 | * @param {Array} arr2
21 | * @returns {Array}
22 | */
23 | export function diffArary(arr1, arr2) {
24 | arr1 = uniqueArr(arr1)
25 | arr2 = uniqueArr(arr2)
26 | return arr1.concat(arr2).filter(arg => !(arr1.includes(arg) && arr2.includes(arg)))
27 | }
28 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 | vue-sku
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 | vue-sku
--------------------------------------------------------------------------------
/static/css/app.b9dbb8b5.css:
--------------------------------------------------------------------------------
1 | .container[data-v-b9221f6a]{line-height:40px}.sku_container[data-v-ccfa908c]{margin-bottom:30px;font-size:12px;color:#666;padding:10px;border:1px solid #e5e5e5}.remove[data-v-ccfa908c]{display:none;position:absolute;z-index:2;width:18px;height:18px;font-size:14px;line-height:16px;color:#fff;text-align:center;cursor:pointer;background:rgba(0,0,0,.3);border-radius:50%}.sku_group:hover .spec_title .remove[data-v-ccfa908c]{display:block}.spec_title[data-v-ccfa908c]{position:relative;padding:7px 10px;background-color:#f8f8f8;line-height:16px;font-weight:400}.spec_title .input[data-v-ccfa908c]{width:200px}.spec_title .remove[data-v-ccfa908c]{top:12px;right:10px}.group_container[data-v-ccfa908c]{padding:10px 10px 0}.group_container .input[data-v-ccfa908c]{width:250px}.group_container .sku_item[data-v-ccfa908c]{background-color:#f8f8f8;padding:10px;display:inline-block;margin-right:10px;vertical-align:middle;text-align:center;position:relative;border-radius:2px;cursor:pointer}.group_container .sku_item:hover .remove[data-v-ccfa908c]{display:block}.group_container .sku_item .remove[data-v-ccfa908c]{top:-8px;right:-8px}.group_container .sku_item .text[data-v-ccfa908c]{display:block;width:74px;margin:0 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-sku",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "serve": "vue-cli-service serve",
7 | "build": "vue-cli-service build",
8 | "lint": "vue-cli-service lint"
9 | },
10 | "dependencies": {
11 | "core-js": "^2.6.5",
12 | "egrid": "^1.1.2",
13 | "element-ui": "^2.10.0",
14 | "vue": "^2.6.10",
15 | "vue-json-pretty": "^1.6.0"
16 | },
17 | "devDependencies": {
18 | "@vue/cli-plugin-babel": "^3.8.0",
19 | "@vue/cli-plugin-eslint": "^3.8.0",
20 | "@vue/cli-service": "^3.8.0",
21 | "babel-eslint": "^10.0.1",
22 | "eslint": "^5.16.0",
23 | "eslint-plugin-vue": "^5.0.0",
24 | "node-sass": "^4.13.1",
25 | "pug": "^2.0.4",
26 | "pug-plain-loader": "^1.0.0",
27 | "sass-loader": "^7.1.0",
28 | "vue-template-compiler": "^2.6.10"
29 | },
30 | "eslintConfig": {
31 | "root": true,
32 | "env": {
33 | "node": true
34 | },
35 | "extends": [
36 | "plugin:vue/essential",
37 | "eslint:recommended"
38 | ],
39 | "rules": {},
40 | "parserOptions": {
41 | "parser": "babel-eslint"
42 | }
43 | },
44 | "postcss": {
45 | "plugins": {
46 | "autoprefixer": {}
47 | }
48 | },
49 | "browserslist": [
50 | "> 1%",
51 | "last 2 versions"
52 | ]
53 | }
54 |
--------------------------------------------------------------------------------
/docs/css/app.22cf5f00.css:
--------------------------------------------------------------------------------
1 | .spec_title[data-v-a2116b5c]{padding:7px 10px;line-height:16px;font-weight:400}.spec_title .label[data-v-a2116b5c]{display:inline-block;width:80px}.flex[data-v-79bafbdc]{display:-webkit-box;display:-ms-flexbox;display:flex}.flex .guide_coefficient[data-v-79bafbdc]{margin-right:20px}.sku_container[data-v-42f5decf]{margin-bottom:30px;font-size:12px;color:#666;padding:10px;border:1px solid #e5e5e5}.remove[data-v-42f5decf]{display:none;position:absolute;z-index:2;width:18px;height:18px;font-size:14px;line-height:16px;color:#fff;text-align:center;cursor:pointer;background:rgba(0,0,0,.3);border-radius:50%}.sku_group[data-v-42f5decf]{margin-bottom:10px}.sku_group:hover .spec_title .remove[data-v-42f5decf]{display:block}.spec_title[data-v-42f5decf]{position:relative;padding:7px 10px;background-color:#f8f8f8;line-height:16px;font-weight:400}.spec_title .input[data-v-42f5decf]{width:200px}.spec_title .remove[data-v-42f5decf]{top:12px;right:10px}.group_container[data-v-42f5decf]{padding:10px 10px 0}.group_container .input[data-v-42f5decf]{width:250px}.group_container .sku_item[data-v-42f5decf]{background-color:#f8f8f8;padding:10px;display:inline-block;margin-right:10px;vertical-align:middle;text-align:center;position:relative;border-radius:2px;cursor:pointer}.group_container .sku_item:hover .remove[data-v-42f5decf]{display:block}.group_container .sku_item .remove[data-v-42f5decf]{top:-8px;right:-8px}.group_container .sku_item .text[data-v-42f5decf]{display:block;width:74px;margin:0 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
--------------------------------------------------------------------------------
/src/components/sku-select.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 | .container
14 | .spec_title(v-for="(spec, index) in skusData" :key="spec.id + '_id'")
15 | span.label {{spec.value}}:
16 | el-button(
17 | v-for="option in spec.leaf"
18 | :key="option.id"
19 | @click="selectSku(index, option)"
20 | :type="activeSku[index].option.id === option.id ? 'primary' : ''"
21 | ) {{option.value}}
22 |
23 | //- .spec_title(v-for="(sku, index) in activeSku" :key="index") {{sku.spec.value}}:{{sku.option.value}}
24 |
25 |
26 |
62 |
--------------------------------------------------------------------------------
/src/utils/sku.js:
--------------------------------------------------------------------------------
1 | // 源自 https://github.com/zent-contrib/sku/blob/master/src/utils/index.js
2 |
3 | // 计算每个sku后面有多少项
4 | export function getLevels(tree) {
5 | let level = []
6 | for (let i = tree.length - 1; i >= 0; i--) {
7 | if (tree[i + 1] && tree[i + 1].leaf) {
8 | level[i] = tree[i + 1].leaf.length * level[i + 1] || 1
9 | } else {
10 | level[i] = 1
11 | }
12 | }
13 | return level
14 | }
15 |
16 | /**
17 | * 笛卡尔积运算
18 | * @param {[type]} tree [description]
19 | * @param {Array} stocks [description]
20 | * @return {[type]} [description]
21 | */
22 | export function flatten(tree, stocks = [], options) {
23 | let { optionValue = 'id', optionText = 'value' } = options || {}
24 | let result = []
25 | let skuLen = 0
26 | let stockMap = {} // 记录已存在的stock的数据
27 | const level = getLevels(tree)
28 | if (tree.length === 0) return result
29 | tree.forEach(sku => {
30 | const { leaf } = sku
31 | if (!leaf || leaf.length === 0) return true
32 | skuLen = (skuLen || 1) * leaf.length
33 | })
34 | // 根据已有的stocks生成一个map
35 | stocks.forEach(stock => {
36 | let { skus, ...attr } = stock
37 | stockMap[skus.map(item => `${item.k_id}_${item.v_id}`).join('|')] = attr
38 | })
39 | for (let i = 0; i < skuLen; i++) {
40 | let skus = []
41 | let mapKey = []
42 | tree.forEach((sku, column) => {
43 | const { leaf } = sku
44 | let item = {}
45 | if (!leaf || leaf.length === 0) return true
46 | if (leaf.length > 1) {
47 | let row = parseInt(i / level[column], 10) % leaf.length
48 | item = tree[column].leaf[row]
49 | } else {
50 | item = tree[column].leaf[0]
51 | }
52 | if (!sku[optionValue] || !item[optionValue]) return
53 | mapKey.push(`${sku[optionValue]}_${item[optionValue]}`)
54 | skus.push({
55 | k_id: sku[optionValue],
56 | k: sku[optionText],
57 | v_id: item[optionValue],
58 | v: item[optionText],
59 | })
60 | })
61 | let { ...data } = stockMap[mapKey.join('|')] || {}
62 | // 从map中找出存在的sku并保留其值
63 | result.push({ ...data, skus })
64 | }
65 | return result
66 | }
67 |
68 | /**
69 | * 判断两个sku是否相同
70 | * @param {[type]} prevSKU [description]
71 | * @param {[type]} nextSKU [description]
72 | * @return {Boolean} [description]
73 | */
74 | export function isEqual(prevSKU, nextSKU, options) {
75 | let { optionValue = 'id' } = options || {}
76 | return (
77 | nextSKU.length === prevSKU.length &&
78 | nextSKU.every(({ leaf = [] }, index) => {
79 | let prevLeaf = prevSKU[index].leaf || []
80 | return (
81 | prevSKU[index][optionValue] === nextSKU[index][optionValue] &&
82 | leaf.length === prevLeaf.length &&
83 | leaf.map(item => item[optionValue]).join(',') ===
84 | prevLeaf.map(item => item[optionValue]).join(',')
85 | )
86 | })
87 | )
88 | }
89 |
--------------------------------------------------------------------------------
/src/utils/README.md:
--------------------------------------------------------------------------------
1 | ## Flatten
2 | #### SKU.flatten(sku, items, options)
3 | 通过计算笛卡尔积,将树形的value变成扁平的数组
4 |
5 | | 参数 | 说明 | 类型 | 默认值 | 备选值 |
6 | |------|------|------|--------|--------|
7 | | sku | 当前选中规格的value | array | `[]` | |
8 | | items | 当前已存在的数据 | array | `[]` | |
9 | | options | 可配置参数 | object | `{}` | `optionValue: 'id', optionText: 'value'` |
10 |
11 | ```javascript
12 | import { SKU } from 'zent'
13 |
14 | const { flatten } = SKU
15 |
16 | let skus = [
17 | { id: 1, value: '颜色', leaf: [{id: 11, value: '红色'}, {id: 12, value: '蓝色'}] },
18 | { id: 2, value: '尺寸', leaf: [{id: 21, value: '大'}, {id: 22, value: '小'}] }
19 | ]
20 |
21 | console.log(flatten(skus))
22 | /**
23 | * output:
24 | * [
25 | * {"skus":[{"k_id":1,"k":"颜色","v_id":11,"v":"红色"},{"k_id":2,"k":"尺寸","v_id":21,"v":"大"}]},
26 | * {"skus":[{"k_id":1,"k":"颜色","v_id":11,"v":"红色"},{"k_id":2,"k":"尺寸","v_id":22,"v":"小"}]}
27 | * {"skus":[{"k_id":1,"k":"颜色","v_id":12,"v":"蓝色"},{"k_id":2,"k":"尺寸","v_id":21,"v":"大"}]}
28 | * {"skus":[{"k_id":1,"k":"颜色","v_id":12,"v":"蓝色"},{"k_id":2,"k":"尺寸","v_id":22,"v":"小"}]}
29 | * ]
30 | */
31 |
32 | // 为某个 SKU 添加额外字段,例如标价、成本、工厂指导价等
33 | let items = [
34 | {
35 | "price": "10.00",
36 | "code": "AE86",
37 | "skus":[{"k_id":1,"k":"颜色","v_id":11,"v":"红色"},{"k_id":2,"k":"尺寸","v_id":22,"v":"小"}]
38 | }
39 | ]
40 | console.log(flatten(skus, items))
41 |
42 | /**
43 | * output:
44 | * [
45 | * {"skus":[{"k_id":1,"k":"颜色","v_id":11,"v":"红色"},{"k_id":2,"k":"尺寸","v_id":21,"v":"大"}]},
46 | * {
47 | * "price":"10.00",
48 | * "code":"AE86",
49 | * "skus":[{"k_id":1,"k":"颜色","v_id":11,"v":"红色"},{"k_id":2,"k":"尺寸","v_id":22,"v":"小"}]
50 | * },
51 | * {"skus":[{"k_id":1,"k":"颜色","v_id":12,"v":"蓝色"},{"k_id":2,"k":"尺寸","v_id":21,"v":"大"}]}
52 | * {"skus":[{"k_id":1,"k":"颜色","v_id":12,"v":"蓝色"},{"k_id":2,"k":"尺寸","v_id":22,"v":"小"}]}
53 | * ]
54 | */
55 | ```
56 |
57 | ## isSame
58 | ```javascript
59 | import { SKU } from 'zent'
60 |
61 | const { isSame } = SKU
62 |
63 | let skuA = [
64 | { id: 1, value: '颜色', leaf: [{id: 11, value: '红色'}, {id: 12, value: '蓝色'}] },
65 | { id: 2, value: '尺寸', leaf: [{id: 21, value: '大'}, {id: 22, value: '小'}] }
66 | ]
67 |
68 | let skuB = [
69 | { id: 1, value: '颜色', leaf: [{id: 11, value: '红色'}, {id: 12, value: '蓝色'}] },
70 | { id: 2, value: '尺寸', leaf: [{id: 21, value: '大'}, {id: 22, value: '小'}] }
71 | ]
72 |
73 | let skuC = [
74 | { id: 1, value: '颜色', leaf: [{id: 11, value: '红色'}, {id: 12, value: '蓝色'}] },
75 | { id: 2, value: '尺寸', leaf: [{id: 22, value: '小'}, {id: 21, value: '大'}] }
76 | ]
77 |
78 | let skuD = [
79 | { id: 1, value: '颜色', leaf: [{id: 11, value: '红色'}, {id: 12, value: '蓝色'}] },
80 | { id: 3, value: '尺寸', leaf: [{id: 21, value: '大'}, {id: 22, value: '小'}] }
81 | ]
82 |
83 | console.log(isSame(skuA, skuB))
84 | console.log(isSame(skuA, skuC))
85 | console.log(isSame(skuA, skuD))
86 |
87 | /**
88 | * output:
89 | *
90 | * true
91 | * false
92 | * false
93 | */
94 | ```
95 |
96 | ## Flatten、isSame 如何在 Python 里使用
97 | 1. 打开[源代码](https://gitee.com/zaxlct/number-squares/blob/dev/src/utils/sku/index.js)
98 | 2. 源代码有三个函数 `getLevels flatten isEqual`,依次复制三个函数到 [ES6 转 ES5 网站](https://www.babeljs.cn/repl)(相当于 python3 转 python2)
99 | 3. 注意,每个函数前的 `export` 语句要删除。即 `export function` => `function`
100 | 4. 使用 [Jiphy](https://github.com/timothycrosley/jiphy) 把生成的 ES5 JS 代码转为 python
101 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vue-sku
2 |
3 | - 用 element-ui 实现了 zent 的 SKU 规格选择器组件
4 | - 后台编辑 SKU
5 | - 为每一种 SKU 设置额外的属性,如价格、库存等
6 | - 前端展示并选择 SKU
7 |
8 | ## 2019-11-03 更新内容
9 |
10 | - **[async 分支](https://github.com/zaxlct/vue-sku/tree/async),实现了从模拟请求后端 mock 数据,到获取当前的 sku 参数传递给后端的完整 demo**
11 | - 删除了合并单元格功能
12 |
13 | ## [在线 DEMO](https://zaxlct.github.io/vue-sku/)(master 分支)
14 |
15 | 注意:本项目只提供 DEMO 提供参考,并未打包成 npm package
16 | 
17 |
18 | ## 参考实现
19 |
20 | - [zent-sku](https://github.com/zent-contrib/sku)
21 | - [rossroma/vue-sku](https://github.com/rossroma/vue-sku)
22 |
23 | ## 文档
24 |
25 | > Flatten、isSame 直接引用了 zent sku [官方文档](https://youzan.github.io/zent/zh/component/sku)
26 |
27 | #### Flatten
28 |
29 | `SKU.flatten(sku, items, options)`
30 | 通过计算笛卡尔积,将树形的 value 变成扁平的数组
31 |
32 | | 参数 | 说明 | 类型 | 默认值 | 备选值 |
33 | | ------- | -------------------- | ------ | ------ | ---------------------------------------- |
34 | | sku | 当前选中规格的 value | array | `[]` | |
35 | | items | 当前已存在的数据 | array | `[]` | |
36 | | options | 可配置参数 | object | `{}` | `optionValue: 'id', optionText: 'value'` |
37 |
38 | ```javascript
39 | import { flatten } from "src/utils/sku";
40 |
41 | let skus = [
42 | {
43 | id: 1,
44 | value: "颜色",
45 | leaf: [{ id: 11, value: "红色" }, { id: 12, value: "蓝色" }]
46 | },
47 | {
48 | id: 2,
49 | value: "尺寸",
50 | leaf: [{ id: 21, value: "大" }, { id: 22, value: "小" }]
51 | }
52 | ];
53 |
54 | console.log(flatten(skus));
55 | /**
56 | * output:
57 | * [
58 | * {"skus":[{"k_id":1,"k":"颜色","v_id":11,"v":"红色"},{"k_id":2,"k":"尺寸","v_id":21,"v":"大"}]},
59 | * {"skus":[{"k_id":1,"k":"颜色","v_id":11,"v":"红色"},{"k_id":2,"k":"尺寸","v_id":22,"v":"小"}]}
60 | * {"skus":[{"k_id":1,"k":"颜色","v_id":12,"v":"蓝色"},{"k_id":2,"k":"尺寸","v_id":21,"v":"大"}]}
61 | * {"skus":[{"k_id":1,"k":"颜色","v_id":12,"v":"蓝色"},{"k_id":2,"k":"尺寸","v_id":22,"v":"小"}]}
62 | * ]
63 | */
64 |
65 | // 为某个 SKU 添加额外字段,例如标价、成本、工厂指导价等
66 | let items = [
67 | {
68 | price: "10.00",
69 | code: "AE86",
70 | skus: [
71 | { k_id: 1, k: "颜色", v_id: 11, v: "红色" },
72 | { k_id: 2, k: "尺寸", v_id: 22, v: "小" }
73 | ]
74 | }
75 | ];
76 | console.log(flatten(skus, items));
77 |
78 | /**
79 | * output:
80 | * [
81 | * {"skus":[{"k_id":1,"k":"颜色","v_id":11,"v":"红色"},{"k_id":2,"k":"尺寸","v_id":21,"v":"大"}]},
82 | * {
83 | * "price":"10.00",
84 | * "code":"AE86",
85 | * "skus":[{"k_id":1,"k":"颜色","v_id":11,"v":"红色"},{"k_id":2,"k":"尺寸","v_id":22,"v":"小"}]
86 | * },
87 | * {"skus":[{"k_id":1,"k":"颜色","v_id":12,"v":"蓝色"},{"k_id":2,"k":"尺寸","v_id":21,"v":"大"}]}
88 | * {"skus":[{"k_id":1,"k":"颜色","v_id":12,"v":"蓝色"},{"k_id":2,"k":"尺寸","v_id":22,"v":"小"}]}
89 | * ]
90 | */
91 | ```
92 |
93 | #### isSame
94 |
95 | ```javascript
96 | import { isSame } from "src/utils/sku";
97 |
98 | let skuA = [
99 | {
100 | id: 1,
101 | value: "颜色",
102 | leaf: [{ id: 11, value: "红色" }, { id: 12, value: "蓝色" }]
103 | },
104 | {
105 | id: 2,
106 | value: "尺寸",
107 | leaf: [{ id: 21, value: "大" }, { id: 22, value: "小" }]
108 | }
109 | ];
110 |
111 | let skuB = [
112 | {
113 | id: 1,
114 | value: "颜色",
115 | leaf: [{ id: 11, value: "红色" }, { id: 12, value: "蓝色" }]
116 | },
117 | {
118 | id: 2,
119 | value: "尺寸",
120 | leaf: [{ id: 21, value: "大" }, { id: 22, value: "小" }]
121 | }
122 | ];
123 |
124 | let skuC = [
125 | {
126 | id: 1,
127 | value: "颜色",
128 | leaf: [{ id: 11, value: "红色" }, { id: 12, value: "蓝色" }]
129 | },
130 | {
131 | id: 2,
132 | value: "尺寸",
133 | leaf: [{ id: 22, value: "小" }, { id: 21, value: "大" }]
134 | }
135 | ];
136 |
137 | let skuD = [
138 | {
139 | id: 1,
140 | value: "颜色",
141 | leaf: [{ id: 11, value: "红色" }, { id: 12, value: "蓝色" }]
142 | },
143 | {
144 | id: 3,
145 | value: "尺寸",
146 | leaf: [{ id: 21, value: "大" }, { id: 22, value: "小" }]
147 | }
148 | ];
149 |
150 | console.log(isSame(skuA, skuB));
151 | console.log(isSame(skuA, skuC));
152 | console.log(isSame(skuA, skuD));
153 |
154 | /**
155 | * output:
156 | *
157 | * true
158 | * false
159 | * false
160 | */
161 | ```
162 |
163 | #### Flatten、isSame 函数如何在 Python 里使用
164 |
165 | 1. 打开[源代码](https://gitee.com/zaxlct/number-squares/blob/dev/src/utils/sku/index.js)
166 | 2. 源代码有三个函数 `getLevels flatten isEqual`,依次复制三个函数到 [ES6 转 ES5 网站](https://www.babeljs.cn/repl)(相当于 python3 转 python2)
167 | 3. 注意,每个函数前的 `export` 语句要删除。即 `export function` => `function`
168 | 4. 使用 [Jiphy](https://github.com/timothycrosley/jiphy) 把生成的 ES5 JS 代码转为 python
169 |
170 | ## 感谢第三方库
171 |
172 | - [element-ui](https://github.com/ElemeFE/element)
173 | - [zent](https://github.com/youzan/zent)
174 | - [egrid](https://github.com/kinglisky/egrid)
175 | - [vue-json-pretty](https://github.com/leezng/vue-json-pretty)
176 |
177 | ## 本地预览项目
178 |
179 | ```bash
180 | git clone https://github.com/zaxlct/vue-sku
181 | npm install
182 | npm run serve
183 | ```
184 |
185 | ## TODO
186 |
187 | - 库存为零时,选择 sku 的按钮 disabled
188 |
189 | ## 提问
190 |
191 | - 有问题可发起 issues,或加 QQ 群: 163801325
192 | - 有想法亦可发起 PR
193 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
77 |
78 |
79 | #app
80 | .sku_container
81 | .sku_group.mb10(v-for="(spec, index) in specification" :key="spec.id")
82 | .spec_title
83 | span.label 规格名:
84 | el-input.input(placeholder='请输入规格名' v-model.trim="spec.value")
85 | span.remove(@click="delSepc(index)") ×
86 |
87 | .group_container
88 | span.label 规格值:
89 | el-popover(
90 | placement="bottom"
91 | width="120"
92 | trigger="click"
93 | v-for="(option, option_index) in spec.leaf" :key="option_index"
94 | )
95 | el-input(v-model.trim="option.value" style="width: 110px;")
96 | .sku_item(slot="reference")
97 | span.remove(@click.stop="delOption(index, option_index)") ×
98 | .text {{option.value}}
99 |
100 | el-input.input(
101 | suffix-icon="el-icon-plus"
102 | v-model="addValues[index]"
103 | placeholder="多个产品属性以空格隔开"
104 | @keyup.native.enter='addOption(index)'
105 | @blur='addOption(index)'
106 | )
107 | .spec_title
108 | el-button(type='info' :disabled='disabled' @click='addSpec') 添加规格项目
109 |
110 | .sku_container
111 | SkuSelect(:skusData="specificationFilter")
112 |
113 | .sku_container
114 | SkuTable(:skusData="specificationFilter")
115 | vue-json-pretty(:data="specificationFilter")
116 |
117 |
118 |
217 |
--------------------------------------------------------------------------------
/src/components/sku-table.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 | .container
11 | .flex
12 | el-form.guide_coefficient(:inline="true" :model="coefficient")
13 | el-form-item(label="指导价倍数" prop="guide_coefficient")
14 | el-input-number(
15 | :step="0.1"
16 | :min="1"
17 | :precision="2"
18 | v-model="coefficient.guide_coefficient"
19 | )
20 | el-form-item
21 | el-button(type="primary" @click="setGuideCoefficient") 批量设置指导价倍数
22 |
23 | el-form(:inline="true" :model="coefficient")
24 | el-form-item(label="标价倍数" prop="purchase_coefficient")
25 | el-input-number(
26 | :step="0.1"
27 | :min="1"
28 | :precision="2"
29 | v-model="coefficient.purchase_coefficient"
30 | )
31 | el-form-item
32 | el-button(type="primary" @click="setPurchaseCoefficient") 批量设置标价倍数
33 |
34 | //- egrid 是 el-table 的封装
35 | egrid(
36 | border
37 | max-height="800"
38 | v-bind="$attrs"
39 | v-on="$listeners"
40 | :data="data"
41 | :columns="columns"
42 | :columns-props="columnsProps"
43 | )
44 |
45 |
46 |
288 |
--------------------------------------------------------------------------------
/docs/js/app.889ab56d.js:
--------------------------------------------------------------------------------
1 | (function(t){function e(e){for(var i,c,u=e[0],s=e[1],o=e[2],f=0,d=[];f=0;n--)t[n+1]&&t[n+1].leaf?e[n]=t[n+1].leaf.length*e[n+1]||1:e[n]=1;return e}function y(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0,i=n||{},a=i.optionValue,r=void 0===a?"id":a,c=i.optionText,u=void 0===c?"value":c,s=[],o=0,l={},f=g(t);if(0===t.length)return s;t.forEach(function(t){var e=t.leaf;if(!e||0===e.length)return!0;o=(o||1)*e.length}),e.forEach(function(t){var e=t.skus,n=Object(k["a"])(t,["skus"]);l[e.map(function(t){return"".concat(t.k_id,"_").concat(t.v_id)}).join("|")]=n});for(var d=function(e){var n=[],i=[];t.forEach(function(a,c){var s=a.leaf,o={};if(!s||0===s.length)return!0;if(s.length>1){var l=parseInt(e/f[c],10)%s.length;o=t[c].leaf[l]}else o=t[c].leaf[0];a[r]&&o[r]&&(i.push("".concat(a[r],"_").concat(o[r])),n.push({k_id:a[r],k:a[u],v_id:o[r],v:o[u]}))});var a=l[i.join("|")]||{},c=Object.assign({},a);s.push(Object(b["a"])({},c,{skus:n}))},p=0;pe.length){var a=[];t.forEach(function(t){var e=n.data.find(function(e){return e.ids===t.ids});e?a.push(e):a.push(Object(b["a"])({},t,{format:"",guide_price:void 0,purchase_price:void 0,sell_price:void 0}))}),this.data=a}else this.data=this.data.filter(function(t){return!i.includes(t.ids)})}}},data:function(){return{data:[],coefficient:{purchase_coefficient:0,guide_coefficient:1.2},columnsProps:{align:"center",minWidth:100}}},methods:{diffIds:function(t,e){return t=t.map(function(t){return t.ids}),e=e.map(function(t){return t.ids}),S(t,e)},initData:function(t){this.data=t.map(function(t){return Object(b["a"])({},t,{format:"",guide_price:100,purchase_price:void 0,sell_price:void 0})})},setGuideCoefficient:function(){var t=this.coefficient.guide_coefficient;this.data=this.data.map(function(e){return Object(b["a"])({},e,{purchase_price:(e.guide_price||0)*t})})},setPurchaseCoefficient:function(){var t=this.coefficient.purchase_coefficient;this.data=this.data.map(function(e){return Object(b["a"])({},e,{sell_price:(e.purchase_price||0)*t})})}}},C=x,j=(n("902d"),Object(p["a"])(C,m,_,!1,null,"79bafbdc",null)),E=j.exports,$={components:{VueJsonPretty:s.a,SkuSelect:h,SkuTable:E},data:function(){return{addValues:[],specification:[{id:1,value:"颜色",leaf:[{id:11,value:"白色"},{id:12,value:"黑色"},{id:13,value:"金色"}]},{id:2,value:"内存",leaf:[{id:21,value:"128G"},{id:22,value:"256G"},{id:23,value:"512G"}]}]}},computed:{disabled:function(){return this.specification.length>3||this.specification.some(function(t){return!t.value})},specificationFilter:function(){return this.specification.filter(function(t){return t.value&&t.leaf.length})}},methods:{addSpec:function(){this.specification.push({id:w()+"_id",value:"",leaf:[]})},delSepc:function(t){this.specification.splice(t,1)},addOption:function(t){var e=this.addValues[t]||"";if(e=e.trim(),e){var n=this.specification[t].leaf,i=e.split(/\s+/).filter(function(t){return!n.some(function(e){return e.value===t})}).map(function(t){return{id:w()+"_id",value:t}});this.specification[t].leaf=O([].concat(Object(c["a"])(n),Object(c["a"])(i))),this.$set(this.addValues,t,"")}},delOption:function(t,e){this.specification[t].leaf.splice(e,1)}}},D=$,P=(n("baa2"),Object(p["a"])(D,a,r,!1,null,"42f5decf",null)),I=P.exports,V=n("f05a"),T=n.n(V),G=n("5c96"),M=n.n(G);n("0fae");i["default"].use(M.a,{size:"small"}),i["default"].use(T.a),i["default"].config.productionTip=!1,new i["default"]({render:function(t){return t(I)}}).$mount("#app")},5854:function(t,e,n){},"6f86":function(t,e,n){},7537:function(t,e,n){"use strict";var i=n("9409"),a=n.n(i);a.a},"902d":function(t,e,n){"use strict";var i=n("6f86"),a=n.n(i);a.a},9409:function(t,e,n){},baa2:function(t,e,n){"use strict";var i=n("5854"),a=n.n(i);a.a}});
--------------------------------------------------------------------------------
/static/js/app.a38f66be.js:
--------------------------------------------------------------------------------
1 | (function(t){function e(e){for(var i,s,c=e[0],u=e[1],o=e[2],f=0,p=[];fi?i+"-"+n:n}return"-"},stock:function(){var t=this.skus[this.selPath];return t&&t.stock||"-"},skus:function(){for(var t=this,e={},n=function(t,n){e[t]?(e[t].stock+=n.stock,e[t].prices.push(n.price)):e[t]={stock:n.stock,prices:[n.price]}},i=function(e,i,r){var a=e.length;e.forEach(function(s,c){for(var u=c+1;u0&&f0}}}),p=f,d=(n("265b"),n("2877")),h=Object(d["a"])(p,o,l,!1,null,"b9221f6a",null),v=h.exports,m=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"container"},[n("el-form",{attrs:{inline:!0,model:t.coefficient}},[n("el-form-item",{attrs:{label:"指导价倍数",prop:"guide_coefficient"}},[n("el-input-number",{attrs:{step:.1,min:1,precision:2},model:{value:t.coefficient.guide_coefficient,callback:function(e){t.$set(t.coefficient,"guide_coefficient",e)},expression:"coefficient.guide_coefficient"}})],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:t.setGuideCoefficient}},[t._v("批量设置指导价倍数")])],1)],1),n("el-form",{attrs:{inline:!0,model:t.coefficient}},[n("el-form-item",{attrs:{label:"标价倍数",prop:"purchase_coefficient"}},[n("el-input-number",{attrs:{step:.1,min:1,precision:2},model:{value:t.coefficient.purchase_coefficient,callback:function(e){t.$set(t.coefficient,"purchase_coefficient",e)},expression:"coefficient.purchase_coefficient"}})],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:t.setPurchaseCoefficient}},[t._v("批量设置标价倍数")])],1)],1),n("egrid",t._g(t._b({attrs:{border:"","max-height":"800",data:t.data,columns:t.columns,"columns-props":t.columnsProps,"span-method":t.objectSpanMethod}},"egrid",t.$attrs,!1),t.$listeners))],1)},_=[],k=(n("7514"),n("cebc")),b=n("a8db");function g(t){for(var e=[],n=t.length-1;n>=0;n--)t[n+1]&&t[n+1].leaf?e[n]=t[n+1].leaf.length*e[n+1]||1:e[n]=1;return e}function y(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0,i=n||{},r=i.optionValue,a=void 0===r?"id":r,s=i.optionText,c=void 0===s?"value":s,u=[],o=0,l={},f=g(t);if(0===t.length)return u;t.forEach(function(t){var e=t.leaf;if(!e||0===e.length)return!0;o=(o||1)*e.length}),e.forEach(function(t){var e=t.skus,n=Object(b["a"])(t,["skus"]);l[e.map(function(t){return"".concat(t.k_id,"_").concat(t.v_id)}).join("|")]=n});for(var p=function(e){var n=[],i=[];t.forEach(function(r,s){var u=r.leaf,o={};if(!u||0===u.length)return!0;if(u.length>1){var l=parseInt(e/f[s],10)%u.length;o=t[s].leaf[l]}else o=t[s].leaf[0];r[a]&&o[a]&&(i.push("".concat(r[a],"_").concat(o[a])),n.push({k_id:r[a],k:r[c],v_id:o[a],v:o[c]}))});var r=l[i.join("|")]||{},s=Object.assign({},r);u.push(Object(k["a"])({},s,{skus:n}))},d=0;de.length){var r=[];t.forEach(function(t){var e=n.data.find(function(e){return e.ids===t.ids});e?r.push(e):r.push(Object(k["a"])({},t,{format:"",guide_price:void 0,purchase_price:void 0,sell_price:void 0}))}),this.data=r}else this.data=this.data.filter(function(t){return!i.includes(t.ids)})}}},data:function(){return{data:[],coefficient:{purchase_coefficient:0,guide_coefficient:0},columnsProps:{align:"center",minWidth:100}}},methods:{diffIds:function(t,e){return t=t.map(function(t){return t.ids}),e=e.map(function(t){return t.ids}),j(t,e)},initData:function(t){this.data=t.map(function(t){return Object(k["a"])({},t,{format:"",guide_price:void 0,purchase_price:void 0,sell_price:void 0})})},objectSpanMethod:function(t){var e=t.row,n=(t.column,t.rowIndex),i=t.columnIndex;if(e.skus.length>1&&0===i||e.skus.length>2&&1===i)return n%2===0?{rowspan:2,colspan:1}:{rowspan:0,colspan:0}},setGuideCoefficient:function(){var t=this.coefficient.guide_coefficient;this.data=this.data.map(function(e){return Object(k["a"])({},e,{purchase_price:(e.guide_price||0)*t})})},setPurchaseCoefficient:function(){var t=this.coefficient.purchase_coefficient;this.data=this.data.map(function(e){return Object(k["a"])({},e,{sell_price:(e.purchase_price||0)*t})})}}},C=x,P=Object(d["a"])(C,m,_,!1,null,null,null),S=P.exports,E={components:{VueJsonPretty:u.a,SkuSelect:v,SkuTable:S},data:function(){return{addValues:[],specification:[{id:1,value:"颜色",leaf:[{id:11,value:"白色"},{id:12,value:"黑色"},{id:13,value:"金色"}]},{id:2,value:"内存",leaf:[{id:21,value:"128G"},{id:22,value:"256G"},{id:23,value:"512G"}]},{id:3,value:"运营商",leaf:[{id:31,value:"移动"},{id:32,value:"联通"},{id:33,value:"电信"},{id:34,value:"全网通"}]}]}},computed:{disabled:function(){return this.specification.length>3||this.specification.some(function(t){return!t.value})}},methods:{addSpec:function(){this.specification.push({id:w()+"_id",value:"",leaf:[]})},delSepc:function(t){this.specification.splice(t,1)},addOption:function(t){var e=this.addValues[t]||"";if(e=e.trim(),e){var n=this.specification[t].leaf,i=e.split(/\s+/).filter(function(t){return!n.some(function(e){return e.value===t})}).map(function(t){return{id:w()+"_id",value:t}});this.specification[t].leaf=[].concat(Object(s["a"])(n),Object(s["a"])(i)),this.$set(this.addValues,t,"")}},delOption:function(t,e){this.specification[t].leaf.splice(e,1)}}},I=E,$=(n("ff7a"),Object(d["a"])(I,r,a,!1,null,"ccfa908c",null)),D=$.exports,M=n("f05a"),V=n.n(M),T=n("5c96"),G=n.n(T);n("0fae");i["default"].use(G.a,{size:"small"}),i["default"].use(V.a),i["default"].config.productionTip=!1,new i["default"]({render:function(t){return t(D)}}).$mount("#app")},"64af":function(t,e,n){},ff7a:function(t,e,n){"use strict";var i=n("64af"),r=n.n(i);r.a}});
2 | //# sourceMappingURL=app.a38f66be.js.map
--------------------------------------------------------------------------------
/static/js/app.a38f66be.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/sku-select.vue?eddd","webpack:///./src/App.vue?382d","webpack:///./src/components/sku-select.vue?d6bd","webpack:///src/components/sku-select.vue","webpack:///./src/components/sku-select.vue?2cd2","webpack:///./src/components/sku-select.vue","webpack:///./src/components/sku-table.vue?b255","webpack:///./src/utils/sku.js","webpack:///./src/utils/index.js","webpack:///src/components/sku-table.vue","webpack:///./src/components/sku-table.vue?8258","webpack:///./src/components/sku-table.vue","webpack:///src/App.vue","webpack:///./src/App.vue?1160","webpack:///./src/App.vue","webpack:///./src/main.js","webpack:///./src/App.vue?7d31"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","app","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_index_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_lib_loader_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_sku_select_vue_vue_type_style_index_0_id_b9221f6a_lang_sass_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_index_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_lib_loader_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_sku_select_vue_vue_type_style_index_0_id_b9221f6a_lang_sass_scoped_true___WEBPACK_IMPORTED_MODULE_0___default","Appvue_type_template_id_ccfa908c_scoped_true_lang_pug_render","_vm","this","_h","$createElement","_c","_self","attrs","id","staticClass","_l","spec","index","_v","placeholder","model","callback","$$v","$set","trim","expression","on","click","$event","delSepc","option","option_index","placement","width","trigger","staticStyle","slot","stopPropagation","delOption","_s","suffix-icon","blur","addOption","nativeOn","keyup","type","indexOf","_k","keyCode","addValues","disabled","addSpec","skusData","specification","staticRenderFns","sku_selectvue_type_template_id_b9221f6a_scoped_true_lang_pug_render","selOptionsName","join","selPath","price","stock","options","title","symbol","active","canClick","select","sku_selectvue_type_template_id_b9221f6a_scoped_true_lang_pug_staticRenderFns","sku_selectvue_type_script_lang_js_","props","Array","default","computed","specs","map","item","spec_leafs","leaf","keys","values","_this","arr","v","k","path","paths","len","func","_iteratorNormalCompletion","_didIteratorError","_iteratorError","undefined","_step","_iterator","iterator","next","done","sort","symbols","titles","pop","err","return","selIds","sel","optionName","getPath","a","obj","skus","prices","maxPrice","Math","max","minPrice","min","_this2","res","addRes","combine","skas","forEach","tmp","gk","concat","_i","_keys","split","watch","deep","immediate","handler","val","methods","_this3","includes","notSiblingsSelIds","filter","sku","components_sku_selectvue_type_script_lang_js_","component","componentNormalizer","sku_select","sku_tablevue_type_template_id_7846a61d_lang_pug_render","inline","coefficient","label","prop","step","precision","setGuideCoefficient","setPurchaseCoefficient","_g","_b","border","max-height","columns","columns-props","columnsProps","span-method","objectSpanMethod","$attrs","$listeners","sku_tablevue_type_template_id_7846a61d_lang_pug_staticRenderFns","getLevels","tree","level","flatten","stocks","arguments","_ref","_ref$optionValue","optionValue","_ref$optionText","optionText","skuLen","stockMap","attr","objectWithoutProperties","k_id","v_id","_loop","mapKey","column","row","parseInt","_ref2","assign","objectSpread","createUniqueString","timestamp","Date","randomNum","random","toString","uniqueArr","from","Set","diffArary","arr1","arr2","arg","sku_tablevue_type_script_lang_js_","skusList","ids","reduce","total","prev","specList","formater","toConsumableArray","vue_runtime_esm","extend","render","h","format","input","e","guide_price","controls","purchase_price","_this4","sell_price","newSkus","oldSkus","_this5","initData","diffIds","find","_item","purchase_coefficient","guide_coefficient","align","minWidth","skusList1","skusList2","rowIndex","columnIndex","rowspan","colspan","components_sku_tablevue_type_script_lang_js_","sku_table_component","sku_table","Appvue_type_script_lang_js_","components","VueJsonPretty","vue_json_pretty_default","SkuSelect","SkuTable","some","str","oldArr","spec_index","src_Appvue_type_script_lang_js_","App_component","App","Vue","use","ElementUI","size","Egrid","config","productionTip","$mount","_node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_index_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_lib_loader_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_id_ccfa908c_lang_sass_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_index_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_lib_loader_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_id_ccfa908c_lang_sass_scoped_true___WEBPACK_IMPORTED_MODULE_0___default"],"mappings":"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","file":"../static/js/app.a38f66be.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/index.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/lib/loader.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sku-select.vue?vue&type=style&index=0&id=b9221f6a&lang=sass&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/index.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/lib/loader.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sku-select.vue?vue&type=style&index=0&id=b9221f6a&lang=sass&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('div',{staticClass:\"sku_container\"},[_vm._l((_vm.specification),function(spec,index){return _c('div',{key:spec.id,staticClass:\"sku_group mb10\"},[_c('div',{staticClass:\"spec_title\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"规格名:\")]),_c('el-input',{staticClass:\"input\",attrs:{\"placeholder\":\"请输入规格名\"},model:{value:(spec.value),callback:function ($$v) {_vm.$set(spec, \"value\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"spec.value\"}}),_c('span',{staticClass:\"remove\",on:{\"click\":function($event){return _vm.delSepc(index)}}},[_vm._v(\"×\")])],1),_c('div',{staticClass:\"group_container\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"规格值:\")]),_vm._l((spec.leaf),function(option,option_index){return _c('el-popover',{key:option_index,attrs:{\"placement\":\"bottom\",\"width\":\"120\",\"trigger\":\"click\"}},[_c('el-input',{staticStyle:{\"width\":\"110px\"},model:{value:(option.value),callback:function ($$v) {_vm.$set(option, \"value\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"option.value\"}}),_c('div',{staticClass:\"sku_item\",attrs:{\"slot\":\"reference\"},slot:\"reference\"},[_c('span',{staticClass:\"remove\",on:{\"click\":function($event){$event.stopPropagation();return _vm.delOption(index, option_index)}}},[_vm._v(\"×\")]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(option.value))])])],1)}),_c('el-input',{staticClass:\"input\",attrs:{\"suffix-icon\":\"el-icon-plus\",\"placeholder\":\"多个产品属性以空格隔开\"},on:{\"blur\":function($event){return _vm.addOption(index)}},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.addOption(index)}},model:{value:(_vm.addValues[index]),callback:function ($$v) {_vm.$set(_vm.addValues, index, $$v)},expression:\"addValues[index]\"}})],2)])}),_c('div',{staticClass:\"spec_title\"},[_c('el-button',{attrs:{\"type\":\"info\",\"disabled\":_vm.disabled},on:{\"click\":_vm.addSpec}},[_vm._v(\"添加规格项目\")])],1)],2),_c('div',{staticClass:\"sku_container\"},[_c('SkuSelect',{attrs:{\"skusData\":_vm.specification}})],1),_c('div',{staticClass:\"sku_container\"},[_c('SkuTable',{attrs:{\"skusData\":_vm.specification}}),_c('vue-json-pretty',{attrs:{\"data\":_vm.specification}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"container\"},[_c('p',[_vm._v(\"选择配置:\"+_vm._s(_vm.selOptionsName.join(' + ') || '-'))]),_c('p',[_vm._v(\"选择路径:\"+_vm._s(_vm.selPath || '-'))]),_c('p',[_vm._v(\"价格:\"+_vm._s(_vm.price))]),_c('p',[_vm._v(\"库存:\"+_vm._s(_vm.stock))]),_vm._l((_vm.keys),function(options,title){return _c('div',{key:title},[_c('span',[_vm._v(_vm._s(title)+\":\")]),_vm._l((options),function(symbol,name){return _c('el-button',{key:symbol,attrs:{\"type\":_vm.active[title] === name ? 'primary' : '',\"disabled\":!_vm.canClick(symbol, name, title)},on:{\"click\":function($event){return _vm.select(symbol, name, title)}}},[_vm._v(_vm._s(name)+\" (\"+_vm._s(symbol)+\")\")])})],2)})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n.container\n p 选择配置:{{ selOptionsName.join(' + ') || '-' }}\n p 选择路径:{{ selPath || '-' }}\n p 价格:{{ price }}\n p 库存:{{ stock }}\n div(v-for='(options, title) in keys', :key='title')\n span {{ title }}:\n el-button(\n v-for='(symbol, name) in options'\n :key='symbol'\n :type=\"active[title] === name ? 'primary' : ''\"\n :disabled='!canClick(symbol, name, title)'\n @click='select(symbol, name, title)'\n ) {{ name }} ({{ symbol }})\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sku-select.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sku-select.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./sku-select.vue?vue&type=template&id=b9221f6a&scoped=true&lang=pug&\"\nimport script from \"./sku-select.vue?vue&type=script&lang=js&\"\nexport * from \"./sku-select.vue?vue&type=script&lang=js&\"\nimport style0 from \"./sku-select.vue?vue&type=style&index=0&id=b9221f6a&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b9221f6a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"container\"},[_c('el-form',{attrs:{\"inline\":true,\"model\":_vm.coefficient}},[_c('el-form-item',{attrs:{\"label\":\"指导价倍数\",\"prop\":\"guide_coefficient\"}},[_c('el-input-number',{attrs:{\"step\":0.1,\"min\":1,\"precision\":2},model:{value:(_vm.coefficient.guide_coefficient),callback:function ($$v) {_vm.$set(_vm.coefficient, \"guide_coefficient\", $$v)},expression:\"coefficient.guide_coefficient\"}})],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.setGuideCoefficient}},[_vm._v(\"批量设置指导价倍数\")])],1)],1),_c('el-form',{attrs:{\"inline\":true,\"model\":_vm.coefficient}},[_c('el-form-item',{attrs:{\"label\":\"标价倍数\",\"prop\":\"purchase_coefficient\"}},[_c('el-input-number',{attrs:{\"step\":0.1,\"min\":1,\"precision\":2},model:{value:(_vm.coefficient.purchase_coefficient),callback:function ($$v) {_vm.$set(_vm.coefficient, \"purchase_coefficient\", $$v)},expression:\"coefficient.purchase_coefficient\"}})],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.setPurchaseCoefficient}},[_vm._v(\"批量设置标价倍数\")])],1)],1),_c('egrid',_vm._g(_vm._b({attrs:{\"border\":\"\",\"max-height\":\"800\",\"data\":_vm.data,\"columns\":_vm.columns,\"columns-props\":_vm.columnsProps,\"span-method\":_vm.objectSpanMethod}},'egrid',_vm.$attrs,false),_vm.$listeners))],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","// 计算每个sku后面有多少项\nexport function getLevels(tree) {\n let level = []\n for (let i = tree.length - 1; i >= 0; i--) {\n if (tree[i + 1] && tree[i + 1].leaf) {\n level[i] = tree[i + 1].leaf.length * level[i + 1] || 1\n } else {\n level[i] = 1\n }\n }\n return level\n}\n\n/**\n * 笛卡尔积运算\n * @param {[type]} tree [description]\n * @param {Array} stocks [description]\n * @return {[type]} [description]\n */\nexport function flatten(tree, stocks = [], options) {\n let { optionValue = 'id', optionText = 'value' } = options || {}\n let result = []\n let skuLen = 0\n let stockMap = {} // 记录已存在的stock的数据\n const level = getLevels(tree)\n if (tree.length === 0) return result\n tree.forEach(sku => {\n const { leaf } = sku\n if (!leaf || leaf.length === 0) return true\n skuLen = (skuLen || 1) * leaf.length\n })\n // 根据已有的stocks生成一个map\n stocks.forEach(stock => {\n let { skus, ...attr } = stock\n stockMap[skus.map(item => `${item.k_id}_${item.v_id}`).join('|')] = attr\n })\n for (let i = 0; i < skuLen; i++) {\n let skus = []\n let mapKey = []\n tree.forEach((sku, column) => {\n const { leaf } = sku\n let item = {}\n if (!leaf || leaf.length === 0) return true\n if (leaf.length > 1) {\n let row = parseInt(i / level[column], 10) % leaf.length\n item = tree[column].leaf[row]\n } else {\n item = tree[column].leaf[0]\n }\n if (!sku[optionValue] || !item[optionValue]) return\n mapKey.push(`${sku[optionValue]}_${item[optionValue]}`)\n skus.push({\n k_id: sku[optionValue],\n k: sku[optionText],\n v_id: item[optionValue],\n v: item[optionText],\n })\n })\n let { ...data } = stockMap[mapKey.join('|')] || {}\n // 从map中找出存在的sku并保留其值\n result.push({ ...data, skus })\n }\n return result\n}\n\n/**\n * 判断两个sku是否相同\n * @param {[type]} prevSKU [description]\n * @param {[type]} nextSKU [description]\n * @return {Boolean} [description]\n */\nexport function isEqual(prevSKU, nextSKU, options) {\n let { optionValue = 'id' } = options || {}\n return (\n nextSKU.length === prevSKU.length &&\n nextSKU.every(({ leaf = [] }, index) => {\n let prevLeaf = prevSKU[index].leaf || []\n return (\n prevSKU[index][optionValue] === nextSKU[index][optionValue] &&\n leaf.length === prevLeaf.length &&\n leaf.map(item => item[optionValue]).join(',') ===\n prevLeaf.map(item => item[optionValue]).join(',')\n )\n })\n )\n}\n","/**\n * @returns {string}\n */\nexport function createUniqueString() {\n const timestamp = +new Date() + ''\n const randomNum = parseInt((1 + Math.random()) * 65536) + ''\n return (+(randomNum + timestamp)).toString(32)\n}\n\n/**\n * @param {Array} arr\n * @returns {Array}\n */\nexport function uniqueArr(arr) {\n return Array.from(new Set(arr))\n}\n\n/**\n * @param {Array} arr1\n * @param {Array} arr2\n * @returns {Array}\n */\nexport function diffArary(arr1, arr2) {\n arr1 = uniqueArr(arr1)\n arr2 = uniqueArr(arr2)\n return arr1.concat(arr2).filter(arg => !(arr1.includes(arg) && arr2.includes(arg)))\n}\n","\n.container\n el-form(:inline=\"true\" :model=\"coefficient\")\n el-form-item(label=\"指导价倍数\" prop=\"guide_coefficient\")\n el-input-number(\n :step=\"0.1\"\n :min=\"1\"\n :precision=\"2\"\n v-model=\"coefficient.guide_coefficient\"\n )\n el-form-item\n el-button(type=\"primary\" @click=\"setGuideCoefficient\") 批量设置指导价倍数\n\n el-form(:inline=\"true\" :model=\"coefficient\")\n el-form-item(label=\"标价倍数\" prop=\"purchase_coefficient\")\n el-input-number(\n :step=\"0.1\"\n :min=\"1\"\n :precision=\"2\"\n v-model=\"coefficient.purchase_coefficient\"\n )\n el-form-item\n el-button(type=\"primary\" @click=\"setPurchaseCoefficient\") 批量设置标价倍数\n\n egrid(\n border\n max-height=\"800\"\n v-bind=\"$attrs\"\n v-on=\"$listeners\"\n :data=\"data\"\n :columns=\"columns\"\n :columns-props=\"columnsProps\"\n :span-method=\"objectSpanMethod\"\n )\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sku-table.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sku-table.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./sku-table.vue?vue&type=template&id=7846a61d&lang=pug&\"\nimport script from \"./sku-table.vue?vue&type=script&lang=js&\"\nexport * from \"./sku-table.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n#app\n .sku_container\n .sku_group.mb10(v-for=\"(spec, index) in specification\" :key=\"spec.id\")\n .spec_title\n span.label 规格名:\n el-input.input(placeholder='请输入规格名' v-model.trim=\"spec.value\")\n span.remove(@click=\"delSepc(index)\") ×\n\n .group_container\n span.label 规格值:\n el-popover(\n placement=\"bottom\"\n width=\"120\"\n trigger=\"click\"\n v-for=\"(option, option_index) in spec.leaf\" :key=\"option_index\"\n )\n el-input(v-model.trim=\"option.value\" style=\"width: 110px;\")\n .sku_item(slot=\"reference\")\n span.remove(@click.stop=\"delOption(index, option_index)\") ×\n .text {{option.value}}\n\n el-input.input(\n suffix-icon=\"el-icon-plus\"\n v-model=\"addValues[index]\"\n placeholder=\"多个产品属性以空格隔开\"\n @keyup.native.enter='addOption(index)'\n @blur='addOption(index)'\n )\n .spec_title\n el-button(type='info' :disabled='disabled' @click='addSpec') 添加规格项目\n\n .sku_container\n SkuSelect(:skusData=\"specification\")\n\n .sku_container\n SkuTable(:skusData=\"specification\")\n vue-json-pretty(:data=\"specification\")\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=ccfa908c&scoped=true&lang=pug&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=ccfa908c&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ccfa908c\",\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport App from './App.vue'\nimport Egrid from 'egrid'\nimport ElementUI from 'element-ui'\nimport 'element-ui/lib/theme-chalk/index.css';\n\nVue.use(ElementUI, { size: 'small' })\nVue.use(Egrid)\n\nVue.config.productionTip = false\n\nnew Vue({\n render: h => h(App),\n}).$mount('#app')\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../node_modules/css-loader/index.js??ref--9-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../node_modules/sass-loader/lib/loader.js??ref--9-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&id=ccfa908c&lang=sass&scoped=true&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../node_modules/css-loader/index.js??ref--9-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../node_modules/sass-loader/lib/loader.js??ref--9-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&id=ccfa908c&lang=sass&scoped=true&\""],"sourceRoot":""}
--------------------------------------------------------------------------------