Login.vue 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <template>
  2. <div class="login-container">
  3. <h2>Login</h2>
  4. <form @submit.prevent="handleLogin">
  5. <label for="username">Username:</label>
  6. <input id="username" v-model.trim="username" type="text" placeholder="Enter username" :class="{ 'has-error': errors.username }">
  7. <small v-if="errors.username">{{ errors.username }}</small>
  8. <label for="password">Password:</label>
  9. <input id="password" v-model.trim="password" type="password" placeholder="Enter password" :class="{ 'has-error': errors.password }">
  10. <small v-if="errors.password">{{ errors.password }}</small>
  11. <label><input type="checkbox" v-model="rememberMe"> Remember me</label>
  12. <button type="submit">Login</button>
  13. </form>
  14. </div>
  15. </template>
  16. <script setup>
  17. import { ref, onMounted } from 'vue';
  18. import { useRouter } from 'vue-router';
  19. import { useStore } from 'vuex';
  20. const store = useStore();
  21. const router = useRouter();
  22. const username = ref('admin');
  23. const password = ref('admin');
  24. const rememberMe = ref(false);
  25. const errors = ref({});
  26. onMounted(() => {
  27. if (localStorage.getItem('rememberMe')) {
  28. username.value = localStorage.getItem('username');
  29. rememberMe.value = true;
  30. }
  31. });
  32. const handleLogin = () => {
  33. errors.value = {};
  34. if (username.value.length < 4 || username.value.length > 16 || /[^\w\s]/.test(username.value)) {
  35. errors.value.username = 'Username must be 4-16 characters and no special characters.';
  36. }
  37. if (password.value.length < 6 || password.value.length > 20) {
  38. errors.value.password = 'Password must be 6-20 characters.';
  39. }
  40. if (!errors.value.username && !errors.value.password) {
  41. if (username.value === 'admin' && password.value === 'admin') {
  42. if (rememberMe.value) {
  43. localStorage.setItem('username', username.value);
  44. localStorage.setItem('rememberMe', true);
  45. }
  46. router.push('/home');
  47. } else {
  48. errors.value.general = 'Username or password is incorrect.';
  49. }
  50. }
  51. };
  52. </script>
  53. <style scoped>
  54. .login-container {
  55. display: flex;
  56. flex-direction: column;
  57. align-items: center;
  58. justify-content: center;
  59. width: 100%;
  60. height: 100vh;
  61. }
  62. .login-container label {
  63. margin-bottom: 0.5rem;
  64. }
  65. .login-container input {
  66. padding: 0.5rem;
  67. margin-bottom: 1rem;
  68. width: 100%;
  69. }
  70. .has-error {
  71. border-color: red;
  72. }
  73. .login-container button {
  74. padding: 0.5rem 1rem;
  75. }
  76. </style>