From 44b820c62e6c6616cd5de8a27b35cdc0b3898315 Mon Sep 17 00:00:00 2001 From: bicochan Date: Mon, 28 Apr 2025 11:23:54 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/app/(with-base-layout)/bbs/page.tsx | 2 + .../src/entities/board/api/board-service.ts | 10 ++ apps/cs/src/entities/board/index.ts | 6 +- .../entities/board/model/board-interface.ts | 35 ++++- apps/cs/src/pages/bbs/index.ts | 1 + apps/cs/src/pages/bbs/model/table-columns.tsx | 41 +++++ apps/cs/src/pages/bbs/ui/bbs-page.tsx | 143 ++++++++++++++++++ 7 files changed, 234 insertions(+), 4 deletions(-) create mode 100644 apps/cs/app/(with-base-layout)/bbs/page.tsx create mode 100644 apps/cs/src/pages/bbs/index.ts create mode 100644 apps/cs/src/pages/bbs/model/table-columns.tsx create mode 100644 apps/cs/src/pages/bbs/ui/bbs-page.tsx diff --git a/apps/cs/app/(with-base-layout)/bbs/page.tsx b/apps/cs/app/(with-base-layout)/bbs/page.tsx new file mode 100644 index 000000000..d9aab376a --- /dev/null +++ b/apps/cs/app/(with-base-layout)/bbs/page.tsx @@ -0,0 +1,2 @@ +import { BbsPage } from "@/pages/bbs"; +export default BbsPage; diff --git a/apps/cs/src/entities/board/api/board-service.ts b/apps/cs/src/entities/board/api/board-service.ts index 9cf29599b..2ba0f55fd 100644 --- a/apps/cs/src/entities/board/api/board-service.ts +++ b/apps/cs/src/entities/board/api/board-service.ts @@ -1,12 +1,22 @@ import { client } from "@/shared/api"; import { ENDPOINT } from "@/shared/config"; import type { + BoardList, + BoardParams, BoardPopupList, BoardPopupParams, BoardService, } from "../model/board-interface"; export class BoardApiService implements BoardService { + public async getBoardList(params: BoardParams): Promise { + const response = await client.get( + `${ENDPOINT.BOARD_SERVICE.BBS}`, + { params }, + ); + return response.data; + } + public async getBoardPopupList( params: BoardPopupParams, ): Promise { diff --git a/apps/cs/src/entities/board/index.ts b/apps/cs/src/entities/board/index.ts index 2173bb4a0..73229695f 100644 --- a/apps/cs/src/entities/board/index.ts +++ b/apps/cs/src/entities/board/index.ts @@ -1,2 +1,6 @@ export { BoardApi } from "./api/board-service"; -export { type BoardPopup } from "./model/board-interface"; +export { + type Board, + type BoardParams, + type BoardPopup, +} from "./model/board-interface"; diff --git a/apps/cs/src/entities/board/model/board-interface.ts b/apps/cs/src/entities/board/model/board-interface.ts index 942840d74..ccfebdaed 100644 --- a/apps/cs/src/entities/board/model/board-interface.ts +++ b/apps/cs/src/entities/board/model/board-interface.ts @@ -9,13 +9,34 @@ export const BOARD_TYPE = { export type BoardType = (typeof BOARD_TYPE)[keyof typeof BOARD_TYPE]; +export interface BoardParams extends PageableParams { + keywordType?: string; + keyword?: string; + bbsId?: number; + bbsTypeCd?: string; + bbsNm?: string; + bbsExpln?: string; + rfrncUseYn?: string; + atflUseYn?: string; + atflMaxCnt?: number; + atflMaxFileSz?: number; + ansUseYn?: string; + cmntUseYn?: string; + dgstfnEvlUseYn?: string; + smsUseYn?: string; + upndFixUseYn?: string; + pstgPrdUseYn?: string; + popupUseYn?: string; + delYn?: string; +} + export interface BoardPopupParams extends PageableParams { bbsNm?: string; } -export interface BoardPopup { +export interface Board { bbsId: number; - bbsTypeCd: BoardType; + bbsTypeCd: string; bbsTypeNm: string; bbsNm: string; bbsExpln: string; @@ -24,6 +45,7 @@ export interface BoardPopup { atflMaxCnt: number; atflMaxFileSz: number; ansUseYn: string; + ansUseAuthrt: string; cmntUseYn: string; dgstfnEvlUseYn: string; smsUseYn: string; @@ -31,12 +53,19 @@ export interface BoardPopup { pstgPrdUseYn: string; popupUseYn: string; delYn: string; - regDt: string; + useYn: string; + mdfcnDt: string; + mdfrNm: string; +} + +export interface BoardPopup extends Board { pstCnt: number; } +export type BoardList = PageableList; export type BoardPopupList = PageableList; export interface BoardService { + getBoardList: (params: BoardParams) => Promise; getBoardPopupList: (params: BoardPopupParams) => Promise; } diff --git a/apps/cs/src/pages/bbs/index.ts b/apps/cs/src/pages/bbs/index.ts new file mode 100644 index 000000000..acdf5e213 --- /dev/null +++ b/apps/cs/src/pages/bbs/index.ts @@ -0,0 +1 @@ +export { BbsPage } from "./ui/bbs-page"; diff --git a/apps/cs/src/pages/bbs/model/table-columns.tsx b/apps/cs/src/pages/bbs/model/table-columns.tsx new file mode 100644 index 000000000..697f953a7 --- /dev/null +++ b/apps/cs/src/pages/bbs/model/table-columns.tsx @@ -0,0 +1,41 @@ +import dayjs from "dayjs"; +import type { ColumnDef } from "@tanstack/react-table"; +import { Button } from "@common/components/ui"; +import type { Board } from "@/entities/board/model/board-interface"; + +export const columns: ColumnDef[] = [ + { + id: "no", + header: "NO", + cell: ({ row }) => row.index + 1, + }, + { + accessorKey: "bbsNm", + header: "게시판명", + }, + { + accessorKey: "bbsTypeNm", + header: "게시판유형", + }, + { + accessorKey: "mdfrNm", + header: "최종수정자", + }, + { + accessorKey: "mdfcnDt", + header: "최종수정일", + cell: ({ row }) => + row.original.mdfcnDt + ? dayjs(row.original.mdfcnDt).format("YYYY-MM-DD") + : "", + }, + { + accessorKey: "useYn", + header: "사용여부", + }, + { + id: "actions", + header: "관리", + cell: () => , + }, +]; diff --git a/apps/cs/src/pages/bbs/ui/bbs-page.tsx b/apps/cs/src/pages/bbs/ui/bbs-page.tsx new file mode 100644 index 000000000..393ee957b --- /dev/null +++ b/apps/cs/src/pages/bbs/ui/bbs-page.tsx @@ -0,0 +1,143 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { + getCoreRowModel, + useReactTable, + type PaginationState, + type RowSelectionState, +} from "@tanstack/react-table"; +import { + Button, + DataTable, + Input, + Label, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@common/components"; +import { CodeSelect } from "@/entities/code"; +import { BoardApi, type BoardParams } from "@/entities/board"; +import { ENDPOINT } from "@/shared/config"; +import { type Board } from "@/entities/board"; +import { columns } from "../model/table-columns"; + +function BbsPage() { + const router = useRouter(); + + const [rowSelection, setRowSelection] = useState({}); + const [boardParams, setBoardParams] = useState({ + bbsTypeCd: "", + bbsNm: "", + }); + const [pagination, setPagination] = useState({ + pageIndex: 0, + pageSize: 10, + }); + + const { data: boardList, refetch } = useQuery({ + queryKey: [ENDPOINT.BOARD_SERVICE.BBS], + queryFn: () => + BoardApi.getBoardList({ + ...boardParams, + page: pagination.pageIndex, + size: pagination.pageSize, + }), + enabled: false, + }); + + const table = useReactTable({ + data: boardList?.content ?? [], + columns, + state: { + pagination, + rowSelection, + }, + rowCount: boardList?.totalElements ?? 0, + manualPagination: true, + enableMultiRowSelection: true, + getCoreRowModel: getCoreRowModel(), + onPaginationChange: setPagination, + onRowSelectionChange: setRowSelection, + }); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + refetch(); + }; + + const handleRowClick = (row: Board) => {}; + + useEffect(() => { + refetch(); + }, [pagination]); + + return ( +
+
+
+ + + setBoardParams({ ...boardParams, bbsTypeCd: value }) + } + /> + + + setBoardParams({ ...boardParams, bbsNm: e.target.value }) + } + /> + + +
+
+
+
+

게시판 목록

+
+ + +
+
+
+
+ +
+
+
+ ); +} + +export { BbsPage };