user.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. import {
  2. login,
  3. logout,
  4. menuList,
  5. dingdingdetail,
  6. usergetinfo,
  7. roleProcessInfo,
  8. requsetSupertubeCompany,
  9. requsetUserBindingCompany,
  10. reuqsetRoleInfo
  11. } from "@/apis/user";
  12. import router from "@/router";
  13. import {
  14. getToken,
  15. setToken,
  16. removeToken,
  17. getMenu,
  18. setMenu,
  19. removeMenu,
  20. getBtn,
  21. setBtn,
  22. removeBtn,
  23. get_business_company,
  24. set_business_company,
  25. remove_business_company,
  26. get_business_companyNo,
  27. set_business_companyNo,
  28. remove_business_companyNo,
  29. get_private_field,
  30. set_private_field,
  31. remove_private_field,
  32. get_action_data,
  33. set_action_data,
  34. remove_action_data,
  35. get_role_level,
  36. set_role_level,
  37. remove_role_level,
  38. getUserCompany,
  39. setUserCompany,
  40. removeUserCompany,
  41. setUserInfo as _setUserInfo,
  42. getUserInfo as _getUserInfo,
  43. removeUserInfo as _removeUserInfo,
  44. getCompanyType as _getCompanyType,
  45. setCompanyType as _setCompanyType,
  46. removeCompanyType as _removeCompanyType
  47. } from '@/utils/auth'
  48. import supplierRouteRecord from "@/router/data"
  49. import { MessageBox } from "element-ui";
  50. import { convertCompanylist } from "@/utils";
  51. import store from "..";
  52. export const userStoreActions = {
  53. reloadMenu: 'user/reloadMenulist',
  54. loginByToken: 'user/loginByToken',
  55. setCompanyList: 'user/setCompanylist',
  56. setCurrentLevel: 'user/setCurrentLevel',
  57. setCurrentCompany: 'user/setCurrentCompany'
  58. }
  59. const state = {
  60. token: getToken(),
  61. name: "",
  62. avatar: require("@/assets/img/avatar.gif"),
  63. introduction: "",
  64. roles: ["admin"],
  65. btnList: getBtn(),
  66. navList: getMenu(),
  67. role_level:get_role_level() || "1",
  68. business_company: get_business_company() || "",
  69. business_companyNo: get_business_companyNo() || "",
  70. private_field: get_private_field() || [],
  71. roleProcess: get_action_data() || [],
  72. currentCompany: getUserCompany() ? getUserCompany().code : '',
  73. userInfo: _getUserInfo(),
  74. isSupertube: false,
  75. companylist:[],
  76. sourceLevel: "0",
  77. currentLevel: "0"
  78. };
  79. const companyTypes = {
  80. 'business': 'business',
  81. 'supplier': 'supplier'
  82. }
  83. const mutations = {
  84. SET_TOKEN: (state, token) => {
  85. state.token = token;
  86. },
  87. SET_MENU: (state, menu) => {
  88. state.menu = menu;
  89. },
  90. SET_HAS: (state, has) => {
  91. state.has = has;
  92. },
  93. SET_INTRODUCTION: (state, introduction) => {
  94. state.introduction = introduction;
  95. },
  96. SET_NAME: (state, name) => {
  97. state.name = name;
  98. },
  99. SET_AVATAR: (state, avatar) => {
  100. state.avatar = avatar;
  101. },
  102. SET_ROLES: (state, roles) => {
  103. state.roles = roles;
  104. },
  105. navListFn(state, val) {
  106. if (!val) {
  107. val = [];
  108. }
  109. state.navList = val;
  110. setMenu(val);
  111. },
  112. btnListFn(state, val) {
  113. if (!val) {
  114. val = [];
  115. }
  116. state.btnList = val;
  117. setBtn(val);
  118. },
  119. setSupplier(state,val){
  120. state.isSupplier = val
  121. },
  122. business_company(state, val) {
  123. state.business_company = val;
  124. set_business_company(val);
  125. },
  126. business_companyNo(state, val) {
  127. state.business_companyNo = val;
  128. set_business_companyNo(val);
  129. },
  130. roleProcess(state, val) {
  131. state.roleProcess = val;
  132. set_action_data(val);
  133. },
  134. private_field(state, val) {
  135. state.private_field = val;
  136. set_private_field(val);
  137. },
  138. setCurrentLevel(state, val){
  139. state.currentLevel = val
  140. },
  141. setOriginLevel(state, val){
  142. state.originLevel = val
  143. },
  144. setUserInfo(state, info){
  145. state.userInfo = info
  146. _setUserInfo(info)
  147. },
  148. setCurrentCompany(state, code){
  149. //获取当前公司详细信息
  150. const company = state.companylist.find(({code: _code}) => _code === code)
  151. setUserCompany(company)
  152. state.currentCompany = code;
  153. },
  154. setCompanyType(state, code){
  155. const isBusiness = code.indexOf('GS') >= 0
  156. state.companyType = isBusiness ? companyTypes.business : companyTypes.supplier
  157. },
  158. setCompanylist(state,val){
  159. state.companylist = val
  160. },
  161. setSupertube(state, val) {
  162. state.isSupertube = val;
  163. }
  164. }
  165. const actions = {
  166. // user login
  167. login({ commit }, userInfo) {
  168. const { username, password } = userInfo;
  169. return new Promise((resolve, reject) => {
  170. login({ username: username.trim(), password: password })
  171. .then((response) => {
  172. const {code, data } = response;
  173. if (code === 0) {
  174. const {token,nickname}=data
  175. commit("SET_TOKEN", token);
  176. commit("SET_NAME", nickname);
  177. setToken(token);
  178. }
  179. resolve(response);
  180. })
  181. .catch((error) => {
  182. reject(error);
  183. });
  184. });
  185. },
  186. //公司角色异常
  187. disabledCompany({commit, that}){
  188. commit("navListFn", []);
  189. commit("btnListFn", []);
  190. initRouter([], that);
  191. const company = getUserCompany()
  192. MessageBox
  193. .alert(`公司 ${company.name} 角色异常或该公司禁用,请检查账号或者角色设置`, '公司角色异常', {type: 'warning', confirmButtonText:'前往首页'})
  194. .then(() => {router.push("/reload?redirect=welcome/dashboard")})
  195. .catch(() => {router.push("/reload?redirect=welcome/dashboard")})
  196. },
  197. dingUserInfor({ commit }, code) {
  198. return new Promise(async (resolve, reject) => {
  199. dingdingdetail(code)
  200. .then((response) => {
  201. const { data } = response;
  202. if (response.code === 0) {
  203. commit("SET_TOKEN", data.token);
  204. setToken(data.token);
  205. resolve("success");
  206. } else {
  207. resolve("error");
  208. }
  209. })
  210. .catch((error) => {
  211. reject(error);
  212. });
  213. });
  214. },
  215. async loginByToken({commit, dispatch}, token) {
  216. setToken(token)
  217. await commit('SET_TOKEN')
  218. await dispatch('getMenuList')
  219. },
  220. // 切换公司后重新请求
  221. async reloadMenulist({commit, dispatch ,that, state}, level){
  222. return new Promise(async resolve => {
  223. const company = getUserCompany()
  224. dispatch('getRoleInfo', company)
  225. //获取菜单
  226. const { mcode, mdata, message: mmsg } = await getRoleMenuList(level);
  227. //账号禁用
  228. if(mcode === 10001){
  229. commit("navListFn", []);
  230. commit("btnListFn", []);
  231. initRouter([], that);
  232. resolve('disabled')
  233. return
  234. }
  235. if (mcode >= 100 && mcode <= 104) {
  236. resolve("noToken");
  237. } else if (mcode !== 0) {
  238. resolve({ code: mcode, data: {}, massage: mmsg });
  239. } else {
  240. const { arrag, isok, btnList } = mdata;
  241. // 生成页面权限
  242. commit("navListFn", arrag);
  243. // 生成按钮权限
  244. commit("btnListFn", btnList);
  245. // 生成路由
  246. initRouter(arrag, that);
  247. resolve(isok ? "success-dataV" : "success");
  248. }
  249. })
  250. },
  251. async getRoleInfo({commit, that, dispatch}, _current_company_){
  252. return new Promise(async resolve => {
  253. //查找默认的业务公司 设置到全局的currentCompany
  254. const { roleid } = _current_company_;
  255. //根据角色获取流程节点权限
  256. const { pcode, pdata, pmsg } = await getRoleProcess(roleid);
  257. if (pcode === 0) {
  258. commit("roleProcess", pdata ?? []);
  259. }
  260. if (pcode >= 100 && pcode <= 104) {
  261. resolve("noToken");
  262. return
  263. }
  264. //根据角色获取角色详情 获取关键字字段
  265. const {code: rcode, data: rdata, message: rmsg} = await reuqsetRoleInfo({ roleid: roleid })
  266. if(rcode === 0){
  267. commit("private_field", rdata.private_field ? rdata.private_field.split(',') : []);
  268. }
  269. if (rcode >= 100 && rcode <= 104) {
  270. resolve("noToken");
  271. return
  272. }
  273. })
  274. },
  275. async getMenuList({ commit, that, dispatch }) {
  276. return new Promise(async (resolve, reject) => {
  277. if (!getToken()) {
  278. resolve("noToken");
  279. } else {
  280. const { ucode, udata, umsg } = await getUserInfo();
  281. if (ucode >= 100 && ucode <= 104) {
  282. resolve("noToken");
  283. } else if (ucode !== 0) {
  284. resolve({ code: ucode, data: udata, massage: umsg })
  285. } else {
  286. const { level } = udata;
  287. //是否超管
  288. const isSupertube = level === '1'
  289. //是否供应商
  290. const isSupplier = level === '3'
  291. //保存用户信息
  292. commit('setUserInfo', udata)
  293. //保存是否超管
  294. commit('setSupplier', isSupplier)
  295. //保存是否超管用户
  296. commit("setSupertube", isSupertube);
  297. //设置原始level和当前level
  298. commit('setOriginLevel', level)
  299. commit('setCurrentLevel', level)
  300. //获取公司列表(区分超管和普通账户api)
  301. const api = isSupertube ? requsetSupertubeCompany : requsetUserBindingCompany
  302. //获取缓存里的业务公司 => 公司名称搜索 => 存在设置为默认公司
  303. const { data: companyData, code: companyCode } = await api({
  304. ...(!isSupertube ? ({size: 10000}) : {type: '1'}),
  305. ...({token: getToken()}),
  306. })
  307. //保存公司列表 普通用户和超管使用两个列表需要转换
  308. let _companylist = []
  309. if(companyCode === 0) {
  310. _companylist = isSupertube ? companyData.list : convertCompanylist(companyData.list);
  311. //超管 + 业务公司 需要将 relation_code 设置为 code
  312. // if(isSupertube) _companylist = _companylist.map(item => ({...item, code: item.relation_code}))
  313. commit('setCompanylist', _companylist)
  314. }
  315. if(companyCode >= 100 && companyCode <= 104){
  316. resolve("noToken")
  317. return
  318. }
  319. //非超管用户获取保存 流程权限 & 关键字字段 & 设置默认业务公司
  320. let defaultCompany = ''
  321. if(!isSupertube){
  322. //查找默认的业务公司 设置到全局的currentCompany
  323. defaultCompany = _companylist.find(({is_main}) => is_main === '1');
  324. const result = dispatch('getRoleInfo', defaultCompany)
  325. if(result === 'noToken') {
  326. resolve('noToken')
  327. return
  328. }
  329. }
  330. //保存默认公司
  331. commit('setCurrentCompany', defaultCompany ? defaultCompany.code : '')
  332. const { mcode, mdata, mmsg } = await getRoleMenuList();
  333. //拦截账号异常: 禁用
  334. if(mcode === 10001) {
  335. dispatch('disabledCompany');
  336. return
  337. }
  338. if (mcode >= 100 && mcode <= 104) {
  339. resolve("noToken");
  340. } else if (mcode !== 0) {
  341. resolve({ code: mcode, data: {}, massage: mmsg });
  342. } else {
  343. const { arrag, isok, btnList } = mdata;
  344. // 生成页面权限
  345. commit("navListFn", arrag);
  346. // 生成按钮权限
  347. commit("btnListFn", btnList);
  348. // 生成路由
  349. initRouter(arrag, that);
  350. resolve(isok ? "success-dataV" : "success");
  351. }
  352. }
  353. }
  354. });
  355. },
  356. // user logout
  357. logout({ commit, state, dispatch }) {
  358. return new Promise((resolve, reject) => {
  359. commit("SET_TOKEN", "");
  360. commit("SET_ROLES", []);
  361. commit("SET_MENU", "");
  362. commit("SET_HAS", "");
  363. _removeUserInfo()
  364. removeBtn();
  365. removeMenu();
  366. removeToken();
  367. remove_business_company();
  368. commit("business_company", "");
  369. commit("business_companyNo", "");
  370. remove_business_companyNo();
  371. remove_private_field();
  372. commit("private_field", []);
  373. remove_action_data();
  374. commit("action_data", []);
  375. removeUserCompany()
  376. commit("action_data", []);
  377. // removeMainList()
  378. // reset visited views and cached views
  379. // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
  380. dispatch("tagsView/delAllViews", null, { root: true });
  381. resolve();
  382. });
  383. },
  384. // remove token
  385. resetToken({ commit }) {
  386. return new Promise((resolve) => {
  387. commit("SET_TOKEN", "");
  388. commit("SET_ROLES", []);
  389. removeToken();
  390. resolve();
  391. });
  392. },
  393. };
  394. async function getUserInfo() {
  395. const { code, data, meaasge } = await usergetinfo({
  396. token:getToken()
  397. });
  398. return {
  399. ucode: code,
  400. udata: data,
  401. umsg: meaasge,
  402. };
  403. }
  404. async function getRoleProcess(roleid) {
  405. const { code, data, meaasge } = await roleProcessInfo({ roleid });
  406. let list = data;
  407. list.map((si) => {
  408. si.action = [];
  409. if (si.child && si.child.length > 0) {
  410. si.child.map((sii) => {
  411. si.action.push(sii.order_process + "");
  412. return sii;
  413. });
  414. }
  415. return si;
  416. });
  417. return {
  418. pcode: code,
  419. pdata: list,
  420. pmsg: meaasge,
  421. };
  422. }
  423. // function isHasRoute(routes){
  424. // let isHas = false
  425. // const chunks = location.hash.split('/')
  426. // const currentPath = chunks[chunks.length - 1]
  427. // const dfs = (routes) => {
  428. // routes.forEach(route => {
  429. // if(route.path === currentPath) isHas = true;
  430. // if(route.children && route.children.length > 0) dfs(route.children)
  431. // })
  432. // }
  433. // dfs([
  434. // {
  435. // path: "/person",
  436. // component: () => import("@/layout/index"),
  437. // redirect: "/person/my-message",
  438. // hidden: true,
  439. // alwaysShow: true,
  440. // meta: {
  441. // title: "个人中心",
  442. // icon: "user",
  443. // },
  444. // children: [
  445. // {
  446. // path: "my-message",
  447. // component: () => import("@/views/person-infor/my-message"),
  448. // name: "MyMessage",
  449. // alwaysShow: true,
  450. // meta: { title: "我的信息", noCache: true, breadcrumb: true },
  451. // },
  452. // {
  453. // path: "change-phone",
  454. // component: () => import("@/views/person-infor/change-phone"),
  455. // name: "ChangePhone",
  456. // alwaysShow: true,
  457. // meta: { title: "更换手机号", noCache: true, breadcrumb: true },
  458. // },
  459. // {
  460. // path: "change-password",
  461. // component: () => import("@/views/person-infor/change-password"),
  462. // name: "ChangePassword",
  463. // alwaysShow: true,
  464. // meta: { title: "修改密码", noCache: true, breadcrumb: true },
  465. // },
  466. // {
  467. // path:'/reload',
  468. // component:() => import('@/views/reload/index')
  469. // }
  470. // ],
  471. // },
  472. // //欢迎页
  473. // {
  474. // path: "/welcome",
  475. // component: () => import("@/layout/index"),
  476. // redirect: "/welcome/dashboard",
  477. // children: [
  478. // {
  479. // path: "dashboard",
  480. // component: () => import("@/views/dashboard/index"),
  481. // name: "Dashboard",
  482. // meta: { title: "首页", icon: "dashboard", affix: true },
  483. // },
  484. // ],
  485. // },...routes])
  486. // return isHas
  487. // }
  488. // 区分供应商和业务公司获取不同的菜单列表
  489. async function getRoleMenuList(level = "") {
  490. const { code, data, message } = await menuList({
  491. ...(level ? { level } : {})
  492. })
  493. //menu接受账户异常:禁用 并返回
  494. if(message === '账户已禁用' || message === '没有该公司的默认角色'){
  495. return {
  496. mdata: {},
  497. mmsg: '账号被禁用',
  498. mcode: 10001
  499. }
  500. }
  501. let arrag = [];
  502. let btnList = [];
  503. let list = [];
  504. let isok = false;
  505. if (code === 0) {
  506. list = data ?? [];
  507. list = list.filter((item) => item.child && item.child.length > 0);
  508. list.forEach((v1) => {
  509. const { menu_route, child } = v1;
  510. if (menu_route === "bigScreen" && child.length) {
  511. isok = true;
  512. }
  513. let pItem = {
  514. name: v1.menu_route,
  515. path: `/${v1.menu_route}`,
  516. meta: {
  517. title: v1.menu_name,
  518. icon: v1.menu_img,
  519. },
  520. children: [],
  521. };
  522. v1.child.forEach((v2) => {
  523. let item = {
  524. path: v2.menu_route,
  525. name: v2.menu_route,
  526. hidden: parseInt(v2.is_display + "") === 0,
  527. meta: {
  528. title: v2.menu_name,
  529. icon: v2.menu_img,
  530. },
  531. url: v2.menu_url,
  532. };
  533. let model = {
  534. menu_route: v2.menu_route,
  535. action: v2.action,
  536. };
  537. btnList.push(model);
  538. pItem.children.push(item);
  539. });
  540. arrag.push(pItem);
  541. });
  542. }
  543. // const isHas = isHasRoute(arrag)
  544. // if(!isHas) router.push('/welcome/dashboard')
  545. return {
  546. mcode: code,
  547. mdata: {
  548. isok,
  549. arrag,
  550. btnList,
  551. },
  552. mmsg: message,
  553. };
  554. }
  555. function initRouter(arr) {
  556. const IndexRoute = [
  557. // 个人信息
  558. {
  559. path: "/person",
  560. component: () => import("@/layout/index"),
  561. redirect: "/person/my-message",
  562. hidden: true,
  563. alwaysShow: true,
  564. meta: {
  565. title: "个人中心",
  566. icon: "user",
  567. },
  568. children: [
  569. {
  570. path: "my-message",
  571. component: () => import("@/views/person-infor/my-message"),
  572. name: "MyMessage",
  573. alwaysShow: true,
  574. meta: { title: "我的信息", noCache: true, breadcrumb: true },
  575. },
  576. {
  577. path: "change-phone",
  578. component: () => import("@/views/person-infor/change-phone"),
  579. name: "ChangePhone",
  580. alwaysShow: true,
  581. meta: { title: "更换手机号", noCache: true, breadcrumb: true },
  582. },
  583. {
  584. path: "change-password",
  585. component: () => import("@/views/person-infor/change-password"),
  586. name: "ChangePassword",
  587. alwaysShow: true,
  588. meta: { title: "修改密码", noCache: true, breadcrumb: true },
  589. },
  590. {
  591. path:'/reload',
  592. component:() => import('@/views/reload/index')
  593. }
  594. ],
  595. },
  596. //欢迎页
  597. {
  598. path: "/welcome",
  599. component: () => import("@/layout/index"),
  600. redirect: "/welcome/dashboard",
  601. children: [
  602. {
  603. path: "dashboard",
  604. component: () => import("@/views/dashboard/index"),
  605. name: "Dashboard",
  606. meta: { title: "首页", icon: "dashboard", affix: true },
  607. },
  608. ],
  609. },
  610. ];
  611. arr.map((v1) => {
  612. v1.component = (resolve) => require([`@/layout/index.vue`], resolve);
  613. if (v1.children && v1.children.length > 0) {
  614. v1.redirect = `/${v1.name}/${v1.children[0].name}`;
  615. v1.children.map((v2) => {
  616. v2.component = (resolve) => require([`@/views/${v2.url}.vue`], resolve);
  617. return v2;
  618. });
  619. }
  620. return v1;
  621. });
  622. IndexRoute.push(...arr);
  623. IndexRoute.push({
  624. path: "404",
  625. component: () => import("@/views/error-page/404"),
  626. hidden: false,
  627. noCache: true,
  628. });
  629. IndexRoute.push({
  630. path: "*",
  631. redirect: "/404",
  632. })
  633. window.vm.$router.addRoutes(IndexRoute);
  634. }
  635. export default {
  636. namespaced: true,
  637. state,
  638. mutations,
  639. actions,
  640. };