14 Commits

Author SHA1 Message Date
Serendipity e6a7efc760 refactor: CLI P0-P2 全面改进
P0:
- 子命令重构: qrgen encode / qrgen decode
- Shell 补全: --generate-completions bash/zsh/fish/pwsh/elvish
- -v 改为 -V (version), Cli::version 继承 Cargo.toml

P1:
- stdin 管道: encode/decode 支持 - 从 stdin 读取
- 退出码: 0=成功, 1=输入错误, 2=系统错误
- 错误消息: bail! 宏 + 上下文信息

P2:
- 进度指示: batch 模式使用 indicatif 进度条
- --version 自动生成

新增依赖: clap_complete, indicatif, image (direct)
2026-06-20 17:48:17 +08:00
Serendipity 5fb967a353 fix: CLI --mode text 报错'未知模式' — 补充 text 匹配分支 2026-06-20 17:32:23 +08:00
Serendipity 86d788e57c feat: vCard 扩展 + 格式扩展 + 解码透视矫正 — v0.3.0
Phase 1: 格式扩展
- png.rs → image.rs,OutputFormat 枚举 (PNG/BMP/JPEG/WebP)
- CLI -f/--format,Web fmt 参数扩展,image crate +bmp feature

Phase 2: 解码增强
- 新增 decoder/perspective.rs — 旋转矫正(MVP)
- auto_correct: finder 检测→计算旋转角→仿射变换→再解码
- decode_image 自动重试矫正流水线

Phase 3: vCard 扩展
- 新增 5 字段:TITLE/URL/BDAY/NOTE/PHOTO
- Rust text_builder + TS qrText + VCardMode UI 同步
- CLI 新增 --title --vcard-url --birthday --note --photo
- 中/英 i18n 翻译

测试: 81 Rust + 19 前端全部通过
2026-06-19 21:38:58 +08:00
Serendipity b41f6ee7df feat: 格式扩展 — 支持 BMP/JPEG/WebP 输出
- png.rs 重命名为 image.rs,新增 OutputFormat 枚举
- QrCode::to_image_bytes 支持 PNG/BMP/JPEG/WebP
- CLI 新增 -f/--format 参数(png/bmp/jpeg/webp)
- Web API fmt 参数扩展至全部 4 种图像格式
- core/Cargo.toml: image crate 新增 bmp feature
2026-06-19 21:34:21 +08:00
Serendipity 8e9e7e1b4c fix: clippy 自动修复冗余闭包 2026-06-19 21:17:12 +08:00
Serendipity c7d5252651 feat: CLI 编码模式 + 批量生成 + text_builder
- 新增 core/src/text_builder.rs — Rust 版文本构造(WiFi/vCard/Email/Phone/SMS)
- CLI 新增 --mode 模式参数(wifi/vcard/email/phone/sms/url/batch)
- CLI 新增 --ssid/--password/--name/--phone/--to 等模式专属参数
- CLI 新增 --batch <file> 批量生成(JSON 数组 / CSV)
- 批量支持自动检测 JSON/CSV 格式并自动编号输出
- 新增 6 个 text_builder 单元测试(80 tests total)
2026-06-19 21:15:55 +08:00
Serendipity 38be82973e feat: Logo 嵌入 — QR 码中央叠加自定义图片
- PNG 渲染:RgbaImage 上使用 imageops::overlay 叠加 logo
- SVG 渲染:base64 编码 logo 嵌入 <image> 标签
- QrCode::to_png_bytes / to_svg 新增 Option<logo_bytes> 参数
- Logo 默认占 QR 区域 25%,建议配合 H 级纠错使用
2026-06-19 21:12:44 +08:00
Serendipity 23ccb37b52 feat: 彩色 QR 码 — 自定义前景色/背景色
- QrConfig 新增 fg_color/bg_color 字段(CSS 十六进制格式)
- QrCode 存储解析后的 [u8;3] RGB
- PNG 渲染 Luma→Rgba,支持 RGBA 颜色
- SVG 渲染使用 QrCode 颜色字段
- CLI 新增 --fg/--bg 参数
- 新增 parse_hex_color 支持 #RRGGBB 和 #RGB
- 新增 2 个颜色测试(74 tests total)
2026-06-19 21:10:56 +08:00
Serendipity effc88c6d7 feat: QR 码解码器 — 从零手写的完整解码流水线
新增 core/src/decoder/ 模块(9 文件,~1500 行):
- bch.rs: BCH(15,5)+BCH(18,6) 查表解码(32+64 有效码字,t≤3)
- format.rs: 从矩阵读取格式信息(EC+掩码)+版本信息(2 副本容错)
- extract.rs: 逆向蛇形排列提取数据码字
- deinterleave.rs: 逆向 RS 数据交错
- rs_decode.rs: RS 纠错流水线(伴随式→BM→Chien→Forney)
- mode_decode.rs: 逆向 4 种编码模式(数字/字母/字节/汉字 Shift JIS)
- detect.rs: 定位图案检测(1:1:3:1:1 比例+交叉验证+聚类)
- image.rs: 图像加载+灰度二值化(PNG/JPEG/WebP)
- mod.rs: 顶层 API(decode_image + decode_matrix)

