wuyunfeng %!s(int64=4) %!d(string=hai) anos
pai
achega
e549133fa5

+ 42 - 17
src/api/role.js

@@ -1,38 +1,63 @@
 import request from '@/utils/request'
 
-export function getRoutes() {
+/**
+ * 获取角色列表
+ * @param params
+ */
+export function getRoleList(part_id) {
   return request({
-    url: '/vue-element-admin/routes',
-    method: 'get'
+    url: `/mgr/role/list/${part_id}`,
+    method: 'get',
+    loading: false
   })
 }
 
-export function getRoles() {
+
+/**
+ * 删除角色
+ * @param id
+ */
+export function deleteRole(id) {
   return request({
-    url: '/vue-element-admin/roles',
-    method: 'get'
+    url: `admin/systems/roles/${id}`,
+    method: 'delete'
   })
 }
 
-export function addRole(data) {
+/**
+ * 获取角色具体权限
+ * @param id
+ */
+export function getRolePermission(id) {
   return request({
-    url: '/vue-element-admin/role',
-    method: 'post',
-    data
+    url: `/mgr/role/${id}`,
+    method: 'get'
   })
 }
 
-export function updateRole(id, data) {
+/**
+ * 添加角色
+ * @param params
+ */
+export function addRole(params) {
   return request({
-    url: `/vue-element-admin/role/${id}`,
-    method: 'put',
-    data
+    url: 'admin/systems/roles',
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
   })
 }
 
-export function deleteRole(id) {
+/**
+ * 修改角色
+ * @param id
+ * @param params
+ */
+export function editRole(id, params) {
   return request({
-    url: `/vue-element-admin/role/${id}`,
-    method: 'delete'
+    url: `/mgr/role/${id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
   })
 }

+ 12 - 0
src/router/index.js

@@ -294,6 +294,18 @@ export const adminRoutes = [
       }
     ]
   },
+  {
+    path: '/ncs-rolemanager',
+    component: Layout,
+    children: [
+      {
+        path: 'index',
+        component: () => import('@/views/ncs-auth/superadmin/defaultRoleManager'),
+        name: 'rolemanager',
+        meta: { title: '角色功能', icon: 'tree', noCache: true }
+      }
+    ]
+  },
 
   { path: '*', redirect: '/404', hidden: true }
 ]

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

@@ -166,6 +166,11 @@ const actions = {
         dispatch('tagsView/delAllViews', null, { root: true })
         resolve()
       }).catch(err => {
+        commit('REMOVE_ACCESS_TOKEN')
+        commit('REMOVE_REFRESH_TOKEN')
+        commit('REMOVE_USER')
+        commit('REMOVE_PARTID')
+        commit('REMOVE_PARTINFO')
         reject(err)
       })
     })

+ 245 - 0
src/views/ncs-auth/compontents/roleEdit.vue

@@ -0,0 +1,245 @@
+<template>
+  <div class="permission-container">
+    <el-form ref="permissionForm" :model="permissionForm" :rules="permissionRules" label-width="200px" class="demo-ruleForm">
+      <el-form-item label="角色名称" prop="role_name">
+        <el-input v-model="permissionForm.role_name" />
+      </el-form-item>
+      <el-form-item label="角色描述" prop="role_describe">
+        <el-input v-model="permissionForm.role_describe" placeholder="最多200字" :maxlength="200" />
+      </el-form-item>
+      <el-form-item label="不用生成到科室" prop="role_describe">
+        <el-checkbox
+          v-model="permissionForm.hidden_in_seller"
+          label="是/否(勾选此项,该角色在创建科室时,不会在科室中创建此角色,不勾选则创建)。不同的科室对同一个角色可能分配不同的功能菜单,所以在创建科室时,将系统内的角色生成到科室上"
+        />
+      </el-form-item>
+      <el-form-item label="角色权限" prop="permission">
+        <el-checkbox v-model="allCheck" :indeterminate="allIndeterminate" @change="handleCheckAll">全部选择</el-checkbox>
+        <div v-for="(item, index) in permissions" :key="item.identifier" class="level_1">
+          <el-row :gutter="20">
+            <el-col :span="4">
+              <el-checkbox
+                v-model="item.checked"
+                :label="item.title"
+                :indeterminate="checkIndeterminate(item.children)"
+                @change="handleCheckboxChanged(item)"
+              />
+            </el-col>
+            <el-col :span="20">
+              <div v-for="(_item, _index) in item.children" :key="_item.identifier" class="checkbox-dropdown">
+                <el-checkbox
+                  v-model="_item.checked"
+                  :label="_item.title"
+                  :indeterminate="checkIndeterminate(_item.children)"
+                  @change="handleCheckboxChanged(_item, item)"
+                />
+                <template v-if="_item.children && _item.children.length">
+                  <el-dropdown trigger="click" split-button :hide-on-click="false">
+                    <el-dropdown-menu slot="dropdown">
+                      <el-dropdown-item v-for="(__item, __index) in _item.children" :key="__item.identifier">
+                        <el-checkbox
+                          v-model="__item.checked"
+                          :label="__item.title"
+                          @change="handleCheckboxChanged(__item, _item)"
+                        />
+                      </el-dropdown-item>
+                    </el-dropdown-menu>
+                  </el-dropdown>
+                </template>
+              </div>
+            </el-col>
+          </el-row>
+        </div>
+      </el-form-item>
+      <el-form-item label="">
+        <el-button type="primary" size="small" style="margin-top: 15px" @click="saveRolePermission">保存设置</el-button>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import * as API_Auth from '@/api/role'
+import * as API_Menus from '@/api/ncs_menu'
+
+export default {
+  name: 'RoleEdit',
+  props: {
+    role_id: {
+      type: Number,
+      required: true,
+      default: 0
+    }
+  },
+  data() {
+    return {
+      /** 权限 表单 */
+      permissionForm: {
+        role_name: '',
+        role_describe: '',
+        hidden_in_seller: false
+      },
+      /** 权限 表单规则 */
+      permissionRules: {
+        role_name: [
+          this.MixinRequired('请输入角色名称!'),
+          { min: 1, max: 10, message: '长度在 1 到 10 个字符', trigger: 'blur' }
+        ]
+      },
+      permissions: [],
+      // 全选状态
+      allCheck: false,
+      // 全选不确定状态
+      allIndeterminate: false
+    }
+  },
+  watch: {
+    role_id: 'GET_RolePermission'
+  },
+  mounted() {
+    // this.role_id = Number(this.$route.params.id)
+    this.GET_RolePermission()
+  },
+  methods: {
+    /** 全选 */
+    handleCheckAll(checked) {
+      this.allIndeterminate = false
+      this.$set(this, 'permissions', this.setPermissionsCheck(this.permissions, checked))
+    },
+    /** 选择 */
+    handleCheckboxChanged(item, parent) {
+      if (item.children && item.children.length) {
+        this.$set(item, 'children', this.setPermissionsCheck(item.children, item.checked))
+      }
+      this.countAllPermissions()
+      this.countParentChecked()
+    },
+    /** 设置权限状态 */
+    setPermissionsCheck(permissions, checked) {
+      const perm = this.MixinClone(permissions)
+      perm.map(item => {
+        item.checked = checked
+        this.$set(item, 'checked', checked)
+        if (item.children && item.children.length) {
+          this.$set(item, 'children', this.setPermissionsCheck(item.children, checked))
+        }
+      })
+      return perm
+    },
+    /** 检测是否有不确定性 */
+    checkIndeterminate(permissions) {
+      if (!Array.isArray(permissions)) return false
+      const _len = permissions.length
+      const __len = permissions.filter(item => item.checked).length
+      return (__len !== 0) && (_len !== __len)
+    },
+    /** 获取所有权限展开后的长度、被选中的长度 */
+    countAllPermissions(permissions) {
+      permissions = permissions || this.permissions
+      const _list = []
+      permissions.forEach(item => {
+        _list.push(item)
+        if (item.children) _list.push(...this.countAllPermissions(item.children))
+      })
+      const length = _list.length
+      const length_checked = _list.filter(_item => _item.checked).length
+      this.allCheck = length === _list.filter(_item => _item.checked).length
+      this.allIndeterminate = (length_checked !== 0) && (length !== length_checked)
+      return _list
+    },
+    /** 计算所有父辈的选中状态 */
+    countParentChecked(permissions) {
+      permissions = permissions || this.permissions
+      permissions.forEach(item => {
+        if (item.children && item.children.length) {
+          this.countParentChecked(item.children)
+          const lenght = item.children.length
+          const checked_length = item.children.filter(_item => _item.checked).length
+          item.checked = !!checked_length
+        }
+      })
+    },
+    /** 保存角色权限 */
+    saveRolePermission() {
+      this.$refs['permissionForm'].validate(valid => {
+        if (valid) {
+          const params = {
+            ...this.permissionForm,
+            menus: this.permissions,
+            shop_id: -1
+          }
+          this.role_id === 0
+            ? API_Auth.addRole(params).then(() => saveSuccess())
+            : API_Auth.editRole(this.role_id, params).then(() => saveSuccess())
+          const saveSuccess = () => {
+            this.$message.success('保存成功!')
+            // this.$route.params.callback()
+            // this.$store.dispatch('delCurrentViews', {
+            //   view: this.$route,
+            //   $router: this.$router
+            // })
+            this.$emit('aftersave')
+          }
+        } else {
+          this.$message.error('表单填写有误,请检查!')
+          return false
+        }
+      })
+    },
+    /** 获取权限菜单树 */
+    GET_RolePermission() {
+      API_Menus.getMenusChildren().then(res => {
+        // 如果this.role_id 不为0,说明是编辑。
+        if (this.role_id !== 0) {
+          API_Auth.getRolePermission(this.role_id).then(response => {
+            this.permissionForm.role_name = response.role_name
+            this.permissionForm.role_describe = response.role_describe
+            this.permissionForm.hidden_in_seller = response.hidden_in_seller
+            const checkedIds = this.expandRouters(response.menus)
+            this.$set(this, 'permissions', this.filterRoleRouter(res, checkedIds))
+            this.countAllPermissions()
+          })
+        } else {
+          this.$set(this, 'permissions', res)
+          this.$set(this.permissionForm, 'role_name', '')
+          this.$set(this.permissionForm, 'role_describe', '')
+          this.countAllPermissions()
+        }
+      })
+    },
+    /** 展开路由的identifier */
+    expandRouters(menus) {
+      const routers = []
+      if (menus) {
+        menus.forEach(item => {
+          item.checked && routers.push(item.identifier)
+          if (item.children && item.children.length) {
+            routers.push(...this.expandRouters(item.children))
+          }
+        })
+      }
+      return routers
+    },
+    /** 递归筛选被选中的路由 */
+    filterRoleRouter(routers, ids) {
+      const _routers = []
+      routers.forEach(item => {
+        if (ids.includes(item.identifier) || item.hidden) {
+          item.checked = true
+        } else {
+          item.checked = false
+        }
+        if (item.children) {
+          this.$set(item, 'children', this.filterRoleRouter(item.children, ids))
+        }
+        _routers.push(item)
+      })
+      return _routers
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 141 - 0
src/views/ncs-auth/superadmin/defaultRoleManager.vue

@@ -0,0 +1,141 @@
+<template>
+  <div class="app-container">
+    <el-container :style="{height: tableHeight+'px'}">
+
+      <el-aside width="260px" style="background-color: rgb(238, 241, 246)">
+        <el-table
+          ref="roleTable"
+          :data="tableData"
+          style="width: 100%"
+          :height="tableHeight-40"
+          highlight-current-row
+          @row-click="rowClick"
+        >
+          <el-table-column
+            prop="role_name"
+            label="角色名称"
+          />
+        </el-table>
+      </el-aside>
+      <el-main>
+        <role-edit :role_id="role_id" @aftersave="getRoleList" />
+      </el-main>
+    </el-container>
+
+  </div>
+</template>
+
+<script>
+import RoleEdit from '../compontents/roleEdit'
+import * as API_Auth from '@/api/role'
+export default {
+  name: 'DefaultRoleManager',
+  components: { RoleEdit },
+  data() {
+    return {
+      /** 角色列表 **/
+      tableData: [],
+      /** 当前选中的角色id */
+      role_id: 0
+    }
+  },
+  computed: {
+    tableHeight() {
+      return this.mainAreaHeight - 40
+    }
+  },
+  mounted() {
+    this.getRoleList()
+  },
+  methods: {
+    getRoleList() {
+      API_Auth.getRoleList(-1).then(res => {
+        this.tableData = [...res]
+        this.$nextTick(() => {
+          if (this.role_id === 0) { // 初始加载角色列表
+            this.$refs.roleTable.setCurrentRow(this.tableData[0])
+            this.role_id = this.tableData[0].role_id
+          } else {
+            const index = this.tableData.findIndex(p => p.role_id === this.role_id)
+            this.$refs.roleTable.setCurrentRow(this.tableData[index])
+          }
+        })
+      })
+    },
+    /**
+       * 单击角色项
+       * @param row
+       */
+    rowClick(row) {
+      this.role_id = row.role_id
+    }
+  }
+}
+</script>
+
+<style type="text/scss" lang="scss" scoped>
+    .permission-container {
+        padding: 10px;
+        background-color: #fff;
+    }
+    .el-aside{
+        padding: 8px 10px;
+    }
+    .level_1 {
+        padding: 15px 0;
+        border-bottom: 1px dashed #e7e7e7;
+        &:last-child{ border-bottom: none }
+    }
+    ::v-deep {
+        .el-form-item__label {
+            padding-top: 15px;
+        }
+        .el-form-item__content {
+            border-left: 1px solid #e7e7e7;
+            padding-left: 20px;
+            padding-top: 15px;
+            .el-form-item__error {
+                padding-left: 20px;
+            }
+        }
+        .el-form-item:last-child {
+            .el-form-item__content {
+                padding-top: 0;
+            }
+        }
+        .el-form-item:not(:first-child) {
+            border-top: 1px solid #e7e7e7;
+            position: relative;
+            &::after {
+                content: ' ';
+                width: 1px;
+                height: 22px;
+                background-color: #e7e7e7;
+                position: absolute;
+                top: -22px;
+                left: 200px;
+            }
+        }
+        .el-button-group {
+            display: inline-block;
+            .el-button {
+                display: inline-block;
+                padding: 0;
+                border: none;
+                &:focus, &:hover {
+                    color: #606266;
+                    border-color: #fff;
+                    background-color: #fff;
+                }
+            }
+        }
+    }
+    .checkbox-dropdown {
+        display: inline-block;
+        min-width: 130px;
+        cursor: pointer;
+        .checked {
+            color: #409EFF
+        }
+    }
+</style>

+ 15 - 11
src/views/ncs-orginazition/components/AppVersionManager.vue

@@ -19,14 +19,14 @@
               <div slot="tip" class="el-upload__tip">只能上传APK文件</div>
             </el-upload>
           </el-form-item>
+          <el-form-item label="版本数字" prop="version_no">
+            <el-input v-model="formmodel.version_no" type="number" clearable :maxlength="100" placeholder="请输入版本信息" />
+          </el-form-item>
           <el-form-item label="版本信息" prop="ver_info">
-            <el-input v-model="formmodel.ver_info" clearable :maxlength="100" placeholder="请输入版本信息" />
+            <el-input v-model="formmodel.version_code" clearable :maxlength="100" placeholder="请输入版本信息" />
           </el-form-item>
           <el-form-item label="文件路径" prop="ver_filepath">
-            <el-input v-model="formmodel.ver_filepath" clearable readonly placeholder="文件路径" />
-          </el-form-item>
-          <el-form-item label="修改时间" prop="ver_datetime">
-            <el-input v-model="formmodel.ver_datetime" clearable readonly placeholder="修改时间" />
+            <el-input v-model="formmodel.app_path" clearable readonly placeholder="文件路径" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -55,13 +55,16 @@ export default {
   data() {
     return {
       formmodel: {
-        ver_filefullpath: ''
+        app_path: ''
       },
       rules: {
-        ver_info: [
+        version_no: [
+          { required: true, message: '版本数字不能为空', trigger: 'blur' }
+        ],
+        version_code: [
           { required: true, message: '版本信息不能为空', trigger: 'blur' }
         ],
-        ver_filepath: [
+        app_path: [
           { required: true, message: '请上传APK文件', trigger: 'blur' }
         ]
       },
@@ -74,7 +77,8 @@ export default {
   methods: {
     /** 上传成功后的钩子 更换图片 置空存储数组*/
     uploaded(response) {
-      this.formmodel.ver_filepath = response
+      // this.formmodel.app_path = response
+      this.$set(this.formmodel, 'app_path', response)
     },
     /** 文件上传之前的校验 */
     handleShopLogoBefore(file) {
@@ -100,8 +104,8 @@ export default {
       this.$refs['editform'].validate((valid) => {
         if (valid) {
           /** 设置app版本信息 */
-          this.formmodel.partid = this.partId
-          this.formmodel.ver_devicetype = this.deviceType
+          this.formmodel.part_id = this.partId
+          this.formmodel.device_type = this.deviceType
           API_Device.setAPPVersion(this.formmodel).then(res => {
             this.formmodel = { ...res }
             this.$message.success('保存成功!')

+ 2 - 1
src/views/ncs-orginazition/components/partInfoEdit.vue

@@ -258,7 +258,8 @@ export default {
       rules: {},
       dayStart: new Date(2020, 11, 11, 7, 0),
       nightStart: new Date(2020, 11, 11, 18, 0),
-      nurseLevel0Config: []
+      nurseLevel0Config: [],
+      parents: []
     }
   },
   async mounted() {