tangning 3 rokov pred
rodič
commit
d922482c9d

+ 31 - 10
src/main.js

@@ -1,4 +1,4 @@
-import { createApp } from 'vue';
+import { createApp ,unref} from 'vue';
 import App from './App.vue'
 import router from './router'
 import ElementPlus from 'element-plus'
@@ -10,6 +10,8 @@ const app = createApp(App);
 app.use(router)
 app.use(ElementPlus, { locale })
 app.mount('#app')
+
+
 // 挂在全局方法
 app.config.globalProperties.$power = (fun,val) =>{
     let replacelist = {
@@ -30,15 +32,34 @@ app.directive('power',{
             'organizationlist':'organization',
         }
         let routeName = router.currentRoute._value.name
-        let roleKeyList = user._value.roleKeyList
-        let rokeName =  `${replacelist[routeName] || routeName}:${binding.value}`
-        if(!roleKeyList.includes(rokeName)){
-                var klses = el.className;
-                console.log('klses',klses)
-                el.className = klses + ' disable'
-                
-                // el.onclick=null;
-            // el.parentNode&&el.parentNode.removeChild(el);
+        let {roleKeyList,roleData,info} = unref(user);
+        let item = null,type,{value} = binding,qxdj=false,rokeName=''
+        if(typeof(value)=='string'){
+            rokeName =  `${replacelist[routeName] || routeName}:${type}`
+            type = value
+        }else{
+            rokeName =  `${replacelist[routeName] || routeName}:${value.roleType}`
+            type = value.roleType
+            item = value
+            switch(roleData[rokeName]){
+                case 4://所属组织内部数据
+                    if(item.deptId != info.deptId){
+                        qxdj = true;
+                    }
+                    break;
+                case 5:
+                    if(item.creatorId != info.id){
+                        qxdj = true;
+                    }
+                    break;
+            }
+        }
+        console.log('power',roleKeyList.includes(rokeName),qxdj,rokeName)
+        var klses = el.className;
+        if((!roleKeyList.includes(rokeName))){//判断无权
+            el.className = klses + ' disable' 
+        }else if(qxdj){//判断有权查询是否权限足够
+            el.className = klses + ' disable' 
         }
     }
 })

+ 70 - 13
src/state/user.js

@@ -1,9 +1,55 @@
 import { ref, watch } from 'vue'
 import { keyViewMap } from '@/constant/view'
-// import { userperInfo } from '@/request/config'
-// import axios from 'axios'
-
-
+import { detailRole } from '@/request/config'
+import axios from 'axios'
+
+const rokrole = [
+{id:100, role:'user',menu: 'user',name: '用户管理', },
+{id:102, role:'user:add',menu: 'user',name: '新增', },
+{id:103, role:'user:edit',menu: 'user',name: '编辑', },
+{id:104, role:'user:del',menu: 'user',name: '删除', },
+{id:106, role:'user:disabled',menu: 'user',name: '启用/禁用', },
+{id:107, role:'user:pwd',menu: 'user',name: '修改密码', },
+{id:101, role:'user:view',menu: 'user',name: '查看', },
+{id:200, role:'role',menu: 'role',name: '角色管理', },
+{id:201, role:'role:view',menu: 'role',name: '查看', },
+{id:202, role:'role:add',menu: 'role',name: '新增', },
+{id:203, role:'role:edit',menu: 'role',name: '编辑', },
+{id:204, role:'role:del',menu: 'role',name: '删除', },
+{id:300, role:'organization',menu: 'organization',name: '组织架构', },
+{id:301, role:'organization:view',menu: 'organization',name: '查看', },
+{id:302, role:'organization:add',menu: 'organization',name: '新增', },
+{id:303, role:'organization:edit',menu: 'organization',name: '编辑', },
+{id:304, role:'organization:del',menu: 'organization',name: '删除', },
+{id:500, role:'vrmodel',menu: 'vrmodel',name: '场景管理', },
+{id:501, role:'vrmodel:view',menu: 'vrmodel',name: '查看', },
+{id:503, role:'vrmodel:edit',menu: 'vrmodel',name: '编辑', },
+{id:504, role:'vrmodel:del',menu: 'vrmodel',name: '删除', },
+{id:506, role:'vrmodel:sync',menu: 'vrmodel',name: '同步', },
+{id:507, role:'vrmodel:download',menu: 'vrmodel',name: '下载', },
+{id:600, role:'camera',menu: 'camera',name: '相机管理', },
+{id:601, role:'camera:view',menu: 'camera',name: '查看', },
+{id:606, role:'camera:bind',menu: 'camera',name: '绑定', },
+{id:607, role:'camera:unbind',menu: 'camera',name: '解绑', },
+{id:700, role:'dispatch',menu: 'dispatch',name: '火调项目', },
+{id:701, role:'dispatch:view',menu: 'dispatch',name: '查看', },
+{id:702, role:'dispatch:add',menu: 'dispatch',name: '新增', },
+{id:703, role:'dispatch:edit',menu: 'dispatch',name: '编辑', },
+{id:704, role:'dispatch:del',menu: 'dispatch',name: '删除', },
+{id:706, role:'dispatch:vrmodel:look',menu: 'dispatch',name: '查看场景', },
+{id:707, role:'dispatch:vrmodel:look',menu: 'dispatch',name: '带看', },
+{id:708, role:'dispatch:doc:look',menu: 'dispatch',name: '档案查看', },
+{id:709, role:'dispatch:doc:upload',menu: 'dispatch',name: '档案管理', },
+{id:710, role:'dispatch:teach',menu: 'dispatch',name: '设置教学项目', },
+{id:711, role:'dispatch:share',menu: 'dispatch',name: '分享', },
+{id:800, role:'teaching',menu: 'teaching',name: '教学平台', },
+{id:801, role:'teaching:view',menu: 'teaching',name: '查看', },
+{id:806, role:'teaching:doc:look',menu: 'teaching',name: '查看档案', },
+{id:807, role:'teaching:vrmodel:look',menu: 'teaching',name: '查看场景', },
+{id:808, role:'teaching:message:add',menu: 'teaching',name: '发表留言', },
+{id:809, role:'teaching:cancel',menu: 'teaching',name: '撤销教学', },
+{id:810, role:'teaching:message:look',menu: 'teaching',name: '查看留言',},
+]
 const strToJson = (str, def) => {
   try {
     str = JSON.parse(str)
@@ -18,17 +64,21 @@ const user = ref({
   info: strToJson(localStorage.getItem('info'), {}),
   permission: strToJson(localStorage.getItem('permission'), []),
   roleKeyList:strToJson(localStorage.getItem('roleKeyList'), []),
-  roleKey: localStorage.getItem('roleKey'),
+  roleData: strToJson(sessionStorage.getItem('roleData'), {}),
+  roleLevel:sessionStorage.getItem('roleLevel')
   
 })
-
+watch(
+  () => user.value.roleLevel,
+  () => sessionStorage.setItem('roleLevel', user.value.roleLevel)
+)
 watch(
   () => user.value.token,
   () => localStorage.setItem('token', user.value.token)
 )
 watch(
-  () => user.value.roleKey,
-  () => localStorage.setItem('roleKey', user.value.roleKey)
+  () => user.value.roleData,
+  () => sessionStorage.setItem('roleData', JSON.stringify(user.value.roleData))
 )
 
 watch(
@@ -49,8 +99,7 @@ watch(
 export const setPermission = async (val,permissions) => {
   let power = []
   if (val !== void 0){
-    power = permissions&&permissions.map(element => element.replace('dept','organization').replace('scene','vrmodel'));
-    console.log('power',power,'permissions',permissions);
+    power = permissions&&permissions.map(element => element.replace('dept','organization').replace('scene','vrmodel') );
     let pubPermission = ['home', 'vrmodel', 'camera', 'teaching', 'dispatch','role','organization'].map(key => ({
       children: [
         { resourceKey: key + ':select' },
@@ -132,9 +181,17 @@ export const setInfoPermission = val => {
 export const setInfo = val => {
   user.value.info = val
 }
-
-export const setRoleKey = val => {
-  user.value.roleKey = val
+export const setRoleLevel = val => {
+  user.value.roleLevel = val
+}
+export const setRoleKey = async val => {
+    let {data} = await axios.get(detailRole+val.id, {roleId:val.id});
+    let roleData = {}
+    data&&data.perm.map(ele => {
+      let {role} = rokrole.find(item => item.id == ele.permissionId)
+      roleData[role] = Number(ele.dataScope)
+    })
+    user.value.roleData = roleData
 }
 
 export default user

+ 1 - 1
src/view/camera/index.vue

@@ -52,7 +52,7 @@
       <!-- <el-table-column label="到期时间" prop="activatedTime"></el-table-column> -->
       <el-table-column label="操作" v-slot:default="{ row }" v-if="auth.unbind || auth.update">
         <!-- <span class="oper-span" @click="oper.readyUpdate(row)" v-if="auth.update">编辑</span> -->
-        <span class="oper-span" @click="unbindCamrea(row)" v-power="'unbind'" style="color: var(--primaryColor)">
+        <span class="oper-span" @click="unbindCamrea(row)" v-power="{...row,roleType:'unbind'}" style="color: var(--primaryColor)">
          解绑
         </span>
       </el-table-column>

+ 15 - 11
src/view/dispatch/index.vue

@@ -58,7 +58,7 @@
           <el-button type="primary" @click="revokeTeaching()" :disabled="getRoke('cancel') && !dataList.selectRows.length" v-power="'cancel'">撤销教学</el-button>
         </template>
         <template v-else>
-          <el-button type="primary" @click="insertProject" :disabled="getRoke('add')" v-if="user.roleKey!=='admin'" v-power="'add'">新增火调项目</el-button>
+          <el-button type="primary" @click="insertProject" :disabled="getRoke('add')"  v-power="'add'">新增火调项目</el-button>
           <!-- :disabled="!dataList.selectRows.length" -->
           <el-button type="primary" @click="setTeaching" :disabled="getRoke('teach')"  v-power="'teach'" >设为教学项目</el-button>
         </template>
@@ -73,7 +73,7 @@
       class="table"
       @selection-change="dataList.changeSelectRows"
     >
-      <el-table-column type="selection" width="50"></el-table-column>
+      <el-table-column type="selection" width="50" :selectable="checkSelectable"></el-table-column>
       <el-table-column label="序号" width="50" v-slot:default="{ $index }">
         <div style="text-align: center">{{ pag.state.size * (pag.state.currPage - 1) + $index + 1 }}</div>
       </el-table-column>
@@ -108,22 +108,22 @@
         撤销 click=" user.roleKey === ADMIN_USER_ID && “  :class="{disable: user.roleKey !== ADMIN_USER_ID}" 分享 :class="{disable: !row.sceneNum}" 
         -->
       <el-table-column label="操作" v-slot:default="{ row }" :width="isTeaching ? 280 : 320">
-        <span class="oper-span" @click="queryDetail(row)"  v-power="'view'">详情</span>
-        <span class="oper-span" @click="archivesHandle(row)" v-power="'doc:look'" >档案</span>
+        <span class="oper-span" @click="queryDetail(row)"  v-power="{...row,roleType:'view'}">详情</span>
+        <span class="oper-span" @click="archivesHandle(row)" v-power="{...row,roleType:'doc:look'}" >档案</span>
         <!-- <span class="oper-span" @click="queryScene(row)" v-power="'readFile'" >场景</span> :class="{disable: !row.sceneNum}"-->
-        <span class="oper-span" v-power="'vrmodel:look'"  v-if="!isTeaching" @click="takeLook(row)">带看</span>
+        <span class="oper-span" v-power="{...row,roleType:'vrmodel:look'}"  v-if="!isTeaching" @click="takeLook(row)">带看</span>
         <template v-if="isTeaching">
-          <span class="oper-span" v-power="'message:look'" @click="leaveMsgHandle(row)">留言</span>
-          <span class="oper-span" v-power="'cancel'" @click="revokeTeaching(row)" style="color: var(--primaryColor)">撤销</span>
+          <span class="oper-span" v-power="{...row,roleType:'message:look'}" @click="leaveMsgHandle(row)">留言</span>
+          <span class="oper-span" v-power="{...row,roleType:'cancel'}" @click="revokeTeaching(row)" style="color: var(--primaryColor)">撤销</span>
         </template>
         <!-- -if="user.info.id == row.creatorId || user.roleKey == 'admin-dept'" -->
         <template v-else>
-          <span class="oper-span" v-power="'share'" @click="shareHandle(row)">分享</span>
-          <span class="oper-span" v-power="'edit'" @click="auth.update && user.info.deptId == row.deptId && editInfo(row)" :class="{disable: !(auth.update && user.info.deptId == row.deptId)}">编辑</span>
+          <span class="oper-span" v-power="{...row,roleType:'share'}" @click="shareHandle(row)">分享</span>
+          <span class="oper-span" v-power="{...row,roleType:'edit'}" @click="auth.update && user.info.deptId == row.deptId && editInfo(row)" :class="{disable: !(auth.update && user.info.deptId == row.deptId)}">编辑</span>
           <span class="oper-span" 
             @click="auth.delete && user.info.deptId == row.deptId && dataList.delete(row)" 
             :class="{disable: !(auth.delete && user.info.deptId == row.deptId)}"
-            v-power="'del'"
+            v-power="{...row,roleType:'del'}"
             style="color: var(--primaryColor)">
           删除
           </span>
@@ -417,6 +417,9 @@ export default {
     });
     const types = ref([{ name: "我的相机", value: 2 }])
     const time = ref(null)
+    const checkSelectable = (row) => {
+      console.log('row',row)
+    }
     const showArchives = ref({show: false, data: 0})
     const showLeaveMsg = ref({show: false, data: 0})
     const share = ref({show: false, data: {randCode: ''} })
@@ -507,7 +510,8 @@ export default {
       showArchives, showLeaveMsg, sfireReason, 
       sprojectSite, share, fireReason, ADMIN_USER_ID,
       projectSite, place: PLACE, reason: REASON, queryAccidentDate,
-      detail, __init: {...state.search.value.state}
+      detail, __init: {...state.search.value.state},
+      checkSelectable
     };
   },
   data() {

+ 5 - 4
src/view/layout/top/index.vue

@@ -69,7 +69,7 @@ import comDialog from "@/components/dialog";
 import axios from 'axios';
 import { updatePsw,getUserInfo,userLogout } from '@/request/config'
 import { sendUserMsg } from '@/request/config'
-import {  setInfo,setInfoPermission,setToken,setRoleKey } from '@/state/user'
+import {  setInfo,setInfoPermission,setToken,setRoleKey,setRoleLevel } from '@/state/user'
 import { computed, ref, reactive, watch } from 'vue'
 import user from '@/state/user'
 import {PSW} from '@/constant/REG'
@@ -93,8 +93,9 @@ export default {
     async getInfo(){
       let res =  await axios.get(getUserInfo)
       setInfo({...res.data.user,cameraSns:res.data.cameraSns})
-      setRoleKey(res.data.roles[0].roleKey)
-      sessionStorage.setItem('roleLevel',res.data.roleLevel)
+      setRoleKey(res.data.roles[0])
+      setRoleLevel(res.data.roleLevel)
+      // setPermission(res.data.roles[0].roleKey,res.data.permissions)
       setInfoPermission(res.data.permissionsList || [])
       console.log('res',res)
     },
@@ -125,7 +126,7 @@ export default {
     async _loginout() {
       await axios.post(userLogout)
       setToken(null)
-      setRoleKey('')
+      setRoleKey({})
       // setPermission()
       setInfo({})
       this.$router.replace({name: 'login'})

+ 3 - 3
src/view/organization/list.vue

@@ -25,12 +25,12 @@
               <span class="custom-tree-node">
                 <span>{{ data.name }}</span>
                 <div class="butList oper-span"  v-if="data.id != '1'">
-                  <a @click.stop="seeDetail(data, node)" v-power="'view'"> 查看 </a>
-                  <a @click.stop="insertProject(data)" :class="{disable: user.info.deptId === data.id}"  v-power="'edit'"> 编辑 </a>
+                  <a @click.stop="seeDetail(data, node)" v-power="{...data,roleType:'view'}"> 查看 </a>
+                  <a @click.stop="insertProject(data)" :class="{disable: user.info.deptId === data.id}" v-power="{...data,roleType:'edit'}"> 编辑 </a>
                   <a :class="{disable: user.info.deptId === data.id}"
                     style="color: var(--primaryColor)"
                     @click.stop="remove(data.id)"
-                    v-power="'del'"
+                    v-power="{...data,roleType:'del'}"
                   >
                     删除
                   </a>

+ 3 - 5
src/view/role/index.vue

@@ -48,11 +48,10 @@
         <el-table-column label="操作" v-slot:default="{ row }">
           <!-- v-if="auth.update || auth.updatePwd || auth.delete"  v-if="auth.update"-->
           <!-- row.roleKey == roleKey[user.roleKey] -->
-          <template v-if="user.roleKey !== 'admin-ordinary'">
-            <span class="oper-span" @click="()=>{newAddclick(row.id,'查看')}" v-power="'view'"
+            <span class="oper-span" @click="()=>{newAddclick(row.id,'查看')}" v-power="{...row,roleType:'view'}"
               >查看</span
             >
-            <span class="oper-span" :class="{disable:editDisable(row)}" @click="()=>{newAddclick(row.id,'编辑')}" v-power="'edit'"
+            <span class="oper-span" :class="{disable:editDisable(row)}" @click="()=>{newAddclick(row.id,'编辑')}" v-power="{...row,roleType:'edit'}" 
               >编辑</span
             >
             <!-- v-if="auth.delete" -->
@@ -61,10 +60,9 @@
               style="color: var(--primaryColor)"
               @click="delInfo(row)"
               :class="{disable:row.type == 0}"
-              v-power="'del'"
+              v-power="{...row,roleType:'del'}"
               >删除</span
             >
-          </template>
         </el-table-column>
       </el-table>
       <com-pagination

+ 2 - 2
src/view/system/login.vue

@@ -124,7 +124,7 @@ export default {
 
         if (!res.data.roles.length) {
           setToken('')
-          setRoleKey('')
+          setRoleKey({})
           setPermission([])
           setInfo({})
           openErrorMsg('当前账号无权限,请联系总队管理员处理。', '提示')
@@ -133,7 +133,7 @@ export default {
           console.log('info', res.data.permissions)
           setInfo(res.data.user)
           setToken(res.data.token)
-          setRoleKey(res.data.roles[0].roleKey)
+          setRoleKey(res.data.roles[0])
           setPermission(res.data.roles[0].roleKey,res.data.permissions)
           this.$router.replace({ name: 'home' })
         }

+ 5 - 5
src/view/teaching/index.vue

@@ -58,11 +58,11 @@
       <el-table-column label="火灾原因" prop="sceneCount"></el-table-column>
       <el-table-column label="项目状态" prop="sceneCount"></el-table-column>
       <el-table-column label="操作" v-slot:default="{ row }" width="250">
-        <span class="oper-span" @click="oper.readyUpdate(row)" v-power="'view'">详情</span>
-        <span class="oper-span" @click="archivesHandle(row)" v-power="'readFile'">档案</span>
-        <span class="oper-span" @click="queryScene(row)">场景</span>
-        <span class="oper-span disable" @click="leaveMsgHandle(row)">留言</span>
-        <span class="oper-span" 
+        <span class="oper-span" @click="oper.readyUpdate(row)" v-power="{...row,roleType:'view'}">详情</span>
+        <span class="oper-span" @click="archivesHandle(row)" v-power="{...row,roleType:'readFile'}">档案</span>
+        <span class="oper-span" v-power="{...row,roleType:'vrmodel:look'}" @click="queryScene(row)">场景</span>
+        <span class="oper-span disable" v-power="{...row,roleType:'message:add'}" @click="leaveMsgHandle(row)">留言</span>
+        <span class="oper-span"  v-power="{...row,roleType:'teaching:cancel'}"
           @click="revokeTeaching(row)" 
           style="color: var(--primaryColor)">
          撤销

+ 6 - 11
src/view/user/index.vue

@@ -61,24 +61,19 @@
           label="操作"
           v-slot:default="{ row }"
         >
-          <!-- v-if="auth.update || auth.updatePwd || auth.delete"  v-if="auth.update"-->
-           <!-- row.roleKey == roleKey[user.roleKey] -->
-          <template v-if="user.roleKey !== 'admin-ordinary'">
+          <template v-if="user.roleLevel !== '5'">
             <span class="oper-span" @click="updateInfo(row)" 
-            v-power="'edit'">编辑</span
-            >
-              <!-- v-if="auth.delete" -->
+            v-power="{...row,roleType:'edit'}" >编辑</span >
             <span
               class="oper-span"
-              v-power="'disabled'"
+              v-power="{...row,roleType:'disabled'}"
               @click="changeUserStatus(row)"
               :class="{disable:user.info.id == row.id}"
               style="color: var(--primaryColor)"
             >
               {{ row.status ? "禁用" : "启用" }}
             </span>
-            
-            <span  :class="user.info.id == row.id?'disable oper-span':'oper-span'"  style="color: var(--primaryColor)" @click="delInfo(row)"  v-power="'del'">删除</span
+            <span  :class="user.info.id == row.id?'disable oper-span':'oper-span'"  style="color: var(--primaryColor)" @click="delInfo(row)" v-power="{...row,roleType:'del'}">删除</span
             >
           </template>
         </el-table-column>
@@ -107,7 +102,7 @@
             maxlength="30"
           ></el-input>
         </el-form-item>
-        <el-form-item label="所属架构" class="mandatory" v-if="user.roleKey !== 'admin-ordinary'">
+        <el-form-item label="所属架构" class="mandatory" v-if="user.roleLevel !== '5'">
           <el-cascader
             style="width: 100%"
             :disabled="editData.tips"
@@ -141,7 +136,7 @@
             placeholder="请输入"
           ></el-input>
         </el-form-item>
-        <el-form-item label="所属架构" class="mandatory" v-if="user.roleKey !== 'admin-ordinary'">
+        <el-form-item label="所属架构" class="mandatory" v-if="user.roleLevel !== '5'">
           <el-cascader
             style="width: 100%"
             v-model="newData.deptIdList"

+ 5 - 5
src/view/vrmodel/index.vue

@@ -24,7 +24,7 @@
     <div class="body-head">
       <h3 style="visibility: hidden;">场景管理</h3>
       <div class="table-ctrl-right">
-        <el-button type="primary" v-power="'sync'" :disabled="getRoke('sync')"  @click="asynccj">同步场景</el-button>
+        <el-button type="primary"  v-power="'sync'" :disabled="getRoke('sync')"  @click="asynccj">同步场景</el-button>
       </div>
     </div>
 
@@ -51,10 +51,10 @@
         {{ row.createTime.substr(0, 11) }}</el-table-column
       >
       <el-table-column label="操作" v-slot:default="{ row }">
-        <span class="oper-span" v-power="'view'" @click="shareHandle(row)">查看</span>
-        <span class="oper-span" :class="{disable:!(butisShow && user.info.id == row.creatorId)}" v-power="'edit'" @click="editModel(row)">编辑</span>
-        <span class="oper-span" @click="download(row)" v-if="row.num" >下载</span>
-        <span :class="!((butisShow)&&~user.info.cameraSns.indexOf(row.snCode))?'disable oper-span':'oper-span'" v-power="'del'" @click="dataList.delete(row)" style="color: var(--primaryColor)"  >删除</span
+        <span class="oper-span"  v-power="{...row,roleType:'view'}" @click="shareHandle(row)">查看</span>
+        <span class="oper-span"  v-power="{...row,roleType:'edit'}" @click="editModel(row)">编辑</span>
+        <span class="oper-span" v-power="{...row,roleType:'download'}" @click="download(row)" v-if="row.num" >下载</span>
+        <span :class="!((butisShow)&&~user.info.cameraSns.indexOf(row.snCode))?'disable oper-span':'oper-span'" v-power="{...row,roleType:'del'}" @click="dataList.delete(row)" style="color: var(--primaryColor)"  >删除</span
         >
       </el-table-column>
     </el-table>

+ 2 - 2
vue.config.js

@@ -19,8 +19,8 @@ module.exports = {
     // 设置代理proxy
     proxy: {
       '/__api': {
-        target: 'http://192.168.0.135:8585/',
-        // target: 'https://testxfhd.4dkankan.com',
+        // target: 'http://192.168.0.135:8585/',
+        target: 'https://testxfhd.4dkankan.com',
         // target: 'https://testhuodiao.4dkankan.com/',
         changeOrigin: true,  
         pathRewrite: {