Skip to content

Commit 92ab870

Browse files
committed
完成前后端联调
2 parents 5e26925 + e35b290 commit 92ab870

File tree

11 files changed

+138
-131
lines changed

11 files changed

+138
-131
lines changed

package-lock.json

Lines changed: 8 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@
2626
"eslint-plugin-vue": "^9.17.0",
2727
"unplugin-auto-import": "^0.17.3",
2828
"unplugin-vue-components": "^0.26.0",
29-
"vite": "^5.0.10"
29+
"vite": "^5.1.2"
3030
}
3131
}

src/components/HeaderView.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ const url = ref("https://pic.imgdb.cn/item/65a271fe871b83018a8f9a8f.gif");
108108
:inactive-action-icon="Sunny"
109109
style="
110110
--el-switch-on-color: rgba(19, 206, 102, 0.7);
111-
--el-switch-off-color: rgba(141, 141, 141, 0.79);
111+
--el-switch-off-color: rgb(74,163,252);
112112
"
113113
/>
114114
</el-menu-item>

src/main.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ import router from "@/router";
66
import ElementPlus from "element-plus";
77
import "element-plus/dist/index.css";
88
import "element-plus/theme-chalk/dark/css-vars.css";
9-
import { createPersistedState } from "pinia-persistedstate-plugin";
10-
119
import "@/css/main.css";
10+
1211
import { createPinia } from "pinia";
12+
import { createPersistedState } from "pinia-persistedstate-plugin";
1313

1414
// 导入element-plus中文语言
1515
import zhCn from "element-plus/dist/locale/zh-cn.mjs";
16+
1617
const app = createApp(App);
1718

1819
// 使用pinia和persist保存状态并持久化

