提交 f0b9d026 authored 作者: wangjiahao's avatar wangjiahao

refactor: 优化仪表板下架逻辑,下架禁止查看

上级 66925df6
...@@ -27,4 +27,7 @@ public class PanelShareOutDTO implements Serializable { ...@@ -27,4 +27,7 @@ public class PanelShareOutDTO implements Serializable {
@ApiModelProperty("分享时间") @ApiModelProperty("分享时间")
private Long createTime; private Long createTime;
@ApiModelProperty("仪表板状态")
private String status;
} }
...@@ -16,5 +16,7 @@ public class PanelSharePo { ...@@ -16,5 +16,7 @@ public class PanelSharePo {
private String creator; private String creator;
@ApiModelProperty("分享人ID") @ApiModelProperty("分享人ID")
private Long userId; private Long userId;
@ApiModelProperty("仪表板状态")
private String status;
} }
...@@ -13,5 +13,7 @@ public class PanelStoreDto { ...@@ -13,5 +13,7 @@ public class PanelStoreDto {
private String name; private String name;
@ApiModelProperty("仪表板Id") @ApiModelProperty("仪表板Id")
private String panelGroupId; private String panelGroupId;
@ApiModelProperty("仪表板状态")
private String status;
} }
...@@ -91,9 +91,9 @@ ...@@ -91,9 +91,9 @@
<if test="level != null"> <if test="level != null">
and panel_group.level = #{level} and panel_group.level = #{level}
</if> </if>
<if test="isAdmin != null and !isAdmin"> <!-- <if test="isAdmin != null and !isAdmin">-->
and (panel_group.node_type='folder' or (panel_group.node_type='panel' and panel_group.`status`='publish') or (panel_group.node_type='panel' and panel_group.`status`='unpublished' and authInfo.privileges like '%manage%') ) <!-- and (panel_group.node_type='folder' or (panel_group.node_type='panel' and panel_group.`status`='publish') or (panel_group.node_type='panel' and panel_group.`status`='unpublished' and authInfo.privileges like '%manage%') )-->
</if> <!-- </if>-->
</where> </where>
ORDER BY CONVERT(panel_group.name using gbk) ORDER BY CONVERT(panel_group.name using gbk)
</select> </select>
...@@ -170,9 +170,9 @@ ...@@ -170,9 +170,9 @@
<if test="level != null"> <if test="level != null">
and panel_group.level = #{level} and panel_group.level = #{level}
</if> </if>
<if test="isAdmin != null and !isAdmin"> <!-- <if test="isAdmin != null and !isAdmin">-->
and (panel_group.node_type='folder' or (panel_group.node_type='panel' and panel_group.`status`='publish') or (panel_group.node_type='panel' and panel_group.`status`='unpublished' and authInfo.privileges like '%manage%') ) <!-- and (panel_group.node_type='folder' or (panel_group.node_type='panel' and panel_group.`status`='publish') or (panel_group.node_type='panel' and panel_group.`status`='unpublished' and authInfo.privileges like '%manage%') )-->
</if> <!-- </if>-->
</where> </where>
ORDER BY panel_group.node_type desc, CONVERT(panel_group.name using gbk) ORDER BY panel_group.node_type desc, CONVERT(panel_group.name using gbk)
</select> </select>
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
<resultMap id="treeNodeMap" type="io.dataease.dto.panel.PanelSharePo"> <resultMap id="treeNodeMap" type="io.dataease.dto.panel.PanelSharePo">
<id column="id" property="id" /> <id column="id" property="id" />
<result column="name" property="name" /> <result column="name" property="name" />
<result column="status" property="status" />
<result column="creator" property="creator" /> <result column="creator" property="creator" />
<result column="user_id" jdbcType="BIGINT" property="userId" /> <result column="user_id" jdbcType="BIGINT" property="userId" />
</resultMap> </resultMap>
...@@ -20,7 +21,7 @@ ...@@ -20,7 +21,7 @@
<insert id="batchInsert" parameterType="io.dataease.plugins.common.base.domain.PanelShare"> <insert id="batchInsert" parameterType="io.dataease.plugins.common.base.domain.PanelShare">
INSERT INTO panel_share (panel_group_id,target_id,granter,create_time,type) INSERT INTO panel_share (panel_group_id,target_id,granter,create_time,type)
VALUES VALUES
<foreach collection="shares" item="share" separator=","> <foreach collection="shares" item="share" separator=",">
(#{share.panelGroupId}, #{share.targetId}, #{userName}, #{share.createTime}, #{share.type}) (#{share.panelGroupId}, #{share.targetId}, #{userName}, #{share.createTime}, #{share.type})
</foreach> </foreach>
...@@ -35,7 +36,7 @@ ...@@ -35,7 +36,7 @@
</delete> </delete>
<select id="query" resultMap="treeNodeMap"> <select id="query" resultMap="treeNodeMap">
select distinct s.panel_group_id as id, u.nick_name as creator, g.name, u.user_id select distinct s.panel_group_id as id, u.nick_name as creator, g.name, u.user_id, g.status
from panel_share s from panel_share s
left join panel_group g on g.id = s.panel_group_id left join panel_group g on g.id = s.panel_group_id
left join sys_user u on u.username = IFNULL(s.granter,g.create_by) left join sys_user u on u.username = IFNULL(s.granter,g.create_by)
...@@ -54,7 +55,7 @@ ...@@ -54,7 +55,7 @@
</select> </select>
<select id="queryOut" resultMap="treeNodeMap"> <select id="queryOut" resultMap="treeNodeMap">
select distinct s.panel_group_id as id, g.name select distinct s.panel_group_id as id, g.name, g.status
from panel_share s from panel_share s
left join panel_group g on g.id = s.panel_group_id left join panel_group g on g.id = s.panel_group_id
where ( s.granter is not null and s.granter = #{userName} ) or ( s.granter is null and g.create_by = #{userName} ) where ( s.granter is not null and s.granter = #{userName} ) or ( s.granter is null and g.create_by = #{userName} )
...@@ -63,10 +64,10 @@ ...@@ -63,10 +64,10 @@
</select> </select>
<select id="queryWithResource" parameterType="io.dataease.controller.request.panel.PanelShareSearchRequest" resultMap="io.dataease.plugins.common.base.mapper.PanelShareMapper.BaseResultMap"> <select id="queryWithResource" parameterType="io.dataease.controller.request.panel.PanelShareSearchRequest" resultMap="io.dataease.plugins.common.base.mapper.PanelShareMapper.BaseResultMap">
select s.* select s.*
from panel_share s from panel_share s
left join panel_group g on g.id = s.panel_group_id left join panel_group g on g.id = s.panel_group_id
where where
s.panel_group_id = #{resourceId} s.panel_group_id = #{resourceId}
<if test="type != null"> <if test="type != null">
and s.type = #{type} and s.type = #{type}
......
...@@ -6,13 +6,14 @@ ...@@ -6,13 +6,14 @@
<id column="store_id" property="storeId"></id> <id column="store_id" property="storeId"></id>
<result column="panel_group_id" property="panelGroupId"></result> <result column="panel_group_id" property="panelGroupId"></result>
<result column="name" property="name"></result> <result column="name" property="name"></result>
<result column="status" property="status"></result>
</resultMap> </resultMap>
<select id="query" parameterType="io.dataease.ext.query.GridExample" resultMap="panelStoreMap"> <select id="query" parameterType="io.dataease.ext.query.GridExample" resultMap="panelStoreMap">
select s.store_id,s.panel_group_id, g.name select s.store_id,s.panel_group_id, g.name ,g.status
from panel_store s from panel_store s
inner join panel_group g on g.id = s.panel_group_id inner join panel_group g on g.id = s.panel_group_id
<if test="_parameter != null"> <if test="_parameter != null">
......
<template> <template>
<div class="bg" :style="customStyle" @scroll="canvasScroll"> <div class="bg" :style="customStyle" @scroll="canvasScroll">
<div id="canvasInfoMain" ref="canvasInfoMain" :style="canvasInfoMainStyle"> <div id="canvasInfoMain" ref="canvasInfoMain" :style="canvasInfoMainStyle">
<el-row v-if="showUnpublishedArea" class="custom-position">
<pre>
<svg-icon icon-class="unpublished" style="font-size: 75px" />
{{ $t('panel.panel_off') }}
</pre>
</el-row>
<el-row v-else-if="componentDataShow.length===0" class="custom-position">
{{ $t('panel.panelNull') }}
</el-row>
<div <div
v-else
id="canvasInfoTemp" id="canvasInfoTemp"
ref="canvasInfoTemp" ref="canvasInfoTemp"
:style="[canvasInfoTempStyle,screenShotStyle]" :style="[canvasInfoTempStyle,screenShotStyle]"
...@@ -9,9 +19,6 @@ ...@@ -9,9 +19,6 @@
@mouseup="deselectCurComponent" @mouseup="deselectCurComponent"
@mousedown="handleMouseDown" @mousedown="handleMouseDown"
> >
<el-row v-if="componentDataShow.length===0" class="custom-position">
{{ $t('panel.panelNull') }}
</el-row>
<canvas-opt-bar /> <canvas-opt-bar />
<ComponentWrapper <ComponentWrapper
v-for="(item, index) in componentDataInfo" v-for="(item, index) in componentDataInfo"
...@@ -137,6 +144,20 @@ export default { ...@@ -137,6 +144,20 @@ export default {
created() { created() {
}, },
computed: { computed: {
mainActiveName() {
return this.$store.state.panel.mainActiveName
},
showUnpublishedArea() {
return this.panelInfo.status === 'unpublished'
// if (this.mainActiveName === 'PanelMain') {
// return this.panelInfo.status === 'unpublished' && this.panelInfo.privileges.indexOf('manage') === -1
// } else {
// return this.panelInfo.status === 'unpublished'
// }
},
panelInfo() {
return this.$store.state.panel.panelInfo
},
showExportImgButton() { showExportImgButton() {
return this.showChartInfo.type && !this.showChartInfo.type.includes('table') return this.showChartInfo.type && !this.showChartInfo.type.includes('table')
}, },
...@@ -372,7 +393,12 @@ export default { ...@@ -372,7 +393,12 @@ export default {
} }
.custom-position { .custom-position {
line-height: 30px;
width: 100%;
z-index: 100;
height: 100%; height: 100%;
text-align: center;
cursor:not-allowed;
flex: 1; flex: 1;
display: flex; display: flex;
align-items: center; align-items: center;
......
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1652951914828" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2768" data-spm-anchor-id="a313x.7781069.0.i0" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
</style></defs><path d="M327.59296 687.74912l511.36 1.28512c23.89504-1.47456 43.82208-17.0752 49.68448-39.38304l99.29216-416.4864c3.8912-14.69952 0.71168-30.13632-8.72448-42.37312-10.25536-13.30688-26.84928-21.248-44.42112-21.248l-203.86304 0c-13.79328 0-24.98048 11.17696-24.98048 24.95488 0 13.78304 11.1872 24.96512 24.98048 24.96512l203.86816 0c3.24608 0 4.73088 1.53088 4.69504 1.53088l-99.2512 416.37376c-0.23552 0.44544-1.69472 1.68448-2.75968 1.80736l-489.42592-1.27488L245.39648 219.45344l213.34016 0c13.79328 0 24.97536-11.17696 24.97536-24.96 0-13.77792-11.18208-24.96-24.97536-24.96l-225.5872 0-27.776-113.22368L59.10528 56.30976c-13.79328 0-24.97536 11.17184-24.97536 24.96 0 13.78304 11.18208 24.96 24.97536 24.96l107.06944 0 131.584 536.35584c-40.72448 12.99968-70.30784 51.16928-70.30784 96.11264 0 30.23872 13.40416 57.39008 34.56 75.89888-21.15584 18.5088-34.56 45.66016-34.56 75.89376 0 55.64928 45.29664 100.90496 100.97152 100.90496 55.68 0 100.97664-45.25568 100.97152-100.90496 0-18.5856-5.07904-36.00384-13.88544-50.9696l360.82688 0c-8.81152 14.96576-13.89056 32.384-13.89056 50.9696 0 55.64928 45.29664 100.90496 100.97152 100.90496 55.68 0 100.97152-45.25568 100.97152-100.90496 0-55.62368-45.29152-100.8896-100.97152-100.8896L328.4224 789.60128c-0.51712 0-1.024 0.03072-1.536 0.04096-27.42272-0.81408-49.47968-23.34208-49.47968-50.944C277.40672 710.86592 299.84256 688.19968 327.59296 687.74912L327.59296 687.74912zM863.4112 839.52128c28.13952 0 51.0208 22.86592 51.0208 50.97472 0 28.11392-22.88128 50.99008-51.0208 50.99008-28.1344 0-51.01056-22.87616-51.01056-50.99008C812.40064 862.3872 835.2768 839.52128 863.4112 839.52128L863.4112 839.52128zM326.97344 839.55712c0.4864 0.01024 0.96256 0.04096 1.44896 0.04096 0.32768 0 0.64512-0.03584 0.96768-0.04608 27.69408 0.51712 50.048 23.15776 50.048 50.944 0 28.11904-22.88128 50.99008-51.0208 50.99008-28.1344 0-51.01568-22.87104-51.01568-50.99008C277.40672 862.8736 299.50976 840.33024 326.97344 839.55712L326.97344 839.55712zM472.99584 297.43616l106.24 102.5536c0.23552 0.22528 0.50176 0.42496 0.7424 0.64512 0.31232 0.27136 0.6144 0.54784 0.93696 0.80896 0.3072 0.256 0.62464 0.47616 0.9472 0.71168 0.33792 0.25088 0.67072 0.49664 1.024 0.73216 0.32256 0.20992 0.64 0.39424 0.96256 0.58368 0.37888 0.22528 0.75264 0.45056 1.14176 0.65024 0.3072 0.16384 0.6144 0.30208 0.93184 0.45056 0.42496 0.19968 0.8448 0.40448 1.28 0.57856 0.28672 0.10752 0.57344 0.20992 0.86016 0.31232 0.47104 0.17408 0.9472 0.34816 1.4336 0.49664 0.256 0.0768 0.52224 0.128 0.768 0.19456 0.52736 0.13312 1.0496 0.27136 1.58208 0.37888 0.23552 0.04608 0.48128 0.07168 0.7168 0.10752 0.55296 0.09216 1.10592 0.18432 1.664 0.24064 0.20992 0.01536 0.4096 0.01024 0.61952 0.03072 0.57856 0.03584 1.16224 0.08704 1.75616 0.08704 0.58368 0 1.15712-0.0512 1.73056-0.08704 0.21504-0.01536 0.42496-0.01024 0.64-0.03072 0.55296-0.0512 1.1008-0.14848 1.6384-0.2304 0.25088-0.04096 0.50176-0.06656 0.74752-0.11776 0.52736-0.1024 1.03936-0.23552 1.55648-0.36864 0.26624-0.07168 0.53248-0.128 0.79872-0.2048 0.48128-0.14336 0.95232-0.31744 1.41312-0.4864 0.29696-0.10752 0.58368-0.2048 0.88064-0.32256 0.43008-0.17408 0.83968-0.37376 1.25952-0.57344 0.32256-0.14848 0.64-0.29184 0.95744-0.4608 0.37376-0.19968 0.7424-0.41984 1.11616-0.64 0.32768-0.19456 0.66048-0.384 0.98304-0.59904 0.34304-0.22528 0.67584-0.47616 1.00352-0.7168 0.32256-0.23552 0.65024-0.46592 0.96256-0.7168 0.31744-0.256 0.6144-0.53248 0.91648-0.80384 0.25088-0.22016 0.512-0.42496 0.75264-0.65536l106.23488-102.5536c9.92256-9.57952 10.19904-25.3696 0.60928-35.28704-4.89984-5.07392-11.42784-7.61344-17.96608-7.61344-6.25152 0-12.49792 2.3296-17.3568 7.00928l-63.90272 61.68064L621.57824 66.79552c0-13.77792-11.1872-24.96-24.98048-24.96s-24.97536 11.18208-24.97536 24.96l0 256.42496L507.70944 261.53472c-9.93792-9.59488-25.72288-9.32352-35.32288 0.60416C462.7968 272.06656 463.0784 287.85152 472.99584 297.43616L472.99584 297.43616z" p-id="2769"></path><path d="M596.59264 358.2464 596.59264 358.2464z" p-id="2770"></path></svg>
\ No newline at end of file
...@@ -1432,6 +1432,7 @@ export default { ...@@ -1432,6 +1432,7 @@ export default {
sure_bt: 'Confirm' sure_bt: 'Confirm'
}, },
panel: { panel: {
panel_off: 'Off the shelf',
batch_opt: 'Batch Operation', batch_opt: 'Batch Operation',
edit_leave_tips: 'Do You Want To Abandon And Leave The Current Page?', edit_leave_tips: 'Do You Want To Abandon And Leave The Current Page?',
hyperlinks: 'Hyperlinks', hyperlinks: 'Hyperlinks',
......
...@@ -1433,6 +1433,7 @@ export default { ...@@ -1433,6 +1433,7 @@ export default {
sure_bt: '確定' sure_bt: '確定'
}, },
panel: { panel: {
panel_off: '仪表板已下架',
batch_opt: '批量操作', batch_opt: '批量操作',
edit_leave_tips: '是否放弃编辑离开当前界面?', edit_leave_tips: '是否放弃编辑离开当前界面?',
hyperlinks: '超鏈接', hyperlinks: '超鏈接',
......
...@@ -1440,6 +1440,7 @@ export default { ...@@ -1440,6 +1440,7 @@ export default {
sure_bt: '确定' sure_bt: '确定'
}, },
panel: { panel: {
panel_off: '仪表板已下架',
batch_opt: '批量操作', batch_opt: '批量操作',
edit_leave_tips: '是否放弃编辑离开当前界面?', edit_leave_tips: '是否放弃编辑离开当前界面?',
hyperlinks: '超链接', hyperlinks: '超链接',
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<span slot-scope="{ data }" class="custom-tree-node father"> <span slot-scope="{ data }" class="custom-tree-node father">
<span style="display: flex; flex: 1 1 0%; width: 0px;" :class="!!data.msgNode ? 'msg-node-class': ''"> <span style="display: flex; flex: 1 1 0%; width: 0px;" :class="!!data.msgNode ? 'msg-node-class': ''">
<span v-if="!!data.id"> <span v-if="!!data.id">
<svg-icon icon-class="panel" class="ds-icon-scene" /> <svg-icon :icon-class="'panel-'+data.status" class="ds-icon-scene" />
</span> </span>
<span style="margin-left: 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">{{ data.name }}</span> <span style="margin-left: 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">{{ data.name }}</span>
</span> </span>
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<span slot-scope="{ data }" class="custom-tree-node father"> <span slot-scope="{ data }" class="custom-tree-node father">
<span style="display: flex; flex: 1 1 0%; width: 0px;" @click="viewMyShare(data)"> <span style="display: flex; flex: 1 1 0%; width: 0px;" @click="viewMyShare(data)">
<span v-if="!!data.id"> <span v-if="!!data.id">
<svg-icon icon-class="panel" class="ds-icon-scene" /> <svg-icon :icon-class="'panel-'+data.status" class="ds-icon-scene" />
</span> </span>
<span style="margin-left: 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">{{ data.name }}</span> <span style="margin-left: 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">{{ data.name }}</span>
</span> </span>
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<template :id="scope.row.storeId" slot-scope="scope"> <template :id="scope.row.storeId" slot-scope="scope">
<div class="start-item"> <div class="start-item">
<div class="filter-db-row star-item-content" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;" @click="showPanel(scope.row)"> <div class="filter-db-row star-item-content" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;" @click="showPanel(scope.row)">
<svg-icon icon-class="panel" class="ds-icon-scene" /> <svg-icon :icon-class="'panel-'+scope.row.status" class="ds-icon-scene" />
<span> {{ scope.row.name }}</span> <span> {{ scope.row.name }}</span>
</div> </div>
<div class="star-item-close"> <div class="star-item-close">
......
...@@ -37,12 +37,12 @@ ...@@ -37,12 +37,12 @@
</el-button> </el-button>
</span> </span>
<span v-if="hasDataPermission('export',panelInfo.privileges)" style="float: right;margin-right: 10px"> <span v-if="hasDataPermission('export',panelInfo.privileges)&&panelInfo.status==='publish'" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.save_to_panel')"> <el-tooltip :content="$t('panel.save_to_panel')">
<el-button class="el-icon-folder-checked" size="mini" circle @click="saveToTemplate" /> <el-button class="el-icon-folder-checked" size="mini" circle @click="saveToTemplate" />
</el-tooltip> </el-tooltip>
</span> </span>
<span v-if="hasDataPermission('export',panelInfo.privileges)" style="float: right;margin-right: 10px"> <span v-if="hasDataPermission('export',panelInfo.privileges)&&panelInfo.status==='publish'" style="float: right;margin-right: 10px">
<el-dropdown> <el-dropdown>
<el-button size="mini" class="el-icon-download" circle /> <el-button size="mini" class="el-icon-download" circle />
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
...@@ -52,25 +52,25 @@ ...@@ -52,25 +52,25 @@
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</span> </span>
<span style="float: right;margin-right: 10px"> <span style="float: right;margin-right: 10px" v-if="panelInfo.status==='publish'">
<el-tooltip :content="$t('panel.fullscreen_preview')"> <el-tooltip :content="$t('panel.fullscreen_preview')">
<el-button class="el-icon-view" size="mini" circle @click="clickFullscreen" /> <el-button class="el-icon-view" size="mini" circle @click="clickFullscreen" />
</el-tooltip> </el-tooltip>
</span> </span>
<span style="float: right;margin-right: 10px"> <span style="float: right;margin-right: 10px" v-if="panelInfo.status==='publish'">
<el-tooltip :content="$t('panel.new_tab_preview')"> <el-tooltip :content="$t('panel.new_tab_preview')">
<el-button class="el-icon-data-analysis" size="mini" circle @click="newTab" /> <el-button class="el-icon-data-analysis" size="mini" circle @click="newTab" />
</el-tooltip> </el-tooltip>
</span> </span>
<span v-if="!hasStar && panelInfo && showType !== 1" style="float: right;margin-right: 10px"> <span v-if="!hasStar && panelInfo && showType !== 1&&panelInfo.status==='publish'" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.store')"> <el-tooltip :content="$t('panel.store')">
<el-button class="el-icon-star-off" size="mini" circle @click="star" /> <el-button class="el-icon-star-off" size="mini" circle @click="star" />
</el-tooltip> </el-tooltip>
</span> </span>
<span v-if="hasStar && panelInfo && showType !== 1" style="float: right;margin-right: 10px"> <span v-if="hasStar && panelInfo && showType !== 1&&panelInfo.status==='publish'" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('commons.cancel')"> <el-tooltip :content="$t('commons.cancel')">
<el-button class="el-icon-star-on" size="mini" circle @click="unstar" /> <el-button class="el-icon-star-on" size="mini" circle @click="unstar" />
</el-tooltip> </el-tooltip>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论