passwordPage.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <template>
  2. <v-form ref="passwordForm" @submit.prevent>
  3. <v-text-field
  4. v-model="loginData.phone"
  5. :counter="isCounter ? 30 : 11"
  6. :disabled="props.phoneDisabled"
  7. :placeholder="placeholder ? placeholder : '请输入手机号码'"
  8. color="primary"
  9. variant="outlined"
  10. density="compact"
  11. :rules="phoneRules"
  12. validate-on="input"
  13. :prepend-inner-icon="props.validEmail ? 'mdi-email' : 'mdi-cellphone'"
  14. >
  15. <!-- <template v-slot:prepend-inner>
  16. <span class="d-flex">
  17. <v-icon icon="mdi-cellphone" size="24" color="#818181"></v-icon>
  18. <span class="d-flex" id="menu-activator">
  19. <span class="phone-number">{{ currentArea }}</span>
  20. <v-icon size="20">mdi-chevron-down</v-icon>
  21. </span>
  22. <v-menu activator="#menu-activator">
  23. <v-list>
  24. <v-list-item v-for="(item, index) in items" :key="index" :value="index" @click="handleChangeCurrentArea(item)">
  25. <v-list-item-title>{{ item.label }}</v-list-item-title>
  26. </v-list-item>
  27. </v-list>
  28. </v-menu>
  29. </span>
  30. </template> -->
  31. </v-text-field>
  32. <v-text-field
  33. v-model="loginData.password"
  34. :placeholder="$t('login.enterPassword')"
  35. variant="outlined"
  36. density="compact"
  37. color="primary"
  38. prepend-inner-icon="mdi-lock-outline"
  39. :append-inner-icon="passwordType ? 'mdi-eye-outline' : 'mdi-eye-off-outline'"
  40. :type="passwordType ? 'text' : 'password'"
  41. @click:append-inner="passwordType = !passwordType"
  42. :rules="[v=> !!v || $t('login.enterPassword'), validPassword]"
  43. @keyup.enter="handleEnter"
  44. ></v-text-field>
  45. </v-form>
  46. </template>
  47. <script setup name="passwordPage">
  48. import { ref, reactive, computed } from 'vue'
  49. defineOptions({ name: 'password-form' })
  50. import { checkEmail } from '@/utils/validate'
  51. import { useI18n } from '@/hooks/web/useI18n'
  52. const { t } = useI18n()
  53. const props = defineProps({ phoneDisabled: Boolean, placeholder: String, validEmail: Boolean, isCounter: Boolean })
  54. const passwordType = ref(false)
  55. const emits = defineEmits(['handleEnter'])
  56. const phoneRules = ref([]) // 区分企业邮箱和手机号2种方式登录校验
  57. if (props.validEmail) {
  58. // 邮箱效验
  59. phoneRules.value = [
  60. value => {
  61. if (value) return true
  62. return props.placeholder ? props.placeholder : '请输入企业邮箱'
  63. },
  64. value => {
  65. if (checkEmail(value)) return true
  66. return '请输入正确的企业邮箱'
  67. }
  68. ]
  69. } else {
  70. // 手机号码效验
  71. phoneRules.value = [
  72. value => {
  73. if (value) return true
  74. return props.placeholder ? props.placeholder : '请输入手机号码'
  75. },
  76. value => {
  77. if (value?.length <= 11 && /^1[3456789]\d{9}$/.test(value)) return true
  78. return t('login.correctPhoneNumber')
  79. }
  80. ]
  81. }
  82. // 手机号区域
  83. // const currentArea = ref('0086')
  84. // const items = [
  85. // { label: '中国大陆-0086', value: '0086' }
  86. // ]
  87. // const handleChangeCurrentArea = (e) => {
  88. // currentArea.value = e.value
  89. // }
  90. // 密码效验
  91. const regex = /^.{8,}$/
  92. const validPassword = computed(() => {
  93. return regex.test(loginData.password) || '请输入至少8位数的密码'
  94. })
  95. const loginUserPhone = localStorage.getItem('loginUserPhone') || ''
  96. const loginData = reactive({
  97. phone: loginUserPhone, // 13229740092
  98. password: '' // 1111
  99. })
  100. // 设置默认账号密码便于开发快捷登录
  101. if (window.location.hostname === 'localhost' || window.location.hostname === '192.168.3.152') {
  102. loginData.phone = props.validEmail ?
  103. '1687284007@qq.com' : '13229740092'
  104. loginData.password = 'Citu123456'
  105. }
  106. const passwordForm = ref()
  107. const handleEnter = () => {
  108. emits('handleEnter')
  109. }
  110. defineExpose({
  111. loginData,
  112. passwordForm
  113. })
  114. </script>