auth.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import { host } from "../utils/constant";
  2. import Storage from "../utils/storage";
  3. const _tokenStorage = new Storage("AUTH");
  4. const _tokenQueue: {
  5. pending: boolean;
  6. list: {
  7. resolve: (value: string) => void;
  8. reject: (err: any) => void;
  9. }[];
  10. } = {
  11. pending: false,
  12. list: [],
  13. };
  14. let _onTokenListener: {
  15. cb: (token: string) => void;
  16. }[] = [];
  17. const _resolveTokenQueue = function (res: any) {
  18. _tokenQueue.pending = false;
  19. uni.hideLoading();
  20. if (res.errMsg) {
  21. console.log(res);
  22. uni.showModal({
  23. title: "登录失败",
  24. content: `${res.errMsg}`,
  25. });
  26. _tokenQueue.list.forEach((item) => {
  27. item.reject(res);
  28. });
  29. } else {
  30. uni.showToast({
  31. icon: "success",
  32. title: "登陆成功",
  33. });
  34. setToken(res as string);
  35. _onTokenListener.forEach((item) => {
  36. item.cb(res as string);
  37. });
  38. _tokenQueue.list.forEach((item) => {
  39. item.resolve(res as string);
  40. });
  41. }
  42. _onTokenListener = [];
  43. _tokenQueue.list = [];
  44. };
  45. export function login(e: any): Promise<string> {
  46. return new Promise((resolve, reject) => {
  47. if (/deny|cancel/.test(e.detail.errMsg)) {
  48. reject();
  49. return;
  50. }
  51. if (!e.detail.code) {
  52. uni.showModal({
  53. title: `${e.detail.errMsg},请重试`,
  54. });
  55. reject();
  56. return;
  57. }
  58. _tokenQueue.list.push({
  59. resolve,
  60. reject,
  61. });
  62. if (_tokenQueue.pending) {
  63. return;
  64. }
  65. _tokenQueue.pending = true;
  66. uni.showLoading({
  67. title: "登录中",
  68. mask: true,
  69. });
  70. uni.login({
  71. success: (res) => {
  72. uni.request<any>({
  73. url: `${host}/user/wxLogin`,
  74. method: "POST",
  75. dataType: "json",
  76. data: {
  77. phoneCode: e.detail.code,
  78. code: res.code,
  79. avatar: "",
  80. nickname: "",
  81. },
  82. success: (res: any) => {
  83. const { statusCode, data } = res;
  84. if (
  85. statusCode === 200 &&
  86. data &&
  87. data.message === "ok" &&
  88. data.code === 200
  89. ) {
  90. _resolveTokenQueue(data.data.satoken);
  91. } else {
  92. _resolveTokenQueue({
  93. errMsg: data.msg ? data.msg : `${JSON.stringify(res)}`,
  94. });
  95. }
  96. },
  97. fail: _resolveTokenQueue,
  98. });
  99. },
  100. fail: _resolveTokenQueue,
  101. });
  102. });
  103. }
  104. export function refresh(): Promise<string> {
  105. return new Promise((resolve, reject) => {
  106. _tokenStorage.get("token").then((token) => {
  107. if (!token) {
  108. clearToken();
  109. reject({
  110. errMsg: "请登录",
  111. });
  112. uni.reLaunch({
  113. url: "/pages/map/map",
  114. });
  115. } else {
  116. getApp<any>().globalData.token = "";
  117. _tokenStorage.clear("token");
  118. uni.request({
  119. url: `${host}/user/refresh`,
  120. method: "GET",
  121. dataType: "json",
  122. header: {
  123. Authorization: token,
  124. },
  125. success: (res: any) => {
  126. console.log("refresh返回", res);
  127. const { statusCode, data } = res;
  128. if (
  129. statusCode === 200 &&
  130. data &&
  131. data.msg === "OK" &&
  132. data.code === 200
  133. ) {
  134. resolve(data.data.access_token);
  135. } else {
  136. if (data.code === 21005) {
  137. uni.reLaunch({
  138. url: "/pages/map/map",
  139. });
  140. }
  141. reject({
  142. errMsg: `${JSON.stringify(res)}`,
  143. });
  144. }
  145. },
  146. fail: reject,
  147. });
  148. }
  149. });
  150. });
  151. }
  152. export function onLogin(cb: (token: string) => void) {
  153. _onTokenListener.push({
  154. cb,
  155. });
  156. }
  157. export function fetchToken() {
  158. return _tokenStorage.get("token");
  159. }
  160. export function setToken(token: string) {
  161. getApp<any>().globalData.token = token;
  162. return _tokenStorage.set("token", token);
  163. }
  164. export function clearToken() {
  165. getApp<any>().globalData.token = "";
  166. return _tokenStorage.clear("token");
  167. }