基于Maven开发的ssm案例

本项目采用SSM框架,结合IntelliJ IDEA和Maven,实现了学生成绩的增删改查、分页显示、成绩统计等功能,前端基于bootstrap,支持按学号、姓名等条件查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

本次作业总体使用了ssm(spring+springmvc+mybatis)框架,使用的IDE工具为IntelliJ IDEA,并且使用Maven进行整体开发,数据库使用的是SQL Server 2008 r2。前端是基于bootstrap框架进行开发,实现的主要功能有:

  1. 显示已录入成绩列表;
  2. 新增学生成绩信息(录入学生标识、课程标识和成绩);
  3. 修改学生成绩信息(仅允许修改成绩)
  4. 删除学生成绩信息
  5. 学生成绩合计功能(所有学生所有课程的总成绩和平均成绩)
  6. 分页显示学生成绩
  7. 按学生统计学生的总成绩和平均成绩
  8. 分别按专业、年级、学号、姓名、科目查询学生成绩信息
    页面概览
    在这里插入图片描述
    在这里插入图片描述

二、文件目录

在这里插入图片描述
在这里插入图片描述

三、主要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源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值