Browse Source

修改商家端支持分组组件

master
xh-pan1 1 year ago
parent
commit
6d86612fad
  1. 1
      canvas-container/components/canvasEditPage.vue
  2. 117
      canvas-container/components/canvasShow/basics/productGroupList.vue
  3. 12
      canvas-container/components/canvasShow/componentMap.js
  4. 1
      canvas-container/components/canvasShow/config/api.js
  5. 2
      canvas-container/components/canvasShow/config/mixin/sendReqMixin.js
  6. 32
      canvas-container/components/leftBar/panelList.js
  7. 1
      canvas-container/components/toolBar/componentMap.js
  8. 385
      canvas-container/components/toolBar/goodsComp/productgroupTool.vue
  9. 56
      canvas-container/components/toolBar/toolModule/product-group-select.vue
  10. 24
      canvas-container/locales/en.json
  11. 24
      canvas-container/locales/zh-CN.json
  12. 3
      src/api/commodity.js
  13. 23
      src/locales/en.json
  14. 24
      src/locales/zh-CN.json
  15. 194
      src/views/commodity/commodityList/commodityGroup.vue
  16. 26
      src/views/commodity/commodityList/index.vue

1
canvas-container/components/canvasEditPage.vue

@ -167,6 +167,7 @@
case 'imageTextList':
case 'brandList':
case 'categoryList':
case 'productGroupList':
case 'assistDiv':
case 'vip':
case 'live':

117
canvas-container/components/canvasShow/basics/productGroupList.vue

@ -0,0 +1,117 @@
<template>
<div class="productGroup-list warp" :class="'terminal' + terminal">
<h2 class="hom-title" :style="{textAlign:componentContent.textAlign}" v-if="componentContent.title">{{componentContent.title}}</h2>
<div class="content-warp" v-if="componentContent.showType == 1">
<div class="item" @click="jumpProductGroup(item)" v-for="(item) of componentContent.productGroupData" :key="item.id">
<div class="imgBox">
<img ref="getHeight" :src="item.img" v-show="item.img" :alt="item.data.groupName">
</div>
</div>
</div>
<div class="content-parent-warp" v-if="componentContent.showType == 2">
<div class="content-list-warp">
<div class="item" @click="jumpProductGroup(item)" v-for="(item) of componentContent.productGroupData" :key="item.id">
<div class="imgBox">
<img ref="getHeight" :src="item.img" v-show="item.img" :alt="item.data.groupName">
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import {funMixin} from '../config/mixin'
export default {
name: 'productGroupList',
mixins: [funMixin],
props: {
terminal: {
type: Number,
default: 4
},
componentContent: {
type: Object
}
}
}
</script>
<style lang="scss" scoped>
.productGroup-list{
padding: 20px 0;
.hom-title{
font-size: 22px;
color: #333;
line-height: 1em;
margin-bottom: 23px;
font-weight: bold;
text-align: center;
}
.content-warp{
display: flex;
flex-wrap: wrap;
margin: 0px 40px 0px 30px;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-ms-flex-direction: row;
flex-direction: row;
-ms-flex-line-pack: center;
align-content: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-sizing: border-box;
box-sizing: border-box;
.item{
width: 25%;
height: auto;
padding-left: 10px;
.imgBox {
position: relative;
}
img {
width: 100%;
}
}
}
.content-parent-warp{
display: -webkit-box;
margin: 0px 40px 0px 30px;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-box-pack: center;
-webkit-box-align: center;
-webkit-box-sizing: border-box;
box-sizing: border-box;
overflow-x: auto;
.content-list-warp{
width: auto;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
align-items: center;
.item{
width: 230px;
height: auto;
padding-left: 10px;
.imgBox {
position: relative;
}
img {
width: 100%;
}
}
}
}
}
</style>

12
canvas-container/components/canvasShow/componentMap.js

@ -7,7 +7,8 @@ export const componentMap = [
['text', () => import('./basics/text')], // 文本
['imageText', () => import('./basics/imageText')], // 图文
['brandList', () => import('./basics/brandList')], // 品牌列表
['categoryList', () => import('./basics/categoryList')], // 品牌列表
['categoryList', () => import('./basics/categoryList')], // 分类列表
['productGroupList', () => import('./basics/productGroupList')], // 分组列表
['imageTextList', () => import('./basics/imageTextList')], // 图文列表
['assistDiv', () => import('./basics/assistDiv')], // 铺助分割
['imageTextNav', () => import('./basics/imageTextNav')], // 图文导航
@ -33,7 +34,8 @@ export const componentMap = [
['text', () => import('./basics/text')], // 文本
['imageText', () => import('./basics/imageText')], // 图文
['brandList', () => import('./basics/brandList')], // 品牌列表
['categoryList', () => import('./basics/categoryList')], // 品牌列表
['categoryList', () => import('./basics/categoryList')], // 分类列表
['productGroupList', () => import('./basics/productGroupList')], // 分组列表
['imageTextList', () => import('./basics/imageTextList')], // 图文列表
['assistDiv', () => import('./basics/assistDiv')], // 铺助分割
['imageTextNav', () => import('./basics/imageTextNav')], // 图文导航
@ -59,7 +61,8 @@ export const componentMap = [
['text', () => import('./basics/text')], // 文本
['imageText', () => import('./basics/imageText')], // 图文
['brandList', () => import('./basics/brandList')], // 品牌列表
['categoryList', () => import('./basics/categoryList')], // 品牌列表
['categoryList', () => import('./basics/categoryList')], // 分类列表
['productGroupList', () => import('./basics/productGroupList')], // 分组列表
['imageTextList', () => import('./basics/imageTextList')], // 图文列表
['assistDiv', () => import('./basics/assistDiv')], // 铺助分割
['imageTextNav', () => import('./basics/imageTextNav')], // 图文导航
@ -85,7 +88,8 @@ export const componentMap = [
['text', () => import('./basics/text')], // 文本
['imageText', () => import('./basics/imageText')], // 图文
['brandList', () => import('./basics/brandList')], // 品牌列表
['categoryList', () => import('./basics/categoryList')], // 品牌列表
['categoryList', () => import('./basics/categoryList')], // 分类列表
['productGroupList', () => import('./basics/productGroupList')], // 分组列表
['imageTextList', () => import('./basics/imageTextList')], // 图文列表
['assistDiv', () => import('./basics/assistDiv')], // 铺助分割
['imageTextNav', () => import('./basics/imageTextNav')], // 图文导航

1
canvas-container/components/canvasShow/config/api.js

@ -8,6 +8,7 @@ export const api = {
// 画布模块
fileUpload: BASEURL + '/file/upload', // 文件上传
getClassify: BASEURL + '/canvas/getClassify', // 查询分类层级
getProductGroup: BASEURL + '/canvas/getProductGroup', // 查询分类层级
getProducts: BASEURL + '/canvas/getProducts', // 选择商品查询
saveCanvas: BASEURL + '/canvas/saveCanvas', // 保存画布
getCanvas: BASEURL + '/canvas/getCanvas', // 读取画布

2
canvas-container/components/canvasShow/config/mixin/sendReqMixin.js

@ -26,7 +26,7 @@ export const sendReq = {
withCredentials : true,
headers: {
'Content-type': params.contentType || 'application/json;charset=utf-8',
"project" : getProject()
"project" : params.project || getProject()
}
}).then((res) => {
if (res && res.data) {

32
canvas-container/components/leftBar/panelList.js

@ -350,6 +350,38 @@ export const panelList = [
],
textAlign: 'center'
}
},
{
title: '分组列表',
iconClass: 'icon-leibieliebiao',
type: 'productGroupList',
componentContent: {
title: '',
showType: 1,
productGroupData: [
{
id: 1,
data: {},
img: ''
},
{
id: 2,
data: {},
img: ''
},
{
id: 3,
data: {},
img: ''
},
{
id: 4,
data: {},
img: ''
}
],
textAlign: 'center'
}
}
]
},

1
canvas-container/components/toolBar/componentMap.js

@ -13,6 +13,7 @@ export const componentMap = new Map([
['notice', () => import('./BasicsComp/noticeTool')], // 公告
['coupon', () => import('./MarketingComp/couponTool')], // 优惠券
['categoryList', () => import('./goodsComp/categoryTool')], // 类别列表
['productGroupList', () => import('./goodsComp/productgroupTool')], // 分组列表
['productList', () => import('./goodsComp/productList')], // 商品列表
['groupList', () => import('./shopComp/groupTool')], // 拼团专区
['spikeList', () => import('./shopComp/spikeTool')], // 秒杀专区

385
canvas-container/components/toolBar/goodsComp/productgroupTool.vue

@ -0,0 +1,385 @@
<template>
<div class="productGroupTool">
<h3 class="toolTit">分组列表</h3>
<div class="toolBox">
<div class="itemBox">
<label>标题</label>
<el-input v-model="activeComponent.componentContent.title" maxlength="20" :placeholder="$t('common.defaulthint')"></el-input>
</div>
<tool-select :linkValue.sync='activeComponent.componentContent.textAlign' title="文字对齐方式" :options="alignList"></tool-select>
<div class="itemBox">
<div class="Tit">显示方式</div>
<el-select v-model="activeComponent.componentContent.showType" :placeholder="$t('common.choose')">
<el-option label="平铺" :value="1"></el-option>
<el-option label="列表" :value="2"></el-option>
</el-select>
</div>
<div class="textTit">添加分组</div>
<div class="productGroupListBox">
<draggable v-model="activeComponent.componentContent.productGroupData">
<div v-for="(item, index) in activeComponent.componentContent.productGroupData" :key="index" class="item">
<div class="listItemBox">
<div class="addImgTit" @click="openAddProductGroup(item, index)">
<div class="titLeft">
<span class="iconfont">&#xe703;</span>
<span class="iconfont">&#xe64a;</span>
<span>分组</span>
</div>
<div class="titRight">
<span class="iconfont" @click.stop="deleteItem(item, index)">&#xe633;</span>
<span v-html="productGroupCurrent === index ? '&#xe660;' : '&#xe695;'" class="iconfont"></span>
</div>
</div>
<div class="addBox" v-show="productGroupCurrent === index">
<div class="addContent">
<tool-single-img :imageUrl.sync='item.img' tip='建议尺寸5:4等比例图片'></tool-single-img>
<div v-if="!item.data.groupName" class="addProductGroupBox" @click="addItemProductGroup(item, index)"><span class="iconfont">&#xe685;</span>添加分组</div>
<div v-else class="productGroupName">
<span>{{item.data.groupName}}</span>
<div class="operation">
<span class="iconfont" @click="replaceProductGroup(index)">&#xe66c;</span>
<span class="iconfont" @click="deleteProductGroup(index)">&#xe633;</span>
</div>
</div>
</div>
<div @click="deleteItem(item, index)" class="deleteItem"><span class="iconfont">&#xe633;</span>删除内容</div>
</div>
</div>
</div>
</draggable>
</div>
</div>
<div class="addImgBtn" v-show="activeComponent.componentContent.productGroupData.length < 8" @click="addProductGroup"><span class="iconfont">&#xe64a;</span>添加分组</div>
<div class="addImgBtn" v-show="activeComponent.componentContent.productGroupData.length === 8"><span class="iconfont">&#xe608;</span>最多只能添加8个</div>
<el-dialog
title="提示"
:visible.sync="dialogVisible"
width="30%"
:before-close="deleteItem">
<span>点击确定删除此项</span>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
<el-button type="primary" @click="dialogVisible = false">{{ $t('common.sure') }}</el-button>
</span>
</el-dialog>
<el-dialog title="选择分组" :visible.sync="dialogProductGroup" width="480px">
<product-group-select ref="productGroupSelect"></product-group-select>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogProductGroup = false">{{ $t('common.cancel') }}</el-button>
<el-button type="primary" @click="productGroupChanged">{{ $t('common.sure') }}</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Draggable from 'vuedraggable'
import {toolMixin} from '@@/config/mixin'
import ProductGroupSelect from '../toolModule/product-group-select'
import ToolSingleImg from '../toolModule/tool-single-img'
import ToolSelect from '../toolModule/tool-select'
// import imageSrc from '../../../assets/canvasImg'
export default {
mixins: [toolMixin],
name: 'productGroupTool',
components: {
ToolSelect,
ToolSingleImg,
ProductGroupSelect,
Draggable
},
data () {
return {
title: '', //
alignList: [
{
id: 1,
label: '居左',
value: 'left'
},
{
id: 2,
label: '居中',
value: 'center'
},
{
id: 3,
label: '居右',
value: 'right'
}
],
textAlign: 'left',
productGroupCurrent: null,
dialogVisible: false,
dialogProductGroup: false,
currentProductGroup: null
}
},
computed: {
},
methods: {
openAddProductGroup (item, index) {
if (this.productGroupCurrent === index) {
this.productGroupCurrent = null
return false
}
this.productGroupCurrent = index
},
//
addProductGroup () {
this.activeComponent.componentContent.productGroupData.push({
data: [],
img: ''
})
},
//
deleteItem (item, index) {
this.$confirm('确定删除此项?')
.then(_ => {
this.activeComponent.componentContent.productGroupData.splice(index, 1)
})
.catch(_ => {
})
},
addItemProductGroup (item, index) {
this.dialogProductGroup = true
this.productGroupCurrent = index
},
//
replaceProductGroup (index) {
this.dialogProductGroup = true
this.productGroupCurrent = index
console.log(this.productGroupCurrent)
},
//
deleteProductGroup (index) {
this.activeComponent.componentContent.productGroupData[index].data = {}
},
//
productGroupChanged () {
let nodesObj = this.$refs.productGroupSelect.productGroup
console.log(nodesObj, this.productGroupCurrent)
if (nodesObj) {
var data = nodesObj
this.dialogProductGroup = false
this.activeComponent.componentContent.productGroupData[this.productGroupCurrent].id = data.id
this.activeComponent.componentContent.productGroupData[this.productGroupCurrent].data = data
}
}
}
}
</script>
<style lang="scss" scoped>
.productGroupTool {
padding: 20px 20px 0 20px;
h3 {
font-size: 18px;
font-weight: 500;
height: 35px;
line-height: 35px;
color: #333333;
margin-bottom: 20px;
}
.toolBox {
padding-bottom: 10px;
.textTit {
height: 35px;
line-height: 35px;
font-size: 16px;
color: #333333;
font-weight: bold;
}
.itemBox {
label {
font-size: 14px;
color: #666666;
height: 40px;
line-height: 40px;
}
margin-bottom: 15px;
}
}
::v-deep .ql-container {
height: 200px;
}
.productGroupListBox {
margin-top: 30px;
.item {
border: 1px solid #E8EAEC;
border-radius: 4px;
margin-bottom: 10px;
}
.listItemBox {
.addImgTit {
padding: 10px;
display: flex;
justify-content: space-between;
align-items: center;
background: #F6F7F9;
cursor: pointer;
.titLeft {
display: flex;
align-items: center;
span {
color: #7D7E80;
}
span:nth-child(1) {
font-size: 28px;
}
span:nth-child(2) {
font-size: 25px;
margin: 0 6px;
}
span:nth-child(3) {
font-size: 14px;
}
}
.titRight {
display: flex;
align-items: center;
span:nth-child(1) {
width: 40px;
text-align: center;
display: block;
height: 30px;
line-height: 30px;
}
}
}
.addContent {
padding: 13px;
.addProductGroupBox {
width: 100%;
height: 35px;
display: flex;
align-items: center;
justify-content: center;
color: #ffffff;
background: $mainColor;
border-radius: 4px;
margin: 15px 0;
cursor: pointer;
}
.deleteItem {
border-radius: 4px;
background: $mainColor;
text-align: center;
height: 36px;
color: #ffffff;
font-size: 14px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
margin-bottom: 10px;
span {
font-size: 18px;
color: #ffffff;
margin-right: 5px;
}
}
.productGroupName {
height: 35px;
display: flex;
align-items: center;
background: #e9e9e9;
padding: 0 10px;
justify-content: space-between;
span {
color: #333333;
}
span {
color: #333333;
}
.operation {
display: flex;
span {
width: 35px;
display: block;
height: 35px;
line-height: 35px;
text-align: center;
cursor: pointer;
}
}
}
}
.deleteItem {
padding: 10px;
display: flex;
align-items: center;
justify-content: center;
background: #F6F7F9;
cursor: pointer;
color: $mainColor;
font-size: 14px;
span {
font-size: 16px;
margin-right: 5px;
}
}
}
}
.addImgBtn {
border-radius: 4px;
background: $mainColor;
text-align: center;
height: 36px;
color: #ffffff;
font-size: 14px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
span {
font-size: 20px;
margin-right: 5px;
}
}
.classList {
.classTit {
display: flex;
justify-content: space-between;
height: 50px;
align-items: center;
padding:0 20px;
background: #eeeeee;
span {
display: block;
width: 100px;
text-align: center;
}
}
.classListBox {
max-height: 300px;
overflow-y: auto;
.classItemBox {
display: flex;
padding: 0 20px;
align-items: center;
border-bottom: 1px solid #eeeeee;
div {
display: flex;
flex: 1;
justify-content: space-between;
height: 50px;
align-items: center;
span:nth-child(1) {
padding-left: 5px;
}
span {
display: block;
width: 100px;
text-align: left;
}
span:nth-child(2) {
text-align: center;
}
}
}
}
}
}
</style>

56
canvas-container/components/toolBar/toolModule/product-group-select.vue

@ -0,0 +1,56 @@
<template>
<!-- <el-cascader style="width: 100%"
ref="cascader"
:options="productGroupList"
:props="{ checkStrictly: true,label: 'groupName',value: 'id',children: 'childs' }"
clearable></el-cascader> -->
<el-select v-model="productGroup" placeholder="请选择">
<el-option
v-for="item in productGroupList"
:key="item.shopGroupId"
:label="item.groupName"
:value="item.shopGroupId">
</el-option>
</el-select>
</template>
<script>
import api from '@@/components/canvasShow/config/api'
import {sendReqMixin} from '@@/components/canvasShow/config/mixin'
import {checkEmptyChild} from '@@/config/common'
import {getShopId} from "@@/utils/auth.js"
export default {
name: 'product-group-select',
mixins: [sendReqMixin],
data () {
return {
productGroupList: [],
productGroup : {}
}
},
mounted () {
this.getProductGroup()
},
methods: {
//
getProductGroup () {
var _this = this
// let shopId = parseInt(getShopId())
// var paramsUrl = `${api.getProductGroup}?`
// if (shopId) {
// paramsUrl += `&shopId=${shopId}`
// }
let params = {
url: api.getProductGroup,
method: 'GET',
project: '0'
}
this.sendReq(params, (res) => {
_this.productGroupList = res.data
checkEmptyChild(_this.productGroupList)
})
}
}
}
</script>

24
canvas-container/locales/en.json

@ -603,5 +603,27 @@
"common.deal":"Deal",
"common.exportafterorder_filename":"afterorderdatadetail.xls",
"common.after-salestatus_info":"After-sale Info",
"common.more":"More"
"common.own":"All",
"common.more":"More",
"product.addproductgroup":"新增分组",
"product.editproductgroup":"编辑分组",
"product.productgroupimage":"分组封面",
"product.productgroupname":"分组名称",
"product.productgroupdesc":"分组描述",
"common.product_number":"商品数量",
"common.edittime":"修改时间",
"product.productgroupname_hint":"请输入分组名称",
"product.productgroupname_zh":"分组中文名称",
"product.productgroupdesc_zh":"分组中文描述",
"product.productgroupname_en":"分组英文名称",
"product.productgroupdesc_en":"分组英文描述",
"product.productgroupdesc_hint":"请输入分组描述",
"product.productgroupproduct":"分组商品",
"product.productgroupproductmanualadd":"手动添加",
"product.productgroupproductintelligentadd":"智能添加",
"product.productgroupproductintelligent":"智能添加已选条件",
"common.gt":"大于",
"common.eq":"等于",
"common.lt":"小于",
"product.productgroupname_empty":"分组名称不能为空"
}

24
canvas-container/locales/zh-CN.json

@ -603,5 +603,27 @@
"common.deal":"处理",
"common.exportafterorder_filename":"售后订单数据明细表.xls",
"common.after-salestatus_info":"售后信息",
"common.more":"更多"
"common.own":"所有",
"common.more":"更多",
"product.addproductgroup":"新增分组",
"product.editproductgroup":"编辑分组",
"product.productgroupimage":"分组封面",
"product.productgroupname":"分组名称",
"product.productgroupdesc":"分组描述",
"common.product_number":"商品数量",
"common.edittime":"修改时间",
"product.productgroupname_hint":"请输入分组名称",
"product.productgroupname_zh":"分组中文名称",
"product.productgroupdesc_zh":"分组中文描述",
"product.productgroupname_en":"分组英文名称",
"product.productgroupdesc_en":"分组英文描述",
"product.productgroupdesc_hint":"请输入分组描述",
"product.productgroupproduct":"分组商品",
"product.productgroupproductmanualadd":"手动添加",
"product.productgroupproductintelligentadd":"智能添加",
"product.productgroupproductintelligent":"智能添加已选条件",
"common.gt":"大于",
"common.eq":"等于",
"common.lt":"小于",
"product.productgroupname_empty":"分组名称不能为空"
}

3
src/api/commodity.js

@ -167,11 +167,10 @@ export function commodityListAdd(data, headers) {
})
}
// 分组商品查询
export function getGroupList(data, headers) {
export function getGroupList(data) {
return request({
url: '/group/getProducts',
method: 'post',
headers:headers,
data
})
}

23
src/locales/en.json

@ -605,5 +605,26 @@
"common.exportafterorder_filename":"afterorderdatadetail.xls",
"common.after-salestatus_info":"After-sale Info",
"common.own":"All",
"common.more":"More"
"common.more":"More",
"product.addproductgroup":"新增分组",
"product.editproductgroup":"编辑分组",
"product.productgroupimage":"分组封面",
"product.productgroupname":"分组名称",
"product.productgroupdesc":"分组描述",
"common.product_number":"商品数量",
"common.edittime":"修改时间",
"product.productgroupname_hint":"请输入分组名称",
"product.productgroupname_zh":"分组中文名称",
"product.productgroupdesc_zh":"分组中文描述",
"product.productgroupname_en":"分组英文名称",
"product.productgroupdesc_en":"分组英文描述",
"product.productgroupdesc_hint":"请输入分组描述",
"product.productgroupproduct":"分组商品",
"product.productgroupproductmanualadd":"手动添加",
"product.productgroupproductintelligentadd":"智能添加",
"product.productgroupproductintelligent":"智能添加已选条件",
"common.gt":"大于",
"common.eq":"等于",
"common.lt":"小于",
"product.productgroupname_empty":"分组名称不能为空"
}

24
src/locales/zh-CN.json

@ -605,5 +605,27 @@
"common.exportafterorder_filename":"售后订单数据明细表.xls",
"common.after-salestatus_info":"售后信息",
"common.own":"所有",
"common.more":"更多"
"common.more":"更多",
"product.addproductgroup":"新增分组",
"product.editproductgroup":"编辑分组",
"product.productgroupimage":"分组封面",
"product.productgroupname":"分组名称",
"product.productgroupdesc":"分组描述",
"common.product_number":"商品数量",
"common.edittime":"修改时间",
"product.productgroupname_hint":"请输入分组名称",
"product.productgroupname_zh":"分组中文名称",
"product.productgroupdesc_zh":"分组中文描述",
"product.productgroupname_en":"分组英文名称",
"product.productgroupdesc_en":"分组英文描述",
"product.productgroupdesc_hint":"请输入分组描述",
"product.productgroupproduct":"分组商品",
"product.productgroupproductmanualadd":"手动添加",
"product.productgroupproductintelligentadd":"智能添加",
"product.productgroupproductintelligent":"智能添加已选条件",
"common.gt":"大于",
"common.eq":"等于",
"common.lt":"小于",
"product.productgroupname_empty":"分组名称不能为空"
}

194
src/views/commodity/commodityList/commodityGroup.vue

@ -1,39 +1,71 @@
<template>
<div class="commodityGroup">
<div class="commodityBox">
<div class="groupTit">{{ groupData.shopGroupId ? '修改分组' : '新建分组' }}</div>
<div class="groupTit" v-if="false">{{ groupData.shopGroupId ? $t('product.editproductgroup') : $t('product.addproductgroup') }}</div>
<div class="newGroupBox">
<el-form class="formBox" :model="groupData" label-width="150px" :rules="groupBuyRules">
<el-form-item label="分组名称" prop="groupName">
<el-input v-model="groupData.groupName" maxlength="20" placeholder="请输入分组名称" onblur="value=value.replace(/(^\s*)|(\s*$)/g, '')" />
<el-form-item :label="$t('product.productgroupimage')" prop="fileLength" />
<div class="upload-wrap">
<el-upload
ref="upload"
:headers="headers"
:action="action"
:on-success="handleImageSuccess"
list-type="picture-card"
:limit="1"
:file-list="imgList"
>
<i class="el-icon-plus" />
</el-upload>
</div>
<el-form-item :label="$t('product.productgroupname_zh')" prop="groupName_ZH">
<el-input v-model="groupData.groupName_ZH" maxlength="20" :placeholder="$t('product.productgroupname_hint')" onblur="value=value.replace(/(^\s*)|(\s*$)/g, '')" />
</el-form-item>
<el-form-item label="分组描述">
<el-form-item :label="$t('product.productgroupname_en')" prop="groupName_EN">
<el-input v-model="groupData.groupName_EN" maxlength="40" :placeholder="$t('product.productgroupname_hint')" onblur="value=value.replace(/(^\s*)|(\s*$)/g, '')" />
</el-form-item>
<el-form-item :label="$t('product.productgroupdesc_zh')">
<el-input
v-model="groupData.groupDescribe"
v-model="groupData.groupDescribe_ZH"
maxlength="200"
type="textarea"
:rows="4"
placeholder="请输入分组描述"
:placeholder="$t('product.productgroupdesc_hint')"
/>
</el-form-item>
<el-form-item label="分组商品">
<el-form-item :label="$t('product.productgroupdesc_en')">
<el-input
v-model="groupData.groupDescribe_EN"
maxlength="200"
type="textarea"
:rows="4"
:placeholder="$t('product.productgroupdesc_hint')"
/>
</el-form-item>
<el-form-item :label="$t('product.productgroupproduct')">
<div class="btnBox">
<el-radio v-model="selectGroup" label="1" /><span @click="manualAdd">手动添加</span>
<el-radio v-model="selectGroup" label="2" /> <span @click="intelligentAdd">智能添加</span>
<el-radio v-model="selectGroup" label="1" /><span @click="manualAdd">{{ $t('product.productgroupproductmanualadd') }}</span>
<el-radio v-model="selectGroup" label="2" /> <span @click="intelligentAdd">{{ $t('product.productgroupproductintelligentadd') }}</span>
</div>
</el-form-item>
<div v-if="groupData.conditions.length !== 0 && selectGroup === '2'" class="intelDataBox">
<div class="intelTit">智能添加已选条件</div>
<div class="intelTit">{{ $t('product.productgroupproductintelligent') }}</div>
<div class="intelList">
<div v-for="(item, index) of groupData.conditions" :key="index" class="intelItem">
<div class="itemBox">
<span v-if="item.type === 1">库存</span>
<span v-if="item.type === 2">价格</span>
<span v-if="item.type === 3">重量</span>
<span v-if="item.type === 4">销量</span>
<span v-if="item.calculation === 1">大于</span>
<span v-if="item.calculation === 2">等于</span>
<span v-if="item.calculation === 3">小于</span>
<span v-if="item.type === 1">{{ $t('product.inventory') }}</span>
<span v-if="item.type === 2">{{ $t('common.price') }}</span>
<span v-if="item.type === 3">{{ $t('product.weight') }}</span>
<span v-if="item.type === 4">{{ $t('product.salesvolume') }}</span>
<span v-if="item.calculation === 1">{{ $t('common.gt') }}</span>
<span v-if="item.calculation === 2">{{ $t('common.eq') }}</span>
<span v-if="item.calculation === 3">{{ $t('common.lt') }}</span>
<span>{{ item.number }}</span>
</div>
</div>
@ -226,21 +258,20 @@ function GroupData() {
// type: 1 // 1- 2- 3- 4-
// }
]
this.groupDescribe = '' //
this.groupImage = '' //
this.groupName = '' //
this.groupDescribe_ZH = '' //
this.groupName_ZH = '' //
this.groupDescribe_EN = '' //
this.groupName_EN = '' //
this.ids = [] // id
this.shopGroupId = null // id
}
import { commodityListAdd, commodityListUpdate, getGroupList, commodityListGetById } from '@/api/commodity'
import { getToken } from '@/utils/auth'
import { uploadUrl } from '@/utils/request'
export default {
name: 'CommodityGroup',
props: {
groupId: {
type: Number,
default: 0
}
},
data() {
return {
formInline: {
@ -252,6 +283,7 @@ export default {
pageSize: 10, //
search: '' //
},
groupId : 0,
groupData: new GroupData(),
isShowManualAdd: false, //
isIntelligentAdd: false, //
@ -295,9 +327,9 @@ export default {
}
],
groupBuyRules: {
groupName: [
{ required: true, message: '请输入分组名称', trigger: 'blur' }
]
// groupName: [
// { required: true, message: '', trigger: 'blur' }
// ]
},
products: [], //
productsPage: 1,
@ -306,23 +338,33 @@ export default {
//
selectGroup: '1',
//
intelData: []
}
},
watch: {
groupId: {
handler(nVal, oVal) {
if (!nVal) {
this.groupData = new GroupData()
this.products = []
this.multipleSelection = []
} else {
this.groupData.shopGroupId = nVal
this.getDetailFn()
}
intelData: [],
imgList: [],
action: uploadUrl,
headers: {
'Authorization-business': getToken()
}
}
},
// watch: {
// groupId: {
// handler(nVal, oVal) {
// if (!nVal) {
// console.log("new GroupData")
// this.groupData = new GroupData()
// this.products = []
// this.multipleSelection = []
// this.imgList=[]
// } else if (nVal != -1){
// console.log("getDetailFn")
// this.groupData.shopGroupId = nVal
// this.getDetailFn()
// }else {
// console.log("GroupData -1")
// }
// }
// }
// },
mounted() {
console.log(this.groupId)
// if (this.$route.query.shopGroupId) {
@ -342,14 +384,41 @@ export default {
this.shopTotal = res.data.total
this.shopListData = res.data.list
},
resetGroupId(newGroupId){
this.groupId = newGroupId
if (!this.groupId) {
console.log("new GroupData")
this.groupData = new GroupData()
this.products = []
this.multipleSelection = []
this.imgList=[]
} else if (this.groupId != -1){
console.log("getDetailFn")
this.groupData.shopGroupId = this.groupId
this.getDetailFn()
}else {
console.log("GroupData -1")
}
},
//
getDetailFn() {
commodityListGetById({ shopGroupId: this.groupData.shopGroupId }).then(res => {
if (res.code === '') {
this.groupData.groupDescribe = res.data.groupDescribe
this.groupData.groupName = res.data.groupName
this.initLangInfo(res.data)
this.groupData.groupDescribe_ZH = res.data.groupDescribe_ZH
this.groupData.groupName_ZH = res.data.groupName_ZH
this.groupData.groupDescribe_EN = res.data.groupDescribe_EN
this.groupData.groupName_EN = res.data.groupName_EN
this.groupData.groupImage = res.data.groupImage
this.multipleSelection = res.data.products
this.products = res.data.products
this.imgList=[]
if(this.groupData.groupImage){
let imageItem = {}
imageItem.url = this.groupData.groupImage
imageItem.name = this.groupData.groupImage
this.imgList.push(imageItem)
}
const shopList = []
this.products.forEach(i => {
shopList.push(i.productId)
@ -364,6 +433,23 @@ export default {
}
})
},
initLangInfo(itemData){
if(itemData && itemData.langInfoMap && itemData.langInfoMap['zh']){
itemData.groupName_ZH = itemData.langInfoMap['zh'].groupName;
itemData.groupDescribe_ZH = itemData.langInfoMap['zh'].groupDescribe;
}else{
itemData.groupName_ZH = "";
itemData.groupDescribe_ZH = "";
}
if(itemData && itemData.langInfoMap && itemData.langInfoMap['en']){
itemData.groupName_EN = itemData.langInfoMap['en'].groupName;
itemData.groupDescribe_EN = itemData.langInfoMap['en'].groupDescribe;
}else{
itemData.groupName_EN = "";
itemData.groupDescribe_EN = "";
}
},
manualAdd() {
this.selectGroup = '1'
// this.groupData.conditions = []
@ -385,6 +471,10 @@ export default {
this.formInline.page = val
this.getAll(this.formInline)
},
handleImageSuccess(response) {
const url = response.data.url
this.groupData.groupImage = url
},
intelligentAdd() {
this.selectGroup = '2'
if (this.selectConditions.length === 0) {
@ -461,9 +551,21 @@ export default {
//
addGroup() {
var self = this
if (self.groupData.groupName === '') {
//
self.groupData.langInfoMap = {}
self.groupData.langInfoMap["zh"] = {};
self.groupData.langInfoMap["zh"].groupName = self.groupData.groupName_ZH;
self.groupData.langInfoMap["zh"].groupDescribe = self.groupData.groupDescribe_ZH;
self.groupData.langInfoMap["zh"].languageType = "zh";
self.groupData.langInfoMap["en"] = {};
self.groupData.langInfoMap["en"].groupName = self.groupData.groupName_EN;
self.groupData.langInfoMap["en"].groupDescribe = self.groupData.groupDescribe_EN;
self.groupData.langInfoMap["en"].languageType = "en";
if (self.groupData.groupName_EN === '' && self.groupData.groupName_ZH === '') {
self.$message({
message: '分组名称不能为空',
message: this.$t('product.productgroupname_empty'),
type: 'warning'
})
return false

26
src/views/commodity/commodityList/index.vue

@ -5,12 +5,12 @@
<!-- 搜索 -->
<div class="formSearch">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="分组名称">
<el-input v-model="formInline.search" maxlength="20" placeholder="请输入分组名称" />
<el-form-item :label="$t('product.productgroupname')">
<el-input v-model="formInline.search" maxlength="20" :placeholder="$t('product.productgroupname_hint')" />
</el-form-item>
<el-form-item>
<el-button type="primary" plain @click="search">{{ $t('common.query') }}</el-button>
<el-button type="primary" plain @click="addNewGroup">新增分组</el-button>
<el-button type="primary" plain @click="addNewGroup">{{ $t('product.addproductgroup') }}</el-button>
<!-- <span v-for="(item,index) in btnList" :key="index" class="promissStyle">
<el-button type="success" plain @click="btnClick(item)">{{ item.permissionName }}</el-button>
</span> -->
@ -27,16 +27,16 @@
tooltip-effect="dark"
style="width: 100%"
>
<el-table-column label="分组名称" width="300">
<el-table-column :label="$t('product.productgroupname')" width="300">
<template slot-scope="scope">{{ scope.row.groupName }}</template>
</el-table-column>
<el-table-column label="分组描述" width="300">
<el-table-column :label="$t('product.productgroupdesc')" width="300">
<template slot-scope="scope">{{ scope.row.groupDescribe }}</template>
</el-table-column>
<el-table-column label="商品数量" width="150">
<el-table-column :label="$t('common.product_number')" width="150">
<template slot-scope="scope">{{ scope.row.number }}</template>
</el-table-column>
<el-table-column prop="updateTime" label="修改时间" width="220" />
<el-table-column prop="updateTime" :label="$t('common.edittime')" width="220" />
<el-table-column :label="$t('common.operate')" show-overflow-tooltip>
<template slot-scope="scope">
<div class="btnList">
@ -71,7 +71,7 @@
class="group-dialog"
>
<el-form :model="sizeForm">
<el-form-item label="分组封面" prop="fileLength" />
<el-form-item :label="$t('product.productgroupimage')" prop="fileLength" />
<div class="upload-wrap">
<el-upload
ref="upload"
@ -86,7 +86,7 @@
</el-upload>
</div>
<el-form-item label="分组名称">
<el-form-item :label="$t('product.productgroupname')">
<el-input v-model="params.groupName" maxlength="20" />
</el-form-item>
<el-form-item size="large" class="btn-wrap">
@ -97,16 +97,16 @@
</el-dialog>
<el-dialog
title="活动报名"
:title="!shopGroupId ? $t('product.addproductgroup') : $t('product.editproductgroup')"
:visible.sync="commidyVisible"
width="900px"
center
:close-on-click-modal="false"
>
<CommGroup
:group-id="shopGroupId"
@cancel="commidyVisible = false"
@reload="search"
ref="CommGroup"
/>
</el-dialog>
</div>
@ -207,8 +207,9 @@ export default {
},
//
edit(row) {
this.commidyVisible = true
this.shopGroupId = row.shopGroupId
this.commidyVisible = true
this.$refs.CommGroup?.resetGroupId(this.shopGroupId)
},
async onSubmit() {
if (this.type === 'add') {
@ -274,6 +275,7 @@ export default {
addNewGroup() {
this.shopGroupId = 0
this.commidyVisible = true
this.$refs.CommGroup?.resetGroupId(this.shopGroupId)
}
}
}

Loading…
Cancel
Save