배너 및 지원현황 추가

This commit is contained in:
2025-12-12 18:08:59 +09:00
parent 2ecb9811bd
commit b746db5638
10 changed files with 190 additions and 86 deletions
+3 -3
View File
@@ -1,7 +1,7 @@
# apps/cs/src/shared/config/env.ts 참고
NEXT_PUBLIC_PORT=3000
NEXT_PUBLIC_PROXY_HOST=http://localhost:3000
NEXT_PUBLIC_PORT=3001
NEXT_PUBLIC_PROXY_HOST=http://localhost:3001
NEXT_PUBLIC_SITE_ID=CS
NEXT_PUBLIC_SUB_DOMAIN=http://localhost:3000
NEXT_PUBLIC_SUB_DOMAIN=http://localhost:13000
NEXT_PUBLIC_SERVER_API_URL=http://192.168.0.102:8000
NEXT_PUBLIC_TINY_API_KEY=t9nc4z6inquvvd5pq1vea8wcp7lb01qmqseh6egms9vpaju2
@@ -0,0 +1,42 @@
import { client } from "@/shared/api";
import { ENDPOINT } from "@/shared/config";
export interface Support {
total: number;
ongoing: number;
han: number;
youngsang: number;
geum: number;
nakdong: number;
type: string;
}
export const getSupportList = async () => {
const url = `/api/proxy${ENDPOINT.IC_SERVICE.GROUPING_STATISTICS}`;
console.log("[getSupportList] API 호출 시작 (프록시, 인증 없음):", url);
try {
const response = await fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
accept: "application/json",
},
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log("[getSupportList] API 응답 성공:", data);
return data;
} catch (error: any) {
console.error("[getSupportList] API 호출 실패:", {
url,
error,
status: error?.status,
message: error?.message,
});
throw error;
}
};
@@ -0,0 +1,49 @@
import type { ColumnDef } from "@tanstack/react-table";
import type { Support } from "../api/support";
const typeLabelMap: Record<string, string> = {
waterQuality: "수질",
flood: "침수",
technical: "기술지원",
};
const supportTableColumns: ColumnDef<Support>[] = [
{
accessorKey: "type",
header: "구분",
cell: ({ getValue }) => {
const value = getValue() as string;
return typeLabelMap[value] || value;
},
},
{
accessorKey: "total",
header: "합계",
},
{
accessorKey: "han",
header: "한강",
},
{
accessorKey: "nakdong",
header: "낙동강",
},
{
accessorKey: "geum",
header: "금강",
},
{
accessorKey: "youngsang",
header: "영산강",
},
{
accessorKey: "ongoing",
header: "진행중",
},
{
accessorKey: "completed",
header: "환료",
},
];
export { supportTableColumns };
@@ -3,7 +3,7 @@
import { useRef } from "react";
import { useQuery } from "@tanstack/react-query";
import { ENDPOINT } from "@/shared/config";
import { getImageUrlByAtflCd, getBannerList } from "../api/banner";
import { getImageUrlByAtflCd, getBannerList, type Banner } from "../api/banner";
import { getCookie } from "@/shared/lib";
import {
@@ -63,7 +63,7 @@ const BannerList: React.FC = () => {
</div>
);
};
const { data: bannerList, error: bannerError, isLoading: isLoadingBanners } = useQuery({
const { data: bannerList, error: bannerError, isLoading: isLoadingBanners } = useQuery<Banner[]>({
queryKey: [ENDPOINT.CMS_SERVICE.BANNERS, siteId],
queryFn: () => getBannerList(siteId),
enabled: !!siteId,
@@ -26,6 +26,7 @@ import ReuseChart from "./reuse-chart";
import ReuseStatus from "./reuse-status";
import NoticeList from "./notice-list";
import BannerList from "./banner-list";
import SupportList from "./support-list";
// Chart.js 등록
ChartJS.register(
@@ -183,13 +184,8 @@ function DashboardPage() {
{/* 두번째 라인 */}
<div className="grid grid-cols-4 gap-1">
<div className="card card-border" id="grouping-statistics">
<div className="card-header text-foreground">
<h3 className="text-2xl font-medium">지원현황</h3>
</div>
<div className="h-70 p-4">
</div>
<div className="card card-border">
<SupportList />
</div>
<div className="card card-border">
<div className="card-header text-foreground">
@@ -0,0 +1,43 @@
"use client";
import { useRouter } from "next/navigation";
import { useQuery } from "@tanstack/react-query";
import { getCoreRowModel } from "@tanstack/react-table";
import { ENDPOINT } from "@/shared/config";
import { useDataTable } from "@/shared/lib";
import {
supportTableColumns,
} from "../model/support-columns";
import { getSupportList } from "../api/support";
const SupportList: React.FC = () => {
const router = useRouter();
const supportQuery = useQuery({
queryKey: [ENDPOINT.BOARD_SERVICE.POSTS],
queryFn: () =>
getSupportList(),
});
const { tableComponent: supportTableComponent } = useDataTable({
query: supportQuery,
tableOptions: {
columns: supportTableColumns,
getCoreRowModel: getCoreRowModel(),
},
dataTableOptions: {
variant: "line",
},
});
return (
<div className="card card-border !p-0">
<div className="card-header !m-0 !border-none text-foreground">
<h3 className="text-2xl font-medium">지원현황</h3>
</div>
{supportTableComponent}
</div>
);
};
export default SupportList;
+1 -1
View File
@@ -82,7 +82,7 @@ export const ENDPOINT = {
REUSE_STATUS: "/operation-service/api/v1/dashBoard/main/reuse/status",
},
IC_SERVICE: {
GROUPING_STATISTICS: "/ic-service/api/v1/nti/grouping-statistics",
GROUPING_STATISTICS: "/ic-service/api/v1/support-status-summary",
},
DC_SERVICE: {
DATA_STATUS: "/dc-service/api/v1/dataStatus",
+1
View File
@@ -24,6 +24,7 @@
"js-cookie": "^3.0.5",
"lucide-react": "^0.474.0",
"next": "15.3.8",
"picocolors": "^1.1.1",
"react-chartjs-2": "^5.3.0",
"react-dnd": "^16.0.1",
"react-dropzone": "^14.3.8",
+4 -1
View File
@@ -45,7 +45,10 @@
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"react": "^19.2.1",
"react-dom": "^19.2.1"
"react-dom": "^19.2.1",
"lodash.isequal": "^4.5.0",
"source-map": "^0.7.4"
},
"onlyBuiltDependencies": [
"esbuild",
+42 -72
View File
@@ -9,6 +9,8 @@ overrides:
'@types/react-dom': ^19.2.3
react: ^19.2.1
react-dom: ^19.2.1
lodash.isequal: ^4.5.0
source-map: ^0.7.4
importers:
@@ -168,10 +170,10 @@ importers:
version: 5.28.5
eslint:
specifier: ^9.0.0
version: 9.39.1(jiti@2.6.1)
version: 9.39.1(jiti@1.21.7)
eslint-config-next:
specifier: 15.4.0
version: 15.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
version: 15.4.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)
postcss:
specifier: ^8.4.49
version: 8.5.6
@@ -298,10 +300,10 @@ importers:
version: 5.28.5
eslint:
specifier: ^9
version: 9.39.1(jiti@1.21.7)
version: 9.39.1(jiti@2.6.1)
eslint-config-next:
specifier: 15.1.7
version: 15.1.7(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)
version: 15.1.7(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
postcss:
specifier: ^8
version: 8.5.6
@@ -516,6 +518,9 @@ importers:
next:
specifier: 15.3.8
version: 15.3.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
picocolors:
specifier: ^1.1.1
version: 1.1.1
react-chartjs-2:
specifier: ^5.3.0
version: 5.3.1(chart.js@4.5.1)(react@19.2.3)
@@ -4644,8 +4649,8 @@ packages:
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
fast-equals@5.3.3:
resolution: {integrity: sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==}
fast-equals@5.3.4:
resolution: {integrity: sha512-d+yU9iNQbbC098NOuMlAIth/g+owbpX/uuOkH/DQcC2fMMyjOlX292Op29DrUKq388m4UUyOdWakUH/msGypOg==}
engines: {node: '>=6.0.0'}
fast-glob@3.3.1:
@@ -5336,9 +5341,6 @@ packages:
lodash.size@4.2.0:
resolution: {integrity: sha512-wbu3SF1XC5ijqm0piNxw59yCbuUf2kaShumYBLWUrcCvwh6C8odz6SY/wGVzCWTQTFL/1Ygbvqg2eLtspUVVAQ==}
lodash.sortby@4.7.0:
resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
lodash.throttle@4.1.1:
resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
@@ -6276,14 +6278,9 @@ packages:
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
source-map@0.8.0-beta.0:
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
engines: {node: '>= 8'}
deprecated: The work that was done in this beta branch won't be included in future versions
source-map@0.7.6:
resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
engines: {node: '>= 12'}
ssf@0.11.2:
resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==}
@@ -6481,9 +6478,6 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
tr46@1.0.1:
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
tree-kill@1.2.2:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
@@ -6778,9 +6772,6 @@ packages:
web-worker@1.5.0:
resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==}
webidl-conversions@4.0.2:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
webpack-sources@3.3.3:
resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==}
engines: {node: '>=10.13.0'}
@@ -6798,9 +6789,6 @@ packages:
webpack-cli:
optional: true
whatwg-url@7.1.0:
resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
which-boxed-primitive@1.1.1:
resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
engines: {node: '>= 0.4'}
@@ -10090,27 +10078,7 @@ snapshots:
estraverse: 5.3.0
esutils: 2.0.3
optionalDependencies:
source-map: 0.6.1
eslint-config-next@15.1.7(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3):
dependencies:
'@next/eslint-plugin-next': 15.1.7
'@rushstack/eslint-patch': 1.15.0
'@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)
'@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)
eslint: 9.39.1(jiti@1.21.7)
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@1.21.7))
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@1.21.7))
eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@1.21.7))
eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@1.21.7))
optionalDependencies:
typescript: 5.9.3
transitivePeerDependencies:
- eslint-import-resolver-webpack
- eslint-plugin-import-x
- supports-color
source-map: 0.7.6
eslint-config-next@15.1.7(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3):
dependencies:
@@ -10132,6 +10100,26 @@ snapshots:
- eslint-plugin-import-x
- supports-color
eslint-config-next@15.4.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3):
dependencies:
'@next/eslint-plugin-next': 15.4.0
'@rushstack/eslint-patch': 1.15.0
'@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)
'@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)
eslint: 9.39.1(jiti@1.21.7)
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@1.21.7))
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@1.21.7))
eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@1.21.7))
eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@1.21.7))
optionalDependencies:
typescript: 5.9.3
transitivePeerDependencies:
- eslint-import-resolver-webpack
- eslint-plugin-import-x
- supports-color
eslint-config-next@15.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3):
dependencies:
'@next/eslint-plugin-next': 15.4.0
@@ -10504,7 +10492,7 @@ snapshots:
fast-deep-equal@3.1.3: {}
fast-equals@5.3.3: {}
fast-equals@5.3.4: {}
fast-glob@3.3.1:
dependencies:
@@ -11133,8 +11121,6 @@ snapshots:
lodash.size@4.2.0: {}
lodash.sortby@4.7.0: {}
lodash.throttle@4.1.1: {}
lodash.uniqby@4.5.0:
@@ -11734,7 +11720,7 @@ snapshots:
react-smooth@4.0.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies:
fast-equals: 5.3.3
fast-equals: 5.3.4
prop-types: 15.8.1
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
@@ -11789,7 +11775,7 @@ snapshots:
dependencies:
ast-types: 0.16.1
esprima: 4.0.1
source-map: 0.6.1
source-map: 0.7.6
tiny-invariant: 1.3.3
tslib: 2.8.1
@@ -12070,13 +12056,9 @@ snapshots:
source-map-support@0.5.21:
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
source-map: 0.7.6
source-map@0.6.1: {}
source-map@0.8.0-beta.0:
dependencies:
whatwg-url: 7.1.0
source-map@0.7.6: {}
ssf@0.11.2:
dependencies:
@@ -12324,10 +12306,6 @@ snapshots:
dependencies:
is-number: 7.0.0
tr46@1.0.1:
dependencies:
punycode: 2.3.1
tree-kill@1.2.2: {}
ts-api-utils@2.1.0(typescript@5.6.3):
@@ -12378,7 +12356,7 @@ snapshots:
postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)
resolve-from: 5.0.0
rollup: 4.53.3
source-map: 0.8.0-beta.0
source-map: 0.7.6
sucrase: 3.35.1
tinyexec: 0.3.2
tinyglobby: 0.2.15
@@ -12405,7 +12383,7 @@ snapshots:
postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)
resolve-from: 5.0.0
rollup: 4.53.3
source-map: 0.8.0-beta.0
source-map: 0.7.6
sucrase: 3.35.1
tinyexec: 0.3.2
tinyglobby: 0.2.15
@@ -12663,8 +12641,6 @@ snapshots:
web-worker@1.5.0: {}
webidl-conversions@4.0.2: {}
webpack-sources@3.3.3: {}
webpack-virtual-modules@0.6.2: {}
@@ -12701,12 +12677,6 @@ snapshots:
- esbuild
- uglify-js
whatwg-url@7.1.0:
dependencies:
lodash.sortby: 4.7.0
tr46: 1.0.1
webidl-conversions: 4.0.2
which-boxed-primitive@1.1.1:
dependencies:
is-bigint: 1.1.0