docs: 新建会议步骤补计票规则选择(默认按类型内置/可选规则库条目,保存快照) Co-Authored-By: Claude Code noreply@anthropic.com
docs: 新建会议步骤补计票规则选择(默认按类型内置/可选规则库条目,保存快照)
Co-Authored-By: Claude Code noreply@anthropic.com
基于《见微·投票系统_需求分析报告》与《见微·投票系统_系统设计文档》实现的可运行系统。
技术栈为落地实现:Python + FastAPI + SQLite(设计文档原定 Java + Spring Cloud + 达梦 + 密码机)。 本实现以「四个独立 SQLite 文件」模拟三库物理隔离,以 真国密 gmssl(SM2/SM3/SM4) 落地密码学能力, 以「密码机抽象层」模拟密钥托管,完整保留需求与设计的业务语义(匿名机制、状态机、规则引擎、审计哈希链等)。
app/core/hsm.py
data/keys/
sign/verify/public_key/fingerprint
alg: SM2
Database
?
%s
.env
DB_BACKEND
EVOTING_*
Dockerfile
docker-compose.yml
data/
GET/POST /api/v1/branding
# 1. 创建虚拟环境并安装依赖 python -m venv venv venv/Scripts/pip install -r requirements.txt # Windows # venv/bin/pip install -r requirements.txt # Linux/macOS # 2. 启动(首次自动初始化数据库并生成演示数据) python run.py
cp .env.example .env # 按需修改 MASTER_KEY 等生产配置 docker compose up -d --build
访问 http://127.0.0.1:8000
系统内置 4 个演示会议(均从「筹备中」开始,可完整走一遍):
通用流程:
electCondition.denominator
ACTUAL
VALID
evoting-system/ ├── run.py # 启动入口(初始化 + 种子 + 服务) ├── config.py # 配置中枢(.env 加载、DB_BACKEND、安全阈值、启动自检) ├── requirements.txt ├── Dockerfile / docker-compose.yml / .dockerignore / .env.example ├── app/ │ ├── main.py # FastAPI 应用 + 路由挂载 + 静态前端 │ ├── core/ # 核心机制:crypto(SM2/SM3/SM4) / hsm(密码机抽象) / ticket / │ │ # rule_engine / captcha / ratelimit / errors │ ├── db/ # 数据层:db.py(存储抽象) + schema.py(四库 Schema) │ ├── services/ # 业务服务(auth(JWT)/election/candidate/roster/ticket/ballot/count/audit/system) │ ├── api/ # REST 路由(/api/v1) │ └── web/index.html # 单页前端(六大模块 + 三套皮肤) ├── scripts/ │ ├── seed.py # 演示种子数据(四类会议) │ └── test_http.py # HTTP 层端到端测试(含验证码,自动反解 SVG 算式) └── data/ # 运行时生成的四库文件与 SM2 密钥(gitignore)
# 推荐:pytest 套件(数据目录自动隔离到临时目录,可无限次重跑) python -m pytest tests/ -q # 覆盖:核心匿名闭环 / 匿名性去关联断言 / 状态机失败重试 / 多语句原子性 / # 备份一致性 / 名册幂等 / 候选人状态校验 / 错误契约 / 多题型计票 / # 验证码与频控 / HTTP 端到端(TestClient 免启动服务,自动解析 SVG 算式)
旧版冒烟脚本 scripts/test_http.py 依赖 data/ 初始状态与运行中的服务(不可重跑),HTTP 层覆盖已由 tests/ 取代,保留仅作参考。
scripts/test_http.py
tests/
管理员登录后在「系统管理」页底部「模型设置」卡片中,配置右下角智能助手的连接方式与模型。
安全约束:仅支持本机/内网地址,数据不出机。 保存配置与「测试连接」都会校验地址 必须解析到回环/私网网段(127.0.0.0/8、10/8、172.16/12、192.168/16、::1、fc00::/7 等), 公网地址直接拒绝(400「仅支持本机/内网地址…数据不出机」),模型推理请求不会发往外网。 「测试连接」按所选方式探测服务并列出可用模型(Ollama /api/tags、OpenAI 兼容 /v1/models)。
/api/tags
/v1/models
EVOTING_MODEL_MIRROR
models/<模型文件名>
<文件名>.part
EVOTING_DB_BACKEND
EVOTING_DATA_DIR
EVOTING_MASTER_KEY
EVOTING_SESSION_TTL
EVOTING_CAPTCHA_EXPOSE_ANSWER
EVOTING_SEED_DEMO
EVOTING_LOGIN_FAIL_LOCK
EVOTING_RATE_LIMIT_REQUESTS
iv‖ciphertext
CAPTCHA_EXPOSE_ANSWER
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
见微·投票系统(完整版)
基于《见微·投票系统_需求分析报告》与《见微·投票系统_系统设计文档》实现的可运行系统。
完整版升级点(相对演示版)
app/core/hsm.py托管(私钥持久化data/keys/,密钥不出机概念),接口sign/verify/public_key/fingerprintalg: SM2),服务端不保存会话、重启不丢会话;logout 用「吊销黑名单」按签名指纹即时失效Database抽象 + SQLite 默认实现 + PostgreSQL/MySQL 方言预留(?→%s占位符转换),.env一键切换DB_BACKEND.env零依赖加载 +EVOTING_*环境变量 + 生产安全默认(验证码答案默认不出响应)Dockerfile+docker-compose.yml,数据卷持久化data/,生产环境变量GET/POST /api/v1/branding,管理员密码门禁、长度校验、变更入审计),前端彩蛋/双击编辑一、快速开始
方式 A:本地运行
方式 B:Docker 部署
访问 http://127.0.0.1:8000
二、演示账号
三、演示流程(核心匿名投票闭环)
系统内置 4 个演示会议(均从「筹备中」开始,可完整走一遍):
通用流程:
四、已实现能力(对照设计文档)
electCondition.denominator:ACTUAL实到(默认)/VALID有效票)五、项目结构
六、运行测试
七、模型设置与模型中心(本地大模型)
管理员登录后在「系统管理」页底部「模型设置」卡片中,配置右下角智能助手的连接方式与模型。
连接方式(4 种)
模型中心(预置下载 / 导入 / 导出 / Ollama 列表)
EVOTING_MODEL_MIRROR(镜像基地址,服务端拼models/<模型文件名>下载)。 下载支持断点续传(HTTP Range:<文件名>.part+ 断点元数据落盘,中断后自动续传) 与取消;未配置镜像时点击下载提示「未配置镜像地址 EVOTING_MODEL_MIRROR」。八、配置项(.env / 环境变量)
EVOTING_DB_BACKENDEVOTING_DATA_DIREVOTING_MASTER_KEYEVOTING_SESSION_TTLEVOTING_CAPTCHA_EXPOSE_ANSWEREVOTING_SEED_DEMOEVOTING_LOGIN_FAIL_LOCKEVOTING_RATE_LIMIT_REQUESTSEVOTING_MODEL_MIRROR九、说明与边界
app/core/hsm.py后端替换为真实密码机(私钥永不出机)。iv‖ciphertext),生产建议 SM4-GCM(已预留接口)。CAPTCHA_EXPOSE_ANSWER默认 False,生产绝不开。