浏览代码

补充ETA指标库的权限

cxmo 1 年之前
父节点
当前提交
990c3d61bf

+ 1 - 1
src/directives/AuthBtn.js

@@ -1,6 +1,6 @@
 //按钮权限指令
 //eg: v-permission="buttonCode"
-//元素必须在组件内存在父元素,否则不起作用
+//元素必须在组件内存在父元素,否则el.parentNode.removeChild不起作用
 import {useAuthBtnStore} from '@/store/modules/authBtn'
 export default {
     mounted(el, binding) {

+ 27 - 1
src/hooks/useAuthBtn.js

@@ -54,7 +54,33 @@ export const enPPTBtn={
 /*
 --------------------------ETA指标库---------------
 */
-export const edbDataBtn={}
+export const edbDataBtn={
+        /*-----------指标详情按钮--------- */
+        edbData_refreshAll:'edbData:refreshAll',//全部刷新
+        edbData_newestValue:'edbData:newestValue',//添加最新值
+        edbData_enNameSetting:'edbData:enNameSetting',//设置英文名称
+        edbData_edbSource:'edbData:edbSource',//指标溯源
+        edbData_copyData:'edbData:copyData',//复制数据
+        edbData_edit:'edbData:edit',//指标编辑,也包括列表项的编辑按钮
+        edbData_update:'edbData:update',//更新指标
+        edbData_saveEdb:'edbData:saveEdb',//保存
+        edbData_deleteEdb:'edbData:deleteEdb',//删除
+        edbData_showChartBasis:'edbData:showChartBasis',//展示/隐藏同比图
+        edbData_switchSeason:'edbData:switchSeason',//切换季节性图
+        edbData_editLimit:'edbData:editLimit',//编辑上下限
+        edbData_calculateAgain:'edbData:calculateAgain',//重新计算
+        /*------------页面按钮---------- */
+        edbData_replaceEdb:'edbData:replaceEdb',//替换指标
+        edbData_calcuEdb:'edbData:calcuEdb',//计算指标
+        edbData_addEdb:'edbData:addEdb',//添加指标
+        edbData_switchEn:'edbData:switchEn',//切换英文版
+        edbData_classifyOpt_add:'edbData:classifyOpt:add',//添加/编辑分类
+        edbData_classifyOpt_delete:'edbData:classifyOpt:delete',//删除分类
+        edbData_classifyOpt_move:'edbData:classifyOpt:move',//移动分类
+        edbData_checkRelatedChart:'edbData:checkRelatedChart',//查看关联图表
+        edbData_checkRelatedEdb:'edbData:checkRelatedEdb',//查看关联指标
+        edbData_checkCalcChart:'edbData:checkCalcChart',//查看计算指标
+}
 
 /*
 -------------------------ETA图库------------------

+ 27 - 12
src/views/dataEDB/Detail.vue

@@ -14,6 +14,8 @@ import {useCopyEdbData} from '@/hooks/edb/useCopyEdbData'
 import {useEDBDelete} from './hooks/useEDBDelete'
 import {useCachedViewsStore} from '@/store/modules/cachedViews'
 import { useWindowSize } from '@vueuse/core'
+import {edbDataBtn,useAuthBtn} from '@/hooks/useAuthBtn'
+const {checkAuthBtn} = useAuthBtn()
 
 const { width } = useWindowSize()
 const cachedViewsStore=useCachedViewsStore()
@@ -178,6 +180,15 @@ async function handleCalculateReset(){
 function handleSave(){
     chartDetailIns?.value.handleSaveChartLimit()
 }
+function isMoreOptShow(){
+    return checkAuthBtn(edbDataBtn.edbData_enNameSetting)
+        || (edbInfo.value.Button.InsertNewDataButton&&checkAuthBtn(edbDataBtn.edbData_newestValue))
+        || (edbInfo.value.EdbType===1&&checkAuthBtn(edbDataBtn.edbData_refreshAll))
+        || (edbInfo.value.EdbType===2&&checkAuthBtn(edbDataBtn.edbData_edbSource))
+        || (edbInfo.value.EdbType===2&&checkAuthBtn(edbDataBtn.edbData_calculateAgain))
+        || (activeType.value==='chart'&&checkAuthBtn(edbDataBtn.edbData_saveEdb))
+        || checkAuthBtn(edbDataBtn.edbData_deleteEdb)
+}
 
 </script>
 
@@ -203,23 +214,23 @@ function handleSave(){
             </van-tab>
         </van-tabs>
         <div class="fix-bottom-box">
-            <div class="item" @click="handleRefreshEDBInfo">
+            <div class="item" @click="handleRefreshEDBInfo" v-permission="edbDataBtn.edbData_update">
                 <img class="icon" src="@/assets/imgs/report/icon_refresh.png" alt="">
                 <span>刷新</span>
             </div>
-            <div class="item" v-if="edbInfo.Button.OpButton" @click="handleEdit">
+            <div class="item" v-if="edbInfo.Button.OpButton&&checkAuthBtn(edbDataBtn.edbData_edit)" @click="handleEdit">
                 <img class="icon" src="@/assets/imgs/dataEDB/icon_edit.png" alt="">
                 <span>编辑</span>
             </div>
-            <div class="item" v-if="activeType==='chart'" @click="handleShowLimit">
+            <div class="item" v-if="activeType==='chart'&&checkAuthBtn(edbDataBtn.edbData_editLimit)" @click="handleShowLimit">
                 <img class="icon" src="@/assets/imgs/myETA/icon_limit.png" alt="">
                 <div>上下限</div>
             </div>
-            <div class="item" v-if="activeType==='data'" @click="handleCopyData">
+            <div class="item" v-if="activeType==='data'&&checkAuthBtn(edbDataBtn.edbData_copyData)" @click="handleCopyData">
                 <img class="icon" src="@/assets/imgs/myETA/icon_copy.png" alt="">
                 <div>复制</div>
             </div>
-            <div class="item" @click="showMoreOpt=true">
+            <div class="item" @click="showMoreOpt=true" v-if="isMoreOptShow()">
                 <img class="icon" src="@/assets/imgs/myETA/icon_menu.png" alt="">
                 <div>更多</div>
             </div>
@@ -244,16 +255,20 @@ function handleSave(){
             <ul class="edb-opt-list">
                 <li class="van-ellipsis item name">{{edbInfo.EdbName}}</li>
 
-                <li class="item" @click="showSetEn=true">设置英文名称</li>
                 <li class="item" 
-                    v-if="edbInfo.Button.InsertNewDataButton"
+                    v-if="checkAuthBtn(edbDataBtn.edbData_enNameSetting)"
+                    @click="showSetEn=true">设置英文名称</li>
+                <li class="item" 
+                    v-if="edbInfo.Button.InsertNewDataButton&&checkAuthBtn(edbDataBtn.edbData_newestValue)"
                     @click="showSetNewData=true"
                 >{{edbInfo.DataInsertConfig.Date?'编辑最新值':'添加最新值'}}</li>
-                <li class="item" v-if="edbInfo.EdbType===1" @click="handleRefreshBaseEDBData">全部刷新</li>
-                <li class="item" v-if="edbInfo.EdbType===2" @click="showEDBHistory=true">指标溯源</li>
-                <li class="item" v-if="edbInfo.EdbType===2" @click="handleCalculateReset">重新计算</li>  
-                <li class="item" v-if="activeType==='chart'" @click="handleSave">保存</li>
-                <li class="item color-red" @click="handleEDBDelete">删除</li>
+                <li class="item" v-if="edbInfo.EdbType===1&&checkAuthBtn(edbDataBtn.edbData_refreshAll)" @click="handleRefreshBaseEDBData">全部刷新</li>
+                <li class="item" v-if="edbInfo.EdbType===2&&checkAuthBtn(edbDataBtn.edbData_edbSource)" @click="showEDBHistory=true">指标溯源</li>
+                <li class="item" v-if="edbInfo.EdbType===2&&checkAuthBtn(edbDataBtn.edbData_calculateAgain)" @click="handleCalculateReset">重新计算</li>  
+                <li class="item" v-if="activeType==='chart'&&checkAuthBtn(edbDataBtn.edbData_saveEdb)" @click="handleSave">保存</li>
+                <li class="item color-red" 
+                    v-if="checkAuthBtn(edbDataBtn.edbData_deleteEdb)"
+                    @click="handleEDBDelete">删除</li>
             </ul>
         </template>
     </van-action-sheet>

+ 50 - 20
src/views/dataEDB/Index.vue

@@ -1,5 +1,5 @@
 <script setup name="DataEDBIndex">
-import {reactive,ref, watch} from 'vue'
+import {computed, reactive,ref, watch} from 'vue'
 import apiDataEDB from '@/api/dataEDB'
 import {apiCommonSetSysConfig,apiGetLanguageConfig} from '@/api/common'
 import EDBClassify from './components/EDBClassify.vue'
@@ -8,6 +8,8 @@ import {useRouter} from 'vue-router'
 import {useCachedViewsStore} from '@/store/modules/cachedViews'
 import langIconZH from '@/assets/imgs/chartETA/lang-icon.png'
 import langIconEN from '@/assets/imgs/chartETA/langEn-icon.png'
+import {edbDataBtn,useAuthBtn} from '@/hooks/useAuthBtn'
+const {checkAuthBtn} = useAuthBtn()
 
 const cachedViewsStore=useCachedViewsStore()
 const router=useRouter()
@@ -36,6 +38,29 @@ async function langTypeChange(){
     }
 }
 
+//根据权限决定actions
+const actions = computed(()=>{
+    let actionArr = []
+    if(checkAuthBtn(edbDataBtn.edbData_addEdb)){
+        actionArr.push({
+            name:'添加指标',
+            path:'/dataEDB/addbaseEDB'
+        })
+    }
+    if(checkAuthBtn(edbDataBtn.edbData_calcuEdb)){
+        actionArr.push({
+            name:'计算指标',
+            path:'/dataEDB/calculate/index'
+        })
+    }
+    if(checkAuthBtn(edbDataBtn.edbData_replaceEdb)){
+        actionArr.push({
+                name:'替换指标',
+                path:'/dataEDB/replaceEDB'
+            })
+    }
+    return actionArr
+})
 
 const listState = reactive({
     list:[],
@@ -129,6 +154,23 @@ watch(
         }
     }
 )
+//图表option check
+function checkOption(item){
+    let optionArr = []
+    if(seeComputeEDBInfo(item)&&checkAuthBtn(edbDataBtn.edbData_checkCalcChart)){
+        optionArr.push('查看')
+    }
+    if(item.Button.ShowEdbRelation&&checkAuthBtn(edbDataBtn.edbData_checkRelatedEdb)){
+        optionArr.push('关联指标')
+    }
+    if(item.Button.ShowChartRelation&&checkAuthBtn(edbDataBtn.edbData_checkRelatedChart)){
+        optionArr.push('关联图表')
+    }
+    if(item.Button.MoveButton){
+        optionArr.push('移动至')
+    }
+    return optionArr.length
+}
 function handleShowEdbOpt(item){
     edbOptState.data=item
 
@@ -251,7 +293,7 @@ async function goSearch(){
                     style="flex:1;padding-left:0"
                     @click-input="goSearch"
                 />
-                <div class="lang-icon icon">
+                <div class="lang-icon icon" v-permission="edbDataBtn.edbData_switchEn">
                     <img :src="langType==='zh'?langIconZH:langIconEN" alt="" @click="langTypeChange">
                 </div>
             </div>
@@ -288,6 +330,7 @@ async function goSearch(){
                                 height="28" 
                                 viewBox="0 0 28 28" 
                                 fill="none"
+                                v-if="checkOption(item)"
                                 @click.stop="handleShowEdbOpt(item)"
                             >
                                 <rect width="28" height="28" rx="4" :fill="item.EdbInfoId===edbOptState.data?.EdbInfoId?'#0052D9':'none'"/>
@@ -302,7 +345,7 @@ async function goSearch(){
     </div>
 
     <!-- 悬浮操作按钮 -->
-    <div class="fixed-opt-btn" @click="showActionPop=true">
+    <div class="fixed-opt-btn" @click="showActionPop=true" v-if="actions.length">
         <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
             <path fill-rule="evenodd" clip-rule="evenodd" d="M43.4855 12.7505L25.4062 2.31235C24.536 1.80995 23.4639 1.80995 22.5937 2.31235L4.5144 12.7505V33.6267C4.5144 34.6315 5.05046 35.5599 5.92065 36.0623L24 46.5005L42.0793 36.0623C42.9495 35.5599 43.4855 34.6315 43.4855 33.6267V12.7505ZM23.997 22.2665L9.01233 13.6153L24 4.96245L38.9859 13.6158L23.997 22.2665ZM25.5 24.8665L40.485 16.2149V33.5165L25.5 42.1666V24.8665ZM22.5 24.8665V42.1667L7.51198 33.5165V16.2132L22.5 24.8665Z" fill="white"/>
         </svg>
@@ -314,20 +357,7 @@ async function goSearch(){
         v-model:show="showActionPop"
         cancel-text="取消"
         close-on-click-action
-        :actions="[
-            {
-                name:'添加指标',
-                path:'/dataEDB/addbaseEDB'
-            },
-            {
-                name:'计算指标',
-                path:'/dataEDB/calculate/index'
-            },
-            {
-                name:'替换指标',
-                path:'/dataEDB/replaceEDB'
-            }
-        ]"
+        :actions="actions"
         @select="handleSelectActionOpt"
     >
     </van-action-sheet>
@@ -345,9 +375,9 @@ async function goSearch(){
         <template #default>
             <ul class="edb-opt-list">
                 <!-- 计算指标查看 -->
-                <li class="item" v-if="seeComputeEDBInfo(edbOptState.data)" @click="handleEDBOpt('see',edbOptState.data)">查看</li>
-                <li class="item" v-if="edbOptState.data?.Button.ShowEdbRelation" @click="handleEDBOpt('relationEDB',edbOptState.data)">关联指标</li>
-                <li class="item" v-if="edbOptState.data?.Button.ShowChartRelation" @click="handleEDBOpt('relationChart',edbOptState.data)">关联图表</li>
+                <li class="item" v-if="seeComputeEDBInfo(edbOptState.data)&&checkAuthBtn(edbDataBtn.edbData_checkCalcChart)" @click="handleEDBOpt('see',edbOptState.data)">查看</li>
+                <li class="item" v-if="edbOptState.data?.Button.ShowEdbRelation&&checkAuthBtn(edbDataBtn.edbData_checkRelatedEdb)" @click="handleEDBOpt('relationEDB',edbOptState.data)">关联指标</li>
+                <li class="item" v-if="edbOptState.data?.Button.ShowChartRelation&&checkAuthBtn(edbDataBtn.edbData_checkRelatedChart)" @click="handleEDBOpt('relationChart',edbOptState.data)">关联图表</li>
                 <li class="item" v-if="edbOptState.data?.Button.MoveButton" @click="handleEDBOpt('move',edbOptState.data)">移动至</li>
             </ul>
         </template>

+ 12 - 10
src/views/dataEDB/components/EDBChartDetail.vue

@@ -15,6 +15,9 @@ Boost(Highcharts)
 import { useRoute } from 'vue-router'
 import { showToast } from 'vant'
 
+import {edbDataBtn,useAuthBtn} from '@/hooks/useAuthBtn'
+const {checkAuthBtn} = useAuthBtn()
+
 const { width } = useWindowSize()
 const route=useRoute()
 
@@ -466,17 +469,16 @@ onMounted(() => {
 
 
 // 图表类型
-const chartTypeOpts=[
-    {
-        name:'曲线图'
-    },
-    {
-        name:'同比图'
-    },
-    {
-        name:'季节性图'
+const chartTypeOpts = computed(()=>{
+    let optionArr=[{name:'曲线图'}]
+    if(checkAuthBtn(edbDataBtn.edbData_showChartBasis)){
+        optionArr.push({name:'同比图'})
     }
-]
+    if(checkAuthBtn(edbDataBtn.edbData_switchSeason)){
+        optionArr.push({name:'季节性图'})
+    }
+    return optionArr
+})
 let beforeChartType='曲线图'
 const chartType=ref('曲线图')
 const showChartType=ref(false)

+ 31 - 7
src/views/dataEDB/components/EDBClassify.vue

@@ -5,6 +5,8 @@ import apiDataEDB from '@/api/dataEDB'
 import { showDialog , showToast } from 'vant';
 import {useEDBDelete} from '../hooks/useEDBDelete'
 import {deleteClassifyItemEmpty} from '../util/util'
+import {edbDataBtn,useAuthBtn} from '@/hooks/useAuthBtn'
+const {checkAuthBtn} = useAuthBtn()
 
 const {edbClassifyDelete}=useEDBDelete()
 const { width } = useWindowSize()
@@ -108,7 +110,7 @@ function getClassifyItemName(item){
     return langType.value==='zh'?item.ClassifyName:item.ClassifyNameEn||item.ClassifyName
 }
 
-// 获取分类数据
+// 获取分类数据classifyState
 let classifyList=ref([])
 async function getEDBClassifyList(){
     const res=await apiDataEDB.edbClassifyList()
@@ -185,6 +187,23 @@ watch(
         }
     }
 )
+//判断每一项的optArr并返回长度
+function checkOpt(item){
+    let optArr = []
+    if(item.Button.AddButton&&checkAuthBtn(edbDataBtn.edbData_classifyOpt_add)&&item.Level<6){
+        optArr.push({name:'添加下级目录',type:'add'})
+    }
+    if(checkAuthBtn(edbDataBtn.edbData_classifyOpt_add)){
+        optArr.push({name:'重命名',type:'edit'})
+    }
+    if(item.Button.DeleteButton&&checkAuthBtn(edbDataBtn.edbData_classifyOpt_delete)){
+        optArr.push({name:'删除',type:'delete',color:"#C54322"})
+    }
+    if(item.Level!==1&&item.Button.MoveButton&&checkAuthBtn(edbDataBtn.edbData_classifyOpt_move)){
+        optArr.push({name:'移动至',type:'move'})
+    }
+    return optArr.length
+}
 // 显示分类的具体操作选项
 function handleShowClassifyOpt(item){
     let optArr=[
@@ -192,12 +211,15 @@ function handleShowClassifyOpt(item){
         {name:'删除',type:'delete',color:"#C54322"},
     ]
     if(item.Button.AddButton&&showParentClassifyData.value.length<5){//添加权限
-        optArr.unshift({name:'添加下级目录',type:'add'})
+        checkAuthBtn(edbDataBtn.edbData_classifyOpt_add)&&optArr.unshift({name:'添加下级目录',type:'add'})
+    }
+    if(!checkAuthBtn(edbDataBtn.edbData_classifyOpt_add)){//重命名
+        optArr=optArr.filter(item=>item.type!='edit')
     }
-    if(!item.Button.DeleteButton){//删除
+    if(!item.Button.DeleteButton||!checkAuthBtn(edbDataBtn.edbData_classifyOpt_delete)){//删除
         optArr=optArr.filter(item=>item.type!='delete')
     }
-    if(item.Button.MoveButton){//移动权限
+    if(item.Button.MoveButton&&checkAuthBtn(edbDataBtn.edbData_classifyOpt_move)){//移动权限
         // 一级目录不能移动至
         if(selectClassifyArr.value.length){
             optArr.push({name:'移动至',type:'move'})
@@ -205,7 +227,7 @@ function handleShowClassifyOpt(item){
     }
     classifyOptState.actions=optArr
     classifyOptState.data=item
-    classifyOptState.show=true
+    optArr.length&&(classifyOptState.show=true)
 }
 function handleSelectOpt(e){
     if(e.type==='add'){
@@ -317,10 +339,12 @@ defineExpose({classifyList,langTypeChange})
                         :style="{color:selectClassifyArr[selectClassifyArr.length-1]?.ClassifyId===item.ClassifyId?'#0052D9':''}"
                         @click.stop="handleSelectClassify(item)"
                     >{{getClassifyItemName(item)}}</span>
-                    <img style="width:22px;height:22px;cursor: pointer;" src="@/assets/imgs/dataEDB/icon_opt.png" alt="" @click.stop="handleShowClassifyOpt(item)">
+                    <img style="width:22px;height:22px;cursor: pointer;" src="@/assets/imgs/dataEDB/icon_opt.png" alt="" 
+                        v-if="checkOpt(item)"
+                        @click.stop="handleShowClassifyOpt(item)">
                 </li>
             </ul>
-            <div class="bot-btn-box">
+            <div class="bot-btn-box" v-permission="edbDataBtn.edbData_classifyOpt_add">
                 <van-button type="primary" block @click="handleAddLevel1">添加一级目录</van-button>
             </div>
         </div>