工业日志AI大模型智能分析系统-前端实现

目录

主要架构

前端项目结构

1. 核心实现代码

1.1 API服务封装 (src/api/log.ts)

1.2 TS类型定义 (src/types/api.ts)

1.3 Pinia状态管理 (src/stores/logStore.ts)

1.4 日志分析页面 (src/views/LogAnalysis.vue)

1.5 日志详情组件 (src/components/LogDetail.vue)

2. 项目配置

2.1 Vite配置 (vite.config.ts)

2.2 Element Plus按需导入 (src/main.ts)

3. 路由配置 (src/router/index.ts)

4. 环境变量配置 (.env.development)

5. 系统功能演示

5.1 主界面及历史记录页面

5.2 主要工作流

6. 关键集成点

前后端通信

状态管理

UI组件

类型安全

备注参考来源


主要架构:

   前端: Vue 3 + TypeScript + Element Plus(本篇介绍)

   其他:LangGraph、LangChain、Django、向量数据库、Ollama、Mysql/Postgres数据库等

环境搭建参考另一篇博客: Vue3 基础教程-CSDN博客

前端项目结构

frontend/
├── public/                  # 静态资源
├── src/
│   ├── api/                # API接口
│   ├── assets/             # 静态资源
│   ├── components/         # 通用组件
│   ├── router/             # 路由配置
│   ├── stores/             # Pinia状态管理
│   ├── types/              # TS类型定义
│   ├── views/              # 页面组件
│   ├── App.vue             # 根组件
│   └── main.ts             # 入口文件
├── tsconfig.json           # TypeScript配置
├── vite.config.ts          # Vite配置
└── package.json

1. 核心实现代码

