123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472 |
- <!--
- 表格树形数据拖拽 本来使用el-table和sortablejs 但是奇怪的判断导致前端无法做跨级拖拽的限制。
- 得由后端来限制,固使用drag-tree-table 但是这个插件构造比较简单,不是用table标签实现的
- 如果产品要实现el-table上面的功能,需要自定义,有更好的方法,还请通知一声。
- -->
- <template>
- <div class="doc-classifyMana-container">
- <div class="doc-classifyMana-top-zone">
- <el-button type="primary" @click="addClassify">添加分类</el-button>
- <el-input placeholder="分类名称" v-model="queryParams.KeyWord" @input="getclassifyData" clearable
- style="width:500px;margin-left: 20px;">
- <i slot="prefix" class="el-input__icon el-icon-search"></i>
- </el-input>
- </div>
- <!-- <el-table style="border:1px solid #eaeaea;" ref="classifyTableRef"
- :data="classifyList" :row-class-name="tableRowClassName" row-key="id" :tree-props="{children:'child'}">
- <el-table-column prop="text" label="一级分类">
- <template slot-scope="scope">
- <span>{{scope.row.level==1?scope.row.text:''}}</span>
- </template>
- </el-table-column>
- <el-table-column prop="text" label="二级分类">
- <template slot-scope="scope">
- <span>{{scope.row.level==2?scope.row.text:''}}</span>
- </template>
- </el-table-column>
- <el-table-column prop="text" label="三级分类">
- <template slot-scope="scope">
- <span>{{scope.row.level==3?scope.row.text:''}}</span>
- </template>
- </el-table-column>
- <el-table-column label="操作" align="center">
- <template slot-scope="scope">
- <div class="table-button">
- <span @click="configItem(scope.row)">权限配置</span>
- <span @click="edititem(scope.row)">编辑</span>
- <span @click="checkdeleteitem(scope.row)" style="margin-right: 0;color: #F56C6C;">删除</span>
- </div>
- </template>
- </el-table-column>
- </el-table> -->
- <dragTreeTable ref="dragTreeTableRef" :beforeDragOver="beforeDrag"
- :data="treeData" :onDrag="onTreeDataChange"
- hightRowChange resize border >
- <!-- onlySameLevelCanDrag -->
- </dragTreeTable>
- <!-- 添加分类弹窗 -->
- <el-dialog :title="dialogTitle" :visible.sync="showAddClassifyDia" width="625px"
- append-to-body :close-on-click-modal="false" @close="resetForm">
- <div style="display: flex;flex-direction: column; align-items: center;margin-bottom: 35px;">
- <el-form :model="classifyForm" ref="classifyFormRef" label-width="80px">
- <el-form-item label="上级目录" prop="ParentId">
- <el-cascader v-model="classifyForm.ParentId" :options="noLevelThreeList" @change="selectParentId"
- placeholder="请选择上级目录(不选默认添加的是一级分类)" ref="parentIdCascaderRef"
- :props="{ value:'ClassifyId',label:'ClassifyName',children:'Children',checkStrictly:true,emitPath:false,disabled:'Disabled'}"
- class="lastCatalogCascader" :disabled="this.dialogTitle.indexOf('编辑分类')!=-1" />
- </el-form-item>
- <el-form-item label="分类名称" prop="HelpDocClassifyName" :rules="{required:true,message:'分类名称不能为空',trigger:'blur'}">
- <el-input v-model="classifyForm.HelpDocClassifyName" placeholder="请输入分类名称" style="width: 337px;"
- maxlength="10"></el-input>
- </el-form-item>
- </el-form>
- <div style="margin-top: 40px;">
- <el-button type="primary" style="width:120px;margin-right:10px" @click="classifySave" size="medium">保存</el-button>
- <el-button style="width:120px;" @click="showAddClassifyDia=false" size="medium">取消</el-button>
- </div>
- </div>
- </el-dialog>
- <!-- 设置权限弹窗 -->
- <el-dialog :title="dialogTitle" :visible.sync="showPermissionDia" width="625px"
- append-to-body :close-on-click-modal="false" @close="resetPermissonForm">
- <div style="display: flex;flex-direction: column; align-items: center;margin-bottom: 35px;">
- <el-form :model="permissionForm" ref="permissionFormRef" label-width="80px">
- <el-form-item label="可见权限" prop="merchantIds">
- <el-select v-model="permissionForm.merchantIds" placeholder="请选择商家"
- multiple style="width: 337px;" collapse-tags clearable filterable >
- <el-option :label="item.BusinessName" :value="item.EtaBusinessId"
- v-for="item in merchantList" :key="item.merchantId"></el-option>
- </el-select>
- </el-form-item>
- </el-form>
- <div style="margin-top: 40px;">
- <el-button type="primary" style="width:120px;margin-right:10px" @click="configSave" size="medium">保存</el-button>
- <el-button style="width:120px;" @click="showPermissionDia=false" size="medium">取消</el-button>
- </div>
- </div>
- </el-dialog>
- </div>
- </template>
- <script>
- // import Sortable from "sortablejs";
- import {assistanceDocInterence,businessCustomInterence} from "@/api/api.js"
- import dragTreeTable from "drag-tree-table";
- export default {
- name:"docClassifyManage",
- components:{dragTreeTable},
- data() {
- // 表格头设置
- this.tableHeadList=[
- {
- type:"selection",
- title: '一级分类',
- field: 'ClassifyName',
- flex:1,
- align: 'center',
- formatter: (item) => {
- return item.Level==1?item.ClassifyName:""
- }
- },
- {
- title: '二级分类',
- field: 'ClassifyName',
- // width: 200,
- flex:1,
- align: 'center',
- formatter: (item) => {
- return item.Level==2?item.ClassifyName:""
- }
- },
- {
- title: '三级分类',
- field: 'ClassifyName',
- // width: 200,
- flex:1,
- align: 'center',
- formatter: (item) => {
- return item.Level==3?item.ClassifyName:""
- }
- },
- {
- type: 'action',
- title: '操作',
- width: 260,
- // flex:1,
- align: 'center',
- actions:[
- {
- text: '权限配置',
- onclick: (item) => {
- // item是当前行的数据
- this.configClassify(item)
- },
- formatter: (item) => {
- return '<span class="table-button">权限配置</span>'
- }
- },
- {
- text: '编辑',
- onclick: (item) => {
- this.editClassify(item)
- },
- formatter: (item) => {
- return '<span class="table-button">编辑</span>'
- }
- },
- {
- text: '删除',
- onclick: (item) => {
- this.deleteClassify(item)
- },
- formatter: (item) => {
- return '<span class="table-button" style="margin-right: 0;color: #F56C6C;">删除</span>'
- }
- }
- ]
- }
- ]
- // 自定义字段替换
- this.custom_field={
- id: 'ClassifyId',
- order: 'Sort',
- lists: 'Children',
- parent_id: 'ParentId'
- }
- return {
- queryParams:{
- KeyWord:''
- },
- treeData:{
- columns:this.tableHeadList,
- lists:[],
- custom_field:this.custom_field
- },
- // 没有三级分类的分类数组,用于添加
- noLevelThreeList:[],
- // // 扁平化之后的数据
- // classifyListFlat:[],
- dialogTitle:"",
- showAddClassifyDia:false,
- classifyForm:{
- ParentId:0,
- HelpDocClassifyName:'',
- Level:0,
- },
- merchantList:[],
- showPermissionDia:false,
- permissionForm:{
- HelpDocClassifyId:0,
- merchantIds:[]
- },
- }
- },
- created(){
- this.getmerchantList()
- this.getclassifyData()
- },
- mounted(){
- this.$nextTick(()=>{
- // this.tableDropSet()
- })
- },
- methods: {
- getmerchantList(){
- businessCustomInterence.getBusinessList({PageSize:9999999,CurrentIndex:1}).then(res=>{
- if(res.Ret == 200){
- this.merchantList = res.Data.List||[]
- }
- })
- },
- getclassifyData(){
- assistanceDocInterence.getAssistanceClassifyList(this.queryParams).then(res=>{
- if(res.Ret == 200){
- this.treeData.lists = res.Data?res.Data.AllNodes||[]:[]
- this.noLevelThreeList = res.Data?res.Data.TwoLevelNodes||[]:[]
- this.treeData.lists.map(list=> {
- // 一级展开
- list.open=true
- })
- // console.log(this.treeData.lists);
- }
- })
- },
- // tableRowClassName({row,rowIndex}) {
- // if( row.child && row.child.length>0 ){
- // return 'has-child-row';
- // }else{
- // return '';
- // }
- // },
- beforeDrag(dragItem,effectItem,type){
- if(type=='center'){
- // 放里面
- if((dragItem.Level-1)!=effectItem.Level) return false
- }else{
- //不放里面
- if(dragItem.Level!=effectItem.Level) return false
- }
- // return false
- },
- onTreeDataChange(list,dragItem){
- // console.log(list,dragItem,'arguments');
- // list - 拖拽后的数据 dragItem-拖拽的项
- let ClassifyId,PrevClassifyId,NextClassifyId,ParentClassifyId=0
- // 在拖拽后的数据中找到拖拽项对应的位置
- const findDraggedItem=(list)=>{
- let itemIndex = list.findIndex(it => it.ClassifyId == dragItem.ClassifyId)
- if(itemIndex!=-1){
- if(itemIndex==0){
- PrevClassifyId=0
- }else{
- PrevClassifyId = list[itemIndex-1].ClassifyId
- }
- if(itemIndex==(list.length-1)){
- NextClassifyId=0
- }else{
- NextClassifyId = list[itemIndex+1].ClassifyId
- }
- ClassifyId = dragItem.ClassifyId
- ParentClassifyId = dragItem.ParentId
- console.log({
- ClassifyId,ParentClassifyId,PrevClassifyId,NextClassifyId
- });
- assistanceDocInterence.moveAssistanceClassify({
- ClassifyId,ParentClassifyId,PrevClassifyId,NextClassifyId
- }).then(res=>{
- if(res.Ret == 200){
- this.$message.success("移动分类成功")
- this.getclassifyData()
- }
- })
- }else{
- list.map(li => {
- li.Children && li.Children.length>0 && findDraggedItem(li.Children)
- })
- }
- }
- findDraggedItem(list)
- },
- // tableDropSet(){
- // const tbody = this.$refs.classifyTableRef.$el.querySelector(
- // ".el-table__body-wrapper > table > tbody"
- // );
- // const _this = this;
- // Sortable.create(tbody, {
- // animation: 150,
- // onStart(evt){
- // if(_this.classifyListFlat && _this.classifyListFlat.length>0){
- // return
- // }else{
- // _this.flatClassifyList(_this.classifyList,0)
- // }
- // console.log(_this.classifyListFlat);
- // },
- // onEnd({ newIndex, oldIndex }) {
- // console.log({ newIndex, oldIndex });
- // if(newIndex == oldIndex) return
- // const oldRow = _this.classifyListFlat[oldIndex]
- // const newRow = _this.classifyListFlat[newIndex]
- // console.log(oldRow,newRow);
- // _this.$message.success("拖拽成功")
- // _this.getclassifyData()
- // },
- // onMove({ dragged, related }){
- // console.log(dragged.rowIndex, related.rowIndex);
- // const oldRow = _this.classifyListFlat[dragged.rowIndex]
- // const newRow = _this.classifyListFlat[related.rowIndex]
- // console.log(oldRow.level,newRow.level);
- // if (oldRow.level !== newRow.level) {
- // return false // 不允许不同级的拖动
- // }
- // }
- // });
- // },
- // flatClassifyList(list,parentId){
- // for (let i = 0; i < list.length; i++) {
- // const element = list[i];
- // const lastElementId = i==0?0:list[i-1].id
- // const nextElementId = i==(list.length-1)?0:list[i+1].id
- // this.classifyListFlat.push({id:element.id,lastElementId,nextElementId,parentId,level:element.level})
- // if(element.child && element.child.length>0){
- // this.flatClassifyList(element.child,element.id)
- // }
- // }
- // },
- // 添加分类
- addClassify(){
- this.dialogTitle="添加分类"
- this.showAddClassifyDia=true
- },
- // 编辑分类
- editClassify(item){
- this.classifyForm={
- ParentId:item.ParentId,
- HelpDocClassifyId:item.ClassifyId,
- HelpDocClassifyName:item.ClassifyName
- }
- this.dialogTitle="编辑分类"
- this.showAddClassifyDia=true
- },
- selectParentId(value){
- this.classifyForm.Level = this.$refs.parentIdCascaderRef.getCheckedNodes()[0].data.Level
- },
- deleteClassify(item){
- this.$confirm('是否确认删除?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning',
- }).then(() => {
- assistanceDocInterence.deleteAssistanceClassify({ClassifyId:item.ClassifyId}).then(res=>{
- if(res.Ret == 200){
- this.$message.success("删除分类成功")
- this.getclassifyData()
- }
- })
- }).catch(()=>{})
- },
- // 保存
- classifySave(){
- this.$refs.classifyFormRef.validate(valid=>{
- if(valid){
- console.log(this.classifyForm);
- if(this.classifyForm.HelpDocClassifyId){
- //编辑
- assistanceDocInterence.editAssistanceClassify(this.classifyForm).then(res=>{
- if(res.Ret == 200){
- this.$message.success(this.dialogTitle+"成功")
- this.showAddClassifyDia=false
- this.resetForm()
- this.getclassifyData()
- }
- })
- }else{
- //新增
- assistanceDocInterence.addAssistanceClassify({...this.classifyForm}).then(res=>{
- if(res.Ret == 200){
- this.$message.success(this.dialogTitle+"成功")
- this.showAddClassifyDia=false
- this.resetForm()
- this.getclassifyData()
- }
- })
- }
- }
- })
- },
- resetForm(){
- this.classifyForm={
- ParentId:0,
- HelpDocClassifyName:'',
- Level:0
- }
- this.$refs.classifyFormRef.clearValidate()
- },
- //权限配置
- configClassify(row){
- this.permissionForm={
- HelpDocClassifyId:row.ClassifyId,
- merchantIds:row.VisibleBusinessIds?row.VisibleBusinessIds.split(',').map(element => {
- return parseInt(element)
- }):[]
- }
- // console.log(this.permissionForm.merchantIds);
- this.dialogTitle="设置权限"
- this.showPermissionDia=true
- },
- resetPermissonForm(){
- this.permissionForm={
- HelpDocClassifyId:0,
- merchantIds:[]
- }
- this.$refs.permissionFormRef.clearValidate()
- },
- configSave(){
- assistanceDocInterence.editAssistanceClassifyVisible({
- HelpDocClassifyId:this.permissionForm.HelpDocClassifyId,
- VisibleBusinessIds:this.permissionForm.merchantIds.join(',')
- }).then(res=>{
- if(res.Ret == 200){
- this.$message.success("设置成功")
- this.showPermissionDia=false
- this.resetPermissonForm()
- this.getclassifyData()
- }
- })
- }
- },
- }
- </script>
- <style lang="scss" scoped>
- .doc-classifyMana-container{
- background-color: white;
- min-height: calc(100vh - 110px);
- padding: 30px;
- box-sizing: border-box;
- border: solid 1px #ECECEC;
- .doc-classifyMana-top-zone{
- display: flex;
- align-items: flex-start;
- justify-content: space-between;
- margin-bottom: 20px;
- }
- }
- </style>
- <style lang="scss">
- .lastCatalogCascader{
- width: 337px;
- .el-input{
- width: 337px;
- }
- }
- .has-child-row {
- background-color: #f2f6fa!important;
- }
- .table-button{
- color:#4099ef;
- cursor: pointer;
- margin-right: 10px;
- }
- </style>
|