jk-2024.07.09-10:08

pull/1/head
陈@jkccchen123 7 months ago
parent 42b489af41
commit 1a05750044

@ -1,201 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>中草药识别</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
padding: 20px;
background-color: #f8f8f8;
color: #333;
}
h1 {
text-align: center;
color: #009688;
}
p {
color: #666;
}
ul {
list-style-type: square;
margin-left: 20px;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: center;
}
th {
background-color: #f2f2f2;
}
img {
max-width: 100%;
height: auto;
margin-top: 20px;
}
.module {
padding: 10px;
margin: 10px;
border: 1px solid #009688;
background-color: #e0f2f1;
cursor: pointer;
transition: background-color 0.3s;
}
.module:hover {
background-color: #b2dfdb;
}
.return-btn {
display: block;
margin-top: 10px;
padding: 10px;
background-color: #138b5b;
color: #fff;
text-align: center;
text-decoration: none;
cursor: pointer;
border-radius: 5px;
}
.return-btn:hover {
background-color: #517900;
}
.link_button {
margin: 10px 5%;
padding: 10px 18px;
color: #fff;
font-size: 14px;
font-weight: bold;
border-radius: 4px;
background: #FD8008;
text-decoration: none;
top: 20px;
position: relative;
width: 600px;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function() {//从后端获取用户名
var params = new URLSearchParams(window.location.search);
var username = params.get('username');
if (username) {
document.getElementById('username1').textContent = username;
}
});
document.addEventListener('DOMContentLoaded', function() {//从后端获取这个用户的身份user/admin
var params = new URLSearchParams(window.location.search);
var userid = params.get('userid');
if (userid === 'admin') {
document.getElementById('managementBtn').style.display = 'block'; // 显示后台管理按钮
} else {
document.getElementById('managementBtn').style.display = 'none'; // 隐藏后台管理按钮
}
});
</script>
</head>
<body>
<!-- 把后端获取的用户名显示在欢迎标题上 -->
<h1>欢迎您,尊敬的 <span id="username1"></span></h1>
<p>欢迎访问中草药识别系统!</p>
<!-- 按钮列表 -->
<div id="moduleSelection">
<div class="module" onclick="openModule('reservation')">识别查询</div>
<div class="module" onclick="openModule('management')" id="managementBtn" >后台管理</div>
</div>
<div id="reservation" style="display: none;">
<h2>识别模块</h2>
<p>在这里上传你的中草药图片进行识别。</p>
<form id="uploadForm" enctype="multipart/form-data">
<input type="file" id="fileInput" name="image" accept="image/*">
<button class="link_button" type="button" onclick="uploadImage()">上传并识别</button>
</form>
<div id="result"></div>
<a href="#" class="return-btn" onclick="goBack()">返回</a>
</div>
<div id="management" style="display: none;">
<h2>系统后台数据查询与管理模块</h2>
<p>这是后台数据管理模块的内容。</p>
<a href="#" class="return-btn" onclick="goBack()">返回模块选择</a>
</div>
<!-- 页尾的一些用户友好内容 -->
<h2>联系我们</h2>
<p>如有任何关于系统的疑问或建议,请联系我们:</p>
<address>
电子邮件:<a href="mailto:aa893824054@163.com">aa893824054@163.com</a><br>
电话184-7635-1355
</address>
<script>
function openModule(moduleId) {//打开模块的功能
var modules = document.getElementsByClassName('module');
for (var i = 0; i < modules.length; i++) {
modules[i].style.display = 'none';
}
document.getElementById('moduleSelection').style.display = 'none';
document.getElementById(moduleId).style.display = 'block';
}
function uploadImage() {//上传图片的功能
var formData = new FormData(document.getElementById("uploadForm"));
// 更换你的实际服务器端API地址
fetch('your-server-url/api/upload', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
document.getElementById("result").innerHTML = "识别结果: " + data.result;
})
.catch(error => console.error('Error:', error));
}
document.addEventListener('DOMContentLoaded', function() {//监听程序,用来解决:点击返回按钮后重新出现“后台管理”按钮的问题
var params = new URLSearchParams(window.location.search);
var username = params.get('username');//获取用户名
if (username) {
document.getElementById('username1').textContent = username;
}
var userid = params.get('userid');//获取身份
updateManagementButtonDisplay(userid);
})
function updateManagementButtonDisplay(userid) {//根据身份设定“后台管理”按钮是否隐藏
if (userid === 'admin') {
document.getElementById('managementBtn').style.display = 'block';
} else {
document.getElementById('managementBtn').style.display = 'none';
}
}
function goBack() {//返回功能同时也是“不断监测id来决定是否隐藏后台管理按钮”的功能的组成部分
var modules = document.getElementsByClassName('module');
for (var i = 0; i < modules.length; i++) {
modules[i].style.display = 'block';
}
document.getElementById("moduleSelection").style.display = 'block';
document.getElementById("reservation").style.display = 'none';
document.getElementById("management").style.display = 'none';
var params = new URLSearchParams(window.location.search);
var userid = params.get('userid');
updateManagementButtonDisplay(userid);
}
</script>
</body>
</html>

