Electron桌面应用(续2)

2026.4.10 星期五

一.pinia

定义 Store | Pinia

首先安装 npm insatll pinia

1.核心三部分

State 存数据(data)

Getters 计算属性(computed)

Actions 方法/异步操作(methods)

2.基础配置

3.应用

要用直接从store里面获取

tsconfig.json

上面配置了noImplicitThis,下面的this才有items这个值

时间格式

2026-04-13T05:53:33.949ZISO 8601 国际标准时间格式,代表一个精确到毫秒的 UTC(协调世界时)时间戳。

二.基于上下文的聊天

把一系列的信息以数组的形式messages传给sdk,就可以基于上下文聊天了。例如如下:

所以只需要把messages的形式改成数组(传数组),而不是单独只传一个content

目前是只传了一个content

步骤

要传入messages: role: 'xxx',content: 'xxx';的形式

改变类型

传值

重新启动,可以看到已经成功可以基于上下文聊天了。

三.路由守卫

四.优化应用功能

1.渲染markdown文本

我们发现,大模型返回的流式数据并没有按格式正确解析,所以我们要渲染markdown文本。

将markdown解析为html: markdown-it

markdown-it特点:

  • 遵循 CommonMark 规范,同时添加语法扩展和增强功能(自动链接 URL,排版美化)
  • 易于扩展:由于模块化的设计,用户可以方便地编写自定义插件或者使用社区提供的插件来扩展 markdown-it 的功能。
  • 快速且高效:markdown-it 被设计为快速和高效的解析器,能够处理大量的 Markdown 文本并将其转换为 HTML。

GitHub - markdown-it/markdown-it: Markdown parser, done right. 100% CommonMark support, extensions, syntax plugins & high speed · GitHub

javascript 复制代码
// 简单使用

import markdownit from 'markdown-it'

const md = markdownit()

const result = md.render('# markdown-it rulezz!')

// 使用插件

// 插件列表 https://www.npmjs.com/search?q=keywords:markdown-it-plugin 
const md = markdownit .use(plugin1)
.use(plugin2, opts, ...)
.use(plugin3);

插件列表 https://www.npmjs.com/search?q=keywords:markdown-it-plugin

库:vue-markdown-render

npm install vue-markdown-render --save

如图,效果已经出来了

但是问题是标题并没有显示对应的样式(tailwindcss对所有html元素进行了一个reset,移除默认样式)

使用插件:tailwind typography(提供美观的排版样式)

npm install -D @tailwindcss/typography

加上prose类

出现了一个scope的隔离问题

成功给标题设置格式

都可以自定义设置

prose-* 后缀的类,是用来统一调整整个排版区域的文本、标题、链接、代码块等元素的灰度色调,让 Markdown 渲染的内容和你的 UI 设计风格匹配。

可以自己设置喜欢的

也可以选大小。具体的自己看文档

2.实现语法高亮

highlight.js库

怎样在markdown-it集成这个库?---> 用markdown-it-highlightjs插件markdown-it-highlightjs - npm

npm i markdown-it-highlightjs

可以自己选喜欢的导入。

也可以用import 'highlight.js/styles/github-dark.min.css'就是如下效果

3.打开对话自动下滑到最下方

scrollBy()方法 / scrollIntoView()方法 可以在mdn上面查找对应的方法

(1)获取MessageList的DOM的节点

获取他的实例,进而获取DOM节点

(2)使用scrollIntoView()方法

这样就可以实现点击会话自动滚到底部

4.输出内容的时候会自动滚动

将上一步分装好的方法加到发送信息函数里面和第一次创建里面,就可以实现自动滚动

为了提高性能,只有当返回的结果换行,他才会获取实例,向下滚动,如果高度没变,就不需要在执行移除。

5.支持图片上传

(1)在渲染进程选择和展示

使用file Input实现文件选择

<input type="file" accept=" image/* "

但是他的样式很丑,我们选择用另一个元素来手动触发file input的选择过程。

将原有的隐藏hidden,拿到他的DOM节点ref="fileInput",加上一个图片选择的icon。

想要 通过点击icon来选择图片。

上面成功拿到file对象,那么怎么把这个对象展示到输入框上面呢?可以用base64

使用FileRender来展示本地图片

FileReader.readAsDataURL()

开始读取指定的 Blob 中的内容。一旦完成,result 属性中将包含一个表示文件数据的 data: URL。

(2)将图片数据传递给主进程,调用LLM处理并返回

将图片复制到useData目录下

拷贝图片,放在useData目录下,返回一个新的路径

存放图片的数据信息


由上图知,已经复制路径成功。

LLM返回结果

必须按照格式把数据传给大模型

要拿到图片base64以及图片的格式mimetype

使用 mime-types 来获取对应的类型https://github.com/jshttp/mime-types

npm install mime-types
//以及安装他的类型文件

npm i @types/mime-types --save-dev

如果是图片的话,把imagePath传过去,如果不是图片,正常传

现在的问题①发出去没有图片显示②LLM回答的不完整

千问模型

  • vl 的模型 (如 qwen-vl-plus-2025-05-07):支持图片
  • 不带 vl 的模型 (如 qwen-longqwen-turbo):不支持图片
显示图片

由于资源保护,electron无法访问所有本地文件,所以无法展示图片。

解决方法:electron中的protocol ,注册自定义协议并拦截基于现有协议的请求。

protocol | Electron

electron中net,快速构建response对象,返回内容

但是不知为什么没有成功,终端并没有打印protocol中的console,也并没有显示图片。

6.重构主进程不同模型处理的逻辑代码

之前是通过if else来处理不同模型对应的代码,但是随着模型增多,会显得冗余

通过抽象出一个类BaseProvider作为基类

OpenAIProvider和QianfanProvider作为子类

相关推荐
mldong5 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排5 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60616 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角7 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰7 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi9 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen9 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马10 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu10 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss