123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587 |
- "use strict";
- const common_vendor = require("../../common/vendor.js");
- const api_user = require("../../api/user.js");
- const common_assets = require("../../common/assets.js");
- new Proxy({}, {
- get(_, key) {
- throw new Error(`Module "util" has been externalized for browser compatibility. Cannot access "util.${key}" in client code. See https://vitejs.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.`);
- }
- });
- const _sfc_main = {
- data() {
- return {
- isLogin: false,
- userInfo: {
- username: "",
- userId: "",
- avatar: ""
- },
- menuItems: [
- { title: "个人资料", icon: "icon-user", action: "profile" },
- // { title: '我的订单', icon: 'icon-order', action: 'orders' },
- // { title: '我的收藏', icon: 'icon-star', action: 'favorites' },
- { title: "设置", icon: "icon-settings", action: "settings" },
- { title: "帮助中心", icon: "icon-help", action: "help" }
- ],
- showAuthModal: false,
- wxLoginCode: ""
- // 存储微信登录code
- };
- },
- onLoad() {
- },
- onShow() {
- this.checkLoginStatus();
- },
- methods: {
- checkLogin() {
- const userInfo = common_vendor.index.getStorageSync("userInfo");
- if (!userInfo) {
- common_vendor.index.reLaunch({
- url: "/pages/login/login",
- success: () => {
- console.log("跳转到身份验证登录页面成功");
- },
- fail: (err) => {
- console.error("跳转到身份验证登录页面失败:", err);
- common_vendor.index.showToast({
- title: "跳转失败,请重试",
- icon: "none"
- });
- }
- });
- return false;
- }
- try {
- const parsedUserInfo = JSON.parse(userInfo);
- if (!parsedUserInfo.openid) {
- common_vendor.index.navigateTo({
- url: "/pages/login/login"
- });
- return false;
- }
- return true;
- } catch (e) {
- console.error("解析用户信息失败:", e);
- common_vendor.index.removeStorageSync("userInfo");
- common_vendor.index.navigateTo({
- url: "/pages/login/login"
- });
- return false;
- }
- },
- // 检查登录状态
- checkLoginStatus() {
- try {
- const token = common_vendor.index.getStorageSync("token");
- const userInfoStr = common_vendor.index.getStorageSync("userInfo");
- if (token && userInfoStr) {
- const userInfo = JSON.parse(userInfoStr);
- const loginTime = userInfo.loginTime || 0;
- const currentTime = (/* @__PURE__ */ new Date()).getTime();
- const loginExpireTime = 7 * 24 * 60 * 60 * 1e3;
- if (currentTime - loginTime > loginExpireTime) {
- console.log("登录已过期,需要重新登录");
- this.handleLogout(false);
- return;
- }
- this.isLogin = true;
- this.userInfo = userInfo;
- this.fetchUserDetail();
- } else {
- this.isLogin = false;
- this.userInfo = {
- username: "",
- userId: "",
- avatar: "",
- phone: ""
- };
- }
- } catch (e) {
- console.error("获取登录状态失败", e);
- this.isLogin = false;
- }
- },
- // 前往登录页
- goLogin() {
- common_vendor.index.navigateTo({
- url: "/pages/login/login"
- });
- },
- // 微信登录
- wxLogin() {
- this.getWxLoginCode();
- },
- // 获取微信登录 code
- getWxLoginCode() {
- common_vendor.index.showLoading({ title: "登录中..." });
- common_vendor.index.login({
- provider: "weixin",
- success: (loginRes) => {
- console.log("获取微信登录code成功:", loginRes.code);
- this.wxLoginCode = loginRes.code;
- common_vendor.index.hideLoading();
- this.showAuthModal = true;
- },
- fail: (err) => {
- common_vendor.index.hideLoading();
- console.error("获取微信登录code失败:", err);
- common_vendor.index.showToast({
- title: "微信登录失败",
- icon: "none"
- });
- }
- });
- },
- // 用户点击授权按钮时调用
- getUserProfile() {
- common_vendor.wx$1.getUserProfile({
- desc: "用于完善用户资料",
- success: (profileRes) => {
- console.log("获取用户信息成功:", profileRes);
- const loginParams = {
- code: this.wxLoginCode,
- userInfo: profileRes.userInfo,
- signature: profileRes.signature,
- rawData: profileRes.rawData,
- encryptedData: profileRes.encryptedData,
- iv: profileRes.iv
- };
- this.showAuthModal = false;
- this.wxLoginRequest(loginParams);
- },
- fail: (err) => {
- console.error("获取用户信息失败:", err);
- this.showAuthModal = false;
- this.wxLoginRequest({
- code: this.wxLoginCode,
- userInfo: {
- nickName: "微信用户",
- avatarUrl: "",
- gender: 0,
- province: "",
- city: "",
- country: ""
- }
- });
- }
- });
- },
- // 取消授权
- cancelAuth() {
- this.showAuthModal = false;
- this.wxLoginRequest({
- code: this.wxLoginCode,
- userInfo: {
- nickName: "微信用户",
- avatarUrl: "",
- gender: 0,
- province: "",
- city: "",
- country: ""
- }
- });
- },
- // 头像选择回调
- onChooseAvatar(e) {
- const { avatarUrl } = e.detail;
- console.log("用户选择的头像:", avatarUrl);
- },
- // 发送微信登录请求并处理结果
- async wxLoginRequest(loginParams) {
- try {
- common_vendor.index.showLoading({ title: "登录中..." });
- console.log("发送登录请求,参数:", loginParams);
- const data = await api_user.wxLogin(loginParams);
- console.log("登录成功,返回数据:", data);
- const userData = this.buildUserData(data, loginParams);
- this.saveLoginState(data, userData);
- if (userData.userId) {
- this.fetchUserDetail();
- } else {
- console.log("无法获取用户ID,跳过获取详细信息");
- }
- if (!userData.phone) {
- console.log("用户未绑定手机号,可以提示用户绑定");
- }
- } catch (error) {
- this.handleLoginError(error, loginParams);
- }
- },
- /**
- * 构建用户数据对象
- * @param {Object} data - 后端返回的数据
- * @param {Object} loginParams - 登录参数
- * @returns {Object} - 构建的用户数据
- */
- buildUserData(data, loginParams) {
- console.log("构建用户数据,服务器返回:", data);
- let userData = {
- // 用户基本信息 - 优先使用服务器返回的数据
- username: data.username || data.nickName || (loginParams.userInfo ? loginParams.userInfo.nickName : "微信用户"),
- // 用户ID可能在不同字段
- userId: data.userId || data.user_id || data.id || data.openid || "",
- // 头像可能在不同字段
- avatar: data.avatar || data.avatarUrl || (loginParams.userInfo ? loginParams.userInfo.avatarUrl : "/static/avatar.png"),
- // 用户详细信息
- phone: data.phone || data.mobile || "",
- gender: data.gender || (loginParams.userInfo ? loginParams.userInfo.gender : 0),
- // 微信相关信息
- openid: data.openid || "",
- unionid: data.unionid || "",
- session_key: data.session_key || "",
- // 是否新用户
- is_new_user: data.is_new_user || false,
- // 登录时间
- loginTime: (/* @__PURE__ */ new Date()).getTime()
- };
- console.log("构建的用户数据:", userData);
- return userData;
- },
- /**
- * 保存登录状态和用户信息
- * @param {Object} data - 后端返回的数据
- * @param {Object} userData - 构建的用户数据
- */
- saveLoginState(data, userData) {
- const token = data.token || data.session_key || "";
- if (token) {
- common_vendor.index.setStorageSync("token", token);
- console.log("Token已保存:", token);
- }
- common_vendor.index.setStorageSync("userInfo", JSON.stringify(userData));
- console.log("用户信息已保存");
- this.isLogin = true;
- this.userInfo = userData;
- common_vendor.index.hideLoading();
- common_vendor.index.showToast({
- title: "登录成功",
- icon: "success"
- });
- },
- /**
- * 处理登录错误
- * @param {Error} error - 错误对象
- * @param {Object} loginParams - 登录参数
- */
- handleLoginError(error, loginParams) {
- common_vendor.index.hideLoading();
- if (error.message && (error.message.includes("code无效") || error.message.includes("已过期") || error.message.includes("已被使用") || error.status === 999)) {
- console.error("微信登录code无效,重新获取:", error);
- common_vendor.index.showToast({
- title: "code已过期,请重试",
- icon: "none",
- duration: 2e3
- });
- setTimeout(() => {
- this.getWxLoginCode();
- }, 1e3);
- return;
- }
- if (error.code === 10001) {
- common_vendor.index.navigateTo({
- url: "/pages/bind/bind?code=" + (loginParams.code || "")
- });
- } else if (error.message && error.message.includes("CSRF")) {
- console.error("CSRF验证失败:", error);
- common_vendor.index.showToast({
- title: "CSRF验证失败,请刷新页面重试",
- icon: "none",
- duration: 2e3
- });
- setTimeout(() => this.refreshCSRFToken(), 2e3);
- } else {
- console.error("微信登录失败:", error);
- common_vendor.index.showToast({
- title: error.message || "登录失败",
- icon: "none"
- });
- }
- },
- /**
- * 获取用户详细信息
- * 步骤6: 获取并更新用户详细信息
- */
- async fetchUserDetail() {
- try {
- if (!this.isLogin)
- return;
- const userId = this.userInfo.userId;
- const userDetail = await api_user.getUserInfo(userId, JSON.parse(common_vendor.index.getStorageSync("userInfo")).openid);
- console.log("获取用户详细信息成功:", userDetail);
- if (userDetail) {
- this.updateUserInfo(userDetail);
- }
- } catch (error) {
- console.error("获取用户详细信息失败:", error);
- }
- },
- /**
- * 更新用户信息
- * @param {Object} userDetail - 用户详细信息
- */
- updateUserInfo(userDetail) {
- const updatedUserInfo = {
- ...this.userInfo,
- // 更新基本信息
- username: userDetail.username || userDetail.nickName || this.userInfo.username,
- avatar: userDetail.avatar || userDetail.avatarUrl || this.userInfo.avatar,
- phone: userDetail.phone || userDetail.mobile || this.userInfo.phone,
- // 更新详细信息
- email: userDetail.email || "",
- address: userDetail.address || "",
- birthday: userDetail.birthday || "",
- // 其他字段
- ...userDetail
- };
- this.userInfo = updatedUserInfo;
- common_vendor.index.setStorageSync("userInfo", JSON.stringify(updatedUserInfo));
- console.log("用户详细信息已更新");
- },
- /**
- * 获取用户手机号
- * @param {Object} e - 事件对象
- */
- getPhoneNumber(e) {
- if (e.detail.code) {
- common_vendor.wx$1.request({
- url: "http:192.168.66.187:8083/wechat/getUserPhoneNumber",
- method: "POST",
- data: {
- code: e.detail.code,
- // 刚获取的新code
- openid: this.data.openid
- }
- });
- }
- },
- /* async getPhoneNumber(e) {
- console.log('获取手机号事件:', e);
-
- // 检查是否成功获取
- if (e.detail.errMsg !== 'getPhoneNumber:ok') {
- console.error('用户拒绝授权手机号');
- uni.showToast({
- title: '获取手机号失败',
- icon: 'none'
- });
- return;
- }
-
- try {
- uni.showLoading({ title: '获取手机号中...' });
-
- // 每次都重新获取最新的登录code
- const loginResult = await new Promise((resolve, reject) => {
- uni.login({
- provider: 'weixin',
- success: (res) => resolve(res),
- fail: (err) => reject(err)
- });
- });
-
- if (!loginResult || !loginResult.code) {
- throw new Error('获取微信登录凭证失败');
- }
-
- console.log('成功获取新的登录code:', loginResult.code);
-
- // 获取存储的用户信息
- const userInfoStr = uni.getStorageSync('userInfo');
- if (!userInfoStr) {
- throw new Error('用户信息不存在,请重新登录');
- }
-
- const userInfo = JSON.parse(userInfoStr);
-
- // 准备请求参数
- const params = {
- code: loginResult.code,
- encryptedData: e.detail.encryptedData,
- iv: e.detail.iv,
- openid: userInfo.openid
- };
-
- console.log('获取手机号请求参数:', params);
-
- // 调用获取手机号API
- const phoneData = await getUserPhoneNumber(params);
- console.log('获取手机号成功:', phoneData);
-
- // 更新用户信息
- if (phoneData && phoneData.phoneNumber) {
- const updatedUserInfo = {
- ...this.userInfo,
- phone: phoneData.phoneNumber
- };
-
- // 更新状态和存储
- this.userInfo = updatedUserInfo;
- uni.setStorageSync('userInfo', JSON.stringify(updatedUserInfo));
-
- uni.showToast({
- title: '手机号绑定成功',
- icon: 'success'
- });
- } else {
- throw new Error('未能获取到手机号');
- }
- } catch (error) {
- console.error('获取手机号失败:', error);
- uni.showToast({
- title: error.message || '获取手机号失败',
- icon: 'none'
- });
- } finally {
- uni.hideLoading();
- }
- }, */
- // 添加刷新 CSRF token 的方法
- refreshCSRFToken() {
- common_vendor.index.request({
- url: "your-api-endpoint/csrf-token",
- // 替换为获取 CSRF token 的 API
- method: "GET",
- success: (res) => {
- if (res.data && res.data.csrfToken) {
- common_vendor.index.setStorageSync("csrfToken", res.data.csrfToken);
- console.log("CSRF token 已刷新");
- }
- },
- fail: (err) => {
- console.error("获取 CSRF token 失败", err);
- }
- });
- },
- handleMenuClick(item) {
- const needLogin = ["profile", "orders", "favorites"];
- if (needLogin.includes(item.action) && !this.isLogin) {
- common_vendor.index.showToast({
- title: "请先登录",
- icon: "none"
- });
- setTimeout(() => {
- this.goLogin();
- }, 1500);
- return;
- }
- switch (item.action) {
- case "profile":
- common_vendor.index.navigateTo({ url: "/pages/profile/profile" });
- break;
- case "orders":
- common_vendor.index.navigateTo({ url: "/pages/orders/orders" });
- break;
- case "favorites":
- common_vendor.index.navigateTo({ url: "/pages/favorites/favorites" });
- break;
- case "settings":
- common_vendor.index.navigateTo({ url: "/pages/settings/settings" });
- break;
- case "help":
- common_vendor.index.navigateTo({ url: "/pages/help/help" });
- break;
- default:
- common_vendor.index.showToast({
- title: `点击了${item.title}`,
- icon: "none"
- });
- }
- },
- // 处理退出登录 - 增强版
- handleLogout(showConfirm = true) {
- const doLogout = () => {
- api_user.logout().then(() => {
- try {
- common_vendor.index.removeStorageSync("token");
- common_vendor.index.removeStorageSync("userInfo");
- this.isLogin = false;
- this.userInfo = {
- username: "",
- userId: "",
- avatar: "",
- phone: ""
- };
- if (showConfirm) {
- common_vendor.index.showToast({
- title: "已退出登录",
- icon: "success"
- });
- }
- } catch (e) {
- console.error("退出登录失败", e);
- if (showConfirm) {
- common_vendor.index.showToast({
- title: "退出登录失败",
- icon: "none"
- });
- }
- }
- }).catch((err) => {
- console.error("退出登录请求失败", err);
- common_vendor.index.removeStorageSync("token");
- common_vendor.index.removeStorageSync("userInfo");
- this.isLogin = false;
- if (showConfirm) {
- common_vendor.index.showToast({
- title: err.message || "退出登录失败",
- icon: "none"
- });
- }
- });
- };
- if (showConfirm) {
- common_vendor.index.showModal({
- title: "提示",
- content: "确定要退出登录吗?",
- success: (res) => {
- if (res.confirm) {
- doLogout();
- }
- }
- });
- } else {
- doLogout();
- }
- },
- // 格式化手机号,例如:188****8888
- formatPhone(phone) {
- if (!phone || phone.length < 11)
- return phone;
- return phone.substring(0, 3) + "****" + phone.substring(7);
- }
- }
- };
- function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
- return common_vendor.e({
- a: $data.isLogin
- }, $data.isLogin ? common_vendor.e({
- b: $data.userInfo.avatar || "/static/avatar.png",
- c: common_vendor.t($data.userInfo.username),
- d: $data.userInfo.phone
- }, $data.userInfo.phone ? {
- e: common_vendor.t($options.formatPhone($data.userInfo.phone))
- } : {}) : {
- f: common_assets._imports_0,
- g: common_vendor.o((...args) => $options.goLogin && $options.goLogin(...args))
- }, {
- h: common_vendor.f($data.menuItems, (item, index, i0) => {
- return {
- a: common_vendor.n(item.icon),
- b: common_vendor.t(item.title),
- c: index,
- d: common_vendor.o(($event) => $options.handleMenuClick(item), index)
- };
- }),
- i: $data.isLogin
- }, $data.isLogin ? {
- j: common_vendor.o((...args) => $options.handleLogout && $options.handleLogout(...args))
- } : {}, {
- k: $data.showAuthModal
- }, $data.showAuthModal ? {
- l: common_vendor.o((...args) => $options.getUserProfile && $options.getUserProfile(...args)),
- m: common_vendor.o((...args) => $options.cancelAuth && $options.cancelAuth(...args))
- } : {});
- }
- const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
- wx.createPage(MiniProgramPage);
|