接入层
Nginx 提供 HTTPS、反向代理、安全响应头和上传大小限制。应用只监听 `127.0.0.1:3340`,不直接暴露 Python 进程。
一个工程项目从进场、施工、验收、签字、审批,到项目甘特图、竣工组卷、移交、退件整改、接收、冻结和借阅,最后形成可校验归档包的完整闭环。本次更新补充甘特图、完整系统设置中心、全量代码审计、依赖漏洞清理和云端部署证据。
一个真实项目里,资料不是孤立存在的。材料进场要先报验,见证取样后等复试;钢筋、模板、混凝土有检验批,防水有基层、附加层、防水层和保护层隐蔽;闭水、淋水试验要留影像,监理问题要整改回复,进度款与签证又要求时间、部位和签字互相对应。
很多系统只做了“新增一条记录、修改一个状态”,看起来功能很多,真正到项目上却会遇到四个问题:资料目录没人跟踪、工序前后关系没人提醒、审批签字没有证据链、竣工后无法组卷移交。黔建 v2.2 的开发重点,不只是把这条链补完整,还要让项目进度、系统配置和代码安全同样能验收。
这套系统没有引入 React/Vue,也没有为了“看起来现代”增加复杂前端构建链。后台管理界面采用原生 HTML5、CSS3 和 JavaScript ES2020+,配合 Y2Ksoft admin-kit 和水世界深色玻璃拟态视觉。单页前端把项目、目录、工序、AI、台账、工资、归档和系统管理组织成统一工作台。
Nginx 提供 HTTPS、反向代理、安全响应头和上传大小限制。应用只监听 `127.0.0.1:3340`,不直接暴露 Python 进程。
Uvicorn 运行 FastAPI,路由统一处理登录、项目、资料、工序、AI、工资、归档、导出和健康检查。
SQLAlchemy ORM 管理业务模型,SQLite 使用 WAL 模式。数据库、附件、AI 文件和归档包放在独立持久目录。
| 层面 | 技术 / 语言 | 用途 |
|---|---|---|
| 后端语言 | Python 3.14 | 业务 API、权限、数据校验、归档与导出 |
| Web 框架 | FastAPI 0.162.0 + Starlette 1.10.0 | HTTP 路由、依赖注入、文件上传、健康检查和已修复安全边界 |
| ORM / 数据库 | SQLAlchemy 2.0.36 + SQLite WAL | 项目、资料、审批、签字、工序、归档、借阅等模型 |
| 前端 | HTML5 + CSS3 + JavaScript ES2020+ | 无前端框架的单页管理工作台与手机响应式界面 |
| UI | Y2Ksoft admin-kit + 自定义 CSS | 暗色水世界渐变、玻璃拟态、呼吸灯和浅色主题 |
| ReportLab 5.1.0 | 逐卷归档 PDF、卷内目录和封面 | |
| Excel | openpyxl 3.1.5 | 格式化资料台账导出 |
| AI / OCR | RapidOCR + PyMuPDF + python-docx + OpenAI 可选 | 图片、扫描 PDF、Word、Excel 的本地识别与结构化 |
| 认证安全 | PBKDF2 + HttpOnly Cookie + CSRF + CSP | 密码哈希、会话、写操作防伪和内容安全策略 |
| 测试与审计 | pytest + HTTPX + Playwright + axe-core + Bandit + pip-audit | 33 项 API、桌面/手机旅程、备份恢复、静态安全和依赖漏洞 |
| 部署 | Uvicorn + systemd + Nginx + HTTPS | 腾讯云 OpenCloudOS 上常驻运行、自动重启和反向代理 |
浏览器(桌面 / 手机)
│ HTTPS
▼
Nginx https://www.y2ksoft.cn/qianjian/
│ 反向代理、剥离 /qianjian/ 前缀
▼
Uvicorn → FastAPI main:app
├─ app/catalog.py 66 项目录
├─ app/construction_brain.py 11 阶段、57 任务
├─ app/schedule_service.py 项目计划与甘特图数据
├─ app/system_settings.py 12 分区设置、校验与生效
├─ app/ai_service.py OCR 与结构化预填
├─ app/archive_service.py 组卷、PDF、分册、校验
├─ app/services.py 校验、导出、序列化
└─ app/models.py SQLAlchemy 数据模型
│
├─ /var/lib/y2k-qianjian/qianjian.db
├─ /var/lib/y2k-qianjian/uploads/
├─ /var/lib/y2k-qianjian/ai_files/
└─ /var/lib/y2k-qianjian/archive_packages/
`main.py` 是 FastAPI 应用入口,负责创建应用、注册中间件和路由。业务规则没有全部塞进路由:资料目录、施工知识库、AI 识别、归档组卷分别拆进 `app/` 下的独立服务。这样测试时可以针对规则引擎单独验证,归档规则也不会被页面逻辑绑死。
黔建工程资料管理系统/
├─ main.py FastAPI 入口与全部业务 API
├─ app/
│ ├─ models.py 业务表、系统设置与关系模型
│ ├─ migrations.py schema 1 → 10 自动升级
│ ├─ security.py PBKDF2、随机盐、会话令牌
│ ├─ services.py 校验、摘要、CSV/Excel、备份
│ ├─ catalog.py 九大板块 66 项资料目录
│ ├─ construction_brain.py 11 阶段 57 任务知识库
│ ├─ schedule_service.py 项目甘特图与进度偏差
│ ├─ system_settings.py 12 分区设置与业务规则
│ ├─ ai_service.py 本地 OCR、文档解析、AI 结构化
│ └─ archive_service.py 关门检查、组卷、PDF、分册、ZIP
├─ static/
│ ├─ index.html 单页工作台
│ ├─ app.js 业务交互与页面渲染
│ ├─ app.css 水世界主题、呼吸灯、打印样式
│ └─ admin-kit/ Y2Ksoft 官方组件套件
├─ tests/test_api.py 33 项 API 集成测试
├─ e2e/browser_flow.py 32 项真实浏览器业务旅程
└─ docs/使用手册_v2.2.0.pdf 30 页客户使用手册
工程资料涉及多用户、审批、冻结、回执和审计,不能把数据只放在浏览器 localStorage。FastAPI 的依赖注入让每个写接口都能统一校验登录、角色、CSRF 和项目权限;Python 生态又能直接处理 PDF、Word、Excel、OCR 和 ReportLab,不需要再维护第二套文档服务。
当前定位是单机、局域网和中小团队试点。SQLite 配合 WAL、在线快照和独立持久目录,部署成本低、备份简单、恢复路径清楚。它的限制也很明确:单机写入并发有上限。如果未来出现多公司、高并发或跨地域协作,数据层应迁移 PostgreSQL,并把附件迁到对象存储;这次没有把 SQLite 包装成“无限并发”的假象。
schema 10 不是简单加几个字段,而是把项目资料生命周期、系统配置和项目进度都建成可追溯的数据结构。项目下有单位工程、目录状态、阶段任务、资料记录、附件、审批、实名签字;新增 `system_settings` 保存组织、编号、审批、打印、安全、AI 和备份策略;竣工后又关联归档节点、案卷、卷内目录项、归档包、移交事件、回执、保管位置和借阅记录。
| 业务域 | 核心数据 / 表 | 解决的闭环问题 |
|---|---|---|
| 项目 | Project、UnitWork、ProjectExecutionState | 项目、单位工程、当前施工阶段和阶段日期 |
| 目录 | ProjectCatalogStatus + 66 项内置目录 | 责任人、计划日期、状态、风险、关联资料 |
| 工序 | ProjectBrainTaskStatus + 57 项知识库 | 今日、明日、7 天提醒、阻断条件和下一工序 |
| 设置 | SystemSetting | 组织、编号、审批、提醒、打印、安全、AI 和备份策略 |
| 资料 | Record、RecordSignature、Attachment | 模板快照、检验项、审批、实名签字、附件 |
| 审批 | Approval | 提交、通过、驳回、整改、再提交 |
| AI | AiIntakeJob、AiUploadSession | 上传、哈希去重、识别、校对、导入草稿 |
| 劳资 | Worker、Attendance、WageSlip、WageSignature | 实名制、考勤、工资审批与付款签字 |
| 归档 | ArchiveNode、ArchiveVolume、ArchiveVolumeItem | 20 节点、案卷、卷内目录、页码、分册 |
| 移交 | ArchiveTransfer、ArchiveTransferEvent、ArchivePackage | 提交、退回、重提、接收、回执、冻结、SHA256 |
| 保存 | ArchiveRetention、ArchiveBorrow | 保管期限、存放位置、借阅、归还和逾期 |
系统已经经历 1.7 到 2.2 多次结构升级,当前 schema 10。`app/migrations.py` 会按版本逐步补表、补字段和迁移历史数据,启动时自动检查 schema。备份中包含版本号,恢复演练使用独立数据库验证,避免“恢复后发现字段不对”。
资料记录带有版本号。两个人同时打开同一条资料时,后提交的人必须基于最新版本,否则服务端拒绝静默覆盖。这个问题在多人协作的现场很容易发生,尤其是项目经理审批、资料员补附件同时进行时。
系统有四类角色:系统管理员、项目经理、资料员、访客。所有写接口都在服务端检查角色和 CSRF Token,不依赖前端按钮是否隐藏。附件下载、归档包下载和备份接口也绑定当前会话。
密码使用 PBKDF2 + 随机盐哈希,会话 Cookie 设置 HttpOnly、SameSite=Lax;HTTPS 环境启用 Secure。登录后会话失效策略明确。
提交、审批、签字、归档、备份等写操作必须携带 CSRF Token。完整备份由 GET 改为 POST + CSRF,避免被诱导链接触发全量导出。
失败登录按 IP 和用户名双维度记录到数据库,重启和多进程后仍然有效。只有配置可信代理时才采用 X-Forwarded-For。
应用统一加入 CSP、X-Frame-Options、nosniff、Referrer-Policy 和 Permissions-Policy;API 文档默认关闭。
上传类型、大小和存储目录受控;AI 自动扫描只读指定收件箱,不扫描整块电脑磁盘,也不把工程文件直接上传到外部服务。
登录、修改密码、项目创建、资料提交、审批、签字、归档、备份等动作记录用户、时间、IP、实体和摘要,方便事后追溯。
# 生产环境关键变量
QIANJIAN_DB_PATH=/var/lib/y2k-qianjian/qianjian.db
QIANJIAN_DATA_DIR=/var/lib/y2k-qianjian
QIANJIAN_SECURE_COOKIE=1
QIANJIAN_TRUSTED_PROXIES=127.0.0.1,::1
QIANJIAN_PUBLIC_URL=https://www.y2ksoft.cn/qianjian
QIANJIAN_ENABLE_API_DOCS=0
QIANJIAN_SEED_DEMO=0
资料目录覆盖工程前期、施工技术与交底、材料进场、试验检测、质量验收、安全文明、农民工劳资、防水专项和竣工验收九大板块。每一项不是静态清单,而是能登记责任人、计划日期、状态、办理说明,并关联项目内资料台账。
关键缺口会进入工作台红色呼吸预警,并与 AI 决策摘要联动。但目录本身不等于正式地方标准:当前内置的是业务覆盖清单和示例模板,正式使用前必须导入项目所在地现行表格和监理认可的表样。
用户真正想要的“AI 决策”不是让大模型随口安排施工,而是系统知道当前项目处在哪个阶段、阶段开始多久、哪些关键任务没完成、哪些资料缺失、下一道工序需要什么。我们采用可审计的工序知识库 + 规则依赖,而不是让模型自由编造。
按当前阶段、资料状态、目录缺口和任务状态生成,标注责任人和关键阻断项。
当天任务不足时,自动补入下一阶段首批准备事项,而不是给出空白计划。
未来 7 天的验收、试验、整改和资料节点提前提示,避免到了现场才补资料。
当前知识库包含 11 个阶段、57 个任务和 40 个可阻断前置条件,覆盖进场准备、土方基坑、基础、地下防水、回填、主体、砌体、屋面/厨卫防水、机电、装饰和竣工验收。
关键任务未完成时,服务端返回 409,禁止推进工序,并列出具体缺项。资料录入完成后,系统还会根据模板关联显示后续隐蔽、试验、保护层或验收动作。这样既不盲目前进,也不是只看进度百分比。
v2.2.0 新增“项目进度”页面。它不再只给项目填一个 0–100% 的装饰数字,而是根据项目开竣工日期、11 道施工工序、阶段工期权重和任务完成情况,生成真正的计划时间轴。
十一道工序按项目总工期比例分配起止日期,展示今天位置线和关键里程碑。
同时显示实际完成率、计划应完成率、偏差、任务数量和阶段状态。
尚未进入的阶段固定显示 0%,不会把准备性任务误算成现场施工完成。
图表数字与 API 实时同步。每个阶段条形内直接显示百分比,右侧显示任务完成数,不依赖鼠标悬停;桌面、手机、深色和浅色主题都保留数字。

