sss 3 rokov pred
rodič
commit
fb54bc4280

+ 34 - 0
src/api/dm/announce/dmAnnounce.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+export function add(data) {
+  return request({
+    url: 'api/dmAnnounce',
+    method: 'post',
+    data
+  })
+}
+
+export function del(ids) {
+  return request({
+    url: 'api/dmAnnounce/',
+    method: 'delete',
+    data: ids
+  })
+}
+
+export function edit(data) {
+  return request({
+    url: 'api/dmAnnounce',
+    method: 'put',
+    data
+  })
+}
+
+export function cancel(id) {
+  return request({
+    url: 'api/dmAnnounce/cancel?id=' + id,
+    method: 'get'
+  })
+}
+
+export default { add, edit, del, cancel }

+ 35 - 0
src/api/dm/api/dmApi.js

@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+export function add(data) {
+  return request({
+    url: 'api/dmApi',
+    method: 'post',
+    data
+  })
+}
+
+export function del(ids) {
+  return request({
+    url: 'api/dmApi/',
+    method: 'delete',
+    data: ids
+  })
+}
+
+export function edit(data) {
+  return request({
+    url: 'api/dmApi',
+    method: 'put',
+    data
+  })
+}
+
+export function getDmApiBySystem(systemId) {
+  return request({
+    url: 'api/dmApi/getDmApiBySystem?systemId=' + systemId,
+    method: 'get'/* ,
+    data */
+  })
+}
+
+export default { add, edit, del, getDmApiBySystem }

+ 35 - 0
src/api/dm/appMenu/dmAppMenu.js

@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+export function getDmAppMenu(params) {
+  return request({
+    url: 'api/dmAppMenu',
+    method: 'get',
+    params
+  })
+}
+
+export function add(data) {
+  return request({
+    url: 'api/dmAppMenu',
+    method: 'post',
+    data
+  })
+}
+
+export function del(ids) {
+  return request({
+    url: 'api/dmAppMenu/',
+    method: 'delete',
+    data: ids
+  })
+}
+
+export function edit(data) {
+  return request({
+    url: 'api/dmAppMenu',
+    method: 'put',
+    data
+  })
+}
+
+export default { add, edit, del, getDmAppMenu }

+ 42 - 0
src/api/dm/system/dmSystem.js

@@ -0,0 +1,42 @@
+import request from '@/utils/request'
+
+export function getDmSystem(params) {
+  return request({
+    url: 'api/dmSystem',
+    method: 'get',
+    params
+  })
+}
+
+export function add(data) {
+  return request({
+    url: 'api/dmSystem',
+    method: 'post',
+    data
+  })
+}
+
+export function del(ids) {
+  return request({
+    url: 'api/dmSystem/',
+    method: 'delete',
+    data: ids
+  })
+}
+
+export function edit(data) {
+  return request({
+    url: 'api/dmSystem',
+    method: 'put',
+    data
+  })
+}
+
+export function queryByUserId(userId) {
+  return request({
+    url: 'api/dmSystem/queryByUserId?userId=' + userId,
+    method: 'get'
+  })
+}
+
+export default { add, edit, del, getDmSystem, queryByUserId }

+ 19 - 4
src/api/dm/user/dmUser.js

@@ -7,9 +7,8 @@ export function getAllDmUser(params) {
     enabled: true
   } */
   return request({
-    url: 'api/dmUser/findNotBindUser',
-    method: 'post',
-    params
+    url: 'api/dmUser/findNotBindUser?userId=' + params,
+    method: 'get'
   })
 }
 
@@ -50,4 +49,20 @@ export function edit(data) {
   })
 }
 
-export default { add, edit, del, getAll }
+export function updateUserSystem(data) {
+  return request({
+    url: 'api/dmUser/updateUserSystem',
+    method: 'post',
+    data
+  })
+}
+
+export function updateUserAppMenu(data) {
+  return request({
+    url: 'api/dmUser/updateUserAppMenu',
+    method: 'post',
+    data
+  })
+}
+
+export default { add, edit, del, getAll, updateUserSystem, updateUserAppMenu }

+ 8 - 1
src/api/system/dept.js

@@ -8,6 +8,13 @@ export function getDepts(params) {
   })
 }
 
+export function getAllDept() {
+  return request({
+    url: 'api/dept/getAllDept',
+    method: 'get'
+  })
+}
+
 export function getDeptSuperior(ids) {
   const data = ids.length || ids.length === 0 ? ids : Array.of(ids)
   return request({
@@ -41,4 +48,4 @@ export function edit(data) {
   })
 }
 
-export default { add, edit, del, getDepts, getDeptSuperior }
+export default { add, edit, del, getDepts, getDeptSuperior, getAllDept }

+ 8 - 0
src/components/Crud/crud.js

@@ -52,10 +52,12 @@ function CRUD(options) {
     },
     tempBtnShow: {
       user: false,
+      dmSystem: false,
       device: false
     },
     tempShow: {
       user: false,
+      dmSystem: false,
       dmuser: false,
       device: false,
       deviceInfo: false,
@@ -366,6 +368,12 @@ function CRUD(options) {
         crud.downloadLoading = false
       })
     },
+    doOpenDmSystem() {
+      crud.tempShow.dmSystem = true
+    },
+    doCloseDmSystem() {
+      crud.tempShow.dmSystem = false
+    },
     doOpenUser(data) {
       // 			crud.selectData = [data];
       crud.openId = data['id']

+ 183 - 0
src/components/DmSystem/index.vue

@@ -0,0 +1,183 @@
+<template>
+  <el-dialog :visible.sync="crud.tempShow.dmSystem" title="选择子系统" width="60%">
+    <!--用户数据-->
+    <el-row>
+      <el-col :xs="15" :sm="18" :md="19" :lg="20" :xl="20">
+        <!--工具栏-->
+        <div class="head-container">
+          <!-- 搜索 -->
+          <el-input
+            v-model="code"
+            type="text"
+            size="small"
+            placeholder="输入子系统名称搜索"
+            style="width: 200px;"
+            class="filter-item"
+          />
+          <span>
+            <el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="getDmSystem()">搜索</el-button>
+            <el-button class="filter-item" size="mini" type="warning" icon="el-icon-refresh-left" @click="crud.resetQuery()">重置</el-button>
+          </span>
+        </div>
+      </el-col>
+    </el-row>
+    <el-row>
+      <el-col :span="17">
+        <el-table
+          ref="multipleTable"
+          v-loading="crud.loading"
+          :data="dmSystems"
+          tooltip-effect="dark"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column
+            type="selection"
+            width="55"
+          />
+          <el-table-column :show-overflow-tooltip="true" prop="systemName" label="用户名" />
+          <el-table-column :show-overflow-tooltip="true" prop="createTime" width="135" label="创建日期" />
+        </el-table>
+        <!--分页组件-->
+        <el-pagination
+          :page-size.sync="size"
+          :total="total"
+          :current-page.sync="page"
+          style="margin-top: 8px;"
+          layout="total, prev, pager, next, sizes"
+          @size-change="getDmSystem()"
+          @current-change="getDmSystem()"
+        />
+      </el-col>
+      <el-col :span="6" :push="1">
+        <el-card style="height: 100%;">
+          <div>您已选择:</div>
+          <div>{{ checkInfo }}</div>
+        </el-card>
+      </el-col>
+    </el-row>
+    <div slot="footer">
+      <el-row>
+        <el-col :xs="10" :sm="10" :md="10" :lg="15" :xl="15">
+          <el-button style="" class="filter-item" @click="toggleSelection()">取消选择</el-button>
+          <el-button class="filter-item" style="margin-left:20% ;" @click="selected()">选择</el-button>
+        </el-col>
+      </el-row>
+
+    </div>
+  </el-dialog>
+</template>
+<script>
+import crudDmSystem from '@/api/dm/system/dmSystem'
+import { mapGetters } from 'vuex'
+import CRUD, { crud } from '@crud/crud'
+
+export default {
+  mixins: [crud()],
+  cruds() {
+    return CRUD({ title: '子系统', url: 'api/dmSystem', tempBtnShow: {
+      dmSystem: true
+    }, crudMethod: { ...crudDmSystem }})
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      dmSystems: [],
+      multipleSelection: crud.selectData || [],
+      checkInfo: '',
+      code: '',
+      size: 0,
+      page: 0,
+      total: 0
+
+    }
+  },
+  computed: {
+    ...mapGetters([
+      'dmSystem'
+    ])
+  },
+  watch: {
+    'crud.selectData': {
+      handler: function(datainfo) {
+        this.$nextTick(function() {
+          this.toggleSelection()
+          this.dmSystems.forEach((item, i) => {
+            datainfo.forEach(row => {
+              if (this.dmSystems[i].id === row * 1) {
+                this.$refs.multipleTable.toggleRowSelection(this.dmSystems[i])
+                this.setCheckInfo()
+              }
+            })
+          })
+        })
+      },
+      deep: true
+    },
+    multipleSelection: {
+      handler: function() {
+        this.setCheckInfo()
+      }
+    }
+  },
+  created() {
+    crudDmSystem.getDmSystem().then(res => {
+      this.total = res.totalElements
+      this.dmSystems = res.content.map(function(obj) {
+        return obj
+      })
+    })
+  },
+  methods: {
+    getDmSystem() {
+      crudDmSystem.getDmSystem({ blurry: this.code, page: this.page, size: this.size }).then(res => {
+        this.total = res.totalElements
+        this.dmSystems = res.content.map(function(obj) {
+          return obj
+        })
+      })
+    },
+    toggleSelection(rows) {
+      if (rows) {
+        rows.forEach(row => {
+          this.$refs.multipleTable.toggleRowSelection(row)
+        })
+      } else {
+        this.$refs.multipleTable.clearSelection()
+      }
+      this.crud.doCloseDmSystem()
+    },
+    handleSelectionChange(val) {
+      var selectOne = this.crud.selectOne
+      if (selectOne === false) { // 不限制选项
+        this.multipleSelection = val
+      }
+      if (selectOne === true) {
+        this.multipleSelection = val
+        this.multipleSelection = val[0]
+        if (val.length > 1) {
+          this.$refs.multipleTable.clearSelection()
+          this.$refs.multipleTable.toggleRowSelection(val.pop())
+        }
+      }
+    },
+    selected() {
+      this.$emit('on-change', this.$refs.multipleTable.selection, this.crud.openId)
+      this.$refs.multipleTable.clearSelection()
+      this.crud.doCloseDmSystem()
+    },
+    setCheckInfo() {
+      var checkedDmSystems = this.$refs.multipleTable.selection
+      var info = ''
+      checkedDmSystems.forEach(row => {
+        info += row.systemName + ','
+      })
+      this.checkInfo = info.substring(0, info.length - 1)
+    }
+  }
+}
+</script>

