From 2b4a3b6f1ba029d3e91e4990ac873167daa70eb9 Mon Sep 17 00:00:00 2001 From: yvan <8574526@qq.com> Date: Fri, 5 Sep 2025 23:35:32 +0800 Subject: [PATCH] 1 --- App.vue | 6 +- http/api/auth.js | 90 +++++++++++++++++++++++++++++- http/api/profile.js | 21 +++++++ http/config/config.js | 5 +- http/config/request.js | 6 +- pages/auth/phone-auth.vue | 59 +++++++++----------- pages/profile/profile.vue | 112 ++++++++++++++++++++++++++++++++------ 7 files changed, 246 insertions(+), 53 deletions(-) diff --git a/App.vue b/App.vue index 4d2502f..cc6e96e 100644 --- a/App.vue +++ b/App.vue @@ -52,7 +52,11 @@ const loginRes = await new Promise((resolve, reject) => { uni.login({ success: resolve, - fail: reject + fail: (error) => { + console.warn('微信登录失败:', error) + // 不reject,而是resolve一个空对象,避免阻止应用启动 + resolve({ code: null, error }) + } }) }) diff --git a/http/api/auth.js b/http/api/auth.js index 99879cf..a4a86c9 100644 --- a/http/api/auth.js +++ b/http/api/auth.js @@ -150,6 +150,33 @@ const executeAuthRequest = (url, data = {}, template = 'PUBLIC_AUTH', loadingTex return uni.$u.http.post(url, data, requestConfig) } +/** + * 执行认证请求(支持不同HTTP方法) + * @param {string} method HTTP方法 + * @param {string} url 请求URL + * @param {Object} data 请求数据 + * @param {string} template 配置模板 + * @param {string} loadingText loading文本 + * @param {Object} config 自定义配置 + * @returns {Promise} 请求Promise + */ +const executeAuthRequestWithMethod = (method, url, data = {}, template = 'PUBLIC_AUTH', loadingText = null, config = {}) => { + const requestConfig = createAuthConfig(template, config, loadingText) + + switch (method.toUpperCase()) { + case 'GET': + return uni.$u.http.get(url, requestConfig) + case 'POST': + return uni.$u.http.post(url, data, requestConfig) + case 'PUT': + return uni.$u.http.put(url, data, requestConfig) + case 'DELETE': + return uni.$u.http.delete(url, requestConfig) + default: + return uni.$u.http.post(url, data, requestConfig) + } +} + // ==================== API方法 ==================== // ==================== 用户登录相关API ==================== @@ -205,6 +232,27 @@ export const wxLogin = (wxData, config = {}) => { return executeAuthRequest('/wechat/user/mini/login', wxData, 'PUBLIC_AUTH', AUTH_LOADING_TEXTS.WX_LOGIN, config) } +/** + * 微信手机号登录 + * @description 通过微信手机号授权进行登录,获取用户token和信息 + * @param {PhoneLoginData} phoneData 手机号登录数据对象 + * @param {string} phoneData.code 微信登录code + * @param {string} phoneData.encryptedData 加密的手机号数据 + * @param {string} phoneData.iv 初始向量 + * @param {Object} [config={}] 自定义请求配置 + * @returns {Promise} 返回登录结果,包含token和用户信息 + * @example + * // 微信手机号登录 + * const result = await wxPhoneLogin({ + * code: 'wx_login_code', + * encryptedData: 'encrypted_phone_data', + * iv: 'initial_vector' + * }) + */ +export const wxPhoneLogin = (phoneData, config = {}) => { + return executeAuthRequest('/wechat/user/mini/phone-login', phoneData, 'PUBLIC_AUTH', AUTH_LOADING_TEXTS.PHONE_LOGIN, config) +} + /** * 更新用户手机号 * @description 通过微信手机号授权更新已登录用户的手机号,需要用户已登录 @@ -226,6 +274,45 @@ export const updatePhoneNumber = (phoneData, config = {}) => { return executeAuthRequest('/user/wechat/mini/phone-update', phoneData, 'AUTHENTICATED_SESSION', AUTH_LOADING_TEXTS.PHONE_VERIFY, config) } +/** + * 获取用户信息 + * @description 获取当前登录用户的详细信息 + * @param {Object} [config={}] 自定义请求配置 + * @returns {Promise} 返回用户信息 + * @example + * // 获取用户信息 + * const userInfo = await getUserInfo() + * + * @since 2.0.0 微信小程序用户信息接口 + */ +export const getUserInfo = (config = {}) => { + return executeAuthRequestWithMethod('GET', '/user/wechat/mini/userinfo', {}, 'AUTHENTICATED_SESSION', '获取用户信息中...', config) +} + +/** + * 更新用户信息 + * @description 更新当前登录用户的信息 + * @param {Object} userData 用户数据对象 + * @param {string} [userData.nickname] 用户昵称 + * @param {string} [userData.avatar] 用户头像URL + * @param {number} [userData.gender] 性别:0-未知,1-男,2-女 + * @param {string} [userData.city] 城市 + * @param {string} [userData.province] 省份 + * @param {string} [userData.country] 国家 + * @param {Object} [config={}] 自定义请求配置 + * @returns {Promise} 返回更新结果 + * @example + * // 更新用户昵称 + * const result = await updateUserInfo({ + * nickname: '新昵称' + * }) + * + * @since 2.0.0 微信小程序用户信息更新接口 + */ +export const updateUserInfo = (userData, config = {}) => { + return executeAuthRequestWithMethod('PUT', '/user/wechat/mini/userinfo', userData, 'AUTHENTICATED_SESSION', '更新用户信息中...', config) +} + // ==================== 用户注册相关API ==================== /** @@ -391,5 +478,6 @@ export const AUTH_CONFIG = { */ export const AUTH_UTILS = { createAuthConfig, - executeAuthRequest + executeAuthRequest, + executeAuthRequestWithMethod } diff --git a/http/api/profile.js b/http/api/profile.js index 441dc5a..b409175 100644 --- a/http/api/profile.js +++ b/http/api/profile.js @@ -230,6 +230,27 @@ export const getUserInfo = (config = {}) => { return executeGetRequest('/user/info', {}, 'AUTHENTICATED_QUERY_WITH_LOADING', config) } +/** + * 获取微信用户信息 + * @description 获取当前登录用户的微信相关信息,包括微信昵称、头像等 + * @param {Object} [config={}] 自定义请求配置 + * @param {Object} [config.custom] 自定义请求选项 + * @param {boolean} [config.custom.loading] 是否显示loading,默认false + * @param {boolean} [config.custom.toast] 是否显示错误提示,默认true + * @returns {Promise} 返回微信用户信息对象 + * @example + * // 基本用法 + * const wxUserInfo = await getWxUserInfo() + * + * // 自定义配置 + * const wxUserInfo = await getWxUserInfo({ + * custom: { loading: true } + * }) + */ +export const getWxUserInfo = (config = {}) => { + return executeGetRequest('/user/wechat/mini/userinfo', {}, 'AUTHENTICATED_QUERY', config) +} + /** * 更新用户基本信息 * @description 更新用户的基本信息,如昵称、头像、个人简介等 diff --git a/http/config/config.js b/http/config/config.js index aee9442..3b56225 100644 --- a/http/config/config.js +++ b/http/config/config.js @@ -65,7 +65,10 @@ export const NO_AUTH_APIS = [ * 这些接口在调用时如果未登录会自动跳转到登录页面 */ export const AUTH_REQUIRED_APIS = [ - + // 微信小程序用户相关接口 + '/user/wechat/mini/userinfo', // 获取用户信息 + '/user/wechat/mini/phone-update', // 更新手机号 + '/user/wechat/mini/check-unionid', // 检查UnionID ] /** diff --git a/http/config/request.js b/http/config/request.js index 81e7d65..f32a943 100644 --- a/http/config/request.js +++ b/http/config/request.js @@ -7,6 +7,8 @@ import { HTTP_CONFIG, checkApiAuth, AUTH_REQUIRED_APIS } from './config.js' * 清理认证数据 */ function clearAuthData() { + console.log('HTTP拦截器: 清理认证数据被调用') + console.trace('调用堆栈:') uni.removeStorageSync(HTTP_CONFIG.storageKeys.token) uni.removeStorageSync(HTTP_CONFIG.storageKeys.refreshToken) uni.removeStorageSync(HTTP_CONFIG.storageKeys.userInfo) @@ -188,8 +190,8 @@ export default (vm) => { // 统一的响应数据处理 if (data.code !== undefined) { - // 如果服务端返回的状态码不等于200,则reject() - if (data.code !== 200) { + // 如果服务端返回的状态码不等于0(成功),则reject() + if (data.code !== 0) { // 如果没有显式定义custom的toast参数为false的话,默认对报错进行toast弹出提示 if (custom?.toast !== false) { uni.$u.toast(data.message || '请求失败') diff --git a/pages/auth/phone-auth.vue b/pages/auth/phone-auth.vue index 7963ab2..0b26ceb 100644 --- a/pages/auth/phone-auth.vue +++ b/pages/auth/phone-auth.vue @@ -62,7 +62,7 @@