From 609aa04aba8b09bfd2a247ca954ee4dd9bbace7f Mon Sep 17 00:00:00 2001
From: ssongliu <73214554+ssongliu@users.noreply.github.com>
Date: Thu, 19 Oct 2023 21:54:44 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E7=B3=BB=E7=BB=9F=E7=94=A8=E6=88=B7?=
 =?UTF-8?q?=E5=90=8D=E3=80=81=E5=AF=86=E7=A0=81=E5=A2=9E=E5=8A=A0=E7=A9=BA?=
 =?UTF-8?q?=E6=A0=BC=E6=A0=A1=E9=AA=8C=20(#2604)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Refs #2602
---
 frontend/src/global/form-rules.ts             | 13 ++++
 frontend/src/lang/modules/en.ts               |  1 +
 frontend/src/lang/modules/tw.ts               |  1 +
 frontend/src/lang/modules/zh.ts               |  1 +
 frontend/src/views/setting/expired.vue        | 63 ++++++++-----------
 .../views/setting/panel/password/index.vue    | 16 ++---
 .../views/setting/panel/username/index.vue    | 17 +++--
 7 files changed, 65 insertions(+), 47 deletions(-)

diff --git a/frontend/src/global/form-rules.ts b/frontend/src/global/form-rules.ts
index b90ac8c76..997865695 100644
--- a/frontend/src/global/form-rules.ts
+++ b/frontend/src/global/form-rules.ts
@@ -1,6 +1,13 @@
 import i18n from '@/lang';
 import { FormItemRule } from 'element-plus';
 
+const checkNoSpace = (rule: any, value: any, callback: any) => {
+    if (value.indexOf(' ') !== -1) {
+        return callback(new Error(i18n.global.t('setting.noSpace')));
+    }
+    callback();
+};
+
 const checkIp = (rule: any, value: any, callback: any) => {
     if (value === '' || typeof value === 'undefined' || value == null) {
         callback(new Error(i18n.global.t('commons.rule.requiredInput')));
@@ -431,6 +438,7 @@ interface CommonRule {
     requiredInput: FormItemRule;
     requiredSelect: FormItemRule;
     requiredSelectBusiness: FormItemRule;
+    noSpace: FormItemRule;
     name: FormItemRule;
     userName: FormItemRule;
     simpleName: FormItemRule;
@@ -484,6 +492,11 @@ export const Rules: CommonRule = {
         message: i18n.global.t('commons.rule.requiredSelect'),
         trigger: 'change',
     },
+    noSpace: {
+        required: true,
+        validator: checkNoSpace,
+        trigger: 'blur',
+    },
     simpleName: {
         required: true,
         validator: checkSimpleName,
diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts
index 7c806e7bc..dfcfbd9e2 100644
--- a/frontend/src/lang/modules/en.ts
+++ b/frontend/src/lang/modules/en.ts
@@ -1050,6 +1050,7 @@ const message = {
         oldPassword: 'Original password',
         newPassword: 'New password',
         retryPassword: 'Confirm password',
+        noSpace: 'Input information cannot include space characters',
         duplicatePassword: 'The new password cannot be the same as the original password, please re-enter!',
         diskClean: 'Cache Clean',
 
diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts
index 352be17fe..004ca44ed 100644
--- a/frontend/src/lang/modules/tw.ts
+++ b/frontend/src/lang/modules/tw.ts
@@ -1006,6 +1006,7 @@ const message = {
         oldPassword: '原密碼',
         newPassword: '新密碼',
         retryPassword: '確認密碼',
+        noSpace: '輸入信息不能包括空格符號',
         duplicatePassword: '新密碼不能與原始密碼一致,請重新輸入!',
         diskClean: '缓存清理',
 
diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts
index 4be57f888..4b8de1cd4 100644
--- a/frontend/src/lang/modules/zh.ts
+++ b/frontend/src/lang/modules/zh.ts
@@ -1006,6 +1006,7 @@ const message = {
         oldPassword: '原密码',
         newPassword: '新密码',
         retryPassword: '确认密码',
+        noSpace: '输入信息不能包含空格符',
         duplicatePassword: '新密码不能与原始密码一致,请重新输入!',
         diskClean: '缓存清理',
 
diff --git a/frontend/src/views/setting/expired.vue b/frontend/src/views/setting/expired.vue
index a1c1e799d..ac9c3393e 100644
--- a/frontend/src/views/setting/expired.vue
+++ b/frontend/src/views/setting/expired.vue
@@ -16,30 +16,22 @@
                         label-position="left"
                         label-width="160px"
                     >
-                        <el-form-item :label="$t('setting.oldPassword')" prop="oldPassword">
-                            <el-input type="password" show-password clearable v-model="passForm.oldPassword" />
+                        <el-form-item :label="$t('setting.oldPassword')" prop="oldPass">
+                            <el-input type="password" show-password clearable v-model.trim="passForm.oldPass" />
                         </el-form-item>
-                        <el-form-item
-                            v-if="settingForm?.complexityVerification === 'disable'"
-                            :label="$t('setting.newPassword')"
-                            prop="newPassword"
-                        >
-                            <el-input type="password" show-password clearable v-model="passForm.newPassword" />
+                        <el-form-item v-if="!isComplexity" :label="$t('setting.newPassword')" prop="newPass">
+                            <el-input type="password" show-password clearable v-model.trim="passForm.newPass" />
                         </el-form-item>
-                        <el-form-item
-                            v-if="settingForm?.complexityVerification === 'enable'"
-                            :label="$t('setting.newPassword')"
-                            prop="newPasswordComplexity"
-                        >
+                        <el-form-item v-if="isComplexity" :label="$t('setting.newPassword')" prop="newPassComplexity">
                             <el-input
                                 type="password"
                                 show-password
                                 clearable
-                                v-model="passForm.newPasswordComplexity"
+                                v-model.trim="passForm.newPassComplexity"
                             />
                         </el-form-item>
-                        <el-form-item :label="$t('setting.retryPassword')" prop="retryPassword">
-                            <el-input type="password" show-password clearable v-model="passForm.retryPassword" />
+                        <el-form-item :label="$t('setting.retryPassword')" prop="rePass">
+                            <el-input type="password" show-password clearable v-model.trim="passForm.rePass" />
                         </el-form-item>
                         <el-form-item>
                             <el-button type="primary" @click="submitChangePassword(passFormRef)">
@@ -61,30 +53,31 @@ import i18n from '@/lang';
 import { Rules } from '@/global/form-rules';
 import router from '@/routers';
 import { MsgError, MsgSuccess } from '@/utils/message';
-let settingForm = ref();
+
+let isComplexity = ref(false);
 
 type FormInstance = InstanceType<typeof ElForm>;
 const passFormRef = ref<FormInstance>();
 const passRules = reactive({
-    oldPassword: [Rules.requiredInput],
-    newPassword: [
+    oldPass: [Rules.noSpace, Rules.requiredInput],
+    newPass: [
         Rules.requiredInput,
+        Rules.noSpace,
         { min: 6, message: i18n.global.t('commons.rule.commonPassword'), trigger: 'blur' },
     ],
-    newPasswordComplexity: [Rules.requiredInput, Rules.password],
-    retryPassword: [Rules.requiredInput, { validator: checkPassword, trigger: 'blur' }],
+    newPassComplexity: [Rules.requiredInput, Rules.noSpace, Rules.password],
+    rePass: [Rules.requiredInput, Rules.noSpace, { validator: checkPasswordSame, trigger: 'blur' }],
 });
 const passForm = reactive({
-    oldPassword: '',
-    newPassword: '',
-    newPasswordComplexity: '',
-    retryPassword: '',
+    oldPass: '',
+    newPass: '',
+    newPassComplexity: '',
+    rePass: '',
 });
 
-function checkPassword(rule: any, value: any, callback: any) {
-    let password =
-        settingForm.value.complexityVerification === 'disable' ? passForm.newPassword : passForm.newPasswordComplexity;
-    if (password !== passForm.retryPassword) {
+function checkPasswordSame(rule: any, value: any, callback: any) {
+    let password = !isComplexity.value ? passForm.newPass : passForm.newPassComplexity;
+    if (password !== passForm.rePass) {
         return callback(new Error(i18n.global.t('commons.rule.rePassword')));
     }
     callback();
@@ -94,22 +87,20 @@ const submitChangePassword = async (formEl: FormInstance | undefined) => {
     if (!formEl) return;
     formEl.validate(async (valid) => {
         if (!valid) return;
-        let password =
-            settingForm.value.complexityVerification === 'disable'
-                ? passForm.newPassword
-                : passForm.newPasswordComplexity;
-        if (password === passForm.oldPassword) {
+        let password = !isComplexity.value ? passForm.newPass : passForm.newPassComplexity;
+        if (password === passForm.oldPass) {
             MsgError(i18n.global.t('setting.duplicatePassword'));
             return;
         }
-        await handleExpired({ oldPassword: passForm.oldPassword, newPassword: password });
+        await handleExpired({ oldPassword: passForm.oldPass, newPassword: password });
         MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
         router.push({ name: 'home' });
     });
 };
 const search = async () => {
     const res = await getSettingInfo();
-    settingForm.value = res.data;
+    let settingForm = res.data;
+    isComplexity.value = settingForm?.complexityVerification === 'enable';
 };
 
 onMounted(() => {
diff --git a/frontend/src/views/setting/panel/password/index.vue b/frontend/src/views/setting/panel/password/index.vue
index eb6f1057a..e7d11f5e7 100644
--- a/frontend/src/views/setting/panel/password/index.vue
+++ b/frontend/src/views/setting/panel/password/index.vue
@@ -8,14 +8,14 @@
                 <el-row type="flex" justify="center">
                     <el-col :span="22">
                         <el-form-item :label="$t('setting.oldPassword')" prop="oldPassword">
-                            <el-input type="password" show-password clearable v-model="passForm.oldPassword" />
+                            <el-input type="password" show-password clearable v-model.trim="passForm.oldPassword" />
                         </el-form-item>
                         <el-form-item
                             v-if="complexityVerification === 'disable'"
                             :label="$t('setting.newPassword')"
                             prop="newPassword"
                         >
-                            <el-input type="password" show-password clearable v-model="passForm.newPassword" />
+                            <el-input type="password" show-password clearable v-model.trim="passForm.newPassword" />
                         </el-form-item>
                         <el-form-item
                             v-if="complexityVerification === 'enable'"
@@ -26,11 +26,11 @@
                                 type="password"
                                 show-password
                                 clearable
-                                v-model="passForm.newPasswordComplexity"
+                                v-model.trim="passForm.newPasswordComplexity"
                             />
                         </el-form-item>
                         <el-form-item :label="$t('setting.retryPassword')" prop="retryPassword">
-                            <el-input type="password" show-password clearable v-model="passForm.retryPassword" />
+                            <el-input type="password" show-password clearable v-model.trim="passForm.retryPassword" />
                         </el-form-item>
                     </el-col>
                 </el-row>
@@ -64,14 +64,16 @@ import { logOutApi } from '@/api/modules/auth';
 const globalStore = GlobalStore();
 const passFormRef = ref<FormInstance>();
 const passRules = reactive({
-    oldPassword: [Rules.requiredInput],
+    oldPassword: [Rules.noSpace, Rules.requiredInput],
     newPassword: [
         Rules.requiredInput,
+        Rules.noSpace,
         { min: 6, message: i18n.global.t('commons.rule.commonPassword'), trigger: 'blur' },
     ],
-    newPasswordComplexity: [Rules.requiredInput, Rules.password],
-    retryPassword: [Rules.requiredInput, { validator: checkPassword, trigger: 'blur' }],
+    newPasswordComplexity: [Rules.requiredInput, Rules.noSpace, Rules.password],
+    retryPassword: [Rules.requiredInput, Rules.noSpace, { validator: checkPassword, trigger: 'blur' }],
 });
+
 const loading = ref(false);
 const passwordVisible = ref<boolean>(false);
 const passForm = reactive({
diff --git a/frontend/src/views/setting/panel/username/index.vue b/frontend/src/views/setting/panel/username/index.vue
index 3b451f6ad..6a13a1ed1 100644
--- a/frontend/src/views/setting/panel/username/index.vue
+++ b/frontend/src/views/setting/panel/username/index.vue
@@ -4,11 +4,18 @@
             <template #header>
                 <DrawerHeader :header="$t('commons.login.username')" :back="handleClose" />
             </template>
-            <el-form ref="formRef" label-position="top" :model="form" @submit.prevent v-loading="loading">
+            <el-form
+                ref="formRef"
+                label-position="top"
+                :model="form"
+                @submit.prevent
+                v-loading="loading"
+                :rules="rules"
+            >
                 <el-row type="flex" justify="center">
                     <el-col :span="22">
-                        <el-form-item :label="$t('commons.login.username')" prop="userName" :rules="Rules.userName">
-                            <el-input clearable v-model="form.userName" />
+                        <el-form-item :label="$t('commons.login.username')" prop="userName">
+                            <el-input clearable v-model.trim="form.userName" />
                         </el-form-item>
                     </el-col>
                 </el-row>
@@ -46,7 +53,9 @@ const loading = ref();
 const form = reactive({
     userName: '',
 });
-
+const rules = reactive({
+    userName: [Rules.userName, Rules.noSpace],
+});
 const formRef = ref<FormInstance>();
 
 const acceptParams = (params: DialogProps): void => {