useAuth.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // 简单的 Auth composable:基于本地存储判断登录态与角色
  2. // 说明:按当前要求不向后端请求角色信息,直接读取 local storage 的 'token' 和 'role'
  3. // TODO: 如需更可靠的判断,可增加 fetchUserInfo() 调用后端并以服务器返回为准;还可加入 token 刷新逻辑
  4. import { ref } from 'vue'
  5. const tokenKey = 'token'
  6. const roleKey = 'role'
  7. export function isLoggedIn(): boolean {
  8. try {
  9. const t = uni.getStorageSync(tokenKey)
  10. return !!t
  11. } catch (err) {
  12. console.error('isLoggedIn: getStorageSync error', err)
  13. return false
  14. }
  15. }
  16. export function getRole(): number | null {
  17. try {
  18. const r = uni.getStorageSync(roleKey)
  19. const rn = typeof r === 'number' ? r : (r ? Number(r) : null)
  20. return Number.isFinite(rn) ? rn : null
  21. } catch (err) {
  22. console.error('getRole: getStorageSync error', err)
  23. return null
  24. }
  25. }
  26. export function roleToString(r: number | null): string {
  27. if (r === 2) return '医生'
  28. if (r === 3) return '患者'
  29. if (r === 4) return '患者家属'
  30. return r === null ? '' : String(r)
  31. }
  32. /**
  33. * 如果当前已登录且本地 role===3(患者),则切换到患者端健康页(tab 页面)。
  34. * 返回:true 表示已发起跳转,false 表示未跳转。
  35. */
  36. export function ensurePatientRedirect(): boolean {
  37. try {
  38. if (!isLoggedIn()) return false
  39. const r = getRole()
  40. if (r === 3) {
  41. // patient health 在 tabBar 中,使用 switchTab
  42. uni.switchTab({ url: '/pages/patient/health/index' })
  43. return true
  44. }
  45. return false
  46. } catch (err) {
  47. console.error('ensurePatientRedirect error', err)
  48. return false
  49. }
  50. }
  51. // 可选:导出 reactive 的状态以便组件订阅(当前未被使用,但保留以备扩展)
  52. export const authState = {
  53. logged: ref<boolean>(isLoggedIn()),
  54. role: ref<number | null>(getRole())
  55. }