login.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <route lang="yaml">
  2. meta:
  3. title: 登录
  4. constant: true
  5. layout: false
  6. </route>
  7. <script setup lang="ts">
  8. import { ref } from 'vue'
  9. import { useRoute, useRouter } from 'vue-router'
  10. import useUserStore from '@/store/modules/settings'
  11. defineOptions({
  12. name: 'Login',
  13. })
  14. const route = useRoute()
  15. const router = useRouter()
  16. const settingsStore = useUserStore()
  17. const redirect = ref(route.query.redirect?.toString() ?? settingsStore.settings.home.fullPath)
  18. const account = ref<string>()
  19. // // 表单类型
  20. const formType = ref<'login' | 'register' | 'resetPassword'>('login')
  21. </script>
  22. <template>
  23. <div class="bg-banner" />
  24. <img class="bgback" src=".././assets/images/loginback1.png" alt="">
  25. <div class="login-box">
  26. <!-- <div class="login-banner">
  27. <img
  28. src="@/assets/images/logo.png"
  29. class="absolute left-4 top-4 h-30px rounded ring ring-stone-2 dark-ring-stone-8"
  30. >
  31. <img src="@/assets/images/login-banner.png" class="banner">
  32. </div> -->
  33. <div class="login-form flex-col-center">
  34. <Transition name="fade" mode="out-in">
  35. <LoginForm
  36. v-if="formType === 'login'" :account @on-login="router.push(redirect)"
  37. @on-register="(account) => { formType = 'register'; account = account }"
  38. @on-reset-password="(account) => { formType = 'resetPassword'; account = account }"
  39. />
  40. <RegisterForm
  41. v-else-if="formType === 'register'" :account
  42. @on-register="(account) => { formType = 'login'; account = account }" @on-login="formType = 'login'"
  43. />
  44. <ResetPasswordForm
  45. v-else-if="formType === 'resetPassword'" :account
  46. @on-reset-password="(account) => { formType = 'login'; account = account }" @on-login="formType = 'login'"
  47. />
  48. </Transition>
  49. </div>
  50. </div>
  51. </template>
  52. <style lang="scss" scoped>
  53. .bg-banner {
  54. position: fixed;
  55. z-index: 0;
  56. width: 100%;
  57. height: 100%;
  58. background: radial-gradient(circle at center, var(--g-container-bg), var(--g-bg));
  59. background-image: url(".././assets/images/loginback.png");
  60. background-size: cover;
  61. }
  62. .bgback {
  63. position: fixed;
  64. top: 58%;
  65. left: 35%;
  66. z-index: 0;
  67. transform: translateX(-50%) translateY(-50%);
  68. }
  69. [data-mode="mobile"] {
  70. .login-box {
  71. position: relative;
  72. flex-direction: column;
  73. justify-content: start;
  74. width: 100%;
  75. .login-banner {
  76. width: 100%;
  77. padding: 20px 0;
  78. .banner {
  79. position: relative;
  80. top: inherit;
  81. right: inherit;
  82. display: inherit;
  83. width: 100%;
  84. max-width: 375px;
  85. margin: 0 auto;
  86. transform: translateY(0);
  87. }
  88. }
  89. .login-form {
  90. width: 100%;
  91. }
  92. }
  93. .copyright {
  94. position: relative;
  95. }
  96. }
  97. .login-box {
  98. position: absolute;
  99. display: flex;
  100. overflow: hidden;
  101. background-color: var(--g-container-bg);
  102. [data-mode="pc"] & {
  103. top: 50%;
  104. left: 70%;
  105. border-radius: 10px;
  106. box-shadow: var(--el-box-shadow);
  107. transform: translateX(-50%) translateY(-50%);
  108. }
  109. .login-banner {
  110. position: relative;
  111. width: 450px;
  112. overflow: hidden;
  113. background-color: var(--g-bg);
  114. .banner {
  115. position: absolute;
  116. top: 50%;
  117. width: 100%;
  118. transform: translateY(-50%);
  119. }
  120. }
  121. .login-form {
  122. width: 500px;
  123. transition: height 0.15s ease;
  124. }
  125. }
  126. .copyright {
  127. position: absolute;
  128. bottom: 0;
  129. width: 100%;
  130. padding: 20px;
  131. margin: 0;
  132. }
  133. .fade-enter-active,
  134. .fade-leave-active {
  135. transition: opacity 0.15s ease;
  136. }
  137. .fade-enter-from,
  138. .fade-leave-to {
  139. opacity: 0;
  140. }
  141. </style>