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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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');
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'));
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';
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';
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毫秒后过期。
}
}));
//登录功能
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;
}
if (results.length > 0) {
// 登录成功
//req.session.username = username; // 将用户名存储在session中
res.redirect('/work1.html?username=' + username + '&userid=' + results[0].id); // 登录成功后重定向到系统主页面
} else {// 登录失败,可以重定向到登录页面并显示错误信息
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。
var username = req.body.username;
connection.query('SELECT id FROM mail WHERE name = ?', [username], function(error, results, fields) {//查询结果通过回调函数传递给results
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。
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('/');
})
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!');
});
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})