VUE 拖拽筛选

  • 本次记录下项目里面遇见的坑,如图所示,这个需求,这个步骤上一步时我上次发的将SQL文件传给后台,然后,后台将SQL文件的字段解析出来,我在这里将其按照图示操作,这里主要涉及拖拽,还有一个就是筛选
  • 思考:操作数据,让数据在其中流动,尽量不动dom元素,这里所有操作都是基于对象数组


    筛选.gif
  • 先说筛选,此处输入筛选字段,向后台发送请求,得到所有包含筛选字段的对象数组,然后将分库分表,孤立表,全局表三个格子的数据用concat链接起来,将请求的数据和格子的数据,做对比,将其一样的给删除(此处有个坑)
 Fiter() {
      let param = {
        sql: localStorage.sql,
        clusterId: this.id,
        databaseName: localStorage.getItem("dataBaseName"),
        condition: this.tagFilter
      };
      console.log(param);
      Api.newRule
        .getDDL(param)
        .then(res => {
          if (res.data.resCode == 10000) {
          // console.log(res.data.data.tableList);
            let dataArr = []
            this.tags = []
            let _data = res.data.data.tableList
            console.log(_data);//这是我请求到的数据
            let arr = []
          
            console.log("分库分表");
             let arr0 = this.guDatas;
              
             console.log("孤立表");
             let arr1 = this.quanDatas;   

              console.log("quanju表");
             let arr2 = this.qiDatas;
             arr =   arr0.concat(arr1).concat(arr2)
           
            console.log(arr)
            for (let i = 0; i < _data.length; i++) {
              console.log(_data[i].name)
              for (let j = 0; j < arr.length; j++) {
                console.log(arr[j].name)        
                if ( _data[i].name == arr[j].name) {
                    // _data.splice(i,1) 
                    //这里是个坑,开始我直接用splice方法,删除一样的数据,但是没注意到,
                    //此处删除了,_data的数据就改变了,不在时原来的数据,
                    //造成的后果就是筛选的时候上面会出现你已经选过的数据,
                    //造成数据越筛选越多,所以这里又做了下面的循环,用第三方避免这种情况
                  dataArr.push(_data[i])     
                }else {
                }
              }
            }
           localStorage.setItem('_dataData',JSON.stringify(_data))
            this.tags = JSON.parse(localStorage._dataData)
            console.log(this.tags)
            for (let i = 0; i < dataArr.length; i++) {
              for (let j = 0; j < this.tags.length; j++) {
               if ( dataArr[i].name == this.tags[j].name) {
                 this.tags.splice(j,1) 
               }
                
              }
              
            }
         
          }
        })
    },
//由于这是临上线发现的BUG。所以仓促改的,代码有些乱,上线了在进行优化一下代码
  • 另外一个就是拖拽了,比较简单,但是需要细心,直接上代码吧,看了就懂了,这是整个这个页面的代码,我把之前的拆分又给整合了,为了贴上来方便,代码实际中,这种页面还是拆分为模块比较好
