Merge pull request #2253 from dataease/pr@dev@feat_panel-publish

feat: 仪表板支持发布功能
This commit is contained in:
王嘉豪 2022-05-16 13:35:33 +08:00 committed by GitHub
commit 3932264403
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 194 additions and 12 deletions

View File

@ -4,6 +4,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.dataease.auth.annotation.DePermission;
import io.dataease.auth.annotation.DePermissionProxy;
import io.dataease.auth.annotation.DePermissions;
import io.dataease.controller.request.panel.PanelGroupBaseInfoRequest;
import io.dataease.plugins.common.base.domain.PanelGroup;
import io.dataease.plugins.common.base.domain.PanelGroupWithBLOBs;
import io.dataease.commons.constants.DePermissionType;
@ -110,5 +111,12 @@ public class PanelGroupController {
panelGroupService.exportPanelViewDetails(request,response);
}
@ApiOperation("更新仪表板状态")
@PostMapping("/updatePanelStatus/{panelId}")
@I18n
@DePermission(type = DePermissionType.PANEL, level = ResourceAuthLevel.PANNEL_LEVEL_MANAGE)
public void updatePanelStatus(@PathVariable String panelId,@RequestBody PanelGroupBaseInfoRequest request){
panelGroupService.updatePanelStatus(panelId,request);
}
}

View File

@ -0,0 +1,12 @@
package io.dataease.controller.request.panel;
import io.dataease.plugins.common.base.domain.PanelGroup;
/**
* Author: wangjiahao
* Date: 2022/5/16
* Description:
*/
public class PanelGroupBaseInfoRequest extends PanelGroup {
}

View File

@ -15,6 +15,8 @@ public class PanelGroupRequest extends PanelGroupDTO {
private String sort;
@ApiModelProperty("用户ID")
private String userId;
@ApiModelProperty("是否是超级管理员")
private Boolean isAdmin;
@ApiModelProperty("操作类型")
private String optType;
@ApiModelProperty("新建来源")

View File

@ -33,6 +33,7 @@
panel_group.`name` AS label,
panel_group.`source`,
panel_group.`panel_type`,
panel_group.`status`,
sourcePanelGroup.`mobile_layout`,
sourcePanelGroup.`name` as source_panel_name,
authInfo.privileges as `privileges`
@ -90,6 +91,9 @@
<if test="level != null">
and panel_group.level = #{level}
</if>
<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%') )
</if>
</where>
ORDER BY CONVERT(panel_group.name using gbk)
</select>
@ -107,6 +111,7 @@
panel_group.`name` AS label,
panel_group.`node_type`,
panel_group.`mobile_layout`,
panel_group.`status`,
(case when ISNULL(defaultPanelGroup.id) then false else true end) is_default,
defaultPanelGroup.id as default_panel_id,
defaultPanelGroup.`name` as default_panel_name,
@ -165,6 +170,9 @@
<if test="level != null">
and panel_group.level = #{level}
</if>
<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%') )
</if>
</where>
ORDER BY panel_group.node_type desc, CONVERT(panel_group.name using gbk)
</select>

View File

@ -8,6 +8,7 @@ import io.dataease.commons.utils.LogUtil;
import io.dataease.commons.utils.TreeUtils;
import io.dataease.controller.request.authModel.VAuthModelRequest;
import io.dataease.controller.request.dataset.DataSetTableRequest;
import io.dataease.controller.request.panel.PanelGroupBaseInfoRequest;
import io.dataease.controller.request.panel.PanelGroupRequest;
import io.dataease.controller.request.panel.PanelViewDetailsRequest;
import io.dataease.dto.PanelGroupExtendDataDTO;
@ -101,6 +102,7 @@ public class PanelGroupService {
public List<PanelGroupDTO> tree(PanelGroupRequest panelGroupRequest) {
String userId = String.valueOf(AuthUtils.getUser().getUserId());
panelGroupRequest.setUserId(userId);
panelGroupRequest.setIsAdmin(AuthUtils.getUser().getIsAdmin());
List<PanelGroupDTO> panelGroupDTOList = extPanelGroupMapper.panelGroupList(panelGroupRequest);
return TreeUtils.mergeTree(panelGroupDTOList, "panel_list");
}
@ -108,6 +110,7 @@ public class PanelGroupService {
public List<PanelGroupDTO> defaultTree(PanelGroupRequest panelGroupRequest) {
String userId = String.valueOf(AuthUtils.getUser().getUserId());
panelGroupRequest.setUserId(userId);
panelGroupRequest.setIsAdmin(AuthUtils.getUser().getIsAdmin());
List<PanelGroupDTO> panelGroupDTOList = extPanelGroupMapper.panelGroupListDefault(panelGroupRequest);
return TreeUtils.mergeTree(panelGroupDTOList, "default_panel");
}
@ -527,4 +530,13 @@ public class PanelGroupService {
DataEaseException.throwException(e);
}
}
public void updatePanelStatus(String panelId,PanelGroupBaseInfoRequest request){
Assert.notNull(request.getStatus(),"status can not be null");
Assert.notNull(panelId,"panelId can not be null");
PanelGroupWithBLOBs panelGroup = new PanelGroupWithBLOBs();
panelGroup.setId(panelId);
panelGroup.setStatus(request.getStatus());
panelGroupMapper.updateByPrimaryKeySelective(panelGroup);
}
}

View File

@ -0,0 +1,2 @@
ALTER TABLE `panel_group`
ADD COLUMN `status` varchar(255) NULL DEFAULT 'publish' COMMENT '1.publish--发布 2.unpublished--未发布' AFTER `mobile_layout`;

View File

@ -157,6 +157,10 @@
<appender-ref ref="console"/>
</logger>
<logger name="io.dataease.ext" level="${logger.sql.level}">
<appender-ref ref="console"/>
</logger>
<logger name="io.dataease.Application" additivity="false" level="${logger.level:INFO}">
<appender-ref ref="infoAsyncAppender"/>
</logger>

View File

@ -143,7 +143,8 @@ export function initPanelData(panelId, callback) {
id: response.data.id,
name: response.data.name,
privileges: response.data.privileges,
sourcePanelName: response.data.sourcePanelName
sourcePanelName: response.data.sourcePanelName,
status: response.data.status
})
// 刷新联动信息
getPanelAllLinkageInfo(panelId).then(rsp => {
@ -199,3 +200,12 @@ export function exportDetails(data) {
})
}
export function updatePanelStatus(panelId, param) {
return request({
url: '/panel/group/updatePanelStatus/' + panelId,
method: 'post',
loading: false,
data: param
})
}

