Spaces:
Running
Running
| export enum UserRole { | |
| ADMIN = 'ADMIN', | |
| PRINCIPAL = 'PRINCIPAL', | |
| TEACHER = 'TEACHER', | |
| STUDENT = 'STUDENT', | |
| USER = 'USER' | |
| } | |
| export enum UserStatus { | |
| ACTIVE = 'active', | |
| PENDING = 'pending', | |
| BANNED = 'banned' | |
| } | |
| export interface User { | |
| id?: number; | |
| _id?: string; | |
| username: string; | |
| password?: string; | |
| trueName?: string; | |
| phone?: string; | |
| email?: string; | |
| schoolId?: string; | |
| role: UserRole | string; | |
| status: UserStatus | string; | |
| avatar?: string; | |
| createTime?: string; | |
| teachingSubject?: string; | |
| homeroomClass?: string; | |
| aiAccess?: boolean; | |
| menuOrder?: string[]; | |
| classApplication?: { | |
| type: 'CLAIM' | 'RESIGN'; | |
| targetClass?: string; | |
| status: 'PENDING' | 'REJECTED'; | |
| }; | |
| // For Principal creating a new school | |
| pendingSchoolData?: { | |
| name: string; | |
| code: string; | |
| }; | |
| studentNo?: string; | |
| parentName?: string; | |
| parentPhone?: string; | |
| address?: string; | |
| gender?: 'Male' | 'Female'; | |
| seatNo?: string; | |
| idCard?: string; | |
| doubaoState?: { | |
| responseId?: string; | |
| thinkingState?: boolean; | |
| }; | |
| } | |
| export interface Student { | |
| id?: number; | |
| _id?: string; | |
| schoolId?: string; | |
| studentNo: string; | |
| seatNo?: string; | |
| name: string; | |
| gender: 'Male' | 'Female'; | |
| birthday?: string; | |
| idCard?: string; | |
| phone?: string; | |
| className: string; | |
| status: 'Enrolled' | 'Graduated' | 'Suspended'; | |
| parentName?: string; | |
| parentPhone?: string; | |
| address?: string; | |
| teamId?: string; | |
| drawAttempts?: number; | |
| dailyDrawLog?: { date: string, count: number }; | |
| flowerBalance?: number; | |
| // New Seating Fields | |
| height?: number; // cm | |
| vision?: 'Normal' | 'Near-Mild' | 'Near-Severe' | 'Far' | 'Unknown'; | |
| character?: 'Active' | 'Quiet' | 'Naughty' | 'Steady' | 'Unknown'; | |
| seatRow?: number; | |
| seatCol?: number; | |
| } | |
| export interface PeriodConfig { | |
| period: number; | |
| name: string; | |
| startTime?: string; | |
| endTime?: string; | |
| } | |
| export interface ClassInfo { | |
| id?: number; | |
| _id?: string; | |
| schoolId?: string; | |
| grade: string; | |
| className: string; | |
| teacherName?: string; | |
| homeroomTeacherIds?: string[]; | |
| studentCount?: number; | |
| periodConfig?: PeriodConfig[]; | |
| seatingConfig?: { rows: number; cols: number; }; // New layout config | |
| } | |
| export interface Course { | |
| id?: number; | |
| _id?: string; | |
| schoolId?: string; | |
| courseCode?: string; | |
| courseName: string; | |
| teacherName: string; | |
| teacherId?: string; | |
| className: string; | |
| credits?: number; | |
| capacity?: number; | |
| enrolled?: number; | |
| } | |
| export type ExamStatus = 'Normal' | 'Absent' | 'Leave' | 'Cheat'; | |
| export interface Score { | |
| id?: number; | |
| _id?: string; | |
| schoolId?: string; | |
| studentName: string; | |
| studentNo: string; | |
| courseName: string; | |
| score: number; | |
| semester?: string; | |
| type: string; | |
| examName?: string; | |
| status?: ExamStatus; | |
| } | |
| export interface Subject { | |
| id?: number; | |
| _id?: string; | |
| schoolId?: string; | |
| name: string; | |
| code?: string; | |
| color?: string; | |
| excellenceThreshold?: number; | |
| thresholds?: Record<string, number>; | |
| } | |
| export interface Exam { | |
| _id?: string; | |
| schoolId?: string; | |
| name: string; | |
| date: string; | |
| type: string; // 'Midterm', 'Final', 'Quiz' | |
| semester?: string; | |
| } | |
| export interface Schedule { | |
| id?: number; | |
| _id?: string; | |
| schoolId?: string; | |
| className: string; | |
| teacherName: string; | |
| subject: string; | |
| dayOfWeek: number; | |
| period: number; | |
| weekType?: 'ALL' | 'ODD' | 'EVEN'; | |
| } | |
| export interface School { | |
| id?: number; | |
| _id?: string; | |
| name: string; | |
| code: string; | |
| } | |
| export interface Notification { | |
| _id?: string; | |
| schoolId?: string; | |
| targetRole?: string; | |
| targetUserId?: string; | |
| title: string; | |
| content: string; | |
| type: 'info' | 'success' | 'warning' | 'error'; | |
| createTime: string; | |
| } | |
| export interface OpenRouterModelConfig { | |
| id: string; // The model name (e.g., qwen/qwen3-coder:free) | |
| name?: string; // Optional friendly name | |
| apiUrl?: string; // Optional custom API URL | |
| isCustom: boolean; // Built-in vs Custom | |
| } | |
| export interface DoubaoModelConfig { | |
| modelId: string; // The Model ID (e.g. doubao-pro-32k) | |
| endpointId: string; // The Endpoint ID (e.g. ep-2024xxxx) - Required for API | |
| name?: string; // Friendly Name | |
| } | |
| export interface SystemConfig { | |
| systemName: string; | |
| semester: string; | |
| semesters?: string[]; | |
| allowRegister: boolean; | |
| allowAdminRegister: boolean; | |
| allowPrincipalRegister?: boolean; | |
| allowStudentRegister?: boolean; | |
| maintenanceMode: boolean; | |
| emailNotify: boolean; | |
| enableAI?: boolean; | |
| aiTotalCalls?: number; | |
| aiProviderOrder?: string[]; // 'GEMINI', 'OPENROUTER', 'GEMMA', 'DOUBAO' | |
| periodConfig?: PeriodConfig[]; | |
| apiKeys?: { | |
| gemini?: string[]; | |
| openrouter?: string[]; | |
| doubao?: string[]; // NEW: Doubao keys | |
| }; | |
| doubaoModels?: DoubaoModelConfig[]; // NEW | |
| openRouterModels?: OpenRouterModelConfig[]; | |
| } | |
| export interface SchoolCalendarEntry { | |
| _id?: string; | |
| schoolId: string; | |
| className?: string; | |
| type: 'HOLIDAY' | 'BREAK' | 'OFF' | 'WORKDAY'; | |
| startDate: string; | |
| endDate: string; | |
| name: string; | |
| } | |
| export interface Todo { | |
| _id?: string; | |
| userId: string; | |
| content: string; | |
| isCompleted: boolean; | |
| createTime: string; | |
| } | |
| // Game & Rewards | |
| export interface GameTeam { | |
| id: string; | |
| name: string; | |
| score: number; | |
| avatar: string; | |
| color: string; | |
| members: string[]; | |
| } | |
| export interface GameRewardConfig { | |
| scoreThreshold: number; | |
| rewardType: 'DRAW_COUNT' | 'ITEM' | 'ACHIEVEMENT'; | |
| rewardName: string; | |
| rewardValue: number; | |
| achievementId?: string; | |
| } | |
| export interface GameSession { | |
| _id?: string; | |
| schoolId: string; | |
| className: string; | |
| subject: string; | |
| isEnabled: boolean; | |
| maxSteps: number; | |
| teams: GameTeam[]; | |
| rewardsConfig: GameRewardConfig[]; | |
| } | |
| export interface StudentReward { | |
| _id?: string; | |
| schoolId: string; | |
| studentId: string; | |
| studentName: string; | |
| rewardType: 'DRAW_COUNT' | 'ITEM' | 'CONSOLATION' | 'ACHIEVEMENT'; | |
| name: string; | |
| count: number; | |
| status: 'PENDING' | 'REDEEMED'; | |
| source: string; | |
| createTime: string; | |
| ownerId?: string; | |
| } | |
| export interface LuckyPrize { | |
| id: string; | |
| name: string; | |
| probability: number; | |
| count: number; | |
| icon?: string; | |
| } | |
| export interface LuckyDrawConfig { | |
| _id?: string; | |
| schoolId: string; | |
| className: string; | |
| ownerId?: string; | |
| prizes: LuckyPrize[]; | |
| dailyLimit: number; | |
| cardCount: number; | |
| defaultPrize: string; | |
| consolationWeight: number; | |
| } | |
| export interface AchievementItem { | |
| id: string; | |
| name: string; | |
| icon: string; | |
| points: number; | |
| description?: string; | |
| addedBy?: string; | |
| addedByName?: string; | |
| } | |
| export interface ExchangeRule { | |
| id: string; | |
| cost: number; | |
| rewardType: 'DRAW_COUNT' | 'ITEM'; | |
| rewardName: string; | |
| rewardValue: number; | |
| achievementId?: string; | |
| } | |
| export interface AchievementConfig { | |
| _id?: string; | |
| schoolId: string; | |
| className: string; | |
| achievements: AchievementItem[]; | |
| exchangeRules: ExchangeRule[]; | |
| } | |
| export interface TeacherExchangeConfig { | |
| _id?: string; | |
| schoolId: string; | |
| teacherId: string; | |
| teacherName: string; | |
| rules: ExchangeRule[]; | |
| } | |
| export interface StudentAchievement { | |
| _id?: string; | |
| schoolId: string; | |
| studentId: string; | |
| studentName: string; | |
| achievementId: string; | |
| achievementName: string; | |
| achievementIcon: string; | |
| points?: number; | |
| semester: string; | |
| createTime: string; | |
| } | |
| export interface Attendance { | |
| _id?: string; | |
| schoolId: string; | |
| studentId: string; | |
| studentName: string; | |
| className: string; | |
| date: string; | |
| status: 'Present' | 'Absent' | 'Leave'; | |
| checkInTime?: string; | |
| } | |
| export interface LeaveRequest { | |
| _id?: string; | |
| schoolId: string; | |
| studentId: string; | |
| studentName: string; | |
| className: string; | |
| reason: string; | |
| startDate: string; | |
| endDate: string; | |
| status: 'Pending' | 'Approved' | 'Rejected'; | |
| createTime: string; | |
| } | |
| export interface Wish { | |
| _id?: string; | |
| schoolId: string; | |
| studentId: string; | |
| studentName: string; | |
| className?: string; | |
| teacherId: string; | |
| teacherName: string; | |
| content: string; | |
| status: 'PENDING' | 'FULFILLED'; | |
| createTime: string; | |
| fulfillTime?: string; | |
| } | |
| export interface Feedback { | |
| _id?: string; | |
| schoolId: string; | |
| creatorId: string; | |
| creatorName: string; | |
| creatorRole: string; | |
| targetId?: string; | |
| targetName?: string; | |
| content: string; | |
| type: 'ACADEMIC' | 'SYSTEM'; | |
| status: 'PENDING' | 'ACCEPTED' | 'PROCESSED' | 'IGNORED'; | |
| reply?: string; | |
| createTime: string; | |
| updateTime?: string; | |
| } | |
| export interface AIChatMessage { | |
| id: string; | |
| role: 'user' | 'model'; | |
| text?: string; | |
| thought?: string; // New: For Deep Thinking Chain of Thought | |
| audio?: string; | |
| images?: string[]; | |
| isAudioMessage?: boolean; | |
| isGeneratingAudio?: boolean; // New status flag for UI | |
| isSearching?: boolean; // New status flag for search | |
| timestamp: number; | |
| } | |
| // --- Comment Generator Types --- | |
| export type ClassRole = 'YES' | 'NO'; | |
| export type Discipline = 'YES' | 'AVERAGE' | 'NO'; | |
| export type AcademicQuality = 'EXCELLENT' | 'GOOD' | 'PASS' | 'FAIL'; | |
| export type Personality = '活泼' | '内敛' | '沉稳' | '细心' | '热心' | '恒心' | '爱心' | '勇敢' | '正义'; | |
| export type Hobby = '体育' | '音乐' | '舞蹈' | '绘画' | '书法' | '手工' | '其他'; | |
| export type Labor = '热爱' | '一般' | '较少参与'; | |
| export type Zodiac = '鼠' | '牛' | '虎' | '兔' | '龙' | '蛇' | '马' | '羊' | '猴' | '鸡' | '狗' | '猪'; | |
| // 学生画像接口 | |
| export interface StudentProfile { | |
| name: string; | |
| classRole: ClassRole; | |
| discipline: Discipline; | |
| academic: AcademicQuality; | |
| personality: Personality; | |
| hobby: Hobby; | |
| labor: Labor; | |
| zodiacYear: Zodiac; | |
| wordCount: number; | |
| } | |
| // 已保存记录接口 | |
| export interface SavedRecord { | |
| id: string; | |
| name: string; | |
| comment: string; | |
| zodiac: Zodiac; | |
| timestamp: number; | |
| } | |