login.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. "use strict";
  2. const common_vendor = require("../../common/vendor.js");
  3. const api_user = require("../../api/user.js");
  4. const common_assets = require("../../common/assets.js");
  5. const _sfc_main = {
  6. data() {
  7. return {
  8. isAgreed: false,
  9. wxLoginCode: ""
  10. };
  11. },
  12. methods: {
  13. toggleAgreement() {
  14. this.isAgreed = !this.isAgreed;
  15. },
  16. handleLogin() {
  17. if (!this.isAgreed) {
  18. common_vendor.index.showToast({
  19. title: "请先阅读并同意相关协议",
  20. icon: "none"
  21. });
  22. return;
  23. }
  24. this.getWxLoginCode();
  25. },
  26. getWxLoginCode() {
  27. common_vendor.index.showLoading({ title: "登录中..." });
  28. common_vendor.index.login({
  29. provider: "weixin",
  30. success: (loginRes) => {
  31. console.log("获取微信登录code成功:", loginRes.code);
  32. this.wxLoginCode = loginRes.code;
  33. common_vendor.index.hideLoading();
  34. this.getUserProfile();
  35. },
  36. fail: (err) => {
  37. common_vendor.index.hideLoading();
  38. console.error("获取微信登录code失败:", err);
  39. common_vendor.index.showToast({
  40. title: "微信登录失败",
  41. icon: "none"
  42. });
  43. }
  44. });
  45. },
  46. getUserProfile() {
  47. common_vendor.wx$1.getUserProfile({
  48. desc: "用于完善用户资料",
  49. success: (profileRes) => {
  50. console.log("获取用户信息成功:", profileRes);
  51. const loginParams = {
  52. code: this.wxLoginCode,
  53. userInfo: profileRes.userInfo,
  54. signature: profileRes.signature,
  55. rawData: profileRes.rawData,
  56. encryptedData: profileRes.encryptedData,
  57. iv: profileRes.iv
  58. };
  59. this.wxLoginRequest(loginParams);
  60. },
  61. fail: (err) => {
  62. console.error("获取用户信息失败:", err);
  63. this.wxLoginRequest({
  64. code: this.wxLoginCode,
  65. userInfo: {
  66. nickName: "微信用户",
  67. avatarUrl: "",
  68. gender: 0,
  69. province: "",
  70. city: "",
  71. country: ""
  72. }
  73. });
  74. }
  75. });
  76. },
  77. async wxLoginRequest(loginParams) {
  78. try {
  79. common_vendor.index.showLoading({ title: "登录中..." });
  80. console.log("发送登录请求,参数:", loginParams);
  81. const data = await api_user.wxLogin(loginParams);
  82. console.log("登录成功,返回数据:", data);
  83. const userData = this.buildUserData(data, loginParams);
  84. this.saveLoginState(data, userData);
  85. } catch (error) {
  86. this.handleLoginError(error, loginParams);
  87. }
  88. },
  89. buildUserData(data, loginParams) {
  90. console.log("构建用户数据,服务器返回:", data);
  91. let userData = {
  92. username: data.username || data.nickName || (loginParams.userInfo ? loginParams.userInfo.nickName : "微信用户"),
  93. name: data.name || data.username || data.nickName || (loginParams.userInfo ? loginParams.userInfo.nickName : ""),
  94. id: data.id || data.userId || data.user_id || data.openid || "",
  95. userId: data.userId || data.user_id || data.id || data.openid || "",
  96. avatar: data.avatar || data.avatarUrl || (loginParams.userInfo ? loginParams.userInfo.avatarUrl : "/static/avatar.png"),
  97. phone: data.phone || data.mobile || "",
  98. gender: data.gender || (loginParams.userInfo ? loginParams.userInfo.gender : 0),
  99. openid: data.openid || "",
  100. unionid: data.unionid || "",
  101. session_key: data.session_key || "",
  102. is_new_user: data.is_new_user || false,
  103. loginTime: (/* @__PURE__ */ new Date()).getTime()
  104. };
  105. console.log("构建的用户数据:", userData);
  106. return userData;
  107. },
  108. saveLoginState(data, userData) {
  109. const token = data.token || data.session_key || "";
  110. if (token) {
  111. common_vendor.index.setStorageSync("token", token);
  112. console.log("Token已保存:", token);
  113. }
  114. if (userData.avatar) {
  115. console.log("用户头像已保存:", userData.avatar);
  116. } else if (data.avatarUrl) {
  117. userData.avatar = data.avatarUrl;
  118. }
  119. common_vendor.index.setStorageSync("userInfo", JSON.stringify(userData));
  120. console.log("基本用户信息已保存");
  121. if (userData.id) {
  122. this.fetchUserDetail(userData.id, userData);
  123. } else {
  124. this.completeLogin();
  125. }
  126. },
  127. // 获取用户详细信息
  128. async fetchUserDetail(userId, basicUserData) {
  129. try {
  130. console.log("获取用户详细信息,用户ID:", userId);
  131. const userDetail = await api_user.getUserInfo(userId);
  132. console.log("获取用户详细信息成功:", userDetail);
  133. if (userDetail) {
  134. const updatedUserInfo = {
  135. ...basicUserData,
  136. // 更新基本信息
  137. name: userDetail.name || basicUserData.name,
  138. phone: userDetail.phone || userDetail.mobile || basicUserData.phone,
  139. gender: userDetail.gender || basicUserData.gender,
  140. // 添加详细信息
  141. id_card: userDetail.id_card || "",
  142. emergency_contact: userDetail.emergency_contact || "",
  143. emergency_phone: userDetail.emergency_phone || "",
  144. relation: userDetail.relation || "",
  145. // 其他可能的字段
  146. ...userDetail
  147. };
  148. common_vendor.index.setStorageSync("userInfo", JSON.stringify(updatedUserInfo));
  149. console.log("用户详细信息已更新并保存");
  150. }
  151. } catch (error) {
  152. console.error("获取用户详细信息失败:", error);
  153. } finally {
  154. this.completeLogin();
  155. }
  156. },
  157. // 完成登录流程
  158. completeLogin() {
  159. common_vendor.index.hideLoading();
  160. common_vendor.index.showToast({
  161. title: "登录成功",
  162. icon: "success",
  163. success: () => {
  164. setTimeout(() => {
  165. common_vendor.index.switchTab({
  166. url: "/pages/index/index"
  167. });
  168. }, 1500);
  169. }
  170. });
  171. },
  172. handleLoginError(error, loginParams) {
  173. common_vendor.index.hideLoading();
  174. if (error.message && (error.message.includes("code无效") || error.message.includes("已过期") || error.message.includes("已被使用") || error.status === 999)) {
  175. console.error("微信登录code无效,重新获取:", error);
  176. common_vendor.index.showToast({
  177. title: "code已过期,请重试",
  178. icon: "none",
  179. duration: 2e3
  180. });
  181. setTimeout(() => {
  182. this.getWxLoginCode();
  183. }, 1e3);
  184. return;
  185. }
  186. console.error("微信登录失败:", error);
  187. common_vendor.index.showToast({
  188. title: error.message || "登录失败",
  189. icon: "none"
  190. });
  191. }
  192. }
  193. };
  194. function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  195. return {
  196. a: common_assets._imports_0,
  197. b: common_vendor.o((...args) => $options.handleLogin && $options.handleLogin(...args)),
  198. c: $data.isAgreed,
  199. d: common_vendor.o((...args) => $options.toggleAgreement && $options.toggleAgreement(...args))
  200. };
  201. }
  202. const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
  203. wx.createPage(MiniProgramPage);