Ly 6 days ago
commit aa4466c666
  1. 8
      src/api/user.ts
  2. 63
      src/layout/loginPage.vue
  3. 796
      src/layout/spacePage.vue
  4. 59
      src/permissions.ts
  5. 12
      src/store/modules/user.ts
  6. 13
      src/utils/auth.ts
  7. 80
      src/utils/request.ts

@ -23,7 +23,13 @@ export const sturegister = (data: any) => {
data,
})
}
// 退出登录
export const logout = () => {
return request({
url: '/sys/logout?_t=' + new Date().getTime(),
method: 'PUT',
})
}
// 获取用户信息
export const getUserInfoService = () => {
return request({

@ -424,69 +424,67 @@ const formModel = ref({
const FacultiesList = ref([]);
const getFacultiesList = async (data: any) => {
const res: any = await getFaculties(data)
console.log(res, 'res11')
if (data.primaryType == 3){
FacultiesList.value = res.result.map((res:any) => {
const res: any = await getFaculties(data);
console.log(res, "res11");
if (data.primaryType == 3) {
FacultiesList.value = res.result.map((res: any) => {
return {
value: res.id,
label: res.name,
isLeaf: true
}
})
}else{
isLeaf: true,
};
});
} else {
FacultiesList.value = res.result.map((res: any) => {
return {
value: res.id,
label: res.name,
isLeaf: false
}
})
isLeaf: false,
};
});
}
}
const deepValues = ref([])
};
const deepValues = ref([]);
//
const props = {
lazy: true,
checkStrictly: true,
emitPath: false,
isLeaf: 'isLeaf',
isLeaf: "isLeaf",
async lazyLoad(node: any, resolve: any) {
console.log(node);
deepValues.value = node.pathValues;
await getFacultiesList({
primaryType: node.level + 1,
pid: node.value,
})
});
const nodes = FacultiesList.value.map((item: any) => {
if (!item.isLeaf) {
return {
value: item.value,
label: item.label,
isLeaf: item.isLeaf,
disabled:true
}
disabled: true,
};
} else {
return {
value: item.value,
label: item.label,
isLeaf: item.isLeaf
}
isLeaf: item.isLeaf,
};
}
})
console.log(nodes,'nodes');
resolve(nodes)
});
console.log(nodes, "nodes");
resolve(nodes);
},
}
const cascader = ref(null)
};
const cascader = ref(null);
const handleChange = (e: any) => {
console.log(e);
formModel.value.clssid = e
cascader.value.togglePopperVisible()
}
formModel.value.clssid = e;
cascader.value.togglePopperVisible();
};
//
const rules = {
@ -572,11 +570,6 @@ const register = async () => {
studentNumb: "",
mobile: "",
captcha: "",
}
ElMessage.success(`注册成功`)
isRegister.value = false
};
ElMessage.success(`注册成功`);
isRegister.value = false;

