Compare commits

...

10 Commits
master ... main

Author SHA1 Message Date
tangzh
dba643eb85 商品常见问题 2025-04-04 21:54:39 +08:00
tangzh
6d40f3379f 商品常见问题 2025-04-04 21:53:00 +08:00
tangzh
9131a17369 楼层 2025-04-04 17:24:02 +08:00
tangzh
a47b0047ee 调整 2025-03-30 22:54:20 +08:00
tangzh
ef1bdea2f0 调整 2025-03-23 20:50:48 +08:00
tangzh
8f32da7b24 调整 2025-03-21 18:06:41 +08:00
tangzh
1060f3decc 调整 2025-03-19 18:45:56 +08:00
tangzh
c6d81c5e2a 后管页面 2025-03-18 19:35:35 +08:00
tangzh
39d6fe755f 后管页面 2025-03-18 14:31:04 +08:00
tangzh
866c24eb70 后管页面 2025-03-17 17:56:46 +08:00
38 changed files with 3054 additions and 237 deletions

62
src/api/deliverytime.js Normal file
View File

@ -0,0 +1,62 @@
import request from '@/utils/request'
/**
* 新增EbdeliveryTime
* @param pram
*/
export function createApi(data) {
return request({
url: '/admin/deliveryTime/save',
method: 'POST',
data
})
}
/**
* ebdeliveryTime更新
* @param pram
*/
export function updateApi(data) {
return request({
url: 'admin/deliveryTime/update',
method: 'POST',
data
})
}
/**
* deliveryTime详情
* @param pram
*/
export function detailApi(id) {
return request({
url: `admin/deliveryTime/info/${id}`,
method: 'GET'
})
}
/**
* deliveryTime删除
* @param pram
*/
export function deleteApi(id) {
return request({
url: `admin/deliveryTime/delete/${id}`,
method: 'get'
})
}
/**
* deliveryTime列表
* @param pram
*/
export function listApi(params) {
return request({
url: 'admin/deliveryTime/list',
method: 'GET',
params
})
}

63
src/api/home.js Normal file
View File

@ -0,0 +1,63 @@
import request from '@/utils/request'
/**
* 新增EbHome
* @param pram
*/
export function homeCreateApi(data) {
return request({
url: '/admin/floor/save',
method: 'POST',
data
})
}
/**
* ebhome更新
* @param pram
*/
export function homeUpdateApi(data) {
return request({
url: '/admin/floor/update',
method: 'POST',
data
})
}
/**
* ebhome详情
* @param pram
*/
export function homeDetailApi(id) {
return request({
url: `/admin/floor/info/${id}`,
method: 'GET'
})
}
/**
* ebhome删除
* @param pram
*/
export function homeDeleteApi(params) {
return request({
url: `/admin/floor/delete`,
method: 'post',
params
})
}
/**
* ebhome列表
* @param pram
*/
export function homeListApi(params) {
return request({
url: '/admin/floor/list',
method: 'GET',
params
})
}

63
src/api/homeItem.js Normal file
View File

@ -0,0 +1,63 @@
import request from '@/utils/request'
/**
* 新增EbHome
* @param pram
*/
export function createApi(data) {
return request({
url: '/admin/floorItem/save',
method: 'POST',
data
})
}
/**
* ebhome更新
* @param pram
*/
export function updateApi(data) {
return request({
url: '/admin/floorItem/update',
method: 'POST',
data
})
}
/**
* ebhome详情
* @param pram
*/
export function detailApi(id) {
return request({
url: `/admin/floorItem/info/${id}`,
method: 'GET'
})
}
/**
* ebhome删除
* @param pram
*/
export function deleteApi(params) {
return request({
url: `/admin/floorItem/delete`,
method: 'post',
params
})
}
/**
* ebhome列表
* @param pram
*/
export function listApi(params) {
return request({
url: '/admin/floorItem/list',
method: 'GET',
params
})
}

View File

@ -37,6 +37,19 @@ export function orderListDataApi(params) {
params
})
}
/**
* 订单 列表 数据统计
* @param params
*/
export function prepareApi(params) {
return request({
url: '/admin/store/order/prepare',
method: 'post',
params
})
}
/**
* 订单 删除
* @param params

63
src/api/problem.js Normal file
View File

@ -0,0 +1,63 @@
import request from '@/utils/request'
/**
* 新增
* @param pram
*/
export function createApi(data) {
return request({
url: '/admin/problem/save',
method: 'POST',
data
})
}
/**
* 更新
* @param pram
*/
export function updateApi(data) {
return request({
url: '/admin/problem/update',
method: 'POST',
data
})
}
/**
* 详情
* @param pram
*/
export function detailApi(id) {
return request({
url: `/admin/problem/info/${id}`,
method: 'GET'
})
}
/**
* 删除
* @param pram
*/
export function deleteApi(params) {
return request({
url: `/admin/problem/delete`,
method: 'post',
params
})
}
/**
* 列表
* @param pram
*/
export function listApi(params) {
return request({
url: '/admin/problem/list',
method: 'GET',
params
})
}

View File

@ -280,6 +280,19 @@ export function productExcelApi(params) {
})
}
/**
* 商品导入
* @param params
* @returns {*}
*/
export function importExcelApi(data) {
return request({
url: `/admin/import/excel/product`,
method: 'post',
data
})
}
/**
* 商品列表 获取复制商品配置
* @param pram

63
src/api/systemHelp.js Normal file
View File

@ -0,0 +1,63 @@
import request from '@/utils/request'
/**
* 新增EbSystemHelpProblem
* @param pram
*/
export function createApi(data) {
return request({
url: 'admin/system/helpProblem/save',
method: 'POST',
data
})
}
/**
* ebsystemhelpproblem更新
* @param pram
*/
export function updateApi(data) {
return request({
url: 'admin/system/helpProblem/update',
method: 'POST',
data
})
}
/**
* ebsystemhelpproblem详情
* @param pram
*/
export function detailApi(id) {
return request({
url: `admin/system/helpProblem/info/${id}`,
method: 'GET'
})
}
/**
* ebsystemhelpproblem删除
* @param pram
*/
export function deleteApi(params) {
return request({
url: `admin/system/helpProblem/delete`,
method: 'POST',
params
})
}
/**
* ebsystemhelpproblem列表
* @param pram
*/
export function listApi(params) {
return request({
url: 'admin/system/helpProblem/list',
method: 'GET',
params
})
}

View File

