From f6d919f8618505b67a3ce3d6770e3982c78b35c7 Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Mon, 5 May 2025 01:07:43 +0900 Subject: [PATCH 01/27] =?UTF-8?q?[fix]:=20InputBlock=20component=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20reset.css=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/App.css | 42 ----- frontend/src/App.jsx | 8 +- frontend/src/assets/reset.css | 161 ++++++++++++++++++ frontend/src/components/InputBlock.jsx | 17 +- .../components/componentsCss/InfoBlock.css | 5 + frontend/src/index.css | 68 -------- frontend/src/main.jsx | 2 +- 7 files changed, 183 insertions(+), 120 deletions(-) delete mode 100644 frontend/src/App.css create mode 100644 frontend/src/assets/reset.css delete mode 100644 frontend/src/index.css diff --git a/frontend/src/App.css b/frontend/src/App.css deleted file mode 100644 index b9d355d..0000000 --- a/frontend/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index d535b0e..f2c29bc 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -7,7 +7,13 @@ function App() { return ( <>
- + { +const InputBlock = ({ inputs }) => { return (
- - - + {inputs.map((input, index) => ( + + ))}
); }; diff --git a/frontend/src/components/componentsCss/InfoBlock.css b/frontend/src/components/componentsCss/InfoBlock.css index cc36177..73b7438 100644 --- a/frontend/src/components/componentsCss/InfoBlock.css +++ b/frontend/src/components/componentsCss/InfoBlock.css @@ -7,4 +7,9 @@ font-weight: 400; font-size: 16px; font-family: "Noto Sans KR", sans-serif; + border: 1px var(--background-black) solid; + padding: 10px; +} +.inputTag:focus { + border: 1px var(--main-green) solid; } diff --git a/frontend/src/index.css b/frontend/src/index.css deleted file mode 100644 index 08a3ac9..0000000 --- a/frontend/src/index.css +++ /dev/null @@ -1,68 +0,0 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index bafbc51..ac0c4ce 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,8 +1,8 @@ import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; -import "./index.css"; import App from "./App.jsx"; import "./assets/root.css"; +import "./assets/reset.css"; createRoot(document.getElementById("root")).render( From 531ffc2ecbaf032304458673bcc3c86b9b317b5f Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Mon, 5 May 2025 01:22:57 +0900 Subject: [PATCH 02/27] resolve conflict: keep index.css, App.css deleted --- frontend/src/index.css | 70 ------------------------------------------ 1 file changed, 70 deletions(-) delete mode 100644 frontend/src/index.css diff --git a/frontend/src/index.css b/frontend/src/index.css deleted file mode 100644 index 0e256a2..0000000 --- a/frontend/src/index.css +++ /dev/null @@ -1,70 +0,0 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} - - From 906cf8cc2d8a212269465873ee178f562d5d68ba Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Mon, 5 May 2025 20:44:42 +0900 Subject: [PATCH 03/27] [feat]add Assignment, deposit, Home, Login page/Initial setup: routing with react-router-dom --- frontend/src/App.jsx | 36 ++++----- frontend/src/Assignment.jsx | 9 +++ frontend/src/Deposit.jsx | 9 +++ frontend/src/Home.jsx | 26 +++++++ frontend/src/Login.jsx | 14 ++++ frontend/src/assets/img/home.svg | 9 +++ frontend/src/main.jsx | 5 +- frontend/yarn.lock | 126 +++++++++++++++---------------- 8 files changed, 146 insertions(+), 88 deletions(-) create mode 100644 frontend/src/Assignment.jsx create mode 100644 frontend/src/Deposit.jsx create mode 100644 frontend/src/Home.jsx create mode 100644 frontend/src/Login.jsx create mode 100644 frontend/src/assets/img/home.svg diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 533a5f5..8c8abc6 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,30 +1,20 @@ import React from "react"; -import InputBlock from "./components/InputBlock"; -import InfoBlock from "./components/InfoBlock"; -import PageBtn from "./components/PageBtn"; -import Header from "./components/Header"; +import { BrowserRouter, Routes, Route } from "react-router-dom"; +import Login from "./Login"; +import Home from "./Home"; +import Assignment from "./Assignment"; +import Deposit from "./Deposit"; function App() { return ( - <> -
-
- - - -
- + + + } /> + } /> + } /> + } /> + + ); } diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx new file mode 100644 index 0000000..581f00a --- /dev/null +++ b/frontend/src/Assignment.jsx @@ -0,0 +1,9 @@ +const Assignment = () => { + return ( +
+

Assignment

+

This is the assignment page.

+
+ ); +}; +export default Assignment; diff --git a/frontend/src/Deposit.jsx b/frontend/src/Deposit.jsx new file mode 100644 index 0000000..295c538 --- /dev/null +++ b/frontend/src/Deposit.jsx @@ -0,0 +1,9 @@ +const Deposit = () => { + return ( +
+

Deposit Page

+

This is the deposit page.

+
+ ); +}; +export default Deposit; diff --git a/frontend/src/Home.jsx b/frontend/src/Home.jsx new file mode 100644 index 0000000..db58368 --- /dev/null +++ b/frontend/src/Home.jsx @@ -0,0 +1,26 @@ +import React, { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import homeLogo from "./assets/img/home.svg"; + +const Home = () => { + const navigate = useNavigate(); + + useEffect(() => { + const timer = setTimeout(() => { + navigate("/login"); + }, 2000); + + return () => clearTimeout(timer); + }, [navigate]); + + return ( +
+
+

PIROCHECK

+ PiroCheck Logo +
+
+ ); +}; + +export default Home; diff --git a/frontend/src/Login.jsx b/frontend/src/Login.jsx new file mode 100644 index 0000000..06d3ddb --- /dev/null +++ b/frontend/src/Login.jsx @@ -0,0 +1,14 @@ +import React from "react"; + +const Login = ({ onLogin }) => { + return ( +
+

로그인 페이지

+ + + +
+ ); +}; + +export default Login; diff --git a/frontend/src/assets/img/home.svg b/frontend/src/assets/img/home.svg new file mode 100644 index 0000000..9b5895e --- /dev/null +++ b/frontend/src/assets/img/home.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index f6015f1..0b2945d 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -3,9 +3,10 @@ import App from "./App.jsx"; import "./assets/root.css"; import { BrowserRouter } from "react-router-dom"; import "./assets/reset.css"; +import { StrictMode } from "react"; createRoot(document.getElementById("root")).render( - + - + ); diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 736512a..9b621ab 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -24,7 +24,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz" integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.26.10": +"@babel/core@^7.26.10": version "7.27.1" resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz" integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== @@ -165,22 +165,22 @@ "@esbuild/aix-ppc64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz#014180d9a149cffd95aaeead37179433f5ea5437" integrity sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ== -"@esbuild/android-arm@0.25.3": - version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz" - integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A== - "@esbuild/android-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz#649e47e04ddb24a27dc05c395724bc5f4c55cbfe" integrity sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ== +"@esbuild/android-arm@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.3.tgz#8a0f719c8dc28a4a6567ef7328c36ea85f568ff4" + integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A== + "@esbuild/android-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.3.tgz#e2ab182d1fd06da9bef0784a13c28a7602d78009" integrity sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ== "@esbuild/darwin-arm64@0.25.3": @@ -190,102 +190,102 @@ "@esbuild/darwin-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz#d8c5342ec1a4bf4b1915643dfe031ba4b173a87a" integrity sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A== "@esbuild/freebsd-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz#9f7d789e2eb7747d4868817417cc968ffa84f35b" integrity sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw== "@esbuild/freebsd-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz#8ad35c51d084184a8e9e76bb4356e95350a64709" integrity sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q== -"@esbuild/linux-arm@0.25.3": - version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz" - integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ== - "@esbuild/linux-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz#3af0da3d9186092a9edd4e28fa342f57d9e3cd30" integrity sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A== +"@esbuild/linux-arm@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz#e91cafa95e4474b3ae3d54da12e006b782e57225" + integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ== + "@esbuild/linux-ia32@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz#81025732d85b68ee510161b94acdf7e3007ea177" integrity sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw== "@esbuild/linux-loong64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz#3c744e4c8d5e1148cbe60a71a11b58ed8ee5deb8" integrity sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g== "@esbuild/linux-mips64el@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz#1dfe2a5d63702db9034cc6b10b3087cc0424ec26" integrity sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag== "@esbuild/linux-ppc64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz#2e85d9764c04a1ebb346dc0813ea05952c9a5c56" integrity sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg== "@esbuild/linux-riscv64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz#a9ea3334556b09f85ccbfead58c803d305092415" integrity sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA== "@esbuild/linux-s390x@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz#f6a7cb67969222b200974de58f105dfe8e99448d" integrity sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ== "@esbuild/linux-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz#a237d3578ecdd184a3066b1f425e314ade0f8033" integrity sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA== "@esbuild/netbsd-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz#4c15c68d8149614ddb6a56f9c85ae62ccca08259" integrity sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA== "@esbuild/netbsd-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz#12f6856f8c54c2d7d0a8a64a9711c01a743878d5" integrity sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g== "@esbuild/openbsd-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz#ca078dad4a34df192c60233b058db2ca3d94bc5c" integrity sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ== "@esbuild/openbsd-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz#c9178adb60e140e03a881d0791248489c79f95b2" integrity sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w== "@esbuild/sunos-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz#03765eb6d4214ff27e5230af779e80790d1ee09f" integrity sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA== "@esbuild/win32-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz#f1c867bd1730a9b8dfc461785ec6462e349411ea" integrity sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ== "@esbuild/win32-ia32@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz#77491f59ef6c9ddf41df70670d5678beb3acc322" integrity sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew== "@esbuild/win32-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz#b17a2171f9074df9e91bfb07ef99a892ac06412a" integrity sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg== "@eslint-community/eslint-utils@^4.2.0": @@ -336,7 +336,7 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^9.22.0", "@eslint/js@9.25.1": +"@eslint/js@9.25.1", "@eslint/js@^9.22.0": version "9.25.1" resolved "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz" integrity sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg== @@ -416,12 +416,12 @@ "@rollup/rollup-android-arm-eabi@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz#e1562d360bca73c7bef6feef86098de3a2f1d442" integrity sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw== "@rollup/rollup-android-arm64@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz#37ba63940211673e15dcc5f469a78e34276dbca7" integrity sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw== "@rollup/rollup-darwin-arm64@4.40.1": @@ -431,87 +431,87 @@ "@rollup/rollup-darwin-x64@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz#5e22dab3232b1e575d930ce891abb18fe19c58c9" integrity sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw== "@rollup/rollup-freebsd-arm64@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz#04c892d9ff864d66e31419634726ab0bebb33707" integrity sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw== "@rollup/rollup-freebsd-x64@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz#f4b1e091f7cf5afc9e3a029d70128ad56409ecfb" integrity sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q== "@rollup/rollup-linux-arm-gnueabihf@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz#c8814bb5ce047a81b1fe4a33628dfd4ac52bd864" integrity sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg== "@rollup/rollup-linux-arm-musleabihf@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz#5b4e7bd83cbebbf5ffe958802dcfd4ee34bf73a3" integrity sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg== "@rollup/rollup-linux-arm64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz#141c848e53cee011e82a11777b8a51f1b3e8d77c" integrity sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg== "@rollup/rollup-linux-arm64-musl@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz#22ebeaf2fa301aa4aa6c84b760e6cd1d1ac7eb1e" integrity sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ== "@rollup/rollup-linux-loongarch64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz#20b77dc78e622f5814ff8e90c14c938ceb8043bc" integrity sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ== "@rollup/rollup-linux-powerpc64le-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz#2c90f99c987ef1198d4f8d15d754c286e1f07b13" integrity sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg== "@rollup/rollup-linux-riscv64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz#9336fd5e47d7f4760d02aa85f76976176eef53ca" integrity sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ== "@rollup/rollup-linux-riscv64-musl@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz#d75b4d54d46439bb5c6c13762788f57e798f5670" integrity sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA== "@rollup/rollup-linux-s390x-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz#e9f09b802f1291839247399028beaef9ce034c81" integrity sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg== "@rollup/rollup-linux-x64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz#0413169dc00470667dea8575c1129d4e7a73eb29" integrity sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ== "@rollup/rollup-linux-x64-musl@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz#c76fd593323c60ea219439a00da6c6d33ffd0ea6" integrity sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ== "@rollup/rollup-win32-arm64-msvc@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz#c7724c386eed0bda5ae7143e4081c1910cab349b" integrity sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg== "@rollup/rollup-win32-ia32-msvc@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz#7749e1b65cb64fe6d41ad1ad9e970a0ccc8ac350" integrity sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA== "@rollup/rollup-win32-x64-msvc@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz#8078b71fe0d5825dcbf83d52a7dc858b39da165c" integrity sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA== "@types/babel__core@^7.20.5": @@ -547,7 +547,7 @@ dependencies: "@babel/types" "^7.20.7" -"@types/estree@^1.0.6", "@types/estree@1.0.7": +"@types/estree@1.0.7", "@types/estree@^1.0.6": version "1.0.7" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz" integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== @@ -562,7 +562,7 @@ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz" integrity sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg== -"@types/react@^19.0.0", "@types/react@^19.0.10": +"@types/react@^19.0.10": version "19.1.2" resolved "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz" integrity sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw== @@ -585,7 +585,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0: +acorn@^8.14.0: version "8.14.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== @@ -625,7 +625,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -browserslist@^4.24.0, "browserslist@>= 4.21.0": +browserslist@^4.24.0: version "4.24.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== @@ -780,7 +780,7 @@ eslint-visitor-keys@^4.2.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== -"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^9.22.0, eslint@>=8.40: +eslint@^9.22.0: version "9.25.1" resolved "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz" integrity sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ== @@ -1125,7 +1125,7 @@ picocolors@^1.1.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -"picomatch@^3 || ^4", picomatch@^4.0.2: +picomatch@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== @@ -1149,7 +1149,7 @@ punycode@^2.1.0: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -react-dom@^19.0.0, react-dom@>=18: +react-dom@^19.0.0: version "19.1.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== @@ -1163,7 +1163,7 @@ react-refresh@^0.17.0: react-router-dom@^7.5.3: version "7.5.3" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.3.tgz" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.5.3.tgz#496e9f6d90f731703c7772668b41747028e0a2d5" integrity sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A== dependencies: react-router "7.5.3" @@ -1177,7 +1177,7 @@ react-router@7.5.3: set-cookie-parser "^2.6.0" turbo-stream "2.4.0" -"react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", react@^19.0.0, react@^19.1.0, react@>=18: +react@^19.0.0: version "19.1.0" resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== @@ -1295,7 +1295,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -"vite@^4.2.0 || ^5.0.0 || ^6.0.0", vite@^6.3.1: +vite@^6.3.1: version "6.3.4" resolved "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz" integrity sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw== From 07a1ca2444e8e51a89fdd5f25ef4f583d871a755 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Mon, 5 May 2025 21:22:43 +0900 Subject: [PATCH 04/27] [feat]intro page --- frontend/src/App.jsx | 4 +++- frontend/src/Home.jsx | 21 ++------------------- frontend/src/Home.module.css | 0 frontend/src/Intro.jsx | 25 +++++++++++++++++++++++++ frontend/src/Intro.module.css | 21 +++++++++++++++++++++ 5 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 frontend/src/Home.module.css create mode 100644 frontend/src/Intro.jsx create mode 100644 frontend/src/Intro.module.css diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 8c8abc6..b168902 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -4,13 +4,15 @@ import Login from "./Login"; import Home from "./Home"; import Assignment from "./Assignment"; import Deposit from "./Deposit"; +import Intro from "./Intro"; function App() { return ( - } /> + } /> } /> + } /> } /> } /> diff --git a/frontend/src/Home.jsx b/frontend/src/Home.jsx index db58368..8ac2af7 100644 --- a/frontend/src/Home.jsx +++ b/frontend/src/Home.jsx @@ -1,26 +1,9 @@ import React, { useEffect } from "react"; import { useNavigate } from "react-router-dom"; -import homeLogo from "./assets/img/home.svg"; +import styles from "./Home.module.css"; const Home = () => { - const navigate = useNavigate(); - - useEffect(() => { - const timer = setTimeout(() => { - navigate("/login"); - }, 2000); - - return () => clearTimeout(timer); - }, [navigate]); - - return ( -
-
-

PIROCHECK

- PiroCheck Logo -
-
- ); + return
; }; export default Home; diff --git a/frontend/src/Home.module.css b/frontend/src/Home.module.css new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/Intro.jsx b/frontend/src/Intro.jsx new file mode 100644 index 0000000..0419c6a --- /dev/null +++ b/frontend/src/Intro.jsx @@ -0,0 +1,25 @@ +import React, { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import styles from "./Intro.module.css"; + +const Intro = () => { + const navigate = useNavigate(); + + useEffect(() => { + const timer = setTimeout(() => { + navigate("/login"); + }, 2000); + + return () => clearTimeout(timer); + }, [navigate]); + + return ( +
+
+

PIROCHECK

+
+
+ ); +}; + +export default Intro; diff --git a/frontend/src/Intro.module.css b/frontend/src/Intro.module.css new file mode 100644 index 0000000..1344aaa --- /dev/null +++ b/frontend/src/Intro.module.css @@ -0,0 +1,21 @@ +.intro { + background-image: url("./assets/img/home.svg"); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; +} +.pirocheck { + font-size: 1.25rem; + transform: scaleX(1.5); +} +.intro_container { + background-color: var(--background-black); + color: var(--main-green); + font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + padding: 1rem; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} From ecee2f31dc5f616d371519b3bdca30f4bc665e85 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Tue, 6 May 2025 01:14:34 +0900 Subject: [PATCH 05/27] =?UTF-8?q?[feat]=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Admin.jsx | 9 ++ frontend/src/App.jsx | 2 + frontend/src/Login.jsx | 96 +++++++++++++++++-- frontend/src/Login.module.css | 44 +++++++++ frontend/src/assets/root.css | 2 +- frontend/src/components/InputBlock.jsx | 7 +- .../components/componentsCss/InfoBlock.css | 7 ++ frontend/vite.config.js | 16 +++- 8 files changed, 168 insertions(+), 15 deletions(-) create mode 100644 frontend/src/Admin.jsx create mode 100644 frontend/src/Login.module.css diff --git a/frontend/src/Admin.jsx b/frontend/src/Admin.jsx new file mode 100644 index 0000000..1eb01d0 --- /dev/null +++ b/frontend/src/Admin.jsx @@ -0,0 +1,9 @@ +const Admin = () => { + return ( +
+

Admin Page

+

This is the admin page.

+
+ ); +}; +export default Admin; diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index b168902..a8edf28 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -5,6 +5,7 @@ import Home from "./Home"; import Assignment from "./Assignment"; import Deposit from "./Deposit"; import Intro from "./Intro"; +import Admin from "./Admin"; function App() { return ( @@ -15,6 +16,7 @@ function App() { } /> } /> } /> + } />
); diff --git a/frontend/src/Login.jsx b/frontend/src/Login.jsx index 06d3ddb..166e8a9 100644 --- a/frontend/src/Login.jsx +++ b/frontend/src/Login.jsx @@ -1,14 +1,96 @@ import React from "react"; +import { useState } from "react"; +import InputBlock from "./components/InputBlock"; +import { useNavigate } from "react-router-dom"; +import styles from "./Login.module.css"; + +const Login = () => { + const [name, setName] = useState(""); + const [password, setPassword] = useState(""); + const [responseMessage, setResponseMessage] = useState(""); + + const navigate = useNavigate(); + + const handleChange = (index, value) => { + if (index === 0) setName(value); + else if (index === 1) setPassword(value); + }; + + const handleLogin = async () => { + try { + const res = await fetch("/api/login", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + body: JSON.stringify({ name, password }), + }); + + if (!res.ok) { + const data = await res.json(); + + if (res.status === 401) { + setResponseMessage( + data?.message || "이름 또는 비밀번호를 다시 확인해주세요." + ); + } else { + setResponseMessage( + data?.message || + "알 수 없는 오류가 발생했습니다. 다시 시도해주세요." + ); + } + + return; + } + + const data = await res.json(); // { id, name, role } + + localStorage.setItem("user", JSON.stringify(data)); + + if (data.role === "ADMIN") { + navigate("/admin"); + } else if (data.role === "MEMBER") { + navigate("/home"); + } else { + setResponseMessage("알 수 없는 사용자 유형입니다."); + } + } catch (error) { + console.error(error); + setResponseMessage("서버 연결에 실패했습니다. 다시 시도해주세요."); + } + }; -const Login = ({ onLogin }) => { return ( -
-

로그인 페이지

- - - +
+
+

PIROCHECK

+ + +
+ {responseMessage} +
+ +
); }; - export default Login; diff --git a/frontend/src/Login.module.css b/frontend/src/Login.module.css new file mode 100644 index 0000000..ece282e --- /dev/null +++ b/frontend/src/Login.module.css @@ -0,0 +1,44 @@ +.login { + height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} +.pirocheck { + font-size: 1.25rem; + transform: scaleX(1.5); + margin-bottom: 65px; +} +.login_container { + background-color: var(--background-black); + color: var(--main-green); + font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + padding: 1rem; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} +.button { + background-color: var(--main-green); + color: white; + width: 309px; + height: 47px; + border-radius: 14px; + margin-top: 15px; + font-size: 16px; +} +button:disabled { + opacity: 0.6; + cursor: default; +} +.errorWrapper { + width: 309px; + display: flex; + justify-content: flex-start; + margin-left: 8px; +} +.errormessage { + font-family: "Noto Sans", sans-serif; + color: #ff5858; + font-size: 10px; + margin-top: 10px; +} diff --git a/frontend/src/assets/root.css b/frontend/src/assets/root.css index 03f70a6..0b747e1 100644 --- a/frontend/src/assets/root.css +++ b/frontend/src/assets/root.css @@ -17,7 +17,7 @@ --fill-gray: #d9d9d9; --warn-red: #ff5858; --text-white: #ffffff; - --border-gray: #c7c7c7; + --border-gray: rgba(204, 204, 204, 0.4); } .noto-sans-kr-context { font-family: "Noto Sans KR", sans-serif; diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx index 18acb60..a6ff2d4 100644 --- a/frontend/src/components/InputBlock.jsx +++ b/frontend/src/components/InputBlock.jsx @@ -1,15 +1,16 @@ import React from "react"; import "./componentsCss/InfoBlock.css"; -const InputBlock = ({ inputs }) => { +const InputBlock = ({ inputs, onChange }) => { return ( -
+
{inputs.map((input, index) => ( onChange && onChange(index, e.target.value)} /> ))}
diff --git a/frontend/src/components/componentsCss/InfoBlock.css b/frontend/src/components/componentsCss/InfoBlock.css index 73b7438..82aa409 100644 --- a/frontend/src/components/componentsCss/InfoBlock.css +++ b/frontend/src/components/componentsCss/InfoBlock.css @@ -9,7 +9,14 @@ font-family: "Noto Sans KR", sans-serif; border: 1px var(--background-black) solid; padding: 10px; + margin-top: 11px; } .inputTag:focus { border: 1px var(--main-green) solid; } +.inputBlock { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 8b0f57b..6b46dee 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -1,7 +1,15 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; -// https://vite.dev/config/ +// https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], -}) + server: { + proxy: { + "/api": { + target: "http://localhost:8080", + changeOrigin: true, + }, + }, + }, +}); From 48e32345b2a12c10c920a8e276f2d7dfa7e54be6 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Tue, 6 May 2025 01:27:51 +0900 Subject: [PATCH 06/27] =?UTF-8?q?[refactor]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20API=20fetch=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC=20(api?= =?UTF-8?q?/user.js)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Login.jsx | 10 ++-------- frontend/src/api/user.js | 0 2 files changed, 2 insertions(+), 8 deletions(-) create mode 100644 frontend/src/api/user.js diff --git a/frontend/src/Login.jsx b/frontend/src/Login.jsx index 166e8a9..e74413a 100644 --- a/frontend/src/Login.jsx +++ b/frontend/src/Login.jsx @@ -3,6 +3,7 @@ import { useState } from "react"; import InputBlock from "./components/InputBlock"; import { useNavigate } from "react-router-dom"; import styles from "./Login.module.css"; +import { loginUser } from "./api/user"; const Login = () => { const [name, setName] = useState(""); @@ -18,14 +19,7 @@ const Login = () => { const handleLogin = async () => { try { - const res = await fetch("/api/login", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - credentials: "include", - body: JSON.stringify({ name, password }), - }); + const res = await loginUser({ name, password }); if (!res.ok) { const data = await res.json(); diff --git a/frontend/src/api/user.js b/frontend/src/api/user.js new file mode 100644 index 0000000..e69de29 From 2ac7f4a7f18d903ac2504512ffcad81e6ec3cdd9 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Tue, 6 May 2025 02:49:03 +0900 Subject: [PATCH 07/27] =?UTF-8?q?[feat]Home=20page=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/App.jsx | 2 + frontend/src/Attendance.jsx | 9 ++++ frontend/src/Home.jsx | 27 +++++++++- frontend/src/Home.module.css | 49 +++++++++++++++++++ frontend/src/Intro.module.css | 23 +++++++-- frontend/src/Login.module.css | 1 - frontend/src/api/user.js | 14 ++++++ .../src/assets/img/{home.svg => logo.svg} | 2 +- 8 files changed, 118 insertions(+), 9 deletions(-) create mode 100644 frontend/src/Attendance.jsx rename frontend/src/assets/img/{home.svg => logo.svg} (99%) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index a8edf28..db217ff 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -6,6 +6,7 @@ import Assignment from "./Assignment"; import Deposit from "./Deposit"; import Intro from "./Intro"; import Admin from "./Admin"; +import Attendance from "./Attendance"; function App() { return ( @@ -15,6 +16,7 @@ function App() { } /> } /> } /> + } /> } /> } /> diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx new file mode 100644 index 0000000..13dedd9 --- /dev/null +++ b/frontend/src/Attendance.jsx @@ -0,0 +1,9 @@ +const Attendance = () => { + return ( +
+

Attendance

+

Attendance page content goes here.

+
+ ); +}; +export default Attendance; diff --git a/frontend/src/Home.jsx b/frontend/src/Home.jsx index 8ac2af7..d8b1c7c 100644 --- a/frontend/src/Home.jsx +++ b/frontend/src/Home.jsx @@ -1,9 +1,32 @@ -import React, { useEffect } from "react"; +import React from "react"; import { useNavigate } from "react-router-dom"; import styles from "./Home.module.css"; +import logo from "./assets/img/logo.svg"; const Home = () => { - return
; + const navigate = useNavigate(); + return ( +
+
+

PIROCHECK

+ + + 로고 +
+
+ ); }; export default Home; diff --git a/frontend/src/Home.module.css b/frontend/src/Home.module.css index e69de29..4165919 100644 --- a/frontend/src/Home.module.css +++ b/frontend/src/Home.module.css @@ -0,0 +1,49 @@ +.home { + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + overflow: hidden; +} +.pirocheck { + margin-top: 43px; + font-size: 1.25rem; + transform: scaleX(1.5); + margin-bottom: 103px; +} +.home_container { + background-color: var(--background-black); + color: var(--main-green); + font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} +.button { + width: 309px; + height: 81px; + border-radius: 14px; + background-color: var(--border-gray); + color: var(--text-white); + font-weight: 400; + font-size: 20px; + border: 1px var(--background-black) solid; + padding: 15px; + font-weight: bold; + margin-bottom: 26px; + z-index: 1; +} +.button p { + text-align: start; + transform: scale(1.3, 0.9); + margin-left: 40px; +} +.button:hover { + background-color: var(--card-toggle-green); + color: var(--text-white); +} +.home img { + position: relative; + opacity: 0.8; + top: -92px; + z-index: 0; +} diff --git a/frontend/src/Intro.module.css b/frontend/src/Intro.module.css index 1344aaa..9fc44ae 100644 --- a/frontend/src/Intro.module.css +++ b/frontend/src/Intro.module.css @@ -1,12 +1,24 @@ .intro { - background-image: url("./assets/img/home.svg"); - background-repeat: no-repeat; - background-size: contain; - background-position: center; + width: 390px; + position: relative; height: 100vh; display: flex; justify-content: center; align-items: center; + z-index: 0; + overflow: hidden; +} + +.intro::before { + content: ""; + position: absolute; + inset: 0; + background-image: url("./assets/img/logo.svg"); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + opacity: 0.5; + z-index: -1; } .pirocheck { font-size: 1.25rem; @@ -16,6 +28,7 @@ background-color: var(--background-black); color: var(--main-green); font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; - padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + display: flex; + justify-content: center; } diff --git a/frontend/src/Login.module.css b/frontend/src/Login.module.css index ece282e..6bb5f64 100644 --- a/frontend/src/Login.module.css +++ b/frontend/src/Login.module.css @@ -14,7 +14,6 @@ background-color: var(--background-black); color: var(--main-green); font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; - padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .button { diff --git a/frontend/src/api/user.js b/frontend/src/api/user.js index e69de29..3964bac 100644 --- a/frontend/src/api/user.js +++ b/frontend/src/api/user.js @@ -0,0 +1,14 @@ +export const loginUser = async ({ name, password }) => { + const res = await fetch("/api/login", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + body: JSON.stringify({ name, password }), + }); + + return res; +}; + +export default loginUser; diff --git a/frontend/src/assets/img/home.svg b/frontend/src/assets/img/logo.svg similarity index 99% rename from frontend/src/assets/img/home.svg rename to frontend/src/assets/img/logo.svg index 9b5895e..62a3683 100644 --- a/frontend/src/assets/img/home.svg +++ b/frontend/src/assets/img/logo.svg @@ -1,5 +1,5 @@ - + From f760f93be7412e975734b511648b4ee516e9ce5e Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 14:49:26 +0900 Subject: [PATCH 08/27] [Fix] header component & home page title font --- frontend/src/Assignment.jsx | 45 ++++++++++++++++-- frontend/src/Home.module.css | 9 ++-- .../src/assets/fonts/Akira Expanded Demo.otf | Bin 0 -> 26320 bytes frontend/src/assets/root.css | 15 ++++++ .../componentsCss/DailyOpenBlock.css | 2 +- .../src/components/componentsCss/Header.css | 7 ++- .../componentsCss/WeeklyListBlock.css | 1 + 7 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 frontend/src/assets/fonts/Akira Expanded Demo.otf diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx index 581f00a..24b0150 100644 --- a/frontend/src/Assignment.jsx +++ b/frontend/src/Assignment.jsx @@ -1,9 +1,48 @@ +import React from "react"; +import WeeklyListBlock from "./components/WeeklyListBlock"; +import Header from "./components/Header"; const Assignment = () => { + const weeks = [ + { + label: "2주차 JS개론/웹개론", + details: [ + { + day: "화", + subject: "Git HTML CSS", + tasks: [ + { label: "제로초 인강", status: "done" }, + { label: "깃허브 클론 코딩", status: "progress" }, + ], + }, + { + day: "목", + subject: "Git HTML CSS", + tasks: [ + { label: "제로초 인강", status: "fail" }, + { label: "깃허브 클론 코딩", status: "progress" }, + ], + }, + ], + }, + { + label: "3주차 JS개론/웹개론", + details: [ + { + day: "화", + subject: "Git HTML CSS", + tasks: [], + }, + ], + }, + ]; + return ( -
-

Assignment

-

This is the assignment page.

+ +
+
+
); }; + export default Assignment; diff --git a/frontend/src/Home.module.css b/frontend/src/Home.module.css index 4165919..9cdf1de 100644 --- a/frontend/src/Home.module.css +++ b/frontend/src/Home.module.css @@ -5,11 +5,11 @@ align-items: center; justify-content: flex-start; overflow: hidden; + font-family: 'Akira Expanded'; } .pirocheck { margin-top: 43px; font-size: 1.25rem; - transform: scaleX(1.5); margin-bottom: 103px; } .home_container { @@ -21,11 +21,12 @@ .button { width: 309px; height: 81px; - border-radius: 14px; + border-radius: 8px; background-color: var(--border-gray); color: var(--text-white); + font-family: 'Akira Expanded'; font-weight: 400; - font-size: 20px; + font-size: 16px; border: 1px var(--background-black) solid; padding: 15px; font-weight: bold; @@ -34,8 +35,6 @@ } .button p { text-align: start; - transform: scale(1.3, 0.9); - margin-left: 40px; } .button:hover { background-color: var(--card-toggle-green); diff --git a/frontend/src/assets/fonts/Akira Expanded Demo.otf b/frontend/src/assets/fonts/Akira Expanded Demo.otf new file mode 100644 index 0000000000000000000000000000000000000000..c75fdb37ecc06afa3fe17248e1f742e07c43f36c GIT binary patch literal 26320 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/root.css b/frontend/src/assets/root.css index b98cab1..a01e08f 100644 --- a/frontend/src/assets/root.css +++ b/frontend/src/assets/root.css @@ -30,4 +30,19 @@ .inter{ font-family: "Inter", sans-serif; +} + +@font-face { + font-family: 'Akira Expanded'; + src: url('../assets/fonts/Akira Expanded Demo.otf') format('truetype'); +} + +body{ + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + overflow: hidden; + background-color: #000000; } \ No newline at end of file diff --git a/frontend/src/components/componentsCss/DailyOpenBlock.css b/frontend/src/components/componentsCss/DailyOpenBlock.css index fe64020..5a44722 100644 --- a/frontend/src/components/componentsCss/DailyOpenBlock.css +++ b/frontend/src/components/componentsCss/DailyOpenBlock.css @@ -41,7 +41,7 @@ .task-icon { - font-size: 20px; + font-size: 15px; } diff --git a/frontend/src/components/componentsCss/Header.css b/frontend/src/components/componentsCss/Header.css index a679d01..b35be0a 100644 --- a/frontend/src/components/componentsCss/Header.css +++ b/frontend/src/components/componentsCss/Header.css @@ -7,12 +7,17 @@ justify-content: space-between; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + margin: 10px; } .header-title { - font-size: 1.25rem; + font-size: 18px; font-weight: bold; color: var(--main-green); + white-space: pre-line; + align-items: center; + text-align: center; + font-family: 'Akira Expanded'; } .icon-button { diff --git a/frontend/src/components/componentsCss/WeeklyListBlock.css b/frontend/src/components/componentsCss/WeeklyListBlock.css index 64fd605..6d29b37 100644 --- a/frontend/src/components/componentsCss/WeeklyListBlock.css +++ b/frontend/src/components/componentsCss/WeeklyListBlock.css @@ -9,6 +9,7 @@ .weekly-item{ background-color: #045E07; + border-radius: 8px; } .weekly-button { From 6fa40beab861f4c21f27260748b012b0995ed018 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 15:23:17 +0900 Subject: [PATCH 09/27] [Feat] add AssignmentInfoBlock component& create Assignment Check page --- frontend/src/Assignment.jsx | 14 +++++++++ .../src/components/AssignmentInfoBlock.jsx | 16 ++++++++++ .../componentsCss/AssignmentInfoBlock.css | 29 +++++++++++++++++++ .../componentsCss/WeeklyListBlock.css | 3 +- 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 frontend/src/components/AssignmentInfoBlock.jsx create mode 100644 frontend/src/components/componentsCss/AssignmentInfoBlock.css diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx index 24b0150..eca3012 100644 --- a/frontend/src/Assignment.jsx +++ b/frontend/src/Assignment.jsx @@ -1,6 +1,7 @@ import React from "react"; import WeeklyListBlock from "./components/WeeklyListBlock"; import Header from "./components/Header"; +import AssignmentInfoBlock from "./components/AssignmentInfoBlock"; const Assignment = () => { const weeks = [ { @@ -36,10 +37,23 @@ const Assignment = () => { }, ]; +//Assignment-Info-Block(형광 초록색카드 더미데이터) + const cardData = { + weekLabel: "3주차", + day: "화", + tasks: [ + { label: "Django girls 과제" }, + { label: "Django girls 과제" }, + ], + }; + return (
+
+ +
); diff --git a/frontend/src/components/AssignmentInfoBlock.jsx b/frontend/src/components/AssignmentInfoBlock.jsx new file mode 100644 index 0000000..4fe77b1 --- /dev/null +++ b/frontend/src/components/AssignmentInfoBlock.jsx @@ -0,0 +1,16 @@ +import React from "react"; +import "./componentsCss/AssignmentInfoBlock.css" + +const AssignmentInfoBlock = ({ weekLabel, day, tasks }) => { + return ( +
+

{weekLabel} ({day})

+
    + {tasks.map((task, idx) => ( +
  • {task.label}
  • + ))} +
+
+ ); +}; +export default AssignmentInfoBlock; \ No newline at end of file diff --git a/frontend/src/components/componentsCss/AssignmentInfoBlock.css b/frontend/src/components/componentsCss/AssignmentInfoBlock.css new file mode 100644 index 0000000..ead854f --- /dev/null +++ b/frontend/src/components/componentsCss/AssignmentInfoBlock.css @@ -0,0 +1,29 @@ +.assignment-info-block { + background-color: var(--main-green); + padding: 16px; + margin: 12px auto; + border-radius: 10px; + max-width: 350px; + + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); + color: black; + font-family: "Noto Sans KR", sans-serif; +} + +.week-day { + font-weight: bold; + font-size: 18px; + margin-bottom: 12px; +} + +.task-list { + list-style: none; + font-weight: 500; + padding: 0; + margin: 0; +} + +.task-list li { + margin-bottom: 6px; + font-size: 16px; +} \ No newline at end of file diff --git a/frontend/src/components/componentsCss/WeeklyListBlock.css b/frontend/src/components/componentsCss/WeeklyListBlock.css index 6d29b37..4f7970d 100644 --- a/frontend/src/components/componentsCss/WeeklyListBlock.css +++ b/frontend/src/components/componentsCss/WeeklyListBlock.css @@ -3,8 +3,7 @@ flex-direction: column; gap: 12px; font-family: "Inter", sans-serif; - width: 371px; - + width: 350px; } .weekly-item{ From 2cec2c2c0d4568b1c1a3ef1470f488df3dd5a60d Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 15:28:43 +0900 Subject: [PATCH 10/27] [Fix] login page title font --- frontend/src/Login.module.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/Login.module.css b/frontend/src/Login.module.css index 6bb5f64..170420b 100644 --- a/frontend/src/Login.module.css +++ b/frontend/src/Login.module.css @@ -7,13 +7,13 @@ } .pirocheck { font-size: 1.25rem; - transform: scaleX(1.5); + transform: scaleX(1.1); margin-bottom: 65px; } .login_container { background-color: var(--background-black); color: var(--main-green); - font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + font-family: 'Akira Expanded'; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .button { From 67525c962d53c3cf8a4df8cb3931bef385bb04b9 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Wed, 7 May 2025 18:11:32 +0900 Subject: [PATCH 11/27] [feat]deposit page --- frontend/package.json | 1 + frontend/src/App.jsx | 2 +- frontend/src/Deposit.jsx | 43 ++++- frontend/src/Deposit.module.css | 41 +++++ .../src/components/componentsCss/Header.css | 7 +- frontend/yarn.lock | 160 ++++++++++++++++++ 6 files changed, 247 insertions(+), 7 deletions(-) create mode 100644 frontend/src/Deposit.module.css diff --git a/frontend/package.json b/frontend/package.json index 261de3d..aac2c62 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "axios": "^1.9.0", "lucide-react": "^0.507.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index b5d2fc4..db217ff 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -24,4 +24,4 @@ function App() { ); } -export default App; \ No newline at end of file +export default App; diff --git a/frontend/src/Deposit.jsx b/frontend/src/Deposit.jsx index 295c538..ce2198c 100644 --- a/frontend/src/Deposit.jsx +++ b/frontend/src/Deposit.jsx @@ -1,8 +1,45 @@ +import Header from "./components/Header"; +import styles from "./Deposit.module.css"; +import axios from "axios"; +import { useEffect, useState } from "react"; + const Deposit = () => { + const [deposit, setDeposit] = useState(null); + useEffect(() => { + const user = JSON.parse(localStorage.getItem("user")); + const userId = user?.id; + + if (!userId) return; + + axios + .get(`/api/deposit/${userId}`) + .then((res) => setDeposit(res.data)) + .catch((err) => { + alert("보증금 정보를 불러오지 못했습니다."); + }); + }, []); + + if (!deposit) return
loagin...
; + return ( -
-

Deposit Page

-

This is the deposit page.

+
+
+
+ 잔여 보증금 + {deposit.amount}원 +
+
+ 과제 차감 + {deposit.descentAssignment}원 +
+
+ 출석 차감 + {deposit.descentAttendance}원 +
+
+ 보증금 방어권 + {deposit.ascentDefence}원 +
); }; diff --git a/frontend/src/Deposit.module.css b/frontend/src/Deposit.module.css new file mode 100644 index 0000000..3f83c5d --- /dev/null +++ b/frontend/src/Deposit.module.css @@ -0,0 +1,41 @@ +.deposit_container { + width: 390px; + display: flex; + flex-direction: column; + align-items: center; +} +.deposit { + background-color: var(--main-green); + width: 309px; + padding-top: 26px; + padding-bottom: 30px; + display: flex; + flex-direction: column; + align-items: center; + gap: 17px; + border-radius: 9px; + margin-top: 80px; + margin-bottom: 87px; +} +.deposit > span:nth-child(1) { + font-weight: bold; + font-size: 16px; +} +.deposit > span:nth-child(2) { + font-weight: bold; + font-size: 20px; +} +.deposit_detail { + background-color: #575757; + color: white; + border: 1px solid rgba(217, 217, 217, 0.4); + border-radius: 8px; + padding: 12px 20px; + font-size: 15px; + display: flex; + justify-content: space-between; + align-items: center; + width: 309px; + height: 47px; + margin-bottom: 15px; +} diff --git a/frontend/src/components/componentsCss/Header.css b/frontend/src/components/componentsCss/Header.css index b35be0a..1c8b660 100644 --- a/frontend/src/components/componentsCss/Header.css +++ b/frontend/src/components/componentsCss/Header.css @@ -4,6 +4,7 @@ font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; display: flex; align-items: center; + width: 390px; justify-content: space-between; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); @@ -15,9 +16,9 @@ font-weight: bold; color: var(--main-green); white-space: pre-line; - align-items: center; - text-align: center; - font-family: 'Akira Expanded'; + align-items: center; + text-align: center; + font-family: "Akira Expanded"; } .icon-button { diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 9b621ab..16365bc 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -612,6 +612,20 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901" + integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -635,6 +649,14 @@ browserslist@^4.24.0: node-releases "^2.0.19" update-browserslist-db "^1.1.1" +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" @@ -665,6 +687,13 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -706,11 +735,52 @@ deep-is@^0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + electron-to-chromium@^1.5.73: version "1.5.148" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.148.tgz" integrity sha512-8uc1QXwwqayD4mblcsQYZqoi+cOc97A2XmKSBOIRbEAvbp6vrqmSYs4dHD2qVygUgn7Mi0qdKgPaJ9WC8cv63A== +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + esbuild@^0.25.0: version "0.25.3" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz" @@ -902,16 +972,60 @@ flatted@^3.2.9: resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + mime-types "^2.1.12" + fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" @@ -934,11 +1048,35 @@ globals@^16.0.0: resolved "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz" integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + ignore@^5.2.0: version "5.3.2" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" @@ -1050,6 +1188,23 @@ lucide-react@^0.507.0: resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.507.0.tgz" integrity sha512-XfgE6gvAHwAtnbUvWiTTHx4S3VGR+cUJHEc0vrh9Ogu672I1Tue2+Cp/8JJqpytgcBHAB1FVI297W4XGNwc2dQ== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -1144,6 +1299,11 @@ prelude-ls@^1.2.1: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" From f51993d75c305133098e73ab0abd91f8cb11fd11 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Wed, 7 May 2025 18:30:18 +0900 Subject: [PATCH 12/27] [fix]Assignment page --- frontend/src/Assignment.jsx | 19 +++++++-------- frontend/src/Assignment.module.css | 13 ++++++++++ .../componentsCss/AssignmentInfoBlock.css | 4 ++-- .../componentsCss/WeeklyListBlock.css | 24 +++++++++---------- 4 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 frontend/src/Assignment.module.css diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx index eca3012..bad9e46 100644 --- a/frontend/src/Assignment.jsx +++ b/frontend/src/Assignment.jsx @@ -2,6 +2,8 @@ import React from "react"; import WeeklyListBlock from "./components/WeeklyListBlock"; import Header from "./components/Header"; import AssignmentInfoBlock from "./components/AssignmentInfoBlock"; +import styles from "./Assignment.module.css"; + const Assignment = () => { const weeks = [ { @@ -37,22 +39,19 @@ const Assignment = () => { }, ]; -//Assignment-Info-Block(형광 초록색카드 더미데이터) + //Assignment-Info-Block(형광 초록색카드 더미데이터) const cardData = { weekLabel: "3주차", day: "화", - tasks: [ - { label: "Django girls 과제" }, - { label: "Django girls 과제" }, - ], + tasks: [{ label: "Django girls 과제" }, { label: "Django girls 과제" }], }; return ( - -
- -
- +
+
+
+ +
diff --git a/frontend/src/Assignment.module.css b/frontend/src/Assignment.module.css new file mode 100644 index 0000000..ef95f36 --- /dev/null +++ b/frontend/src/Assignment.module.css @@ -0,0 +1,13 @@ +.info { + margin-top: 28px; + margin-bottom: 54px; +} + +.assignment_page { + background-color: "black"; + min-height: "100vh"; + color: "white"; + display: flex; + flex-direction: column; + align-items: center; +} diff --git a/frontend/src/components/componentsCss/AssignmentInfoBlock.css b/frontend/src/components/componentsCss/AssignmentInfoBlock.css index ead854f..404c79d 100644 --- a/frontend/src/components/componentsCss/AssignmentInfoBlock.css +++ b/frontend/src/components/componentsCss/AssignmentInfoBlock.css @@ -3,7 +3,7 @@ padding: 16px; margin: 12px auto; border-radius: 10px; - max-width: 350px; + width: 309px; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); color: black; @@ -26,4 +26,4 @@ .task-list li { margin-bottom: 6px; font-size: 16px; -} \ No newline at end of file +} diff --git a/frontend/src/components/componentsCss/WeeklyListBlock.css b/frontend/src/components/componentsCss/WeeklyListBlock.css index 4f7970d..b7b1bca 100644 --- a/frontend/src/components/componentsCss/WeeklyListBlock.css +++ b/frontend/src/components/componentsCss/WeeklyListBlock.css @@ -3,18 +3,18 @@ flex-direction: column; gap: 12px; font-family: "Inter", sans-serif; - width: 350px; + width: 309px; } -.weekly-item{ - background-color: #045E07; +.weekly-item { + background-color: #045e07; border-radius: 8px; } .weekly-button { background-color: #575757; color: white; - border: 1px solid rgba(217, 217, 217, 0.4); + border: 1px solid rgba(217, 217, 217, 0.4); border-radius: 8px; padding: 12px 20px; font-size: 15px; @@ -26,12 +26,12 @@ cursor: pointer; } -.weekly-button:hover{ - border: 1px solid var(--card-toggle-green) +.weekly-button:hover { + border: 1px solid var(--card-toggle-green); } -.weekly-button.active{ - background-color: #045E07; +.weekly-button.active { + background-color: #045e07; border: none; } @@ -51,14 +51,12 @@ border-radius: 0 0 12px 12px; color: white; font-size: 16px; - } - .detail-item { margin-top: 6px; } -.daily-open-block-wrapper{ - background-color:#045E07; -} \ No newline at end of file +.daily-open-block-wrapper { + background-color: #045e07; +} From f1f7c7a8a63b68fa0f3fd486cf909a397441ea6f Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 20:36:45 +0900 Subject: [PATCH 13/27] Merge frontend into frontend_km and resolve conflict --- frontend/src/components/InputBlock.jsx | 2 +- .../components/componentsCss/{InfoBlock.css => InputBlock.css} | 0 frontend/yarn.lock | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename frontend/src/components/componentsCss/{InfoBlock.css => InputBlock.css} (100%) diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx index 18acb60..63a1607 100644 --- a/frontend/src/components/InputBlock.jsx +++ b/frontend/src/components/InputBlock.jsx @@ -1,5 +1,5 @@ import React from "react"; -import "./componentsCss/InfoBlock.css"; +import "./componentsCss/InputBlock.css"; const InputBlock = ({ inputs }) => { return ( diff --git a/frontend/src/components/componentsCss/InfoBlock.css b/frontend/src/components/componentsCss/InputBlock.css similarity index 100% rename from frontend/src/components/componentsCss/InfoBlock.css rename to frontend/src/components/componentsCss/InputBlock.css diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 736512a..57037e2 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1047,7 +1047,7 @@ lru-cache@^5.1.1: lucide-react@^0.507.0: version "0.507.0" - resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.507.0.tgz" + resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.507.0.tgz#d93a75ed130bd530a368fe1dd4ea009ea90a772b" integrity sha512-XfgE6gvAHwAtnbUvWiTTHx4S3VGR+cUJHEc0vrh9Ogu672I1Tue2+Cp/8JJqpytgcBHAB1FVI297W4XGNwc2dQ== minimatch@^3.1.2: From e5e75a1801caf4d7c8e2e5862d2331559ae805bb Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 22:27:45 +0900 Subject: [PATCH 14/27] =?UTF-8?q?[add]:=20Attendacne=20page,=20InputBlock?= =?UTF-8?q?=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Attendance.jsx | 40 ++++++++++++++++++++++++-- frontend/src/Attendance.module.css | 17 +++++++++++ frontend/src/components/Header.jsx | 37 +++++++++++++++--------- frontend/src/components/InputBlock.jsx | 3 +- 4 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 frontend/src/Attendance.module.css diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index 13dedd9..b45887c 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -1,9 +1,43 @@ +import { useState } from "react"; +import Header from "./components/Header"; +import InputBlock from "./components/InputBlock"; +import styles from "./Attendance.module.css"; + const Attendance = () => { + const [attendanceCode, setAttendanceCode] = useState([""]); + const handleChange = (index, value) => { + // 숫자만 입력 허용 + if (/^\d*$/.test(value)) { + const userCodes = [...attendanceCode]; + userCodes[index] = value; + setAttendanceCode(userCodes); + } + }; + const handleSubmit = () => { + console.log("제출된 출석 코드: ", attendanceCode[0]); + // 서버 요청 등 추가 작업 + }; + return ( -
-

Attendance

-

Attendance page content goes here.

+
+
+ + {attendanceCode[0].length === 4 && ( + + )}
); }; + export default Attendance; diff --git a/frontend/src/Attendance.module.css b/frontend/src/Attendance.module.css new file mode 100644 index 0000000..cebb0b5 --- /dev/null +++ b/frontend/src/Attendance.module.css @@ -0,0 +1,17 @@ +.attendance_page { + background-color: "black"; + height: "100vh"; + display: flex; + flex-direction: column; + align-items: center; + position: relative; +} +.submitBtn { + background-color: #ffffff; + opacity: 42%; + border-radius: 10px; + position: absolute; + top: 109px; + right: 63px; + padding: 7px; +} diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index 3b9d2a0..c9ec60e 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -1,35 +1,44 @@ -import React from 'react'; -import { useNavigate, useLocation } from 'react-router-dom'; -import { ArrowLeft, Wallet } from 'lucide-react'; -import './componentsCss/Header.css'; -import arrowIcon from '../assets/img/arrowicon.svg'; -import moneyIcon from '../assets/img/moneyicon.svg'; +import React from "react"; +import { useNavigate, useLocation } from "react-router-dom"; +import { ArrowLeft, Wallet } from "lucide-react"; +import "./componentsCss/Header.css"; +import arrowIcon from "../assets/img/arrowicon.svg"; +import moneyIcon from "../assets/img/moneyicon.svg"; const Header = () => { const navigate = useNavigate(); const location = useLocation(); const path = location.pathname; let title = "ATTENDANCE\nCHECK"; - if (path.includes('assignment')) title = "ASSIGNMENT\nCHECK"; - else if (path.includes('deposit')) title = "DEPOSIT"; + if (path.includes("assignment")) title = "ASSIGNMENT\nCHECK"; + else if (path.includes("deposit")) title = "DEPOSIT"; + else if (path.includes("attendance")) title = "ATTENDANCE\nCHECK"; - const showRightButton = !path.includes('deposit'); + const showRightButton = !path.includes("deposit"); return (
-

{title}

{showRightButton ? ( - ) : ( -
// 오른쪽 공백 유지 +
// 오른쪽 공백 유지 )}
); }; -export default Header; \ No newline at end of file +export default Header; diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx index e4d515e..5caf6cc 100644 --- a/frontend/src/components/InputBlock.jsx +++ b/frontend/src/components/InputBlock.jsx @@ -1,7 +1,7 @@ import React from "react"; import "./componentsCss/InputBlock.css"; -const InputBlock = ({ inputs, onChange }) => { +const InputBlock = ({ inputs, onChange, values }) => { return (
{inputs.map((input, index) => ( @@ -10,6 +10,7 @@ const InputBlock = ({ inputs, onChange }) => { className="inputTag" type={input.type} placeholder={input.placeholder} + value={values[index] || ""} onChange={(e) => onChange && onChange(index, e.target.value)} /> ))} From af238d082f71f485cde3af949eade282db4e26f1 Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 22:35:22 +0900 Subject: [PATCH 15/27] =?UTF-8?q?[fix]:=20InputBlock=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20values=20=EC=97=86=EB=8A=94=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/InputBlock.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx index 5caf6cc..65ae0ab 100644 --- a/frontend/src/components/InputBlock.jsx +++ b/frontend/src/components/InputBlock.jsx @@ -10,7 +10,7 @@ const InputBlock = ({ inputs, onChange, values }) => { className="inputTag" type={input.type} placeholder={input.placeholder} - value={values[index] || ""} + value={values?.[index] || ""} onChange={(e) => onChange && onChange(index, e.target.value)} /> ))} From dffff68d61755514722a217ac1896b9fe89a3c4e Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 22:55:42 +0900 Subject: [PATCH 16/27] [add]: boom img --- frontend/src/Attendance.jsx | 6 ++++++ frontend/src/assets/img/tabler--boom.svg | 1 + 2 files changed, 7 insertions(+) create mode 100644 frontend/src/assets/img/tabler--boom.svg diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index b45887c..b9ad764 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -36,6 +36,12 @@ const Attendance = () => { Submit )} +
+ + + + +
); }; diff --git a/frontend/src/assets/img/tabler--boom.svg b/frontend/src/assets/img/tabler--boom.svg new file mode 100644 index 0000000..8c6b2eb --- /dev/null +++ b/frontend/src/assets/img/tabler--boom.svg @@ -0,0 +1 @@ + \ No newline at end of file From 29f6ccde471a92409ae9d8061be548a34ebcb5fc Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 22:58:42 +0900 Subject: [PATCH 17/27] [add]: boom img --- frontend/src/Attendance.jsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index b9ad764..5581dfd 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -36,12 +36,7 @@ const Attendance = () => { Submit )} -
- - - - -
+
); }; From 6bfd0c28c3b8d7cf8872cccce3ddc9fcf837b65d Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 23:23:09 +0900 Subject: [PATCH 18/27] =?UTF-8?q?[add]:=20boom.png=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/public/img/tabler--boom.png | Bin 0 -> 20512 bytes .../{src/assets => public}/img/tabler--boom.svg | 0 frontend/src/Attendance.jsx | 12 +++++++++++- frontend/src/Attendance.module.css | 15 +++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 frontend/public/img/tabler--boom.png rename frontend/{src/assets => public}/img/tabler--boom.svg (100%) diff --git a/frontend/public/img/tabler--boom.png b/frontend/public/img/tabler--boom.png new file mode 100644 index 0000000000000000000000000000000000000000..23126cfb9a890d5f14be5a83f5c636d747e97190 GIT binary patch literal 20512 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 Kb6Mw<&;$S~3^A<$ literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/tabler--boom.svg b/frontend/public/img/tabler--boom.svg similarity index 100% rename from frontend/src/assets/img/tabler--boom.svg rename to frontend/public/img/tabler--boom.svg diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index 5581dfd..5d256c5 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -36,7 +36,17 @@ const Attendance = () => { Submit )} -
+
+
+ +
+
+ +
+
+ +
+
); }; diff --git a/frontend/src/Attendance.module.css b/frontend/src/Attendance.module.css index cebb0b5..ea7f9d4 100644 --- a/frontend/src/Attendance.module.css +++ b/frontend/src/Attendance.module.css @@ -15,3 +15,18 @@ right: 63px; padding: 7px; } +.attend_img_container { + display: flex; + gap: 22px; + width: 100%; + padding-block: 40px; + justify-content: center; +} +.boom_icon { + width: 70px; + height: 65px; +} +.boom_icon > img { + width: 100%; + height: 100%; +} From 7344416c1a12b18aa815515ab12bc3fdc8e39dce Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 23:26:01 +0900 Subject: [PATCH 19/27] =?UTF-8?q?[add]:=20boom=5Ffilled=5Fcolor=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 --- frontend/public/img/boom-filled-green.png | Bin 0 -> 16289 bytes frontend/public/img/boom-filled-red.png | Bin 0 -> 16879 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 frontend/public/img/boom-filled-green.png create mode 100644 frontend/public/img/boom-filled-red.png diff --git a/frontend/public/img/boom-filled-green.png b/frontend/public/img/boom-filled-green.png new file mode 100644 index 0000000000000000000000000000000000000000..6416093059824996f574981553f5705819c56466 GIT binary patch literal 16289 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 A#sB~S literal 0 HcmV?d00001 diff --git a/frontend/public/img/boom-filled-red.png b/frontend/public/img/boom-filled-red.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5bb3b1d467a98c48a0b7990526fe5f0b75af1b GIT binary patch literal 16879 zcmeIaWmuG5*EfF75Dp?R0)hg7bo-XJr^(XDi8yY{=%cl zq13O1p6G10-Mpm12>X_8#x$a%`>PS6)HqExU9fohr5WwZ(~Z!izj4r+1`L(;thaMG zZq#HV272I#h>N^3kfO_M$s6!9_y-uq z{@*W=Qy?HJ+N7A%qz|AV7aG#@sEAYuhWh%U>l*2KI63s?-_7V5QP9PkPYmynK7fI6 z!o=^RFfz~JV7QBR+{o=?e6{V zT{2;G{Kgmt6z>$!Mj@HIF)X#1d_y-L$Kh?pN@=CegBk3nz1W_)_g0oWhh8bIR78yq z0R|+%VwGsL_UhG0_X1XK4tvvK!3sA^xB4RKhcbAUP7=` z&gZFbSWkK;kI8lJL^=t}CcZ-lK3AyVFyaLEQA&k`>^@ol7NGKs$%_~mOb8sc;?x!t zT_u`~p@0lzv+4QUzQbc=(|ypXTC-ESTNgWUPdBEyyG)vuXkc7GquxOA0=vws5=YO{ znz#I$euhc>l-+LoscUUcq|yqwj&?G$y#)%1R=}Z$aKoSS$No`n)nm?zl2HLf*=YmW zX{a$7W#SeS4~OwdI}V3QOjS+D4)Gz`erv=+(M8}1G^znJTc;)l1P#o zASr2gQIdaL{!!rY*r+}&p(}65v7VKIRpquh5Pk{}er9(qo z^qO0bqLPZ4;fNAI^3Tq%O`S2!jU!WsU5I(?{Ra=|%BZhwKO!&Hya4DeP= BCl?m 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 Date: Wed, 7 May 2025 23:47:24 +0900 Subject: [PATCH 20/27] =?UTF-8?q?public=EA=B5=AC=EC=A1=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/fonts/Akira Expanded Demo.otf | Bin .../{src => public}/assets/img/arrowicon.png | Bin .../{src => public}/assets/img/arrowicon.svg | 0 frontend/{src => public}/assets/img/logo.svg | 0 .../{src => public}/assets/img/moneyicon.png | Bin .../{src => public}/assets/img/moneyicon.svg | 0 .../assets/img/tabler--boom.svg | 0 frontend/src/Home.jsx | 3 +-- frontend/src/components/Header.jsx | 18 +++++++++++++----- frontend/src/main.jsx | 4 ++-- frontend/src/{assets => }/reset.css | 0 frontend/src/{assets => }/root.css | 0 12 files changed, 16 insertions(+), 9 deletions(-) rename frontend/{src => public}/assets/fonts/Akira Expanded Demo.otf (100%) rename frontend/{src => public}/assets/img/arrowicon.png (100%) rename frontend/{src => public}/assets/img/arrowicon.svg (100%) rename frontend/{src => public}/assets/img/logo.svg (100%) rename frontend/{src => public}/assets/img/moneyicon.png (100%) rename frontend/{src => public}/assets/img/moneyicon.svg (100%) rename frontend/{src => public}/assets/img/tabler--boom.svg (100%) rename frontend/src/{assets => }/reset.css (100%) rename frontend/src/{assets => }/root.css (100%) diff --git a/frontend/src/assets/fonts/Akira Expanded Demo.otf b/frontend/public/assets/fonts/Akira Expanded Demo.otf similarity index 100% rename from frontend/src/assets/fonts/Akira Expanded Demo.otf rename to frontend/public/assets/fonts/Akira Expanded Demo.otf diff --git a/frontend/src/assets/img/arrowicon.png b/frontend/public/assets/img/arrowicon.png similarity index 100% rename from frontend/src/assets/img/arrowicon.png rename to frontend/public/assets/img/arrowicon.png diff --git a/frontend/src/assets/img/arrowicon.svg b/frontend/public/assets/img/arrowicon.svg similarity index 100% rename from frontend/src/assets/img/arrowicon.svg rename to frontend/public/assets/img/arrowicon.svg diff --git a/frontend/src/assets/img/logo.svg b/frontend/public/assets/img/logo.svg similarity index 100% rename from frontend/src/assets/img/logo.svg rename to frontend/public/assets/img/logo.svg diff --git a/frontend/src/assets/img/moneyicon.png b/frontend/public/assets/img/moneyicon.png similarity index 100% rename from frontend/src/assets/img/moneyicon.png rename to frontend/public/assets/img/moneyicon.png diff --git a/frontend/src/assets/img/moneyicon.svg b/frontend/public/assets/img/moneyicon.svg similarity index 100% rename from frontend/src/assets/img/moneyicon.svg rename to frontend/public/assets/img/moneyicon.svg diff --git a/frontend/src/assets/img/tabler--boom.svg b/frontend/public/assets/img/tabler--boom.svg similarity index 100% rename from frontend/src/assets/img/tabler--boom.svg rename to frontend/public/assets/img/tabler--boom.svg diff --git a/frontend/src/Home.jsx b/frontend/src/Home.jsx index d8b1c7c..f1fe4fa 100644 --- a/frontend/src/Home.jsx +++ b/frontend/src/Home.jsx @@ -1,7 +1,6 @@ import React from "react"; import { useNavigate } from "react-router-dom"; import styles from "./Home.module.css"; -import logo from "./assets/img/logo.svg"; const Home = () => { const navigate = useNavigate(); @@ -23,7 +22,7 @@ const Home = () => {

