实现的主要功能有:
学生可以在登录进入系统后进行选课和查看课表等操作,另外,也可以查看、修改自己的个人信息。具体功能如下:1、查看自己的课表2、可以进行选课3、退出登录系统管理员则可以对整个系统进行管理操作,其在学生功能的基础上,还增加了如下功能:1、能够搜索查询学生的个人信息,查看每个班有哪些学生2、添加学生,添加课程,添加班级,对课程进行编排3、能删除或批量删除学生、课程、班级4、对学生、课程、班级进行编辑更改
项目目录截图:
主要代码解析:
班级控制层
package com.offcn.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.offcn.pojo.Classes;
import com.offcn.pojo.StudentExt;
import com.offcn.service.ClassesService;
import com.offcn.service.StudentService;
/**
* <p>
* Company: offcn
* </p>
*
* @author chenya
* @date 2019年12月18日
* @version 1.0
*/
@Controller
@RequestMapping("/cla") // 用来处理请求地址映射的注解
public class ClassesController {
@Resource
ClassesService classesService;
@Resource
StudentService studentService;
/*
* 列表与分页Action
*/
@RequestMapping("/list")
// 声明一个list方法,返回一个String类型
public String list(Model model, @RequestParam(required = false, defaultValue = "1") int pageNO) {
int size = 3;
model.addAttribute("size", size);
model.addAttribute("pageNO", pageNO);
model.addAttribute("count", classesService.getClassesCount());
model.addAttribute("clalist", classesService.getClassPager(pageNO, size));
return "class/list";
}
/*
* 删除单个对象Action
*/
@RequestMapping("/delete/{id}")
public String delete(Model model, @PathVariable int id,
@RequestParam(required = false, defaultValue = "1") int pageNO, RedirectAttributes redirectAttributes) {
if (classesService.delete(id) > 0) {
// redirectAttributes:重定向之后还能带参数跳转
// 隐藏了参数,链接地址上不直接暴露,但是能且只能在重定向的 “页面”
// 获取message参数值。其原理就是放到session中,session在跳到页面后马上移除对象。
redirectAttributes.addFlashAttribute("message", "删除成功!");
} else {
redirectAttributes.addFlashAttribute("message", "删除失败!");
}
return "redirect:/cla/list?pageNO=" + pageNO;
}
/*
* 删除多个对象Action
*/
@RequestMapping("/deletes")
public String deletes(Model model, @RequestParam int[] id,
@RequestParam(required = false, defaultValue = "1") int pageNO, RedirectAttributes redirectAttributes) {
// 执行删除
System.out.println("批量删除" + id.toString());
int rows = classesService.deletes(id);
if (rows > 0) {
redirectAttributes.addFlashAttribute("message", "删除" + rows + "行记录成功!");
} else {
redirectAttributes.addFlashAttribute("message", "删除失败!");
}
return "redirect:/cla/list?pageNO=" + pageNO;
}
/*
* 添加学生
*/
@RequestMapping("/add")
public String add(Model model) {
model.addAttribute("entity", new Classes());
return "class/add";
}
/*
* 添加保存
*/
@RequestMapping("/addSave")
// @ModelAttribute:绑定请求参数到指定对象
public String addSave(Model model, @ModelAttribute("entity") @Valid Classes entity, BindingResult bindingResult) {
// 如果模型中存在错误
if (bindingResult.hasErrors()) {
model.addAttribute("entity", entity);
return "class/add";
} else {
classesService.insert(entity);
return "redirect:/cla/list";
}
}
/*
* 编辑
*/
@RequestMapping("/edit/{id}")
// @PathVariable可以用来映射URL中的占位符到目标方法的参数中
public String edit(Model model, @PathVariable int id) {
model.addAttribute("entity", classesService.getCLassId(id));
return "class/edit";
}
/*
* 编辑保存
*/
@RequestMapping("/editSave")
// @Valid的参数后必须紧挨着一个BindingResult 参数
// Spring验证的错误返回
public String editSave(Model model, @ModelAttribute("entity") @Valid Classes entity, BindingResult bindingResult) {
// 如果模型中存在错误
if (bindingResult.hasErrors()) {
model.addAttribute("entity", entity);
return "/class/edit";
} else {
classesService.update(entity);
return "redirect:list";
}
}
@RequestMapping("search/{id}")
public String search(@PathVariable int id, Model model) {
List<StudentExt> slist = studentService.getStuByCid(id);
model.addAttribute("slist", slist);
return "class/stulist";
}
@RequestMapping("search1/{id}")
public String search1(@PathVariable int id, Model model) {
/*
* List<StudentExt> slist=studentService.getStuByCid(id);
* model.addAttribute("slist", slist);
*/
Classes classes = classesService.getStuByid(id);
model.addAttribute("classes", classes);
return "class/stulist1";
}
}
班级mapper层
package com.offcn.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.offcn.pojo.Classes;
//声明一个接口类
public interface ClassesMapper {
int deleteByPrimaryKey(Integer id);
int insert(Classes record);
int insertSelective(Classes record);//选择性保存数据
Classes selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Classes record);
int updateByPrimaryKey(Classes record);
List<Classes> getAllClasses();
//@Param 手动进行封装,用户参数传递标识
public List<Classes> getClassPager(@Param("skip") int skip, @Param("size") int size);
public Classes getCLassId(int id);
public int getClassesCount();
public int delete(int id);
public int update(Classes entity);
public Classes getStuByid(int id);
}
mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置mybatis的缓存,延迟加载等等一系列属性 -->
<settings>
<!-- 全局映射器启用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 查询时,关闭关联对象即时加载以提高性能 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允许使用列标签代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 对于批量更新操作缓存SQL以提高性能 -->
<!-- <setting name="defaultExecutorType" value="BATCH" /> -->
<!-- 数据库超过25000秒仍未响应则超时 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<typeAliases>
<package name="com.offcn.pojo" />
</typeAliases>
<!-- 全局别名设置,在映射文件中只需写别名,而不必写出整个类路径 -->
<!-- <typeAliases>
<typeAlias alias="TestBean"
type="com.offcn.persist.test.dataobject.TestBean" />
</typeAliases> -->
<!-- 非注解的sql映射文件配置,如果使用mybatis注解,该mapper无需配置,但是如果mybatis注解中包含@resultMap注解,则mapper必须配置,给resultMap注解使用 -->
<!--
<mappers>
<mapper resource="com/offcn/mapper/GoodsDAO.xml" />
</mappers> -->
</configuration>
在线演示地址:
http://www.educhenya.com:8080/student_manager
管理员账号及其密码: admin aaa
学生账号及其密码: 22 22222
运行截图: