cloud-ui/src/views/product/info/index.vue

691 lines
21 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container">
<el-card class="box-card">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="商品名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入商品名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['product:info:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['product:info:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['product:info:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['product:info:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</el-card>
<el-card>
<i class="el-icon-tickets">商品信息数据列表</i>
</el-card>
<el-card class="box-card">
<el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="60" align="center" />
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="商品名称" align="center" prop="name" />
<el-table-column label="商品描述" align="center" prop="productDesc">
<template slot-scope="scope">
<el-popover
placement="right"
title="商品描述"
width="500"
trigger="click">
<div v-html="scope.row.productDesc"></div>
<el-button slot="reference" type="text">查看</el-button>
</el-popover>
</template>
</el-table-column>
<el-table-column label="商品类型" align="center" prop="type" />
<el-table-column label="冗余字段" align="center" prop="typeIds" />
<el-table-column label="商品主图" align="center" prop="img">
<template slot-scope="scope">
<img :src="scope.row.img" alt="加载失败" width="80px" height="80px"/>
</template>
</el-table-column>
<el-table-column label="商品轮播图" align="center" prop="carouselImages" >
<template slot-scope="scope">
<img :src="scope.row.carouselImages" alt="加载失败" width="80px" height="80px"/>
</template>
</el-table-column>
<el-table-column label="商品评论数" align="center" prop="commentCount" />
<el-table-column label="商品收藏人气" align="center" prop="collectCount" />
<el-table-column label="品牌信息" align="center" prop="brand" />
<el-table-column label="品牌状态" align="center" prop="status">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="上架"
inactive-text="下架"
inactive-value="0"
active-value="1"
@change="updateInfoStatus(scope.row)"
>
</el-switch>
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="搜索关键字" align="center" prop="keywords" />
<el-table-column label="规格信息" align="center" prop="ruleId" />
<el-table-column label="0添加商品信息 1添加规格信息 2添加描述信息" align="center" prop="step"/>
<el-table-column label="商品描述" align="center" prop="productDesc">
<template slot-scope="scope">
<el-popover
placement="right"
title="商品描述"
width="500"
trigger="click">
<div v-html="scope.row.productDesc"></div>
<el-button slot="reference" type="text">查看</el-button>
</el-popover>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['product:info:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['product:info:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改商品信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="60%" append-to-body>
<el-card>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-steps :active="active" finish-status="success">
<el-step title="添加商品信息"> </el-step>
<el-step title="添加规格信息"></el-step>
<el-step title="添加描述信息"></el-step>
</el-steps>
<div v-show="active == 0">
<el-row>
<el-col :span="12">
<div class="grid-content bg-purple">
<el-form-item label="商品名称" prop="name">
<el-input v-model="form.name" placeholder="请输入商品名称" />
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content bg-purple">
<el-form-item label="单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入单位" />
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content bg-purple">
<el-form-item label="品牌信息" prop="brandId">
<el-select v-model="form.brand" placeholder="请选择品牌" clearable>
<el-option v-for="item in brandList" :label="item.name" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content bg-purple">
<el-form-item label="分类" prop="type">
<el-cascader
v-model="form.type"
:options="typeList"
:props="{ expandTrigger: 'hover' ,value:'catId',label:'name',children:'childrenList'}"
@change="handleChange"></el-cascader>
</el-form-item>
</div>
</el-col>
<!-- <el-col :span="12">-->
<!-- <div class="grid-content bg-purple">-->
<!-- <el-form-item label="商品分类" prop="type">-->
<!-- <el-cascader :options="options" v-model="form.type"-->
<!-- :show-all-levels="false"-->
<!-- :props="{ expandTrigger: 'hover' ,value:'catId',label:'name',children:'childrenList'}"-->
<!-- @change="handleChange"></el-cascader>-->
<!-- </el-form-item>-->
<!-- </div>-->
<!-- </el-col>-->
</el-row>
<el-form-item label="商品主图" prop="img">
<image-upload v-model="form.img" placeholder="请输入商品主图" :limit="1" :is-show-tip="false"/>
</el-form-item>
<el-form-item label="商品轮播图" prop="carouselImages">
<image-upload v-model="form.carouselImages" placeholder="请输入内容" :limit="1" :is-show-tip="false"/>
</el-form-item>
</div>
<div v-show="active == 1">
<el-form-item label="规格信息" prop="ruleId">
<el-select v-model="form.rule" placeholder="请选择规格" v-on:change="changeRuleInfoListByRuleId" clearable>
<el-option v-for="item in ruleList" :label="item.name" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item>
<el-form ref="form" :model="skuFormTemplate" label-width="80px">
<el-row>
<el-col :span="5">
<el-form-item label="商品库存">
<el-input-number v-model="skuFormTemplate.stock" :min="1" :max="99999" style="width: 100px" ></el-input-number>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="商品价格">
<el-input-number v-model="skuFormTemplate.price" :min="1" :max="99999" style="width: 100px"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="商品进价">
<el-input-number v-model="skuFormTemplate.purchasePrice":min="1" :max="99999" style="width: 100px"></el-input-number>
</el-form-item>
</el-col>
<el-form-item label="商品售价">
<el-input-number v-model="skuFormTemplate.sellingPrice":min="1" :max="99999" style="width: 100px"></el-input-number>
</el-form-item>
<el-form-item label="规格图片">
<ImageUpload v-model="skuFormTemplate.image" :limit="1"></ImageUpload>
</el-form-item>
<el-col :span="5">
<el-form-item label="编号">
<el-input-number v-model="skuFormTemplate.number":min="1" :max="99999" style="width: 100px"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="重量">
<el-input-number v-model="skuFormTemplate.weight":min="1" :max="99999" style="width: 100px"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="体积">
<el-input-number v-model="skuFormTemplate.volume":min="1" :max="99999" style="width: 100px"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="5">
<el-button type="primary" @click="onSubmit"></el-button>
<el-button type="warning" @click="onClear"></el-button>
</el-col>
</el-row>
</el-form>
<template>
<el-table
:data="tableBodyTemplate"
style="width: 100%">
<el-table-column v-for="column in tableColumnHeaderTemplate" :key="0"
:prop="column.prop"
:label="column.label">
<template slot-scope="scope">
<el-input-number v-if="column.prop.indexOf('image') == -1 && column.prop.indexOf('xxx') == -1"
v-model="scope.row[column.prop]" :min="1" :max="9999999999" label="描述" style="width: 120px" ></el-input-number>
<ImageUpload v-else-if="column.prop.indexOf('image') > -1 " v-model="scope.row[column.prop]" :limit="1" style="width: 120px "></ImageUpload>
<span v-else>{{scope.row[column.prop]}}</span>
</template>
</el-table-column>
</el-table>
</template>
</div>
<div v-show="active==2">
<el-button @click="pc = true; move =false">商品描述</el-button>
<editor v-if="pc" v-model="form.productDesc" :min-height="150"/>
</div>
</el-form>
<el-button style="margin-top: 12px;" @click="step" :disabled="active <1">上一步</el-button>
<el-button style="margin-top: 12px;" @click="next" :disabled="active >= 2">下一步</el-button>
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel"> </el-button>
</el-card>
</el-dialog>
</el-card>
</div>
</template>
<script>
import { listInfo, getInfo, delInfo, addInfo, updateInfo } from "@/api/product/info";
import ImageUpload from "@/components/ImageUpload"
import {listBrand, updateBrand} from "@/api/product/brand"
import { listRule } from "@/api/product/rule"
import { listType } from "@/api/product/type"
export default {
components:{ImageUpload},
name: "Info",
data() {
return {
options: [{
value: '',
label: '',
children: [{
value: '',
label: '',
}]
}],
muliple:true,
//富文本
pc:true,
move:false,
typeList: [],
children: [{}],
tableColumnHeaderTemplate:[],
tableBodyTemplate:[],
active: 0,
rule: [],
ruleAttrList:[],
brandList:[],
ruleList:[],
tableData:[],
MallProductInfoList: [],
stepsMap: {
0: '添加商品信息',
1: '添加规格信息',
2: '添加描述信息',
},
skuFormTemplate:{
'stock': '0',
'price': '0',
purchasePrice: '0',
sellingPrice: '0',
image: '',
number: '0',
weight: '0',
volume: '0'},
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
brandName: null,
ruleName: null,
// 商品信息表格数据
infoList: [],
//商品品牌名称
name: null,
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
name: null,
step: null
},
// 表单参数
form: {},
// 表单校验
rules: {
// brandId: [
// { required: true, message: "商品品牌不能为空", trigger: "blur" }
// ]
}
};
},
created() {
this.getList();
this.initBrandListInfo();
this.initRuleListInfo();
this.initTypeListInfo();
},
methods: {
handleChange(){
},
updateInfoStatus(params) {
const {id, status} = params
this.updateInfoById({id, status})
},
onSubmit() {
this.settingsOrnClear(true)
},
onClear() {
this.settingsOrnClear();
},
settingsOrnClear(flag){
for (let skuFormTemplateKey in this.skuFormTemplate) {
this.tableBodyTemplate.forEach(item=>{
for (let itemKey in item) {
if(skuFormTemplateKey===itemKey){
if(flag){
item[itemKey]=this.skuFormTemplate[skuFormTemplateKey]
}else{
item[itemKey]=''
}
}
}
});
}
},
changeRuleInfoListByRuleId(object) {
this.tableColumnHeaderTemplate = [];
this.tableBodyTemplate = [];
let ruleInfo = this.ruleList.find(item => object == item.id);
if (!ruleInfo) {
return;
}
let ruleAttrJson;
try {
ruleAttrJson = JSON.parse(ruleInfo.ruleAttr);
} catch (error) {
console.error('Error parsing ruleAttr JSON:', error);
return;
}
ruleAttrJson.forEach((ruleAttr, index) => {
this.tableColumnHeaderTemplate.push({'prop': `xxx${index}`, 'label': ruleAttr.ruleType});
});
const cartesian = (ruleAttrJson, index, current) => {
if (index === ruleAttrJson.length) {
this.tableBodyTemplate.push({...current});
return;
}
for (let i = 0; i < ruleAttrJson[index].ruleAttrList.length; i++) {
const updatedCurrent = {...current}; // Create a copy of current object
updatedCurrent[`xxx${index}`] = ruleAttrJson[index].ruleAttrList[i];
current['image'] = '';
cartesian(ruleAttrJson, index + 1, updatedCurrent);
}
};
cartesian(ruleAttrJson, 0, {});
this.tableColumnHeaderTemplate.push(
{prop:'stock',label:'商品库存'},
{prop:'price',label:'商品价格'},
{prop:'purchasePrice',label:'商品进价'},
{prop:'sellingPrice',label:'商品售价'},
{prop:'image',label:'商品图片'},
{prop:'number',label:'编号'},
{prop:'weight',label:'重量'},
{prop:'volume',label:'体积'},
)
},
/** 查询商品类型**/
initTypeListInfo() {
let prams = {
status : 0
};
listType(prams).then(res => {
if(200 == res.code){
this.typeList = res.data.list;
}
});
},
/**查询商品规格**/
initRuleListInfo() {
let params = {
status: 0
};
listRule(params).then(res =>{
if(200 == res.code){
this.ruleList = res.data.list;
}
});
},
/**查询品牌表**/
initBrandListInfo() {
let params = {
status: 0
};
listBrand(params).then(res =>{
if(200 == res.code){
this.brandList = res.data.list;
}
});
},
// 上一步
step() {
this.active--;
},
// 下一步
next() {
this.active++;
},
/** 查询商品信息列表 */
getList() {
this.loading = true;
listInfo(this.queryParams).then(response => {
let productInfoList = response.data.list;
productInfoList.forEach(item => {
let num = item.step;
item.step = this.switchStepByNum(num)
})
this.infoList = productInfoList;
this.total = response.data.total;
this.loading = false;
});
},
// 根据num切换step
switchStepByNum(num) {
if (num == null || num == '' || num == undefined) {
this.$modal.msgError("num is NULL");
return;
}
for (let stepsMapKey in this.stepsMap) {
if (num == stepsMapKey) {
return this.stepsMap[stepsMapKey];
}
}
},
// * 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
id: null,
name: null,
productDesc: null,
type: null,
typeIds: null,
img: null,
carouselImages: null,
commentCount: null,
collectCount: null,
brand: null,
status: null,
unit: null,
keywords: null,
ruleId: null,
brandId: null,
revision: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
step: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加商品信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getInfo(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改商品信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
this.updateInfoById(this.form)
} else {
addInfo(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
updateInfoById(data) {
updateInfo(data).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除商品信息编号为"' + ids + '"的数据项?').then(function() {
return delInfo(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('product/info/export', {
...this.queryParams
}, `info_${new Date().getTime()}.xlsx`)
}
}
};
</script>