silu/创旅丝路/resources/backend/page/combo/add.html

689 lines
22 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<!-- 引入样式 -->
<link rel="stylesheet" href="../../plugins/element-ui/index.css" />
<link rel="stylesheet" href="../../styles/common.css" />
<link rel="stylesheet" href="../../styles/page.css" />
<style>
.addDish .el-input {
width: 130px;
}
.addDish .el-input-number__increase {
border-left: solid 1px #FFE1CA;
background: #fff3ea;
}
.addDish .el-input-number__decrease {
border-right: solid 1px #FFE1CA;
background: #fff3ea;
}
.addDish input {
border: 1px solid #ffe1ca;
}
.addDish .table {
border: solid 1px #EBEEF5;
border-radius: 3px;
}
.addDish .table th {
padding: 5px 0;
}
.addDish .table td {
padding: 7px 0;
}
.addDishList .seachDish {
position: absolute;
top: 10px;
right: 20px;
}
.addDishList .el-dialog__body {
padding: 0;
border-bottom: solid 1px #ccc;
}
.addDishList .el-dialog__footer {
padding-top: 27px;
}
.addDish {
width: 777px;
}
.addDish .addBut {
background: #ffc200;
display: inline-block;
padding: 0px 20px;
border-radius: 3px;
line-height: 40px;
cursor: pointer;
border-radius: 4px;
color: #333333;
font-weight: 500;
}
.addDish .content {
background: #fafafb;
padding: 20px;
border: solid 1px #ccc;
border-radius: 3px;
}
.addDishCon {
padding: 0 20px;
display: flex;
line-height: 40px;
}
.addDishCon .leftCont {
display: flex;
border-right: solid 2px #E4E7ED;
width: 60%;
padding: 15px;
}
.addDishCon .leftCont .tabBut {
width: 110px;
}
.addDishCon .leftCont .tabBut span {
display: block;
text-align: center;
border-right: solid 2px #f4f4f4;
cursor: pointer;
}
.addDishCon .leftCont .act {
border-color: #FFC200 !important;
color: #FFC200 !important;
}
.addDishCon .leftCont .tabList {
flex: 1;
padding: 15px;
}
.addDishCon .leftCont .tabList .table {
border: solid 1px #f4f4f4;
border-bottom: solid 1px #f4f4f4;
}
.addDishCon .leftCont .tabList .table .items {
border-bottom: solid 1px #f4f4f4;
padding: 0 10px;
display: flex;
}
.addDishCon .leftCont .tabList .table .items .el-checkbox, .addDishCon .leftCont .tabList .table .items .el-checkbox__label {
width: 100%;
}
.addDishCon .leftCont .tabList .table .items .item {
display: flex;
padding-right: 20px;
}
.addDishCon .leftCont .tabList .table .items .item span {
display: inline-block;
text-align: center;
flex: 1;
}
.addDishCon .ritCont {
width: 40%;
padding: 0 15px;
}
.addDishCon .ritCont .item {
box-shadow: 0px 1px 4px 3px rgba(0, 0, 0, 0.03);
display: flex;
text-align: center;
padding: 0 10px;
margin-bottom: 20px;
border-radius: 6px;
color: #818693;
}
.addDishCon .ritCont .item span:first-child {
text-align: left;
color: #20232A;
}
.addDishCon .ritCont .item .price {
display: inline-block;
flex: 1;
}
.addDishCon .ritCont .item .del {
cursor: pointer;
}
.addDishCon .ritCont .item .del img {
position: relative;
top: 5px;
width: 20px;
}
.addDishCon .el-checkbox__label{
width: 100%;
}
#combo-add-app .setmealFood .el-form-item__label::before{
content: '*';
color: #F56C6C;
margin-right: 4px;
}
#combo-add-app .uploadImg .el-form-item__label::before{
content: '*';
color: #F56C6C;
margin-right: 4px;
}
</style>
</head>
<body>
<div class="addBrand-container" id="combo-add-app">
<div class="container">
<el-form
ref="ruleForm"
:model="ruleForm"
:rules="rules"
:inline="true"
label-width="180px"
class="demo-ruleForm"
>
<div>
<el-form-item label="敏感词名称:" prop="name" >
<el-input v-model="ruleForm.name" placeholder="请填写敏感词名称" maxlength="20"/>
</el-form-item>
<el-form-item label="敏感词分类:" prop="idType">
<el-select v-model="ruleForm.idType" placeholder="请选择敏感词分类" @change="$forceUpdate()">
<el-option v-for="(item, index) in setMealList" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</div>
<div>
</div>
<div>
<el-form-item label="敏感词:" class="setmealFood">
<el-form-item>
<div class="addDish">
<span v-if="dishTable.length == 0" class="addBut" @click="openAddDish"> + 添加敏感词</span>
<div v-if="dishTable.length != 0" class="content">
<div class="addBut" style="margin-bottom: 20px" @click="openAddDish">+ 添加敏感词</div>
<div class="table">
<el-table :data="dishTable" style="width: 100%">
<el-table-column prop="name" label="名称" width="180" align="center"></el-table-column>
<el-table-column prop="address" label="操作" width="180px;" align="center">
<template slot-scope="scope">
<el-button type="text" size="small" @click="delDishHandle(scope.$index)"> 删除 </el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</el-form-item>
</el-form-item>
</div>
<div>
</div>
<div class="address">
<el-form-item label="敏感词描述:">
<el-input v-model="ruleForm.description" type="textarea" :rows="3" placeholder="敏感词描述最长200字" maxlength="200"/>
</el-form-item>
</div>
<div class="subBox address">
<el-form-item>
<el-button @click="goBack()"> 取消 </el-button>
<el-button type="primary" @click="submitForm('ruleForm', false)"> 保存 </el-button>
<el-button
v-if="actionType == 'add'"
type="primary"
class="continue"
@click="submitForm('ruleForm', true)"
>
保存并继续添加敏感词
</el-button>
</el-form-item>
</div>
</el-form>
</div>
<el-dialog
title="添加敏感词"
class="addDishList"
:visible.sync="dialogVisible"
width="60%"
:before-close="handleClose"
>
<el-input
v-model="value"
class="seachDish"
placeholder="请输入敏感词名称进行搜索"
style="width: 250px"
size="small"
clearable
>
<i slot="prefix" class="el-input__icon el-icon-search" style="cursor: pointer" @click="seachHandle"></i>
</el-input>
<!-- <AddDish ref="adddish" :check-list="checkList" :seach-key="seachKey" @checkList="getCheckList" /> -->
<div class="addDishCon">
<div class="leftCont">
<div
v-show="seachKey.trim() == ''"
class="tabBut"
>
<span
v-for="(item, index) in dishType"
:key="index"
:class="{act:index == keyInd}"
@click="checkTypeHandle(index, item.id)"
>{{ item.name }}</span>
</div>
<div class="tabList">
<div class="table">
<div v-if="dishAddList.length == 0" style="padding-left:10px">
暂无敏感词!
</div>
<el-checkbox-group
v-if="dishAddList.length > 0"
v-model="checkedList"
@change="checkedListHandle"
>
<div
v-for="(item, index) in dishAddList"
:key="index"
class="items"
>
<el-checkbox
:key="index"
:label="item"
>
<div class="item">
<span style="flex: 3;text-align: left">{{ item.dishName }}</span>
<span>{{ item.status == 0 ? '停售' : '在售' }}</span>
<span>{{ Number(item.price)/100 }}</span>
</div>
</el-checkbox>
</div>
</el-checkbox-group>
</div>
</div>
</div>
<div class="ritCont">
<div class="tit">
已选敏感词({{ checkedList.length }})
</div>
<div class="items">
<div
v-for="(item, ind) in checkedList"
:key="ind"
class="item"
>
<span>{{ item.dishName }}</span>
<span class="price">¥ {{ Number(item.price)/100 }} </span>
<span
class="del"
@click="delCheck(ind)"
>
<img
src="../../images/icons/btn_clean@2x.png"
alt=""
>
</span>
</div>
</div>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="addTableList">确 定</el-button>
</span>
</el-dialog>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="../../plugins/vue/vue.js"></script>
<!-- 引入组件库 -->
<script src="../../plugins/element-ui/index.js"></script>
<!-- 引入axios -->
<script src="../../plugins/axios/axios.min.js"></script>
<script src="../../js/request.js"></script>
<script src="../../api/combo.js"></script>
<script src="../../js/validate.js"></script>
<script src="../../js/index.js"></script>
<script src="../../api/food.js"></script>
<script>
new Vue({
el: '#combo-add-app',
data() {
return {
id: '',
actionType: '',
value: '',
setMealList: [],
seachKey: '',
dishList: [],
imageUrl: '',
actionType: '',
dishTable: [],
dialogVisible: false,
checkList: [],
ruleForm: {
name: '',
categoryId: '',
price: '',
code: '',
image: '',
description: '',
dishList: [],
status: true,
idType: '',
},
dishType: [],
dishAddList: [],
dishListCache: [],
keyInd : 0,
searchValue: '',
checkedList: []
}
},
computed: {
rules() {
return {
name: {
required: true,
message: '请输入敏感词名称',
trigger: 'blur',
},
idType: {
required: true,
message: '请选择敏感词分类',
trigger: 'change',
},
price: {
required: true,
validator: (rules, value, callback) => {
if (!value) {
callback(new Error('请填写敏感词价格'))
} else {
const reg = /^\d+(\.\d{0,2})?$/
if (reg.test(value)) {
if(value < 10000){
callback()
}else{
callback(new Error('敏感词价格小于10000'))
}
} else {
callback(new Error('敏感词价格格式只能为数字,且最多保留两位小数'))
}
}
},
trigger: 'blur',
},
}
},
},
watch:{
seachKey(value){
if (value.trim()){
this.getDishForName(this.seachKey)
}
},
checkList(value){
this.checkedList = value
}
},
created() {
this.getDishTypeList()
this.getDishType()
this.id = requestUrlParam('id')
this.actionType = this.id ? 'edit' : 'add'
if (this.id) {
this.init()
}
},
mounted() {},
methods: {
async init() {
querySetmealById(this.id).then((res) => {
if (String(res.code) === '1') {
this.ruleForm = res.data
this.ruleForm.status = res.data.status === '1'
this.ruleForm.price = res.data.price / 100
this.imageUrl = `/common/download?name=${res.data.image}`
this.checkList = res.data.setmealDishes
this.dishTable = res.data.setmealDishes
this.ruleForm.idType = res.data.categoryId
// this.ruleForm.password = ''
} else {
this.$message.error(res.msg || '操作失败')
}
})
},
seachHandle() {
this.seachKey = this.value
},
// 获取敏感词分类
getDishTypeList() {
getCategoryList({ type: 2 }).then((res) => {
if (res.code === 1) {
this.setMealList = res.data.map((obj) => ({ ...obj, idType: obj.id }))
} else {
this.$message.error(res.msg || '操作失败')
}
})
},
// 删除敏感词
delDishHandle(index) {
this.dishTable.splice(index, 1)
this.checkList.splice(index, 1)
},
// 获取添加敏感词数据
getCheckList(value) {
this.checkList = [...value]
},
// 添加敏感词
openAddDish() {
this.seachKey = ''
this.dialogVisible = true
//搜索条件清空,敏感词重新查询,敏感词类别选第一个重新查询
this.value = ''
this.keyInd = 0
this.getDishList(this.dishType[0].id)
},
// 取消添加敏感词
handleClose(done) {
// this.$refs.adddish.close()
this.dialogVisible = false
// this.checkList = JSON.parse(JSON.stringify(this.dishTable))
// this.dialogVisible = false
},
// 保存添加敏感词列表
addTableList() {
this.dishTable = JSON.parse(JSON.stringify(this.checkList))
this.dishTable.forEach((n) => {
n.copies = 1
})
this.dialogVisible = false
// 添加处理逻辑清空选中list
this.checkList = []
},
submitForm(formName, st) {
this.$refs[formName].validate((valid) => {
if (valid) {
let prams = { ...this.ruleForm }
prams.price *= 100
prams.setmealDishes = this.dishTable.map((obj) => ({
copies: obj.copies,
dishId: obj.dishId,
name: obj.name,
price: obj.price,
}))
prams.status = this.ruleForm ? 1 : 0
prams.categoryId = this.ruleForm.idType
if(prams.setmealDishes.length < 1){
this.$message.error('请选择敏感词!')
return
}
if(!this.imageUrl){
this.$message.error('请上传敏感词图片')
return
}
// delete prams.dishList
if (this.actionType == 'add') {
delete prams.id
addSetmeal(prams)
.then((res) => {
if (res.code === 1) {
this.$message.success('敏感词添加成功!')
if (!st) {
this.goBack()
} else {
this.$refs.ruleForm.resetFields()
this.dishList = []
this.dishTable = []
this.ruleForm = {
name: '',
categoryId: '',
price: '',
code: '',
image: '',
description: '',
dishList: [],
status: true,
id: '',
idType: '',
}
this.imageUrl = ''
}
} else {
this.$message.error(res.msg || '操作失败')
}
})
.catch((err) => {
this.$message.error('请求出错了:' + err)
})
} else {
delete prams.updateTime
editSetmeal(prams)
.then((res) => {
if (res.code === 1) {
this.$message.success('敏感词修改成功!')
this.goBack()
} else {
this.$message.error(res.msg || '操作失败')
}
})
.catch((err) => {
this.$message.error('请求出错了:' + err)
})
}
} else {
return false
}
})
},
handleAvatarSuccess (response, file, fileList) {
// this.imageUrl = response.data
if(response.code === 0 && response.msg === '未登录'){
window.top.location.href = '/backend/page/login/login.html'
}else{
this.imageUrl = `/common/download?name=${response.data}`
this.ruleForm.image = response.data
}
},
onChange (file) {
if(file){
const suffix = file.name.split('.')[1]
const size = file.size / 1024 / 1024 < 2
if(['png','jpeg','jpg'].indexOf(suffix) < 0){
this.$message.error('上传图片只支持 png、jpeg、jpg 格式!')
this.$refs.upload.clearFiles()
return false
}
if(!size){
this.$message.error('上传文件大小不能超过 2MB!')
return false
}
return file
}
},
goBack() {
window.parent.menuHandle(
{
id: '5',
url: '../backend/page/combo/list.html',
name: '敏感词管理',
},
false
)
},
// 获取敏感词分类
getDishType () {
getCategoryList({'type':1}).then(res => {
if (res.code === 1) {
this.dishType = res.data
this.getDishList(res.data[0].id)
} else {
this.$message.error(res.msg)
}
})
},
// 通过敏感词ID获取敏感词列表分类
getDishList (id) {
queryDishList({categoryId: id}).then(res => {
if (res.code === 1) {
if (res.data.length == 0) {
this.dishAddList = []
return
}
let newArr = res.data;
newArr.forEach((n) => {
n.dishId = n.id
n.copies = 1
// n.dishCopies = 1
n.dishName = n.name
})
this.dishAddList = newArr
} else {
this.$message.error(res.msg)
}
})
},
// 关键词收搜敏感词列表分类
getDishForName (name) {
queryDishList({name}).then(res => {
if (res.code === 1) {
let newArr = res.data
newArr.forEach((n) => {
n.dishId = n.id
n.dishName = n.name
})
this.dishAddList = newArr
} else {
this.$message.error(res.msg)
}
})
},
checkTypeHandle (ind,id) {
this.keyInd = ind
this.getDishList(id)
},
checkedListHandle (value) {
this.getCheckList(this.checkedList)
},
open (done) {
this.dishListCache = JSON.parse(JSON.stringify(this.checkList))
},
close (done) {
this.checkList = this.dishListCache
},
// 删除
delCheck (ind){
this.checkedList.splice(ind, 1)
}
},
})
</script>
</body>
</html>