@ -144,16 +144,13 @@ export default {
imageSuccessCBK(arr) {
const _this = this;
arr.forEach((v) => {
if (this.getFileType(v) == "video") {
window.tinymce
.get(_this.tinymceId)
.insertContent(
`<video class="wscnph" src="${v}" controls muted></video>`
);
let fileType = this.getFileType(v);
if (fileType == "video") {
window.tinymce.get(_this.tinymceId).insertContent(`<video class="wscnph" src="${v}" controls muted></video>`);
} else if (fileType == 'pdf') {
window.tinymce.get(_this.tinymceId).insertContent(`<iframe src="${v}" />`);
} else {
window.tinymce
.get(_this.tinymceId)
.insertContent(`<img class="wscnph" src="${v}" />`);
window.tinymce.get(_this.tinymceId).insertContent(`<img class="wscnph" src="${v}" />`);
}
});
},
@ -196,6 +193,12 @@ export default {
if (result) {
return "video";
}
// pdf
const pdfList = ['pdf'];
result = pdfList.find((item) => item === suffix);
if (result) {
return "pdf";
}
//
return "other";
},

View File

@ -2,9 +2,11 @@
<div>
<input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx, .xls" @change="handleClick">
<div class="drop" @drop="handleDrop" @dragover="handleDragover" @dragenter="handleDragover">
Drop excel file here or
<span v-if="fileName">已选择{{ fileName }}</span>
<span v-else>将文件拖到此处或</span>
<el-button :loading="loading" style="margin-left:16px;" size="mini" type="primary" @click="handleUpload">
Browse
<span v-if="fileName">重新选择</span>
<span v-else>点击上传</span>
</el-button>
</div>
</div>
@ -24,10 +26,15 @@ export default {
excelData: {
header: null,
results: null
}
},
fileName: ''
}
},
methods: {
resetData() {
this.$refs['excel-upload-input'].value = null;
this.fileName = '';
},
generateData({ header, results }) {
this.excelData.header = header
this.excelData.results = results
@ -64,7 +71,8 @@ export default {
const files = e.target.files
const rawFile = files[0] // only use files[0]
if (!rawFile) return
this.upload(rawFile)
this.upload(rawFile);
this.fileName = rawFile.name;
},
upload(rawFile) {
this.$refs['excel-upload-input'].value = null // fix can't select the same excel
@ -125,8 +133,7 @@ export default {
}
.drop{
border: 2px dashed #bbb;
width: 600px;
height: 160px;
width: 800px;
line-height: 160px;
margin: 0 auto;
font-size: 24px;

View File

@ -27,7 +27,7 @@
</div>
</div>
<el-dialog
title="上传图片"
title="上传附件"
:visible.sync="visible"
width="896px"
:before-close="handleClose"
@ -111,6 +111,7 @@ export default {
e.dataTransfer.dropEffect = 'move'
},
handleDragEnter (e, item) {
alert(11)
e.dataTransfer.effectAllowed = 'move'
if (item === this.dragging) {
return

View File

@ -55,7 +55,7 @@
>
<el-dropdown-item
v-if="
node.label !== '全部图片' &&
node.label !== '默认' &&
checkPermi(['admin:category:update'])
"
@click.native="onEdit(data.id)"
@ -63,7 +63,7 @@
>
<el-dropdown-item
v-if="
node.label !== '全部图片' &&
node.label !== '默认' &&
checkPermi(['admin:category:delete'])
"
@click.native="handleDelete(data.id)"
@ -88,14 +88,14 @@
type="primary"
class="mr15 mb20"
@click="checkPics"
>使用选中图片
>使用选中附件
</el-button
>
<div class="mb20">
<el-tooltip
class="item"
effect="dark"
content="上传图片"
content="上传附件"
placement="top-start"
>
<el-upload
@ -118,7 +118,7 @@
<el-tooltip
class="item"
effect="dark"
content="删除图片"
content="删除"
placement="top-start"
>
<el-button
@ -141,7 +141,7 @@
:show-file-list="false"
multiple
>
<el-button class="mr10" type="primary" v-if="pictureType">上传{{typeDate =='pic'?'图片':'视频'}}</el-button>
<el-button class="mr10" type="primary" v-if="pictureType">上传{{typeDate =='pic'?'图片':'文件'}}</el-button>
</el-upload>
<div>
<el-button
@ -149,7 +149,7 @@
type="danger"
@click.stop="editPicList('图片')"
v-if="pictureType"
>删除{{typeDate =='pic'?'图片':'视频'}}
>删除{{typeDate =='pic'?'图片':'文件'}}
</el-button
>
</div>
@ -181,11 +181,11 @@
<div class="abs_video">
<el-radio-group v-model="typeDate" @change="radioChange" size="small">
<el-radio-button label="pic">图片</el-radio-button>
<el-radio-button label="video">视频</el-radio-button>
<el-radio-button label="video">文件</el-radio-button>
</el-radio-group>
</div>
</div>
<div class="pictrueList acea-row" v-loading="loadingPic">
<div class="pictrueList acea-row" v-loading="loadingPic" v-if="typeDate == 'pic'">
<div v-show="isShowPic" class="imagesNo">
<i
class="el-icon-picture"
@ -208,17 +208,44 @@
v-lazy="item.sattDir ? item.sattDir : localImg"
:class="item.isSelect ? 'on' : ''"
@click="changImage(item, index, pictrueList.list)"
v-if="item.attType !== 'video/mp4'"
v-if="('jpg,jpeg,gif,png,bmp,PNG,JPG,mp4'.split(',')).includes(item.attType)"
/>
<video
:src="item.sattDir"
:class="item.isSelect ? 'on' : ''"
@click="changImage(item, index, pictrueList.list)"
v-if="item.attType == 'video/mp4'"
></video>
</div>
</div>
</div>
<div class="pictrueList acea-row" v-loading="loadingPic" v-else>
<div v-show="isShowPic" class="imagesNo">
<i
class="el-icon-picture"
style="font-size: 60px; color: rgb(219, 219, 219)"
/>
<span class="imagesNo_sp">附件库为空</span>
</div>
<div
class="conters scrollbarAll"
:style="{ maxHeight: !pictureType ? '500px' : '700px' }"
>
<div
v-for="(item, index) in pictrueList.list"
:key="index"
class="gridPic" style="margin-right: 10px; margin-bottom: 40px; width: 300px; height: 200px"
>
<span class="num_badge" v-if="item.num > 0">{{ item.num }}</span>
<embed
:title="item.name"
:class="item.isSelect ? 'on' : ''"
style="object-fit: contain;"
:src="item.sattDir"
v-lazy="item.sattDir ? item.sattDir : localImg"
v-if="('zip,doc,docx,xls,xlsx,pdf,mp3,wma,wav,amr,mp4,p12,application/pdf'.split(',')).includes(item.attType)"
/>
<span @click="changImage(item, index, pictrueList.list)" style="font-size: 14px">{{item.name}}</span>
</div>
</div>
</div>
</div>
<div class="block">
<el-pagination
@ -386,7 +413,7 @@ export default {
page: 1,
limit: 10,
pid: 0,
attType: "jpg,jpeg,gif,png,bmp,PNG,JPG",
attType: "image_ext_str",
},
classifyId: 0,
myHeaders: {"X-Token": getToken()},
@ -478,7 +505,7 @@ export default {
//
handlerGetList() {
let datas = {
name: "全部图片",
name: "默认",
id: "",
};
treeCategroy(this.treeFrom).then((data) => {
@ -494,7 +521,7 @@ export default {
//
getList() {
const data = {
name: "全部图片",
name: "默认",
id: 10000,
};
treeCategroy(this.treeFrom).then((res) => {
@ -651,27 +678,30 @@ export default {
// 使
checkPics() {
if (!this.checkPicList.length)
return this.$message.warning("请先选择图片");
return this.$message.warning("请先选择");
if (this.$route && this.$route.query.field === "dialog") {
let str = "";
for (let i = 0; i < this.checkPicList.length; i++) {
str += '<img src="' + this.checkPicList[i].sattDir + '">';
if (this.typeDate ==='pic') {
str += '<img src="' + this.checkPicList[i].sattDir + '">';
} else {
str += '<embed src="' + this.checkPicList[i].sattDir + '">';
}
}
/* eslint-disable */
nowEditor.dialog.close(true);
nowEditor.editor.setContent(str, true);
} else {
if (this.isMore === "1" && this.checkPicList.length > 1) {
return this.$message.warning("最多只能选一张图片");
return this.$message.warning("最多只能选一张");
}
this.$emit("getImage", [...this.checkedMore, ...this.checkPicList]);
}
},
//
//
editPicList(tit) {
if (!this.checkPicList.length)
return this.$message.warning("请先选择图片");
return this.$message.warning("请先选择");
this.$modalSure().then(() => {
fileDeleteApi(this.ids.join(",")).then(() => {
this.$message.success("刪除成功");
@ -689,7 +719,7 @@ export default {
};
this.getMove();
} else {
this.$message.warning("请先选择图片");
this.$message.warning("请先选择");
}
},
getMove() {
@ -713,10 +743,10 @@ export default {
},
videoChange(val) {
if (val == false) {
this.$set(this.tableData, "attType", "jpg,jpeg,gif,png,bmp,PNG,JPG");
this.$set(this.tableData, "attType", "image_ext_str");
this.getFileList();
} else {
this.$set(this.tableData, "attType", "video/mp4");
this.$set(this.tableData, "attType", "file_ext_str");
this.getFileList();
}
},
@ -901,8 +931,8 @@ export default {
.gridPic {
margin-right: 15px;
margin-bottom: 10px;
width: 110px;
height: 110px;
width: 140px;
height: 140px;
position: relative;
cursor: pointer;
@ -918,6 +948,12 @@ export default {
display: block;
}
embed {
width: 100%;
height: 100%;
display: block;
}
.num_badge {
position: absolute;
bottom: 6px;

View File

@ -1,7 +1,7 @@
<template>
<div>
<el-dialog
title="上传图片"
title="上传附件"
:visible.sync="visible"
width="950px"
:modal="booleanVal"

View File

@ -22,6 +22,31 @@ const operationRouter = {
icon: 'clipboard'
}
},
{
path: 'help',
name: 'help',
component: () => import('@/views/systemSetting/help'),
meta: {
title: '帮助与问题',
icon: 'clipboard'
}
},
{
path: 'home',
name: 'home',
component: () => import('@/views/home'),
meta: {
title: '楼层设置',
icon: 'clipboard'
}
},
{
path: 'homeItem/list/:id',
component: () => import('@/views/home/item/index'),
name: 'homeItem',
meta: { title: '楼层项', noCache: true, activeMenu: `/home/index` },
hidden: true
},
{
path:'notification',
name:'notification',
@ -148,6 +173,12 @@ const operationRouter = {
name: 'freightSet',
meta: { title: '配送模板', noCache: true }
},
{
path: 'deliveryTime',
component: () => import('@/views/deliveryTime'),
name: 'deliveryTime',
meta: { title: '送达时间', noCache: true }
},
]
},
]

View File

@ -36,6 +36,12 @@ const storeRouter = {
name: 'StoreComment',
meta: { title: '商品评论', icon: '' }
},
{
path: 'problem/:id?',
component: () => import('@/views/store/problem/index'),
name: 'Problem',
meta: { title: '商品常见问题', icon: '' }
},
{
path: 'list/creatProduct/:id?/:isDisabled?',
component: () => import('@/views/store/creatStore/index'),

View File

@ -0,0 +1,124 @@
<template>
<!-- 基于 Element UI 新增和修改弹窗 -->
<el-dialog
:title="!dataForm.id ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible">
<!-- 新增和创建表单表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="120px">
<el-form-item label="预约配送天数" prop="appointDay">
<el-input v-model="dataForm.appointDay" placeholder="预约配送天数"></el-input>
</el-form-item>
<el-form-item label="上午配送时间" prop="amSendHour">
<el-input v-model="dataForm.amSendHour" placeholder="9点-12点填入9-12"></el-input>
</el-form-item>
<el-form-item label="下午配送时间" prop="pmSendHour">
<el-input v-model="dataForm.pmSendHour" placeholder="15点-19点填入15-19"></el-input>
</el-form-item>
<el-form-item label="配送区间(分钟)" prop="sendSplit">
<el-input v-model="dataForm.sendSplit" placeholder="配送区间(分钟)"></el-input>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="dataForm.type" prop="type">
<el-option label="通用" :value="1"></el-option>
<el-option label="指定门店" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="门店" prop="storeId" v-if="dataForm.type === 2">
<el-select v-model="dataForm.storeId" filterable placeholder="请选择门店">
<el-option v-for="(item,i) in storeData" :value="item.id" :key="i" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否无效" prop="status">
<el-select v-model="dataForm.status">
<el-option label="有效" :value="1"></el-option>
<el-option label="无效" :value="0"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataSubmit()">确定</el-button>
</span>
</el-dialog>
</template>
<script>
import * as api from '@/api/deliverytime.js'
import { storeListApi } from '@/api/storePoint';
export default {
data() {
return {
visible: false,
dataForm: {
id: 0,
appointDay: '',
amSendHour: '',
pmSendHour: '',
sendSplit: '',
type: 1,
storeId: '',
status: '',
},
storeData:[],
dataRule: {
appointDay: [
{required: true, message: '请填写预约配送天数', trigger: 'blur'}
],
amSendHour: [
{required: true, message: '请填写上午配送时间', trigger: 'blur'}
],
pmSendHour: [
{required: true, message: '请填写下午配送时间', trigger: 'blur'}
],
sendSplit: [
{required: true, message: '请填写配送区间', trigger: 'blur'}
],
type: [
{required: true, message: '请选择类型', trigger: 'blur'}
],
status: [
{required: true, message: '请选择状态', trigger: 'blur'}
],
}
}
},
methods: {
init(id) { //
this.dataForm.id = id || 0
this.visible = true
this.$nextTick(() => {
this.$refs['dataForm'].resetFields()
if (this.dataForm.id) {
api.detailApi(id).then(res => {
this.dataForm = res;
})
}
})
this.storeList()
},
storeList() {
storeListApi({status: 1, page: 1, limit: 9999}).then((data) => {
this.storeData = data.list;
});
},
//
dataSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
this.dataForm.id ?
api.updateApi(this.dataForm).then(res => {
this.$message.success('修改成功');
}) :
api.createApi(this.dataForm).then(res => {
this.$message.success('新增成功');
});
this.visible = false;
this.$emit('refreshDataList');
}
})
}
}
}
</script>

View File

@ -0,0 +1,158 @@
<template>
<div class="divBox">
<el-card class="box-card">
<div slot="header" class="clearfix">
<el-button v-hasPermi="['admin:deliveryTime:save']" size="mini" type="primary" @click="addOrUpdateHandle()">新增数据</el-button>
</div>
<el-table
:data="dataList"
border
v-loading="dataListLoading"
@selection-change="selectionChangeHandle"
style="width: 100%"
size="mini">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="id"
header-align="center"
align="center"
label="编号">
</el-table-column>
<el-table-column
prop="appointDay"
header-align="center"
align="center"
label="预约天数">
</el-table-column>
<el-table-column
prop="amSendHour"
header-align="center"
align="center"
label="上午配送(点)">
</el-table-column>
<el-table-column
prop="pmSendHour"
header-align="center"
align="center"
label="下午配送(点)">
</el-table-column>
<el-table-column
prop="sendSplit"
header-align="center"
align="center"
label="配送区间(分钟)">
</el-table-column>
<el-table-column
prop="type"
header-align="center"
align="center"
label="类型">
<template slot-scope="scope">
<div class="demo-image__preview">
<span v-if="scope.row.type == 1">通用</span>
<span v-else-if="scope.row.type == 2">指定门店{{scope.row.storeId}}</span>
</div>
</template>
</el-table-column>
<el-table-column
prop="status"
header-align="center"
align="center"
label="状态">
<template slot-scope="scope">
<span v-if="scope.row.status == 0">无效</span>
<span v-else-if="scope.row.status == 1">有效</span>
</template>
</el-table-column>
<el-table-column
prop="createTime"
header-align="center"
align="center"
label="创建时间">
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="150"
label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 表单弹窗, 新增数据和修改数据 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</el-card>
</div>
</template>
<script>
import AddOrUpdate from './add-and-update'
import * as api from '@/api/deliverytime.js'
export default {
data () {
return {
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false
}
},
components: {
AddOrUpdate
},
created() {
this.getDataList()
},
methods: {
//
getDataList () {
this.dataListLoading = true
api.listApi().then(res => {
this.dataList = res.list
this.totalPage = res.total
this.dataListLoading = false
}).catch(res => {
this.dataListLoading = false
this.$message.error(res.message)
})
},
//
sizeChangeHandle (val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
//
currentChangeHandle (val) {
this.pageIndex = val
this.getDataList()
},
// /
addOrUpdateHandle (id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id)
})
},
}
}
</script>

View File

@ -0,0 +1,232 @@
<template>
<div>
<!-- 基于 Element UI 新增和修改弹窗 -->
<el-dialog
:title="!dataForm.id ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible"
@close="dialogClose"
>
<!-- 新增和创建表单表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()"
label-width="110px">
<el-form-item label="名称" prop="name">
<el-input v-model="dataForm.name" placeholder="名称"></el-input>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-input v-model="dataForm.title" placeholder="标题"></el-input>
</el-form-item>
<el-form-item label="展示渠道" prop="channel">
<el-select v-model="dataForm.channel" placeholder="展示渠道" class="selWidth" style="width: 220px">
<el-option :value="item.id" v-for="(item, index) in channelList" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="楼层图:" prop="imgUrl" v-if="this.dataForm.channel === '1'">
<div class="upLoadPicBox" @click="modalPicTap('1')" :disabled="isDisabled">
<div v-if="dataForm.imgUrl" class="pictrue"><img :src="dataForm.imgUrl"></div>
<div v-else class="upLoad">
<i class="el-icon-camera cameraIconfont" />
</div>
</div>
</el-form-item>
<el-form-item label="导航" prop="business" v-if="this.dataForm.channel === '2'">
<el-select v-model="dataForm.business" placeholder="展示渠道" class="selWidth" style="width: 220px">
<el-option :value="item.id" v-for="(item, index) in categoryList" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="跳转类型" prop="jumpType">
<el-select v-model="dataForm.jumpType" placeholder="请选择" class="selWidthd" style="width: 220px" @change="jumpTypeChange()">
<el-option :value="item.id" v-for="(item, index) in jumpTypeList" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="选分类" prop="jumpIds" v-if="dataForm.jumpType == 2">
<el-select v-model="dataForm.jumpIds" placeholder="选分类" class="selWidthd" style="width: 220px" @click.native="selectCate">
<el-option :value="item.id" v-for="(item, index) in productCateList" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="选商品" prop="jumpIds" v-else-if="dataForm.jumpType == 1">
<el-input v-model="dataForm.jumpIds" placeholder="选商品" @click.native="selectProductSwitch(1)"></el-input>
</el-form-item>
<el-form-item label="选商品" prop="jumpIds" v-else-if="dataForm.jumpType == 3">
<el-input v-model="dataForm.jumpIds" placeholder="选商品" @click.native="selectProductSwitch(1)"></el-input>
</el-form-item>
<!-- <el-form-item label="选活动" prop="jumpIds" v-if="dataForm.jumpType === 4">-->
<!-- <el-input v-model="dataForm.jumpIds" placeholder="选活动"></el-input>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="跳转地址" prop="jumpUrl">-->
<!-- <el-input v-model="dataForm.jumpUrl" placeholder="跳转地址"></el-input>-->
<!-- </el-form-item>-->
<el-form-item label="是否无效" prop="status">
<el-select v-model="dataForm.delFlag" class="selWidthd" style="width: 220px">
<el-option label="有效" :value="1"></el-option>
<el-option label="无效" :value="0"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataSubmit()">确定</el-button>
</span>
</el-dialog>
<el-dialog
title="选择商品"
:close-on-click-modal="false"
:visible.sync="selectProductVisible"
@close="selectProductSwitch(0)">
<!-- 选择商品 -->
<selectProductWindow v-if="selectProductShow" ref="select_product_window"/>
<el-button type="primary" @click="selectProductOk()" style="margin-left: 90%">确定</el-button>
</el-dialog>
</div>
</template>
<script>
import * as api from '@/api/home.js'
import {listCategroy} from "@/api/categoryApi";
import selectProductWindow from "@/views/home/selectProduct";
export default {
components: {selectProductWindow},
data() {
return {
isDisabled: false, //this.$route.params.isDisabled==='1'?true:false,
visible: false,
categoryList: [],
channelList: [
{id: '1', name: '首页楼层'},
{id: '2', name: '随心配套餐层'},
{id: '3', name: '首页精品推荐'},
],
jumpTypeList: [
{id: 0, name: '无跳转'},
{id: 1, name: '商品详情'},
{id: 2, name: '分类列表'},
{id: 3, name: '商品列表'},
// {id: 4, name: ''},
],
productCateList: [],
selectProductVisible: false,
selectProductShow: false,
dataForm: {
id: 0,
name: '',
title: '',
imgUrl: '',
jumpType: '',
jumpUrl: '',
jumpIds: '',
channel: '',
business: '',
delFlag: '',
orderNo: '',
beginTime: '',
endTime: '',
},
dataRule: {
name: [
{required: true, message: '名称 为必填项', trigger: 'blur'}
],
title: [
{required: true, message: '标题 为必填项', trigger: 'blur'}
],
jumpType: [
{required: true, message: '跳转类型 为必填项', trigger: 'blur'}
],
channel: [
{required: true, message: '展示渠道 为必填项', trigger: 'blur'}
],
orderNo: [
{required: true, message: '排序 为必填项', trigger: 'blur'}
],
delFlag: [
{required: true, message: '是否有效 为必填项', trigger: 'blur'}
],
}
}
},
methods: {
init(id) { //
this.dataForm.id = id || 0
this.visible = true
this.$nextTick(() => {
this.$refs['dataForm'].resetFields()
this.dialogClose();
if (this.dataForm.id) {
api.homeDetailApi(id).then(res => {
this.dataForm = res;
})
}
this.getCategoryList()
})
},
dialogClose() {
this.dataForm.jumpType = '';
this.dataForm.jumpIds = '';
this.dataForm.delFlag = '';
this.dataForm.business = '';
},
getCategoryList() {
listCategroy({ limit: 999, page: '1', status: 1, type: 8 }).then(res => {
this.categoryList = res.list;
})
},
//
dataSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
this.dataForm.id ?
api.homeUpdateApi(this.dataForm).then(res => {
this.$message.success('修改成功');
}) :
api.homeCreateApi(this.dataForm).then(res => {
this.$message.success('新增成功');
});
setTimeout(() => {
this.$emit('refreshDataList')
}, 600)
this.visible = false;
}
})
},
jumpTypeChange() {
this.dataForm.jumpIds = '';
},
selectProductOk() {
let products = this.$refs['select_product_window'].dataListSelections;
if (products.length <= 0) {
this.$message.error('请选择商品');
return;
}
let ids = products.map(item => {return item.id})
this.dataForm.jumpIds = ids + "";
this.selectProductSwitch(0);
},
selectProductSwitch(flag) {
this.selectProductVisible = (flag === 1 ? true : false);
this.selectProductShow = (flag === 1 ? true : false);
},
selectCate() {
listCategroy({ limit: 999, page: '1', status: 1, type: 1 }).then(res => {
this.productCateList = res.list;
})
},
//
modalPicTap (tit, num, i,status) {
const _this = this;
if(_this.isDisabled) return;
this.$modalUpload(function(img) {
if(tit==='1'&& !num){
_this.dataForm.imgUrl = img[0].sattDir
}
},tit, 'content')
},
}
}
</script>

232
src/views/home/index.vue Normal file
View File

@ -0,0 +1,232 @@
<template>
<div class="divBox">
<el-card class="box-card">
<div slot="header" class="clearfix">
<div class="container">
<el-form ref="form" inline :model="dataForm" size="small">
<el-form-item label="标题:">
<el-input v-model="dataForm.name" placeholder="请输入名称/标题" class="selWidth" clearable>
<el-button slot="append" icon="el-icon-search" @click="handleSearch" />
</el-input>
</el-form-item>
<el-form-item label="展示渠道:">
<el-select v-model="dataForm.channel" placeholder="展示渠道" clearable class="selWidth" @change="handleSearch">
<el-option label="--请选择--" value=""></el-option>
<el-option label="首页楼层" :value="1"></el-option>
<el-option label="随心配套餐层" :value="2"></el-option>
<el-option label="首页精品推荐" :value="3"></el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<div class="acea-row">
<el-button v-hasPermi="['admin:home:save']" size="mini" type="primary" @click="addOrUpdateHandle()">新增数据</el-button>
<el-button v-hasPermi="['admin:home:delete']" size="mini" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button>
</div>
</div>
<el-table
ref="table"
v-loading="dataListLoading"
:data="dataList"
style="width: 100%"
size="mini"
highlight-current-row
@selection-change="selectionChangeHandle"
>
<el-table-column type="expand">
<template slot-scope="props">
<el-form label-position="left" inline class="demo-table-expand">
<el-form-item label="跳转参数解析: " style="width: 100%">
<span v-for="(value, key) in props.row.jumpIdsMap" class="mr10"> {{ key }} {{ value }} <br/></span>
</el-form-item>
</el-form>
</template>
</el-table-column>
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="name"
header-align="center"
align="center"
label="名称">
</el-table-column>
<el-table-column
prop="title"
header-align="center"
align="center"
label="标题">
</el-table-column>
<el-table-column label="楼层图" min-width="80" header-align="center">
<template slot-scope="scope">
<div class="demo-image__preview" style="text-align: center">
<el-image v-if="scope.row.imgUrl"
style="width: 36px; height: 36px;"
:src="scope.row.imgUrl"
:preview-src-list="[scope.row.imgUrl]"
/>
</div>
</template>
</el-table-column>
<el-table-column
prop="jumpType"
header-align="center"
align="center"
label="跳转类型">
<template slot-scope="scope">
<span v-if="scope.row.jumpType == 0"></span>
<span v-else-if="scope.row.jumpType == 1">商品详情</span>
<span v-else-if="scope.row.jumpType == 2">分类列表</span>
<span v-else-if="scope.row.jumpType == 3">商品列表</span>
<!-- <span v-else-if="scope.row.jumpType == 4">活动栏目</span>-->
</template>
</el-table-column>
<el-table-column
prop="jumpIds"
header-align="center"
align="center"
label="跳转参数">
</el-table-column>
<el-table-column
prop="channelStr"
header-align="center"
align="center"
label="展示渠道">
<template slot-scope="scope">
<span v-if="scope.row.channel == 1">首页楼层</span>
<span v-else-if="scope.row.channel == 2">随心配套餐层</span>
<span v-else-if="scope.row.channel == 3">首页精品推荐</span>
</template>
</el-table-column>
<el-table-column
prop="orderNo"
header-align="center"
align="center"
label="排序">
</el-table-column>
<el-table-column
prop="status"
header-align="center"
align="center"
label="状态">
<template slot-scope="scope">
<span v-if="scope.row.delFlag == 0">无效</span>
<span v-else-if="scope.row.delFlag == 1">有效</span>
</template>
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="250"
label="操作">
<template slot-scope="scope">
<router-link :to="{path: '/operation/homeItem/list/' + scope.row.id + ''}">
<el-button type="text" size="small" class="mr10">楼层项</el-button>
</router-link>
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
<el-button type="text" size="small" @click="deleteHandle(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 表单弹窗, 新增数据和修改数据 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</el-card>
</div>
</template>
<script>
import AddOrUpdate from './add-and-update'
import * as api from '@/api/home.js'
export default {
data() {
return {
dataForm: {
name: '',
},
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false,
addOrUpdateItemVisible: false,
}
},
components: {
AddOrUpdate
},
created() {
this.getDataList()
},
methods: {
//
getDataList() {
this.dataListLoading = true
api.homeListApi(this.dataForm).then(res => {
this.dataList = res.list
this.totalPage = res.total
this.dataListLoading = false
}).catch(res => {
this.dataListLoading = false
this.$message.error(res.message)
})
},
handleSearch() {
this.page = 1
this.getDataList()
},
//
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
//
currentChangeHandle(val) {
this.pageIndex = val
this.getDataList()
},
//
selectionChangeHandle(val) {
this.dataListSelections = val
},
// /
addOrUpdateHandle(id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id)
})
},
//
deleteHandle(id) {
var ids = id ? [id] : this.dataListSelections.map(item => {
return item.id
})
this.$confirm(`您确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
api.homeDeleteApi({ids : ids.join(',')}).then(res => {
this.$message.success('操作成功')
this.getDataList()
})
})
}
}
}
</script>

View File

@ -0,0 +1,295 @@
<template>
<div>
<!-- 基于 Element UI 新增和修改弹窗 -->
<el-dialog
:title="'楼层子项调整'"
:close-on-click-modal="false"
:visible.sync="visible"
:before-close="handleClose"
>
<el-form :model="itemForm" :rules="dataRule" ref="itemForm">
<el-form-item>
<el-button type="primary" size="mini" icon="el-icon-edit" @click="addRow()">
添加行
</el-button>
</el-form-item>
<el-form-item prop="region">
<el-table :data="itemForm.region" border style="width: 100%" size="mini" class="tempBox">
<el-table-column min-width="120px" align="center" :label="'名称'" prop="name">
<template slot-scope="scope">
<el-form-item :rules="dataRule.name" :prop="'region.'+scope.$index+'.name'">
<el-input v-model="scope.row.name" placeholder="名称"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="120px" align="center" :label="'标题'" prop="title">
<template slot-scope="scope">
<el-form-item :rules="dataRule.title" :prop="'region.'+scope.$index+'.title'">
<el-input v-model="scope.row.title" placeholder="标题"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="50px" align="center" :label="'楼层图'" prop="imgUrl">
<template slot-scope="scope">
<el-form-item :rules="dataRule.imgUrl" :prop="'region.'+scope.$index+'.imgUrl'">
<div class="upLoadPicBox" @click="modalPicTap('1', scope.$index)" :disabled="isDisabled">
<div v-if="scope.row.imgUrl" class="pictrue"><img :src="scope.row.imgUrl"></div>
<div v-else class="upLoad"><i class="el-icon-camera cameraIconfont" /></div>
</div>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="120px" align="center" :label="'跳转类型'" prop="jumpType">
<template slot-scope="scope">
<el-form-item :rules="dataRule.jumpType" :prop="'region.'+scope.$index+'.jumpType'">
<el-select v-model="scope.row.jumpType" placeholder="请选择" class="selWidthd" style="width: 220px" @change="jumpTypeChange(scope.$index)">
<el-option :value="item.id" v-for="(item, index) in jumpTypeList" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="120px" align="center" :label="'跳转类型'" prop="jumpIds">
<template slot-scope="scope">
<el-form-item :rules="dataRule.jumpIds" :prop="'region.'+scope.$index+'.jumpIds'">
<el-input v-if="scope.row.jumpType === 1" v-model="scope.row.jumpIdsText" placeholder="选商品" @click.native="selectProductSwitch(1, 1, scope.$index)"></el-input>
<!-- <el-input v-if="scope.row.jumpType === 1 || scope.row.jumpType === 3" v-model="scope.row.jumpIds" type="hidden"></el-input>-->
<el-select v-if="scope.row.jumpType === 2" v-model="scope.row.jumpIds" placeholder="选分类" class="selWidthd" style="width: 220px" @click.native="selectCate">
<el-option :value="item.id" v-for="(item, index) in productCateList" :key="index" :label="item.name"></el-option>
</el-select>
<el-input v-if="scope.row.jumpType === 3" v-model="scope.row.jumpIdsText" placeholder="选商品" @click.native="selectProductSwitch(1, 0, scope.$index)"></el-input>
</el-form-item>
</template>
</el-table-column>
<!-- <el-table-column min-width="120px" align="center" :label="'跳转地址'" prop="jumpIds">-->
<!-- <template slot-scope="scope">-->
<!-- <el-form-item :rules="dataRule.jumpUrl" :prop="'region.'+scope.$index+'.jumpUrl'">-->
<!-- <el-input v-model="scope.row.jumpUrl" placeholder="跳转地址"></el-input>-->
<!-- </el-form-item>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column align="center" :label="'排序'" prop="orderNo">
<template slot-scope="scope">
<el-form-item :rules="dataRule.orderNo" :prop="'region.'+scope.$index+'.orderNo'">
<el-input-number v-model="scope.row.orderNo" placeholder="排序" controls-position="right" :min="0" style="width: 100px"/>
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" label="操作" min-width="80">
<template slot-scope="scope">
<el-button
type="text"
size="small"
@click="delRow(scope.$index)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataSubmit()">确定</el-button>
</span>
</el-dialog>
<el-dialog
title="选择商品"
:close-on-click-modal="false"
:visible.sync="selectProductVisible"
@close="selectProductSwitch(0)">
<!-- 选择商品 -->
<selectProductWindow v-if="selectProductShow" ref="select_product_window"/>
<el-button type="primary" @click="selectProductOk()" style="margin-left: 90%">确定</el-button>
</el-dialog>
</div>
</template>
<script>
import * as api from '@/api/homeItem.js'
import {listCategroy} from "@/api/categoryApi";
import selectProductWindow from "@/views/home/selectProduct";
const defaultRole = {
region: [{
name: '',
title: '',
homeId: '',
imgUrl: '',
jumpType: '',
jumpUrl: '',
jumpIds: '',
jumpIdsText: '',
business: '',
delFlag: '',
orderNo: '',
}],
}
export default {
components: {selectProductWindow},
data() {
return {
isDisabled: false,
visible: false,
jumpTypeList: [
{id: 0, name: '无跳转'},
{id: 1, name: '商品详情'},
{id: 2, name: '分类列表'},
{id: 3, name: '商品列表'},
// {id: 4, name: ''},
],
homeId: '',
productCateList: [],
itemForm: Object.assign({}, defaultRole),
selectProductVisible: false,
selectProductShow: false,
selectProductNum: 0,
selectProductIndex: 0,
dataForm: {
id: 0,
name: '',
title: '',
homeId: '',
imgUrl: '',
jumpType: '',
jumpUrl: '',
jumpIds: '',
jumpIdsText: '',
business: '',
delFlag: '',
orderNo: '',
},
dataRule: {
name: [
{required: true, message: '名称 为必填项', trigger: 'blur'}
],
title: [
{required: true, message: '标题 为必填项', trigger: 'blur'}
],
jumpType: [
{required: true, message: '跳转类型 为必填项', trigger: 'blur'}
],
orderNo: [
{required: true, message: '排序 为必填项', trigger: 'blur'}
],
delFlag: [
{required: true, message: '是否有效 为必填项', trigger: 'blur'}
],
}
}
},
methods: {
init(homeId) { //
this.homeId = homeId
this.visible = true
document.querySelector('.el-dialog__wrapper .el-dialog').style.width = '75%'
},
//
addRow() {
this.itemForm.region.push(Object.assign({}, {
name: '',
title: '',
homeId: '',
imgUrl: '',
jumpType: '',
jumpUrl: '',
jumpIds: '',
jumpIdsText: '',
business: '',
delFlag: '',
orderNo: '',
}))
},
delRow(index) {
this.itemForm.region.splice(index, 1)
},
//
dataSubmit() {
this.$refs['itemForm'].validate((valid) => {
if (valid) {
this.loading = true;
this.itemForm.region.forEach((el, index) => {
el.homeId = this.homeId
})
const itemList = this.itemForm.region
api.createApi(itemList).then(res => {
this.$message.success('操作成功')
this.handleClose()
this.$nextTick(() => {
this.dialogVisible = false
})
setTimeout(() => {
this.$emit('refreshDataList')
}, 600)
this.loading = false;
})
} else {
return false
}
})
},
jumpTypeChange(index) {
this.itemForm.region[index].jumpIds = '';
this.itemForm.region[index].jumpIdsText = '';
},
selectProductOk() {
let products = this.$refs['select_product_window'].dataListSelections;
if (products.length <= 0) {
this.$message.error('请选择商品');
return;
}
if (this.selectProductNum !== 0 && this.selectProductNum < products.length) {
this.$message.error('只能选择' + this.selectProductNum + '件商品');
return;
}
let ids = products.map(item => { return item.id })
let storeName = products.map(item => { return item.storeName })
this.itemForm.region[this.selectProductIndex].jumpIds = ids + "";
this.itemForm.region[this.selectProductIndex].jumpIdsText = storeName + "";
this.selectProductSwitch(0);
},
selectProductSwitch(flag, num, index) {
this.selectProductVisible = (flag === 1 ? true : false);
this.selectProductShow = (flag === 1 ? true : false);
this.selectProductNum = (flag === 1 ? num : 0);
this.selectProductIndex = (flag === 1 ? index : 0);
},
selectCate() {
listCategroy({limit: 999, page: '1', status: 1, type: 1}).then(res => {
this.productCateList = res.list;
})
},
handleClose() {
this.visible = false
this.itemForm = {
region: [{
name: '',
title: '',
homeId: '',
imgUrl: '',
jumpType: '',
jumpUrl: '',
jumpIds: '',
jumpIdsText: '',
business: '',
delFlag: '',
orderNo: '',
}],
};
},
//
modalPicTap(tit, index) {
let _this = this.itemForm.region[index];
this.$modalUpload(function (img) {
if (tit === '1') {
_this.imgUrl = img[0].sattDir
}
}, tit, 'content')
},
}
}
</script>

View File

@ -0,0 +1,232 @@
<template>
<div class="divBox">
<el-card class="box-card">
<div slot="header" class="clearfix">
<div class="container">
<el-form ref="form" inline :model="dataForm" size="small">
<el-form-item label="标题:">
<el-input v-model="dataForm.name" placeholder="请输入名称/标题" class="selWidth" clearable>
<el-button slot="append" icon="el-icon-search" @click="handleSearch" />
</el-input>
</el-form-item>
</el-form>
</div>
<div class="acea-row">
<el-button v-hasPermi="['admin:home:save']" size="mini" type="primary" @click="addHandle()">新增数据</el-button>
<el-button v-hasPermi="['admin:home:delete']" size="mini" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button>
</div>
</div>
<el-table
ref="table"
v-loading="dataListLoading"
:data="dataList"
style="width: 100%"
size="mini"
highlight-current-row
@selection-change="selectionChangeHandle"
>
<el-table-column type="expand">
<template slot-scope="props">
<el-form label-position="left" inline class="demo-table-expand">
<el-form-item label="跳转参数解析: " style="width: 100%">
<span v-for="(value, key) in props.row.jumpIdsMap" class="mr10"> {{ key }} {{ value }} <br/></span>
</el-form-item>
</el-form>
</template>
</el-table-column>
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="name"
header-align="center"
align="center"
label="名称">
</el-table-column>
<el-table-column
prop="title"
header-align="center"
align="center"
label="标题">
</el-table-column>
<el-table-column label="封面图" min-width="80" header-align="center">
<template slot-scope="scope">
<div class="demo-image__preview" style="text-align: center">
<el-image v-if="scope.row.imgUrl"
style="width: 36px; height: 36px;"
:src="scope.row.imgUrl"
:preview-src-list="[scope.row.imgUrl]"
/>
</div>
</template>
</el-table-column>
<el-table-column
prop="jumpType"
header-align="center"
align="center"
label="跳转类型">
<template slot-scope="scope">
<span v-if="scope.row.jumpType == 0"></span>
<span v-else-if="scope.row.jumpType == 1">商品详情</span>
<span v-else-if="scope.row.jumpType == 2">分类列表</span>
<span v-else-if="scope.row.jumpType == 3">商品列表</span>
<!-- <span v-else-if="scope.row.jumpType == 4">活动栏目</span>-->
</template>
</el-table-column>
<el-table-column
prop="jumpIds"
header-align="center"
align="center"
label="跳转参数">
</el-table-column>
<el-table-column
prop="type"
header-align="center"
align="center"
label="类型">
<template slot-scope="scope">
<span v-if="scope.row.type == 0">商品</span>
<span v-else-if="scope.row.type == 1">轮播图</span>
</template>
</el-table-column>
<el-table-column
prop="orderNo"
header-align="center"
align="center"
label="排序">
</el-table-column>
<el-table-column
prop="status"
header-align="center"
align="center"
label="状态">
<template slot-scope="scope">
<span v-if="scope.row.delFlag == 0">无效</span>
<span v-else-if="scope.row.delFlag == 1">有效</span>
</template>
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="250"
label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" @click="updateHandle(scope.row.id)">修改</el-button>
<el-button type="text" size="small" @click="deleteHandle(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 新增数据 -->
<save v-if="addVisible" ref="save" @refreshDataList="getDataList"></save>
<!-- 修改数据 -->
<update v-if="updateVisible" ref="update" @refreshDataList="getDataList"></update>
</el-card>
</div>
</template>
<script>
import Update from './update-item'
import Save from './add-item'
import * as api from '@/api/homeItem.js'
export default {
data() {
return {
dataForm: {
homeId: 0,
name: '',
},
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
updateVisible: false,
addVisible: false,
}
},
components: {
Update, Save
},
mounted() {
this.dataForm.homeId = this.$route.params.id
this.getDataList()
},
methods: {
//
getDataList() {
this.dataListLoading = true
api.listApi(this.dataForm).then(res => {
this.dataList = res.list
this.totalPage = res.total
this.dataListLoading = false
}).catch(res => {
this.dataListLoading = false
this.$message.error(res.message)
})
},
handleSearch() {
this.page = 1
this.getDataList()
},
//
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
//
currentChangeHandle(val) {
this.pageIndex = val
this.getDataList()
},
//
selectionChangeHandle(val) {
this.dataListSelections = val
},
//
updateHandle(id) {
this.updateVisible = true
this.$nextTick(() => {
this.$refs.update.init(id)
})
},
//
addHandle() {
this.addVisible = true
this.$nextTick(() => {
this.$refs.save.init(this.dataForm.homeId)
})
},
//
deleteHandle(id) {
var ids = id ? [id] : this.dataListSelections.map(item => {
return item.id
})
this.$confirm(`您确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
api.deleteApi({ids : ids.join(',')}).then(res => {
this.$message.success('操作成功')
this.getDataList()
})
})
}
}
}
</script>

View File

@ -0,0 +1,204 @@
<template>
<div>
<!-- 基于 Element UI 新增和修改弹窗 -->
<el-dialog
:title="'楼层子项调整'"
:close-on-click-modal="false"
:visible.sync="visible"
>
<!-- 新增和创建表单表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()"
label-width="110px">
<el-form-item label="名称" prop="name">
<el-input v-model="dataForm.name" placeholder="名称"></el-input>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-input v-model="dataForm.title" placeholder="标题"></el-input>
</el-form-item>
<el-form-item label="楼层图:" prop="imgUrl">
<div class="upLoadPicBox" @click="modalPicTap('1')" :disabled="isDisabled">
<div v-if="dataForm.imgUrl" class="pictrue"><img :src="dataForm.imgUrl"></div>
<div v-else class="upLoad">
<i class="el-icon-camera cameraIconfont" />
</div>
</div>
</el-form-item>
<el-form-item label="跳转类型" prop="jumpType">
<el-select v-model="dataForm.jumpType" placeholder="请选择" class="selWidthd" style="width: 220px" @change="jumpTypeChange()">
<el-option :value="item.id" v-for="(item, index) in jumpTypeList" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="选商品" prop="jumpIdsText" v-if="dataForm.jumpType == 1">
<el-input v-model="dataForm.jumpIdsText" placeholder="选商品" @click.native="selectProductSwitch(1)"></el-input>
</el-form-item>
<el-form-item label="选分类" prop="jumpIds" v-else-if="dataForm.jumpType == 2">
<el-select v-model="dataForm.jumpIds" placeholder="选分类" class="selWidthd" style="width: 220px" @click.native="selectCate">
<el-option :value="item.id.toString()" v-for="(item, index) in productCateList" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="选商品" prop="jumpIdsText" v-else-if="dataForm.jumpType == 3">
<el-input v-model="dataForm.jumpIdsText" placeholder="选商品" @click.native="selectProductSwitch(1)"></el-input>
</el-form-item>
<!-- <el-form-item label="选活动" prop="jumpIds" v-if="dataForm.jumpType === 4">-->
<!-- <el-input v-model="dataForm.jumpIds" placeholder="选活动"></el-input>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="跳转地址" prop="jumpUrl">-->
<!-- <el-input v-model="dataForm.jumpUrl" placeholder="跳转地址"></el-input>-->
<!-- </el-form-item>-->
<el-form-item label="是否无效" prop="status">
<el-select v-model="dataForm.delFlag" class="selWidthd" style="width: 220px">
<el-option label="有效" :value="1"></el-option>
<el-option label="无效" :value="0"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataSubmit()">确定</el-button>
</span>
</el-dialog>
<el-dialog
title="选择商品"
:close-on-click-modal="false"
:visible.sync="selectProductVisible"
@close="selectProductSwitch(0)">
<!-- 选择商品 -->
<selectProductWindow v-if="selectProductShow" ref="select_product_window"/>
<el-button type="primary" @click="selectProductOk()" style="margin-left: 90%">确定</el-button>
</el-dialog>
</div>
</template>
<script>
import * as api from '@/api/homeItem.js'
import { listCategroy } from "@/api/categoryApi";
import selectProductWindow from "@/views/home/selectProduct";
export default {
components: {selectProductWindow},
data() {
return {
isDisabled: false,
visible: false,
jumpTypeList: [
{id: 0, name: '无跳转'},
{id: 1, name: '商品详情'},
{id: 2, name: '分类列表'},
{id: 3, name: '商品列表'},
// {id: 4, name: ''},
],
productCateList: [],
selectProductVisible: false,
selectProductShow: false,
dataForm: {
id: 0,
name: '',
title: '',
homeId: '',
imgUrl: '',
jumpType: '',
jumpUrl: '',
jumpIds: '',
jumpIdsText: '',
business: '',
delFlag: '',
orderNo: '',
},
dataRule: {
name: [
{required: true, message: '名称 为必填项', trigger: 'blur'}
],
title: [
{required: true, message: '标题 为必填项', trigger: 'blur'}
],
jumpType: [
{required: true, message: '跳转类型 为必填项', trigger: 'blur'}
],
orderNo: [
{required: true, message: '排序 为必填项', trigger: 'blur'}
],
delFlag: [
{required: true, message: '是否有效 为必填项', trigger: 'blur'}
],
}
}
},
methods: {
init(id) { //
document.querySelector('.el-dialog__wrapper .el-dialog').style.width = '45%'
this.dataForm.id = id
this.visible = true
this.$nextTick(() => {
this.$refs['dataForm'].resetFields()
if (this.dataForm.id) {
api.detailApi(id).then(res => {
this.dataForm = res;
})
this.selectCate()
}
})
},
//
dataSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
this.loading = true;
api.updateApi(this.dataForm).then(res => {
this.$message.success('修改成功');
})
this.visible = false;
setTimeout(() => {
this.$emit('refreshDataList')
}, 600)
this.loading = false;
}
})
},
jumpTypeChange() {
this.dataForm.jumpIds = '';
this.dataForm.jumpIdsText = '';
},
selectProductOk() {
let products = this.$refs['select_product_window'].dataListSelections;
if (products.length <= 0) {
this.$message.error('请选择商品');
return;
}
if (this.selectProductNum !== 0 && this.selectProductNum < products.length) {
this.$message.error('只能选择' + this.selectProductNum + '件商品');
return;
}
let ids = products.map(item => { return item.id })
let storeName = products.map(item => { return item.storeName })
this.dataForm.jumpIds = ids + "";
this.dataForm.jumpIdsText = storeName + "";
this.selectProductSwitch(0);
},
selectProductSwitch(flag, num, index) {
this.selectProductVisible = (flag === 1 ? true : false);
this.selectProductShow = (flag === 1 ? true : false);
this.selectProductNum = (flag === 1 ? num : 0);
},
selectCate() {
listCategroy({ limit: 999, page: '1', status: 1, type: 1 }).then(res => {
this.productCateList = res.list;
})
},
//
modalPicTap (tit, num, i,status) {
const _this = this;
if(_this.isDisabled) return;
this.$modalUpload(function(img) {
if(tit==='1'&& !num){
_this.dataForm.imgUrl = img[0].sattDir
}
},tit, 'content')
},
}
}
</script>

View File

@ -0,0 +1,120 @@
<template>
<div class="divBox">
<el-card class="box-card">
<div slot="header" class="clearfix">
<div class="container">
<el-form inline :model="dataForm" size="small">
<el-form-item label="商品搜索:">
<el-input v-model="dataForm.keywords" placeholder="请输入商品名称关键字商品ID" class="selWidth"
size="small" clearable>
<el-button slot="append" icon="el-icon-search" @click="handleSearch" size="small"/>
</el-input>
</el-form-item>
</el-form>
</div>
</div>
<el-table
ref="table"
v-loading="dataListLoading"
:data="dataList"
style="width: 100%"
size="mini"
highlight-current-row
@selection-change="selectionChangeHandle"
>
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="id"
label="ID"
min-width="30%"
/>
<el-table-column label="商品图" min-width="30%">
<template slot-scope="scope">
<div class="demo-image__preview">
<el-image
style="width: 36px; height: 36px"
:src="scope.row.image"
:preview-src-list="[scope.row.image]"
/>
</div>
</template>
</el-table-column>
<el-table-column label="商品名称"
prop="storeName"
min-width="40%"
:show-overflow-tooltip="true">
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="dataForm.page"
:page-sizes="[6, 20, 50, 100]"
:page-size="dataForm.limit"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
</el-card>
</div>
</template>
<script>
import {productLstApi} from '@/api/store'
export default {
data() {
return {
dataForm: {
keywords: '',
page: 1,
limit: 6,
type: '0'
},
dataList: [],
totalPage: 0,
dataListSelections: [],
dataListLoading: false
}
},
created() {
this.getDataList()
},
methods: {
//
getDataList() {
this.dataListLoading = true
productLstApi(this.dataForm).then(res => {
this.dataList = res.list
this.totalPage = res.total
this.dataListLoading = false
}).catch(res => {
this.dataListLoading = false
this.$message.error(res.message)
})
},
handleSearch() {
this.dataForm.page = 1
this.getDataList()
},
//
sizeChangeHandle(val) {
this.dataForm.limit = val
this.dataForm.page = 1
this.getDataList()
},
//
currentChangeHandle(val) {
this.dataForm.page = val
this.getDataList()
},
//
selectionChangeHandle(val) {
this.dataListSelections = val
},
}
}
</script>

View File

@ -9,10 +9,11 @@
<el-radio-button label="all">全部 {{ '(' +orderChartType.all?orderChartType.all:0 + ')' }}</el-radio-button>
<el-radio-button label="unPaid">未支付 {{ '(' +orderChartType.unPaid?orderChartType.unPaid:0+ ')' }}</el-radio-button>
<el-radio-button label="notShipped">未发货 {{ '(' +orderChartType.notShipped?orderChartType.notShipped:0+ ')' }}</el-radio-button>
<el-radio-button label="prepareIng">备货中 {{ '(' +orderChartType.prepareIng?orderChartType.prepareIng:0+ ')' }}</el-radio-button>
<el-radio-button label="spike">待收货 {{ '(' +orderChartType.spike?orderChartType.spike:0+ ')' }}</el-radio-button>
<el-radio-button label="bargain">待评价 {{ '(' +orderChartType.bargain?orderChartType.bargain:0+ ')' }}</el-radio-button>
<el-radio-button label="complete">交易完成 {{ '(' +orderChartType.complete?orderChartType.complete:0+ ')' }}</el-radio-button>
<el-radio-button label="toBeWrittenOff">待核销 {{ '(' +orderChartType.toBeWrittenOff?orderChartType.toBeWrittenOff:0+ ')' }}</el-radio-button>
<!--<el-radio-button label="toBeWrittenOff">待核销 {{ '(' +orderChartType.toBeWrittenOff?orderChartType.toBeWrittenOff:0+ ')' }}</el-radio-button>-->
<el-radio-button label="refunding">退款中 {{ '(' +orderChartType.refunding?orderChartType.refunding:0+ ')' }}</el-radio-button>
<el-radio-button label="refunded">已退款 {{ '(' +orderChartType.refunded?orderChartType.refunded:0+ ')' }}</el-radio-button>
<el-radio-button label="deleted">已删除 {{ '(' +orderChartType.deleted?orderChartType.deleted:0+ ')' }}</el-radio-button>
@ -55,16 +56,16 @@
:data="tableData.data"
size="mini"
class="table"
@selection-change="handleSelectionChange"
highlight-current-row
:header-cell-style=" {fontWeight:'bold'}"
:row-key="(row)=>{ return row.orderId}"
>
<!-- @selection-change="handleSelectionChange" -->
<!-- <el-table-column
<el-table-column
type="selection"
:reserve-selection="true"
width="55"
/> -->
/>
<el-table-column
label="订单号"
min-width="210"
@ -145,7 +146,7 @@
<span class="acea-row">
退款凭证
<template v-if="scope.row.refundReasonWapImg">
<div v-for="(item, index) in scope.row.refundReasonWapImg.split(',')" :key="index" class="demo-image__preview" style="width: 35px;height: auto;display: inline-block;">
<div v-for="(item, index) in scope.row.refundReasonWapImg.split(',')" :key="index" class="demo-image__preview" style="width: 35px;height: auto;margin-right:5px;display: inline-block;">
<el-image
:src="item"
:preview-src-list="[item]"
@ -169,8 +170,9 @@
/>
<el-table-column label="操作" min-width="150" fixed="right" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.paid === false" type="text" size="small" @click="edit(scope.row)" class="mr10" v-hasPermi="['admin:order:update:price']">编辑</el-button>
<el-button v-if="scope.row.statusStr.key === 'notShipped' && scope.row.refundStatus ===0" type="text" size="small" class="mr10" @click="sendOrder(scope.row)" v-hasPermi="['admin:order:send']">发送货</el-button>
<el-button v-if="scope.row.paid === false" type="text" size="small" @click="edit(scope.row)" class="mr10" v-hasPermi="['admin:order:update:price']">编辑</el-button>
<el-button v-if="scope.row.statusStr.key === 'notShipped' && scope.row.refundStatus ===0" type="text" size="small" class="mr10" @click="prepare(scope.row)" v-hasPermi="['admin:order:send']">去备货</el-button>
<el-button v-if="scope.row.statusStr.key === 'prepareIng' && scope.row.refundStatus ===0" type="text" size="small" class="mr10" @click="sendOrder(scope.row)" v-hasPermi="['admin:order:send']">发送货</el-button>
<el-button v-if=" scope.row.statusStr.key === 'toBeWrittenOff' && scope.row.paid == true && scope.row.refundStatus === 0 " type="text" size="small" class="mr10" v-hasPermi="['admin:order:write:update']" @click="onWriteOff(scope.row)">立即核销</el-button>
<el-dropdown trigger="click">
<span class="el-dropdown-link">
@ -306,7 +308,7 @@
</template>
<script>
import { orderListDataApi, orderStatusNumApi, writeUpdateApi, orderListApi, updatePriceApi, orderLogApi, orderMarkApi, orderDeleteApi, orderRefuseApi, orderRefundApi,orderPrint } from '@/api/order'
import { orderListDataApi, orderStatusNumApi, writeUpdateApi, orderListApi, updatePriceApi, orderLogApi, orderMarkApi, orderDeleteApi, orderRefuseApi, orderRefundApi, orderPrint, prepareApi } from '@/api/order'
import cardsData from '@/components/cards/index'
import zbParser from '@/components/FormGenerator/components/parser/ZBParser'
import detailsFrom from './orderDetail'
@ -316,7 +318,9 @@
import Cookies from 'js-cookie'
import { isWriteOff } from "@/utils";
import {orderExcelApi} from '@/api/store'
import { checkPermi } from "@/utils/permission"; //
import { checkPermi } from "@/utils/permission";
import * as categoryApi from "@/api/categoryApi";
import * as api from "@/api/systemHelp"; //
export default {
name: 'orderlistDetails',
components: {
@ -436,7 +440,7 @@
onOrderRefund(row) {
this.refundData = {
orderId: row.orderId,
amount: row.payPrice,
amount: row.refundPrice,
type: ''
}
this.orderids = row.orderId
@ -449,11 +453,25 @@
this.getList()
})
},
//
prepare(row) {
var ids = row ? row.id : this.ids;
this.$confirm(`您确定对选中的订单进行【${row ? '备货' : '批量备货'}】操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
prepareApi({ ids: ids}).then(data => {
this.$message.success('备货成功')
this.getList()
})
})
},
//
sendOrder(row) {
if(row.type===0){
this.$refs.send.modals = true;
this.$refs.send.getList();
// this.$refs.send.getList();
this.$refs.send.sheetInfo();
}else{
this.$refs.videoSend.modals = true;

View File

@ -66,6 +66,36 @@
<div class="description-term">送货人电话{{orderDatalist.deliveryId}}</div>
</div>
</template>
<template v-if="orderDatalist.refundStatus > 0">
<el-divider></el-divider>
<div class="title">退款售后</div>
<div class="acea-row">
<div class="description-term">售后单号{{orderDatalist.returnInfo.code}}</div>
<div class="description-term">售后金额{{orderDatalist.returnInfo.returnAmount}}</div>
<div class="description-term">售后时间{{orderDatalist.returnInfo.createTime}}</div>
<div class="description-term">售后原因{{orderDatalist.returnInfo.returnReason}}</div>
<div class="description-term">售后数量{{orderDatalist.returnInfo.returnNum}}</div>
</div>
<fieldset class="border p-3">
<legend>凭证</legend>
<div v-for="(item, index) in orderDatalist.refundReasonWapImg.split(',')" :key="index" class="demo-image__preview" style="width: 35px; height: 35px; margin-right: 15px; display: inline-block;">
<el-image :src="item" :preview-src-list="[item]"/>
</div>
</fieldset>
<fieldset class="border p-3">
<legend>商品</legend>
<div v-if=" orderDatalist.returnInfo.returnInfoList && orderDatalist.returnInfo.returnInfoList.length">
<div v-for="(val, i ) in orderDatalist.returnInfo.returnInfoList" :key="i" class="tabBox acea-row row-middle">
<div class="demo-image__preview mr10" style="width: 35px; height: 35px">
<el-image :src="val.image" :preview-src-list="[val.image]"/>
</div>
<div class="text_overflow">
<div class="description-term">{{ val.storeName + ' x '+ val.returnNum }}</div>
</div>
</div>
</div>
</fieldset>
</template>
<template v-if="orderDatalist.mark">
<el-divider></el-divider>
<div class="title">用户备注</div>
@ -104,10 +134,14 @@
</div>
</template>
<script>0
<script>
import Level from "@/views/user/list/level.vue";
0
import { orderDetailApi, getLogisticsInfoApi } from '@/api/order'
export default {
name: 'OrderDetail',
components: {Level},
props: {
orderId: {
type: String,
@ -217,4 +251,10 @@ export default {
}
}
fieldset {
border: 1px solid #ccc; /* 设置边框 */
padding: 10px; /* 设置内边距 */
margin: 10px 0; /* 设置外边距 */
}
</style>

View File

@ -3,9 +3,9 @@
<el-form ref="formItem" :model="formItem" label-width="110px" @submit.native.prevent :rules="rules">
<el-form-item label="选择类型:">
<el-radio-group v-model="formItem.type" @change="changeRadioType(formItem.type)">
<el-radio label="1">发货</el-radio>
<!-- <el-radio label="1">发货</el-radio>-->
<el-radio label="2">送货</el-radio>
<el-radio label="3">虚拟</el-radio>
<!-- <el-radio label="3">虚拟</el-radio>-->
</el-radio-group>
</el-form-item>
<div v-if="formItem.type==='1'">
@ -67,12 +67,12 @@
<el-input v-model="formItem.deliveryTel" placeholder="请输入送货人电话" style="width:80%;"></el-input>
</el-form-item>
</div>
<div>
<el-form-item label="" >
<div style="color:#CECECE;">顺丰请输入单号收件人或寄件人手机号后四位</div>
<div style="color:#CECECE;">例如SF000000000000:3941</div>
</el-form-item>
</div>
<!-- <div>-->
<!-- <el-form-item label="" >-->
<!-- <div style="color:#CECECE;">顺丰请输入单号收件人或寄件人手机号后四位</div>-->
<!-- <div style="color:#CECECE;">例如SF000000000000:3941</div>-->
<!-- </el-form-item>-->
<!-- </div>-->
</el-form>
<div slot="footer">
<el-button type="primary" @click="putSend('formItem')">提交</el-button>
@ -103,7 +103,7 @@
data() {
return {
formItem: {
type: '1',
type: '2',
expressRecordType: '1',
expressId: '',
expressCode: '',
@ -220,7 +220,7 @@
cancel(name) {
this.modals = false;
this.$refs[name].resetFields();
this.formItem.type = '1';
this.formItem.type = '2';
this.formItem.expressRecordType = '1';
}
}

View File

@ -291,6 +291,13 @@
</el-form-item>
</el-col>
</el-row>
<el-row v-show="currentTab === 1 && !isDisabled">
<el-col :span="24">
<el-form-item label="质检报告:">
<Tinymce v-model="formValidate.qualityTest"></Tinymce>
</el-form-item>
</el-col>
</el-row>
<el-row v-show="currentTab === 1 && isDisabled">
<el-col :span="24">
<el-form-item label="商品详情:">
@ -298,6 +305,13 @@
</el-form-item>
</el-col>
</el-row>
<el-row v-show="currentTab === 1 && isDisabled">
<el-col :span="24">
<el-form-item label="质检报告:">
<span v-html="formValidate.qualityTest || '无'"></span>
</el-form-item>
</el-col>
</el-row>
<!-- 其他设置-->
<el-row v-show="currentTab === 2">
<el-col :span="24">
@ -306,11 +320,11 @@
<el-input-number v-model="formValidate.sort" :min="0" placeholder="请输入排序" :disabled="isDisabled" />
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="积分:">
<el-input-number v-model="formValidate.giveIntegral" :min="0" placeholder="请输入排序" :disabled="isDisabled" />
</el-form-item>
</el-col>
<!-- <el-col v-bind="grid">-->
<!-- <el-form-item label="积分:">-->
<!-- <el-input-number v-model="formValidate.giveIntegral" :min="0" placeholder="请输入排序" :disabled="isDisabled" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col v-bind="grid">
<el-form-item label="虚拟销量:">
<el-input-number v-model="formValidate.ficti" :min="0" placeholder="请输入排序" :disabled="isDisabled" />
@ -421,7 +435,7 @@
cost: 0,
otPrice: 0,
stock: 0,
barCode: '',
// barCode: '',
// weight: 0,
// volume: 0
}],
@ -429,11 +443,12 @@
selectRule: '',
isSub: false,
content: '',
qualityTest: '',
specType: false,
id: 0,
couponIds: [],
coupons: [],
activity: ['默认','秒杀']
activity: ['默认']//,''
}
const objTitle = {
price: {
@ -448,9 +463,9 @@
stock: {
title: '库存'
},
barCode: {
title: '商品编号'
},
// barCode: {
// title: ''
// },
// weight: {
// title: 'KG'
// },
@ -464,7 +479,7 @@
data() {
return {
isDisabled: this.$route.params.isDisabled==='1'?true:false,
activity: { '默认': 'red', '秒杀': 'blue' },
activity: { '默认': 'red'}, // , '': 'blue'
props2: {
children: 'child',
label: 'name',
@ -705,7 +720,7 @@
cost: 0,
otPrice: 0,
stock: 0,
barCode: '',
// barCode: '',
// weight: 0,
// volume: 0,
brokerage: 0,
@ -736,7 +751,7 @@
cost: 0,
otPrice: 0,
stock: 0,
barCode: '',
// barCode: '',
// weight: 0,
// volume: 0,
brokerage: 0,
@ -869,7 +884,7 @@
this.$set(val, 'cost', this.oneFormBatch[0].cost)
this.$set(val, 'otPrice', this.oneFormBatch[0].otPrice)
this.$set(val, 'stock', this.oneFormBatch[0].stock)
this.$set(val, 'barCode', this.oneFormBatch[0].barCode)
// this.$set(val, 'barCode', this.oneFormBatch[0].barCode)
// this.$set(val, 'weight', this.oneFormBatch[0].weight)
// this.$set(val, 'volume', this.oneFormBatch[0].volume)
this.$set(val, 'brokerage', this.oneFormBatch[0].brokerage)
@ -978,13 +993,14 @@
selectRule: info.selectRule,
isSub: info.isSub,
content: this.$selfUtil.replaceImgSrcHttps(info.content),
qualityTest: this.$selfUtil.replaceImgSrcHttps(info.qualityTest),
specType: info.specType,
id: info.id,
giveIntegral: info.giveIntegral,
ficti: info.ficti,
coupons: info.coupons,
couponIds: info.couponIds,
activity: info.activityStr ? info.activityStr.split(',') : ['默认','秒杀']
activity: info.activityStr ? info.activityStr.split(',') : ['默认']// ,''
}
marketingSendApi({type:3}).then(res=>{
if(this.formValidate.couponIds !== null){
@ -1217,12 +1233,13 @@
goodDesignList({gid:70}).then((response)=>{
let list = response.list;
let arr = [],arr1 = [];
const listArr = [{ name: '是否热卖', value: 'isGood' }];
const listArr = [{ name: '为你推荐', value: 'isGood' }];
let typeLists = [
{ name: '', value: 'isHot',type:'2' }, //
{ name: '', value: 'isBenefit' ,type:'4'}, //
// { name: '', value: 'isHot',type:'2' }, //
// { name: '', value: 'isBenefit' ,type:'4'}, //
{ name: '', value: 'isBest',type:'1' }, //
{ name: '', value: 'isNew',type:'3' }]; //
// { name: '', value: 'isNew',type:'3' }, //
];
list.forEach((item)=>{
let obj = {};
obj.value = JSON.parse(item.value);

View File

@ -21,7 +21,8 @@
<el-button size="small" type="primary" class="mr10" v-hasPermi="['admin:product:save']">添加商品</el-button>
</router-link>
<!-- <el-button size="small" type="success" class="mr10" @click="onCopy" v-hasPermi="['admin:product:save']">商品采集</el-button>-->
<!-- <el-button size="small" icon="el-icon-upload2" @click="exports" v-hasPermi="['admin:export:excel:product']">导出</el-button>-->
<el-button size="small" type="success" class="mr10" @click="importExcel">商品导入</el-button>
<el-button size="small" icon="el-icon-upload2" @click="exports" v-hasPermi="['admin:export:excel:product']">导出</el-button>
</div>
<el-table
v-loading="listLoading"
@ -133,14 +134,17 @@
<router-link :to="{path: '/store/list/creatProduct/' + scope.row.id}">
<el-button type="text" size="small" class="mr10" v-if="tableFrom.type !== '5' && tableFrom.type !== '1'" v-hasPermi="['admin:product:update']">编辑</el-button>
</router-link>
<el-button v-if="tableFrom.type === '5'" type="text" size="small" @click="handleRestore(scope.row.id, scope.$index)" v-hasPermi="['admin:product:restore']">恢复商品</el-button>
<el-button v-if="tableFrom.type === '5'" type="text" size="small" @click="handleRestore(scope.row.id, scope.$index)" v-hasPermi="['admin:product:restore']">恢复商品</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.id, tableFrom.type)" v-hasPermi="['admin:product:delete']">{{ tableFrom.type === '5' ? '删除' : '加入回收站' }}</el-button>
<router-link :to="{path: '/store/problem/' + scope.row.id + ''}">
<el-button type="text" size="small" class="mr10" v-hasPermi="['admin:problem:info']">常见问题</el-button>
</router-link>
</template>
</el-table-column>
</el-table>
<div class="block">
<el-pagination
:page-sizes="[20, 40, 60, 80]"
:page-sizes="[10, 20, 40, 60]"
:page-size="tableFrom.limit"
:current-page="tableFrom.page"
layout="total, sizes, prev, pager, next, jumper"
@ -150,6 +154,7 @@
/>
</div>
</el-card>
<el-dialog
title="复制淘宝、天猫、京东、苏宁"
:visible.sync="dialogVisible"
@ -159,17 +164,56 @@
:before-close="handleClose">
<tao-bao v-if="dialogVisible" @handleCloseMod="handleCloseMod"></tao-bao>
</el-dialog>
<el-dialog
:visible.sync="importVisible"
title="导入文件"
:close-on-click-modal="false"
width="1200px"
@close="uploadExcelClose">
<el-row type="flex" justify="center" align="centre">
<el-col :span="18">
<upload-excel-component :on-success="handleSuccess" :before-upload="beforeUpload" ref="excel-upload-input"/>
</el-col>
<el-col :span="2" style="line-height: 160px">
<el-button plain type="primary" @click="excelUpload" :disabled="excelUploadState">上传到服务器</el-button>
</el-col>
</el-row>
</el-dialog>
</div>
</template>
<script>
import { productLstApi, productDeleteApi, categoryApi, putOnShellApi, offShellApi, productHeadersApi, productExportApi, restoreApi, productExcelApi } from '@/api/store'
import {
productLstApi,
productDeleteApi,
categoryApi,
putOnShellApi,
offShellApi,
productHeadersApi,
productExportApi,
restoreApi,
productExcelApi,
importExcelApi,
replyListApi, productDetailApi
} from '@/api/store'
import { getToken } from '@/utils/auth'
import taoBao from './taoBao'
import { checkPermi } from "@/utils/permission"; //
import UploadExcelComponent from '@/components/UploadExcel/index.vue'
import { checkPermi } from "@/utils/permission";
import CreatTemplates from "@/views/systemSetting/logistics/shippingTemplates/creatTemplates.vue";
import edit from "@/components/Category/edit.vue";
import tableHeader from "element-ui/packages/table/src/table-header";
import {fileImageApi} from "@/api/systemSetting";
import AddOrUpdate from "@/views/home/add-and-update.vue"; //
export default {
name: 'ProductList',
components: { taoBao },
computed: {
tableHeader() {
return tableHeader
}
},
components: {AddOrUpdate, edit, CreatTemplates, taoBao, UploadExcelComponent },
data() {
return {
props: {
@ -187,15 +231,21 @@ export default {
},
tableFrom: {
page: 1,
limit: 20,
limit: 10,
cateId: '',
keywords: '',
type: '1'
},
excelTableData: [],
excelTableHeader: [],
excelUploadState: true,
excelUploadFile: '',
categoryList: [],
merCateList: [],
objectUrl: process.env.VUE_APP_BASE_API,
dialogVisible: false,
importVisible: false,
problemVisible: false,
}
},
mounted() {
@ -216,6 +266,42 @@ export default {
})
});
},
beforeUpload(file) {
this.excelUploadState = false;
this.excelUploadFile = file;
const isLt1M = file.size / 1024 / 1024 < 1;
if (isLt1M) { return true; }
this.$message.warning("上传文件不能大于1M");
this.excelUploadState = true;
return false;
},
handleSuccess({ results, header }) {
this.excelTableData = results;
this.excelTableHeader = header;
},
async excelUpload() {
if (this.excelTableData.length === 0 || this.excelTableHeader.length === 0) {
this.$message.error("数据为空,不能上传");
}
let loading = this.$loading({
lock: true,
text: "上传中,请稍候...",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)",
});
const formData = new FormData();
formData.append("multipart", this.excelUploadFile);
importExcelApi(formData).then(res => {
loading.close();
this.$message.success("上传成功");
this.tableData.page = 1;
this.goodHeade()
this.getList()
this.importVisible = false;
}).catch(() => {
loading.close();
})
},
seachList() {
this.tableFrom.page = 1
this.getList()
@ -223,6 +309,11 @@ export default {
handleClose() {
this.dialogVisible = false
},
uploadExcelClose() {
this.importVisible = false
this.excelUploadState = true;
this.$refs['excel-upload-input'].resetData();
},
handleCloseMod(item){
this.dialogVisible = item
this.goodHeade();
@ -232,12 +323,42 @@ export default {
onCopy(){
this.dialogVisible = true
},
//
modalPicTap (tit, num, i,status) {
const _this = this;
if(_this.isDisabled) return;
this.$modalUpload(function(img) {
if(tit==='1'&& !num){
_this.formValidate.image = img[0].sattDir
_this.OneattrValue[0].image = img[0].sattDir
}
if(tit==='2'&& !num){
if(img.length>10) return this.$message.warning("最多选择10张图片");
if(img.length + _this.formValidate.sliderImages.length > 10) return this.$message.warning("最多选择10张图片");
img.map((item) => {
_this.formValidate.sliderImages.push(item.sattDir)
});
}
if(tit==='1'&& num === 'dan' ){
_this.OneattrValue[0].image = img[0].sattDir
}
if(tit==='1'&& num === 'duo' ){
_this.ManyAttrValue[i].image = img[0].sattDir
}
if(tit==='1'&& num === 'pi' ){
_this.oneFormBatch[0].image = img[0].sattDir
}
},tit, 'content')
},
//
exports () {
productExcelApi({cateId:this.tableFrom.cateId,keywords: this.tableFrom.keywords, type:this.tableFrom.type}).then((res) => {
window.location.href = res.fileName;
})
},
importExcel() {
this.importVisible = true
},
//
goodHeade () {
productHeadersApi().then(res => {
@ -285,6 +406,12 @@ export default {
})
})
},
productProblem(id) {
this.problemVisible = true
this.$nextTick(() => {
this.$refs.problemList.init(id)
})
},
onchangeIsShow(row) {
row.isShow
? putOnShellApi( row.id ).then(() => {

View File

@ -0,0 +1,90 @@
<template>
<div>
<!-- 基于 Element UI 新增和修改弹窗 -->
<el-dialog
:title="!dataForm.id ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible"
>
<!-- 新增和创建表单表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="90px">
<el-form-item label="问题:" prop="title">
<el-input v-model="dataForm.title" placeholder="问题"></el-input>
</el-form-item>
<el-form-item label="回答:" prop="content">
<Tinymce v-model="dataForm.content" placeholder="回答"></Tinymce>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataSubmit()">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Tinymce from '@/components/Tinymce/index'
import * as api from '@/api/problem.js'
export default {
components: { Tinymce },
data() {
return {
visible: false,
productCateList: [],
selectProductVisible: false,
selectProductShow: false,
dataForm: {
id: 0,
title: '',
content: '',
businessId: '',
},
dataRule: {
title: [
{required: true, message: '问题 为必填项', trigger: 'blur'}
],
content: [
{required: true, message: '回答 为必填项', trigger: 'blur'}
],
}
}
},
methods: {
init(id, businessId) {
this.dataForm.id = id || 0
this.dataForm.businessId = businessId
this.visible = true
this.$nextTick(() => {
this.$refs['dataForm'].resetFields()
if (this.dataForm.id) {
api.detailApi(id).then(res => {
this.dataForm.title = res.title;
this.dataForm.content = this.$selfUtil.replaceImgSrcHttps(res.content);
})
}
})
},
//
dataSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
this.dataForm.id ?
api.updateApi(this.dataForm).then(res => {
this.$message.success('修改成功');
}) :
api.createApi(this.dataForm).then(res => {
this.$message.success('新增成功');
});
setTimeout(() => {
this.$emit('refreshDataList')
}, 600)
this.visible = false;
}
})
},
}
}
</script>

View File

@ -0,0 +1,156 @@
<template>
<div class="divBox">
<el-card class="box-card">
<div slot="header" class="clearfix">
<div class="container">
<el-form ref="form" inline :model="dataForm" size="small">
<el-form-item label="标题:">
<el-input v-model="dataForm.title" placeholder="请输入问题/回答内容" class="selWidth" clearable>
<el-button slot="append" icon="el-icon-search" @click="handleSearch" />
</el-input>
</el-form-item>
</el-form>
</div>
<div class="acea-row">
<el-button v-hasPermi="['admin:problem:save']" size="mini" type="primary" @click="addOrUpdateHandle()">新增数据</el-button>
<el-button v-hasPermi="['admin:problem:delete']" size="mini" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button>
</div>
</div>
<el-table
ref="table"
v-loading="dataListLoading"
:data="dataList"
style="width: 100%"
size="mini"
highlight-current-row
@selection-change="selectionChangeHandle"
>
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="title"
header-align="center"
align="center"
label="问题">
</el-table-column>
<!-- <el-table-column-->
<!-- prop="content"-->
<!-- header-align="center"-->
<!-- align="center"-->
<!-- label="回答">-->
<!-- </el-table-column>-->
<el-table-column
fixed="right"
header-align="center"
align="center"
width="250"
label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
<el-button type="text" size="small" @click="deleteHandle(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 表单弹窗, 新增数据和修改数据 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</el-card>
</div>
</template>
<script>
import AddOrUpdate from './add-and-update'
import * as api from '@/api/problem.js'
export default {
data() {
return {
dataForm: {
title: '',
businessId: ''
},
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false,
}
},
components: {
AddOrUpdate
},
mounted() {
this.dataForm.businessId = this.$route.params.id
this.getDataList()
},
methods: {
//
getDataList() {
this.dataListLoading = true
api.listApi(this.dataForm).then(res => {
this.dataList = res.list
this.totalPage = res.total
this.dataListLoading = false
}).catch(res => {
this.dataListLoading = false
this.$message.error(res.message)
})
},
handleSearch() {
this.page = 1
this.getDataList()
},
//
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
//
currentChangeHandle(val) {
this.pageIndex = val
this.getDataList()
},
//
selectionChangeHandle(val) {
this.dataListSelections = val
},
// /
addOrUpdateHandle(id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id, this.dataForm.businessId)
})
},
//
deleteHandle(id) {
var ids = id ? [id] : this.dataListSelections.map(item => {
return item.id
})
this.$confirm(`您确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
api.deleteApi({ids : ids.join(',')}).then(res => {
this.$message.success('操作成功')
this.getDataList()
})
})
}
}
}
</script>

