You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

358 lines
12 KiB

<template>
<div class="container">
<basic-crumb></basic-crumb>
<!-- 产品新增-大类 -->
<div class="title">请点击选择产品大类</div>
<div class="prodct_list">
<div class="prodct_item" @click="changePage(item)"
v-for="item in productArr" :key="item.id">
{{item.name}}
</div>
<!-- <div class="prodct_item" @click="handleAdd" style="font-size:3vw;">
+
</div> -->
</div>
<el-dialog append-to-body :title="dialogTitle" :visible.sync="formDialog" width="550px">
<el-form ref="addForm" :model="formData" label-width="5vw" :rules="formRules">
<el-form-item label="大类" prop="name">
<el-input placeholder="请输入大类名称" v-model="formData.name"></el-input>
</el-form-item>
<el-form-item label="简称" prop="shortName">
<el-input placeholder="请输入简称" v-model="formData.shortName"></el-input>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="formDialog = false"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</template>
</el-dialog>
<!-- 右键菜单 -->
<!-- <div class="context-menu" v-show="menuVisible" :style="menuStyle" @click.stop>
<div class="menu-item" @click="handleEdit">修改</div>
<div class="menu-item" @click="handleDelete">删除</div>
</div> -->
</div>
</template>
<script>
import basicCrumb from "@/components/basic-crumb/main"
import {getCategory,addCategory, deleteCategory , updateCategory } from '@/api/product/product'
import { mapGetters } from "vuex";
export default {
components:{
basicCrumb
},
data(){
return{
productArr:[],
addDialog:false,
addForm:{},
formRules:{
name: [{ required: true, message: '请输入大类名称', trigger: 'blur' }, { max: 8, message: '大类名称最多输入8个字符', trigger: 'blur' }],
shortName: [{ required: true, message: '请输入简称', trigger: 'blur' },
{ min: 1, message: '简称最少输入1个字符', trigger: 'blur' },
{ max: 3, message: '简称最多输入3个字符', trigger: 'blur' },
{
pattern: /^[A-Z]+$/,
message: '简称只能输入英文大写字母',
trigger: ['blur', 'change']
}
]
},
// 右键菜单相关
menuVisible: false,
menuBottom: 0,
menuRight: 0,
currentItem: null,// 当前右键操作的大类项
formDialog: false, // 弹窗显示状态
dialogTitle: '', // 动态弹窗标题(新增/修改)
formData: {},
menuStyle:{}
}
},
computed: {
...mapGetters(["routeData"])
},
mounted(){
console.log('this.$route-------大',this.$route)
console.log('this.routeData------------大', this.routeData)
const routeDataN = (this.routeData || []).filter(item => {
return !['/order/category', '/order/subcategory'].includes(item.url);
});
console.log("routeDataN",routeDataN)
let arr = [
...routeDataN,
]
this.$store.commit('SET_ROUTE_DATA', arr)
this.getCategoryList()
// 点击页面空白处关闭右键菜单
document.addEventListener('click', this.closeContextMenu)
},
methods: {
getCategoryList(){
getCategory({
parentId:0,
size:9999,
current:1
}).then(res =>{
res.data.data.records.map(item =>{
return{
...item,
url:"/category"
}
})
this.productArr = res.data.data.records
})
},
// 获取小类
// getCategoryList(id){
// this.categoryId = id
// getCategory(
// {
// parentId:id,
// size:9999,
// current:1
// }
// ).then(res =>{
// this.productArr = res.data.data.records
// })
// },
handleAdd(){
this.dialogTitle = '新增大类' // 设置弹窗标题
if (this.$refs.addForm) {
this.$refs.addForm.resetFields();
}
this.formData = { name: '', parentId: 0 , shortName: '',} // 清空表单,新增无id
this.formDialog = true // 打开弹窗
},
// 处理修改
handleEdit() {
this.menuVisible = false // 关闭右键菜单
this.dialogTitle = '修改大类' // 设置弹窗标题
if (this.$refs.addForm) {
this.$refs.addForm.resetFields();
}
// 填充表单数据(带id,用于修改)
this.formData = {
id: this.currentItem.id,
name: this.currentItem.name,
parentId: 0, // 大类parentId固定为0
shortName: this.currentItem.shortName || '',
}
console.log("currentItem", this.currentItem)
this.formDialog = true // 打开弹窗
},
// 处理删除
handleDelete() {
// 关闭右键菜单
this.menuVisible = false
// 先校验是否有子分类
getCategory({
parentId: this.currentItem.id,
size: 9999,
current: 1
}).then(res => {
if (res.data.code == 200) {
const productArr = res.data.data.records || []
// 有子分类,提示不能删除
if (productArr.length>=1) {
this.$message.warning('该大类下存在小类,无法删除')
} else {
// 无子分类,确认删除
this.$confirm('确定要删除该大类吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// 调用删除接口
deleteCategory({
ids: this.currentItem.id
}).then(res => {
if (res.data.code == 200) {
this.$message.success('删除成功')
this.getCategoryList()
}
})
}).catch(() => {
this.$message.info('已取消删除')
})
}
}
})
},
// 打开右键菜单
openContextMenu(event, item) {
// 阻止默认右键菜单
event.preventDefault()
// 记录当前操作项
this.currentItem = item
// 记录当前点击的DOM元素
this.currentItemDom = event.currentTarget
// 关键修改4:计算菜单的位置(固定在元素右下角)
const rect = this.currentItemDom.getBoundingClientRect()
this.menuStyle = {
position: 'fixed',
left: `${rect.right - 60 }px`, // 120是菜单宽度
top: `${rect.bottom}px`, // bottom:0 对应top为元素底部
zIndex: 9999
}
// 显示菜单
this.menuVisible = true
},
// 关闭右键菜单
closeContextMenu() {
this.menuVisible = false
},
changePage(val){
// const routeDataN = this.routeData
// 应该去掉 /order/category 和 /order/subcategory
const routeDataN = (this.routeData || []).filter(item => {
return !['/order/category', '/order/subcategory'].includes(item.url);
});
console.log("routeDataN",routeDataN)
let arr = [
...routeDataN,
{name:val.name,url:'/order/category',categoryId:val.id}
]
this.$store.commit('SET_ROUTE_DATA', arr)
this.$router.push({
path: '/order/subcategory', query: {
isLast: true,
categoryId: val.id,
sort:this.$route.query.sort ? this.$route.query.sort:'',
productEdit:this.$route.query.productEdit ? this.$route.query.productEdit:'',
mode: this.$route.query.mode ? this.$route.query.mode:'',
orderId:this.$route.query.orderId ? this.$route.query.orderId:'',
customerId:this.$route.query.customerId ? this.$route.query.customerId:'',
} });
},
submit(){
this.$refs.addForm.validate(valid =>{
if (valid) {
// 判断是否有id:有=修改,无=新增
const id = this.formData.id
if (id) {
updateCategory({
id:id,
parentId: 0,
name: this.formData.name,
shortName: this.formData.shortName
}).then(res => {
if (res.data.code == 200) {
this.$message.success('修改成功')
this.getCategoryList()
this.formDialog = false
}
})
} else {
addCategory({
parentId: 0,
name: this.formData.name,
shortName: this.formData.shortName
}).then(res => {
if (res.data.code == 200) {
this.$message.success('新增成功')
this.getCategoryList()
this.formDialog = false
}
})
}
}
})
}
},
beforeDestroy() {
// 移除事件监听,防止内存泄漏
document.removeEventListener('click', this.closeContextMenu)
},
}
</script>
<style scoped lang="scss">
.container{
width: 99%;
height: 99%;
background: rgb(255, 255, 255);
margin: 0 auto;
margin-top: 8px;
padding: 20px !important;
overflow-y: auto;
.title{
font-size: 1.5vw;
margin-top: 2.1vw;
margin-left: 3.4vw;
color: #101010;
}
.prodct_list{
display: flex;
flex-wrap: wrap;
margin-top: 15px;
// 移除左右 padding改为用 auto 实现水平居中
padding: 0;
// 让容器在页面中水平居中
margin: 15px auto 0;
// 固定一行5个的总宽度元素宽度+间距
width: calc( (10.42vw + 5vw) * 5 - 5vw );
// 让元素均匀分布两侧留白一致
justify-content: flex-start;
gap: 5vw;
.prodct_item{
width: 10.42vw;
height: 10.42vw;
border-radius: 2.08vw;
background: #f1ab46;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 2.5vw;
text-align: center;
cursor: pointer;
&:hover {
background: #ecb76c;
}
}
} // 右键菜单样式
.context-menu {
position: fixed;
width: 120px;
background: #fff;
border: 1px solid #e6e6e6;
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
z-index: 9999;
.menu-item {
padding: 8px 16px;
cursor: pointer;
&:hover {
background: #f5f5f5;
}
&:not(:last-child) {
border-bottom: 1px solid #e6e6e6;
}
}
}
}
</style>