REDEME文件,补充技术栈
This commit is contained in:
		
							parent
							
								
									fe08137ea1
								
							
						
					
					
						commit
						3784fc87f4
					
				
							
								
								
									
										68
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								README.md
									
									
									
									
									
								
							| 
						 | 
					@ -1,5 +1,67 @@
 | 
				
			||||||
# Vue 3 + Vite
 | 
					# 预警系统 (pre-warning-system)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
 | 
					基于Vue 3 + Vite构建的仓库预警管理系统,提供实时监控、数据可视化和异常预警功能。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Learn more about IDE Support for Vue in the [Vue Docs Scaling up Guide](https://vuejs.org/guide/scaling-up/tooling.html#ide-support).
 | 
					## 功能特点
 | 
				
			||||||
 | 
					- 实时数据监控仪表盘
 | 
				
			||||||
 | 
					- 多维度数据可视化图表
 | 
				
			||||||
 | 
					- 异常事件预警与通知
 | 
				
			||||||
 | 
					- 历史数据查询与分析
 | 
				
			||||||
 | 
					- 用户权限管理
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 技术栈
 | 
				
			||||||
 | 
					- **前端框架**: Vue 3 (Composition API + <script setup>)
 | 
				
			||||||
 | 
					- **构建工具**: Vite
 | 
				
			||||||
 | 
					- **路由管理**: Vue Router
 | 
				
			||||||
 | 
					- **状态管理**: Vuex
 | 
				
			||||||
 | 
					- **UI组件**: element-plus (v2.10.1) 和 tdesign-vue-next (v1.13.2)
 | 
				
			||||||
 | 
					- **图表可视化**: echarts (v5.6.0) 和 @antv/g6 (v4.8.24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 项目结构
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					/src
 | 
				
			||||||
 | 
					  /views        # 页面组件
 | 
				
			||||||
 | 
					  /components   # 通用组件
 | 
				
			||||||
 | 
					  /router       # 路由配置
 | 
				
			||||||
 | 
					  /store        # 状态管理
 | 
				
			||||||
 | 
					  /assets       # 静态资源
 | 
				
			||||||
 | 
					/escel          # 数据文件
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 安装与启动
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 环境要求
 | 
				
			||||||
 | 
					- Node.js 14.0.0+ 
 | 
				
			||||||
 | 
					- npm 6.0.0+ 或 yarn 1.22.0+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 安装依赖
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					npm install
 | 
				
			||||||
 | 
					# 或
 | 
				
			||||||
 | 
					yarn install
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 开发环境启动
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					npm run dev
 | 
				
			||||||
 | 
					# 或
 | 
				
			||||||
 | 
					yarn dev
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 生产环境构建
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					npm run build
 | 
				
			||||||
 | 
					# 或
 | 
				
			||||||
 | 
					yarn build
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 配置说明
 | 
				
			||||||
 | 
					系统配置文件位于 `src/config` 目录下,可根据实际需求修改API地址、预警阈值等参数。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 数据导入
 | 
				
			||||||
 | 
					1. 将数据文件放入 `/escel` 目录
 | 
				
			||||||
 | 
					2. 在系统设置中选择导入对应文件
 | 
				
			||||||
 | 
					3. 系统将自动解析并更新数据库
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 许可证
 | 
				
			||||||
 | 
					[MIT](LICENSE)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,23 +2,15 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div style="width: 100%; height: 100%;">
 | 
					  <div style="width: 100%; height: 100%;">
 | 
				
			||||||
    <div class="graph-box" id="graph-container"></div>
 | 
					    <div class="graph-box" id="graph-container"></div>
 | 
				
			||||||
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  <div class="slider-box">
 | 
					  <div class="slider-box">
 | 
				
			||||||
 <div class="slider-container">
 | 
					 <div class="slider-container">
 | 
				
			||||||
  <div class="play-controls">
 | 
					  <div class="play-controls">
 | 
				
			||||||
    <button @click="togglePlay" class="play-button">
 | 
					 | 
				
			||||||
      {{ isPlaying ? '暂停' : '播放' }}
 | 
					 | 
				
			||||||
    </button>
 | 
					 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
      <el-slider style="" v-model="state.sliderValue" @input="sliderChange" :marks="state.marks" />
 | 
					      <el-slider style="" v-model="state.sliderValue" @input="sliderChange" :marks="state.marks" />
 | 
				
			||||||
     </div>
 | 
					     </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					 | 
				
			||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
import axios from "axios";
 | 
					import axios from "axios";
 | 
				
			||||||
import { onMounted,onUnmounted, reactive,ref } from "vue";
 | 
					import { onMounted,onUnmounted, reactive,ref } from "vue";
 | 
				
			||||||
| 
						 | 
					@ -27,7 +19,6 @@ import { ElLoading } from 'element-plus';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const isPlaying = ref(false);
 | 
					const isPlaying = ref(false);
 | 
				
			||||||
const playTimer = ref(null);
 | 
					const playTimer = ref(null);
 | 
				
			||||||
 | 
					 | 
				
			||||||
const state = reactive({
 | 
					const state = reactive({
 | 
				
			||||||
  graph: null,
 | 
					  graph: null,
 | 
				
			||||||
  marks: {
 | 
					  marks: {
 | 
				
			||||||
| 
						 | 
					@ -65,15 +56,6 @@ const setStateSliderValue = (value) => {
 | 
				
			||||||
  sliderChange(value);
 | 
					  sliderChange(value);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 自动播放相关方法
 | 
					 | 
				
			||||||
const togglePlay = () => {
 | 
					 | 
				
			||||||
  if (isPlaying.value) {
 | 
					 | 
				
			||||||
    stopAutoPlay();
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    startAutoPlay();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const startAutoPlay = () => {
 | 
					const startAutoPlay = () => {
 | 
				
			||||||
  isPlaying.value = true;
 | 
					  isPlaying.value = true;
 | 
				
			||||||
  // 获取排序后的mark键
 | 
					  // 获取排序后的mark键
 | 
				
			||||||
| 
						 | 
					@ -84,13 +66,12 @@ const startAutoPlay = () => {
 | 
				
			||||||
    if (currentIndex < markKeys.length - 1) {
 | 
					    if (currentIndex < markKeys.length - 1) {
 | 
				
			||||||
        currentIndex++;
 | 
					        currentIndex++;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        stopAutoPlay();
 | 
					        currentIndex = 0; // 滑到最后重置
 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    const nextValue = markKeys[currentIndex];
 | 
					    const nextValue = markKeys[currentIndex];
 | 
				
			||||||
    state.sliderValue = nextValue;
 | 
					    state.sliderValue = nextValue;
 | 
				
			||||||
    sliderChange(nextValue);
 | 
					    sliderChange(nextValue, true); // 传入isAuto参数标记为自动触发
 | 
				
			||||||
  }, 3000); // 3秒切换一次
 | 
					  }, 6000); // 6秒切换一次
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const stopAutoPlay = () => {
 | 
					const stopAutoPlay = () => {
 | 
				
			||||||
| 
						 | 
					@ -101,16 +82,17 @@ const stopAutoPlay = () => {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const sliderChange = (val) => {
 | 
					const sliderChange = (val, isAuto = false) => {
 | 
				
			||||||
  // 拖动时暂停自动播放
 | 
					  // 拖动时暂停自动播放
 | 
				
			||||||
  if (isPlaying.value) {
 | 
					  // 只有手动操作时才暂停自动播放
 | 
				
			||||||
    stopAutoPlay();
 | 
					    if (!isAuto && isPlaying.value) {
 | 
				
			||||||
  }
 | 
					      stopAutoPlay();
 | 
				
			||||||
  if (state.marks[val]) {
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  if (state.marks[val]) {
 | 
					  if (state.marks[val]) {
 | 
				
			||||||
    getData(state.marks[val]);
 | 
					    getData(state.marks[val]);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 根据日期获取图谱数据
 | 
					 * 根据日期获取图谱数据
 | 
				
			||||||
| 
						 | 
					@ -222,6 +204,7 @@ onUnmounted(() => {
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
onMounted(() => {
 | 
					onMounted(() => {
 | 
				
			||||||
 | 
					  startAutoPlay(); // 页面加载时自动开始滑动
 | 
				
			||||||
  getData('2024-01-03')
 | 
					  getData('2024-01-03')
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					@ -260,9 +243,11 @@ onMounted(() => {
 | 
				
			||||||
.slider-box {
 | 
					.slider-box {
 | 
				
			||||||
  flex: 1;
 | 
					  flex: 1;
 | 
				
			||||||
  margin-top: 0;
 | 
					  margin-top: 0;
 | 
				
			||||||
  width: 90%;
 | 
					  width: 95%;
 | 
				
			||||||
  margin-top: -230px;
 | 
					  margin-top: -230px;
 | 
				
			||||||
  margin-left: 10px;
 | 
					  margin-left: 10px;
 | 
				
			||||||
  flex-direction: column;
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					color: #fff;
 | 
				
			||||||
 | 
					  font-size: 16px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,10 +16,10 @@
 | 
				
			||||||
              alt="" style="margin-bottom: -7px;">最初首发者:   {{ currentItem.earler }} </li>
 | 
					              alt="" style="margin-bottom: -7px;">最初首发者:   {{ currentItem.earler }} </li>
 | 
				
			||||||
          <li style="margin-left: 10px;"><img src="../assets/images/logo/point.png" alt="" style="margin-bottom: -7px;">积极评论者:{{ currentItem.comenter
 | 
					          <li style="margin-left: 10px;"><img src="../assets/images/logo/point.png" alt="" style="margin-bottom: -7px;">积极评论者:{{ currentItem.comenter
 | 
				
			||||||
          }}</li>
 | 
					          }}</li>
 | 
				
			||||||
          <li style="margin-left: 200px;margin-top: -45px;"><img src="../assets/images/logo/point.png" alt="" style="margin-bottom: -7px;">锚点用户{{
 | 
					          <li style="margin-left: 220px;margin-top: -45px;"><img src="../assets/images/logo/point.png" alt="" style="margin-bottom: -7px;">积极转发者:{{
 | 
				
			||||||
            currentItem.keyuser }}</li>
 | 
					 | 
				
			||||||
          <li style="margin-left: 200px;;"><img src="../assets/images/logo/point.png" alt="" style="margin-bottom: -7px;">积极转发者:   {{
 | 
					 | 
				
			||||||
            currentItem.switcher }}</li>
 | 
					            currentItem.switcher }}</li>
 | 
				
			||||||
 | 
					          <li style="margin-left: 220px;;"><img src="../assets/images/logo/point.png" alt="" style="margin-bottom: -7px;">锚点用户:   {{
 | 
				
			||||||
 | 
					             currentItem.keyuser}}</li>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <img src="../assets/images/logo/cancel.png" alt=""
 | 
					        <img src="../assets/images/logo/cancel.png" alt=""
 | 
				
			||||||
          style="float: right;margin-right: 10px;margin-top: -520px;cursor: pointer;" @click="showTooltip = false">
 | 
					          style="float: right;margin-right: 10px;margin-top: -520px;cursor: pointer;" @click="showTooltip = false">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user