Files
zTools2/sql/schema.sql
zikai aa08a1cf60 feat: 新增 PDF 转换服务(epub->pdf,cookie 用户隔离,软删/硬删两级删除)
纯 Python 转换(ebooklib 解析 epub + weasyprint 渲染 HTML/CSS 为 PDF),
无需 calibre/xvfb 系统依赖。复用 UploadedFile 存储(原始文件与产物 PDF)。

- model/dao/schema:PdfJob 记录转换任务(owner_cookie/source/output/进度/状态)
- pdf_converter:epub->PDF 转换器(按 spine 顺序拼 HTML,OPF 目录解析相对资源)
- pdf_service:上传落盘 + asyncio 后台转换(独立 Session)+ 进度追踪 + 两级删除
  · 用户软删(user_deleted,管理页仍可见)· 管理员硬删(真正删磁盘+记录)
- pdf_controller:/api/pdf/*(用户,cookie)+ /api/admin/pdf/*(Basic Auth)
- /pdf、/pdf-admin 页面(原生 JS,复用 common.css/js)
- 配置 pdf 段(max_size 250MB、转换超时、cookie)
- pytest 7 项(SQLite→MySQL 隔离测试库):上传/转换/下载/软删/硬删/超限/越权
2026-07-27 11:33:43 +08:00

95 lines
6.0 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- zikai_filesvc 数据库的表定义。
-- 由 app/scripts/init_db.py 通过本机 socket 以 root 身份执行;表级幂等。
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS `uploaded_file` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`storage_path` VARCHAR(512) NOT NULL COMMENT 'upload_dir 下相对路径,例如 2026/06/<uuid>.bin',
`original_filename` VARCHAR(512) NOT NULL,
`content_type` VARCHAR(255) NOT NULL DEFAULT '',
`size_bytes` BIGINT UNSIGNED NOT NULL DEFAULT 0,
`sha256` CHAR(64) NOT NULL DEFAULT '',
`source` VARCHAR(32) NOT NULL DEFAULT 'http' COMMENT 'http / sftp / ...',
`uploaded_by` VARCHAR(128) NOT NULL DEFAULT '',
`uploaded_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_uploaded_at` (`uploaded_at`),
KEY `idx_source` (`source`),
KEY `idx_sha256` (`sha256`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 分片上传会话表。由 app/services/chunk_upload_service.py 使用。
-- 运行时也由 Base.metadata.create_all 幂等创建,此处供 init_db.py 全新建库时一并导入。
CREATE TABLE IF NOT EXISTS `upload_session` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`upload_id` CHAR(64) NOT NULL COMMENT 'uuid4().hex客户端持有的会话标识',
`filename` VARCHAR(512) NOT NULL,
`size_bytes` BIGINT UNSIGNED NOT NULL DEFAULT 0,
`chunk_size` BIGINT UNSIGNED NOT NULL DEFAULT 0,
`total_chunks` BIGINT UNSIGNED NOT NULL DEFAULT 0,
`uploaded_chunks` JSON NOT NULL COMMENT '已上传分片下标数组,如 [0,1,3]',
`file_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT 'complete 后指向 uploaded_file.id',
`status` VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT 'pending/completed/failed',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_upload_id` (`upload_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 反向隧道会话表。由 app/services/tunnel_service.py + sftp_server.py 使用。
CREATE TABLE IF NOT EXISTS `tunnel_session` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR(128) NOT NULL COMMENT '发起隧道的 user 名',
`user_ip` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'user 端 SSH peer 地址',
`local_port` INT NOT NULL COMMENT 'user 要暴露的本地服务端口',
`tunnel_port` INT NOT NULL COMMENT 'server 侧 SSH remote forward 绑定的本地端口',
`started_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ended_at` DATETIME NULL DEFAULT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT 'active/closed',
PRIMARY KEY (`id`),
KEY `idx_user_name` (`user_name`),
KEY `idx_tunnel_port` (`tunnel_port`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 共享白板表(文本记事本)。由 app/services/whiteboard_service.py 使用。
-- content 存完整文本version 是乐观锁版本号(每次编辑 +1edit_count 累计编辑次数。
-- 白板长期留存,实时同步由 WebSocket hub 在内存维护在线连接。
CREATE TABLE IF NOT EXISTS `whiteboard` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`board_id` VARCHAR(64) NOT NULL COMMENT '用户可读的 url id[a-zA-Z0-9_-]{1,64}',
`content` MEDIUMTEXT NOT NULL COMMENT '白板文本内容',
`version` INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号,每次编辑 +1',
`edit_count` INT NOT NULL DEFAULT 0 COMMENT '累计编辑次数(含清空)',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_board_id` (`board_id`),
KEY `idx_updated_at` (`updated_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- PDF 转换任务表。由 app/services/pdf_service.py 使用。
-- 原始文件与产物 PDF 复用 uploaded_file 存储,本表只记录关系与转换状态。
-- 删除两级user_deleted用户软删管理页仍可见/ admin 硬删(真正删除)。
CREATE TABLE IF NOT EXISTS `pdf_job` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`owner_cookie` VARCHAR(64) NOT NULL COMMENT '用户标识httpOnly cookie 值uuid4 hex',
`source_file_id` BIGINT UNSIGNED NOT NULL COMMENT '原始上传文件 -> uploaded_file.id',
`source_filename` VARCHAR(512) NOT NULL,
`source_size` BIGINT UNSIGNED NOT NULL DEFAULT 0,
`output_file_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '产物 PDF -> uploaded_file.id转换完成前 NULL',
`status` VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/converting/done/failed',
`progress` INT NOT NULL DEFAULT 0 COMMENT '转换进度 0-100',
`error_message` VARCHAR(512) NOT NULL DEFAULT '',
`user_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '用户软删标记',
`deleted_at` DATETIME NULL DEFAULT NULL COMMENT '用户软删时间',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_owner_cookie` (`owner_cookie`),
KEY `idx_status` (`status`),
KEY `idx_user_deleted` (`user_deleted`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;