Files
cashier-web/src/views/online-shop/pad-setting.vue

282 lines
7.6 KiB
Vue

<template>
<div class="app-container">
<div class="left_menu">
<div class="search_wrap">
<el-input placeholder="名称/代码" v-model="query.name" @change="searchCateory">
<template #append>
<el-button icon="el-icon-search" @click="searchCateory"></el-button>
</template>
</el-input>
</div>
<div class="tree_wrap">
<!-- <el-tree :data="treeData" node-key="id" highlight-current :props="{ label: 'name' }" default-expand-all
@node-click="treeItemClick"></el-tree> -->
<div class="item" :class="{ active: selectCatoryIndex == index }" v-for="(item, index) in treeData"
:key="item.id" @click="treeItemClick(item, index)">
{{ item.name }}
</div>
</div>
</div>
<div class="table_wrap">
<div class="header_wrap">
<el-button type="primary" @click="addHandle">新建</el-button>
</div>
<div class="table" id="table_drag">
<el-table ref="table" :data="tableData.list" border height="100%" v-loading="tableData.loading" row-key="id">
<el-table-column label="序号" type="index" width="80"></el-table-column>
<el-table-column label="ID" prop="id" width="80"></el-table-column>
<el-table-column label="菜品名称" prop="productNames"></el-table-column>
<el-table-column label="类型" prop="padLayoutName"></el-table-column>
<el-table-column label="所属小类" prop="productCategoryName"></el-table-column>
<el-table-column label="自定义分类" prop="customName"></el-table-column>
<el-table-column label="操作" width="200">
<template v-slot="scope">
<el-button type="text" @click="editorHandle(scope.row, 1)">编辑</el-button>
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle(scope.row.id)">
<template #reference>
<el-button type="text">删除</el-button>
</template>
</el-popconfirm>
<el-button type="text" @click="editorHandle(scope.row, 2)">预览</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination @size-change="paginationSizeChange" :total="tableData.total" :current-page="tableData.page"
:page-size="tableData.size" @current-change="paginationChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div>
</div>
<AddPadPage ref="AddPadPage" :category="selectCatory.id" @success="addSuccess" />
</div>
</template>
<script>
import Sortable from "sortablejs";
import AddPadPage from "./components/addPadPage.vue";
import paoductCategoryApi from "@/api/product/productclassification";
import padProdApi from "@/api/account/padProd";
import { swapArrayEle } from "@/utils/tools.js";
import { ElMessage, ElNotification } from "element-plus";
export default {
components: {
AddPadPage,
},
data() {
return {
query: {
name: "",
},
selectCatoryIndex: 0,
selectCatory: "",
treeDataOrgin: [],
treeData: [],
tableData: {
loading: false,
page: 1,
size: 10,
total: 0,
list: [],
},
};
},
mounted() {
this.tbShopCategoryGet();
},
methods: {
// 搜索分类
searchCateory() {
this.treeData = this.treeDataOrgin.filter((item) => {
return item.name.includes(this.query.name);
});
if (this.treeData.length) {
this.selectCatoryIndex = 0;
this.selectCatory = this.treeData[this.selectCatoryIndex];
this.getTableData();
}
},
//表格拖拽
tableDrag() {
const el = document.querySelector("#table_drag .el-table__body-wrapper tbody");
new Sortable(el, {
animation: 150,
onEnd: async (e) => {
// console.log('拖拽结束===', e);
if (e.oldIndex == e.newIndex) return;
let arr = swapArrayEle(this.tableData.list, e.oldIndex, e.newIndex);
console.log(arr);
let data = arr.map((item, index) => {
return {
id: item.id,
sort: index,
};
});
try {
await productCategorySort(data);
this.getTableData();
} catch (error) {
console.log(error);
}
},
});
},
// 删除
async delTableHandle(id) {
try {
await padProdApi.delete({ id });
ElMessage.success("已删除");
this.getTableData();
} catch (error) {
console.log(error);
}
},
// 编辑 预览
editorHandle(row, type) {
this.$refs.AddPadPage.show(row.id, type);
},
// 新建成功
addSuccess() {
this.tableData.page = 1;
this.getTableData();
},
// 新建
addHandle() {
if (this.selectCatory.id) {
this.$refs.AddPadPage.show();
} else {
ElNotification.error({
title: "错误",
message: "请选择分类",
});
}
},
// 分类被点击
treeItemClick(data, index) {
this.selectCatoryIndex = index;
this.selectCatory = data;
this.tableData.page = 1;
this.getTableData();
},
// 获取商品分类
async tbShopCategoryGet() {
this.tableData.loading = true;
try {
const res = await paoductCategoryApi.getList({
page: 1,
size: 100,
});
this.treeDataOrgin = res;
this.treeData = res;
this.selectCatory = res[this.selectCatoryIndex];
this.getTableData();
} catch (error) {
console.log(error);
}
},
// 重置查询
resetHandle() {
this.tableData.page = 1;
this.tableData.size = 10;
this.tableData.list = [];
this.getTableData();
},
// 每页条数改变是回调
paginationSizeChange(e) {
this.tableData.size = e;
this.tableData.page = 1;
this.getTableData();
},
// 分页回调
paginationChange(e) {
this.tableData.page = e;
this.tableData.list = [];
this.getTableData();
},
// Pad点餐列表
async getTableData() {
try {
this.tableData.loading = true;
const res = await padProdApi.getList({
page: this.tableData.page,
size: this.tableData.size,
customName: "",
productCategoryId: this.selectCatory.id,
padLayoutId: "",
id: "",
});
this.tableData.loading = false;
this.tableData.list = res.records;
this.tableData.total = res.totalRow;
} catch (error) {
console.log(error);
}
},
},
};
</script>
<style scoped lang="scss">
:deep(.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content) {
background-color: #1890ff;
color: #fff;
}
.app-container {
display: flex;
}
.left_menu {
width: 164px;
height: calc(100vh - 210px);
border: 1px solid #ddd;
.search_wrap {
padding: 14px;
}
.tree_wrap {
width: 100%;
height: calc(100% - 70px);
overflow-y: auto;
.item {
padding: 10px 15px;
font-size: 14px;
display: flex;
align-items: center;
&:hover {
cursor: pointer;
}
&.active {
background-color: #1890ff;
color: #fff;
}
}
}
}
.table_wrap {
flex: 1;
padding-left: 14px;
.header_wrap {
display: flex;
}
.table {
padding-top: 15px;
width: 100%;
height: calc(100vh - 310px);
}
}
.head-container {
padding-top: 20px;
}
</style>