mirror of
https://github.com/dataease/dataease.git
synced 2026-05-15 21:42:32 +08:00
refactor(工作台): 工作台分享收藏等状态变更优化
This commit is contained in:
@@ -18,6 +18,7 @@ public interface XpackShareExtMapper {
|
||||
s.id as share_id,
|
||||
v.id as resource_id,
|
||||
v.mobile_layout as ext_flag,
|
||||
v.status as ext_flag1,
|
||||
v.type,
|
||||
s.creator,
|
||||
s.time,
|
||||
|
||||
@@ -30,4 +30,6 @@ public class XpackSharePO implements Serializable {
|
||||
|
||||
private Integer extFlag;
|
||||
|
||||
private Integer extFlag1;
|
||||
|
||||
}
|
||||
|
||||
@@ -154,7 +154,6 @@ public class XpackShareManage {
|
||||
Long uid = AuthUtils.getUser().getUserId();
|
||||
QueryWrapper<Object> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("s.creator", uid);
|
||||
queryWrapper.ne("v.status", 0);
|
||||
if (StringUtils.isNotBlank(request.getType())) {
|
||||
BusiResourceEnum busiResourceEnum = BusiResourceEnum.valueOf(request.getType().toUpperCase());
|
||||
if (ObjectUtils.isEmpty(busiResourceEnum)) {
|
||||
@@ -208,7 +207,7 @@ public class XpackShareManage {
|
||||
return pos.stream().map(po ->
|
||||
new XpackShareGridVO(
|
||||
po.getShareId(), po.getResourceId(), po.getName(), po.getCreator().toString(),
|
||||
po.getTime(), po.getExp(), 9, po.getExtFlag(), po.getType())).toList();
|
||||
po.getTime(), po.getExp(), 9, po.getExtFlag(),po.getExtFlag1(), po.getType())).toList();
|
||||
}
|
||||
|
||||
private XpackShareManage proxy() {
|
||||
|
||||
@@ -19,7 +19,8 @@ public interface CoreStoreExtMapper {
|
||||
v.update_by as editor,
|
||||
v.update_time as edit_time,
|
||||
v.name,
|
||||
v.mobile_layout as ext_flag
|
||||
v.mobile_layout as ext_flag,
|
||||
v.status as ext_flag1
|
||||
from core_store s
|
||||
inner join data_visualization_info v on s.resource_id = v.id
|
||||
${ew.customSqlSegment}
|
||||
|
||||
@@ -26,4 +26,6 @@ public class StorePO implements Serializable {
|
||||
|
||||
private Integer extFlag;
|
||||
|
||||
private Integer extFlag1;
|
||||
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ public class VisualizationStoreManage {
|
||||
new VisualizationStoreVO(
|
||||
po.getStoreId(), po.getResourceId(), po.getName(),
|
||||
po.getType(), String.valueOf(po.getCreator()), ObjectUtils.isEmpty(po.getEditor()) ? null : String.valueOf(po.getEditor()),
|
||||
po.getEditTime(), 9, po.getExtFlag())).toList();
|
||||
po.getEditTime(), 9, po.getExtFlag(), po.getExtFlag1())).toList();
|
||||
}
|
||||
|
||||
public IPage<StorePO> queryStorePage(int goPage, int pageSize, VisualizationWorkbranchQueryRequest request) {
|
||||
@@ -112,7 +112,6 @@ public class VisualizationStoreManage {
|
||||
if (StringUtils.isNotBlank(info)) {
|
||||
queryWrapper.notExists(String.format(info, "s.resource_id"));
|
||||
}
|
||||
queryWrapper.ne("v.status", 0);
|
||||
queryWrapper.orderBy(true, request.isAsc(), "v.update_time");
|
||||
Page<StorePO> page = new Page<>(goPage, pageSize);
|
||||
return coreStoreExtMapper.query(page, queryWrapper);
|
||||
|
||||
@@ -13,14 +13,14 @@ import icon_undo_outlined from '@/assets/svg/icon_undo_outlined.svg'
|
||||
import icon_redo_outlined from '@/assets/svg/icon_redo_outlined.svg'
|
||||
import dvRecoverOutlined from '@/assets/svg/dv-recover_outlined.svg'
|
||||
import dvCancelPublish from '@/assets/svg/icon_undo_outlined.svg'
|
||||
import {ElIcon, ElMessage, ElMessageBox} from 'element-plus-secondary'
|
||||
import { ElIcon, ElMessage, ElMessageBox } from 'element-plus-secondary'
|
||||
import eventBus from '@/utils/eventBus'
|
||||
import {ref, nextTick, computed, toRefs, onBeforeUnmount, onMounted} from 'vue'
|
||||
import {useEmbedded} from '@/store/modules/embedded'
|
||||
import {dvMainStoreWithOut} from '@/store/modules/data-visualization/dvMain'
|
||||
import {snapshotStoreWithOut} from '@/store/modules/data-visualization/snapshot'
|
||||
import {useAppStoreWithOut} from '@/store/modules/app'
|
||||
import {storeToRefs} from 'pinia'
|
||||
import { ref, nextTick, computed, toRefs, onBeforeUnmount, onMounted } from 'vue'
|
||||
import { useEmbedded } from '@/store/modules/embedded'
|
||||
import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain'
|
||||
import { snapshotStoreWithOut } from '@/store/modules/data-visualization/snapshot'
|
||||
import { useAppStoreWithOut } from '@/store/modules/app'
|
||||
import { storeToRefs } from 'pinia'
|
||||
import Icon from '../icon-custom/src/Icon.vue'
|
||||
import ComponentGroup from '@/components/visualization/ComponentGroup.vue'
|
||||
import UserViewGroup from '@/custom-component/component-group/UserViewGroup.vue'
|
||||
@@ -35,10 +35,10 @@ import {
|
||||
findAllViewsId,
|
||||
initCanvasData
|
||||
} from '@/utils/canvasUtils'
|
||||
import {changeSizeWithScale} from '@/utils/changeComponentsSizeWithScale'
|
||||
import { changeSizeWithScale } from '@/utils/changeComponentsSizeWithScale'
|
||||
import MoreComGroup from '@/custom-component/component-group/MoreComGroup.vue'
|
||||
import {XpackComponent} from '@/components/plugin'
|
||||
import {useCache} from '@/hooks/web/useCache'
|
||||
import { XpackComponent } from '@/components/plugin'
|
||||
import { useCache } from '@/hooks/web/useCache'
|
||||
import QueryGroup from '@/custom-component/component-group/QueryGroup.vue'
|
||||
import ComponentButton from '@/components/visualization/ComponentButton.vue'
|
||||
import OuterParamsSet from '@/components/visualization/OuterParamsSet.vue'
|
||||
@@ -46,30 +46,30 @@ import MultiplexingCanvas from '@/views/common/MultiplexingCanvas.vue'
|
||||
import ComponentButtonLabel from '@/components/visualization/ComponentButtonLabel.vue'
|
||||
import DeFullscreen from '@/components/visualization/common/DeFullscreen.vue'
|
||||
import DeAppApply from '@/views/common/DeAppApply.vue'
|
||||
import {useEmitt} from '@/hooks/web/useEmitt'
|
||||
import {useUserStoreWithOut} from '@/store/modules/user'
|
||||
import { useEmitt } from '@/hooks/web/useEmitt'
|
||||
import { useUserStoreWithOut } from '@/store/modules/user'
|
||||
import TabsGroup from '@/custom-component/component-group/TabsGroup.vue'
|
||||
import {useI18n} from '@/hooks/web/useI18n'
|
||||
import {updatePublishStatus} from '@/api/visualization/dataVisualization'
|
||||
import { useI18n } from '@/hooks/web/useI18n'
|
||||
import { updatePublishStatus } from '@/api/visualization/dataVisualization'
|
||||
|
||||
let nameEdit = ref(false)
|
||||
let inputName = ref('')
|
||||
let nameInput = ref(null)
|
||||
const dvMainStore = dvMainStoreWithOut()
|
||||
const snapshotStore = snapshotStoreWithOut()
|
||||
const {styleChangeTimes, snapshotIndex} = storeToRefs(snapshotStore)
|
||||
const { styleChangeTimes, snapshotIndex } = storeToRefs(snapshotStore)
|
||||
const resourceGroupOpt = ref(null)
|
||||
const resourceAppOpt = ref(null)
|
||||
const dvToolbarMain = ref(null)
|
||||
const {componentData, canvasStyleData, canvasViewInfo, dvInfo, editMode, appData} =
|
||||
const { componentData, canvasStyleData, canvasViewInfo, dvInfo, editMode, appData } =
|
||||
storeToRefs(dvMainStore)
|
||||
let scaleEdit = 100
|
||||
const {wsCache} = useCache('localStorage')
|
||||
const { wsCache } = useCache('localStorage')
|
||||
const dvModel = 'dataV'
|
||||
const outerParamsSetRef = ref(null)
|
||||
const fullScreeRef = ref(null)
|
||||
const userStore = useUserStoreWithOut()
|
||||
const {t} = useI18n()
|
||||
const { t } = useI18n()
|
||||
const emits = defineEmits(['recoverToPublished'])
|
||||
|
||||
const props = defineProps({
|
||||
@@ -166,12 +166,12 @@ const saveCanvasWithCheck = (withPublish = false, status?) => {
|
||||
leaf: true,
|
||||
id: dvInfo.value.pid || '0'
|
||||
}
|
||||
resourceGroupOpt.value.optInit('leaf', params, 'newLeaf', true, {withPublish, status})
|
||||
resourceGroupOpt.value.optInit('leaf', params, 'newLeaf', true, { withPublish, status })
|
||||
}
|
||||
return
|
||||
}
|
||||
checkCanvasChangePre(() => {
|
||||
saveResource({withPublish, status})
|
||||
saveResource({ withPublish, status })
|
||||
})
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ const saveResource = (checkParams?) => {
|
||||
)
|
||||
}
|
||||
if (appData.value) {
|
||||
initCanvasData(dvInfo.value.id, {busiFlag: 'dataV', resourceTable: 'snapshot'}, () => {
|
||||
initCanvasData(dvInfo.value.id, { busiFlag: 'dataV', resourceTable: 'snapshot' }, () => {
|
||||
useEmitt().emitter.emit('refresh-dataset-selector')
|
||||
resourceAppOpt.value.close()
|
||||
dvMainStore.setAppDataInfo(null)
|
||||
@@ -213,7 +213,7 @@ const saveResource = (checkParams?) => {
|
||||
}
|
||||
|
||||
const clearCanvas = () => {
|
||||
dvMainStore.setCurComponent({component: null, index: null})
|
||||
dvMainStore.setCurComponent({ component: null, index: null })
|
||||
dvMainStore.setComponentData([])
|
||||
snapshotStore.recordSnapshotCache('renderChart')
|
||||
}
|
||||
@@ -264,7 +264,7 @@ const backHandler = (url: string) => {
|
||||
openHandler.value.invokeMethod(pm)
|
||||
return
|
||||
}
|
||||
dvMainStore.canvasStateChange({key: 'curPointArea', value: 'base'})
|
||||
dvMainStore.canvasStateChange({ key: 'curPointArea', value: 'base' })
|
||||
wsCache.delete('DE-DV-CATCH-' + dvInfo.value.id)
|
||||
wsCache.set('dv-info-id', dvInfo.value.id)
|
||||
if (!!history.state.back) {
|
||||
@@ -340,7 +340,7 @@ const publishStatusChange = status => {
|
||||
|
||||
const isIframe = computed(() => appStore.getIsIframe)
|
||||
const fullScreenPreview = () => {
|
||||
dvMainStore.canvasStateChange({key: 'curPointArea', value: 'base'})
|
||||
dvMainStore.canvasStateChange({ key: 'curPointArea', value: 'base' })
|
||||
fullScreeRef.value.toggleFullscreen()
|
||||
}
|
||||
</script>
|
||||
@@ -358,10 +358,8 @@ const fullScreenPreview = () => {
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-icon class="custom-el-icon back-icon" @click="backToMain()">
|
||||
<Icon name="icon_left_outlined"
|
||||
>
|
||||
<icon_left_outlined class="svg-icon toolbar-icon"
|
||||
/>
|
||||
<Icon name="icon_left_outlined">
|
||||
<icon_left_outlined class="svg-icon toolbar-icon" />
|
||||
</Icon>
|
||||
</el-icon>
|
||||
<div class="left-area">
|
||||
@@ -376,7 +374,7 @@ const fullScreenPreview = () => {
|
||||
@click="undo()"
|
||||
>
|
||||
<Icon name="icon_undo_outlined">
|
||||
<icon_undo_outlined class="svg-icon"/>
|
||||
<icon_undo_outlined class="svg-icon" />
|
||||
</Icon>
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
@@ -389,7 +387,7 @@ const fullScreenPreview = () => {
|
||||
@click="redo()"
|
||||
>
|
||||
<Icon name="icon_redo_outlined">
|
||||
<icon_redo_outlined class="svg-icon"/>
|
||||
<icon_redo_outlined class="svg-icon" />
|
||||
</Icon>
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
@@ -514,10 +512,8 @@ const fullScreenPreview = () => {
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item @click="recoverToPublished" v-if="dvInfo.status === 2">
|
||||
<el-icon class="handle-icon">
|
||||
<Icon name="icon_left_outlined"
|
||||
>
|
||||
<dv-recover-outlined class="svg-icon toolbar-icon"
|
||||
/>
|
||||
<Icon name="icon_left_outlined">
|
||||
<dv-recover-outlined class="svg-icon toolbar-icon" />
|
||||
</Icon>
|
||||
</el-icon>
|
||||
{{ t('visualization.publish_recover') }}
|
||||
@@ -527,10 +523,8 @@ const fullScreenPreview = () => {
|
||||
v-if="[1, 2].includes(dvInfo.status)"
|
||||
>
|
||||
<el-icon class="handle-icon">
|
||||
<Icon name="icon_left_outlined"
|
||||
>
|
||||
<dv-cancel-publish class="svg-icon toolbar-icon"
|
||||
/>
|
||||
<Icon name="icon_left_outlined">
|
||||
<dv-cancel-publish class="svg-icon toolbar-icon" />
|
||||
</Icon>
|
||||
</el-icon>
|
||||
{{ t('visualization.cancel_publish') }}
|
||||
@@ -570,7 +564,7 @@ const fullScreenPreview = () => {
|
||||
<de-fullscreen ref="fullScreeRef" show-position="dvEdit"></de-fullscreen>
|
||||
<multiplexing-canvas ref="multiplexingRef"></multiplexing-canvas>
|
||||
<outer-params-set ref="outerParamsSetRef"></outer-params-set>
|
||||
<XpackComponent ref="openHandler" jsname="L2NvbXBvbmVudC9lbWJlZGRlZC1pZnJhbWUvT3BlbkhhbmRsZXI="/>
|
||||
<XpackComponent ref="openHandler" jsname="L2NvbXBvbmVudC9lbWJlZGRlZC1pZnJhbWUvT3BlbkhhbmRsZXI=" />
|
||||
</template>
|
||||
|
||||
<style lang="less" scoped>
|
||||
|
||||
@@ -5,6 +5,8 @@ import icon_dashboard_outlined from '@/assets/svg/icon_dashboard_outlined.svg'
|
||||
import icon_database_outlined from '@/assets/svg/icon_database_outlined.svg'
|
||||
import icon_operationAnalysis_outlined from '@/assets/svg/icon_operation-analysis_outlined.svg'
|
||||
import dvDashboardSpineMobile from '@/assets/svg/dv-dashboard-spine-mobile.svg'
|
||||
import dvDashboardSpineMobileDisabled from '@/assets/svg/dv-dashboard-spine-mobile-disabled.svg'
|
||||
import dvDashboardSpineDisabled from '@/assets/svg/dv-dashboard-spine-disabled.svg'
|
||||
import icon_pc_outlined from '@/assets/svg/icon_pc_outlined.svg'
|
||||
import { useI18n } from '@/hooks/web/useI18n'
|
||||
import { ref, reactive, watch, computed } from 'vue'
|
||||
@@ -117,7 +119,7 @@ const getEmptyDesc = (): string => {
|
||||
}
|
||||
|
||||
const handleCellClick = row => {
|
||||
if (row) {
|
||||
if (row && row.extFlag1) {
|
||||
const sourceId = row.resourceId
|
||||
if (['dashboard', 'panel'].includes(row.type)) {
|
||||
window.open('#/panel/index?dvId=' + sourceId, '_self')
|
||||
@@ -131,9 +133,11 @@ const iconMap = {
|
||||
panel: icon_dashboard_outlined,
|
||||
panelMobile: dvDashboardSpineMobile,
|
||||
dashboard: icon_dashboard_outlined,
|
||||
dashboardDisabled: icon_dashboard_outlined,
|
||||
dashboardMobile: dvDashboardSpineMobile,
|
||||
screen: icon_operationAnalysis_outlined,
|
||||
dataV: icon_operationAnalysis_outlined,
|
||||
dataVDisabled: icon_operationAnalysis_outlined,
|
||||
dataset: icon_app_outlined,
|
||||
datasource: icon_database_outlined
|
||||
}
|
||||
@@ -201,16 +205,34 @@ watch(
|
||||
<template v-slot:default="scope">
|
||||
<div class="name-content">
|
||||
<el-icon style="margin-right: 12px; font-size: 18px" v-if="scope.row.extFlag">
|
||||
<Icon name="dv-dashboard-spine-mobile"
|
||||
<Icon v-if="scope.row.extFlag1" name="dv-dashboard-spine-mobile"
|
||||
><dvDashboardSpineMobile class="svg-icon"
|
||||
/></Icon>
|
||||
<Icon v-if="!scope.row.extFlag1" name="dv-dashboard-spine-mobile"
|
||||
><dvDashboardSpineMobileDisabled class="svg-icon"
|
||||
/></Icon>
|
||||
</el-icon>
|
||||
<el-icon v-else :class="`main-color color-${scope.row.type}`">
|
||||
<Icon><component class="svg-icon" :is="iconMap[scope.row.type]"></component></Icon>
|
||||
<el-icon
|
||||
v-else
|
||||
:class="`main-color color-${scope.row.type} custom-color${
|
||||
scope.row.extFlag1 ? '' : '-disabled'
|
||||
}`"
|
||||
>
|
||||
<Icon
|
||||
><component
|
||||
class="svg-icon"
|
||||
:is="iconMap[scope.row.type + (scope.row.extFlag1 ? '' : 'Disabled')]"
|
||||
></component
|
||||
></Icon>
|
||||
</el-icon>
|
||||
<el-tooltip placement="top">
|
||||
<template #content>{{ scope.row.name }}</template>
|
||||
<span class="ellipsis" style="max-width: 250px">{{ scope.row.name }}</span>
|
||||
<span
|
||||
class="ellipsis"
|
||||
:class="{ 'color-disabled': !scope.row.extFlag1 }"
|
||||
style="max-width: 250px"
|
||||
>{{ scope.row.name }}</span
|
||||
>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
@@ -284,6 +306,7 @@ watch(
|
||||
color: #fff;
|
||||
background: #3370ff;
|
||||
}
|
||||
|
||||
.name-star {
|
||||
font-size: 15px;
|
||||
padding-left: 5px;
|
||||
@@ -296,4 +319,11 @@ watch(
|
||||
line-height: 20px !important;
|
||||
}
|
||||
}
|
||||
.color-disabled {
|
||||
color: #bbbfc4;
|
||||
}
|
||||
|
||||
.custom-color-disabled {
|
||||
background: #bbbfc4 !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -8,7 +8,7 @@ import icon_database_outlined from '@/assets/svg/icon_database_outlined.svg'
|
||||
import icon_operationAnalysis_outlined from '@/assets/svg/icon_operation-analysis_outlined.svg'
|
||||
import dvDashboardSpineMobile from '@/assets/svg/dv-dashboard-spine-mobile.svg'
|
||||
import icon_pc_outlined from '@/assets/svg/icon_pc_outlined.svg'
|
||||
import icon_cancel_store from '@/assets/svg/icon_cancel_store.svg'
|
||||
import dvDashboardSpineMobileDisabled from '@/assets/svg/dv-dashboard-spine-mobile-disabled.svg'
|
||||
import { useI18n } from '@/hooks/web/useI18n'
|
||||
import { ref, reactive, onMounted, computed, watch } from 'vue'
|
||||
import type { TabsPaneContext } from 'element-plus-secondary'
|
||||
@@ -61,6 +61,7 @@ const iconMap = {
|
||||
panelMobile: dvDashboardSpineMobile,
|
||||
dashboard: icon_dashboard_outlined,
|
||||
dashboardMobile: dvDashboardSpineMobile,
|
||||
dashboardMobileDisabled: dvDashboardSpineMobileDisabled,
|
||||
screen: icon_operationAnalysis_outlined,
|
||||
dataV: icon_operationAnalysis_outlined,
|
||||
dataset: icon_app_outlined,
|
||||
@@ -198,7 +199,7 @@ const sortChange = param => {
|
||||
}
|
||||
|
||||
const handleCellClick = row => {
|
||||
if (row) {
|
||||
if (row && !checkDisabled(row)) {
|
||||
const sourceId = activeName.value === 'recent' ? row.id : row.resourceId
|
||||
if (['dashboard', 'panel'].includes(row.type)) {
|
||||
window.open('#/panel/index?dvId=' + sourceId, '_self')
|
||||
@@ -238,6 +239,10 @@ const executeStore = rowInfo => {
|
||||
})
|
||||
}
|
||||
|
||||
const checkDisabled = row => {
|
||||
return activeName.value === 'store' && !row.extFlag1
|
||||
}
|
||||
|
||||
const executeCancelStore = rowInfo => {
|
||||
const param = {
|
||||
id: rowInfo.resourceId,
|
||||
@@ -352,18 +357,32 @@ const getEmptyDesc = (): string => {
|
||||
<Icon
|
||||
><component
|
||||
class="svg-icon"
|
||||
:is="iconMap[scope.row.type + 'Mobile']"
|
||||
:is="
|
||||
iconMap[
|
||||
scope.row.type + 'Mobile' + (checkDisabled(scope.row) ? 'Disabled' : '')
|
||||
]
|
||||
"
|
||||
></component
|
||||
></Icon>
|
||||
</el-icon>
|
||||
<el-icon v-else :class="`main-color color-${scope.row.type}`">
|
||||
<el-icon
|
||||
v-else
|
||||
:class="`main-color color-${scope.row.type} custom-color${
|
||||
checkDisabled(scope.row) ? '-disabled' : ''
|
||||
}`"
|
||||
>
|
||||
<Icon
|
||||
><component class="svg-icon" :is="iconMap[scope.row.type]"></component
|
||||
></Icon>
|
||||
</el-icon>
|
||||
<el-tooltip placement="top">
|
||||
<template #content>{{ scope.row.name }}</template>
|
||||
<span class="ellipsis" style="max-width: 250px">{{ scope.row.name }}</span>
|
||||
<span
|
||||
class="ellipsis"
|
||||
:class="{ 'color-disabled': checkDisabled(scope.row) }"
|
||||
style="max-width: 250px"
|
||||
>{{ scope.row.name }}</span
|
||||
>
|
||||
</el-tooltip>
|
||||
<el-icon
|
||||
v-if="activeName === 'recent' && ['screen', 'panel'].includes(scope.row.type)"
|
||||
@@ -568,6 +587,14 @@ const getEmptyDesc = (): string => {
|
||||
.jump-active {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.color-disabled {
|
||||
color: #bbbfc4;
|
||||
}
|
||||
|
||||
.custom-color-disabled {
|
||||
background: #bbbfc4 !important;
|
||||
}
|
||||
</style>
|
||||
<style lang="less">
|
||||
.menu-panel-select_popper {
|
||||
|
||||
@@ -35,4 +35,7 @@ public class VisualizationStoreVO implements Serializable {
|
||||
private int weight;
|
||||
|
||||
private Integer extFlag;
|
||||
|
||||
private Integer extFlag1;
|
||||
|
||||
}
|
||||
|
||||
@@ -38,6 +38,8 @@ public class XpackShareGridVO implements Serializable {
|
||||
|
||||
private Integer extFlag;
|
||||
|
||||
private Integer extFlag1;
|
||||
|
||||
@Schema(description = "类型")
|
||||
private String type;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user