Commit Graph

70 Commits

Author SHA1 Message Date
Serendipity 171afab9bb docs: 修复 ROADMAP 版本号 — v0.3.0→已交付, v0.4.0/v1.0.0 去重 2026-06-19 21:42:54 +08:00
Serendipity 7f3b8b4cc7 docs: 更新全部 markdown 文档 — v0.3.0
- README: 测试数 81、输出格式表 + vCard 10字段、透视矫正、格式扩展
- CHANGELOG: v0.3.0 条目(格式扩展+解码增强+vCard扩展)
- ROADMAP: v0.2.0/v0.3.0 移至已交付,更新下一版本规划
- CLAUDE.md: 测试 81→105、perspective.rs 模块、Web fmt 参数
2026-06-19 21:41:49 +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 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 8e9e7e1b4c fix: clippy 自动修复冗余闭包 2026-06-19 21:17:12 +08:00
Serendipity b5bc944d71 fix: clippy manual_div_ceil → .div_ceil() 2026-06-19 21:16:42 +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 3d11ba2446 docs: README 修复数字 + mermaid 图完整 + 解码示例
- 测试数 58→72,Tauri commands 5→6
- mermaid 架构图新增 Decoder 层 + Web decode 端点
- mermaid 数据流水线新增解码逆向流程
- 库调用示例新增 decode_image 用法
2026-06-19 20:47:24 +08:00
Serendipity 797a41ea50 docs: 更新全部 markdown 文档 — 加入解码器内容
- README: 解码功能说明 + CLI/Web/GUI 解码示例 + 项目结构树 + 规格表
- CHANGELOG: 解码器条目(9 模块 + 三端入口 + RS/BCH 算法)
- ROADMAP: 解码移至已交付 + 前端工程化 + RS 纠错解码
- CLAUDE.md: 解码器架构 + Web API decode 端点 + IPC 接口
2026-06-19 20:45:22 +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 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 87aa3f4574 fix: 修复 README 项目结构树状图缩进 2026-06-19 19:51:34 +08:00
Serendipity ea07d27603 fix: 修复 README.md 多余代码块闭合标签 2026-06-19 19:49:00 +08:00
Serendipity c20e3f5149 fix: husky hooks 添加 shebang 行以支持 Windows Git 2026-06-19 19:43:33 +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 ce8063431e docs: 开源规范化 — doc comments + 社区文件 + 示例代码 + crates.io 就绪
- 为 core 公开 API 添加完整 doc comments(rustdoc 可用)
- 新增 .editorconfig / CONTRIBUTING / CODE_OF_CONDUCT / SECURITY
- 新增 Issue 模板(bug + feature)+ PR 模板
- 新增 3 个代码示例(examples/)
- 更新 Cargo.toml 元数据(description/repository/keywords/categories/MSRV)
- 更新 README + CHANGELOG
2026-06-19 18:56:28 +08:00
Serendipity cbcd4e5123 docs: 修复 mermaid 图语法错误 — 移除特殊字符
- 去掉 → Unicode 箭头和 <br/>,简化节点文本
- API 节点从梯形语法 /.../ 改为普通方框

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 15:27:02 +08:00
Serendipity 4dc5f62b2e docs: 更新 README + CHANGELOG — web 端 / Docker / 修复记录
- README: 四种使用方式,新增 Web 服务/Docker 章节
- CHANGELOG: 完整的 Fixed 列表 (14 项修复)
- 测试数 69→82, Docker badge, axum badge

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 15:24:50 +08:00
Serendipity 15b3119588 docs: 更新 CLAUDE.md — web 端 + Docker + 修复说明
- workspace: core+cli+gui → core+cli+gui+web
- 新增 Web 服务构建/API 文档
- 新增 Docker 构建说明
- 测试数更新: 69 → 82
- 新增已知坑位 (PNG margin, finder separator, Tauri 导出)
- beforeBuildCommand 改为 npm run build
- 架构树增加 capabilities/ utils/ Dockerfile/ .dockerignore

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 15:22:58 +08:00
Serendipity 88d3d827ca chore: docker-compose 资源限制 + 健康检查 + 日志轮转
- mem_limit: 64m, mem_reservation: 32m
- cpus: 0.5 (N100 4核不缺)
- healthcheck: wget 每60s探测
- logging: 10m/3文件

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 12:33:15 +08:00
Serendipity f19bd6e52e feat: Docker 镜像构建成功 — 17.7MB alpine 镜像
- .dockerignore: 排除 target/ gui/ test/ (镜像上下文 ~3KB)
- web/Dockerfile: sed 移除 gui 成员后编译,避免 Tauri 依赖
- 多阶段构建: rust:alpine 编译 → alpine:3.22 运行

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 12:23:28 +08:00
Serendipity dcd53b2691 feat: web 端 GUI 风格界面 + SVG 支持 + 预览清晰度修复
- index.html: 完整复刻 GUI 三栏布局(模式/预览/设置)
  7 种编码模式切换,实时防抖预览,下载 PNG/SVG/复制
- main.rs: API 新增 fmt=svg 参数,预览用 PNG size=8 避免拉伸模糊
- Dockerfile: 多阶段构建(alpine),部署就绪

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 11:52:08 +08:00
Serendipity 6ba79a99d3 feat: 新增 web 端 — axum HTTP 服务 + Docker 化
新增 workspace crate :
- axum 0.8 + tokio 异步 HTTP 服务
- / → 嵌入式 HTML 页面(输入→实时预览→下载/复制)
- /api/qr?text=&level=M&margin=4&size=8 → PNG
- Dockerfile: rust-alpine 多阶段构建,镜像仅 ~12MB
- Cargo.toml: workspace 新增 web 成员

部署:
  docker build -t qrgen-web -f web/Dockerfile .
  docker run -p 3000:3000 qrgen-web

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 11:42:20 +08:00
Serendipity 79ccac3d8e chore: 添加 MIT License
Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 11:36:56 +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 3f1b9901b5 fix: 格式信息 BCH 编码运算符优先级 — | 低于 ^ 导致 XOR 未覆盖数据位
Bug: ((data << 10) | (val & 0x3FF)) ^ 0x5412 被解析为 (data << 10) | ((val & 0x3FF) ^ 0x5412)
导致格式信息的 XOR mask 未覆盖前 5 个数据位,扫码器读到错误的 EC 级别和掩码编号
2026-06-17 09:26:09 +08:00
Serendipity 11d8cffa57 fix: tauri-plugin-store 配置格式 — {} 改为空 plugins 2026-06-17 09:16:35 +08:00
Serendipity d4da3b4277 fix: placement.rs — actual_col==0 时下溢保护 2026-06-17 09:06:18 +08:00
Serendipity 43926888c9 test: Kanji 编码单元测试
- 添加 4 个 Kanji 编码单元测试到 encoder/mode.rs
- 修复 unicode_to_shift_jis 中 Shift JIS 间隙区域 (0xA0-0xDF)
  导致的整数下溢 bug
- 修复 png.rs 返回类型与函数签名不匹配的问题
- 修复 qr.rs to_png_bytes 返回值类型不匹配的问题

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-17 09:04:05 +08:00
Serendipity 91bdf9ecc3 fix: 前端 HIGH/MEDIUM — timer 清理 + 历史持久化 + Error Boundary + console 移除 2026-06-17 09:03:38 +08:00
Serendipity feb5ae709f fix: 4 个 CRITICAL bug 修复
- C1: placement.rs 删除列偏移特殊处理 (col==6→5),place_bit 已自动跳过保留区
- C2: version.rs V5-H 纠错表 h_g1: 4→2 (总码字数 200→134)
- C3: mode.rs Kanji 编码删除冗余 if/else 重复分支
- C4: galois.rs div() 返回 Option<u8> 替代 panic!
2026-06-17 08:58:29 +08:00
Serendipity 7c13fb8f1c docs: README + CLAUDE.md + CHANGELOG 2026-06-17 08:43:04 +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