auth.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. "use strict";
  2. const common_vendor = require("../common/vendor.js");
  3. const utils_api = require("./api.js");
  4. const TOKEN_KEY = "user_token";
  5. const USER_INFO_KEY = "user_info";
  6. let statusCheckTimer = null;
  7. const STATUS_CHECK_INTERVAL = 1e4;
  8. let isShowingDisabledModal = false;
  9. const setToken = (token) => {
  10. common_vendor.index.setStorageSync(TOKEN_KEY, token);
  11. };
  12. const getToken = () => {
  13. return common_vendor.index.getStorageSync(TOKEN_KEY) || null;
  14. };
  15. const removeToken = () => {
  16. common_vendor.index.removeStorageSync(TOKEN_KEY);
  17. };
  18. const setUserInfo = (userInfo) => {
  19. common_vendor.index.setStorageSync(USER_INFO_KEY, JSON.stringify(userInfo));
  20. };
  21. const getUserInfo = () => {
  22. const userInfo = common_vendor.index.getStorageSync(USER_INFO_KEY);
  23. return userInfo ? JSON.parse(userInfo) : null;
  24. };
  25. const removeUserInfo = () => {
  26. common_vendor.index.removeStorageSync(USER_INFO_KEY);
  27. };
  28. const isLoggedIn = () => {
  29. return !!getToken();
  30. };
  31. const logout = () => {
  32. stopStatusCheck();
  33. removeToken();
  34. removeUserInfo();
  35. };
  36. const wxSilentLogin = async (loginCode) => {
  37. try {
  38. console.log("[静默登录] 开始检查用户状态, code:", loginCode);
  39. const result = await utils_api.wxSilentLoginApi({ loginCode });
  40. console.log("[静默登录] 后端响应:", result);
  41. if (result.code === 200 && result.data.isSign === "true" && result.data.token) {
  42. setToken(result.data.token);
  43. console.log("[静默登录] 老用户登录成功");
  44. await fetchAndSaveUserInfo();
  45. startStatusCheck();
  46. }
  47. return result.data;
  48. } catch (error) {
  49. console.error("[静默登录] 失败:", error);
  50. throw error;
  51. }
  52. };
  53. const wxPhoneLogin = async (params) => {
  54. try {
  55. console.log("[手机号登录] 开始验证手机号");
  56. const result = await utils_api.wxPhoneLoginApi(params);
  57. console.log("[手机号登录] 后端响应:", result);
  58. if (result.code === 200 && result.data.isSign === "true" && result.data.token) {
  59. setToken(result.data.token);
  60. console.log("[手机号登录] 已注册用户登录成功");
  61. await fetchAndSaveUserInfo();
  62. startStatusCheck();
  63. }
  64. return result.data;
  65. } catch (error) {
  66. console.error("[手机号登录] 失败:", error);
  67. throw error;
  68. }
  69. };
  70. const wxCompleteUserInfo = async (userInfo) => {
  71. try {
  72. console.log("[完善信息] 提交用户信息");
  73. const result = await utils_api.wxCompleteUserInfoApi(userInfo);
  74. console.log("[完善信息] 后端响应:", result);
  75. if (result.code === 200 && result.data.token) {
  76. setToken(result.data.token);
  77. console.log("[完善信息] 注册成功");
  78. await fetchAndSaveUserInfo();
  79. startStatusCheck();
  80. return true;
  81. } else {
  82. throw new Error(result.message || "注册失败");
  83. }
  84. } catch (error) {
  85. console.error("[完善信息] 失败:", error);
  86. throw error;
  87. }
  88. };
  89. const fetchAndSaveUserInfo = async () => {
  90. try {
  91. const result = await utils_api.getUserInfoApi();
  92. if (result.code === 200 && result.data) {
  93. setUserInfo(result.data);
  94. console.log("[用户信息] 获取成功");
  95. }
  96. } catch (error) {
  97. console.error("[用户信息] 获取失败:", error);
  98. }
  99. };
  100. const refreshUserInfo = async () => {
  101. if (!isLoggedIn()) {
  102. return null;
  103. }
  104. try {
  105. const result = await utils_api.getUserInfoApi();
  106. if (result.code === 200 && result.data) {
  107. const userInfo = {
  108. nickname: result.data.nickname || "",
  109. avatar: result.data.avatar || "",
  110. phone: result.data.phone || "",
  111. status: result.data.status || 0
  112. };
  113. if (userInfo.status === 1) {
  114. console.log("[用户状态] 账号已被禁用,自动退出登录");
  115. handleUserDisabled();
  116. return null;
  117. }
  118. setUserInfo(userInfo);
  119. console.log("[刷新用户状态] 成功, status:", userInfo.status);
  120. return userInfo;
  121. }
  122. } catch (error) {
  123. console.warn("[刷新用户状态] 失败:", error.message);
  124. }
  125. return getUserInfo();
  126. };
  127. const handleUserDisabled = () => {
  128. if (isShowingDisabledModal) {
  129. return;
  130. }
  131. isShowingDisabledModal = true;
  132. stopStatusCheck();
  133. logout();
  134. common_vendor.index.showModal({
  135. title: "账号已禁用",
  136. content: "您的账号已被禁用,如有疑问请联系客服",
  137. showCancel: false,
  138. confirmText: "我知道了",
  139. success: () => {
  140. isShowingDisabledModal = false;
  141. common_vendor.index.switchTab({ url: "/pages/mine/mine" });
  142. }
  143. });
  144. };
  145. const startStatusCheck = () => {
  146. if (statusCheckTimer) {
  147. return;
  148. }
  149. if (!isLoggedIn()) {
  150. return;
  151. }
  152. console.log("[状态检查] 启动定时检查");
  153. checkUserStatus();
  154. statusCheckTimer = setInterval(() => {
  155. checkUserStatus();
  156. }, STATUS_CHECK_INTERVAL);
  157. };
  158. const stopStatusCheck = () => {
  159. if (statusCheckTimer) {
  160. console.log("[状态检查] 停止定时检查");
  161. clearInterval(statusCheckTimer);
  162. statusCheckTimer = null;
  163. }
  164. };
  165. const checkUserStatus = async () => {
  166. if (!isLoggedIn()) {
  167. stopStatusCheck();
  168. return;
  169. }
  170. try {
  171. const result = await utils_api.getUserInfoApi();
  172. if (result.code === 200 && result.data) {
  173. if (result.data.status === 1) {
  174. console.log("[状态检查] 检测到账号被禁用");
  175. handleUserDisabled();
  176. }
  177. }
  178. } catch (error) {
  179. console.warn("[状态检查] 检查失败:", error.message);
  180. }
  181. };
  182. const checkLogin = (callback) => {
  183. if (isLoggedIn()) {
  184. return true;
  185. }
  186. common_vendor.index.showModal({
  187. title: "登录提示",
  188. content: '此功能需要登录后使用,请点击"立即登录"按钮进行授权',
  189. showCancel: false,
  190. confirmText: "我知道了"
  191. });
  192. return false;
  193. };
  194. exports.checkLogin = checkLogin;
  195. exports.getUserInfo = getUserInfo;
  196. exports.isLoggedIn = isLoggedIn;
  197. exports.logout = logout;
  198. exports.refreshUserInfo = refreshUserInfo;
  199. exports.setUserInfo = setUserInfo;
  200. exports.startStatusCheck = startStatusCheck;
  201. exports.stopStatusCheck = stopStatusCheck;
  202. exports.wxCompleteUserInfo = wxCompleteUserInfo;
  203. exports.wxPhoneLogin = wxPhoneLogin;
  204. exports.wxSilentLogin = wxSilentLogin;