1.1 API服务封装 (src/api/log.ts)
import axios from 'axios'
import type { LogAnalysisRequest, LogAnalysisResponse } from '@/types/api'const apiClient = axios.create({baseURL: import.meta.env.VITE_API_BASE_URL,timeout: 10000
})export const logService = {async analyzeLog(logData: string): Promise<LogAnalysisResponse> {const response = await apiClient.post<LogAnalysisResponse>('/api/analyze', {log: logData})return response.data},async getRecentLogs(page = 1, pageSize = 10) {return apiClient.get('/api/logs', {params: { page, pageSize }})}
}
1.2 TS类型定义 (src/types/api.ts)
export interface LogAnalysisRequest {log: string
}export interface LogAnalysisResponse {log_id: numbersolution: {description: stringsteps: string[]confidence: number}
}export interface LogRecord {id: numberraw_message: stringcomponent: string | nullsource: string | nulltimestamp: stringsolution?: {description: stringsteps: string[]}
}
1.3 Pinia状态管理 (src/stores/logStore.ts)
import { defineStore } from 'pinia'
import { logService } from '@/api/log'
import type { LogAnalysisResponse, LogRecord } from '@/types/api'interface LogState {analysisResult: LogAnalysisResponse | nullhistory: LogRecord[]isLoading: boolean
}export const useLogStore = defineStore('log', {state: (): LogState => ({analysisResult: null,history: [],isLoading: false}),actions: {async analyzeLog(logData: string) {this.isLoading = truetry {this.analysisResult = await logService.analyzeLog(logData)await this.loadHistory()} finally {this.isLoading = false}},async loadHistory(page = 1) {const response = await logService.getRecentLogs(page)this.history = response.data.results}}
})
1.4 日志分析页面 (src/views/LogAnalysis.vue)
<template><div class="log-analysis-container"><el-card shadow="hover"><template #header><div class="card-header"><span>工业设备日志分析</span></div></template><el-form @submit.prevent="handleSubmit"><el-form-item label="日志内容"><el-inputv-model="logInput"type="textarea":rows="5"placeholder="粘贴设备日志内容..."clearable/></el-form-item><el-form-item><el-buttontype="primary":loading="store.isLoading"native-type="submit">分析日志</el-button></el-form-item></el-form><el-divider /><template v-if="store.analysisResult"><h3>分析结果</h3><el-alert:title="store.analysisResult.solution.description"type="success":closable="false"/><el-steps direction="vertical" :active="store.analysisResult.solution.steps.length"class="solution-steps"><el-stepv-for="(step, index) in store.analysisResult.solution.steps":key="index":title="`步骤 ${index + 1}`":description="step"/></el-steps><el-tag type="info">置信度: {{ (store.analysisResult.solution.confidence * 100).toFixed(1) }}%</el-tag></template></el-card><el-card shadow="hover" class="history-card"><template #header><div class="card-header"><span>历史记录</span><el-button @click="store.loadHistory()">刷新</el-button></div></template><el-table :data="store.history" stripe><el-table-column prop="timestamp" label="时间" width="180" /><el-table-column prop="component" label="部件" width="120" /><el-table-column prop="source" label="来源" width="150" /><el-table-column prop="raw_message" label="日志内容" show-overflow-tooltip /><el-table-column label="操作" width="120"><template #default="{ row }"><el-button size="small" @click="showDetail(row)">详情</el-button></template></el-table-column></el-table></el-card><el-dialog v-model="detailVisible" title="日志详情"><log-detail :log="currentLog" /></el-dialog></div>
</template><script setup lang="ts">
import { ref } from 'vue'
import { useLogStore } from '@/stores/logStore'
import LogDetail from '@/components/LogDetail.vue'const store = useLogStore()
const logInput = ref('')
const detailVisible = ref(false)
const currentLog = ref<any>(null)const handleSubmit = async () => {if (!logInput.value.trim()) returnawait store.analyzeLog(logInput.value)
}const showDetail = (log: any) => {currentLog.value = logdetailVisible.value = true
}// 初始化加载历史记录
store.loadHistory()
</script><style scoped>
.log-analysis-container {max-width: 1200px;margin: 0 auto;padding: 20px;
}.history-card {margin-top: 20px;
}.solution-steps {margin: 20px 0;padding-left: 20px;
}
</style>
1.5 日志详情组件 (src/components/LogDetail.vue)
<template><div v-if="log" class="log-detail"><el-descriptions :column="2" border><el-descriptions-item label="日志ID">{{ log.id }}</el-descriptions-item><el-descriptions-item label="记录时间">{{ formatDateTime(log.timestamp) }}</el-descriptions-item><el-descriptions-item label="部件"><el-tag :type="getComponentTagType(log.component)">{{ log.component || '未知' }}</el-tag></el-descriptions-item><el-descriptions-item label="来源">{{ log.source || '未知' }}</el-descriptions-item></el-descriptions><el-divider /><h4>原始日志内容</h4><el-inputtype="textarea":model-value="log.raw_message"readonly:rows="5"resize="none"class="log-content"/><template v-if="log.solution"><el-divider /><h4>解决方案</h4><el-alert:title="log.solution.description"type="success":closable="false"class="solution-alert"/><el-steps direction="vertical" :active="log.solution.steps.length" class="solution-steps"><el-stepv-for="(step, index) in log.solution.steps":key="index":title="`步骤 ${index + 1}`":description="step"/></el-steps></template></div>
</template><script setup lang="ts">
import { formatDateTime, getComponentTagType } from '@/utils/common'defineProps<{log: any
}>()
</script><style scoped>
.log-detail {padding: 10px;
}.log-content {margin-top: 10px;
}.solution-alert {margin: 15px 0;
}.solution-steps {margin-top: 20px;padding-left: 20px;
}
</style>

2. 项目配置

2.1 Vite配置 (vite.config.ts)
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'export default defineConfig({plugins: [vue()],resolve: {alias: {'@': path.resolve(__dirname, './src')}},server: {proxy: {'/api': {target: 'http://localhost:8000',  // Django后端地址changeOrigin: true}}}
})
2.2 Element Plus按需导入 (src/main.ts)
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import { createPinia } from 'pinia'import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'const app = createApp(App)app.use(createPinia())
app.use(router)
app.use(ElementPlus)app.mount('#app')
3. 路由配置 (src/router/index.ts)
import { createRouter, createWebHistory } from 'vue-router'
import LogAnalysis from '@/views/LogAnalysis.vue'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',name: 'home',component: LogAnalysis},{path: '/history',name: 'history',component: () => import('@/views/LogHistory.vue')}]
})export default router

4. 环境变量配置 (.env.development)

VITE_API_BASE_URL=/
VITE_APP_TITLE=工业设备智能运维系统

5. 系统功能演示

5.1 主界面及历史记录页面

首页分析页面

历史记录页面

