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作为子类

相关推荐
eEKI DAND2 小时前
一个比 Nginx 还简单的 Web 服务器
服务器·前端·nginx
weixin_443478512 小时前
Flutter学习之自定义组件
javascript·学习·flutter
Highcharts.js9 小时前
Highcharts 云端渲染的真相:交互式图表与服务器端生成的边界
前端·信息可视化·服务器渲染·highcharts·图表渲染
zhuyan10810 小时前
Linux 系统磁盘爆满导致无法启动修复指南
前端·chrome
编程牛马姐11 小时前
独立站SEO流量增长:提高Google排名的优化方法
前端·javascript·网络
NotFound48611 小时前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
Dontla11 小时前
高基数(High Cardinality)问题介绍(Prometheus、高基数字段、低基数字段)
前端·数据库·prometheus
whuhewei14 小时前
为什么客户端不存在跨域问题
前端·安全
妮妮喔妮14 小时前
supabase的webhook报错
开发语言·前端·javascript