Login.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <script setup lang="ts">
  2. import { appName, openRegisration } from "@/env";
  3. import { ref, computed, onMounted } from "vue";
  4. import { useMainStore } from "@/stores/main";
  5. import { useDisplay } from "vuetify";
  6. import { storeToRefs } from "pinia";
  7. import Navbar from "@/components/Navbar.vue";
  8. const mainStore = useMainStore();
  9. const mainStoreRef = storeToRefs(mainStore);
  10. // variable
  11. const email = ref("");
  12. const password = ref("");
  13. const { name } = useDisplay();
  14. let showPassword = ref(false);
  15. // getter
  16. const loginError = mainStoreRef.readLoginError;
  17. const width = computed(() => {
  18. // name is reactive and
  19. // must use .value
  20. switch (name.value) {
  21. case "xs":
  22. return 12;
  23. case "sm":
  24. return 12;
  25. // case "md":
  26. // return 6;
  27. }
  28. return 6;
  29. });
  30. // action
  31. function submit() {
  32. mainStore.logIn(email.value, password.value);
  33. }
  34. // lifecycle
  35. onMounted(() => {});
  36. </script>
  37. <template>
  38. <Navbar />
  39. <v-container fluid class="pa-0">
  40. <v-row align="center" no-gutters class="overflow-hidden">
  41. <v-col :cols="width">
  42. <section class="overflow-hidden banner-item">
  43. <img src="../assets/img/banner.png" alt="" />
  44. <h2>
  45. 將您的生活、創作、宣傳做成影片
  46. <br />
  47. 開始使用 AI Presentors
  48. </h2>
  49. </section>
  50. </v-col>
  51. <v-col :cols="width" class="px-6 my-8 my-md-0">
  52. <div class="form-title">
  53. <h3>登入</h3>
  54. <span></span>
  55. </div>
  56. <v-form ref="form" class="login-form" lazy-validation>
  57. <v-text-field
  58. v-model="email"
  59. name="email"
  60. prepend-icon="person"
  61. :rules="[(v) => !!v || '請輸入您的帳號']"
  62. label="使用者名稱"
  63. required
  64. ></v-text-field>
  65. <v-text-field
  66. v-model="password"
  67. name="password"
  68. id="password"
  69. prepend-icon="key"
  70. :append-icon="showPassword ? 'visibility' : 'visibility_off'"
  71. :rules="[(v) => !!v || '請輸入您的密碼']"
  72. :type="showPassword ? 'text' : 'password'"
  73. label="密碼"
  74. hint="4-12 位數密碼"
  75. @click:append="showPassword = !showPassword"
  76. required
  77. ></v-text-field>
  78. <p class="text-center">
  79. 還沒有帳號?
  80. <router-link to="/signup">註冊</router-link>/<router-link
  81. to="/recover-password"
  82. >忘記密碼</router-link
  83. >
  84. </p>
  85. <v-btn
  86. rounded="pill"
  87. color="primary"
  88. @click.prevent="submit"
  89. class="login-btn"
  90. >
  91. 立即登入
  92. </v-btn>
  93. </v-form>
  94. </v-col>
  95. </v-row>
  96. </v-container>
  97. <!-- <v-container fluid class="d-flex fill-height">
  98. <v-row align="center" justify="center">
  99. <v-col :cols="width">
  100. <v-card class="elevation-12">
  101. <v-toolbar dark color="primary">
  102. <v-toolbar-title>{{ appName }}</v-toolbar-title>
  103. <v-spacer></v-spacer>
  104. <v-btn to="/signup">SignUp</v-btn>
  105. </v-toolbar>
  106. <v-card-text>
  107. <v-form @keyup.enter="submit">
  108. <v-text-field
  109. @keyup.enter="submit"
  110. v-model="email"
  111. prepend-icon="person"
  112. name="email"
  113. label="Email"
  114. type="text"
  115. ></v-text-field>
  116. <v-text-field
  117. @keyup.enter="submit"
  118. v-model="password"
  119. prepend-icon="key"
  120. name="password"
  121. label="Password"
  122. id="password"
  123. type="password"
  124. ></v-text-field>
  125. </v-form>
  126. <div v-if="loginError">
  127. <v-alert
  128. :value="loginError"
  129. transition="fade-transition"
  130. type="error"
  131. >
  132. Incorrect email or password
  133. </v-alert>
  134. </div>
  135. <div class="d-flex align-end flex-column">
  136. <router-link to="/recover-password"
  137. >Forgot your password?</router-link
  138. >
  139. </div>
  140. </v-card-text>
  141. <v-card-actions>
  142. <v-spacer></v-spacer>
  143. <v-btn @click.prevent="submit">Login</v-btn>
  144. </v-card-actions>
  145. </v-card>
  146. </v-col>
  147. </v-row>
  148. </v-container> -->
  149. </template>