"use strict"; const common_vendor = require("../../common/vendor.js"); const utils_auth = require("../../utils/auth.js"); const utils_api = require("../../utils/api.js"); const UserInfoPopup = () => "../../components/UserInfoPopup.js"; const _sfc_main = { components: { UserInfoPopup }, data() { return { showOneClickLogin: true, // 是否显示一键登录按钮 agreedToTerms: false, // 是否同意协议 loginCode: "", // 微信登录code tempUserData: null // 临时存储的用户数据 }; }, methods: { /** * 返回上一页 */ handleBack() { const pages = getCurrentPages(); if (pages.length > 1) { common_vendor.index.navigateBack(); } else { common_vendor.index.switchTab({ url: "/pages/index/index" }); } }, /** * 第一步:微信一键登录(老用户静默登录) */ async handleWxLogin() { if (!this.agreedToTerms) { common_vendor.index.showToast({ title: "请先阅读并同意用户协议", icon: "none", duration: 2e3 }); return; } try { common_vendor.index.showLoading({ title: "登录中..." }); const loginRes = await this.wxLoginAsync(); this.loginCode = loginRes.code; console.log("[登录] 获取到微信code:", this.loginCode); const result = await utils_auth.wxSilentLogin(this.loginCode); common_vendor.index.hideLoading(); if (result && result.isSign === "true") { console.log("[登录] 老用户登录成功"); this.handleLoginSuccess(); } else if (result && result.isSign === "false") { console.log("[登录] 新用户,需要授权手机号"); this.showOneClickLogin = false; } else if (result && result.code === 103) { common_vendor.index.showModal({ title: "账号异常", content: "您的账号已被禁用,如有疑问请联系客服", showCancel: false }); } else { throw new Error("登录接口返回数据异常"); } } catch (error) { common_vendor.index.hideLoading(); console.error("[登录] 微信登录失败:", error); common_vendor.index.showToast({ title: error.message || "登录失败,请重试", icon: "none", duration: 2e3 }); } }, /** * 第二步:获取手机号授权(新用户) */ async handleGetPhoneNumber(e) { console.log("[登录] 手机号授权回调:", e); if (e.detail.errMsg !== "getPhoneNumber:ok") { if (e.detail.errMsg.includes("no permission")) { common_vendor.index.showModal({ title: "权限不足", content: '获取手机号功能需要:\n1. 小程序企业认证\n2. 开通"手机号快速验证组件"权限\n3. 在真机上测试', showCancel: false }); } else { common_vendor.index.showToast({ title: "授权失败,请重试", icon: "none" }); } return; } try { common_vendor.index.showLoading({ title: "验证中..." }); const loginRes = await this.wxLoginAsync(); const newLoginCode = loginRes.code; const params = { loginCode: newLoginCode, phoneCode: e.detail.code, encryptedData: e.detail.encryptedData, iv: e.detail.iv }; console.log("[登录] 发送手机号验证请求"); const result = await utils_auth.wxPhoneLogin(params); common_vendor.index.hideLoading(); if (result && result.isSign === "false") { console.log("[登录] 需要完善用户信息"); this.tempUserData = result; this.$refs.userInfoPopup.open(result); } else if (result && result.isSign === "true") { console.log("[登录] 已注册用户,登录成功"); this.handleLoginSuccess(); } else { throw new Error("验证接口返回数据异常"); } } catch (error) { common_vendor.index.hideLoading(); console.error("[登录] 手机号验证失败:", error); let errorMsg = "验证失败,请重试"; if (error.message) { if (error.message.includes("48001") || error.message.includes("未开通手机号快速验证组件")) { common_vendor.index.showModal({ title: "权限未开通", content: '小程序未开通"手机号快速验证组件"权限\n\n请前往微信公众平台:\n开发 → 开发管理 → 接口设置\n开通"手机号快速验证组件"', showCancel: false }); return; } else if (error.message.includes("40029") || error.message.includes("code无效")) { errorMsg = "phoneCode已失效,请重新授权"; } else if (error.message.includes("40001") || error.message.includes("access_token")) { errorMsg = "access_token无效,请重试"; } else if (error.message.includes("45011")) { errorMsg = "操作过于频繁,请稍后重试"; } else { errorMsg = error.message; } } common_vendor.index.showToast({ title: errorMsg, icon: "none", duration: 3e3 }); } }, /** * 第三步:完善用户信息(首次登录) */ async handleUserInfoConfirm(userInfo) { try { common_vendor.index.showLoading({ title: "注册中..." }); const completeInfo = { openid: this.tempUserData.openid, unionid: this.tempUserData.unionid, phoneNumber: this.tempUserData.phoneNumber, nickname: userInfo.nickname, avatarUrl: userInfo.avatarUrl // 微信临时URL,先存着 }; console.log("[登录] 提交用户信息"); await utils_auth.wxCompleteUserInfo(completeInfo); if (userInfo.tempAvatarPath) { console.log("[登录] 开始上传头像到服务器, tempAvatarPath:", userInfo.tempAvatarPath); try { const uploadedUrl = await this.uploadAvatarWithToken(userInfo.tempAvatarPath); console.log("[登录] 头像上传成功, uploadedUrl:", uploadedUrl); if (uploadedUrl) { console.log("[登录] 调用updateUserProfile更新头像"); const updateResult = await utils_api.updateUserProfile({ avatar: uploadedUrl }); console.log("[登录] updateUserProfile返回:", updateResult); const userInfoLocal = common_vendor.index.getStorageSync("user_info"); if (userInfoLocal) { const parsed = JSON.parse(userInfoLocal); parsed.avatar = uploadedUrl; common_vendor.index.setStorageSync("user_info", JSON.stringify(parsed)); } console.log("[登录] 头像上传成功:", uploadedUrl); } } catch (uploadErr) { console.warn("[登录] 头像上传失败:", uploadErr); } } common_vendor.index.hideLoading(); console.log("[登录] 注册成功"); this.handleLoginSuccess(); } catch (error) { common_vendor.index.hideLoading(); console.error("[登录] 注册失败:", error); common_vendor.index.showToast({ title: error.message || "注册失败,请重试", icon: "none", duration: 2e3 }); } }, /** * 带token上传头像 */ uploadAvatarWithToken(filePath) { return new Promise((resolve, reject) => { common_vendor.index.uploadFile({ url: utils_api.uploadFile.url, filePath, name: "file", header: { "Authorization": `Bearer ${common_vendor.index.getStorageSync("user_token") || ""}` }, success: (res) => { const data = JSON.parse(res.data); if (data.code === 200 && data.data && data.data.url) { resolve(data.data.url); } else { reject(new Error(data.message || "上传失败")); } }, fail: (err) => { reject(err); } }); }); }, /** * 登录成功后的处理 */ handleLoginSuccess() { common_vendor.index.showToast({ title: "登录成功", icon: "success", duration: 1500 }); setTimeout(() => { const pages = getCurrentPages(); if (pages.length > 1) { common_vendor.index.navigateBack(); } else { common_vendor.index.switchTab({ url: "/pages/index/index" }); } }, 1500); }, /** * 协议勾选变化 */ handleAgreementChange(e) { this.agreedToTerms = e.detail.value.length > 0; }, /** * 显示协议内容 */ showAgreement(type) { const title = type === "user" ? "用户协议" : "隐私政策"; common_vendor.index.showModal({ title, content: "这里显示协议内容...", showCancel: false }); }, /** * 封装 wx.login 为 Promise */ wxLoginAsync() { return new Promise((resolve, reject) => { common_vendor.index.login({ provider: "weixin", success: (res) => { resolve(res); }, fail: (err) => { reject(err); } }); }); } } }; if (!Array) { const _component_user_info_popup = common_vendor.resolveComponent("user-info-popup"); _component_user_info_popup(); } function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { return common_vendor.e({ a: common_vendor.o((...args) => $options.handleBack && $options.handleBack(...args)), b: $data.showOneClickLogin }, $data.showOneClickLogin ? { c: common_vendor.o((...args) => $options.handleWxLogin && $options.handleWxLogin(...args)) } : { d: common_vendor.o((...args) => $options.handleGetPhoneNumber && $options.handleGetPhoneNumber(...args)) }, { e: $data.agreedToTerms, f: common_vendor.o(($event) => $options.showAgreement("user")), g: common_vendor.o(($event) => $options.showAgreement("privacy")), h: common_vendor.o((...args) => $options.handleAgreementChange && $options.handleAgreementChange(...args)), i: common_vendor.sr("userInfoPopup", "cdfe2409-0"), j: common_vendor.o($options.handleUserInfoConfirm) }); } const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-cdfe2409"], ["__file", "D:/program/gupiao-wx/src/pages/login/login.vue"]]); wx.createPage(MiniProgramPage);