**一、立项背景和目标**:传统会议表决多依赖举手或纸质投票,存在统计慢、易出错、留痕难、效率低等痛点。本项目面向党政机关、企事业单位的无纸化会议表决场景,将原由 Java(Spring WebFlux)+ Python(pywebview 壳)+ Vue 三套技术栈拼装、需安装 JVM 与 Python 运行时的系统,重构为单一 Rust 程序:一个 exe 即完整软件,业务接口与原系统 1:1 对齐,实现免安装、免运行时、开箱即用、数据加密留痕的无纸化会议表决全流程。
**二、软件功能、核心功能模块**:①会议管理:创建 / 编辑会议、设置时间地点与出席统计;②参会人员管理:按会议创建账号、Excel 批量导入、PBKDF2 加密;③议程与表决管理:支持表决 / 测评 / 选举 / 评分四类,选项增删排序;④签到管理:签到记录与结果导出;⑤投票明细:投票记录、按项目聚合统计与导出;⑥iPad 端:局域网登录后完成签到、表决、测评、选举、评分,支持手写签名、画布批注与意见反馈;⑦大屏投影:实时展示签到人数、投票进度与结果,支持背景墙 / 分组配置;⑧文件管理:Office/PDF/ 图片上传,Office 转 PDF 再切图预览下载;⑨认证与权限:OAuth2 登录、验证码、会话、用户 / 角色 / 租户 / 菜单 / 操作日志;⑩系统配置:投影屏配置、连接数、同步代理、动态 CRUD。
**三、业务流程与功能路径**:管理员登录→新建会议→导入参会人员→配置议程与表决项→开启会议;参会人用 iPad/APK 经局域网登录→签到→逐项表决 / 测评 / 选举 / 评分→提交反馈;大屏实时同步进度与结果;会后一键导出签到表、表决结果、投票明细(xlsx/docx);全程数据经 SQLCipher 加密落库,可追溯审计。
**一、整体架构与设计思路**:采用单进程架构,一个 exe 同时承载 axum HTTP 服务、WebView2 桌面壳与 SQLite 加密数据库;按安全层(oauth/session/user/group/tenant/authority/captcha/password)、会议业务层(meeting 下 9 大子模块:会议 / 参会人 / 议程 / 表决 / 签到 / 投票 / 文件 / 投屏 / 同步)、本地公开接口层、系统配置层分层解耦。技术栈:Rust + axum + tokio 异步;sqlx + SQLCipher(数据库整体加密、WAL、版本化迁移);winit + wry 渲染 Vue 前端;windows-sys 原生系统托盘;office2pdf + pdfium-render 实现 Office→PDF→PNG 文档转换;calamine 解析 Excel;手写 OOXML 导出 xlsx/docx;RSocket over WebSocket 实时广播;PBKDF2-HMAC-SHA1 密码与 Java 完全兼容。前端 Vue 编译产物零改动复用,通过注入桥接 shim 将 pywebview.api 调用映射到 /api/bridge。
**二、我的负责模块和结果**:独立完成全部后端 Rust 重构,接口与原系统 1:1 对齐:共注册 **110 个路由接口**,覆盖 **65 个 Rust 源文件、23 张数据表**,涵盖安全、会议、投屏、文件、同步、配置等全量模块;实现参会人员按会议隔离登录、Excel 批量导入、SQL 层分页与排序白名单防注入;完成 SQLCipher 整体加密、主密钥独立存放、版本化迁移与 rekey 改密;交付 "单 exe 免运行时" 安装包,替代原 JVM + Python 双运行时,部署与启动显著简化。
**三、难点、坑与解决方案**:(1) 数据库整体加密:编译期内置 SQLCipher,主密钥放 % APPDATA% 而非安装目录,数据库密钥 SHA-256 派生,兼顾安全与卸载残留;(2) 前端不可改源码:服务端注入桥接 shim 映射 pywebview.api,实现前端零改动;(3) 投屏前端懒加载 chunk 404 白屏:静态资源 dist 优先、screen 目录回退修复;(4) sqlx 绑定 Value::String 致 LIKE 匹配失败:强制绑定裸 String;(5) axum 请求体默认 2MB 致 html2canvas 截图上传 413:放宽至 200MB;(6) wry 窗口尺寸不跟随:显式 set_bounds;(7) 分页在 SQL 层完成、动态 CRUD 列名白名单校验,从源头杜绝 SQL 注入。