From 8e22399ec4b06bab02d026d4d9e6de0e9a17ed1a Mon Sep 17 00:00:00 2001 From: "Lim\\jun" Date: Wed, 7 Feb 2024 18:52:29 +0900 Subject: [PATCH] =?UTF-8?q?Dashboard=20-=20=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/schedule/EgovAdminScheduleList.jsx | 11 +++- .../pages/admin/schedule/MonthlyBarChart.jsx | 58 ++++++++++++++++--- .../dashboard/AdminDashboardController.java | 23 ++++++++ .../repository/MenuMonthlyRepository.java | 21 ++++++- .../service/AdminDashboardService.java | 2 +- 5 files changed, 101 insertions(+), 14 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/schedule/EgovAdminScheduleList.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/schedule/EgovAdminScheduleList.jsx index 3ca47cb..b1ec2ec 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/schedule/EgovAdminScheduleList.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/schedule/EgovAdminScheduleList.jsx @@ -198,6 +198,13 @@ function EgovAdminDashboard(props) { // const [value, setValue] = useState('today'); const [slot, setSlot] = useState('week'); + const [totalDownloads, setTotalDownloads] = useState(0); + + // 총 다운로드 수를 받아온 후 state 업데이트 + const handleTotalDownloads = (sum) => { + setTotalDownloads(sum); + console.log(sum); + }; return (
@@ -290,10 +297,10 @@ function EgovAdminDashboard(props) { 주간 현황 - 총 2,300건 + 총 {totalDownloads}건 - + diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/schedule/MonthlyBarChart.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/schedule/MonthlyBarChart.jsx index 12e157e..e77cf40 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/schedule/MonthlyBarChart.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/schedule/MonthlyBarChart.jsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import {useCallback, useEffect, useState} from 'react'; // material-ui import { useTheme } from '@mui/material/styles'; @@ -6,6 +6,8 @@ import { useTheme } from '@mui/material/styles'; // third-party import ReactApexChart from 'react-apexcharts'; +import * as EgovNet from 'api/egovFetch'; + // chart options const barChartOptions = { chart: { @@ -22,7 +24,7 @@ const barChartOptions = { } }, dataLabels: { - enabled: false + enabled: true }, xaxis: { categories: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'], @@ -43,37 +45,75 @@ const barChartOptions = { // ==============================|| MONTHLY BAR CHART ||============================== // -const MonthlyBarChart = () => { +const MonthlyBarChart = ({ onDataFetched }) => { const theme = useTheme(); const { primary, secondary } = theme.palette.text; const info = theme.palette.info.light; - const [series] = useState([ + const [options, setOptions] = useState(barChartOptions); + const [fileDailyList, setFileDailyList] = useState([]); + + // 메뉴 접속 및 방문자 수 + const retrieveList = useCallback(() => { + const retrieveListURL = '/admin/dashboard/file' + + const requestOptions = { + method: "POST", + headers: { + 'Content-type': 'application/json', + }, + // body: JSON.stringify() + } + + EgovNet.requestFetch(retrieveListURL, + requestOptions, + (resp) => { + setFileDailyList(resp.result.fileDailyList); + const sum = resp.result.fileDailyList.reduce((accumulator, currentValue) => accumulator + currentValue, 0); + onDataFetched(sum); + }, + function (resp) { + console.log("err response : ", resp); + } + ); + // eslint-disable-next-lie react-hooks/exhaustive-deps + }, []); + + const [series, setSeries] = useState([ { - data: [80, 95, 70, 42, 65, 55, 78] + data: fileDailyList } ]); - const [options, setOptions] = useState(barChartOptions); + useEffect(() => { + retrieveList(); + }, [onDataFetched]); useEffect(() => { + setSeries([ + { + data: fileDailyList + }, + ]); + setOptions((prevState) => ({ ...prevState, colors: [info], + // labels: ['PC', 'Mobile', 'Mobile', 'Mobile', 'Mobile', 'Mobile', 'Mobile'], xaxis: { labels: { style: { - colors: [secondary, secondary, secondary, secondary, secondary, secondary, secondary] + colors: [primary, secondary, secondary, secondary, secondary, secondary, secondary] } } }, tooltip: { theme: 'light' - } + }, })); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [primary, info, secondary]); + }, [primary, info, secondary, fileDailyList]); return (
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/AdminDashboardController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/AdminDashboardController.java index 317fa1a..1358ff0 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/AdminDashboardController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/AdminDashboardController.java @@ -61,6 +61,29 @@ public class AdminDashboardController extends BaseController { } + @Operation( + summary = "이번주 다운로드 조회", + description = "이번주 다운로드 조회", + tags = {"AdminDashboardController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.POST, value = "/file", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO getfile(@AuthenticationPrincipal LoginVO user) + throws Exception { + + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + + resultMap.put("fileDailyList", adminDashboardService.selectFileDaily()); + + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + resultVO.setResult(resultMap); + return resultVO; + } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/repository/MenuMonthlyRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/repository/MenuMonthlyRepository.java index 8f07b52..0000955 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/repository/MenuMonthlyRepository.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/repository/MenuMonthlyRepository.java @@ -25,9 +25,9 @@ public interface MenuMonthlyRepository extends JpaRepository MenuDailyList(); @@ -62,5 +62,22 @@ public interface MenuMonthlyRepository extends JpaRepository LoginDailyList(); + + + + @Query(value = "WITH all_days AS (" + + " SELECT generate_series(" + + " DATE_TRUNC('year', CURRENT_DATE)," + + " DATE_TRUNC('year', CURRENT_DATE) + INTERVAL '1 year' - INTERVAL '1 day'," + + " INTERVAL '1 day'" + + " ) AS day" + + ")" + + "SELECT COALESCE(COUNT(tn.access_dt), 0) AS log_cnt " + + "FROM all_days ad " + + "LEFT JOIN (SELECT access_dt FROM public.th_attach_file_log WHERE\n" + + " access_dt >= CURRENT_DATE - INTERVAL '6 day') tn ON ad.day = DATE_TRUNC('day', tn.access_dt) " + + "GROUP BY TO_CHAR(ad.day, 'Day') " + + "ORDER BY MIN(ad.day)", nativeQuery = true) + List FileDailyList(); } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/service/AdminDashboardService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/service/AdminDashboardService.java index 500ec46..29a93dc 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/service/AdminDashboardService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/dashboard/service/AdminDashboardService.java @@ -24,7 +24,7 @@ public class AdminDashboardService extends EgovAbstractServiceImpl { public List selectLoginDaily() { return menuMonthlyRepository.LoginDailyList(); } - + public List selectFileDaily() { return menuMonthlyRepository.FileDailyList(); }