@ -0,0 +1,17 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}\\main.js"
}
]
}

@ -1,74 +1,62 @@
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',
port : '13307 ',
user : 'root',
password : '123456',
database : 'mailbox'
});
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
// 创建 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';
//result_string +='<table width="90%" class="table">\r\n';
//result_string +='<tr><th>用户名</th><th>密码</th><th>身份</th><th>备注</th></tr>\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'
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 +='<a class="link_button" href="welcome.html" >前往登陆</a>\r\n';
result_string +='</div>\r\n';
res.send(result_string + build_html_foot())
});
})
// 文件上传接口
app.post('/fileUpload', function(req, res){
// 上传的文件在req.files中
const filename = req.files[0].path + pathLib.parse(req.files[0].originalname).ext
console.log(filename);
fs.rename(req.files[0].path, filename, function(err){
if(err){
res.send(err)
}else{
res.send('upload successfully')
console.log('[上传成功]' + filename);
}
})
})
const session = require('express-session');
app.use(session({ // 这里是在Express应用程序中使用会话中间件并传入一个包含会话配置选项的对象。
secret: 'your_secret_key', // 指定会话的密钥,用于加密会话数据,确保会话数据的安全性。
resave: false, // 在会话数据没有发生变化的情况下是否强制重新保存会话数据。这里设置为false表示不强制重新保存。
@ -78,11 +66,10 @@ app.use(session({ // 这里是在Express应用
}
}));
//登录功能
app.post('/login', urlencodedParser, function(req, res) {
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) {
@ -101,6 +88,7 @@ app.post('/login', urlencodedParser, function(req, res) {
});
})
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
@ -118,10 +106,9 @@ app.post('/idcheck', urlencodedParser, function(req, res) {//处理一个POST请
});
app.post('/insertrecord', urlencodedParser, function (req, res) {
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);
@ -133,7 +120,101 @@ app.post('/insertrecord', urlencodedParser, function (req, res) {
})
function build_html_head(title) {
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';
@ -145,11 +226,11 @@ function build_html_head(title) {
html_fragment += '<body>\r\n';
return html_fragment;
}
function build_html_foot() {
function build_html_foot() {//no'de页面尾部
return '</body>\r\n</html>';
}
var server = app.listen(8081, function () {
var server = app.listen(8083, '0.0.0.0', function () {
var host = server.address().address
var port = server.address().port

@ -0,0 +1,92 @@
var mysql = require('mysql');
var express = require('express');
var cors = require('cors');
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'
});
app.use(cors())
//上传并识别功能
const upload = multer({ dest: 'uploads/' }); // 上传文件的临时存储目录 // Multer是一个Node.js中间件用于处理multipart/form-data类型的表单数据
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);
const user_name = req.query.user_name
// Check if file with same hash already exists in database
const sqlCheck = 'SELECT * 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: '识别成功,结果为:' + result[0].goods});//如果文件已经存在,则返回这个文件的对应的匹配结果
} 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, username) VALUES (?, ?, ?, ?)';
connection.query(sql, [fileName, filePath, fileHash, user_name], 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 });
});
}
});
}
});
});
});
var server = app.listen(8084, '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)
})

@ -1,5 +1,5 @@
{
"name": "www",
"name": "www2",
"lockfileVersion": 3,
"requires": true,
"packages": {
@ -149,6 +149,18 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"node_modules/cors": {
"version": "2.8.5",
"resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dependencies": {
"object-assign": "^4",
"vary": "^1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@ -276,6 +288,17 @@
"node": ">= 0.10.0"
}
},
"node_modules/express-fileupload": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.5.0.tgz",
"integrity": "sha512-jSW3w9evqM37VWkEPkL2Ck5wUo2a8qa03MH+Ou/0ZSTpNlQFBvSLjU12k2nYcHhaMPv4JVvv6+Ac1OuLgUZb7w==",
"dependencies": {
"busboy": "^1.6.0"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/express-session": {
"version": "1.18.0",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.0.tgz",

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save