Merge pull request #13367 from dataease/pr@dev-v2@export_data_permission

perf(X-Pack): 仪表板导出权限页面控制
This commit is contained in:
xuwei-fit2cloud 2024-11-15 18:45:42 +08:00 committed by GitHub
commit b859c99ea3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 69 additions and 19 deletions

View File

@ -124,7 +124,8 @@
v-if=" v-if="
!['picture-group', 'rich-text'].includes(element.innerType) && !['picture-group', 'rich-text'].includes(element.innerType) &&
barShowCheck('download') && barShowCheck('download') &&
showDownload showDownload &&
(exportPermissions[0] || exportPermissions[1])
" "
@click.prevent @click.prevent
> >
@ -138,14 +139,18 @@
</div> </div>
<template #dropdown> <template #dropdown>
<el-dropdown-menu style="width: 120px"> <el-dropdown-menu style="width: 120px">
<el-dropdown-item @click="exportAsExcel">Excel</el-dropdown-item> <el-dropdown-item v-if="exportPermissions[1]" @click="exportAsExcel"
>Excel</el-dropdown-item
>
<el-dropdown-item <el-dropdown-item
v-if="element.innerType === 'table-pivot'" v-if="exportPermissions[1] && element.innerType === 'table-pivot'"
@click="exportAsFormattedExcel" @click="exportAsFormattedExcel"
> >
<span>Excel(带格式)</span> <span>Excel(带格式)</span>
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item @click="exportAsImage">图片</el-dropdown-item> <el-dropdown-item v-if="exportPermissions[0]" @click="exportAsImage"
>图片</el-dropdown-item
>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
@ -169,7 +174,8 @@
!['picture-group', 'rich-text'].includes(element.innerType) && !['picture-group', 'rich-text'].includes(element.innerType) &&
barShowCheck('previewDownload') && barShowCheck('previewDownload') &&
authShow && authShow &&
showDownload showDownload &&
(exportPermissions[0] || exportPermissions[1])
" "
> >
<el-icon @click="downloadClick" class="bar-base-icon"> <el-icon @click="downloadClick" class="bar-base-icon">
@ -179,14 +185,18 @@
</el-icon> </el-icon>
<template #dropdown> <template #dropdown>
<el-dropdown-menu style="width: 118px"> <el-dropdown-menu style="width: 118px">
<el-dropdown-item @click="exportAsExcel">Excel</el-dropdown-item> <el-dropdown-item @click="exportAsExcel" v-if="exportPermissions[1]"
>Excel</el-dropdown-item
>
<el-dropdown-item <el-dropdown-item
v-if="element.innerType === 'table-pivot'" v-if="exportPermissions[1] && element.innerType === 'table-pivot'"
@click="exportAsFormattedExcel" @click="exportAsFormattedExcel"
> >
<span>Excel(带格式)</span> <span>Excel(带格式)</span>
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item @click="exportAsImage">图片</el-dropdown-item> <el-dropdown-item v-if="exportPermissions[0]" @click="exportAsImage"
>图片</el-dropdown-item
>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
@ -227,11 +237,15 @@ import { ElMessage, ElTooltip, ElButton } from 'element-plus-secondary'
import CustomTabsSort from '@/custom-component/de-tabs/CustomTabsSort.vue' import CustomTabsSort from '@/custom-component/de-tabs/CustomTabsSort.vue'
import { exportPivotExcel } from '@/views/chart/components/js/panel/common/common_table' import { exportPivotExcel } from '@/views/chart/components/js/panel/common/common_table'
import { XpackComponent } from '@/components/plugin' import { XpackComponent } from '@/components/plugin'
import { exportPermission } from '@/utils/utils'
const dvMainStore = dvMainStoreWithOut() const dvMainStore = dvMainStoreWithOut()
const snapshotStore = snapshotStoreWithOut() const snapshotStore = snapshotStoreWithOut()
const copyStore = copyStoreWithOut() const copyStore = copyStoreWithOut()
const customTabsSortRef = ref(null) const customTabsSortRef = ref(null)
const authShow = computed(() => !dvInfo.value.weight || dvInfo.value.weight > 3) const authShow = computed(() => !dvInfo.value.weight || dvInfo.value.weight > 3)
const exportPermissions = computed(() =>
exportPermission(dvInfo.value['weight'], dvInfo.value['ext'])
)
const emits = defineEmits([ const emits = defineEmits([
'userViewEnlargeOpen', 'userViewEnlargeOpen',
'datasetParamsInit', 'datasetParamsInit',

View File

@ -9,7 +9,7 @@
> >
<div class="export-button"> <div class="export-button">
<el-select <el-select
v-if="optType === 'enlarge' && authShow" v-if="optType === 'enlarge' && exportPermissions[0]"
v-model="pixel" v-model="pixel"
class="pixel-select" class="pixel-select"
size="small" size="small"
@ -26,7 +26,7 @@
<el-button <el-button
class="m-button" class="m-button"
v-if="optType === 'enlarge' && authShow" v-if="optType === 'enlarge' && exportPermissions[0]"
link link
icon="Download" icon="Download"
size="middle" size="middle"
@ -36,7 +36,7 @@
</el-button> </el-button>
<el-button <el-button
class="m-button" class="m-button"
v-if="optType === 'details' && authShow" v-if="optType === 'details' && exportPermissions[1]"
link link
icon="Download" icon="Download"
size="middle" size="middle"
@ -50,7 +50,7 @@
</el-button> </el-button>
<el-button <el-button
class="m-button" class="m-button"
v-if="optType === 'details' && authShow" v-if="optType === 'details' && exportPermissions[2]"
link link
icon="Download" icon="Download"
size="middle" size="middle"
@ -64,7 +64,7 @@
</el-button> </el-button>
<el-button <el-button
class="m-button" class="m-button"
v-if="optType === 'details' && authShow && viewInfo.type === 'table-pivot'" v-if="optType === 'details' && exportPermissions[2] && viewInfo.type === 'table-pivot'"
link link
icon="Download" icon="Download"
size="middle" size="middle"
@ -150,6 +150,7 @@ import { useRequestStoreWithOut } from '@/store/modules/request'
import { usePermissionStoreWithOut } from '@/store/modules/permission' import { usePermissionStoreWithOut } from '@/store/modules/permission'
import { activeWatermarkCheckUser } from '@/components/watermark/watermark' import { activeWatermarkCheckUser } from '@/components/watermark/watermark'
import { getCanvasStyle } from '@/utils/style' import { getCanvasStyle } from '@/utils/style'
import { exportPermission } from '@/utils/utils'
const downLoading = ref(false) const downLoading = ref(false)
const dvMainStore = dvMainStoreWithOut() const dvMainStore = dvMainStoreWithOut()
const dialogShow = ref(false) const dialogShow = ref(false)
@ -167,7 +168,6 @@ const { dvInfo, editMode } = storeToRefs(dvMainStore)
const exportLoading = ref(false) const exportLoading = ref(false)
const sourceViewType = ref() const sourceViewType = ref()
const activeName = ref('left') const activeName = ref('left')
const userInfo = ref(null)
const DETAIL_CHART_ATTR: DeepPartial<ChartObj> = { const DETAIL_CHART_ATTR: DeepPartial<ChartObj> = {
render: 'antv', render: 'antv',
type: 'table-info', type: 'table-info',
@ -214,6 +214,10 @@ const DETAIL_TABLE_ATTR: DeepPartial<ChartObj> = {
const authShow = computed(() => editMode.value === 'edit' || dvInfo.value.weight > 3) const authShow = computed(() => editMode.value === 'edit' || dvInfo.value.weight > 3)
const exportPermissions = computed(() =>
exportPermission(dvInfo.value['weight'], dvInfo.value['ext'])
)
const customExport = computed(() => { const customExport = computed(() => {
const style = const style =
canvasStyleData.value && canvasStyleData.value &&

View File

@ -188,3 +188,29 @@ export const isLink = () => {
export const isNull = arg => { export const isNull = arg => {
return typeof arg === 'undefined' || arg === null || arg === 'null' return typeof arg === 'undefined' || arg === null || arg === 'null'
} }
export const exportPermission = (weight, ext) => {
const result = [0, 0, 0]
if (!weight || weight === 1) {
return result
} else if (weight === 9) {
return [1, 1, 1]
}
if (!ext) {
return result
}
const extArray = formatExt(ext) || []
for (let index = 0; index < extArray.length; index++) {
result[index] = extArray[index]
}
return result
}
export const formatExt = (num: number): number[] | null => {
if (!num) {
return null
}
const reversedStr = num.toString().split('').reverse().join('')
const reversedNumArray = reversedStr?.split('')?.map(Number) ?? []
return reversedNumArray
}

View File

@ -18,6 +18,7 @@ import ShareVisualHead from '@/views/share/share/ShareVisualHead.vue'
import { XpackComponent } from '@/components/plugin' import { XpackComponent } from '@/components/plugin'
import { useEmitt } from '@/hooks/web/useEmitt' import { useEmitt } from '@/hooks/web/useEmitt'
import { useShareStoreWithOut } from '@/store/modules/share' import { useShareStoreWithOut } from '@/store/modules/share'
import { exportPermission } from '@/utils/utils'
const shareStore = useShareStoreWithOut() const shareStore = useShareStoreWithOut()
const dvMainStore = dvMainStoreWithOut() const dvMainStore = dvMainStoreWithOut()
@ -37,7 +38,9 @@ const preview = () => {
const isDataEaseBi = computed(() => appStore.getIsDataEaseBi) const isDataEaseBi = computed(() => appStore.getIsDataEaseBi)
const isIframe = computed(() => appStore.getIsIframe) const isIframe = computed(() => appStore.getIsIframe)
const shareDisable = computed(() => shareStore.getShareDisable) const shareDisable = computed(() => shareStore.getShareDisable)
const exportPermissions = computed(() =>
exportPermission(dvInfo.value['weight'], dvInfo.value['ext'])
)
const reload = () => { const reload = () => {
emit('reload', dvInfo.value.id) emit('reload', dvInfo.value.id)
} }
@ -197,7 +200,7 @@ const initOpenHandler = newWindow => {
<el-dropdown-item style="width: 118px" @click="downloadAsAppTemplate('app')">{{ <el-dropdown-item style="width: 118px" @click="downloadAsAppTemplate('app')">{{
t('visualization.apply_template') t('visualization.apply_template')
}}</el-dropdown-item> }}</el-dropdown-item>
<el-dropdown-item @click="download('img')">{{ <el-dropdown-item v-if="exportPermissions[0]" @click="download('img')">{{
t('chart.image') t('chart.image')
}}</el-dropdown-item> }}</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>

View File

@ -70,7 +70,7 @@ function createNew() {
resourceTreeRef.value?.createNewObject() resourceTreeRef.value?.createNewObject()
} }
const loadCanvasData = (dvId, weight?) => { const loadCanvasData = (dvId, weight?, ext?) => {
const initMethod = props.showPosition === 'multiplexing' ? initCanvasDataPrepare : initCanvasData const initMethod = props.showPosition === 'multiplexing' ? initCanvasDataPrepare : initCanvasData
dataInitState.value = false dataInitState.value = false
initMethod( initMethod(
@ -84,6 +84,7 @@ const loadCanvasData = (dvId, weight?) => {
curPreviewGap curPreviewGap
}) { }) {
dvInfo['weight'] = weight dvInfo['weight'] = weight
dvInfo['ext'] = ext || 0
state.canvasDataPreview = canvasDataResult state.canvasDataPreview = canvasDataResult
state.canvasStylePreview = canvasStyleResult state.canvasStylePreview = canvasStyleResult
state.canvasViewInfoPreview = canvasViewInfoPreview state.canvasViewInfoPreview = canvasViewInfoPreview
@ -162,11 +163,11 @@ const slideOpenChange = () => {
} }
const reload = id => { const reload = id => {
loadCanvasData(id, state.dvInfo.weight) loadCanvasData(id, state.dvInfo.weight, state.dvInfo.ext)
} }
const resourceNodeClick = data => { const resourceNodeClick = data => {
loadCanvasData(data.id, data.weight) loadCanvasData(data.id, data.weight, data.ext)
} }
const state = reactive({ const state = reactive({

View File

@ -171,6 +171,8 @@ public class DataVisualizationVO implements Serializable {
*/ */
private Integer weight; private Integer weight;
private int ext;
/** /**
* 应用信息 * 应用信息
*/ */