feat: 增加删除三个月以前数据库记录的功能

This commit is contained in:
lyz05
2024-10-20 19:11:49 +08:00
parent 89dac978d5
commit 761356c036
3 changed files with 92 additions and 56 deletions

View File

@@ -1,7 +1,7 @@
FROM node:16.18.0-alpine FROM node:16.18.0-alpine
ENV TZ Asia/Shanghai ENV TZ Asia/Shanghai
RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \ RUN apk add tzdata sqlite sqlite-dev && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \ && echo ${TZ} > /etc/timezone \
&& apk del tzdata && apk del tzdata

View File

@@ -73,7 +73,7 @@ async function resolve(req, res) {
res.type("application/xml"); res.type("application/xml");
} }
// 记录视频信息 // 记录视频信息
db.videoinfoInsert({url,title:ret.title}) db.videoInfoInsert({url,title:ret.title})
//B站视频直接重定向 //B站视频直接重定向
if (ret.url) if (ret.url)
res.redirect(ret.url); res.redirect(ret.url);
@@ -86,8 +86,8 @@ async function resolve(req, res) {
async function index(req, res) { async function index(req, res) {
const urls = [mgtv.example_urls[0], bilibili.example_urls[0], tencentvideo.example_urls[0], youku.example_urls[0], iqiyi.example_urls[0]]; const urls = [mgtv.example_urls[0], bilibili.example_urls[0], tencentvideo.example_urls[0], youku.example_urls[0], iqiyi.example_urls[0]];
const path = req.protocol + "://" + req.headers.host + req.originalUrl; const path = req.protocol + "://" + req.headers.host + req.originalUrl;
const resolve_info = await db.accesscountquery() const resolve_info = await db.accessCountQuery()
const hotlist = await db.hotlistquery() const hotlist = await db.hotlistQuery()
res.render("danmaku", { res.render("danmaku", {
path, path,
urls, urls,
@@ -107,4 +107,9 @@ router.get("/", async function (req, res) {
if (!req.query.url) index(req, res); else resolve(req, res); if (!req.query.url) index(req, res); else resolve(req, res);
}); });
router.get("/delete", async function (req, res) {
const rows = await db.deleteAccess();
res.send(`删除三个月以前的记录,删除了${rows}条记录`);
});
module.exports = router; module.exports = router;

View File

@@ -1,19 +1,28 @@
const sqlite3 = require('sqlite3').verbose() const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database( let dbConnected = true; // 连接状态
'./db/danmaku.db', let db;
sqlite3.OPEN_READWRITE,
function (err) { if (dbConnected) {
db = new sqlite3.Database(
'./db/danmaku.db',
sqlite3.OPEN_READWRITE,
function (err) {
if (err) { if (err) {
console.log(err.message) console.log(err.message);
db = null; dbConnected = false; // 更新连接状态
} else {
console.log('Connected to the database successfully');
} }
console.log('connect database successfully') }
} );
) }
// 封装一个异步的 SQL 查询函数 // 封装一个异步的 SQL 查询函数
function query(sql, params = []) { function all(sql, params = []) {
if (!dbConnected) return []; // 返回默认值
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
db.all(sql, params, (err, rows) => { db.all(sql, params, (err, rows) => {
if (err) { if (err) {
@@ -25,7 +34,8 @@ function query(sql, params = []) {
}); });
} }
function insert(sql, params = []) { function run(sql, params = []) {
if (!dbConnected) return null; // 返回默认值
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
db.run(sql, params, function(err) { db.run(sql, params, function(err) {
if (err) { if (err) {
@@ -38,79 +48,100 @@ function insert(sql, params = []) {
} }
async function errorInsert(record) { async function errorInsert(record) {
if (!dbConnected) return null; // 返回默认值
try { try {
const rows = await insert("INSERT INTO Error(ip, url, err, created_at) VALUES(?, ?, ?, datetime('now'))", const rows = await run("INSERT INTO Error(ip, url, err, created_at) VALUES(?, ?, ?, datetime('now'))",
[record.ip,record.url,record.err] [record.ip, record.url, record.err]
) );
return rows return rows;
}catch (err) { } catch (err) {
console.error('Error during data insertion:', err.message); console.error('Error during data insertion:', err.message);
} }
} }
async function accessInsert(record) { async function accessInsert(record) {
if (!dbConnected) return null; // 返回默认值
try { try {
const rows = await insert("INSERT INTO Access(ip, url, UA, created_at) VALUES(?, ?, ?, datetime('now'))", const rows = await run("INSERT INTO Access(ip, url, UA, created_at) VALUES(?, ?, ?, datetime('now'))",
[record.ip,record.url,record.UA] [record.ip, record.url, record.UA]
) );
return rows return rows;
}catch (err) { } catch (err) {
console.error('Error during data insertion:', err.message); console.error('Error during data insertion:', err.message);
} }
} }
async function accesscountquery() { async function accessCountQuery() {
if (!dbConnected) return {'today_visited': "null", 'lastday_visited': "null", 'month_visited': "null"}; // 返回默认值
try { try {
const ret = await query("SELECT * FROM AccessStatistics"); const ret = await all("SELECT * FROM AccessStatistics");
return ret[0]; return ret[0];
} catch (err) { } catch (err) {
console.error('Error during data query:', err.message); console.error('Error during data query:', err.message);
return {'today_visited':"null",'lastday_visited':"null",'month_visited':"null"}; return {'today_visited': "null", 'lastday_visited': "null", 'month_visited': "null"};
} }
} }
async function videoinfoInsert(record) { async function videoInfoInsert(record) {
if (!dbConnected) return null; // 返回默认值
try { try {
const rows = await insert("INSERT INTO videoinfo(url, title) VALUES(?, ?)", const rows = await run("INSERT INTO videoinfo(url, title) VALUES(?, ?)",
[record.url,record.title] [record.url, record.title]
) );
return rows return rows;
}catch (err) { } catch (err) {
console.error('Error during data insertion:', err.message); console.error('Error during data insertion:', err.message);
} }
} }
async function hotlistquery() { async function hotlistQuery() {
if (!dbConnected) return []; // 返回默认值
try { try {
return await query("SELECT * FROM YesterdayHotlist;"); return await all("SELECT * FROM YesterdayHotlist;");
} catch (err) { } catch (err) {
console.error('Error during data query:', err.message); console.error('Error during data query:', err.message);
return null; return null;
} }
} }
// 删除三个月以前的记录Access,Error
async function deleteAccess() {
if (!dbConnected) return null; // 返回默认值
try {
// vacuum
await run("vacuum");
let result,changes = 0;
result = await run("DELETE FROM Access WHERE created_at < datetime('now', '-3 month')");
changes += result.changes;
result = await run("DELETE FROM Error WHERE created_at < datetime('now', '-3 month')");
changes += result.changes;
// vacuum
await run("vacuum");
return changes; // 提取删除的行数
} catch (err) {
console.error('Error during data deletion:', err.message);
return null;
}
}
async function main() { async function main() {
const ret = await hotlistquery() const ret = await deleteAccess();
console.log(ret) console.log(ret);
} }
if (!module.parent) { if (!module.parent) {
accessInsert( accessInsert({
{ 'ip': '127.0.0.1',
'ip': '127.0.0.1', 'url': 'https://www.mgtv.com/b/336727/8087768.html',
'url': 'https://www.mgtv.com/b/336727/8087768.html', 'UA': 'PostmanRuntime/7.37.3'
'UA': 'PostmanRuntime/7.37.3' });
}
) videoInfoInsert({
'url': 'https://www.mgtv.com/b/336727/8087768.html',
videoinfoInsert( 'title': '婚前21天'
{ });
'url': 'https://www.mgtv.com/b/336727/8087768.html',
'title': '婚前21天' main();
}
)
main()
} }
module.exports = { errorInsert, accessInsert, accesscountquery, videoinfoInsert, hotlistquery}; module.exports = { errorInsert, accessInsert, accessCountQuery, videoInfoInsert, hotlistQuery, deleteAccess };