ATTENDANCE

CHECK

- 로고 + 로고
); diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index c9ec60e..4ac3367 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -2,8 +2,6 @@ import React from "react"; import { useNavigate, useLocation } from "react-router-dom"; import { ArrowLeft, Wallet } from "lucide-react"; import "./componentsCss/Header.css"; -import arrowIcon from "../assets/img/arrowicon.svg"; -import moneyIcon from "../assets/img/moneyicon.svg"; const Header = () => { const navigate = useNavigate(); const location = useLocation(); @@ -23,7 +21,12 @@ const Header = () => { onClick={() => navigate(-1)} aria-label="뒤로가기" > - Back + Back

{title}

{showRightButton ? ( @@ -32,10 +35,15 @@ const Header = () => { onClick={() => navigate("/deposit")} aria-label="보증금 페이지 이동" > - Deposit + Deposit ) : ( -
// 오른쪽 공백 유지 +
)}
); diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index 0b2945d..1725ce4 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,8 +1,8 @@ import { createRoot } from "react-dom/client"; import App from "./App.jsx"; -import "./assets/root.css"; +import "./root.css"; import { BrowserRouter } from "react-router-dom"; -import "./assets/reset.css"; +import "./reset.css"; import { StrictMode } from "react"; createRoot(document.getElementById("root")).render( diff --git a/frontend/src/assets/reset.css b/frontend/src/reset.css similarity index 100% rename from frontend/src/assets/reset.css rename to frontend/src/reset.css diff --git a/frontend/src/assets/root.css b/frontend/src/root.css similarity index 100% rename from frontend/src/assets/root.css rename to frontend/src/root.css From 1b6272b2b58d9eb4aadd99f26a1c32d638a4ba0c Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 23:52:38 +0900 Subject: [PATCH 21/27] [Feat] Connect backend and frontend for Assignment section --- frontend/src/Assignment.jsx | 96 +++++++++++---------- frontend/src/api/assignment.js | 6 ++ frontend/src/components/WeeklyListBlock.jsx | 10 +-- frontend/src/utils/AssignmentStatus.js | 12 +++ 4 files changed, 74 insertions(+), 50 deletions(-) create mode 100644 frontend/src/api/assignment.js create mode 100644 frontend/src/utils/AssignmentStatus.js diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx index bad9e46..6d9789f 100644 --- a/frontend/src/Assignment.jsx +++ b/frontend/src/Assignment.jsx @@ -1,61 +1,67 @@ -import React from "react"; +import React, { useEffect, useState } from "react"; +import axios from "axios"; import WeeklyListBlock from "./components/WeeklyListBlock"; import Header from "./components/Header"; import AssignmentInfoBlock from "./components/AssignmentInfoBlock"; import styles from "./Assignment.module.css"; +import { mapStatus } from "./utils/AssignmentStatus.js"; const Assignment = () => { - const weeks = [ - { - label: "2주차 JS개론/웹개론", - details: [ - { - day: "화", - subject: "Git HTML CSS", - tasks: [ - { label: "제로초 인강", status: "done" }, - { label: "깃허브 클론 코딩", status: "progress" }, - ], - }, - { - day: "목", - subject: "Git HTML CSS", - tasks: [ - { label: "제로초 인강", status: "fail" }, - { label: "깃허브 클론 코딩", status: "progress" }, - ], - }, - ], - }, - { - label: "3주차 JS개론/웹개론", - details: [ - { - day: "화", - subject: "Git HTML CSS", - tasks: [], - }, - ], - }, - ]; - - //Assignment-Info-Block(형광 초록색카드 더미데이터) - const cardData = { - weekLabel: "3주차", - day: "화", - tasks: [{ label: "Django girls 과제" }, { label: "Django girls 과제" }], - }; + const [weeks, setWeeks] = useState([]); + const [highlightCard, setHighlightCard] = useState(null); + + useEffect(() => { + const user = JSON.parse(localStorage.getItem("user")); + const userId = user?.id; + + if (!userId) return; + + fetchAssignmentsByUser(userId) + .then((weekData) => { + const formatted = weekData.map((weekItem) => ({ + label: `${weekItem.week}주차 ${weekItem.title}`, + details: weekItem.days.map((dayItem) => ({ + day: dayItem.day, + subject: weekItem.title, + tasks: dayItem.details.map((task) => ({ + label: task.assignmentName, + status: mapStatus(task.status), + })), + })), + })); + + setWeeks(formatted); + + // 형광 카드용 하이라이트 카드 추출 (가장 최근 주차 + 첫 요일)=>운영진용 페이지 만든 후 수정필요 + // 운영진이 가장 최근 공개한 과제로. + if (formatted.length > 0 && formatted[0].details.length > 0) { + const first = formatted[0]; + const firstDay = first.details[0]; + + setHighlightCard({ + weekLabel: first.label, + day: firstDay.day, + tasks: firstDay.tasks, + }); + } + }) + .catch(() => { + alert("과제 정보를 불러오지 못했습니다."); + }); + }, []); return (
-
- -
- + {highlightCard && ( +
+ +
+ )}
); }; export default Assignment; + diff --git a/frontend/src/api/assignment.js b/frontend/src/api/assignment.js new file mode 100644 index 0000000..1887f5e --- /dev/null +++ b/frontend/src/api/assignment.js @@ -0,0 +1,6 @@ +import axios from "axios"; + +export const fetchAssignmentsByUser = async (userId) => { + const res = await axios.get(`/api/assignment/${userId}`); + return res.data; +}; diff --git a/frontend/src/components/WeeklyListBlock.jsx b/frontend/src/components/WeeklyListBlock.jsx index 8f8a7ee..52a7b92 100644 --- a/frontend/src/components/WeeklyListBlock.jsx +++ b/frontend/src/components/WeeklyListBlock.jsx @@ -12,7 +12,7 @@ const WeeklyListBlock = ({ weeks }) => { return (
{weeks.map((week, index) => ( -
+
+
+ + + + + +
); }; diff --git a/frontend/src/components/AttendanceWeekInfo.jsx b/frontend/src/components/AttendanceWeekInfo.jsx new file mode 100644 index 0000000..4f80431 --- /dev/null +++ b/frontend/src/components/AttendanceWeekInfo.jsx @@ -0,0 +1,12 @@ +import React from "react"; +import "./componentsCss/AttendanceWeekInfo.css"; + +const AttendanceWeekInfo = ({ week }) => { + return ( +
+

{week}주차

+
+ ); +}; + +export default AttendanceWeekInfo; diff --git a/frontend/src/components/componentsCss/AttendanceWeekInfo.css b/frontend/src/components/componentsCss/AttendanceWeekInfo.css new file mode 100644 index 0000000..23216da --- /dev/null +++ b/frontend/src/components/componentsCss/AttendanceWeekInfo.css @@ -0,0 +1,16 @@ +.eachWeekInfo { + width: 270px; + padding: 14px; + border-radius: 20px; + background-color: #6e6e6e; + border: 1px solid #d9d9d9; + margin-block: 20px; + display: flex; + align-items: center; +} +.weekInfo { + font-weight: 600; + font-size: 15px; + color: #ffffff; + font-family: "Inter", sans-serif; +} From a79c6f6f8e25bd25298ba74a8ae252f7cbb624b9 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Thu, 8 May 2025 00:02:34 +0900 Subject: [PATCH 24/27] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=90=98=EC=A7=80?= =?UTF-8?q?=EB=8A=94=20=EC=95=8A=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/index.html | 2 +- frontend/src/components/Header.jsx | 1 - frontend/src/main.jsx | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 0c589ec..79c4701 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,4 +1,4 @@ - + diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index 4ac3367..a4f62b1 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -1,6 +1,5 @@ import React from "react"; import { useNavigate, useLocation } from "react-router-dom"; -import { ArrowLeft, Wallet } from "lucide-react"; import "./componentsCss/Header.css"; const Header = () => { const navigate = useNavigate(); diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index 1725ce4..b318f90 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,7 +1,6 @@ import { createRoot } from "react-dom/client"; import App from "./App.jsx"; import "./root.css"; -import { BrowserRouter } from "react-router-dom"; import "./reset.css"; import { StrictMode } from "react"; From 73090890d9cd5bd278df23d1071fe62a8dee6f56 Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Thu, 8 May 2025 00:04:32 +0900 Subject: [PATCH 25/27] =?UTF-8?q?[fix]:=20public/img=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/{ => assets}/img/boom-filled-green.png | Bin .../public/{ => assets}/img/boom-filled-red.png | Bin frontend/public/{ => assets}/img/tabler--boom.png | Bin frontend/public/img/tabler--boom.svg | 1 - frontend/src/Attendance.jsx | 6 +++--- frontend/src/Attendance.module.css | 3 +++ 6 files changed, 6 insertions(+), 4 deletions(-) rename frontend/public/{ => assets}/img/boom-filled-green.png (100%) rename frontend/public/{ => assets}/img/boom-filled-red.png (100%) rename frontend/public/{ => assets}/img/tabler--boom.png (100%) delete mode 100644 frontend/public/img/tabler--boom.svg diff --git a/frontend/public/img/boom-filled-green.png b/frontend/public/assets/img/boom-filled-green.png similarity index 100% rename from frontend/public/img/boom-filled-green.png rename to frontend/public/assets/img/boom-filled-green.png diff --git a/frontend/public/img/boom-filled-red.png b/frontend/public/assets/img/boom-filled-red.png similarity index 100% rename from frontend/public/img/boom-filled-red.png rename to frontend/public/assets/img/boom-filled-red.png diff --git a/frontend/public/img/tabler--boom.png b/frontend/public/assets/img/tabler--boom.png similarity index 100% rename from frontend/public/img/tabler--boom.png rename to frontend/public/assets/img/tabler--boom.png diff --git a/frontend/public/img/tabler--boom.svg b/frontend/public/img/tabler--boom.svg deleted file mode 100644 index 8c6b2eb..0000000 --- a/frontend/public/img/tabler--boom.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index 7593b8c..36cff96 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -39,13 +39,13 @@ const Attendance = () => { )}
- +
- +
- +
diff --git a/frontend/src/Attendance.module.css b/frontend/src/Attendance.module.css index ea7f9d4..a6f3852 100644 --- a/frontend/src/Attendance.module.css +++ b/frontend/src/Attendance.module.css @@ -30,3 +30,6 @@ width: 100%; height: 100%; } +.attend_week_container { + margin-top: 20px; +} From 5a06c9dd5390cb91ab5354c9f1771fb2aaa495dd Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Thu, 8 May 2025 00:25:08 +0900 Subject: [PATCH 26/27] =?UTF-8?q?[add]:=20Attendance=20base=20tool=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/public/assets/img/full_coin_green.png | Bin 0 -> 22100 bytes frontend/public/assets/img/one_coin_yellow.png | Bin 0 -> 15784 bytes frontend/public/assets/img/three_out_red.png | Bin 0 -> 18409 bytes frontend/public/assets/img/two_coin_yellow.png | Bin 0 -> 19564 bytes frontend/src/Attendance.jsx | 6 +++--- frontend/src/components/AttendanceWeekInfo.jsx | 9 +++++++++ .../componentsCss/AttendanceWeekInfo.css | 11 ++++++++++- 7 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 frontend/public/assets/img/full_coin_green.png create mode 100644 frontend/public/assets/img/one_coin_yellow.png create mode 100644 frontend/public/assets/img/three_out_red.png create mode 100644 frontend/public/assets/img/two_coin_yellow.png diff --git a/frontend/public/assets/img/full_coin_green.png b/frontend/public/assets/img/full_coin_green.png new file mode 100644 index 0000000000000000000000000000000000000000..7471e14f6b8199c90e04974ba1347dd5e4d91f43 GIT binary patch literal 22100 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 Tvv?N({!@}ye_AGM{`P+WJ)9~B literal 0 HcmV?d00001 diff --git a/frontend/public/assets/img/three_out_red.png b/frontend/public/assets/img/three_out_red.png new file mode 100644 index 0000000000000000000000000000000000000000..d2729d1de98fb8a4b241d4c03040119098130a01 GIT binary patch literal 18409 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 Oe;&xG$bz)Vi~k1{PB~`) literal 0 HcmV?d00001 diff --git a/frontend/public/assets/img/two_coin_yellow.png b/frontend/public/assets/img/two_coin_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..80650f25fa9f7ba562ab5894af616ad46328f92d GIT binary patch literal 19564 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 S1w9D-Q { )}
- +
- +
- +
diff --git a/frontend/src/components/AttendanceWeekInfo.jsx b/frontend/src/components/AttendanceWeekInfo.jsx index 4f80431..2bae09c 100644 --- a/frontend/src/components/AttendanceWeekInfo.jsx +++ b/frontend/src/components/AttendanceWeekInfo.jsx @@ -5,6 +5,15 @@ const AttendanceWeekInfo = ({ week }) => { return (

{week}주차

+
+ +
+
+ +
+
+ +
); }; diff --git a/frontend/src/components/componentsCss/AttendanceWeekInfo.css b/frontend/src/components/componentsCss/AttendanceWeekInfo.css index 23216da..458de9d 100644 --- a/frontend/src/components/componentsCss/AttendanceWeekInfo.css +++ b/frontend/src/components/componentsCss/AttendanceWeekInfo.css @@ -2,11 +2,12 @@ width: 270px; padding: 14px; border-radius: 20px; - background-color: #6e6e6e; + background-color: #434343; border: 1px solid #d9d9d9; margin-block: 20px; display: flex; align-items: center; + justify-content: space-around; } .weekInfo { font-weight: 600; @@ -14,3 +15,11 @@ color: #ffffff; font-family: "Inter", sans-serif; } +.coin_img_container { + width: 30px; + height: 30px; +} +.coin_img_container > img { + width: 100%; + height: 100%; +} From 4c29ddae538e52dcb8a432e991d549bb3877da22 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Thu, 8 May 2025 00:28:15 +0900 Subject: [PATCH 27/27] [Fix] assignment api url --- .github/workflows/main.yml | 2 +- .gitignore | 1 - frontend/src/api/assignment.js | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 234cd69..69e3cdc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,7 +23,7 @@ jobs: - name: Send Discord notification env: - DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK }} run: | curl -H "Content-Type: application/json" \ -X POST \ diff --git a/.gitignore b/.gitignore index bf54333..53d4561 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,3 @@ .env *.pem .idea/ - diff --git a/frontend/src/api/assignment.js b/frontend/src/api/assignment.js index 1887f5e..4102105 100644 --- a/frontend/src/api/assignment.js +++ b/frontend/src/api/assignment.js @@ -1,6 +1,5 @@ import axios from "axios"; export const fetchAssignmentsByUser = async (userId) => { - const res = await axios.get(`/api/assignment/${userId}`); - return res.data; + const res = await axios.get(`/api/assignment/grouped/${userId}`); return res.data; };