user.ts 4.5 KB

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