2 Commits 76e84c426c ... b9bad05715

Autor SHA1 Mensagem Data
  sunxuewei b9bad05715 Merge branch 'sxw-skeleton' of http://101.36.160.140:21044/emergency-report/report-vue into sxw-skeleton 2 anos atrás
  sunxuewei 110ef4229c 优化 2 anos atrás

BIN
src/assets/img/top-bj.png


+ 2 - 4
src/const/website.ts

@@ -1,7 +1,5 @@
1
 export default {
1
 export default {
2
-  title: "接诉即处",
3
-  subtitle: "“接诉即处”业务管理系统",
4
-  copyright: "",
2
+  title: "中央应急物资储备管理系统",
5
   isFirstPage: true, // 配置首页不可关闭
3
   isFirstPage: true, // 配置首页不可关闭
6
   key: "avenue", // 配置主键,目前用于存储
4
   key: "avenue", // 配置主键,目前用于存储
7
   validateCode: true, // 是否开启验证码校验
5
   validateCode: true, // 是否开启验证码校验
@@ -17,7 +15,7 @@ export default {
17
   whiteList: ["/login", "/404", "/401", "/lock"], // 配置无权限可以访问的页面
15
   whiteList: ["/login", "/404", "/401", "/lock"], // 配置无权限可以访问的页面
18
   whiteTagList: ["/login", "/404", "/401", "/lock"], // 配置不添加tags页面 ('/advanced-router/mutative-detail/*'——*为通配符)
16
   whiteTagList: ["/login", "/404", "/401", "/lock"], // 配置不添加tags页面 ('/advanced-router/mutative-detail/*'——*为通配符)
19
   fistPage: {
17
   fistPage: {
20
-    label: "出库信息填报",
18
+    label: "首页",
21
     value: "/home/index",
19
     value: "/home/index",
22
     params: {},
20
     params: {},
23
     query: {},
21
     query: {},

+ 2 - 2
src/layout/components/sidebar/sidebar.vue

@@ -3,7 +3,7 @@
3
     <div class="sidebar_menu_scroll">
3
     <div class="sidebar_menu_scroll">
4
       <el-menu default-active="1" @open="handleOpen" @close="handleClose">
4
       <el-menu default-active="1" @open="handleOpen" @close="handleClose">
5
         <template v-for="(item, index) in menu">
5
         <template v-for="(item, index) in menu">
6
-          <el-sub-menu v-if="item.children.length > 0" :key="item.path" :index="index">
6
+          <el-sub-menu v-if="item.children.length > 0" :key="item.path" :index="`${index}`">
7
             <template #title>
7
             <template #title>
8
               <span>{{ item.name }}</span>
8
               <span>{{ item.name }}</span>
9
             </template>
9
             </template>
@@ -41,7 +41,7 @@ const menuClick = (item: any) => {
41
 </script>
41
 </script>
42
 <style lang="scss" scoped>
42
 <style lang="scss" scoped>
43
 .sidebar_menu {
43
 .sidebar_menu {
44
-  height: calc(100vh - 90px);
44
+  height: calc(100vh - 130px);
45
   width: 200px;
45
   width: 200px;
46
   overflow: hidden;
46
   overflow: hidden;
47
   &_scroll {
47
   &_scroll {

+ 11 - 30
src/layout/components/topbar/index.vue

@@ -3,10 +3,6 @@
3
     <div class="topbar_title">
3
     <div class="topbar_title">
4
       <img src="~@/assets/img/logo.png" />
4
       <img src="~@/assets/img/logo.png" />
5
     </div>
5
     </div>
6
-    <!-- <div class="topbar_help">
7
-      <el-icon color="#767DEA"><QuestionFilled /></el-icon>
8
-      帮助
9
-    </div> -->
10
     <div class="topbar_user">
6
     <div class="topbar_user">
11
       <el-dropdown @command="handleCommand" trigger="hover">
7
       <el-dropdown @command="handleCommand" trigger="hover">
12
         <div class="avatar-wrapper">
8
         <div class="avatar-wrapper">
@@ -26,16 +22,17 @@
26
       </el-dropdown>
22
       </el-dropdown>
27
     </div>
23
     </div>
28
   </div>
24
   </div>
25
+  <topTag />
29
 </template>
26
 </template>
30
 
27
 
31
 <script setup lang="ts">
28
 <script setup lang="ts">
29
+import topTag from "./topTag.vue";
30
+
32
 import { ref } from "vue";
31
 import { ref } from "vue";
33
 import { useStore } from "vuex";
32
 import { useStore } from "vuex";
34
-import { useRouter } from "vue-router";
35
-import { ElMessageBox, ElMessage } from "element-plus";
36
-import { QuestionFilled, UserFilled, ArrowDown } from "@element-plus/icons-vue";
33
+import { ElMessageBox } from "element-plus";
34
+import { UserFilled, ArrowDown } from "@element-plus/icons-vue";
37
 
35
 
38
-const router = useRouter();
39
 const store = useStore();
36
 const store = useStore();
40
 const userInfo: any = ref("");
37
 const userInfo: any = ref("");
41
 
38
 
@@ -48,18 +45,12 @@ const handleCommand = () => {
48
     confirmButtonText: "确定",
45
     confirmButtonText: "确定",
49
     cancelButtonText: "取消",
46
     cancelButtonText: "取消",
50
     type: "warning"
47
     type: "warning"
51
-  })
52
-    .then(() => {
53
-      store.dispatch("LogOut").then(() => {
54
-        // 刷新登录页面,避免多次弹框
55
-        window.location.reload();
56
-        ElMessage({
57
-          type: "success",
58
-          message: "成功退出登录"
59
-        });
60
-      });
61
-    })
62
-    .catch(() => console.log("取消"));
48
+  }).then(() => {
49
+    store.dispatch("LogOut").then(() => {
50
+      // 刷新登录页面,避免多次弹框
51
+      window.location.reload();
52
+    });
53
+  });
63
 };
54
 };
64
 </script>
55
 </script>
65
 
56
 
@@ -85,16 +76,6 @@ const handleCommand = () => {
85
       margin-right: 30px;
76
       margin-right: 30px;
86
     }
77
     }
87
   }
78
   }
88
-  &_help {
89
-    display: flex;
90
-    align-items: center;
91
-    font-size: 16px;
92
-    margin-right: 30px;
93
-    color: #fff;
94
-    .el-icon {
95
-      font-size: 18px;
96
-    }
97
-  }
98
   &_user {
79
   &_user {
99
     min-width: 180px;
80
     min-width: 180px;
100
     .avatar-wrapper {
81
     .avatar-wrapper {

+ 0 - 15
src/layout/components/topbar/logo.vue

@@ -1,15 +0,0 @@
1
-<template>
2
-  <div class="logo">
3
-    <img src="~@/assets/img/logo.png" />
4
-  </div>
5
-</template>
6
-<script setup lang="ts"></script>
7
-<style lang="scss" scoped>
8
-.logo {
9
-  width: 90px;
10
-  height: 90px;
11
-  display: flex;
12
-  align-items: center;
13
-  justify-content: center;
14
-}
15
-</style>

+ 133 - 0
src/layout/components/topbar/topTag.vue

@@ -0,0 +1,133 @@
1
+<template>
2
+  <div class="top_tag">
3
+    <el-tabs
4
+      v-model="active"
5
+      :closable="tagList.length !== 1"
6
+      type="card"
7
+      @contextmenu="handleContextmenu"
8
+      @tab-click="openTag"
9
+      @tab-remove="removeTag"
10
+    >
11
+      <el-tab-pane v-for="item in tagList" :key="item.value" :label="item.label" :name="item.value" />
12
+    </el-tabs>
13
+    <el-dropdown class="top_tag__menu">
14
+      <el-button>
15
+        更多
16
+        <el-icon><ArrowDown /></el-icon>
17
+      </el-button>
18
+      <template #dropdown>
19
+        <el-dropdown-menu>
20
+          <el-dropdown-item @click="closeOthersTags">关闭其他</el-dropdown-item>
21
+          <el-dropdown-item @click="closeAllTags">关闭全部</el-dropdown-item>
22
+        </el-dropdown-menu>
23
+      </template>
24
+    </el-dropdown>
25
+  </div>
26
+</template>
27
+
28
+<script setup lang="ts">
29
+import { computed, nextTick } from "vue";
30
+import { useRouter } from "vue-router";
31
+import { useStore } from "vuex";
32
+import { useGetters } from "@/hooks/storeHooks";
33
+import { ArrowDown } from "@element-plus/icons-vue";
34
+
35
+const router = useRouter();
36
+const store = useStore();
37
+const { tagWel, tagList, tag, website } = useGetters(["tagWel", "tagList", "tag", "website"]);
38
+const active = computed(() => tag.value.value);
39
+
40
+// 右键点击事件
41
+const handleContextmenu = () => {
42
+  console.log(1);
43
+};
44
+
45
+// 点击事件
46
+const openTag = (item: any) => {
47
+  router.push(item.props.name);
48
+};
49
+
50
+// 删除事件
51
+const removeTag = (name: string) => {
52
+  const { foundTag, key } = findTag(name);
53
+  store.commit("DEL_TAG", foundTag);
54
+  if (foundTag.value === tag.value.value) {
55
+    router.push(tagList.value[key === 0 ? key : key - 1].value);
56
+  }
57
+};
58
+
59
+// 关闭其他
60
+const closeOthersTags = () => {
61
+  store.commit("DEL_TAG_OTHER");
62
+};
63
+
64
+// 关闭所有
65
+const closeAllTags = () => {
66
+  store.commit("DEL_ALL_TAG");
67
+  nextTick(() => {
68
+    router.push(tagWel.value.value);
69
+  });
70
+};
71
+
72
+const findTag = (value: string) => {
73
+  let foundTag: any, key: any;
74
+  tagList.value.map((item: any, index: number) => {
75
+    if (item.value === value) {
76
+      foundTag = item;
77
+      key = index;
78
+    }
79
+  });
80
+  return { foundTag, key };
81
+};
82
+</script>
83
+
84
+<style lang="scss" scoped>
85
+.top_tag {
86
+  user-select: none;
87
+  position: relative;
88
+  padding: 0 10px;
89
+  box-sizing: border-box;
90
+  overflow: hidden;
91
+  margin-left: 200px;
92
+  height: 40px;
93
+  padding-right: 106px;
94
+  :deep(.el-tabs--card) {
95
+    .el-tabs__header {
96
+      border: none;
97
+    }
98
+    .el-tabs__header {
99
+      .el-tabs__item {
100
+        border: none;
101
+        margin: 0 3px;
102
+        height: 40px;
103
+        font-size: 14px;
104
+        line-height: 40px;
105
+        font-family: SourceHanSansCN-Regular, SourceHanSansCN;
106
+        font-weight: 400;
107
+        color: #000000;
108
+        &.is-active {
109
+          color: #4069f2;
110
+          border-bottom: 4px solid #4069f2;
111
+        }
112
+      }
113
+      .el-tabs__nav {
114
+        border: none;
115
+      }
116
+    }
117
+  }
118
+  &__menu {
119
+    position: absolute !important;
120
+    top: 3px;
121
+    right: 0;
122
+    padding: 1px 0 0 15px;
123
+    box-sizing: border-box;
124
+
125
+    .el-button {
126
+      background: rgba(52, 112, 255, 0.1);
127
+      border: 1px solid #3470ff;
128
+      color: #4069f2;
129
+      margin-right: 17px;
130
+    }
131
+  }
132
+}
133
+</style>

+ 7 - 0
src/router/Routermethods.ts

@@ -1,4 +1,5 @@
1
 import router from ".";
1
 import router from ".";
2
+import store from "@/store";
2
 
3
 
3
 const layout = () => import("@/layout/index.vue");
4
 const layout = () => import("@/layout/index.vue");
4
 
5
 
@@ -33,3 +34,9 @@ export function setTitle(title: string) {
33
   title = title ? `${title}——${defaultTitle}` : defaultTitle;
34
   title = title ? `${title}——${defaultTitle}` : defaultTitle;
34
   document.title = title;
35
   document.title = title;
35
 }
36
 }
37
+
38
+// 移除选中tag,如果是最后一个则打开前一个tag
39
+export function closeTagOrOpenLastTag(value: string) {
40
+  console.log(store.getters.tagList);
41
+  store.getters.tagList;
42
+}

+ 1 - 0
src/store/getters.ts

@@ -5,6 +5,7 @@ export default {
5
 
5
 
6
   tag: (state: any) => state.tag.tag,
6
   tag: (state: any) => state.tag.tag,
7
   tagWel: (state: any) => state.tag.tagWel,
7
   tagWel: (state: any) => state.tag.tagWel,
8
+  tagList: (state: any) => state.tag.tagList,
8
 
9
 
9
   website: (state: any) => state.common.website
10
   website: (state: any) => state.common.website
10
 };
11
 };

+ 4 - 4
src/store/modules/tag.ts

@@ -48,11 +48,11 @@ export default {
48
         return !diff(item, action);
48
         return !diff(item, action);
49
       });
49
       });
50
       setFistTag(state.tagList);
50
       setFistTag(state.tagList);
51
-      cache.session.set("tagList", state.tagList);
51
+      cache.session.setJSON("tagList", state.tagList);
52
     },
