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 }) {
+ 參考過去作品