sendSms.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from './sendSms.module.less';
  3. import smsTop from '../images/sms-top.png';
  4. import closeAble from '../images/closeAble.png';
  5. import {
  6. NButton,
  7. NForm,
  8. NFormItem,
  9. NGi,
  10. NGrid,
  11. NImage,
  12. NInput,
  13. NSpace
  14. } from 'naive-ui';
  15. import { sendImgCode, sendSmsVerify } from '../api';
  16. export default defineComponent({
  17. name: 'sendSms',
  18. props: {
  19. phone: {
  20. type: String,
  21. default: ''
  22. },
  23. clientId: {
  24. type: String,
  25. default: 'cooleshow-teacher'
  26. },
  27. type: {
  28. type: String,
  29. default: 'LOGIN'
  30. }
  31. },
  32. emits: ['close', 'sendCode'],
  33. setup(props, { emit }) {
  34. const state = reactive({
  35. identifyingCode: null as any,
  36. code: null as any
  37. });
  38. const formRef = ref();
  39. const getSendImgCode = async () => {
  40. const { data } = await sendImgCode({ phone: props.phone });
  41. state.identifyingCode = data;
  42. };
  43. const onSubmit = async () => {
  44. formRef.value.validate(async (errors: any) => {
  45. if (errors) return;
  46. try {
  47. await sendSmsVerify({
  48. code: state.code,
  49. clientId: props.clientId,
  50. type: props.type,
  51. mobile: props.phone
  52. });
  53. emit('close');
  54. emit('sendCode');
  55. } catch {
  56. state.code = '';
  57. setTimeout(() => {
  58. getSendImgCode();
  59. }, 500);
  60. }
  61. });
  62. };
  63. onMounted(() => {
  64. getSendImgCode();
  65. });
  66. return () => (
  67. <div class={styles.downMove}>
  68. <img src={smsTop} class={styles.downMoveBg} alt="" />
  69. <img
  70. src={closeAble}
  71. class={styles.closeAble}
  72. onClick={() => {
  73. emit('close');
  74. }}
  75. alt=""
  76. />
  77. <h2>请输入图形验证码</h2>
  78. <NForm class={styles.smsForm} ref={formRef} model={state}>
  79. <NGrid xGap={12}>
  80. <NGi span={15}>
  81. <NFormItem
  82. showLabel={false}
  83. path="code"
  84. rule={[
  85. {
  86. required: true,
  87. message: '请输入图形验证码',
  88. trigger: ['blur', 'input']
  89. }
  90. ]}>
  91. <NInput placeholder="图形验证码" v-model:value={state.code} />
  92. </NFormItem>
  93. </NGi>
  94. <NGi span={9}>
  95. <div onClick={getSendImgCode}>
  96. <NImage
  97. class={styles.smsImg}
  98. lazy
  99. previewDisabled
  100. src={state.identifyingCode}
  101. />
  102. </div>
  103. <span class={styles.imgChange} onClick={getSendImgCode}>
  104. 看不清?换一换
  105. </span>
  106. </NGi>
  107. </NGrid>
  108. </NForm>
  109. <NSpace class={styles.btnGroup} justify="center">
  110. <NButton
  111. class={[styles.btn, styles.cancelBtn]}
  112. round
  113. type="default"
  114. onClick={() => {
  115. emit('close');
  116. }}>
  117. 取消
  118. </NButton>
  119. <NButton
  120. class={[styles.btn, styles.submitBtn]}
  121. onClick={onSubmit}
  122. round
  123. type="primary">
  124. 确定
  125. </NButton>
  126. </NSpace>
  127. </div>
  128. );
  129. }
  130. });