From 44c71c9562ef79e0df427c6187e51b774788136c Mon Sep 17 00:00:00 2001 From: hyx <1515023255@qq.com> Date: Fri, 8 Aug 2025 19:25:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E6=AC=A1=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library_system/src/components/HeaderBar.vue | 55 ++++++-- library_system/src/router/index.js | 19 +-- library_system/src/store/index.js | 75 ++++++----- library_system/src/views/Auth/Login.vue | 2 +- library_system/src/views/Books/AddBook.vue | 2 +- library_system/src/views/Books/BookDetail.vue | 6 +- library_system/src/views/Books/BookList.vue | 2 +- .../src/views/Borrow/BorrowBook.vue | 4 +- library_system/src/views/Home.vue | 4 +- .../src/views/Ranking/MonthlyRank.vue | 2 +- .../src/views/Ranking/WeeklyRank.vue | 2 +- .../src/views/User/BorrowRecords.vue | 2 +- library_system/src/views/User/Profile.vue | 122 ------------------ library_system/src/views/User/Recharge.vue | 2 +- 14 files changed, 111 insertions(+), 188 deletions(-) delete mode 100644 library_system/src/views/User/Profile.vue diff --git a/library_system/src/components/HeaderBar.vue b/library_system/src/components/HeaderBar.vue index b5dfa40..a301e25 100644 --- a/library_system/src/components/HeaderBar.vue +++ b/library_system/src/components/HeaderBar.vue @@ -38,13 +38,24 @@ + + +
+
{{ user.username }}
+
VIP{{ vip }}级
+
+ + 余额: ¥{{ balance }} +
+
+ + + + 账户充值 + 借阅记录 + 退出登录 +
+
登录 @@ -60,9 +71,12 @@ import { useRouter } from 'vue-router' import { useStore } from 'vuex' import { ElMessage } from 'element-plus' import { Reading, ArrowDown } from '@element-plus/icons-vue' +import { Wallet } from '@element-plus/icons-vue' const store = useStore() const router = useRouter() +const vip = computed(() => store.state.vipLevel) +const balance = computed(() => store.state.balance) const user = computed(() => store.state.user) const isAdmin = computed(() => store.getters.isAdmin) @@ -163,7 +177,7 @@ const logout = () => { .user-info { display: flex; align-items: center; - gap: 10px; + gap: 5px; } .username { @@ -176,4 +190,29 @@ const logout = () => { color: white; cursor: pointer; } + +.user-dropdown-info { + padding: 5px 16px; + text-align: center; +} + +.user-name { + font-weight: bold; + margin-bottom: 4px; +} + +.user-vip { + color: #ff9a2e; + font-size: 14px; + margin-bottom: 6px; +} + +.user-balance { + font-size: 14px; + color: #666; + display: flex; + align-items: center; + justify-content: center; + gap: 2px; +} \ No newline at end of file diff --git a/library_system/src/router/index.js b/library_system/src/router/index.js index a2c2452..79dcc68 100644 --- a/library_system/src/router/index.js +++ b/library_system/src/router/index.js @@ -20,12 +20,7 @@ const routes = [ name: 'Register', component: () => import('../views/Auth/Register.vue') }, - { - path: '/profile', - name: 'Profile', - component: () => import('../views/User/Profile.vue'), - meta: { requiresAuth: true } - }, + { path: '/books', name: 'Books', @@ -44,12 +39,12 @@ const routes = [ component: () => import('../views/Books/AddBook.vue'), meta: { requiresAuth: true, requiresAdmin: true } }, - { - path: '/books/edit/:id', - name: 'EditBook', - component: () => import('../views/Books/EditBook.vue'), - meta: { requiresAuth: true, requiresAdmin: true } - }, + // { + // path: '/books/edit/:id', + // name: 'EditBook', + // component: () => import('../views/Books/EditBook.vue'), + // meta: { requiresAuth: true, requiresAdmin: true } + // }, { path: '/borrow', name: 'BorrowBook', diff --git a/library_system/src/store/index.js b/library_system/src/store/index.js index 313b261..e0c9743 100644 --- a/library_system/src/store/index.js +++ b/library_system/src/store/index.js @@ -1,10 +1,10 @@ import { createStore } from 'vuex' -import axios from 'axios' +import service from '../utils/request' -// 配置axios基础路径 -axios.defaults.baseURL = 'http://localhost:8877' -// 允许跨域携带cookie -axios.defaults.withCredentials = true +// // 配置axios基础路径 +// axios.defaults.baseURL = 'http://localhost:8877' +// // 允许跨域携带cookie +// axios.defaults.withCredentials = true export default createStore({ state: { @@ -39,7 +39,7 @@ export default createStore({ actions: { // 用户登录 async login({ dispatch }, { username, password }) { - const response = await axios.post('/user/login', + const response = await service.post('/user/login', `username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ) @@ -55,7 +55,7 @@ export default createStore({ // 用户注册 async register(_, { username, password }) { - const response = await axios.post('/user/register', + const response = await service.post('/user/register', `username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ) @@ -68,23 +68,34 @@ export default createStore({ }, // 获取当前用户信息 - async fetchUser({ commit, dispatch }) { - const response = await axios.get('/user/getinfo') - - if (response.data.code === 200) { - commit('setUser', response.data.data) - // 同时获取余额和VIP信息 - await dispatch('fetchBalanceAndVip') - // 获取已借书籍 - await dispatch('fetchBorrowedBooks') - } - - return response.data - }, + async fetchUser({ commit, dispatch }) { + const response = await service.get('/user/getinfo') + + // 接口可能返回两种格式: + // 1. 带code的标准格式:{code:200, message:..., data: null} + // 2. 直接返回用户信息:{username: "张三", pic: "..."} + if (response.data.code === 200) { + // 情况1:如果code=200但data为null,可能接口直接在根节点返回用户信息 + const userData = response.data.data || response.data; + // 过滤掉非用户信息字段(如code/message) + const filteredUser = { + username: userData.username || '', + pic: userData.pic || '' + }; + commit('setUser', filteredUser); + await dispatch('fetchBalanceAndVip'); + await dispatch('fetchBorrowedBooks'); + } else { + // 处理接口返回非200的情况(如未登录) + commit('setUser', null); + } + + return response.data; +}, // 获取余额和VIP等级 async fetchBalanceAndVip({ commit }) { - const response = await axios.post('/user/findmoney') + const response = await service.post('/user/findmoney') if (response.data.code === 200) { // 解析消息提取余额和VIP等级 @@ -104,7 +115,7 @@ export default createStore({ // 账户充值 async recharge(_, { money }) { - const response = await axios.post('/user/recharge', + const response = await service.post('/user/recharge', `money=${money}`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ) @@ -124,7 +135,7 @@ export default createStore({ // 获取借阅记录 async fetchBorrowRecords() { - const response = await axios.get('/user/findone') + const response = await service.get('/user/findone') if (response.data.code !== 200) { throw new Error(response.data.message || '获取借阅记录失败') @@ -135,7 +146,7 @@ export default createStore({ // 获取当前用户已借书籍 async fetchBorrowedBooks({ commit }) { - const response = await axios.get('/user/borrow/books') + const response = await service.get('/user/borrow/books') if (response.data.code === 200) { commit('setBorrowedBooks', response.data.data || []) @@ -146,7 +157,7 @@ export default createStore({ // 借书 async borrowBook(_, { title }) { - const response = await axios.post('/borrow/borrowbook', + const response = await service.post('/borrow/borrowbook', `title=${encodeURIComponent(title)}`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ) @@ -160,7 +171,7 @@ export default createStore({ // 还书 async returnBook(_, { title }) { - const response = await axios.post('/borrow/returnbook', + const response = await service.post('/borrow/returnbook', `title=${encodeURIComponent(title)}`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ) @@ -185,7 +196,7 @@ export default createStore({ url += `?${queryParams.toString()}` } - const response = await axios.get(url) + const response = await service.get(url) if (response.data.code !== 200) { throw new Error(response.data.message || '获取书籍列表失败') @@ -200,7 +211,7 @@ export default createStore({ }, async fetchBookById(_, id) { - const response = await axios.get(`/api/selectone?id=${id}`) + const response = await service.get(`/api/selectone?id=${id}`) if (response.data.code !== 200) { throw new Error(response.data.message || '获取书籍详情失败') @@ -210,7 +221,7 @@ export default createStore({ }, async addBook(_, bookData) { - const response = await axios.post('/api/add', bookData, { + const response = await service.post('/api/add', bookData, { headers: { 'Content-Type': 'application/json' } }) @@ -222,7 +233,7 @@ export default createStore({ }, async deleteBook(_, { title }) { - const response = await axios.post('/user/delete', + const response = await service.post('/user/delete', `title=${encodeURIComponent(title)}`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ) @@ -235,7 +246,7 @@ export default createStore({ }, async fetchWeeklyRank() { - const response = await axios.get('/api/rank/weekly') + const response = await service.get('/api/rank/weekly') if (response.data.code !== 200) { throw new Error(response.data.message || '获取本周热租榜失败') @@ -245,7 +256,7 @@ export default createStore({ }, async fetchMonthlyRank() { - const response = await axios.get('/api/rank/monthly') + const response = await service.get('/api/rank/monthly') if (response.data.code !== 200) { throw new Error(response.data.message || '获取本月热租榜失败') diff --git a/library_system/src/views/Auth/Login.vue b/library_system/src/views/Auth/Login.vue index fcc4942..fb87837 100644 --- a/library_system/src/views/Auth/Login.vue +++ b/library_system/src/views/Auth/Login.vue @@ -74,7 +74,7 @@ const login = async () => { await loginForm.value.validate() loading.value = true - await store.dispatch('user/login', form.value) + await store.dispatch('login', form.value) ElMessage.success('登录成功') // 获取用户信息 diff --git a/library_system/src/views/Books/AddBook.vue b/library_system/src/views/Books/AddBook.vue index 89d3e67..5d13af0 100644 --- a/library_system/src/views/Books/AddBook.vue +++ b/library_system/src/views/Books/AddBook.vue @@ -96,7 +96,7 @@ const submitForm = async () => { await addBookForm.value.validate() loading.value = true - await store.dispatch('book/addBook', form.value) + await store.dispatch('addBook', form.value) ElMessage.success('添加书籍成功') router.push('/books') } catch (error) { diff --git a/library_system/src/views/Books/BookDetail.vue b/library_system/src/views/Books/BookDetail.vue index 554c7e5..20ca523 100644 --- a/library_system/src/views/Books/BookDetail.vue +++ b/library_system/src/views/Books/BookDetail.vue @@ -67,7 +67,7 @@ onMounted(async () => { const fetchBook = async () => { try { - const response = await store.dispatch('book/fetchBookById', bookId) + const response = await store.dispatch('fetchBookById', bookId) book.value = response.data } catch (error) { console.error('获取书籍详情失败:', error) @@ -87,7 +87,7 @@ const fetchBook = async () => { const borrowBook = async () => { try { - await store.dispatch('borrow/borrowBook', { title: book.value.title }) + await store.dispatch('borrowBook', { title: book.value.title }) ElMessage.success(`成功借阅《${book.value.title}》`) // 刷新书籍信息 await fetchBook() @@ -109,7 +109,7 @@ const deleteBook = async () => { } ) - await store.dispatch('book/deleteBook', { title: book.value.title }) + await store.dispatch('deleteBook', { title: book.value.title }) ElMessage.success('书籍已删除') router.push('/books') } catch (error) { diff --git a/library_system/src/views/Books/BookList.vue b/library_system/src/views/Books/BookList.vue index 25abbe5..7c221ec 100644 --- a/library_system/src/views/Books/BookList.vue +++ b/library_system/src/views/Books/BookList.vue @@ -96,7 +96,7 @@ const fetchBooks = async () => { keyword: searchKeyword.value } - const response = await store.dispatch('book/fetchBooks', params) + const response = await store.dispatch('fetchBooks', params) books.value = response.data.list total.value = response.data.total } catch (error) { diff --git a/library_system/src/views/Borrow/BorrowBook.vue b/library_system/src/views/Borrow/BorrowBook.vue index 9fc2e35..439da5f 100644 --- a/library_system/src/views/Borrow/BorrowBook.vue +++ b/library_system/src/views/Borrow/BorrowBook.vue @@ -65,7 +65,7 @@ const fetchBooks = async () => { keyword: searchKeyword.value } - const response = await store.dispatch('book/fetchBooks', params) + const response = await store.dispatch('fetchBooks', params) books.value = response.data.list total.value = response.data.total } catch (error) { @@ -102,7 +102,7 @@ const handleBorrow = async (book) => { return } - await store.dispatch('borrow/borrowBook', { title: book.title }) + await store.dispatch('borrowBook', { title: book.title }) ElMessage.success(`成功借阅《${book.title}》`) // 刷新列表 await fetchBooks() diff --git a/library_system/src/views/Home.vue b/library_system/src/views/Home.vue index 2ad815c..e75e16c 100644 --- a/library_system/src/views/Home.vue +++ b/library_system/src/views/Home.vue @@ -60,11 +60,11 @@ onMounted(async () => { try { // 获取本周排行榜 - const weeklyResponse = await store.dispatch('book/fetchWeeklyRank') + const weeklyResponse = await store.dispatch('fetchWeeklyRank') weeklyRank.value = weeklyResponse.data.slice(0, 6) // 获取本月排行榜 - const monthlyResponse = await store.dispatch('book/fetchMonthlyRank') + const monthlyResponse = await store.dispatch('fetchMonthlyRank') monthlyRank.value = monthlyResponse.data.slice(0, 6) } catch (error) { console.error('获取排行榜数据失败:', error) diff --git a/library_system/src/views/Ranking/MonthlyRank.vue b/library_system/src/views/Ranking/MonthlyRank.vue index f90c6c4..ff3ff3f 100644 --- a/library_system/src/views/Ranking/MonthlyRank.vue +++ b/library_system/src/views/Ranking/MonthlyRank.vue @@ -51,7 +51,7 @@ onMounted(async () => { const fetchMonthlyRank = async () => { try { - const response = await store.dispatch('book/fetchMonthlyRank') + const response = await store.dispatch('fetchMonthlyRank') rankList.value = response.data } catch (error) { console.error('获取本月热租榜失败:', error) diff --git a/library_system/src/views/Ranking/WeeklyRank.vue b/library_system/src/views/Ranking/WeeklyRank.vue index 7d96f8d..b719fb8 100644 --- a/library_system/src/views/Ranking/WeeklyRank.vue +++ b/library_system/src/views/Ranking/WeeklyRank.vue @@ -50,7 +50,7 @@ onMounted(async () => { const fetchWeeklyRank = async () => { try { - const response = await store.dispatch('book/fetchWeeklyRank') + const response = await store.dispatch('fetchWeeklyRank') rankList.value = response.data } catch (error) { console.error('获取本周热租榜失败:', error) diff --git a/library_system/src/views/User/BorrowRecords.vue b/library_system/src/views/User/BorrowRecords.vue index 3438020..ffcad87 100644 --- a/library_system/src/views/User/BorrowRecords.vue +++ b/library_system/src/views/User/BorrowRecords.vue @@ -46,7 +46,7 @@ onMounted(async () => { const fetchRecords = async () => { try { - const response = await store.dispatch('borrow/fetchBorrowRecords') + const response = await store.dispatch('fetchBorrowRecords') records.value = response.data } catch (error) { console.error('获取借阅记录失败:', error) diff --git a/library_system/src/views/User/Profile.vue b/library_system/src/views/User/Profile.vue deleted file mode 100644 index b03de23..0000000 --- a/library_system/src/views/User/Profile.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - \ No newline at end of file diff --git a/library_system/src/views/User/Recharge.vue b/library_system/src/views/User/Recharge.vue index 5055694..a258e97 100644 --- a/library_system/src/views/User/Recharge.vue +++ b/library_system/src/views/User/Recharge.vue @@ -67,7 +67,7 @@ const submitRecharge = async () => { try { await rechargeForm.value.validate() - await store.dispatch('user/recharge', { money: form.value.money }) + await store.dispatch('recharge', { money: form.value.money }) ElMessage.success(`成功充值¥${form.value.money}元`) // 更新用户信息