Browse Source

temp save

liujq 4 years ago
parent
commit
3685337a13

+ 18 - 0
src/api/base.js

@@ -44,7 +44,25 @@ export default {
   admpermissionsedit: params => { // 菜单 - 编辑
     return getRequestNoSort('/adm/permissions/edit', params, 'loading')
   },
+  admpermissionsdel: params => { // 菜单 - 删除
+    return getRequestNoSort('/adm/permissions/del', params, 'loading')
+  },
   admpermissionslist: params => { // 菜单 - 列表
     return getRequest('/adm/permissions/list', params)
   },
+  admmenulist: params => { // 菜单 - 左侧菜单列表
+    return getRequest('/adm/menu/list', params)
+  },
+  admroleslist: params => { // 角色 - 列表
+    return getRequest('/adm/roles/list', params)
+  },
+  admrolesadd: params => { // 角色 - 添加
+    return getRequestNoSort('/adm/roles/add', params, 'loading')
+  },
+  admrolesedit: params => { // 角色 - 编辑
+    return getRequestNoSort('/adm/roles/edit', params, 'loading')
+  },
+  admrolesdel: params => { // 角色 - 删除
+    return getRequestNoSort('/adm/roles/del', params, 'loading')
+  },
 }

+ 6 - 0
src/router/index.js

@@ -52,6 +52,12 @@ export let moreRoutes = [
         component: () => import('@/views/base/menu'),
         meta: { title: '菜单配置' }
       },
+      {
+        path: 'role',
+        name: 'role',
+        component: () => import('@/views/base/role'),
+        meta: { title: '角色权限' }
+      },
       {
         path: 'dictDtl',
         name: 'DictDtl',

+ 26 - 0
src/store/modules/user.js

@@ -43,6 +43,7 @@ const actions = {
           setStorageUser(res.data)
           commit('SYS_DOMAIN', res.data.domain)
           dispatch('getDict')
+          dispatch('getMenu')
           resolve()
         } else {
           console.log('未找到token')
@@ -52,6 +53,31 @@ const actions = {
       })
     })
   },
