소스 검색

feat: (add) 增加

gemercheung 2 년 전
부모
커밋
2714ea95d7
4개의 변경된 파일294개의 추가작업 그리고 248개의 파일을 삭제
  1. 24 1
      src/api/sys/user.ts
  2. 105 103
      src/locales/lang/zh-CN/sys.ts
  3. 15 10
      src/views/sys/login/RegisterForm.vue
  4. 150 134
      src/views/sys/login/useLogin.ts

+ 24 - 1
src/api/sys/user.ts

@@ -2,6 +2,7 @@ import { defHttp } from '/@/utils/http/axios';
 import {
   LoginParams,
   SendcodeParams,
+  RegisterParams,
   LoginResultModel,
   GetUserInfoModel,
   updateUserInfoPasswordParam,
@@ -51,6 +52,28 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
   );
 }
 
+export function registerApi(params: RegisterParams, mode: ErrorMessageMode = 'modal') {
+  const paramData: RegisterParams = {
+    area: '86',
+    code: params.code,
+    userName: params.userName,
+    userPassword: encodeStr(window.btoa(params.userPassword)),
+  };
+
+  return defHttp.post<LoginResultModel>(
+    {
+      url: Api.Register,
+      // params,
+      params: paramData,
+      headers: { 'Content-Type': ContentTypeEnum.JSON },
+    },
+    {
+      errorMessageMode: mode,
+      useResult: true,
+    },
+  );
+}
+
 export async function sendCodeApi(params: SendcodeParams) {
   const paramData: SendcodeParams = {
     areaNum: '86',
@@ -67,7 +90,7 @@ export async function sendCodeApi(params: SendcodeParams) {
       useResult: true,
     },
   );
-  console.log('res', res);
+
   if (res.code === 200) {
     return Promise.resolve(true);
   } else {

+ 105 - 103
src/locales/lang/zh-CN/sys.ts

@@ -1,103 +1,105 @@
-export default {
-  api: {
-    operationFailed: '操作失败',
-    errorTip: '错误提示',
-    errorMessage: '操作失败,系统异常!',
-    timeoutMessage: '登录超时,请重新登录!',
-    apiTimeoutMessage: '接口请求超时,请刷新页面重试!',
-    apiRequestFailed: '请求出错,请稍候重试',
-    networkException: '网络异常',
-    networkExceptionMsg: '网络异常,请检查您的网络连接是否正常!',
-
-    errMsg401: '用户没有权限(令牌、用户名、密码错误)!',
-    errMsg403: '用户得到授权,但是访问是被禁止的。!',
-    errMsg404: '网络请求错误,未找到该资源!',
-    errMsg405: '网络请求错误,请求方法未允许!',
-    errMsg408: '网络请求超时!',
-    errMsg500: '服务器错误,请联系管理员!',
-    errMsg501: '网络未实现!',
-    errMsg502: '网络错误!',
-    errMsg503: '服务不可用,服务器暂时过载或维护!',
-    errMsg504: '网络超时!',
-    errMsg505: 'http版本不支持该请求!',
-  },
-  app: { logoutTip: '温馨提醒', logoutMessage: '是否确认退出系统?', menuLoading: '菜单加载中...' },
-  errorLog: {
-    tableTitle: '错误日志列表',
-    tableColumnType: '类型',
-    tableColumnDate: '时间',
-    tableColumnFile: '文件',
-    tableColumnMsg: '错误信息',
-    tableColumnStackMsg: 'stack信息',
-
-    tableActionDesc: '详情',
-
-    modalTitle: '错误详情',
-
-    fireVueError: '点击触发vue错误',
-    fireResourceError: '点击触发资源加载错误',
-    fireAjaxError: '点击触发ajax错误',
-
-    enableMessage: '只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效.',
-  },
-  exception: {
-    backLogin: '返回登录',
-    backHome: '返回首页',
-    subTitle403: '抱歉,您无权访问此页面。',
-    subTitle404: '抱歉,您访问的页面不存在。',
-    subTitle500: '抱歉,服务器报告错误。',
-    noDataTitle: '当前页无数据',
-    networkErrorTitle: '网络错误',
-    networkErrorSubTitle: '抱歉,您的网络连接已断开,请检查您的网络!',
-  },
-  lock: {
-    unlock: '点击解锁',
-    alert: '锁屏密码错误',
-    backToLogin: '返回登录',
-    entry: '进入系统',
-    placeholder: '请输入锁屏密码或者用户密码',
-  },
-  login: {
-    backSignIn: '返回',
-    signInFormTitle: '登录',
-    mobileSignInFormTitle: '手机登录',
-    qrSignInFormTitle: '二维码登录',
-    signUpFormTitle: '注册',
-    forgetFormTitle: '重置密码',
-
-    signInTitle: '10分钟搞定实景VR',
-    signInDesc: '自助720度实景VR发布管理,自助、简单、安全、高效',
-    policy: '我同意xxx隐私政策',
-    scanSign: `扫码后点击"确认",即可完成登录`,
-
-    loginButton: '登录',
-    registerButton: '注册',
-    rememberMe: '记住我',
-    forgetPassword: '忘记密码?',
-    otherSignIn: '其他登录方式',
-
-    // notify
-    loginSuccessTitle: '登录成功',
-    loginSuccessDesc: '欢迎回来',
-
-    // placeholder
-    accountPlaceholder: '请输入账号',
-    passwordPlaceholder: '请输入密码',
-    passwordFormat: '输入密码格式有误',
-    smsPlaceholder: '请输入验证码',
-    mobilePlaceholder: '请输入手机号码',
-    policyPlaceholder: '勾选后才能注册',
-    diffPwd: '两次输入密码不一致',
-
-    userName: '账号',
-    password: '密码',
-    confirmPassword: '确认密码',
-    email: '邮箱',
-    smsCode: '短信验证码',
-    mobile: '手机号码',
-
-    loginDragValidate: '登录需要拖拽验证',
-    loginAgain: '请再次操作',
-    captcha: '验证码',
-  },
-};
+export default {
+  api: {
+    operationFailed: '操作失败',
+    errorTip: '错误提示',
+    errorMessage: '操作失败,系统异常!',
+    timeoutMessage: '登录超时,请重新登录!',
+    apiTimeoutMessage: '接口请求超时,请刷新页面重试!',
+    apiRequestFailed: '请求出错,请稍候重试',
+    networkException: '网络异常',
+    networkExceptionMsg: '网络异常,请检查您的网络连接是否正常!',
+
+    errMsg401: '用户没有权限(令牌、用户名、密码错误)!',
+    errMsg403: '用户得到授权,但是访问是被禁止的。!',
+    errMsg404: '网络请求错误,未找到该资源!',
+    errMsg405: '网络请求错误,请求方法未允许!',
+    errMsg408: '网络请求超时!',
+    errMsg500: '服务器错误,请联系管理员!',
+    errMsg501: '网络未实现!',
+    errMsg502: '网络错误!',
+    errMsg503: '服务不可用,服务器暂时过载或维护!',
+    errMsg504: '网络超时!',
+    errMsg505: 'http版本不支持该请求!',
+  },
+  app: { logoutTip: '温馨提醒', logoutMessage: '是否确认退出系统?', menuLoading: '菜单加载中...' },
+  errorLog: {
+    tableTitle: '错误日志列表',
+    tableColumnType: '类型',
+    tableColumnDate: '时间',
+    tableColumnFile: '文件',
+    tableColumnMsg: '错误信息',
+    tableColumnStackMsg: 'stack信息',
+
+    tableActionDesc: '详情',
+
+    modalTitle: '错误详情',
+
+    fireVueError: '点击触发vue错误',
+    fireResourceError: '点击触发资源加载错误',
+    fireAjaxError: '点击触发ajax错误',
+
+    enableMessage: '只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效.',
+  },
+  exception: {
+    backLogin: '返回登录',
+    backHome: '返回首页',
+    subTitle403: '抱歉,您无权访问此页面。',
+    subTitle404: '抱歉,您访问的页面不存在。',
+    subTitle500: '抱歉,服务器报告错误。',
+    noDataTitle: '当前页无数据',
+    networkErrorTitle: '网络错误',
+    networkErrorSubTitle: '抱歉,您的网络连接已断开,请检查您的网络!',
+  },
+  lock: {
+    unlock: '点击解锁',
+    alert: '锁屏密码错误',
+    backToLogin: '返回登录',
+    entry: '进入系统',
+    placeholder: '请输入锁屏密码或者用户密码',
+  },
+  login: {
+    backSignIn: '返回',
+    signInFormTitle: '登录',
+    mobileSignInFormTitle: '手机登录',
+    qrSignInFormTitle: '二维码登录',
+    signUpFormTitle: '注册',
+    forgetFormTitle: '重置密码',
+
+    signInTitle: '10分钟搞定实景VR',
+    signInDesc: '自助720度实景VR发布管理,自助、简单、安全、高效',
+    policy: '我同意xxx隐私政策',
+    scanSign: `扫码后点击"确认",即可完成登录`,
+
+    loginButton: '登录',
+    registerButton: '注册',
+    rememberMe: '记住我',
+    forgetPassword: '忘记密码?',
+    otherSignIn: '其他登录方式',
+
+    // notify
+    loginSuccessTitle: '登录成功',
+    loginSuccessDesc: '欢迎回来',
+
+    // placeholder
+    accountPlaceholder: '请输入账号',
+    passwordPlaceholder: '请输入密码',
+    passwordFormat: '输入密码格式有误',
+    smsPlaceholder: '请输入验证码',
+    mobilePlaceholder: '请输入手机号码',
+    policyPlaceholder: '勾选后才能注册',
+    diffPwd: '两次输入密码不一致',
+
+    mobileFormat: '输入手机格式有误',
+
+    userName: '账号',
+    password: '密码',
+    confirmPassword: '确认密码',
+    email: '邮箱',
+    smsCode: '短信验证码',
+    mobile: '手机号码',
+
+    loginDragValidate: '登录需要拖拽验证',
+    loginAgain: '请再次操作',
+    captcha: '验证码',
+  },
+};

+ 15 - 10
src/views/sys/login/RegisterForm.vue

@@ -1,12 +1,12 @@
 <template>
   <template v-if="getShow">
     <LoginFormTitle class="enter-x" />
-    <Form class="p-4 enter-x" :model="RegisterformData" :rules="getFormRules" ref="formRef">
-      <FormItem name="account" class="enter-x">
+    <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef">
+      <FormItem name="userName" class="enter-x">
         <Input
           class="fix-auto-fill"
           size="large"
-          v-model:value="RegisterformData.userName"
+          v-model:value="formData.userName"
           placeholder="请输入手机号"
         />
       </FormItem>
@@ -26,18 +26,18 @@
           :sendCodeApi="
             () => {
               return sendCodeApi({
-                phone: RegisterformData.userName,
+                phone: formData.userName,
               });
             }
           "
-          v-model:value="RegisterformData.code"
+          v-model:value="formData.code"
           placeholder="请输入手机验证码"
         />
       </FormItem>
-      <FormItem name="password" class="enter-x">
+      <FormItem name="userPassword" class="enter-x">
         <StrengthMeter
           size="large"
-          v-model:value="RegisterformData.userPassword"
+          v-model:value="formData.userPassword"
           placeholder="请输入账号密码"
         />
       </FormItem>
@@ -81,7 +81,7 @@
   import { CountdownInput } from '/@/components/CountDown';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from './useLogin';
-  import { sendCodeApi } from '/@/api/sys/user';
+  import { sendCodeApi, registerApi } from '/@/api/sys/user';
 
   const FormItem = Form.Item;
   // const InputPassword = Input.Password;
@@ -91,7 +91,7 @@
   const formRef = ref();
   const loading = ref(false);
 
-  const RegisterformData = reactive({
+  const formData = reactive({
     userName: '',
     userPassword: '',
     // confirmPassword: '',
@@ -101,14 +101,19 @@
     // policy: false,
   });
 
-  const { getFormRules } = useFormRules(RegisterformData);
+  const { getFormRules } = useFormRules(formData);
   const { validForm } = useFormValid(formRef);
 
   const getShow = computed(() => unref(getLoginState) === LoginStateEnum.REGISTER);
 
   async function handleRegister() {
+    console.log('getFormRules', getFormRules);
     const data = await validForm();
     if (!data) return;
     console.log(data);
+    const res = await registerApi(data);
+    if (res.code === 200) {
+      handleBackLogin();
+    }
   }
 </script>

+ 150 - 134
src/views/sys/login/useLogin.ts

@@ -1,134 +1,150 @@
-import type { ValidationRule } from 'ant-design-vue/lib/form/Form';
-import type { RuleObject } from 'ant-design-vue/lib/form/interface';
-import { ref, computed, unref, Ref } from 'vue';
-import { useI18n } from '/@/hooks/web/useI18n';
-
-export enum LoginStateEnum {
-  LOGIN,
-  REGISTER,
-  RESET_PASSWORD,
-  MOBILE,
-  QR_CODE,
-}
-
-const currentState = ref(LoginStateEnum.LOGIN);
-
-export function useLoginState() {
-  function setLoginState(state: LoginStateEnum) {
-    currentState.value = state;
-  }
-
-  const getLoginState = computed(() => currentState.value);
-
-  function handleBackLogin() {
-    setLoginState(LoginStateEnum.LOGIN);
-  }
-
-  return { setLoginState, getLoginState, handleBackLogin };
-}
-
-export function useFormValid<T extends Object = any>(formRef: Ref<any>) {
-  async function validForm() {
-    const form = unref(formRef);
-    if (!form) return;
-    const data = await form.validate();
-    return data as T;
-  }
-
-  return { validForm };
-}
-
-export function useFormRules(formData?: Recordable) {
-  const { t } = useI18n();
-
-  const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder')));
-  const getPasswordFormRule = computed(() => {
-    return [
-      ...createRule(t('sys.login.passwordPlaceholder')),
-      { validator: validatePassword(), trigger: 'change' },
-    ];
-  });
-  const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder')));
-  const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder')));
-
-  const validatePolicy = async (_: RuleObject, value: boolean) => {
-    return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve();
-  };
-  const validatePassword = () => {
-    return async (_: RuleObject, value: string) => {
-      const reg = new RegExp('[\\u4E00-\\u9FFF]+', 'g');
-      if (reg.test(value)) {
-        return Promise.reject(t('sys.login.passwordFormat'));
-      }
-      return Promise.resolve();
-    };
-  };
-  const validateConfirmPassword = (password: string) => {
-    return async (_: RuleObject, value: string) => {
-      if (!value) {
-        return Promise.reject(t('sys.login.passwordPlaceholder'));
-      }
-      if (value !== password) {
-        return Promise.reject(t('sys.login.diffPwd'));
-      }
-      return Promise.resolve();
-    };
-  };
-
-  const getFormRules = computed((): { [k: string]: ValidationRule | ValidationRule[] } => {
-    const accountFormRule = unref(getAccountFormRule);
-    const passwordFormRule = unref(getPasswordFormRule);
-    const smsFormRule = unref(getSmsFormRule);
-    const mobileFormRule = unref(getMobileFormRule);
-
-    const mobileRule = {
-      sms: smsFormRule,
-      mobile: mobileFormRule,
-    };
-    switch (unref(currentState)) {
-      // register form rules
-      case LoginStateEnum.REGISTER:
-        return {
-          account: accountFormRule,
-          password: [
-            ...passwordFormRule,
-            { validator: validatePassword(formData?.password), trigger: 'change' },
-          ],
-          confirmPassword: [
-            { validator: validateConfirmPassword(formData?.password), trigger: 'change' },
-          ],
-          policy: [{ validator: validatePolicy, trigger: 'change' }],
-          ...mobileRule,
-        };
-
-      // reset password form rules
-      case LoginStateEnum.RESET_PASSWORD:
-        return {
-          account: accountFormRule,
-          ...mobileRule,
-        };
-
-      // mobile form rules
-      case LoginStateEnum.MOBILE:
-        return mobileRule;
-
-      // login form rules
-      default:
-        return {
-          account: accountFormRule,
-          password: passwordFormRule,
-        };
-    }
-  });
-  return { getFormRules };
-}
-
-function createRule(message: string) {
-  return [
-    {
-      required: true,
-      message,
-      trigger: 'change',
-    },
-  ];
-}
+import type { ValidationRule } from 'ant-design-vue/lib/form/Form';
+import type { RuleObject } from 'ant-design-vue/lib/form/interface';
+import { ref, computed, unref, Ref } from 'vue';
+import { useI18n } from '/@/hooks/web/useI18n';
+
+export enum LoginStateEnum {
+  LOGIN,
+  REGISTER,
+  RESET_PASSWORD,
+  MOBILE,
+  QR_CODE,
+}
+
+const currentState = ref(LoginStateEnum.LOGIN);
+
+export function useLoginState() {
+  function setLoginState(state: LoginStateEnum) {
+    currentState.value = state;
+  }
+
+  const getLoginState = computed(() => currentState.value);
+
+  function handleBackLogin() {
+    setLoginState(LoginStateEnum.LOGIN);
+  }
+
+  return { setLoginState, getLoginState, handleBackLogin };
+}
+
+export function useFormValid<T extends Object = any>(formRef: Ref<any>) {
+  async function validForm() {
+    const form = unref(formRef);
+    if (!form) return;
+    const data = await form.validate();
+    return data as T;
+  }
+
+  return { validForm };
+}
+
+export function useFormRules(formData?: Recordable) {
+  const { t } = useI18n();
+
+  const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder')));
+  const getPasswordFormRule = computed(() => {
+    return [
+      ...createRule(t('sys.login.passwordPlaceholder')),
+      { validator: validatePassword(), trigger: 'change' },
+    ];
+  });
+  const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder')));
+  // const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder')));
+  const getMobileFormRule = computed(() => {
+    return [
+      ...createRule(t('sys.login.mobilePlaceholder')),
+      { validator: validateMobile(), trigger: 'change' },
+    ];
+  });
+
+  // const validatePolicy = async (_: RuleObject, value: boolean) => {
+  //   return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve();
+  // };
+  const validateMobile = () => {
+    return async (_: RuleObject, value: string) => {
+      const reg = new RegExp(/^1\d{10}$/);
+      if (!reg.test(value)) {
+        if (value) {
+          return Promise.reject(t('sys.login.mobileFormat'));
+        }
+      }
+      return Promise.resolve();
+    };
+  };
+  const validatePassword = () => {
+    return async (_: RuleObject, value: string) => {
+      const reg = new RegExp('[\\u4E00-\\u9FFF]+', 'g');
+      if (reg.test(value)) {
+        return Promise.reject(t('sys.login.passwordFormat'));
+      }
+      return Promise.resolve();
+    };
+  };
+  // const validateConfirmPassword = (password: string) => {
+  //   return async (_: RuleObject, value: string) => {
+  //     if (!value) {
+  //       return Promise.reject(t('sys.login.passwordPlaceholder'));
+  //     }
+  //     if (value !== password) {
+  //       return Promise.reject(t('sys.login.diffPwd'));
+  //     }
+  //     return Promise.resolve();
+  //   };
+  // };
+
+  const getFormRules = computed((): { [k: string]: ValidationRule | ValidationRule[] } => {
+    const accountFormRule = unref(getAccountFormRule);
+    const passwordFormRule = unref(getPasswordFormRule);
+    const smsFormRule = unref(getSmsFormRule);
+    const mobileFormRule = unref(getMobileFormRule);
+
+    const mobileRule = {
+      code: smsFormRule,
+    };
+    switch (unref(currentState)) {
+      // register form rules
+      case LoginStateEnum.REGISTER:
+        return {
+          userName: mobileFormRule,
+          userPassword: [
+            ...passwordFormRule,
+            { validator: validatePassword(formData?.password), trigger: 'change' },
+          ],
+          // confirmPassword: [
+          //   { validator: validateConfirmPassword(formData?.password), trigger: 'change' },
+          // ],
+          // policy: [{ validator: validatePolicy, trigger: 'change' }],
+          ...mobileRule,
+        };
+
+      // reset password form rules
+      case LoginStateEnum.RESET_PASSWORD:
+        return {
+          account: accountFormRule,
+          ...mobileRule,
+        };
+
+      // mobile form rules
+      case LoginStateEnum.MOBILE:
+        return mobileRule;
+
+      // login form rules
+      default:
+        return {
+          account: accountFormRule,
+          password: passwordFormRule,
+        };
+    }
+  });
+  return { getFormRules };
+}
+
+function createRule(message: string) {
+  return [
+    {
+      required: true,
+      message,
+      trigger: 'change',
+    },
+  ];
+}