/** * 用户信息 Hook * 封装获取用户信息的逻辑,可在各个应用中复用 * * 使用方式: * import { useUserInfo } from '@gold/hooks/web/useUserInfo' * * const { fetchUserInfo, loading, error } = useUserInfo() * await fetchUserInfo() */ import { ref } from 'vue' import axios from 'axios' import { API_BASE } from '@gold/config/api' // 获取 token 的工具函数(需要从应用层传入或使用全局配置) let getTokenFn = null /** * 设置获取 token 的函数 * @param {Function} fn - 获取 token 的函数 */ export function setTokensGetter(fn) { getTokenFn = fn } /** * 获取 Authorization Header * @returns {string} */ function getAuthHeader() { if (getTokenFn) { const token = getTokenFn() return token ? `Bearer ${token}` : '' } // 如果没有设置 token getter,尝试从常见位置获取 try { // 尝试从 sessionStorage 获取 const manualToken = sessionStorage.getItem('DEV_MANUAL_TOKEN') if (manualToken) { return `Bearer ${manualToken}` } } catch (e) { // 忽略错误 } return '' } /** * 用户信息 Hook * @param {Object} options - 配置选项 * @param {string} options.baseUrl - API 基础 URL(可选,默认使用 APP_MEMBER) * @param {Function} options.getToken - 获取 token 的函数(可选) * @returns {Object} { fetchUserInfo, loading, error, userInfo } */ export function useUserInfo(options = {}) { const loading = ref(false) const error = ref(null) const userInfo = ref(null) // 如果传入了 getToken 函数,设置它 if (options.getToken) { setTokensGetter(options.getToken) } // 确定 API 基础路径 const baseUrl = options.baseUrl || API_BASE.APP_MEMBER const apiUrl = `${baseUrl}/user/get` /** * 获取用户信息 * @returns {Promise} 用户信息对象 */ async function fetchUserInfo() { loading.value = true error.value = null try { const authHeader = getAuthHeader() const headers = { 'Content-Type': 'application/json', } if (authHeader) { headers.Authorization = authHeader } // 获取 tenant-id(从环境变量或默认值) const tenantId = (typeof import.meta !== 'undefined' && import.meta.env?.VITE_TENANT_ID) || (typeof process !== 'undefined' && process.env?.VITE_TENANT_ID) || '1' if (tenantId) { headers['tenant-id'] = tenantId } const response = await axios.get(apiUrl, { headers }) // 处理响应数据(根据后端返回格式调整) // 后端通常返回 { code: 0, data: {...}, msg: '...' } 格式 let data = null if (response.data) { // 如果响应有 code 字段,说明是标准格式 if (typeof response.data.code === 'number') { // code 为 0 或 200 表示成功 if (response.data.code === 0 || response.data.code === 200) { data = response.data.data || response.data } } else { // 没有 code 字段,直接使用 data data = response.data.data || response.data } } if (data) { userInfo.value = data return data } } catch (err) { error.value = err console.error('获取用户信息失败:', err) throw err } finally { loading.value = false } } return { fetchUserInfo, loading, error, userInfo, } } /** * 便捷函数:直接获取用户信息(不返回响应式状态) * @param {Object} options - 配置选项 * @returns {Promise} 用户信息对象 */ export async function getUserInfo(options = {}) { // 如果传入了 getToken 函数,设置到全局 if (options.getToken) { setTokensGetter(options.getToken) } const { fetchUserInfo } = useUserInfo(options) return await fetchUserInfo() }