|
|
|
@ -1,233 +1,318 @@
|
|
|
|
|
package dao.impl;
|
|
|
|
|
|
|
|
|
|
import dao.StudentDao;
|
|
|
|
|
import domain.Course;
|
|
|
|
|
import domain.SelectCourse;
|
|
|
|
|
import domain.Student;
|
|
|
|
|
import org.springframework.dao.DataAccessException;
|
|
|
|
|
import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
|
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
|
|
import utils.JDBCUtils;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
// 引入相关类和接口
|
|
|
|
|
import dao.StudentDao; // StudentDao 接口,定义学生相关的数据访问方法
|
|
|
|
|
import domain.Course; // Course 实体类,表示课程数据
|
|
|
|
|
import domain.SelectCourse; // SelectCourse 实体类,表示学生选课信息
|
|
|
|
|
import domain.Student; // Student 实体类,表示学生数据
|
|
|
|
|
import org.springframework.dao.DataAccessException; // 数据访问异常
|
|
|
|
|
import org.springframework.jdbc.core.BeanPropertyRowMapper; // 将查询结果映射为 Java 对象
|
|
|
|
|
import org.springframework.jdbc.core.JdbcTemplate; // JDBC 操作模板
|
|
|
|
|
import utils.JDBCUtils; // 自定义工具类,用于获取数据库数据源
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; // ArrayList 类,用于存储参数和结果
|
|
|
|
|
import java.util.List; // List 接口,表示列表
|
|
|
|
|
import java.util.Map; // Map 接口,用于存储查询条件
|
|
|
|
|
import java.util.Set; // Set 接口,用于存储条件的键集合
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* StudentDaoImpl 实现了 StudentDao 接口,负责操作学生数据表。
|
|
|
|
|
*/
|
|
|
|
|
public class StudentDaoImpl implements StudentDao {
|
|
|
|
|
|
|
|
|
|
// 使用 JdbcTemplate 来简化数据库操作,JDBCUtils 提供数据源
|
|
|
|
|
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取所有学生信息
|
|
|
|
|
* @return 返回所有学生的 List;查询失败时返回 null
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public List<Student> findAll() {
|
|
|
|
|
//使用JDBC操作数据库
|
|
|
|
|
try {
|
|
|
|
|
// SQL 语句:查询所有学生
|
|
|
|
|
String sql = "select * from student";
|
|
|
|
|
// 执行查询并返回结果,使用 BeanPropertyRowMapper 将结果映射为 Student 实体类
|
|
|
|
|
List<Student> students = template.query(sql, new BeanPropertyRowMapper<Student>(Student.class));
|
|
|
|
|
return students;
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
return null; // 查询失败时返回 null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据学生 ID 和密码查找学生
|
|
|
|
|
* @param id 学生 ID
|
|
|
|
|
* @param password 学生密码
|
|
|
|
|
* @return 找到的学生;未找到时返回 null
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Student findStudentidAndPassword(String id,String password) {
|
|
|
|
|
public Student findStudentidAndPassword(String id, String password) {
|
|
|
|
|
try {
|
|
|
|
|
// SQL 语句:根据学生 ID 和密码查询学生
|
|
|
|
|
String sql = "select * from student where s_id = ? and s_password = ?";
|
|
|
|
|
Student student = template.queryForObject(sql,new BeanPropertyRowMapper<Student>(Student.class),id,password);
|
|
|
|
|
// 执行查询并返回结果
|
|
|
|
|
Student student = template.queryForObject(sql, new BeanPropertyRowMapper<Student>(Student.class), id, password);
|
|
|
|
|
return student;
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
return null; // 查询失败时返回 null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据学生 ID 查找学生
|
|
|
|
|
* @param id 学生 ID
|
|
|
|
|
* @return 找到的学生;未找到时返回 null
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Student findStudentById(String id) {
|
|
|
|
|
try {
|
|
|
|
|
// SQL 语句:根据学生 ID 查询学生信息
|
|
|
|
|
String sql = "select * from student where s_id = ?";
|
|
|
|
|
Student student = template.queryForObject(sql,new BeanPropertyRowMapper<Student>(Student.class),id);
|
|
|
|
|
// 执行查询并返回结果
|
|
|
|
|
Student student = template.queryForObject(sql, new BeanPropertyRowMapper<Student>(Student.class), id);
|
|
|
|
|
return student;
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
return null; // 查询失败时返回 null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 添加新学生
|
|
|
|
|
* @param student 学生对象
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void addStudent(Student student) {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "insert into student(s_id,s_password) values(?,?)";
|
|
|
|
|
template.update(sql,student.getS_id(),student.getS_password());
|
|
|
|
|
// SQL 语句:插入学生数据
|
|
|
|
|
String sql = "insert into student(s_id, s_password) values(?, ?)";
|
|
|
|
|
// 执行插入操作
|
|
|
|
|
template.update(sql, student.getS_id(), student.getS_password());
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 更新学生信息
|
|
|
|
|
* @param student 学生对象,包含要更新的信息
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void updateInfo(Student student) {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "update student set s_name =?,s_sex=?,s_age=?,s_phone=?,s_email=?,s_address=?,s_college=?,s_department=?,s_class=? where s_id=?";
|
|
|
|
|
template.update(sql,student.getS_name(),student.getS_sex(),student.getS_age(),student.getS_phone(),student.getS_email(),student.getS_address(),student.getS_college(),student.getS_department(),student.getS_class(),student.getS_id());
|
|
|
|
|
// SQL 语句:更新学生信息
|
|
|
|
|
String sql = "update student set s_name = ?, s_sex = ?, s_age = ?, s_phone = ?, s_email = ?, s_address = ?, s_college = ?, s_department = ?, s_class = ? where s_id = ?";
|
|
|
|
|
// 执行更新操作
|
|
|
|
|
template.update(sql, student.getS_name(), student.getS_sex(), student.getS_age(),
|
|
|
|
|
student.getS_phone(), student.getS_email(), student.getS_address(),
|
|
|
|
|
student.getS_college(), student.getS_department(), student.getS_class(), student.getS_id());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 更新学生密码
|
|
|
|
|
* @param studentid 学生 ID
|
|
|
|
|
* @param newpassword 新密码
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void updatePassword(String studentid, String newpassword) {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "update student set s_password=? where s_id=?";
|
|
|
|
|
template.update(sql,newpassword,studentid);
|
|
|
|
|
// SQL 语句:更新学生密码
|
|
|
|
|
String sql = "update student set s_password = ? where s_id = ?";
|
|
|
|
|
// 执行更新操作
|
|
|
|
|
template.update(sql, newpassword, studentid);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查找指定学生的所有选课信息
|
|
|
|
|
* @param studentid 学生 ID
|
|
|
|
|
* @return 包含学生选课信息的 List;查询失败时返回 null
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public List<SelectCourse> findAllSelectCourse(String studentid) {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "select student.s_id,student.s_name,course.c_id,course.c_name,course.c_info,teacher.t_id,t_name,select_course.score\n" +
|
|
|
|
|
"from select_course,student,course,teacher\n" +
|
|
|
|
|
"where student.s_id=select_course.s_id\n" +
|
|
|
|
|
"and select_course.c_id=course.c_id\n" +
|
|
|
|
|
"and course.t_id=teacher.t_id\n" +
|
|
|
|
|
"and student.s_id=?";
|
|
|
|
|
List<SelectCourse> scs = template.query(sql, new BeanPropertyRowMapper<SelectCourse>(SelectCourse.class),studentid);
|
|
|
|
|
// SQL 语句:查询学生的所有选课信息
|
|
|
|
|
String sql = "select student.s_id, student.s_name, course.c_id, course.c_name, course.c_info, teacher.t_id, t_name, select_course.score " +
|
|
|
|
|
"from select_course, student, course, teacher " +
|
|
|
|
|
"where student.s_id = select_course.s_id " +
|
|
|
|
|
"and select_course.c_id = course.c_id " +
|
|
|
|
|
"and course.t_id = teacher.t_id " +
|
|
|
|
|
"and student.s_id = ?";
|
|
|
|
|
// 执行查询并返回结果
|
|
|
|
|
List<SelectCourse> scs = template.query(sql, new BeanPropertyRowMapper<SelectCourse>(SelectCourse.class), studentid);
|
|
|
|
|
return scs;
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
return null; // 查询失败时返回 null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取所有可选课程
|
|
|
|
|
* @return 包含所有可选课程的 List;查询失败时返回 null
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public List<Course> findAllOptionalCourse() {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "select course.c_id,course.c_name,course.c_info,teacher.t_id,t_name\n" +
|
|
|
|
|
"from course,teacher\n" +
|
|
|
|
|
"where course.t_id=teacher.t_id";
|
|
|
|
|
// SQL 语句:查询所有可选课程
|
|
|
|
|
String sql = "select course.c_id, course.c_name, course.c_info, teacher.t_id, t_name " +
|
|
|
|
|
"from course, teacher " +
|
|
|
|
|
"where course.t_id = teacher.t_id";
|
|
|
|
|
// 执行查询并返回结果
|
|
|
|
|
List<Course> cs = template.query(sql, new BeanPropertyRowMapper<Course>(Course.class));
|
|
|
|
|
return cs;
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
return null; // 查询失败时返回 null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 学生选修课程
|
|
|
|
|
* @param studentid 学生 ID
|
|
|
|
|
* @param courseid 课程 ID
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void addSelectCourse(String studentid, String courseid) {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "insert into select_course(s_id,c_id) values(?,?)";
|
|
|
|
|
template.update(sql,studentid,courseid);
|
|
|
|
|
// SQL 语句:学生选修课程
|
|
|
|
|
String sql = "insert into select_course(s_id, c_id) values(?, ?)";
|
|
|
|
|
// 执行插入操作
|
|
|
|
|
template.update(sql, studentid, courseid);
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据学生 ID 删除学生
|
|
|
|
|
* @param studentid 学生 ID
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void deleteStudentById(String studentid) {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "delete from student where s_id=?";
|
|
|
|
|
template.update(sql,studentid);
|
|
|
|
|
// SQL 语句:删除学生
|
|
|
|
|
String sql = "delete from student where s_id = ?";
|
|
|
|
|
// 执行删除操作
|
|
|
|
|
template.update(sql, studentid);
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查找符合条件的学生总数
|
|
|
|
|
* @param condition 查询条件
|
|
|
|
|
* @return 符合条件的学生总数
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public int findTotalCount(Map<String, String[]> condition) {
|
|
|
|
|
//定义模板初始化sql
|
|
|
|
|
String sql = "select count(*) from student where 1=1";
|
|
|
|
|
// 初始化 SQL 语句
|
|
|
|
|
String sql = "select count(*) from student where 1 = 1";
|
|
|
|
|
StringBuilder sb = new StringBuilder(sql);
|
|
|
|
|
//遍历map
|
|
|
|
|
List<Object> params = new ArrayList<Object>(); // 存储查询参数
|
|
|
|
|
// 遍历查询条件
|
|
|
|
|
Set<String> keySet = condition.keySet();
|
|
|
|
|
//定义参数集合
|
|
|
|
|
List<Object> params = new ArrayList<Object>();
|
|
|
|
|
for (String key : keySet) {
|
|
|
|
|
System.out.println(key);
|
|
|
|
|
//排除分页条件参数
|
|
|
|
|
// 排除分页相关的参数
|
|
|
|
|
if ("currentPage".equals(key) || "rows".equals(key)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取value
|
|
|
|
|
String value = condition.get(key)[0];
|
|
|
|
|
//判断value是否有值
|
|
|
|
|
if (value != null && !"".equals(value)) {
|
|
|
|
|
//有值
|
|
|
|
|
sb.append(" and "+key+" like ? ");
|
|
|
|
|
params.add("%"+value+"%");//?条件的值
|
|
|
|
|
// 添加条件到 SQL 语句
|
|
|
|
|
sb.append(" and " + key + " like ? ");
|
|
|
|
|
params.add("%" + value + "%"); // ? 条件的值
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
System.out.println(sb.toString());
|
|
|
|
|
System.out.println(params);
|
|
|
|
|
return template.queryForObject(sb.toString(),Integer.class,params.toArray());
|
|
|
|
|
// 执行查询并返回结果
|
|
|
|
|
return template.queryForObject(sb.toString(), Integer.class, params.toArray());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 添加学生的所有信息
|
|
|
|
|
* @param s 学生对象,包含所有信息
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void addStudentAllInfo(Student s) {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "insert into student(s_id,s_college,s_department,s_class,s_name,s_sex,s_age,s_phone,s_email,s_address) values(?,?,?,?,?,?,?,?,?,?)";
|
|
|
|
|
template.update(sql,s.getS_id(),s.getS_college(),s.getS_department(),s.getS_class(),s.getS_name(),s.getS_sex(),s.getS_age(),s.getS_phone(),s.getS_email(),s.getS_address());
|
|
|
|
|
// SQL 语句:插入学生所有信息
|
|
|
|
|
String sql = "insert into student(s_id, s_college, s_department, s_class, s_name, s_sex, s_age, s_phone, s_email, s_address) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
|
|
|
|
// 执行插入操作
|
|
|
|
|
template.update(sql, s.getS_id(), s.getS_college(), s.getS_department(), s.getS_class(), s.getS_name(),
|
|
|
|
|
s.getS_sex(), s.getS_age(), s.getS_phone(), s.getS_email(), s.getS_address());
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取所有学生的选课信息
|
|
|
|
|
* @return 所有学生的选课信息;查询失败时返回 null
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public List<SelectCourse> findSelectCourseAllStudent() {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "select student.s_id,student.s_name,course.c_id,course.c_name,course.c_info,teacher.t_id,t_name,select_course.score\n" +
|
|
|
|
|
"from select_course,student,course,teacher\n" +
|
|
|
|
|
"where student.s_id=select_course.s_id\n" +
|
|
|
|
|
"and select_course.c_id=course.c_id\n" +
|
|
|
|
|
"and course.t_id=teacher.t_id\n";
|
|
|
|
|
// SQL 语句:查询所有学生的选课信息
|
|
|
|
|
String sql = "select student.s_id, student.s_name, course.c_id, course.c_name, course.c_info, teacher.t_id, t_name, select_course.score " +
|
|
|
|
|
"from select_course, student, course, teacher " +
|
|
|
|
|
"where student.s_id = select_course.s_id " +
|
|
|
|
|
"and select_course.c_id = course.c_id " +
|
|
|
|
|
"and course.t_id = teacher.t_id";
|
|
|
|
|
// 执行查询并返回结果
|
|
|
|
|
List<SelectCourse> scs = template.query(sql, new BeanPropertyRowMapper<SelectCourse>(SelectCourse.class));
|
|
|
|
|
return scs;
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
return null; // 查询失败时返回 null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据条件分页查询学生
|
|
|
|
|
* @param start 起始记录
|
|
|
|
|
* @param rows 每页记录数
|
|
|
|
|
* @param condition 查询条件
|
|
|
|
|
* @return 符合条件的学生列表
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public List<Student> findByPage(int start, int rows, Map<String, String[]> condition) {
|
|
|
|
|
try {
|
|
|
|
|
String sql = "select * from student where 1=1";
|
|
|
|
|
// 初始化 SQL 语句
|
|
|
|
|
String sql = "select * from student where 1 = 1";
|
|
|
|
|
StringBuilder sb = new StringBuilder(sql);
|
|
|
|
|
//遍历map
|
|
|
|
|
List<Object> params = new ArrayList<Object>(); // 存储查询参数
|
|
|
|
|
// 遍历查询条件
|
|
|
|
|
Set<String> keySet = condition.keySet();
|
|
|
|
|
//定义参数集合
|
|
|
|
|
List<Object> params = new ArrayList<Object>();
|
|
|
|
|
for (String key : keySet) {
|
|
|
|
|
//排除分页条件参数
|
|
|
|
|
// 排除分页相关的参数
|
|
|
|
|
if ("currentPage".equals(key) || "rows".equals(key)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取value
|
|
|
|
|
String value = condition.get(key)[0];
|
|
|
|
|
//判断value是否有值
|
|
|
|
|
if (value != null && !"".equals(value)) {
|
|
|
|
|
//有值
|
|
|
|
|
sb.append(" and "+key+" like ? ");
|
|
|
|
|
params.add("%"+value+"%");//?条件的值
|
|
|
|
|
// 添加条件到 SQL 语句
|
|
|
|
|
sb.append(" and " + key + " like ? ");
|
|
|
|
|
params.add("%" + value + "%"); // ? 条件的值
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//添加分页查询
|
|
|
|
|
sb.append(" limit ? , ?");
|
|
|
|
|
//添加分页查询参数值
|
|
|
|
|
// 添加分页条件
|
|
|
|
|
sb.append(" limit ?, ?");
|
|
|
|
|
params.add(start);
|
|
|
|
|
params.add(rows);
|
|
|
|
|
System.out.println(sb.toString());
|
|
|
|
|
System.out.println(params);
|
|
|
|
|
return template.query(sb.toString(),new BeanPropertyRowMapper<Student>(Student.class),params.toArray());
|
|
|
|
|
// 执行查询并返回结果
|
|
|
|
|
return template.query(sb.toString(), new BeanPropertyRowMapper<Student>(Student.class), params.toArray());
|
|
|
|
|
} catch (DataAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
e.printStackTrace(); // 捕获并打印异常堆栈
|
|
|
|
|
return null; // 查询失败时返回 null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|