Newer
Older
dxCard-admin / src / views / system / usersetting / commponents / UserPhoneModal.vue
YFJ on 23 Sep 8 KB 项目推送
<template>
<BasicModal v-bind="$attrs" @register="registerModal" width="500px"  :title="title" :showCancelBtn="false" :showOkBtn="false">
  <a-form v-if="type==='updatePhone'" class="antd-modal-form" ref="updateFormRef" :model="updateFormState"
          :rules="updateValidatorRules">
    <div v-if="current === 0">
      <a-form-item name="phoneText">
        <span class="black font-size-13">原手机号</span>
        <div class="phone-padding">
          <span>{{ updateFormState.phoneText }}</span>
        </div>
      </a-form-item>
      <a-form-item name="smscode">
        <span class="black font-size-13">验证码</span>
        <CountdownInput class="phone-padding" size="large" v-model:value="updateFormState.smscode" placeholder="输入6位验证码"
                        :sendCodeApi="()=>updateSendCodeApi('verifyOriginalPhone')"/>
      </a-form-item>
      <a-form-item>
        <a-button size="large" type="primary" block @click="nextStepClick">
          下一步
        </a-button>
      </a-form-item>
    </div>
    <div v-else-if="current === 1">
      <a-form-item name="newPhone">
        <span class="black font-size-13">新手机号</span>
        <div class="phone-padding">
          <a-input v-model:value="updateFormState.newPhone" placeholder="请输入新手机号"/>
        </div>
      </a-form-item>
      <a-form-item name="smscode">
        <span class="black font-size-13">验证码</span>
        <CountdownInput class="phone-padding" size="large" v-model:value="updateFormState.smscode" placeholder="输入6位验证码"
                        :sendCodeApi="()=>updateSendCodeApi('updatePhone')"/>
      </a-form-item>
      <a-form-item>
        <a-button size="large" type="primary" block @click="finishedClick">
          完成
        </a-button>
      </a-form-item>
    </div>
  </a-form>

  <a-form v-else-if="type==='bindPhone'" class="antd-modal-form" ref="formRef" :model="formState" :rules="validatorRules">
    <a-form-item  name="phone">
      <a-input size="large" v-model:value="formState.phone" placeholder="请输入手机号" />
    </a-form-item>
    <a-form-item name="smscode">
      <CountdownInput size="large" v-model:value="formState.smscode" placeholder="输入6位验证码" :sendCodeApi="sendCodeApi" />
    </a-form-item>
    <a-form-item>
      <a-button size="large" type="primary" block @click="updatePhone">
        确认
      </a-button>
    </a-form-item>
  </a-form>
</BasicModal>
</template>

<script lang="ts" setup name="user-replace-phone-modal">
import BasicModal from "/@/components/Modal/src/BasicModal.vue";
import { CountdownInput } from '/@/components/CountDown';
import { useUserStore } from "/@/store/modules/user";
import { useMessage } from "/@/hooks/web/useMessage";
import { defineEmits, ref, reactive, toRaw } from "vue";
import { useModalInner } from "/@/components/Modal";
import { getCaptcha } from "/@/api/sys/user";
import { SmsEnum } from "/@/views/sys/login/useLogin";
import { Rule } from "/@/components/Form";
import { rules } from "/@/utils/helper/validator";
import { Form } from "ant-design-vue";
import { updateMobile, changePhone } from "../UserSetting.api";
import { duplicateCheck } from "/@/views/system/user/user.api";
import {defHttp} from "@/utils/http/axios";
import { ExceptionEnum } from "@/enums/exceptionEnum";

const userStore = useUserStore();
const { createMessage } = useMessage();
const formState = reactive<Record<string, any>>({
  phone:'',
  smscode:''
});

//修改手机号
const updateFormState = reactive<Record<string, any>>({
  phone:'',
  smscode:'',
  newPhone:'',
  phoneText:'',
  newSmsCode:''
});

const formRef = ref();
const userData = ref<any>({})

