feat: complete student archive subsystem — 7 entities, PDF report, frontend profile page

This commit is contained in:
2026-07-06 15:58:36 +08:00
parent b6990dd11b
commit 8bd59b8ac6
15 changed files with 1539 additions and 9 deletions

View File

@@ -0,0 +1,52 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import { Student } from './student.entity';
import { Department } from './department.entity';
@Entity('archive_attachments')
export class ArchiveAttachment {
@PrimaryGeneratedColumn()
id: number;
@Column({ name: 'student_id', type: 'integer' })
studentId: number;
@ManyToOne(() => Student, { eager: true })
@JoinColumn({ name: 'student_id' })
student: Student;
@Column({ length: 50, nullable: true })
category: string;
@Column({ name: 'file_name', length: 255, nullable: true })
fileName: string;
@Column({ name: 'file_path', length: 500, nullable: true })
filePath: string;
@Column({ name: 'file_size', type: 'integer', nullable: true })
fileSize: number;
@Column({ name: 'mime_type', length: 100, nullable: true })
mimeType: string;
@Column({ name: 'department_id', type: 'integer', nullable: true })
departmentId: number;
@ManyToOne(() => Department, { nullable: true })
@JoinColumn({ name: 'department_id' })
department: Department;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}

View File

@@ -0,0 +1,66 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import { Student } from './student.entity';
import { StudentEnrollment } from './student-enrollment.entity';
import { Department } from './department.entity';
@Entity('exam_scores')
export class ExamScore {
@PrimaryGeneratedColumn()
id: number;
@Column({ name: 'student_id', type: 'integer' })
studentId: number;
@ManyToOne(() => Student, { eager: true })
@JoinColumn({ name: 'student_id' })
student: Student;
@Column({ name: 'enrollment_id', type: 'integer', nullable: true })
enrollmentId: number;
@ManyToOne(() => StudentEnrollment, { nullable: true })
@JoinColumn({ name: 'enrollment_id' })
enrollment: StudentEnrollment;
@Column({ name: 'exam_type', length: 50, nullable: true })
examType: string;
@Column({ name: 'exam_name', length: 100, nullable: true })
examName: string;
@Column({ length: 50, nullable: true })
subject: string;
@Column({ type: 'decimal', precision: 5, scale: 2, nullable: true })
score: number;
@Column({ name: 'class_avg', type: 'decimal', precision: 5, scale: 2, nullable: true })
classAvg: number;
@Column({ type: 'integer', nullable: true })
rank: number;
@Column({ name: 'exam_date', type: 'date', nullable: true })
examDate: string;
@Column({ name: 'department_id', type: 'integer', nullable: true })
departmentId: number;
@ManyToOne(() => Department, { nullable: true })
@JoinColumn({ name: 'department_id' })
department: Department;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}

View File

@@ -26,3 +26,10 @@ export { ExpenseType } from './expense-type.entity';
export { Notification, NotificationType } from './notification.entity';
export { Department, DepartmentType } from './department.entity';
export { UserDepartment } from './user-department.entity';
export { StudentProfile } from './student-profile.entity';
export { StudentEnrollment } from './student-enrollment.entity';
export { ExamScore } from './exam-score.entity';
export { LearningRecord } from './learning-record.entity';
export { ResultArchive } from './result-archive.entity';
export { ArchiveAttachment } from './archive-attachment.entity';
export { StudentReport } from './student-report.entity';

View File

@@ -0,0 +1,52 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import { Student } from './student.entity';
import { Department } from './department.entity';
@Entity('learning_records')
export class LearningRecord {
@PrimaryGeneratedColumn()
id: number;
@Column({ name: 'student_id', type: 'integer' })
studentId: number;
@ManyToOne(() => Student, { eager: true })
@JoinColumn({ name: 'student_id' })
student: Student;
@Column({ name: 'record_date', type: 'date', nullable: true })
recordDate: string;
@Column({ name: 'record_type', length: 50, nullable: true })
recordType: string;
@Column({ type: 'text', nullable: true })
content: string;
@Column({ name: 'follow_up_method', length: 50, nullable: true })
followUpMethod: string;
@Column({ name: 'next_step', type: 'text', nullable: true })
nextStep: string;
@Column({ name: 'department_id', type: 'integer', nullable: true })
departmentId: number;
@ManyToOne(() => Department, { nullable: true })
@JoinColumn({ name: 'department_id' })
department: Department;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}

View File

