From 95f4f08403ef34b4e7dc1a71789bca47228aba9c Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Fri, 3 Apr 2026 18:09:16 +0800 Subject: [PATCH] =?UTF-8?q?perf(X-Pack):=20=E9=92=89=E9=92=89=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=A2=9E=E5=8A=A0=E8=81=8A=E5=A4=A9=E7=BE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/ehcache/ehcache.xml | 12 +++++++ core/core-frontend/package.json | 1 + core/core-frontend/src/locales/en.ts | 5 +++ core/core-frontend/src/locales/tw.ts | 5 +++ core/core-frontend/src/locales/zh-CN.ts | 5 +++ core/core-frontend/src/permission.ts | 36 ++++++++++++++++++- core/core-frontend/src/utils/RemoteJs.ts | 2 +- .../api/dingtalk/api/DingtalkApi.java | 13 +++++-- .../dto/DingtalkChatCheckRequest.java | 10 ++++++ .../dingtalk/dto/DingtalkSettingCreator.java | 8 +++++ .../dingtalk/dto/DingtalkSignatureInfo.java | 26 ++++++++++++++ .../api/dingtalk/dto/SignatureRequest.java | 11 ++++++ .../api/dingtalk/vo/DingtalkInfoVO.java | 6 ++-- 13 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkChatCheckRequest.java create mode 100644 sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkSignatureInfo.java create mode 100644 sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/SignatureRequest.java diff --git a/core/core-backend/src/main/resources/ehcache/ehcache.xml b/core/core-backend/src/main/resources/ehcache/ehcache.xml index 0e9e4c8bf2..a5eabbba46 100644 --- a/core/core-backend/src/main/resources/ehcache/ehcache.xml +++ b/core/core-backend/src/main/resources/ehcache/ehcache.xml @@ -141,5 +141,17 @@ + + java.lang.String + java.lang.String + + 120 + + + 1000 + 10 + + + diff --git a/core/core-frontend/package.json b/core/core-frontend/package.json index 394ca3d64e..b2bb6a722e 100644 --- a/core/core-frontend/package.json +++ b/core/core-frontend/package.json @@ -31,6 +31,7 @@ "crypto-js": "^4.1.1", "dayjs": "^1.11.9", "decimal.js": "^10.5.0", + "dingtalk-jsapi": "^3.1.0", "echarts": "^5.5.1", "element-plus-secondary": "^1.0.0", "element-resize-detector": "^1.2.4", diff --git a/core/core-frontend/src/locales/en.ts b/core/core-frontend/src/locales/en.ts index 4c2207531a..7a97779eb1 100644 --- a/core/core-frontend/src/locales/en.ts +++ b/core/core-frontend/src/locales/en.ts @@ -4278,6 +4278,10 @@ export default { add_task: 'Add task', lark_groups: 'Lark group', dingtalk_groups: ' Dingtalk group', + dingtalk_groups_tips: 'Create an application robot first and add it to the group', + robot_code_place: 'Defaults to the same as APP Key', + click_add_chat: 'Please click the button below to add a group chat', + add_chat_tips: 'Only supports admin-associated accounts using the client', larksuite_groups: 'Larksuite group', send_setting: 'Send settings', retrying_settings: 'Send failed retry settings', @@ -4657,6 +4661,7 @@ export default { notification_user: 'Notifier', notification_email: 'Email notification', please_enter_email: 'Please enter email, press Enter to confirm', + please_choose_dingtalk_group: 'Please select dingtalk group', please_choose_lark_group: 'Please select lark group', notification_content: 'Notification content', default_msg: 'Default message', diff --git a/core/core-frontend/src/locales/tw.ts b/core/core-frontend/src/locales/tw.ts index 2b78c7d642..5a9d554a39 100644 --- a/core/core-frontend/src/locales/tw.ts +++ b/core/core-frontend/src/locales/tw.ts @@ -4159,6 +4159,10 @@ export default { add_task: '新增任務', lark_groups: '飛書群', dingtalk_groups: '釘釘群', + dingtalk_groups_tips: '先建立應用機器人並添加到群裡', + robot_code_place: '默認與 APP Key一致', + click_add_chat: '請點擊下方按鈕添加群聊', + add_chat_tips: '僅支持 admin 關聯帳號在客戶端使用', larksuite_groups: '國際飛書群', send_setting: '發送設定', retrying_settings: '發送失敗重試設定', @@ -4525,6 +4529,7 @@ export default { notification_user: '通知人', notification_email: '郵件通知', please_enter_email: '請輸入郵箱,回車確認', + please_choose_dingtalk_group: '請選擇釘釘群', please_choose_lark_group: '請選擇飛書群', notification_content: '通知內容', default_msg: '默認消息', diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index 1958efe61c..d73114e02f 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -4163,6 +4163,10 @@ export default { add_task: '添加任务', lark_groups: '飞书群', dingtalk_groups: '钉钉群', + dingtalk_groups_tips: '先创建应用机器人并添加到群里', + robot_code_place: '默认与 APP Key一致', + click_add_chat: '请点击下方按钮添加群聊', + add_chat_tips: '仅支持 admin 关联账号在客户端使用', larksuite_groups: '国际飞书群', send_setting: '发送设置', retrying_settings: '发送失败重试设置', @@ -4534,6 +4538,7 @@ export default { notification_user: '通知人', notification_email: '邮件通知', please_enter_email: '请输入邮箱,回车确认', + please_choose_dingtalk_group: '请选择钉钉群', please_choose_lark_group: '请选择飞书群', notification_content: '通知内容', default_msg: '默认消息', diff --git a/core/core-frontend/src/permission.ts b/core/core-frontend/src/permission.ts index 93fa94b246..7b15d80c7e 100644 --- a/core/core-frontend/src/permission.ts +++ b/core/core-frontend/src/permission.ts @@ -13,6 +13,7 @@ import { interactiveStoreWithOut } from '@/store/modules/interactive' import { useAppearanceStoreWithOut } from '@/store/modules/appearance' import { useEmbedded } from '@/store/modules/embedded' import { useLoading } from '@/hooks/web/useLoading' +import { ElMessageBox } from 'element-plus-secondary' const appearanceStore = useAppearanceStoreWithOut() const { wsCache } = useCache() const permissionStore = usePermissionStoreWithOut() @@ -109,6 +110,9 @@ router.beforeEach(async (to, from, next) => { }, {}) } if (!pathValid(to.path) && to.path !== '/404' && !to.path.startsWith('/de-link')) { + if (to.path.startsWith('/sys-setting')) { + await noAdminPermission() + } const firstPath = getFirstAuthMenu() next({ path: firstPath || '/404' }) return @@ -137,6 +141,9 @@ router.beforeEach(async (to, from, next) => { await interactiveStore.initInteractive(true) if (!pathValid(to.path) && to.path !== '/404' && !to.path.startsWith('/de-link')) { + if (to.path.startsWith('/sys-setting')) { + await noAdminPermission() + } const firstPath = getFirstAuthMenu() next({ path: firstPath || '/404' }) return @@ -169,7 +176,34 @@ router.beforeEach(async (to, from, next) => { } } }) - +const noAdminPermission = async () => { + const promise = new Promise((resolve, reject) => { + ElMessageBox.confirm('当前页面仅对 admin 开放, 即将跳转首页', { + confirmButtonType: 'primary', + type: 'warning', + confirmButtonText: '确定', + cancelButtonText: '', + autofocus: false, + showCancelButton: false, + showClose: false + }) + .then(() => { + resolve() + }) + .catch(() => { + reject() + }) + }) + return Promise.race([ + promise, + new Promise(resolve => { + setTimeout(() => { + ElMessageBox.close() + resolve() + }, 3000) + }) + ]) +} router.afterEach(() => { done() loadDone() diff --git a/core/core-frontend/src/utils/RemoteJs.ts b/core/core-frontend/src/utils/RemoteJs.ts index 289fca8935..79743f0151 100644 --- a/core/core-frontend/src/utils/RemoteJs.ts +++ b/core/core-frontend/src/utils/RemoteJs.ts @@ -1,5 +1,5 @@ export const loadScript = (url: string, jsId?: string) => { - return new Promise(function (resolve, reject) { + return new Promise(function (resolve, reject) { const scriptId = jsId || 'de-fit2cloud-script-id' let dom = document.getElementById(scriptId) if (dom) { diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/api/DingtalkApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/api/DingtalkApi.java index 20d78b6463..fd6857b18b 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/api/DingtalkApi.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/api/DingtalkApi.java @@ -1,11 +1,10 @@ package io.dataease.api.dingtalk.api; import com.github.xiaoymin.knife4j.annotations.ApiSupport; -import io.dataease.api.dingtalk.dto.DingtalkEnableEditor; -import io.dataease.api.dingtalk.dto.DingtalkSettingCreator; -import io.dataease.api.dingtalk.dto.DingtalkTokenRequest; +import io.dataease.api.dingtalk.dto.*; import io.dataease.api.dingtalk.vo.DingtalkInfoVO; import io.dataease.api.lark.vo.LarkGroupVO; +import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.GetMapping; @@ -47,4 +46,12 @@ public interface DingtalkApi { @Operation(summary = "获取群组", hidden = true) @GetMapping("/getGroup") LarkGroupVO getGroup(); + + @Hidden + @PostMapping("/getSignatureInfo") + DingtalkSignatureInfo getSignatureInfo(@RequestBody SignatureRequest request); + + @Hidden + @PostMapping("/checkChat") + void checkChat(@RequestBody DingtalkChatCheckRequest request); } diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkChatCheckRequest.java b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkChatCheckRequest.java new file mode 100644 index 0000000000..d03445bb0d --- /dev/null +++ b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkChatCheckRequest.java @@ -0,0 +1,10 @@ +package io.dataease.api.dingtalk.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class DingtalkChatCheckRequest implements Serializable { + private String chatId; +} diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkSettingCreator.java b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkSettingCreator.java index 09ee809e15..02d234d6a2 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkSettingCreator.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkSettingCreator.java @@ -1,13 +1,17 @@ package io.dataease.api.dingtalk.dto; +import io.dataease.api.dingtalk.vo.DingtalkChatItem; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; +import java.util.List; @Schema(description = "钉钉设置构造器") @Data public class DingtalkSettingCreator implements Serializable { + @Schema(description = "corpId", requiredMode = Schema.RequiredMode.REQUIRED) + private String corpId; @Schema(description = "agentId", requiredMode = Schema.RequiredMode.REQUIRED) private String agentId; @Schema(description = "appKey", requiredMode = Schema.RequiredMode.REQUIRED) @@ -20,4 +24,8 @@ public class DingtalkSettingCreator implements Serializable { private Boolean enable; @Schema(description = "是否有效") private Boolean valid; + @Schema(description = "机器人Code") + private String robotCode; + @Schema(description = "群列表") + private List chatList; } diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkSignatureInfo.java b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkSignatureInfo.java new file mode 100644 index 0000000000..fe86b8281f --- /dev/null +++ b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/DingtalkSignatureInfo.java @@ -0,0 +1,26 @@ +package io.dataease.api.dingtalk.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class DingtalkSignatureInfo implements Serializable { + + private String corpId; + + private String agentId; + + private String timeStamp; + + private String nonceStr; + + private String signature; + + private Integer type = 0; + + private List jsApiList = List.of("chooseChat"); + + +} diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/SignatureRequest.java b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/SignatureRequest.java new file mode 100644 index 0000000000..7232c6e7c9 --- /dev/null +++ b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/dto/SignatureRequest.java @@ -0,0 +1,11 @@ +package io.dataease.api.dingtalk.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SignatureRequest implements Serializable { + + private String currentUrl; +} diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/vo/DingtalkInfoVO.java b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/vo/DingtalkInfoVO.java index f802adce67..88c70f9c6d 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/vo/DingtalkInfoVO.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/vo/DingtalkInfoVO.java @@ -10,6 +10,8 @@ import java.util.List; @Schema(description = "钉钉信息") @Data public class DingtalkInfoVO implements Serializable { + @Schema(description = "corpId") + private String corpId; @Schema(description = "agentId") private String agentId; @Schema(description = "appKey") @@ -23,10 +25,10 @@ public class DingtalkInfoVO implements Serializable { @Schema(description = "是否可用") private Boolean valid = false; - @JsonIgnore + @Schema(description = "机器人Code") private String robotCode; - @JsonIgnore + @Schema(description = "群列表") private List chatList; }