View File

@ -146,7 +146,7 @@
</template>
<el-table-column align="center" label="图片" min-width="80">
<template slot-scope="scope">
<el-form-item :rules="[{required: true, message: '请上传图片', trigger: 'change'}]" :prop="'attrValue.'+scope.$index+'.image'">
<el-form-item :rules="[{required: true, message: '请上传附件', trigger: 'change'}]" :prop="'attrValue.'+scope.$index+'.image'">
<div class="upLoadPicBox" @click="modalPicTap('1','duo',scope.$index)">
<div v-if="scope.row.image" class="pictrue pictrueTab"><img :src="scope.row.image"></div>
<div v-else class="upLoad pictrueTab">
@ -696,7 +696,7 @@
let list = response.list;
let arr = [];
let arr1 = [];
const listArr = [{ name: '是否热卖', value: 'isHot' }];
const listArr = [{ name: '为你推荐', value: 'isHot' }];
let typeLists = [
{ name: '', value: 'isGood',type:'2' }, //1 2 3 4
{ name: '', value: 'isBenefit' ,type:'4'},

View File

@ -22,9 +22,8 @@
<el-table v-loading="listLoading" :data="ruleForm.region" border fit highlight-current-row style="width: 100%" size="mini" class="tempBox">
<el-table-column align="center" label="可配送区域" min-width="260">
<template slot-scope="scope">
<span v-if="scope.$index === 0">默认全国</span>
<!-- <span v-if="scope.$index === 0">默认全国</span>-->
<el-cascader
v-else
v-model="scope.row.city_ids"
style="width: 98%"
:options="cityList"
@ -67,7 +66,6 @@
<el-table-column align="center" label="操作" min-width="80">
<template slot-scope="scope">
<el-button
v-if="scope.$index > 0"
type="text"
size="small"
@click="confirmEdit(ruleForm.region,scope.$index)"
@ -96,7 +94,7 @@
<el-cascader
v-model="row.city_ids"
style="width: 95%"
:options="cityList"
:options="a_cityList"
:props="props"
collapse-tags
clearable
@ -179,7 +177,7 @@ const defaultRole = {
firstPrice: 0,
renewal: 0,
renewalPrice: 0,
city_ids: []
city_ids: [],
}],
undelivery: 0,
free: [],
@ -264,6 +262,7 @@ export default {
ruleForm: Object.assign({}, defaultRole),
listLoading: false,
cityList: [],
a_cityList: [],
columns: {
title: '首件',
title2: '续件',
@ -271,13 +270,17 @@ export default {
},
isShowPrice: true,
tempId: 0,
type: 0 // 0 1
type: 0, // 0 1
defaultCity : {"id":0,"cityId":0,"name":"默认全国","city_ids":[[0]],"child":null}
}
},
mounted() {
setTimeout(()=>{
let cityList = JSON.parse(sessionStorage.getItem('cityList'));
let a_cityList = JSON.parse(sessionStorage.getItem('cityList'));
cityList.unshift(this.defaultCity);
this.cityList = cityList;
this.a_cityList = a_cityList;
},1000);
},
methods: {
@ -314,7 +317,6 @@ export default {
}
},
changeRegion(value) {
console.log(value)
},
changeRadio(num) {
this.columns = Object.assign({}, statusMap[num - 1])
@ -403,7 +405,10 @@ export default {
logistics.cityListTree().then(res => {
sessionStorage.setItem('cityList',JSON.stringify(res));
let cityList = JSON.parse(sessionStorage.getItem('cityList'));
let a_cityList = JSON.parse(sessionStorage.getItem('cityList'));
cityList.unshift(this.defaultCity);
this.cityList = cityList;
this.a_cityList = a_cityList;
}).catch(res => {
this.$message.error(res.message)
})
@ -441,31 +446,38 @@ export default {
// //
// shippingTemplatesFreeRequestList: []
}
let isAllNum = 0;
this.ruleForm.region.forEach((el, index) => {
el.title = el.city_ids.length > 0 ? JSON.stringify(el.city_ids) : JSON.stringify([[0, 0]])
for (var i = 0; i < el.city_ids.length; i++) {
el.city_ids[i].shift()
let cityId = 'all';
let title = JSON.stringify([[0]]);
if (el.city_ids.length > 0 && el.city_ids[0] != '0') {
cityId = el.city_ids.join(',');
title = JSON.stringify(el.city_ids);
} else {
isAllNum = isAllNum + 1;
}
el.cityId = el.city_ids.length > 0 ? el.city_ids.join(',') : 'all'
el.title = title;
el.cityId = cityId
})
if (isAllNum > 1 || (isAllNum == 1 && this.ruleForm.region.length > 1)) {
this.$message.error('配送区域已有全国选项,请移除其他区域')
this.loading = false;
return ;
}
param.shippingTemplatesRegionRequestList = this.ruleForm.region
param.shippingTemplatesRegionRequestList.forEach((el, index) => {
// delete el.city_ids
// delete el.city_id
})
if (this.ruleForm.appoint) {
this.ruleForm.free.forEach((el, index) => {
el.title = el.city_ids.length > 0 ? JSON.stringify(el.city_ids) : JSON.stringify([[0, 0]])
for (var i = 0; i < el.city_ids.length; i++) {
el.city_ids[i].shift()
let cityId = 'all';
let title = JSON.stringify([[0]]);
if (el.city_ids.length > 0 && el.city_ids[0] != '0') {
cityId = el.city_ids.join(',');
title = JSON.stringify(el.city_ids);
}
el.cityId = el.city_ids.length > 0 ? el.city_ids.join(',') : 'all'
el.title = title;
el.cityId = cityId
})
param.shippingTemplatesFreeRequestList = this.ruleForm.free
param.shippingTemplatesFreeRequestList.forEach((el, index) => {
// delete el.city_ids
// delete el.city_id
})
}
if (this.type === 0) {
logistics.shippingSave(param).then(res => {
@ -519,4 +531,7 @@ export default {
width: 100px !important;
}
}
.el-table__row .el-form-item--mini.el-form-item {
margin-bottom: 0;
}
</style>

View File

@ -239,7 +239,7 @@
onchangeTime(e){
this.ruleForm.dayTime = e ? e.join(',') : '';
},
//
//
modalPicTap (tit) {
const _this = this
this.$modalUpload(function(img) {

View File

@ -0,0 +1,125 @@
<template>
<!-- 基于 Element UI 新增和修改弹窗 -->
<el-dialog
:title="!dataForm.id ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible">
<!-- 新增和创建表单表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="80px">
<el-form-item label="分类" prop="cid">
<el-select v-model="dataForm.cid" placeholder="请选择" class="selWidthd">
<el-option
v-for="item in categoryList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-input v-model="dataForm.title" placeholder="标题"></el-input>
</el-form-item>
<el-form-item label="内容" prop="content">
<el-input v-model="dataForm.content" placeholder="内容"></el-input>
</el-form-item>
<el-form-item label="跳转地址" prop="jumpUrl">
<el-input v-model="dataForm.jumpUrl" placeholder="跳转地址"></el-input>
</el-form-item>
<el-form-item label="是否无效" prop="status">
<el-select v-model="dataForm.status">
<el-option label="有效" :value="true"></el-option>
<el-option label="无效" :value="false"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataSubmit()">确定</el-button>
</span>
</el-dialog>
</template>
<script>
import * as api from '@/api/systemHelp.js'
import { listCategroy } from "@/api/categoryApi";
export default {
data() {
return {
visible: false,
categoryList: [],
dataForm: {
id: 0,
cid: '',
title: '',
content: '',
jumpUrl: '',
shareTitle: '',
shareSynopsis: '',
shareImage: '',
status: '',
sort: '',
},
dataRule: {
cid: [
{required: true, message: '分类 为必填项', trigger: 'blur'}
],
title: [
{required: true, message: '标题 为必填项', trigger: 'blur'}
],
content: [
{required: true, message: '内容 为必填项', trigger: 'blur'}
],
status: [
{required: true, message: '状态 为必填项', trigger: 'blur'}
],
sort: [
{required: true, message: '排序 为必填项', trigger: 'blur'}
],
}
}
},
methods: {
init(id) { //
this.dataForm.id = id || 0
this.visible = true
this.$nextTick(() => {
this.$refs['dataForm'].resetFields()
if (this.dataForm.id) {
api.detailApi(id).then(res => {
this.dataForm = res;
})
}
this.getCategoryList()
})
},
//
dataSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
this.dataForm.id ?
api.updateApi(this.dataForm).then(res => {
this.$message.success('修改成功');
}) :
api.createApi(this.dataForm).then(res => {
this.$message.success('新增成功');
});
this.visible = false;
this.$emit('refreshDataList');
}
})
},
getCategoryList() {
const categroy = {
limit: 999,
page: '1',
status: 1,
type : 9
};
listCategroy(categroy).then(res => {
this.categoryList = res.list;
})
},
}
}
</script>

View File

@ -0,0 +1,205 @@
<template>
<div class="divBox">
<el-card class="box-card">
<div slot="header" class="clearfix">
<div class="container">
<el-form ref="form" inline :model="dataForm" size="small">
<el-form-item label="标题:">
<el-input v-model="dataForm.title" placeholder="请输入标题" class="selWidth" clearable>
<el-button slot="append" icon="el-icon-search" @click="handleSearch" />
</el-input>
</el-form-item>
<el-form-item label="分类:">
<el-select v-model="dataForm.cid" placeholder="分类" clearable class="selWidth" @change="handleSearch">
<el-option label="--请选择--" value=""></el-option>
<el-option
v-for="item in categoryList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-form>
</div>
<div class="acea-row">
<el-button v-hasPermi="['admin:helpProblem:save']" size="mini" type="primary" @click="addOrUpdateHandle()">新增数据</el-button>
<el-button v-hasPermi="['admin:helpProblem:delete']" size="mini" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button>
</div>
</div>
<el-table
ref="table"
v-loading="dataListLoading"
:data="dataList"
style="width: 100%"
size="mini"
highlight-current-row
@selection-change="selectionChangeHandle"
>
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="cid"
header-align="center"
align="center"
label="分类">
<template slot-scope="scope">
<span>{{scope.row.cname}}</span>
</template>
</el-table-column>
<el-table-column
prop="title"
header-align="center"
align="center"
label="标题">
</el-table-column>
<el-table-column
prop="usefulNum"
header-align="center"
align="center"
label="有用">
</el-table-column>
<el-table-column
prop="uselessNum"
header-align="center"
align="center"
label="无用">
</el-table-column>
<el-table-column
prop="status"
header-align="center"
align="center"
label="状态">
<template slot-scope="scope">
<span v-if="scope.row.status == 0">无效</span>
<span v-else-if="scope.row.status == 1">有效</span>
</template>
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="150"
label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
<el-button type="text" size="small" @click="deleteHandle(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 表单弹窗, 新增数据和修改数据 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</el-card>
</div>
</template>
<script>
import AddOrUpdate from './add-and-update'
import * as api from '@/api/systemHelp.js'
import { listCategroy } from '@/api/categoryApi.js'
export default {
data() {
return {
dataForm: {
title: '',
cid: ''
},
categoryList: [],
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false
}
},
components: {
AddOrUpdate
},
created() {
this.getDataList()
this.getCategoryList()
},
methods: {
//
getDataList() {
this.dataListLoading = true
api.listApi(this.dataForm).then(res => {
this.dataList = res.list
this.totalPage = res.total
this.dataListLoading = false
}).catch(res => {
this.dataListLoading = false
this.$message.error(res.message)
})
},
getCategoryList() {
const categroy = {
limit: 999,
page: '1',
status: 1,
type : 9
};
listCategroy(categroy).then(res => {
this.categoryList = res.list;
})
},
handleSearch() {
this.page = 1
this.getDataList()
},
//
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
//
currentChangeHandle(val) {
this.pageIndex = val
this.getDataList()
},
//
selectionChangeHandle(val) {
this.dataListSelections = val
},
// /
addOrUpdateHandle(id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id)
})
},
//
deleteHandle(id) {
var ids = id ? [id] : this.dataListSelections.map(item => {
return item.id
})
this.$confirm(`您确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
api.deleteApi({ids : ids.join(',')}).then(res => {
this.$message.success('操作成功')
this.getDataList()
})
})
}
}
}
</script>

View File

@ -22,9 +22,8 @@
<el-table v-loading="listLoading" :data="ruleForm.region" border fit highlight-current-row style="width: 100%" size="mini" class="tempBox">
<el-table-column align="center" label="可配送区域" min-width="260">
<template slot-scope="scope">
<span v-if="scope.$index === 0">默认全国</span>
<!-- <span v-if="scope.$index === 0">默认全国</span>-->
<el-cascader
v-else
v-model="scope.row.city_ids"
style="width: 98%"
:options="cityList"
@ -67,7 +66,6 @@
<el-table-column align="center" label="操作" min-width="80">
<template slot-scope="scope">
<el-button
v-if="scope.$index > 0"
type="text"
size="small"
@click="confirmEdit(ruleForm.region,scope.$index)"
@ -96,7 +94,7 @@
<el-cascader
v-model="row.city_ids"
style="width: 95%"
:options="cityList"
:options="a_cityList"
:props="props"
collapse-tags
clearable
@ -108,7 +106,7 @@
<el-input-number v-model="row.number" controls-position="right" :step-strictly="ruleForm.type===1?true:false" :min="ruleForm.type===1?1:0.1"/>
</template>
</el-table-column>
<el-table-column min-width="120px" align="center" label="包邮金额(元)">
<el-table-column min-width="120px" align="center" label="包邮金额(元)" v-if="isShowPrice">
<template slot-scope="{row}">
<el-input-number v-model="row.price" controls-position="right" />
</template>
@ -263,19 +261,25 @@ export default {
ruleForm: Object.assign({}, defaultRole),
listLoading: false,
cityList: [],
a_cityList: [],
columns: {
title: '首件',
title2: '续件',
title3: '包邮件数'
},
isShowPrice: true,
tempId: 0,
type: 0 // 0 1
type: 0, // 0 1
defaultCity : {"id":0,"cityId":0,"name":"默认全国","city_ids":[[0]],"child":null}
}
},
mounted() {
setTimeout(()=>{
let cityList = JSON.parse(sessionStorage.getItem('cityList'));
let a_cityList = JSON.parse(sessionStorage.getItem('cityList'));
cityList.unshift(this.defaultCity);
this.cityList = cityList;
this.a_cityList = a_cityList;
},1000);
},
methods: {
@ -312,10 +316,14 @@ export default {
}
},
changeRegion(value) {
console.log(value)
},
changeRadio(num) {
this.columns = Object.assign({}, statusMap[num - 1])
if (num === 4) {
this.isShowPrice = false;
} else {
this.isShowPrice = true;
}
},
//
addRegion(region) {
@ -396,7 +404,10 @@ export default {
logistics.cityListTree().then(res => {
sessionStorage.setItem('cityList',JSON.stringify(res));
let cityList = JSON.parse(sessionStorage.getItem('cityList'));
let a_cityList = JSON.parse(sessionStorage.getItem('cityList'));
cityList.unshift(this.defaultCity);
this.cityList = cityList;
this.a_cityList = a_cityList;
}).catch(res => {
this.$message.error(res.message)
})
@ -434,31 +445,38 @@ export default {
// //
// shippingTemplatesFreeRequestList: []
}
let isAllNum = 0;
this.ruleForm.region.forEach((el, index) => {
el.title = el.city_ids.length > 0 ? JSON.stringify(el.city_ids) : JSON.stringify([[0, 0]])
for (var i = 0; i < el.city_ids.length; i++) {
el.city_ids[i].shift()
let cityId = 'all';
let title = JSON.stringify([[0]]);
if (el.city_ids.length > 0 && el.city_ids[0] != '0') {
cityId = el.city_ids.join(',');
title = JSON.stringify(el.city_ids);
} else {
isAllNum = isAllNum + 1;
}
el.cityId = el.city_ids.length > 0 ? el.city_ids.join(',') : 'all'
el.title = title;
el.cityId = cityId
})
if (isAllNum > 1 || (isAllNum == 1 && this.ruleForm.region.length > 1)) {
this.$message.error('配送区域已有全国选项,请移除其他区域')
this.loading = false;
return ;
}
param.shippingTemplatesRegionRequestList = this.ruleForm.region
param.shippingTemplatesRegionRequestList.forEach((el, index) => {
// delete el.city_ids
// delete el.city_id
})
if (this.ruleForm.appoint) {
this.ruleForm.free.forEach((el, index) => {
el.title = el.city_ids.length > 0 ? JSON.stringify(el.city_ids) : JSON.stringify([[0, 0]])
for (var i = 0; i < el.city_ids.length; i++) {
el.city_ids[i].shift()
let cityId = 'all';
let title = JSON.stringify([[0]]);
if (el.city_ids.length > 0 && el.city_ids[0] != '0') {
cityId = el.city_ids.join(',');
title = JSON.stringify(el.city_ids);
}
el.cityId = el.city_ids.length > 0 ? el.city_ids.join(',') : 'all'
el.title = title;
el.cityId = cityId
})
param.shippingTemplatesFreeRequestList = this.ruleForm.free
param.shippingTemplatesFreeRequestList.forEach((el, index) => {
// delete el.city_ids
// delete el.city_id
})
}
if (this.type === 0) {
logistics.shippingSave(param).then(res => {
@ -512,4 +530,7 @@ export default {
width: 100px !important;
}
}
.el-table__row .el-form-item--mini.el-form-item {
margin-bottom: 0;
}
</style>

View File

@ -10,8 +10,7 @@
:name="tab.id.toString()">
<template>
<el-tabs v-model="activeNamel2"
type="border-card" @tab-click="handleItemTabClick">
<el-tabs v-model="activeNamel2" type="border-card" @tab-click="handleItemTabClick">
<el-tab-pane
v-for="(tabItem,itemIndex) in tab.child"
:key="itemIndex"

View File

@ -26,13 +26,6 @@
</el-radio-group>
</el-form-item>
<el-form-item label="核销员">
<el-radio-group v-model="ruleForm.isProsecutor">
<el-radio :label="1">开启</el-radio>
<el-radio :label="0">关闭</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="ruleForm.status">
<el-radio :label="true">开启</el-radio>
@ -97,7 +90,6 @@
id : res.uid,
mark: res.mark,
// phone: res.phone,
isProsecutor: res.isProsecutor,
status: res.status,
addres: res.addres,
groupId: Number(res.groupId) || '',

View File

@ -16,29 +16,29 @@
</el-col>
</el-col>
<template v-if="collapse">
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
<el-col v-bind="grid">
<el-form-item label="用户等级:">
<el-select v-model="levelData" placeholder="请选择" class="selWidth" clearable filterable multiple>
<el-option :value="item.id" v-for="(item, index) in levelList" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="用户分组:">
<el-select v-model="groupData" placeholder="请选择" class="selWidth" clearable filterable multiple>
<el-option :value="item.id" v-for="(item, index) in groupList" :key="index" :label="item.groupName"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="用户标签:">
<el-select v-model="labelData" placeholder="请选择" class="selWidth" clearable filterable multiple>
<el-option :value="item.id" v-for="(item, index) in labelLists" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-col>
<!-- <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">-->
<!-- <el-col v-bind="grid">-->
<!-- <el-form-item label="用户等级:">-->
<!-- <el-select v-model="levelData" placeholder="请选择" class="selWidth" clearable filterable multiple>-->
<!-- <el-option :value="item.id" v-for="(item, index) in levelList" :key="index" :label="item.name"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col v-bind="grid">-->
<!-- <el-form-item label="用户分组:">-->
<!-- <el-select v-model="groupData" placeholder="请选择" class="selWidth" clearable filterable multiple>-->
<!-- <el-option :value="item.id" v-for="(item, index) in groupList" :key="index" :label="item.groupName"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col v-bind="grid">-->
<!-- <el-form-item label="用户标签:">-->
<!-- <el-select v-model="labelData" placeholder="请选择" class="selWidth" clearable filterable multiple>-->
<!-- <el-option :value="item.id" v-for="(item, index) in labelLists" :key="index" :label="item.name"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-col>-->
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
<el-col v-bind="grid">
<el-form-item label="国家:">
@ -121,21 +121,21 @@
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="身份:">
<el-radio-group v-model="userFrom.isPromoter" type="button" class="selWidth">
<el-radio-button label="">
<span>全部</span>
</el-radio-button>
<el-radio-button label="1">
<span>推广员</span>
</el-radio-button>
<el-radio-button label="0">
<span>普通用户</span>
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<!-- <el-col v-bind="grid">-->
<!-- <el-form-item label="身份:">-->
<!-- <el-radio-group v-model="userFrom.isPromoter" type="button" class="selWidth">-->
<!-- <el-radio-button label="">-->
<!-- <span>全部</span>-->
<!-- </el-radio-button>-->
<!-- <el-radio-button label="1">-->
<!-- <span>推广员</span>-->
<!-- </el-radio-button>-->
<!-- <el-radio-button label="0">-->
<!-- <span>普通用户</span>-->
<!-- </el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
</el-col>
<!-- <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
@ -160,8 +160,8 @@
</div>
<div class="btn_bt">
<el-button class="mr10" size="small" @click="onSend" type="primary" v-hasPermi="['admin:coupon:user:receive']">发送优惠券</el-button>
<el-button class="mr10" size="small" @click="setBatch('group')">批量设置分组</el-button>
<el-button class="mr10" size="small" @click="setBatch('label')">批量设置标签</el-button>
<!-- <el-button class="mr10" size="small" @click="setBatch('group')">批量设置分组</el-button>-->
<!-- <el-button class="mr10" size="small" @click="setBatch('label')">批量设置标签</el-button>-->
</div>
</div>
<el-table
@ -229,24 +229,24 @@
<span>{{scope.row.nickname | filterEmpty }} | {{scope.row.sex | sexFilter}}</span>
</template>
</el-table-column>
<el-table-column
label="用户等级"
min-width="100"
>
<template slot-scope="scope">
<span>{{scope.row.level | levelFilter | filterEmpty}}</span>
</template>
</el-table-column>
<el-table-column
prop="groupName"
label="分组"
min-width="100"
/>
<el-table-column
prop="spreadNickname"
label="推荐人"
min-width="130"
/>
<!-- <el-table-column-->
<!-- label="用户等级"-->
<!-- min-width="100"-->
<!-- >-->
<!-- <template slot-scope="scope">-->
<!-- <span>{{scope.row.level | levelFilter | filterEmpty}}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column-->
<!-- prop="groupName"-->
<!-- label="分组"-->
<!-- min-width="100"-->
<!-- />-->
<!-- <el-table-column-->
<!-- prop="spreadNickname"-->
<!-- label="推荐人"-->
<!-- min-width="130"-->
<!-- />-->
<el-table-column
label="手机号"
min-width="100"
@ -263,25 +263,16 @@
<!--<span>{{scope.row.userType | typeFilter}}</span>-->
<!--</template>-->
<!--</el-table-column>-->
<el-table-column
prop="nowMoney"
label="余额"
min-width="100"
/>
<el-table-column
prop="integral"
label="积分"
min-width="100"
/>
<el-table-column
prop="isProsecutor"
label="核销员"
min-width="100"
>
<template slot-scope="scope">
<el-tag v-if="scope.row.isProsecutor == 0 ">非核销员</el-tag>
<el-tag v-else>核销员</el-tag>
</template>
<!-- <el-table-column-->
<!-- prop="nowMoney"-->
<!-- label="余额"-->
<!-- min-width="100"-->
<!-- />-->
<!-- <el-table-column-->
<!-- prop="integral"-->
<!-- label="积分"-->
<!-- min-width="100"-->
<!-- />-->
</el-table-column>
<el-table-column label="操作" min-width="130" fixed="right" align="center">
@ -293,13 +284,13 @@
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="onDetails(scope.row.uid)" v-if="checkPermi(['admin:user:topdetail'])">账户详情</el-dropdown-item>
<el-dropdown-item @click.native="editPoint(scope.row.uid)" v-if="checkPermi(['admin:user:operate:founds'])">积分余额</el-dropdown-item>
<el-dropdown-item @click.native="setBatch('group',scope.row)" v-if="checkPermi(['admin:user:group'])">设置分组</el-dropdown-item>
<el-dropdown-item @click.native="setBatch('label',scope.row)" v-if="checkPermi(['admin:user:tag'])">设置标签</el-dropdown-item>
<!-- <el-dropdown-item @click.native="editPoint(scope.row.uid)" v-if="checkPermi(['admin:user:operate:founds'])">积分余额</el-dropdown-item>-->
<!-- <el-dropdown-item @click.native="setBatch('group',scope.row)" v-if="checkPermi(['admin:user:group'])">设置分组</el-dropdown-item>-->
<!-- <el-dropdown-item @click.native="setBatch('label',scope.row)" v-if="checkPermi(['admin:user:tag'])">设置标签</el-dropdown-item>-->
<el-dropdown-item @click.native="setPhone(scope.row)" v-if="checkPermi(['admin:user:update:phone'])">修改手机号</el-dropdown-item>
<el-dropdown-item @click.native="onLevel(scope.row.uid,scope.row.level)" v-if="checkPermi(['admin:user:update:level'])">修改用户等级</el-dropdown-item>
<el-dropdown-item @click.native="setExtension(scope.row)" v-if="checkPermi(['admin:user:update:spread'])">修改上级推广人</el-dropdown-item>
<el-dropdown-item @click.native="clearSpread(scope.row)" v-if="scope.row.spreadUid && scope.row.spreadUid>0 && checkPermi(['admin:retail:spread:clean'])">清除上级推广人</el-dropdown-item>
<!-- <el-dropdown-item @click.native="onLevel(scope.row.uid,scope.row.level)" v-if="checkPermi(['admin:user:update:level'])">修改用户等级</el-dropdown-item>-->
<!-- <el-dropdown-item @click.native="setExtension(scope.row)" v-if="checkPermi(['admin:user:update:spread'])">修改上级推广人</el-dropdown-item>-->
<!-- <el-dropdown-item @click.native="clearSpread(scope.row)" v-if="scope.row.spreadUid && scope.row.spreadUid>0 && checkPermi(['admin:retail:spread:clean'])">清除上级推广人</el-dropdown-item>-->
</el-dropdown-menu>
</el-dropdown>
</template>