继续进行法律文书智能摘要系统的开发,本次主要注重功能优化

概述
本次法律文书智能摘要系统的开发聚焦于界面交互优化与功能整合,全面提升用户操作体验与数据一致性。在前端层面,修复了PDF标注弹窗溢出导致视野偏移的问题,并通过引入可拖拽面板组件实现了文档详情中目录与功能区域的宽度自主控制;同时合并了文档管理中的"详情"与"阅读"按钮,统一跳转至工作台,避免功能冗余。此外,右侧面板完成了从Emoji图标到线性SVG风格的视觉升级,法规按钮位置也调整至用户头像左侧,解决了与用户按钮重合的布局问题。
在核心功能方面,法治助手模块完善了对话历史的状态保持,进入其他页面后再次打开可恢复上一轮对话,且左侧对话历史侧栏固定头部与底部,中间区域支持滚动,确保智能回答、文档检索等六个按钮始终可触达。PDF标注系统与手动批注系统开始合并治理,统一数据源与交互入口;文件上传时间信息修正为使用created_at字段,前端展示不再为空;对话助手选项仿照ChatGPT将模式选择器内嵌至输入框,并优化下拉菜单方向为新对话自动命名。同时,长程记忆模块修复了固定session_id导致的查询失效问题,对话助手中的消息保存、会话创建等异步操作均已增加错误处理,确保数据可靠。
系统优化
使用细节
1.文件详情打开标注版后,标注右侧会弹开,使界面变宽,滑出视野,修复问题
2.文档详情左侧的目录与右侧的功能能够自主控制宽度
3.文档详情中右侧面板希望设计和排版设计,美化按钮团
4.法规的按钮与用户的按钮在右下角重合了
5.文档的详情与阅读界面合为一体,文档管理中不同时出现"详情""阅读"两个按钮,只要详情即可
| 序号 | 改动文件 | 关键变更描述 |
|---|---|---|
| 1 | DocumentWorkbench.vue |
PDF弹窗溢出修复 :dialog width="80%" → "95%",新增 .pdf-dialog-body { overflow: hidden; max-width: 100% } |
| 2 | DocumentWorkbench.vue + useResizable.ts |
面板拖拽宽度:新建可拖拽 composable,支持方向参数、localStorage 持久化、最小/最大宽度约束;左右面板各增加 4px 拖拽手柄(hover 显示主题色) |
| 3 | DocumentWorkbench.vue |
图标 SVG 美化:6 个 Tab 的 emoji 图标全部替换为 14×14 线性 SVG(stroke 风格),标签精简为单字/双字 |
| 4 | DocumentWorkbench.vue |
法规按钮位置修复 :right: 24px → right: 80px,法规按钮和法规面板均移至用户头像左侧 |
| 5 | DocumentsListView.vue |
文档列表按钮合并 :移除"阅读"按钮和预览抽屉,仅保留"详情"→跳转统一工作台;删除 DocumentView 导入和相关代码 |
6.文书详情页面的右侧界面的信息界面去掉emoji图片,用线性 SVG风格

功能优化
1.法制助手的状态
开法智助手的时候,左侧的对话历史要展现出来,而且如果进入了其他页面,再次点击法治助手的时候,要显示刚刚的对话,而不是重新跳回原始的法制助手

返回的时候可以看到下方的输入框

