From fe4be1b06ef1ccdb19b873e49b68ab54cfe7585f Mon Sep 17 00:00:00 2001 From: Ching Date: Sun, 9 Feb 2025 18:06:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(app):=20=E6=B7=BB=E5=8A=A0=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E6=97=A5=E5=BF=97=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加了一个新的页面logs.html,用于显示今天的扫描日志。用户可以在该页面上查看扫描的条码和相关信息。 --- app.py | 24 ++++++++- models.py | 63 ++++++++++++++++++++++++ templates/logs.html | 116 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 models.py create mode 100644 templates/logs.html diff --git a/app.py b/app.py index c645e3f..1c4d6b2 100644 --- a/app.py +++ b/app.py @@ -4,7 +4,7 @@ import os import re from apscheduler.schedulers.background import BackgroundScheduler -from flask import Flask, jsonify, request +from flask import Flask, jsonify, request, render_template from pygrocy import EntityType, Grocy import atexit import base64 @@ -16,6 +16,7 @@ import requests from barcode import BarcodeSpider, ShowApiSpider from recipe import get_recipe_from_xiachufang +import models logger = loguru.logger # config = configparser.ConfigParser() @@ -540,6 +541,27 @@ def add_to_stream(): return jsonify({"message": str(e)}), 500 +@app.route('/scanlogs/today', methods=['GET']) +def get_today_scanlogs(): + try: + # 获取今天的所有日志并序列化 + logs = models.ScanLog.get_today_logs() + serialized_logs = [log.serialize() for log in logs] + + return jsonify({ + 'logs': serialized_logs, + 'count': len(serialized_logs) + }), 200 + + except Exception as e: + return jsonify({'error': str(e)}), 500 + + +@app.route('/logs') +def show_logs(): + return render_template('logs.html') + + # 初始化 APScheduler 并添加定时任务 scheduler = BackgroundScheduler() scheduler.add_job(func=consume_stream, trigger="interval", seconds=10) diff --git a/models.py b/models.py new file mode 100644 index 0000000..8d9c978 --- /dev/null +++ b/models.py @@ -0,0 +1,63 @@ +from peewee import * +from datetime import datetime, time +import json + +# Create database instance +db = SqliteDatabase('scanner.db') + +class BaseModel(Model): + class Meta: + database = db + +class BarcodeDB(BaseModel): + barcode = CharField(unique=True) + product_info = TextField() + + class Meta: + table_name = 'barcode_db' + +class ScanLog(BaseModel): + barcode = CharField() + scan_at = DateTimeField(default=datetime.now) + + class Meta: + table_name = 'scan_logs' + + @classmethod + def get_today_logs(cls): + # Get today's start and end timestamps + today = datetime.now().date() + today_start = datetime.combine(today, time.min) # Start of day (00:00:00) + today_end = datetime.combine(today, time.max) # End of day (23:59:59.999999) + + # Query logs for today + return cls.objects.filter( + scan_at__gte=today_start, + scan_at__lte=today_end + ).order_by('-scan_at') + + def serialize(self): + # Try to get product info from BarcodeDB + name = None + try: + product = BarcodeDB.get(BarcodeDB.barcode == self.barcode) + product_info = json.loads(product.product_info) + name = product_info.get('name') + except BarcodeDB.DoesNotExist: + pass + + return { + 'barcode': self.barcode, + 'name': name, + 'scan_at': self.scan_at + } + + + +# Create tables +def create_tables(): + with db: + db.create_tables([BarcodeDB, ScanLog]) + +if __name__ == '__main__': + create_tables() diff --git a/templates/logs.html b/templates/logs.html new file mode 100644 index 0000000..448b934 --- /dev/null +++ b/templates/logs.html @@ -0,0 +1,116 @@ + + + + Today's Scan Logs + + + + +

Today's Scan Logs

+
+ + + + + + + + + + +
BarcodeNameAction
+
+ + + + \ No newline at end of file