박정하 박정하 2023-07-06
20230706 박정하 연령대별 통계 작업
@b5b0437f98a0b7cd45d050f980f3273e01cffa7e
client/views/component/chart/Chart7.jsx
--- client/views/component/chart/Chart7.jsx
+++ client/views/component/chart/Chart7.jsx
@@ -2,205 +2,162 @@
 import * as am5 from "@amcharts/amcharts5";
 import * as am5xy from "@amcharts/amcharts5/xy";
 import am5themes_Animated from "@amcharts/amcharts5/themes/Animated";
+import CommonUtil from "../../../resources/js/CommonUtil";
 
-class Chart6 extends Component {
-  componentDidMount() {
-    am5.ready(function () {
 
-      // Create root element
-      // https://www.amcharts.com/docs/v5/getting-started/#Root_element
-      var root = am5.Root.new("chart7");
+export default function Chart7({ data }) {
+  const createChart = () => {
+    console.log('createChart7 data : ', data);
 
-      // Set themes
-      // https://www.amcharts.com/docs/v5/concepts/themes/
-      root.setThemes([
-        am5themes_Animated.new(root)
-      ]);
+    /* Chart code */
 
-      // Create chart
-      // https://www.amcharts.com/docs/v5/charts/xy-chart/
-      var chart = root.container.children.push(
-        am5xy.XYChart.new(root, {
-          panX: false,
-          panY: false,
-          wheelX: "panX",
-          wheelY: "zoomX",
-          layout: root.verticalLayout,
-          arrangeTooltips: false
+    // Create root element
+    // https://www.amcharts.com/docs/v5/getting-started/#Root_element
+    let root = am5.Root.new("Chart7");
+    root._logo.dispose();
+    // Set themes
+    // https://www.amcharts.com/docs/v5/concepts/themes/
+    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: false,
+        panY: false,
+        wheelX: "panX",
+        wheelY: "zoomX",
+        layout: root.verticalLayout,
+        arrangeTooltips: false
+      })
+    );
+
+    // Use only absolute numbers
+    chart.getNumberFormatter().set("numberFormat", "#.#s");
+
+    // Add legend
+    // https://www.amcharts.com/docs/v5/charts/xy-chart/legend-xy-series/
+    let legend = chart.children.push(
+      am5.Legend.new(root, {
+        centerX: am5.p50,
+        x: am5.p50
+      })
+    );
+
+    // Create axes
+    // https://www.amcharts.com/docs/v5/charts/xy-chart/axes/
+    let yAxis = chart.yAxes.push(
+      am5xy.CategoryAxis.new(root, {
+        categoryField: "age",
+        renderer: am5xy.AxisRendererY.new(root, {
+          inversed: true,
+          cellStartLocation: 0.1,
+          cellEndLocation: 0.9
         })
-      );
+      })
+    );
 
-      // Use only absolute numbers
-      chart.getNumberFormatter().set("numberFormat", "#.#s");
+    yAxis.data.setAll(data);
 
-      // Add legend
-      // https://www.amcharts.com/docs/v5/charts/xy-chart/legend-xy-series/
-      var legend = chart.children.push(
-        am5.Legend.new(root, {
-          centerX: am5.p50,
-          x: am5.p50
+    let xAxis = chart.xAxes.push(
+      am5xy.ValueAxis.new(root, {
+        renderer: am5xy.AxisRendererX.new(root, {
+          strokeOpacity: 0.1
         })
-      );
+      })
+    );
 
-      // Data
-      var data = [
-        {
-          age: "85+",
-          male: -0.1,
-          female: 0.3
-        },
-        {
-          age: "80-54",
-          male: -0.2,
-          female: 0.3
-        },
-        {
-          age: "75-79",
-          male: -0.3,
-          female: 0.6
-        },
-        {
-          age: "70-74",
-          male: -0.5,
-          female: 0.8
-        },
-        {
-          age: "65-69",
-          male: -0.8,
-          female: 1.0
-        },
-        {
-          age: "60-64",
-          male: -1.1,
-          female: 1.3
-        },
-        {
-          age: "55-59",
-          male: -1.7,
-          female: 1.9
-        },
-        {
-          age: "50-54",
-          male: -2.2,
-          female: 2.5
-        },
-      ];
-
-      // Create axes
-      // https://www.amcharts.com/docs/v5/charts/xy-chart/axes/
-      var yAxis = chart.yAxes.push(
-        am5xy.CategoryAxis.new(root, {
-          categoryField: "age",
-          renderer: am5xy.AxisRendererY.new(root, {
-            inversed: true,
-            cellStartLocation: 0.1,
-            cellEndLocation: 0.9
+    // Add series
+    // https://www.amcharts.com/docs/v5/charts/xy-chart/series/
+    function createSeries(field, labelCenterX, pointerOrientation, rangeValue) {
+      let series = chart.series.push(
+        am5xy.ColumnSeries.new(root, {
+          xAxis: xAxis,
+          yAxis: yAxis,
+          valueXField: field,
+          categoryYField: "age",
+          sequencedInterpolation: true,
+          clustered: false,
+          tooltip: am5.Tooltip.new(root, {
+            pointerOrientation: pointerOrientation,
+            labelText: "{categoryY}: {valueX}"
           })
         })
       );
 
-      yAxis.data.setAll(data);
+      series.columns.template.setAll({
+        height: am5.p100,
+        strokeOpacity: 0,
+        fillOpacity: 0.8
+      });
 
-      var xAxis = chart.xAxes.push(
-        am5xy.ValueAxis.new(root, {
-          renderer: am5xy.AxisRendererX.new(root, {
-            strokeOpacity: 0.1
+      series.bullets.push(function () {
+        return am5.Bullet.new(root, {
+          locationX: 1,
+          locationY: 0.5,
+          sprite: am5.Label.new(root, {
+            centerY: am5.p50,
+            text: "{valueX}",
+            populateText: true,
+            centerX: labelCenterX
           })
-        })
-      );
-
-      // Add series
-      // https://www.amcharts.com/docs/v5/charts/xy-chart/series/
-      function createSeries(field, labelCenterX, pointerOrientation, rangeValue) {
-        var series = chart.series.push(
-          am5xy.ColumnSeries.new(root, {
-            xAxis: xAxis,
-            yAxis: yAxis,
-            valueXField: field,
-            categoryYField: "age",
-            sequencedInterpolation: true,
-            clustered: false,
-            tooltip: am5.Tooltip.new(root, {
-              pointerOrientation: pointerOrientation,
-              labelText: "{categoryY}: {valueX}"
-            })
-          })
-        );
-
-        series.columns.template.setAll({
-          height: am5.p100,
-          strokeOpacity: 0,
-          fillOpacity: 0.8
         });
+      });
 
-        series.bullets.push(function () {
-          return am5.Bullet.new(root, {
-            locationX: 1,
-            locationY: 0.5,
-            sprite: am5.Label.new(root, {
-              centerY: am5.p50,
-              text: "{valueX}",
-              populateText: true,
-              centerX: labelCenterX
-            })
-          });
-        });
+      series.data.setAll(data);
+      series.appear();
 
-        series.data.setAll(data);
-        series.appear();
+      let rangeDataItem = xAxis.makeDataItem({
+        value: rangeValue
+      });
+      xAxis.createAxisRange(rangeDataItem);
+      rangeDataItem.get("grid").setAll({
+        strokeOpacity: 1,
+        stroke: series.get("stroke")
+      });
 
-        var rangeDataItem = xAxis.makeDataItem({
-          value: rangeValue
-        });
-        xAxis.createAxisRange(rangeDataItem);
-        rangeDataItem.get("grid").setAll({
-          strokeOpacity: 1,
-          stroke: series.get("stroke")
-        });
+      let label = rangeDataItem.get("label");
+      label.setAll({
+        text: field.toUpperCase(),
+        fontSize: "1.1em",
+        fill: series.get("stroke"),
+        paddingTop: 10,
+        isMeasured: false,
+        centerX: labelCenterX
+      });
+      label.adapters.add("dy", function () {
+        return -chart.plotContainer.height();
+      });
 
-        var label = rangeDataItem.get("label");
-        label.setAll({
-          text: field.toUpperCase(),
-          fontSize: "1.1em",
-          fill: series.get("stroke"),
-          paddingTop: 10,
-          isMeasured: false,
-          centerX: labelCenterX
-        });
-        label.adapters.add("dy", function () {
-          return -chart.plotContainer.height();
-        });
-
-        return series;
-      }
-
-      createSeries("male", am5.p100, "right", -3);
-      createSeries("female", 0, "left", 4);
-
-      // Add cursor
-      // https://www.amcharts.com/docs/v5/charts/xy-chart/cursor/
-      var cursor = chart.set("cursor", am5xy.XYCursor.new(root, {
-        behavior: "zoomY"
-      }));
-      cursor.lineY.set("forceHidden", true);
-      cursor.lineX.set("forceHidden", true);
-
-      // Make stuff animate on load
-      // https://www.amcharts.com/docs/v5/concepts/animations/
-      chart.appear(1000, 100);
-
-    }); // end am5.ready()
-  }
-
-  componentWillUnmount() {
-    if (this.root) {
-      this.root.dispose();
+      return series;
     }
+
+    createSeries("male", am5.p100, "right", -2);
+    createSeries("female", 0, "left", 2);
+
+    // Add cursor
+    // https://www.amcharts.com/docs/v5/charts/xy-chart/cursor/
+    let cursor = chart.set("cursor", am5xy.XYCursor.new(root, {
+      behavior: "zoomY"
+    }));
+    cursor.lineY.set("forceHidden", true);
+    cursor.lineX.set("forceHidden", true);
+
+    // Make stuff animate on load
+    // https://www.amcharts.com/docs/v5/concepts/animations/
+    chart.appear(1000, 100);
   }
 
-  render() {
-    return <div id="chart7" style={{ width: "100%", height: "100%" }}></div>;
-  }
-}
+  React.useEffect(() => {
+    console.log('React.useEffect chart8 data : ', data);
+    if (CommonUtil.isEmpty(data) == false) {
+      createChart();
+    }
+  }, [data])
 
-export default Chart6;
+  return (
+    <div id="Chart7" style={{ width: "100%", height: "100%" }}></div>
+  )
+}
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/main/Main_agency.jsx
--- client/views/pages/main/Main_agency.jsx
+++ client/views/pages/main/Main_agency.jsx
@@ -9,7 +9,7 @@
 import AddCircleIcon from "@mui/icons-material/AddCircle";
 import Calendar_agency from "../../component/Calendar_agency.jsx";
 import Chart10 from "../../component/chart/Chart10.jsx";
-import Cart7 from "../../component/chart/Chart7.jsx";
+import Chart7 from "../../component/chart/Chart7.jsx";
 import Chart8 from "../../component/chart/Chart8.jsx";
 import tool from "../../../resources/files/images/tool.png";
 import medicinebox from "../../../resources/files/images/medicinebox.png";
@@ -59,6 +59,7 @@
     }
   });
   // 내 시니어 목록 조회
+  const [seniorGenderData, setSeniorGenderData] = React.useState([]);
   const mySeniorSelectList = () => {
     fetch("/user/seniorSelectList.json", {
       method: "POST",
@@ -78,26 +79,31 @@
         let age = today.getFullYear() - birth.getFullYear() + 1;
         seniorGenderArr.push({ "gender": item['user_gender'], "age": age })
       })
-      console.log("seniorGenderArr : ", seniorGenderArr)
 
       let genderData = [];
-      for (let i = 4; i < 14; i++) {
+      for (let i = 0; i < 18; i++) {
         let age = i * 5;
-        genderData.push({ "age": age, "male": 0, "female": 0 })
+        let age1 = ((i + 1) * 5) - 1;
+        if (i == 17) {
+          genderData.push({ "age": age + '+', "male": 0, "female": 0 })
+        } else {
+          genderData.push({ "age": age + '-' + age1, "male": 0, "female": 0 })
+        }
       }
 
       seniorGenderArr.map((item, idx) => {
         for (let i = 0; i < 18; i++) {
           if (item['age'] > i * 5 && item['age'] < ((i + 1) * 5) - 1) {
             if (item['gender'] == "남") {
-              genderData[i]['male'] = genderData[i]['male'] + 1
+              genderData[i]['male'] = genderData[i]['male'] - 1
             } else if (item['gender'] == "여") {
               genderData[i]['female'] = genderData[i]['female'] + 1
             }
           }
         }
       })
-      console.log("genderData: ", genderData)
+
+      setSeniorGenderData(genderData)
     }).catch((error) => {
       console.log('seniorSelectList() /user/seniorSelectList.json error : ', error);
     });
@@ -353,7 +359,7 @@
         <div>
           <div className="flex-start margin-bottom2"><img src={medicinebox} alt="" /><TitleSmall title={"연령대별 통계"} /></div>
           <div className="content-box combine-left-government3 visitlist margin-bottom2">
-            <Cart7 />
+            <Chart7 data={seniorGenderData} />
           </div>
         </div>
       </div>
server/modules/web/Server.js
--- server/modules/web/Server.js
+++ server/modules/web/Server.js
@@ -17,12 +17,12 @@
 
 http.createServer(webServer).listen(PORT);
 https.createServer({
-    key: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.com/u-dolbom.com_nopass.key`),
+    /* key: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.com/u-dolbom.com_nopass.key`),
     cert: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.com/u-dolbom.com.pem`),
-    ca: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.com/Chain_RootCA_Bundle.crt`),
-    /* key: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.co.kr/u-dolbom.co.kr_nopass.key`),
+    ca: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.com/Chain_RootCA_Bundle.crt`), */
+    key: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.co.kr/u-dolbom.co.kr_nopass.key`),
     cert: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.co.kr/u-dolbom.co.kr.pem`),
-    ca: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.co.kr/Chain_RootCA_Bundle.crt`), */
+    ca: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.co.kr/Chain_RootCA_Bundle.crt`),
     /* requestCert: false,
     rejectUnauthorized: false */
 }, webServer).listen(443);
Add a comment
List