index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <div class="go-login">
  3. <div class="login-account">
  4. <div class="login-account-header"></div>
  5. <div class="login-account-container">
  6. <div class="login-account-top">
  7. <div class="login-account-top-logo">
  8. <img src="~@/assets/images/logo.png" alt="" />
  9. </div>
  10. <div class="login-account-top-desc">
  11. GoView
  12. </div>
  13. </div>
  14. <div class="login-account-form">
  15. <n-form
  16. ref="formRef"
  17. label-placement="left"
  18. size="large"
  19. :model="formInline"
  20. :rules="rules"
  21. >
  22. <n-form-item path="username">
  23. <n-input
  24. v-model:value="formInline.username"
  25. placeholder="请输入用户名"
  26. >
  27. <template #prefix>
  28. <n-icon size="18" color="#808695">
  29. <PersonOutline />
  30. </n-icon>
  31. </template>
  32. </n-input>
  33. </n-form-item>
  34. <n-form-item path="password">
  35. <n-input
  36. v-model:value="formInline.password"
  37. type="password"
  38. show-password-toggle
  39. placeholder="请输入密码"
  40. >
  41. <template #prefix>
  42. <n-icon size="18" color="#808695">
  43. <LockClosedOutline />
  44. </n-icon>
  45. </template>
  46. </n-input>
  47. </n-form-item>
  48. <n-form-item class="default-color">
  49. <div class="flex justify-between">
  50. <div class="flex-initial">
  51. <n-checkbox v-model:checked="autoLogin">自动登录</n-checkbox>
  52. </div>
  53. </div>
  54. </n-form-item>
  55. <n-form-item>
  56. <n-button
  57. type="primary"
  58. @click="handleSubmit"
  59. size="large"
  60. :loading="loading"
  61. block
  62. >
  63. 登录
  64. </n-button>
  65. </n-form-item>
  66. </n-form>
  67. </div>
  68. </div>
  69. </div>
  70. </div>
  71. </template>
  72. <script lang="ts" setup>
  73. import { reactive, ref } from 'vue'
  74. import { useRoute, useRouter } from 'vue-router'
  75. import { useMessage } from 'naive-ui'
  76. import { PersonOutline, LockClosedOutline } from '@vicons/ionicons5'
  77. interface FormState {
  78. username: string
  79. password: string
  80. }
  81. const formRef = ref()
  82. const message = useMessage()
  83. const loading = ref(false)
  84. const autoLogin = ref(true)
  85. const formInline = reactive({
  86. username: 'admin',
  87. password: '123456'
  88. })
  89. const rules = {
  90. username: { required: true, message: '请输入用户名', trigger: 'blur' },
  91. password: { required: true, message: '请输入密码', trigger: 'blur' }
  92. }
  93. const router = useRouter()
  94. const route = useRoute()
  95. const handleSubmit = (e: Event) => {
  96. e.preventDefault()
  97. formRef.value.validate(async (errors: any) => {
  98. if (!errors) {
  99. const { username, password } = formInline
  100. loading.value = true
  101. message.success('登录成功!')
  102. router.replace('/')
  103. } else {
  104. message.error('请填写完整信息,并且进行验证码校验')
  105. }
  106. })
  107. }
  108. </script>
  109. <style lang="scss" scoped>
  110. @include go(login) {
  111. .login-account {
  112. display: flex;
  113. flex-direction: column;
  114. height: 100vh;
  115. overflow: auto;
  116. background-image: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%);
  117. &-container {
  118. flex: 1;
  119. padding: 32px 0;
  120. width: 384px;
  121. margin: 0 auto;
  122. margin-top: 100px;
  123. }
  124. &-top {
  125. padding: 32px 0;
  126. text-align: center;
  127. &-desc {
  128. font-size: 14px;
  129. color: #808695;
  130. }
  131. }
  132. &-other {
  133. width: 100%;
  134. }
  135. .default-color {
  136. color: #515a6e;
  137. .ant-checkbox-wrapper {
  138. color: #515a6e;
  139. }
  140. }
  141. }
  142. }
  143. @media (min-width: 768px) {
  144. .login-account {
  145. background-repeat: no-repeat;
  146. background-position: 50%;
  147. background-size: 100%;
  148. }
  149. .page-account-container {
  150. padding: 32px 0 24px 0;
  151. }
  152. }
  153. </style>