View File

@ -131,6 +131,8 @@ export default {
default_login: 'Normal'
},
commons: {
publish: 'publish',
unpublished: 'unpublished',
default_pwd: 'Default Pwd',
stop: 'Stop',
first_login_tips: 'Please change the initial password',

View File

@ -131,6 +131,8 @@ export default {
default_login: '普通登錄'
},
commons: {
publish: '发布',
unpublished: '取消发布',
default_pwd: '初始密碼',
stop: '停止',
first_login_tips: '您使用的是初始密碼,記得修改密碼哦',

View File

@ -131,6 +131,8 @@ export default {
default_login: '普通登录'
},
commons: {
publish: '发布',
unpublished: '取消发布',
default_pwd: '初始密码',
stop: '停止',
first_login_tips: '您使用的是初始密码,记得修改密码哦',

View File

@ -54,6 +54,24 @@
<div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe6e5;</span>
<div class="name">下架</div>
<div class="code-name">&amp;#xe6e5;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6e6;</span>
<div class="name">上架</div>
<div class="code-name">&amp;#xe6e6;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe71f;</span>
<div class="name">发布</div>
<div class="code-name">&amp;#xe71f;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe61b;</span>
<div class="name">批量操作</div>
@ -570,9 +588,9 @@
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1651808824317') format('woff2'),
url('iconfont.woff?t=1651808824317') format('woff'),
url('iconfont.ttf?t=1651808824317') format('truetype');
src: url('iconfont.woff2?t=1652670008819') format('woff2'),
url('iconfont.woff?t=1652670008819') format('woff'),
url('iconfont.ttf?t=1652670008819') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@ -598,6 +616,33 @@
<div class="content font-class">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-unpublish"></span>
<div class="name">
下架
</div>
<div class="code-name">.icon-unpublish
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-publish"></span>
<div class="name">
上架
</div>
<div class="code-name">.icon-publish
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-fabu"></span>
<div class="name">
发布
</div>
<div class="code-name">.icon-fabu
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-piliang-copy"></span>
<div class="name">
@ -1372,6 +1417,30 @@
<div class="content symbol">
<ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-unpublish"></use>
</svg>
<div class="name">下架</div>
<div class="code-name">#icon-unpublish</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-publish"></use>
</svg>
<div class="name">上架</div>
<div class="code-name">#icon-publish</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-fabu"></use>
</svg>
<div class="name">发布</div>
<div class="code-name">#icon-fabu</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-piliang-copy"></use>

View File

@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 2459092 */
src: url('iconfont.woff2?t=1651808824317') format('woff2'),
url('iconfont.woff?t=1651808824317') format('woff'),
url('iconfont.ttf?t=1651808824317') format('truetype');
src: url('iconfont.woff2?t=1652670008819') format('woff2'),
url('iconfont.woff?t=1652670008819') format('woff'),
url('iconfont.ttf?t=1652670008819') format('truetype');
}
.iconfont {
@ -13,6 +13,18 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-unpublish:before {
content: "\e6e5";
}
.icon-publish:before {
content: "\e6e6";
}
.icon-fabu:before {
content: "\e71f";
}
.icon-piliang-copy:before {
content: "\e61b";
}

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,27 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "1236927",
"name": "下架",
"font_class": "unpublish",
"unicode": "e6e5",
"unicode_decimal": 59109
},
{
"icon_id": "1236928",
"name": "上架",
"font_class": "publish",
"unicode": "e6e6",
"unicode_decimal": 59110
},
{
"icon_id": "4933307",
"name": "发布",
"font_class": "fabu",
"unicode": "e71f",
"unicode_decimal": 59167
},
{
"icon_id": "5807789",
"name": "批量操作",

View File

@ -23,12 +23,20 @@
<span v-if="panelInfo.sourcePanelName" style="color: green;font-size: 12px">({{ $t('panel.source_panel_name') }}:{{ panelInfo.sourcePanelName }})</span>
</el-col>
<el-col :span="12">
<span v-if="hasDataPermission('manage',panelInfo.privileges)&&activeTab==='PanelList'&&!panelInfo.sourcePanelName" style="float: right;margin-right: 10px">
<el-button size="mini" type="primary" @click="editPanel">
{{ $t('commons.edit') }}
</el-button>
</span>
<span v-if="hasDataPermission('manage',panelInfo.privileges)&&activeTab==='PanelList'&&!panelInfo.sourcePanelName" style="float: right;margin-right: 10px">
<el-button size="mini" type="primary" @click="changePublishState">
<span v-if="panelInfo.status==='publish'">{{ $t('commons.unpublished') }}</span>
<span v-if="panelInfo.status!=='publish'">{{ $t('commons.publish') }}</span>
</el-button>
</span>
<span v-if="hasDataPermission('export',panelInfo.privileges)" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.save_to_panel')">
<el-button class="el-icon-folder-checked" size="mini" circle @click="saveToTemplate" />
@ -136,7 +144,7 @@ import { starStatus, saveEnshrine, deleteEnshrine } from '@/api/panel/enshrine'
import bus from '@/utils/bus'
import { queryAll } from '@/api/panel/pdfTemplate'
import ShareHead from '@/views/panel/GrantAuth/ShareHead'
import { initPanelData } from '@/api/panel/panel'
import { initPanelData, updatePanelStatus } from '@/api/panel/panel'
import { proxyInitPanelData } from '@/api/panel/shareProxy'
import { dataURLToBlob } from '@/components/canvas/utils/utils'
import { findResourceAsBase64, readFile } from '@/api/staticResource/staticResource'
@ -420,6 +428,14 @@ export default {
const param = { userId: this.shareUserId }
proxyInitPanelData(this.panelInfo.id, param, null)
} else { initPanelData(this.panelInfo.id) }
},
changePublishState() {
if (this.panelInfo.status === 'publish') {
this.panelInfo.status = 'unpublished'
} else {
this.panelInfo.status = 'publish'
}
updatePanelStatus(this.panelInfo.id, { 'status': this.panelInfo.status })
}
}
}

View File

@ -68,6 +68,6 @@ export function starStatus(panelId) {
method: 'post',
loading: true
})
}
}