Index.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <app-statusbar class="login">
  3. <app-navback class="login-navback" />
  4. <div class="login-logo">
  5. <img :src="'./img/login-logo.png'" />
  6. </div>
  7. <Form ref="formRef" class="login-form" @submit="formValidate">
  8. <CellGroup inset>
  9. <Field v-model="formData.userName" name="account" label="账号登录" label-align="top" size="large"
  10. placeholder="请输入登录账号/手机号" :rules="[{ required: true, message: '请输入账号登录' }]" />
  11. <Field v-model="formData.password" name="password" type="password" label="密码" label-align="top" size="large"
  12. placeholder="请输入密码" :rules="[{ required: true, message: '请输入密码' }]" autocomplete="off" />
  13. </CellGroup>
  14. </Form>
  15. <div class="login-link">
  16. <span @click="navigationTo('user-register')">用户注册</span>
  17. <span @click="navigationTo('user-forget')">忘记密码</span>
  18. </div>
  19. <ClickVerify class="login-submit" v-model:show="showClickVerify" @success="formSubmit">
  20. <Button type="primary" native-type="submit" @click="formRef?.submit" round block>登录</Button>
  21. </ClickVerify>
  22. <div class="login-footer">
  23. <div class="login-footer__trem">
  24. <Checkbox shape="square" icon-size="16px" v-model="checked">我已阅读并同意</Checkbox>
  25. <span @click="routerTo('rules-zcxy')">《用户注册协议》</span>
  26. <span>、</span>
  27. <span @click="routerTo('rules-yhkhfxgzs')">《用户开户风险告知书》</span>
  28. <span>、</span>
  29. <span @click="routerTo('rules-yszc')">《隐私政策》</span>
  30. </div>
  31. <div class="login-footer__version">
  32. <span>v1.0.{{ appVersion }}</span>
  33. </div>
  34. </div>
  35. </app-statusbar>
  36. </template>
  37. <script lang="ts" setup>
  38. import { shallowRef, onMounted, onUnmounted } from 'vue'
  39. import { FormInstance, Button, Field, CellGroup, Form, Checkbox, showFailToast, showToast } from 'vant'
  40. import { fullloading, dialog } from '@/utils/vant'
  41. import { useLogin } from '@/business/login'
  42. import { useNavigation } from '@mobile/router/navigation'
  43. import service from '@/services'
  44. import plus from '@/utils/h5plus'
  45. import ClickVerify from '@mobile/components/base/click-verify/index.vue'
  46. const { routerBack, setGlobalUrlParams, routerTo } = useNavigation()
  47. const { formData, userLogin } = useLogin()
  48. const formRef = shallowRef<FormInstance>()
  49. const checked = shallowRef(false) // 是否同意协议管理
  50. const showClickVerify = shallowRef(false) // 显示验证窗口
  51. const meta = document.getElementsByTagName('meta')
  52. const appVersion = meta.namedItem('revised')?.content ?? '0'
  53. // 导航跳转
  54. const navigationTo = (name: string) => {
  55. fullloading((hideLoading) => {
  56. service.onReady().then(() => {
  57. hideLoading()
  58. routerTo(name)
  59. }).catch(() => {
  60. showFailToast('初始化失败')
  61. })
  62. }, '加载中...')
  63. }
  64. // 表单验证
  65. const formValidate = () => {
  66. if (checked.value) {
  67. showClickVerify.value = true
  68. } else {
  69. showToast('请先同意使用条款')
  70. }
  71. }
  72. // 表单提交
  73. const formSubmit = () => {
  74. fullloading((hideLoading) => {
  75. userLogin().then((forcedPasswordChange) => {
  76. hideLoading()
  77. if (forcedPasswordChange) {
  78. dialog('为了您的账户安全,请修改密码!').then(() => {
  79. setGlobalUrlParams({ forcedPasswordChange })
  80. routerTo('user-password', true)
  81. })
  82. } else {
  83. routerBack()
  84. }
  85. }).catch((err) => {
  86. formData.password = ''
  87. showFailToast(err)
  88. })
  89. }, '登录中...')
  90. }
  91. onMounted(() => plus.setStatusBarStyle('dark'))
  92. onUnmounted(() => plus.setStatusBarStyle('light'))
  93. </script>
  94. <style lang="less">
  95. @import './index.less';
  96. </style>