login.js 8.1 KB

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