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 { 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
|
||||||
|
|||||||
Reference in New Issue
Block a user