原实现是 Canvas 画笔画板,与「文字白板/记事本」需求不符。重做为纯文本实时协作: - model:strokes JSON -> content TEXT + version INT(乐观锁)+ edit_count; schema/dao/service 同步重构,append_stroke/replace_strokes -> update_content。 - WS 协议:stroke -> edit(发完整文本,debounce 400ms);init 下发 content/version。 update 帧广播给他人,cleared 广播给所有人。 - 前端:canvas -> textarea;收到远端 update 用最长公共前后缀算变更区间, 仅替换该区间并保留光标(区间前不动/后平移/内移末尾);清空/复制文本按钮。 - schema.sql 更新 whiteboard 表 DDL;DB 旧表 DROP 重建(开发环境)。 - 测试脚本与 README 同步更新。
71 lines
4.4 KiB
SQL
71 lines
4.4 KiB
SQL
-- 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 是乐观锁版本号(每次编辑 +1),edit_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;
|