From fa3ac93010bea3805438ee3ab0a182bfbf7423da Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期一, 27 五月 2024 16:19:31 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/system/loginmini/MiniRegister.vue |  266 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 266 insertions(+), 0 deletions(-)

diff --git a/src/views/system/loginmini/MiniRegister.vue b/src/views/system/loginmini/MiniRegister.vue
new file mode 100644
index 0000000..617b765
--- /dev/null
+++ b/src/views/system/loginmini/MiniRegister.vue
@@ -0,0 +1,266 @@
+<template>
+  <div class="aui-content">
+    <div class="aui-container">
+      <div class="aui-form">
+        <div class="aui-image">
+          <div class="aui-image-text">
+            <img :src="jeecgAdTextImg" alt="" />
+          </div>
+        </div>
+        <div class="aui-formBox">
+          <div class="aui-formWell">
+            <a-form ref="formRef" :model="formData">
+              <div class="aui-flex aui-form-nav aui-clear-left" style="padding-bottom: 21px">
+                <div class="aui-flex-box activeNav on">{{t('sys.login.signUpFormTitle')}}</div>
+              </div>
+              <div class="aui-form-box">
+                <div class="aui-account aui-account-line">
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:user-outlined"/>
+                      <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.userName')" v-model:value="formData.username" />
+                    </div>
+                  </a-form-item>
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:mobile-outlined"/>
+                      <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.mobile')" v-model:value="formData.mobile" />
+                    </div>
+                  </a-form-item>
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:mail-outlined"/>
+                      <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.smsCode')" v-model:value="formData.smscode" />
+                      <div v-if="showInterval" class="aui-code-line" @click="getLoginCode">{{t('component.countdown.normalText')}}</div>
+                      <div v-else class="aui-code-line">{{t('component.countdown.sendText',[unref(timeRuning)])}}</div>
+                    </div>
+                  </a-form-item>
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:lock-outlined"/>
+                      <a-input class="fix-auto-fill" :type="pwdIndex==='close'?'password':'text'" :placeholder="t('sys.login.password')" v-model:value="formData.password" />
+                      <div class="aui-eye">
+                        <img :src="eyeKImg" alt="寮�鍚�" v-if="pwdIndex==='open'"  @click="pwdClick('close')" />
+                        <img :src="eyeGImg" alt="鍏抽棴"  v-else-if="pwdIndex==='close'"  @click="pwdClick('open')" />
+                      </div>
+                    </div>
+                  </a-form-item>
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:lock-outlined"/>
+                      <a-input class="fix-auto-fill" :type="confirmPwdIndex==='close'?'password':'text'" :placeholder="t('sys.login.confirmPassword')" v-model:value="formData.confirmPassword" />
+                      <div class="aui-eye">
+                        <img :src="eyeKImg" alt="寮�鍚�" v-if="confirmPwdIndex==='open'" @click="confirmPwdClick('close')" />
+                        <img :src="eyeGImg" alt="鍏抽棴" v-else-if="confirmPwdIndex==='close'" @click="confirmPwdClick('open')" />
+                      </div>
+                    </div>
+                  </a-form-item>
+                  <a-form-item name="policy">
+                    <div class="aui-flex">
+                      <div class="aui-flex-box">
+                        <div class="aui-choice">
+                          <a-checkbox  v-model:checked="formData.policy" />
+                          <span style="color: #1b90ff;margin-left: 4px">{{ t('sys.login.policy') }}</span>
+                        </div>
+                      </div>
+                    </div>
+                  </a-form-item>
+                </div>
+              </div>
+              <div class="aui-formButton">
+                <div class="aui-flex">
+                  <a class="aui-link-login aui-flex-box" @click="registerHandleClick"> {{ t('sys.login.registerButton') }}</a>
+                </div>
+                <div class="aui-flex">
+                  <a class="aui-linek-code aui-flex-box" @click="goBackHandleClick">{{ t('sys.login.backSignIn') }}</a>
+                </div>
+              </div>
+            </a-form>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup name="mini-register">
+  import { ref, reactive, unref, toRaw } from 'vue';
+  import { getCaptcha, register } from '/@/api/sys/user';
+  import { SmsEnum } from '/@/views/sys/login/useLogin';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import logoImg from '/@/assets/loginmini/icon/lanpu_logo.png';
+  import jeecgAdTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png';
+  import eyeKImg from '/@/assets/loginmini/icon/icon-eye-k.png';
+  import eyeGImg from '/@/assets/loginmini/icon/icon-eye-g.png';
+  import { useI18n } from "/@/hooks/web/useI18n";
+
+  const { t } = useI18n();
+  const { notification, createErrorModal, createMessage } = useMessage();
+  const emit = defineEmits(['go-back', 'success', 'register']);
+  const formRef = ref();
+  const formData = reactive<any>({
+    username: '',
+    mobile: '',
+    smscode: '',
+    password: '',
+    confirmPassword: '',
+    policy: false,
+  });
+  //鏄惁鏄剧ず鑾峰彇楠岃瘉鐮�
+  const showInterval = ref<boolean>(true);
+  //60s
+  const timeRuning = ref<number>(60);
+  //瀹氭椂鍣�
+  const timer = ref<any>(null);
+  //瀵嗙爜鐪肩潧鎵撳紑鍏抽棴
+  const pwdIndex = ref<string>('close');
+  //纭瀵嗙爜鐪肩潧鎵撳紑鍏抽棴
+  const confirmPwdIndex = ref<string>('close');
+
+  /**
+   * 杩斿洖
+   */
+  function goBackHandleClick() {
+    emit('go-back');
+    initForm();
+  }
+
+  /**
+   * 鑾峰彇鎵嬫満楠岃瘉鐮�
+   */
+  async function getLoginCode() {
+    if (!formData.mobile) {
+      createMessage.warn(t('sys.login.mobilePlaceholder'));
+      return;
+    }
+    const result = await getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.REGISTER });
+    if (result) {
+      const TIME_COUNT = 60;
+      if (!unref(timer)) {
+        timeRuning.value = TIME_COUNT;
+        showInterval.value = false;
+        timer.value = setInterval(() => {
+          if (unref(timeRuning) > 0 && unref(timeRuning) <= TIME_COUNT) {
+            timeRuning.value = timeRuning.value - 1;
+          } else {
+            showInterval.value = true;
+            clearInterval(unref(timer));
+            timer.value = null;
+          }
+        }, 1000);
+      }
+    }
+  }
+
+  function registerHandleClick() {
+    if (!formData.username) {
+      createMessage.warn(t('sys.login.accountPlaceholder'));
+      return;
+    }
+    if (!formData.mobile) {
+      createMessage.warn(t('sys.login.mobilePlaceholder'));
+      return;
+    }
+    if (!formData.smscode) {
+      createMessage.warn(t('sys.login.smsPlaceholder'));
+      return;
+    }
+    if (!formData.password) {
+      createMessage.warn(t('sys.login.passwordPlaceholder'));
+      return;
+    }
+    if (!formData.confirmPassword) {
+      createMessage.warn(t('sys.login.confirmPassword'));
+      return;
+    }
+    if (formData.password !== formData.confirmPassword) {
+      createMessage.warn(t('sys.login.diffPwd'));
+      return;
+    }
+    if(!formData.policy){
+      createMessage.warn(t('sys.login.policyPlaceholder'));
+      return;
+    }
+    registerAccount();
+  }
+
+  /**
+   * 娉ㄥ唽璐﹀彿
+   */
+  async function registerAccount() {
+    try {
+      const resultInfo = await register(
+        toRaw({
+          username: formData.username,
+          password: formData.password,
+          phone: formData.mobile,
+          smscode: formData.smscode,
+        })
+      );
+      if (resultInfo && resultInfo.data.success) {
+        notification.success({
+          description: resultInfo.data.message || t('sys.api.registerMsg'),
+          duration: 3,
+        });
+        emit('success', { username: formData.username, password: formData.password });
+        initForm();
+      } else {
+        notification.warning({
+          message: t('sys.api.errorTip'),
+          description: resultInfo.data.message || t('sys.api.networkExceptionMsg'),
+          duration: 3,
+        });
+      }
+    } catch (error) {
+      notification.error({
+        message: t('sys.api.errorTip'),
+        description: error.message || t('sys.api.networkExceptionMsg'),
+        duration: 3,
+      });
+    }
+  }
+
+  /**
+   * 鍒濆鍖栬〃鍗�
+   */
+  function initForm() {
+    Object.assign(formData,{username:'',mobile: '', smscode: '', password: '', confirmPassword: '', policy: false})
+    if(!unref(timer)){
+      showInterval.value = true;
+      clearInterval(unref(timer));
+      timer.value = null;
+    }
+    formRef.value.resetFields();
+  }
+
+  /**
+   * 瀵嗙爜鎵撳紑鎴栧叧闂�
+   * @param value
+   */
+  function pwdClick(value) {
+    pwdIndex.value = value;
+  }
+
+  /**
+   * 纭瀵嗙爜鎵撳紑鎴栧叧闂�
+   * @param value
+   */
+  function confirmPwdClick(value) {
+    confirmPwdIndex.value = value;
+  }
+
+  defineExpose({
+    initForm
+  })
+</script>
+<style lang="less" scoped>
+@import '/@/assets/loginmini/style/home.less';
+@import '/@/assets/loginmini/style/base.less';
+.aui-input-line .aui-icon{
+  position: absolute;
+  z-index: 2;
+  top: 10px;
+  left: 10px;
+  font-size: 20px !important;
+}
+</style>

--
Gitblit v1.9.3