HJW20 2 months ago
parent ee570460df
commit bf6a570974

@ -0,0 +1,2 @@
def clear_all_students(self) -> None:
self.dal.clear_all_students()

@ -0,0 +1,5 @@
def delete_student(self,sid:str)-> bool:
if not self.dal.check_student_exists(sid):
raise ValueError(f"学生ID{sid}不存在。")
return self.dal.delete_student(sid)

@ -0,0 +1,9 @@
def export_students(self,file_path:str)-> bool:
student =self.dal.get_all_students()
try:
with open(file_path,'w',encoding='utf-8')as f:
json.dump([student.to_dict() for student in students],f,ensure_ascii=False,indent=4)
return True
except Exception as e:
print(f"导出学生数据到JOSN 时出错:{e}")
return False

@ -0,0 +1,6 @@
def get_avg_height(self)-> float:
students =self.dal.get_all_students()
if not students:
return 0.0
total_height = sum(student.height for student in students)
return total_height/len(students)

@ -0,0 +1,2 @@
def get_student_by_count(self)-> int:
return self.dal.get_student_by_count()

@ -0,0 +1,3 @@
def get_student_by_height(self,min_height:int,max_height:int)-> List[Student]:
students=self.dal.get_all_students()
return [s for s in students if min_height <= s.height <= max_height]

@ -0,0 +1,8 @@
def get_student_by_id(self,sid:str)-> Optional[Student]:
return self.dal.find_student_by_sid(sid)
def get_student_by_name(self,name:str)-> List[Student]:
return self.dal.find_student_by_name(name)
def get_student_by_class(self,class_name:str)-> List[Student]:
return self.dal.find_student_by_class_name(name)
def get_all_students(self)-> List[Student]:
return self.dal.get_all_students()

@ -0,0 +1,9 @@
def get_students_by_age(self,min_age:int,max_age:int)->List[Student]:
today =date.today()
students = self.dal.get_all_students()
age_filtered_students=[]
for student in students:
age =today.year-student.birth_date.year-((today.month,today,day)<(student.birth_date.month,student.birth_date.day))
if min_age <=age<=max_age:
age_filtered_students.append(student)
return age_filtered_students

@ -0,0 +1,3 @@
def get_students_by_enrollment_year(self,year:int)-> List[Student]:
students =self.dal.get_all_students()
return [student for student in students if student.enrollment_date.year ==year]

@ -0,0 +1,7 @@
class StudentBll:
def __init__(self,dal:StudentDal):
self.dal=dal
def delete_student(self,sid:str)-> bool:
if not self.dal.check_student_exists(sid):
raise ValueError(f"学生 ID {sid}不存在。")
return self.dal.delete_students(sid)

@ -0,0 +1,117 @@
from typing import List, Optional
from models.student import Student
from dal.idal import IStudentDAL
from utils.validator import validate_student_data
from utils.id_utils import is_valid_id_card
class StudentService:
"""学生信息业务逻辑层"""
def __init__(self, dal: IStudentDAL):
self.dal = dal
def add_student(self, student: Student) -> tuple[bool, str]:
"""添加学生"""
# 数据验证
is_valid, msg = validate_student_data(student)
if not is_valid:
return False, msg
# 检查学号是否已存在
if self.dal.get_by_stu_id(student.stu_id):
return False, "学号已存在"
# 检查身份证号是否已存在
if self.dal.get_by_id(student.id_card):
return False, "身份证号已存在"
# 添加学生
success = self.dal.add_student(student)
return success, "添加成功" if success else "添加失败"
def delete_student(self, id_card: str) -> tuple[bool, str]:
"""删除学生"""
if not is_valid_id_card(id_card):
return False, "无效的身份证号"
success = self.dal.delete_student(id_card)
return success, "删除成功" if success else "删除失败"
def update_student(self, student: Student) -> tuple[bool, str]:
"""更新学生信息"""
# 数据验证
is_valid, msg = validate_student_data(student)
if not is_valid:
return False, msg
# 检查学生是否存在
existing = self.dal.get_by_id(student.id_card)
if not existing:
return False, "学生不存在"
# 检查学号是否被其他学生使用
stu_with_same_id = self.dal.get_by_stu_id(student.stu_id)
if stu_with_same_id and stu_with_same_id.id_card != student.id_card:
return False, "学号已被其他学生使用"
success = self.dal.update_student(student)
return success, "更新成功" if success else "更新失败"
def get_student_by_id(self, id_card: str) -> Optional[Student]:
"""根据身份证号获取学生"""
if not is_valid_id_card(id_card):
return None
return self.dal.get_by_id(id_card)
def get_student_by_stu_id(self, stu_id: str) -> Optional[Student]:
"""根据学号获取学生"""
return self.dal.get_by_stu_id(stu_id)
def get_all_students(self) -> List[Student]:
"""获取所有学生"""
return self.dal.get_all()
def search_by_name(self, name: str) -> List[Student]:
"""按姓名查询(模糊)"""
return self.dal.get_by_name(name)
def search_by_class(self, class_name: str) -> List[Student]:
"""按班级查询(模糊)"""
return self.dal.get_by_class(class_name)
def search_by_major(self, major: str) -> List[Student]:
"""按专业查询(模糊)"""
return self.dal.get_by_major(major)
def count_total_students(self) -> int:
"""统计学生总数"""
return self.dal.count_students()
def count_by_major(self) -> dict:
"""按专业统计人数"""
return self.dal.count_by_major()
def calculate_avg_height(self, group_by: str = None) -> dict:
"""计算平均身高"""
students = self.dal.get_all()
if not group_by:
heights = [s.height for s in students if s.height is not None]
return {'all': sum(heights) / len(heights)} if heights else {'all': 0}
groups = {}
for student in students:
if student.height is None:
continue
key = getattr(student, group_by)
if key not in groups:
groups[key] = []
groups[key].append(student.height)
return {k: sum(v) / len(v) for k, v in groups.items()}
def clear_all_data(self) -> tuple[bool, str]:
"""清空所有学生数据"""
success = self.dal.clear_all()
return success, "数据已清空" if success else "清空失败"

@ -0,0 +1,4 @@
def update_student_partial(self,sid:str,name:Optional[str]=None,height:Optional[int]=None,birth_date:Optional[date]=None,enrollment_date:Optional[date]=None,class_name:Optional[str]=None)->bool:
if not self.dal.check_student_exists(sid):
raise ValueError(f"学生ID{sid}不存在。")
return self.dal.update_student_partial(sid,name,height,birth_date,enrollment_date,class_name)
Loading…
Cancel
Save