登录时会查询验证数据库中的两个表:user表和studen表,只要满足一个表中存在就可以登录成功。但是student表中的用户登录成功后跳转到stu_home.vue;给出改善后的代码
时间: 2024-12-06 21:22:30 浏览: 14
为了实现您的需求,我们需要对现有的 `login.js` 文件进行修改,并在前端 `login.vue` 中添加逻辑来处理不同用户的跳转。以下是改进后的代码:
### login.js
```javascript
let db = require('../db/index');
exports.login = (req, res) => {
let userid = req.query.userid;
let password = req.query.password;
// 查询 user 表
let sqlUser = 'SELECT * FROM user WHERE userid = ? AND password = ?';
db.query(sqlUser, [userid, password], (err, userData) => {
if (err) {
return res.send({ status: 400, message: "登录失败" });
}
if (userData.length > 0) {
return res.send({ status: 200, message: "登录成功", role: 'admin' });
}
// 如果 user 表没有找到,查询 student 表
let sqlStudent = 'SELECT * FROM student WHERE userid = ? AND password = ?';
db.query(sqlStudent, [userid, password], (err, studentData) => {
if (err) {
return res.send({ status: 400, message: "登录失败" });
}
if (studentData.length > 0) {
return res.send({ status: 200, message: "登录成功", role: 'student' });
}
return res.send({ status: 202, message: '用户名或密码错误' });
});
});
};
exports.register = (req, res) => {
const sql1 = 'SELECT * FROM user WHERE userid = ?';
const sql2 = 'INSERT INTO user (userid, password) VALUES (?, ?)';
db.query(sql1, [req.body.userid], (err, data) => {
if (err) {
return res.send({ status: 400, message: "操作失败" });
}
if (data.length > 0) {
return res.send({ status: 202, message: '用户名已存在' });
} else {
db.query(sql2, [req.body.userid, req.body.password], (err, data) => {
if (err) {
return res.send({ status: 400, message: "注册失败" });
}
res.send({ status: 200, message: "注册成功" });
});
}
});
};
```
### login.vue
```vue
<template>
<el-row style="min-height: 100vh;" class="bg-blue-500">
<el-col :lg="16" :md="12" class="flex items-center justify-center flex-col">
<div class="font-bold text-5xl text-light-500 mb-5">勤以为学</div>
<div class="font-bold text-5xl text-light-500">信以为生</div>
</el-col>
<el-col :lg="8" :md="12" class="bg-light-50 flex items-center justify-center flex-col">
<h2 class="font-bold text-2xl text-blue-500 mb-5">学情监测系统</h2>
<el-form :model="form" :rules="rules" label-width="auto" style="max-width: 600px" ref="formRef">
<el-form-item label="账号" prop="userid">
<el-input v-model="form.userid">
<template #prefix>
<el-icon><User /></el-icon>
</template>
</el-input>
</el-form-item>
<el-form-item prop="password" label="密码">
<el-input v-model="form.password" type="password" show-password>
<template #prefix>
<el-icon><Lock /></el-icon>
</template>
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">登录</el-button>
<el-button class="text-light-blue-500" @click="register">注册</el-button>
<div>{{ form.msg }}</div> <!-- 显示错误或成功消息 -->
</el-form-item>
</el-form>
</el-col>
</el-row>
</template>
<script setup>
import { reactive, ref } from 'vue';
import { useRouter } from 'vue-router';
import axios from 'axios';
import Swal from 'sweetalert2';
const form = reactive({
userid: '',
password: '',
msg: ''
});
const rules = {
userid: [
{ required: true, message: '账号不能为空', trigger: 'blur' },
{ pattern: /^\d{10}$/, message: '账号必须是10位数字', trigger: 'blur' }
],
password: [
{ required: true, message: '密码不能为空', trigger: 'blur' },
{ min: 6, message: '密码长度不少于6位', trigger: 'blur' }
]
};
const formRef = ref(null);
const router = useRouter();
const onSubmit = () => {
formRef.value.validate((valid) => {
if (valid) {
axios.get("http://127.0.0.1:3000/login", {
params: {
userid: form.userid,
password: form.password
}
}).then((response) => {
if (response.data.status === 200) {
localStorage.setItem("islogin", "true");
localStorage.setItem("userid", form.userid);
localStorage.setItem("role", response.data.role);
if (response.data.role === 'admin') {
router.push({ name: 'home' });
} else if (response.data.role === 'student') {
router.push({ name: 'stu_home' });
}
Swal.fire({
icon: 'success',
title: '登录成功',
text: `欢迎回来!`
});
} else {
form.msg = response.data.message;
}
}).catch((error) => {
console.error("登录请求失败:", error);
Swal.fire({
icon: 'error',
title: '登录失败',
text: '输入正确的账号和密码'
});
});
} else {
Swal.fire({
icon: 'warning',
title: '验证失败',
text: '请填写正确的账号和密码'
});
}
});
};
const register = () => {
router.push('/register');
};
</script>
<style scoped></style>
```
### 解释
1. **后端 (`login.js`)**:
- 首先查询 `user` 表,如果找到匹配的用户,则返回成功并设置角色为 `admin`。
- 如果 `user` 表没有找到匹配的用户,再查询 `student` 表。
- 如果 `student` 表中有匹配的用户,则返回成功并设置角色为 `student`。
- 如果两个表都没有找到匹配的用户,则返回登录失败的信息。
2. **前端 (`login.vue`)**:
- 在 `onSubmit` 方法中,发送登录请求时,通过 `params` 参数传递 `userid` 和 `password`。
- 根据返回的 `role` 值,决定跳转到不同的页面(`home` 或 `stu_home`)。
- 使用 `localStorage` 存储用户的登录状态、用户ID和角色信息。
这样,学生用户登录成功后将被重定向到 `stu_home.vue` 页面,而管理员用户将被重定向到 `home.vue` 页面。
阅读全文