liuQiang 2 ani în urmă
părinte
comite
6eb16e9edf
3 a modificat fișierele cu 95 adăugiri și 10 ștergeri
  1. 2 1
      package.json
  2. 91 8
      src/views/collect/index.vue
  3. 2 1
      vite.config.js

+ 2 - 1
package.json

@@ -18,7 +18,6 @@
     "@element-plus/icons-vue": "2.0.10",
     "@vueup/vue-quill": "1.1.0",
     "@vueuse/core": "9.5.0",
-    "awe-dnd": "^0.3.4",
     "axios": "0.27.2",
     "echarts": "5.4.0",
     "element-plus": "2.2.27",
@@ -30,10 +29,12 @@
     "pinia": "2.0.22",
     "socket.io-client": "^4.0.0",
     "sockjs-client": "^1.6.1",
+    "sortablejs": "^1.15.0",
     "vue": "3.2.45",
     "vue-cropper": "1.0.3",
     "vue-native-websocket": "^2.0.15",
     "vue-router": "4.1.4",
+    "vuedraggable": "^4.1.0",
     "vuex": "^4.1.0"
   },
   "devDependencies": {

+ 91 - 8
src/views/collect/index.vue

@@ -3,14 +3,44 @@
     <!-- 标签 -->
     <div class="tags">
       <!-- TODO 标签可以拖动位置 -->
-      <el-tabs v-model="clickCollect" class="demo-tabs">
+      <!-- 
+      <el-tabs v-if="false" v-model="clickCollect" class="demo-tabs tabSign">
         <el-tab-pane label="常用" name="first"></el-tab-pane>
         <el-tab-pane label="默认" name="second"></el-tab-pane>
-        <el-tab-pane
-          v-for="item in tabList"
-          :key="item.labelId"
-          :name="item.labelId"
+        <draggable
+          :list="toRaw(tabList)"
+          ghost-class="ghost"
+          chosen-class="chosenClass"
+          animation="300"
         >
+          <template #item="{ element }">
+            <el-tab-pane>
+              <template #label>
+                <div
+                  v-if="isChangeTabName !== element.labelId"
+                  @click.right="tabClick($event, element)"
+                >
+                  {{ element.labelName }}
+                </div>
+                <div v-else>
+                  <el-input
+                    v-model="changeTabName"
+                    size="mini"
+                    @blur="reTabName"
+                    maxlength="32"
+                    :autofocus="true"
+                  ></el-input>
+                </div>
+              </template>
+            </el-tab-pane>
+          </template>
+        </draggable>
+      </el-tabs> -->
+
+      <el-tabs v-model="clickCollect" class="tabSign" ref="tabs">
+        <el-tab-pane label="常用" name="first"></el-tab-pane>
+        <el-tab-pane label="默认" name="second"></el-tab-pane>
+        <el-tab-pane v-for="item in tabList" :key="item" :name="item.labelId">
           <template #label>
             <div
               v-if="isChangeTabName !== item.labelId"
@@ -42,7 +72,7 @@
           <el-input
             v-model="tabName"
             size="mini"
-            @blur="addCollectFn"
+            @change="addCollectFn"
             maxlength="32"
             :autofocus="true"
           ></el-input>
@@ -168,7 +198,9 @@
 </template>
 
 <script setup>
-import { onMounted, ref, watch } from "vue";
+import Sortable from "sortablejs";
+import draggable from "vuedraggable";
+import { onMounted, ref, watch, nextTick } from "vue";
 import { toRaw } from "@vue/reactivity";
 import { listLabel, addLabel, delLabel, updateLabel } from "@/api/biz/label.js";
 import { listFavorite } from "@/api/biz/favorite.js";
@@ -244,6 +276,7 @@ const isChangeTabName = ref(0); //存放修改状标签的id
 onMounted(async () => {
   await getList();
   await getCollectList();
+  rowDrop();
   // 添加监听,点击其他地方关闭菜单
   window.addEventListener("click", closeMenu, true);
 });
@@ -273,8 +306,16 @@ const addCollectFn = async () => {
     isAddCollect.value = false;
     return;
   }
+
+  const list = toRaw(tabList.value);
+  let order = 0;
+  if (list.length > 0) {
+    order = getBigOrder(list);
+  }
+
   const res = await addLabel({
     labelName: tabName.value,
+    orderNum: order,
   });
   if (res.code == 200) {
     isAddCollect.value = false;
@@ -288,8 +329,9 @@ const getList = async () => {
   console.log("tabList =", res);
   if (res.rows.length > 0) {
     let dates = JSON.parse(JSON.stringify(res.rows));
+    dates.sort(sortArr("orderNum"));
     tabList.value = [...dates];
-    console.log("tabList", tabList.value);
+    // console.log("tabList", tabList.value);
     // console.log("dates", dates);
   }
 };
@@ -325,6 +367,47 @@ const reTabName = async () => {
   isChangeTabName.value = 0;
   console.log("rename", res);
 };
+//拖拽事件
+const rowDrop = () => {
+  const el = document.querySelector(".tabSign .el-tabs__nav"); //找到想要拖拽的那一列
+  // console.log('el',el);
+  const _this = toRaw(tabList.value);
+  // console.log("_this", _this);
+  Sortable.create(el, {
+    filter: "#tab-first,#tab-second", //限制哪些可以拖动
+    preventOnFilter: true,
+    onChoose: function (/**Event*/ evt) {
+      evt.oldIndex;
+      console.log("evt", evt);
+    },
+    //结束拖拽事件
+    onEnd({ newIndex, oldIndex, to }) {
+      console.log("newIndex", newIndex);
+      console.log("oldIndex", oldIndex);
+      //oldIIndex拖放前的位置, newIndex拖放后的位置  //tabOptionList为遍历的tab签
+      const currRow = _this.splice(oldIndex, 1)[0]; //鼠标拖拽当前的el-tabs-pane
+      _this.splice(newIndex, 0, currRow); //tableData 是存放所以el-tabs-pane的数组
+    },
+  });
+};
+
+// 工具函数
+//获取新增标签时要赋予的ordername
+const getBigOrder = (arr) => {
+  let num = 0;
+  arr.forEach((item) => {
+    if (item.orderNum > num) {
+      num = item.orderNum;
+    }
+  });
+  return num + 1;
+};
+//数组排序
+const sortArr = (field) => {
+  return function (a, b) {
+    return a[field] - b[field];
+  };
+};
 </script>
 
 <style lang="scss" scoped>

+ 2 - 1
vite.config.js

@@ -33,12 +33,13 @@ export default defineConfig(({
 		},
 		// vite 相关配置
 		server: {
-			port: 80,
+			port: 81,
 			host: true,
 			open: true,
 			proxy: {
 				// https://cn.vitejs.dev/config/#server-proxy
 				'/dev-api': {
+					// target: 'http://192.168.1.28:8080/',
 					target: 'http://8.142.173.95:19527/',
 					changeOrigin: true,
 					rewrite: (p) => p.replace(/^\/dev-api/, '')