@@ -0,0 +1,52 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import { Student } from './student.entity';
import { Department } from './department.entity';
@Entity('result_archives')
export class ResultArchive {
@PrimaryGeneratedColumn()
id: number;
@Column({ name: 'student_id', type: 'integer', unique: true })
studentId: number;
@ManyToOne(() => Student, { eager: true })
@JoinColumn({ name: 'student_id' })
student: Student;
@Column({ name: 'culture_final_score', type: 'decimal', precision: 5, scale: 2, nullable: true })
cultureFinalScore: number;
@Column({ name: 'professional_final_score', type: 'decimal', precision: 5, scale: 2, nullable: true })
professionalFinalScore: number;
@Column({ name: 'admission_status', length: 50, nullable: true })
admissionStatus: string;
@Column({ name: 'admitted_college', length: 100, nullable: true })
admittedCollege: string;
@Column({ name: 'admitted_major', length: 100, nullable: true })
admittedMajor: string;
@Column({ name: 'department_id', type: 'integer', nullable: true })
departmentId: number;
@ManyToOne(() => Department, { nullable: true })
@JoinColumn({ name: 'department_id' })
department: Department;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}

View File

@@ -0,0 +1,61 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import { Student } from './student.entity';
import { Department } from './department.entity';
@Entity('student_enrollments')
export class StudentEnrollment {
@PrimaryGeneratedColumn()
id: number;
@Column({ name: 'student_id', type: 'integer' })
studentId: number;
@ManyToOne(() => Student, { eager: true })
@JoinColumn({ name: 'student_id' })
student: Student;
@Column({ name: 'course_category', length: 50, nullable: true })
courseCategory: string;
@Column({ name: 'class_type', length: 50, nullable: true })
classType: string;
@Column({ name: 'class_name', length: 100, nullable: true })
className: string;
@Column({ name: 'head_teacher', length: 50, nullable: true })
headTeacher: string;
@Column({ name: 'subject_teacher', length: 50, nullable: true })
subjectTeacher: string;
@Column({ name: 'start_date', type: 'date', nullable: true })
startDate: string;
@Column({ name: 'end_date', type: 'date', nullable: true })
endDate: string;
@Column({ length: 20, default: 'active' })
status: string;
@Column({ name: 'department_id', type: 'integer', nullable: true })
departmentId: number;
@ManyToOne(() => Department, { nullable: true })
@JoinColumn({ name: 'department_id' })
department: Department;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}

View File

@@ -0,0 +1,58 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import { Student } from './student.entity';
import { Department } from './department.entity';
@Entity('student_profiles')
export class StudentProfile {
@PrimaryGeneratedColumn()
id: number;
@Column({ name: 'student_id', type: 'integer', unique: true })
studentId: number;
@ManyToOne(() => Student, { eager: true })
@JoinColumn({ name: 'student_id' })
student: Student;
@Column({ name: 'target_college', length: 100, nullable: true })
targetCollege: string;
@Column({ name: 'target_major', length: 100, nullable: true })
targetMajor: string;
@Column({ name: 'subject_direction', length: 50, nullable: true })
subjectDirection: string;
@Column({ length: 20, nullable: true })
grade: string;
@Column({ name: 'campus_location', length: 100, nullable: true })
campusLocation: string;
@Column({ name: 'profile_date', type: 'date', nullable: true })
profileDate: string;
@Column({ type: 'text', nullable: true })
notes: string;
@Column({ name: 'department_id', type: 'integer', nullable: true })
departmentId: number;
@ManyToOne(() => Department, { nullable: true })
@JoinColumn({ name: 'department_id' })
department: Department;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}

View File

@@ -0,0 +1,49 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import { Student } from './student.entity';
import { Department } from './department.entity';
@Entity('student_reports')
export class StudentReport {
@PrimaryGeneratedColumn()
id: number;
@Column({ name: 'student_id', type: 'integer' })
studentId: number;
@ManyToOne(() => Student, { eager: true })
@JoinColumn({ name: 'student_id' })
student: Student;
@Column({ name: 'snapshot_data', type: 'simple-json', nullable: true })
snapshotData: Record<string, unknown>;
@Column({ name: 'html_content', type: 'text', nullable: true })
htmlContent: string;
@Column({ name: 'pdf_path', length: 500, nullable: true })
pdfPath: string;
@Column({ name: 'generated_at', type: 'datetime', nullable: true })
generatedAt: Date;
@Column({ name: 'department_id', type: 'integer', nullable: true })
departmentId: number;
@ManyToOne(() => Department, { nullable: true })
@JoinColumn({ name: 'department_id' })
department: Department;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}