login.js 8.2 KB

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