You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
teamwk/www/main.js

211 lines
8.4 KiB

8 months ago
var mysql = require('mysql');
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
const crypto = require('crypto');
const fs = require('fs');
const path = require('path');
const fileUpload = require('express-fileupload');
const session = require('express-session');
const multer = require('multer');
8 months ago
var connection = mysql.createConnection({
host : 'localhost',
port : '13307',
user : 'root',
password : '123456',
database : 'mailbox'
});
// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })
app.use(express.static('static'));
8 months ago
app.get('/', function (req, res) {
//var result_string = build_html_head('识别系统') + '<h2>欢迎来到识别系统!</h2>\r\n';
var result_string = build_html_head('识别系统') + '<h2 style="text-align:center;">欢迎来到识别系统!</h2>\r\n';
8 months ago
connection.query('SELECT * FROM mail;', function (error, results, fields) {
if (error) {
console.log('[SELECT ERROR] - ',error.message);
return;
}
console.log('[SELECT SUCCESS]');
for (var i = results.length - 1; i >= 0; i--) {
result_string +='<tr>\r\n';
result_string += (' <td>'
+ results[i].name
+ '</td><td>'
+ results[i].passwd
+ '</td><td>'
+ results[i].id
+ '</td><td>'
+ results[i].msg
+ '</td>\r\n');
result_string +='</tr>\r\n';
}
result_string +='</table>\r\n';
8 months ago
result_string +='<a class="link_button" href="form.html">注册用户</a>\r\n'
result_string +='<div style="text-align: right;">\r\n';
result_string +='<a class="link_button" href="welcome.html" >登陆界面</a>\r\n';
result_string +='</div>\r\n';
res.send(result_string + build_html_foot())
});
})
// Multer是一个Node.js中间件用于处理multipart/form-data类型的表单数据
const upload = multer({ dest: 'uploads/' }); // 上传文件的临时存储目录
// 单文件上传
app.post('/api/upload', upload.single('image'), function(req, res) {
if (!req.file) {
return res.status(400).send('No file uploaded.');
}
const file = req.file;
const tempFilePath = file.path;
const hash = crypto.createHash('sha256');
const input = fs.createReadStream(tempFilePath);
input.on('data', (data) => {
hash.update(data);
});
input.on('end', () => {
const fileHash = hash.digest('hex');
const fileName = file.originalname;
const filePath = path.join(__dirname, 'uploads', fileName);
// Check if file with same hash already exists in database
const sqlCheck = 'SELECT name FROM images WHERE hash = ?';
connection.query(sqlCheck, [fileHash], function(err, result) {
if (err) {
console.log(err);
return res.status(500).send('Error checking file in database');
}
if (result.length > 0) {
// If file with same hash exists, return "has been uploaded"
fs.unlinkSync(tempFilePath); // Delete the uploaded file
return res.json({ message: 'File with same hash already uploaded', fileName: 'hasbeen uploaded'});
} else {
fs.rename(tempFilePath, filePath, function(err) {
if (err) {
console.log(err);
return res.status(500).send('Error uploading file');
} else {
const sql = 'INSERT INTO images (name, path, hash) VALUES (?, ?, ?)';
connection.query(sql, [fileName, filePath, fileHash], function(err, result) {
if (err) {
console.log(err);
return res.status(500).send('Error uploading file to database');
}
res.json({ message: 'File uploaded successfully', fileName: fileName });
});
}
});
}
});
});
});
app.use(session({ // 这里是在Express应用程序中使用会话中间件并传入一个包含会话配置选项的对象。
secret: 'your_secret_key', // 指定会话的密钥,用于加密会话数据,确保会话数据的安全性。
resave: false, // 在会话数据没有发生变化的情况下是否强制重新保存会话数据。这里设置为false表示不强制重新保存。
saveUninitialized: true, // 是否在会话初始化时保存未修改过的会话。设置为true表示保存未修改过的会话。
cookie: { // 配置会话的cookie参数
maxAge: 60000 // 指定了会话的过期时间单位是毫秒。在这里会话会在60秒即60000毫秒后过期。
8 months ago
}
}));
//登录功能
app.post('/login', urlencodedParser, function(req, res) {
var username = req.body.username;
var password = req.body.passwd;
// 查询数据库中是否存在匹配的用户名和密码
connection.query('SELECT * FROM mail WHERE name = ? AND passwd = ?', [username, password], function(error, results, fields) {
if (error) {
console.log('[SELECT ERROR] - ', error.message);
res.send('数据库查询错误!'); // 可以重定向到登录页面或其他处理方式
return;
}
8 months ago
if (results.length > 0) {
// 登录成功
//req.session.username = username; // 将用户名存储在session中
res.redirect('/work1.html?username=' + username + '&userid=' + results[0].id); // 登录成功后重定向到系统主页面
} else {// 登录失败,可以重定向到登录页面并显示错误信息
8 months ago
console.log('[用户名或密码不正确]');
res.send('<script>alert("用户名或密码不正确");window.location.href="welcome.html";</script>');
}
});
})
app.post('/idcheck', urlencodedParser, function(req, res) {//处理一个POST请求路径为/idcheck并传入一个中间件urlencodedParser用于解析POST请求中的表单数据。回调函数包含了请求对象req和响应对象res。
8 months ago
var username = req.body.username;
connection.query('SELECT id FROM mail WHERE name = ?', [username], function(error, results, fields) {//查询结果通过回调函数传递给results
8 months ago
if (error) {
console.log('[SELECT ERROR] - ', error.message);
res.send('数据库查询错误!');
return;
}
if (results.length > 0 && results[0].id === 'admin') {//在查询结果中如果存在匹配的用户且该用户的ID为admin则返回一个包含用户ID为admin的响应对象。
res.send({ userid: 'admin' });//响应对象res返回一个包含用户ID为admin的JSON对象。
} else {//如果查询结果为空或者查询到的用户ID不是admin则返回一个空的用户ID。
8 months ago
res.send({ userid: '' });
}
});
});
app.post('/insertrecord', urlencodedParser, function (req, res) {
var insert_sql = 'INSERT INTO mail(name, passwd, id, msg) VALUES(?,?,?,?)';
var insert_params = [req.body.name, req.body.passwd, req.body.id, req.body.msg];
connection.query(insert_sql, insert_params, function(error, result) {
if (error) {
console.log('[INSERT ERROR] - ',error.message);
return;
}
console.log('[INSERT SUCCESS]');
});
res.redirect('/');
})
8 months ago
function build_html_head(title) {
var html_fragment = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 '
+'Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\r\n';
html_fragment += '<html lang="en">\r\n';
html_fragment += '<head>\r\n';
html_fragment += ' <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">\r\n';
html_fragment += ' <title>' + title +'</title>\r\n';
html_fragment += ' <link rel="stylesheet" href="style.css">\r\n';
html_fragment += '</head>\r\n';
html_fragment += '<body>\r\n';
return html_fragment;
}
function build_html_foot() {
return '</body>\r\n</html>';
}
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
connection.connect(function(err){
if(err){
console.log('[query] - :'+err);
return;
}
console.log('[connection connect] succeed!');
8 months ago
});
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})