LoginPage.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <template>
  2. <q-page padding class="login-page">
  3. <q-card flat class="login-card q-pa-md q-pt-xl bg-surface">
  4. <div class="text-center">
  5. <q-img :src="Logo" style="max-width: 250px" />
  6. <div class="text-h6">{{ $t("general.welcome") }}</div>
  7. </div>
  8. <q-form
  9. ref="loginForm"
  10. class="q-pa-md"
  11. autocorrect="off"
  12. autocapitalize="off"
  13. autocomplete="off"
  14. spellcheck="false"
  15. @submit="submitLogin"
  16. >
  17. <q-card-section class="q-mt-sm">
  18. <q-input
  19. v-model="email"
  20. filled
  21. type="email"
  22. label="Email"
  23. lazy-rules
  24. autofocus
  25. :rules="[inputRules.required, inputRules.email]"
  26. />
  27. <q-input
  28. v-model="password"
  29. :label="$t('users.password')"
  30. filled
  31. :type="isPwd ? 'password' : 'text'"
  32. class="q-mt-xs"
  33. lazy-rules
  34. :rules="[inputRules.required, inputRules.min(6)]"
  35. >
  36. <template #append>
  37. <q-icon
  38. :name="isPwd ? 'mdi-eye-off' : 'mdi-eye'"
  39. class="cursor-pointer q-ml-md"
  40. @click="isPwd = !isPwd"
  41. />
  42. </template>
  43. </q-input>
  44. <q-checkbox v-model="checkbox" label="Lembrar email" />
  45. </q-card-section>
  46. <q-card-actions align="right">
  47. <q-btn
  48. color="primary"
  49. :label="$t('navigation.login')"
  50. size="md"
  51. padding="md"
  52. type="submit"
  53. :loading="submitting"
  54. >
  55. <template #loading>
  56. <q-spinner />
  57. </template>
  58. </q-btn>
  59. </q-card-actions>
  60. </q-form>
  61. </q-card>
  62. </q-page>
  63. </template>
  64. <script setup>
  65. import { ref, onMounted } from "vue";
  66. import { useQuasar } from "quasar";
  67. import { useAuth } from "src/composables/useAuth";
  68. import { useRouter } from "vue-router";
  69. import { useInputRules } from "src/composables/useInputRules";
  70. import Logo from "src/assets/logo.png";
  71. const router = useRouter();
  72. const $q = useQuasar();
  73. const { inputRules } = useInputRules();
  74. const email = ref("");
  75. const password = ref(process.env.PASSWORD);
  76. const isPwd = ref(true);
  77. const submitting = ref(false);
  78. const loginForm = ref(null);
  79. const checkbox = ref(false);
  80. const submitLogin = async () => {
  81. try {
  82. submitting.value = true;
  83. const validate = await loginForm.value.validate();
  84. if (!validate) {
  85. return;
  86. }
  87. const email_storage = $q.cookies.get("email");
  88. if (email_storage && !checkbox.value) {
  89. $q.cookies.remove("email");
  90. }
  91. if (checkbox.value) {
  92. $q.cookies.set("email", email.value, {
  93. expires: "3d",
  94. path: "/",
  95. sameSite: "Lax",
  96. });
  97. }
  98. await useAuth().login(email.value, password.value);
  99. submitting.value = false;
  100. router.push({ name: "DashboardPage" });
  101. } catch (error) {
  102. submitting.value = false;
  103. }
  104. };
  105. onMounted(() => {
  106. const email_storage = $q.cookies.get("email");
  107. if (email_storage) {
  108. checkbox.value = true;
  109. email.value = email_storage;
  110. }
  111. if (process.env.DEV && process.env.SENHA) {
  112. password.value = process.env.SENHA;
  113. }
  114. });
  115. </script>
  116. <style lang="scss" scoped>
  117. .login-page {
  118. display: flex;
  119. justify-content: center;
  120. align-items: center;
  121. .login-card {
  122. width: 100%;
  123. max-width: 500px;
  124. border-radius: 12px;
  125. }
  126. }
  127. </style>