From e5d3fc46f6bbcca80ef7d4a52f3114e16c628860 Mon Sep 17 00:00:00 2001 From: OwenWu930302 <050915123a@gmail.com> Date: Fri, 6 Jun 2025 13:21:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E8=87=B4=E5=8A=9F=E8=83=BD=E5=B7=B2?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/TeacherController.php | 28 ++++++++++ app/Http/Controllers/WorksController.php | 8 +-- app/Models/Past_projects.php | 23 ++++++++ app/Models/Team.php | 16 ++++-- app/Models/Team_members.php | 18 +++++++ package-lock.json | 13 +++-- package.json | 1 + resources/js/Pages/Teacher/Index.jsx | 63 ++++++++++++++++++++++ resources/js/Pages/Welcome.jsx | 28 +++++++++- resources/js/Pages/Works/Index.jsx | 25 ++++----- routes/web.php | 14 ++--- 11 files changed, 202 insertions(+), 35 deletions(-) create mode 100644 app/Http/Controllers/TeacherController.php create mode 100644 app/Models/Past_projects.php create mode 100644 app/Models/Team_members.php create mode 100644 resources/js/Pages/Teacher/Index.jsx diff --git a/app/Http/Controllers/TeacherController.php b/app/Http/Controllers/TeacherController.php new file mode 100644 index 0000000..15c55fd --- /dev/null +++ b/app/Http/Controllers/TeacherController.php @@ -0,0 +1,28 @@ +with([ + 'projects:id,team_id,title,proposal_path,poster_path,code_link,created_at,updated_at', + 'teammembers.user:id,name,email' + ]) + ->select('id', 'name', 'advisor_id') + ->get(); + + return Inertia::render('Teacher/Index', [ + 'teams' => $teams, + ]); + } +} diff --git a/app/Http/Controllers/WorksController.php b/app/Http/Controllers/WorksController.php index 85567bd..e6f1e47 100644 --- a/app/Http/Controllers/WorksController.php +++ b/app/Http/Controllers/WorksController.php @@ -1,7 +1,7 @@ input('search')) { $query->where('title', 'like', "%{$search}%"); } - $works = $query->orderBy('id', 'desc')->paginate(10); + $pastWorks = $query->orderBy('id', 'desc')->paginate(10); return Inertia::render('Works/Index', [ - 'works' => $works, + 'pastWorks' => $pastWorks, 'filters' => $request->only('search'), ]); } diff --git a/app/Models/Past_projects.php b/app/Models/Past_projects.php new file mode 100644 index 0000000..e6c11d1 --- /dev/null +++ b/app/Models/Past_projects.php @@ -0,0 +1,23 @@ +hasMany(Project::class, 'team_id', 'id'); + } + + public function teamMembers() + { + return $this->hasMany(Team_members::class, 'team_id', 'id'); + } } diff --git a/app/Models/Team_members.php b/app/Models/Team_members.php new file mode 100644 index 0000000..c3d7750 --- /dev/null +++ b/app/Models/Team_members.php @@ -0,0 +1,18 @@ +belongsTo(User::class, 'user_id', 'id'); + } +} diff --git a/package-lock.json b/package-lock.json index 51f1384..9e57e06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "packages": { "": { "dependencies": { + "@heroicons/react": "^2.2.0", "animate.css": "^4.1.1", "framer-motion": "^12.15.0" }, @@ -828,6 +829,15 @@ "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, + "node_modules/@heroicons/react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", + "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==", + "license": "MIT", + "peerDependencies": { + "react": ">= 16 || ^19.0.0-rc" + } + }, "node_modules/@inertiajs/core": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-2.0.11.tgz", @@ -2992,7 +3002,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "devOptional": true, "license": "MIT" }, "node_modules/jsesc": { @@ -3311,7 +3320,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "devOptional": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -3861,7 +3869,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "devOptional": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" diff --git a/package.json b/package.json index 46ad43e..e941e2d 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "vite": "^6.2.4" }, "dependencies": { + "@heroicons/react": "^2.2.0", "animate.css": "^4.1.1", "framer-motion": "^12.15.0" } diff --git a/resources/js/Pages/Teacher/Index.jsx b/resources/js/Pages/Teacher/Index.jsx new file mode 100644 index 0000000..9aca68b --- /dev/null +++ b/resources/js/Pages/Teacher/Index.jsx @@ -0,0 +1,63 @@ +import React from 'react'; +import Header from "@/Components/Header"; +import Footer from "@/Components/Footer"; +import SidePanel from "@/Components/SidePanel"; + +export default function Index({ auth, teams = [] }) { + return ( +
+
+ +
+

我的指導隊伍與學生作品

+ {teams.length === 0 ? ( +

目前沒有您的指導隊伍。

+ ) : ( + teams.map(team => ( +
+

隊伍:{team.name}(ID: {team.id})

+

學生名單:

+
    + {team.teammembers && team.teammembers.length > 0 ? ( + team.teammembers.map(member => ( +
  • + 學號:{member.user_id} + {member.user ? `,姓名:${member.user.name}(${member.user.email})` : ',未知學生'} +
  • + )) + ) : ( +
  • 尚無學生資料
  • + )} +
+

作品列表:

+
    + {team.projects && team.projects.length > 0 ? ( + team.projects.map(project => ( +
  • + {project.title} + {project.proposal_path && ( + <> | 企劃書:下載 + )} + {project.poster_path && ( + <> | 海報:下載 + )} + {project.code_link && ( + <> | 程式碼:檢視 + )} +
  • + )) + ) : ( +
  • 尚無作品
  • + )} +
+
+ )) + )} +
+
+ ); +} diff --git a/resources/js/Pages/Welcome.jsx b/resources/js/Pages/Welcome.jsx index 792397e..cb0994b 100644 --- a/resources/js/Pages/Welcome.jsx +++ b/resources/js/Pages/Welcome.jsx @@ -104,7 +104,33 @@ export default function Welcome({ auth, notices }) {

)} - + {auth?.user?.role === "teacher" && ( + +

+ 老師專區 +

+

+ 查看指導隊伍作品 +

+ + )} + {auth?.user?.role === "teacher" && ( + +

+ 老師專區 +

+

+ 查看歷屆作品 +

+ + )} + {auth?.user?.role === "admin" && ( { e.preventDefault(); - router.get(route('works.index'), { search }); + router.get(route('past-works.index'), { search }); }; return ( @@ -18,12 +18,13 @@ export default function WorksIndex({ works, filters, auth }) {
+

參考過去作品

setSearch(e.target.value)} - placeholder="搜尋標題" + placeholder="搜尋作品標題" className="flex-1 border rounded px-3 py-2 dark:text-black" />