var express = require('express'); const http = require('http').Server(router); var router = express.Router(); var bodyParser = require('body-parser'); var path = require("path"); const nodemailer = require('nodemailer'); const fs = require('fs'); const multer = require('multer') const Database = require('sqlite-async'); const { name } = require('ejs'); var execSync = require('child_process').execSync; var jsonParser = bodyParser.json(); var urlencodedParser = bodyParser.urlencoded({ extended: false }) const moment = require('moment'); // 使用 moment.js 来方便地处理时间格式 //桌面latest版 function execute(cmd){ execSync(cmd,{cwd:'C:\\Users\\17217\\Desktop\\english\\python'},function(error, stdout, stderr){ if (error){ console.log("error!") console.error(error); } else{ console.log("运行成功!") } }) } //邮箱发送验证码 function sendMails(mailId, VerificationCode){ //设置邮箱配置、资源链接池 var transporter = nodemailer.createTransport({ //host:'smtp.qq.com', //邮箱服务的主机,smtp.qq.com service: 'qq', port: '465', //对应的端口号QQ邮箱的端口号是465 secure: false, //开启安全连接 auth: { //用户信息 user: '1721777650@qq.com', //用来发邮件的邮箱账户 pass: 'woaibabamama' //这里的密码是qq的smtp授权码,可以去qq邮箱后台开通查看 } }); //设置收件人信息、邮件内容 var mailOptions = { from: '1721777650@qq.com', //发送者 to: '947213307@qq.com', //接收者 subject: '验证码邮件', //主题 text: '您的注册验证码为' + VerificationCode, //文本内容 }; transporter.sendMail(mailOptions, (error) => { if (error) { return console.log(error); } console.log('邮件发送成功,发送至:', mailId); }); } //验证码生成 function getVerificationCode(){ //传入需要的字符串长度 // 准备一个用来抽取码的字符串,或者字典 var verification_code_str = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; //数字和字母 // 获取某个范围的随机整数,封装的函数,在上面抽取字典的时候进行了调用 function getRandom(min, max) { //获取min-max数字之间的某个随机数,直接调用即可 return Math.round(Math.random() * (max - min) + min); } let newStr = ''; //创建一个空字符串,用来拼接四位随机码 for (var i = 0; i < 4; i++) { //for循环四次,则拼接四位随机码 newStr += verification_code_str[getRandom(0, verification_code_str.length - 1)]; //从字典中随机选一个下标,并拼接到空字符串中 } return newStr } function delDir(p) { //删除文件夹,用于注销用户 // 读取文件夹中所有文件及文件夹 var list = fs.readdirSync(p) list.forEach((v) => { // 拼接路径 var url = p + '/' + v // 读取文件信息 var stats = fs.statSync(url) // 判断是文件还是文件夹 if (stats.isFile()) { // 当前为文件,则删除文件 fs.unlinkSync(url) } else { // 当前为文件夹,则递归调用自身 arguments.callee(url) } }) // 删除空文件夹 fs.rmdirSync(p) } // 定义全局变量 global.myVariable = ''; global.myVariable1 = ''; global.myVariable2 = ''; // 每2分钟更新一次全局变量 setInterval(function() { global.myVariable = ''; global.myVariable1 = '' global.myVariable2 = ''; }, 120000); router.get('/guanli', function (req, res, next) { res.render('guanli', { xiugai_success: req.session.message }); }); // 响应主页请求 router.get('/zuozhan', function(req, res) { const title = 'Dynamic EJS Page'; const message = myVariable; res.render('zuozhan', { title: title, message: message });//将动态数据渲染到前端界面 }); // 响应主页请求 router.get('/zuozhan2', function(req, res) { const title = 'Dynamic EJS Page'; const message = myVariable2; res.render('zuozhan2', { title: title, message: message });//将动态数据渲染到前端界面 }); /* GET home page. */ router.get('/', function (req, res, next) { // const checkUserStatus = setInterval(() => { if (req.session.user) { admin_portal_link = req.session.admin ? '/data/admin' : ''; res.render('index', { user_name: req.session.user, admin_portal: admin_portal_link, admin: req.session.admin, message: req.session.message }); } else { if (!req.session.error) req.session.error = "请先登录!" res.redirect('login'); } // },1000) }); /* Login functions */ router.get('/login', function (req, res) { res.render('login', { login_error: req.session.error }); }); router.get('/download', function (req, res, next) { res.render('download'); }); router.post('/login', urlencodedParser, function (req, res, next) { var name = req.body.name; // 获取当前时间并格式化 const now = new Date(); const loginTime = now.toISOString(); // 使用 ISO 格式的时间字符串 // 在 name 获取后,添加文件操作代码 //const fs = require('fs'); const path = 'C:/Users/17217/Desktop/teamwk123/log.txt'; // 文件路径 // 将 name 和 loginTime 写入文件,追加模式 fs.appendFile(path, `${name} - ${loginTime}\n`, function (err) { if (err) { console.error('写入文件时发生错误:', err); // 你可以选择返回错误响应或者继续执行 return; } console.log('用户名和登录时间已写入文件:', name, loginTime); }); var pwd = req.body.pwd; var sqlite3 = require('sqlite3').verbose() var sql = "SELECT * FROM users where username='" + name + "' and password='" + pwd+"'" var db = new sqlite3.Database('data.db', () => { db.get(sql, function (err, row) { if (row== undefined) { console.log('error'); req.session.error = "用户名或密码错误,请重新输入!"; res.redirect('login'); } else { username = name; // 使用 const 来定义变量 // var exec = require('child_process').exec; // exec(`python C:/Users/17217/Desktop/english/users/admin/log.py `+username) // db.run("delete from "+name,function(){ //每次先将表信息清空再重新读取文件夹里面的文件信息 // }); // fs.readdir('./users/'+name, 'utf8', function(err, data) { // console.log(data); // for (var key in data) { // console.log(key); // var a=key // console.log(data[key]); // var b=data[key] // var c = fs.statSync(path.join(__dirname,'../users/'+name+'/'+data[key])) // console.log(c.size) // var add = db.prepare("INSERT INTO "+name+"(fid,fname,fsize,fowner) VALUES(?,?,?,?)");//读取用户名文件夹下文件ID、文件名、大小并写入数据库中 // add.run(a,b,c.size,name); // add.finalize(); // } // }) if (name == 'admin') { req.session.error = '' req.session.message = ''; req.session.user = 'admin'; req.session.admin = true; res.redirect('/') } else{ req.session.error = '' req.session.message = ''; req.session.user = req.body.name; req.session.admin = false; res.redirect('/') } } } ); }) }); router.get('/register', function (req, res, next) { res.render('register'); }); global.h1=''; //定义全局变量h1用于保存验证码信息 router.post('/register', urlencodedParser, function (req, res, next) { var name = req.body.username; var pwd = req.body.pwd1; var pwd1 =req.body.pwd2; var code1 = req.body.code; var mailId =req.body.email; if(code1=='') { VerificationCode = getVerificationCode() //生成随机码 global.h1 = VerificationCode; console.log('发送的验证码为:'+ VerificationCode) sendMails(mailId, VerificationCode) //发送邮箱验证码 } else{ if(code1==h1) { var sqlite3 = require('sqlite3').verbose() var sql = "SELECT * FROM users where username='" + name+"'" var db = new sqlite3.Database('data.db', () => { db.get(sql, function (err, row) { if(name==''||pwd=='') { res.send("用户名或密码不能为空!"); } else{ if (row == undefined) { if(pwd==pwd1){ fs.mkdir(path.join(__dirname, '../users/'+name), (err) => { if (err) { return console.error(err); } console.log('Directory created successfully!'); }); var a="create table "+name+"(fid varchar(15),fname varchar(15),fsize varchar(15),fowner varchar(15))" db.run(a) var add = db.prepare("INSERT INTO users(username,password) VALUES(?,?)"); add.run(req.body.username, req.body.pwd1); add.finalize(); res.redirect('login'); } else{ res.send("输入密码不一致!"); } } else { res.send("该用户名已存在,请重新注册"); } } } ); }) } else{ res.send("验证码错误!"); } } }); //文件上传页面 //上传文件到本地文件夹 router.post('/upload', multer({dest:'./users/'}).any(),function(req, res){ filepath = 'users/admin/' filename = req.files[0].destination + req.files[0].originalname console.log("filename: "+filename); console.log("username: "+username) fs.rename(req.files[0].path, filepath + req.files[0].originalname, function(err){//重命名 new_name = filepath + req.files[0].originalname originalname=req.files[0].originalname console.log("new_name: "+ new_name) var exec = require('child_process').exec; new_name2='./'+new_name console.log("new_name2: "+ new_name2) if (err){ res.send(err) } else{ var sqlite3 = require('sqlite3').verbose() var db = new sqlite3.Database('data.db', () => { db.run("delete from "+username,function(){ //每次先将表信息清空再重新读取文件夹里面的文件信息 }); fs.readdir('./users/'+username, 'utf8', function(err, data) { //读取用户名文件夹下文件ID、文件名、大小并写入数据库中 console.log(data); for (var key in data) { console.log(key); var a=key console.log(data[key]); var b=data[key] var c = fs.statSync(path.join(__dirname,'../users/'+username+'/'+data[key])) console.log(c.size) var add = db.prepare("INSERT INTO "+username+"(fid,fname,fsize,fowner) VALUES(?,?,?,?)"); add.run(a,b,c.size,username); add.finalize(); } }) }) // execute("python D:/99/ui_ref/users/admin/a.py") var exec = require('child_process').exec; exec(`python C:/Users/17217/Desktop/teamwk123/users/admin/decode.py`) res.send('上传成功,点击←返回上一页'); } }) }) //python router.post('/execution',function(req, res){ var exec = require('child_process').exec; exec(`python C:/Users/17217/Desktop/english/users/admin/decode.py`) res.send('运行成功,点击←返回上一页!'); }) router.post("/getit", function (data, res) { fs.readFile("C:\\Users\\17217\\Desktop\\teamwk123\\result.txt", 'utf-8', (err, data) => { if (err) { console.error(err); return; } console.log(data); a = data; res.send(a); }); }) router.post("/histroy", function (data, res) { fs.readFile("C:\\Users\\17217\\Desktop\\teamwk123\\log.txt", 'utf-8', (err, data) => { if (err) { console.error(err); return; } console.log(data); a = data; res.send(a); }); }) router.post("/log", function (data, res) { fs.readFile("C:\\Users\\17217\\Desktop\\teamwk123\\rizhi.txt", 'utf-8', (err, data) => { if (err) { console.error(err); return; } console.log(data); a = data; res.send(a); }); }) //下达指令接口 router.post('/sendit', urlencodedParser,function (req, res) { var message = req.body.message; console.log(message); myVariable = message; res.send('发送指令成功,点击←返回上一页!'); }) router.post('/sendit1', urlencodedParser,function (req, res) { var message = req.body.message; console.log(message); myVariable2 = message; res.send('发送指令成功,点击←返回上一页!'); }) //回复命令接口 router.post('/sendit2', urlencodedParser,function (req, res) { var message = req.body.message; console.log(message); myVariable1 = message; res.send('已向指挥员回复命令,点击←返回上一页!'); }) //修改用户名 router.post('/xiugai1', urlencodedParser, async function (req, res) { var name = req.body.name; if(name=='') { req.session.message = '用户名不能为空!' res.redirect('guanli'); } else { const db = await Database.open(path.resolve(__dirname, '../data.db')); //使用async await使代码相对顺序执行,防止还没执行数据库操作,req.session.user就改变了 await db.run("update users set code = "+"'"+req.session.user+"'"+" WHERE username = "+"'"+req.session.user+"'",function(err){ }) await db.run("update users set username = "+"'"+name+"'"+" WHERE code = "+"'"+req.session.user+"'",function(err){ }) await db.run("alter table "+req.session.user+" rename to "+name,function(err){ }) fs.rename("users\\"+req.session.user, "users\\"+name, function(err) {//改用户文件夹名字 }) req.session.message = '用户名修改成功!' req.session.user=name res.redirect('guanli'); console.log(req.session.user); } }); //修改密码 router.post('/xiugai2', urlencodedParser, function (req, res) { var pwd = req.body.pwd; if(pwd=='') { req.session.message = '密码不能为空!' res.redirect('guanli'); } else { var sqlite3 = require('sqlite3').verbose() var db = new sqlite3.Database('data.db', () => { db.run("update users set password = "+pwd+" WHERE username = "+"'"+req.session.user+"'",function(err){//数据库查找并修改对应用户名的密码 }) }) req.session.message = '密码修改成功!' res.redirect('guanli'); } }); //用户注销 router.post('/zhuxiao', async function (req, res) { var sqlite3 = require('sqlite3').verbose() var db = new sqlite3.Database('data.db', () => { var sql_del = db.prepare("delete from users where username='"+req.session.user+"'") sql_del.run() db.run("drop table "+req.session.user,function(err){ }) }) delDir("users\\"+req.session.user) req.session.error = '注销成功!' res.redirect('login'); }); /* Logout functions */ router.get('/logout', function (req, res, next) { req.session.user = 0; req.session.message = ''; req.session.admin = false; res.redirect('/') }); module.exports = router;