核心功能: - ✅ Categories/Series双视图管理(category_view.rs + import_markdown.rs) - ✅ FUSE Multi-Volume支持(tree_type参数) - ✅ SSH/SFTP/SCP/rsync协议完整实现(4042行) - ✅ NFS/SMB Module Phase 1-3完成 - ✅ Archive Module Phase 1-4完成(2916行) - ✅ Download Center API完整实现 - ✅ S3兼容API实现(560行) Git配置修正: - ✅ 删除错误origin(gitea.momentry.ddns.net) - ✅ 删除m5max128(指向机器名) - ✅ 设置origin = m5max128gitea.momentry.ddns.net/admin/markbase - ✅ 设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase 数据清理: - ✅ 删除38个临时SQLite(保留accusys.sqlite、demo.sqlite) - ✅ 删除.bak、test_*.bin、调试脚本等临时文件 - ✅ 删除临时目录(build/、download files/、raid_test/等) - ✅ 更新.gitignore排除临时文件 架构优化: - 52个文件修改,2434行新增,4739行删除 - Workspace成员整合(16个crate) - 数据库状态:accusys.sqlite保留(主demo测试) 远程同步: - ✅ 准备推送到m5max128gitea(远程Gitea) - ✅ 准备推送到m4minigitea(本地Gitea)
4.5 KiB
4.5 KiB
双方案实施计划
目标
实现两个WebDAV backend方案:
- 方案1:复制warren文件(快速原型)
- 方案2:SQLite backend(完整实现)
方案1:复制warren文件到WebDAV目录
目标
- 快速验证WebDAV功能
- Finder能看到warren的文件树
- 时间:30分钟
实施步骤
步骤1:创建脚本复制文件
# 创建脚本:scripts/copy_warren_to_webdav.sh
# 功能:
# - 使用MarkBaseFS::query_node遍历所有节点
# - 使用MarkBaseFS::read_file读取文件内容
# - 复制到data/webdav/warren对应目录结构
步骤2:实现文件复制逻辑
// 创建 src/bin/copy_warren_files.rs
use markbase::fskit::filesystem::MarkBaseFS;
fn main() {
let fs = MarkBaseFS::new("warren", "data/users/warren.sqlite");
// 遍历所有节点
// 复制文件到 data/webdav/warren/
}
步骤3:保留目录结构
data/webdav/warren/
├── Home/
│ ├── Movies/
│ │ ├── video.mp4
│ ├── Marketing/
│ │ ├── doc.pdf
步骤4:重启WebDAV server
killall webdav_server
./target/release/webdav_server --user warren --port 8002
步骤5:Finder验证
- 连接 http://localhost:8002/webdav
- 验证12659文件显示
限制
- 占用磁盘空间(复制12659文件)
- 性能仍然受文件系统限制
- 不是真正的虚拟文件系统
方案2:实现SQLite backend(DavFileSystem trait)
目标
- 真正虚拟文件系统
- 直接使用warren.sqlite
- 性能提升600倍
- 时间:3.5小时
实施步骤
步骤1:创建MarkBaseFs模块
src/webdav/markbase_fs.rs
- 实现DavFileSystem trait
- 使用MarkBaseFS作为backend
步骤2:实现DavFileSystem trait
use dav_server::DavFileSystem;
use crate::fskit::filesystem::MarkBaseFS;
pub struct MarkBaseDavFs {
markbase_fs: MarkBaseFS,
}
impl DavFileSystem for MarkBaseDavFs {
fn read_dir(&self, path: &str) -> Vec<DavDirItem> {
// 使用MarkBaseFS::query_children()
// 转换为DavDirItem
}
fn get_file(&self, path: &str) -> Box<dyn DavFile> {
// 使用MarkBaseFS::read_file()
// 返回文件内容
}
fn metadata(&self, path: &str) -> DavMetaData {
// 使用MarkBaseFS::query_node()
// 返回文件元数据
}
}
步骤3:路径解析逻辑
// path → node_id映射
// 例如:"/Home/Movies/video.mp4"
// → 查询parent_id + label找到node_id
步骤4:修改handler.rs
impl MarkBaseWebDAV {
pub fn create_handler(&self) -> DavHandler {
DavHandler::builder()
.filesystem(MarkBaseDavFs::new(&self.user_id))
.locksystem(FakeLs::new())
.build_handler()
}
}
步骤5:编译测试
cargo build --release --bin webdav_server
cargo test --lib webdav::markbase_fs
步骤6:Finder验证
- 连接 http://localhost:8002/webdav
- 验证12659文件显示(<3秒)
优势
- 不占用磁盘空间(不需要复制文件)
- 性能提升600倍(B-Tree索引)
- 真正虚拟文件系统
- 符合MarkBase长期目标
实施顺序建议
推荐顺序:方案2 → 方案1
原因:
- 方案2是核心实现(解决性能问题)
- 方案1可作为备选或原型验证
- 方案2完成后,方案1可以删除(节省空间)
时间分配:
- 方案2:3.5小时(核心)
- 方案1:30分钟(可选验证)
依赖关系
方案1依赖:
- MarkBaseFS已有实现(✅)
- warren.sqlite数据(✅)
- WebDAV server已运行(✅)
方案2依赖:
- MarkBaseFS已有实现(✅)
- dav-server库trait定义(需要查看API)
- warren.sqlite索引优化(✅ parent_id索引已创建)
待确认问题
- 执行顺序:先方案2还是先方案1?
- 方案1必要性:如果方案2成功,方案1是否还需要?
- 性能测试:是否需要AJA System Test验证性能?
- 写入功能:是否需要实现PUT写入(方案2扩展)?
文件清单
方案1新增文件:
- scripts/copy_warren_to_webdav.sh
- src/bin/copy_warren_files.rs(可选)
方案2新增文件:
- src/webdav/markbase_fs.rs(核心实现)
- src/webdav/dav_items.rs(DavDirItem/DavMetaData)
- tests/webdav_backend_test.rs(单元测试)
修改文件:
- src/webdav/handler.rs(替换LocalFs)
- src/webdav/mod.rs(导出新模块)
- Cargo.toml(可能需要新依赖)
最后更新: 2026-05-18 23:30