import json from typing import List, Optional from .student_dal import IStudentDAL from ..model.student import Student from datetime import datetime class JsonStudentDAL(IStudentDAL): """学生信息的JSON文件存储实现""" def __init__(self, file_path: str = 'students.json'): self.file_path = file_path self._ensure_file_exists() def _ensure_file_exists(self): """确保JSON文件存在""" try: with open(self.file_path, 'r', encoding='utf-8') as file: json.load(file) except (FileNotFoundError, json.JSONDecodeError): with open(self.file_path, 'w', encoding='utf-8') as file: json.dump([], file) def _student_to_dict(self, student: Student) -> dict: """将Student对象转换为字典""" return { 'name': student.name, 'id_card': student.id_card, 'stu_id': student.stu_id, 'gender': student.gender, 'height': student.height, 'weight': student.weight, 'enrollment_date': str(student.enrollment_date) if student.enrollment_date else None, 'class_name': student.class_name, 'major': student.major, 'email': student.email, 'phone': student.phone } def _dict_to_student(self, data: dict) -> Student: """将字典转换为Student对象""" # 处理日期类型 enrollment_date = data.get('enrollment_date') if enrollment_date: enrollment_date = datetime.strptime(enrollment_date, '%Y-%m-%d').date() return Student( name=data.get('name'), id_card=data.get('id_card'), stu_id=data.get('stu_id'), gender=data.get('gender'), height=data.get('height'), weight=data.get('weight'), enrollment_date=enrollment_date, class_name=data.get('class_name'), major=data.get('major'), email=data.get('email'), phone=data.get('phone') ) def _load_data(self) -> List[dict]: """加载JSON文件数据""" with open(self.file_path, 'r', encoding='utf-8') as file: return json.load(file) def _save_data(self, data: List[dict]): """保存数据到JSON文件""" with open(self.file_path, 'w', encoding='utf-8') as file: json.dump(data, file, ensure_ascii=False, indent=2) def get_by_id(self, id_card: str) -> Optional[Student]: """根据身份证号获取学生信息""" for data in self._load_data(): if data.get('id_card') == id_card: return self._dict_to_student(data) return None def get_by_stu_id(self, stu_id: str) -> Optional[Student]: """根据学号获取学生信息""" for data in self._load_data(): if data.get('stu_id') == stu_id: return self._dict_to_student(data) return None def get_all(self) -> List[Student]: """获取所有学生信息""" return [self._dict_to_student(data) for data in self._load_data()] def add(self, student: Student) -> bool: """添加学生信息""" # 检查学号和身份证号是否已存在 if self.get_by_id(student.id_card) or self.get_by_stu_id(student.stu_id): return False data = self._load_data() data.append(self._student_to_dict(student)) self._save_data(data) return True def update(self, student: Student) -> bool: """更新学生信息""" data = self._load_data() updated = False for i, item in enumerate(data): if item.get('id_card') == student.id_card: data[i] = self._student_to_dict(student) updated = True break if updated: self._save_data(data) return updated def delete_by_id(self, id_card: str) -> bool: """根据身份证号删除学生信息""" data = self._load_data() original_length = len(data) data = [item for item in data if item.get('id_card') != id_card] if len(data) < original_length: self._save_data(data) return True return False def delete_by_stu_id(self, stu_id: str) -> bool: """根据学号删除学生信息""" data = self._load_data() original_length = len(data) data = [item for item in data if item.get('stu_id') != stu_id] if len(data) < original_length: self._save_data(data) return True return False def search_by_name(self, name: str) -> List[Student]: """根据姓名模糊查询学生信息""" return [self._dict_to_student(data) for data in self._load_data() if name in data.get('name', '')] def search_by_class(self, class_name: str) -> List[Student]: """根据班级模糊查询学生信息""" return [self._dict_to_student(data) for data in self._load_data() if class_name in (data.get('class_name') or '')] def search_by_major(self, major: str) -> List[Student]: """根据专业模糊查询学生信息""" return [self._dict_to_student(data) for data in self._load_data() if major in (data.get('major') or '')]