|
|
|
@ -30,113 +30,156 @@ import java.util.List;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Controller - 试卷
|
|
|
|
|
*
|
|
|
|
|
* 这个类主要作为Spring MVC的控制器,用于处理与试卷相关的各种HTTP请求,
|
|
|
|
|
* 通过调用不同的业务服务层接口来获取相应的数据,进行分页处理、条件筛选等操作,
|
|
|
|
|
* 并根据请求的情况返回视图或者数据响应给客户端,例如展示试卷列表页面以及试卷详情页面等功能。
|
|
|
|
|
*
|
|
|
|
|
* @author candy.tam
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
@Controller
|
|
|
|
|
public class PaperController {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建一个日志记录器对象,用于记录在这个控制器类中发生的一些关键操作、调试信息或者错误信息等,
|
|
|
|
|
// 通过LoggerFactory根据当前类的Class对象获取对应的Logger实例,方便后续在代码中进行日志输出操作,便于调试和查看运行情况。
|
|
|
|
|
private Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 通过@Autowired注解自动注入ICourseService接口的实现类实例,ICourseService用于处理与课程相关的各种业务逻辑,
|
|
|
|
|
// 比如根据课程ID查询课程信息、获取某个学科下的课程列表等操作,在试卷相关操作中(如试卷列表页面展示时关联课程信息等情况)会调用其相关方法来实现具体的课程相关业务功能。
|
|
|
|
|
@Autowired
|
|
|
|
|
private ICourseService iCourseService;
|
|
|
|
|
|
|
|
|
|
// 注入ISysAreaService接口的实现类实例,ISysAreaService用于处理与系统区域相关的业务逻辑,
|
|
|
|
|
// 例如根据区域ID查询区域信息、获取特定层级的区域列表等操作,在试卷相关业务中(可能涉及按区域筛选试卷等情况)会用到该服务层接口的方法来获取区域相关数据。
|
|
|
|
|
@Autowired
|
|
|
|
|
private ISysAreaService iSysAreaService;
|
|
|
|
|
|
|
|
|
|
// 自动注入IPaperService接口的实现类实例,IPaperService主要负责处理与试卷相关的业务逻辑,
|
|
|
|
|
// 像根据试卷ID查询试卷信息、获取符合特定条件的试卷列表(分页查询并结合各种筛选条件)、查找试卷包含的题目信息等操作都会调用它的相应方法来完成。
|
|
|
|
|
@Autowired
|
|
|
|
|
private IPaperService iPaperService;
|
|
|
|
|
|
|
|
|
|
// 注入IQuestionService接口的实现类实例,IQuestionService用于处理与题目相关的业务逻辑,
|
|
|
|
|
// 在试卷详情页面展示时,需要获取试卷包含的题目列表进行展示,会调用其相关方法来获取题目相关数据。
|
|
|
|
|
@Autowired
|
|
|
|
|
private IQuestionService iQuestionService;
|
|
|
|
|
|
|
|
|
|
// 注入ISubjectService接口的实现类实例,ISubjectService用于处理与学科(科目)相关的业务逻辑,
|
|
|
|
|
// 例如根据学科ID查询学科详细信息等操作,在试卷相关操作中(如试卷列表页面展示所属学科信息、试卷详情页面关联学科信息等情况)会调用该服务层接口的方法来获取学科数据。
|
|
|
|
|
@Autowired
|
|
|
|
|
private ISubjectService iSubjectService;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理试卷列表页面的GET请求,请求路径格式为"paperlist/{subjectId}-{courseId}-{paperType}-{year}-{area}-{pageNum}.html",
|
|
|
|
|
* 其中各个{ }内的参数是路径变量,分别代表学科ID、课程ID、试卷类型、年份、区域、页码,
|
|
|
|
|
* 该方法用于获取试卷列表相关的各种数据(如课程信息、区域信息、学科信息、符合条件的试卷分页数据等),
|
|
|
|
|
* 根据请求头中用户代理信息判断是否是移动端访问,来设置不同的视图名称,最后将获取到的数据添加到ModelAndView对象中返回,供Spring MVC框架渲染相应的视图展示给客户端。
|
|
|
|
|
*
|
|
|
|
|
* @param request HttpServletRequest对象,用于获取请求相关的各种信息,在这里主要是获取请求的URI(通过request.getRequestURI()方法)记录日志,
|
|
|
|
|
* 以及获取请求头中的"user-agent"信息传递给BrowserUtils工具类判断是否是移动端访问,从而决定返回的视图名称等操作。
|
|
|
|
|
* @param subjectId 学科的唯一标识字符串,通过@PathVariable注解从请求路径中获取,用于指定要查询试卷列表所属的学科,传递给相关服务层方法作为查询依据,获取学科及其关联的数据信息,例如筛选该学科下的试卷等操作。
|
|
|
|
|
* @param courseId 课程的唯一标识字符串,同样是路径变量,用于指定要查询试卷列表相关的课程,传递给服务层方法查询课程信息以及筛选该课程相关的试卷等操作,获取相应的课程数据以及符合课程关联条件的试卷信息。
|
|
|
|
|
* @param paperType 试卷类型的标识字符串,从请求路径中获取,用于筛选特定类型的试卷,传递给条件构造器来构建查询条件,获取符合该类型要求的试卷列表信息,例如只查询真题、模拟题等不同类型的试卷,具体取决于业务中对试卷类型的分类和使用方式。
|
|
|
|
|
* @param year 年份字符串,用于筛选特定年份的试卷,作为查询条件之一传递给服务层构建查询条件,以便获取对应年份的试卷列表信息,例如查询2023年的试卷等情况。
|
|
|
|
|
* @param area 区域的标识字符串,从请求路径中获取,用于指定区域相关的筛选条件,传递给服务层方法查询对应区域信息以及筛选该区域相关的试卷等操作,获取相应的区域数据以及符合区域关联条件的试卷信息。
|
|
|
|
|
* @param pageNum 页码整数,通过路径变量获取,表示要查询的试卷列表的页码信息,用于创建Page对象来确定分页查询情况,获取对应页码的数据记录,方便实现试卷列表的分页展示功能。
|
|
|
|
|
* @param model ModelAndView对象,用于设置视图名称以及向视图传递数据,在这里会将查询到的课程列表、学科信息、当前课程、区域列表、试卷分页数据、试卷总数等各种试卷相关的数据添加到该对象中,
|
|
|
|
|
* 然后根据设备类型设置合适的视图名称,最后返回该对象供Spring MVC框架进行视图渲染并展示试卷列表页面给客户端。
|
|
|
|
|
* @return 返回配置好视图名称和试卷相关数据的ModelAndView对象,供Spring MVC框架根据视图名称渲染并展示试卷列表页面给客户端,展示相应的试卷信息以及关联数据给用户查看。
|
|
|
|
|
*/
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
|
@RequestMapping(value = {"paperlist/{subjectId}-{courseId}-{paperType}-{year}-{area}-{pageNum}.html"}, method = RequestMethod.GET)
|
|
|
|
|
public ModelAndView indexAction(HttpServletRequest request , @PathVariable String subjectId , @PathVariable String courseId , @PathVariable String paperType,
|
|
|
|
|
@PathVariable String year , @PathVariable String area , @PathVariable Integer pageNum, ModelAndView model) {
|
|
|
|
|
// request url
|
|
|
|
|
logger.info("request url :{}" , request.getRequestURI());
|
|
|
|
|
CourseEntity course = iCourseService.selectById(courseId);
|
|
|
|
|
SysAreaEntity currArea = iSysAreaService.selectById(area);
|
|
|
|
|
public ModelAndView indexAction(HttpServletRequest request, @PathVariable String subjectId, @PathVariable String courseId, @PathVariable String paperType,
|
|
|
|
|
@PathVariable String year, @PathVariable String area, @PathVariable Integer pageNum, ModelAndView model) {
|
|
|
|
|
// 使用日志记录器记录请求的URL信息,方便后续查看请求访问情况以及进行调试等操作,通过格式化输出的方式将请求的URI信息记录到日志中,
|
|
|
|
|
// 输出的日志级别为INFO,通常用于记录一些重要的运行时信息,方便运维人员或者开发人员了解系统的访问情况。
|
|
|
|
|
logger.info("request url :{}", request.getRequestURI());
|
|
|
|
|
|
|
|
|
|
// 调用iCourseService的selectById方法,传入课程的唯一标识(courseId)作为参数,从数据库等数据源中查询对应的课程详细信息(以CourseEntity对象形式返回),
|
|
|
|
|
// 获取到的课程信息后续会添加到ModelAndView对象中传递给视图进行展示,例如展示课程名称、课程简介等相关内容,同时也可能用于其他关联查询或筛选操作(如筛选该课程下的试卷等情况)。
|
|
|
|
|
CourseEntity course = iCourseService.selectById(courseId);
|
|
|
|
|
|
|
|
|
|
// 调用iSysAreaService的selectById方法,传入区域的标识(area)作为参数,从数据库等数据源中查询对应的区域详细信息(以SysAreaEntity对象形式返回),
|
|
|
|
|
// 获取到的区域信息(在这里命名为currArea,表示当前筛选的区域)会添加到ModelAndView对象中,方便在试卷列表页面展示区域相关情况,例如区域名称等内容,也可能用于后续的筛选或关联操作。
|
|
|
|
|
SysAreaEntity currArea = iSysAreaService.selectById(area);
|
|
|
|
|
|
|
|
|
|
// 调用iCourseService的selectList方法,通过MyBatis Plus的条件构造器Condition创建查询条件,
|
|
|
|
|
// 使用eq("subject_id", subjectId)表示筛选出学科ID等于当前传入学科ID(subjectId)的课程列表,再通过orderBy("sort", true)按照"sort"字段升序排序课程列表,
|
|
|
|
|
// 获取与该学科相关的课程列表信息(以List<CourseEntity>形式返回),用于在试卷列表页面展示同属一个学科下的其他课程情况,比如在页面上提供相关课程的导航链接等情况,将课程列表信息添加到ModelAndView对象中。
|
|
|
|
|
List<CourseEntity> courseList = iCourseService.selectList(Condition.create().eq("subject_id", subjectId).orderBy("sort", true));
|
|
|
|
|
SubjectEntity subject = iSubjectService.selectById(subjectId);
|
|
|
|
|
List<SysAreaEntity> areaList = iSysAreaService.selectList(Condition.create().eq("tree_level", "0"));
|
|
|
|
|
|
|
|
|
|
Page<PaperEntity> page = new Page<>(pageNum , 10);
|
|
|
|
|
Condition condition = Condition.create();
|
|
|
|
|
if(!StringUtils.isEmpty(subjectId) && !"0".equals(subjectId)) {
|
|
|
|
|
condition.eq("subject_id", subjectId);
|
|
|
|
|
}
|
|
|
|
|
if(!StringUtils.isEmpty(paperType) && !"0".equals(paperType)) {
|
|
|
|
|
condition.eq("type", paperType);
|
|
|
|
|
}
|
|
|
|
|
if(!StringUtils.isEmpty(courseId) && !"0".equals(courseId)) {
|
|
|
|
|
condition.eq("course_id", courseId);
|
|
|
|
|
}
|
|
|
|
|
if(!StringUtils.isEmpty(year) && !"0".equals(year)) {
|
|
|
|
|
condition.eq("year", year);
|
|
|
|
|
}
|
|
|
|
|
if(!StringUtils.isEmpty(area) && !"0".equals(area)) {
|
|
|
|
|
condition.eq("area_id", area);
|
|
|
|
|
}
|
|
|
|
|
PageUtils result = PageUtils.getPage(iPaperService.selectPage(page , condition));
|
|
|
|
|
if(courseList.size() > 0 && course == null) {
|
|
|
|
|
course = courseList.get(0);
|
|
|
|
|
}
|
|
|
|
|
Integer total = iPaperService.selectCount(Condition.EMPTY);
|
|
|
|
|
model.addObject("courseList", courseList);
|
|
|
|
|
model.addObject("subject", subject);
|
|
|
|
|
model.addObject("course", course);
|
|
|
|
|
model.addObject("areaList", areaList);
|
|
|
|
|
model.addObject("paperPage" , result);
|
|
|
|
|
model.addObject("total" , total);
|
|
|
|
|
model.addObject("courseId", courseId);
|
|
|
|
|
model.addObject("paperType", paperType);
|
|
|
|
|
model.addObject("year", year);
|
|
|
|
|
model.addObject("area", area);
|
|
|
|
|
model.addObject("currArea", currArea);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(BrowserUtils.isMobile(request.getHeader("user-agent"))) {
|
|
|
|
|
model.setViewName("mobile/paperlist");
|
|
|
|
|
}else {
|
|
|
|
|
model.setViewName("paperlist");
|
|
|
|
|
}
|
|
|
|
|
return model;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
|
@RequestMapping(value = {"/paper/{paperId}.html"}, method = RequestMethod.GET)
|
|
|
|
|
public ModelAndView indexAction(HttpServletRequest request , @PathVariable String paperId , ModelAndView model){
|
|
|
|
|
try {
|
|
|
|
|
// request url
|
|
|
|
|
logger.info("request url :{}" , request.getRequestURI());
|
|
|
|
|
model.setViewName("paper");
|
|
|
|
|
PaperEntity paper = iPaperService.selectById(paperId);
|
|
|
|
|
model.addObject("paper", paper);
|
|
|
|
|
model.addObject("subject", StringUtils.isEmpty(paper.getSubjectId()) ? null : iSubjectService.selectById(paper.getSubjectId()));
|
|
|
|
|
model.addObject("course", StringUtils.isEmpty(paper.getCourseId()) ? null : iCourseService.selectById(paper.getCourseId()));
|
|
|
|
|
|
|
|
|
|
// 查询试卷题目
|
|
|
|
|
model.addObject("questionList", iPaperService.findQuestionList(paperId));
|
|
|
|
|
// 获取推荐试卷
|
|
|
|
|
model.addObject("zhentiPaperList", iPaperService.selectPage(new Page<PaperEntity>(1, 5) , Condition.create().eq("subject_id", paper.getSubjectId()).eq("type",SystemConstant.ZHENGTI_PAPER_ID)).getRecords());
|
|
|
|
|
model.addObject("moniPaperList", iPaperService.selectPage(new Page<PaperEntity>(1, 5) , Condition.create().eq("subject_id", paper.getSubjectId()).eq("type",SystemConstant.MONI_PAPER_ID)).getRecords());
|
|
|
|
|
model.addObject("yatiPaperList", iPaperService.selectPage(new Page<PaperEntity>(1, 5) , Condition.create().eq("subject_id", paper.getSubjectId()).eq("type",SystemConstant.YATI_PAPER_ID)).getRecords());
|
|
|
|
|
model.addObject("hotPaperList", iPaperService.selectPage(new Page<PaperEntity>(1, 5) , Condition.create().eq("subject_id", paper.getSubjectId()).eq("course_id", paper.getCourseId())).getRecords());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(BrowserUtils.isMobile(request.getHeader("user-agent"))) {
|
|
|
|
|
model.setViewName("mobile/paper");
|
|
|
|
|
}else {
|
|
|
|
|
model.setViewName("paper");
|
|
|
|
|
}
|
|
|
|
|
return model;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
model.setViewName("404");
|
|
|
|
|
return model;
|
|
|
|
|
|
|
|
|
|
// 调用iSubjectService的selectById方法,传入学科的唯一标识(subjectId)作为参数,从数据库等数据源中查询对应的学科详细信息(以SubjectEntity对象形式返回),
|
|
|
|
|
// 获取学科信息是为了在试卷列表页面展示该试卷列表所属的学科相关情况,例如学科名称等内容,将学科信息添加到ModelAndView对象中传递给视图进行展示。
|
|
|
|
|
SubjectEntity subject = iSubjectService.selectById(subjectId);
|
|
|
|
|
|
|
|
|
|
// 调用iSysAreaService的selectList方法,通过条件构造器构建查询条件,
|
|
|
|
|
// 使用eq("tree_level", "0")表示筛选出层级为0的区域列表(可能表示顶级区域或者根区域等情况,具体含义由业务中区域层级的定义决定),获取区域列表信息(以List<SysAreaEntity>形式返回),
|
|
|
|
|
// 这些区域列表信息会添加到ModelAndView对象中,方便在试卷列表页面展示可筛选的区域情况,例如提供区域下拉框供用户选择等情况。
|
|
|
|
|
List<SysAreaEntity> areaList = iSysAreaService.selectList(Condition.create().eq("tree_level", "0"));
|
|
|
|
|
|
|
|
|
|
// 创建一个Page对象,用于进行分页查询操作,传入当前页码(pageNum)和每页显示的记录数量(这里固定为10)来确定分页情况,
|
|
|
|
|
// 后续将这个Page对象以及其他构建的查询条件一起传递给iPaperService的selectPage方法进行分页查询符合条件的试卷列表信息。
|
|
|
|
|
Page<PaperEntity> page = new Page<>(pageNum, 10);
|
|
|
|
|
|
|
|
|
|
// 创建一个Condition对象,用于构建MyBatis Plus的查询条件,后续根据传入的各个参数情况,往这个条件对象中添加相应的条件,用于筛选符合要求的试卷列表信息。
|
|
|
|
|
Condition condition = Condition.create();
|
|
|
|
|
|
|
|
|
|
// 判断学科ID是否不为空且不等于"0"(可能"0"表示不进行学科筛选等特殊情况,具体由业务逻辑决定),
|
|
|
|
|
// 如果满足条件,使用eq("subject_id", subjectId)向条件对象中添加学科ID的筛选条件,即筛选出学科ID等于传入学科ID的试卷列表信息。
|
|
|
|
|
if (!StringUtils.isEmpty(subjectId) &&!"0".equals(subjectId)) {
|
|
|
|
|
condition.eq("subject_id", subjectId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 类似地,判断试卷类型是否不为空且不等于"0",如果是,则添加试卷类型的筛选条件,筛选出符合该类型要求的试卷列表信息,例如只查询真题、模拟题等不同类型的试卷。
|
|
|
|
|
if (!StringUtils.isEmpty(paperType) &&!"0".equals(paperType)) {
|
|
|
|
|
condition.eq("type", paperType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 判断课程ID是否满足相应条件,若满足则添加课程ID的筛选条件,用于获取该课程相关的试卷信息,例如筛选出属于某个具体课程的试卷列表。
|
|
|
|
|
if (!StringUtils.isEmpty(courseId) &&!"0".equals(courseId)) {
|
|
|
|
|
condition.eq("course_id", courseId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 对年份参数进行类似的判断和条件添加操作,筛选出对应年份的试卷列表信息,比如只展示2023年的试卷等情况。
|
|
|
|
|
if (!StringUtils.isEmpty(year) &&!"0".equals(year)) {
|
|
|
|
|
condition.eq("year", year);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据区域ID参数情况添加区域筛选条件,获取该区域相关的试卷信息,确保查询到的试卷列表是与指定区域相关的。
|
|
|
|
|
if (!StringUtils.isEmpty(area) &&!"0".equals(area)) {
|
|
|
|
|
condition.eq("area_id", area);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 调用PageUtils工具类的getPage方法,传入iPaperService的selectPage方法返回的结果(即分页查询到的试卷列表信息),进行一些分页相关的处理(具体处理逻辑由PageUtils类决定),
|
|
|
|
|
// 获取处理后的分页数据结果(以PageUtils对象形式返回),包含了分页相关的数据(如总记录数、当前页码、每页记录数等信息以及试卷记录列表等内容),将其添加到ModelAndView对象中,用于在视图中展示试卷列表以及分页相关的情况。
|
|
|
|
|
PageUtils result = PageUtils.getPage(iPaperService.selectPage(page, condition));
|
|
|
|
|
|
|
|
|
|
// 判断课程列表的大小是否大于0且当前课程对象为null(可能存在传入的课程ID对应的课程不存在,但有同学科下的其他课程情况),
|
|
|
|
|
// 如果满足条件,说明可以从课程列表中取第一个课程作为默认展示的课程(具体业务逻辑可能根据实际情况而定),将其赋值给course变量,后续添加到ModelAndView对象中用于视图展示。
|
|
|
|
|
if (courseList.size() > 0 && course == null) {
|
|
|
|
|
course = courseList.get(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 调用iPaperService的selectCount方法,传入空的Condition对象(表示不添加额外筛选条件,可能用于获取全部试卷的总数等情况,具体取决于业务逻辑),
|
|
|
|
|
// 查询试卷的总数量(以整数形式返回),将试卷总数添加到ModelAndView对象中,方便在页面上展示试卷的总数量等相关信息,例如提示用户共有多少份试卷等情况。
|
|
|
|
|
Integer total = iPaperService.selectCount(Condition.EMPTY);
|
|
|
|
|
|
|
|
|
|
// 将查询到的课程列表信息添加到ModelAndView对象中,设置属性名为"courseList",方便在视图中通过这个属性名获取课程列表数据进行展示,例如循环展示课程名称等相关内容。
|
|
|
|
|
model.addObject("courseList", courseList);
|
|
|
|
|
// 把学科信息添加到ModelAndView对象中,属性名为"subject",用于在视图中展示学科相关情况,例如学科名称等内容,让用户了解试卷所属的学科背景。
|
|
|
|
|
model.addObject("subject", subject);
|
|
|
|
|
// 将当前课程的详细信息添加到ModelAndView对象中,属性名为"course",方便在视图中展示课程的各种详细内容,如课程名称、简介等信息。
|
|
|
|
|
model.addObject("course", course);
|
|
|
|
|
// 把区域列表信息添加到ModelAndView对象中,属性名为"areaList",以便在视图中展示可筛选的区域情况,例如以下拉框形式展示区域选项等情况。
|
|
|
|
|
model.addObject("areaList", areaList);
|
|
|
|
|
// 将处理后的试卷分页数据添加到ModelAndView对象中,属性名为"paperPage",方便在视图中展示试卷列表以及分页相关的信息,例如展示试卷标题、分页导航条等内容。
|
|
|
|
|
model.addObject("paperPage", result);
|
|
|
|
|
// 把试卷总数添加到ModelAndView对象中,属性名为"total",用于在视图中展示试卷的总数量相关信息,给用户一个整体的试卷数量提示。
|
|
|
|
|
model.addObject("total", total);
|
|
|
|
|
// 将课程ID添加到ModelAndView对象中,属性名为"courseId",可能在页面上用于一些与课程相关的操作或者链接生成等情况(具体取决于前端页面的业务逻辑设计)。
|
|
|
|
|
model.addObject("courseId", courseId);
|
|
|
|
|
// 同样把试卷类型添加到ModelAndView对象中,属性名为"paperType",方便在页面上展示当前筛选的试卷类型情况,或者用于根据类型进行其他相关操作等情况。
|
|
|
|
|
model.addObject("paperType", paperType);
|
|
|
|
|
// 将年份信息添加到ModelAndView对象中,属性名为"year",用于在视图中展示当前筛选的年份情况,例如提示用户当前展示的是哪一年的试卷等情况。
|
|
|
|
|
model.addObject("year", year);
|
|
|
|
|
// 把区域标识添加到ModelAndView对象中,属性名为"area",可能在页面上用于显示当前筛选的区域情况或者进行区域相关的操作等情况。
|