From e3f5a482a6394fbda53a319d2d01933103efb1e4 Mon Sep 17 00:00:00 2001 From: JaeguJaegu <118053865+SunwooJaeho@users.noreply.github.com> Date: Fri, 7 Mar 2025 14:19:51 +0900 Subject: [PATCH 01/11] chore(admin): init lucide icons --- apps/admin/package.json | 1 + pnpm-lock.yaml | 35 +++++++++++++++++++---------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/apps/admin/package.json b/apps/admin/package.json index 6e7494e..bd379be 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -28,6 +28,7 @@ "@tanstack/react-router": "^1.104.1", "antd": "^5.24.1", "ky": "^1.7.5", + "lucide-react": "^0.462.0", "react": "catalog:react19", "react-dom": "catalog:react19", "tailwindcss": "^4.0.6" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f61543..d14b465 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,6 +62,9 @@ importers: ky: specifier: ^1.7.5 version: 1.7.5 + lucide-react: + specifier: ^0.462.0 + version: 0.462.0(react@19.0.0) react: specifier: catalog:react19 version: 19.0.0 @@ -5672,9 +5675,9 @@ snapshots: '@storybook/addon-docs@8.4.2(@types/react@19.0.0)(storybook@8.4.2(prettier@3.5.1))(webpack-sources@3.2.3)': dependencies: '@mdx-js/react': 3.1.0(@types/react@19.0.0)(react@18.3.1) - '@storybook/blocks': 8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.5.1)) + '@storybook/blocks': 8.4.2(react-dom@18.3.1(react@19.0.0))(react@18.3.1)(storybook@8.4.2(prettier@3.5.1)) '@storybook/csf-plugin': 8.4.2(storybook@8.4.2(prettier@3.5.1))(webpack-sources@3.2.3) - '@storybook/react-dom-shim': 8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.5.1)) + '@storybook/react-dom-shim': 8.4.2(react-dom@18.3.1(react@19.0.0))(react@18.3.1)(storybook@8.4.2(prettier@3.5.1)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) storybook: 8.4.2(prettier@3.5.1) @@ -5744,24 +5747,24 @@ snapshots: memoizerific: 1.11.3 storybook: 8.4.2(prettier@3.5.1) - '@storybook/blocks@8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.5.1))': + '@storybook/blocks@8.4.2(react-dom@18.3.1(react@18.3.1))(react@19.0.0)(storybook@8.4.2(prettier@3.5.1))': dependencies: '@storybook/csf': 0.1.11 - '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@19.0.0) storybook: 8.4.2(prettier@3.5.1) ts-dedent: 2.2.0 optionalDependencies: - react: 18.3.1 + react: 19.0.0 react-dom: 18.3.1(react@18.3.1) - '@storybook/blocks@8.4.2(react-dom@18.3.1(react@18.3.1))(react@19.0.0)(storybook@8.4.2(prettier@3.5.1))': + '@storybook/blocks@8.4.2(react-dom@18.3.1(react@19.0.0))(react@18.3.1)(storybook@8.4.2(prettier@3.5.1))': dependencies: '@storybook/csf': 0.1.11 - '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@19.0.0) + '@storybook/icons': 1.2.12(react-dom@18.3.1(react@19.0.0))(react@18.3.1) storybook: 8.4.2(prettier@3.5.1) ts-dedent: 2.2.0 optionalDependencies: - react: 19.0.0 + react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@storybook/builder-vite@8.4.2(storybook@8.4.2(prettier@3.5.1))(vite@5.4.9(@types/node@20.16.13)(lightningcss@1.29.1)(terser@5.36.0))(webpack-sources@3.2.3)': @@ -5811,14 +5814,14 @@ snapshots: '@storybook/global@5.0.0': {} - '@storybook/icons@1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/icons@1.2.12(react-dom@18.3.1(react@18.3.1))(react@19.0.0)': dependencies: - react: 18.3.1 + react: 19.0.0 react-dom: 18.3.1(react@18.3.1) - '@storybook/icons@1.2.12(react-dom@18.3.1(react@18.3.1))(react@19.0.0)': + '@storybook/icons@1.2.12(react-dom@18.3.1(react@19.0.0))(react@18.3.1)': dependencies: - react: 19.0.0 + react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@storybook/instrumenter@8.4.2(storybook@8.4.2(prettier@3.5.1))': @@ -5835,15 +5838,15 @@ snapshots: dependencies: storybook: 8.4.2(prettier@3.5.1) - '@storybook/react-dom-shim@8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.5.1))': + '@storybook/react-dom-shim@8.4.2(react-dom@18.3.1(react@18.3.1))(react@19.0.0)(storybook@8.4.2(prettier@3.5.1))': dependencies: - react: 18.3.1 + react: 19.0.0 react-dom: 18.3.1(react@18.3.1) storybook: 8.4.2(prettier@3.5.1) - '@storybook/react-dom-shim@8.4.2(react-dom@18.3.1(react@18.3.1))(react@19.0.0)(storybook@8.4.2(prettier@3.5.1))': + '@storybook/react-dom-shim@8.4.2(react-dom@18.3.1(react@19.0.0))(react@18.3.1)(storybook@8.4.2(prettier@3.5.1))': dependencies: - react: 19.0.0 + react: 18.3.1 react-dom: 18.3.1(react@18.3.1) storybook: 8.4.2(prettier@3.5.1) From c856ecbe90426a3c2046609596ad585d4ffb0f0b Mon Sep 17 00:00:00 2001 From: JaeguJaegu <118053865+SunwooJaeho@users.noreply.github.com> Date: Mon, 10 Mar 2025 13:49:02 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat(admin):=20pretendard=20=ED=8F=B0?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/src/styles/globals.css | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/admin/src/styles/globals.css b/apps/admin/src/styles/globals.css index 347fc3e..a971cf6 100644 --- a/apps/admin/src/styles/globals.css +++ b/apps/admin/src/styles/globals.css @@ -1,5 +1,20 @@ +@import url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/variable/pretendardvariable-dynamic-subset.css"); @import "tailwindcss"; +:root { + font-family: + "Pretendard Variable", Pretendard, -apple-system, + BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", + "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", sans-serif; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + font-size: 16px; +} + .ProseMirror ul ul, .ProseMirror ol ol, .ProseMirror ul ol, From 13e07097142d22379071975471809676b9a3e841 Mon Sep 17 00:00:00 2001 From: JaeguJaegu <118053865+SunwooJaeho@users.noreply.github.com> Date: Mon, 10 Mar 2025 13:50:43 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat(admin):=20aside-navigation-menu=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/src/assets/.gitkeep | 0 apps/admin/src/assets/logo.svg | 1 + .../src/components/aside-navigation-menu.tsx | 87 +++++++++++++++++++ apps/admin/src/routes/__root.tsx | 30 +++++-- apps/admin/src/routes/index.tsx | 4 +- 5 files changed, 114 insertions(+), 8 deletions(-) delete mode 100644 apps/admin/src/assets/.gitkeep create mode 100644 apps/admin/src/assets/logo.svg create mode 100644 apps/admin/src/components/aside-navigation-menu.tsx diff --git a/apps/admin/src/assets/.gitkeep b/apps/admin/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/admin/src/assets/logo.svg b/apps/admin/src/assets/logo.svg new file mode 100644 index 0000000..5fe7912 --- /dev/null +++ b/apps/admin/src/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin/src/components/aside-navigation-menu.tsx b/apps/admin/src/components/aside-navigation-menu.tsx new file mode 100644 index 0000000..df2975b --- /dev/null +++ b/apps/admin/src/components/aside-navigation-menu.tsx @@ -0,0 +1,87 @@ +import { Link } from '@tanstack/react-router'; +import { Menu, type MenuProps } from 'antd'; +import { + Clipboard, + FlaskConical, + GraduationCap, + Speech, + Users, +} from 'lucide-react'; + +import LOGO from '~/assets/logo.svg'; + +type MenuItem = Required['items'][number]; + +const items: MenuItem[] = [ + //TODO: Link 내부 url 변경 + { + key: 'user', + label: '회원 관리', + icon: , + }, + { + key: 'about', + label: '소개', + icon: , + children: [ + { key: 'dept', label: 학부 소개 }, + { key: 'club', label: 동아리 소개 }, + { key: 'contact', label: 찾아오시는 길 }, + ], + }, + { + key: 'professor', + label: 교수진 소개, + icon: , + }, + { + key: 'lab', + label: 연구실 소개, + icon: , + }, + { + key: 'board', + label: '게시판', + icon: , + children: [ + { key: 'notice', label: 공지사항 }, + { key: 'news', label: 학부 소식 }, + ], + }, +]; + +function AsideHeader() { + return ( +
+ logo +
+

AI컴퓨터공학부

+

관리자 시스템

+
+
+ ); +} + +function AsideFooter() { + //TODO: 로그아웃 기능 적용 + return ( +
+ +
+ ); +} + +export default function AsideNavigationMenu() { + return ( + + ); +} diff --git a/apps/admin/src/routes/__root.tsx b/apps/admin/src/routes/__root.tsx index adae2c8..5d76054 100644 --- a/apps/admin/src/routes/__root.tsx +++ b/apps/admin/src/routes/__root.tsx @@ -1,17 +1,35 @@ import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; -import { Outlet, createRootRoute } from '@tanstack/react-router'; +import { Outlet, createRootRoute, useLocation } from '@tanstack/react-router'; import { TanStackRouterDevtools } from '@tanstack/router-devtools'; +import { ConfigProvider } from 'antd'; +import AsideNavigationMenu from '~/components/aside-navigation-menu'; export const Route = createRootRoute({ component: App, }); function App() { + const location = useLocation(); + const isSigninPage = location.pathname === '/'; + return ( - <> - - - - + +
+ {!isSigninPage && } +
+ +
+ + +
+
); } diff --git a/apps/admin/src/routes/index.tsx b/apps/admin/src/routes/index.tsx index 01ac06a..7bc9c05 100644 --- a/apps/admin/src/routes/index.tsx +++ b/apps/admin/src/routes/index.tsx @@ -27,8 +27,8 @@ function SignInPage() { }; return ( -
- +
+ 로그인 From aa307167f91b1c536639dbd2f081903748661aa7 Mon Sep 17 00:00:00 2001 From: JaeguJaegu <118053865+SunwooJaeho@users.noreply.github.com> Date: Mon, 10 Mar 2025 13:57:02 +0900 Subject: [PATCH 04/11] =?UTF-8?q?refactor:=20bg=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/src/components/aside-navigation-menu.tsx | 6 +++--- apps/admin/src/routes/__root.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/admin/src/components/aside-navigation-menu.tsx b/apps/admin/src/components/aside-navigation-menu.tsx index df2975b..bad2049 100644 --- a/apps/admin/src/components/aside-navigation-menu.tsx +++ b/apps/admin/src/components/aside-navigation-menu.tsx @@ -52,7 +52,7 @@ const items: MenuItem[] = [ function AsideHeader() { return ( -
+
logo

AI컴퓨터공학부

@@ -65,7 +65,7 @@ function AsideHeader() { function AsideFooter() { //TODO: 로그아웃 기능 적용 return ( -
+
+
+
+ + {formatExpireTime(expireTime)} +
+
+ + +
); } diff --git a/apps/admin/src/utils/.gitkeep b/apps/admin/src/utils/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/admin/src/utils/utils.ts b/apps/admin/src/utils/utils.ts new file mode 100644 index 0000000..3d68bc8 --- /dev/null +++ b/apps/admin/src/utils/utils.ts @@ -0,0 +1,9 @@ +export const formatExpireTime = (times: number | null) => { + if (times === null || times <= 0) return null; + + const totalSeconds = Math.floor(times / 1000); + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + + return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`; +}; From 46079be4e4010982b97a22fc3246286b3d24dd97 Mon Sep 17 00:00:00 2001 From: JaeguJaegu <118053865+SunwooJaeho@users.noreply.github.com> Date: Wed, 12 Mar 2025 14:59:17 +0900 Subject: [PATCH 11/11] chore: change file name --- apps/admin/src/components/aside-navigation-menu.tsx | 2 +- .../hooks/{use-token-experation.ts => use-token-expiration.ts} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename apps/admin/src/hooks/{use-token-experation.ts => use-token-expiration.ts} (100%) diff --git a/apps/admin/src/components/aside-navigation-menu.tsx b/apps/admin/src/components/aside-navigation-menu.tsx index bd42e4b..0699756 100644 --- a/apps/admin/src/components/aside-navigation-menu.tsx +++ b/apps/admin/src/components/aside-navigation-menu.tsx @@ -11,7 +11,7 @@ import { import LOGO from '~/assets/logo.svg'; import { useRefreshTokens } from '~/hooks/use-refresh-token'; -import { useTokenExpiration } from '~/hooks/use-token-experation'; +import { useTokenExpiration } from '~/hooks/use-token-expiration'; import { authServices } from '~/utils/auth'; import { formatExpireTime } from '~/utils/utils'; diff --git a/apps/admin/src/hooks/use-token-experation.ts b/apps/admin/src/hooks/use-token-expiration.ts similarity index 100% rename from apps/admin/src/hooks/use-token-experation.ts rename to apps/admin/src/hooks/use-token-expiration.ts