对话式智能助手项目经验
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)来评估模型的预测性能,确保其在实际应用中的可靠性。