|
|
|
@ -1,13 +1,12 @@
|
|
|
|
|
import { createStore } from 'vuex'
|
|
|
|
|
import service from '../utils/request'
|
|
|
|
|
import { safeGetItem, safeSetItem, safeRemoveItem } from '../utils/storage'
|
|
|
|
|
import service from '../utils/request'
|
|
|
|
|
|
|
|
|
|
export default createStore({
|
|
|
|
|
state: {
|
|
|
|
|
user: safeGetItem('user', null),
|
|
|
|
|
balance: safeGetItem('balance', 0),
|
|
|
|
|
vipLevel: safeGetItem('vipLevel', 0),
|
|
|
|
|
borrowedBooks: safeGetItem('borrowedBooks', []),
|
|
|
|
|
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: {
|
|
|
|
@ -15,115 +14,71 @@ export default createStore({
|
|
|
|
|
isAdmin: state => state.user?.admin || false
|
|
|
|
|
},
|
|
|
|
|
mutations: {
|
|
|
|
|
setUser(state, user) {
|
|
|
|
|
const admin = user.admin === 1;
|
|
|
|
|
const userData = {
|
|
|
|
|
...user,
|
|
|
|
|
admin
|
|
|
|
|
};
|
|
|
|
|
setUser(state, user) {
|
|
|
|
|
const admin = user.admin === 1;
|
|
|
|
|
const userData = {
|
|
|
|
|
...user,
|
|
|
|
|
admin
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
state.user = userData
|
|
|
|
|
safeSetItem('user', userData)
|
|
|
|
|
state.user = user
|
|
|
|
|
sessionStorage.setItem('user', JSON.stringify(user))
|
|
|
|
|
},
|
|
|
|
|
setBalanceAndVip(state, { balance, vip }) {
|
|
|
|
|
state.balance = balance
|
|
|
|
|
state.vipLevel = vip
|
|
|
|
|
safeSetItem('balance', balance)
|
|
|
|
|
safeSetItem('vipLevel', vip)
|
|
|
|
|
sessionStorage.setItem('balance', JSON.stringify(balance))
|
|
|
|
|
sessionStorage.setItem('vipLevel', JSON.stringify(vip))
|
|
|
|
|
},
|
|
|
|
|
setBorrowedBooks(state, books) {
|
|
|
|
|
state.borrowedBooks = books
|
|
|
|
|
safeSetItem('borrowedBooks', books)
|
|
|
|
|
sessionStorage.setItem('borrowedBooks', JSON.stringify(books))
|
|
|
|
|
},
|
|
|
|
|
clearUser(state) {
|
|
|
|
|
state.user = null
|
|
|
|
|
state.balance = 0
|
|
|
|
|
state.vipLevel = 0
|
|
|
|
|
state.borrowedBooks = []
|
|
|
|
|
safeRemoveItem('user')
|
|
|
|
|
safeRemoveItem('balance')
|
|
|
|
|
safeRemoveItem('vipLevel')
|
|
|
|
|
safeRemoveItem('borrowedBooks')
|
|
|
|
|
// 不清除sessionInitialized,保持应用状态
|
|
|
|
|
sessionStorage.removeItem('user')
|
|
|
|
|
sessionStorage.removeItem('balance')
|
|
|
|
|
sessionStorage.removeItem('vipLevel')
|
|
|
|
|
sessionStorage.removeItem('borrowedBooks')
|
|
|
|
|
},
|
|
|
|
|
removeBorrowedBook(state, title) {
|
|
|
|
|
state.borrowedBooks = state.borrowedBooks.filter(book => book.title !== title)
|
|
|
|
|
safeSetItem('borrowedBooks', state.borrowedBooks)
|
|
|
|
|
},
|
|
|
|
|
setSessionInitialized(state, value) {
|
|
|
|
|
state.sessionInitialized = value
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
actions: {
|
|
|
|
|
async initSession({ commit, dispatch, state }) {
|
|
|
|
|
async initSession({ commit, dispatch }) {
|
|
|
|
|
try {
|
|
|
|
|
// 首先检查本地是否有保存的用户信息
|
|
|
|
|
const savedUser = safeGetItem('user', null)
|
|
|
|
|
if (savedUser) {
|
|
|
|
|
// 静默获取用户信息
|
|
|
|
|
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 {
|
|
|
|
|
const userData = savedUser
|
|
|
|
|
if (userData && userData.username) {
|
|
|
|
|
// 验证服务器端会话是否仍然有效
|
|
|
|
|
const response = await service.get('/user/getinfo', {
|
|
|
|
|
silent: true // 避免未登录时显示错误
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (response.data && response.data.username) {
|
|
|
|
|
// 服务器会话有效,更新用户信息
|
|
|
|
|
const admin = response.data.admin === 1;
|
|
|
|
|
commit('setUser', {
|
|
|
|
|
username: response.data.username,
|
|
|
|
|
pic: response.data.pic || '',
|
|
|
|
|
admin
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 获取关联信息
|
|
|
|
|
try {
|
|
|
|
|
await dispatch('fetchBalanceAndVip')
|
|
|
|
|
} catch (balanceError) {
|
|
|
|
|
console.warn('获取余额信息失败:', balanceError)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
await dispatch('fetchBorrowedBooks')
|
|
|
|
|
} catch (booksError) {
|
|
|
|
|
console.warn('获取借阅书籍失败:', booksError)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 服务器会话无效,清除本地数据
|
|
|
|
|
commit('clearUser')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (parseError) {
|
|
|
|
|
console.error('解析保存的用户信息失败:', parseError)
|
|
|
|
|
commit('clearUser')
|
|
|
|
|
await dispatch('fetchBalanceAndVip')
|
|
|
|
|
} catch (balanceError) {
|
|
|
|
|
console.warn('获取余额信息失败:', balanceError)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 没有保存的用户信息,尝试静默获取
|
|
|
|
|
const response = await service.get('/user/getinfo', {
|
|
|
|
|
silent: true
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (response.data && response.data.username) {
|
|
|
|
|
const admin = response.data.admin === 1;
|
|
|
|
|
commit('setUser', {
|
|
|
|
|
username: response.data.username,
|
|
|
|
|
pic: response.data.pic || '',
|
|
|
|
|
admin
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 获取关联信息
|
|
|
|
|
try {
|
|
|
|
|
await dispatch('fetchBalanceAndVip')
|
|
|
|
|
} catch (balanceError) {
|
|
|
|
|
console.warn('获取余额信息失败:', balanceError)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
await dispatch('fetchBorrowedBooks')
|
|
|
|
|
} catch (booksError) {
|
|
|
|
|
console.warn('获取借阅书籍失败:', booksError)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
await dispatch('fetchBorrowedBooks')
|
|
|
|
|
} catch (booksError) {
|
|
|
|
|
console.warn('获取借阅书籍失败:', booksError)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
@ -161,37 +116,32 @@ export default createStore({
|
|
|
|
|
return response.data
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 获取当前用户信息 - 符合接口文档1.3
|
|
|
|
|
// 获取当前用户信息 - 符合接口文档
|
|
|
|
|
async fetchUser({ commit, dispatch }) {
|
|
|
|
|
try {
|
|
|
|
|
const response = await service.get('/user/getinfo')
|
|
|
|
|
const userData = await service.get('/user/getinfo')
|
|
|
|
|
const admin = userData.admin === 1;
|
|
|
|
|
// 用户信息接口直接返回用户对象
|
|
|
|
|
commit('setUser', {
|
|
|
|
|
username: userData.username || '',
|
|
|
|
|
pic: userData.pic || '',
|
|
|
|
|
admin
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 根据接口文档1.3,直接返回用户对象
|
|
|
|
|
if (response.data && response.data.username) {
|
|
|
|
|
const admin = response.data.admin === 1;
|
|
|
|
|
commit('setUser', {
|
|
|
|
|
username: response.data.username || '',
|
|
|
|
|
pic: response.data.pic || '',
|
|
|
|
|
admin
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 获取关联信息
|
|
|
|
|
try {
|
|
|
|
|
await dispatch('fetchBalanceAndVip')
|
|
|
|
|
} catch (balanceError) {
|
|
|
|
|
console.error('获取余额信息失败:', balanceError)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
await dispatch('fetchBorrowedBooks')
|
|
|
|
|
} catch (booksError) {
|
|
|
|
|
console.error('获取借阅书籍失败:', booksError)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return response.data
|
|
|
|
|
} else {
|
|
|
|
|
throw new Error('获取用户信息失败')
|
|
|
|
|
}
|
|
|
|
|
// 获取关联信息
|
|
|
|
|
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
|
|
|
|
@ -249,45 +199,37 @@ export default createStore({
|
|
|
|
|
return { code: 200, message: '已退出登录' }
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 查询个人借书记录 - 符合接口文档1.6
|
|
|
|
|
// 查询个人借书记录
|
|
|
|
|
async fetchBorrowRecords() {
|
|
|
|
|
const response = await service.get('/user/findone')
|
|
|
|
|
return response.data
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 获取当前用户已借书籍 - 符合接口文档2.5
|
|
|
|
|
// 获取当前用户已借书籍
|
|
|
|
|
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
|
|
|
|
|
},
|
|
|
|
|
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
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 租借书籍 - 符合接口文档3.1
|
|
|
|
|
async borrowBook({ dispatch }, { title }) {
|
|
|
|
|
const response = await service.post('/borrow/borrowbook',
|
|
|
|
|
`title=${encodeURIComponent(title)}`,
|
|
|
|
|
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// 根据接口文档3.1,检查响应
|
|
|
|
|
if (response.data && response.data.code === 200) {
|
|
|
|
|
// 借书后刷新用户信息
|
|
|
|
|
await dispatch('fetchUser')
|
|
|
|
|
return response.data
|
|
|
|
|
} else if (response.data && response.data.code === 1) {
|
|
|
|
|
throw new Error(response.data.message || '借书失败')
|
|
|
|
|
} else {
|
|
|
|
|
throw new Error('借书失败')
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// 租借书籍
|
|
|
|
|
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 }) {
|
|
|
|
@ -297,23 +239,16 @@ async returnBook({ dispatch }, { title }) {
|
|
|
|
|
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// 根据接口文档3.2,检查响应
|
|
|
|
|
if (response.data && response.data.code === 200) {
|
|
|
|
|
// 还书成功后刷新借阅书籍列表
|
|
|
|
|
await dispatch('fetchBorrowedBooks')
|
|
|
|
|
return response.data
|
|
|
|
|
} else if (response.data && response.data.code === 1) {
|
|
|
|
|
throw new Error(response.data.message || '还书失败')
|
|
|
|
|
} else {
|
|
|
|
|
throw new Error('还书失败')
|
|
|
|
|
}
|
|
|
|
|
// 还书成功后刷新借阅书籍列表
|
|
|
|
|
await dispatch('fetchBorrowedBooks')
|
|
|
|
|
|
|
|
|
|
return response.data
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('还书失败:', error)
|
|
|
|
|
throw error
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 查询全部书籍 - 符合接口文档
|
|
|
|
|
async fetchBooks(_, params = {}) {
|
|
|
|
|
const config = {
|
|
|
|
@ -362,11 +297,11 @@ async returnBook({ dispatch }, { title }) {
|
|
|
|
|
params: { title }
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 根据接口文档2.3,返回单条对象
|
|
|
|
|
if (response.data && response.data.title) {
|
|
|
|
|
return { data: response.data }
|
|
|
|
|
// 根据接口文档处理响应
|
|
|
|
|
if (response.data && response.data.code === 200) {
|
|
|
|
|
return { data: response.data.data }
|
|
|
|
|
} else {
|
|
|
|
|
throw new Error('获取书籍信息失败')
|
|
|
|
|
throw new Error(response.data?.message || '获取书籍信息失败')
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('API请求失败:', error)
|
|
|
|
@ -374,66 +309,35 @@ async returnBook({ dispatch }, { title }) {
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 新增书籍 - 符合接口文档2.1
|
|
|
|
|
// 新增书籍
|
|
|
|
|
async addBook(_, bookData) {
|
|
|
|
|
const response = await service.post('/api/add', bookData, {
|
|
|
|
|
headers: { 'Content-Type': 'application/json' }
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 根据接口文档2.1,成功返回整本书信息
|
|
|
|
|
if (response.data && response.data.code === 200) {
|
|
|
|
|
return response.data
|
|
|
|
|
} else if (response.data && response.data.code === 1) {
|
|
|
|
|
throw new Error(response.data.message || '添加书籍失败')
|
|
|
|
|
} else {
|
|
|
|
|
throw new Error('添加书籍失败')
|
|
|
|
|
}
|
|
|
|
|
return response.data
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 管理员删除书籍 - 符合接口文档2.4
|
|
|
|
|
// 管理员删除书籍
|
|
|
|
|
async deleteBook(_, { title }) {
|
|
|
|
|
const response = await service.post('/user/delete',
|
|
|
|
|
`title=${encodeURIComponent(title)}`,
|
|
|
|
|
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// 根据接口文档修改响应处理
|
|
|
|
|
if (response.data && response.data.code === 200) {
|
|
|
|
|
return response.data
|
|
|
|
|
} else {
|
|
|
|
|
// 统一处理错误消息
|
|
|
|
|
const errorMsg = response.data?.message || '删除书籍失败'
|
|
|
|
|
throw new Error(errorMsg)
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
const response = await service.post('/user/delete',
|
|
|
|
|
`title=${encodeURIComponent(title)}`,
|
|
|
|
|
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return response.data
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 本周热租榜 - 符合接口文档4.1
|
|
|
|
|
// 本周热租榜 - 符合接口文档
|
|
|
|
|
async fetchWeeklyRank() {
|
|
|
|
|
const response = await service.get('/api/rank/weekly')
|
|
|
|
|
|
|
|
|
|
// 根据接口文档4.1,直接返回数组
|
|
|
|
|
if (response.data && Array.isArray(response.data)) {
|
|
|
|
|
return { data: response.data }
|
|
|
|
|
} else {
|
|
|
|
|
return { data: [] }
|
|
|
|
|
}
|
|
|
|
|
return { data: Array.isArray(response) ? response : response.data || [] }
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 本月热租榜 - 符合接口文档4.2
|
|
|
|
|
// 本月热租榜 - 符合接口文档
|
|
|
|
|
async fetchMonthlyRank() {
|
|
|
|
|
const response = await service.get('/api/rank/monthly')
|
|
|
|
|
|
|
|
|
|
// 根据接口文档4.2,结构与4.1相同
|
|
|
|
|
if (response.data && Array.isArray(response.data)) {
|
|
|
|
|
return { data: response.data }
|
|
|
|
|
} else {
|
|
|
|
|
return { data: [] }
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return { data: Array.isArray(response) ? response : response.data || [] }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|