|
|
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('识别系统') + '<script src="/login.js"></script> <h2 style="text-align:center;">欢迎来到识别系统!</h2>\r\n';
|
|
|
result_string +='<table width="90%" class="table">\r\n';
|
|
|
result_string +='<tr><th>用户名</th><th>密码</th><th>身份</th><th>邮箱</th></tr>\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())
|
|
|
});
|
|
|
})
|
|
|
|
|
|
|
|
|
app.use(session({ // 这里是在Express应用程序中使用会话中间件,并传入一个包含会话配置选项的对象。
|
|
|
secret: 'your_secret_key', // 指定会话的密钥,用于加密会话数据,确保会话数据的安全性。
|
|
|
resave: false, // 在会话数据没有发生变化的情况下,是否强制重新保存会话数据。这里设置为false,表示不强制重新保存。
|
|
|
saveUninitialized: true, // 是否在会话初始化时保存未修改过的会话。设置为true,表示保存未修改过的会话。
|
|
|
cookie: { // 配置会话的cookie参数,
|
|
|
maxAge: 60000 // 指定了会话的过期时间,单位是毫秒。在这里,会话会在60秒(即60000毫秒)后过期。
|
|
|
}
|
|
|
}));
|
|
|
|
|
|
|
|
|
app.get('/user-info', function(req, res) {
|
|
|
if (req.session.user) {
|
|
|
res.json(req.session.user);
|
|
|
} else {
|
|
|
res.status(401).json({ message: '未登录' });
|
|
|
}
|
|
|
});
|
|
|
|
|
|
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.user = {
|
|
|
id: results[0].id,
|
|
|
username: username
|
|
|
};
|
|
|
res.redirect('/work1.html');
|
|
|
} else {// 登录失败,可以重定向到登录页面并显示错误信息
|
|
|
console.log('[用户名或密码不正确]');
|
|
|
res.send('<script>alert("用户名或密码不正确");window.location.href="welcome.html";</script>');
|
|
|
}
|
|
|
});
|
|
|
})
|
|
|
|
|
|
app.get('/logout', function(req, res) {//用户退出登录功能
|
|
|
req.session.user = null
|
|
|
res.redirect('/welcome.html');
|
|
|
})
|
|
|
|
|
|
|
|
|
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('/');
|
|
|
})
|
|
|
|
|
|
|
|
|
app.get('/api/users', function (req, res) {
|
|
|
// 查询所有用户
|
|
|
connection.query('SELECT * FROM mail', function (error, users) {
|
|
|
if (error) {
|
|
|
console.log('[SELECT ERROR] - ', error.message);
|
|
|
res.status(500).send('数据库查询错误!');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 遍历所有用户,查询每个用户的图片上传次数
|
|
|
let completedRequests = 0;
|
|
|
users.forEach(user => {
|
|
|
connection.query('SELECT COUNT(*) AS imageCount FROM images WHERE username = ?', [user.name], function (error, results) {
|
|
|
if (error) {
|
|
|
console.log('[SELECT ERROR] - ', error.message);
|
|
|
res.status(500).send('数据库查询错误!');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 将查询结果添加到用户对象中
|
|
|
user.imageCount = results[0].imageCount;
|
|
|
|
|
|
// 检查是否所有查询都已完成
|
|
|
completedRequests++;
|
|
|
if (completedRequests === users.length) {
|
|
|
res.json(users);
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
|
|
|
app.get('/api/user-images-count', function (req, res) {
|
|
|
const username = req.query.username;
|
|
|
|
|
|
if (!username) {
|
|
|
res.status(400).json({ error: '用户名不能为空' });
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
connection.query('SELECT COUNT(*) AS imageCount FROM images WHERE username = ?', [username], function (error, results) {
|
|
|
if (error) {
|
|
|
console.log('[SELECT ERROR] - ', error.message);
|
|
|
res.status(500).send('数据库查询错误!');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
res.json({ imageCount: results[0].imageCount });
|
|
|
});
|
|
|
});
|
|
|
|
|
|
|
|
|
app.get('/api/userUploads', function (req, res) {
|
|
|
const sql = 'SELECT username, COUNT(*) AS upload_count FROM images GROUP BY username';
|
|
|
connection.query(sql, function (error, results) {
|
|
|
if (error) {
|
|
|
console.log('[SELECT ERROR] - ', error.message);
|
|
|
res.status(500).send('数据库查询错误!');
|
|
|
return;
|
|
|
}
|
|
|
res.json(results);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
app.post('/api/updateUser', urlencodedParser, function (req, res) {
|
|
|
const { name, passwd, id, msg, oldName } = req.body;
|
|
|
const sql = 'UPDATE mail SET name = ?, passwd = ?, id = ?, msg = ? WHERE name = ?';
|
|
|
connection.query(sql, [name, passwd, id, msg, oldName], function (error, result) {
|
|
|
if (error) {
|
|
|
console.log('[UPDATE ERROR] - ', error.message);
|
|
|
res.status(500).send('更新用户信息失败!');
|
|
|
return;
|
|
|
}
|
|
|
res.json({ message: '用户信息更新成功' });
|
|
|
});
|
|
|
});
|
|
|
|
|
|
app.post('/api/deleteUser', urlencodedParser, function (req, res) {
|
|
|
const { name } = req.body;
|
|
|
const sql = 'DELETE FROM mail WHERE name = ?';
|
|
|
connection.query(sql, [name], function (error, result) {
|
|
|
if (error) {
|
|
|
console.log('[DELETE ERROR] - ', error.message);
|
|
|
res.status(500).send('删除用户失败!');
|
|
|
return;
|
|
|
}
|
|
|
res.json({ message: '用户删除成功' });
|
|
|
});
|
|
|
});
|
|
|
|
|
|
|
|
|
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() {//no'de页面尾部
|
|
|
return '</body>\r\n</html>';
|
|
|
}
|
|
|
|
|
|
var server = app.listen(8083, '0.0.0.0', 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)
|
|
|
}) |