xiaohuo 8 months ago
commit 4f9904398a
  1. 2
      ALOps_sys_fe/alops-ui/.env.development
  2. 2
      ALOps_sys_fe/alops-ui/.env.production
  3. 2
      ALOps_sys_fe/alops-ui/package.json
  4. 3
      ALOps_sys_fe/alops-ui/public/index.html
  5. 2
      ALOps_sys_fe/alops-ui/src/layout/components/Sidebar/Logo.vue
  6. 6
      ALOps_sys_fe/alops-ui/src/views/QandA/Aiassistant/index.vue
  7. 45
      ALOps_sys_fe/alops-ui/src/views/QandA/knowledge/index.vue
  8. 1
      ALOps_sys_fe/alops-ui/src/views/device/deviceInformation/index.vue
  9. 174
      ALOps_sys_fe/alops-ui/src/views/inMonitoring/devicesState/detail.vue
  10. 14
      ALOps_sys_fe/alops-ui/src/views/inMonitoring/inMonitor/message/index.vue
  11. 6
      ALOps_sys_fe/alops-ui/src/views/inMonitoring/inMonitor/rules/index.vue
  12. 4
      ALOps_sys_fe/alops-ui/src/views/index.vue
  13. 4
      ALOps_sys_fe/alops-ui/src/views/message/index.vue

@ -1,5 +1,5 @@
# 页面标题
VUE_APP_TITLE = 中国烟草
VUE_APP_TITLE = 唐山烟草网络设备智能监管平台
# 开发环境配置
ENV = 'development'

@ -1,5 +1,5 @@
# 页面标题
VUE_APP_TITLE = 中国烟草
VUE_APP_TITLE = 唐山烟草网络设备智能监管平台
# 生产环境配置
ENV = 'production'