52
     },
53
     DEL_ALL_TAG: (state: any) => {
53
     DEL_ALL_TAG: (state: any) => {
54
-      state.tagList = [state.tagWel];
55
-      cache.session.set("tagList", state.tagList);
54
+      state.tagList = [];
55
+      cache.session.setJSON("tagList", state.tagList);
56
     },
56
     },
57
     DEL_TAG_OTHER: (state: any) => {
57
     DEL_TAG_OTHER: (state: any) => {
58
       state.tagList = state.tagList.filter((item: ITagType) => {
58
       state.tagList = state.tagList.filter((item: ITagType) => {
@@ -63,7 +63,7 @@ export default {
63
         }
63
         }
64
       });
64
       });
65
       setFistTag(state.tagList);
65
       setFistTag(state.tagList);
66
-      cache.session.set("tagList", state.tagList);
66
+      cache.session.setJSON("tagList", state.tagList);
67
     }
67
     }
68
   },
68
   },
69
   actions: {}
69
   actions: {}

+ 1 - 83
src/styles/media.scss

@@ -23,20 +23,6 @@
23
   z-index: 1025;
23
   z-index: 1025;
24
 }
24
 }
25
 
25
 
26
-.avue--collapse {
27
-  .avue-left,
28
-  .avue-logo {
29
-    width: 60px;
30
-  }
31
-  .avue-header {
32
-    padding-left: 60px;
33
-  }
34
-  .avue-main {
35
-    width: calc(100% - 60px);
36
-    left: 60px;
37
-  }
38
-}
39
-
40
 .avue-header {
26
 .avue-header {
41
   width: 100%;
27
   width: 100%;
42
   background-color: #fff;
28
   background-color: #fff;
@@ -49,7 +35,7 @@
49
   padding: 0;
35
   padding: 0;
50
   padding-bottom: 20px;
36
   padding-bottom: 20px;
51
   width: calc(100% - 200px);
37
   width: calc(100% - 200px);
52
-  height: calc(100% - 90px);
38
+  height: calc(100% - 130px);
53
   box-sizing: border-box;
39
   box-sizing: border-box;
54
   overflow: hidden;
40
   overflow: hidden;
55
 }
41
 }
