文章

福利管理系统开发文档

媒体管理系统开发文档

1. 项目概述

1.1 项目目标

构建一个媒体管理系统,支持以下功能:

  • 自动刮削:从文件夹中提取媒体文件(视频、图片)的元数据。
  • 文件夹监控:实时监控文件夹变化,自动更新数据库。
  • 媒体播放:通过前端界面播放视频和浏览图片。
  • 数据管理:提供API接口,支持媒体文件的查询、更新和删除。

1.2 技术栈

  • 后端:FastAPI、SQLite/PostgreSQL、Watchdog、Celery。
  • 前端:Vue 3、Vue Router、Axios、Video.js/Vue-Video-Player。
  • 自动化刮削:Python、Pillow、MoviePy/FFmpeg。

2. 系统架构

2.1 后端架构

  • API服务:提供RESTful API接口。
  • 数据库:存储媒体文件的元数据。
  • 文件夹监控:实时监控文件夹变化,更新数据库。
  • 异步任务:使用Celery处理耗时的刮削任务。

2.2 前端架构

  • 页面路由:使用Vue Router管理页面跳转。
  • 媒体播放:使用Video.js或Vue-Video-Player播放视频。
  • 数据交互:通过Axios与后端API通信。

3. 数据库设计

3.1 表结构

1
2
3
4
5
6
7
8
CREATE TABLE media_files (
    id INTEGER PRIMARY KEY,
    file_name TEXT,
    file_path TEXT,
    file_type TEXT,  -- 如 'video' 或 'image'
    metadata TEXT,   -- JSON格式的元数据
    folder_path TEXT
);

3.2 字段说明

  • id:主键,唯一标识媒体文件。
  • file_name:文件名。
  • file_path:文件路径。
  • file_type:文件类型(视频或图片)。
  • metadata:元数据(JSON格式,如分辨率、时长、拍摄日期等)。
  • folder_path:文件夹路径。

4. 后端实现

4.1 API接口设计

| 方法 | 路径 | 描述 | | —- | —————– | —————————- | | GET | /api/media | 获取所有媒体文件的元数据。 | | GET | /api/media/{id} | 获取单个媒体文件的详细信息。 | | POST | /api/scrape | 启动刮削任务。 | | POST | /api/watch | 启动文件夹监控。 |

4.2 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from fastapi import FastAPI
import sqlite3
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

app = FastAPI()

# 数据库连接
DB_PATH = "media_db.sqlite"
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()

# 监控文件夹变化
class FolderChangeHandler(FileSystemEventHandler):
    def on_moved(self, event):
        if event.is_directory:
            old_path = event.src_path
            new_path = event.dest_path
            cursor.execute('''
                UPDATE media_files
                SET folder_path = ?
                WHERE folder_path = ?
            ''', (new_path, old_path))
            conn.commit()

# 启动文件夹监控
observer = Observer()
event_handler = FolderChangeHandler()
observer.schedule(event_handler, path="path/to/your/folder", recursive=True)
observer.start()

# API接口
@app.get("/api/media")
def get_media():
    cursor.execute("SELECT * FROM media_files")
    return cursor.fetchall()

@app.post("/api/scrape")
def scrape_folder():
    # 实现刮削逻辑
    pass

@app.post("/api/watch")
def watch_folder():
    # 启动文件夹监控
    pass

# 关闭数据库连接
@app.on_event("shutdown")
def shutdown():
    conn.close()
    observer.stop()

5. 前端实现

5.1 页面设计

  • 首页:展示媒体文件列表,支持搜索和筛选。
  • 播放页:播放视频或展示图片。
  • 管理页:启动刮削任务、监控文件夹。

5.2 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<template>
  <div>
    <h1>媒体库</h1>
    <ul>
      <li v-for="file in mediaFiles" :key="file.id">
        <router-link :to="`/media/${file.id}`"></router-link>
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      mediaFiles: [],
    };
  },
  async created() {
    const response = await axios.get('/api/media');
    this.mediaFiles = response.data;
  },
};
</script>

6. 自动化刮削

6.1 功能描述

  • 遍历文件夹,提取媒体文件的元数据。
  • 将元数据存储到数据库。
  • 监控文件夹变化,自动更新数据库。

6.2 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os
from PIL import Image
from moviepy.video.io.VideoFileClip import VideoFileClip

def extract_metadata(file_path):
    if file_path.lower().endswith(('.jpg', '.jpeg', '.png')):
        with Image.open(file_path) as img:
            return img.info  # 提取图片元数据
    elif file_path.lower().endswith(('.mp4', '.avi', '.mov')):
        with VideoFileClip(file_path) as video:
            return {
                'duration': video.duration,
                'resolution': video.size,
            }  # 提取视频元数据
    return {}

7. 部署与运行

7.1 后端部署

  • 使用uvicorn运行FastAPI服务:
    1
    
    uvicorn main:app --reload
    

7.2 前端部署

  • 使用npm运行Vue项目:
    1
    
    npm run serve
    

7.3 数据库部署

  • 使用SQLite(本地)或PostgreSQL(生产环境)。

8. 测试与维护

  • 单元测试:使用pytest测试后端API。
  • 前端测试:使用Jest测试Vue组件。
  • 日志记录:记录系统运行日志,便于排查问题。
  • 性能优化:优化数据库查询和文件刮削逻辑。

9. 总结

通过本开发文档,你可以构建一个功能完善的媒体管理系统,支持自动刮削、文件夹监控和媒体播放。该系统具有高扩展性和灵活性,适合处理大量媒体文件。

本文由作者按照 CC BY 4.0 进行授权