From 6d4e9ccb34e0292bfadba7bfd678231cb37ae8c0 Mon Sep 17 00:00:00 2001
From: qx <1084500556@qq.com>
Date: 星期三, 02 七月 2025 15:45:16 +0800
Subject: [PATCH] :qx

---
 src/views/index.vue |  450 ++++++++++++++++++++++++++-----------------------------
 1 files changed, 215 insertions(+), 235 deletions(-)

diff --git a/src/views/index.vue b/src/views/index.vue
index 8ccd4ef..268ec38 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="centre">
-    <div style="display:flex;justify-content: center;align-items: center;">
+    <!-- 浠婃棩缁熻 -->
+    <div style="display: flex; justify-content: center; align-items: center;">
       <h4>浠婃棩缁熻</h4>
     </div>
     <div class="top">
@@ -37,11 +38,13 @@
         </div>
       </div>
     </div>
-     <div style="display:flex;justify-content: center;align-items: center;">
+
+    <!-- 杩戜竴鏈堢粺璁� -->
+    <div style="display: flex; justify-content: center; align-items: center;">
       <h4>杩戜竴鏈堢粺璁�</h4>
     </div>
     <div class="data-view">
-      <div id="main" style="width:95%;height:330px"></div>
+      <div id="main" style="width: 95%; height: 330px"></div>
     </div>
     <div class="view">
       <div id="main2"></div>
@@ -52,11 +55,14 @@
 
 <script>
 import { getCustomer, getOrder, getReportToday, getTobeToday, getPieChart, getChart } from "@/api/home";
+import { noticeToday } from "@/api/system/notice";
+import { initWebSocket } from "@/utils/websocket";
 const echarts = require('echarts/lib/echarts');
 require('echarts/lib/component/title');
 require('echarts/lib/component/tooltip');
 require('echarts/lib/component/legend');
 require('echarts/lib/chart/pie');
+require('echarts/lib/chart/line');
 
 export default {
   data() {
@@ -73,305 +79,263 @@
       teamYYNum: [],
       PieChart: [],
       PieChart2: [],
-    }
+      loading: false
+    };
   },
 
   created() {
     this.getList();
-
+    this.initWebSocket();
   },
