login.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <route lang="yaml">
  2. meta:
  3. title: 登录
  4. constant: true
  5. layout: false
  6. </route>
  7. <script setup lang="ts">
  8. import { ref, onBeforeMount } from "vue";
  9. import { useRoute, useRouter } from "vue-router";
  10. import useUserStore from "@/store/modules/settings";
  11. // import { asyncRoutes } from "@/router/routes"; // 请根据实际路径调整
  12. // import {
  13. // preprocessRoutes,
  14. // convertToTreeData,
  15. // TreeNode,
  16. // } from "@/utils/composables/routeUtils"; // 导入工具方法
  17. defineOptions({
  18. name: "Login",
  19. });
  20. import api from "@/api";
  21. // const treeData = ref<TreeNode[]>([]);
  22. // onBeforeMount(() => {
  23. // // 对 asyncRoutes 进行预处理并转换为树形结构
  24. // const processedRoutes = preprocessRoutes(asyncRoutes);
  25. //
  26. // treeData.value = convertToTreeData(0, processedRoutes);
  27. //
  28. // // api.roleApi
  29. // // .updateConfig({
  30. // // sysConfig: JSON.stringify(processedRoutes),
  31. // // sysPerms: JSON.stringify(treeData.value),
  32. // // })
  33. // // .then((res) => {});
  34. // });
  35. const route = useRoute();
  36. const router = useRouter();
  37. const settingsStore = useUserStore();
  38. const redirect = ref(
  39. route.query.redirect?.toString() ?? settingsStore.settings.home.fullPath
  40. );
  41. const account = ref<string>();
  42. // // 表单类型
  43. const formType = ref<"login" | "register" | "resetPassword">("login");
  44. </script>
  45. <template>
  46. <div class="bg-banner" />
  47. <img class="bgback" src=".././assets/images/loginback1.png" alt="" />
  48. <div class="login-box">
  49. <!-- <div class="login-banner">
  50. <img
  51. src="@/assets/images/logo.png"
  52. class="absolute left-4 top-4 h-30px rounded ring ring-stone-2 dark-ring-stone-8"
  53. >
  54. <img src="@/assets/images/login-banner.png" class="banner">
  55. </div> -->
  56. <div class="login-form flex-col-center">
  57. <Transition name="fade" mode="out-in">
  58. <LoginForm
  59. v-if="formType === 'login'"
  60. :account
  61. @on-login="router.push(redirect)"
  62. @on-register="
  63. (account) => {
  64. formType = 'register';
  65. account = account;
  66. }
  67. "
  68. @on-reset-password="
  69. (account) => {
  70. formType = 'resetPassword';
  71. account = account;
  72. }
  73. "
  74. />
  75. <RegisterForm
  76. v-else-if="formType === 'register'"
  77. :account
  78. @on-register="
  79. (account) => {
  80. formType = 'login';
  81. account = account;
  82. }
  83. "
  84. @on-login="formType = 'login'"
  85. />
  86. <ResetPasswordForm
  87. v-else-if="formType === 'resetPassword'"
  88. :account
  89. @on-reset-password="
  90. (account) => {
  91. formType = 'login';
  92. account = account;
  93. }
  94. "
  95. @on-login="formType = 'login'"
  96. />
  97. </Transition>
  98. </div>
  99. </div>
  100. </template>
  101. <style lang="scss" scoped>
  102. .bg-banner {
  103. position: fixed;
  104. z-index: 0;
  105. width: 100%;
  106. height: 100%;
  107. background: radial-gradient(
  108. circle at center,
  109. var(--g-container-bg),
  110. var(--g-bg)
  111. );
  112. background-image: url(".././assets/images/loginback.png");
  113. background-size: cover;
  114. }
  115. .bgback {
  116. position: fixed;
  117. top: 58%;
  118. left: 35%;
  119. z-index: 0;
  120. transform: translateX(-50%) translateY(-50%);
  121. }
  122. [data-mode="mobile"] {
  123. .login-box {
  124. position: relative;
  125. flex-direction: column;
  126. justify-content: start;
  127. width: 100%;
  128. .login-banner {
  129. width: 100%;
  130. padding: 20px 0;
  131. .banner {
  132. position: relative;
  133. top: inherit;
  134. right: inherit;
  135. display: inherit;
  136. width: 100%;
  137. max-width: 375px;
  138. margin: 0 auto;
  139. transform: translateY(0);
  140. }
  141. }
  142. .login-form {
  143. width: 100%;
  144. }
  145. }
  146. .copyright {
  147. position: relative;
  148. }
  149. }
  150. .login-box {
  151. position: absolute;
  152. display: flex;
  153. overflow: hidden;
  154. background-color: var(--g-container-bg);
  155. [data-mode="pc"] & {
  156. top: 50%;
  157. left: 70%;
  158. border-radius: 10px;
  159. box-shadow: var(--el-box-shadow);
  160. transform: translateX(-50%) translateY(-50%);
  161. }
  162. .login-banner {
  163. position: relative;
  164. width: 450px;
  165. overflow: hidden;
  166. background-color: var(--g-bg);
  167. .banner {
  168. position: absolute;
  169. top: 50%;
  170. width: 100%;
  171. transform: translateY(-50%);
  172. }
  173. }
  174. .login-form {
  175. width: 500px;
  176. transition: height 0.15s ease;
  177. }
  178. .fade-enter-active,
  179. .fade-leave-active {
  180. transition: opacity 0.15s ease;
  181. }
  182. .fade-enter-from,
  183. .fade-leave-to {
  184. opacity: 0;
  185. }
  186. }
  187. .copyright {
  188. position: absolute;
  189. bottom: 0;
  190. width: 100%;
  191. padding: 20px;
  192. margin: 0;
  193. }
  194. .fade-enter-active,
  195. .fade-leave-active {
  196. transition: opacity 0.15s ease;
  197. }
  198. .fade-enter-from,
  199. .fade-leave-to {
  200. opacity: 0;
  201. }
  202. </style>