+ 0 - 0
src/components/User/dmUserindex.vue → src/components/User/dmUserIndex.vue


+ 178 - 0
src/components/WangEditor/WangEditor.vue

@@ -0,0 +1,178 @@
+<template>
+  <div class="editor-wrapper">
+    <div
+      ref="editor"
+      :class="{ 'editor-container': true, 'editor-readonly': readOnly, 'editor-disabled': disabled }"
+    />
+  </div>
+</template>
+
+<script>
+import WangEditor from 'wangeditor'
+
+export default {
+  model: {
+    prop: 'value',
+    event: 'change'
+  },
+  props: {
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    readOnly: {
+      type: Boolean,
+      default: false
+    },
+    value: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      editor: null
+    }
+  },
+  watch: {
+    disabled(value) {
+      if (this.editor) {
+        const toggle = value ? this.editor.disable : this.editor.enable
+        toggle()
+      }
+    }
+    // value: {
+    //   immediate: true,
+    //   handler (value) {
+    //     console.log('value变化', this.editor)
+    //     if (this.editor && value) {
+    //       this.editor.txt.html(value)
+    //     }
+    //   },
+    // },
+    // '$i18n.locale': {
+    //   handler() {
+    //     if (this.editor) {
+    //       const toggle = this.disabled ? this.editor.enable : this.editor.disable
+    //       const reset = this.disabled ? this.editor.disable : this.editor.enable
+    //       toggle()
+    //       this.$nextTick(() => {
+    //         reset()
+    //       })
+    //     }
+    //   },
+    // },
+  },
+  mounted() {
+    const editor = new WangEditor(this.$refs.editor)
+    console.log(editor)
+    editor.config = editor.customConfig
+    // editor.config.lang = this.$store.state.language
+    editor.config.height = 320
+    editor.config.zIndex = 10
+    // editor.i18next = i18next
+    editor.config.onchange = (newHtml) => {
+      this.$emit('change', newHtml)
+    }
+    editor.config.customAlert = (message, type) => {
+      const exec = this.$message[type] || this.$message.info
+      exec(message)
+    }
+    editor.config.excludeMenus = [
+      'emoticon',
+      'video',
+      'code',
+      'fontName',
+      'table',
+      'redo',
+      'undo'
+    ]
+    editor.config.fontNames = [
+      'bmw regular',
+      'bmw bold'
+    ]
+    editor.config.showFullScreen = false
+    // editor.config.uploadImgServer = this.$store.getters.getUrl('/portal/v1/file/upload?recType=10021002')
+    // editor.config.uploadImgHeaders = {
+    //   token: this.$store.state.token,
+    // }
+    // editor.config.uploadFileName = 'file'
+    // editor.config.customUploadImg = (resultFiles, insertImgFn) => {
+    //   resultFiles.forEach((file) => {
+    //     const formData = new FormData()
+    //     formData.append('file', file)
+    //     $.post('/portal/v1/file/upload?recType=10021002', formData, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).then((res) => {
+    //       if (res.objectUrl) {
+    //         insertImgFn(res.objectUrl)
+    //       }
+    //     })
+    //   })
+    // }
+    editor.config.withCredentials = true
+    editor.create()
+    // 回显
+    this.$watch('value', (value) => {
+      if ((editor || this.editor) && value) {
+        const instance = this.editor || editor
+        instance.txt.html(value)
+      }
+    }, { immediate: true })
+    if (this.$attrs.value) {
+      editor.txt.html(this.$attrs.value)
+    }
+    // 创建编辑器
+    if (this.disabled || this.readOnly) {
+      editor.disable()
+    }
+    this.editor = editor
+  },
+  beforeDestroy() {
+    // 调用销毁 API 对当前编辑器实例进行销毁
+    this.editor.destroy()
+    this.editor = null
+  },
+  methods: {
+    getEditorData() {
+      return this.editor.txt.html()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.editor-container {
+  ::v-deep .w-e-toolbar {
+    /*border-color: fade(black, 15%) !important*/
+    /*border-bottom-color: fade(black, 9%) !important*/
+    /*border-radius: @global-radius-r2 @global-radius-r2 0 0*/
+    .w-e-menu {
+      // width: 36px
+      // height: 36px
+      &.w-e-active i {
+        /*color: @primary-color*/
+      }
+    }
+    .w-e-menu-tooltip {
+      z-index: 13 !important
+    }
+  }
+  ::v-deep .w-e-text-container {
+    /*border-color: fade(black, 15%) !important*/
+    /*border-radius: 0 0 @global-radius-r2 @global-radius-r2*/
+  }
+}
+.editor-readonly {
+  ::v-deep .w-e-toolbar {
+    display: none
+  }
+  ::v-deep .w-e-text-container {
+    border: none !important
+  }
+  ::v-deep .placeholder {
+    display: none
+  }
+}
+.editor-disabled {
+  cursor: not-allowed
+}
+</style>

+ 131 - 0
src/views/dm/announce/index.vue

@@ -0,0 +1,131 @@
+<template>
+  <div class="app-container">
+    <!--工具栏-->
+    <div class="head-container">
+      <!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
+      <crudOperation :permission="permission" />
+      <!--表单组件-->
+      <el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title">
+        <el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
+          <el-form-item label="公告标题">
+            <el-input v-model="form.announceTitle" style="width: 370px;" />
+          </el-form-item>
+          <el-form-item label="公告内容" prop="abstract">
+            <WangEditor v-model="form.announceContent" />
+          </el-form-item>
+          <el-form-item label="发布方式">
+            <el-radio-group v-model="form.sendType" @change="sendTypeChange">
+              <el-radio :label="0">立刻发布</el-radio>
+              <el-radio :label="1">定时发布</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item v-show="sendTypeShow" label="定时时间">
+            <el-date-picker v-model="form.sendTime" type="datetime" placeholder="选择日期时间" />
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="text" @click="crud.cancelCU">取消</el-button>
+          <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
+        </div>
+      </el-dialog>
+      <!--表格渲染-->
+      <el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="announceTitle" label="公告标题" />
+        <el-table-column prop="createBy" label="发布人员" />
+        <el-table-column prop="sendTime" label="发布公告时间" />
+        <el-table-column prop="sendState" label="发布状态">
+          <template slot-scope="scope">
+            {{ dict.label.send_state[scope.row.sendState] }}
+          </template>
+        </el-table-column>
+        <el-table-column v-if="checkPer(['admin','dmAnnounce:edit','dmAnnounce:del'])" label="操作" width="150px" align="center">
+          <template slot-scope="scope">
+            <div v-if="scope.row.isCancel">已取消</div>
+            <udOperation
+              v-if="!scope.row.isCancel"
+              :data="scope.row"
+              :permission="permission"
+            />
+            <el-button v-if="!scope.row.isCancel" size="mini" @click="toCancel(scope.row.id)">取消</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!--分页组件-->
+      <pagination />
+    </div>
+  </div>
+</template>
+
+<script>
+import crudDmAnnounce from '@/api/dm/announce/dmAnnounce'
+import CRUD, { presenter, header, form, crud } from '@crud/crud'
+import rrOperation from '@crud/RR.operation'
+import crudOperation from '@crud/CRUD.operation'
+import udOperation from '@crud/UD.operation'
+import pagination from '@crud/Pagination'
+
+import WangEditor from '@/components/WangEditor/WangEditor'
+import { cancel } from '../../../api/dm/announce/dmAnnounce'
+
+const defaultForm = { id: null, announceTitle: null, announceContent: null, sendType: 0, sendTime: null, isCancel: null, sendState: null, createBy: null, updateBy: null, createTime: null, updateTime: null }
+export default {
+  name: 'DmAnnounce',
+  components: { pagination, crudOperation, rrOperation, udOperation, WangEditor },
+  mixins: [presenter(), header(), form(defaultForm), crud()],
+  dicts: ['send_state'],
+  cruds() {
+    return CRUD({ title: '系统公告', url: 'api/dmAnnounce', idField: 'id', sort: 'id,desc', crudMethod: { ...crudDmAnnounce }})
+  },
+  data() {
+    return {
+      permission: {
+        add: ['admin', 'dmAnnounce:add'],
+        edit: ['admin', 'dmAnnounce:edit'],
+        del: ['admin', 'dmAnnounce:del']
+      },
+      rules: {
+      },
+      sendTypeShow: false
+    }
+  },
+  watch: {
+    'form.sendType'(val) {
+      if (val === 0) {
+        this.sendTypeShow = false
+      } else if (val === 1) {
+        this.sendTypeShow = true
+      }
+    }
+  },
+  methods: {
+    // 钩子:在获取表格数据之前执行,false 则代表不获取数据
+    [CRUD.HOOK.beforeRefresh]() {
+      return true
+    },
+    sendTypeChange(data) {
+      if (data === 0) {
+        this.sendTypeShow = false
+      } else if (data === 1) {
+        this.sendTypeShow = true
+      }
+    },
+    toCancel(id) {
+      this.$confirm('确认取消当前申请?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        crudDmAnnounce.cancel(id).then(() => {
+          this.crud.notify('取消成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
+          this.crud.refresh()
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 170 - 0
src/views/dm/api/index.vue

@@ -0,0 +1,170 @@
+<template>
+  <div class="app-container">
+    <!--工具栏-->
+    <div class="head-container">
+      <!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
+      <dmSystemTemp :params.sync="params" @on-change="dmSystemCallbackFunc" />
+      <crudOperation :permission="permission" />
+      <!--表单组件-->
+      <el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="500px">
+        <el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
+          <el-form-item label="接口名称">
+            <el-input v-model="form.apiName" style="width: 370px;" />
+          </el-form-item>
+          <el-form-item label="所属系统" prop="usersList">
+            <el-input v-model="systemIds" style="display: none;" />
+            <el-input v-model="systemNames" :rows="3" type="textarea" style="width: 370px;" />
+            <el-button type="primary" @click="openDmSystem(form)">选择子系统</el-button>
+          </el-form-item>
+          <el-form-item label="接口地址">
+            <el-input v-model="form.apiUrl" style="width: 370px;" />
+          </el-form-item>
+          <el-form-item label="文件名称">
+            <el-input v-model="form.localStorage.name" style="width: 370px;" />
+          </el-form-item>
+          <!--   上传文件   -->
+          <el-form-item v-if="crud.status.add" label="上传接口配置文件">
+            <el-upload
+              ref="upload"
+              :limit="1"
+              :before-upload="beforeUpload"
+              :auto-upload="true"
+              :headers="headers"
+              :on-success="handleSuccess"
+              :on-error="handleError"
+              :action="fileUploadApi + '?name=' + form.localStorage.name"
+            >
+              <div class="eladmin-upload"><i class="el-icon-upload" /> 添加文件</div>
+              <div slot="tip" class="el-upload__tip">可上传任意格式文件,且不超过100M</div>
+            </el-upload>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="text" @click="crud.cancelCU">取消</el-button>
+          <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
+        </div>
+      </el-dialog>
+      <!--表格渲染-->
+      <el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="apiName" label="接口名称" />
+        <el-table-column prop="dmSystems" label="子系统名称">
+          <template slot-scope="{row, column}">
+            {{ row[column.property] && row[column.property].map(item => item.systemName).join(',') }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="createTime" label="创建时间" />
+        <el-table-column v-if="checkPer(['admin','dmApi:edit','dmApi:del'])" label="操作" width="150px" align="center">
+          <template slot-scope="scope">
+            <udOperation
+              :data="scope.row"
+              :permission="permission"
+            />
+          </template>
+        </el-table-column>
+      </el-table>
+      <!--分页组件-->
+      <pagination />
+    </div>
+  </div>
+</template>
+
+<script>
+import crudDmApi from '@/api/dm/api/dmApi'
+import { getToken } from '@/utils/auth'
+import CRUD, { presenter, header, form, crud } from '@crud/crud'
+import rrOperation from '@crud/RR.operation'
+import crudOperation from '@crud/CRUD.operation'
+import udOperation from '@crud/UD.operation'
+import pagination from '@crud/Pagination'
+import { mapGetters } from 'vuex'
+import dmSystemTemp from '@/components/DmSystem/index'
+
+const defaultForm = { id: null, apiName: null, apiUrl: null, dmSystems: [], localStorage: {}, createBy: null, updateBy: null, createTime: null, updateTime: null }
+export default {
+  name: 'DmApi',
+  components: { pagination, crudOperation, rrOperation, udOperation, dmSystemTemp },
+  mixins: [presenter(), header(), form(defaultForm), crud()],
+  cruds() {
+    return CRUD({ title: '接口管理', url: 'api/dmApi', idField: 'id', sort: 'id,desc', crudMethod: { ...crudDmApi }})
+  },
+  data() {
+    return {
+      permission: {
+        add: ['admin', 'dmApi:add'],
+        edit: ['admin', 'dmApi:edit'],
+        del: ['admin', 'dmApi:del']
+      },
+      rules: {
+      },
+      headers: { 'Authorization': getToken() },
+      systemIds: '',
+      systemNames: '',
+      params: {
+        max: 100000, // 可以选择用户个数最大限制
+        dmUserIsApprove: null// 是否要查有审批权限的用户
+      }
+    }
+  },
+  computed: {
+    ...mapGetters([
+      'baseApi',
+      'fileUploadApi'
+    ])
+  },
+  methods: {
+    // 钩子:在获取表格数据之前执行,false 则代表不获取数据
+    [CRUD.HOOK.beforeRefresh]() {
+      return true
+    },
+    dmSystemCallbackFunc(dmSystemList, rowId) {
+      this.form.dmSystems = dmSystemList
+      console.log('dmSystemList:', this.form.dmSystems)
+      var systemIds = ''
+      var systemNames = ''
+      dmSystemList.forEach((item, i) => {
+        systemIds += dmSystemList[i]['id'] + ','
+        systemNames += dmSystemList[i]['systemName'] + ','
+      })
+      this.systemIds = systemIds.substring(0, systemIds.length - 1)
+      this.systemNames = systemNames.substring(0, systemNames.length - 1)
+      console.log('systemIds:', this.systemIds)
+      console.log('systemNames:', this.systemNames)
+    },
+    // 上传文件
+    upload() {
+      this.$refs.upload.submit()
+    },
+    beforeUpload(file) {
+      let isLt2M = true
+      isLt2M = file.size / 1024 / 1024 < 100
+      if (!isLt2M) {
+        this.loading = false
+        this.$message.error('上传文件大小不能超过 100MB!')
+      }
+      this.form.name = file.name
+      return isLt2M
+    },
+    handleSuccess(response, file, fileList) {
+      this.form.localStorage = response
+    },
+    // 监听上传失败
+    handleError(e, file, fileList) {
+      const msg = JSON.parse(e.message)
+      this.$notify({
+        title: msg.message,
+        type: 'error',
+        duration: 2500
+      })
+      this.loading = false
+    },
+    openDmSystem(form) {
+      this.crud.doOpenDmSystem(form)
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 146 - 0
src/views/dm/appMenu/index.vue

@@ -0,0 +1,146 @@
+<template>
+  <div class="app-container">
+    <!--工具栏-->
+    <div class="head-container">
+      <div v-if="crud.props.searchToggle">
+        <!-- 搜索 -->
+        <label class="el-form-item-label">菜单名称</label>
+        <el-input v-model="query.name" clearable placeholder="菜单名称" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
+        <rrOperation :crud="crud" />
+      </div>
+      <!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
+      <crudOperation :permission="permission" />
+      <!--表单组件-->
+      <el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="500px">
+        <el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
+          <el-form-item label="菜单名称">
+            <el-input v-model="form.name" style="width: 370px;" />
+          </el-form-item>
+          <el-form-item label="菜单路由">
+            <el-input v-model="form.route" style="width: 370px;" />
+          </el-form-item>
+          <el-form-item label="菜单图标">
+            <el-upload
+              class="avatar-uploader"
+              :headers="headers"
+              :action="imagesUploadApi"
+              :show-file-list="false"
+              :on-success="handleAvatarSuccess"
+              :file-list="fileList"
+            >
+              <img v-if="imageUrl" :src="imageUrl" class="avatar">
+              <i v-else class="el-icon-plus avatar-uploader-icon" />
+            </el-upload>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="text" @click="crud.cancelCU">取消</el-button>
+          <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
+        </div>
+      </el-dialog>
+      <!--表格渲染-->
+      <el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="name" label="菜单名称" />
+        <el-table-column prop="iocn" label="菜单图标" />
+        <el-table-column prop="route" label="菜单路由" />
+        <el-table-column prop="createBy" label="创建者" />
+        <el-table-column prop="createTime" label="创建日期" />
+        <el-table-column v-if="checkPer(['admin','dmAppMenu:edit','dmAppMenu:del'])" label="操作" width="150px" align="center">
+          <template slot-scope="scope">
+            <udOperation
+              :data="scope.row"
+              :permission="permission"
+            />
+          </template>
+        </el-table-column>
+      </el-table>
+      <!--分页组件-->
+      <pagination />
+    </div>
+  </div>
+</template>
+
+<script>
+import crudDmAppMenu from '@/api/dm/appMenu/dmAppMenu'
+import CRUD, { presenter, header, form, crud } from '@crud/crud'
+import rrOperation from '@crud/RR.operation'
+import crudOperation from '@crud/CRUD.operation'
+import udOperation from '@crud/UD.operation'
+import pagination from '@crud/Pagination'
+import { getToken } from '@/utils/auth'
+import { mapGetters } from 'vuex'
+
+const defaultForm = { id: null, name: null, iocn: null, route: null, createBy: null, updateBy: null, createTime: null, updateTime: null }
+export default {
+  name: 'DmAppMenu',
+  components: { pagination, crudOperation, rrOperation, udOperation },
+  mixins: [presenter(), header(), form(defaultForm), crud()],
+  cruds() {
+    return CRUD({ title: 'app菜单', url: 'api/dmAppMenu', idField: 'id', sort: 'id,desc', crudMethod: { ...crudDmAppMenu }})
+  },
+  data() {
+    return {
+      headers: { 'Authorization': getToken() },
+      permission: {
+        add: ['admin', 'dmAppMenu:add'],
+        edit: ['admin', 'dmAppMenu:edit'],
+        del: ['admin', 'dmAppMenu:del']
+      },
+      rules: {
+      },
+      queryTypeOptions: [
+        { key: 'name', display_name: '菜单名称' }
+      ],
+      fileList: [],
+      imageUrl: ''
+    }
+  },
+  computed: {
+    ...mapGetters([
+      'baseApi',
+      'imagesUploadApi'
+    ])
+  },
+  methods: {
+    // 钩子:在获取表格数据之前执行,false 则代表不获取数据
+    [CRUD.HOOK.beforeRefresh]() {
+      return true
+    },
+    handleAvatarSuccess(res, file) {
+      this.form.iocn = 'https://smartpark.caih.com/static/zkptres/' + res.realName
+      this.imageUrl = (process.env.NODE_ENV !== 'production' ? this.baseApi + '/file/' + res.realName : 'https://smartpark.caih.com/static/zkptres/' + res.realName)
+      console.log('res', res)
+      console.log('file', file)
+    }
+  }
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+  .avatar-uploader {
+  ::v-deep .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+  ::v-deep .el-upload:hover {
+    border-color: #409EFF;
+  }
+  }
+  .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 178px;
+    height: 178px;
+    line-height: 178px;
+    text-align: center;
+  }
+  .avatar {
+    width: 178px;
+    height: 178px;
+    display: block;
+  }
+</style>

+ 155 - 0
src/views/dm/system/index.vue

@@ -0,0 +1,155 @@
+<template>
+  <div class="app-container">
+    <!--工具栏-->
+    <div class="head-container">
+      <!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
+      <crudOperation :permission="permission" />
+      <dmUserTemp @on-change="dmUserCallbackFunc" />
+      <!--表单组件-->
+      <el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="500px">
+        <el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
+          <el-form-item label="系统名称" prop="systemName">
+            <el-input v-model="form.systemName" style="width: 370px;" />
+          </el-form-item>
+          <el-form-item label="系统地址" prop="systemUrl">
+            <el-input v-model="form.systemUrl" style="width: 370px;" />
+          </el-form-item>
+          <el-form-item label="系统图标" prop="storageId">
+            <!--            <el-input v-model="form.storageId" style="width: 370px;" />-->
+            <el-upload
+              class="avatar-uploader"
+              :action="imagesUploadApi"
+              :show-file-list="false"
+              :on-success="handleAvatarSuccess"
+              :file-list="fileList"
+            >
+              <img v-if="imageUrl" :src="imageUrl" class="avatar">
+              <i v-else class="el-icon-plus avatar-uploader-icon" />
+            </el-upload>
+          </el-form-item>
+          <el-form-item label="管理员" prop="dmUser.name">
+            <el-input v-model="form.dmUser.name" style="width: 370px;" @click.native="openDmList(form)" />
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="text" @click="crud.cancelCU">取消</el-button>
+          <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
+        </div>
+      </el-dialog>
+      <!--表格渲染-->
+      <el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="systemName" label="子系统名称" />
+        <el-table-column prop="dmUser.name" label="子系统管理员" />
+        <el-table-column prop="createTime" label="创建时间" />
+        <el-table-column prop="updateTime" label="更新时间" />
+        <el-table-column v-if="checkPer(['admin','dmSystem:edit','dmSystem:del'])" label="操作" width="150px" align="center">
+          <template slot-scope="scope">
+            <udOperation
+              :data="scope.row"
+              :permission="permission"
+            />
+          </template>
+        </el-table-column>
+      </el-table>
+      <!--分页组件-->
+      <pagination />
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import crudDmSystem from '@/api/dm/system/dmSystem'
+import CRUD, { presenter, header, form, crud } from '@crud/crud'
+import rrOperation from '@crud/RR.operation'
+import crudOperation from '@crud/CRUD.operation'
+import udOperation from '@crud/UD.operation'
+import pagination from '@crud/Pagination'
+import dmUserTemp from '@/components/User/dmUserindex'
+
+const defaultForm = { systemName: null, systemUrl: null, storage: {}, dmUser: {}}
+export default {
+  name: 'DmSystem',
+  components: { pagination, crudOperation, rrOperation, udOperation, dmUserTemp },
+  mixins: [presenter(), header(), form(defaultForm), crud()],
+  cruds() {
+    return CRUD({ title: '子系统', url: 'api/dmSystem', idField: 'id', sort: 'id,desc', crudMethod: { ...crudDmSystem }})
+  },
+  data() {
+    return {
+      permission: {
+        add: ['admin', 'dmSystem:add'],
+        edit: ['admin', 'dmSystem:edit'],
+        del: ['admin', 'dmSystem:del']
+      },
+      rules: {
+        systemName: [
+          { required: true, message: '子系统名称不能为空', trigger: 'blur' }
+        ],
+        systemUrl: [
+          { required: true, message: '子系统地址不能为空', trigger: 'blur' }
+        ],
+        userId: [
+          { required: true, message: '子系统管理员不能为空', trigger: 'blur' }
+        ]
+      },
+      imageUrl: '',
+      fileList: []
+    }
+  },
+  computed: {
+    ...mapGetters([
+      'baseApi',
+      'imagesUploadApi' // 图片上传
+    ])
+  },
+  methods: {
+    // 钩子:在获取表格数据之前执行,false 则代表不获取数据
+    [CRUD.HOOK.beforeRefresh]() {
+      return true
+    },
+    handleAvatarSuccess(res, file) {
+      this.form.storage = res
+      this.imageUrl = this.baseApi + '/file/' + res.type + '/' + res.realName
+      console.log('res', res)
+      console.log('file', file)
+    },
+    openDmList(form) {
+      this.crud.doOpenDmUser(form)
+      console.log(form)
+    },
+    dmUserCallbackFunc(userList) {
+      this.form.dmUser = userList[0]
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .avatar-uploader {
+    ::v-deep .el-upload {
+      border: 1px dashed #d9d9d9;
+      border-radius: 6px;
+      cursor: pointer;
+      position: relative;
+      overflow: hidden;
+    }
+    ::v-deep .el-upload:hover {
+       border-color: #409EFF;
+     }
+  }
+  .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 178px;
+    height: 178px;
+    line-height: 178px;
+    text-align: center;
+  }
+  .avatar {
+    width: 178px;
+    height: 178px;
+    display: block;
+  }
+</style>

+ 98 - 0
src/views/dm/systemNavigation/index.vue

@@ -0,0 +1,98 @@
+<template>
+  <el-row>
+    <el-col v-for="(system, index) in systemList" :key="system.id" :span="4" :offset="index > 0 ? 1 : 0">
+      <el-card :body-style="{ padding: '0px' }">
+        <img :src=" baseApi + '/file/' + system.storage.type + '/' + system.storage.realName" class="image">
+        <div class="content">
+          <span>{{ system.systemName }}</span>
+          <el-button type="danger" round>进入</el-button>
+        </div>
+      </el-card>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import crudDmSystem from '@/api/dm/system/dmSystem'
+export default {
+  data() {
+    return {
+      systemList: []
+    }
+  },
+  computed: {
+    ...mapGetters([
+      'user',
+      'baseApi'
+    ])
+  },
+  mounted() {
+    this.queryByUserId(this.user.id)
+  },
+  methods: {
+    queryByUserId(userId) {
+      crudDmSystem.queryByUserId(userId).then(res => {
+        console.log('res', res)
+        this.systemList = res
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  >>> .el-col:nth-child(5n + 1) {
+    margin-left: 0;
+  }
+  >>> .el-col:nth-child(n + 6) {
+    margin-top: 20px;
+  }
+
+  .content {
+    padding: 20px;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+    align-items: center;
+
+    span {
+      font-size: 16px;
+      font-weight: 600;
+      margin-bottom: 15px;
+    }
+    ::v-deep .el-button {
+      width: 60%;
+    }
+  }
+
+  .time {
+    font-size: 13px;
+    color: #999;
+  }
+
+  .bottom {
+    margin-top: 13px;
+    line-height: 12px;
+  }
+
+  .button {
+    padding: 0;
+    float: right;
+  }
+
+  .image {
+    width: 100%;
+    display: block;
+  }
+
+  .clearfix:before,
+  .clearfix:after {
+    display: table;
+    content: "";
+  }
+
+  .clearfix:after {
+    clear: both
+  }
+</style>

+ 170 - 402
src/views/dm/user/index.vue

@@ -1,444 +1,212 @@
 <template>
   <div class="app-container">
-    <el-row :gutter="20">
-      <!--侧边部门数据-->
-      <el-col :xs="9" :sm="6" :md="5" :lg="4" :xl="4">
-        <div class="head-container">
-          <el-input
-            v-model="deptName"
-            clearable
-            size="small"
-            placeholder="输入部门名称搜索"
-            prefix-icon="el-icon-search"
-            class="filter-item"
-            @input="getDeptDatas"
-          />
+    <!--工具栏-->
+    <div class="head-container">
+      <!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
+      <crudOperation :permission="permission" />
+      <el-button class="filter-item" size="mini" type="success" icon="el-icon-edit" :disabled="crud.selections.length !== 1" @click="systemConfigClick(crud.selections[0])">配置子系统权限</el-button>
+      <el-button class="filter-item" size="mini" type="success" icon="el-icon-edit" :disabled="crud.selections.length !== 1" @click="appMenuConfigClick(crud.selections[0])">配置APP菜单权限</el-button>
+
+      <!--配置子系统权限-->
+      <el-dialog title="配置子系统权限" :visible.sync="systemConfig">
+        <el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
+          <el-descriptions>
+            <el-descriptions-item label="姓名">{{ form.name }}</el-descriptions-item>
+            <el-descriptions-item label="员工工号">{{ form.userNumber }}</el-descriptions-item>
+            <el-descriptions-item label="职务">{{ form.jobs && form.jobs.map(item => item.name).join(',') }}</el-descriptions-item>
+            <el-descriptions-item label="所属部门">{{ form.dept.name }}</el-descriptions-item>
+          </el-descriptions>
+          <div>授权子系统权限:</div>
+          <el-checkbox-group v-model="dmUserSystem">
+            <el-checkbox v-for="dmSystem in dmSystemList" :key="dmSystem.id" :label="dmSystem.id" name="type" border>{{ dmSystem.systemName }}</el-checkbox>
+          </el-checkbox-group>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="text" @click="cancelSystemConfig">取消</el-button>
+          <el-button :loading="crud.status.cu === 2" type="primary" @click="submitSystemConfig">确认</el-button>
         </div>
-        <el-tree
-          :data="deptDatas"
-          :load="getDeptDatas"
-          :props="defaultProps"
-          :expand-on-click-node="false"
-          lazy
-          @node-click="handleNodeClick"
-        />
-      </el-col>
-      <!--用户数据-->
-      <el-col :xs="15" :sm="18" :md="19" :lg="20" :xl="20">
-        <!--工具栏-->
-        <div class="head-container">
-          <div v-if="crud.props.searchToggle">
-            <!-- 搜索 -->
-            <!--
-            <date-range-picker v-model="query.createTime" class="date-item" />
-            <el-select
-              v-model="query.enabled"
-              clearable
-              size="small"
-              placeholder="状态"
-              class="filter-item"
-              style="width: 90px"
-              @change="crud.toQuery"
-            >
-              <el-option
-                v-for="item in enabledTypeOptions"
-                :key="item.key"
-                :label="item.display_name"
-                :value="item.key"
-              />
-            </el-select> -->
-            <el-input v-model="query.blurry" clearable size="small" placeholder="输入名称/联系方式/邮箱搜索" style="width: 250px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
-            <date-range-picker v-model="query.createTime" class="date-item" />
-            <rrOperation />
-          </div>
-          <crudOperation :permission="permission" />
+      </el-dialog>
+
+      <!--配置app菜单权限-->
+      <el-dialog title="配置app菜单权限" :visible.sync="appMenuConfig">
+        <el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
+          <el-descriptions>
+            <el-descriptions-item label="姓名">{{ form.name }}</el-descriptions-item>
+            <el-descriptions-item label="员工工号">{{ form.userNumber }}</el-descriptions-item>
+            <el-descriptions-item label="职务">{{ form.jobs && form.jobs.map(item => item.name).join(',') }}</el-descriptions-item>
+            <el-descriptions-item label="所属部门">{{ form.dept.name }}</el-descriptions-item>
+          </el-descriptions>
+          <div>授权子系统权限:</div>
+          <el-checkbox-group v-model="dmUserAppMenu">
+            <el-checkbox v-for="dmAppMenu in dmAppMenuList" :key="dmAppMenu.id" :label="dmAppMenu.id" name="type" border>{{ dmAppMenu.name }}</el-checkbox>
+          </el-checkbox-group>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="text" @click="cancelAppMenuConfig">取消</el-button>
+          <el-button :loading="crud.status.cu === 2" type="primary" @click="submitAppMenuConfig">确认</el-button>
         </div>
-        <!--表单渲染-->
-        <el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="570px">
-          <el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="66px">
-            <el-form-item label="姓名" prop="name">
-              <el-input v-model="form.name" style="width: 370px;" />
-            </el-form-item>
-            <el-form-item label="性别">
-              <el-radio-group v-model="form.sex" style="width: 178px">
-                <el-radio label="男">男</el-radio>
-                <el-radio label="女">女</el-radio>
-              </el-radio-group>
-            </el-form-item>
-            <el-form-item label="联系方式">
-              <el-input v-model="form.contacts" style="width: 370px;" />
-            </el-form-item>
-            <el-form-item label="邮箱" prop="email">
-              <el-input v-model="form.email" style="width: 370px;" />
-            </el-form-item>
-            <el-form-item label="部门" prop="dept.id">
-              <treeselect
-                v-model="form.dept.id"
-                :options="depts"
-                :load-options="loadDepts"
-                style="width: 178px"
-                placeholder="选择部门"
-              />
-            </el-form-item>
-            <el-form-item label="岗位" prop="jobs">
-              <el-select
-                v-model="jobDatas"
-                style="width: 178px"
-                multiple
-                placeholder="请选择"
-                @remove-tag="deleteTag"
-                @change="changeJob"
-              >
-                <el-option
-                  v-for="item in jobs"
-                  :key="item.name"
-                  :label="item.name"
-                  :value="item.id"
-                />
-              </el-select>
-            </el-form-item>
-            <el-form-item label="是否是审批人">
-              <el-radio-group v-model="form.isApprover" style="width: 178px">
-                <el-radio label="1" value="1">是</el-radio>
-                <el-radio label="0" value="0">否</el-radio>
-              </el-radio-group>
-            </el-form-item>
-            <el-form-item style="margin-bottom: 0;" label="角色" prop="roles">
-              <el-select
-                v-model="roleDatas"
-                style="width: 437px"
-                multiple
-                placeholder="请选择"
-                @remove-tag="deleteTag"
-                @change="changeRole"
-              >
-                <el-option
-                  v-for="item in roles"
-                  :key="item.name"
-                  :disabled="level !== 1 && item.level <= level"
-                  :label="item.name"
-                  :value="item.id"
-                />
-              </el-select>
+      </el-dialog>
+
+      <!--表格渲染-->
+      <el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="name" label="姓名" />
+        <el-table-column prop="type" label="人员种类">
+          <template slot-scope="scope">
+            {{ dict.label.dm_usertype[scope.row.type] }}
+          </template>
+        </el-table-column>
 
-            </el-form-item>
-          </el-form>
-          <div slot="footer" class="dialog-footer">
-            <el-button type="text" @click="crud.cancelCU">取消</el-button>
-            <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
-          </div>
-        </el-dialog>
-        <!--表格渲染-->
-        <el-table ref="table" v-loading="crud.loading" :data="crud.data" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
-          <el-table-column :selectable="checkboxT" type="selection" width="55" />
-          <el-table-column :show-overflow-tooltip="true" prop="name" label="姓名" />
-          <el-table-column :show-overflow-tooltip="true" prop="sex" label="性别" />
-          <el-table-column :show-overflow-tooltip="true" prop="contacts" label="联系方式" />
-          <el-table-column :show-overflow-tooltip="true" prop="email" label="邮箱" />
-          <el-table-column :show-overflow-tooltip="true" prop="dept" label="部门">
-            <template slot-scope="scope">
-              <div>{{ scope.row.dept.name }}</div>
-            </template>
-          </el-table-column>
-          <el-table-column :show-overflow-tooltip="true" prop="isApprover" label="是否是审批者">
-            <template slot-scope="scope">
-              <div v-if="scope.row.isApprover == 1">是</div>
-              <div v-if="scope.row.isApprover == 0">否</div>
-            </template>
-          </el-table-column>
-          <el-table-column :show-overflow-tooltip="true" prop="createTime" width="135" label="创建日期" />
-          <el-table-column
-            v-if="checkPer(['admin','dmUser:edit','dmUser:del'])"
-            label="操作"
-            width="115"
-            align="center"
-            fixed="right"
-          >
-            <template slot-scope="scope">
-              <udOperation
-                :data="scope.row"
-                :permission="permission"
-                :disabled-dle="scope.row.id === user.id"
-              />
-            </template>
-          </el-table-column>
-        </el-table>
-        <!--分页组件-->
-        <pagination />
-      </el-col>
-    </el-row>
+        <el-table-column prop="userNumber" label="员工工号" />
+        <el-table-column prop="jobs" label="职务">
+          <template slot-scope="{row, column}">
+            {{ row[column.property] && row[column.property].map(item => item.name).join(',') }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="contacts" label="手机" />
+        <el-table-column label="人员状态" align="center" prop="enabled">
+          <template slot-scope="scope">
+            <el-switch
+              v-model="scope.row.status"
+              active-color="#409EFF"
+              inactive-color="#F56C6C"
+              :disabled="true"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column prop="updateTime" label="最后更新时间" />
+        <el-table-column v-if="checkPer(['admin','dmUser:edit','dmUser:del'])" label="操作" width="150px" align="center">
+          <!--          <template slot-scope="scope">-->
+          <!--            <el-button-->
+          <!--              size="mini"-->
+          <!--              type="primary"-->
+          <!--              @click="openDetailsConfig(scope.row)"-->
+          <!--            >详情</el-button>-->
+          <!--          </template>-->
+        </el-table-column>
+      </el-table>
+      <!--分页组件-->
+      <pagination />
+    </div>
   </div>
 </template>
 
 <script>
 import crudDmUser from '@/api/dm/user/dmUser'
-import { isvalidPhone } from '@/utils/validate'
-import { getDepts, getDeptSuperior } from '@/api/system/dept'
-import { getAll, getLevel } from '@/api/system/role'
-import { getAllJob } from '@/api/system/job'
+import { getDmSystem } from '@/api/dm/system/dmSystem'
+import { getDmAppMenu } from '@/api/dm/appMenu/dmAppMenu'
 import CRUD, { presenter, header, form, crud } from '@crud/crud'
 import rrOperation from '@crud/RR.operation'
 import crudOperation from '@crud/CRUD.operation'
 import udOperation from '@crud/UD.operation'
 import pagination from '@crud/Pagination'
-import DateRangePicker from '@/components/DateRangePicker'
-import Treeselect from '@riophae/vue-treeselect'
-import { mapGetters } from 'vuex'
-import '@riophae/vue-treeselect/dist/vue-treeselect.css'
-import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
-let userRoles = []
-let userJobs = []
-const defaultForm = { id: null, name: null, nickName: null, sex: '男', email: null, enabled: 'false', roles: [], jobs: [], dept: { id: null }, contacts: null, isApprover: '0' }
+
+const defaultForm = { id: null, name: null, sex: null, contacts: null, email: null, deptId: null, dept: {}, isApprover: null, createBy: null, updateBy: null, createTime: null, updateTime: null, faceId: null, cardId: null, usercode: null, userNumber: null, status: null, type: null, picture: null, remark: null, isVisitorApproval: null, userRootGroupId: null, userRootGroupName: null }
+const optShow = {
+  add: false,
+  edit: false,
+  del: false,
+  download: true,
+  reset: false
+}
 export default {
-  name: 'User',
-  components: { Treeselect, crudOperation, rrOperation, udOperation, pagination, DateRangePicker },
+  name: 'DmUser',
+  components: { pagination, crudOperation, rrOperation, udOperation },
+  mixins: [presenter(), header(), form(defaultForm), crud()],
+  dicts: ['dm_usertype'],
   cruds() {
-    return CRUD({ title: '文印管理系统-用户管理', url: 'api/dmUser', idField: 'id', sort: 'id,desc', crudMethod: { ...crudDmUser }})
+    return CRUD({ title: '123', url: 'api/dmUser', idField: 'id', sort: 'id,desc', crudMethod: { ...crudDmUser }, optShow: optShow })
   },
-  mixins: [presenter(), header(), form(defaultForm), crud()],
-  // 数据字典
-  dicts: ['user_status'],
   data() {
-    // 自定义验证
-    const validPhone = (rule, value, callback) => {
-      if (!value) {
-        callback(new Error('请输入电话号码'))
-      } else if (!isvalidPhone(value)) {
-        callback(new Error('请输入正确的11位手机号码'))
-      } else {
-        callback()
-      }
-    }
     return {
-      height: document.documentElement.clientHeight - 180 + 'px;',
-      deptName: '', depts: [], deptDatas: [], jobs: [], level: 3, roles: [],
-      jobDatas: [], roleDatas: [], // 多选时使用
-      defaultProps: { children: 'children', label: 'name', isLeaf: 'leaf' },
       permission: {
-        add: ['admin', 'user:add'],
-        edit: ['admin', 'user:edit'],
-        del: ['admin', 'user:del']
+        add: ['admin', 'dmUser:add'],
+        edit: ['admin', 'dmUser:edit'],
+        del: ['admin', 'dmUser:del']
       },
-      enabledTypeOptions: [
-        { key: 'true', display_name: '激活' },
-        { key: 'false', display_name: '锁定' }
-      ],
       rules: {
-        name: [
-          { required: true, message: '请输入用户名', trigger: 'blur' }/* ,
-          { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' } */
-        ],
-        email: [
-          { required: true, message: '请输入邮箱地址', trigger: 'blur' },
-          { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }
-        ],
-        'dept.id': [
-          { required: true, message: '请选择部门', trigger: 'blur' }
-        ],
-        contacts: [
-          { required: true, trigger: 'blur', validator: validPhone }
-        ]
-      }
-    }
-  },
-  computed: {
-    ...mapGetters([
-      'user'
-    ])
-  },
-  created() {
-    this.crud.msg.add = '新增成功'
-  },
-  mounted: function() {
-    const that = this
-    window.onresize = function temp() {
-      that.height = document.documentElement.clientHeight - 180 + 'px;'
+      },
+      dmSystemList: [],
+      systemConfig: false,
+      dmUserSystem: [],
+      dmAppMenuList: [],
+      appMenuConfig: false,
+      dmUserAppMenu: []
     }
   },
   methods: {
-    changeRole(value) {
-      userRoles = []
-      value.forEach(function(data, index) {
-        const role = { id: data }
-        userRoles.push(role)
-      })
-    },
-    changeJob(value) {
-      userJobs = []
-      value.forEach(function(data, index) {
-        const job = { id: data }
-        userJobs.push(job)
-      })
-    },
-    deleteTag(value) {
-      userRoles.forEach(function(data, index) {
-        if (data.id === value) {
-          userRoles.splice(index, value)
-        }
-      })
-    },
-    // 新增与编辑前做的操作
-    [CRUD.HOOK.afterToCU](crud, form) {
-      this.getRoles()
-      if (form.id == null) {
-        this.getDepts()
-      } else {
-        this.getSupDepts(form.dept.id)
-      }
-      this.getRoleLevel()
-      this.getJobs()
-      form.enabled = form.enabled.toString()
-    },
-    // 新增前将多选的值设置为空
-    [CRUD.HOOK.beforeToAdd]() {
-      this.jobDatas = []
-      this.roleDatas = []
-    },
-    // 初始化编辑时候的角色与岗位
-    [CRUD.HOOK.beforeToEdit](crud, form) {
-      this.getJobs(this.form.dept.id)
-      this.jobDatas = []
-      this.roleDatas = []
-      userRoles = []
-      userJobs = []
-      const _this = this
-      form.roles.forEach(function(role, index) {
-        _this.roleDatas.push(role.id)
-        const rol = { id: role.id }
-        userRoles.push(rol)
-      })
-      form.jobs.forEach(function(job, index) {
-        _this.jobDatas.push(job.id)
-        const data = { id: job.id }
-        userJobs.push(data)
-      })
-    },
-    // 提交前做的操作
-    [CRUD.HOOK.afterValidateCU](crud) {
-      if (!crud.form.dept.id) {
-        this.$message({
-          message: '部门不能为空',
-          type: 'warning'
-        })
-        return false
-      } else if (this.jobDatas.length === 0) {
-        this.$message({
-          message: '岗位不能为空',
-          type: 'warning'
-        })
-        return false
-      } else if (this.roleDatas.length === 0) {
-        this.$message({
-          message: '角色不能为空',
-          type: 'warning'
-        })
-        return false
-      }
-      crud.form.roles = userRoles
-      crud.form.jobs = userJobs
+    // 钩子:在获取表格数据之前执行,false 则代表不获取数据
+    [CRUD.HOOK.beforeRefresh]() {
       return true
     },
-    // 获取左侧部门数据
-    getDeptDatas(node, resolve) {
-      const sort = 'id,desc'
-      const params = { sort: sort }
-      if (typeof node !== 'object') {
-        if (node) {
-          params['name'] = node
-        }
-      } else if (node.level !== 0) {
-        params['pid'] = node.data.id
+    systemConfigClick(data) {
+      this.form = data
+      for (let i = 0; i < data.dmSystems.length; i++) {
+        this.dmUserSystem.push(data.dmSystems[i].id)
       }
-      setTimeout(() => {
-        getDepts(params).then(res => {
-          if (resolve) {
-            resolve(res.content)
-          } else {
-            this.deptDatas = res.content
-          }
-        })
-      }, 100)
-    },
-    getDepts() {
-      getDepts({ enabled: true }).then(res => {
-        this.depts = res.content.map(function(obj) {
-          if (obj.hasChildren) {
-            obj.children = null
-          }
-          return obj
-        })
-      })
-    },
-    getSupDepts(deptId) {
-      getDeptSuperior(deptId).then(res => {
-        const date = res.content
-        this.buildDepts(date)
-        this.depts = date
+      console.log('this.dmUserSystem', this.dmUserSystem)
+      this.systemConfig = true
+      this.getDmSystemList()
+    },
+    // 获取所有子系统
+    getDmSystemList() {
+      getDmSystem().then(res => {
+        this.dmSystemList = res.content
       })
     },
-    buildDepts(depts) {
-      depts.forEach(data => {
-        if (data.children) {
-          this.buildDepts(data.children)
-        }
-        if (data.hasChildren && !data.children) {
-          data.children = null
-        }
-      })
+    cancelSystemConfig() {
+      this.dmSystemList = []
+      this.dmUserSystem = []
+      this.systemConfig = false
     },
-    // 获取弹窗内部门数据
-    loadDepts({ action, parentNode, callback }) {
-      if (action === LOAD_CHILDREN_OPTIONS) {
-        getDepts({ enabled: true, pid: parentNode.id }).then(res => {
-          parentNode.children = res.content.map(function(obj) {
-            if (obj.hasChildren) {
-              obj.children = null
-            }
-            return obj
-          })
-          setTimeout(() => {
-            callback()
-          }, 200)
-        })
-      }
-    },
-    // 切换部门
-    handleNodeClick(data) {
-      if (data.pid === 0) {
-        this.query.deptId = null
-      } else {
-        this.query.deptId = data.id
+    submitSystemConfig() {
+      console.log(this.dmUserSystem)
+
+      const updateUserSystemData = {}
+      updateUserSystemData.userId = this.form.id
+      updateUserSystemData.systemIds = this.dmUserSystem
+      crudDmUser.updateUserSystem(updateUserSystemData)
+      this.dmSystemList = []
+      this.dmUserSystem = []
+      this.systemConfig = false
+      this.crud.refresh()
+    },
+    appMenuConfigClick(data) {
+      this.form = data
+      console.log('data.dmAppMenus.length:', data.dmAppMenus.length)
+      for (let i = 0; i < data.dmAppMenus.length; i++) {
+        this.dmUserAppMenu.push(data.dmAppMenus[i].id)
       }
-      this.crud.toQuery()
+      console.log('this.dmUserAppMenu', this.dmUserAppMenu)
+      this.appMenuConfig = true
+      this.getDmAppMenuList()
     },
-    // 获取弹窗内角色数据
-    getRoles() {
-      getAll().then(res => {
-        this.roles = res
-      }).catch(() => { })
-    },
-    // 获取弹窗内岗位数据
-    getJobs() {
-      getAllJob().then(res => {
-        this.jobs = res.content
-      }).catch(() => { })
+    getDmAppMenuList() {
+      getDmAppMenu().then(res => {
+        this.dmAppMenuList = res.content
+      })
     },
-    // 获取权限级别
-    getRoleLevel() {
-      getLevel().then(res => {
-        this.level = res.level
-      }).catch(() => { })
+    cancelAppMenuConfig() {
+      this.dmAppMenuList = []
+      this.dmUserAppMenu = []
+      this.appMenuConfig = false
     },
-    checkboxT(row, rowIndex) {
-      return row.id !== this.user.id
+    submitAppMenuConfig() {
+      console.log(this.dmUserAppMenu)
+
+      const updateUserAppMenuData = {}
+      updateUserAppMenuData.userId = this.form.id
+      updateUserAppMenuData.appMenuIds = this.dmUserAppMenu
+      crudDmUser.updateUserAppMenu(updateUserAppMenuData)
+      this.dmAppMenuList = []
+      this.dmUserAppMenu = []
+      this.appMenuConfig = false
+      this.crud.refresh()
     }
   }
 }
 </script>
 
-<style rel="stylesheet/scss" lang="scss" scoped>
-  ::v-deep .vue-treeselect__control,::v-deep .vue-treeselect__placeholder,::v-deep .vue-treeselect__single-value {
-    height: 30px;
-    line-height: 30px;
-  }
+<style scoped>
+
 </style>

+ 103 - 67
src/views/system/user/index.vue

@@ -58,12 +58,12 @@
             <rrOperation />
           </div>
           <crudOperation show="" :permission="permission" />
-          <el-button
-            :disabled="crud.selections.length === 0"
-            :loading="unbindLoading"
-            @click="toUnBind(crud.selections)"
-          >解绑
-          </el-button>
+          <!--          <el-button-->
+          <!--            :disabled="crud.selections.length === 0"-->
+          <!--            :loading="unbindLoading"-->
+          <!--            @click="toUnBind(crud.selections)"-->
+          <!--          >解绑-->
+          <!--          </el-button>-->
         </div>
         <!--表单渲染-->
         <el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="570px">
@@ -74,41 +74,41 @@
             <el-form-item label="手机号" prop="phone">
               <el-input v-model.number="form.phone" />
             </el-form-item>
-            <!-- <el-form-item label="用户名称" prop="nickName">
+            <el-form-item label="用户名称" prop="nickName">
               <el-input v-model="form.nickName" />
-            </el-form-item> -->
-            <el-form-item label="用户名称" prop="dmUser.id">
-              <el-select
-                v-model="form.dmUser.id"
-                style="width: 193px"
-                filterable
-                placeholder="请选择"
-              >
-                <!-- <el-option value="">请选择</el-option> -->
-                <el-option
-                  v-for="item in dmUsers"
-                  :key="item.name"
-                  :label="item.name"
-                  :value="item.id"
-                />
-              </el-select>
-            </el-form-item>
-            <el-form-item label="所属单位" prop="dmCompany.companyId">
-              <el-select
-                v-model="form.dmCompany.companyId"
-                style="width: 193px"
-                filterable
-                placeholder="请选择"
-              >
-                <!-- <el-option value="">请选择</el-option> -->
-                <el-option
-                  v-for="item in dmCompanies"
-                  :key="item.fullName"
-                  :label="item.fullName"
-                  :value="item.companyId"
-                />
-              </el-select>
             </el-form-item>
+            <!--            <el-form-item label="用户名称" prop="dmUser.id">-->
+            <!--              <el-select-->
+            <!--                v-model="form.dmUser.id"-->
+            <!--                style="width: 193px"-->
+            <!--                filterable-->
+            <!--                placeholder="请选择"-->
+            <!--              >-->
+            <!--                &lt;!&ndash; <el-option value="">请选择</el-option> &ndash;&gt;-->
+            <!--                <el-option-->
+            <!--                  v-for="item in dmUsers"-->
+            <!--                  :key="item.name"-->
+            <!--                  :label="item.name"-->
+            <!--                  :value="item.id"-->
+            <!--                />-->
+            <!--              </el-select>-->
+            <!--            </el-form-item>-->
+            <!--            <el-form-item label="所属单位" prop="dmCompany.companyId">-->
+            <!--              <el-select-->
+            <!--                v-model="form.dmCompany.companyId"-->
+            <!--                style="width: 193px"-->
+            <!--                filterable-->
+            <!--                placeholder="请选择"-->
+            <!--              >-->
+            <!--                &lt;!&ndash; <el-option value="">请选择</el-option> &ndash;&gt;-->
+            <!--                <el-option-->
+            <!--                  v-for="item in dmCompanies"-->
+            <!--                  :key="item.fullName"-->
+            <!--                  :label="item.fullName"-->
+            <!--                  :value="item.companyId"-->
+            <!--                />-->
+            <!--              </el-select>-->
+            <!--            </el-form-item>-->
             <el-form-item v-if="form.id == null" label="初始密码" prop="orgPassword">
               <el-input v-model="form.orgPassword" />
             </el-form-item>
@@ -118,17 +118,34 @@
             <el-form-item label="备注" prop="remark">
               <el-input v-model="form.remark" />
             </el-form-item>
-            <!--<el-form-item label="邮箱" prop="email">
+            <el-form-item label="邮箱" prop="email">
               <el-input v-model="form.email" />
             </el-form-item>
+            <el-form-item label="工号" prop="userCode">
+              <el-input v-model="form.userCode" />
+            </el-form-item>
             <el-form-item label="部门" prop="dept.id">
-              <treeselect
+              <!--              <treeselect-->
+              <!--                v-model="form.dept.id"-->
+              <!--                :options="depts"-->
+              <!--                :load-options="loadDepts"-->
+              <!--                style="width: 178px"-->
+              <!--                placeholder="选择部门"-->
+              <!--              />-->
+              <el-select
                 v-model="form.dept.id"
-                :options="depts"
-                :load-options="loadDepts"
-                style="width: 178px"
-                placeholder="选择部门"
-              />
+                style="width: 300px"
+                filterable
+                :filter-method="filterDept"
+                placeholder="搜索部门名称"
+              >
+                <el-option
+                  v-for="item in deptList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
             </el-form-item>
             <el-form-item label="岗位" prop="jobs">
               <el-select
@@ -152,7 +169,7 @@
                 <el-radio label="男">男</el-radio>
                 <el-radio label="女">女</el-radio>
               </el-radio-group>
-            </el-form-item> -->
+            </el-form-item>
             <el-form-item label="状态">
               <el-radio-group v-model="form.enabled" :disabled="form.id === user.id" style="width: 193px">
                 <el-radio
@@ -162,7 +179,7 @@
                 >{{ item.label }}</el-radio>
               </el-radio-group>
             </el-form-item>
-            <!-- <el-form-item style="margin-bottom: 0;" label="角色" prop="roles">
+            <el-form-item style="margin-bottom: 0;" label="角色" prop="roles">
               <el-select
                 v-model="roleDatas"
                 style="width: 437px"
@@ -179,7 +196,7 @@
                   :value="item.id"
                 />
               </el-select>
-            </el-form-item> -->
+            </el-form-item>
           </el-form>
           <div slot="footer" class="dialog-footer">
             <el-button type="text" @click="crud.cancelCU">取消</el-button>
@@ -192,14 +209,14 @@
           <el-table-column :show-overflow-tooltip="true" prop="username" label="账号" />
           <el-table-column :show-overflow-tooltip="true" prop="dmUser.name" label="用户名称" />
           <el-table-column :show-overflow-tooltip="true" prop="dmCompany.fullName" label="所属单位" />
-          <!-- <el-table-column prop="gender" label="性别" /> -->
+          <el-table-column prop="gender" label="性别" />
           <el-table-column :show-overflow-tooltip="true" prop="phone" width="100" label="手机号" />
-          <!-- <el-table-column :show-overflow-tooltip="true" width="135" prop="email" label="邮箱" /> -->
-          <!-- <el-table-column :show-overflow-tooltip="true" prop="dept" label="部门">
+          <el-table-column :show-overflow-tooltip="true" width="135" prop="email" label="邮箱" />
+          <el-table-column :show-overflow-tooltip="true" prop="dept" label="部门">
             <template slot-scope="scope">
               <div>{{ scope.row.dept.name }}</div>
             </template>
-          </el-table-column> -->
+          </el-table-column>
           <el-table-column label="状态" align="center" prop="enabled">
             <template slot-scope="scope">
               <el-switch
@@ -240,7 +257,7 @@
 <script>
 import crudUser from '@/api/system/user'
 import { isvalidPhone } from '@/utils/validate'
-import { getDepts, getDeptSuperior } from '@/api/system/dept'
+import { getDepts, getDeptSuperior, getAllDept } from '@/api/system/dept'
 import { getAll, getLevel } from '@/api/system/role'
 import { getAllJob } from '@/api/system/job'
 import { getAllDmUser } from '@/api/dm/user/dmUser'
@@ -257,7 +274,7 @@ import '@riophae/vue-treeselect/dist/vue-treeselect.css'
 import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
 let userRoles = []
 let userJobs = []
-const defaultForm = { id: null, username: null, nickName: null, gender: '男', email: null, enabled: 'false', roles: [], jobs: [], dept: { id: null }, phone: null, dmUser: { id: null }, dmCompany: { companyId: null }, orgPassword: null, errLimit: null, remark: null }
+const defaultForm = { id: null, username: null, nickName: null, gender: '男', email: null, enabled: 'false', roles: [], jobs: [], dept: { id: null }, phone: null, dmUser: { id: null }, dmCompany: { companyId: null }, orgPassword: null, errLimit: null, remark: null, userCode: null }
 export default {
   name: 'User',
   components: { /* Treeselect, */ crudOperation, rrOperation, udOperation, pagination, DateRangePicker },
@@ -309,8 +326,17 @@ export default {
     }
     return {
       height: document.documentElement.clientHeight - 180 + 'px;',
-      deptName: '', depts: [], deptDatas: [], jobs: [], level: 3, roles: [], dmUsers: [], dmCompanies: [],
-      jobDatas: [], roleDatas: [], // 多选时使用
+      deptName: '',
+      depts: [],
+      deptDatas: [],
+      deptList: [],
+      jobs: [],
+      level: 3,
+      roles: [],
+      dmUsers: [],
+      dmCompanies: [],
+      jobDatas: [],
+      roleDatas: [], // 多选时使用
       defaultProps: { children: 'children', label: 'name', isLeaf: 'leaf' },
       permission: {
         add: ['admin', 'user:add'],
@@ -326,14 +352,18 @@ export default {
         username: [
           { required: true, message: '请输入账号', trigger: 'blur' },
           { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
-        ], /*
+        ],
         nickName: [
           { required: true, message: '请输入用户名称', trigger: 'blur' },
           { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
-        ], email: [
+        ],
+        email: [
           { required: true, message: '请输入邮箱地址', trigger: 'blur' },
           { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }
-        ] */
+        ],
+        userCode: [
+          { required: true, message: '请输入工号', trigger: 'blur' }
+        ],
         /* 'dmUser.id': [{ required: true, message: '请选择绑定用户', trigger: 'blur' }], */
         phone: [
           { required: true, trigger: 'blur', validator: validPhone }
@@ -415,11 +445,7 @@ export default {
     // 新增与编辑前做的操作
     [CRUD.HOOK.afterToCU](crud, form) {
       this.getRoles()
-      /* if (form.id == null) {
-        this.getDepts()
-      } else {
-        this.getSupDepts(form.dept.id)
-      } */
+      this.getDeptList()
       this.getRoleLevel()
       this.getJobs()
       this.getAllDmUser(form.id)
@@ -452,7 +478,7 @@ export default {
     },
     // 提交前做的操作
     [CRUD.HOOK.afterValidateCU](crud) {
-      /* if (!crud.form.dept.id) {
+      if (!crud.form.dept.id) {
         this.$message({
           message: '部门不能为空',
           type: 'warning'
@@ -472,7 +498,7 @@ export default {
         return false
       }
       crud.form.roles = userRoles
-      crud.form.jobs = userJobs */
+      crud.form.jobs = userJobs
       return true
     },
     // 获取左侧部门数据
@@ -597,6 +623,16 @@ export default {
     },
     checkboxT(row, rowIndex) {
       return row.id !== this.user.id
+    },
+    getDeptList() {
+      getAllDept().then(res => {
+        this.deptList = res.content
+      })
+    },
+    filterDept(val) {
+      getDepts({ name: val }).then(res => {
+        this.deptList = res.content
+      })
     }
   }
 }