From b3c8faab701104ddda5f4cd8fe2cbd0f3b52f178 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Tue, 12 May 2026 21:40:56 +0800 Subject: [PATCH] feat: add Feishu notification configuration UI --- src/assets/images/logos/feishu.png | Bin 0 -> 17556 bytes .../cards/NotificationChannelCard.vue | 81 ++++++++++++++ src/composables/useSetupWizard.ts | 12 +++ src/locales/en-US.ts | 25 +++++ src/locales/zh-CN.ts | 25 +++++ src/locales/zh-TW.ts | 25 +++++ src/utils/imageUtils.ts | 2 + .../setting/AccountSettingNotification.vue | 7 +- src/views/setup/NotificationSettingsStep.vue | 100 ++++++++++++++++++ src/views/user/UserProfileView.vue | 9 ++ 10 files changed, 284 insertions(+), 2 deletions(-) create mode 100644 src/assets/images/logos/feishu.png diff --git a/src/assets/images/logos/feishu.png b/src/assets/images/logos/feishu.png new file mode 100644 index 0000000000000000000000000000000000000000..36278db26051fc15048c2999111f8fcecf19ca8a GIT binary patch literal 17556 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 // 各通知类型的名称字典 const notificationTypeNames: { [key: string]: string } = { wechat: t('notification.wechat.name'), + feishu: t('notification.feishu.name'), wechatclawbot: t('notification.wechatclawbot.name'), telegram: t('notification.telegram.name'), qqbot: t('notification.qqbot.name'), @@ -417,6 +418,8 @@ const getIcon = computed(() => { return getLogoUrl('wechat') case 'wechatclawbot': return getLogoUrl('wechatclawbot') + case 'feishu': + return getLogoUrl('feishu') case 'telegram': return getLogoUrl('telegram') case 'qqbot': @@ -777,6 +780,84 @@ watch(notificationInfoDialog, value => { + + + + + + + + + + + + + + + + + + + + + + + + + + = { wechat: '企业微信', + feishu: '飞书', wechatclawbot: '微信 ClawBot', telegram: 'Telegram', slack: 'Slack', @@ -679,6 +681,16 @@ export function useSetupWizard() { break case 'wechatclawbot': break + case 'feishu': + if (!config.FEISHU_APP_ID?.trim()) { + errors.push(t('notification.feishu.appIdRequired')) + validationErrors.value.notification.FEISHU_APP_ID = true + } + if (!config.FEISHU_APP_SECRET?.trim()) { + errors.push(t('notification.feishu.appSecretRequired')) + validationErrors.value.notification.FEISHU_APP_SECRET = true + } + break case 'telegram': if (!config.TELEGRAM_TOKEN?.trim()) { errors.push(t('notification.telegram.tokenRequired')) diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index f365999a..d61fbd29 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -505,6 +505,28 @@ export default { logoutSuccess: 'WeChat ClawBot logged out', logoutFailed: 'Failed to logout WeChat ClawBot', }, + feishu: { + name: 'Feishu', + appId: 'App ID', + appIdHint: 'App ID of the Feishu Open Platform application', + appIdRequired: 'App ID cannot be empty', + appSecret: 'App Secret', + appSecretHint: 'App Secret of the Feishu Open Platform application', + appSecretRequired: 'App Secret cannot be empty', + openId: 'Default User Open ID', + openIdHint: 'Default recipient user Open ID; leave empty to prefer recent interacted users', + openIdPlaceholder: 'ou_xxx', + chatId: 'Default Group Chat ID', + chatIdHint: 'Default recipient group chat ID; either this or Open ID is enough', + chatIdPlaceholder: 'oc_xxx', + admins: 'Admin Whitelist', + adminsHint: 'Open IDs allowed to run commands and admin actions, separated by commas', + adminsPlaceholder: 'Open ID list, separated by commas', + verificationToken: 'Verification Token', + verificationTokenHint: 'Verification Token for Feishu event subscription, required when validation is enabled', + encryptKey: 'Encrypt Key', + encryptKeyHint: 'Encrypt Key for Feishu event subscription, required when encryption is enabled', + }, telegram: { name: 'Telegram', token: 'Bot Token', @@ -1769,6 +1791,7 @@ export default { channel: 'Notification', wechat: 'WeChat Work', wechatClawBot: 'WeChat ClawBot', + feishu: 'Feishu', resourceDownload: 'Resource Download', mediaImport: 'Media Import', subscription: 'Subscription', @@ -2851,6 +2874,7 @@ export default { accountBinding: 'Account Binding', wechatUser: 'WeChat Work User', wechatClawBotUser: 'WeChat ClawBot User', + feishuUser: 'Feishu User', telegramUser: 'Telegram User', slackUser: 'Slack User', discordUser: 'Discord User', @@ -3441,6 +3465,7 @@ export default { typeHint: 'Select the type of notification channel to use', name: 'Notification Name', nameHint: 'Set a name for the notification channel', + feishuConfig: 'Feishu Configuration', telegramConfig: 'Telegram Configuration', emailConfig: 'Email Configuration', botToken: 'Bot Token', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 72b15264..1617c8db 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -500,6 +500,28 @@ export default { logoutSuccess: '微信 ClawBot 已退出登录', logoutFailed: '微信 ClawBot 退出登录失败', }, + feishu: { + name: '飞书', + appId: 'App ID', + appIdHint: '飞书开放平台应用的 App ID', + appIdRequired: 'App ID 不能为空', + appSecret: 'App Secret', + appSecretHint: '飞书开放平台应用的 App Secret', + appSecretRequired: 'App Secret 不能为空', + openId: '默认用户 Open ID', + openIdHint: '默认通知接收用户的 Open ID,留空则优先使用互动用户', + openIdPlaceholder: 'ou_xxx', + chatId: '默认群聊 Chat ID', + chatIdHint: '默认通知接收群聊的 Chat ID,和 Open ID 二选一即可', + chatIdPlaceholder: 'oc_xxx', + admins: '管理员白名单', + adminsHint: '允许执行命令和管理操作的 Open ID 列表,多个使用 , 分隔', + adminsPlaceholder: 'Open ID 列表,多个使用 , 分隔', + verificationToken: 'Verification Token', + verificationTokenHint: '飞书事件订阅的 Verification Token,启用事件校验时填写', + encryptKey: 'Encrypt Key', + encryptKeyHint: '飞书事件订阅的 Encrypt Key,启用消息加密时填写', + }, telegram: { name: 'Telegram', token: 'Bot Token', @@ -1739,6 +1761,7 @@ export default { channel: '通知', wechat: '企业微信', wechatClawBot: '微信 ClawBot', + feishu: '飞书', resourceDownload: '资源下载', mediaImport: '整理入库', subscription: '订阅', @@ -2803,6 +2826,7 @@ export default { accountBinding: '账号绑定', wechatUser: '企业微信用户', wechatClawBotUser: '微信 ClawBot 用户', + feishuUser: '飞书用户', telegramUser: 'Telegram用户', slackUser: 'Slack用户', discordUser: 'Discord用户', @@ -3386,6 +3410,7 @@ export default { typeHint: '选择要使用的通知渠道类型', name: '通知名称', nameHint: '为通知渠道设置一个名称', + feishuConfig: '飞书配置', telegramConfig: 'Telegram 配置', emailConfig: '邮件配置', botToken: '机器人令牌', diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts index 99ccbd71..c55aec01 100644 --- a/src/locales/zh-TW.ts +++ b/src/locales/zh-TW.ts @@ -501,6 +501,28 @@ export default { logoutSuccess: '微信 ClawBot 已退出登入', logoutFailed: '微信 ClawBot 退出登入失敗', }, + feishu: { + name: '飛書', + appId: 'App ID', + appIdHint: '飛書開放平台應用的 App ID', + appIdRequired: 'App ID 不能為空', + appSecret: 'App Secret', + appSecretHint: '飛書開放平台應用的 App Secret', + appSecretRequired: 'App Secret 不能為空', + openId: '預設用戶 Open ID', + openIdHint: '預設通知接收用戶的 Open ID,留空則優先使用互動用戶', + openIdPlaceholder: 'ou_xxx', + chatId: '預設群聊 Chat ID', + chatIdHint: '預設通知接收群聊的 Chat ID,和 Open ID 二選一即可', + chatIdPlaceholder: 'oc_xxx', + admins: '管理員白名單', + adminsHint: '允許執行命令與管理操作的 Open ID 列表,多個使用 , 分隔', + adminsPlaceholder: 'Open ID 列表,多個使用 , 分隔', + verificationToken: 'Verification Token', + verificationTokenHint: '飛書事件訂閱的 Verification Token,啟用事件校驗時填寫', + encryptKey: 'Encrypt Key', + encryptKeyHint: '飛書事件訂閱的 Encrypt Key,啟用消息加密時填寫', + }, telegram: { name: 'Telegram', token: 'Bot Token', @@ -1741,6 +1763,7 @@ export default { channel: '通知', wechat: '企業微信', wechatClawBot: '微信 ClawBot', + feishu: '飛書', resourceDownload: '資源下載', mediaImport: '整理入庫', subscription: '訂閱', @@ -2805,6 +2828,7 @@ export default { accountBinding: '賬號綁定', wechatUser: '企業微信用戶', wechatClawBotUser: '微信 ClawBot 用戶', + feishuUser: '飛書用戶', telegramUser: 'Telegram用戶', slackUser: 'Slack用戶', discordUser: 'Discord用戶', @@ -3388,6 +3412,7 @@ export default { typeHint: '選擇要使用的通知管道類型', name: '通知名稱', nameHint: '為通知管道設定一個名稱', + feishuConfig: '飛書設定', telegramConfig: 'Telegram 設定', emailConfig: '郵件設定', botToken: '機器人權杖', diff --git a/src/utils/imageUtils.ts b/src/utils/imageUtils.ts index 7d9f7c80..4e0a4c65 100644 --- a/src/utils/imageUtils.ts +++ b/src/utils/imageUtils.ts @@ -14,6 +14,7 @@ import plexLogo from '@/assets/images/logos/plex.png' import trimemediaLogo from '@/assets/images/logos/trimemedia.png' import ugreenLogo from '@/assets/images/logos/ugreen.png' import wechatLogo from '@/assets/images/logos/wechat.png' +import feishuLogo from '@/assets/images/logos/feishu.png' import clawbotLogo from '@/assets/images/logos/clawbot.png' import telegramLogo from '@/assets/images/logos/telegram.webp' import slackLogo from '@/assets/images/logos/slack.webp' @@ -47,6 +48,7 @@ const logoMap: Record = { trimemedia: trimemediaLogo, ugreen: ugreenLogo, wechat: wechatLogo, + feishu: feishuLogo, wechatclawbot: clawbotLogo, telegram: telegramLogo, slack: slackLogo, diff --git a/src/views/setting/AccountSettingNotification.vue b/src/views/setting/AccountSettingNotification.vue index 79d4ab77..bf201903 100644 --- a/src/views/setting/AccountSettingNotification.vue +++ b/src/views/setting/AccountSettingNotification.vue @@ -357,9 +357,12 @@ onMounted(() => { {{ t('setting.notification.wechatClawBot') }} - - {{ t('setting.notification.telegram') }} + + {{ t('setting.notification.feishu') }} + + {{ t('setting.notification.telegram') }} + {{ t('setting.notification.slack') }} diff --git a/src/views/setup/NotificationSettingsStep.vue b/src/views/setup/NotificationSettingsStep.vue index 4e98f861..e93501f3 100644 --- a/src/views/setup/NotificationSettingsStep.vue +++ b/src/views/setup/NotificationSettingsStep.vue @@ -66,6 +66,19 @@ const notificationTypes = [ + + + + +
飞书
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +