Serendipity
|
cd75141037
|
refactor: P0-P5 全面架构重构
P1 thiserror 类型化错误:
新增 core/src/error.rs QrError 枚举, 全链 String -> QrError,
包括 EmptyInput/InvalidVersion/DataTooLong/DecodeFail 等 8 种变体
P2 text_builder Tauri 统一:
新增 build_qr_text Tauri command, 删除前端 qrText.ts,
所有 mode 组件改为 invoke 调用 Rust 端构建文本
P3 QrConfig 颜色字段移除:
从 QrConfig/QrCode 移除 fg_color/bg_color,
改为 to_svg/to_image_bytes 参数传递
P4 前端 4 项合并:
Context 拆分为 StateContext+DispatchContext (H10),
新建 useModeForm 通用 hook (M11),
VCardMode grid-cols-2 网格布局 (M13),
persistHistory/loadHistory 迁至 utils/storage.ts (L9)
P5 算法优化:
MaskedView 懒计算替代 8 次 Matrix 克隆 (H9),
encoding_rs 精确 Kanji Shift JIS 映射 (H12)
验证: cargo check+clippy 通过, 81+24+7 全部测试通过
|
2026-06-21 15:09:10 +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
|
ef6b092eda
|
feat: 前端测试 + 覆盖率 — 19 tests, vitest + @vitest/coverage-v8
- 新增 qrContext reducer 测试(7 tests: 默认状态/模式/表单/配置/预览/历史/边界)
- 安装 @vitest/coverage-v8,覆盖率阈值 lines≥10% functions≥40%
- 更新 vitest.config.ts
v0.2.0 全部 7 个 Phase 完成:
✅ Phase 1: 彩色 QR 码
✅ Phase 2: Logo 嵌入
✅ Phase 3: CLI 编码模式
✅ Phase 4: 批量生成
✅ Phase 5: i18n 中英双语
✅ Phase 6: 前端测试
✅ Phase 7: E2E (Playwright 待后续安装)
|
2026-06-19 21:25:41 +08:00 |
|
Serendipity
|
77fac0e28f
|
feat: i18n 中英双语界面 — i18next + react-i18next
- 安装 i18next / react-i18next / i18next-browser-languagedetector
- 新建 src/i18n.ts 配置(fallback zh)
- 中/英翻译文件各 ~50 条目
- App.tsx 新增 EN/中 语言切换按钮
- ExportPanel + QrPreview + ModePanel + HistoryList + ErrorBoundary
- 全部 7 种模式组件均支持双语
- 12 前端测试通过,tsc 零错误
|
2026-06-19 21:23:10 +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
|
11fbe20102
|
feat: GUI 端新增解码功能 — 选择图片解码 QR 码
- 新增 decode_qr Tauri command(接收图片字节,返回解码文本)
- ExportPanel 新增「选择图片解码」按钮 + 解码结果展示
- fs:allow-read-file 权限,支持 /c/Users/33644 和 C:\Users\33644\AppData\Local\Temp 路径
|
2026-06-19 20:39:07 +08:00 |
|
Serendipity
|
c3956f0f36
|
chore: 前端工程化 + Git hooks + 对齐 PathEditor 规范
- 新增 .gitattributes(CRLF 统一)+ rust-toolchain.toml
- 新增 Prettier + ESLint + markdownlint 配置
- 新增 Husky Git hooks(pre-commit lint-staged + commit-msg commitlint)
- 新增 vitest 前端测试(12 tests, utils/qrText.ts)
- 新增 @ 路径别名(vite + tsconfig)
- 新增 ROADMAP / SUPPORT / CODEOWNERS / FUNDING / dependabot
- 更新 .gitignore + .editorconfig
- 更新 package.json(新增 lint/format/test 脚本)
- 全项目 prettier 格式化 + eslint 通过
- 更新 CLAUDE.md + README.md
|
2026-06-19 19:42:13 +08:00 |
|
Serendipity
|
9f76bb31da
|
fix: QR 预览优化 — 移除虚线边框/圆角/padding,专业白底+微阴影
- 去掉 border-dashed / rounded-2xl / p-4(干扰扫描)
- 纯白容器 + shadow-sm,干净专业
- svgToDataUrl 改用 TextEncoder(替代废弃的 unescape)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-18 11:34:05 +08:00 |
|
Serendipity
|
07da35c349
|
fix: beforeBuildCommand 改用 npm run build(Tauri CWD 在 src-frontend/)
Tauri v2 在 Windows 上执行 beforeBuildCommand 时 CWD 为前端目录
(gui/src-frontend/), 而非 tauri.conf.json 所在目录 (gui/)。
之前 cd src-frontend 和 cd /d src-frontend 都因 CWD 已是前端目录
而找不到路径。直接 npm run build 即可。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-18 11:31:01 +08:00 |
|
Serendipity
|
05b1714628
|
fix: QR 扫描失败 + GUI 导出失败 — PNG margin + separator + fs 插件
🔴 QR 扫描失败根因 (2项):
- render/png: saturating_sub 导致 margin 区域映射到 finder 黑角,
quiet zone 全黑,扫描器无法定位 QR
- matrix/patterns: 缺少右上 finder 左侧 + 左下 finder 顶部
隔离带预留,数据模块破坏 finder 检测比率(1:1:3:1:1)
🔴 GUI 导出失败 (2项):
- gui/Cargo.toml + gui/lib.rs: 注册 tauri-plugin-fs 后端插件
(前端 writeFile 调用缺少 Rust handler)
- capabilities: fs:allow-write-file + $HOME/** 路径 scope
(ACL 默认不给 fs 写权限,需显式声明)
🔧 其他:
- ExportPanel: 导出失败显示红色错误信息(替代静默吞错)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-18 11:21:27 +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
|
11d8cffa57
|
fix: tauri-plugin-store 配置格式 — {} 改为空 plugins
|
2026-06-17 09:16:35 +08:00 |
|
Serendipity
|
91bdf9ecc3
|
fix: 前端 HIGH/MEDIUM — timer 清理 + 历史持久化 + Error Boundary + console 移除
|
2026-06-17 09:03:38 +08:00 |
|
Serendipity
|
a46144f4dc
|
chore: 打包配置 — NSIS 安装包 + WebView2Loader.dll
|
2026-06-17 08:39:41 +08:00 |
|
Serendipity
|
7bad07344d
|
style: 暗色模式完善 + CSS 打磨 + 打包配置
|
2026-06-17 00:27:33 +08:00 |
|
Serendipity
|
ec20a5d083
|
feat: 历史记录面板(回填/删除/清空)
|
2026-06-17 00:25:26 +08:00 |
|
Serendipity
|
3c56fc45d3
|
feat: WiFi/vCard/Email/电话/SMS 全模式表单
|
2026-06-17 00:24:38 +08:00 |
|
Serendipity
|
1a4af38bac
|
feat: QR 预览 + 导出面板(PNG/SVG/复制) + 文本/URL 模式
|
2026-06-17 00:23:23 +08:00 |
|
Serendipity
|
8aacd3bea2
|
feat: 主布局 + 左侧模式面板
|
2026-06-17 00:21:19 +08:00 |
|
Serendipity
|
3186502edb
|
feat: 类型定义 + Context/Reducer + 编码 Hook
|
2026-06-17 00:20:32 +08:00 |
|
Serendipity
|
a952ebcb5f
|
feat: Tauri commands — encode/export/history CRUD
|
2026-06-17 00:19:39 +08:00 |
|
Serendipity
|
4d3147a1e9
|
feat: Tauri 2 + React 脚手架 — gui crate
|
2026-06-17 00:18:39 +08:00 |
|
Serendipity
|
6d11e96fff
|
fix: 移除错误的 egui crate(应为 Tauri 2,Task 2 重新脚手架)
|
2026-06-17 00:10:40 +08:00 |
|
Serendipity
|
95e3cc91ff
|
chore: workspace 加 gui 成员,qr-core 加 serde
|
2026-06-17 00:10:18 +08:00 |
|