user.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. vipData?: any;
  24. vipDesc?: string;
  25. vipExpired?: boolean;
  26. isVip?: boolean;
  27. roles?: string[];
  28. isOperation?: boolean;
  29. company?: any;
  30. department?: any;
  31. corporation?: any;
  32. teams?: { id: string; name: string }[];
  33. wechat?: any;
  34. sina?: any;
  35. github?: any;
  36. created?: any;
  37. createdAt?: any;
  38. limit?: number;
  39. }
  40. const user = reactive<IUser>({
  41. id: '',
  42. });
  43. const message = reactive<{ unread: number }>({
  44. unread: 0,
  45. });
  46. export const getDomain = () => {
  47. if (import.meta.env.BASE_URL[0] === '/') {
  48. return location.hostname;
  49. }
  50. let domain = location.hostname;
  51. const domainItems = domain.split('.');
  52. if (
  53. domainItems.length < 3 ||
  54. (domainItems.length === 4 &&
  55. +domainItems[0] > 0 &&
  56. +domainItems[1] > 0 &&
  57. +domainItems[2] > 0 &&
  58. +domainItems[3] > 0)
  59. ) {
  60. domain = '';
  61. } else if (domain.endsWith('.com.cn') || domain.endsWith('.org.cn')) {
  62. domain = domainItems.slice(-3).join('.');
  63. } else {
  64. domain = domainItems.slice(-2).join('.');
  65. }
  66. return domain;
  67. };
  68. export const useUser = () => {
  69. const getUser = async (token?: boolean) => {
  70. const params: any = {};
  71. if (token) {
  72. if (localStorage.getItem('remember')) {
  73. params.token = 'r';
  74. } else {
  75. params.token = '1';
  76. }
  77. }
  78. const ret: IUser = await axios.get('/api/account/profile', { params });
  79. const statistics: any = await axios.post('/api/account/statistics');
  80. if (!ret) {
  81. return;
  82. }
  83. if (statistics) {
  84. ret.limit = statistics.documents?.le5leV?.limit;
  85. }
  86. setUser(ret);
  87. return user;
  88. };
  89. const getMessage = async () => {
  90. const ret: { unread: number } = await axios.post(
  91. '/api/message/unread/count'
  92. );
  93. ret && (message.unread = ret.unread);
  94. };
  95. const setUser = async (data: IUser) => {
  96. if (data.vip) {
  97. const vip = new Date(data.vip);
  98. if (vip > new Date()) {
  99. data.vipExpired = false;
  100. } else if (vip > new Date('2023-01-17T08:00:00+08:00')) {
  101. data.vipExpired = true;
  102. } else {
  103. data.vip = undefined;
  104. }
  105. if (data.vip) {
  106. data.vip = dayjs(data.vip).format('YYYY-MM-DD HH:mm:ss');
  107. }
  108. if (data.vipData?.devPackage) {
  109. data.vipDesc = '旗舰会员';
  110. } else if (data.vipData?.deploymentPackage) {
  111. data.vipDesc = '超级会员';
  112. } else if (data.vipData?.cloudHosting) {
  113. data.vipDesc = '高级会员';
  114. } else {
  115. data.vipDesc = '普通会员';
  116. }
  117. } else {
  118. data.vipDesc = '普通用户';
  119. }
  120. if (data.roles) {
  121. for (const item of data.roles) {
  122. if (item.indexOf('运营') > -1) {
  123. data.isOperation = true;
  124. break;
  125. }
  126. }
  127. }
  128. data.created = dayjs(data.createdAt).format('YYYY-MM-DD HH:mm:ss');
  129. // if (data.token) {
  130. // if (import.meta.env.BASE_URL[0] === '/') {
  131. // // localStorage.setItem('token', data.token);
  132. // } else {
  133. // setCookie('token', data.token, {
  134. // path: '/',
  135. // domain: getDomain(),
  136. // });
  137. // // localStorage.removeItem('token');
  138. // }
  139. // delete data.token;
  140. // }
  141. if (data.token) {
  142. setCookie('token', data.token, {
  143. path: '/',
  144. domain: getDomain(),
  145. });
  146. delete data.token;
  147. }
  148. updateObject(user, data);
  149. };
  150. const signout = () => {
  151. updateObject(user, {});
  152. // localStorage.removeItem('token');
  153. const domain = getDomain();
  154. if (domain) {
  155. deleteCookie('token', {
  156. path: '/',
  157. domain: domain, //'le5le.com',
  158. });
  159. }
  160. // router.replace({ path: '/login', query: router.currentRoute.value.query });
  161. };
  162. return {
  163. user,
  164. message,
  165. getUser,
  166. getMessage,
  167. setUser,
  168. signout,
  169. };
  170. };