src/methods/logout.js

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,5 @@
11
import request from "@/util/request.js";
2-
3-
import {useTokenStore} from "@/stores/token";
4-
import {useReaderStore} from "@/stores/reader";
5-
import {useAdminStore} from "@/stores/admin";
6-
import {ElMessage} from "element-plus";
7-
8-
const adminStore = useAdminStore();
9-
const tokenStore = useTokenStore();
10-
const readerStore = useReaderStore();
11-
12-
// 用户退出
2+
// 用户退出登录
133
const logoutService = function () {
144
// 调用后端接口清除redis中的令牌
155
return request.delete('/logout');

src/stores/reader.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import {defineStore} from "pinia";
22
import {ref} from 'vue';
33

4-
54
/**
65
* 保存登录时用户的信息
76
*/
@@ -29,7 +28,7 @@ export const useReaderStore = defineStore('reader', () => {
2928
reader.value.token = '';
3029
}
3130
return {
32-
reader, setReader,clearReader
31+
reader, setReader, clearReader
3332
}
3433
},
3534
{

src/stores/token.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1-
import { defineStore } from "pinia";
1+
import {defineStore} from "pinia";
22
import {ref} from 'vue';
3-
export const useTokenStore = defineStore('token',()=>{
3+
4+
export const useTokenStore = defineStore('token', () => {
45
//1.定义描述token
56
const token = ref('')
67
//2.定义修改token的方法
7-
const setToken = (newToken)=>{
8+
const setToken = (newToken) => {
89
token.value = newToken
910
}
1011
//3.定义移除token的方法
11-
const removeToken = ()=>{
12-
token.value=''
12+
const removeToken = () => {
13+
token.value = ''
1314
}
1415
return {
15-
token,setToken,removeToken
16+
token, setToken, removeToken
1617
}
1718
},
1819
{
1920
//使用persis插件持久化
2021
persis: true
2122
}
22-
)
23+
)

src/util/request.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {useTokenStore} from "@/stores/token.js";
55

66
const baseURL = "/api";
77
const instance = axios.create({baseURL});
8-
98
const tokenStore = useTokenStore();
109

1110

@@ -22,19 +21,22 @@ instance.interceptors.response.use(
2221
},
2322
//失败回调
2423
(error) => {
25-
// 状态码为401,419都跳转到登录界面
26-
if (error.response) {
27-
const code = error.response.status;
28-
if (code === 401) {
24+
const code = error.response.status;
25+
switch (code) {
26+
case 401:
2927
ElMessage({message: '请先登录!', type: "error",});
30-
router.push('/login');
31-
} else if (code === 419) {
28+
break;
29+
case 419:
3230
ElMessage.error("身份已过期,请重新登录!");
33-
router.push('/login');
34-
} else {
31+
break;
32+
default:
3533
ElMessage.error("服务器异常!" + code);
36-
}
34+
break;
3735
}
36+
router.push('/login');
37+
window.local.reload();
38+
39+
3840
// 将异步的状态设置为失败状态
3941
return Promise.reject(error);
4042
}

src/views/BookView.vue

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ import SideView from "@/components/SideView.vue";
55
import HeaderView from "@/components/HeaderView.vue";
66
import { Search } from "@element-plus/icons-vue";
77
import { ElMessage } from "element-plus";
8-
import { useReaderStore } from "@/stores/reader.js";
98
import { borrowService } from "@/methods/borrow.js";
109
11-
const readerStore = useReaderStore();
1210
const tableData = ref([]);
1311
1412
// 页面加载时获取所有书籍
@@ -21,9 +19,11 @@ onMounted(async () => {
2119
// 获取所有书籍
2220
const getAllBooks = async function () {
2321
loading.value = true;
22+
2423
const result = await getAllBookService(condition.value);
2524
tableData.value = result.data;
2625
total.value = result.total;
26+
2727
loading.value = false;
2828
};
2929
@@ -34,29 +34,25 @@ const condition = ref({
3434
isbn: null,
3535
number: 0,
3636
currentPage: 1,
37-
pageSize: 8,
37+
pageSize: 15,
3838
});
3939
40-
// 是否加载中
40+
// 是否显示加载中动画
4141
const loading = ref(false);
4242
4343
// 结果总数
4444
const total = ref(0);
4545
4646
// 分页大小变化
4747
const handleSizeChange = (val) => {
48-
loading.value = true;
4948
condition.value.pageSize = val;
5049
getAllBooks();
51-
loading.value = false;
5250
};
5351
5452
// 当前页数发生变化
5553
const handleCurrentChange = (val) => {
56-
loading.value = true;
5754
condition.value.currentPage = val;
5855
getAllBooks();
59-
loading.value = false;
6056
};
6157
6258
let detail = ref(false);
@@ -165,9 +161,11 @@ const disabledDate = (time) => {
165161

166162
<!--书籍表格-->
167163
<el-table
164+
height="600"
168165
:data="tableData"
169166
style="width: 100%"
170167
v-loading="loading"
168+
element-loading-text="玩命加载中......"
171169
>
172170
<el-table-column prop="title" label="书名" width="150" />
173171
<el-table-column prop="author" label="作者" width="150" />

src/views/LoginView.vue

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<script setup>
2-
import { reactive, ref } from "vue";
3-
import { adminLoginService, loginService } from "@/methods/login";
2+
import {reactive, ref} from "vue";
3+
import {adminLoginService, loginService} from "@/methods/login";
44
import router from "@/router";
5-
import { useTokenStore } from "@/stores/token";
6-
import { useReaderStore } from "@/stores/reader.js";
7-
import { ElNotification } from "element-plus";
8-
import { useAdminStore } from "@/stores/admin.js";
5+
import {useTokenStore} from "@/stores/token";
6+
import {useReaderStore} from "@/stores/reader.js";
7+
import {ElLoading, ElNotification} from "element-plus";
8+
import {useAdminStore} from "@/stores/admin.js";
99
1010
const adminStore = useAdminStore();
1111
const readerStore = useReaderStore();
@@ -16,7 +16,7 @@ const ruleFormRef = ref();
1616
// 表单校验规则
1717
const rules = {
1818
username: [
19-
{ min: 1, max: 10, message: "长度在 1 到 10 个字符", trigger: "change" },
19+
{min: 1, max: 10, message: "长度在 1 到 10 个字符", trigger: "change"},
2020
],
2121
};
2222
@@ -36,14 +36,28 @@ const loginDto = ref({
3636
password: "",
3737
});
3838
const login = async function () {
39+
// 显示加载中动画
40+
const loading = ElLoading.service({
41+
lock: true,
42+
text: '长时间加载请刷新页面......',
43+
background: 'rgba(0, 0, 0, 0.7)',
44+
})
45+
3946
const result = await loginService(loginDto.value);
4047
returnReader = result.data;
41-
console.log(returnReader);
48+
49+
// console.log(returnReader);
50+
4251
//保存用户信息和token
4352
readerStore.setReader(returnReader);
4453
tokenStore.setToken(returnReader.token);
4554
adminStore.setIsAdmin(false);
46-
console.log("tokenStore:" + tokenStore.token);
55+
56+
// 关闭动画
57+
loading.close();
58+
59+
// console.log("tokenStore:" + tokenStore.token);
60+
4761
await router.push("/book");
4862
ElNotification.success({
4963
title: "登录成功",
@@ -100,44 +114,46 @@ let isAdmin = ref(false);
100114
<template>
101115
<!--用户登录表单-->
102116
<el-form
103-
ref="ruleFormRef"
104-
status-icon
105-
label-width="120px"
106-
class="centered-form"
107-
:model="loginDto"
108-
:rules="rules"
109-
title="登录"
117+
ref="ruleFormRef"
118+
status-icon
119+
label-width="120px"
120+
class="centered-form"
121+
:model="loginDto"
122+
:rules="rules"
123+
title="登录"
110124
>
111125
<!--用户名-->
112126
<el-form-item label="用户名" prop="username" class="form-row" required>
113-
<el-input v-model="loginDto.username" />
127+
<el-input v-model="loginDto.username"/>
114128
</el-form-item>
115129
<!--密码-->
116130
<el-form-item label="密码" prop="password" class="form-row" required>
117131
<el-input
118-
v-model.number="loginDto.password"
119-
type="password"
120-
show-password
132+
v-model.number="loginDto.password"
133+
type="password"
134+
show-password
121135
/>
122136
</el-form-item>
123137
<div class="button-row">
124138
<el-form-item>
125139
<el-button type="primary" @click="submitForm(ruleFormRef)"
126-
>登录</el-button
140+
>登录
141+
</el-button
127142
>
128143
<el-button type="success" @click="router.push('/register')"
129-
>注册</el-button
144+
>注册
145+
</el-button
130146
>
131147
</el-form-item>
132148

133149
<el-switch
134-
v-model="isAdmin"
135-
class="mb-2"
136-
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #fd8250"
137-
inline-prompt
138-
size="large"
139-
active-text="管理员"
140-
inactive-text="读者"
150+
v-model="isAdmin"
151+
class="mb-2"
152+
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #fd8250"
153+
inline-prompt
154+
size="large"
155+
active-text="管理员"
156+
inactive-text="读者"
141157
/>
142158
</div>
143159
</el-form>

0 commit comments

Comments
 (0)