项目实战:话题总结(挖掘)与可疑对话分析组件

📅 发布时间:2026/7/6 6:45:18 👁️ 浏览次数:
项目实战:话题总结(挖掘)与可疑对话分析组件
一、项目概述在安全风控、舆情监控和刑侦分析等领域从海量聊天记录中自动挖掘话题、识别可疑对话是一项极具挑战且至关重要的任务。传统的人工审核效率低下且难以发现隐藏的关联。为了解决这一痛点我们基于 Vue Element UI 设计并实现了一套话题挖掘与可疑对话分析组件。本文将详细剖析系统的核心模块设计、关键技术实现以及性能优化策略希望能为从事类似数据挖掘项目的开发者提供有价值的参考。二、组件功能概览组件功能主要围绕“话题挖掘”这一核心流程分为三个层次的功能模块任务管理支持用户创建话题挖掘任务查看任务列表、进度和状态并对未开始或已完成的任务进行“话题挖掘”操作。结果查看点击“结果查看”进入弹窗展示与该任务关联的可疑对话组私聊/群聊支持关键词高亮、查看完整上下文。上下文摘要左侧面板展示对话的上下文摘要列表支持搜索、分页和选中交互方便用户快速定位重要信息。组件整体交互流程如下用户在任务列表页筛选或新建任务任务完成后点击“结果查看”弹出详情弹窗弹窗左侧为话题列表右侧为对应的可疑对话组点击对话组中的“查看上下文”可跳转至完整的对话详情页。三、核心组件设计与实现1. TopicSummary任务管理主页面TopicSummary是整个系统的入口负责展示所有话题挖掘任务并提供筛选、新建任务和操作入口。筛选区域与列表展示页面顶部是一个可折叠的筛选栏包含“犯罪方向”、“任务名称”、“状态”三个筛选条件下方是任务列表。列表关键字段包括任务名称、犯罪方向、进度、状态、操作。进度条展示是一个技术亮点后端返回的进度格式为“已完成数/总数”如 “3/10”我们需要将其转换为百分比。这里定义了一个过滤器toPercentagetoPercentage(rateProgress) { if (!rateProgress || typeof rateProgress ! string) return 0; const parts rateProgress.split(/); if (parts.length ! 2) return 0; const completed parseInt(parts[0], 10); const total parseInt(parts[1], 10); if (isNaN(completed) || isNaN(total) || total 0) return 0; return Math.round((completed / total) * 100); }进度条的颜色根据任务状态动态变化待挖掘无特殊颜色进行中为蓝色已完成为绿色失败为红色。状态文本通过另一个过滤器filterFun从状态码映射为可读文本。新建任务弹窗点击“新建任务”按钮弹出弹窗需要填写任务名称并选择犯罪方向。犯罪方向的数据来源于黑词挖掘任务列表接口blackWordDiscoveryRecord。选择犯罪方向后自动填充对应的标签ID和名称。技术细节弹窗使用自定义的AbyDialog组件封装通过v-if控制创建与销毁避免内存泄漏。提交前进行表单验证成功后刷新列表。话题挖掘操作点击某一行操作列的“话题挖掘”按钮会触发二次确认弹窗对于进行中的任务直接确认。确认后调用topicSummaryExcavate接口并显示该行专属的 loading 状态防止用户重复点击。async handleTopicMining(row) { try { this.miningLoading row.id; if (row.status ! 0) { await this.$confirm(确定要对当前任务进行话题挖掘吗, 提示, { type: warning }); } await this.topicSummaryExcavateFun(row); } finally { this.miningLoading null; } }2. TopicResult可疑对话组弹窗当用户点击“结果查看”时会打开TopicResult弹窗。该组件采用左右双面板布局左侧嵌入TopSumUp组件显示话题列表。右侧展示与选中话题关联的可疑对话组并支持私聊/群聊切换。私聊/群聊切换与差异化展示右侧顶部有两个标签“私聊”和“群聊”点击切换时重新请求数据。对话组卡片根据chat_type字段动态渲染私聊展示发送方账号 → 箭头 → 接收方账号并显示双方昵称。群聊只显示群组ID。template v-ifitem.chat_type 1 img srcwx.png classwechat_icon span{{ item.account1_number }}{{ item.nickname1 ? item.nickname1 : }}/span div classaccout_iconi classel-icon-sort/i/div img srcwx.png classwechat_icon span{{ item.account2_number }}{{ item.nickname2 ? item.nickname2 : }}/span /template template v-else-ifitem.chat_type 2 img srcwx.png classwechat_icon span{{ item.group_id || -- }}/span /template关键词高亮与上下文预览每条对话组卡片中会展示最多 6 条上下文消息每条消息包含发送账号、时间、内容。命中关键词的内容会被标红高亮高亮方法如下highlightKeywords(message, keywords) { if (!message || !keywords?.length) return message; const escaped keywords.map(k k.replace(/[.*?^${}()|[\]\\]/g, \\$)); const regex new RegExp((${escaped.join(|)}), gi); return message.replace(regex, span stylecolor: #EF0000;$1/span); }消息内容采用多行文本截断最多 3 行超出部分显示省略号并配有“查看上下文”按钮点击可跳转至完整的对话详情页通过openWin工具函数打开新页面。3. TopSumUp话题列表组件该组件位于结果弹窗的左侧展示从接口获取的话题摘要列表。每个列表项包含发送者名称、上下文摘要、相关性标签等。搜索与分页顶部提供搜索框按标题搜索和状态筛选全部/有效/无效支持分页。数据通过topicSummaryResult接口获取分页参数与主列表独立。选中交互点击任一话题项其背景变为高亮同时右侧的可疑对话组会联动刷新通过recordId传递给父组件TopicResult。这里使用sFlag记录当前选中项的索引并动态绑定类名sActive。四、关键技术点剖析1. 分页管理组件内多个模块任务列表、对话组列表、话题列表都涉及分页每个模块维护独立的pageNum、pageSize和total并在分页组件变化时调用对应的数据获取方法。这种设计避免了全局状态污染使组件更加内聚。2. 过滤器与状态映射为了将后端返回的状态码如 0、1、2、-1转换为可读文本和样式我们定义了两个过滤器filterFun根据状态码从字典数组中查找对应的标签。toPercentage将进度字符串转换为百分比数字。同时通过动态类名.status0、.status1等控制状态颜色实现了样式与数据的解耦。3. 弹窗组件复用项目中多处使用弹窗新建任务、结果查看、关键词管理我们统一封装了AbyDialog组件通过v-if控制显示并在关闭时重置内部状态。对于需要嵌入子组件的弹窗如TopicResult嵌套TopSumUp采用ref调用子组件方法的方式传递数据。4. 下拉框懒加载与远程搜索在添加关键词的弹窗中虽然本系统未直接使用但代码中保留了相关逻辑我们实现了下拉选项的懒加载和远程搜索初始只加载前 10 条滚动到底部再追加 5 条输入关键词时使用定时器分段渲染过滤后的结果避免界面卡顿。selectRemote(query) { if (query ) { // 恢复初始 } else { this.isFirstLoadType false; this.caseTypeSelectList this.caseTypeAllList.filter(...); this.timer setInterval(() { this.keywordTypeList this.caseTypeSelectList.slice(0, this.loadNum); this.loadNum 10; }); } }五、性能优化与注意事项定时器清理在beforeDestroy钩子中清除下拉搜索的定时器防止内存泄漏。加载状态控制为每个数据请求设置独立的 loading 变量如tableLoading、dialogLoading避免界面闪烁。防抖处理对于搜索输入未来可考虑加入防抖减少不必要的请求。组件销毁重置所有弹窗关闭时重置表单和内部数据避免下次打开时残留旧信息。六、结语本文详细介绍了基于 Vue 构建的话题挖掘与可疑对话分析组件的设计与实现。通过模块化的组件拆分、清晰的状态管理以及丰富的交互细节系统能够高效地辅助用户从海量聊天数据中发现有价值的信息。未来我们可以进一步集成自然语言处理模型自动生成话题摘要和风险评分提升系统的智能化水平。