对话式智能助手项目经验
package.json 本地包导入tgz
参考:npm如何引入本地自建的包和需要维护的包_npm 引用本地包-CSDN博客、[如何在项目中引用本地的npm包_npm引入本地包-CSDN博客](https://blog.csdn.net/qq_57956183/article/details/132346194#:~:text=package.json中配置引用本地依赖包。 以下是具体操作步骤: 1. 打开您的 package.json,文件,找到 dependencies 部分。 2. 不要指定包名的版本号,而是指定依赖项所在的本地路径。)、
主要是为了能够使用下载的会员图标库,
package.json:
作为dependencies引入,需要注意的是文件位置,可以通过cd
的方式,确认路径是否有问题
还有需要注意的是,打包的tgz中必须包含package.json
,否则会报错,这个是卡最多的地方
1 | { |
然后需要在main.ts中进行引用
1 | import '@fortawesome/fontawesome-free/css/all.min.css'; |
git冲突
参考:还在恐惧 Git 冲突? 一篇文章拯救你 - 知乎 (zhihu.com)
图标库
Chart Bullet Classic Regular Icon | Font Awesom
clip-path
下面的代码将Arrow tail改为四边形中间内凹一个正三角形的样式:
1 | <div class="flex justify-center items-center relative"> |
实现一个四边形中间凹入一个正三角形的效果,核心在于使用 CSS 中的 clip-path
属性来裁剪出我们需要的形状。我们将利用 polygon
函数定义裁剪路径的每个顶点坐标。下面是实现的具体步骤:
- 了解
clip-path: polygon()
clip-path: polygon()
允许我们通过指定顶点坐标来裁剪元素的形状。坐标使用百分比来表示,起点为左上角 (0%, 0%)
,终点为右下角 (100%, 100%)
。
基础四边形
首先,绘制一个基本的四边形,使用 clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%)
。这将裁剪出一个完整的矩形。
1 | clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); |
这个路径依次描述四个顶点:
(0 0)
:左上角(100% 0)
:右上角(100% 100%)
:右下角(0 100%)
:左下角
- 内凹一个正三角形
为了让中间部分凹入一个正三角形,我们需要在矩形的一侧插入一个新的点,使得矩形的一条边向内凹。
假设你希望左边中间凹入,我们可以通过在左侧边线中间插入一个新的点来实现。将其设置为 (25% 50%)
,它表示相对于左边线,水平向右 25% 的位置,高度为 50%(即中间位置)。这样可以在四边形的中间位置凹入一个三角形。
- 实现凹入的多边形
要在左侧边缘中间凹入一个三角形,我们只需在基本四边形的坐标中插入 (25% 50%)
作为中间点,最终的裁剪路径如下:
1 | clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 25% 50%); |
(0 0)
:左上角(100% 0)
:右上角(100% 100%)
:右下角(0 100%)
:左下角- **
(25% 50%)
**:左边线的中间位置,凹入三角形的顶点
- 完整代码实现
在实际 HTML 中,给定一个 div
元素,我们将使用这个 clip-path
来裁剪其外形:
1 | <div class="flex justify-center items-center relative"> |
总结:
clip-path: polygon()
允许我们裁剪元素的形状。- 通过在四边形的顶点之间插入新的点,我们可以创建一个带有中间凹入正三角形的形状。
- 具体的
clip-path
路径是根据顶点的顺序定义的,顶点之间连线会形成凹入的效果。
这就是如何通过 clip-path
创建一个中间凹入正三角形的四边形的具体实现原理。
低代码实现
拖拽以及伸缩
滚动跟手逻辑
代码中实现了通过@scroll="onScroll"
监听滚动事件,并且在滚动时处理拖拽和调整大小的交互。
1 | const onScroll = (scroll: { scrollLeft: number, scrollTop: number }) => { |
获取 el-scroll
滚动距离
在 onScroll
方法中,传入了滚动的 scrollLeft
和 scrollTop
,可以用来实时获取滚动距离,特别是在拖动或调整大小时使用。
1 | <el-scrollbar height="95%" wrap-style="width:100%;" class="flex justify-center" @scroll="onScroll"> |
onMouseDown
(按下鼠标处理逻辑)
onMouseDown
用于初始化拖拽或调整大小操作,保存当前的鼠标坐标以及操作的类型(拖拽或调整大小)。
1 | const onMouseDown = (event: MouseEvent, index: number, handleType: 'drag' | 'resize') => { |
onMouseMove
(鼠标移动处理逻辑)
onMouseMove
负责拖动或调整大小操作,根据鼠标移动的距离更新元素的位置或尺寸。
1 | const onMouseMove = (event: MouseEvent) => { |
onMouseUp
(释放鼠标处理逻辑)
onMouseUp
用于结束拖拽或调整大小操作,解除事件监听。
1 | const onMouseUp = () => { |
自适应布局
检查遮挡逻辑
在拖拽过程中,checkCollision
用于检查当前拖动的元素是否与其他元素发生遮挡。
1 | const checkCollision = () => { |
检查两个元素是否遮挡
使用 checkOverlap
函数判断两个元素是否在视觉上发生遮挡,判断依据为元素的四个边界位置。
1 | const checkOverlap = (item1: StatementItem, item2: StatementItem) => { |
归位逻辑
如果两个元素不再遮挡,使用 restoreAllMovedItems
恢复被下移的元素位置。
1 | const restoreAllMovedItems = () => { |
elementplus主题调节
参考:https://element-plus.org/zh-CN/guide/theming
通过开发者选项,找到对应组件的颜色指代代码--el-slider-main-bg-color
,然后将其放置到一个统一class类中,当然也可以放在root中,但是会导致加载速度变慢以及多样式覆盖的问题
1 | <template> |
position:fixed相对父级元素定位
参考:https://www.zhihu.com/question/24822927
如果父级元素设置了transform属性,position:relative/absolute/fixed会基于此定位,详细请参考:transformedelement creates a containing block for all its positioned descendants
:after、:before
箭头形状组件
1 | <template> |
WEB自带TTS实现语音文字互转
Statement.vue
1 | <template> |
echart封装
引用方法
statementltems.ts
下面是假数据部分,需要加新的图标时增加statementItems,type、chart、data、chartOption控制对应的图表参数
1 | import { ref } from 'vue'; |
Statement.vue
下面是使用假数据循环渲染部分,用到新的图表类型时,需要往getChartComponent
中添加对应的图表名称
1 | <template> |
StatementItem.ts
下面是类型接口,需要加图表时,在chart中加入对应的类型
1 | export interface StatementItem { |
柱状图
BarContainer.vue
1 | <template> |
waterBarOption.ts
1 | import { ECBasicOption } from 'echarts/types/dist/shared'; |
waterBarData.ts
1 | export const waterBarData = { |
仪表盘
BoardContainer.vue
1 | <template> |
radarOptions.ts
1 | import { ECBasicOption } from 'echarts/types/dist/shared'; |
radarData.ts
1 | export const radarData = { |
盒须图
BoxplotContainer.vue
1 | <template> |
boxplotOptions.ts
1 | import { ECBasicOption } from 'echarts/types/dist/shared'; |
boxplotData.ts
1 | // Boxplot 数据 |
漏斗图
funnelContainer.vue
1 | <template> |
funnelOptions.ts
1 | import { ECBasicOption } from 'echarts/types/dist/shared'; |
funnelData.ts
1 | export const funnelData = [ |
横向柱状图
horizontalBarContainer.vue
1 | <template> |
airHorizontalBarOption.ts
1 | import { ECBasicOption } from 'echarts/types/dist/shared'; |
horizontalBarData.ts
1 | export const horizontalBarData = { |
折线图
lineContainer.vue
1 | <template> |
airLineOptions.ts
1 | import { ECBasicOption } from 'echarts/types/dist/shared'; |
airLineData.ts
1 | // airLineData.ts |
饼图
PieContainer.vue
1 | <template> |
forestPieOption.ts
1 | import { ECBasicOption } from 'echarts/types/dist/shared'; |
forestPieData.ts
1 | export const forestPieData = { |
雷达图
radarContainer.vue
1 | <template> |
radarOptions.ts
1 | import { ECBasicOption } from 'echarts/types/dist/shared'; |
radarData.ts
1 | export const radarData = { |
散点图
scatterContainer.vue
1 | <template> |
scatterOption.ts
1 | import { ECBasicOption } from 'echarts/types/dist/shared'; |
scatterData.ts
1 | export const scatterData = { |
electron + vue3打包项目
步骤
- 下载
由于直接npm
会导致卡死,所以采用cnpm
1 | npm install -g cnpm --registry=https://registry.npmmirror.com |
- 创建 Electron 主进程文件
src/electron/main.js
这里踩了一个大坑就是之前执着用ts,导致后面在“main”的指定中,因为只能指定js类型文件,所以会导致以后每一次main文件修改,都会需要进行编译后,才能运行出修改的代码,但是实际上也不能这么写,后面会在main文件指定底下详细说明
还有一个问题就是require
、__dirname
这些都是commandjs的用法,也就是常规node,如果在es模块下使用时需要添加nodeIntegration:true
、contextIsolation:false
1 | // 控制应用生命周期和创建原生浏览器窗口的模组 |
- 配置 Vite 进行 Electron 打包
vite.config.ts
rollupOptions:
external:
globals:
electron:
build中的outDir指定的是什么文件输出路径
emptyOutDir:
1 | import { defineConfig } from 'vite'; |
- 配置ts编译方式
tsconfig.node.json
注意tsconfig.node.json主要是需要commandjs的
include
内的位置也需要注意,因为是直接处于outDir
下面的
所以之前include
里面为"src/electron"
,outDir
为./dist/electron
时,编译出来的位置在./dist/electron/src/electron
解决方式有两种,一种是更改rootDir
,但是会报错,因为vite.config.ts
不位于这个文件夹下面
第二种方法就是下面的方法将electron文件夹,移出src,并将ouDir
设置为"./dist"
同时下面还有支持导出js的配置,只需要把include
中的内容改为.js
后缀就行
1 | { |
- 更新 package.json 的脚本
在 package.json 中添加 Electron 的启动脚本以及指定app入口路径:
vue-tsc -b用作build时的ts检查,vue-tsc -b
会检查并编译,vue-tsc –noEmit
只检查不编译,当然直接去掉这个命令可以直接编译出来,但是不推荐这么做,去损失了ts检查代码的功能
1 | "main": "dist/electron/main.js", |
- 更新 Electron Builder 配置
在 package.json 中添加 Electron Builder 的打包配置:
1 | "build": { |
- 输入运行命令以及构建命令
打包前注意router必须是hash模式
参考:https://blog.csdn.net/qq_40994260/article/details/107440478/
1 | import { createRouter, createWebHashHistory } from 'vue-router'; |
打包后mac相关文件都位于Resources
下的app.asar
,需要借助Electron
官方的工具才能打开,不过会存在很多.lproj
后缀的文件夹,里面均为空,其实里面是针对各个语言的配置包,但是这个项目没有配置,所以为空
1 | sudp npm run electron:dev |
热更新实现
报错
- tsconfig.app.json以及tsconfig.node.json的区分问题
参考:https://blog.csdn.net/2301_79568124/article/details/137783628
- main.ts代码在编译后莫名在最后一行多了个export {};导致报错
在 tsconfig.node.json 中调整 compilerOptions,确保正确处理 CommonJS 模块
1 | { |
- 启动electron:build命令,但是没有编译出main.js文件,原因是tsconfig.node.json中include没有增加对应electron文件夹
- 编译出main.js文件夹位置错位的问题,主要是outDir以及rootDir
- 报错
⨯ Application entry file "index.js" in the "/Users/tec/Desktop/ai-report-assistant-frontend/dist/mac-arm64/ai-report-assistant-frontend.app/Contents/Resources/app.asar" does not exist.
这个原因在于main.js文件缺失,解决过程如下,首先是直接报错给gpt,发现”main”没加,然后发现根本就没编译electron文件夹下面的内容
报错require not defined in ES Module scope以及**__dirname is not defined**
原因都在于Electron 主进程代码使用了 ES module 格式,但 require 只在 CommonJS 中可用,需要删除
package.json
中的"type": "module",
,并在main.ts
中进行相关配置,详情见步骤2,同时在tsconfig.node.json
中也需要修改编译的相关配置,详情见bug2,和步骤4
整体思路
- 识别问题类型模型:
- 目标:分类用户的输入为问数、归因或预测。
- 方法:使用自然语言处理技术(如BERT或其他预训练模型),并结合有标注的数据集进行监督学习。训练时,输入为用户提问,输出为问题类型标签。
- 评估:使用准确率、召回率和F1分数来评估模型性能,确保模型能有效区分不同类型的问题。
- 提取关键数据模型:
- 目标:从用户输入中提取出关键的数值、单位和时间等信息。
- 方法:应用命名实体识别(NER)技术,训练模型识别特定实体(如年份、数量等)。可以使用标注数据来进行微调。
- 评估:通过查全率和查准率来评估模型在提取关键数据方面的表现,确保其准确性。
- 分析原因模型:
- 目标:分析用户询问的背后原因,并生成相关因素及其贡献。
- 方法:利用关联规则学习或因果推断模型,结合历史数据,识别影响温室气体排放的主要因素和子因素。训练时,可以使用结构化数据和文本数据进行联合学习。
- 评估:通过对比分析结果与真实数据的吻合度,验证模型的有效性和解释性。
- 预测未来趋势模型:
- 目标:预测未来的温室气体排放量及其变化趋势。
- 方法:应用时间序列分析(如ARIMA、LSTM等),使用历史数据进行训练。可以引入外部因素(如政策变化、经济指标等)以提升预测准确性。
- 评估:通过均方根误差(RMSE)和平均绝对误差(MAE)来评估模型的预测性能,确保其在实际应用中的可靠性。