index.tsx 3.2 KB

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