yjryu / KERIS star
류윤주 류윤주 2023-11-24
231124 류윤주 메인 수정
@3341a0274e13bbfc334aa03b51cc13dd6fd729f8
client/resources/css/admin.css
--- client/resources/css/admin.css
+++ client/resources/css/admin.css
@@ -559,13 +559,11 @@
 }
 
 /* 통계 */
-.chart-wrap {
-  padding: 30px;
-}
 
 #chartdiv {
   width: 100%;
   height: 300px;
+  /* background-color: #fff; */
 }
 
 .table-zone table thead th {
client/views/component/chart/LineChart.vue
--- client/views/component/chart/LineChart.vue
+++ client/views/component/chart/LineChart.vue
@@ -16,18 +16,7 @@
             type: Array,
             required: true,
         },
-        // categoryGroup: {
-        //     type: String,
-        //     required: true,
-        // },
-        // colors: {
-        //     type: Array,
-        //     required: true,
-        // },
-        // unit: {
-        //     type: String,
-        //     required: true,
-        // },
+
     },
     data() {
         return {
@@ -42,63 +31,66 @@
             let root = am5.Root.new(this.$refs.chartdiv);
             root._logo.dispose();
 
-
+            
             // Set themes
             // https://www.amcharts.com/docs/v5/concepts/themes/
-            root.setThemes([
-                am5themes_Animated.new(root)
-            ]);
-
+            root.setThemes([am5themes_Animated.new(root)]);
 
             // Create chart
             // https://www.amcharts.com/docs/v5/charts/xy-chart/
-            let chart = root.container.children.push(am5xy.XYChart.new(root, {
-                panX: true,
-                panY: true,
-                wheelX: "panX",
-                wheelY: "zoomX",
-                pinchZoomX: true
-            }));
-
-            chart.get("colors").set("step", 3);
-
-
-            // Add cursor
-            // https://www.amcharts.com/docs/v5/charts/xy-chart/cursor/
-            let cursor = chart.set("cursor", am5xy.XYCursor.new(root, {}));
-            cursor.lineY.set("visible", false);
-
+            let chart = root.container.children.push(
+                am5xy.XYChart.new(root, {
+                    panX: false,
+                    panY: false,
+                    wheelX: "panX",
+                    wheelY: "zoomX",
+                    layout: root.verticalLayout
+                })
+            );
 
             // Create axes
             // https://www.amcharts.com/docs/v5/charts/xy-chart/axes/
-            let xAxis = chart.xAxes.push(am5xy.DateAxis.new(root, {
-                maxDeviation: 0.3,
-                baseInterval: {
-                    timeUnit: "day",
-                    count: 1
-                },
-                renderer: am5xy.AxisRendererX.new(root, {}),
-                tooltip: am5.Tooltip.new(root, {})
-            }));
+            let xRenderer = am5xy.AxisRendererX.new(root, {});
+            let xAxis = chart.xAxes.push(
+                am5xy.CategoryAxis.new(root, {
+                    categoryField: "date",
+                    renderer: xRenderer,
+                    tooltip: am5.Tooltip.new(root, {})
+                })
+            );
+            xRenderer.grid.template.setAll({
+                location: 1
+            })
 
-            let yAxis = chart.yAxes.push(am5xy.ValueAxis.new(root, {
-                maxDeviation: 0.3,
-                renderer: am5xy.AxisRendererY.new(root, {})
-            }));
+            xAxis.data.setAll(data);
+
+            let yAxis = chart.yAxes.push(
+                am5xy.ValueAxis.new(root, {
+                    min: 0,
+                    extraMax: 0.1,
+                    renderer: am5xy.AxisRendererY.new(root, {
+                        strokeOpacity: 0.1
+                    })
+                })
+            );
+
 
 
             // Add series
             Object.keys(data[0]).forEach((key, index) => {
                 if (key !== "date") {
                     let series = chart.series.push(am5xy.LineSeries.new(root, {
-                        name: "Series " + (index + 1),
+
+                        name: key,
                         xAxis: xAxis,
                         yAxis: yAxis,
                         valueYField: key,
-                        valueXField: "date",
+                        categoryXField: "date",
                         tooltip: am5.Tooltip.new(root, {
-                            labelText: "{valueX}: {valueY}"
+                            pointerOrientation: "horizontal",
+                            labelText: "{categoryX}: {valueY}"
                         })
+
                     }));
 
                     series.strokes.template.setAll({
@@ -111,16 +103,19 @@
                         date: item.date,
                         [key]: item[key]
                     })));
+
+                    series.bullets.push(function () {
+                        return am5.Bullet.new(root, {
+                            sprite: am5.Circle.new(root, {
+                                strokeWidth: 3,
+                                stroke: series.get("stroke"),
+                                radius: 5,
+                                fill: root.interfaceColors.get("background")
+                            })
+                        });
+                    });
                 }
             });
