diff --git a/frontend/src/common/pattern.ts b/frontend/src/common/pattern.ts deleted file mode 100644 index 887571d8..00000000 --- a/frontend/src/common/pattern.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { i18n } from '@/i18n'; - -export const AccountUsernamePattern = { - pattern: /^[a-zA-Z0-9_]{5,16}$/g, - message: i18n.global.t('system.account.usernamePatternErrMsg'), -}; - -export const ResourceCodePattern = { - pattern: /^[a-zA-Z0-9_\-.:]{1,32}$/g, - message: i18n.global.t('system.menu.resourceCodePatternErrMsg'), -}; diff --git a/frontend/src/common/rule.ts b/frontend/src/common/rule.ts new file mode 100644 index 00000000..242cc50c --- /dev/null +++ b/frontend/src/common/rule.ts @@ -0,0 +1,41 @@ +import { useI18nPleaseInput, useI18nPleaseSelect } from '@/hooks/useI18n'; +import { i18n } from '@/i18n'; + +/** + * 表单验证规则 + * label: 支持 i18n key + */ +export const Rules = { + requiredInput: (label: string = '', trigger: string[] = ['change', 'blur']) => { + return { + required: true, + message: useI18nPleaseInput(label), + trigger: trigger, + }; + }, + + requiredSelect: (label: string = '', trigger: string[] = ['change', 'blur']) => { + return { + required: true, + message: useI18nPleaseSelect(label), + trigger: trigger, + }; + }, + + accountUsername: { + pattern: /^[a-zA-Z0-9_]{5,16}$/g, + message: i18n.global.t('system.account.usernamePatternErrMsg'), + trigger: 'blur', + }, + accountPassword: { + pattern: /^(?=.*[A-Za-z])(?=.*\d)(?=.*[`~!@#$%^&*()_+<>?:"{},.\/\\;'[\]])[A-Za-z\d`~!@#$%^&*()_+<>?:"{},.\/\\;'[\]]{8,}$/, + message: i18n.global.t('login.passwordRuleTip'), + trigger: 'blur', + }, + + resourceCode: { + pattern: /^[a-zA-Z0-9_\-.:]{1,32}$/g, + message: i18n.global.t('system.menu.resourceCodePatternErrMsg'), + trigger: 'blur', + }, +}; diff --git a/frontend/src/hooks/useI18n.ts b/frontend/src/hooks/useI18n.ts index 0ea2c95f..c7f8f5f1 100644 --- a/frontend/src/hooks/useI18n.ts +++ b/frontend/src/hooks/useI18n.ts @@ -79,16 +79,29 @@ export function useI18nDetailTitle(i18nKey: string) { } export function useI18nOperateSuccessMsg() { - const t = i18n.global.t; - ElMessage.success(t('common.operateSuccess')); + MsgSuccess('common.operateSuccess'); } export function useI18nSaveSuccessMsg() { - const t = i18n.global.t; - ElMessage.success(t('common.saveSuccess')); + MsgSuccess('common.saveSuccess'); } export function useI18nDeleteSuccessMsg() { - const t = i18n.global.t; - ElMessage.success(t('common.deleteSuccess')); + MsgSuccess('common.deleteSuccess'); +} + +/** + * error msg + * @param msg msg(支持i8n msgkey) + */ +export function MsgError(msg: string) { + ElMessage.error(i18n.global.t(msg)); +} + +/** + * success msg + * @param msg msg(支持i8n msgkey) + */ +export function MsgSuccess(msg: string) { + ElMessage.success(i18n.global.t(msg)); } diff --git a/frontend/src/i18n/en/common.ts b/frontend/src/i18n/en/common.ts index 92b1039d..4d9e7160 100644 --- a/frontend/src/i18n/en/common.ts +++ b/frontend/src/i18n/en/common.ts @@ -23,6 +23,7 @@ export default { time: 'Time', account: 'Account', password: 'Password', + captcha: 'Captcha', createTime: 'Create Time', creator: 'Creator', updateTime: 'Update Time', @@ -338,25 +339,19 @@ export default { accountPasswordLogin: 'Account Password Login', thirdPartyLogin: 'Third Party login', ldapLogin: 'LDAP Login', - inputUsernamePlaceholder: 'Please enter your username', - inputPasswordPlaceholder: 'Please enter your password', - inputCaptchaPlaceholder: 'Please enter the verification code', login: 'Login', loginFailTip: 'Tip: If you fail to log in more than {loginFailCount} times, you will not be allowed to log in again for {loginFailMin} minutes', loginSuccessTip: 'welcome back!', changePassword: 'Change Password', oldPassword: 'Old Password', newPassword: 'New Password', - inputNewPasswordPlaceholder: 'Please enter a new password', passwordRuleTip: 'Must be at least 8 characters long and contain upper/lower case + number + special symbol', passwordChangeSuccessTip: 'The password has been changed successfully, and the new password has been filled in the login password box', otpValidation: 'OTP validation', qrCode: 'QR code', enterOtpCodeTip: 'Enter the authorization code shown in the Token APP', - inputOtpCodePlaceholder: 'Please enter the OTP authorization code', updateBasicInfo: 'Modifying basic information', name: 'Name', - inputNamePlaceholder: 'Please enter your name', }, components: { df: { diff --git a/frontend/src/i18n/en/system.ts b/frontend/src/i18n/en/system.ts index f19619f2..0aff0b50 100644 --- a/frontend/src/i18n/en/system.ts +++ b/frontend/src/i18n/en/system.ts @@ -34,8 +34,6 @@ export default { inline: 'Embedded', linkAddress: 'Link Address', linkPlaceholder: 'External/embedded links (http://xxx.com)', - menuNameRuleMsg: 'Please enter a resource name', - codeRuleMsg: 'Please enter a resource code', routeNameNotEmpty: 'Route names cannot be empty', resourceCodePatternErrMsg: 'Only 1-32 uppercase letters, numbers, and -.: characters are allowed', assignedRole: 'Assigned Role', diff --git a/frontend/src/i18n/zh-cn/common.ts b/frontend/src/i18n/zh-cn/common.ts index 49eb898e..529c8ea4 100644 --- a/frontend/src/i18n/zh-cn/common.ts +++ b/frontend/src/i18n/zh-cn/common.ts @@ -23,6 +23,7 @@ export default { time: '时间', account: '账号', password: '密码', + captcha: '验证码', createTime: '创建时间', creator: '创建者', updateTime: '更新时间', @@ -348,9 +349,6 @@ export default { accountPasswordLogin: '账号密码登录', thirdPartyLogin: '第三方登录', ldapLogin: 'LDAP 登录', - inputUsernamePlaceholder: '请输入用户名', - inputPasswordPlaceholder: '请输入密码', - inputCaptchaPlaceholder: '请输入验证码', login: '登 录', loginFailTip: '提示:登录失败超过{loginFailCount}次后将被限制{loginFailMin}分钟内不可再次登录', loginSuccessTip: '欢迎回来!', @@ -364,7 +362,6 @@ export default { enterOtpCodeTip: '请输入令牌APP中显示的授权码', updateBasicInfo: '修改基本信息', name: '姓名', - inputNamePlaceholder: '请输入姓名', }, components: { df: { diff --git a/frontend/src/i18n/zh-cn/system.ts b/frontend/src/i18n/zh-cn/system.ts index 9255f321..7dff8614 100644 --- a/frontend/src/i18n/zh-cn/system.ts +++ b/frontend/src/i18n/zh-cn/system.ts @@ -33,8 +33,6 @@ export default { inline: '内嵌', linkAddress: '链接地址', linkPlaceholder: '外链/内嵌的链接地址(http://xxx.com)', - menuNameRuleMsg: '请输入资源名称', - codeRuleMsg: '请输入code', routeNameNotEmpty: '路由名不能为空', resourceCodePatternErrMsg: '只允许输入1-32位大小写字母、数字、_-.:', assignedRole: '已分配角色', diff --git a/frontend/src/views/flow/ProcInstEdit.vue b/frontend/src/views/flow/ProcInstEdit.vue index ce90654f..e0772396 100755 --- a/frontend/src/views/flow/ProcInstEdit.vue +++ b/frontend/src/views/flow/ProcInstEdit.vue @@ -53,8 +53,8 @@ import { FlowBizType } from './enums'; import EnumSelect from '@/components/enumselect/EnumSelect.vue'; import ProcdefTasks from './components/ProcdefTasks.vue'; import RedisRunCmdFlowBizForm from './flowbiz/redis/RedisRunCmdFlowBizForm.vue'; -import { useI18nPleaseInput, useI18nPleaseSelect } from '@/hooks/useI18n'; import { useI18n } from 'vue-i18n'; +import { Rules } from '@/common/rule'; const DbSqlExecFlowBizForm = defineAsyncComponent(() => import('./flowbiz/dbms/DbSqlExecFlowBizForm.vue')); @@ -81,20 +81,8 @@ const bizComponents: any = shallowReactive({ }); const rules = { - bizType: [ - { - required: true, - message: useI18nPleaseSelect('flow.bizType'), - trigger: ['change', 'blur'], - }, - ], - remark: [ - { - required: true, - message: useI18nPleaseInput('common.remark'), - trigger: ['change', 'blur'], - }, - ], + bizType: [Rules.requiredSelect('flow.bizType')], + remark: [Rules.requiredInput('common.remark')], }; const defaultForm = { diff --git a/frontend/src/views/flow/ProcdefEdit.vue b/frontend/src/views/flow/ProcdefEdit.vue index 0169eb2d..d44728a6 100755 --- a/frontend/src/views/flow/ProcdefEdit.vue +++ b/frontend/src/views/flow/ProcdefEdit.vue @@ -91,9 +91,10 @@ import { ProcdefStatus } from './enums'; import TagTreeCheck from '../ops/component/TagTreeCheck.vue'; import { TagResourceTypeEnum, TagResourceTypePath } from '@/common/commonEnum'; import EnumSelect from '@/components/enumselect/EnumSelect.vue'; -import { useI18nFormValidate, useI18nPleaseInput, useI18nSaveSuccessMsg } from '@/hooks/useI18n'; +import { useI18nFormValidate, useI18nSaveSuccessMsg } from '@/hooks/useI18n'; import { useI18n } from 'vue-i18n'; import FormItemTooltip from '@/components/form/FormItemTooltip.vue'; +import { Rules } from '@/common/rule'; const { t } = useI18n(); @@ -115,20 +116,8 @@ const formRef: any = ref(null); const taskTableRef: any = ref(null); const rules = { - name: [ - { - required: true, - message: useI18nPleaseInput('common.name'), - trigger: ['change', 'blur'], - }, - ], - defKey: [ - { - required: true, - message: useI18nPleaseInput('Key'), - trigger: ['change', 'blur'], - }, - ], + name: [Rules.requiredInput('common.name')], + defKey: [Rules.requiredInput('key')], }; const state = reactive({ diff --git a/frontend/src/views/flow/flowbiz/dbms/DbSqlExecFlowBizForm.vue b/frontend/src/views/flow/flowbiz/dbms/DbSqlExecFlowBizForm.vue index c43d8d2c..8a39aca4 100755 --- a/frontend/src/views/flow/flowbiz/dbms/DbSqlExecFlowBizForm.vue +++ b/frontend/src/views/flow/flowbiz/dbms/DbSqlExecFlowBizForm.vue @@ -24,26 +24,11 @@ import DbSelectTree from '@/views/ops/db/component/DbSelectTree.vue'; import MonacoEditor from '@/components/monaco/MonacoEditor.vue'; import { registerDbCompletionItemProvider } from '@/views/ops/db/db'; import { TagResourceTypeEnum } from '@/common/commonEnum'; -import { useI18n } from 'vue-i18n'; -import { useI18nPleaseInput } from '@/hooks/useI18n'; - -const { t } = useI18n(); +import { Rules } from '@/common/rule'; const rules = { - dbId: [ - { - required: true, - message: t('flow.selectDbPlaceholder'), - trigger: ['change', 'blur'], - }, - ], - sql: [ - { - required: true, - message: useI18nPleaseInput('flow.runSql'), - trigger: ['change', 'blur'], - }, - ], + dbId: [Rules.requiredSelect('db.db')], + sql: [Rules.requiredInput('flow.runSql')], }; const emit = defineEmits(['changeResourceCode']); diff --git a/frontend/src/views/flow/flowbiz/redis/RedisRunCmdFlowBizForm.vue b/frontend/src/views/flow/flowbiz/redis/RedisRunCmdFlowBizForm.vue index 350e4a6d..79e06cb7 100755 --- a/frontend/src/views/flow/flowbiz/redis/RedisRunCmdFlowBizForm.vue +++ b/frontend/src/views/flow/flowbiz/redis/RedisRunCmdFlowBizForm.vue @@ -26,7 +26,7 @@ import { NodeType, TagTreeNode } from '@/views/ops/component/tag'; import { redisApi } from '@/views/ops/redis/api'; import { sleep } from '@/common/utils/loading'; import { useI18n } from 'vue-i18n'; -import { useI18nPleaseInput } from '@/hooks/useI18n'; +import { Rules } from '@/common/rule'; const { t } = useI18n(); @@ -38,13 +38,7 @@ const rules = { trigger: ['change', 'blur'], }, ], - cmd: [ - { - required: true, - message: useI18nPleaseInput('flow.runCmd'), - trigger: ['change', 'blur'], - }, - ], + cmd: [Rules.requiredInput('flow.runCmd')], }; // tagpath 节点类型 diff --git a/frontend/src/views/login/component/AccountLogin.vue b/frontend/src/views/login/component/AccountLogin.vue index fe9970fe..51a4b72e 100644 --- a/frontend/src/views/login/component/AccountLogin.vue +++ b/frontend/src/views/login/component/AccountLogin.vue @@ -2,20 +2,14 @@
- + + + + + {{ $t('login.loginFailTip', { @@ -56,6 +53,7 @@ }) }} +