diff --git a/Dockerfile b/Dockerfile index 7d5d6bb..e6fbe4f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM node:16.18.0-alpine 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 \ && apk del tzdata diff --git a/routes/danmaku.js b/routes/danmaku.js index 9a5caa7..70131f6 100644 --- a/routes/danmaku.js +++ b/routes/danmaku.js @@ -73,7 +73,7 @@ async function resolve(req, res) { res.type("application/xml"); } // 记录视频信息 - db.videoinfoInsert({url,title:ret.title}) + db.videoInfoInsert({url,title:ret.title}) //B站视频,直接重定向 if (ret.url) res.redirect(ret.url); @@ -86,8 +86,8 @@ async function resolve(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 path = req.protocol + "://" + req.headers.host + req.originalUrl; - const resolve_info = await db.accesscountquery() - const hotlist = await db.hotlistquery() + const resolve_info = await db.accessCountQuery() + const hotlist = await db.hotlistQuery() res.render("danmaku", { path, urls, @@ -107,4 +107,9 @@ router.get("/", async function (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; diff --git a/utils/db.js b/utils/db.js index 78e010f..2a6c4c7 100644 --- a/utils/db.js +++ b/utils/db.js @@ -1,19 +1,28 @@ -const sqlite3 = require('sqlite3').verbose() +const sqlite3 = require('sqlite3').verbose(); -let db = new sqlite3.Database( - './db/danmaku.db', - sqlite3.OPEN_READWRITE, - function (err) { +let dbConnected = true; // 连接状态 +let db; + +if (dbConnected) { + db = new sqlite3.Database( + './db/danmaku.db', + sqlite3.OPEN_READWRITE, + function (err) { if (err) { - console.log(err.message) - db = null; + console.log(err.message); + dbConnected = false; // 更新连接状态 + } else { + console.log('Connected to the database successfully'); } - console.log('connect database successfully') - } -) + } + ); +} + + // 封装一个异步的 SQL 查询函数 -function query(sql, params = []) { +function all(sql, params = []) { + if (!dbConnected) return []; // 返回默认值 return new Promise((resolve, reject) => { db.all(sql, params, (err, rows) => { 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) => { db.run(sql, params, function(err) { if (err) { @@ -38,79 +48,100 @@ function insert(sql, params = []) { } async function errorInsert(record) { + if (!dbConnected) return null; // 返回默认值 try { - const rows = await insert("INSERT INTO Error(ip, url, err, created_at) VALUES(?, ?, ?, datetime('now'))", - [record.ip,record.url,record.err] - ) - return rows - }catch (err) { + const rows = await run("INSERT INTO Error(ip, url, err, created_at) VALUES(?, ?, ?, datetime('now'))", + [record.ip, record.url, record.err] + ); + return rows; + } catch (err) { console.error('Error during data insertion:', err.message); } } async function accessInsert(record) { + if (!dbConnected) return null; // 返回默认值 try { - const rows = await insert("INSERT INTO Access(ip, url, UA, created_at) VALUES(?, ?, ?, datetime('now'))", - [record.ip,record.url,record.UA] - ) - return rows - }catch (err) { + const rows = await run("INSERT INTO Access(ip, url, UA, created_at) VALUES(?, ?, ?, datetime('now'))", + [record.ip, record.url, record.UA] + ); + return rows; + } catch (err) { 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 { - const ret = await query("SELECT * FROM AccessStatistics"); + const ret = await all("SELECT * FROM AccessStatistics"); return ret[0]; } catch (err) { 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 { - const rows = await insert("INSERT INTO videoinfo(url, title) VALUES(?, ?)", - [record.url,record.title] - ) - return rows - }catch (err) { + const rows = await run("INSERT INTO videoinfo(url, title) VALUES(?, ?)", + [record.url, record.title] + ); + return rows; + } catch (err) { console.error('Error during data insertion:', err.message); } } -async function hotlistquery() { +async function hotlistQuery() { + if (!dbConnected) return []; // 返回默认值 try { - return await query("SELECT * FROM YesterdayHotlist;"); + return await all("SELECT * FROM YesterdayHotlist;"); } catch (err) { console.error('Error during data query:', err.message); 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() { - const ret = await hotlistquery() - console.log(ret) + const ret = await deleteAccess(); + console.log(ret); } if (!module.parent) { - accessInsert( - { - 'ip': '127.0.0.1', - 'url': 'https://www.mgtv.com/b/336727/8087768.html', - 'UA': 'PostmanRuntime/7.37.3' - } - ) - - videoinfoInsert( - { - 'url': 'https://www.mgtv.com/b/336727/8087768.html', - 'title': '婚前21天' - } - ) - main() + accessInsert({ + 'ip': '127.0.0.1', + 'url': 'https://www.mgtv.com/b/336727/8087768.html', + 'UA': 'PostmanRuntime/7.37.3' + }); + + videoInfoInsert({ + 'url': 'https://www.mgtv.com/b/336727/8087768.html', + 'title': '婚前21天' + }); + + main(); } -module.exports = { errorInsert, accessInsert, accesscountquery, videoinfoInsert, hotlistquery}; \ No newline at end of file +module.exports = { errorInsert, accessInsert, accessCountQuery, videoInfoInsert, hotlistQuery, deleteAccess };