Login.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <template>
  2. <div class="login">
  3. <div class="login-mask" />
  4. <div class="login-form-wrap">
  5. <div class="login-form mx-6">
  6. <div class="login-form__content px-2 py-10">
  7. <header>
  8. <img :src="logo" class="mr-4" />
  9. <h1>{{ title }}</h1>
  10. </header>
  11. <a-form class="mx-auto mt-10" :model="formData" :rules="formRules" ref="formRef">
  12. <a-form-item name="account">
  13. <a-input size="large" v-model:value="formData.account" placeholder="Username: vben" />
  14. </a-form-item>
  15. <a-form-item name="password">
  16. <a-input-password
  17. size="large"
  18. visibilityToggle
  19. v-model:value="formData.password"
  20. placeholder="Password: 123456"
  21. />
  22. </a-form-item>
  23. <!-- <a-form-item name="verify" v-if="openLoginVerify">
  24. <BasicDragVerify v-model:value="formData.verify" ref="verifyRef" />
  25. </a-form-item> -->
  26. <a-row>
  27. <a-col :span="12">
  28. <a-form-item>
  29. <!-- 未做逻辑,需要自行处理 -->
  30. <a-checkbox v-model:checked="autoLogin" size="small">自动登录</a-checkbox>
  31. </a-form-item>
  32. </a-col>
  33. <a-col :span="12">
  34. <a-form-item :style="{ 'text-align': 'right' }">
  35. <!-- 未做逻辑,需要自行处理 -->
  36. <a-button type="link" size="small">忘记密码</a-button>
  37. </a-form-item>
  38. </a-col>
  39. </a-row>
  40. <a-form-item>
  41. <a-button
  42. type="primary"
  43. size="large"
  44. class="rounded-sm"
  45. :block="true"
  46. @click="login"
  47. :loading="formState.loading"
  48. >登录</a-button
  49. >
  50. </a-form-item>
  51. </a-form>
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. </template>
  57. <script lang="ts">
  58. import {
  59. defineComponent,
  60. reactive,
  61. ref,
  62. unref,
  63. toRaw,
  64. // computed
  65. } from 'vue';
  66. import { Checkbox } from 'ant-design-vue';
  67. import Button from '/@/components/Button/index.vue';
  68. // import { BasicDragVerify, DragVerifyActionType } from '/@/components/Verify/index';
  69. import { userStore } from '/@/store/modules/user';
  70. // import { appStore } from '/@/store/modules/app';
  71. import { useMessage } from '/@/hooks/web/useMessage';
  72. import { useSetting } from '/@/hooks/core/useSetting';
  73. import logo from '/@/assets/images/logo.png';
  74. export default defineComponent({
  75. components: {
  76. // BasicDragVerify,
  77. AButton: Button,
  78. ACheckbox: Checkbox,
  79. },
  80. setup() {
  81. const formRef = ref<any>(null);
  82. const autoLoginRef = ref(false);
  83. // const verifyRef = ref<RefInstanceType<DragVerifyActionType>>(null);
  84. const { globSetting } = useSetting();
  85. const { notification } = useMessage();
  86. // const openLoginVerifyRef = computed(() => appStore.getProjectConfig.openLoginVerify);
  87. const formData = reactive({
  88. account: 'vben',
  89. password: '123456',
  90. // verify: undefined,
  91. });
  92. const formState = reactive({
  93. loading: false,
  94. });
  95. const formRules = reactive({
  96. account: [{ required: true, message: '请输入账号', trigger: 'blur' }],
  97. password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
  98. // verify: unref(openLoginVerifyRef) ? [{ required: true, message: '请通过验证码校验' }] : [],
  99. });
  100. // function resetVerify() {
  101. // const verify = unref(verifyRef);
  102. // if (!verify) return;
  103. // formData.verify && verify.$.resume();
  104. // formData.verify = undefined;
  105. // }
  106. async function handleLogin() {
  107. const form = unref(formRef);
  108. if (!form) return;
  109. formState.loading = true;
  110. try {
  111. const data = await form.validate();
  112. const userInfo = await userStore.login(
  113. toRaw({
  114. password: data.password,
  115. username: data.account,
  116. })
  117. );
  118. if (userInfo) {
  119. notification.success({
  120. message: '登录成功',
  121. description: `欢迎回来: ${userInfo.realName}`,
  122. duration: 3,
  123. });
  124. }
  125. } catch (error) {
  126. } finally {
  127. // resetVerify();
  128. formState.loading = false;
  129. }
  130. }
  131. return {
  132. formRef,
  133. // verifyRef,
  134. formData,
  135. formState,
  136. formRules,
  137. login: handleLogin,
  138. autoLogin: autoLoginRef,
  139. // openLoginVerify: openLoginVerifyRef,
  140. title: globSetting && globSetting.title,
  141. logo,
  142. };
  143. },
  144. });
  145. </script>
  146. <style lang="less" scoped>
  147. @import (reference) '../../../design/index.less';
  148. .login {
  149. position: relative;
  150. height: 100vh;
  151. background: url(../../../assets/images/login/login-bg.png) no-repeat;
  152. background-size: 100% 100%;
  153. &-mask {
  154. display: none;
  155. height: 100%;
  156. background: url(../../../assets/images/login/login-in.png) no-repeat;
  157. background-position: 30% 30%;
  158. background-size: 80% 80%;
  159. .respond-to(xlarge, { display: block;});
  160. }
  161. &-form {
  162. width: 520px;
  163. background: @white;
  164. border: 10px solid rgba(255, 255, 255, 0.5);
  165. border-width: 8px;
  166. border-radius: 4px;
  167. background-clip: padding-box;
  168. .respond-to(xlarge, { margin: 0 120px 0 50px});
  169. &-wrap {
  170. position: absolute;
  171. top: 0;
  172. right: 0;
  173. display: flex;
  174. width: 100%;
  175. height: 90%;
  176. justify-content: center;
  177. align-items: center;
  178. .respond-to(large, {
  179. width: 600px;
  180. right: calc(50% - 270px);
  181. });
  182. .respond-to(xlarge, { width: 540px; right:0});
  183. }
  184. &__content {
  185. width: 100%;
  186. height: 100%;
  187. border: 1px solid #999;
  188. border-radius: 2px;
  189. header {
  190. display: flex;
  191. justify-content: center;
  192. align-items: center;
  193. img {
  194. display: inline-block;
  195. width: 48px;
  196. }
  197. h1 {
  198. margin-bottom: 0;
  199. font-size: 24px;
  200. // color: @primary-color;
  201. text-align: center;
  202. }
  203. }
  204. form {
  205. width: 80%;
  206. }
  207. }
  208. }
  209. }
  210. </style>