CLI三层架构重构完成:interface/metadata/storage/tools层
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled

架构设计:
- 上层(interface):虚拟操作系统层
  - web.rs: HTTP Server
  - ssh.rs: SSH/SFTP Server
  - webdav.rs: WebDAV Server
  - iscsi.rs: iSCSI Server
  - tree.rs: File Tree管理(categories/series)

- 中层(metadata):核心数据库层
  - config.rs: 配置管理(从framework.rs迁移)
  - user.rs: 用户管理
  - db.rs: 数据库管理
  - auth.rs: 认证授权

- 底层(storage):文件存取层
  - scan.rs: 文件扫描导入(从framework.rs迁移)
  - hash.rs: 哈希计算(从framework.rs迁移)
  - archive.rs: 压缩解压缩
  - sync.rs: 文件同步
  - mount.rs: 存储挂载

- 辅助工具(tools):辅助功能
  - render.rs: Markdown渲染(从framework.rs迁移)
  - test.rs: 测试命令(从framework.rs迁移)

架构优势:
 清晰的三层分离,符合架构理念
 21个独立模块,职责清晰
 main.rs简化至23行,cli/mod.rs24行
 删除旧架构(cli/apps和framework.rs)
 编译成功,所有CLI命令可用

命令範例:
markbase interface web start --port 11438
markbase interface ssh start --port 2024
markbase interface tree import --user accusys --tree-type categories
markbase metadata config show
markbase storage scan directory --user accusys --dir data/downloads
markbase tools render file --file README.md

文件统计:
- 新增文件:20个Rust模块
- 删除文件:3个旧架构文件
- 修改文件:2个核心入口
- 总计:21个文件变更
This commit is contained in:
Warren
2026-06-13 01:36:15 +08:00
parent 499efed099
commit cdc2e4b9d6
25 changed files with 881 additions and 480 deletions

View File

@@ -0,0 +1,20 @@
pub mod render;
pub mod test;
use clap::Subcommand;
#[derive(Subcommand)]
pub enum ToolsCommands {
#[command(flatten)]
Render(render::RenderCommand),
#[command(flatten)]
Test(test::TestCommand),
}
pub async fn handle_tools_command(cmd: ToolsCommands) -> anyhow::Result<()> {
match cmd {
ToolsCommands::Render(c) => render::handle_render_command(c)?,
ToolsCommands::Test(c) => test::handle_test_command(c)?,
}
Ok(())
}

View File

@@ -0,0 +1,26 @@
use clap::Subcommand;
#[derive(Subcommand)]
pub enum RenderCommand {
File {
#[arg(short, long)]
file: String,
#[arg(short, long)]
output: Option<String>,
},
}
pub fn handle_render_command(cmd: RenderCommand) -> anyhow::Result<()> {
match cmd {
RenderCommand::File { file, output } => {
let md = std::fs::read_to_string(&file)?;
let html = crate::render::md_to_html(&md);
if let Some(path) = &output {
std::fs::write(path, html)?;
} else {
println!("{html}");
}
}
}
Ok(())
}

View File

@@ -0,0 +1,61 @@
use clap::Subcommand;
#[derive(Subcommand)]
pub enum TestCommand {
Bcrypt {
#[arg(short, long, default_value = "demo123")]
password: String,
#[arg(long)]
verify_hash: Option<String>,
},
Connection {
#[arg(short, long, default_value = "11438")]
port: u16,
},
}
pub fn handle_test_command(cmd: TestCommand) -> anyhow::Result<()> {
match cmd {
TestCommand::Bcrypt { password, verify_hash } => {
use bcrypt::{hash, verify, DEFAULT_COST};
println!("=== bcrypt Hash Test ===");
println!("Password: {}", password);
println!("");
let new_hash = hash(&password, DEFAULT_COST)?;
println!("Generated hash:");
println!("{}", new_hash);
println!("");
if let Some(hash_to_verify) = verify_hash {
println!("Verifying hash: {}", hash_to_verify);
let valid = verify(&password, &hash_to_verify)?;
println!("Valid: {}", valid);
println!("");
}
let db_hash = "$2b$10$ha5wU.mOi8fHLJCfun860u2cfVopa04jwe/q82IKOwqp5uG70qsH6";
println!("Database hash: {}", db_hash);
let valid = verify(&password, db_hash)?;
println!("Database hash valid for '{}': {}", password, valid);
println!("");
if !valid {
println!("❌ Database hash is incorrect!");
println!("Update SQL:");
println!("UPDATE sftpgo_users SET password_hash = '{}' WHERE username IN ('testuser', 'demo', 'warren', 'momentry');", new_hash);
println!("");
println!("Execute:");
println!("sqlite3 data/auth.sqlite \"UPDATE sftpgo_users SET password_hash = '{}' WHERE username IN ('testuser', 'demo', 'warren', 'momentry');\"", new_hash);
} else {
println!("✅ Database hash is correct!");
}
}
TestCommand::Connection { port } => {
println!("Testing connection to port: {}", port);
// TODO: 实现连接测试逻辑
}
}
Ok(())
}