一、前言
本次作业总体使用了ssm(spring+springmvc+mybatis)框架,使用的IDE工具为IntelliJ IDEA,并且使用Maven进行整体开发,数据库使用的是SQL Server 2008 r2。前端是基于bootstrap框架进行开发,实现的主要功能有:
- 显示已录入成绩列表;
- 新增学生成绩信息(录入学生标识、课程标识和成绩);
- 修改学生成绩信息(仅允许修改成绩)
- 删除学生成绩信息
- 学生成绩合计功能(所有学生所有课程的总成绩和平均成绩)
- 分页显示学生成绩
- 按学生统计学生的总成绩和平均成绩
- 分别按专业、年级、学号、姓名、科目查询学生成绩信息
页面概览
二、文件目录
三、主要Java类设计
3.1 studentController类
@Controller
public class studentController {
@Autowired
private IstudentService istudentService;
@RequestMapping(value = "index")
public String index(){
return "index";
}
//从数据库中加载数据
@RequestMapping(value = "/student",method = RequestMethod.POST)
@ResponseBody
public JSONObject showStudentALL(HttpServletRequest request){
List<studentAllAttr> listStudent = istudentService.findStudentAllAttr();
JSONObject stujson = new JSONObject();
System.out.println(request.getParameter("pageIndex"));
int rows = Integer.parseInt(request.getParameter("pageSize"));//每一页的最大记录数
int page = Integer.parseInt(request.getParameter("pageIndex"));//页码
//System.out.print(page+" "+rows);
int PageIndexbegin = (page-1)*rows;//每一页起始点位置
int PageIndexend = PageIndexbegin+rows>listStudent.size()-1?listStudent.size():PageIndexbegin+rows;
stujson.put("total",listStudent.size());
stujson.put("rows",listStudent.subList(PageIndexbegin,PageIndexend));//一页的条数
System.out.println(stujson.toString());
return stujson;
}
//通过学号查找学生姓名
@RequestMapping(value = "/searchstuName",method = RequestMethod.POST)
@ResponseBody
public JSONObject searchstuName(HttpServletRequest request, HttpServletResponse response){
response.setContentType("text/html;charset=utf-8"); //当然如果是json数据,需要设置为("text/javascript;charset=utf-8");
response.setCharacterEncoding("utf-8");
String stuNo = request.getParameter("stuNo");
System.out.println(stuNo);
String stuName = istudentService.searchName(Integer.parseInt(stuNo));
System.out.println(stuName);
JSONObject stuNamejson = new JSONObject();
stuNamejson.put("stuName",stuName);
return stuNamejson;
}
//添加成绩信息
@RequestMapping(value = "/addscore",method = RequestMethod.POST)
@ResponseBody //@RequestBody转换接受的JSON为对象,用@ResponseBody转换返回的对象为JSON。有两种接受前端数据的方式,一种使用Map接受,一种使用实体类进行接收
public String addscore(@RequestBody Map<String, String> addmap){
int stuNo = Integer.parseInt(addmap.get("studentNo"));//获取学号,并进行类型转换
//System.out.println(addmap.get("subjectName"));
int stuId = istudentService.searchStuId(stuNo);//通过学号获取学生id
int subId = istudentService.searchId(addmap.get("subjectName"));//通过课程名获取课程id
float stuscore = Float.parseFloat(addmap.get("stuscore"));//获取学生成绩
System.out.println(stuNo+" "+subId+" "+stuscore+" ");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
try {
System.out.println(addmap.get("addtime"));
Date modifytime = sdf.parse(addmap.get("addtime"));
int hasfoundinScore = istudentService.searchalex(subId,stuId);//查找该学生课程信息,
System.out.println(hasfoundinScore);
//如果该条记录存在就更新数据库
if(hasfoundinScore!=0){
istudentService.updateScore(hasfoundinScore,subId,stuId,stuscore,new Date());
return "更新成功";
}//不存在就插入
else{
int isadd = 0;
isadd = istudentService.addScore(subId,stuId,stuscore,new Date());
if(isadd!=0)
return "新增成功";
else
return "新增失败";
}
}catch (ParseException e){
e.printStackTrace();
return "失败";
}
}
//删除学生成绩信息
@RequestMapping(value = "/delet",method = RequestMethod.POST)
@ResponseBody
public String delet(@RequestBody Map<String, String> deletemap){
int stuid = istudentService.searchStuId(Integer.parseInt(deletemap.get("stuNo")));//根据学号找stuid
int subid = istudentService.searchId(deletemap.get("subname"));//根据课程名找subid
int scoreid = istudentService.searchalex(subid,stuid);//查找是否存在该成绩信息记录
System.out.println(scoreid);
if(scoreid!=0) {
istudentService.delScore(scoreid);//存在即删除
return "del ok";
}
return "del false";
}
//根据学号获得学生总成绩
@RequestMapping(value="/getGradeSum",method = RequestMethod.POST)
@ResponseBody
public String getGradeSum(HttpServletRequest request){
System.out.println(request.getParameter("sumno")+"");
int stuNo = Integer.parseInt(request.getParameter("sumno"));
int stuId = istudentService.searchStuId(stuNo);
System.out.println(stuId+"getsum");
float scoresum = istudentService.getGradeSum(stuId);
return scoresum+"";
}
//获取所有学生总成绩
@RequestMapping(value = "/getAllGradeSum",method = RequestMethod.POST)
@ResponseBody
public String getAllGradeSum(){
return istudentService.getAllGradeSum()+"";
}
//根据学号获得学生平均成绩
@RequestMapping(value="/getGradeAvg",method = RequestMethod.POST)
@ResponseBody
public String getGradeAvg(HttpServletRequest request){
System.out.println(request.getParameter("avgno")+"");
int stuNo = Integer.parseInt(request.getParameter("avgno"));
int stuId = istudentService.searchStuId(stuNo);
System.out.println(stuId+"getsum");
float scoreavg = istudentService.getGradeAvg(stuId);
return scoreavg+"";
}
//获得所有学生平均成绩
@RequestMapping(value = "/getAllGradeAvg",method = RequestMethod.POST)
@ResponseBody
public String getAllGradeAvg(){
return istudentService.getAllGradeAvg()+"";
}
}
3.2 ScoreMapper类
package zzx.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import zzx.entity.score;
import java.util.Date;
import java.util.List;
@Repository
public interface ScoreMapper {
public List<score> findstuScore(@Param("stuid") int stuid,@Param("subid") int subid);
public List<score> findAllScore();
//查找某学生成绩信息是否已经存在 already exist 返回已存在记录ID
public int searchalex(@Param("subId")int subId,@Param("stuId") int stuId);
//添加成绩信息
public int addScore(@Param("subjectId") int subjectId, @Param("studentId") int studentId, @Param("studentScore") float studentScore, @Param("motime") Date modifyTime);
//更新成绩信息
public void updateScore(@Param("scoreId") int scoreId,@Param("subjectId") int subjectId, @Param("studentId") int studentId, @Param("studentScore") float studentScore, @Param("motime") Date modifyTime);
//删除成绩信息
public void delScore(@Param("scoreId") int scoreId);
//获取某学生的总成绩
public Float getGradeSum(@Param("sumNo") int sumNo);
//获取所有学生总成绩
public Float getAllGradeSum();
//获取学生平均成绩
public Float getGradeAvg(@Param("avgno") int avgno);
//获取所有学生平均成绩
public Float getAllGradeAvg();
}
3.3 IstudentServiceImpl类
@Service
@Transactional
public class IstudentServiceImpl implements IstudentService {
@Resource
private StudentMapper studentMapper;
@Resource
private SubjectMapper subjectMapper;
@Resource
private ScoreMapper scoreMapper;
@Override
public List<student> findAllStudent(){
return studentMapper.findAllStudent();
}
@Override
public List<studentAllAttr> findStudentAllAttr() {
return studentMapper.findStudentAllAttr();
}
@Override
public String searchName(int stuNo){System.out.println(stuNo);return studentMapper.searchName(stuNo);}
@Override
public int searchStuId(int stuNo){return studentMapper.searchStuId(stuNo);}
public StudentMapper getSdao(){
return studentMapper;
}
public void setSdao(StudentMapper studentMapper){
this.studentMapper = studentMapper;
}
@Override
public List<subject> findstubject(int subid){return subjectMapper.findstubject(subid);}
@Override
public List<subject> findAllsub(){return subjectMapper.findAllsub();}
@Override
public int searchId(String subname){System.out.println(subjectMapper.searchId(subname));return subjectMapper.searchId(subname);}
public SubjectMapper getSubjectMapper() {
return subjectMapper;
}
public void setSubjectMapper(SubjectMapper subjectMapper) {
this.subjectMapper = subjectMapper;
}
@Override
public List<score> findAllScore() {
return null;
}
@Override
public List<score> findstuScore(int subint, int stuid) {
return null;
}
@Override
public int addScore(int subjectId, int studentId, float studentScore, Date modifyTime){return scoreMapper.addScore(subjectId,studentId,studentScore,modifyTime);};
@Override
public int searchalex(int subId,int stuId){return scoreMapper.searchalex(subId,stuId);}
@Override
public void updateScore(int soreId,int subjectId, int studentId, float studentScore,Date modifyTime){
//Date now = new Date();
//SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//可以方便地修改日期格式
scoreMapper.updateScore(soreId,subjectId,studentId,studentScore,modifyTime);
}
@Override
public float getGradeSum(int sumNo){return scoreMapper.getGradeSum(sumNo);}
@Override
public Float getAllGradeSum(){return scoreMapper.getAllGradeSum();}
@Override
public Float getGradeAvg(int avgno){return scoreMapper.getGradeAvg(avgno);}
@Override
public Float getAllGradeAvg(){return scoreMapper.getAllGradeAvg();}
public void delScore(int scoreId){scoreMapper.delScore(scoreId);}
public ScoreMapper getScoreMapper() {
return scoreMapper;
}
public void setScoreMapper(ScoreMapper scoreMapper) {
this.scoreMapper = scoreMapper;
}
}
3.4 scoremapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="zzx.mapper.ScoreMapper">
<select id="findstuScore" parameterType="int" resultType="score">
select * from ScoreInfo where subjectId=#{subid} and studentId=#{stuid};
</select>
<select id="findAllScore">
select * from ScoreInfo;
</select>
<insert id="addScore" >
insert into ScoreInfo(subjectId,studentId,studentScore,modifyTime) values (#{subjectId},#{studentId},#{studentScore},#{motime})
<selectKey resultType="java.lang.Integer" keyProperty="id" >
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
<select id="searchalex" resultType="java.lang.Integer">
select ISNULL(MAX(scoreId),0) from ScoreInfo where subjectId = #{subId} and studentId = #{stuId}
</select>
<update id="updateScore">
update ScoreInfo <trim prefix="set" suffixOverrides=",">
<if test="subjectId!=null">subjectId=#{subjectId},</if>
<if test="studentId!=null">studentId=#{studentId},</if>
<if test="studentScore!=null">studentScore=#{studentScore},</if>
<if test="motime!=null">modifyTime=#{motime},</if>
</trim>
where scoreId = #{scoreId}
</update>
<delete id="delScore">
delete from ScoreInfo where scoreId = #{scoreId}
</delete>
<select id="getGradeSum" resultType="java.lang.Float">
select sum(studentScore) from ScoreInfo where studentId = #{sumNo}
</select>
<select id="getAllGradeSum" resultType="java.lang.Float">
select sum(studentScore) from ScoreInfo
</select>
<select id="getGradeAvg" resultType="java.lang.Float">
select avg(studentScore) from ScoreInfo where studentId = #{avgno}
</select>
<select id="getAllGradeAvg" resultType="java.lang.Float">
select avg(studentScore) from ScoreInfo
</select>
</mapper>
四、主要网页设计
4.1 表格设计
引用了bootstrapTable插件
4.1.1 表格HTML元素部分
<div id="gradetable">
<table class="table" id="stutable"></table>
</div>
4.1.2 表格JavaScript初始化
$(function () {
//1.初始化Table
var oTable = new TableInit();
oTable.Init();
//2.初始化Button的点击事件
var oButtonInit = new ButtonInit();
oButtonInit.Init();
});
function tableHeight(){
//可以根据自己页面情况进行调整
return $(window).height() -280;
}
var TableInit = function () {
var oTableInit = new Object();
//初始化Table
oTableInit.Init = function () {
$('#stutable').bootstrapTable({
method: 'post',
contentType: "application/x-www-form-urlencoded",//必须要有!!!!
url:"/student",//要请求数据的文件路径
toolbar: '#toolbar',//指定工具栏
striped: true, //是否显示行间隔色
height:tableHeight(),//高度调整
dataType:"json",//bootstrap table 可以前端分页也可以后端分页,这里
//我们使用的是后端分页,后端分页时需返回含有total:总记录数,这个键值好像是固定的
//rows: 记录集合 键值可以修改 dataField 自己定义成自己想要的就好
smartDisplay:false,
pageNumber: 1, //初始化加载第一页,默认第一页
pagination:true,//是否分页
queryParams:oTableInit.queryParams,//请求服务器时所传的参数
sidePagination:'server',//指定服务器端分页
pageSize:10,//单页记录数
pageList:[3,10,20,30],//分页步进值
showRefresh:true,//刷新按钮
showColumns:true,
clickToSelect: true,//是否启用点击选中行
toolbarAlign:'right',//工具栏对齐方式
buttonsAlign:'right',//按钮对齐方式
toolbar:'#toolbar',//指定工作栏
columns: [{
checkbox: true
}, {
field: 'specialty',
title: '专业'
}, {
field: 'grade',
title: '年级'
}, {
field: 'studentNo',
title: '学号'
}, {
field: 'studentname',
title: '姓名'
}, {
field: 'studentsex',
title: '性别'
}, {
field: 'subjectName',
title: '科目'
}, {
field: 'studentScore',
title: '成绩'
}, {
field: 'peration',
title: '操作',
width: 120,
align: 'center',
valign: 'middle',
formatter: actionFormatter
},
],
locale:'zh-CN',//中文支持,
responseHandler: function (res) {
//如果没有错误则返回数据,渲染表格
console.log(res);
return res;
},
});
//操作栏的格式化
function actionFormatter(value, row, index) {
var id = value;
var result = "";
result += "<a href='javascript:;' onclick=\"modify(this)\" title='编辑'><span class='glyphicon glyphicon-pencil'>编辑</span></a>";
result += "<a href='javascript:;' onclick=\"deleteing(this)\" title='删除'><span class='glyphicon glyphicon-remove'>删除</span></a>";
return result;
}
};
//得到查询的参数
oTableInit.queryParams = function (params) {
var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
//每页多少条数据
pageSize: params.limit,
//请求第几页
pageIndex:params.pageNumber,
//searchtext: $("#search_text").val(),
//searchkey: $(".search").text()
};
return temp;
};
return oTableInit;
};
var ButtonInit = function () {
var oInit = new Object();
var postdata = {};
oInit.Init = function () {
//初始化页面上面的按钮事件
};
return oInit;
};
4.2 表单部分
4.2.1 HTML元素部分
4.2.2 JavaScript事件处理
1、关于submit
这里表单的提交按钮控制两个事件,一个是新增,一个是递交修改,在提交之前会先调用后台searchstuName方法查找该学生是否存在,如果存在,使用ajax向后台addscore发送请求,addscore先判定该条记录是否存在,如果存在则进行更新操作如果不存在则进行新增操作
function searchName(obj) {
var stuNo = $(obj).val();
if(stuNo!=null){
$.ajax({
url:"/searchstuName",//通过学号查找姓名,如果存在姓名自动出现在输入框,否则新增
type:"post",
contentType: "application/x-www-form-urlencoded; charset=utf-8",
data:{stuNo:stuNo},
dataType:"json",//预期获取的数据格式
success:function (data) {
console.log(data.stuName);
var stuname = data.stuName;
if(stuname!=null) {
$("#name").val(stuname);
isstuex = 1;
}
else {
$("#name").attr("placeholder","该用户不存在");
isstuex = 0;
}
}
})
}
}
$("#submit1").click(function () {
var ischecked = checkform()
var adddata = {};
adddata["studentNo"] = $("#sno").val();
adddata["subjectName"] = $("input:radio[name='optionsRadiosinline2']:checked").val();
adddata["stuscore"] = $("#grade").val();
adddata["scoreId"] = formid;
var nowtime = new Date();
adddata["addtime"] = nowtime.toLocaleDateString();
console.log(adddata["studentNo"]);
console.log(adddata["subjectName"]);
console.log(adddata["addtime"]);
console.log(isstuex)
//添加操作
//学生存在。新增score表
if (isstuex == 1&&ischecked) {
console.log("addnewScore")
$.ajax({
url: "/addscore",
type: "post",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(adddata),
dataType: "text",//预期获取的数据格式
success: function (data) {
console.log(data);
$("button[name='refresh']").trigger("click");
//window.location.reload();
if(submitflag==1)
alert("新增成功");
if(submitflag==2)
alert("修改成功");
}
})
}
if(isstuex==0){
//searchName(document.getElementById("name"));
alert("该用户不存在");
}
})
2、关于delete
//删除
function deleteing(obj){
var ttr = $(obj).parent().parent();
var ttd = ttr.children()
var deldata = {};
deldata["stuNo"] = ttd[3].innerHTML;
deldata["subname"] = ttd[6].innerHTML;
if(confirm("确认删除?")){
$.ajax({
url: "/delet",
type: "post",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(deldata),
dataType: "text",//预期获取的数据格式
success: function (data) {
console.log(data);
$("button[name='refresh']").trigger("click");//表格刷新
}
})
}
}
3、关于获取学生总成绩与平均成绩
使用getGradeSum()来获取学生总成绩,getavgGrade()来获取学生平均成绩,当用户输入学生学号为空时则统计所有学生总成绩,否则则统计特定学生总成绩,求平均成绩同理
function getGradeSum() {
var sumNo = prompt("请输入学生学号,不输入即求所有学生总成绩 ");
console.log(sumNo);
if(sumNo==''){
$.ajax({
url: "/getAllGradeSum",
type: "post",
contentType: "application/x-www-form-urlencoded; charset=utf-8",
dataType: "text",//预期获取的数据格式
success: function (data) {
alert("所有学生总成绩为"+data);
},
error:function () {
console.log(sumNo);
}
})
}
else {
//先查找学生是否存在
$.ajax({
url:"/searchstuName",//通过学号查找姓名,如果存在姓名自动出现在输入框,否则新增
type:"post",
contentType: "application/x-www-form-urlencoded; charset=utf-8",
data:{stuNo:sumNo},
dataType:"json",//预期获取的数据格式
success:function (data) {
console.log(data.stuName);
var stuname = data.stuName;
if(stuname!=null) {
isstuex = 1;
//学生存在,获取总成绩
$.ajax({
url: "/getGradeSum",
type: "post",
contentType: "application/x-www-form-urlencoded; charset=utf-8",
data: {sumno: sumNo},
dataType: "text",//预期获取的数据格式
success: function (data) {
alert("该学生总成绩为" + data);
},
error: function () {
console.log(sumNo);
}
});
}
else {
alert("该用户不存在");
isstuex = 0;
}
}
})
}
}
如下为源码地址:
GitHub源码