1、立项背景和目标:集团及下属多个主体每年需开展员工满意度、培训需求、制度落实、招聘与人才盘点等多类调研,此前使用免费在线表单工具,存在三个硬伤:一是数据存放在第三方公有云,薪酬、绩效、组织人事等敏感数据无法合规留存;二是问卷样式与统计口径不统一,一份结论报告需要人工汇总 2—3 天;三是多主体同时使用时问卷互相可见、权限无法隔离。项目目标是自建一套可本地私有化部署、数据完全自主可控、支持多租户物理隔离的在线调研平台,把"发问卷—收数据—出结论"的全链路压缩到半天以内。
2、软件功能和核心功能模块:平台内置 21 种题型(单选、多选、下拉、矩阵、量表、评分、NPS、权重打分、签名、数字、日期、文本等),核心模块包括三栏拖拽式可视化编辑器(左题型库 / 中画布 / 右属性面板)、跳题逻辑与显示条件、断点续答、匿名与实名双模式、多租户物理隔离(每个租户独立数据库与上传目录)、角色权限体系(平台超管、租户管理员、只读查看)、ECharts 统计与交叉分析(频次、占比、均值、词云、矩阵透视)、实时投屏大屏、答卷明细与原始数据导出。
3、业务流程和功能路径:管理员登录 → 新建问卷(默认草稿)→ 拖拽配置题目与逻辑 → 发布并设置回收期限 → 通过链接或二维码分发 → 受访者免登录填写(手机端适配、断点续答)→ 实时统计与投屏 → 一键导出明细与图表 → 归档沉淀题库。
1、整体架构和设计思路:采用"单体分层 + 多租户物理隔离"架构。Flask 承担 Web 层,SQLite(WAL 模式)承载数据,waitress 作为生产级 WSGI 容器,systemd 托管进程,Nginx 负责反向代理与静态资源;前端使用原生 JavaScript 零构建(不依赖 Node 工具链,便于在离线内网与信创环境交付)。后端按 engine(问卷引擎)/ models(数据模型)/ library(题库资产)/ tenant(租户路由)/ security(安全) / perf(性能)分层解耦,租户前缀由中间件统一剥离,实现一套代码支撑"一租户一库"、交付即拷贝目录。
2、我负责的模块和结果:独立完成需求定义、原型设计、全部后端与前端开发、性能调优、安全加固与部署运维。量化结果:支持题型 21 种;首屏资源体积由 78.2 KB 压缩至 21.2 KB(下降 73%);公网 50 并发压测 p95 响应由 18.1 秒降至 3.7 秒,100 并发 p95 为 5.9 秒;"同一时刻集体打开"的承载人数由 25 人提升至 50—60 人;单次调研从发放到产出结论由约 2 个工作日缩短至 0.5 个工作日;平台已支撑集团多个主体的常态化调研,零数据外泄。
3、遇到的难点和解决方案:① SQLite 在高并发读写下出现锁等待,通过启用 WAL 模式、把统计查询改为预聚合缓存并补建条件索引解决;② 公网带宽仅 4 Mbps,静态资源成为瓶颈,引入 gzip 压缩与基于文件修改时间的长缓存(?v=mtime),并修正 Vary 响应头(追加 Accept-Encoding),使压缩与缓存同时生效;③ HR 敏感数据合规要求高,实现登录失败"IP + 账号"双维度分级限流(5/8/12/20 次分别对应 5 分钟至 6 小时封锁)、Cookie 加 HttpOnly 与 SameSite、全站非 GET 请求校验 Origin/Referer、上传做扩展名白名单与随机文件名、密码以 PBKDF2-SHA256 20 万轮加盐存储;④ 存量单租户数据升级为多租户时不能丢线上数据,编写幂等迁移脚本(先备份、再按租户拆库),迁移后逐租户核对答卷数量与统计结果一致才放行。