5.2 主要工作流
  1. 用户粘贴错误日志:
  1. xxx restoration fail,x.x.x.x not in "0.0.0.0" error.
  2. 点击"分析日志"按钮
  3. 系统显示:
  • 解决方案:"重新...操作..."
  • 详细步骤:4步操作指南("1. 关闭xxx" "2. 找到xxx" "3. 重新xxx" "4. 重启xxx")
  • 置信度:92%

6. 关键集成点

  • 前后端通信:
  1. 通过Axios封装API调用
  2. 使用Vite代理解决跨域
  • 状态管理
  1. Pinia集中管理分析结果和历史记录
  2. 类型安全的TypeScript接口
  • UI组件
  1. Element Plus的Form、Table、Steps等组件
  2. 响应式布局适应不同屏幕
  • 类型安全
  1. 所有API接口都有TS类型定义
  2. 组件Props类型检查

备注参考来源:

万能的deepseek...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913471.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++内存泄漏排查

引言 C内存泄漏问题的普遍性与危害内存泄漏排查大赛的背景与目标文章结构和主要内容概述 内存泄漏的基本概念 内存泄漏的定义与类型&#xff08;显式、隐式、循环引用等&#xff09;C中常见的内存泄漏场景&#xff08;指针管理不当、资源未释放等&#xff09;内存泄漏对程序性能…

20250706-4-Docker 快速入门(上)-常用容器管理命令_笔记

一、常用管理命令1. 选项&#xfeff;&#xfeff;1&#xff09;ls&#xfeff;功能&#xff1a;列出容器常用参数&#xff1a;-a&#xff1a;查看所有容器包含退出的-q&#xff1a;列出所有容器ID-l&#xff1a;列出最新创建的容器状态使用技巧&#xff1a;容器很多时使用dock…

基于 Camunda BPM 的工作流引擎示例项目

项目介绍 这是一个基于 Camunda BPM 的工作流引擎示例项目&#xff0c;包含完整的后台接口和前端页面&#xff0c;实现了流程的设计、部署、执行等核心功能。 技术栈 后端 Spring Boot 2.7.9Camunda BPM 7.18.0MySQL 8.0JDK 1.8 前端 Vue 3Element PlusBpmn.jsVite 功能…

Day06_刷题niuke20250707

试卷01&#xff1a; 单选题 C 1. 在C中,一个程序无论由多少个源程序文件组成,其中有且仅有一个主函数main().说法是否正确&#xff1f; A 正确 B 错误 正确答案&#xff1a;A 官方解析&#xff1a; 在C程序设计中,一个完整的程序确实有且仅有一个main函数作为程序的入口点,这…

洛谷 P5788 【模板】单调栈

题目背景模板题&#xff0c;无背景。2019.12.12 更新数据&#xff0c;放宽时限&#xff0c;现在不再卡常了。题目描述给出项数为 n 的整数数列 a1…n​。定义函数 f(i) 代表数列中第 i 个元素之后第一个大于 ai​ 的元素的下标&#xff0c;即 f(i)mini<j≤n,aj​>ai​​{…

linux系统运行时_安全的_备份_还原_方法rsync

1.问题与需求 问题: 新部署的机器设备(主控RK3588), 没有经过烧录定制镜像, 研发部署, 直接组装发送到客户现场需要通过frpc远程部署: 安装ros2 python包 docker镜像 环境配置 自启动配置 SN设备信息写自动部署脚本, 实现一键部署升级无奈物联网卡做了白名单限制, apt 和…

18套精美族谱Excel模板,助力家族文化传承!

【资源分享】18套精美族谱Excel模板&#xff0c;助力家族文化传承&#xff01; &#x1f3af; 本文分享一套完整的家族谱系资源&#xff0c;包含18个精心设计的Excel模板&#xff0c;从基础模板到专业图表&#xff0c;满足各类家族的族谱制作需求。 一、为什么要制作族谱&…

MySQL Galera Cluster企业级部署

一、MySQL Galera Cluster简介 主要特点 同步复制&#xff1a; 所有的写操作&#xff08;包括插入、更新、删除&#xff09;在集群中的所有节点上都是同步的。这意味着每个节点上的数据是完全一致的。 多主节点&#xff1a; 集群中的每个节点都是主节点。所有节点都可以处理读…

HTTP 重定向