@ -1,7 +1,7 @@
{
"name": "ruoyi",
"version": "3.9.0",
"description": "中国烟草",
"description": "唐山烟草网络设备智能监管平台",
"author": "若依",
"license": "MIT",
"scripts": {

@ -4,9 +4,10 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<title><%= webpackConfig.name %></title>
<title>唐山烟草网络设备智能监管平台</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,

@ -35,7 +35,7 @@ export default {
},
data() {
return {
title: process.env.VUE_APP_TITLE,
title: '中国烟草',
logo: logoImg
}
}

@ -79,21 +79,23 @@ export default {
methods: {
sendMessage() {
if (!this.newMessage.trim()) return;
console.log("%c 🍃: sendMessage -> this.newMessage ", "font-size:16px;background-color:#46f583;color:black;", this.newMessage)
//
this.messages.push({
text: this.newMessage,
sender: 'customer',
time: this.formatTime(new Date())
});
let newMessageContent = this.newMessage;
//
setTimeout(() => {
this.autoReply(this.newMessage);
this.autoReply(newMessageContent);
}, 1000);
this.newMessage = '';
},
async autoReply(userMessage) {
console.log("%c 🇱🇺: autoReply -> userMessage ", "font-size:16px;background-color:#c70b31;color:white;", userMessage)
let replyText = '';
let res = await knowledgeAsk({question: userMessage });
if (res.code == 200) {

@ -22,7 +22,7 @@
<el-table-column label="文件名称" align="center" key="source" prop="source" :show-overflow-tooltip="true" />
<el-table-column label="更新时间" align="center" prop="uploadTime" width="160">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.uploadTime) }}</span>
<span>{{ formatISOTime(scope.row.uploadTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
@ -56,6 +56,8 @@
:data="{ source: form.source }"
:on-preview="handlePreview"
:on-remove="handleRemove"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:file-list="fileList"
:headers="headers"
:auto-upload="false">
@ -298,6 +300,22 @@ export default {
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 格式化ISO时间字符串 */
formatISOTime(isoString) {
if (!isoString) return '';
const date = new Date(isoString);
if (isNaN(date.getTime())) return isoString;
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
/** 导出按钮操作 */
handleExport() {
this.download('system/user/export', {
@ -318,6 +336,31 @@ export default {
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true
},
//
beforeUpload(file) {
const isDocx = file.name.endsWith('.docx');
const isTxt = file.name.endsWith('.txt');
const isLt5M = file.size / 1024 / 1024 < 5;
if (!isDocx && !isTxt) {
this.$message.error('只允许上传docx/txt格式的文件!');
return false;
}
if (!isLt5M) {
this.$message.error('文件大小不能超过5MB!');
return false;
}
return true;
},
//
handleUploadError(err, file, fileList) {
this.upload.isUploading = false;
//
this.$modal.msgError("上传失败,请重试");
console.error('上传失败:', err);
},
//
handleFileSuccess(response, file, fileList) {
this.upload.isUploading = false;

@ -21,6 +21,7 @@
<el-col :span="24">
<el-form-item label="采集间隔" prop="frequency">
<el-input-number v-model="queryParams.frequency" controls-position="right" :min="1"></el-input-number>
<span> 分钟</span>
</el-form-item>
</el-col>
<el-col :span="24">

@ -247,7 +247,7 @@ export default {
components: { History, Interface, Vlan, Routing, LineChart, Veneer},
data() {
return {
DateValue: [dayjs().subtract(1, 'month').format('YYYY-MM-DD HH:mm:ss'),dayjs().format('YYYY-MM-DD HH:mm:ss')],
DateValue: [dayjs().subtract(1, 'week').format('YYYY-MM-DD HH:mm:ss'),dayjs().format('YYYY-MM-DD HH:mm:ss')],
selectedTab: 1,
tabs: [
{ name: '历史预警' },
@ -447,62 +447,73 @@ mounted() {
}
]
})
const value = this.details.cpuUtilization / 100;
usedmemory3.setOption({
series: [
{
type: 'liquidFill',
radius: '47%',
center: ['25%', '45%'],
color: [
{
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#446bf5',
},
{
offset: 1,
color: '#2ca3e2',
},
],
globalCoord: false,
},
],
data: [value, value], // data
backgroundStyle: {
borderWidth: 1,
color: 'RGBA(51, 66, 127, 0.7)',
},
label: {
normal: {
textStyle: {
fontSize: 50,
color: '#fff',
},
formatter: function(params) {
return Math.round(params.value * 100) + '%';
}
},
},
outline: {
// show: false
borderDistance: 0,
itemStyle: {
borderWidth: 2,
borderColor: '#112165',
},
},
}
],
title: [
{
text: 'CPU占用',
left: '45%',
top: '55%',
left: '25%',
top: '75%',
textAlign: 'center',
textStyle: {
fontSize: '14',
fontWeight: '400',
color: '#6AA0E4',
textAlign: 'center',
textShadowColor: '#000',
},
},
],
series: {
type: 'pie',
radius: ['90%', "100%"],
hoverAnimation: false,
data: [
{
value: this.details.cpuUtilization,
label: {
normal: {
color: '#6AA0E4',
fontSize: 22,
fontWeight: 'bold',
formatter: function(params) {
return params.value + '%';
},
position: 'center',
show: true,
}
},
itemStyle: {
normal: {
color: '#6AA0E4'
}
}
},{
value: 100-this.details.cpuUtilization,
name: '',
labelLine: {
show: false
},
itemStyle: {
normal: {
color: '#D8D8D8'
},
emphasis:{
color:'#D8D8D8'
}
}
}]
}
]
})
usedmemory4.setOption({
title: [
@ -603,41 +614,19 @@ mounted() {
let value = item.value;
let unit = '';
//
if (item.seriesName === '设备温度') {
unit = '℃';
} else if (item.seriesName === '健康度') {
// - 访
//
let originalValue;
switch(value) {
case 100: originalValue = 1; break;
case 75: originalValue = 2; break;
case 50: originalValue = 3; break;
case 25: originalValue = 4; break;
default: originalValue = 0;
}
let statusText = '';
switch(originalValue) {
case 1: statusText = '健康'; break;
case 2: statusText = '良好'; break;
case 3: statusText = '一般'; break;
case 4: statusText = '需维护'; break;
default: statusText = '未知';
}
result += item.marker + item.seriesName + ': ' + value + '% (' + statusText + ')<br/>';
return;
} else {
unit = '%';
}
//
if (item.seriesName === '设备温度') {
unit = '℃';
} else {
unit = '%';
}
result += item.marker + item.seriesName + ': ' + value + unit + '<br/>';
});
return result;
}
},
legend: {
data: ['设备温度', 'CPU使用率', '内存使用率', '健康度'],
data: ['设备温度', 'CPU使用率', '内存使用率'],
textStyle: {
color: '#718096'
}
@ -764,43 +753,6 @@ mounted() {
}]
}
}
},
{
name: '健康度',
type: 'bar',
// 1->100, 2->75, 3->50, 4->25
// 使
data: details.healthList.map(value => {
const valueMap = {1: 100, 2: 75, 3: 50, 4: 25};
// 使value
return {
value: valueMap[value] || 0,
originalValue: value
};
}),
itemStyle: {
color: function(params) {
//
const originalValue = params.data && params.data.originalValue !== undefined ?
params.data.originalValue : params.value;
// 使switchcasebreak
switch(originalValue) {
case 1: return '#48bb78'; // - 绿
case 2: return '#4299e1'; // -
case 3: return '#ed8936'; // -
case 4: return '#f56565'; // -
default: return '#a0aec0'; //
}
}
},
barWidth: '40%',
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
});

@ -9,6 +9,12 @@
<el-form-item label="预警时间">
<el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd hh:mm:ss" type="datetimerange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item>
<el-form-item label="设备编号" prop="equNumber">
<el-input v-model="queryParams.equNumber" placeholder="设备编号" clearable style="width: 240px" />
</el-form-item>
<el-form-item label="设备名称" prop="name">
<el-input v-model="queryParams.name" placeholder="设备名称" clearable style="width: 240px" />
</el-form-item>
<el-form-item label="预警等级" prop="level">
<el-select v-model="queryParams.level" placeholder="预警等级" clearable style="width: 240px">
<el-option v-for="dict in dict.type.warning_level" :key="dict.value" :label="dict.label" :value="dict.value" />
@ -39,14 +45,14 @@
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column
label="序号"
<el-table-column label="序号"
width="60"
type="index"
></el-table-column>
<el-table-column label="设备名称" align="center" key="name" prop="name" width="150" :show-overflow-tooltip="true" />
<el-table-column label="预警时间" align="center" key="occurTime" prop="occurTime" :show-overflow-tooltip="true" />
<el-table-column label="预警等级" align="center" key="level" prop="level" :show-overflow-tooltip="true" />
<el-table-column label="预警信息" align="center" key="message" prop="message" width="200" :show-overflow-tooltip="true">
<el-table-column label="预警信息" align="left" key="message" prop="message" width="200" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span @click="showContentDialog('预警信息', scope.row.message)" class="clickable-cell">{{ scope.row.message || '--' }}</span>
</template>
@ -66,7 +72,7 @@
<span>{{ parseTime(scope.row.handleTime) || '--' }}</span>
</template>
</el-table-column>
<el-table-column label="解决方案" align="center" key="solution" prop="solution" :show-overflow-tooltip="true" >
<el-table-column label="解决方案" align="left" key="solution" prop="solution" :show-overflow-tooltip="true" >
<template slot-scope="scope">
<span @click="showContentDialog('解决方案', scope.row.solution)" class="clickable-cell">{{ scope.row.solution || '--'}}</span>
</template>

@ -34,8 +34,8 @@
type="index"
></el-table-column>
<el-table-column label="名称" align="center" key="ruleName" prop="ruleName" width="120"/>
<el-table-column label="描述" align="center" key="description" prop="description" width="240" :show-overflow-tooltip="true" />
<el-table-column label="触发条件" align="center" key="alertTemplate" prop="alertTemplate" width="240" :show-overflow-tooltip="true" >
<el-table-column label="描述" align="left" key="description" prop="description" width="240" :show-overflow-tooltip="true" />
<el-table-column label="触发条件" align="left" key="alertTemplate" prop="alertTemplate" width="240" :show-overflow-tooltip="true" >
<template slot-scope="scope">
<span v-if="scope.row.paramName">{{ findParamName(scope.row.paramName) }} {{ scope.row.operator }} {{ scope.row.compareValue }}</span>
<span v-else></span>
@ -43,7 +43,7 @@
</el-table-column>
<el-table-column label="预警级别" align="center" key="severity" prop="severity" width="120" />
<el-table-column label="预警方式" align="center" key="alertWay" prop="alertWay" width="120" :show-overflow-tooltip="true" />
<el-table-column label="预警邮箱" align="center" key="alertStation" prop="alertStation" width="200" :show-overflow-tooltip="true" />
<el-table-column label="预警邮箱" align="left" key="alertStation" prop="alertStation" width="200" :show-overflow-tooltip="true" />
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['inMonitoring:alertRule:edit']">修改</el-button>

@ -926,9 +926,11 @@ export default {
},
//
jumpToDeviceFiles(floor) {
// ''
const floorNumber = Number(String(floor).replace('层', ''));
this.$router.push({
path: '/device/files',
query: { floor: floor }
query: { floor: floorNumber }
});
},

@ -14,7 +14,7 @@
></el-table-column>
<el-table-column label="消息ID" align="center" key="id" prop="id" width="80" />
<el-table-column label="用户ID" align="center" key="userId" prop="userId" width="80" />
<el-table-column label="消息内容" align="center" key="content" prop="content" :show-overflow-tooltip="true">
<el-table-column label="消息内容" align="left" key="content" prop="content" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span>{{ scope.row.content || '--' }}</span>
</template>
@ -26,7 +26,7 @@
</el-tag>
</template>
</el-table-column>
<el-table-column label="标题" align="center" key="title" prop="title" :show-overflow-tooltip="true">
<el-table-column label="标题" align="left" key="title" prop="title" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span>{{ scope.row.title || '--' }}</span>
</template>

Loading…
Cancel
Save