user.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import { reactive } from 'vue';
  2. import axios from 'axios';
  3. import dayjs from 'dayjs';
  4. import { updateObject } from '@/services/object';
  5. import router from '@/router';
  6. import { deleteCookie, setCookie } from '@/services/cookie';
  7. export interface IUser {
  8. id?: string;
  9. account?: string;
  10. phone?: string;
  11. email?: string;
  12. password?: string;
  13. rePassword?: string;
  14. username?: string;
  15. avatarUrl?: string;
  16. role?: string;
  17. token?: string;
  18. inviteCode?: string;
  19. code?: string;
  20. remember?: boolean;
  21. captcha?: string;
  22. vip?: string;
  23. isVip?: boolean;
  24. roles?: string[];
  25. isOperation?: boolean;
  26. company?: any;
  27. department?: any;
  28. corporation?: any;
  29. teams?: { id: string; name: string }[];
  30. wechat?: any;
  31. sina?: any;
  32. github?: any;
  33. created?: any;
  34. createdAt?: any;
  35. }
  36. const user = reactive<IUser>({
  37. id: '',
  38. });
  39. const message = reactive<{ unread: number }>({
  40. unread: 0,
  41. });
  42. export const useUser = () => {
  43. const getUser = async (token?: boolean) => {
  44. const params: any = {};
  45. if (token) {
  46. if (localStorage.getItem('remember')) {
  47. params.token = 'r';
  48. } else {
  49. params.token = '1';
  50. }
  51. }
  52. const ret: IUser = await axios.get('/api/account/profile', { params });
  53. if (!ret) {
  54. return;
  55. }
  56. setUser(ret);
  57. return user;
  58. };
  59. const getMessage = async () => {
  60. const ret: { unread: number } = await axios.post(
  61. '/api/message/unread/count'
  62. );
  63. ret && (message.unread = ret.unread);
  64. };
  65. const setUser = async (data: IUser) => {
  66. if (data.department && !data.department.id) {
  67. delete data.department;
  68. }
  69. if (data.vip) {
  70. const vip = new Date(data.vip);
  71. if (vip > new Date()) {
  72. data.isVip = true;
  73. }
  74. if (data.vip) {
  75. data.vip = dayjs(data.vip).format('YYYY-MM-DD HH:mm:ss');
  76. }
  77. }
  78. if (data.roles) {
  79. for (const item of data.roles) {
  80. if (item.indexOf('运营') > -1) {
  81. data.isOperation = true;
  82. break;
  83. }
  84. }
  85. }
  86. data.created = dayjs(data.createdAt).format('YYYY-MM-DD HH:mm:ss');
  87. if (data.token) {
  88. let baseUrl = import.meta.env.BASE_URL;
  89. if (baseUrl && baseUrl !== '/') {
  90. localStorage.setItem('token', data.token);
  91. } else {
  92. setCookie('token', data.token, {
  93. path: '/',
  94. domain: getRootDomain(),
  95. });
  96. localStorage.removeItem('token');
  97. }
  98. delete data.token;
  99. }
  100. updateObject(user, data);
  101. };
  102. const signout = () => {
  103. updateObject(user, {});
  104. localStorage.removeItem('token');
  105. const domain = getRootDomain();
  106. if (domain) {
  107. deleteCookie('token', {
  108. path: '/',
  109. domain: 'le5le.com',
  110. });
  111. }
  112. router.replace({ path: '/login', query: router.currentRoute.value.query });
  113. };
  114. const getRootDomain = () => {
  115. let domain = '';
  116. const domainItems = document.domain.split('.');
  117. if (
  118. domainItems.length < 3 ||
  119. (domainItems.length === 4 &&
  120. +domainItems[0] > 0 &&
  121. +domainItems[1] > 0 &&
  122. +domainItems[2] > 0 &&
  123. +domainItems[3] > 0)
  124. ) {
  125. domain = '';
  126. } else if (
  127. document.domain.endsWith('.com.cn') ||
  128. document.domain.endsWith('.org.cn')
  129. ) {
  130. domain = domainItems.slice(-3).join('.');
  131. } else {
  132. domain = domainItems.slice(-2).join('.');
  133. }
  134. return domain;
  135. };
  136. return {
  137. user,
  138. message,
  139. getUser,
  140. getMessage,
  141. setUser,
  142. signout,
  143. };
  144. };