v2.2.0 将系统设置重构为 12 个分区。设置保存在新增 `system_settings` 表,服务端按分区白名单校验,所有修改都进入审计日志。
| 分区 | 关键配置 | 实际生效位置 |
|---|---|---|
| 组织信息 | 企业全称、简称、系统名称、联系人和地址 | 系统品牌、打印页眉和归档信息 |
| 编号规则 | 资料、整改、试验和交底格式、流水号位数 | 新资料自动编号 |
| 审批规则 | 严格流程、电子签字、整改复查、归档闸门、项目经理自审 | 提交、审批、归档和工序推进 |
| 提醒规则 | 证照到期、未来任务、工资逾期、工作台刷新 | 预警中心与自动刷新 |
| 打印设置 | A4、字号、边距、页眉页脚、签字摘要 | 浏览器打印和 PDF |
| 安全策略 | 会话时长、登录失败上限、密码长度、日志保留建议 | 登录和密码修改 |
| AI 识别 | 自动扫描、间隔、人工复核、最低置信度、上传上限 | 桌面收件箱与 AI 上传 |
| 备份策略 | 提醒周期、AI 文件、归档包和校验要求 | 完整 ZIP 备份与恢复前检查 |
| 用户与权限 | 角色、姓名、密码重置、启停和管理员保护 | 全部登录与审批权限 |
| 审计日志 | 动作、用户、日期、关键词和 CSV 导出 | 系统操作追溯 |
| 备份与恢复 | 完整 ZIP、JSON、备份校验和强制下线会话 | 数据维护 |
| 运行状态 | 版本、schema、审批强制策略和业务数量 | 管理员运行检查 |
审批设置不再是前端开关。例如关闭“资料流转必须电子签字”后,后台提交、审批和归档会按配置执行;关闭“允许项目经理审核本人资料”后,项目经理审批自己创建的记录会收到 403。服务器设置 `QIANJIAN_STRICT_WORKFLOW=1` 时,页面不能关闭严格流程。


项目资料最耗时的环节之一是重复输入。现场资料可能来自手机拍照、扫描 PDF、Word、Excel,也可能是资料员把文件放在电脑桌面。系统提供三种入口:控制台上传、手机扫码拍照、桌面受控收件箱自动扫描。
本地默认识别链路是 RapidOCR、PyMuPDF、python-docx 和规则匹配,不配置云端密钥也能工作;只有在客户明确配置 API 时才使用大模型增强字段理解。文件通过 SHA256 去重,识别任务有状态、来源、原始文件、提取字段、问题和置信度。
手机扫码入口采用一次性上传会话,二维码 30 分钟内有效。云端部署时上传地址由 `QIANJIAN_PUBLIC_URL` 生成,不再把本机 localhost 地址写进二维码。
每份资料都保留模板快照。模板以后改版,不会把历史资料的数据含义改掉。字段分为文本、文本域、下拉、日期和检查项;必填、数值范围、检查项结论由服务端校验,避免绕过前端直接提交错误数据。
提交、批准、驳回、付款和归档都绑定登录用户的实名信息、时间、签字摘要,可附加手写签名。签字被包含在资料详情、打印、Excel、CSV、JSON 和 ZIP 备份中。任何审批都不会只改一个彩色状态标签而没有证据。
工程资料不能只管质检表。农民工花名册、身份证、合同、考勤、工资表、银行流水、公示照片和纠纷台账都是迎检高频内容。系统把工人、考勤、工资单、审批和付款签字串起来。
客户真正每天使用的不是“炫酷图表”,而是打印、导出、签字和恢复。系统支持 A4 浏览器打印、多选连续打印、资料详情打印、CSV、格式化 Excel、模板包 JSON、全量 JSON 和数据库 + 附件 ZIP。
支持模板包 JSON 导入;AI 识别支持图片、PDF、Word、Excel;所有导入数据先进入草稿或校对区。
资料台账 CSV、格式化 Excel、工资 CSV、目录 CSV;归档包包含逐卷 PDF、卷内目录、资料 JSON、附件、目录 CSV 和 manifest。
POST + CSRF 导出 ZIP,内含 SQLite 在线快照、上传附件、AI 文件、归档包、回执和 manifest。
schema 10 备份独立恢复到新数据库后,核验系统设置、项目、目录、工序、资料、签字、工资、归档包、回执、移交和事件完整。
备份不是“数据库文件复制一下”这么简单。SQLite 使用在线备份快照,保证导出时数据库一致性;代码目录和业务数据目录分开,重新部署不会覆盖 `/var/lib/y2k-qianjian`。
v2.0 引入了项目级归档,v2.2 继续把系统设置、项目进度和代码审计补齐。归档不再只是把单份资料标记成“已归档”。系统先做竣工关门检查:66 项目录、关键缺口、全部资料审批状态和竣工验收阶段必须同时满足。然后按配置化归档节点建立案卷、卷内目录、页码和分册。
qianjian-archive-项目编号-版本.zip
├─ archive_manifest.json
├─ SHA256SUMS.txt
├─ volume_catalog.csv
├─ volumes/
│ ├─ 01_工程准备文件.pdf
│ ├─ 02_监理文件.pdf
│ ├─ 03_施工文件.pdf
│ └─ ...
├─ records/
│ └─ records.json
└─ attachments/
├─ 隐蔽验收照片.jpg
├─ 材料合格证.pdf
└─ 复试报告.pdf
默认 20 个归档节点覆盖工程准备、监理、施工、竣工验收和归档保存。超过 200 页自动分册并保持连续页次;卷内目录可以追溯到资料编号、模板、项目、单位工程和附件。归档包生成后保存 SHA256,移交时不会只靠文件名判断版本。
| 移交状态 | 允许动作 | 控制点 |
|---|---|---|
| 草稿 | 关门检查、组卷、生成归档包 | 资料缺口和最终阶段未完成时不能提交 |
| 已提交 | 甲方/监理/住建或档案馆接收或退回 | 接收方核验归档包和清单 |
| 退回整改 | 填写原因、修复资料、重新组卷、重新提交 | 退件原因留痕,版本重新计算 |
| 已接收 | 上传回执、登记保管和存放位置 | 回执文件类型、大小和校验 |
| 已冻结 | 禁止重建和修改,允许按流程借阅 | 冻结后保留移交事件和签字摘要 |
接收后登记保管期限、库房位置和借阅归还;逾期借阅有状态提醒。这样,项目资料从进场资料目录一路走到“可交付给甲方、监理或城建档案部门审查的归档包”,而不是停在系统内的某个状态标签。
v2.2.0 采用接口测试、真实浏览器旅程、视觉/无障碍、静态安全扫描和依赖漏洞审计五层验收。测试覆盖资料填报、审批签字、甘特图、设置保存、用户权限、备份校验、AI 校对、工资审批、组卷、退件、重提、接收、冻结和借阅。
| 审计发现 | 风险 | 修复 |
|---|---|---|
| 访客可读取工资和 AI 原始资料 | Broken Access Control | 劳务与 AI 入口统一限制 admin / manager / inspector |
| 项目经理可绕过自审限制 | Business Logic | 审批接口读取 allow_manager_self_approval |
| 电子签字开关未接入业务 | Configuration Bypass | 提交、审批和归档统一读取设置 |
| 空显示姓名破坏签字 | Input Validation | 姓名至少两个字符 |
| CSP 允许未使用第三方脚本域 | Security Misconfiguration | script-src 收紧为 self |
| 旧 Starlette 依赖漏洞 | 已知 CVE / DoS / 路径问题 | FastAPI 0.162.0 + Starlette 1.10.0 |
安全审计不是把“未实现”伪装成“已实现”。项目级成员 ACL、贵州正式表样、住建/档案馆 XML 接口和 CA 签章仍需要客户组织架构、正式规范或接口文档,系统没有用猜测规则代替正式边界。
线上部署在腾讯云 OpenCloudOS 9,使用现有域名 `www.y2ksoft.cn` 的 HTTPS 子路径,避免等待新子域名 DNS。Nginx 保留公网路径 `/qianjian/`,代理时转发到本机 3340;应用只绑定回环地址,业务数据库和附件不放在代码目录。
# 服务器目录
/var/www/y2ksoft/qianjian/ 代码与虚拟环境
/var/lib/y2k-qianjian/ 数据库、附件、AI文件、归档包、回执
/etc/y2k-qianjian.env 生产环境变量,权限 600
/etc/systemd/system/qianjian-doc.service
/etc/nginx/conf.d/y2ksoft-qianjian.inc
前端资源原来使用 `/api/`、`/static/` 绝对路径,放到子路径会跳出应用。本次部署改为基于当前页面目录解析资源,所以本地根路径和云端 `/qianjian/` 都能工作;手机上传页面也使用公开 URL 前缀生成二维码和 API 地址。
systemd 负责自动重启、日志和运行边界:应用以独立 `qianjian` 用户运行,`ProtectSystem=strict`、`ProtectHome=true`、只允许写 `/var/lib/y2k-qianjian`。Nginx 配置修改前已备份,修改后先执行 `nginx -t` 再 reload,避免影响同一台服务器上的其他系统。
v2.2.0 升级前额外保存了部署前代码包和数据库快照:`/root/qianjian-backups/code-before-v2.2.0-20261031_102435.tar.gz` 与 `db-before-v2.2.0-20261031_102435.db`。升级后健康检查返回 `version 2.2.0 / schema 10 / database ok`。
系统地址:https://www.y2ksoft.cn/qianjian/
生产版本:v2.2.0 · schema 10 · HTTPS










博客正文讲开发逻辑,客户日常操作请看配套 30 页图文手册。手册按“登录 → 工作台 → 项目/目录/工序/甘特图 → 资料填报与审批 → 系统设置 → AI 收录 → 工资 → 竣工归档移交 → 系统备份”的顺序编写,关键按钮带编号箭头。
PDF · 30 页 · 甘特图、系统设置、审计、工资、归档和备份
这次交付已经形成从项目建立到档案保存借阅的完整可运行闭环,但不能把“完整”理解成“所有地区、所有法定格式都已兼容”。下面这些内容仍在后续路线中:
这不是给系统找借口,而是工程软件应有的边界:能验证的功能写清楚,缺客户规范或接口的功能明确列为接入项。真正可用的系统,不是每个按钮都写“AI”,而是每个关键动作都能追溯到数据、规则、责任人和归档证据。
黔建不是一个“好看的项目资料表格库”。它把 66 项目录、11 阶段甘特图、57 项施工任务、12 分区系统设置、AI 识别、审批签字、工资台账、竣工组卷、移交回执、冻结借阅、打印导出、备份恢复和代码安全审计连成一条能运行、能检查、能归档的项目资料链。
系统已经上线:www.y2ksoft.cn/qianjian/