index.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <div class="login-wrap" @keydown.enter="login">
  3. <div class="login-con">
  4. <el-card class="box-card">
  5. <template #header>
  6. <span class="login--header">登录</span>
  7. </template>
  8. <el-form
  9. ref="loginForm"
  10. :model="form"
  11. :rules="rules"
  12. class="login-form"
  13. >
  14. <el-form-item prop="userName">
  15. <el-input
  16. v-model="form.userName"
  17. placeholder="请输入账号 admin or test"
  18. class="form--input"
  19. >
  20. <template #prefix>
  21. <span class="svg-container">
  22. <svg-icon icon-class="user" />
  23. </span>
  24. </template>
  25. </el-input>
  26. </el-form-item>
  27. <el-form-item prop="passWord">
  28. <el-input
  29. v-model="form.passWord"
  30. show-password
  31. :minlength="3"
  32. :maxlength="18"
  33. placeholder="请输入密码 admin or test"
  34. class="form--input"
  35. >
  36. <template #prefix>
  37. <span class="svg-container">
  38. <svg-icon icon-class="password" />
  39. </span>
  40. </template>
  41. </el-input>
  42. </el-form-item>
  43. <el-form-item>
  44. <el-button
  45. :loading="loading"
  46. type="primary"
  47. class="login--button"
  48. @click="login"
  49. >
  50. 登录
  51. </el-button>
  52. </el-form-item>
  53. </el-form>
  54. </el-card>
  55. </div>
  56. </div>
  57. </template>
  58. <script lang="ts">
  59. import { defineComponent, ref, unref, reactive, watch } from 'vue'
  60. import { useRouter } from 'vue-router'
  61. import type { RouteRecordRaw } from 'vue-router'
  62. import { permissionStore } from '_p/index/store/modules/permission'
  63. import { appStore } from '_p/index/store/modules/app'
  64. import wsCache from '@/cache'
  65. import { ElNotification } from 'element-plus'
  66. import { loginApi, getRoleDetApi } from './api'
  67. interface FormModule {
  68. userName: string,
  69. passWord: string
  70. }
  71. interface RulesModule {
  72. userName: any[],
  73. passWord: any[]
  74. }
  75. export default defineComponent({
  76. name: 'Login',
  77. setup() {
  78. const { push, addRoute, currentRoute } = useRouter()
  79. const loginForm = ref<HTMLElement | null>(null)
  80. const loading = ref<boolean>(false)
  81. const redirect = ref<string>('')
  82. watch(() => {
  83. return currentRoute.value
  84. }, (route) => {
  85. redirect.value = (route.query && route.query.redirect) as string
  86. }, {
  87. immediate: true
  88. })
  89. const form = reactive<FormModule>({
  90. userName: '',
  91. passWord: ''
  92. })
  93. const rules = reactive<RulesModule>({
  94. userName: [{ required: true, message: '请输入账号' }],
  95. passWord: [{ required: true, message: '请输入密码' }]
  96. })
  97. async function login(): Promise<void> {
  98. const formWrap = unref(loginForm) as any
  99. if (!formWrap) return
  100. loading.value = true
  101. try {
  102. formWrap.validate(async(valid: boolean) => {
  103. if (valid) {
  104. // 模拟登录接口之后返回角色信息
  105. const res = await loginApi({ data: form })
  106. if (res) {
  107. // 获取权限信息
  108. const role = await getRoleDetApi({
  109. params: {
  110. id: res.data.roleId
  111. }
  112. })
  113. if (role) {
  114. wsCache.set(appStore.userInfo, Object.assign(form, role.data))
  115. permissionStore.GenerateRoutes().then(() => {
  116. permissionStore.addRouters.forEach(async(route: RouteRecordRaw) => {
  117. await addRoute(route.name!, route) // 动态添加可访问路由表
  118. })
  119. permissionStore.SetIsAddRouters(true)
  120. push({ path: redirect.value || '/' })
  121. })
  122. }
  123. }
  124. } else {
  125. console.log('error submit!!')
  126. return false
  127. }
  128. })
  129. } catch (err) {
  130. console.log(err)
  131. } finally {
  132. loading.value = false
  133. }
  134. }
  135. ElNotification({
  136. title: '提示',
  137. message: '账号 admin 为 前端 控制路由权限,账号 test 为 后端 控制路由权限。密码与账号相同',
  138. duration: 60000
  139. })
  140. return {
  141. loginForm,
  142. loading, redirect, form, rules,
  143. login
  144. }
  145. }
  146. })
  147. </script>
  148. <style lang="less" scoped>
  149. .login-wrap {
  150. width: 100%;
  151. height: 100%;
  152. background-image: url('~@/assets/img/login-bg.jpg');
  153. background-size: cover;
  154. background-position: center;
  155. position: relative;
  156. .box-card {
  157. width: 400px;
  158. .login--header {
  159. font-size: 24px;
  160. font-weight: 600;
  161. }
  162. .svg-container {
  163. color: #889aa4;
  164. vertical-align: middle;
  165. width: 30px;
  166. display: inline-block;
  167. }
  168. .form--input {
  169. width: 100%;
  170. @{deep}(.el-input__inner) {
  171. padding-left: 40px;
  172. }
  173. }
  174. .login--button {
  175. width: 100%;
  176. }
  177. }
  178. .login-con {
  179. position: absolute;
  180. right: 160px;
  181. top: 50%;
  182. transform: translateY(-60%);
  183. }
  184. }
  185. </style>