修改已有文件:
- core: galois.rs 表 pub(crate), 新增 poly_eval(); reed_solomon 公开内部函数
- cli: 新增 --decode <file> 解码模式
- web: 新增 POST /api/decode(multipart file upload)

测试: 72 passed (58 原有 + 14 新增 decoder 测试)
2026-06-19 20:36:12 +08:00
Serendipity 1e9c94eff9 fix: 全面代码审查修复 — 安全/类型/持久化/代码质量 (28项)
🔴 CRITICAL (1):
- tauri.conf.json: CSP 从 null 改为最小权限策略

🟠 HIGH (6):
- 新建 capabilities/default.json: Tauri v2 权限约束(store/dialog/clipboard)
- cli: 路径遍历防护 — 拒绝含 ParentDir 组件的输出路径
- HistoryList: 删除/清空同步持久化到 store,历史点击用 formData 回填
- ExportPanel: 移除 console.warn,getCurrentText any→QrState
- useQrEncode: WiFi 密码在历史中脱敏显示(P:***),Store 实例缓存

🟡 MEDIUM (10):
- mode.rs: Kanji fallback 从 UTF-8 字节改为 13-bit 零值占位(段内模式一致)
- mode.rs: Shift JIS 第二字节跳过 0x7F 空洞,修正行内索引
- mode.rs: encode_numeric/alphanumeric 添加 debug_assert! 前置条件
- mask.rs: best_matrix.unwrap()→expect() 附错误信息
- version.rs: ec_info 仅返回 count>0 的 BlockInfo,EcInfo/BlockInfo 加 Debug+Clone
- types/index.ts: HistoryEntry.mode string→ModeType,新增 formData 字段
- qrContext.tsx: 使用缓存 Store 加载历史

🟢 LOW (11):
- cargo fmt 全部文件
- svg.rs: String::new()→with_capacity() 预分配
- patterns.rs: encode_format_info 拆分为两行提高可读性
- png.rs: 提取 fill_module() 辅助函数降低嵌套
- ErrorBoundary: 添加 componentDidCatch 错误日志入口
- QrPreview: dangerouslySetInnerHTML→<img>+data URL(安全),loading 状态指示
- galois.rs/version.rs: 5 处 #[allow(clippy::indexing_slicing)]+安全文档
- 新建 utils/qrText.ts: 集中管理 6 种模式的文本构造,消除 ExportPanel/mode 间重复

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-17 14:10:13 +08:00
Serendipity 91bdf9ecc3 fix: 前端 HIGH/MEDIUM — timer 清理 + 历史持久化 + Error Boundary + console 移除 2026-06-17 09:03:38 +08:00
Serendipity 30af4ff607 style: cargo fmt + clippy fix 全项目格式化 2026-06-16 23:58:15 +08:00
Serendipity 9f2856a81f feat: CLI 工具 (clap + anyhow) 2026-06-16 23:52:57 +08:00
Serendipity ad77b3ac1b feat: workspace 骨架 — core + cli 模块结构 2026-06-16 23:27:58 +08:00