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/www3/main.js

259 lines
9.7 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('识别系统') + '<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)
})