login.js 8.0 KB

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