LoginForm.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <!--
  2. * @Author: 半生瓜 1515706227@qq.com
  3. * @Date: 2024-04-21 17:20:21
  4. * @LastEditors: 半生瓜 1515706227@qq.com
  5. * @LastEditTime: 2024-06-05 16:55:24
  6. * @FilePath: \vue-element-plus-admin-mini\src\views\Login\components\LoginForm.vue
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. -->
  9. <script setup lang="tsx">
  10. import { reactive, ref, watch, onMounted, unref } from 'vue'
  11. import { Form, FormSchema } from '@/components/Form'
  12. import { useI18n } from '@/hooks/web/useI18n'
  13. import { ElCheckbox, ElLink, ElMessage } from 'element-plus'
  14. import { useForm } from '@/hooks/web/useForm'
  15. import {
  16. loginApi,
  17. getRsaKey,
  18. getTestRoleApi,
  19. getAdminRoleApi,
  20. getRefreshToken,
  21. getuesrinfo
  22. } from '@/api/login'
  23. import { useAppStore } from '@/store/modules/app'
  24. import { usePermissionStore } from '@/store/modules/permission'
  25. import { useRouter } from 'vue-router'
  26. import type { RouteLocationNormalizedLoaded, RouteRecordRaw } from 'vue-router'
  27. import { UserType } from '@/api/login/types'
  28. import { useValidator } from '@/hooks/web/useValidator'
  29. import { useUserStore } from '@/store/modules/user'
  30. import { BaseButton } from '@/components/Button'
  31. import { Icon } from '@/components/Icon'
  32. import { cloneDeep } from 'lodash-es'
  33. import router from '@/router'
  34. import { getSystem, saveSystem } from '@/api/System'
  35. const { required } = useValidator()
  36. const appStore = useAppStore()
  37. const userStore = useUserStore()
  38. const permissionStore = usePermissionStore()
  39. const { currentRoute, addRoute, push } = useRouter()
  40. const { t } = useI18n()
  41. const rules = {
  42. username: [required()],
  43. password: [required()]
  44. // authCode: [required()]
  45. }
  46. const schema = reactive<FormSchema[]>([
  47. {
  48. field: 'title',
  49. colProps: {
  50. span: 24
  51. },
  52. formItemProps: {
  53. slots: {
  54. default: () => {
  55. return (
  56. <h2 style="color: #409FFF;" class="text-3xl font-bold text-center w-[100%]">
  57. {t('login.login')}
  58. </h2>
  59. )
  60. }
  61. }
  62. }
  63. },
  64. {
  65. field: 'username',
  66. // value: 'admin',
  67. component: 'Input',
  68. colProps: {
  69. span: 24
  70. },
  71. componentProps: {
  72. placeholder: '请输入用户名',
  73. prefixIcon: <Icon icon="mdi:account" />
  74. }
  75. },
  76. {
  77. field: 'password',
  78. // value: 'admin',
  79. component: 'InputPassword',
  80. colProps: {
  81. span: 24
  82. },
  83. componentProps: {
  84. style: {
  85. width: '100%'
  86. },
  87. placeholder: '请输入密码',
  88. prefixIcon: <Icon icon="mdi:password-outline" />
  89. }
  90. },
  91. // {
  92. // field: 'authCode',
  93. // // value: 'admin',
  94. // component: 'InputPassword',
  95. // colProps: {
  96. // span: 24
  97. // },
  98. // // componentProps: {
  99. // // style: {
  100. // // width: '100%'
  101. // // },
  102. // // placeholder: '请输入授权码',
  103. // // prefixIcon: <Icon icon="tdesign:secured" />
  104. // // }
  105. // },
  106. {
  107. field: 'login',
  108. colProps: {
  109. span: 24
  110. },
  111. formItemProps: {
  112. slots: {
  113. default: () => {
  114. return (
  115. <>
  116. <div style=" margin-top: 50px;" class="w-[100%]">
  117. <BaseButton
  118. style="font-size: 1.3rem; height: 2.5rem; "
  119. loading={loading.value}
  120. type="primary"
  121. class="w-[100%]"
  122. onClick={signIn}
  123. >
  124. {t('login.login')}
  125. </BaseButton>
  126. </div>
  127. </>
  128. )
  129. }
  130. }
  131. }
  132. }
  133. ])
  134. const remember = ref(userStore.getRememberMe)
  135. const initLoginInfo = () => {
  136. const loginInfo = userStore.getLoginInfo
  137. if (loginInfo) {
  138. const { username, password } = loginInfo
  139. setValues({ username, password })
  140. }
  141. }
  142. onMounted(() => {
  143. initLoginInfo()
  144. })
  145. const { formRegister, formMethods } = useForm()
  146. const { getFormData, getElFormExpose, setValues } = formMethods
  147. const loading = ref(false)
  148. const redirect = ref<string>('')
  149. watch(
  150. () => currentRoute.value,
  151. (route: RouteLocationNormalizedLoaded) => {
  152. redirect.value = route?.query?.redirect as string
  153. },
  154. {
  155. immediate: true
  156. }
  157. )
  158. // 加密
  159. const encryptedData = function (publicKey, data) {
  160. // 新建JSEncrypt对象
  161. let encryptor = new JSEncrypt()
  162. // 设置公钥
  163. encryptor.setPublicKey(publicKey)
  164. // 加密数据
  165. return encryptor.encrypt(data)
  166. }
  167. // 登录
  168. const signIn = async () => {
  169. const formRef = await getElFormExpose()
  170. await formRef?.validate(async (isValid) => {
  171. if (isValid) {
  172. loading.value = true
  173. const formData = await getFormData<UserType>()
  174. try {
  175. const res2 = await getRsaKey()
  176. let nweformData = cloneDeep(formData)
  177. nweformData.password = encryptedData(res2.data, formData.password)
  178. nweformData.username = encryptedData(res2.data, formData.username)
  179. // nweformData.authCode = encryptedData(res2.data, formData.authCode)
  180. const res = await loginApi(nweformData)
  181. if (res) {
  182. // // 是否记住我
  183. // if (unref(remember)) {
  184. // userStore.setLoginInfo({
  185. // username: formData.username,
  186. // password: formData.password
  187. // })
  188. // } else {
  189. // userStore.setLoginInfo(undefined)
  190. // }
  191. userStore.setRememberMe(unref(remember))
  192. userStore.setToken(res.data)
  193. userStore.setUserInfo(res.data)
  194. let a1 = {} as any
  195. let ressys = await getSystem()
  196. if (ressys) {
  197. ressys.data.map((item) => {
  198. if (item.configKey == 'jarVersion') {
  199. a1 = item
  200. a1.configValue = JSON.parse(a1.configValue)
  201. a1.configValue.manger = 'V1.0.0.20240606'
  202. a1.configValue = JSON.stringify(a1.configValue)
  203. saveSystem([a1]).then(() => {})
  204. }
  205. })
  206. }
  207. // 设置一个每2000毫秒执行一次的定时器
  208. let refreshtokentime = setInterval(function () {
  209. if (userStore.getToken) {
  210. getRefreshToken(userStore.getToken).then((res) => {
  211. userStore.setToken(res.data)
  212. })
  213. } else {
  214. clearInterval(refreshtokentime)
  215. }
  216. }, 480000)
  217. let res22 = await getuesrinfo()
  218. if (res22.code == 200) {
  219. localStorage.setItem('headimg', res22.data.headImg)
  220. localStorage.setItem('displayName', res22.data.displayName)
  221. }
  222. // 是否使用动态路由
  223. if (appStore.getDynamicRouter) {
  224. getRole()
  225. } else {
  226. await permissionStore.generateRoutes('static').catch(() => {})
  227. permissionStore.getAddRouters.forEach((route) => {
  228. addRoute(route as RouteRecordRaw) // 动态添加可访问路由表
  229. })
  230. permissionStore.setIsAddRouters(true)
  231. push({ path: redirect.value || permissionStore.addRouters[0].path })
  232. }
  233. }
  234. } finally {
  235. loading.value = false
  236. }
  237. }
  238. })
  239. }
  240. // 获取角色信息
  241. const getRole = async () => {
  242. const formData = await getFormData<UserType>()
  243. const params = {
  244. roleName: formData.username
  245. }
  246. const res =
  247. appStore.getDynamicRouter && appStore.getServerDynamicRouter
  248. ? await getAdminRoleApi()
  249. : await getTestRoleApi(params)
  250. if (res) {
  251. if (res.data.length > 0) {
  252. console.log('kankan....', res.data)
  253. const routers = res.data || []
  254. userStore.setRoleRouters(routers)
  255. appStore.getDynamicRouter && appStore.getServerDynamicRouter
  256. ? await permissionStore.generateRoutes('server', routers).catch(() => {})
  257. : await permissionStore.generateRoutes('frontEnd', routers).catch(() => {})
  258. permissionStore.getAddRouters.forEach((route) => {
  259. addRoute(route as RouteRecordRaw) // 动态添加可访问路由表
  260. })
  261. permissionStore.setIsAddRouters(true)
  262. push({ path: redirect.value || permissionStore.addRouters[0].path })
  263. } else {
  264. userStore.setToken('')
  265. userStore.setUserInfo(undefined)
  266. userStore.setRoleRouters([])
  267. formData.username = ''
  268. formData.password = ''
  269. // formData.authCode = ''
  270. ElMessage.error('暂无权限,请联系管理员')
  271. }
  272. }
  273. }
  274. </script>
  275. <template>
  276. <Form
  277. :schema="schema"
  278. :rules="rules"
  279. label-position="top"
  280. hide-required-asterisk
  281. size="large"
  282. class="dark:(border-1 border-[var(--el-border-color)] border-solid)"
  283. @register="formRegister"
  284. />
  285. </template>