user.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. /**
  2. * 用户管理工具
  3. * 处理用户信息、权限、状态等相关功能
  4. * 适配mobile2工程
  5. */
  6. import { userStorage } from '@/common/storage';
  7. /**
  8. * 用户信息管理
  9. */
  10. export const userManager = {
  11. /**
  12. * 获取当前用户信息
  13. */
  14. getCurrentUser() {
  15. const userInfo = userStorage.getUserInfo();
  16. if (!userInfo || !userInfo.user) {
  17. return null;
  18. }
  19. const user = userInfo.user;
  20. const permissions = userInfo.permissions || [];
  21. const roles = userInfo.roles || [];
  22. return {
  23. // 基本信息
  24. userId: user.userId,
  25. userName: user.userName,
  26. nickName: user.nickName || user.userName,
  27. email: user.email,
  28. phoneNumber: user.phoneNumber,
  29. sex: user.sex,
  30. avatar: user.avatar,
  31. // 部门信息
  32. deptId: user.deptId,
  33. deptName: user?.deptName || '',
  34. // 状态信息
  35. status: user.status,
  36. createTime: user.createTime,
  37. loginDate: user.loginDate,
  38. // 权限信息
  39. permissions,
  40. roles,
  41. // 扩展信息
  42. remark: user.remark,
  43. };
  44. },
  45. /**
  46. * 检查用户是否拥有指定权限
  47. * @param {string} permission 权限标识
  48. */
  49. hasPermission(permission) {
  50. if (!permission) return true;
  51. const userInfo = this.getCurrentUser();
  52. if (!userInfo || !userInfo.permissions) {
  53. return false;
  54. }
  55. return userInfo.permissions.includes(permission);
  56. },
  57. /**
  58. * 检查用户是否拥有指定角色
  59. * @param {string} role 角色标识
  60. */
  61. hasRole(role) {
  62. if (!role) return true;
  63. const userInfo = this.getCurrentUser();
  64. if (!userInfo || !userInfo.roles) {
  65. return false;
  66. }
  67. return userInfo.roles.some((r) => r.roleKey === role);
  68. },
  69. /**
  70. * 检查用户是否为管理员
  71. */
  72. isAdmin() {
  73. return this.hasRole('admin') || this.hasRole('super_admin');
  74. },
  75. /**
  76. * 获取用户显示名称
  77. */
  78. getDisplayName() {
  79. const user = this.getCurrentUser();
  80. if (!user) return '未登录';
  81. return user.nickName || user.userName || '用户';
  82. },
  83. /**
  84. * 格式化用户信息用于显示
  85. */
  86. formatUserForDisplay() {
  87. const user = this.getCurrentUser();
  88. if (!user) return null;
  89. return {
  90. name: this.getDisplayName(),
  91. avatar: user.avatar || '/static/logo.png',
  92. deptName: user.deptName || '未设置部门',
  93. status: user.status,
  94. loginDate: user.loginDate,
  95. };
  96. },
  97. /**
  98. * 检查用户状态是否正常
  99. */
  100. isUserStatusNormal() {
  101. const user = this.getCurrentUser();
  102. if (!user) return false;
  103. // 0 = 正常,1 = 停用
  104. return user.status === '0' || user.status === 0;
  105. },
  106. /**
  107. * 获取用户完整信息字符串
  108. */
  109. getUserInfoString() {
  110. const user = this.getCurrentUser();
  111. if (!user) return '未登录用户';
  112. const info = [
  113. `用户名: ${user.userName || '未知'}`,
  114. `昵称: ${user.nickName || '未设置'}`,
  115. `部门: ${user.deptName || '未分配'}`,
  116. `邮箱: ${user.email || '未设置'}`,
  117. `手机: ${user.phoneNumber || '未设置'}`,
  118. ];
  119. if (user.loginDate) {
  120. info.push(`登录时间: ${new Date(user.loginDate).toLocaleString()}`);
  121. }
  122. return info.join('\n');
  123. },
  124. /**
  125. * 更新用户信息(仅更新本地缓存)
  126. * @param {Object} updatedInfo 更新的信息
  127. */
  128. updateUserInfo(updatedInfo) {
  129. const currentInfo = userStorage.getUserInfo();
  130. if (!currentInfo) return false;
  131. try {
  132. const newInfo = {
  133. ...currentInfo,
  134. user: {
  135. ...currentInfo.user,
  136. ...updatedInfo,
  137. },
  138. };
  139. uni.setStorageSync('userInfo', JSON.stringify(newInfo));
  140. console.log('用户信息已更新', updatedInfo);
  141. return true;
  142. } catch (error) {
  143. console.error('更新用户信息失败:', error);
  144. return false;
  145. }
  146. },
  147. };
  148. /**
  149. * 用户状态管理
  150. */
  151. export const userState = {
  152. /**
  153. * 检查并处理登录状态
  154. */
  155. autoLoginCheck() {
  156. if (!userStorage.isLoggedIn()) {
  157. console.log('用户未登录,跳转到登录页');
  158. uni.reLaunch({
  159. url: '/pages/login/index',
  160. });
  161. return false;
  162. }
  163. return true;
  164. },
  165. /**
  166. * 处理登录成功
  167. * @param {Object} loginResult 登录结果
  168. * @param {Object} userInfo 用户信息
  169. */
  170. handleLoginSuccess(loginResult, userInfo) {
  171. try {
  172. // 保存登录信息
  173. userStorage.saveLoginInfo(loginResult, userInfo);
  174. // 可以在这里添加其他登录成功后的处理
  175. console.log('登录成功处理完成', {
  176. user: userInfo?.user?.userName,
  177. hasToken: !!loginResult?.access_token,
  178. });
  179. return true;
  180. } catch (error) {
  181. console.error('登录成功处理失败:', error);
  182. return false;
  183. }
  184. },
  185. /**
  186. * 处理登录失败
  187. * @param {Error} error 错误信息
  188. */
  189. handleLoginError(error) {
  190. console.error('登录失败:', error);
  191. // 清除可能残留的登录信息
  192. userStorage.clearAll();
  193. // 显示错误提示
  194. uni.showToast({
  195. title: '登录失败',
  196. icon: 'error',
  197. duration: 2000,
  198. });
  199. },
  200. /**
  201. * 处理退出登录
  202. */
  203. async handleLogout() {
  204. try {
  205. // 清除本地数据
  206. userStorage.clearAll();
  207. // 跳转到登录页
  208. uni.reLaunch({
  209. url: '/pages/login/index',
  210. });
  211. console.log('退出登录处理完成');
  212. return true;
  213. } catch (error) {
  214. console.error('退出登录处理失败:', error);
  215. return false;
  216. }
  217. },
  218. };
  219. /**
  220. * 默认导出用户管理器
  221. */
  222. export default userManager;