useAutoLogin.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. // 本来应该是后端做,出于工期考虑转到前端
  2. import QueryString from 'qs';
  3. import { useUserStore } from '/@/store/modules/user';
  4. import { RouteLocationNormalized } from 'vue-router';
  5. import { useMessage } from '../web/useMessage';
  6. /** 自动登录功能的Hook,该Hook是为了部署在同一局域网内的多套系统之间能够无缝切换 */
  7. export function useAutoLogin() {
  8. /** 启用自动登录功能来跳转新的页面 */
  9. function open(url: string, redirect?: string, target?: string) {
  10. const userStore = useUserStore();
  11. const qs = QueryString.stringify({
  12. autoLogin: true,
  13. username: userStore.getUserInfo.username,
  14. workNo: userStore.getUserInfo.workNo,
  15. redirect,
  16. });
  17. window.open(`${url}?${qs}`, target);
  18. }
  19. /** 用在路由守卫里,执行自动登录的逻辑,如果存在符合自动登录标准的query则执行自动登录 */
  20. async function doAutoLogin(route: RouteLocationNormalized) {
  21. const userStore = useUserStore();
  22. if (!route.query) return;
  23. const { autoLogin, username, workNo } = route.query;
  24. if (!autoLogin || !username || !workNo) return;
  25. const params = {
  26. username: username as string,
  27. workNo: workNo as string,
  28. checkKey: new Date().getTime(),
  29. };
  30. try {
  31. await userStore.autoLogin(params);
  32. } catch (e: any) {
  33. const message = useMessage().createMessage;
  34. message.error(e.message);
  35. return;
  36. }
  37. }
  38. return {
  39. /** 启用单点登录功能来跳转新的页面,参数与window.open一致,但需要注意url需要指向登录页 */
  40. open,
  41. /** 用在跳转到的页面上,执行单点登录的逻辑 */
  42. doAutoLogin,
  43. };
  44. }