diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java index 8afa6e7281..01a9dd903b 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java @@ -45,6 +45,7 @@ public class ShiroServiceImpl implements ShiroService { // 获取主题信息 filterChainDefinitionMap.put("/plugin/theme/themes", ANON); filterChainDefinitionMap.put("/plugin/theme/items/**", ANON); + filterChainDefinitionMap.put("/plugin/view/types", ANON); // 验证链接 filterChainDefinitionMap.put("/api/link/validate**", ANON); diff --git a/backend/src/main/java/io/dataease/base/domain/PanelLinkMapping.java b/backend/src/main/java/io/dataease/base/domain/PanelLinkMapping.java index 7321d46342..0bb0bebfd3 100644 --- a/backend/src/main/java/io/dataease/base/domain/PanelLinkMapping.java +++ b/backend/src/main/java/io/dataease/base/domain/PanelLinkMapping.java @@ -11,5 +11,7 @@ public class PanelLinkMapping implements Serializable { private Long userId; + private String uuid; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/PanelLinkMappingExample.java b/backend/src/main/java/io/dataease/base/domain/PanelLinkMappingExample.java index a4e98885dc..baa9094e73 100644 --- a/backend/src/main/java/io/dataease/base/domain/PanelLinkMappingExample.java +++ b/backend/src/main/java/io/dataease/base/domain/PanelLinkMappingExample.java @@ -293,6 +293,76 @@ public class PanelLinkMappingExample { addCriterion("user_id not between", value1, value2, "userId"); return (Criteria) this; } + + public Criteria andUuidIsNull() { + addCriterion("uuid is null"); + return (Criteria) this; + } + + public Criteria andUuidIsNotNull() { + addCriterion("uuid is not null"); + return (Criteria) this; + } + + public Criteria andUuidEqualTo(String value) { + addCriterion("uuid =", value, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidNotEqualTo(String value) { + addCriterion("uuid <>", value, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidGreaterThan(String value) { + addCriterion("uuid >", value, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidGreaterThanOrEqualTo(String value) { + addCriterion("uuid >=", value, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidLessThan(String value) { + addCriterion("uuid <", value, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidLessThanOrEqualTo(String value) { + addCriterion("uuid <=", value, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidLike(String value) { + addCriterion("uuid like", value, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidNotLike(String value) { + addCriterion("uuid not like", value, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidIn(List values) { + addCriterion("uuid in", values, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidNotIn(List values) { + addCriterion("uuid not in", values, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidBetween(String value1, String value2) { + addCriterion("uuid between", value1, value2, "uuid"); + return (Criteria) this; + } + + public Criteria andUuidNotBetween(String value1, String value2) { + addCriterion("uuid not between", value1, value2, "uuid"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.xml b/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.xml index 1ec9fe2a52..aa8ee9b55e 100644 --- a/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.xml @@ -5,6 +5,7 @@ + @@ -65,7 +66,7 @@ - id, resource_id, user_id + id, resource_id, user_id, uuid @@ -146,6 +153,9 @@ user_id = #{record.userId,jdbcType=BIGINT}, + + uuid = #{record.uuid,jdbcType=VARCHAR}, + @@ -155,7 +165,8 @@ update panel_link_mapping set id = #{record.id,jdbcType=BIGINT}, resource_id = #{record.resourceId,jdbcType=VARCHAR}, - user_id = #{record.userId,jdbcType=BIGINT} + user_id = #{record.userId,jdbcType=BIGINT}, + uuid = #{record.uuid,jdbcType=VARCHAR} @@ -169,13 +180,17 @@ user_id = #{userId,jdbcType=BIGINT}, + + uuid = #{uuid,jdbcType=VARCHAR}, + where id = #{id,jdbcType=BIGINT} update panel_link_mapping set resource_id = #{resourceId,jdbcType=VARCHAR}, - user_id = #{userId,jdbcType=BIGINT} + user_id = #{userId,jdbcType=BIGINT}, + uuid = #{uuid,jdbcType=VARCHAR} where id = #{id,jdbcType=BIGINT} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/commons/utils/CodingUtil.java b/backend/src/main/java/io/dataease/commons/utils/CodingUtil.java index ca256b47b7..ec283b549b 100644 --- a/backend/src/main/java/io/dataease/commons/utils/CodingUtil.java +++ b/backend/src/main/java/io/dataease/commons/utils/CodingUtil.java @@ -7,6 +7,7 @@ import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.MessageDigest; +import java.util.UUID; /** * 加密解密工具 @@ -19,6 +20,13 @@ public class CodingUtil { private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + + public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f", + "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", + "W", "X", "Y", "Z" }; /** * MD5加密 * @@ -165,4 +173,26 @@ public class CodingUtil { } } + + public static boolean isNumeric(String str){ + for (int i = str.length();--i>=0;){ + if (!Character.isDigit(str.charAt(i))){ + return false; + } + } + return true; + } + + + + public static String shortUuid() { + StringBuffer shortBuffer = new StringBuffer(); + String uuid = UUID.randomUUID().toString().replace("-", ""); + for (int i = 0; i < 8; i++) { + String str = uuid.substring(i * 4, i * 4 + 4); + int x = Integer.parseInt(str, 16); + shortBuffer.append(chars[x % 0x3E]); + } + return shortBuffer.toString(); + } } diff --git a/backend/src/main/java/io/dataease/controller/IndexController.java b/backend/src/main/java/io/dataease/controller/IndexController.java index e9d77d1056..e2c5128d71 100644 --- a/backend/src/main/java/io/dataease/controller/IndexController.java +++ b/backend/src/main/java/io/dataease/controller/IndexController.java @@ -3,6 +3,7 @@ package io.dataease.controller; import io.dataease.commons.exception.DEException; import io.dataease.commons.license.DefaultLicenseService; import io.dataease.commons.license.F2CLicenseResponse; +import io.dataease.commons.utils.CodingUtil; import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; import io.dataease.service.panel.PanelLinkService; @@ -48,8 +49,13 @@ public class IndexController { } @GetMapping("/link/{index}") - public void link(@PathVariable(value = "index", required = true) Long index) { - String url = panelLinkService.getUrlByIndex(index); + public void link(@PathVariable(value = "index", required = true) String index) { + String url; + if (CodingUtil.isNumeric(index)) { + url = panelLinkService.getUrlByIndex(Long.parseLong(index)); + }else { + url = panelLinkService.getUrlByUuid(index); + } HttpServletResponse response = ServletUtils.response(); try { response.sendRedirect(url); @@ -59,6 +65,8 @@ public class IndexController { } } + + @GetMapping("/tempMobileLink/{id}/{token}") public void tempMobileLink(@PathVariable("id") String id, @PathVariable("token") String token) { String url = "/#preview/" + id; diff --git a/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java b/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java index 2ec72e2990..fb9f271662 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java @@ -8,7 +8,9 @@ import io.dataease.base.mapper.PanelGroupMapper; import io.dataease.base.mapper.PanelLinkMapper; import io.dataease.base.mapper.PanelLinkMappingMapper; import io.dataease.base.mapper.ext.ExtPanelLinkMapper; +import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.AuthUtils; +import io.dataease.commons.utils.CodingUtil; import io.dataease.commons.utils.ServletUtils; import io.dataease.controller.request.panel.link.EnablePwdRequest; import io.dataease.controller.request.panel.link.LinkRequest; @@ -114,7 +116,13 @@ public class PanelLinkService { PanelLinkMapping mapping = new PanelLinkMapping(); mapping.setResourceId(resourceId); mapping.setUserId(AuthUtils.getUser().getUserId()); + mapping.setUuid(CodingUtil.shortUuid()); panelLinkMappingMapper.insert(mapping); + }else { + mappings.stream().filter(mapping -> StringUtils.isBlank(mapping.getUuid())).forEach(item -> { + item.setUuid(CodingUtil.shortUuid()); + panelLinkMappingMapper.updateByPrimaryKey(item); + }); } return convertDto(one); } @@ -206,7 +214,7 @@ public class PanelLinkService { example.createCriteria().andResourceIdEqualTo(resourceId).andUserIdEqualTo(AuthUtils.getUser().getUserId()); List mappings = panelLinkMappingMapper.selectByExample(example); PanelLinkMapping mapping = mappings.get(0); - return SHORT_URL_PREFIX + mapping.getId(); + return SHORT_URL_PREFIX + mapping.getUuid(); } public String getUrlByIndex(Long index) { @@ -216,4 +224,18 @@ public class PanelLinkService { PanelLink one = findOne(resourceId, userId); return convertDto(one).getUri(); } + + public String getUrlByUuid(String uuid) { + PanelLinkMappingExample example = new PanelLinkMappingExample(); + example.createCriteria().andUuidEqualTo(uuid); + List mappings = panelLinkMappingMapper.selectByExample(example); + if (CollectionUtils.isEmpty(mappings)) { + DEException.throwException("link is not exist"); + } + PanelLinkMapping mapping = mappings.get(0); + String resourceId = mapping.getResourceId(); + Long userId = mapping.getUserId(); + PanelLink one = findOne(resourceId, userId); + return convertDto(one).getUri(); + } } diff --git a/backend/src/main/resources/db/migration/V32__1.8.sql b/backend/src/main/resources/db/migration/V32__1.8.sql index bbe4ecdcf8..725be3d641 100644 --- a/backend/src/main/resources/db/migration/V32__1.8.sql +++ b/backend/src/main/resources/db/migration/V32__1.8.sql @@ -309,3 +309,6 @@ delete from chart_group where id in ( 'bc7542d8-2b7e-4909-81ff-3627b0227501', 'bfa7d87f-c76f-4406-9f19-0adccb7c568d' ) + +ALTER TABLE `panel_link_mapping` +ADD COLUMN `uuid` varchar(8) NULL COMMENT 'uuid' AFTER `user_id`; diff --git a/frontend/src/views/link/view/index.vue b/frontend/src/views/link/view/index.vue index 307a3d4395..4ac41383a6 100644 --- a/frontend/src/views/link/view/index.vue +++ b/frontend/src/views/link/view/index.vue @@ -40,6 +40,8 @@ export default { id: res.data.id, name: res.data.name }) + // 设置浏览器title为当前仪表板名称 + document.title = res.data.name // 刷新联动信息 getPanelAllLinkageInfo(this.resourceId).then(rsp => { this.$store.commit('setNowPanelTrackInfo', rsp.data)