Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions frontend/src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import Assignment from "./pages/generation/Assignment";
import Deposit from "./pages/generation/Deposit";
import Intro from "./Intro";
import Admin from "./pages/admin/Admin";
import DetailManageStudent from "./pages/admin/DetailManageStudent.jsx";
import ManageStudent from "./pages/admin/ManageStudent.jsx";
import ManageTask from "./pages/admin/ManageTask.jsx";
import AttendanceCode from "./pages/admin/AttendanceCode";
Expand Down Expand Up @@ -68,6 +69,14 @@ function App() {
</RequireAdmin>
}
/>
<Route
path="/managestudent/detail/:studentId"
element={
<RequireAdmin>
<DetailManageStudent />
</RequireAdmin>
}
/>
<Route
path="/managetask"
element={
Expand Down
10 changes: 10 additions & 0 deletions frontend/src/api/students.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,13 @@ export const getStudentsByName = async (name) => {
});
return res.data; // [{ id: ..., name: ... }]
};

export const getStudentDetail = async (studentId) => {
try {
const res = await api.get(`/admin/managestudent/${studentId}`);
return res.data;
} catch (error) {
console.error("학생 상세 정보 불러오기 실패:", error);
throw error;
}
};
47 changes: 47 additions & 0 deletions frontend/src/pages/admin/DetailManageStudent.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { useParams } from "react-router-dom";
import { useEffect, useState } from "react";
import Header from "../../components/Header";
import style from "./DetailManageStudent.module.css";
import { getStudentDetail } from "../../api/students";

const DetailManageStudent = () => {
const { studentId } = useParams();
const [student, setStudent] = useState(null);

useEffect(() => {
const fetchStudent = async () => {
try {
const data = await getStudentDetail(studentId);
setStudent(data);
} catch (err) {
console.error("학생 상세 정보 불러오기 실패:", err);
}
};

fetchStudent();
}, [studentId]);

if (!student) return <div>loading...</div>;

return (
<div className={style.managestudent_wrapper}>
<Header />
<div className={style.under_header}>
<div className={style.student_card}>
<h2>{student.name}</h2>
<p>잔여 보증금: {student.deposit}원</p>
<p>보증금 방어권: {student.defence}</p>
</div>

<div className={style.assignment_list}>
{student.assignmentTitles.map((title, idx) => (
<button key={idx} className={style.assignment_button}>
{title}
</button>
))}
</div>
</div>
</div>
);
};
export default DetailManageStudent;
11 changes: 11 additions & 0 deletions frontend/src/pages/admin/DetailManageStudent.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.managestudent_wrapper {
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
}
.under_header {
display: flex;
flex-direction: column;
align-items: center;
}
8 changes: 7 additions & 1 deletion frontend/src/pages/admin/ManageStudent.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
import { getStudentsByName } from "../../api/students";
import Header from "../../components/Header";
import InputBlock from "../../components/InputBlock";
Expand All @@ -8,6 +9,7 @@ const ManageStudent = () => {
const [studentName, setStudentName] = useState([""]);
const [page, setPage] = useState(1);
const [students, setStudents] = useState([]); // 서버 데이터 저장
const navigate = useNavigate();

const studentsPerPage = 6;

Expand Down Expand Up @@ -54,7 +56,11 @@ const ManageStudent = () => {
/>
<div className={style.student_list}>
{paginatedStudents.map((student, index) => (
<button key={student.id || index} className={style.student_button}>
<button
key={student.id || index}
className={style.student_button}
onClick={() => navigate(`/managestudent/detail/${student.id}`)}
>
{student.name} <span>&gt;</span>
</button>
))}
Expand Down
3 changes: 3 additions & 0 deletions frontend/src/pages/admin/ManageStudent.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
text-align: left;
font-size: 16px;
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
.student_button:hover {
border: 1px solid #39ff14;
Expand Down