对话历史的这个侧栏不随着页面拉长,需要能点击到上方的智能回答、文档检索、文档增强、长程记忆、通用问答、新对话等按钮
概述:使用单个 flexbox 容器,固定头部/底部区域,中间区域可滚动。
关键组件:
-
父容器:
display: flex; flex-direction: column; height: 100vh -
头部区域(按钮/模式栏):
flex-shrink: 0 -
中间区域(聊天消息):
flex: 1; overflow-y: auto; min-height: 0 -
底部区域(输入框):
flex-shrink: 0 -
侧边栏(历史记录):
position: sticky或固定宽度的 flex 子项,独立滚动
挑战与对策:
-
挑战:嵌套 flex 容器需要
min-height: 0才能正确收缩- 对策:在
.chat-panel、.chat-messages和.history-list上显式设置该属性
- 对策:在
-
挑战:返回时滚动位置丢失
- 对策:使用
sessionStorage保存/恢复滚动位置
- 对策:使用
实现步骤:
-
定义三区域垂直布局(头部/消息/输入)
-
设置头部和底部的固定高度
-
使中间区域可滚动:
overflow-y: auto -
实现滚动位置持久化
2.pdf标注与手动标注的合并处理
两套系统的现状
| 维度 | PDF 标注系统 (PdfAnnotatedViewer) | 批注系统 (AnnotationPanel) |
|---|---|---|
| 数据源 | AI: 后端 /summary/{id}/annotations-data;手动: localStorage | 后端 annotation_threads 表(SQLite) |
| 视觉形态 | 彩色锚框 + label 标签 | 文本高亮/下划线 + 卡片式评论 |
| 核心功能 | 快速定位、分类标签(关键要点/争议焦点/法律风险) | 富文本批注、回复讨论、解决状态、历史记录 |
| 使用场景 | PDF 视图 | 文字视图 + PDF 视图 |
冗余点
- UnifiedAnnotationPanel 中上下两块割裂:批注区是 AnnotationPanel 子组件,标注区是独立的扁平列表。两者各自管理 activeId,状态不同步
- 数据不互通:PDF 手动标注存 localStorage,批注系统走后端数据库------同一个文档两套独立存储
- 操作重复:PDF 中选文字添加标注 → popup 输入 comment;文字视图中选文字添加批注 → 富文本编辑器。两套入口产生两种"标注"
- 标注区没有回复/讨论能力,批注区没有分类标签能力------功能各缺一半

画线与批注逻辑分离
3.文件上传时间信息修正
当前情况分析
数据库层面
documents 表已有 created_at 字段(TIMESTAMP,默认 CURRENT_TIMESTAMP),上传时会自动写入。
前端展示层面
DocumentsListView.vue:331 使用了 doc.upload_time 字段,但后端 API 返回的是 created_at , 字段名不一致 导致一直显示为空。
关于 upload_time 与 created_at 的区别
字段 含义 适用场景 created_at 文档首次入库的时间 所有文档统一的时间戳 upload_time 用户上传文件的时间 更明确地表示用户操作时间
使用 created_at ,不需要新增 upload_time 字段。原因:
-
语义等价 --- 对于上传的文书来说,创建时间 = 上传时间,两者是一个概念
-
已有数据库字段 --- created_at 已存在且已正确写入,不需要 ALTER TABLE 迁移
-
减少维护成本 --- 多一个冗余字段意味着每次上传都要写两次时间戳
-
一致性 --- 系统中其他时间字段(如 feedback 的 updated_at )也用的是类似命名

4.对话助手选项优化
原来的对话助手的三个选项有些冗余,仿照chatgpt放在+隐藏
- .mode-selector 和 .mode-trigger(约 Line 896-906)
-
改动前 : margin-bottom: 8px + align-self: flex-start ,模式选择器是独立块级元素
-
改动后 :移除 margin-bottom 和 align-self , .mode-trigger 添加 display: flex; align-items: center; height: 100% ,使其与输入框在同一行内对齐
- .mode-btn 按钮样式(约 Line 910-929)
-
改动前 : border: 1px solid var(--border-color) 有完整边框 + border-radius: var(--radius) 圆角 + background: var(--bg-card) 背景色
-
改动后 :
-
border: none; border-right: 1px solid var(--border-subtle) --- 只保留右侧分割线
-
border-radius: var(--radius-lg) 0 0 var(--radius-lg) --- 只有左上左下圆角
-
background: transparent --- 透明背景,与输入框融为一体
-
悬停时添加 background: var(--accent-light) 高亮
- .mode-dropdown 下拉菜单定位(约 Line 940-951)
-
改动前 : top: 100%; margin-top: 4px --- 从按钮 下方 展开
-
改动后 : bottom: 100%; margin-bottom: 8px --- 从按钮 上方 展开
- .mode-dropdown-up-* 过渡动画(约 Line 984-993)
-
改动前 :类名 mode-dropdown-enter-* , transform: translateY(-4px) --- 向下位移
-
改动后 :类名改为 mode-dropdown-up-enter-* (匹配模板中的 Transition name), transform: translateY(6px) --- 向上位移,配合 bottom: 100% 实现向上滑入效果
- .chat-input-area 和 .input-wrap(约 Line 1091-1137)
-
改动前 : .chat-input-area 有 display: flex; flex-direction: column ,模式选择器在输入框 上方
-
改动后 :
-
移除 .chat-input-area 的 flex-direction: column
-
.input-wrap 改为 align-items: stretch; gap: 0; overflow: visible --- 模式按钮、输入框、发送按钮水平排列,容器可以溢出(用于上方下拉菜单显示)
-
.send-btn 添加 align-self: center; margin: 0 4px

