hyx_brand
hyx 3 months ago
parent b2e3d51c0e
commit b5bf87ce53

@ -14,6 +14,7 @@
{{ book.state }} {{ book.state }}
</el-tag> </el-tag>
<span>阅读量: {{ book.number }}</span> <span>阅读量: {{ book.number }}</span>
<el-button @click="$emit('borrow')"></el-button>
</div> </div>
</div> </div>
</el-card> </el-card>

@ -28,9 +28,41 @@ export default createStore({
state.balance = 0 state.balance = 0
state.vipLevel = 0 state.vipLevel = 0
state.borrowedBooks = [] state.borrowedBooks = []
},
removeBorrowedBook(state, title) {
state.borrowedBooks = state.borrowedBooks.filter(book => book.title !== title)
},
setSessionInitialized(state, value) {
state.sessionInitialized = value
} }
}, },
actions: { actions: {
async initSession({ commit, dispatch }) {
try {
// 静默获取用户信息
const userData = await service.get('/user/getinfo', {
silent: true // 避免未登录时显示错误
})
if (userData && userData.username) {
commit('setUser', {
username: userData.username,
pic: userData.pic || '',
admin: userData.admin || false
})
// 获取关联信息
await dispatch('fetchBalanceAndVip')
await dispatch('fetchBorrowedBooks')
}
} catch (error) {
console.log('未检测到有效会话')
} finally {
commit('setSessionInitialized', true)
}
},
// 用户登录 // 用户登录
async login({ dispatch }, { username, password }) { async login({ dispatch }, { username, password }) {
const response = await service.post('/user/login', const response = await service.post('/user/login',
@ -89,12 +121,15 @@ export default createStore({
}, },
// 获取余额和VIP等级 // 获取余额和VIP等级
async fetchBalanceAndVip({ commit }) { async fetchBalanceAndVip({ commit }) {
try { try {
const response = await service.post('/user/findmoney') const response = await service.post('/user/findmoney')
// 确保从 response.data 获取数据
const resData = response.data || {}
const message = resData.message || ''
// 解析消息提取余额和VIP等级 // 解析消息提取余额和VIP等级
const message = response.data.message || ''
const balanceMatch = message.match(/余额为:(\d+\.\d+)元/) const balanceMatch = message.match(/余额为:(\d+\.\d+)元/)
const vipMatch = message.match(/当前VIP等级为(\d+)/) const vipMatch = message.match(/当前VIP等级为(\d+)/)
@ -105,28 +140,32 @@ export default createStore({
}) })
} else { } else {
console.error('无法解析余额信息:', message) console.error('无法解析余额信息:', message)
// 尝试从数据字段获取 // 尝试从数据字段获取虽然接口返回data为null但保留此逻辑以防后端变更
if (response.data.data) { if (resData.data) {
commit('setBalanceAndVip', { commit('setBalanceAndVip', {
balance: parseFloat(response.data.data.balance) || 0, balance: parseFloat(resData.data.balance) || 0,
vip: parseInt(response.data.data.vipLevel) || 0 vip: parseInt(resData.data.vipLevel) || 0
}) })
} else {
// 添加调试日志
console.log('完整响应数据:', resData)
} }
} }
return response.data return resData
} catch (error) { } catch (error) {
console.error('获取余额失败:', error) console.error('获取余额失败:', error)
throw error throw error
} }
}, },
// 账户充值 // 账户充值
async recharge(_, { money }) { async recharge({ dispatch }, { money }) { // 添加 { dispatch } 解构
const response = await service.post('/user/recharge', const response = await service.post('/user/recharge',
`money=${money}`, `money=${money}`,
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
) )
// 充值后刷新余额 // 充值后刷新余额
await dispatch('fetchBalanceAndVip') await dispatch('fetchBalanceAndVip')
return response.data return response.data
@ -159,24 +198,28 @@ export default createStore({
}, },
// 租借书籍 // 租借书籍
async borrowBook(_, { title }) { async borrowBook({ dispatch }, { title }) {
const response = await service.post('/borrow/borrowbook', const response = await service.post('/borrow/borrowbook',
`title=${encodeURIComponent(title)}`, `title=${encodeURIComponent(title)}`,
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
) )
// 借书后刷新用户信息
await dispatch('fetchUser')
return response.data return response.data
}, },
// 归还书籍 // 归还书籍
async returnBook(_, { title }) { async returnBook({ dispatch }, { title }) {
const response = await service.post('/borrow/returnbook', const response = await service.post('/borrow/returnbook',
`title=${encodeURIComponent(title)}`, `title=${encodeURIComponent(title)}`,
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
) )
// 还书后刷新用户信息
await dispatch('fetchUser')
return response.data return response.data
}, },
// 查询全部书籍 - 符合接口文档 // 查询全部书籍 - 符合接口文档
async fetchBooks(_, params = {}) { async fetchBooks(_, params = {}) {
@ -217,21 +260,23 @@ export default createStore({
}, },
// 根据书名查单本书 - 符合接口文档 // 根据书名查单本书 - 符合接口文档
async fetchBookByTitle(_, title) { async fetchBookByTitle(_, payload) { // 接收 payload 对象
const { title } = payload; // 解构出 title
const response = await service.get('/api/selectone', { const response = await service.get('/api/selectone', {
params: { title } params: { title } // 正确传递查询参数
}) })
// 处理不同响应格式 // 处理不同响应格式
let book = null let bookData = null
if (response.data) { if (response.data) {
book = response.data.data || response.data // 适配不同后端响应结构
bookData = response.data.data || response.data
} else { } else {
book = response bookData = response
} }
return { data: book } return { data: bookData }
}, },
// 新增书籍 // 新增书籍
async addBook(_, bookData) { async addBook(_, bookData) {

@ -56,7 +56,7 @@ const route = useRoute()
const router = useRouter() const router = useRouter()
const store = useStore() const store = useStore()
const bookTitle = route.params.title const bookTitle = ref(route.params.title)
const book = ref(null) const book = ref(null)
const isAdmin = computed(() => store.getters.isAdmin) const isAdmin = computed(() => store.getters.isAdmin)
@ -67,19 +67,20 @@ onMounted(async () => {
const fetchBook = async () => { const fetchBook = async () => {
try { try {
const response = await store.dispatch('fetchBookByTitle', bookTitle) // 使 bookTitle
const response = await store.dispatch('fetchBookByTitle', { title: bookTitle })
book.value = response.data book.value = response.data
} catch (error) { } catch (error) {
console.error('获取书籍详情失败:', error) console.error('获取书籍详情失败:', error)
ElMessage.error('获取书籍详情失败') ElMessage.error('获取书籍详情失败')
// //
book.value = { book.value = {
id: bookId, id: bookTitle, // 使ID
title: '示例书籍', title: 111, // 使
url: 'https://picsum.photos/id/24/300/400', url: 'https://picsum.photos/id/24/300/400',
money: 5.00, money: 5.00,
number: 8, number: 8,
content: '这是一本示例书籍,用于展示书籍详情页面的效果。包含了书籍的基本信息和详细介绍,用户可以在这里查看书籍的具体内容并进行借阅操作。', content: `无法获取《${bookTitle}》的详细信息,显示示例数据`,
state: '维护中', state: '维护中',
} }
} }

@ -102,6 +102,11 @@ const fetchBooks = async () => {
} catch (error) { } catch (error) {
console.error('获取书籍列表失败:', error) console.error('获取书籍列表失败:', error)
ElMessage.error('获取书籍列表失败') ElMessage.error('获取书籍列表失败')
books.value = [
{ id: 1, title: '三体', url: 'https://picsum.photos/id/24/200/300', money: 5, number: 12, state: '正常', content: '科幻' },
{ id: 2, title: '人类简史', url: 'https://picsum.photos/id/25/200/300', money: 4, number: 10, state: '正常', content: '历史' },
{ id: 3, title: '百年孤独', url: 'https://picsum.photos/id/26/200/300', money: 6, number: 0, state: '维护中', content: '文学' },
]
total.value = books.value.length total.value = books.value.length
} }

@ -22,7 +22,7 @@
v-for="book in books" v-for="book in books"
:key="book.id" :key="book.id"
:book="book" :book="book"
@click="handleBorrow(book)" /> @borrow="handleBorrow(book)" />
</div> </div>
<div class="pagination"> <div class="pagination">

@ -73,7 +73,9 @@
try { try {
await store.dispatch('returnBook', { title: book.title }) await store.dispatch('returnBook', { title: book.title })
ElMessage.success(`${book.title}》归还成功`) ElMessage.success(`${book.title}》归还成功`)
store.commit('removeBorrowedBook', book.title)
await fetchBorrowedBooks() await fetchBorrowedBooks()
} catch (error) { } catch (error) {
console.error('归还失败:', error) console.error('归还失败:', error)
ElMessage.error(error.message || '归还失败') ElMessage.error(error.message || '归还失败')

Loading…
Cancel
Save