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 @@
-
-
-
-
-
-
-
-
-
- {{ user.username }}
-
-
- {{ isAdmin ? '管理员' : '普通用户' }}
-
-
- {{ formatDate(user.create_time) }}
- {{ formatDate(user.update_time) }}
-
-
-
-
-
- 账户充值
- 查看借阅记录
-
-
-
-
-
-
-
-
\ 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}元`)
// 更新用户信息