-
-            // Set date fields
-            // https://www.amcharts.com/docs/v5/concepts/data/#Parsing_dates
-            root.dateFormatter.setAll({
-                dateFormat: "yyyy-MM-dd",
-                dateFields: ["valueX"]
-            });
-
 
 
             // Make stuff animate on load
client/views/component/chart/SingleBarChart.vue
--- client/views/component/chart/SingleBarChart.vue
+++ client/views/component/chart/SingleBarChart.vue
@@ -1,5 +1,7 @@
 <template>
-    <div class="chart-container" ref="chartdiv"></div>
+    <div class="chart-wrap">
+        <div id="chartdiv" ref="chartdiv"></div>
+    </div>
 </template>
   
 <script>
@@ -9,17 +11,20 @@
 
 export default {
     props: {
-        data: {
+        chartData: {
             type: Array,
-            required: true,
+            default: [],
+            // required: true,
         },
         xField: {
             type: String,
-            required: true,
+            default: null
+            // required: true,
         },
         yField: {
             type: String,
-            required: true,
+            default: null
+            // required: true,
         },
     },
     data() {
@@ -29,7 +34,16 @@
     },
     methods: {
         createChart(data, xField, yField) {
-            let root = am5.Root.new(this.$refs.chartdiv);
+            let chartWarp = this.$refs["chartdiv"]; // 차트 상위 div ref 매칭
+            chartWarp.innerHTML = ""; // 차트 상위 div 내용 초기화 (기존 차트 삭제)
+            let div = document.createElement("div"); // 차트를 담을 빈 div 생성 (차트 하위 div)
+            div.style.width = "100%"; // 차트를 담을 div의 넓이
+            div.style.height = "100%"; // 차트를 담을 div의 높이
+            chartWarp.appendChild(div); // 차트 상위 div 안에 차트 하위 div를 추가
+            let root = am5.Root.new(div); // 차트 하위 div에 차트(root) 담기
+            this.charts = root; // 차트 정보 전역에 담기
+
+            // let root = am5.Root.new(this.$refs.chartdiv);
             root._logo.dispose();
             // Set themes
             // https://www.amcharts.com/docs/v5/concepts/themes/
@@ -101,24 +115,22 @@
             // Make stuff animate on load
             series.appear(1000);
             chart.appear(1000, 100);
-
-            return chart;
-        }
+            this.chart = chart;
+        },
+       
 
     },
     watch: {
-
+        'chartData': function (newData, oldData) {
+            console.log("new:", newData, oldData);
+            this.createChart(newData, this.xField, this.yField);
+        },
     },
     mounted() {
-        this.chart = this.createChart(this.data, this.xField, this.yField);
+        console.log("chart")
+        //this.createChart(this.data, this.xField, this.yField);
     },
 };
 </script>
   
-<style scoped>
-.chart-container {
-    width: 100%;
-    height: 300px;
-}
-</style>
   
(No newline at end of file)
client/views/pages/admin/main/Amain.vue
--- client/views/pages/admin/main/Amain.vue
+++ client/views/pages/admin/main/Amain.vue
@@ -77,7 +77,7 @@
                 <div class="content">
                     <div class="main-content-title">페이지별 접속 통계</div>
                     <div class="content-zone">
-                        <SingleBarChart :data="totalMenuData" xField="menu" yField="value" />
+                        <SingleBarChart :chartData="accumulatePageAccess" xField="page_nm" yField="count"/>
                     </div>
                 </div>
                 <div class="content">
@@ -149,16 +149,6 @@
                 user_id: null,
             },
             store: useStore(),
