【项目实训】法律文书智能摘要系统8

一、项目概述

法律文书智能摘要系统是一个基于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.dbapp/db/db.py连接backend/app.db。登录、注册等接口使用的工具函数从db.py导入,操作的是app.db,而connection.init_db()把表建在legal_docs.db中,导致/login/send-code请求报错no such table: usersno such table: verify_codes

解决方案

  • 删除db.py中独立的DB_PATHget_db_connection()函数
  • connection导入统一的DB_PATHget_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_idsession_idip_addressversion_idupdated_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.tsgetAnonymousId()(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导出格式支持,使用Python csv模块生成CSV响应
  • 前端"导出报告"按钮下拉菜单增加"导出CSV"选项

触发路径 :点击"导出报告▾" → 选择"导出CSV" → 下载report_{文档ID}.csv → Excel打开可直接查看(中文表头,UTF-8编码兼容)。

4.6 分享功能

需求:分享摘要亮点和批注内容。

实现方案

  • 前端使用navigator.share API(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 ✅ 已完成
核心功能 分享功能 ✅ 已完成
体验优化 多角色对比全屏+平行滚动 ✅ 已完成
体验优化 法制助手跳转逻辑修复 ✅ 已完成

本期开发后,法律文书摘要系统已从一个单向的文本生成工具,进化为支持多角色思辨、用户反馈闭环、多格式导出与分享的协作平台。