@@ -97,71 +83,3 @@
97
     display: block;
83
     display: block;
98
   }
84
   }
99
 }
85
 }
100
-
101
-@media screen and (max-width: 992px) {
102
-  $width: 240px;
103
-  // ele的自适应
104
-  .el-dialog,
105
-  .el-message-box {
106
-    width: 98% !important;
107
-  }
108
-  //登录页面
109
-  .login-left {
110
-    display: none !important;
111
-  }
112
-  .login-logo {
113
-    padding-top: 30px !important;
114
-    margin-left: -30px;
115
-  }
116
-  .login-weaper {
117
-    margin: 0 auto;
118
-    width: 96% !important;
119
-  }
120
-  .login-border {
121
-    border-radius: 5px;
122
-    padding: 40px;
123
-    margin: 0 auto;
124
-    float: none !important;
125
-    width: 100% !important;
126
-  }
127
-  .login-main {
128
-    width: 100% !important;
129
-  }
130
-  //主框架
131
-  .avue-tags {
132
-    display: none;
133
-  }
134
-  .avue-left,
135
-  .avue-logo {
136
-    left: -$width;
137
-  }
138
-  .avue-main {
139
-    left: 0;
140
-    width: 100%;
141
-  }
142
-  .avue-header {
143
-    margin-bottom: 15px;
144
-    padding-left: 15px;
145
-  }
146
-  .top-bar__item {
147
-    display: none;
148
-  }
149
-  .avue--collapse {
150
-    .avue-left,
151
-    .avue-logo {
152
-      width: $width;
153
-      left: 0;
154
-    }
155
-    .avue-main {
156
-      left: $width;
157
-      width: 100%;
158
-    }
159
-    .avue-header {
160
-      padding: 0;
161
-      transform: translate3d(230px, 0, 0);
162
-    }
163
-    .avue-shade {
164
-      display: block;
165
-    }
166
-  }
167
-}

