From cbefc1d6f212d82cb13e8f6d5e45ac22376758d0 Mon Sep 17 00:00:00 2001 From: eoao Date: Tue, 29 Jul 2025 20:00:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A7=84=E5=88=99=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E4=BA=BA=E6=9C=BA=E9=AA=8C=E8=AF=81=E5=92=8C=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=A4=B1=E8=B4=A5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mail-vue/src/i18n/en.js | 6 +- mail-vue/src/i18n/index.js | 4 +- mail-vue/src/i18n/zh.js | 4 + mail-vue/src/init/init.js | 4 +- mail-vue/src/layout/account/index.vue | 55 ++++- mail-vue/src/views/login/index.vue | 81 ++++++-- mail-vue/src/views/sys-setting/index.vue | 86 +++++++- ...{index-CTj27R8v.css => index-BEDjT-8v.css} | 2 +- mail-worker/dist/assets/index-BOcWPX50.js | 193 ------------------ mail-worker/dist/assets/index-BwB6muO3.js | 193 ++++++++++++++++++ mail-worker/dist/index.html | 4 +- mail-worker/src/api/test-api.js | 1 + mail-worker/src/const/entity-const.js | 11 +- mail-worker/src/entity/setting.js | 2 + mail-worker/src/entity/verify-record.js | 10 + mail-worker/src/i18n/en.js | 2 +- mail-worker/src/i18n/zh.js | 2 +- mail-worker/src/index.js | 3 + mail-worker/src/init/init.js | 24 +++ mail-worker/src/service/account-service.js | 36 +++- mail-worker/src/service/login-service.js | 30 ++- mail-worker/src/service/setting-service.js | 51 +++-- mail-worker/src/service/turnstile-service.js | 2 +- .../src/service/verify-record-service.js | 90 ++++++++ mail-worker/src/utils/ip-utils.js | 9 + 25 files changed, 632 insertions(+), 273 deletions(-) rename mail-worker/dist/assets/{index-CTj27R8v.css => index-BEDjT-8v.css} (76%) delete mode 100644 mail-worker/dist/assets/index-BOcWPX50.js create mode 100644 mail-worker/dist/assets/index-BwB6muO3.js create mode 100644 mail-worker/src/entity/verify-record.js create mode 100644 mail-worker/src/service/verify-record-service.js create mode 100644 mail-worker/src/utils/ip-utils.js diff --git a/mail-vue/src/i18n/en.js b/mail-vue/src/i18n/en.js index 9fb4fd0..1002f57 100644 --- a/mail-vue/src/i18n/en.js +++ b/mail-vue/src/i18n/en.js @@ -255,7 +255,11 @@ const en = { backgroundUrlDesc: 'Image URL', localUpload: ' Local upload', imageLink: 'Image URL', - backgroundWarning: 'Image file size affects website load speed.' + imageLinkErrorMsg: 'Invalid image URL', + backgroundWarning: 'Image file size affects website load speed.', + rulesVerify: 'Rules', + rulesVerifyTitle: 'Trigger After {count} Daily Uses per IP', + botVerifyMsg: 'Please verify that you are human', } export default en diff --git a/mail-vue/src/i18n/index.js b/mail-vue/src/i18n/index.js index c6a5119..b6005a8 100644 --- a/mail-vue/src/i18n/index.js +++ b/mail-vue/src/i18n/index.js @@ -4,8 +4,8 @@ import zh from './zh.js' const i18n = createI18n({ legacy: false, messages: { - en, - zh + zh, + en }, }); diff --git a/mail-vue/src/i18n/zh.js b/mail-vue/src/i18n/zh.js index c1eab35..311428f 100644 --- a/mail-vue/src/i18n/zh.js +++ b/mail-vue/src/i18n/zh.js @@ -255,6 +255,10 @@ const zh = { backgroundUrlDesc: '在线图片链接', localUpload: '本地上传', imageLink: '图片链接', + imageLinkErrorMsg: '图片链接不正确', backgroundWarning: '图片文件大小会影响网站加载速度', + rulesVerify: '规则', + rulesVerifyTitle: 'IP 每天使用 {count} 次后触发', + botVerifyMsg: '请完成人机验证', } export default zh \ No newline at end of file diff --git a/mail-vue/src/init/init.js b/mail-vue/src/init/init.js index 7ed09f0..76e9cd1 100644 --- a/mail-vue/src/init/init.js +++ b/mail-vue/src/init/init.js @@ -6,6 +6,7 @@ import {permsToRouter} from "@/perm/perm.js"; import router from "@/router"; import {websiteConfig} from "@/request/setting.js"; import {cvtR2Url} from "@/utils/convert.js"; +import i18n from "@/i18n/index.js"; export async function init() { document.title = '\u200B' @@ -15,11 +16,12 @@ export async function init() { const accountStore = useAccountStore(); const token = localStorage.getItem('token'); - if (!settingStore.lang) { settingStore.lang = navigator.language.split('-')[0] } + i18n.global.locale.value = settingStore.lang + let setting = null; if (token) { diff --git a/mail-vue/src/layout/account/index.vue b/mail-vue/src/layout/account/index.vue index 1e076f5..1885396 100644 --- a/mail-vue/src/layout/account/index.vue +++ b/mail-vue/src/layout/account/index.vue @@ -103,7 +103,10 @@ :class="verifyShow ? 'turnstile-show' : 'turnstile-hide'" :data-sitekey="settingStore.settings.siteKey" data-callback="onTurnstileSuccess" - > + data-error-callback="onTurnstileError" + > + 人机验证模块加载失败,请刷新浏览器 +
@@ -145,6 +148,7 @@ const accountName = ref(null) const addRef = ref({}) let account = null let turnstileId = null +const botJsError = ref(false) let verifyToken = '' const addForm = reactive({ email: '', @@ -170,11 +174,19 @@ const openSelect = () => { mySelect.value.toggleMenu() } +window.onTurnstileError = (e) => { + console.log('人机验加载失败') + nextTick(() => { + if (!turnstileId) { + turnstileId = window.turnstile.render('.register-turnstile') + } else { + window.turnstile.reset(turnstileId); + } + }) +}; + window.onTurnstileSuccess = (token) => { verifyToken = token; - setTimeout(() => { - verifyShow.value = false - },1500) }; function setName() { @@ -338,14 +350,27 @@ function submit() { }) return } - if (!verifyToken && settingStore.settings.addEmailVerify === 0) { - verifyShow.value = true - if (!turnstileId) { + if (!verifyToken && (settingStore.settings.addEmailVerify === 0 || (settingStore.settings.addEmailVerify === 2 && settingStore.settings.addVerifyOpen))) { + if (!verifyShow.value) { + verifyShow.value = true nextTick(() => { - turnstileId = window.turnstile.render('.add-email-turnstile') + if (!turnstileId) { + try { + turnstileId = window.turnstile.render('.add-email-turnstile') + } catch (e) { + botJsError.value = true + console.log('人机验证js加载失败') + } + } else { + window.turnstile.reset('.add-email-turnstile') + } + }) + } else if (!botJsError.value) { + ElMessage({ + message: t('botVerifyMsg'), + type: "error", + plain: true }) - } else { - window.turnstile.reset(turnstileId) } return; } @@ -357,16 +382,24 @@ function submit() { addForm.email = '' accounts.push(account) verifyToken = '' + settingStore.settings.addVerifyOpen = account.addVerifyOpen ElMessage({ message: t('addSuccessMsg'), type: "success", plain: true }) + verifyShow.value = false userStore.refreshUserInfo() }).catch(res => { if (res.code === 400) { verifyToken = '' - window.turnstile.reset(turnstileId) + if (turnstileId) { + window.turnstile.reset(turnstileId) + } else { + nextTick(() => { + turnstileId = window.turnstile.render('.add-email-turnstile') + }) + } verifyShow.value = true } addLoading.value = false diff --git a/mail-vue/src/views/login/index.vue b/mail-vue/src/views/login/index.vue index 42839a4..152799b 100644 --- a/mail-vue/src/views/login/index.vue +++ b/mail-vue/src/views/login/index.vue @@ -13,11 +13,12 @@ {{settingStore.settings.title}} {{$t('loginTitle')}} {{$t('regTitle')}} -
+