一、项目概述
法律文书智能摘要系统是一个基于Vue 3 + FastAPI的法律文书处理平台,核心功能包括文书上传解析、智能摘要生成、多角色视角对比、用户反馈收集与内容导出分享等。本期开发主要围绕系统基础架构修复 、文件上传解析能力建设 和五项核心功能扩展三个方向推进。

二、系统基础架构修复
2.1 数据库初始化顺序修复
问题描述 :项目启动时,main.py先导入所有路由模块,而路由模块中的某些代码在模块顶层就立即执行了数据库操作(如storage_service.initialize_users()向annotation_users表插入默认数据),但建表操作init_db()直到第30行才被调用,导致表不存在即执行插入操作,应用启动崩溃。
解决方案 :将init_db()的调用提前到所有路由导入之前,同时确保其他数据库迁移(如mmem_migration.ensure_schema())也在导入前完成。
python
# app/main.py(修改后)
from app.db.connection import init_db as init_db_full
init_db_full() # 先建表
from app.services.mmem import migration as mmem_migration
mmem_migration.ensure_schema()
# 然后才导入路由模块
from app.api.documents import router as documents_router
from app.api.storage import router as storage_router
修复效果 :导入storage_router时,annotation_users表已被创建,initialize_users()能正常执行INSERT语句,应用启动成功。
2.2 两套数据库连接统一
问题描述 :项目存在两个独立的数据库模块------app/db/connection.py连接data/legal_docs.db,app/db/db.py连接backend/app.db。登录、注册等接口使用的工具函数从db.py导入,操作的是app.db,而connection.init_db()把表建在legal_docs.db中,导致/login和/send-code请求报错no such table: users和no such table: verify_codes。
解决方案:
- 删除
db.py中独立的DB_PATH和get_db_connection()函数 - 从
connection导入统一的DB_PATH和get_db - 将所有数据库操作函数改为使用
get_db()上下文管理器 - 删除
db.py中多余的init_db()函数 - 修正
app/db/__init__.py的导入
修复效果 :所有模块通过get_db()操作同一个legal_docs.db文件,表结构完全一致,登录、注册等接口请求正常返回。
三、文件上传与解析功能
系统采用格式识别 + 策略路由 的架构模式,在documents.py中实现统一的上传入口,根据文件扩展名和内容特征自动路由到不同解析器。
3.1 TXT格式------多编码兼容解码
TXT文件解析实现了多编码容错机制:首选UTF-8解码;检测到双重编码(mojibake)特征字符时自动修复;UTF-8失败时降级为GBK解码;最终以errors="replace"兜底,确保任何情况下都能解析。
3.2 DOCX格式------python-docx解析
利用python-docx库遍历文档段落,通过样式名判断标题("Heading" in para.style.name),保持段落结构,为每个段落生成带类型标注的文本块。
3.3 PDF非扫描件------PyMuPDF高精度解析
扫描件检测 :采样前3页,若文本总量少于50 * pages_to_check字符则判定为扫描件。
段落合并算法:融合三重判断------行尾空缺比例(gap_ratio > 0.20)、垂直间距(> 2.5倍字号)、字体大小变化(> 1.5倍),自适应识别段落边界。
行类型识别:根据坐标位置判断页眉(bbox1 < 50)、页脚(bbox3 > page.rect.height - 50)、标题(字号 > 14)和正文。
3.4 PDF扫描件------OCR + LLM勘误
图像预处理:灰度化 → 二值化(Otsu阈值)→ 中值滤波去噪 → 倾斜校正。
OCR识别 :使用Tesseract OCR(chi_sim语言包)以300 DPI分辨率渲染页面进行识别。
LLM勘误:OCR完成后调用LLM进行勘误和标准化,提升识别质量。
3.5 四种格式对比
| 维度 | TXT | DOCX | PDF(非扫描) | PDF(扫描件) |
|---|---|---|---|---|
| 解析引擎 | Python内置解码 | python-docx | PyMuPDF | Tesseract OCR |
| 文本精度 | 无损 | 无损 | 无损 | 依赖图像质量 |
| 结构保留 | 仅段落 | 标题/段落 | 完整结构+坐标 | OCR重建结构 |
| 处理耗时 | 极快 | 较快 | 中等 | 较慢 |
四、五项核心功能扩展
4.1 多角色并行对比
需求:支持同时生成法官、律师、法学生三个角色的摘要,并排展示或Tab切换,用不同颜色高亮差异。
实现方案:
- 新建
MultiRoleComparison.vue组件 - 后端新增
POST /api/summary/{doc_id}/multi-role端点,一次性生成三个角色摘要 - UI提供顶部Tab切换(法官/律师/学术),当前激活Tab对应颜色边框
- 新增"并排模式"按钮,三摘要卡片水平排列
- 差异高亮:对相同段落但不同表述的文本进行对比标注
触发路径:用户打开文档详情页 → 生成任意角色摘要 → 点击"多角色并行对比"按钮 → 点击"生成三个角色" → Tab/并排模式切换查看。
4.2 满意/不满意反馈面板
需求:用户对摘要给出满意或不满意反馈,存储反馈数据用于优化模型指令。
实现方案:
- 数据库新增
summary_feedback表(id, doc_id, role, version_id, rating, comment, created_at) SummaryPanel.vue结果区底部添加反馈按钮组- 后端新增
POST /api/summary/{doc_id}/feedback端点 - 后台管理页可查看所有反馈数据统计
触发路径:生成摘要后底部出现反馈面板 → 点击👍或👎 → 选填原因 → 提交反馈 → 显示"感谢反馈"。
4.3 反馈机制深度完善
在基础反馈功能之上,进一步实现了完整的反馈闭环:
数据库层:
- 升级
summary_feedback表,新增user_id、session_id、ip_address、version_id、updated_at字段 - 系统启动时自动检测并添加缺失列
- 新增CRUD函数:
save_summary_feedback()(防重复提交/更新)、get_user_feedback()、list_feedbacks()(管理员分页)、get_feedback_stats_global()(全局统计)
后端API:
POST /api/summary/{doc_id}/feedback--- 支持匿名ID、自动去重/更新GET /api/summary/{doc_id}/feedback/user--- 查询用户已有反馈GET /api/summary/admin/feedbacks--- 管理员反馈列表(仅本地访问)GET /api/summary/admin/feedbacks/stats--- 全局统计(仅本地访问)
前端工具层:
- 新建
feedback.ts:getAnonymousId()(localStorage持久化UUID)、getSessionId()(sessionStorage会话UUID)
管理后台:
- 新建
AdminFeedbackView.vue:概览卡片(总反馈数/满意率/满意/不满意数量)、筛选器(文档ID/视角/评分)、数据表格、详情弹窗、分页支持 - 新增路由
/admin/feedback
4.4 导出为图片(PNG)
需求:一键导出当前视图为PNG图片。
实现方案:
- 前端安装
html2canvas依赖 SummaryPanel.vue工具栏添加"导出图片"按钮- 使用html2canvas将摘要内容区域渲染为canvas并导出PNG
- 支持选择导出范围(仅摘要/包含来源映射)
触发路径 :点击"导出报告▾" → 选择"导出PNG图片" → 自动下载摘要_{角色}_{文档ID}.png。
4.5 导出为CSV
需求:将摘要关键要素导出为CSV表格格式。
实现方案:
- 后端
enhance.py新增CSV导出格式支持,使用Pythoncsv模块生成CSV响应 - 前端"导出报告"按钮下拉菜单增加"导出CSV"选项
触发路径 :点击"导出报告▾" → 选择"导出CSV" → 下载report_{文档ID}.csv → Excel打开可直接查看(中文表头,UTF-8编码兼容)。
4.6 分享功能
需求:分享摘要亮点和批注内容。
实现方案:
- 前端使用
navigator.shareAPI(Web Share API) - 不支持Web Share时降级为"复制链接"功能
- 生成分享摘要:文档名 + 角色摘要概述 + 关键要素前3条
- 批注分享:导出选中批注为格式化文本
涉及文件 :SummaryPanel.vue(分享按钮)、AnnotationPanel.vue(批注分享)
触发路径:点击"分享"按钮 → 移动端弹出系统原生分享面板(微信/钉钉/QQ等)→ 桌面端自动复制到剪贴板。
4.7 多角色对比排版优化
目标:全屏模态框展示多角色对比内容,实现三个角色平行滚动。
功能点:
- 全屏展开 :使用Element Plus的
el-dialog实现全屏对话框,支持Tab/三栏并排/单栏聚焦三种布局切换 - 平行滚动:三个角色内容区域共享滚动条位置,滚动任一卡片自动同步其他两个;提供"解除同步"开关(默认同步)
- 全屏布局优化:Tab模式标签更醒目;并排模式三栏宽度均分;字体从13px放大至15px
平行滚动实现 :为三个并排卡片添加ref引用,监听滚动事件通过scrollTop同步;使用isSyncScrolling标志防止滚动事件循环触发。
4.8 法制助手跳转逻辑修复
问题:法制助手页面检索后点开文档,返回时回到文档管理页面而非检索结果页面。
解决方案:
- 搜索时保存状态:URL携带
?q=关键词&mode=搜索模式参数 - 点击文书时记录来源:
goToDocument将当前搜索页面的完整URL(含查询参数)作为returnTo参数传给文书详情页 - 返回时恢复状态:
DocumentView.vue的返回按钮使用window.history.back()回到搜索页面;onMounted检测URL中的q参数后自动恢复搜索关键词和搜索结果 - 阅读器同理:打开阅读器再返回也保留搜索状态
五、开发进度总结
| 模块 | 功能 | 状态 |
|---|---|---|
| 系统架构 | 数据库初始化顺序修复 | ✅ 已完成 |
| 系统架构 | 两套数据库连接统一 | ✅ 已完成 |
| 文件上传 | TXT多编码兼容解析 | ✅ 已完成 |
| 文件上传 | DOCX解析 | ✅ 已完成 |
| 文件上传 | PDF非扫描件解析 | ✅ 已完成 |
| 文件上传 | PDF扫描件OCR+LLM勘误 | ✅ 已完成 |
| 核心功能 | 多角色并行对比 | ✅ 已完成 |
| 核心功能 | 满意/不满意反馈面板 | ✅ 已完成 |
| 核心功能 | 反馈机制深度完善(匿名ID/去重/管理后台) | ✅ 已完成 |
| 核心功能 | 导出为PNG图片 | ✅ 已完成 |
| 核心功能 | 导出为CSV | ✅ 已完成 |
| 核心功能 | 分享功能 | ✅ 已完成 |
| 体验优化 | 多角色对比全屏+平行滚动 | ✅ 已完成 |
| 体验优化 | 法制助手跳转逻辑修复 | ✅ 已完成 |
本期开发后,法律文书摘要系统已从一个单向的文本生成工具,进化为支持多角色思辨、用户反馈闭环、多格式导出与分享的协作平台。