+ 8 - 3
src/views/dataStatistics/droughtResistant/index.vue

@@ -174,7 +174,6 @@ const getSpanArr = (data: any) => {
174
       }
174
       }
175
     });
175
     });
176
   });
176
   });
177
-  console.log(mergeObj.value);
178
 };
177
 };
179
 
178
 
180
 // 获取表格数据
179
 // 获取表格数据
@@ -209,12 +208,18 @@ const getList = () => {
209
   });
208
   });
210
 };
209
 };
211
 
210
 
212
-const arraySpanMethod = ({ column, rowIndex }: any) => {
211
+const arraySpanMethod = ({ column, rowIndex, columnIndex }: any) => {
212
+  if (rowIndex === 0) {
213
+    if (columnIndex === 1) {
214
+      return [1, 2];
215
+    } else if (columnIndex === 2) {
216
+      return [0, 0];
217
+    }
218
+  }
213
   const mergeCol = ["upidName", "username"];
219
   const mergeCol = ["upidName", "username"];
214
   // 判断列的属性
220
   // 判断列的属性
215
   if (mergeCol.indexOf(column.property) !== -1) {
221
   if (mergeCol.indexOf(column.property) !== -1) {
216
     // 判断其值是不是为0
222
     // 判断其值是不是为0
217
-    console.log(column.property, rowIndex);
218
     if (mergeObj.value[column.property][rowIndex]) {
223
     if (mergeObj.value[column.property][rowIndex]) {
219
       return [mergeObj.value[column.property][rowIndex], 1];
224
       return [mergeObj.value[column.property][rowIndex], 1];
220
     } else {
225
     } else {

+ 8 - 1
src/views/dataStatistics/reliefMaterial/index.vue

@@ -203,7 +203,14 @@ const clearSearch = () => {
203
   getList();
203
   getList();
204
 };
204
 };
205
 
205
 
206
-const arraySpanMethod = ({ column, rowIndex }: any) => {
206
+const arraySpanMethod = ({ column, rowIndex, columnIndex }: any) => {
207
+  if (rowIndex === 0) {
208
+    if (columnIndex === 1) {
209
+      return [1, 2];
210
+    } else if (columnIndex === 2) {
211
+      return [0, 0];
212
+    }
213
+  }
207
   const mergeCol = ["upidName", "username"];
214
   const mergeCol = ["upidName", "username"];
208
   // 判断列的属性
215
   // 判断列的属性
209
   if (mergeCol.indexOf(column.property) !== -1) {
216
   if (mergeCol.indexOf(column.property) !== -1) {