user.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. import {
  2. setToken,
  3. setRefreshToken,
  4. removeToken,
  5. removeRefreshToken
  6. } from '@/util/auth'
  7. import {
  8. Message
  9. } from 'element-ui'
  10. import {
  11. setStore,
  12. getStore
  13. } from '@/util/store'
  14. import {
  15. isURL,
  16. validatenull
  17. } from '@/util/validate'
  18. import {
  19. deepClone
  20. } from '@/util/util'
  21. import website from '@/config/website'
  22. import {
  23. loginByUsername,
  24. loginBySocial,
  25. getUserInfo,
  26. logout,
  27. refreshToken,
  28. getButtons
  29. } from '@/api/user'
  30. import {
  31. getTopMenu,
  32. getRoutes
  33. } from '@/api/system/menu'
  34. import md5 from 'js-md5'
  35. function addPath(ele, first) {
  36. const menu = website.menu;
  37. const propsConfig = menu.props;
  38. const propsDefault = {
  39. label: propsConfig.label || 'name',
  40. path: propsConfig.path || 'path',
  41. icon: propsConfig.icon || 'icon',
  42. children: propsConfig.children || 'children'
  43. }
  44. const icon = ele[propsDefault.icon];
  45. ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon;
  46. const isChild = ele[propsDefault.children] && ele[propsDefault.children].length !== 0;
  47. if (!isChild) ele[propsDefault.children] = [];
  48. if (!isChild && first && !isURL(ele[propsDefault.path])) {
  49. ele[propsDefault.path] = ele[propsDefault.path] + '/index'
  50. } else {
  51. ele[propsDefault.children].forEach(child => {
  52. addPath(child);
  53. })
  54. }
  55. }
  56. const user = {
  57. state: {
  58. tenantId: getStore({
  59. name: 'tenantId'
  60. }) || '',
  61. userInfo: getStore({
  62. name: 'userInfo'
  63. }) || [],
  64. permission: getStore({
  65. name: 'permission'
  66. }) || {},
  67. roles: [],
  68. menuId: {},
  69. menu: getStore({
  70. name: 'menu'
  71. }) || [],
  72. menuAll: getStore({
  73. name: 'menuAll'
  74. }) || [],
  75. token: getStore({
  76. name: 'token'
  77. }) || '',
  78. refreshToken: getStore({
  79. name: 'refreshToken'
  80. }) || '',
  81. },
  82. actions: {
  83. //根据用户名登录
  84. LoginByUsername({
  85. commit
  86. }, userInfo) {
  87. return new Promise((resolve, reject) => {
  88. loginByUsername(userInfo.tenantId, userInfo.deptId, userInfo.roleId, userInfo.username, md5(userInfo.password), userInfo.type, userInfo.key, userInfo.code).then(res => {
  89. const data = res.data;
  90. localStorage.setItem('roleName', data.role_name);
  91. if (data.error_description) {
  92. Message({
  93. message: data.error_description,
  94. type: 'error'
  95. })
  96. } else {
  97. commit('SET_TOKEN', data.access_token);
  98. commit('SET_REFRESH_TOKEN', data.refresh_token);
  99. commit('SET_TENANT_ID', data.tenant_id);
  100. commit('SET_USER_INFO', data);
  101. commit('DEL_ALL_TAG');
  102. commit('CLEAR_LOCK');
  103. }
  104. resolve();
  105. }).catch(error => {
  106. reject(error);
  107. })
  108. })
  109. },
  110. //根据手机号登录
  111. LoginByPhone({
  112. commit
  113. }, userInfo) {
  114. return new Promise((resolve) => {
  115. loginByUsername(userInfo.phone, userInfo.code).then(res => {
  116. const data = res.data.data;
  117. commit('SET_TOKEN', data);
  118. commit('DEL_ALL_TAG');
  119. commit('CLEAR_LOCK');
  120. resolve();
  121. })
  122. })
  123. },
  124. //根据第三方信息登录
  125. LoginBySocial({
  126. commit
  127. }, userInfo) {
  128. return new Promise((resolve) => {
  129. loginBySocial(userInfo.tenantId, userInfo.source, userInfo.code, userInfo.state).then(res => {
  130. const data = res.data;
  131. if (data.error_description) {
  132. Message({
  133. message: data.error_description,
  134. type: 'error'
  135. })
  136. } else {
  137. commit('SET_TOKEN', data.access_token);
  138. commit('SET_REFRESH_TOKEN', data.refresh_token);
  139. commit('SET_USER_INFO', data);
  140. commit('DEL_ALL_TAG');
  141. commit('CLEAR_LOCK');
  142. }
  143. resolve();
  144. })
  145. })
  146. },
  147. //获取用户信息
  148. GetUserInfo({
  149. commit
  150. }) {
  151. return new Promise((resolve, reject) => {
  152. getUserInfo().then((res) => {
  153. const data = res.data.data;
  154. commit('SET_ROLES', data.roles);
  155. resolve(data);
  156. }).catch(err => {
  157. reject(err);
  158. })
  159. })
  160. },
  161. //刷新token
  162. refreshToken({
  163. state,
  164. commit
  165. }) {
  166. window.console.log('handle refresh token')
  167. return new Promise((resolve, reject) => {
  168. refreshToken(state.refreshToken, state.tenantId).then(res => {
  169. const data = res.data;
  170. commit('SET_TOKEN', data.access_token);
  171. commit('SET_REFRESH_TOKEN', data.refresh_token);
  172. resolve();
  173. }).catch(error => {
  174. reject(error)
  175. })
  176. })
  177. },
  178. // 登出
  179. LogOut({
  180. commit
  181. }) {
  182. return new Promise((resolve, reject) => {
  183. logout().then(() => {
  184. commit('SET_TOKEN', '');
  185. commit('SET_MENU', []);
  186. commit('SET_MENU_ALL_NULL', []);
  187. commit('SET_ROLES', []);
  188. commit('SET_TAG_LIST', []);
  189. commit('DEL_ALL_TAG');
  190. commit('CLEAR_LOCK');
  191. removeToken();
  192. removeRefreshToken();
  193. resolve();
  194. }).catch(error => {
  195. reject(error)
  196. })
  197. })
  198. },
  199. //注销session
  200. FedLogOut({
  201. commit
  202. }) {
  203. return new Promise(resolve => {
  204. commit('SET_TOKEN', '');
  205. commit('SET_MENU_ALL_NULL', []);
  206. commit('SET_MENU', []);
  207. commit('SET_ROLES', []);
  208. commit('SET_TAG_LIST', []);
  209. commit('DEL_ALL_TAG');
  210. commit('CLEAR_LOCK');
  211. removeToken();
  212. removeRefreshToken();
  213. resolve();
  214. })
  215. },
  216. //获取顶部菜单
  217. GetTopMenu() {
  218. return new Promise(resolve => {
  219. getTopMenu().then((res) => {
  220. const data = res.data.data || [];
  221. resolve(data)
  222. })
  223. })
  224. },
  225. //获取系统菜单
  226. GetMenu({
  227. commit,
  228. dispatch
  229. }, topMenuId) {
  230. return new Promise(resolve => {
  231. const obj = {
  232. topMenuId: topMenuId,
  233. type: getStore({ name: 'language' })
  234. }
  235. getRoutes(obj).then((res) => {
  236. const data = res.data.data
  237. let menu = deepClone(data);
  238. menu.forEach(ele => {
  239. addPath(ele, true);
  240. });
  241. commit('SET_MENU_ALL', menu)
  242. commit('SET_MENU', menu)
  243. dispatch('GetButtons');
  244. resolve(menu)
  245. })
  246. })
  247. },
  248. //获取系统按钮
  249. GetButtons({
  250. commit
  251. }) {
  252. return new Promise((resolve) => {
  253. getButtons().then(res => {
  254. const data = res.data.data;
  255. commit('SET_PERMISSION', data);
  256. resolve();
  257. })
  258. })
  259. },
  260. },
  261. mutations: {
  262. SET_TOKEN: (state, token) => {
  263. setToken(token);
  264. state.token = token;
  265. setStore({
  266. name: 'token',
  267. content: state.token
  268. })
  269. },
  270. SET_MENU_ID(state, menuId) {
  271. state.menuId = menuId;
  272. },
  273. SET_MENU_ALL: (state, menuAll) => {
  274. let menu = state.menuAll;
  275. menuAll.forEach(ele => {
  276. ele.children.forEach(i => {
  277. delete i.source
  278. })
  279. if (!menu.find(item => item.label === ele.label && item.path === ele.path)) {
  280. menu.push(ele);
  281. }
  282. })
  283. state.menuAll = menu
  284. setStore({
  285. name: 'menuAll',
  286. content: state.menuAll
  287. })
  288. },
  289. SET_MENU_ALL_NULL: (state) => {
  290. state.menuAll = []
  291. setStore({
  292. name: 'menuAll',
  293. content: state.menuAll
  294. })
  295. },
  296. SET_MENU: (state, menu) => {
  297. // menu.forEach(ele => {
  298. // ele.chiildren.forEach(i=>{
  299. // delete i.source
  300. // })
  301. // })
  302. state.menu = menu
  303. setStore({
  304. name: 'menu',
  305. content: state.menu
  306. })
  307. },
  308. SET_REFRESH_TOKEN: (state, refreshToken) => {
  309. setRefreshToken(refreshToken)
  310. state.refreshToken = refreshToken;
  311. setStore({
  312. name: 'refreshToken',
  313. content: state.refreshToken
  314. })
  315. },
  316. SET_TENANT_ID: (state, tenantId) => {
  317. state.tenantId = tenantId;
  318. setStore({
  319. name: 'tenantId',
  320. content: state.tenantId
  321. })
  322. },
  323. SET_USER_INFO: (state, userInfo) => {
  324. if (validatenull(userInfo.avatar)) {
  325. userInfo.avatar = "/img/bg/img-logo.png";
  326. }
  327. state.userInfo = userInfo;
  328. setStore({
  329. name: 'userInfo',
  330. content: state.userInfo
  331. })
  332. },
  333. SET_ROLES: (state, roles) => {
  334. state.roles = roles;
  335. },
  336. SET_PERMISSION: (state, permission) => {
  337. let result = [];
  338. function getCode(list) {
  339. list.forEach(ele => {
  340. if (typeof (ele) === 'object') {
  341. const chiildren = ele.children;
  342. const code = ele.code;
  343. if (chiildren) {
  344. getCode(chiildren)
  345. } else {
  346. result.push(code);
  347. }
  348. }
  349. })
  350. }
  351. getCode(permission);
  352. state.permission = {};
  353. result.forEach(ele => {
  354. state.permission[ele] = true;
  355. });
  356. setStore({
  357. name: 'permission',
  358. content: state.permission
  359. })
  360. }
  361. }
  362. }
  363. export default user