<template>
  <div class="layout-main">
    <m-breadcrumb :data="pathData" :currentPath="currentPath"></m-breadcrumb>
     <div  class="layout-main__hd" @dragenter="dragenter" @dragover.prevent  @drop="dropTag($event)">
       <div :class="[isShow?'someTagBox':'someTagBoxMore']">
         <div class="tagFifter"><el-input type="text" placeholder="输入筛选字段" v-model="tagFilter" @change="changeFilter" size="mini" clearable></el-input width='180px'><el-button @click="Fiter"  size="mini"> 筛选</el-button> 
         <el-button @click="moreTag"  size="mini">更多</el-button></div>
          <el-tag
            class="someTag"
            onselectstart="return false;"
            v-for="tag in tags"
            :key="tag.name"
            ref="tagClick"
            @dragstart.native="dragstart($event, tag)"
            draggable="true"
            
            :type="tag.type">
            {{tag.name}}
          </el-tag> 
         
       </div>
        
     </div>
     <div  class="layout-main__bd">
      <div class="gulibiao"@dragenter="dragenter" @dragover.prevent @drop="drop1($event)"  ref="click1" accessKey="1">
         <div class="gulibiao-tit"><i></i><el-tooltip placement="top">
                      <div slot="content">将按照您设置的规则散列分布在<br/>不同的数据库实例上</div>
                        <el-button type="text" color="#000">分库分表</el-button>
                      </el-tooltip></div>
                          <el-tag 
                            :key="guData.name"  
                            v-for="guData in guDatas"  
                            :type="guData.type"
                           onselectstart="return false;"
                            @dragstart.native="dragstart1($event, guData)"
                            draggable="true"
                          >
                            {{guData.name}}
                          </el-tag></div>


      <div class="quanjubiao" ref="click2" accessKey="2"  @dragover.prevent @drop="drop2($event)">
           <div class="quanjubiao-tit"><i></i><el-tooltip placement="top">
                      <div slot="content"><br/>将在一个集群里且仅在第一个slice分片上创建</div>
                        <el-button type="text" color="#000">孤立表</el-button>
                      </el-tooltip></div>
                            <el-tag 
                              :key="quanData.name"  
                              v-for="quanData in quanDatas"  
                              :type="quanData.type"
                            onselectstart="return false;"
                            @dragstart.native="dragstart2($event, quanData)"
                            draggable="true"
                            >
                              {{quanData.name}}
                            </el-tag> </div>
      <div class="qita"  ref="click3" accessKey="3" @dragover.prevent @drop="drop3($event)">
         <div class="qita-tit"><i></i><el-tooltip placement="top">
                      <div slot="content">在集群下的每一个数据库实例上创建<br/></div>
                        <el-button type="text" color="#000">全局表</el-button>
                      </el-tooltip></div>
                        <el-tag 
                        :key="qiData.name"  
                        v-for="qiData in qiDatas"  
                        :type="qiData.type"
                       onselectstart="return false;"
                         @dragstart.native="dragstart3($event, qiData)"
                        draggable="true"
                      >
                        {{qiData.name}}
                      </el-tag></div>
      <el-button type="primary "style="width:136px;" @click="saveMeta" class="baocunMeta">保存</el-button>                  
     </div>
  </div>
</template>

