index.js 4.26 KB
import Vue from "vue";
import Vuex from "vuex";
import Cookies from "js-cookie";
import layoutStore from "./modules/layout/index";
import { defaultRouter } from "@/router/index";
import { encryptLoginPassword } from "@/utils";

import request from "@/api/index";
import router from "@/router/index";
import { addrouters } from "@/router/index";
Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    token: "",
    csCode: localStorage.getItem("csCode") || "",
    info: sessionStorage.getItem("info")
      ? JSON.parse(sessionStorage.getItem("info"))
      : "", // 每次刷新都要通过token请求个人信息来筛选动态路由
    routers: [], //左侧菜单
    addRouters:
      sessionStorage.getItem("addRouters") &&
      sessionStorage.getItem("addRouters") != "undefined"
        ? JSON.parse(sessionStorage.getItem("addRouters"))
        : [], //动态路由
    tokenSources: new Map(), //正在请求接口(切换取消请求)
  },
  mutations: {
    setToken(state, token) {
      state.token = token;
    },
    setCode(state, code) {
      state.csCode = code;
      localStorage.setItem("csCode", code);
    },
    setInfo(state, data) {
      state.info = { ...data };
      sessionStorage.setItem("info", JSON.stringify(state.info));
    },
    setRouters: (state, routers) => {
      let aRouters = addrouters.filter((item) => {
        let path = item.children[0]?.path.replace("/", "");
        return routers?.includes(path);
      });

      state.addRouters = aRouters; // 保存动态路由用来addRouter
      state.routers = defaultRouter.concat(aRouters); // 所有有权限的路由表,用来生成菜单列表
      sessionStorage.setItem("addRouters", JSON.stringify(routers));
    },
    setTokenSources(state, data) {
      if (data instanceof Array) {
        state.tokenSources.set(data[0], data[1]);
      } else {
        state.tokenSources = new Map();
      }
    },
    delTokenSources(state, data) {
      state.tokenSources.delete(data);
    },
  },
  actions: {
    Login({ state, commit }, params) {
      let loginForm = {};
      loginForm.username = params.username;
      loginForm.password = encryptLoginPassword(params.password);
      request
        .login({ ...loginForm })
        .then((res) => {
          let response = res;
          if (response.status == 0) {
            const userInfo = { ...response.data };
            userInfo.showRoleName = response.data.permissions[0]?.roleName;
            commit("setToken", "isLogin");
            commit("setInfo", { ...userInfo });
            commit("setRouters", [...userInfo.permissions[0]?.authorityRouter]);
            state.addRouters.forEach((res) => {
              router.addRoute(res);
            });
            router.addRoute({
              path: "*",
              redirect: "/404",
              hidden: true,
              children: [],
            });
            console.log(Cookies.get("ZT_YIJIAO_TOKEN"));
            if (params.url) {
              window.location.href = params.url;
            } else {
              router.push({ path: "/" });
            }
          }
        })
        .catch(() => {});
    },
    permissions({ state, commit }, role) {
      commit("setToken", "isLogin");
      let userInfo = state.info;
      let authorityRouterObj = userInfo.permissions.filter((item) => {
        return item.role == role;
      });
      userInfo.showRoleName = authorityRouterObj[0]?.roleName
      commit("setInfo", userInfo);
      commit("setRouters", [...authorityRouterObj[0]?.authorityRouter]);
      state.addRouters.forEach((res) => {
        router.addRoute(res);
      });
      router.addRoute({
        path: "*",
        redirect: "/404",
        hidden: true,
        children: [],
      });
      router.push({ path: "/" });
    },
  },
  getters: {
    addRouters: (state) => state.addRouters,
    token: (state) => state.token,
    code: (state) => state.csCode,
    info: (state) => state.info,
    routers: (state) => state.routers,
    logoShow: (state) => state.layoutStore.logoShow,
    isCollapse: (state) => state.layoutStore.isCollapse,
    uniquerouter: (state) => state.layoutStore.uniquerouter,
    tabnavBox: (state) => state.layoutStore.tabnavBox,
    rightNav: (state) => state.layoutStore.rightNav,
  },
  modules: {
    layoutStore,
  },
});

export default store;