feat: 改造 user store(微信登录),新增 card store

- user store 增加 refreshToken 状态、wxLogin 微信登录(条件编译)、降级登录
- card store 封装年卡列表/详情/我的年卡/激活/绑定/入园码等状态和操作

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jacobxu666
2026-06-14 17:24:19 +08:00
co-authored by Claude Opus 4.8
parent ec045249ff
commit cdec6ef299
2 changed files with 101 additions and 4 deletions
+64
View File
@@ -0,0 +1,64 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
import * as cardApi from '../api/card'
import type { CardInfo, CardDetail, MyCard, ActivateParams, QrCodeInfo } from '../api/types'
export const useCardStore = defineStore('card', () => {
const cardList = ref<CardInfo[]>([])
const currentCard = ref<CardDetail | null>(null)
const myCards = ref<MyCard[]>([])
const loading = ref(false)
/** 获取年卡列表 */
async function fetchCardList(params?: { keyword?: string; category?: string }) {
loading.value = true
try {
cardList.value = await cardApi.getCardList(params)
} finally {
loading.value = false
}
}
/** 获取年卡详情 */
async function fetchCardDetail(id: string) {
loading.value = true
try {
currentCard.value = await cardApi.getCardDetail(id)
} finally {
loading.value = false
}
}
/** 获取我的年卡 */
async function fetchMyCards() {
myCards.value = await cardApi.getMyCards()
}
/** 激活年卡 */
async function activateCard(cardId: string, data: ActivateParams) {
return await cardApi.activateCard(cardId, data)
}
/** 绑定年卡 */
async function bindCard(cardNo: string) {
return await cardApi.bindCard(cardNo)
}
/** 获取入园码 */
async function getEntryQrCode(cardId: string): Promise<QrCodeInfo> {
return await cardApi.getEntryQrCode(cardId)
}
return {
cardList,
currentCard,
myCards,
loading,
fetchCardList,
fetchCardDetail,
fetchMyCards,
activateCard,
bindCard,
getEntryQrCode
}
})
+37 -4
View File
@@ -1,40 +1,73 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { ref, computed } from 'vue' import { ref, computed } from 'vue'
import { getToken, setToken, removeToken } from '../api/request' import { getToken, setToken, removeToken } from '../api/request'
import { getUserInfo, login as apiLogin, type UserInfo, type LoginParams } from '../api/user' import { wxLogin as apiWxLogin, login as apiLogin, getUserInfo as apiGetUserInfo } from '../api/user'
import type { UserInfo, LoginParams } from '../api/types'
import { TOKEN_KEY, REFRESH_TOKEN_KEY } from '../config'
export const useUserStore = defineStore('user', () => { export const useUserStore = defineStore('user', () => {
const token = ref<string>(getToken()) const token = ref<string>(getToken())
const refreshToken = ref<string>(uni.getStorageSync(REFRESH_TOKEN_KEY) || '')
const userInfo = ref<UserInfo | null>(null) const userInfo = ref<UserInfo | null>(null)
const isLogin = computed(() => !!token.value) const isLogin = computed(() => !!token.value)
/** 微信授权登录 */
async function wxLogin() {
// #ifdef MP-WEIXIN
const loginRes = await new Promise<UniApp.LoginRes>((resolve, reject) => {
uni.login({
provider: 'weixin',
success: resolve,
fail: reject
})
})
const result = await apiWxLogin(loginRes.code)
token.value = result.accessToken
refreshToken.value = result.refreshToken
setToken(result.accessToken)
uni.setStorageSync(REFRESH_TOKEN_KEY, result.refreshToken)
return result
// #endif
// #ifdef H5
throw new Error('H5 登录暂未开放,请在微信小程序中使用')
// #endif
}
/** 账号密码登录(降级方案) */
async function login(params: LoginParams) { async function login(params: LoginParams) {
const result = await apiLogin(params) const result = await apiLogin(params)
token.value = result.accessToken token.value = result.accessToken
refreshToken.value = result.refreshToken
setToken(result.accessToken) setToken(result.accessToken)
// 登录成功后获取用户信息 uni.setStorageSync(REFRESH_TOKEN_KEY, result.refreshToken)
await fetchUserInfo()
return result return result
} }
/** 获取用户信息 */
async function fetchUserInfo() { async function fetchUserInfo() {
if (!token.value) return if (!token.value) return
const info = await getUserInfo() const info = await apiGetUserInfo()
userInfo.value = info userInfo.value = info
return info return info
} }
/** 退出登录 */
function logout() { function logout() {
token.value = '' token.value = ''
refreshToken.value = ''
userInfo.value = null userInfo.value = null
removeToken() removeToken()
uni.removeStorageSync(REFRESH_TOKEN_KEY)
} }
return { return {
token, token,
refreshToken,
userInfo, userInfo,
isLogin, isLogin,
wxLogin,
login, login,
fetchUserInfo, fetchUserInfo,
logout logout