user.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import { defineStore } from 'pinia'
  2. import { ref, computed } from 'vue'
  3. import { userApi } from '@/api/user'
  4. export const useUserStore = defineStore('user', () => {
  5. // 状态
  6. const userInfo = ref(uni.getStorageSync('userInfo') || null)
  7. const loginPopupVisible = ref(false)
  8. // 计算属性
  9. const isLoggedIn = computed(() => !!userInfo.value?.openid)
  10. const userId = computed(() => userInfo.value?.userId)
  11. const userName = computed(() => userInfo.value?.username)
  12. // 方法
  13. const showLoginPopup = () => {
  14. loginPopupVisible.value = true
  15. }
  16. const hideLoginPopup = () => {
  17. loginPopupVisible.value = false
  18. }
  19. const setUserInfo = (info) => {
  20. userInfo.value = info
  21. uni.setStorageSync('userInfo', info)
  22. }
  23. const clearUserInfo = () => {
  24. userInfo.value = null
  25. uni.removeStorageSync('userInfo')
  26. }
  27. // 登录方法
  28. const wechatLogin = async (code) => {
  29. console.log('wechatLogin', code)
  30. try {
  31. const data = await userApi.login({ code })
  32. setUserInfo(data)
  33. return data
  34. } catch (error) {
  35. console.error('微信登录失败:', error)
  36. throw error
  37. }
  38. }
  39. const accountLogin = async (username, password) => {
  40. try {
  41. const data = await userApi.mobileLogin({ username, password })
  42. setUserInfo(data)
  43. return data
  44. } catch (error) {
  45. console.error('账号登录失败:', error)
  46. throw error
  47. }
  48. }
  49. // H5手动登录 - 跳转到H5登录页面
  50. const showH5Login = async () => {
  51. console.log('🔐 获取微信授权码并跳转到H5登录页面')
  52. try {
  53. // 获取微信授权码
  54. const loginRes = await uni.login({
  55. provider: 'weixin'
  56. })
  57. console.log('获取到微信授权码:', loginRes.code)
  58. // 跳转到H5登录页面,传递wechatCode
  59. uni.navigateTo({
  60. url: `/pages/common/webview?dest=login&title=登录&wechatCode=${loginRes.code}`
  61. })
  62. } catch (error) {
  63. console.error('获取微信授权码失败:', error)
  64. // 降级处理:不传wechatCode
  65. uni.navigateTo({
  66. url: '/pages/common/webview?dest=login&title=登录'
  67. })
  68. }
  69. }
  70. // H5自动登录 - 跳转到H5自动登录页面
  71. const showH5AutoLogin = () => {
  72. console.log('🔄 跳转到H5自动登录页面')
  73. // 获取yhsbToken,有token就自动登录,没有就手动登录
  74. const userInfo = uni.getStorageSync('userInfo') || {}
  75. const yhsbToken = userInfo.yhsbToken
  76. if (yhsbToken) {
  77. uni.navigateTo({
  78. url: `/pages/common/webview?dest=autoLogin&title=自动登录&yhsbToken=${yhsbToken}`
  79. })
  80. } else {
  81. console.log('⚠️ 未找到yhsbToken,跳转手动登录')
  82. showH5Login()
  83. }
  84. }
  85. // 登出
  86. const logout = () => {
  87. clearUserInfo()
  88. uni.reLaunch({
  89. url: '/pages/parent/index'
  90. })
  91. }
  92. return {
  93. // 状态
  94. userInfo,
  95. loginPopupVisible,
  96. // 计算属性
  97. isLoggedIn,
  98. userId,
  99. userName,
  100. // 方法
  101. showLoginPopup,
  102. hideLoginPopup,
  103. setUserInfo,
  104. clearUserInfo,
  105. wechatLogin,
  106. accountLogin,
  107. // H5登录方法
  108. showH5Login,
  109. showH5AutoLogin,
  110. logout
  111. }
  112. })