You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
5.3 KiB
150 lines
5.3 KiB
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 '')] |