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:
co-authored by
Claude Opus 4.8
parent
ec045249ff
commit
cdec6ef299
@@ -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
@@ -1,40 +1,73 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, computed } from 'vue'
|
||||
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', () => {
|
||||
const token = ref<string>(getToken())
|
||||
const refreshToken = ref<string>(uni.getStorageSync(REFRESH_TOKEN_KEY) || '')
|
||||
const userInfo = ref<UserInfo | null>(null)
|
||||
|
||||
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) {
|
||||
const result = await apiLogin(params)
|
||||
token.value = result.accessToken
|
||||
refreshToken.value = result.refreshToken
|
||||
setToken(result.accessToken)
|
||||
// 登录成功后获取用户信息
|
||||
await fetchUserInfo()
|
||||
uni.setStorageSync(REFRESH_TOKEN_KEY, result.refreshToken)
|
||||
return result
|
||||
}
|
||||
|
||||
/** 获取用户信息 */
|
||||
async function fetchUserInfo() {
|
||||
if (!token.value) return
|
||||
const info = await getUserInfo()
|
||||
const info = await apiGetUserInfo()
|
||||
userInfo.value = info
|
||||
return info
|
||||
}
|
||||
|
||||
/** 退出登录 */
|
||||
function logout() {
|
||||
token.value = ''
|
||||
refreshToken.value = ''
|
||||
userInfo.value = null
|
||||
removeToken()
|
||||
uni.removeStorageSync(REFRESH_TOKEN_KEY)
|
||||
}
|
||||
|
||||
return {
|
||||
token,
|
||||
refreshToken,
|
||||
userInfo,
|
||||
isLogin,
|
||||
wxLogin,
|
||||
login,
|
||||
fetchUserInfo,
|
||||
logout
|
||||
|
||||
Reference in New Issue
Block a user