@ -1,204 +1,223 @@
<template>
<div class="login_container">
<div class="top">
<div class="loginBtn">
<p @click="loginFn">{{ user.token ? '已登录' : '登录/注册' }}</p>
</div>
<div class="title">{{ setting.title }}</div>
</div>
<div class="login_container">
<div class="top">
<div class="loginBtn">
<p @click="loginFn">{{ user.token ? "已登录" : "登录/注册" }}</p>
</div>
<div class="title">{{ setting.title }}</div>
</div>
<div class="main-content">
<div class="personal-center">
<div class="leftBox">
<h2>个人中心</h2>
<p>学生8527</p>
<button class="btn1" @click="handleHomeClick">返回首页</button>
<button class="btn2" disabled>个人中心</button>
<button class="btn3" @click="handlePasswordClick">重置密码</button>
<div class="main-content">
<div class="personal-center">
<div class="leftBox">
<h2>个人中心</h2>
<p>学生8527</p>
<button class="btn1" @click="handleHomeClick">返回首页</button>
<button class="btn2" disabled>个人中心</button>
<button class="btn3" @click="handlePasswordClick">重置密码</button>
<button class="btn4" @click="logoutEvent">退出登录</button>
</div>
<div class="rightBoxes">
<div class="topBox">
<el-form
style="margin: 30px 0 0 200px"
:model="formModel"
size="large"
autocomplete="off"
>
<el-form-item>
<div class="left" style="width: 60px; color: #fbfdfd">
用户账号
</div>
<div class="right">
<el-input disabled v-model="formModel.username"></el-input>
</div>
</el-form-item>
<el-form-item>
<div style="display: flex; align-items: center; color: pink">
<div class="left" style="width: 60px; color: #fbfdfd">
姓名
</div>
<div class="right">
<el-input disabled v-model="formModel.realname"></el-input>
</div>
</div>
<div class="rightBoxes">
<div class="topBox">
<el-form style="margin:30px 0 0 200px;" :model="formModel" size="large" autocomplete="off">
<el-form-item>
<div class="left" style="width: 60px;color: #fbfdfd;">
用户账号
</div>
<div class="right">
<el-input disabled v-model="formModel.username"></el-input>
</div>
</el-form-item>
<el-form-item>
<div style="display: flex; align-items: center; color: pink">
<div class="left" style="width: 60px;color: #fbfdfd;">
姓名
</div>
<div class="right">
<el-input disabled v-model="formModel.realname"></el-input>
</div>
</div>
</el-form-item>
<el-form-item prop="clssid">
<div class="left" style="width: 60px;color: #fbfdfd;">
班级
</div>
<div class="right">
<el-input disabled v-model="formModel.className"></el-input>
</div>
</el-form-item>
</el-form>
</div>
<div class="bottomBox">
<el-form size="large" style="margin:30px 0 0 265px;" :model="formModel">
<el-form-item>
<div style="display: flex; align-items: center;">
<div class="left" style="width: 60px;color: #fbfdfd;">
学号
</div>
<div class="right">
<el-input disabled v-model="formModel.workNo"></el-input>
</div>
</div>
</el-form-item>
<el-form-item>
<div style="display: flex; align-items: center;">
<div class="left" style="width: 60px;color: #fbfdfd;">
手机号
</div>
<div class="right">
<el-input disabled v-model="formModel.phone"></el-input>
</div>
</div>
</el-form-item>
<el-form-item>
<div style="display: flex; align-items: center;">
<div class="left" style="width: 60px;color: #fbfdfd;">
成绩
</div>
<div class="right">
<el-input-number disabled v-model="formModel.score"></el-input-number>
</div>
<el-button
style="color: #333333; margin: 5px 3px 0 83px; font-size: 15px; font-weight: 700; background-color: #e9ddab;"
size="large" @click="openDialog">更改个人信息</el-button>
</div>
</el-form-item>
</el-form>
</div>
</el-form-item>
<el-form-item prop="clssid">
<div class="left" style="width: 60px; color: #fbfdfd">班级</div>
<div class="right">
<el-input disabled v-model="formModel.className"></el-input>
</div>
</div>
</el-form-item>
</el-form>
</div>
<div class="bottomBox">
<el-form
size="large"
style="margin: 30px 0 0 265px"
:model="formModel"
>
<el-form-item>
<div style="display: flex; align-items: center">
<div class="left" style="width: 60px; color: #fbfdfd">
学号
</div>
<div class="right">
<el-input disabled v-model="formModel.workNo"></el-input>
</div>
</div>
</el-form-item>
<el-form-item>
<div style="display: flex; align-items: center">
<div class="left" style="width: 60px; color: #fbfdfd">
手机号
</div>
<div class="right">
<el-input disabled v-model="formModel.phone"></el-input>
</div>
</div>
</el-form-item>
<el-form-item>
<div style="display: flex; align-items: center">
<div class="left" style="width: 60px; color: #fbfdfd">
成绩
</div>
<div class="right">
<el-input-number
disabled
v-model="formModel.score"
></el-input-number>
</div>
<el-button
style="
color: #333333;
margin: 5px 3px 0 83px;
font-size: 15px;
font-weight: 700;
background-color: #e9ddab;
"
size="large"
@click="openDialog"
>更改个人信息</el-button
>
</div>
</el-form-item>
</el-form>
</div>
</div>
</div>
</div>
<!-- 弹框 -->
<el-dialog v-model="dialog" title="更改个人信息" width="500">
<el-form :model="dialogForm" :rules="rules" ref="formRef">
<el-form-item prop="username" label="用户账号" style="margin-top: 30px;">
<el-input v-model="dialogForm.username" disabled></el-input>
</el-form-item>
<el-form-item prop="name" label="姓名" label-width="58px">
<el-input v-model="dialogForm.name"></el-input>
</el-form-item>
<el-form-item prop="phone" label="手机号" label-width="58px">
<el-input v-model="dialogForm.phone"></el-input>
</el-form-item>
<!-- <el-form-item prop="clssid" label="班级" label-width="58px">
</div>
<!-- 弹框 -->
<el-dialog v-model="dialog" title="更改个人信息" width="500">
<el-form :model="dialogForm" :rules="rules" ref="formRef">
<el-form-item prop="username" label="用户账号" style="margin-top: 30px">
<el-input v-model="dialogForm.username" disabled></el-input>
</el-form-item>
<el-form-item prop="name" label="姓名" label-width="58px">
<el-input v-model="dialogForm.name"></el-input>
</el-form-item>
<el-form-item prop="phone" label="手机号" label-width="58px">
<el-input v-model="dialogForm.phone"></el-input>
</el-form-item>
<!-- <el-form-item prop="clssid" label="班级" label-width="58px">
<el-cascader placeholder="请选择所属班级" :props="props" style="width: 142%; height: 0.2344rem"
v-model="dialogForm.clssid" @change="handleChange" />
</el-form-item> -->
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="changeInformation">
确认修改
</el-button>
</div>
</template>
</el-dialog>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="changeInformation">
确认修改
</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup lang="ts" name="spacePage">
import { ElMessage } from 'element-plus'
import { ref,onMounted} from "vue"
import { useRouter } from 'vue-router'
import settingStore from "@/store/modules/setting";
import { ElMessage } from "element-plus";
import { ref, onMounted } from "vue";
import { useRouter } from "vue-router";
import settingStore from "@/store/modules/setting";;
const setting = settingStore();
import userStore from '@/store/modules/user';
import { getUserInfoService,userChangeService } from '@/api/user'
import userStore from "@/store/modules/user";
import { getUserInfoService, userChangeService, logout } from "@/api/user";
// import {getFaculties } from '@/api/user'
const router = useRouter()
import { clearLocalStorage } from "@/utils/auth";
const router = useRouter();
const user = userStore();
const loginFn = () => {
router.push('/login')
}
router.push("/login");
};
const handleHomeClick = () => {
router.push('/studyPage')
router.push("/studyPage");
};
const handlePasswordClick = () => {
console.log('密码管理');
router.push('/passwordPage')
console.log("密码管理");
router.push("/passwordPage");
};
const formRef = ref();
const formModel = ref({
username: "",
realname: "",
className: '',
workNo: "",
phone: '',
score: ''
username: "",
realname: "",
className: "",
workNo: "",
phone: "",
score: "",
});
const dialogForm=ref({
username: "",
name: "",
phone: '',
})
const getUser=async()=>{
const res: any = await getUserInfoService();
// console.log(res.result,'aaaaa');
formModel.value = res.result;
// console.log(formModel, 'formModel');
dialogForm.value.username=res.result.username
}
const dialogForm = ref({
username: "",
name: "",
phone: "",
});
const getUser = async () => {
const res: any = await getUserInfoService();
// console.log(res.result,'aaaaa');
formModel.value = res.result;
// console.log(formModel, 'formModel');
dialogForm.value.username = res.result.username;
};
const rules = {
username: [
{ required: true, message: "请输入用户名", trigger: "blur" },
{
min: 5,
max: 30,
message: "用户名长度最小五位最大三十位",
trigger: ["change", "blur"],
},
],
// workNo: [
// { required: true, message: "", trigger: "blur" },
// {
// min: 5,
// max: 11,
// message: "",
// trigger: ["change", "blur"],
// },
// ],
name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
// clssid: [
// { required: true, message: "", trigger: "blur" },
// ],
phone: [
{ required: true, message: "请输入手机号", trigger: "blur" },
// {
// pattern: /^1[3-9]\d{9}$/,
// message: "",
// trigger: ["change", "blur"],
// },
]
username: [
{ required: true, message: "请输入用户名", trigger: "blur" },
{
min: 5,
max: 30,
message: "用户名长度最小五位最大三十位",
trigger: ["change", "blur"],
},
],
// workNo: [
// { required: true, message: "", trigger: "blur" },
// {
// min: 5,
// max: 11,
// message: "",
// trigger: ["change", "blur"],
// },
// ],
name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
// clssid: [
// { required: true, message: "", trigger: "blur" },
// ],
phone: [
{ required: true, message: "请输入手机号", trigger: "blur" },
// {
// pattern: /^1[3-9]\d{9}$/,
// message: "",
// trigger: ["change", "blur"],
// },
],
};
onMounted(()=>{
getUser()
})
onMounted(() => {
getUser();
});
// //
// const FacultiesList = ref([])
@ -232,234 +251,247 @@ onMounted(()=>{
// dialogForm.value.clssid = e
// }
const loading = ref(false)
const dialog = ref(false)
const changeInformation =async() => {
await formRef.value.validate();
await userChangeService({
realname: dialogForm.value.name,
phone: dialogForm.value.phone,
const loading = ref(false);
const dialog = ref(false);
const changeInformation = async () => {
await formRef.value.validate();
await userChangeService({
realname: dialogForm.value.name,
phone: dialogForm.value.phone,
})
.then(() => {
ElMessage.success("修改成功");
})
.then(() => {
ElMessage.success('修改成功')
})
.catch((error) => {
// console.log(error, 'error')
ElMessage.error(error.response.data.message)
})
loading.value = true
setTimeout(() => {
dialog.value = false
}, 400)
getUser()
}
.catch((error) => {
// console.log(error, 'error')
ElMessage.error(error.response.data.message);
});
loading.value = true;
setTimeout(() => {
dialog.value = false;
}, 400);
getUser();
};
const openDialog = () => {
dialog.value = true
dialogForm.value.name = formModel.value.realname
dialogForm.value.phone = formModel.value.phone
}
dialog.value = true;
dialogForm.value.name = formModel.value.realname;
dialogForm.value.phone = formModel.value.phone;
};
const handleClose = () => {
dialog.value = false
}
dialog.value = false;
};
// 退
const logoutEvent = async () => {
await logout().then(res => {
console.log(res,'111');
clearLocalStorage();
user.token = ''
router.push("/login");
})
};
</script>
<style lang="less" scoped>
.login_container {
position: relative;
position: relative;
width: 100%;
// height: 1080px;
min-height: 100vh;
background-color: #091d22;
background: url("../assets//images/bg3.png") no-repeat;
background-size: cover;
.top {
width: 100%;
// height: 1080px;
min-height: 100vh;
background-color: #091d22;
background: url("../assets//images/bg3.png") no-repeat;
height: 75px;
text-align: center;
font-size: 42px;
line-height: 75px;
font-style: italic;
background: url("../assets/images/topbgc.png") no-repeat;
// background-position: center bottom -10px;
background-size: cover;
.top {
width: 100%;
height: 75px;
text-align: center;
font-size: 42px;
line-height: 75px;
font-style: italic;
background: url("../assets/images/topbgc.png") no-repeat;
// background-position: center bottom -10px;
background-size: cover;
.title {
color: #fff;
}
.title {
color: #fff;
}
.loginBtn {
position: absolute;
/* 清除浮动影响 */
float: left;
/* 向左浮动 */
top: 10px;
left: 230px;
border: 1px solid #33FEFE;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
width: 142px;
height: 40px;
line-height: 37px;
background: linear-gradient(to bottom, #08B9C1, #0758B8);
transform: skew(-30deg);
cursor: pointer;
/* 在X轴方向倾斜 -30 度 */
border-radius: 5%;
p {
transform: skew(30deg);
/* 反向倾斜,抵消父元素的变形 */
font-size: 18px;
color: #fff;
}
}
.loginBtn {
position: absolute;
/* 清除浮动影响 */
float: left;
/* 向左浮动 */
top: 10px;
left: 230px;
border: 1px solid #33fefe;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
width: 142px;
height: 40px;
line-height: 37px;
background: linear-gradient(to bottom, #08b9c1, #0758b8);
transform: skew(-30deg);
cursor: pointer;
/* 在X轴方向倾斜 -30 度 */
border-radius: 5%;
p {
transform: skew(30deg);
/* 反向倾斜,抵消父元素的变形 */
font-size: 18px;
color: #fff;
}
}
}
}
.main-content {
display: flex;
justify-content: center;
align-items: center;
.personal-center {
display: flex;
justify-content: center;
align-items: center;
.personal-center {
display: flex;
width: 1800px;
height: 600px;
margin-top: 150px;
justify-content: space-evenly;
.leftBox {
position: relative;
width: 550px;
height: 600px;
background: url("../assets/images/space1.png") no-repeat;
transform: skewX(-5deg);
margin-right: -150px;
// flex-direction: column;
background-size: 98%;
h2 {
position: absolute;
top: 6px;
left: 60%;
transform: translateX(-50%);
color: #ededd8;
font-size: 16px;
font-weight: 700;
height: 40px;
line-height: 40px;
font-size: 20px;
}
p {
position: absolute;
top: 28%;
left: 55%;
transform: translateX(-50%);
color: #fdeda0;
font-size: 20px;
font-weight: 700;
height: 40px;
line-height: 40px;
}
.btn1,
.btn2,
.btn3 {
display: block;
width: 200px;
height: 55px;
background-color: #e9ddab;
margin: 25px auto;
border: none;
border-radius: 5px;
color: #333;
font-size: 20px;
font-weight: 700;
transform: skewX(-17deg);
}
.btn1 {
position: absolute;
top: 268px;
left: 31%;
}
.btn2 {
position: absolute;
left: 26%;
top: 360px;
background-color:#e2c04f ;
}
.btn3 {
position: absolute;
left: 22%;
top: 453px;
}
}
width: 1800px;
height: 600px;
margin-top: 150px;
justify-content: space-evenly;
.leftBox {
position: relative;
width: 550px;
height: 600px;
background: url("../assets/images/space1.png") no-repeat;
transform: skewX(-5deg);
margin-right: -150px;
// flex-direction: column;
background-size: 98%;
h2 {
position: absolute;
top: 6px;
left: 60%;
transform: translateX(-50%);
color: #ededd8;
font-size: 16px;
font-weight: 700;
height: 40px;
line-height: 40px;
font-size: 20px;
}
p {
position: absolute;
top: 28%;
left: 55%;
transform: translateX(-50%);
color: #fdeda0;
font-size: 20px;
font-weight: 700;
height: 40px;
line-height: 40px;
}
.btn1,
.btn2,
.btn3,
.btn4 {
display: block;
width: 200px;
height: 55px;
background-color: #e9ddab;
margin: 25px auto;
border: none;
border-radius: 5px;
color: #333;
font-size: 20px;
font-weight: 700;
transform: skewX(-17deg);
}
.btn1 {
position: absolute;
top: 238px;
left: 31%;
}
.btn2 {
position: absolute;
left: 26%;
top: 320px;
background-color: #e2c04f;
}
.btn3 {
position: absolute;
left: 22%;
top: 403px;
}
.btn4 {
position: absolute;
left: 18%;
top: 483px;
}
}
.rightBoxes {
width: 1200px;
height: 600px;
// background-color: skyblue;
// flex: 1;
display: flex;
justify-content: space-around;
flex-direction: column;
transform: skewX(-17deg);
.topBox {
// width: 800px;
// height: 300px;
flex: 1;
background-color: lightgreen;
background: url("../assets/images/space2.png") no-repeat;
background-size: 98%;
// display: flex;
// justify-content: center;
// align-items: center;
transform: skewX(15deg);
.el-input {
width: 450px;
height: 50px;
}
:deep(.el-form-item__error) {
left: 90px;
}
}
.bottomBox {
margin-top: 36px;
flex: 1;
// width: 800px;
// height: 200px;
background-color: lightcoral;
background: url("../assets/images/space3.png") no-repeat;
background-size: 98%;
// display: flex;
// justify-content: center;
// align-items: center;
transform: skewX(15deg);
.el-input {
width: 450px;
height: 50px;
}
:deep(.el-form-item__error) {
left: 90px;
}
}
.rightBoxes {
width: 1200px;
height: 600px;
// background-color: skyblue;
// flex: 1;
display: flex;
justify-content: space-around;
flex-direction: column;
transform: skewX(-17deg);
.topBox {
// width: 800px;
// height: 300px;
flex: 1;
background-color: lightgreen;
background: url("../assets/images/space2.png") no-repeat;
background-size: 98%;
// display: flex;
// justify-content: center;
// align-items: center;
transform: skewX(15deg);
.el-input {
width: 450px;
height: 50px;
}
:deep(.el-form-item__error) {
left: 90px;
}
}
.bottomBox {
margin-top: 36px;
flex: 1;
// width: 800px;
// height: 200px;
background-color: lightcoral;
background: url("../assets/images/space3.png") no-repeat;
background-size: 98%;
// display: flex;
// justify-content: center;
// align-items: center;
transform: skewX(15deg);
.el-input {
width: 450px;
height: 50px;
}
:deep(.el-form-item__error) {
left: 90px;
}
}
}
}
}
// .personal-center {
@ -470,5 +502,5 @@ const handleClose = () => {
// transform: skewX(-15deg);
// display: flex;
// }</style>
// }
</style>

@ -1,32 +1,41 @@
import router from "./router";
import userStore from "./store/modules/user";
import { getToken } from "./utils/auth";
import pinia from "./store";
import userStore from "./store/modules/user";
import { getToken, clearLocalStorage } from "@/utils/auth";
const store = userStore(pinia);
router.beforeEach((to: any, from: any, next: any) => {
router.beforeEach(async (to:any, from:any, next:any) => {
const { token, userInfo, getUserInfo } = store;
if (to.path === "/login") {
if (store.token) {
next("/studyPage");
} else {
next();
}
// next();
} else {
const token = getToken();
if (token) {
console.log(store.userInfo);
if (store.userInfo) {
next();
} else {
store.getUserInfo().then(() => {
next();
});
}
// next();
} else {
next("/login");
}
token ? next("/studyPage") : next();
return;
}
const authToken = getToken();
if (!authToken) {
return redirectToLogin(next);
}
if (userInfo) {
return next();
}
try {
await getUserInfo();
next();
} catch (error) {
console.error("获取用户信息失败:", error);
redirectToLogin(next);
}
});
const redirectToLogin = (next: any) => {
clearLocalStorage();
next("/login");
};
export default router;

@ -32,9 +32,15 @@ const userStore = defineStore("userStore", {
this.userInfo = null;
},
async getUserInfo() {
const res:any = await getUserInfo();
this.userInfo = res.result.userInfo;
console.log(res);
try {
const res:any = await getUserInfo();
this.userInfo = res.result.userInfo;
console.log(res);
} catch (error) {
console.log(error);
}
// this.userInfo = res.result;
},

@ -4,8 +4,21 @@ const setToken = (token: string): void => {
};
const getToken = () => localStorage.getItem(TOKEN_KEY) || "";
const removeToken = () => localStorage.removeItem(TOKEN_KEY);
const clearLocalStorage = () => {
removeToken();
localStorage.removeItem("activeStepIndex");
localStorage.removeItem("experimentPreservation");
localStorage.removeItem("saveRoute");
localStorage.removeItem("isRunCode");
localStorage.removeItem("falg");
localStorage.removeItem("product");
localStorage.removeItem("installationStep");
localStorage.removeItem("stepIds");
}
export {
setToken,
getToken,
removeToken,
clearLocalStorage
};

@ -5,45 +5,71 @@ import { ElMessage } from "element-plus";
import { removeToken } from "@/utils/auth";
import userStore from "@/store/modules/user";
import router from "@/router";
// 创建axios实例
const server = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 30000,
});
// 创建请求拦截器
// 获取用户状态
// 创建请求拦截器
server.interceptors.request.use((config) => {
const useuserStore = userStore(pinia);
const useUserStore = userStore(pinia);
config.headers.Authorization = useuserStore.token;
config.headers["x-access-token"] = useuserStore.token;
if (useUserStore.token) {
config.headers.Authorization = useUserStore.token;
config.headers["x-access-token"] = useUserStore.token;
}
return config;
});
// 处理错误的通用方法
const handleAuthError = (message:string) => {
const useUserStore = userStore(pinia);
ElMessage.error(message);
removeToken();
useUserStore.token = "";
router.push("/login");
};
// 创建相应拦截器
server.interceptors.response.use((response) => {
if (response.data.code === 401) {
const useuserStore = userStore(pinia);
server.interceptors.response.use(
(response) => {
const { code, message } = response.data;
// useuserStore.clearStatus();
// return Promise.reject(response);
}
if (response.data.code != 200 && response.data.code != 0) {
ElMessage.error(response.data.message);
return Promise.reject(response);
}
if (response.data.code === 401) {
ElMessage.error(response.data.message);
return Promise.reject(response);
}
if (response.data.code === 412) {
ElMessage.error(response.data.message);
removeToken();
router.push("/login");
return Promise.reject(response);
}
return response.data;
});
switch (code) {
case 401:
case 412:
handleAuthError(message);
return Promise.reject(response);
case 200:
case 0:
return response.data;
default:
ElMessage.error(message);
return Promise.reject(response);
}
},
(error) => {
if (error.response) {
const { status, data } = error.response;
switch (status) {
case 401:
case 403:
case 500:
handleAuthError(data.message);
break;
default:
ElMessage.error(data.message || "请求出错,请稍后再试");
}
}
// 暴露axios实例
return Promise.reject(error);
}
);
export default server;

Loading…
Cancel
Save