You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
4.1 KiB

  1. <script setup lang="ts">
  2. import { ref, computed } from "vue";
  3. import { useRouter } from "vue-router";
  4. import { initRouter } from "/@/router";
  5. import { storageSession } from "/@/utils/storage";
  6. import { addClass, removeClass } from "/@/utils/operate";
  7. import bg from "/@/assets/login/bg.png";
  8. import avatar from "/@/assets/login/avatar.svg";
  9. import illustration0 from "/@/assets/login/illustration0.svg";
  10. import illustration1 from "/@/assets/login/illustration1.svg";
  11. import illustration2 from "/@/assets/login/illustration2.svg";
  12. import illustration3 from "/@/assets/login/illustration3.svg";
  13. import illustration4 from "/@/assets/login/illustration4.svg";
  14. import illustration5 from "/@/assets/login/illustration5.svg";
  15. import illustration6 from "/@/assets/login/illustration6.svg";
  16. const router = useRouter();
  17. // eslint-disable-next-line vue/return-in-computed-property
  18. const currentWeek = computed(() => {
  19. switch (String(new Date().getDay())) {
  20. case "0":
  21. return illustration0;
  22. case "1":
  23. return illustration1;
  24. case "2":
  25. return illustration2;
  26. case "3":
  27. return illustration3;
  28. case "4":
  29. return illustration4;
  30. case "5":
  31. return illustration5;
  32. case "6":
  33. return illustration6;
  34. default:
  35. return illustration4;
  36. }
  37. });
  38. let user = ref("admin");
  39. let pwd = ref("123456");
  40. const onLogin = (): void => {
  41. storageSession.setItem("info", {
  42. username: "admin",
  43. accessToken: "eyJhbGciOiJIUzUxMiJ9.test"
  44. });
  45. initRouter("admin").then(() => {});
  46. router.push("/");
  47. };
  48. function onUserFocus() {
  49. addClass(document.querySelector(".user"), "focus");
  50. }
  51. function onUserBlur() {
  52. if (user.value.length === 0)
  53. removeClass(document.querySelector(".user"), "focus");
  54. }
  55. function onPwdFocus() {
  56. addClass(document.querySelector(".pwd"), "focus");
  57. }
  58. function onPwdBlur() {
  59. if (pwd.value.length === 0)
  60. removeClass(document.querySelector(".pwd"), "focus");
  61. }
  62. </script>
  63. <template>
  64. <img :src="bg" class="wave" />
  65. <div class="container">
  66. <div class="img">
  67. <component :is="currentWeek"></component>
  68. </div>
  69. <div class="login-box">
  70. <div class="login-form">
  71. <avatar class="avatar" />
  72. <h2
  73. v-motion
  74. :initial="{
  75. opacity: 0,
  76. y: 100
  77. }"
  78. :enter="{
  79. opacity: 1,
  80. y: 0,
  81. transition: {
  82. delay: 100
  83. }
  84. }"
  85. >
  86. Pure Admin
  87. </h2>
  88. <div
  89. class="input-group user focus"
  90. v-motion
  91. :initial="{
  92. opacity: 0,
  93. y: 100
  94. }"
  95. :enter="{
  96. opacity: 1,
  97. y: 0,
  98. transition: {
  99. delay: 200
  100. }
  101. }"
  102. >
  103. <div class="icon">
  104. <i class="fa fa-user"></i>
  105. </div>
  106. <div>
  107. <h5>用户名</h5>
  108. <input
  109. type="text"
  110. class="input"
  111. v-model="user"
  112. @focus="onUserFocus"
  113. @blur="onUserBlur"
  114. />
  115. </div>
  116. </div>
  117. <div
  118. class="input-group pwd focus"
  119. v-motion
  120. :initial="{
  121. opacity: 0,
  122. y: 100
  123. }"
  124. :enter="{
  125. opacity: 1,
  126. y: 0,
  127. transition: {
  128. delay: 300
  129. }
  130. }"
  131. >
  132. <div class="icon">
  133. <i class="fa fa-lock"></i>
  134. </div>
  135. <div>
  136. <h5>密码</h5>
  137. <input
  138. type="password"
  139. class="input"
  140. v-model="pwd"
  141. @focus="onPwdFocus"
  142. @blur="onPwdBlur"
  143. />
  144. </div>
  145. </div>
  146. <button
  147. class="btn"
  148. v-motion
  149. :initial="{
  150. opacity: 0,
  151. y: 10
  152. }"
  153. :enter="{
  154. opacity: 1,
  155. y: 0,
  156. transition: {
  157. delay: 400
  158. }
  159. }"
  160. @click="onLogin"
  161. >
  162. 登录
  163. </button>
  164. </div>
  165. </div>
  166. </div>
  167. </template>
  168. <style scoped>
  169. @import url("/@/style/login.css");
  170. </style>