商品管理

master
xiaoning 17 hours ago
parent 7ece66f7a6
commit 6bdd800fd4

@ -10,6 +10,14 @@ export function listPmsProduct(query, pageReq) {
})
}
export function listCourseForProduct(query, pageReq) {
return request({
url: '/pms/product/courseList',
method: 'post',
data: query,
params: pageReq
})
}
// 查询商品信息详细
export function getPmsProduct(id) {
return request({

@ -110,7 +110,7 @@ export function updateUserPwd(oldPassword, newPassword) {
// 用户头像上传
export function uploadAvatar(data) {
return request({
url: '/system/user/profile/avatar',
url:process.env.VUE_APP_BASE_API + '/com/productImage/upload',
method: 'post',
data: data
})

@ -77,7 +77,7 @@ export default {
dialogVisible: false,
hideUpload: false,
baseUrl: process.env.VUE_APP_BASE_API,
uploadImgUrl: process.env.VUE_APP_BASE_API + "/oss/upload", //
uploadImgUrl: process.env.VUE_APP_BASE_API + "/com/productImage/upload", //
headers: {
Authorization: "Bearer " + getToken(),
},
@ -123,7 +123,8 @@ export default {
},
//
handleUploadSuccess(res) {
this.uploadList.push({ name: res.fileName, url: res.url });
this.uploadList.push({url: res.data.originUrl });
if (this.uploadList.length === this.number) {
this.fileList = this.fileList.concat(this.uploadList);
this.uploadList = [];
@ -182,8 +183,10 @@ export default {
let strs = "";
separator = separator || ",";
for (let i in list) {
strs += list[i].url.replace(this.baseUrl, "") + separator;
strs += list[i].url + separator;//.replace(this.baseUrl, "")
console.log(strs)
}
return strs != '' ? strs.substr(0, strs.length - 1) : '';
}
}

@ -109,9 +109,11 @@ export default {
const validatePass = (rule, value, callback) => {
if (value === undefined || value === '') {
callback(new Error('请输入密码'))
} else if (!isPass(value)) {
callback(new Error('最少6位,包含大小写字母和特殊字符'))
} else {
}
// else if (!isPass(value)) {
// callback(new Error('6,'))
// }
else {
if (this.form.checkPass !== '' && this.form.checkPass !== undefined) {
this.$refs.form.validateField('checkPass')
}
@ -250,7 +252,7 @@ export default {
this.open = false
this.$emit('ok')
} else {
this.msgError(response.respMsg)
this.msgError(response.message)
}
}).catch(() => {
this.loadingChange = false
@ -265,7 +267,7 @@ export default {
this.open = false
this.$emit('ok')
} else {
this.msgError(response.respMsg)
this.msgError(response.message)
}
}).catch(() => {
this.loadingChange = false

@ -2,5 +2,6 @@ export const dict_types = ["sys_user_sex",
"sys_show_hide", "sys_normal_disable", "sys_job_status", "sys_job_group", "sys_yes_no", "sys_notice_type", "sys_notice_status",
"sys_oper_type", "sys_common_status", "wms_item_type", "wms_carrier_level", "wms_supplier_level", "wms_receipt_type", "wms_receipt_status",
"wms_shipment_type", "wms_shipment_status", "wms_movement_type", "wms_movement_status",'coupon_use_scope','coupon_exchange_type','activity_coupon_status',
"pms_publish_status", 'sku_sort_list', 'sys_show_status','oms_pay_type','oms_order_status','oms_aftersale_status','oms_aftersale_type'
"pms_publish_status", 'sku_sort_list',
'sys_show_status','oms_pay_type','oms_order_status','oms_aftersale_status','oms_aftersale_type',"pms_is_course"
];

@ -162,20 +162,20 @@ export const dynamicRoutes = [
}
]
},
// {
// path: '/product',
// component: Layout,
// hidden: true,
// permissions: ['pms:product:list'],
// children: [
// {
// path: 'edit',
// component: () => import('@/views/pms/product/AddProduct'),
// name: 'addProduct',
// meta: { title: '编辑商品' }
// }
// ]
// },
{
path: '/product',
component: Layout,
hidden: true,
permissions: ['pms:product:list'],
children: [
{
path: 'edit',
component: () => import('@/views/mall/product/AddProduct'),
name: 'addProduct',
meta: { title: '编辑商品' }
}
]
},
// {
// path: '/order',
// component: Layout,

@ -55,7 +55,8 @@ const user = {
return new Promise((resolve, reject) => {
getInfo().then(res => {
const user = res.user
const avatar = require("@/assets/images/profile.jpg") ;
// const avatar = require("@/assets/images/profile.jpg") ;
const avatar = res.user.avatar;
if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
commit('SET_ROLES', res.roles)
commit('SET_PERMISSIONS', res.permissions)

@ -46,7 +46,7 @@ export default {
},
recurs(list){
list.forEach(it => {
it.label = it.name
it.label = it.typeName
it.value = it.id
if(it.children){
this.recurs(it.children)

@ -0,0 +1,283 @@
<template>
<div class="app-container">
<el-card style="margin: 20px 20px; font-size: 14px">
<div class="first"><img alt="" :src="avatar" style="width: 50px; height: 50px; float:left; margin-right:10px;border-radius:50%" />
<p style="font-size:16px;margin-bottom:8px">{{name}}{{hello}}</p>
<p style="font-size:12px;color:rgb(185, 181, 189)">今天是{{nowTime}}</p>
</div>
<div class="first">
</div>
</el-card>
<el-row class="pl20 pr20" :gutter="10">
<el-col :span="9">
<el-card shadow="always" style="padding-bottom: 30px">
<div slot="header"><span>售后</span></div>
<ul style="margin-top: 10px">
<li class="li" style="width: 50%">待处理
</li>
<li class="li" style="width: 50%">处理中
</li>
</ul>
<ul>
<li class="da" style="width: 50%">
<router-link :to="{path:'/order/aftersale', query:{status:0}}">{{ orderAndAftersaleStatisticsObj.pendingAftersaleCount }}</router-link>
</li>
<li class="da" style="width: 50%">
<router-link :to="{path:'/order/aftersale', query:{status:1}}">{{ orderAndAftersaleStatisticsObj.processingAftersaleCount }}</router-link>
</li>
</ul>
</el-card>
</el-col>
<el-col :span="15">
<el-card shadow="always" style="padding-bottom: 30px">
<div slot="header"><span>订单</span></div>
<div>
<ul style="margin-top: 10px">
<li class="li">未发订单数
</li>
<li class="li">今日订单数
</li>
<li class="li">今日成交额
</li>
<li class="li">今日发货数
</li>
</ul>
<ul>
<li class="da">
<router-link :to="{path:'/order/order',query:{status:1}}">{{ orderAndAftersaleStatisticsObj.waitDeliveredCount }}</router-link>
</li>
<li class="da">
<router-link :to="{path:'/order/order',query:{today:true}}">{{ orderAndAftersaleStatisticsObj.todayOrderCount }}</router-link>
</li>
<li class="da">
<router-link :to="{path:'/order/order',query:{today:true,status:1}}">{{ orderAndAftersaleStatisticsObj.todayTransactionAmount }}</router-link>
</li>
<li class="da">
<router-link :to="{path:'/order/order',query:{today:true, status: 2}}">{{ orderAndAftersaleStatisticsObj.todayHasDeliveredCount }}</router-link>
</li>
</ul>
</div>
</el-card>
</el-col>
</el-row>
<el-row class="pl20 pr20" :gutter="10">
<el-col :span="24">
<order-line-chart></order-line-chart>
<div class="card transform">
<top-product></top-product>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import {str2Date} from '@/utils/date';
import PanelGroup from '@/views/components/PanelGroup'
import {mapGetters} from 'vuex'
import OrderLineChart from "@/views/dashboard/OrderLineChart.vue";
import TopProduct from "@/views/components/IndexOrderPanelGroup/TopProduct.vue";
import {orderAndAftersaleStatistics} from "@/api/statistics";
const DATA_FROM_BACKEND = {
columns: ['date', 'orderCount','orderAmount'],
rows: [
{date: '2018-11-01', orderCount: 10, orderAmount: 1093},
{date: '2018-11-02', orderCount: 20, orderAmount: 2230},
{date: '2018-11-03', orderCount: 33, orderAmount: 3623},
{date: '2018-11-04', orderCount: 50, orderAmount: 6423},
{date: '2018-11-05', orderCount: 80, orderAmount: 8492},
{date: '2018-11-06', orderCount: 60, orderAmount: 6293},
{date: '2018-11-07', orderCount: 20, orderAmount: 2293},
{date: '2018-11-08', orderCount: 60, orderAmount: 6293},
{date: '2018-11-09', orderCount: 50, orderAmount: 5293},
{date: '2018-11-10', orderCount: 30, orderAmount: 3293},
{date: '2018-11-11', orderCount: 20, orderAmount: 2293},
{date: '2018-11-12', orderCount: 80, orderAmount: 8293},
{date: '2018-11-13', orderCount: 100, orderAmount: 10293},
{date: '2018-11-14', orderCount: 10, orderAmount: 1293},
{date: '2018-11-15', orderCount: 40, orderAmount: 4293}
]
};
export default {
components: {
PanelGroup,
OrderLineChart,
TopProduct
},
data() {
return {
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date();
let start = new Date();
start.setFullYear(2018);
start.setMonth(10);
start.setDate(1);
end.setTime(start.getTime() + 3600 * 1000 * 24 * 7);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近一月',
onClick(picker) {
const end = new Date();
let start = new Date();
start.setFullYear(2018);
start.setMonth(10);
start.setDate(1);
end.setTime(start.getTime() + 3600 * 1000 * 24 * 30);
picker.$emit('pick', [start, end]);
}
}]
},
orderCountDate: '',
chartSettings: {
xAxisType: 'time',
area:true,
axisSite: { right: ['orderAmount']},
labelMap: {'orderCount': '订单数量', 'orderAmount': '订单金额'}},
chartData: {
columns: [],
rows: []
},
loading: false,
dataEmpty: false,
nowTime: '',
hello: '',
orderAndAftersaleStatisticsObj: {
pendingAftersaleCount: 0,
processingAftersaleCount: 0,
waitDeliveredCount: 0,
todayHasDeliveredCount: 0,
todayOrderCount: 0,
todayTransactionAmount: 0
}
}
},
computed: {
...mapGetters(['avatar', 'name'])
},
created() {
this.showTimes()
this.helloTimes()
this.orderAndAftersaleStat()
this.initOrderCountDate()
this.getData()
},
methods: {
handleDateChange() {
this.getData();
},
initOrderCountDate() {
let start = new Date();
start.setFullYear(2018, 10, 1);
const end = new Date();
end.setTime(start.getTime() + 1000 * 60 * 60 * 24 * 7);
this.orderCountDate = [start, end];
},
getData(){
setTimeout(() => {
this.chartData = {
columns: ['date', 'orderCount','orderAmount'],
rows: []
};
for(let i=0;i<DATA_FROM_BACKEND.rows.length;i++){
let item=DATA_FROM_BACKEND.rows[i];
let currDate=str2Date(item.date);
let start=this.orderCountDate[0];
let end=this.orderCountDate[1];
if(currDate.getTime()>=start.getTime()&&currDate.getTime()<=end.getTime()){
this.chartData.rows.push(item);
}
}
this.dataEmpty = false;
this.loading = false
}, 1000)
},
timeFormate(timeStamp) {
let year = new Date(timeStamp).getFullYear()
let month =
new Date(timeStamp).getMonth() + 1 < 10
? '0' + (new Date(timeStamp).getMonth() + 1)
: new Date(timeStamp).getMonth() + 1
let date =
new Date(timeStamp).getDate() < 10
? '0' + new Date(timeStamp).getDate()
: new Date(timeStamp).getDate()
let hh =
new Date(timeStamp).getHours() < 10
? '0' + new Date(timeStamp).getHours()
: new Date(timeStamp).getHours()
let mm =
new Date(timeStamp).getMinutes() < 10
? '0' + new Date(timeStamp).getMinutes()
: new Date(timeStamp).getMinutes()
let ss =
new Date(timeStamp).getSeconds() < 10
? '0' + new Date(timeStamp).getSeconds()
: new Date(timeStamp).getSeconds()
let week = new Date(timeStamp).getDay()
let weeks = ['日', '一', '二', '三', '四', '五', '六']
let getWeek = '星期' + weeks[week]
this.nowTime =
year +
'年' +
month +
'月' +
date +
'日' +
' ' +
getWeek
},
showTimes() {
this.timeFormate(new Date())
},
helloTimes() {
let hh = new Date().getHours()
if (0 < hh < 12) {
this.hello = '上午好'
} else if (hh < 18) {
this.hello = '下午好'
} else {
this.hello = '晚上好'
}
},
orderAndAftersaleStat(){
orderAndAftersaleStatistics().then((response) => {
this.orderAndAftersaleStatisticsObj = response
})
}
}
}
</script>
<style scoped lang="stylus">
.app-container
.li {
float: left;
width: 25%;
font-size: 12px;
color: rgb(185, 181, 189);
}
.da {
float: left;
width: 25%;
font-size: 20px;
}
.first {
float: left;
width: 50%;
margin-bottom: 20px;
}
.el-table .warning-row {
background: rgb(39, 138, 230);
}
</style>

@ -0,0 +1,257 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="状态" prop="showStatus">
<DictRadio v-model="queryParams.showStatus" @change="handleQuery" size="small"
:radioData="dict.type.sys_normal_disable" :showAll="'all'"/>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input
v-model="queryParams.nameLike"
placeholder="名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item class="flex_one tr">
<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"
>新增</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="pmsBrandList" @selection-change="handleSelectionChange" border>
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="品牌logo" prop="logo">
<template slot-scope="{ row }">
<el-image v-if="row.logo" :src="row.logo" :preview-src-list="[row.logo]" class="small-img circle-img"/>
</template>
</el-table-column>
<el-table-column label="名称" prop="name"/>
<el-table-column label="排序" prop="sort"/>
<el-table-column label="状态" prop="showStatus">
<template slot-scope="{ row }">
<dict-tag :value="row.showStatus" prop-name="sys_normal_disable"/>
</template>
</el-table-column>
<el-table-column label="操作" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<InBody v-show="total>0">
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</InBody>
<!-- 添加或修改品牌管理对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-one">
<el-form-item label="状态">
<DictRadio v-model="form.showStatus" size="small"
:radioData="dict.type.sys_normal_disable"/>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="名称" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="logo" prop="logo">
<oss-image-upload v-model="form.logo" :limit="1" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {addPmsBrand, delPmsBrand, exportPmsBrand, getPmsBrand, listPmsBrand, updatePmsBrand} from "@/api/pms/brand";
export default {
name: "PmsBrand",
dicts: ['sys_normal_disable'],
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
pmsBrandList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
nameLike: null,
sort: null,
showStatus: null,
},
//
form: {},
//
rules: {
},
};
},
created() {
this.getList();
},
methods: {
/** 查询品牌管理列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listPmsBrand(query, pageReq).then(response => {
const { content, totalElements } = response
this.pmsBrandList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
name: null,
sort: null,
showStatus: 0,
logo: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: 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
getPmsBrand(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改品牌";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updatePmsBrand(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addPmsBrand(this.form).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 delPmsBrand(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有品牌管理数据项?').then(() => {
this.exportLoading = true;
return exportPmsBrand(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {});
}
}
};
</script>

@ -0,0 +1,376 @@
<template>
<div class="add-product-wrapper">
<el-form label-width="108px" :model="form" ref="form" :rules="rules">
<el-card style="margin: 20px 20px; font-size: 14px">
<div slot="header">
<span>基本信息</span>
</div>
<el-row>
<el-form-item label="是否为课程">
<DictRadio v-model="form.isCourse" size="small"
:radioData="dict.type.pms_is_course" @change="findCourse"/>
</el-form-item>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="商品名称" prop="name">
<el-input v-model="form.name" placeholder="请输入商品名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="商品编码" prop="outProductId">
<el-input v-model="form.outProductId" placeholder="请输入商品编码"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="品牌" prop="brandId">
<brand-select v-model="form.brandId" @change="onBrandChange"></brand-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="分类" prop="categoryId">
<product-category-select v-model="form.categoryId" @change="categoryChange"></product-category-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="价格" prop="price">
<el-input v-model="form.price" placeholder="请输入PRICE"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入单位"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="商品重量" prop="weight">
<el-input v-model="form.weight" placeholder="商品重量,默认为克"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="上架状态">
<DictRadio v-model="form.publishStatus" size="small"
:radioData="dict.type.pms_publish_status"/>
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card style="margin: 20px 20px; font-size: 14px">
<div slot="header">
<span>产品图片</span>
</div>
<el-form-item label="主图" prop="pic">
<oss-image-upload v-model="form.pic" :limit="1"></oss-image-upload>
</el-form-item>
<el-form-item label="轮播图" prop="albumPics">
<oss-image-upload v-model="albumPics" :limit="5"></oss-image-upload>
</el-form-item>
</el-card>
<el-card style="margin: 20px 20px; font-size: 14px">
<div slot="header">
<span>产品规格</span>
</div>
<el-form-item label="规格类型">
<div class="sku-wrapper">
<div class="sku_sorts">
<div class="sku_sort" v-for="(s, idx0) in productAttr" :key="s.name">
<div class="label flex-center">
<div class="flex-one">
<dict-select v-model="s.name" prop-name="sku_sort_list" value-prop="label"></dict-select>
</div><a class="red" @click="deleteSkuSort(idx0)"></a>
</div>
<div class="values" v-if="s.name">
<div class="value" v-for="(it2, idx1) in s.options" :key="idx1">
<el-input :value="it2.name" @input="changeName(s, idx1, $event)" placeholder="请输入规格名称"></el-input><a class="red no-break ml8" v-if="idx1 < s.options.length - 1 || (s.options.length === maxOptionNum &amp;&amp; idx1 === 3)" @click="deleteOption(s, idx1)"></a>
</div>
</div>
</div>
</div>
<el-button v-if="productAttr.length < 2" @click="addSkuSort">+</el-button>
</div>
</el-form-item>
<el-form-item label="规格信息">
<el-button @click="refreshSku()" class="mb20">刷新列表</el-button>
<el-table :data="form.skuList" :max-height="400">
<el-table-column v-for="s in skuAttr" :label="s.name" :key="s.name" :prop="s.name"></el-table-column>
<el-table-column label="展示图片">
<template v-slot="{ row }">
<oss-image-upload class="img-upload-mini" v-model="row.pic" :limit="1" :is-show-tip="false"></oss-image-upload>
</template>
</el-table-column>
<el-table-column label="销售价格" >
<template v-slot="{ row,$index }">
<el-form-item
:rules="{ required: true, message: '请填写价格', trigger: 'blur' }"
:prop="'skuList['+$index+'].price'">
<el-input v-model="row.price"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="库存">
<template v-slot="{ row, $index }">
<el-input v-model="row.stock" type="number"></el-input>
</template>
</el-table-column>
<el-table-column label="编码">
<template v-slot="{ row }">
<el-form-item>
<el-input v-model="row.outSkuId"></el-input>
<el-input v-model="row.spData" v-show="false"></el-input>
</el-form-item>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-card>
<el-card style="margin: 20px 20px; font-size: 14px">
<div slot="header">
<span>详情页</span>
</div>
<el-form-item label="移动端" prop="detailMobileHtml">
<Editor v-model="form.detailMobileHtml" placeholder="请输入内容" type="url"></Editor>
</el-form-item>
</el-card>
<div class="tc">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-form>
<CourseSelect ref="courseSelect"/>
</div>
</template>
<script>
import {addPmsProduct, getPmsProduct, updatePmsProduct} from "@/api/pms/product";
import ProductCategorySelect from "@/views/components/ProductCategorySelect.vue";
import BrandSelect from "@/views/components/BrandSelect.vue";
import CourseSelect from "@/views/mall/product/courseSelect";
export default {
name: "AddProduct",
dicts: ['pms_publish_status','pms_is_course'],
components: {BrandSelect, ProductCategorySelect,CourseSelect},
data() {
return {
rules: {
name: [
{ required: true, message: '请输入商品名称', trigger: 'blur' },
],
},
form: {
publishStatus: 0,
sort: 1000,
isCourse:'0',
},
skuAttr:[],
albumPics:null,
productAttr: [
{
name: '颜色',
options: [
{name: '红'},
{name: null}
]
}
],
maxOptionNum: 44
}
},
created() {
const {id} = this.$route.query
if (id) {
this.getInfo(id);
}
},
methods: {
findCourse(){
if (this.form.isCourse=='1'){
this.$refs.courseSelect.chooseCourseObj.open = true
}
},
refreshSku(){
let skus = [];
let skuMap = new Map()
this.skuAttr=[...this.productAttr]
if(this.form.skuList){
this.form.skuList.forEach(sku=>{
skuMap.set(sku.spData,sku)
})
}
this.productAttr.forEach((attr, index) => {
const attrSku = [];
attr.options.forEach((option) => {
if (!option.name) {
return
}
if (index === 0) {
attrSku.push({[attr.name]: option.name});
} else {
skus.forEach(it3 => {
attrSku.push({...it3, [attr.name]: option.name })
})
}
})
skus = attrSku;
})
skus.forEach(it => {
if(it){
it.spData=JSON.stringify(it)
}
})
skus.forEach(it => {
let sku = skuMap.get(it.spData);
if(sku){
it.outSkuId = sku.outSkuId;
it.price = sku.price;
it.pic = sku.pic;
it.stock = sku.stock;
it.id = sku.id
}else{
it.outSkuId = null;
it.price = null;
it.pic = null;
it.stock = null;
it.id = null
}
})
this.form.productAttr = JSON.stringify(this.productAttr)
this.form.skuList= skus
},
categoryChange(value){
if(Array.isArray(value)){
console.log(value.toString())
this.form.productCategoryName=value.toString()
}else{
this.form.productCategoryName=null
}
},
onBrandChange(value){
this.form.brandName = value
},
getInfo(id) {
getPmsProduct(id).then(response => {
const {albumPics } = response
if (albumPics) {
this.albumPics = albumPics.split(',')
}
this.form = response;
if(this.form.productAttr){
this.productAttr =JSON.parse(this.form.productAttr)
}
this.refreshSku()
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if(this.albumPics){
this.form.albumPics = this.albumPics.toString()
}
if(this.form.categoryId && Array.isArray(this.form.categoryId)){
this.form.categoryId = this.form.categoryId.pop()
}
//sku
if (!this.form.price){
this.form.price = Math.min.apply(Math, this.form.skuList.map(it => it.price))
}
if (this.form.id != null) {
updatePmsProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
});
} else {
addPmsProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
});
}
this.cancel();
}else{
if(this.form.name){
this.$alert('请填写规格价格', '提示', {
confirmButtonText: '确定',
});
}else{
this.$alert('请填写商品名称', '提示', {
confirmButtonText: '确定',
});
}
}
});
},
cancel() {
this.$tab.closeOpenPage({ path: '/pms/product' })
},
changeName(s, idx, val) {
s.options[idx].name = val;
if (s.options.length - 1 !== idx || s.options.length >= this.maxOptionNum) {
return
}
s.options.push({name: null})
},
addSkuSort() {
this.productAttr.push({
name: null,
options: [{name: null}]
})
},
deleteSkuSort(idx) {
this.productAttr.splice(idx);
},
deleteOption(s, idx) {
s.options.splice(idx, 1);
}
}
}
</script>
<style lang="stylus">
.add-product-wrapper
padding 12px
.content
margin 0 auto
width 75%
min-width 800px
.sku-wrapper
background-color #f7f8fa
padding 12px
.sku_sorts
.sku_sort
background-color white
margin-bottom 12px
.label
padding 8px
.values
padding 8px 0 0 8px
border-top 1px solid $border-color
display flex
flex-wrap wrap
.value
padding 0 32px 8px 0
width 200px!important
display flex
align-items center
.img-upload-mini .el-upload--picture-card
width: 48px;
height: 48px;
line-height: 57px;
</style>

@ -0,0 +1,133 @@
<template>
<el-dialog :title="chooseCourseObj.title" :visible.sync="chooseCourseObj.open" :width="chooseCourseObj.width" append-to-body>
<el-form ref="auditForm" inline :model="chooseCourseObj.queryParams" label-width="80px">
<el-form-item label="课程名称" prop="courseName">
<el-input
size="small"
placeholder="请输入课程名称"
v-model="chooseCourseObj.queryParams.courseName"
clearable
/>
</el-form-item>
<el-form-item label="课程分类" prop="courseTypeId">
<product-category-select v-model="chooseCourseObj.queryParams.courseTypeId"></product-category-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="getCourseList"></el-button>
</el-form-item>
</el-form>
<el-table class="mt20" :data="chooseCourseObj.list" ref="table" v-loading="chooseCourseObj.loading" max-height="500" border
row-key="id" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"/>
<el-table-column label="课程名称" prop="courseName">
<template v-slot="{row}">
<div class="flex-center">
<el-image v-if="row.pic" :src="row.pic" :preview-src-list="[row.pic]" class="small-img circle-img"/>
<span class="ml5">{{ row.name }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="课程类型" prop="courseTypeName"/>
<el-table-column label="课程状态" prop="sale"/>
<el-table-column label="授课模式" prop="teachingMode"/>
<el-table-column label="创建时间" prop="createTime"/>
</el-table>
<pagination
v-show="chooseCourseObj.total>0"
:total="chooseCourseObj.total"
:page.sync="chooseCourseObj.queryParams.pageNum"
:limit.sync="chooseCourseObj.queryParams.pageSize"
@pagination="getCourseList"
/>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="chooseCourseObj.open=false"> </el-button>
</div>
</el-dialog>
</template>
<script>
import ProductCategorySelect from "@/views/components/ProductCategorySelect.vue";
import {listCourseForProduct} from "@/api/pms/product";
export default {
components: {ProductCategorySelect},
name: "CourseSelect",
data() {
return {
selectCourseIds: [],
selectProducts: [],
chooseCourseObj: {
loading: false,
open: false,
title: "选择课程",
list: [],
width: '60%',
queryParams: {
pageNum: 1,
pageSize: 10,
sale:'1',
courseTypeId: null,
courseName: null
},
total: 0
}
}
},
methods: {
submitForm() {
this.$emit('onComplete', this.selectProducts)
this.chooseCourseObj.open = false
},
async init(chooseProductId) {
this.chooseCourseObj.queryParams.excludeProductIds = chooseProductId;
this.chooseCourseObj.queryParams.pageNum = 1;
await this.getCourseList();
this.chooseCourseObj.open = true
this.$nextTick(()=>{
this.$refs.table.clearSelection()
})
},
judge() {
this.$nextTick(()=>{
this.chooseCourseObj.list.forEach(ele => {
if (this.selectProducts.some(item => item.id === ele.id)) {
this.$refs.table.toggleRowSelection(ele, true)
} else {
this.$refs.table.toggleRowSelection(ele, false)
}
});
})
},
handleSelectionChange(selection) {
this.selectProducts = selection
},
async getCourseList() {
this.chooseCourseObj.loading = true;
const query = {...this.chooseCourseObj.queryParams, pageNum: undefined, pageSize: undefined};
if (query.categoryId && Array.isArray(query.categoryId)) {
query.categoryId = query.categoryId.pop()
}
const {pageNum, pageSize} = this.chooseCourseObj.queryParams;
const pageReq = {page: pageNum - 1, size: pageSize};
await listCourseForProduct(query, pageReq).then(response => {
const {content, totalElements} = response
this.chooseCourseObj.list = [...content];
this.chooseCourseObj.total = totalElements;
this.chooseCourseObj.loading = false;
});
},
}
}
</script>
<style lang="stylus">
.line
display flex
align-items center
margin-bottom: 5px;
border-bottom 1px dashed #ccc
.line:last-child
border-bottom 0 !important
margin-bottom 0 !important
</style>

@ -0,0 +1,251 @@
<template>
<div class="app-container">
<div v-show="show">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="" prop="isCourse">
<DictRadio v-model="queryParams.isCourse" @change="handleQuery" size="small"
:radioData="isCourses"/>
</el-form-item>
<el-form-item label="上架状态" prop="publishStatus">
<DictRadio v-model="queryParams.publishStatus" @change="handleQuery" size="small"
:radioData="dict.type.pms_publish_status" :showAll="'all'"/>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input
v-model="queryParams.nameLike"
placeholder="请输入商品名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="品牌" prop="brandName">
<el-input
v-model="queryParams.brandNameLike"
placeholder="请输入品牌名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分类" prop="productCategoryName">
<el-input
v-model="queryParams.productCategoryNameLike"
placeholder="请输入分类名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="编码" prop="outProductId">
<el-input
v-model="queryParams.outProductId"
placeholder="请输入商品编码"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item class="flex_one tr">
<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"
>新增</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="pmsProductList" @selection-change="handleSelectionChange" border>
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="主图" prop="pic">
<template slot-scope="{ row }">
<el-image v-if="row.pic" :src="row.pic" :preview-src-list="[row.pic]" class="small-img"/>
</template>
</el-table-column>
<el-table-column label="名称/编码" min-width="200" prop="outProductId">
<template slot-scope="{ row }">
<div>名称{{ row.name }} </div>
<div v-if="row.outProductId">{{ row.outProductId }}</div>
</template>
</el-table-column>
<el-table-column label="品牌/分类" prop="brandName">
<template slot-scope="{ row }">
<div v-if="row.brandName">{{ row.brandName }}</div>
<div v-if="row.productCategoryName">{{ row.productCategoryName }}</div>
</template>
</el-table-column>
<el-table-column label="价格/排序" prop="price">
<template slot-scope="{ row }">
<div v-if="row.price">{{ row.price }}</div>
<div v-if="row.sort">{{ row.sort }}</div>
</template>
</el-table-column>
<el-table-column label="上架状态/商品课程" prop="">
<template slot-scope="{ row }">
<dict-tag :value="row.publishStatus" prop-name="pms_publish_status"/>
&nbsp;&nbsp;
<dict-tag :value="row.isCourse" prop-name="pms_is_course" />
</template>
</el-table-column>
<el-table-column label="操作" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<InBody v-show="total>0">
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</InBody>
</div>
</div>
</template>
<script>
import {delPmsProduct, listPmsProduct} from "@/api/pms/product";
import {mapGetters} from "vuex";
export default {
name: "PmsProduct",
dicts: ['pms_publish_status','pms_is_course'],
data() {
return {
show: true,
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
pmsProductList: [],
isCourses:[{
value: '0',
label: '商品'
}, {
value: '1',
label: '课程'
}],
//
queryParams: {
pageNum: 1,
pageSize: 10,
brandId: null,
categoryId: null,
outProductId: null,
name: null,
pic: null,
albumPics: null,
publishStatus: null,
sort: null,
price: null,
unit: null,
weight: null,
detailHtml: null,
detailMobileHtml: null,
brandName: null,
productCategoryName: null,
isCourse:null,
},
};
},
created() {
this.getList();
},
computed:{
...mapGetters(['userId']),
},
methods: {
productSelect(){
this.open=true
// this.$router.push({ path: '/product/getCourseList' });
},
/** 查询商品信息列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listPmsProduct(query, pageReq).then(response => {
const { content, totalElements } = response
this.pmsProductList = content;
this.total = totalElements;
this.loading = false;
});
},
/** 搜索按钮操作 */
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.$router.push({ path: '/product/edit' });
},
/** 修改按钮操作 */
handleUpdate(row) {
this.$router.push({ path: '/product/edit', query: { id: row.id } });
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除商品信息编号为"' + ids + '"的数据项?').then(function() {
return delPmsProduct(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
}
};
</script>

@ -0,0 +1,320 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
:inline="true"
v-show="showSearch"
label-width="100px"
size="medium"
class="ry_form"
>
<el-form-item label="状态" prop="showStatus">
<DictRadio
v-model="queryParams.showStatus"
@change="handleQuery"
size="small"
:radioData="dict.type.sys_show_status"
:showAll="'all'"
/>
</el-form-item>
<el-form-item label="名称" prop="typeName">
<el-input
v-model="queryParams.nameLike"
placeholder="名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item class="flex_one tr">
<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"
>新增
</el-button>
</el-col>
</el-row>
<el-table
v-loading="loading"
:data="pmsProductCategoryList"
border
:tree-props="{ hasChildren: 'hasChildren', children: 'children' }"
@selection-change="handleSelectionChange"
row-key="id"
>
<el-table-column label="名称" prop="typeName" />
<el-table-column label="图片" prop="icon">
<template slot-scope="{ row }">
<el-image
v-if="row.icon"
:src="row.icon"
:preview-src-list="[row.icon]"
class="small-img circle-img"
/>
</template>
</el-table-column>
<el-table-column label="排序" prop="sort" />
<el-table-column label="状态" prop="showStatus">
<template v-slot="{ row }">
<dict-tag
:value="row.showStatus"
prop-name="sys_show_status"
></dict-tag>
</template>
</el-table-column>
<el-table-column
label="操作"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改商品分类对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px">
<el-form ref="form" :model="form" :rules="rules" label-width="108px">
<el-form-item label="名称" prop="typeName">
<el-input v-model="form.typeName" placeholder="名称" />
</el-form-item>
<el-form-item label="图片" prop="icon">
<oss-image-upload v-model="form.icon" :limit="1" />
</el-form-item>
<el-form-item label="状态">
<DictRadio
v-model="form.showStatus"
size="small"
:radioData="dict.type.sys_show_status"
/>
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="排序" />
</el-form-item>
<!-- <el-form-item label="层级" prop="level">
<el-input v-model="form.level" placeholder="层级" />
</el-form-item> -->
<!-- <el-form-item label="上级分类" prop="parentId">
<product-category-select class="w200" v-model="form.parentId" :props="{ checkStrictly: true }"/>
</el-form-item> -->
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
listPmsProductCategory,
getPmsProductCategory,
delPmsProductCategory,
addPmsProductCategory,
updatePmsProductCategory,
exportPmsProductCategory,
} from "@/api/pms/productCategory";
import ProductCategorySelect from "@/views/components/ProductCategorySelect.vue";
export default {
name: "PmsProductCategory",
dicts: ["sys_show_status"],
components: { ProductCategorySelect },
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
pmsProductCategoryList: [],
//
title: "",
//
open: false,
//
queryParams: {
parentId: null,
nameLike: null,
level: null,
showStatus: null,
sort: null,
},
//
form: {},
//
rules: {},
};
},
created() {
this.getList();
},
methods: {
/** 查询商品分类列表 */
getList() {
this.loading = true;
const query = { ...this.queryParams };
listPmsProductCategory(query).then((rows) => {
this.pmsProductCategoryList = rows;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
parentId: null,
name: null,
level: null,
showStatus: 0,
sort: null,
icon: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
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;
getPmsProductCategory(id).then((response) => {
this.form = response;
this.open = true;
this.title = "修改商品分类";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate((valid) => {
if (valid) {
let p;
if (this.form.parentId) {
this.form.parentId = this.form.parentId.pop();
}
if (this.form.id != null) {
p = updatePmsProductCategory(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
p = addPmsProductCategory(this.form).then((response) => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
p.then(() => {
this.$store.dispatch("mall/loadProductCategories", true);
});
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
if (row.children && row.children.length > 0) {
this.$message.error("请先删除子目录");
return;
}
const ids = row.id;
this.$modal
.confirm('是否确认删除商品分类编号为"' + ids + '"的数据项?')
.then(function () {
return delPmsProductCategory(ids);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal
.confirm("是否确认导出所有商品分类数据项?")
.then(() => {
this.exportLoading = true;
return exportPmsProductCategory(queryParams);
})
.then((response) => {
this.$download.download(response);
this.exportLoading = false;
})
.catch(() => {});
},
},
};
</script>

@ -0,0 +1,282 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="PRODUCT_ID" prop="productId">
<el-input
v-model="queryParams.productId"
placeholder="请输入PRODUCT_ID"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="sku编码" prop="outSkuId">
<el-input
v-model="queryParams.outSkuId"
placeholder="请输入sku编码"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="PRICE" prop="price">
<el-input
v-model="queryParams.price"
placeholder="请输入PRICE"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="展示图片" prop="pic">
<el-input
v-model="queryParams.pic"
placeholder="请输入展示图片"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item class="flex_one tr">
<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="['pms:sku:add']"
>新增</el-button>
</el-col>
</el-col>
</el-row>
<el-table v-loading="loading" :data="pmsSkuList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="PRODUCT_ID" align="center" prop="productId" />
<el-table-column label="sku编码" align="center" prop="outSkuId" />
<el-table-column label="PRICE" align="center" prop="price" />
<el-table-column label="展示图片" align="center" prop="pic" />
<el-table-column label="商品销售属性json格式" align="center" prop="spData" />
<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="['pms:sku:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['pms:sku: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"
/>
<!-- 添加或修改sku信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-two">
<el-form-item label="PRODUCT_ID" prop="productId">
<el-input v-model="form.productId" placeholder="请输入PRODUCT_ID" />
</el-form-item>
<el-form-item label="sku编码" prop="outSkuId">
<el-input v-model="form.outSkuId" placeholder="请输入sku编码" />
</el-form-item>
<el-form-item label="PRICE" prop="price">
<el-input v-model="form.price" placeholder="请输入PRICE" />
</el-form-item>
<el-form-item label="展示图片" prop="pic">
<el-input v-model="form.pic" placeholder="请输入展示图片" />
</el-form-item>
<el-form-item label="商品销售属性json格式" prop="spData">
<el-input v-model="form.spData" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listPmsSku, getPmsSku, delPmsSku, addPmsSku, updatePmsSku, exportPmsSku } from "@/api/pms/sku";
export default {
name: "PmsSku",
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
// sku
pmsSkuList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
productId: null,
outSkuId: null,
price: null,
pic: null,
spData: null,
},
//
form: {},
//
rules: {
outSkuId: [
{ required: true, message: "sku编码不能为空", trigger: "blur" }
],
},
};
},
created() {
this.getList();
},
methods: {
/** 查询sku信息列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listPmsSku(query, pageReq).then(response => {
const { content, totalElements } = response
this.pmsSkuList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
productId: null,
outSkuId: null,
price: null,
pic: null,
spData: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: 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 = "添加sku信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getPmsSku(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改sku信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updatePmsSku(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addPmsSku(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除sku信息编号为"' + ids + '"的数据项?').then(function() {
return delPmsSku(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有sku信息数据项').then(() => {
this.exportLoading = true;
return exportPmsSku(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {});
}
}
};
</script>

@ -56,7 +56,12 @@
:default-expand-all="isExpandAll"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
<el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
<el-table-column prop="deptName" label="部门/校区名称" width="260">
<template slot-scope="scope">
<el-tag :type="scope.row.deptType === '1'?'info':'' ">{{ scope.row.deptType === '1'?'部门':'校区' }}</el-tag>
<span>{{ scope.row.deptName }}</span>
</template>
</el-table-column>
<el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
<el-table-column prop="status" label="状态" width="100">
<template slot-scope="scope">
@ -112,28 +117,55 @@
<el-input v-model="form.deptName" placeholder="请输入部门名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门类型:">
<el-radio-group v-model="form.deptType">
<el-radio
v-for="dict in deptTypeOptions"
:key="dict.deptType"
:label="dict.deptType"
>{{ dict.deptTypeName }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="显示排序" prop="orderNum">
<el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="负责人" prop="leaderId">
<el-select v-model="form.leaderId" placeholder="部门负责人" @change="changeLeader" clearable>
<el-option
v-for="dict in leaderOptions"
:key="dict.userId"
:label="dict.nickName"
:value="dict.userId"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="负责人" prop="leader">
<el-input v-model="form.leader" placeholder="请输入负责人" maxlength="20" />
<el-input v-model="form.leader" placeholder="部门负责人" maxlength="20" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="phone">
<el-input v-model="form.phone" placeholder="请输入联系电话" maxlength="11" />
<el-input v-model="form.phone" placeholder="负责人联系电话" maxlength="11" :disabled="true"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
<el-input v-model="form.email" placeholder="负责人邮箱" maxlength="50" :disabled="true"/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -159,6 +191,7 @@
<script>
import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept";
import {listUser} from "@/api/system/user";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
@ -176,6 +209,8 @@ export default {
deptList: [],
//
deptOptions: [],
//
leaderOptions: [],
//
title: "",
//
@ -189,6 +224,14 @@ export default {
deptName: undefined,
status: undefined
},
//
deptTypeOptions: [{
deptType: '1',
deptTypeName: '部门'
}, {
deptType: '2',
deptTypeName: '校区'
}],
//
form: {},
//
@ -223,6 +266,22 @@ export default {
this.getList();
},
methods: {
/****/
changeLeader(value){
if (value){
const selectedOption = this.leaderOptions.find(opt => opt.userId === value);
this.form.leader=selectedOption.nickName;
this.form.phone=selectedOption.phonenumber;
this.form.email=selectedOption.email;
}else {
this.form.leader=null;
this.form.phone=null;
this.form.email=null;
}
},
/** 查询部门列表 */
getList() {
this.loading = true;
@ -280,7 +339,11 @@ export default {
this.title = "添加部门";
listDept().then(response => {
this.deptOptions = this.handleTree(response.data, "deptId");
});
listUser().then(response => {
this.leaderOptions=response.rows
})
},
/** 展开/折叠操作 */
toggleExpandAll() {

@ -46,38 +46,38 @@
v-hasPermi="['system:dict: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="['system:dict: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="['system:dict: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="['system:dict:export']"
>导出</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="['system:dict: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="['system:dict: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="['system:dict:export']"-->
<!-- >导出</el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
type="warning"

@ -62,38 +62,38 @@
v-hasPermi="['system:dict: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="['system:dict: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="['system:dict: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="['system:dict:export']"
>导出</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="['system:dict: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="['system:dict: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="['system:dict:export']"-->
<!-- >导出</el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
type="danger"

@ -44,38 +44,7 @@
v-hasPermi="['system:post: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="['system:post: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="['system:post: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="['system:post:export']"
>导出</el-button>
</el-col>
<!-- -->
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>

@ -62,38 +62,29 @@
v-hasPermi="['system:role: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="['system:role: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="['system:role: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="['system:role:export']"
>导出</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="['system:role: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="['system:role:remove']"-->
<!-- >删除</el-button>-->
<!-- </el-col>-->
<!-- -->
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@ -119,7 +110,8 @@
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope" v-if="scope.row.roleId !== 1">
<template slot-scope="scope" >
<template v-if="(userId==1 &&scope.row.roleId !== 1) ||(userId!==1 && scope.row.roleId>108)">
<el-button
size="mini"
type="text"
@ -134,17 +126,20 @@
@click="handleDelete(scope.row)"
v-hasPermi="['system:role:remove']"
>删除</el-button>
<el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
<span class="el-dropdown-link">
<i class="el-icon-d-arrow-right el-icon--right"></i>更多
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="handleDataScope" icon="el-icon-circle-check"
v-hasPermi="['system:role:edit']">数据权限</el-dropdown-item>
<el-dropdown-item command="handleAuthUser" icon="el-icon-user"
v-hasPermi="['system:role:edit']">分配用户</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
<!-- <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)"-->
<!-- v-hasPermi="['system:role:edit']" v-if="scope.row.roleId !== 1">-->
<!-- <span class="el-dropdown-link">-->
<!-- <i class="el-icon-d-arrow-right el-icon&#45;&#45;right"></i>更多-->
<!-- </span>-->
<!-- <el-dropdown-menu slot="dropdown" v-if="(userId==1 &&scope.row.roleId !== 1) ||(userId!==1 && scope.row.roleId>108)">-->
<!-- <el-dropdown-item command="handleDataScope" icon="el-icon-circle-check"-->
<!-- v-hasPermi="['system:role:edit']"-->
<!-- >数据权限</el-dropdown-item>-->
<!-- <el-dropdown-item command="handleAuthUser" icon="el-icon-user"-->
<!-- v-hasPermi="['system:role:edit']">分配用户</el-dropdown-item>-->
<!-- </el-dropdown-menu>-->
<!-- </el-dropdown>-->
</template>
</el-table-column>
</el-table>
@ -263,6 +258,7 @@ export default {
dicts: ['sys_normal_disable'],
data() {
return {
userId:this.$store.getters.userId,
//
loading: true,
//

@ -62,18 +62,8 @@
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
v-model="dateRange"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-form-item style="float: right" >
<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>
@ -90,48 +80,8 @@
v-hasPermi="['system:user: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="['system:user: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="['system:user:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="el-icon-upload2"
size="mini"
@click="handleImport"
v-hasPermi="['system:user:import']"
>导入</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:user:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
@ -152,6 +102,7 @@
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>

@ -39,6 +39,21 @@
</div>
</el-card>
</el-col>
<el-col :span="17" :xs="24">
<el-card>
<div slot="header" class="clearfix">
<span>基本资料</span>
</div>
<el-tabs v-model="activeTab" @tab-click="changeTab">
<el-tab-pane label="基本资料" name="userInfo">
<userInfo :user="user" />
</el-tab-pane>
<el-tab-pane label="修改密码" name="resetPwd">
<resetPwd :user="user" />
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
</el-row>
</div>
</template>
@ -57,13 +72,16 @@ export default {
user: {},
roleGroup: {},
postGroup: {},
activeTab: "userinfo"
activeTab: "userInfo"
};
},
created() {
this.getUser();
},
methods: {
changeTab(){
console.log(this.activeTab)
},
getUser() {
getUserProfile().then(response => {
this.user = response.data;

@ -55,7 +55,10 @@ export default {
this.$refs["form"].validate(valid => {
if (valid) {
updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
this.$modal.msgSuccess("修改成功");
this.$modal.msgSuccess("修改成功,请重新登录");
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
})
});
}
});

@ -1,6 +1,8 @@
<template>
<div>
<div class="user-info-head"><img v-bind:src="options.img" title="点击上传头像" class="img-circle img-lg" /></div>
<div >
<!-- class="user-info-head" -->
<img v-bind:src="options.img" title="点击上传头像" class="img-circle img-lg" @click="editCropper()" />
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog">
<el-row>
<el-col :xs="24" :md="12" :style="{height: '350px'}">
@ -11,6 +13,7 @@
:autoCrop="options.autoCrop"
:autoCropWidth="options.autoCropWidth"
:autoCropHeight="options.autoCropHeight"
:outputType="options.outputType"
:fixedBox="options.fixedBox"
@realTime="realTime"
v-if="visible"
@ -50,12 +53,13 @@
</el-row>
</el-dialog>
</div>
</div>
</template>
<script>
import store from "@/store";
import { VueCropper } from "vue-cropper";
import { uploadAvatar } from "@/api/system/user";
import { uploadAvatar,updateUserProfile } from "@/api/system/user";
export default {
components: { VueCropper },
@ -79,12 +83,15 @@ export default {
autoCropHeight: 200, //
fixedBox: true //
},
fileName:"",
fileType:"",
previews: {}
};
},
methods: {
//
editCropper() {
console.log(123)
this.open = true;
},
//
@ -113,6 +120,8 @@ export default {
this.$modal.msgError("文件格式错误,请上传图片类型,如JPGPNG后缀的文件。");
} else {
const reader = new FileReader();
this.fileName=file.name
this.fileType=file.type
reader.readAsDataURL(file);
reader.onload = () => {
this.options.img = reader.result;
@ -123,13 +132,21 @@ export default {
uploadImg() {
this.$refs.cropper.getCropBlob(data => {
let formData = new FormData();
formData.append("avatarfile", data);
const file = new File([data], this.fileName, { type: this.fileType });
formData.append("file", file);
uploadAvatar(formData).then(response => {
if (response.success){
updateUserProfile({avatar:response.data.thumbUrl}).then(response1=>{
this.open = false;
this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl;
store.commit('SET_AVATAR', this.options.img);
this.options.img =response.thumbUrl;
store.commit('SET_AVATAR', response.data.thumbUrl);
this.$modal.msgSuccess("修改成功");
this.visible = false;
})
}
});
});
},

@ -62,7 +62,10 @@ export default {
this.$refs["form"].validate(valid => {
if (valid) {
updateUserProfile(this.user).then(response => {
this.$modal.msgSuccess("修改成功");
this.$modal.msgSuccess("修改成功,请重新登陆");
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
})
});
}
});

Loading…
Cancel
Save