什么是 HTTP 重定向&#xff1f; HTTP 重定向&#xff08;HTTP Redirect&#xff09; 是服务器向客户端&#xff08;通常是浏览器&#xff09;发出的指令&#xff0c;告诉客户端某个请求的资源已被移到新的位置。重定向通常通过发送一个特殊的 HTTP 状态码&#xff08;例如 3x…

本地加载非在线jar包设置

项目中存在私有jar包&#xff0c;提示在线获取不到&#xff0c;需要先获取到完整的jar包在打进maven中再在项目中进行maven依赖引入 mvn install:install-file -DfileD:\tools\maven\apache-maven-3.5.2\local_repository2\org\ahjk\SixCloudCommon\1.0\SixCloudCommon-1.0-SN…

Codeforces Round 979 (Div. 2)

A c[1]-b[1]0&#xff0c;之后每个c[1]-b[1]最大都是maxa-mina&#xff0c;最大和最小放前两个 B ans2^(a1)-2^s-1&#xff0c;1一个最小 C 我们可以把式子化为(....)||(....)||(....)括号里没有||&#xff0c;如果括号全是1那么A赢&#xff0c;A尽量选择把1选在一起 D …

UI前端大数据处理性能瓶颈突破:分布式计算框架的应用

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;前端大数据处理的性能困境与破局之路在数据爆炸增长的时代&#xff0c;UI…

病虫害数据集

数据是泰迪杯主办方提供的已经标记好的数据&#xff0c;4k画质的图片&#xff0c;总大小8个G 链接&#xff1a;https://pan.baidu.com/s/1fvmNHGrLvflEovjfCjDLOw?pwd6666 提取码&#xff1a;6666 虫害包括&#xff1a; 八点灰灯蛾 褐飞虱属 白背飞虱 二化螟 蟋蟀 黄足…

JAVA基础:关于JDK环境变量设置的若干相关细节及注意事项

一、JDK下载安装 网址&#xff1a;https://www.oracle.com/java/technologies/downloads/ 以 win11 为例&#xff0c;根据网址下载安装包后&#xff0c;点击安装&#xff0c;注意设置安装路径 二、基础常识 1.Java三大使用平台 Java SE(Java Standard Edition): 标准版&…

C++高频知识点(四)

文章目录 16. 虚基类要解决什么问题&#xff1f;17. C中如何进行类型转换操作&#xff1f;列举并解释四种类型转换方式。18. 什么是函数重载&#xff1f;如何进行函数重载&#xff1f;19. 解释C中的友元函数和友元类&#xff0c;并解释其使用场景。友元函数友元类 20. 请解释C中…

【Servlet资源转发介绍】

文章目录 前言一、Servlet 资源转发是什么&#xff1f;1. 为什么要资源转发&#xff1f; 二、资源转发 vs 重定向三、如何使用 RequestDispatcher 进行资源转发1. 引入依赖2. 获取 RequestDispatcher3. forward 示例4. include 示例JSP 中 include 指令或动作Servlet 中 includ…

牛客周赛 Round 99题解

Round 99 思路&#xff1a;我们之间去用字符串去统计即可&#xff0c;输入一个字符串&#xff0c;看相邻有没有99即可 #include<bits/stdc.h> using namespace std; #define int long long string s; signed main() {cin>>s;int ns.size();for(int i1;i<n;i){i…

AR 如何改变我们构建网站的方式

想坐在沙发上试鞋子&#xff1f;欢迎来到 Web AR 的世界。还记得你在网页上逛商城时&#xff0c;点击一副墨镜&#xff0c;然后镜头打开&#xff0c;它就自动出现在你脸上的那一瞬间吗&#xff1f;不需要下载 App&#xff0c;不需要跳转&#xff0c;只需一个浏览器。这不是科幻…

华为OD机试 2025B卷 - 货币单位转换(C++PythonJAVAJSC语言)

2025B卷目录点击查看: 华为OD机试2025B卷真题题库目录|机考题库 + 算法考点详解 2025B卷 100分题型 题目描述 记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。 每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分…

php协程

开发需求:在一套老项目中&#xff08;fastadmin&#xff09;实现一个定时任务&#xff0c;每分钟访问几十个接口&#xff0c;拿到数据。 使用的swoole&#xff0c;在thinkphp5中实现协程。启动命令php swoole.php <?php //chdir(__DIR__); define(APP_PATH, __DIR__ . /app…