login.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <!-- 登录页 -->
  3. <div class="login main-background main-background-type0">
  4. <div class="nav-placeholder"></div>
  5. <!-- 表单 -->
  6. <section class="main-section ">
  7. <div class="content">
  8. <div class="title">
  9. <h2>登录</h2>
  10. </div>
  11. <div class="form-container">
  12. <DynamicForm
  13. ref="form"
  14. :model="formModel"
  15. :options="formOptions"
  16. />
  17. <a-button type="primary" block @click="handleSubmit">登录</a-button>
  18. </div>
  19. </div>
  20. </section>
  21. </div>
  22. </template>
  23. <script setup lang="ts">
  24. import type { SimpleSelectFormItemProps } from '@imengyu/imengyu-web-shared';
  25. import { useAuthStore } from '@/stores/auth';
  26. import { waitTimeOut } from '@imengyu/imengyu-utils';
  27. import { DynamicForm, type IDynamicFormOptions, type IDynamicFormRef } from '@imengyu/vue-dynamic-form';
  28. import { message, Modal, type FormInstance } from 'ant-design-vue';
  29. import { ref } from 'vue';
  30. import { useRouter } from 'vue-router';
  31. const form = ref<IDynamicFormRef>();
  32. const formModel = ref({
  33. mobile: '',
  34. password: '',
  35. account: '',
  36. type: 0,
  37. });
  38. const formOptions = ref<IDynamicFormOptions>({
  39. formLabelCol: { span: 6 },
  40. formWrapperCol: { span: 24 },
  41. formAdditionaProps: {
  42. layout: 'vertical'
  43. },
  44. formItems: [
  45. {
  46. label: '账号',
  47. name: 'mobile',
  48. type: 'text',
  49. hidden: { callback: (_, m) => (m as any).type == 1 },
  50. additionalProps: {
  51. placeholder: '请输入账号'
  52. },
  53. },
  54. {
  55. label: '账号',
  56. name: 'account',
  57. type: 'text',
  58. hidden: { callback: (_, m) => (m as any).type == 0 },
  59. additionalProps: {
  60. placeholder: '请输入账号'
  61. },
  62. },
  63. {
  64. label: '密码',
  65. name: 'password',
  66. type: 'password',
  67. additionalProps: {
  68. placeholder: '请输入密码'
  69. }
  70. },
  71. {
  72. label: '登录类型',
  73. name: 'type',
  74. type: 'radio-value',
  75. additionalProps: {
  76. placeholder: '请输入密码',
  77. options: [
  78. {
  79. text: '传承人',
  80. value: 0,
  81. },
  82. {
  83. text: '管理员',
  84. value: 1,
  85. },
  86. ],
  87. } as SimpleSelectFormItemProps
  88. },
  89. ],
  90. formRules: {
  91. mobile: [
  92. { required: true, message: '请输入账号' },
  93. ],
  94. account: [
  95. { required: true, message: '请输入密码' }
  96. ],
  97. password: [
  98. { required: true, message: '请输入密码' }
  99. ],
  100. },
  101. });
  102. const router = useRouter();
  103. const authStore = useAuthStore();
  104. async function handleSubmit() {
  105. try {
  106. await (form.value?.getFormRef() as FormInstance).validate();
  107. } catch {
  108. return;
  109. }
  110. try {
  111. await authStore.login(
  112. formModel.value.type == 1 ? formModel.value.account : formModel.value.mobile,
  113. formModel.value.password,
  114. formModel.value.type,
  115. );
  116. message.success('您已成功登录');
  117. await waitTimeOut(200);
  118. if (authStore.loginType == 0) {
  119. router.push('/inheritor');
  120. } else {
  121. router.push('/admin');
  122. }
  123. } catch (error) {
  124. Modal.error({
  125. title: '登录失败',
  126. content: '' + error,
  127. });
  128. }
  129. }
  130. </script>
  131. <style lang="scss">
  132. .login {
  133. min-height: calc(100vh - 50px);
  134. }
  135. </style>