|
@@ -0,0 +1,494 @@
|
|
|
+<script setup>
|
|
|
+import {reactive, ref,watch} from 'vue'
|
|
|
+import { useWindowSize } from '@vueuse/core'
|
|
|
+import apiDataEDB from '@/api/dataEDB'
|
|
|
+import { showDialog , showToast } from 'vant';
|
|
|
+import {useEDBDelete} from '../hooks/useEDBDelete'
|
|
|
+
|
|
|
+const {edbClassifyDelete}=useEDBDelete()
|
|
|
+const { width } = useWindowSize()
|
|
|
+
|
|
|
+const props=defineProps({
|
|
|
+ modelValue:{
|
|
|
+ type:Boolean,
|
|
|
+ default:false
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+const emits=defineEmits(['update:modelValue','change'])
|
|
|
+
|
|
|
+// 关闭弹窗
|
|
|
+function handleClose(){
|
|
|
+ emits('update:modelValue',false)
|
|
|
+}
|
|
|
+
|
|
|
+// 当前点击了哪些分类
|
|
|
+let selectClassifyNameStr=''
|
|
|
+let selectClassifyId=0
|
|
|
+function handleSelectClassify(level1,level2,level3){
|
|
|
+ // console.log(level1,level2,level3);
|
|
|
+ if(level1){
|
|
|
+ selectClassifyId=level1.ClassifyId
|
|
|
+ selectClassifyNameStr=`${level1.ClassifyName}`
|
|
|
+ }
|
|
|
+ if(level2){
|
|
|
+ selectClassifyId=level2.ClassifyId
|
|
|
+ selectClassifyNameStr=`${level1.ClassifyName}/${level2.ClassifyName}`
|
|
|
+ }
|
|
|
+ if(level3){
|
|
|
+ selectClassifyId=level3.ClassifyId
|
|
|
+ selectClassifyNameStr=`${level1.ClassifyName}/${level2.ClassifyName}/${level3.ClassifyName}`
|
|
|
+ }
|
|
|
+ emits('change',{selectClassifyNameStr,selectClassifyId})
|
|
|
+}
|
|
|
+
|
|
|
+// 设置显示的分类名称(中英文)
|
|
|
+function getClassifyItemName(item){
|
|
|
+ return item.ClassifyName
|
|
|
+}
|
|
|
+
|
|
|
+// 获取分类数据
|
|
|
+const classifyList=ref([])
|
|
|
+async function getEDBClassifyList(){
|
|
|
+ const res=await apiDataEDB.edbClassifyList()
|
|
|
+ if(res.Ret===200){
|
|
|
+ classifyList.value=res.Data.AllNodes||[]
|
|
|
+ }
|
|
|
+}
|
|
|
+getEDBClassifyList()
|
|
|
+
|
|
|
+const openClassify=ref([])//当前展开的分类
|
|
|
+
|
|
|
+// 分类操作数据
|
|
|
+const classifyState=reactive({
|
|
|
+ show:false,
|
|
|
+ title:'',
|
|
|
+ name:'',//输入框中的值
|
|
|
+ placeholderText:'',
|
|
|
+ type:'add',//新增、编辑
|
|
|
+ level:1,//1新增/编辑一级目录,2新增/编辑二级目录
|
|
|
+ level1Text:'',
|
|
|
+ level2Text:'',
|
|
|
+ parentId:0,
|
|
|
+ classifyId:0,
|
|
|
+})
|
|
|
+watch(
|
|
|
+ ()=>classifyState.show,
|
|
|
+ (n)=>{
|
|
|
+ if(!n){
|
|
|
+ classifyState.title=''
|
|
|
+ classifyState.name=''
|
|
|
+ classifyState.placeholderText=''
|
|
|
+ classifyState.type='add'
|
|
|
+ classifyState.level=1
|
|
|
+ classifyState.level1Text=''
|
|
|
+ classifyState.level2Text=''
|
|
|
+ classifyState.parentId=0
|
|
|
+ classifyState.classifyId=0
|
|
|
+ }
|
|
|
+ }
|
|
|
+)
|
|
|
+function handleAddLevel1(){
|
|
|
+ classifyState.title='添加一级目录'
|
|
|
+ classifyState.placeholderText='请输入一级分类名称'
|
|
|
+ classifyState.show=true
|
|
|
+}
|
|
|
+async function handleConfirmClassifyState(){
|
|
|
+ let params={}
|
|
|
+ if(classifyState.type==='add'){
|
|
|
+ params={
|
|
|
+ ClassifyName:classifyState.name,
|
|
|
+ Level:classifyState.level,
|
|
|
+ ParentId:classifyState.parentId
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ params={
|
|
|
+ ClassifyName:classifyState.name,
|
|
|
+ ClassifyId:classifyState.classifyId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const res=classifyState.type==='add'?await apiDataEDB.edbClassifyAdd(params):await apiDataEDB.edbClassifyEdit(params)
|
|
|
+ if(res.Ret===200){
|
|
|
+ getEDBClassifyList()
|
|
|
+ classifyState.show=false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 显示分类操作按钮数据
|
|
|
+const classifyOptState=reactive({
|
|
|
+ show:false,
|
|
|
+ actions:[],
|
|
|
+ level:1,//点击的是几级
|
|
|
+ level1Data:null,
|
|
|
+ level2Data:null,
|
|
|
+ level3Data:null
|
|
|
+})
|
|
|
+watch(
|
|
|
+ ()=>classifyOptState.show,
|
|
|
+ (n)=>{
|
|
|
+ if(!n){
|
|
|
+ classifyOptState.actions=[]
|
|
|
+ classifyOptState.level=1
|
|
|
+ classifyOptState.level1Data=null
|
|
|
+ classifyOptState.level2Data=null
|
|
|
+ classifyOptState.level3Data=null
|
|
|
+ }
|
|
|
+ }
|
|
|
+)
|
|
|
+// 显示分类的具体操作选项
|
|
|
+function handleShowClassifyOpt(level,level1,level2,level3){
|
|
|
+ const optArr=[
|
|
|
+ {name:'重命名',type:'edit'},
|
|
|
+ {name:'删除',type:'delete',color:"#C54322"}
|
|
|
+ ]
|
|
|
+ if(level===1){
|
|
|
+ // 判断操作权限
|
|
|
+ if(level1.Button.AddButton){//添加权限
|
|
|
+ optArr.unshift({name:'添加二级目录',type:'add'})
|
|
|
+ }
|
|
|
+ if(!level1.Button.OpButton){//编辑权限
|
|
|
+ optArr=optArr.filter(item=>item.type!='edit')
|
|
|
+ }
|
|
|
+ if(!level1.Button.DeleteButton){//删除
|
|
|
+ optArr=optArr.filter(item=>item.type!='delete')
|
|
|
+ }
|
|
|
+ }else if(level===2){
|
|
|
+ // 判断操作权限
|
|
|
+ if(level2.Button.AddButton){//添加权限
|
|
|
+ optArr.unshift({name:'添加三级目录',type:'add'})
|
|
|
+ }
|
|
|
+ if(level2.Button.MoveButton){//移动权限
|
|
|
+ optArr.push({name:'移动至',type:'move'})
|
|
|
+ }
|
|
|
+ if(!level2.Button.OpButton){//编辑权限
|
|
|
+ optArr=optArr.filter(item=>item.type!='edit')
|
|
|
+ }
|
|
|
+ if(!level2.Button.DeleteButton){//删除
|
|
|
+ optArr=optArr.filter(item=>item.type!='delete')
|
|
|
+ }
|
|
|
+ }else if(level===3){
|
|
|
+ // 判断操作权限
|
|
|
+ if(level3.Button.MoveButton){//移动权限
|
|
|
+ optArr.push({name:'移动至',type:'move'})
|
|
|
+ }
|
|
|
+ if(!level3.Button.OpButton){//编辑权限
|
|
|
+ optArr=optArr.filter(item=>item.type!='edit')
|
|
|
+ }
|
|
|
+ if(!level3.Button.DeleteButton){//删除
|
|
|
+ optArr=optArr.filter(item=>item.type!='delete')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ classifyOptState.actions=optArr
|
|
|
+ classifyOptState.level=level
|
|
|
+ classifyOptState.level1Data=level1
|
|
|
+ classifyOptState.level2Data=level2
|
|
|
+ classifyOptState.level3Data=level3
|
|
|
+ classifyOptState.show=true
|
|
|
+}
|
|
|
+function handleSelectOpt(e){
|
|
|
+ if(e.type==='add'){
|
|
|
+ classifyState.title=e.name
|
|
|
+ classifyState.placeholderText='请输入分类名称'
|
|
|
+ classifyState.type='add'
|
|
|
+ classifyState.level1Text=classifyOptState.level1Data?.ClassifyName
|
|
|
+ classifyState.level2Text=classifyOptState.level2Data?.ClassifyName
|
|
|
+ if(classifyOptState.level===1){
|
|
|
+ classifyState.parentId=classifyOptState.level1Data?.ClassifyId
|
|
|
+ classifyState.level=1
|
|
|
+ }
|
|
|
+ if(classifyOptState.level===2){
|
|
|
+ classifyState.parentId=classifyOptState.level2Data?.ClassifyId
|
|
|
+ classifyState.level=2
|
|
|
+ }
|
|
|
+ classifyState.show=true
|
|
|
+ }
|
|
|
+ if(e.type==='edit'){
|
|
|
+ classifyState.title='重命名'
|
|
|
+ classifyState.placeholderText='请输入分类名称'
|
|
|
+ classifyState.type='edit'
|
|
|
+ classifyState.level=classifyOptState.level
|
|
|
+ if(classifyOptState.level===1){
|
|
|
+ classifyState.classifyId=classifyOptState.level1Data?.ClassifyId
|
|
|
+ classifyState.name=classifyOptState.level1Data?.ClassifyName
|
|
|
+ }else if(classifyOptState.level===2){
|
|
|
+ classifyState.level1Text=classifyOptState.level1Data?.ClassifyName
|
|
|
+ classifyState.classifyId=classifyOptState.level2Data?.ClassifyId
|
|
|
+ classifyState.name=classifyOptState.level2Data?.ClassifyName
|
|
|
+ }else if(classifyOptState.level===3){
|
|
|
+ classifyState.level1Text=classifyOptState.level1Data?.ClassifyName
|
|
|
+ classifyState.level2Text=classifyOptState.level2Data?.ClassifyName
|
|
|
+ classifyState.classifyId=classifyOptState.level3Data?.ClassifyId
|
|
|
+ classifyState.name=classifyOptState.level3Data?.ClassifyName
|
|
|
+ }
|
|
|
+ classifyState.show=true
|
|
|
+ }
|
|
|
+ if(e.type==='delete'){
|
|
|
+ let data=null
|
|
|
+ if(classifyOptState.level===1){
|
|
|
+ data=classifyOptState.level1Data
|
|
|
+ }else if(classifyOptState.level===2){
|
|
|
+ data=classifyOptState.level2Data
|
|
|
+ }else if(classifyOptState.level===3){
|
|
|
+ data=classifyOptState.level3Data
|
|
|
+ }
|
|
|
+ edbClassifyDelete(data).then(res=>{
|
|
|
+ console.log(res===true);
|
|
|
+ if(res===true){
|
|
|
+ getEDBClassifyList()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if(e.type==='move'){
|
|
|
+ classifyMoveState.selectValue=''
|
|
|
+ classifyMoveState.tabIndex=0
|
|
|
+ if(classifyOptState.level===2){
|
|
|
+ //移动二级
|
|
|
+ classifyMoveState.options=classifyList.value.map(item=>{
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ Children:null
|
|
|
+ }
|
|
|
+ })
|
|
|
+ classifyMoveState.classifyId=classifyOptState.level2Data.ClassifyId
|
|
|
+ classifyMoveState.moveLevel=2
|
|
|
+ }
|
|
|
+ if(classifyOptState.level===3){
|
|
|
+ //移动三级
|
|
|
+ classifyMoveState.options=classifyList.value.map(item=>{
|
|
|
+ const children=item.Children.map(_item=>{
|
|
|
+ return {
|
|
|
+ ..._item,
|
|
|
+ Children:null
|
|
|
+ }
|
|
|
+ })
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ Children:children
|
|
|
+ }
|
|
|
+ })
|
|
|
+ classifyMoveState.classifyId=classifyOptState.level3Data.ClassifyId
|
|
|
+ classifyMoveState.moveLevel=3
|
|
|
+ }
|
|
|
+
|
|
|
+ classifyMoveState.show=true
|
|
|
+ }
|
|
|
+ classifyOptState.show=false
|
|
|
+}
|
|
|
+
|
|
|
+// 移动分类数据
|
|
|
+const classifyMoveState=reactive({
|
|
|
+ show:false,
|
|
|
+ selectValue:'',
|
|
|
+ options:[],
|
|
|
+ classifyId:0,//要移动的分类id
|
|
|
+ tabIndex:0,//当前选择了哪一级的分类
|
|
|
+ moveLevel:2,//要移动的分类是哪级
|
|
|
+})
|
|
|
+function handleSelectMoveClassifyChange({value,selectedOptions,tabIndex}){
|
|
|
+ classifyMoveState.tabIndex=tabIndex
|
|
|
+}
|
|
|
+function handleConfirmMove(){
|
|
|
+ if(!classifyMoveState.selectValue){
|
|
|
+ showToast('请选择要移动至的分类')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if(classifyMoveState.moveLevel===3&&classifyMoveState.tabIndex!=1){
|
|
|
+ showToast('请选择要移动至的二级分类')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ let NextClassifyId=0
|
|
|
+ if(classifyMoveState.moveLevel===2){
|
|
|
+ const index=classifyMoveState.options.findIndex(e=>e.ClassifyId===classifyMoveState.selectValue)
|
|
|
+ console.log(index);
|
|
|
+ NextClassifyId=classifyList.value[index].Children[0]?.ClassifyId
|
|
|
+ }else if(classifyMoveState.moveLevel===3){
|
|
|
+ let index1=0,index2=0;
|
|
|
+ classifyMoveState.options.forEach((e,idx)=>{
|
|
|
+ e.Children?.forEach((e2,idx2)=>{
|
|
|
+ if(e2.ClassifyId===classifyMoveState.selectValue){
|
|
|
+ index1=idx
|
|
|
+ index2=idx2
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ NextClassifyId=classifyList.value[index1].Children[index2].Children[0]?.ClassifyId
|
|
|
+ }
|
|
|
+ // console.log(NextClassifyId);
|
|
|
+ apiDataEDB.edbClassifyMove({
|
|
|
+ ClassifyId:classifyMoveState.classifyId,
|
|
|
+ ParentClassifyId:classifyMoveState.selectValue,
|
|
|
+ PrevClassifyId:0,
|
|
|
+ NextClassifyId:NextClassifyId
|
|
|
+ }).then(res=>{
|
|
|
+ if(res.Ret===200){
|
|
|
+ showToast('移动成功')
|
|
|
+ getEDBClassifyList()
|
|
|
+ classifyMoveState.show=false
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <van-popup
|
|
|
+ :show="props.modelValue"
|
|
|
+ position="right"
|
|
|
+ closeable
|
|
|
+ :style="{width:width>650?'400px':'100%',height:'100%'}"
|
|
|
+ @click-close-icon="handleClose"
|
|
|
+ >
|
|
|
+ <div class="edb-classify-wrap">
|
|
|
+ <div class="top-box"></div>
|
|
|
+ <div class="classify-box">
|
|
|
+ <van-collapse v-model="openClassify" :border="false">
|
|
|
+ <van-collapse-item
|
|
|
+ v-for="level1 in classifyList"
|
|
|
+ :key="level1.ClassifyId"
|
|
|
+ :name="level1.ClassifyId"
|
|
|
+ :is-link="false"
|
|
|
+ :border="false"
|
|
|
+ >
|
|
|
+ <template #title>
|
|
|
+ <div class="van-ellipsis" @click="handleSelectClassify(level1)">
|
|
|
+ <van-icon :name="openClassify.includes(level1.ClassifyId)?'arrow-down':'arrow'" style="margin-right:4px"/>
|
|
|
+ <span>{{getClassifyItemName(level1)}}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #value>
|
|
|
+ <img style="width:22px;height:22px" src="@/assets/imgs/dataEDB/icon_opt.png" alt="" @click.stop="handleShowClassifyOpt(1,level1)">
|
|
|
+ </template>
|
|
|
+ <div class="level2-box">
|
|
|
+ <van-collapse-item
|
|
|
+ v-for="level2 in level1.Children"
|
|
|
+ :key="level2.ClassifyId"
|
|
|
+ :name="level2.ClassifyId"
|
|
|
+ :is-link="false"
|
|
|
+ :border="false"
|
|
|
+ >
|
|
|
+ <template #title>
|
|
|
+ <div class="van-ellipsis" @click="handleSelectClassify(level1,level2)">
|
|
|
+ <van-icon :name="openClassify.includes(level2.ClassifyId)?'arrow-down':'arrow'" style="margin-right:4px"/>
|
|
|
+ <span>{{getClassifyItemName(level2)}}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #value>
|
|
|
+ <img style="width:22px;height:22px" src="@/assets/imgs/dataEDB/icon_opt.png" alt="" @click.stop="handleShowClassifyOpt(2,level1,level2)">
|
|
|
+ </template>
|
|
|
+ <div class="level3-box">
|
|
|
+ <van-collapse-item
|
|
|
+ v-for="level3 in level2.Children"
|
|
|
+ :key="level3.ClassifyId"
|
|
|
+ :title="getClassifyItemName(level3)"
|
|
|
+ :name="level3.ClassifyId"
|
|
|
+ :is-link="false"
|
|
|
+ disabled
|
|
|
+ :border="false"
|
|
|
+ >
|
|
|
+ <template #title>
|
|
|
+ <div class="van-ellipsis" @click="handleSelectClassify(level1,level2,level3)">
|
|
|
+ <span>{{getClassifyItemName(level3)}}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #value>
|
|
|
+ <img style="width:22px;height:22px" src="@/assets/imgs/dataEDB/icon_opt.png" alt="" @click.stop="handleShowClassifyOpt(3,level1,level2,level3)">
|
|
|
+ </template>
|
|
|
+ </van-collapse-item>
|
|
|
+ </div>
|
|
|
+ </van-collapse-item>
|
|
|
+ </div>
|
|
|
+ </van-collapse-item>
|
|
|
+ </van-collapse>
|
|
|
+ </div>
|
|
|
+ <div class="bot-btn-box">
|
|
|
+ <van-button type="primary" block @click="handleAddLevel1">添加一级目录</van-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </van-popup>
|
|
|
+
|
|
|
+ <!-- 分类操作选项 -->
|
|
|
+ <van-action-sheet
|
|
|
+ v-model:show="classifyOptState.show"
|
|
|
+ :actions="classifyOptState.actions"
|
|
|
+ cancel-text="取消"
|
|
|
+ @select="handleSelectOpt"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 创建/编辑分类 -->
|
|
|
+ <van-dialog
|
|
|
+ v-model:show="classifyState.show"
|
|
|
+ :title="classifyState.title"
|
|
|
+ show-cancel-button
|
|
|
+ @confirm="handleConfirmClassifyState"
|
|
|
+ >
|
|
|
+ <div class="edit-classify-wrap">
|
|
|
+ <p v-if="classifyState.level1Text" style="margin-bottom:8px">一级目录:{{classifyState.level1Text}}</p>
|
|
|
+ <p v-if="classifyState.level2Text" style="margin-bottom:8px">二级目录:{{classifyState.level2Text}}</p>
|
|
|
+ <input class="input-box" type="text" :placeholder="classifyState.placeholderText" v-model="classifyState.name">
|
|
|
+ </div>
|
|
|
+ </van-dialog>
|
|
|
+
|
|
|
+ <van-popup
|
|
|
+ v-model:show="classifyMoveState.show"
|
|
|
+ round
|
|
|
+ position="bottom"
|
|
|
+ >
|
|
|
+ <van-cascader
|
|
|
+ v-model="classifyMoveState.selectValue"
|
|
|
+ title="移动至"
|
|
|
+ :options="classifyMoveState.options"
|
|
|
+ :field-names="{text:'ClassifyName',value:'ClassifyId',children:'Children'}"
|
|
|
+ @close="classifyMoveState.show = false"
|
|
|
+ @change="handleSelectMoveClassifyChange"
|
|
|
+ />
|
|
|
+ <div style="width:300px;margin:0 auto;padding:20px 0">
|
|
|
+ <van-button type="primary" round block @click="handleConfirmMove">确定</van-button>
|
|
|
+ </div>
|
|
|
+ </van-popup>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.edb-classify-wrap{
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ .top-box{
|
|
|
+ height: calc(var(--van-popup-close-icon-margin) + 50px);
|
|
|
+ background-color: #fff;
|
|
|
+ flex-shrink: 0;
|
|
|
+ }
|
|
|
+ .classify-box{
|
|
|
+ flex: 1;
|
|
|
+ overflow-y: auto;
|
|
|
+ :deep(.van-cell__title){
|
|
|
+ flex: 2;
|
|
|
+ overflow: hidden;
|
|
|
+ white-space: nowrap;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ color: #333;
|
|
|
+ }
|
|
|
+ :deep(.van-collapse-item__content){
|
|
|
+ padding-right: 0;
|
|
|
+ padding-top: 0;
|
|
|
+ padding-bottom: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .bot-btn-box{
|
|
|
+ padding: 48px;
|
|
|
+ flex-shrink: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+.edit-classify-wrap{
|
|
|
+ padding: 32px 48px;
|
|
|
+ .input-box{
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ display: block;
|
|
|
+ padding: 24px 32px;
|
|
|
+ background-color: #f6f6f6;
|
|
|
+ border-radius: 12px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+</style>
|