diff --git a/core/backend/src/main/java/io/dataease/controller/IndexController.java b/core/backend/src/main/java/io/dataease/controller/IndexController.java index 4eec795d31..98d16127a8 100644 --- a/core/backend/src/main/java/io/dataease/controller/IndexController.java +++ b/core/backend/src/main/java/io/dataease/controller/IndexController.java @@ -71,6 +71,10 @@ public class IndexController { if (StringUtils.isNotEmpty(fromLink)) { url = url + "&fromLink=" + fromLink; } + String ticket = request.getParameter("ticket"); + if (StringUtils.isNotEmpty(ticket)) { + url = url + "&ticket=" + ticket; + } response.sendRedirect(url); } catch (IOException e) { LogUtil.error(e.getMessage()); diff --git a/core/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java b/core/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java index f6654d7d72..b43f21e5e6 100644 --- a/core/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java +++ b/core/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java @@ -84,4 +84,8 @@ public interface LinkApi { @ApiOperation("删除ticket") @PostMapping("/delTicket") void deleteTicket(@RequestBody TicketDelRequest request); + + @ApiOperation("切换是否必填ticket") + @PostMapping("/enableTicket") + void switchRequire(@RequestBody TicketSwitchRequest request); } diff --git a/core/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java b/core/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java index a88e6e7a1f..86b7a59b99 100644 --- a/core/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java +++ b/core/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java @@ -9,9 +9,11 @@ import io.dataease.controller.panel.api.LinkApi; import io.dataease.controller.request.chart.ChartExtRequest; import io.dataease.controller.request.panel.link.*; import io.dataease.dto.panel.link.GenerateDto; +import io.dataease.dto.panel.link.TicketDto; import io.dataease.dto.panel.link.ValidateDto; import io.dataease.plugins.common.base.domain.PanelGroupWithBLOBs; import io.dataease.plugins.common.base.domain.PanelLink; +import io.dataease.plugins.common.base.domain.PanelLinkMapping; import io.dataease.plugins.common.base.domain.PanelLinkTicket; import io.dataease.service.chart.ChartViewService; import io.dataease.service.panel.PanelLinkService; @@ -95,7 +97,8 @@ public class LinkServer implements LinkApi { dto.setValid(false); return dto; } - String mappingUuid = panelLinkService.getMappingUuid(one); + PanelLinkMapping mapping = panelLinkService.getMapping(one); + String mappingUuid = mapping.getUuid(); if (!StringUtils.equals(uuid, mappingUuid)) { dto.setValid(false); return dto; @@ -104,6 +107,10 @@ public class LinkServer implements LinkApi { dto.setEnablePwd(one.getEnablePwd()); dto.setPassPwd(panelLinkService.validateHeads(one)); dto.setExpire(panelLinkService.isExpire(one)); + + String ticketText = request.getTicket(); + TicketDto ticketDto = panelLinkService.validateTicket(ticketText, mapping); + dto.setTicket(ticketDto); return dto; } @@ -158,4 +165,9 @@ public class LinkServer implements LinkApi { public void deleteTicket(TicketDelRequest request) { panelLinkService.deleteTicket(request); } + + @Override + public void switchRequire(TicketSwitchRequest request) { + panelLinkService.switchRequire(request); + } } diff --git a/core/backend/src/main/java/io/dataease/controller/request/panel/link/LinkValidateRequest.java b/core/backend/src/main/java/io/dataease/controller/request/panel/link/LinkValidateRequest.java index 39ab661e36..f01f6091d9 100644 --- a/core/backend/src/main/java/io/dataease/controller/request/panel/link/LinkValidateRequest.java +++ b/core/backend/src/main/java/io/dataease/controller/request/panel/link/LinkValidateRequest.java @@ -9,4 +9,5 @@ public class LinkValidateRequest implements Serializable { private String link; private String user; + private String ticket; } diff --git a/core/backend/src/main/java/io/dataease/controller/request/panel/link/TicketSwitchRequest.java b/core/backend/src/main/java/io/dataease/controller/request/panel/link/TicketSwitchRequest.java new file mode 100644 index 0000000000..ff6727cbfc --- /dev/null +++ b/core/backend/src/main/java/io/dataease/controller/request/panel/link/TicketSwitchRequest.java @@ -0,0 +1,13 @@ +package io.dataease.controller.request.panel.link; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class TicketSwitchRequest implements Serializable { + + private String resourceId; + + private Boolean require = false; +} diff --git a/core/backend/src/main/java/io/dataease/dto/panel/link/TicketDto.java b/core/backend/src/main/java/io/dataease/dto/panel/link/TicketDto.java new file mode 100644 index 0000000000..e2deb6ee9b --- /dev/null +++ b/core/backend/src/main/java/io/dataease/dto/panel/link/TicketDto.java @@ -0,0 +1,15 @@ +package io.dataease.dto.panel.link; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class TicketDto implements Serializable { + + private boolean ticketValid; + + private boolean ticketExp; + + private String args; +} diff --git a/core/backend/src/main/java/io/dataease/dto/panel/link/ValidateDto.java b/core/backend/src/main/java/io/dataease/dto/panel/link/ValidateDto.java index 827bb012cd..c6671175ce 100644 --- a/core/backend/src/main/java/io/dataease/dto/panel/link/ValidateDto.java +++ b/core/backend/src/main/java/io/dataease/dto/panel/link/ValidateDto.java @@ -19,4 +19,6 @@ public class ValidateDto { private String resourceId; @ApiModelProperty("用户ID") private String userId; + + private TicketDto ticket; } diff --git a/core/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java b/core/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java index 82cd185411..28ec8bde3d 100644 --- a/core/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java +++ b/core/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java @@ -11,6 +11,7 @@ import io.dataease.commons.utils.ServletUtils; import io.dataease.controller.request.panel.link.*; import io.dataease.dto.panel.PanelGroupDTO; import io.dataease.dto.panel.link.GenerateDto; +import io.dataease.dto.panel.link.TicketDto; import io.dataease.ext.ExtPanelGroupMapper; import io.dataease.ext.ExtPanelLinkMapper; import io.dataease.plugins.common.base.domain.*; @@ -128,13 +129,13 @@ public class PanelLinkService { } } - public String getMappingUuid(PanelLink link) { + public PanelLinkMapping getMapping(PanelLink link) { String resourceId = link.getResourceId(); Long userId = link.getUserId(); PanelLinkMappingExample example = new PanelLinkMappingExample(); example.createCriteria().andResourceIdEqualTo(resourceId).andUserIdEqualTo(userId); List mappings = panelLinkMappingMapper.selectByExample(example); - if (CollectionUtils.isNotEmpty(mappings)) return mappings.get(0).getUuid(); + if (CollectionUtils.isNotEmpty(mappings)) return mappings.get(0); return null; } @@ -291,8 +292,12 @@ public class PanelLinkService { PanelLinkTicketExample example = new PanelLinkTicketExample(); example.createCriteria().andTicketEqualTo(ticket); if (creator.isGenerateNew()) { + ticketEntity.setAccessTime(null); ticketEntity.setTicket(CodingUtil.shortUuid()); } + ticketEntity.setArgs(creator.getArgs()); + ticketEntity.setExp(creator.getExp()); + ticketEntity.setUuid(creator.getUuid()); panelLinkTicketMapper.updateByExample(ticketEntity, example); return ticketEntity.getTicket(); } @@ -317,7 +322,15 @@ public class PanelLinkService { panelLinkTicketMapper.deleteByExample(example); } - + public void switchRequire(TicketSwitchRequest request) { + String resourceId = request.getResourceId(); + Boolean require = request.getRequire(); + PanelLinkMappingExample example = new PanelLinkMappingExample(); + example.createCriteria().andResourceIdEqualTo(resourceId).andUserIdEqualTo(AuthUtils.getUser().getUserId()); + PanelLinkMapping mapping = new PanelLinkMapping(); + mapping.setRequireTicket(require); + panelLinkMappingMapper.updateByExampleSelective(mapping, example); + } public PanelLinkTicket getByTicket(String ticket) { PanelLinkTicketExample example = new PanelLinkTicketExample(); @@ -354,4 +367,37 @@ public class PanelLinkService { PanelLink one = findOne(resourceId, userId); return convertDto(one, uuid, mapping.getRequireTicket()).getUri(); } + + public TicketDto validateTicket(String ticket, PanelLinkMapping mapping) { + String uuid = mapping.getUuid(); + TicketDto ticketDto = new TicketDto(); + if (StringUtils.isBlank(ticket)) { + ticketDto.setTicketValid(!mapping.getRequireTicket()); + return ticketDto; + } + PanelLinkTicketExample example = new PanelLinkTicketExample(); + example.createCriteria().andTicketEqualTo(ticket).andUuidEqualTo(uuid); + List tickets = panelLinkTicketMapper.selectByExample(example); + if (CollectionUtils.isEmpty(tickets)) { + ticketDto.setTicketValid(false); + return ticketDto; + } + PanelLinkTicket linkTicket = tickets.get(0); + ticketDto.setTicketValid(true); + ticketDto.setArgs(linkTicket.getArgs()); + Long accessTime = linkTicket.getAccessTime(); + long now = System.currentTimeMillis(); + if (ObjectUtils.isEmpty(accessTime)) { + accessTime = now; + ticketDto.setTicketExp(false); + linkTicket.setAccessTime(accessTime); + panelLinkTicketMapper.updateByPrimaryKey(linkTicket); + return ticketDto; + } + Long exp = linkTicket.getExp(); + long expTime = exp * 60L * 1000L; + long time = now - accessTime; + ticketDto.setTicketExp(time > expTime); + return ticketDto; + } } diff --git a/core/backend/src/main/resources/db/migration/V62__1.18.18.sql b/core/backend/src/main/resources/db/migration/V62__1.18.18.sql index 4d2f74ea56..0deb306377 100644 --- a/core/backend/src/main/resources/db/migration/V62__1.18.18.sql +++ b/core/backend/src/main/resources/db/migration/V62__1.18.18.sql @@ -4,11 +4,12 @@ DROP TABLE IF EXISTS `panel_link_ticket`; CREATE TABLE `panel_link_ticket` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `uuid` varchar(255) NOT NULL, - `ticket` varchar(255) NOT NULL, - `exp` bigint DEFAULT NULL, - `args` varchar(255) DEFAULT NULL, + `id` bigint NOT NULL AUTO_INCREMENT, + `uuid` varchar(255) NOT NULL, + `ticket` varchar(255) NOT NULL, + `exp` bigint DEFAULT NULL, + `args` varchar(255) DEFAULT NULL, + `access_time` bigint DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1; diff --git a/core/frontend/public/link.html b/core/frontend/public/link.html index 2bdb7b338c..635a6d4f8d 100644 --- a/core/frontend/public/link.html +++ b/core/frontend/public/link.html @@ -34,6 +34,7 @@ const terminal = getQueryVariable('terminal') const attachParams = getQueryVariable('attachParams') const fromLink = getQueryVariable('fromLink') + const ticket = getQueryVariable('ticket') const baseUrl = window.location.pathname.replace('link.html', '') let url = baseUrl + "#/delink?link=" + encodeURIComponent(link) if (terminal) { @@ -48,6 +49,9 @@ if (fromLink) { url += '&fromLink=' + fromLink } + if (ticket) { + url += '&ticket=' + ticket + } window.location.href = url diff --git a/core/frontend/src/api/link/index.js b/core/frontend/src/api/link/index.js index 16a1adf659..87256278d1 100644 --- a/core/frontend/src/api/link/index.js +++ b/core/frontend/src/api/link/index.js @@ -50,6 +50,14 @@ export function switchEnablePwd(data) { }) } +export function switchEnableTicket(data) { + return request({ + url: 'api/link/enableTicket', + method: 'post', + data + }) +} + export function viewLinkLog(data) { return request({ url: 'api/link/viewLog', diff --git a/core/frontend/src/views/link/generate/index.vue b/core/frontend/src/views/link/generate/index.vue index d7ded228d9..6a10b6f2ae 100644 --- a/core/frontend/src/views/link/generate/index.vue +++ b/core/frontend/src/views/link/generate/index.vue @@ -127,19 +127,37 @@ class="ticket" >
- + ticket必选 + + +
- - - + + + + +
+ - + + diff --git a/core/frontend/src/views/link/view/index.vue b/core/frontend/src/views/link/view/index.vue index b4d954235f..01faf2ddc2 100644 --- a/core/frontend/src/views/link/view/index.vue +++ b/core/frontend/src/views/link/view/index.vue @@ -39,6 +39,10 @@ export default { user: { type: String, default: null + }, + ticketArgs: { + type: String, + default: null } }, data() { @@ -125,17 +129,35 @@ export default { tempParam && loadingCount++ attachParamsEncode && loadingCount++ - if (attachParamsEncode) { + let argsObject = null + const args = this.ticketArgs + try { + console.log(args) + argsObject = JSON.parse(this.ticketArgs) + } catch (error) { + console.error(error) + } + const hasArgs = argsObject && Object.keys(argsObject) + if (attachParamsEncode || hasArgs) { try { - const Base64 = require('js-base64').Base64 - const attachParam = JSON.parse(decodeURIComponent(Base64.decode(attachParamsEncode))) - getOuterParamsInfo(this.resourceId).then(rsp => { - if (--loadingCount === 0) { - this.show = true - } - this.$store.commit('setNowPanelOuterParamsInfo', rsp.data) - this.$store.commit('addOuterParamsFilter', attachParam) - }) + let attachParam = null + if (attachParamsEncode) { + const Base64 = require('js-base64').Base64 + attachParam = JSON.parse(decodeURIComponent(Base64.decode(attachParamsEncode))) + } + if (hasArgs) { + attachParam = Object.assign({}, attachParam, argsObject) + } + const hasAttachParam = attachParam && Object.keys(attachParam) + if (hasAttachParam) { + getOuterParamsInfo(this.resourceId).then(rsp => { + if (--loadingCount === 0) { + this.show = true + } + this.$store.commit('setNowPanelOuterParamsInfo', rsp.data) + this.$store.commit('addOuterParamsFilter', attachParam) + }) + } } catch (e) { if (--loadingCount === 0) { this.show = true diff --git a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/domain/PanelLinkTicket.java b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/domain/PanelLinkTicket.java index 7c6b107faa..b9c5df65e5 100644 --- a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/domain/PanelLinkTicket.java +++ b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/domain/PanelLinkTicket.java @@ -15,5 +15,7 @@ public class PanelLinkTicket implements Serializable { private String args; + private Long accessTime; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/domain/PanelLinkTicketExample.java b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/domain/PanelLinkTicketExample.java index d3e3ca9f89..885c9ec082 100644 --- a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/domain/PanelLinkTicketExample.java +++ b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/domain/PanelLinkTicketExample.java @@ -433,6 +433,66 @@ public class PanelLinkTicketExample { addCriterion("args not between", value1, value2, "args"); return (Criteria) this; } + + public Criteria andAccessTimeIsNull() { + addCriterion("access_time is null"); + return (Criteria) this; + } + + public Criteria andAccessTimeIsNotNull() { + addCriterion("access_time is not null"); + return (Criteria) this; + } + + public Criteria andAccessTimeEqualTo(Long value) { + addCriterion("access_time =", value, "accessTime"); + return (Criteria) this; + } + + public Criteria andAccessTimeNotEqualTo(Long value) { + addCriterion("access_time <>", value, "accessTime"); + return (Criteria) this; + } + + public Criteria andAccessTimeGreaterThan(Long value) { + addCriterion("access_time >", value, "accessTime"); + return (Criteria) this; + } + + public Criteria andAccessTimeGreaterThanOrEqualTo(Long value) { + addCriterion("access_time >=", value, "accessTime"); + return (Criteria) this; + } + + public Criteria andAccessTimeLessThan(Long value) { + addCriterion("access_time <", value, "accessTime"); + return (Criteria) this; + } + + public Criteria andAccessTimeLessThanOrEqualTo(Long value) { + addCriterion("access_time <=", value, "accessTime"); + return (Criteria) this; + } + + public Criteria andAccessTimeIn(List values) { + addCriterion("access_time in", values, "accessTime"); + return (Criteria) this; + } + + public Criteria andAccessTimeNotIn(List values) { + addCriterion("access_time not in", values, "accessTime"); + return (Criteria) this; + } + + public Criteria andAccessTimeBetween(Long value1, Long value2) { + addCriterion("access_time between", value1, value2, "accessTime"); + return (Criteria) this; + } + + public Criteria andAccessTimeNotBetween(Long value1, Long value2) { + addCriterion("access_time not between", value1, value2, "accessTime"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/mapper/PanelLinkTicketMapper.xml b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/mapper/PanelLinkTicketMapper.xml index 2befbb5e8a..f4443d9c57 100644 --- a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/mapper/PanelLinkTicketMapper.xml +++ b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/base/mapper/PanelLinkTicketMapper.xml @@ -7,6 +7,7 @@ + @@ -67,7 +68,7 @@ - id, uuid, ticket, `exp`, args + id, uuid, ticket, `exp`, args, access_time @@ -166,6 +175,9 @@ args = #{record.args,jdbcType=VARCHAR}, + + access_time = #{record.accessTime,jdbcType=BIGINT}, + @@ -177,7 +189,8 @@ uuid = #{record.uuid,jdbcType=VARCHAR}, ticket = #{record.ticket,jdbcType=VARCHAR}, `exp` = #{record.exp,jdbcType=BIGINT}, - args = #{record.args,jdbcType=VARCHAR} + args = #{record.args,jdbcType=VARCHAR}, + access_time = #{record.accessTime,jdbcType=BIGINT} @@ -197,6 +210,9 @@ args = #{args,jdbcType=VARCHAR}, + + access_time = #{accessTime,jdbcType=BIGINT}, + where id = #{id,jdbcType=BIGINT} @@ -205,7 +221,8 @@ set uuid = #{uuid,jdbcType=VARCHAR}, ticket = #{ticket,jdbcType=VARCHAR}, `exp` = #{exp,jdbcType=BIGINT}, - args = #{args,jdbcType=VARCHAR} + args = #{args,jdbcType=VARCHAR}, + access_time = #{accessTime,jdbcType=BIGINT} where id = #{id,jdbcType=BIGINT} \ No newline at end of file diff --git a/sdk/dataease-plugin-common/src/main/resources/generatorConfig.xml b/sdk/dataease-plugin-common/src/main/resources/generatorConfig.xml index 930744a03e..a3d97c62b8 100644 --- a/sdk/dataease-plugin-common/src/main/resources/generatorConfig.xml +++ b/sdk/dataease-plugin-common/src/main/resources/generatorConfig.xml @@ -63,7 +63,7 @@ - +