# ai-chat **Repository Path**: carloslst/ai-chat ## Basic Information - **Project Name**: ai-chat - **Description**: 简单的ai对话框,基于SSE实现 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-24 - **Last Updated**: 2025-06-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AI分析弹窗项目 ## 项目简介 本项目基于 Vue3 + TypeScript + Element Plus,实现了支持 SSE 流、打字动画、弹窗拖拽缩放、AI思考 loading 动画等功能的高可用弹窗分析组件。 ## 快速开始 #### 介绍 简单的ai对话框,基于SSE实现 #### 软件架构 软件架构说明 py3.x + vue3 + ts + vite + element-plus #### 安装教程 1. npm install 2. python 代码 pip install #### 使用说明 1. npm run dev 2. 控制台(python sseService.py) 或者 pycharm直接运行 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 问题点 ## 技术方案 ### 一、项目整体架构 简述本项目采用的技术栈、架构模式和主要设计思想。 - **技术栈**:Vue3 + Composition API + TypeScript + SCSS + Element Plus - **架构模式**:组件化开发,关注点分离,核心功能通过 hooks 和独立组件封装 - **主要模块**:弹窗(ResizableDialog)、AI分析(AiAnalysisResult)、SSE流(useSSE)、打字动画(useTypingEffect)、Loading动画(AiThinking) --- ### 二、核心功能模块设计 #### 1. 弹窗(ResizableDialog) - **功能点**: - 支持拖拽、缩放、最大化、最小化、还原 - 尺寸限制支持百分比和像素 - 弹窗body支持内容自适应和滚动 - **技术实现**: - 通过 `useResizableDialog` hook 管理弹窗状态和行为 - 支持 props 配置 min/max/初始尺寸、位置等 - 事件驱动(emit)与外部交互 - 关键代码片段: ```ts const minWidth = computed(() => parseSize(props.minWidth, window.innerWidth, 560)); // ... ``` #### 2. AI分析结果(AiAnalysisResult) - **功能点**: - 弹窗内容区展示AI分析结果 - 支持 markdown 渲染、代码高亮、内容安全 - 打字动画、暂停、快进、全部显示等交互 - **技术实现**: - 通过插槽嵌入到弹窗 - 使用 `useTypingEffect` 实现打字动画 - 通过 DOMPurify 过滤 markdown 渲染结果 - 滚动逻辑通过 ref 传递,保证内容区和弹窗body滚动分离 #### 3. SSE流式数据(useSSE + AdvancedSSE) - **功能点**: - 支持流式数据推送,AI分析结果实时展示 - 连接、关闭、状态、错误处理 - **技术实现**: - 封装 `useSSE` hook,统一管理 SSE 连接 - 支持 onMessage/onEvent/onError 回调 - 自动清理,防止内存泄漏 - 关键代码片段: ```ts const { startSSE, closeSSE } = useSSE({ ... }); ``` #### 4. AI 结果有用性反馈组件(AiResultUseful) #### 组件功能 - 提供"有用/无用"反馈按钮,支持本地高亮,点击后可通过事件上报。 - 默认使用 Element Plus 的 `Promotion`(点赞/有用)和 `Bottom`(点踩/无用)图标。 - 可插入到弹窗头部中间区域,提升用户交互体验。 #### 用法示例 ```vue ``` #### 事件说明 - `update:useful(val: boolean)`:当用户点击"有用"或"无用"按钮时触发,`val` 为 `true`(有用)或 `false`(无用)。 #### 组件代码片段 ```vue #### 5. Loading动画(AiThinking) - **功能点**: - "AI思考中..."动态点点动画 - 支持自定义颜色、点数、文案 - **技术实现**: - 封装为独立组件 `` - 纯CSS动画,性能优良 - 关键代码片段: ```vue AI思考中 ``` --- ### 三、关键交互与体验优化 - **滚动体验**:内容区和弹窗body滚动分离,自动滚动到底,保证用户始终看到最新内容。 - **打字动画**:逐字渲染,支持暂停、快进、全部显示,提升交互感。 - **异常处理**:SSE连接异常自动关闭,loading动画及时反馈。 --- ### 四、可扩展性与维护性 - 所有核心功能均以 hook 或组件形式封装,便于后续业务扩展和团队协作。 - 关键参数(如弹窗尺寸、SSE地址、动画速度等)均支持 props 配置,灵活适配不同场景。 - 代码结构清晰,注释完善,便于新成员快速上手。 #### 插件化与二次开发友好 **设计理念** - 解耦核心与扩展,主流程只关注基础能力,所有增强、定制、业务相关逻辑均可通过插件机制实现。 - 预留开放扩展点,方便外部注入自定义逻辑。 - 降低维护和升级成本,便于业务快速集成和二次开发。 **实现方式** - 插槽与事件机制:通过 Vue 插槽(slot)和事件(emit),允许外部自定义弹窗内容、头部按钮、反馈组件等。 - 插件注册与钩子:预留插件注册接口(如 useSSE/useTypingEffect/useAnalysisPlugin),允许外部注册自定义处理函数,支持生命周期钩子(如 onSSEMessage、onTypingEnd、onFeedbackSubmit)。 - 配置驱动:通过 props 传递自定义配置(如自定义SSE地址、内容渲染器、敏感词检测器等),实现灵活适配。 **应用场景举例** - 自定义 AI 内容渲染:通过插槽或传入自定义 markdown 渲染器,实现特殊格式、表格、图表等扩展。 - 反馈上报:通过事件监听 `AiResultUseful` 的反馈,接入埋点、上报、A/B 测试等。 - SSE 数据处理:注册自定义 SSE 消息解析器,适配不同后端协议。 - 交互扩展:在弹窗头部插入自定义按钮(如"导出"、"收藏"),或扩展底部操作区。 **代码示例** 插槽扩展: ```vue ``` 事件与钩子: ```vue ``` 插件注册(伪代码): ```ts // useAnalysisPlugin.ts export function useAnalysisPlugin(options: { onSSEMessage?: (msg) => void, onFeedback?: (val) => void }) { // 在SSE、反馈等流程中调用options提供的钩子 } ``` 配置驱动: ```vue ``` --- ### 五、安全与性能 - **安全**:Markdown 渲染结果通过 DOMPurify 过滤,防止 XSS。 - **性能**:SSE流和打字动画均为异步、渐进式渲染,提升用户感知速度。loading动画纯CSS,无图片,性能优良。 - **资源释放**:SSE连接、打字动画等均在组件卸载时自动清理,防止内存泄漏。 --- ### 六、未来可扩展方向 - 支持多种 loading 动画类型 - 弹窗支持多层嵌套、全局管理 - SSE支持断线重连、心跳检测 - AI分析结果支持多格式渲染(如表格、图表等) --- ### 七、关键代码结构示意 ```plaintext App.vue └─ ResizableDialog └─ AiAnalysisResult ├─ useTypingEffect ├─ useSSE └─ AiThinking ``` --- ### 八、总结 本方案通过组件化、hook封装、关注点分离等方式,实现了高可维护、高扩展性、良好用户体验和安全性的AI分析弹窗功能。后续可根据业务需求灵活扩展和优化。