|
|
|
@ -6,7 +6,8 @@ export default createStore({
|
|
|
|
|
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')) || []
|
|
|
|
|
borrowedBooks: JSON.parse(sessionStorage.getItem('borrowedBooks')) || [],
|
|
|
|
|
sessionInitialized: false
|
|
|
|
|
},
|
|
|
|
|
getters: {
|
|
|
|
|
isAuthenticated: state => !!state.user,
|
|
|
|
@ -14,6 +15,12 @@ export default createStore({
|
|
|
|
|
},
|
|
|
|
|
mutations: {
|
|
|
|
|
setUser(state, user) {
|
|
|
|
|
const admin = user.admin === 1;
|
|
|
|
|
const userData = {
|
|
|
|
|
...user,
|
|
|
|
|
admin
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
state.user = user
|
|
|
|
|
sessionStorage.setItem('user', JSON.stringify(user))
|
|
|
|
|
},
|
|
|
|
@ -53,18 +60,31 @@ export default createStore({
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (userData && userData.username) {
|
|
|
|
|
const admin = userData.admin === 1;
|
|
|
|
|
|
|
|
|
|
commit('setUser', {
|
|
|
|
|
username: userData.username,
|
|
|
|
|
pic: userData.pic || '',
|
|
|
|
|
admin: userData.admin || false
|
|
|
|
|
admin
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 获取关联信息
|
|
|
|
|
await dispatch('fetchBalanceAndVip')
|
|
|
|
|
await dispatch('fetchBorrowedBooks')
|
|
|
|
|
try {
|
|
|
|
|
await dispatch('fetchBalanceAndVip')
|
|
|
|
|
} catch (balanceError) {
|
|
|
|
|
console.warn('获取余额信息失败:', balanceError)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
await dispatch('fetchBorrowedBooks')
|
|
|
|
|
} catch (booksError) {
|
|
|
|
|
console.warn('获取借阅书籍失败:', booksError)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log('未检测到有效会话')
|
|
|
|
|
console.log('未检测到有效会话,用户需要重新登录')
|
|
|
|
|
// 清除可能存在的无效数据
|
|
|
|
|
commit('clearUser')
|
|
|
|
|
} finally {
|
|
|
|
|
commit('setSessionInitialized', true)
|
|
|
|
|
}
|
|
|
|
@ -100,12 +120,12 @@ export default createStore({
|
|
|
|
|
async fetchUser({ commit, dispatch }) {
|
|
|
|
|
try {
|
|
|
|
|
const userData = await service.get('/user/getinfo')
|
|
|
|
|
|
|
|
|
|
const admin = userData.admin === 1;
|
|
|
|
|
// 用户信息接口直接返回用户对象
|
|
|
|
|
commit('setUser', {
|
|
|
|
|
username: userData.username || '',
|
|
|
|
|
pic: userData.pic || '',
|
|
|
|
|
admin: userData.admin || false
|
|
|
|
|
admin
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 获取关联信息
|
|
|
|
@ -128,40 +148,37 @@ export default createStore({
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 获取余额和VIP等级
|
|
|
|
|
|
|
|
|
|
async fetchBalanceAndVip({ commit }) {
|
|
|
|
|
try {
|
|
|
|
|
const response = await service.post('/user/findmoney')
|
|
|
|
|
const resData = response.data || {}
|
|
|
|
|
|
|
|
|
|
// 正确解析响应数据
|
|
|
|
|
if (resData.code === 200) {
|
|
|
|
|
const message = resData.message || ''
|
|
|
|
|
const balanceMatch = message.match(/余额为:(\d+\.\d+)元/)
|
|
|
|
|
const vipMatch = message.match(/当前VIP等级为:(\d+)/)
|
|
|
|
|
|
|
|
|
|
if (balanceMatch && vipMatch) {
|
|
|
|
|
commit('setBalanceAndVip', {
|
|
|
|
|
balance: parseFloat(balanceMatch[1]),
|
|
|
|
|
vip: parseInt(vipMatch[1])
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
// 尝试从其他字段获取
|
|
|
|
|
const balance = parseFloat(resData.balance) || 0
|
|
|
|
|
const vip = parseInt(resData.vipLevel) || 0
|
|
|
|
|
commit('setBalanceAndVip', { balance, vip })
|
|
|
|
|
// 获取余额和VIP等级 - 符合接口文档1.5
|
|
|
|
|
async fetchBalanceAndVip({ commit }) {
|
|
|
|
|
try {
|
|
|
|
|
const response = await service.post('/user/findmoney')
|
|
|
|
|
const resData = response.data || {}
|
|
|
|
|
|
|
|
|
|
if (resData.code === 200) {
|
|
|
|
|
const message = resData.message || ''
|
|
|
|
|
// 使用正则表达式解析余额和VIP等级
|
|
|
|
|
const balanceMatch = message.match(/余额为:(\d+\.?\d*)元/)
|
|
|
|
|
const vipMatch = message.match(/当前VIP等级为:(\d+)/)
|
|
|
|
|
|
|
|
|
|
if (balanceMatch && vipMatch) {
|
|
|
|
|
const balance = parseFloat(balanceMatch[1])
|
|
|
|
|
const vip = parseInt(vipMatch[1])
|
|
|
|
|
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: '获取余额失败' }
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
throw new Error(resData.message || '获取余额信息失败')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return resData
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('获取余额失败:', error)
|
|
|
|
|
throw error
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 账户充值
|
|
|
|
@ -214,16 +231,22 @@ async borrowBook({ dispatch }, { title }) {
|
|
|
|
|
return response.data
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 归还书籍
|
|
|
|
|
// 归还书籍 - 符合接口文档3.2
|
|
|
|
|
async returnBook({ dispatch }, { title }) {
|
|
|
|
|
const response = await service.post('/borrow/returnbook',
|
|
|
|
|
`title=${encodeURIComponent(title)}`,
|
|
|
|
|
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// 还书后刷新用户信息
|
|
|
|
|
await dispatch('fetchUser')
|
|
|
|
|
return response.data
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 查询全部书籍 - 符合接口文档
|
|
|
|
@ -265,26 +288,26 @@ async returnBook({ dispatch }, { title }) {
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 根据书名查单本书 - 符合接口文档
|
|
|
|
|
// 根据书名查单本书 - 符合接口文档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
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
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 addBook(_, bookData) {
|
|
|
|
|