登录时会先后查询验证user表和student表,只要用户存在任意表中,就会登录成功,否则提示错误信息:用户注册时,所有的信息将会保存到student表中;根据要求,改善代码
时间: 2024-12-06 18:24:22 浏览: 17
为了改进登录和注册功能,使其更加健壮且符合要求,可以进行以下优化:
### 登录功能优化
1. **统一查询**:将对 `user` 表和 `student` 表的查询合并为一个 SQL 查询,以减少数据库访问次数。
2. **返回角色信息**:在查询结果中直接返回用户的角色信息(如 `admin` 或 `student`)。
### 注册功能优化
1. **唯一性检查**:在插入数据前,先检查 `student` 表中是否已经存在相同的 `sid`。
2. **完整的用户信息**:确保所有必要的用户信息都保存到 `student` 表中。
以下是改进后的代码:
#### 改进后的 `login.js`
```javascript
let db = require('../db/index');
exports.login = (req, res) => {
let userid = req.body.userid;
let password = req.body.password;
// 统一查询 user 表和 student 表
let sql = `
SELECT 'admin' AS role FROM user WHERE userid = ? AND password = ?
UNION ALL
SELECT 'student' AS role FROM student WHERE sid = ? AND spassword = ?
`;
db.query(sql, [userid, password, userid, password], (err, results) => {
if (err) {
return res.send({ status: 400, message: "登录失败" });
}
if (results.length > 0) {
return res.send({ status: 200, message: "登录成功", role: results[0].role });
} else {
return res.send({ status: 202, message: '用户名或密码错误' });
}
});
};
```
#### 改进后的 `register.js`
```javascript
let db = require('../db/index');
exports.post = (req, res) => {
const { sid, spassword, sname, scollege, sclass, smajor, sphone, semail } = req.body;
// 检查用户是否存在
db.query('SELECT * FROM student WHERE sid = ?', [sid], (error, results) => {
if (error) {
return res.status(500).json({ success: false, message: '数据库查询错误', error: error.message });
}
if (results.length > 0) {
// 用户已存在
return res.status(409).json({ success: false, message: '账号已存在' });
} else {
// 添加新用户到数据库
const query = 'INSERT INTO student (sid, spassword, sname, scollege, sclass, smajor, sphone, semail) VALUES (?, ?, ?, ?, ?, ?, ?, ?)';
db.query(query, [sid, spassword, sname, scollege, sclass, smajor, sphone, semail], (error, results) => {
if (error) {
return res.status(500).json({ success: false, message: '注册失败', error: error.message });
}
// 注册成功
res.status(201).json({ success: true, message: '注册成功,请登录。' });
});
}
});
};
```
### 前端登录逻辑调整
确保前端登录逻辑能够处理新的响应格式。
#### 改进后的 `login.vue`
```vue
<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.post("http://127.0.0.1:3000/api/login", { 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>
```
通过这些改进,登录和注册功能将更加高效和可靠。
阅读全文