const validatorRules: Record<string, Rule[]> = {
  phone: [{...rules.duplicateCheckRule("sys_user",'phone',formState,{ label:'手机号' })[0]},{ pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' }],
  smscode: [{ required: true,message:'请输入验证码' }],
};

//修改手机号验证规则
const updateValidatorRules: Record<string, Rule[]> = {
  newPhone: [{...rules.duplicateCheckRule("sys_user",'phone',formState,{ label:'手机号' })[0]},{ pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' }],
  smscode: [{ required: true,message:'请输入验证码' }],
  newSmsCode: [{ required: true,message:'请输入验证码' }],
};
const useForm = Form.useForm;
const title = ref<string>('');
const emit = defineEmits(['register','success']);
//修改手机号还是绑定手机号
const type = ref<string>('updatePhone');
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
  setModalProps({ confirmLoading: false });
  if(data.record.phone){
    updateFormState.phone = "";
    updateFormState.smscode = "";
    current.value = 0;
    title.value = '修改手机号';
    type.value = "updatePhone";
    Object.assign(updateFormState, data.record);
  }else{
    title.value = '绑定手机号';
    type.value = "bindPhone"
    //赋值
    data.record.smscode = '';
    Object.assign(formState, data.record);
    setTimeout(()=>{
      formRef.value.resetFields();
      formRef.value.clearValidate();
    },300)
  }
  userData.value = data.record;
});

/**
 * 倒计时执行前的函数
 */
function sendCodeApi() {
  return getCaptcha({ mobile: formState.phone, smsmode: SmsEnum.REGISTER });
}

/**
 * 倒计时执行前的函数
 * 
 * @param type 类型 verifyOriginalPhone 验证员手机号 updatePhone 修改手机号
 */
function updateSendCodeApi(type) {
  let phone = ""
  if(current.value === 0){
    phone = updateFormState.phone;
  }else{
    phone = updateFormState.newPhone;
  }
  let params = { phone: phone,  type: type };
  return new Promise((resolve, reject) => {
    defHttp.post({ url: "/sys/user/sendChangePhoneSms", params }, { isTransformResponse: false }).then((res) => {
      console.log(res);
      if (res.success) {
        resolve(true);
      } else {
        //update-begin---author:wangshuai---date:2024-04-18---for:【QQYUN-9005】同一个IP,1分钟超过5次短信,则提示需要验证码---
        if(res.code != ExceptionEnum.PHONE_SMS_FAIL_CODE){
          createMessage.error(res.message || '未知问题');
          reject();
        }
        reject(res);
        //update-end---author:wangshuai---date:2024-04-18---for:【QQYUN-9005】同一个IP,1分钟超过5次短信,则提示需要验证码---
      }
    }).catch((res)=>{
      createMessage.error(res.message || '未知问题');
      reject();
    });
  });
}

/**
 * 更新手机号
 */
async function updatePhone() {
  await formRef.value.validateFields();
  updateMobile(formState).then((res) =>{
    if(res.success){
      createMessage.success(type.value === "updatePhone"?"修改手机号成功":"绑定手机号成功")
      emit("success")
      closeModal();
    }else{
      createMessage.warning(res.message)
    }
  })
}
  //走到第几步
  const current = ref<number>(0);
  const updateFormRef = ref();

  /**
   * 下一步点击事件
   */
  async function nextStepClick() {
    let params = { phone: updateFormState.phone, smscode: updateFormState.smscode, type: 'verifyOriginalPhone' };
    changeAndVerifyPhone(params,1)
  }

  /**
   * 完成
   */
  function finishedClick() {
    changeAndVerifyPhone({ phone: updateFormState.phone, newPhone: updateFormState.newPhone, smscode: updateFormState.smscode, type: 'updatePhone' },0);
  }

  /**
   * 修改并验证手机号
   * @param params
   * @param index
   */
  async function changeAndVerifyPhone(params, index) {
    await updateFormRef.value.validateFields();
    changePhone(params).then((res)=>{
      if(res.success){
        current.value = index;
        if(index == 0){
          createMessage.success(res.message);
          emit("success");
          closeModal();
        }
        updateFormState.smscode = "";
      }else{
        createMessage.warn(res.message);
      }
    }).catch((res) =>{
      createMessage.warn(res.message);
    })
  }
</script>
<style lang="less" scoped>
  .antd-modal-form {
    padding: 10px 24px 10px 24px;
  }
 .black {
   color: #000000;
 }
 .font-size-13 {
   font-size: 13px;
   line-height: 15px;
 }
  .phone-padding {
    padding-top: 10px;
    padding-bottom: 10px;
  }
  :deep(.ant-form-item){
    margin-bottom: 10px;
  }
</style>