<script>
import Api from "@/libs/api";
import { mapState } from "vuex";
import Util from "@/libs/util";
export default {
  data() {
    return {
      id: localStorage.getItem("clusterDetailId"),
      pathData: [
        { path: "/clusterManage/cluster", name: "集群列表" },
        { path: "/clusterManage/cluster/detail/"+localStorage.getItem("clusterDetailId"), name: "集群详情" },
        ],
      currentPath: "创建表二",
      loading: false,
      isShow: true,
      dataBaseName: "", //上一步所选数据库名字
      tagFilter: "",
      predataBase: "", //上一部村的拖拽的标签数据
      tmp: "",
      tmp1: "",
      tmp2: "",
      tmp3: "",
      keys: "",
      tags: [],
      guDatas: [], //分库分表
      quanDatas: [], //孤立表
      qiDatas: [], //全员表
      keys: ""
    };
  },
  computed: {
    ...mapState({
      count1: state => state.ddl.dataBaseName,
      count2: state => state.ddl.dataBaseBiaoName
    }),
    updated() {
       this.Fiter();
    },
  },

  methods: {
    //初始化
    loadData() {
      console.log(this.count1);
      console.log(this.count2);
      this.dataBaseName = this.count1;
      // this.tags = this.count2.tableList;
     this.changeFilter()
     
      // this.tags = JSON.parse(localStorage.getItem('dataBaseBiaoName'))
    },
    //筛选字段
    changeFilter() {
      console.log(this.tagFilter);
      if (this.tagFilter == "") {
        this.Fiter();
      }
    },
     Fiter() {
      let param = {
        sql: localStorage.sql,
        clusterId: this.id,
        databaseName: localStorage.getItem("dataBaseName"),
        condition: this.tagFilter
      };
      console.log(param);
          Api.newRule
        .getDDL(param)
        .then(res => {
          if (res.data.resCode == 10000) {
          // console.log(res.data.data.tableList);
            let dataArr = []
            this.tags = []
            let _data = res.data.data.tableList
            console.log(_data);
            let arr = []
          
            console.log("分库分表");
             let arr0 = this.guDatas;
              
             console.log("孤立表");
             let arr1 = this.quanDatas;   

              console.log("quanju表");
             let arr2 = this.qiDatas;
             arr =   arr0.concat(arr1).concat(arr2)
           
              console.log(arr)
            for (let i = 0; i < _data.length; i++) {
              console.log(_data[i].name)
              for (let j = 0; j < arr.length; j++) {
                console.log(arr[j].name)        
                if ( _data[i].name == arr[j].name) {
                  // _data.splice(i,1) 
                  dataArr.push(_data[i])     
                }else {
                }
              }
            }
            
           localStorage.setItem('_dataData',JSON.stringify(_data))
            this.tags = JSON.parse(localStorage._dataData)
            console.log(this.tags)
            for (let i = 0; i < dataArr.length; i++) {
              for (let j = 0; j < this.tags.length; j++) {
               if ( dataArr[i].name == this.tags[j].name) {
                 this.tags.splice(j,1) 
                // delete _data[i];
               }
                
              }
              
            }
         
          }
        })
    },
    /**
     * @description DDLMeta结构保存
     * @param {dataBaseName} 数据库名字
     * @param {clusterId} 集群id
     * @param {sqlId} 集群id
     *  @param {tableType} 表名以及表类型拼成的字符串
     */
    saveMeta() {
      console.log(this.guDatas);
      let arr0 = this.guDatas;
      console.log(this.quanDatas);
      let arr1 = this.quanDatas;
      console.log(this.qiDatas);
      let arr2 = this.qiDatas;

      if (arr0.length == 0 && arr1.length == 0 && arr2.length == 0) {
        this.$message.error("还未选择任何表,请选择需要添加的表");
      } else {
        let str0 = ""; //分库分表
        for (let i = 0; i < arr0.length; i++) {
          str0 += arr0[i].name + `,` + `0` + `,,`;
        }
        console.log(str0);
        let str1 = ""; //孤立表
        for (let i = 0; i < arr1.length; i++) {
          str1 += arr1[i].name + `,` + `1` + `,,`;
        }
        console.log(str1);
        let str2 = ""; //全员表表
        for (let i = 0; i < arr2.length; i++) {
          str2 += arr2[i].name + `,` + `2` + `,,`;
        }
        console.log(str2);
        let str;
        str = str0 + str1 + str2;
        console.log(str.substring(0, str.length - 2));
        let params = {
          dataBaseName: this.dataBaseName,
          tableType: str.substring(0, str.length - 2),
          clusterId: this.id,
          sqlId: this.count2.sqlId
        };
        console.log(params);
        Api.newRule
          .saveMeta(params)
          .then(res => {
            console.log(res);
            if (res.data.resCode == 10000) {
              //获取设置规则需要的树数据
              console.log(res.data.data);
              Api.newRule
                .getSchema1(this.count2.sqlId)
                .then(res => {
                  this.$store.commit("schemaData", res.data.data);
                  localStorage.setItem(
                    "schemaData",
                    JSON.stringify(res.data.data)
                  );
                  console.log(res.data.data);
                  localStorage.setItem("schemaMark", 1);
                })
                .catch(res => {});
              if (res.data.resMsg == "无分表不需要创建工单") {
                this.$alert(res.data.resMsg, "成功", {
                  confirmButtonText: "确定",
                  showClose: false,
                  type: "success",
                  callback: action => {
                    //这里跳转详情页面
                    this.$router.push(
                      "/clusterManage/cluster/detail/" + this.id
                    );
                  }
                });
              } else {
                this.$confirm(res.data.resMsg, "成功", {
                  confirmButtonText: "开始设置规则",
                  cancelButtonText: "稍后设置规则",
                  type: "success"
                })
                  .then(() => {
                    //这里跳转设置规则页面
                    localStorage.setItem("sqlNum", 2);
                    this.$router.push("/clusterManage/cluster/createRule1");
                  })
                  .catch(() => {
                    //这里跳转详情页面
                    this.$router.push(
                      "/clusterManage/cluster/detail/" + this.id
                    );
                  });
              }
            } else {
              this.$message.error("表已存在,创建失败");
              this.$router.push("/clusterManage/cluster/detail/" + this.id);
            }
          })
          .catch(res => {
            this.$confirm(res.data.resMsg, "失败", {
              // confirmButtonText: '返回修改',
              cancelButtonText: "返回修改",
              type: "warning"
            })
              .then(() => {
                //这里跳转设置规则页面
              })
              .catch(() => {
                //这里跳转详情页面
              });
          });
      }
    },
    dragstart(event, tag) {
      console.log(111);
      console.log(tag);
      console.log("dragstart");
      this.tmp = tag;
    },
    dragstart1(event, guData) {
      console.log(this.$refs.click1.accessKey);
      this.keys = this.$refs.click1.accessKey;
      console.log("dragstart1");
      this.tmp1 = guData;
      console.log(this.tmp1);
    },
    dragstart2(event, quanData) {
      console.log(this.$refs.click2.accessKey);
      this.keys = this.$refs.click2.accessKey;
      console.log("dragstart2");
      this.tmp2 = quanData;
      console.log(this.tmp2);
    },
    dragstart3(event, qiData) {
      console.log(this.$refs.click3.accessKey);
      this.keys = this.$refs.click3.accessKey;
      console.log("dragstart3");
      this.tmp3 = qiData;
      console.log(this.tmp3);
    },
    dragenter() {},
    dragover() {},
    dragend() {
      console.log("end");
      this.guDatas.push(this.tmp);
    },
    drop1(e) {
      console.log('drop1');
      if (this.keys == 2) {
        this.guDatas.push(this.tmp2);
        this.quanDatas.splice(this.quanDatas.indexOf(this.tmp2), 1);
      } else if (this.keys == 3) {
        this.guDatas.push(this.tmp3);
        this.qiDatas.splice(this.qiDatas.indexOf(this.tmp3), 1);
      } else if (this.keys == 1) {
      } else {
        console.log(this.tmp);
        this.guDatas.push(this.tmp);
        this.tags.splice(this.tags.indexOf(this.tmp), 1);
      }
      this.keys = "";
      console.log(this.keys);
      console.log(e.dataTransfer);
     
      console.log('this.tags')
      console.log(this.tags)
      Util.quChong(this.guDatas)
       console.log(this.guDatas);
   
    },
    drop2(e) {
      console.log('drop2');

      if (this.keys == 1) {
        this.quanDatas.push(this.tmp1);
        this.guDatas.splice(this.guDatas.indexOf(this.tmp1), 1);
      } else if (this.keys == 3) {
        this.quanDatas.push(this.tmp3);
        this.qiDatas.splice(this.qiDatas.indexOf(this.tmp3), 1);
      } else if (this.keys == 2) {
      } else {
        this.quanDatas.push(this.tmp);
        this.tags.splice(this.tags.indexOf(this.tmp), 1);
      }
      this.keys = "";
      // console.log(e.dataTransfer);
      // this.quanDatas.push( this.tmp)
      // this.tags.splice(this.tags.indexOf(this.tmp), 1);
      console.log('this.tags')
      console.log(this.tags)
      Util.quChong(this.quanDatas)
       console.log(this.quanDatas);
    },
    drop3(e) {
      console.log('drop3');

      if (this.keys == 1) {
        this.qiDatas.push(this.tmp1);
        this.guDatas.splice(this.guDatas.indexOf(this.tmp1), 1);
      } else if (this.keys == 2) {
        this.qiDatas.push(this.tmp2);
        this.quanDatas.splice(this.quanDatas.indexOf(this.tmp2), 1);
      } else if (this.keys == 3) {
      } else {
        this.qiDatas.push(this.tmp);
        this.tags.splice(this.tags.indexOf(this.tmp), 1);
      }
      console.log(e.dataTransfer);
      this.keys = "";
      console.log('this.tags')
      console.log(this.tags)
       Util.quChong(this.qiDatas)
       console.log(this.qiDatas);
    },
    dropTag(e) {
      console.log('droTag');

      if (this.keys == 1) {
        this.tags.push(this.tmp1);
        // this.qiDatas.push(this.tmp1);
        this.guDatas.splice(this.guDatas.indexOf(this.tmp1), 1);
      } else if (this.keys == 2) {
        this.tags.push(this.tmp2);
        this.quanDatas.splice(this.quanDatas.indexOf(this.tmp2), 1);
      } else if (this.keys == 3) {
        this.tags.push(this.tmp3);
        this.qiDatas.splice(this.qiDatas.indexOf(this.tmp3), 1);
      }
      this.keys = "";
      console.log('this.tags')
      Util.quChong(this.tags)
       console.log(this.tags);

    },
    moreTag() {
      this.isShow = !this.isShow;
    }
  },

  created() {
    this.predataBase = JSON.parse(localStorage.getItem("dataBaseBiaoName"));
    this.loadData();
  }
};
</script>