-            totalMenuData: [
-                { menu: "통합지원센터란", value: 15 },
-                { menu: "기술문서", value: 2 },
-                { menu: "자료집", value: 4 },
-                { menu: "기업홍보관", value: 7 },
-                { menu: "공지사항", value: 9 },
-                { menu: "홍보뉴스", value: 20 },
-                { menu: "전문가협의체", value: 7 },
-            ],
-
             Page: [
                     { menu: "통합지원센터란", value: null, divClass: "blue" , nameClass: "blue-sub-title main-sub-title", cntClass:"number blue-sub-title"},
                     { menu: "기술문서", value: null, divClass: "blue" , nameClass: "blue-sub-title main-sub-title", cntClass:"number blue-sub-title"},
@@ -190,6 +180,7 @@
                     'Content-Type': "application/json; charset=UTF-8",
                 },
             }).then(function (response) {
+               
                 vm.todayVisit = response.data.todayVisit;
                 vm.accumulateMember = response.data.accumulateMember;
                 vm.accumulateMatching = response.data.accumulateMatching;
@@ -205,14 +196,13 @@
                     }
                 };
 
-                for(let i = 0; i < vm.totalMenuData.length; i++) {
-                    for(let j = 0; j < vm.accumulatePageAccess.length; j++) {
-                        if(vm.totalMenuData[i].menu === vm.accumulatePageAccess[j].page_nm) {
-                            vm.totalMenuData[i].value = vm.accumulatePageAccess[j].count;
-                        }
-                    }
-                };
-                console.log(vm.totalMenuData)
+                // for(let i = 0; i < vm.totalMenuData.length; i++) {
+                //     for(let j = 0; j < vm.accumulatePageAccess.length; j++) {
+                //         if(vm.totalMenuData[i].menu === vm.accumulatePageAccess[j].page_nm) {
+                //             vm.totalMenuData[i].value = vm.accumulatePageAccess[j].count;
+                //         }
+                //     }
+                // };
             }).catch(function (error) {
                 console.log("error - ", error)
                 alert("대시보드 조회 오류, 관리자에게 문의하세요.");
@@ -241,13 +231,16 @@
         }
         
     },
-    watch: {},
+    watch: {
+        'accumulatePageAccess':function(newData){
+          console.log("accumulatePageAccess",newData);
+        }
+    },
     computed: {},
     components: {
         'SingleBarChart': SingleBarChart
     },
     mounted() {
-        console.log('amain')
         this.dashboard();
         this.top5();
     }
client/views/pages/admin/statistics/Visit.vue
--- client/views/pages/admin/statistics/Visit.vue
+++ client/views/pages/admin/statistics/Visit.vue
@@ -65,43 +65,43 @@
     data() {
         return {
             visitData: [{
-                date: new Date(2019, 5, 12).getTime(),
+                date: "2023-11-01",
                 total_value: 100,
                 value1: 50,
                 value2: 48,
                 value3: 58,
             }, {
-                date: new Date(2019, 5, 13).getTime(),
+                date: "2023-11-02",
                 total_value: 100,
                 value1: 53,
                 value2: 51,
                 value3: 51,
             }, {
-                date: new Date(2019, 5, 14).getTime(),
+                date: "2023-11-03",
                 total_value: 100,
                 value1: 56,
                 value2: 58,
                 value3: 58,
             }, {
-                date: new Date(2019, 5, 15).getTime(),
+                date: "2023-11-04",
                 total_value: 100,
                 value1: 52,
                 value2: 53,
                 value3: 32,
             }, {
-                date: new Date(2019, 5, 16).getTime(),
+                date: "2023-11-05",
                 total_value: 100,
                 value1: 48,
                 value2: 44,
                 value3: 44,
             }, {
-                date: new Date(2019, 5, 17).getTime(),
+                date: "2023-11-06",
                 total_value: 100,
                 value1: 47,
                 value2: 42,
                 value3: 74,
             }, {
-                date: new Date(2019, 5, 18).getTime(),
+                date: "2023-11-07",
                 total_value: 100,
                 value1: 59,
                 value2: 55,
client/views/pages/user/mypage/MatchingManager.vue
--- client/views/pages/user/mypage/MatchingManager.vue
+++ client/views/pages/user/mypage/MatchingManager.vue
@@ -74,7 +74,7 @@
                                         <button class="red-btn small-btn" @click="pickCancelModal(item)">취소</button>
                                     </div>
                                     <div v-else>
-                                        <button class="inbox-btn-gray small-btn">거절됨</button>
+                                        <button class="dark-gray-btn small-btn">거절됨</button>
                                     </div>
                                 </div>
                             </div>
Add a comment
List