+
   watch: {
-        $route(to, from) {
-            window.location.reload(); //鐩戞祴鍒拌矾鐢卞彂鐢熻烦杞椂鍒锋柊涓�娆¢〉闈�
-            // this.$router.go(0);
-        },
-    },
- 
+    $route(to, from) {
+      window.location.reload();
+    }
+  },
 
   methods: {
- 
+    goToNotice(noticeId) {
+      this.$router.push({
+        path: '/notice',
+        query: { noticeId }
+      });
+    },
+
+    // 鍒濆鍖� WebSocket 杩炴帴
+    initWebSocket() {
+      const token = this.$store.state.user.token || '';
+      initWebSocket(token, (type, data) => {
+        if (type === 'error') {
+          this.$notify.error({
+            title: '閿欒',
+            message: data,
+            duration: 5000,
+            position: 'top-right'
+          });
+          return;
+        }
+
+        try {
+          const message = JSON.parse(data);
+          console.log('WebSocket 瑙f瀽鍚庢秷鎭�:', message);
+          if (message.noticeId && message.noticeTitle) {
+            const noticeTypeLabel = message.noticeType === '1' ? '閫氱煡' : '鍏憡';
+            this.$notify({
+              title: `鏂�${noticeTypeLabel}`,
+              message: message.noticeTitle || '鏃犳爣棰�',
+              type: 'success',
+              duration: 5000, // 鎮仠 5 绉�
+              position: 'top-right',
+              offset: 50,
+              onClick: () => {
+                this.goToNotice(message.noticeId);
+              }
+            });
+          } else {
+            console.log('鏈煡娑堟伅绫诲瀷:', message);
+          }
+        } catch (error) {
+          console.error('娑堟伅瑙f瀽澶辫触:', error, '鍘熷鏁版嵁:', data);
+          this.$notify.info({
+            title: '娑堟伅',
+            message: `鏈嶅姟鍣ㄥ洖搴斿瓧绗︿覆: ${data}`,
+            duration: 5000,
+            position: 'top-right',
+            offset: 50
+          });
+        }
+      });
+    },
+
     getList() {
       this.loading = true;
-      // 鏌ヨ浠婃棩鐧昏
-      getCustomer().then((response) => {
-        this.Customer = response
+
+      // 鏌ヨ鎵�鏈夊叕鍛婏紙浠呯敤浜庡垵濮嬪寲鏁版嵁锛屽彲鏍规嵁闇�瑕佷繚鐣欐垨绉婚櫎锛�
+      noticeToday().then(response => {
+        console.log('Notice API response:', response);
+        this.loading = false;
+      }).catch(error => {
+        console.error('Notice API error:', error);
+        this.$notify.error({
+          title: '閿欒',
+          message: `鑾峰彇閫氱煡澶辫触锛�${error.message}`,
+          duration: 5000,
+          position: 'top-right'
+        });
         this.loading = false;
       });
-      // 鏌ヨ浠婃棩宸叉
-      getOrder().then((response) => {
-        this.Order = response
+
+      getCustomer().then(response => {
+        this.Customer = response.data || response;
         this.loading = false;
       });
-      // 鏌ヨ浠婃棩鎶ュ憡
-      getReportToday().then((response) => {
-        this.ReportToday = response
+
+      getOrder().then(response => {
+        this.Order = response.data || response;
         this.loading = false;
       });
-      // 鏌ヨ浠婃棩寰呮
-      getTobeToday().then((response) => {
-        this.TobeToday = response
+
+      getReportToday().then(response => {
+        this.ReportToday = response.data || response;
         this.loading = false;
       });
-      // 鎶樼嚎鍥�
-      getChart().then((response) => {
+
+      getTobeToday().then(response => {
+        this.TobeToday = response.data || response;
+        this.loading = false;
+      });
+
+      getChart().then(response => {
         response.data.forEach(item => {
-          this.LineChart.push(item.date)
+          this.LineChart.push(item.date);
           this.reportNum.push(item.tdcoun);
           this.personYYNum.push(item.grcoun);
           this.teamYYNum.push(item.bgcoun);
-
         });
-        let myChart = this.$echarts.init(document.getElementById('main'));
 
+        let myChart = this.$echarts.init(document.getElementById('main'));
         myChart.setOption({
-          tooltip: {
-            trigger: 'axis'
-          },
-          legend: {
-            data: ['姣忔棩浣撴鐧昏鏁�', '姣忔棩鍥綋鐧昏鏁�', '姣忔棩鍙戝竷鎶ュ憡鏁�']
-          },
-          grid: {
-            left: '3%',
-            right: '4%',
-            bottom: '3%',
-            containLabel: true
-          },
-          toolbox: {
-            feature: {
-              saveAsImage: {}
-            }
-          },
+          tooltip: { trigger: 'axis' },
+          legend: { data: ['姣忔棩浣撴鐧昏鏁�', '姣忔棩鍥綋鐧昏鏁�', '姣忔棩鍙戝竷鎶ュ憡鏁�'] },
+          grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true },
+          toolbox: { feature: { saveAsImage: {} } },
           xAxis: {
             type: 'category',
             boundaryGap: false,
             axisLine: {
               show: true,
-              lineStyle: {
-                color: "blue",
-                size: 12,
-                width: 0,
-                tyle: "solid"
-              }
+              lineStyle: { width: 0, color: 'blue', type: 'solid' }
             },
             data: this.LineChart
           },
-          yAxis: {
-            type: 'value',
-            min: 0,
-            max: 100,
-            interval: 5
-          },
+          yAxis: { type: 'value', min: 0, max: 400, interval: 20 },
           series: [
-            {
-              name: '姣忔棩浣撴鐧昏鏁�',
-              type: 'line',
-              stack: 'Total',
-              data: this.personYYNum
-            },
-            {
-              name: '姣忔棩鍥綋鐧昏鏁�',
-              type: 'line',
-              stack: 'Total',
-              data: this.reportNum
-            },
-            {
-              name: '姣忔棩鍙戝竷鎶ュ憡鏁�',
-              type: 'line',
-              stack: 'Total',
-              data: this.teamYYNum
-            },
+            { name: '姣忔棩浣撴鐧昏鏁�', type: 'line', stack: 'Total', data: this.personYYNum },
+            { name: '姣忔棩鍥綋鐧昏鏁�', type: 'line', stack: 'Total', data: this.reportNum },
+            { name: '姣忔棩鍙戝竷鎶ュ憡鏁�', type: 'line', stack: 'Total', data: this.teamYYNum }
           ]
+        });
 
-        })
-        let sizeFun =  ()=> {
-          myChart.resize()
-        }
-        window.addEventListener("resize", sizeFun)
-
+        const sizeFun = () => myChart.resize();
+        window.addEventListener('resize', sizeFun);
         this.loading = false;
       });
 
-      // 楗肩姸鍥�
-      getPieChart().then((response) => {
+      getPieChart().then(response => {
         if (response.data) {
-
-          if(response.data.tjdj == 0){
-            this.PieChart = []
-            this.PieChart = [
-              {
-                "name": "浣撴鐧昏浜烘暟鍒嗗竷",
-                "count": 1,
-                "value": 10
-              },
-
-            ]
-          }else if (response.data.tjdj.length === 0) {
-
-            this.PieChart = []
-            this.PieChart = [
-              {
-                "name": "浣撴鐧昏浜烘暟鍒嗗竷",
-                "count": 1,
-                "value": 10
-              },
-
-            ]
+          if (response.data.tjdj == 0 || !response.data.tjdj?.length) {
+            this.PieChart = [{ name: '浣撴鐧昏浜烘暟鍒嗗竷', count: 1, value: 10 }];
           } else {
-            this.PieChart = response.data.tjdj
-            this.PieChart.forEach(item => {
-              item.value = item.count
-            })
-            this.PieChart.reverse()
-            this.PieChart.push(this.PieChart[0])
-            this.PieChart.splice(0, 1)
-
+            this.PieChart = response.data.tjdj;
+            this.PieChart.forEach(item => { item.value = item.count; });
+            this.PieChart.reverse();
+            this.PieChart.push(this.PieChart[0]);
+            this.PieChart.splice(0, 1);
           }
 
           let myChart2 = this.$echarts.init(document.getElementById('main2'));
           myChart2.setOption({
-            title: {
-              text: '浣撴鐧昏浜烘暟鍒嗗竷',
-              top: '5'
+            title: { text: '浣撴鐧昏浜烘暟鍒嗗竷', top: '5' },
+            tooltip: { trigger: 'item' },
+            legend: { top: '80%', left: 'center' },
+            series: [{
+              type: 'pie',
+              radius: ['16%', '54%'],
+              center: ['50%', '43%'],
+              avoidLabelOverlap: false,
+              startAngle: 180,
+              minAngle: 10,
+              data: this.PieChart,
+              emphasis: {
+                itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' }
+              }
+            }]
+          });
 
-            },
-
-            tooltip: {
-              trigger: 'item'
-            },
-            legend: {
-              top: '80%',
-              left: 'center'
-            },
-            series: [
-              {
-                // name: 'Access From',
-                type: 'pie',
-                radius: ['16%', '54%'],
-                center: ["50%", "43%"],
-                avoidLabelOveralap:false,
-                startAngle:180,
-                minAngle:10,
-                data: this.PieChart,
-                emphasis: {
-                  itemStyle: {
-                    shadowBlur: 10,
-                    shadowOffsetX: 0,
-                    shadowColor: 'rgba(0, 0, 0, 0.5)'
-                  }
-                }
-              }]
-          })
-
-          if(response.data.tjyc == 0){
-            this.PieChart2 = []
-            this.PieChart2 = [
-              {
-                "name": "浣撴缁撴灉寮傚父浜烘暟鍒嗗竷",
-                "count": 1,
-                "value": 0
-              },
-
-            ]
-          }else if (response.data.tjyc.length === 0) {
-            this.PieChart2 = []
-            this.PieChart2 = [
-              {
-                "name": "浣撴缁撴灉寮傚父浜烘暟鍒嗗竷",
-                "count": 1,
-                "value": 0
-              },
-
-            ]
+          if (response.data.tjyc == 0 || !response.data.tjyc?.length) {
+            this.PieChart2 = [{ name: '浣撴缁撴灉寮傚父浜烘暟鍒嗗竷', count: 1, value: 0 }];
           } else {
-            this.PieChart2 = response.data.tjyc
-            this.PieChart2.reverse()
-            this.PieChart2.push(this.PieChart2[0])
-            this.PieChart2.splice(0, 1)
-            this.PieChart2.forEach(item => {
-              item.value = item.count
-            })
-            // this.TobeToday = response
+            this.PieChart2 = response.data.tjyc;
+            this.PieChart2.reverse();
+            this.PieChart2.push(this.PieChart2[0]);
+            this.PieChart2.splice(0, 1);
+            this.PieChart2.forEach(item => { item.value = item.count; });
           }
+
           let myChart3 = this.$echarts.init(document.getElementById('main3'));
-
           myChart3.setOption({
-            title: {
-              text: '浣撴缁撴灉寮傚父浜烘暟鍒嗗竷',
-              top: '5'
+            title: { text: '浣撴缁撴灉寮傚父浜烘暟鍒嗗竷', top: '5' },
+            tooltip: { trigger: 'item' },
+            legend: { top: '80%', left: 'center' },
+            series: [{
+              type: 'pie',
+              radius: ['16%', '54%'],
+              center: ['50%', '43%'],
+              avoidLabelOverlap: false,
+              startAngle: 180,
+              minAngle: 10,
+              data: this.PieChart2,
+              emphasis: {
+                itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' }
+              }
+            }]
+          });
 
-            },
-            tooltip: {
-              trigger: 'item'
-            },
-            legend: {
-              top: '80%',
-              left: 'center'
-            },
-            series: [
-              {
-                // name: 'Access From',
-                type: 'pie',
-                radius: ['16%', '54%'],
-                center: ["50%", "43%"],
-                avoidLabelOveralap:false,
-                startAngle:180,
-                minAngle:10,
-                data: this.PieChart2,
-                emphasis: {
-                  itemStyle: {
-                    shadowBlur: 10,
-                    shadowOffsetX: 0,
-                    shadowColor: 'rgba(0, 0, 0, 0.5)'
-                  }
-                }
-              }]
-          })
-          window.onresize =  () =>{
-          myChart2.resize()
-          myChart3.resize()
+          window.onresize = () => {
+            myChart2.resize();
+            myChart3.resize();
+          };
         }
-        }
-
-
-      
         this.loading = false;
       });
+    },
 
+    parseTime(time, cFormat) {
+      if (!time) return '';
+      try {
+        const date = new Date(time);
+        if (isNaN(date.getTime())) return '';
+        const formatObj = {
+          y: date.getFullYear(),
+          m: String(date.getMonth() + 1).padStart(2, '0'),
+          d: String(date.getDate()).padStart(2, '0'),
+          h: String(date.getHours()).padStart(2, '0'),
+          i: String(date.getMinutes()).padStart(2, '0'),
+          s: String(date.getSeconds()).padStart(2, '0')
+        };
+        return cFormat.replace(/{([ymdhis]+)}/g, (result, key) => formatObj[key] || '');
+      } catch (error) {
+        console.error('parseTime error:', error, 'time:', time);
+        return '';
+      }
     }
-  },
-
-
-  mounted() {
-
   }
-}
-
-
+};
 </script>
 
 <style>
 .centre {
   min-height: 820px;
-  margin: 15px 15px;
+  margin: 15px;
   background-color: #f3f3f3;
-  padding: 10px 10px 10px 10px;
+  padding: 10px;
 }
 
 .top {
   width: 100%;
   display: flex;
   height: 120px;
-
 }
 
 .add {
-  width: 380px;
+  width: 320px;
   height: 75px;
-  margin-top: 30px;
+  margin-top: 20px;
   margin-left: 20px;
   margin-right: 20px;
   background-color: #fff;
-  display: flex
+  display: flex;
 }
 
 .img {
@@ -385,7 +349,6 @@
 .image {
   width: 60px;
   height: 60px;
-
 }
 
 .txt {
@@ -401,7 +364,7 @@
 
 .data-view {
   margin: 0 15px;
-  height: 323px !important
+  height: 323px !important;
 }
 
 #main {
@@ -409,23 +372,40 @@
 }
 
 .view {
-  margin: 0px 15px;
+  margin: 0 15px;
   padding-top: 15px;
   min-height: 350px;
   display: flex;
 }
 
-#main2 {
+#main2,
+#main3 {
   width: 820px;
   height: 350px;
   background-color: #fff;
   margin-right: 20px;
 }
 
-#main3 {
-  width: 820px;
-  height: 350px;
-  background-color: #fff;
-  margin-right: 20px;
+/* 鑷畾涔� Element UI 閫氱煡鏍峰紡 */
+.el-notification {
+  min-width: 300px;
+  background-color: #f0f9eb;
+  border-color: #e1f3d8;
+  color: #67c23a;
+  font-size: 16px;
+  padding: 15px 20px;
+}
+
+.el-notification__title {
+  font-weight: bold;
+}
+
+.el-notification__content {
+  font-size: 14px;
+  color: #333;
+}
+
+.el-notification__closeBtn {
+  color: #999;
 }
 </style>
\ No newline at end of file

--
Gitblit v1.8.0