You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pyx_gitkeshe/src/store/index.js

370 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { createStore } from 'vuex'
import service from '../utils/request'
export default createStore({
state: {
user: JSON.parse(sessionStorage.getItem('user')) || null,
balance: JSON.parse(sessionStorage.getItem('balance')) || 0,
vipLevel: JSON.parse(sessionStorage.getItem('vipLevel')) || 0,
borrowedBooks: JSON.parse(sessionStorage.getItem('borrowedBooks')) || [],
sessionInitialized: false
},
getters: {
isAuthenticated: state => !!state.user,
isAdmin: state => state.user?.admin || false
},
mutations: {
setUser(state, user) {
const admin = user.admin === 1;
const userData = {
...user,
admin
};
state.user = user
console.log("user")
console.log(user)
console.log("state.user")
console.log(state.user)
sessionStorage.setItem('user', JSON.stringify(user))
},
setBalanceAndVip(state, { balance, vip }) {
state.balance = balance
state.vipLevel = vip
sessionStorage.setItem('balance', JSON.stringify(balance))
sessionStorage.setItem('vipLevel', JSON.stringify(vip))
},
setBorrowedBooks(state, books) {
state.borrowedBooks = books
sessionStorage.setItem('borrowedBooks', JSON.stringify(books))
},
clearUser(state) {
state.user = null
state.balance = 0
state.vipLevel = 0
state.borrowedBooks = []
sessionStorage.removeItem('user')
sessionStorage.removeItem('balance')
sessionStorage.removeItem('vipLevel')
sessionStorage.removeItem('borrowedBooks')
},
removeBorrowedBook(state, title) {
state.borrowedBooks = state.borrowedBooks.filter(book => book.title !== title)
},
setSessionInitialized(state, value) {
state.sessionInitialized = value
}
},
actions: {
async initSession({ commit, dispatch }) {
try {
// 静默获取用户信息
const userData = await service.get('/user/getinfo', {
silent: true // 避免未登录时显示错误
})
if (userData && userData.username) {
const admin = userData.admin === 1;
commit('setUser', {
username: userData.username,
pic: userData.pic || '',
admin
})
// 获取关联信息
try {
await dispatch('fetchBalanceAndVip')
} catch (balanceError) {
console.warn('获取余额信息失败:', balanceError)
}
try {
await dispatch('fetchBorrowedBooks')
} catch (booksError) {
console.warn('获取借阅书籍失败:', booksError)
}
}
} catch (error) {
console.log('未检测到有效会话,用户需要重新登录')
// 清除可能存在的无效数据
commit('clearUser')
} finally {
commit('setSessionInitialized', true)
}
},
// 用户登录
async login({ dispatch }, { username, password }) {
const response = await service.post('/user/login',
`username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`,
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
)
// 登录成功后获取用户信息
const userInfo = await dispatch('fetchUser')
return {
...response.data,
user: userInfo
}
},
// 用户注册
async register(_, { username, password }) {
const response = await service.post('/user/register',
`username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`,
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
)
return response.data
},
// 获取当前用户信息 - 符合接口文档
async fetchUser({ commit, dispatch }) {
try {
const response = await service.get('/user/getinfo')
const userData = response.data
console.log("fetchUer userData")
console.log(userData)
const admin = userData.admin === 1;
// 用户信息接口直接返回用户对象
commit('setUser', {
username: userData.username || '',
pic: userData.pic || '',
admin
})
// 获取关联信息
try {
await dispatch('fetchBalanceAndVip')
} catch (balanceError) {
console.error('获取余额信息失败:', balanceError)
}
try {
await dispatch('fetchBorrowedBooks')
} catch (booksError) {
console.error('获取借阅书籍失败:', booksError)
}
return userData
} catch (error) {
commit('clearUser')
throw error
}
},
// 获取余额和VIP等级 - 符合接口文档1.5
async fetchBalanceAndVip({ commit }) {
try {
const response = await service.post('/user/findmoney')
const resData = response.data || {}
if (resData.code === 200) {
console.log("fetchBalanceAndVip resData")
console.log(resData)
const balance = resData.data.balance
const vip = resData.data.vip
// const message = resData.message || ''
// // 使用正则表达式解析余额和VIP等级
// const balanceMatch = message.match(/余额为:(\d+\.?\d*)元/)
// const vipMatch = message.match(/当前VIP等级为(\d+)/)
console.log("balance:"+balance+",vip:"+vip)
if (balance && vip) {
commit('setBalanceAndVip', { balance, vip })
} else {
console.warn('无法解析余额或VIP信息:', message)
commit('setBalanceAndVip', { balance: 0, vip: 0 })
}
} else {
throw new Error(resData.message || '获取余额信息失败')
}
return resData
} catch (error) {
console.error('获取余额失败:', error)
// 不抛出错误,避免影响其他功能
return { code: 500, message: '获取余额失败' }
}
},
// 账户充值
async recharge({ dispatch }, { money }) { // 添加 { dispatch } 解构
const response = await service.post('/user/recharge',
`money=${money}`,
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
)
// 充值后刷新余额
await dispatch('fetchBalanceAndVip')
return response.data
},
// 退出登录
async logout({ commit }) {
commit('clearUser')
return { code: 200, message: '已退出登录' }
},
// 查询个人借书记录
async fetchBorrowRecords() {
const response = await service.get('/user/findone')
return response.data
},
// 获取当前用户已借书籍
async fetchBorrowedBooks({ commit }) {
const response = await service.get('/user/borrow/books')
// 按照接口文档处理响应
if (response.data.code === 200) {
commit('setBorrowedBooks', response.data.data || [])
} else {
throw new Error(response.data.message || '获取已借书籍失败')
}
return response.data
},
// 租借书籍
async borrowBook({ dispatch }, { title }) {
const response = await service.post('/borrow/borrowbook',
`title=${encodeURIComponent(title)}`,
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
)
// 借书后刷新用户信息
await dispatch('fetchUser')
return response.data
},
// 归还书籍 - 符合接口文档3.2
async returnBook({ dispatch }, { title }) {
try {
const response = await service.post('/borrow/returnbook',
`title=${encodeURIComponent(title)}`,
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
)
// 还书成功后刷新借阅书籍列表
await dispatch('fetchBorrowedBooks')
return response.data
} catch (error) {
console.error('还书失败:', error)
throw error
}
},
// 查询全部书籍 - 符合接口文档
async fetchBooks(_, params = {}) {
const config = {
params: {
page: params.page || 1,
pageSize: params.pageSize || 10,
title: params.keyword || ''
}
}
const response = await service.get('/api/select', config)
const countResponse = await service.get('/api/countArticle')
// console.log('请求书籍:', params.title)
// console.log('API响应:', response)
// 处理不同响应格式
let list = []
let total = countResponse.data.data
if (Array.isArray(response)) {
list = response
// total = response.length
} else if (Array.isArray(response.data)) {
list = response.data
// total = response.data.length
} else if (response.data && Array.isArray(response.data.data)) {
list = response.data.data
// total = response.data.total || response.data.data.length
} else if (response.data && Array.isArray(response.data.list)) {
list = response.data.list
// total = response.data.total || response.data.list.length
}
return {
data: {
list,
total
}
}
},
// 根据书名查单本书 - 符合接口文档2.3
async fetchBookByTitle(_, payload) {
const { title } = payload;
try {
const response = await service.get('/api/selectone', {
params: { title }
})
// 根据接口文档处理响应
if (response.data && response.data.code === 200) {
return { data: response.data.data }
} else {
throw new Error(response.data?.message || '获取书籍信息失败')
}
} catch (error) {
console.error('API请求失败:', error)
throw error
}
},
async fetchBookById(_, payload) {
const { id } = payload;
try {
const response = await service.get('/api/selectById/'+id)
// 根据接口文档处理响应
if (response.data && response.data.code === 200) {
return { data: response.data.data }
} else {
throw new Error(response.data?.message || '获取书籍信息失败')
}
} catch (error) {
console.error('API请求失败:', error)
throw error
}
},
// 新增书籍
async addBook(_, bookData) {
const response = await service.post('/api/add', bookData, {
headers: { 'Content-Type': 'application/json' }
})
return response.data
},
// 管理员删除书籍
async deleteBook(_, { title }) {
const response = await service.post('/user/delete',
`title=${encodeURIComponent(title)}`,
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
)
return response.data
},
// 本周热租榜 - 符合接口文档
async fetchWeeklyRank() {
const response = await service.get('/api/rank/weekly')
return { data: Array.isArray(response) ? response : response.data || [] }
},
// 本月热租榜 - 符合接口文档
async fetchMonthlyRank() {
const response = await service.get('/api/rank/monthly')
return { data: Array.isArray(response) ? response : response.data || [] }
}
}
})