dvc890 commited on
Commit
c728eff
·
verified ·
1 Parent(s): bb6e59d

Upload 45 files

Browse files
Files changed (3) hide show
  1. pages/AchievementStudent.tsx +22 -4
  2. pages/GameLucky.tsx +4 -2
  3. server.js +2 -1
pages/AchievementStudent.tsx CHANGED
@@ -1,7 +1,7 @@
1
 
2
  import React, { useState, useEffect } from 'react';
3
  import { api } from '../services/api';
4
- import { AchievementConfig, AchievementItem, Student, StudentAchievement, SystemConfig, TeacherExchangeConfig } from '../types';
5
  import { Award, ShoppingBag, Loader2, Calendar, Lock } from 'lucide-react';
6
  import { Emoji } from '../components/Emoji';
7
 
@@ -11,6 +11,7 @@ export const AchievementStudent: React.FC = () => {
11
  const [config, setConfig] = useState<AchievementConfig | null>(null);
12
  const [teacherRules, setTeacherRules] = useState<TeacherExchangeConfig[]>([]);
13
  const [myAchievements, setMyAchievements] = useState<StudentAchievement[]>([]);
 
14
 
15
  // UI State
16
  const [activeTab, setActiveTab] = useState<'wall' | 'shop'>('wall');
@@ -19,6 +20,17 @@ export const AchievementStudent: React.FC = () => {
19
 
20
  const currentUser = api.auth.getCurrentUser();
21
 
 
 
 
 
 
 
 
 
 
 
 
22
  useEffect(() => {
23
  loadData();
24
  }, [selectedSemester]);
@@ -52,6 +64,7 @@ export const AchievementStudent: React.FC = () => {
52
  // Fetch Teacher Rules
53
  // Get ALL associated teachers (Homeroom + Course teachers)
54
  const teachers = await api.users.getTeachersForClass(me.className);
 
55
  const teacherIds = teachers.map((t: any) => t._id);
56
 
57
  if (teacherIds.length > 0) {
@@ -204,11 +217,16 @@ export const AchievementStudent: React.FC = () => {
204
  <p className="text-xs mt-2">请提醒你的任课老师在“成就管理-兑换规则”中添加奖品哦!</p>
205
  </div>
206
  ) : (
207
- teacherRules.map(teacherConfig => (
 
 
 
 
 
208
  teacherConfig.rules.length > 0 && (
209
  <div key={teacherConfig.teacherId} className="bg-white rounded-xl border border-gray-200 p-6 shadow-sm">
210
  <h3 className="font-bold text-lg text-gray-800 mb-4 border-b pb-2 flex items-center">
211
- 🛍️ {teacherConfig.teacherName} 的兑换店
212
  </h3>
213
  <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
214
  {teacherConfig.rules.map(rule => {
@@ -235,7 +253,7 @@ export const AchievementStudent: React.FC = () => {
235
  </div>
236
  </div>
237
  )
238
- ))
239
  )}
240
  </div>
241
  )}
 
1
 
2
  import React, { useState, useEffect } from 'react';
3
  import { api } from '../services/api';
4
+ import { AchievementConfig, AchievementItem, Student, StudentAchievement, SystemConfig, TeacherExchangeConfig, User } from '../types';
5
  import { Award, ShoppingBag, Loader2, Calendar, Lock } from 'lucide-react';
6
  import { Emoji } from '../components/Emoji';
7
 
 
11
  const [config, setConfig] = useState<AchievementConfig | null>(null);
12
  const [teacherRules, setTeacherRules] = useState<TeacherExchangeConfig[]>([]);
13
  const [myAchievements, setMyAchievements] = useState<StudentAchievement[]>([]);
14
+ const [availableTeachers, setAvailableTeachers] = useState<User[]>([]); // To resolve teacher names
15
 
16
  // UI State
17
  const [activeTab, setActiveTab] = useState<'wall' | 'shop'>('wall');
 
20
 
21
  const currentUser = api.auth.getCurrentUser();
22
 
23
+ // Helper to format polite teacher name
24
+ const formatTeacherName = (t: User | undefined) => {
25
+ if (!t) return '未知老师';
26
+ const name = t.trueName || t.username;
27
+ const surname = name.charAt(0);
28
+ // Use teachingSubject if available, otherwise just Surname + Teacher.
29
+ // Do not default to "科任".
30
+ const subject = t.teachingSubject;
31
+ return subject ? `${subject}-${surname}老师` : `${surname}老师`;
32
+ };
33
+
34
  useEffect(() => {
35
  loadData();
36
  }, [selectedSemester]);
 
64
  // Fetch Teacher Rules
65
  // Get ALL associated teachers (Homeroom + Course teachers)
66
  const teachers = await api.users.getTeachersForClass(me.className);
67
+ setAvailableTeachers(teachers); // Save for formatting
68
  const teacherIds = teachers.map((t: any) => t._id);
69
 
70
  if (teacherIds.length > 0) {
 
217
  <p className="text-xs mt-2">请提醒你的任课老师在“成就管理-兑换规则”中添加奖品哦!</p>
218
  </div>
219
  ) : (
220
+ teacherRules.map(teacherConfig => {
221
+ // Resolve teacher info to get subject
222
+ const teacherObj = availableTeachers.find(t => t._id === teacherConfig.teacherId);
223
+ const displayName = teacherObj ? formatTeacherName(teacherObj) : teacherConfig.teacherName;
224
+
225
+ return (
226
  teacherConfig.rules.length > 0 && (
227
  <div key={teacherConfig.teacherId} className="bg-white rounded-xl border border-gray-200 p-6 shadow-sm">
228
  <h3 className="font-bold text-lg text-gray-800 mb-4 border-b pb-2 flex items-center">
229
+ 🛍️ {displayName} 的兑换店
230
  </h3>
231
  <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
232
  {teacherConfig.rules.map(rule => {
 
253
  </div>
254
  </div>
255
  )
256
+ )})
257
  )}
258
  </div>
259
  )}
pages/GameLucky.tsx CHANGED
@@ -91,8 +91,10 @@ export const GameLucky: React.FC<{className?: string}> = ({ className }) => {
91
  if (!t) return '未知老师';
92
  const name = t.trueName || t.username;
93
  const surname = name.charAt(0);
94
- const subject = t.teachingSubject || '科任';
95
- return `${subject}-${surname}老师`;
 
 
96
  };
97
 
98
  useEffect(() => {
 
91
  if (!t) return '未知老师';
92
  const name = t.trueName || t.username;
93
  const surname = name.charAt(0);
94
+ // Use teachingSubject if available, otherwise just Surname + Teacher.
95
+ // Do not default to "科任".
96
+ const subject = t.teachingSubject;
97
+ return subject ? `${subject}-${surname}老师` : `${surname}老师`;
98
  };
99
 
100
  useEffect(() => {
server.js CHANGED
@@ -157,7 +157,8 @@ app.get('/api/classes/:className/teachers', async (req, res) => {
157
 
158
  if (teacherIds.size === 0) return res.json([]);
159
 
160
- const teachers = await User.find({ _id: { $in: Array.from(teacherIds) } }, 'trueName username _id');
 
161
  res.json(teachers);
162
  } catch (e) {
163
  console.error("Error fetching teachers", e);
 
157
 
158
  if (teacherIds.size === 0) return res.json([]);
159
 
160
+ // UPDATED: Include teachingSubject in the response
161
+ const teachers = await User.find({ _id: { $in: Array.from(teacherIds) } }, 'trueName username _id teachingSubject');
162
  res.json(teachers);
163
  } catch (e) {
164
  console.error("Error fetching teachers", e);