智能排课系统,集成AI智能算法与教务管理需求,支持自定义排课规则(教师课时、教室容量、课程优先级等),
自动规避时间 / 资源冲突,一键生成课表并支持可视化调整,让排课从繁琐耗时变高效简单!
小明:最近我在做一个排课系统,想在App里加入登录功能,你有没有什么建议?
小李:当然有!登录功能是App的核心部分之一,需要确保安全性。你打算用哪种技术来实现呢?
小明:我计划用React Native来做前端,后端用Node.js,数据库用MySQL。那登录功能应该怎么设计呢?
小李:首先,你需要设计用户表,包括用户名、密码(最好加密存储)、角色等字段。然后在App中创建登录页面,输入用户名和密码后,发送请求到后端进行验证。
小明:那具体怎么写代码呢?能给我看看示例吗?
小李:好的,我们先从后端开始。在Node.js中,可以使用Express框架来处理HTTP请求。下面是一个简单的登录接口示例:
// 后端代码(Node.js + Express)
const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const app = express();
const port = 3000;
// 创建数据库连接
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',
database: 'schedule_db'
});
connection.connect();
app.use(bodyParser.json());
// 登录接口
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 查询用户是否存在
connection.query(
'SELECT * FROM users WHERE username = ?',
[username],
(error, results) => {
if (error) {
return res.status(500).json({ error: '数据库查询失败' });
}
if (results.length === 0) {
return res.status(401).json({ error: '用户名或密码错误' });
}
const user = results[0];
// 这里应该使用哈希算法对密码进行比对,例如bcrypt
if (user.password === password) {
return res.json({ success: true, message: '登录成功', user });
} else {
return res.status(401).json({ error: '用户名或密码错误' });
}
}
);
});
app.listen(port, () => {
console.log(`服务器运行在 http://localhost:${port}`);
});
小明:这段代码看起来不错,但密码直接比较不太安全吧?
小李:你说得对。实际开发中,密码不应该以明文形式存储。我们可以使用bcrypt库来对密码进行哈希处理。
小明:那怎么在注册时处理密码呢?
小李:注册时,用户输入的密码会被哈希后存入数据库。登录时,输入的密码也会被哈希,然后与数据库中的哈希值进行比对。这样即使数据库泄露,攻击者也无法获取原始密码。
小明:明白了。那App端的登录页面该怎么写呢?
小李:如果你用的是React Native,可以使用fetch API向后端发送POST请求。下面是一个简单的登录页面示例:
// App端代码(React Native)
import React, { useState } from 'react';
import { View, TextInput, Button, Alert } from 'react-native';
const LoginScreen = () => {
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const handleLogin = async () => {
const response = await fetch('http://localhost:3000/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ username, password }),
});

const data = await response.json();
if (data.success) {
Alert.alert('登录成功', '欢迎回来!');
} else {
Alert.alert('登录失败', data.error || '未知错误');
}
};
return (
placeholder="用户名" value={username} onChangeText={text => setUsername(text)} style={{ borderWidth: 1, padding: 10, marginBottom: 10 }} /> placeholder="密码" value={password} onChangeText={text => setPassword(text)} secureTextEntry style={{ borderWidth: 1, padding: 10, marginBottom: 10 }} /> ); }; export default LoginScreen; 小明:这个代码很清晰,但我担心网络请求的安全性。 小李:确实,如果使用HTTP,数据可能被窃听。你应该使用HTTPS来加密通信。另外,还可以在登录后生成一个JWT(JSON Web Token)作为认证令牌,用于后续请求的身份验证。 小明:JWT是怎么工作的? 小李:当用户登录成功后,后端生成一个JWT,并返回给客户端。客户端在后续请求中携带该Token,后端验证Token的有效性,从而确认用户身份。 小明:那怎么生成和验证JWT呢? 小李:可以用jsonwebtoken库来实现。下面是一个简单的例子: // 生成JWT(后端) const jwt = require('jsonwebtoken'); const token = jwt.sign({ userId: user.id }, 'your-secret-key', { expiresIn: '1h' }); res.json({ token }); // 验证JWT(中间件) const authenticateToken = (req, res, next) => { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; if (!token) { return res.sendStatus(401); } jwt.verify(token, 'your-secret-key', (err, user) => { if (err) { return res.sendStatus(403); } req.user = user; next(); }); }; 小明:明白了。那登录功能的完整流程大概是怎样的? 小李:大致流程如下: 用户在App中输入用户名和密码。 App将这些信息发送到后端。 后端验证用户名和密码是否正确。 如果正确,生成JWT并返回给App。 App保存JWT,并在后续请求中附带该Token。 后端在每次请求时验证Token的有效性,确保用户身份。 小明:听起来挺复杂的,不过一步步来应该没问题。 小李:没错,只要按照流程逐步实现,就能做出一个安全可靠的登录功能。 小明:谢谢你,我现在对登录功能有了更深入的理解。 小李:不客气!如果你还有其他问题,随时问我。