+  getMenu({ commit }) {
+    return new Promise((resolve, reject) => {
+      Vue.$api.base.admmenulist().then(res => {
+        console.log(res)
+        // const cObj = res || {}
+        // let newDict = {}
+        // for (let k in cObj) {
+        //   const cArr = cObj[k].map(item => {
+        //     return {
+        //       ...item,
+        //       key: item.dict_label,
+        //       val: item.dict_value
+        //     }
+        //   })
+        //   newDict[k] = cArr
+        // }
+        // setStorageDict(newDict)
+        // Vue.$dictData = Vue.prototype.$dictData = newDict
+        // commit('DICT_DATA', newDict)
+        resolve()
+      }).catch(error => {
+        reject(error)
+      })
+    })
+  },
   getDict({ commit }) {
     return new Promise((resolve, reject) => {
       Vue.$api.base.admdicttree().then(res => {

+ 58 - 12
src/views/base/components/popup/MenuEdit.vue

@@ -24,6 +24,7 @@ export default {
     curObj: Object,
     curType: String,
   },
+  inject: ['parentData'],
   mixins,
   data() {
     return {
@@ -34,20 +35,62 @@ export default {
   watch: {
     isShow: function(val) {
       if (val) {
-        let params = {...this.curObj}
-        if (this.curType === 'edit') params = {...this.curObj}
-        if (this.curType === 'add') params = {}
-        this.formData = [
-          {label: '菜单名称', key: 'name', rules: 1},
-          {label: '类型', key: 'perm_type', type: 'select', options: this.$dictData.perm_type, rules: 1},
-          {label: '路径', key: 'path', rules: 1},
-          {label: '状态', key: 'perm_status', type: 'select', options: this.$dictData.perm_status, rules: 1},
-        ]
-        this.setDefaultValue(params)
+        let params = {}
+        if (this.curType === 'edit') {
+          params = {...this.curObj}
+          let parentIdArr = JSON.parse(JSON.stringify(params.ids))
+          if (params.ids && params.ids.length > 1) {
+            parentIdArr.pop()
+            params.parentIdArr = parentIdArr
+          }
+        }
+        if (this.curType === 'add') {
+          params = {
+            parentName: this.curObj.name,
+            perm_status: '1', 
+            perm_type: '2',
+            parentIdArr: this.curObj.ids
+          }
+        }
+        this.getDef(params)
       }
     }
   },
   methods: {
+    typeChange () {
+      let params = {...this.$refs.ruleForm.baseForm}
+      this.getDef(params)
+    },
+    getDef (params) {
+      if (params.perm_type && params.perm_type === '1') {
+        this.formData = [
+          {label: '上级节点', key: 'parentIdArr', type: 'cascader', options: this.parentData.curData, props: { checkStrictly: true }},
+          {label: '节点类型', key: 'perm_type', type: 'select', options: this.$dictData.perm_type, rules: 1, changeHandle: this.typeChange},
+          {label: '目录名称', key: 'name', rules: 1},
+          {label: '目录路径', key: 'path', rules: 1},
+          {label: '目录排序', key: 'sort'},
+          {label: '状态', key: 'perm_status', type: 'select', clearable: false, options: this.$dictData.perm_status},
+        ]
+      } else if (params.perm_type && params.perm_type === '2') {
+        this.formData = [
+          {label: '上级节点', key: 'parentIdArr', type: 'cascader', options: this.parentData.curData, props: { checkStrictly: true }},
+          {label: '节点类型', key: 'perm_type', type: 'select', options: this.$dictData.perm_type, rules: 1, changeHandle: this.typeChange},
+          {label: '菜单名称', key: 'name', rules: 1},
+          {label: '菜单路径', key: 'path', rules: 1},
+          {label: '菜单排序', key: 'sort'},
+          {label: '菜单栏', key: 'menu_hidden', type: 'select', clearable: false, options: this.$dictData.show_hidden},
+          {label: '状态', key: 'perm_status', type: 'select', clearable: false, options: this.$dictData.perm_status},
+        ]
+      } else {
+        this.formData = [
+          {label: '上级节点', key: 'parentIdArr', type: 'cascader', options: this.parentData.curData, props: { checkStrictly: true }},
+          {label: '节点名称', key: 'name', rules: 1},
+          {label: '节点类型', key: 'perm_type', type: 'select', options: this.$dictData.perm_type, rules: 1, changeHandle: this.typeChange},
+          {label: '状态', key: 'perm_status', type: 'select', clearable: false, options: this.$dictData.perm_status},
+        ]
+      }
+      this.setDefaultValue(params)
+    },
     close (str) {
       if (str === 'confirm') {
         this.$refs['ruleForm'].$refs['baseForm'].validate((valid) => {
@@ -55,9 +98,12 @@ export default {
             const oldform = this.$refs.ruleForm.baseForm
             let params = {...oldform}
             let str = 'admpermissionsadd'
-            params.p_id = this.curObj.p_id
+            params.p_id = params.parentIdArr[params.parentIdArr.length - 1]
+            delete params.parentIdArr
+            if (!params.sort) delete params.sort
             if(this.curType === 'edit') {
-              params.dict_id = this.curObj.id
+              // params.p_id = this.curObj.p_id
+              params.id = this.curObj.id
               str = 'admpermissionsedit'
             }
             this.$api.base[str](params).then(data => {

+ 111 - 0
src/views/base/components/popup/RoleEdit.vue

@@ -0,0 +1,111 @@
+<template>
+<el-dialog
+  v-loading="loading"
+  :show-close="false"
+  :close-on-click-modal="false"
+  :visible.sync="isShow"
+  :title="this.curObj && this.curObj.id ? '编辑角色' : '添加角色'"
+  :fullscreen="false"
+  width="470px"
+  custom-class="xl-dialog"
+  center>
+  <base-form style="width:400px" :data="formData" ref="ruleForm" :isInline="false" labelWidth="80px">
+    <div slot="otherItem" class="scoped-tree">
+      <el-tree
+        :data="curData"
+        show-checkbox
+        node-key="id"
+        :default-expanded-keys="checkedIds"
+        :default-checked-keys="checkedIds"
+        ref="tree"
+        :props="defaultProps">
+      </el-tree>
+    </div>
+    <div slot="footer">
+      <el-button class="xl-form-btn t2" @click="close">关 闭</el-button>
+      <el-button class="xl-form-btn t1" @click="close('confirm')">确定</el-button>
+    </div>
+  </base-form>
+</el-dialog>
+</template>
+<script>
+export default {
+  props: {
+    isShow: Boolean,
+    curObj: Object
+  },
+  mixins,
+  data() {
+    return {
+      formData: [],
+      curData: [],
+      checkedIds: [],
+      defaultProps: {
+        children: 'children',
+        label: 'name'
+      },
+      loading: true,
+    }
+  },
+  watch: {
+    isShow: function(val) {
+      if (val) {
+        let params = {...this.curObj}
+        this.checkedIds = params.permissions_ids || []
+        this.formData = [
+          {label: '角色名称', key: 'name', rules: 1},
+          {label: '角色描述', key: 'description', rules: 1},
+        ]
+        this.setDefaultValue(params)
+      }
+    }
+  },
+  created () {
+    this.getMenu()
+  },
+  methods: {
+    getMenu () {
+      this.$api.base.admpermissionslist().then(res => {
+        this.curData = [...res]
+      })
+    },
+    systemChange (val) {
+      // console.log(val)
+    },
+    close (str) {
+      if (str === 'confirm') {
+        this.$refs['ruleForm'].$refs['baseForm'].validate((valid) => {
+          if (valid) {
+            const oldform = this.$refs.ruleForm.baseForm
+            let params = {...oldform}
+            let str = 'admrolesadd'
+            if(this.curObj && this.curObj.id) {
+              params.id = this.curObj.id
+              str = 'admrolesedit'
+            }
+            const ids = this.$refs.tree.getCheckedKeys()
+            params.node = ids.join(',')
+            this.$api.base[str](params).then(data => {
+              this.$msgs('保存成功!')
+              this.$emit('close', params)
+              // this.setDefaultValue()
+            })
+          }
+        })
+      } else {
+        this.$emit('close')
+        this.setDefaultValue()
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+::v-deep .scoped-tree {
+  height: 300px;
+  overflow-y: auto;
+  .el-tree {
+    background: #f7f7f7;
+  }
+}
+</style>

+ 0 - 8
src/views/base/dict.vue

@@ -52,14 +52,6 @@ export default {
     }
   },
   mounted () {
-    // this.tableData = [
-    //   {id: 1, type: 'grade', typeName: '学校类别', typeDescription: '如:小学,中学等', createByName: 'liujq', createTime: '2021-01-13 10:25', updateByName: 'liujq', updateTime: '2021-01-13 10:25'},
-    //   {id: 2, type: 'type', typeName: '学校性质', typeDescription: '如:公立、私立等', createByName: 'liujq', createTime: '2021-01-13 10:25', updateByName: 'liujq', updateTime: '2021-01-13 10:25'},
-    //   {id: 3, type: 'type', typeName: '学校性质', typeDescription: '如:公立、私立等', createByName: 'liujq', createTime: '2021-01-13 10:25', updateByName: 'liujq', updateTime: '2021-01-13 10:25'},
-    //   {id: 4, type: 'type', typeName: '学校性质', typeDescription: '如:公立、私立等', createByName: 'liujq', createTime: '2021-01-13 10:25', updateByName: 'liujq', updateTime: '2021-01-13 10:25'},
-    //   {id: 5, type: 'type', typeName: '学校性质', typeDescription: '如:公立、私立等', createByName: 'liujq', createTime: '2021-01-13 10:25', updateByName: 'liujq', updateTime: '2021-01-13 10:25'},
-    //   {id: 6, type: 'type', typeName: '学校性质', typeDescription: '如:公立、私立等', createByName: 'liujq', createTime: '2021-01-13 10:25', updateByName: 'liujq', updateTime: '2021-01-13 10:25'},
-    // ]
     this.listConfig = {
       rows: [
         { label: '类型编号', prop: 'dict_type' },

+ 46 - 21
src/views/base/menu.vue

@@ -1,14 +1,21 @@
 <template>
   <div class="app-container">
     <!-- <el-tree :data="curData" :props="defaultProps"></el-tree> -->
+    <!-- default-expand-all -->
     <el-tree
       :data="curData"
       node-key="id"
       default-expand-all
       :expand-on-click-node="false">
       <span class="custom-tree-node" slot-scope="{ node, data }">
-        <span>{{ node.data.name }}</span>
+        <span>{{ node.data.name }} --  {{pTypeObj[node.data.perm_type]}} ----{{node.data.path}} ----{{node.data.sort}}</span>
         <span>
+          <el-button
+            type="text"
+            size="mini"
+            @click="() => editMenu(data)">
+            编辑
+          </el-button>
           <el-button
             type="text"
             size="mini"
@@ -27,6 +34,7 @@
     <popup-edit
       :isShow="isPopupShow"
       :curObj="curObj"
+      :curType="curType"
       @close="closePopup"
     />
   </div>
@@ -50,6 +58,7 @@ export default {
   mixins: [baseTable],
   created () {},
   data () {
+    const pTypeObj = arrToObj(this.$dictData.perm_type)
     return {
       defaultProps: {
         children: 'children',
@@ -59,6 +68,7 @@ export default {
       isPopupShow: false,
       curObj: {},
       curType: '',
+      pTypeObj
     }
   },
   mounted () {
@@ -67,29 +77,44 @@ export default {
   methods: {
     getMenu () {
       this.$api.base.admpermissionslist().then(res => {
-        this.curData = res || []
+        let curData = res || []
+        this.curData = [...this.formatData(curData)]
+      })
+    },
+    formatData (arr, ids) {
+      let newArr = []
+      const curArr = JSON.parse(JSON.stringify(arr))
+      curArr.forEach(item => {
+        let obj = {...item}
+        if (item.perm_type === '2' || item.perm_type === '1') {
+          obj.label = item.name
+          obj.value = item.id
+          obj.ids = ids ? [...ids, item.id] : [item.id]
+          if (item.children && item.children.length > 0) {
+            obj.children = this.formatData(item.children, obj.ids)
+          }
+          if (obj.children && obj.children.length === 0) delete obj.children
+          newArr.push(obj)
+        }
       })
+      return newArr
     },
-    appendMenu (data) {
-      console.log(data)
-      this.openPopup(data, 'add')
+    editMenu (row) {
+      this.openPopup(row, 'edit')
     },
-    removeMenu (node, name) {
-      console.log(node)
+    appendMenu (row) {
+      this.openPopup(row, 'add')
     },
-    // delHandle (row) {
-    //   const msgHtml = `确定要删除此字典吗?`
-    //   this.$msg(msgHtml, 'confirm', ()=> {
-    //     this.$api.base.dicttypedel({
-    //       dict_id: row.id,
-    //     }).then(data => {
-    //       this.$msgs(`删除成功!`)
-    //       this.fetchData()
-    //     })
-    //   }, null, true)
-    // },
-    linkDtl (row) {
-      this.$router.push(`/base/dictDtl?dict_type=${row.dict_type}&dict_name=${row.dict_name}&id=${row.id}`)
+    removeMenu (node, row) {
+      const msgHtml = `确定要删除吗?`
+      this.$msg(msgHtml, 'confirm', ()=> {
+        this.$api.base.admpermissionsdel({
+          id: row.id,
+        }).then(data => {
+          this.$msgs(`删除成功!`)
+          this.getMenu()
+        })
+      }, null, true)
     },
     openPopup (row, type) {
       this.curObj = row
@@ -99,7 +124,7 @@ export default {
     closePopup (obj) {
       this.isPopupShow = false
       if (obj) {
-        this.fetchData()
+        this.getMenu()
       }
     }
   }

+ 84 - 0
src/views/base/role.vue

@@ -0,0 +1,84 @@
+<template>
+  <div class="app-container">
+    <table-list
+      :operationsDefaultLength="3"
+      :listLoading="listLoading"
+      :data="tableData"
+      :columns="listConfig"
+      :currentPage="currentPage"
+      :pageSize="pageSize"
+      :totalRecords="totalRecords"
+      @currentChange="pageHandle"
+      :isAdd="true"
+      @add="openPopup"
+    />
+    <popup-edit
+      :isShow="isPopupShow"
+      :curObj="curObj"
+      @close="closePopup"
+    />
+  </div>
+</template>
+<script>
+import { arrToObj } from '@/utils'
+import PopupEdit from './components/popup/RoleEdit'
+import baseTable from '_m/baseTable.js'
+export default {
+  name: 'xx',
+  components: {
+    PopupEdit
+  },
+  provide () {
+    return {
+      parentData: this
+    }
+  },
+  mixins: [baseTable],
+  created () {},
+  data () {
+    return {
+      apiStr: 'base.admroleslist',
+      searchForm: null,
+      isPopupShow: false,
+      curObj: {},
+    }
+  },
+  mounted () {
+    this.listConfig = {
+      rows: [
+        { label: '角色名称', prop: 'name' },
+        { label: '角色描述', prop: 'description' },
+        { label: '操作', width: 230, type: 'handle2',
+          operations: [
+            { label: '编辑', func: this.openPopup, btnType: 'primary' },
+            { label: '删除', func: this.delHandle, btnType: 'danger'},
+          ]
+        }
+      ]
+    }
+  },
+  methods: {
+    delHandle (row) {
+      const msgHtml = `确定要删除该角色吗?`
+      this.$msg(msgHtml, 'confirm', ()=> {
+        this.$api.base.admrolesdel({
+          id: row.id,
+        }).then(data => {
+          this.$msgs(`删除成功!`)
+          this.fetchData()
+        })
+      }, null, true)
+    },
+    openPopup (row) {
+      this.curObj = row
+      this.isPopupShow = true
+    },
+    closePopup (obj) {
+      this.isPopupShow = false
+      if (obj) {
+        this.fetchData()
+      }
+    }
+  }
+}
+</script>

+ 1 - 1
src/views/school/components/popup/IndexEdit.vue

@@ -86,7 +86,7 @@ export default {
         { label: '图片', key: 'pri_image', type: 'upload' },
         { label: '所属楼盘', key: 'estate_id_list', multiple: true, type: 'selectRemote', changeHandle: this.deviceChange,
           remoteParams: { skey: 'estate_name', api: `house.admestatelist`, opKey: 'estate_name', opVal: 'id' },
-          remoteOptionsHouse
+          remoteOptions: remoteOptionsHouse
         },
         { label: '学校地址', key: 'address' },
       ]

+ 16 - 1
src/views/user/components/popup/IndexEdit.vue

@@ -48,10 +48,24 @@ export default {
     getDef() {
       const params = { ...this.curObj }
       const disabled = false
+      let remoteOptionsRoles = []
+      if (params.role_arr && params.role_arr.length > 0) {
+        params.rolesIds = params.role_arr.map(item => {
+          remoteOptionsRoles.push({ keyRO: item.name, valRO: item.id })
+          return item.id
+        })
+      } else {
+        params.rolesIds = []
+      }
+      console.log(remoteOptionsRoles)
       this.formData = [
         { label: '账号', key: 'username', rules: 1 },
         { label: '昵称', key: 'nickname', rules: 1 },
         { label: '密码', key: 'password', rules: 1 },
+        { label: '角色', key: 'rolesIds', type: 'selectRemote', multiple: true,
+          remoteParams: { skey: 'name', api: `base.admroleslist`, opKey: 'name', opVal: 'id' },
+          // remoteOptions: remoteOptionsRoles
+        },
         { label: '邮箱', key: 'email' },
         { label: '头像', key: 'avatar', type: 'upload' },
       ]
@@ -62,7 +76,8 @@ export default {
         this.$refs['ruleForm'].$refs['baseForm'].validate((valid) => {
           if (valid) {
             const oldform = this.$refs.ruleForm.baseForm
-            const newForm = { ...oldform }
+            let newForm = { ...oldform }
+            newForm.roles = newForm.rolesIds.join(',')
             if (this.curObj.id) newForm.id = this.curObj.id
             this.$emit('close', newForm)
           }

+ 1 - 1
src/views/user/index.vue

@@ -64,7 +64,7 @@ export default {
         { label: '昵称', prop: 'nickname' },
         { label: '账号', prop: 'username' },
         { label: '头像', prop: 'avatar', type: 'img' },
-        { label: '邮箱', prop: 'email' },
+        { label: '角色', prop: 'role_name' },
         { label: '更新人', prop: 'update_by' },
         { label: '更新时间', prop: 'update_at' },
         { label: '操作', width: 200, type: 'handle2', operations: