瀏覽代碼

add menus

张延森 6 年之前
父節點
當前提交
21129f2223
共有 8 個檔案被更改,包括 262 行新增30 行删除
  1. 1
    1
      package.json
  2. 11
    3
      src/config/api.js
  3. 3
    9
      src/router.js
  4. 17
    12
      src/store/modules/sysmenu.js
  5. 2
    2
      src/views/index.js
  6. 227
    0
      src/views/sysmenu/index.vue
  7. 0
    1
      src/views/sysuser/edit.vue
  8. 1
    2
      src/views/sysuser/list.vue

+ 1
- 1
package.json 查看文件

@@ -14,7 +14,7 @@
14 14
     "blueimp-md5": "^2.10.0",
15 15
     "dayjs": "^1.8.12",
16 16
     "echarts": "^4.2.1",
17
-    "element-ui": "^2.6.1",
17
+    "element-ui": "^2.10.1",
18 18
     "normalize.css": "^8.0.1",
19 19
     "nprogress": "^0.2.0",
20 20
     "vue": "^2.6.6",

+ 11
- 3
src/config/api.js 查看文件

@@ -349,11 +349,19 @@ const apis = {
349 349
   menu:{
350 350
     list: {
351 351
       method: 'get',
352
-      url: `${commPrefix}/sysmenu`
352
+      url: `${commPrefix}/menu`
353 353
     },
354
-    add: {
354
+    save: {
355 355
       method: 'post',
356
-      url: `${commPrefix}/sysmenuAdd`
356
+      url: `${commPrefix}/menu`
357
+    },
358
+    update: {
359
+      method: 'put',
360
+      url: `${commPrefix}/menu/:id`
361
+    },
362
+    delete: {
363
+      method: 'delete',
364
+      url: `${commPrefix}/menu/:id`
357 365
     },
358 366
     
359 367
   },

+ 3
- 9
src/router.js 查看文件

@@ -56,24 +56,18 @@ router.beforeEach((to, from, next) => {
56 56
   const toLogin = { name: 'login', query: { from: to.name } }
57 57
   const toIndex = { name: 'index' }
58 58
   const to403 = { name: 'norights' }
59
-  
60
-  // 白名单, 异常页不处理
61
-  if (to.fullPath.indexOf('/exception') > -1) {
62
-    next()
63
-    return
64
-  }
65 59
 
66 60
   // 尝试去获取人员
67 61
   store.dispatch('getUser').then(() => {
68 62
     // 校验权限
69 63
     if (checkAuthority(store.state, to.name)) {
70
-      return to.name === 'login' ? next(toIndex) : next()
64
+      return to.name === 'login' || to.fullPath.indexOf('/exception') > -1 ? next(toIndex) : next()
71 65
     } else {
72
-      next(to403)
66
+      return to.name === 'login' || to.fullPath.indexOf('/exception') > -1 ? next() : next(to403)
73 67
     }
74 68
   }).catch((err) => {
75 69
     window.console.error(err.message || err)
76
-    return to.name === 'login' ? next() : next(toLogin)
70
+    return to.name === 'login' || to.fullPath.indexOf('/exception') > -1 ? next() : next(toLogin)
77 71
   })
78 72
 
79 73
 })

+ 17
- 12
src/store/modules/sysmenu.js 查看文件

@@ -1,23 +1,28 @@
1
-import lodash from 'lodash'
2
-import { interact } from '../../utils'
1
+import { interact, replaceApiParams } from '../../utils'
3 2
 import apis from '../../config/api'
4 3
 
5 4
 export default {
6 5
   namespaced: true,
7 6
   state: {
8
-    safety : {}
9 7
   },
10 8
   mutations: {
11
-    updateSafety(state, payload) {
12
-      state.safety  = payload || {}
13
-    }
14 9
   },
15 10
   actions: {
16
-    sysMenu({ commit }, payload) { // 查询所有
17
-      const api = lodash.get(apis, 'menu.list')
18
-      interact(api, payload).then((data) => {
19
-        commit('updateSafety', data)
20
-      })
21
-    }
11
+    getAllMenus() { // 查询所有
12
+      return interact(apis.menu.list)
13
+    },
14
+    deleteMenu(_, menu) {
15
+      return interact(replaceApiParams(apis.menu.delete, { id: menu.menuId }))
16
+    },
17
+    insertMenu(_, menu) {
18
+      const { children, authority, ...dt } = menu // eslint-disable-line
19
+      const dtStr = window.JSON.stringify(dt)
20
+      return interact(apis.menu.save, dtStr)
21
+    },
22
+    editMenu(_, menu) {
23
+      const { children, authority, ...dt } = menu // eslint-disable-line
24
+      const dtStr = window.JSON.stringify(dt)
25
+      return interact(replaceApiParams(apis.menu.update, { id: menu.menuId }), dtStr)
26
+    },
22 27
   }
23 28
 }

+ 2
- 2
src/views/index.js 查看文件

@@ -50,9 +50,9 @@ const pages = [
50 50
       //   },
51 51
       // },
52 52
       {
53
-        path: 'sysmenu/list',
53
+        path: 'sysmenu',
54 54
         name: 'sysmenu',
55
-        component: () => import('./sysmenu/list.vue'),
55
+        component: () => import('./sysmenu'),
56 56
         meta: {
57 57
           menuShow: true,
58 58
           title: '菜单管理',

+ 227
- 0
src/views/sysmenu/index.vue 查看文件

@@ -0,0 +1,227 @@
1
+<template>
2
+  <div>
3
+    <div class="page-bar">
4
+      <el-button icon="el-icon-plus" @click="insertRootMenu">顶级节点</el-button>
5
+    </div>
6
+    <div class="tree-box">
7
+      <div
8
+        v-for="(menus, inx) in treeData"
9
+        :key="inx">
10
+        <el-tree
11
+          :data="[menus]"
12
+          node-key="menuId"
13
+          :check-on-click-node="true"
14
+          :expand-on-click-node="false"
15
+          :default-expand-all="true"
16
+          @node-click="handleNodeClick"
17
+          @node-contextmenu="showContextMenu"
18
+        >
19
+          <el-popover
20
+            trigger="manual"
21
+            placement="right"
22
+            :value="checkMenu.menuId == data.menuId && contextMenuVisible"
23
+            slot-scope="{ data }"
24
+          >
25
+            <div>
26
+              <el-button type="text" icon="el-icon-plus" @click="() => insertSubMenu(data)">子菜单</el-button>
27
+            </div>
28
+            <div>
29
+              <el-button type="text" icon="el-icon-edit" @click="dialogVisible = true">编辑</el-button>
30
+            </div>
31
+            <div>
32
+              <el-button type="text" icon="el-icon-delete" @click="() => deleteNode(data)">删除</el-button>
33
+            </div>
34
+            <span slot="reference" class="custom-tree-node">
35
+              <span>{{data.menuName}} <small>({{data.menuId}})</small></span>
36
+            </span>
37
+          </el-popover>
38
+        </el-tree>
39
+      </div>
40
+    </div>
41
+    <el-dialog
42
+      title="提示"
43
+      :visible.sync="dialogVisible"
44
+      width="30%">
45
+      <el-form :model="checkMenu" label-width="80px">
46
+        <el-form-item label="菜单ID">
47
+          <el-input v-model="checkMenu.menuId" :disabled="!!checkMenu.createDate"></el-input>
48
+        </el-form-item>
49
+        <el-form-item label="菜单名称">
50
+          <el-input v-model="checkMenu.menuName"></el-input>
51
+        </el-form-item>
52
+      </el-form>
53
+      <div slot="footer">
54
+        <el-button @click="dialogVisible = false">取 消</el-button>
55
+        <el-button type="primary" @click="editNode">确 定</el-button>
56
+      </div>
57
+    </el-dialog>
58
+  </div>
59
+</template>
60
+
61
+<script>
62
+import { createNamespacedHelpers } from 'vuex'
63
+const { mapActions: mapMenuActions } = createNamespacedHelpers('sysmenu')
64
+
65
+
66
+export default {
67
+  name: 'SysMenu',
68
+  data () {
69
+    return {
70
+      menusRaw: [],
71
+      menusWithChildren: [],
72
+      menuDetailTPL: {
73
+        menuId: '',
74
+        menuName: '',
75
+        menuPid: '',
76
+        menuParents: '',
77
+        status: 1,
78
+        sortNo: 0,
79
+      },
80
+      checkMenu: {},
81
+      contextMenuVisible: false,
82
+      dialogVisible: false,
83
+    }
84
+  },
85
+  computed: {
86
+    treeData () {
87
+      return (this.menusWithChildren || []).filter(m => m.menuPid === "-1") || []
88
+    },
89
+  },
90
+  created () {
91
+    this.initData()
92
+  },
93
+  methods: {
94
+    ...mapMenuActions([
95
+      'getAllMenus',
96
+      'deleteMenu',
97
+      'insertMenu',
98
+      'editMenu',
99
+    ]),
100
+    initData () {
101
+      this.getAllMenus().then((menus) => {
102
+        this.menusRaw = menus
103
+        this.menusWithChildren = menus.map((menu) => {
104
+          const parent = menus.filter((m) => m.menuId === menu.menuPid)[0]
105
+          if (parent) {
106
+            parent.children = (parent.children || []).concat(menu)
107
+          }
108
+          return menu
109
+        })
110
+      })
111
+    },
112
+    handleNodeClick (data) {
113
+      this.checkMenu = data
114
+      this.contextMenuVisible = false
115
+    },
116
+    showContextMenu (e, data) {
117
+      this.checkMenu = data
118
+      this.contextMenuVisible = true
119
+    },
120
+    insertRootMenu () {
121
+      this.checkMenu = {
122
+        ...this.menuDetailTPL,
123
+        menuPid: "-1",
124
+        menuParents: "",
125
+      }
126
+      this.dialogVisible = true
127
+    },
128
+    insertSubMenu (menu) {
129
+      const children = menu.children || []
130
+      const lastSortNo = (children[children.length - 1] || {}).sortNo || menu.sortNo
131
+
132
+      this.checkMenu = {
133
+        ...this.menuDetailTPL,
134
+        menuPid: menu.menuId,
135
+        menuParents: menu.menuParents.split(",").filter(x => x).concat(menu.menuId).join(","),
136
+        sortNo: lastSortNo + 1
137
+      }
138
+      this.dialogVisible = true
139
+    },
140
+    editNode () {
141
+      const newMenu = !this.checkMenu.createDate      
142
+      const api = newMenu ? this.insertMenu : this.editMenu
143
+      api(this.checkMenu).then(data => {
144
+        this.checkMenu.createDate = data.createDate
145
+        const parent = this.menusWithChildren.filter(m => m.menuId === data.menuPid)[0]
146
+        if (parent) {
147
+          const exists = (parent.children || []).filter(m => m.menuId === data.menuId)[0]
148
+          if (!exists) {
149
+            parent.children = (parent.children || []).concat(data)
150
+          }
151
+        } else {
152
+          this.menusWithChildren = this.menusWithChildren.concat(data)
153
+        }
154
+
155
+        this.contextMenuVisible = false
156
+        this.dialogVisible = false
157
+        this.$notify({
158
+          title: '成功',
159
+          message: '数据更新成功',
160
+          type: 'success'
161
+        });
162
+      }).catch((err) => {
163
+        // this.contextMenuVisible = false
164
+        // this.dialogVisible = false
165
+        this.$notify.error({
166
+          title: '失败',
167
+          message: err.message || err,
168
+        });
169
+      })
170
+    },
171
+    deleteNode (menu) {
172
+      this.$confirm(`确认删除菜单 [${menu.menuName}] ?`).then(() => {
173
+        //
174
+        this.deleteMenu(menu).then(() => {
175
+          const parent = this.menusWithChildren.filter(m => m.menuId === menu.menuPid)[0]
176
+          if (parent) {
177
+            parent.children = (parent.children || []).filter(m => m.menuId !== menu.menuId)
178
+          } else {
179
+            this.menusWithChildren = this.menusWithChildren.filter(m => m.menuId !== menu.menuId)
180
+          }
181
+          this.contextMenuVisible = false
182
+          this.dialogVisible = false
183
+
184
+          this.$notify({
185
+            title: '成功',
186
+            message: '删除菜单成功',
187
+            type: 'success'
188
+          });
189
+        }).catch((err) => {
190
+          this.$notify.error({
191
+            title: '失败',
192
+            message: err.message || err,
193
+          });
194
+        })
195
+      }).catch(() => {
196
+        // 取消删除
197
+        this.contextMenuVisible = false
198
+      })
199
+    },
200
+  },
201
+}
202
+</script>
203
+
204
+<style lang="scss" scoped>
205
+.page-bar {
206
+  padding: 24px 0;
207
+}
208
+
209
+.tree-box {
210
+  display: flex;
211
+
212
+  & > div {
213
+    flex: auto;
214
+
215
+    & + div {
216
+      margin-left: 24px;
217
+    }
218
+  }
219
+}
220
+</style>
221
+
222
+
223
+<style lang="scss">
224
+  .custom-tree-node {
225
+    font-size: 14px;
226
+  }
227
+</style>

+ 0
- 1
src/views/sysuser/edit.vue 查看文件

@@ -108,7 +108,6 @@ export default {
108 108
             this.$notify.success('编辑信息成功')
109 109
           })
110 110
           // 保存角色
111
-          console.log('this.formInline.menuArray',this.formInline.menuArray)
112 111
           this.formInline.menuArray = this.roleId
113 112
           this.updateUserRolede(this.formInline)
114 113
         }

+ 1
- 2
src/views/sysuser/list.vue 查看文件

@@ -188,8 +188,7 @@ export default {
188 188
     },
189 189
     TransactionReplyAdd(){
190 190
           this.filterData.menuArray = this.userRoleId
191
-          this.updateUserRolede(this.filterData).then((res)=>{
192
-            console.log('测试返回值:', res)
191
+          this.updateUserRolede(this.filterData).then(()=>{
193 192
             this.getList()
194 193
           })
195 194
           this.filterData.dialogFormVisible = false