另外,新对话要根据内容适当的起个名字
问题与修复
1.长程记忆存储
前端查询记忆时始终使用固定的 session_id = 'story-month-multi-event' ,但聊天产生的记忆存储的是聊天的会话 ID(如 3e761a65-4f0 ),两者不匹配。
问题根源 :
-
前端查询记忆时始终使用固定的 session_id = 'story-month-multi-event'
-
但聊天产生的记忆存储的是 聊天的会话 ID (如 3e761a65-4f0 )
-
两者不匹配,导致查询结果为空
修复方式 :
-
修改 API 调用,默认 不传 session_id 参数,加载 所有记忆
-
移除 seedMemoryShowcase() 调用,避免 502 错误干扰
现在点击左侧导航栏的"长程记忆"应该能看到你之前对话产生的

2.对话助手记忆存储
| 问题 | 修复 |
|---|---|
| 用户消息 saveSessionMessage 未 await,可能丢失 | 添加 await + try-catch 错误处理 |
| createChatSession 无错误处理 | 包裹 try-catch,失败时提示并 return |
| emoji 出现在错误消息中 | 替换为 错误 纯文本 |
| chatLoading = false 在 stream 结束后重复设置 | 移除冗余的赋值 |
| 助手消息保存无错误处理 | 添加 try-catch |

小结
| 工作模块 | 关键改进 |
|---|---|
| 系统优化 | PDF弹窗溢出修复(宽度95%+防溢出);左右面板可拖拽调整宽度(持久化存储);右侧Tab图标替换为线性SVG;法规按钮移至用户头像左侧(右距80px);文档列表合并"详情/阅读"按钮,仅保留详情并跳转工作台 |
| 功能优化 | 法治助手对话历史持久化,侧栏固定头尾、中间滚动;PDF标注与手动批注统一入口与视觉;文件上传时间改用created_at字段显示;对话助手模式选择器内嵌输入框,下拉菜单向上展开,新对话自动命名 |
| 问题修复 | 长程记忆固定session_id导致查询为空,改为默认加载所有记忆;对话助手异步操作增加await和错误处理(消息保存、会话创建等) |
经过本轮迭代,系统的界面一致性、布局灵活性与功能可用性均有显著提升。文档详情页面的可拖拽面板与合并后的详情按钮大幅降低了用户的学习与操作成本;法治助手的对话状态持久化及滚动区域设计,使多轮交互更加自然流畅。标注与批注系统的整合虽已明确冗余点和数据冲突,但两套数据模型(localStorage vs 后端数据库)的完全统一仍需后续数据库迁移与API重构,当前版本优先实现了视觉与入口的统一,为全面合并打下基础。
后续开发应重点关注标注与批注系统的彻底融合,统一存储后端并支持分类标签与富文本回复的互补能力;同时持续优化长程记忆的上下文关联逻辑,使对话历史更智能地自动生成标题。此外,建议对所有异步操作进行全面的错误边界处理,并增加用户操作的可撤销性,以提升系统的健壮性与用户体验。