147 lines
3.7 KiB
JavaScript
147 lines
3.7 KiB
JavaScript
|
|
/**
|
|||
|
|
* 用户信息 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 setTokenGetter(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) {
|
|||
|
|
setTokenGetter(options.getToken)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 确定 API 基础路径
|
|||
|
|
const baseUrl = options.baseUrl || API_BASE.APP_MEMBER
|
|||
|
|
const apiUrl = `${baseUrl}/user/get`
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取用户信息
|
|||
|
|
* @returns {Promise<Object>} 用户信息对象
|
|||
|
|
*/
|
|||
|
|
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<Object>} 用户信息对象
|
|||
|
|
*/
|
|||
|
|
export async function getUserInfo(options = {}) {
|
|||
|
|
const { fetchUserInfo } = useUserInfo(options)
|
|||
|
|
return await fetchUserInfo()
|
|||
|
|
}
|
|||
|
|
|