<style lang='scss'>
.someTagBox {
  height: 105px;
  overflow: hidden;
}

.someTag {
  margin-right: 5px;
  margin-top: 5px;
}
.tagFifter {
  .el-input {
    width: 200px;
    margin-right: 10px;
  }
}
.layout-main__bd {
  overflow: hidden;
  .baocunMeta {
    margin-top: 20px;
    margin-left: 2.5%;
  }
  .gulibiao {
    float: left;
    padding: 0 5px;
    margin-left: 2.5%;
    width: 30%;
    height: 400px;
    box-sizing: border-box;
    box-shadow: 0 0 10px #ccc;
    border: 1px solid #3399ff;
    .gulibiao-tit {
      border-bottom: 1px solid #eee;
      margin-bottom: 5px;
      .el-button {
        color: #000;
      }
    }
  }
  .quanjubiao {
    float: left;
    padding: 0 5px;
    width: 30%;
    height: 400px;
    margin-left: 2.5%;
    margin-right: 2.5%;
    box-sizing: border-box;
    box-shadow: 0 0 10px #ccc;
    border: 1px solid #3399ff;
    .quanjubiao-tit {
      border-bottom: 1px solid #eee;
      margin-bottom: 5px;
      .el-button {
        color: #000;
      }
    }
  }
  .qita {
    float: left;
    width: 30%;
    padding: 0 5px;
    margin-right: 2.5%;
    height: 400px;
    box-sizing: border-box;
    border: 1px solid #3399ff;
    box-shadow: 0 0 10px #ccc;
    .qita-tit {
      border-bottom: 1px solid #eee;
      margin-bottom: 5px;
      .el-button {
        color: #000;
      }
    }
  }
}
</style>

+😂😂先写到这里吧😂😂

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • 《新的百万富翁》第18-25章。 一.你想成为怎样的人? 我想成为一个承担起责任的人。可以控制自己的态度,控制自己...
    张清_早起_深圳阅读 104评论 0 0
  • 研一第二学期,一节课都没上,躺在宿舍床上,想象从去年六月份到现在,紫癜——这个以前从没听过的词已经发生在我身上大半...
    手握魔静阅读 3,698评论 0 3
  • 并没有那么帅阅读 255评论 0 1
  • 我觉得在鹅卵石和人行道中间看到新鲜的泥土是一件很奇怪的事情。就像城镇的衣服被撕掉了一片,露出了裸露的肌肉 感觉到想...
    CNBLUEone阅读 201评论 0 0