feat: v1.1.0 - 图片按日期分文件夹保存、设置面板、序号显示模式、自动刷新

This commit is contained in:
2026-04-16 10:42:36 +08:00
parent 3503ee35ab
commit f703c0491c
9 changed files with 639 additions and 220 deletions

View File

@@ -2,30 +2,35 @@
配置管理模块
"""
import os
import json
from pathlib import Path
from datetime import datetime
# 基础路径
BASE_DIR = Path(__file__).parent.absolute()
DATA_DIR = BASE_DIR / "data"
IMAGES_DIR = DATA_DIR / "images"
DB_PATH = DATA_DIR / "events.db"
CONFIG_PATH = DATA_DIR / "config.json"
# 确保目录存在
IMAGES_DIR.mkdir(parents=True, exist_ok=True)
DATA_DIR.mkdir(parents=True, exist_ok=True)
# Web 服务配置
WEB_PORT = 19016
WEB_HOST = "0.0.0.0"
# 摄像头配置
CAMERA_INDEX = 0 # 默认摄像头
CAPTURE_INTERVAL = 60 # 拍照间隔(秒)
# 大模型配置(用于图片分析)
LLM_PROVIDER = "bailian" # bailian / openai / local
LLM_API_URL = os.environ.get("VISION_API_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1")
LLM_API_KEY = os.environ.get("VISION_API_KEY", "sk-lm-fuP5tGU8:Hi7YU87jHyDP6Ay8Tl2j")
LLM_MODEL = os.environ.get("VISION_MODEL", "qwen-vl-plus") # 视觉模型
# 默认配置
DEFAULT_CONFIG = {
"images_dir": str(DATA_DIR / "images"),
"camera_index": 0,
"capture_interval": 60,
"auto_analyze": True,
"refresh_interval": 5, # 页面刷新间隔(秒)
"display_limit": 20, # 显示最近多少条
"vision_api_url": os.environ.get("VISION_API_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1"),
"vision_api_key": os.environ.get("VISION_API_KEY", "sk-lm-fuP5tGU8:Hi7YU87jHyDP6Ay8Tl2j"),
"vision_model": os.environ.get("VISION_MODEL", "qwen-vl-plus")
}
# 分析配置
ANALYSIS_PROMPT = """请分析这张图片,识别其中的重要事件或变化。
@@ -46,12 +51,18 @@ ANALYSIS_PROMPT = """请分析这张图片,识别其中的重要事件或变
# 数据库配置
DB_SCHEMA = """
CREATE TABLE IF NOT EXISTS config (
key TEXT PRIMARY KEY,
value TEXT
);
CREATE TABLE IF NOT EXISTS images (
id INTEGER PRIMARY KEY AUTOINCREMENT,
path TEXT NOT NULL,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
camera_id INTEGER DEFAULT 0,
analyzed BOOLEAN DEFAULT 0
analyzed BOOLEAN DEFAULT 0,
date_folder TEXT
);
CREATE TABLE IF NOT EXISTS events (
@@ -65,5 +76,66 @@ CREATE TABLE IF NOT EXISTS events (
);
CREATE INDEX IF NOT EXISTS idx_images_timestamp ON images(timestamp);
CREATE INDEX IF NOT EXISTS idx_images_date_folder ON images(date_folder);
CREATE INDEX IF NOT EXISTS idx_events_type ON events(event_type);
"""
"""
class ConfigManager:
"""配置管理器"""
def __init__(self):
self.config = DEFAULT_CONFIG.copy()
self.load()
def load(self):
"""加载配置"""
if CONFIG_PATH.exists():
try:
with open(CONFIG_PATH, 'r', encoding='utf-8') as f:
saved = json.load(f)
self.config.update(saved)
except:
pass
def save(self):
"""保存配置"""
with open(CONFIG_PATH, 'w', encoding='utf-8') as f:
json.dump(self.config, f, ensure_ascii=False, indent=2)
def get(self, key, default=None):
"""获取配置项"""
return self.config.get(key, default)
def set(self, key, value):
"""设置配置项"""
self.config[key] = value
self.save()
def get_images_dir(self, date=None):
"""获取图片保存目录(按日期)"""
base_dir = Path(self.config['images_dir'])
if date is None:
date = datetime.now().strftime('%Y-%m-%d')
# 每天的图片放在单独文件夹
date_folder = base_dir / date
date_folder.mkdir(parents=True, exist_ok=True)
return date_folder
def get_all(self):
"""获取所有配置"""
return self.config.copy()
def update(self, updates):
"""批量更新配置"""
for key, value in updates.items():
if key in self.config:
self.config[key] = value
self.save()
# 全局配置实例
config_mgr = ConfigManager()