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 || [] } } } })