项目介绍
计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了,让整个世界都可以即时通话和联系,极大的方便了人们的生活。所以说,成绩管理系统用计算机技术来进行设计,不仅在管理方面更加的系统化,操作性强,最重要的是关于数据的保存和使用都能节约大量的时间,该系统非常的好用。
成绩管理系统管理数据的工具是MySQL,编码的语言是Java,运用的框架是SSM框架。该系统的目标用户包括管理员,学生。管理员对课程信息管理,对班级信息,学生成绩信息,公告信息,学生信息等进行管理,管理方式主要就是增删改查管理。学生下载课程文件,查看课程成绩,更改登录成绩管理系统的密码,更改个人信息等。
成绩管理系统不仅能让操作人员使用更加地方便,并且设计的也很合理,能有效的避免误操作,让数据在录入的环节就符合设计需要,极大的规避了源头性的输入误差,顺利的让数据变得更加可控并且可靠,让出错的几率降到最低。
4.2 功能模块设计
对管理员具体功能的设计结果将以图4.1所示的管理员功能结构图来进行体现。管理员对于成绩管理系统操作的功能包括对课程信息管理,对班级信息,学生成绩信息,公告信息,学生信息等进行管理,管理方式主要就是增删改查管理。
对学生具体功能的设计结果将以图4.2所示的学生功能结构图来进行体现。学生对于成绩管理系统操作的功能包括下载课程文件,查看课程成绩,更改登录成绩管理系统的密码,更改个人信息等。
开发环境
编程语言:Java
数据库 :Mysql
系统架构:B/S
后端框架:SSM
编译工具:idea或者eclipse,jdk1.8,maven
支持定做:java/php/python/android/小程序/vue/爬虫/c#/asp.net
系统实现
5.1 管理员功能实现
5.1.1 成绩信息管理
该功能主要用于实现对成绩基本信息的管理,成绩信息管理界面的运行效果见图5.1。在此界面,管理员添加学生的成绩信息,学生的成绩包括课程名称,学生姓名,班级,联系方式,成绩等信息,在成绩信息管理界面,如果发现登记出错误的成绩信息,管理员可以及时更改,已经无效的学生成绩信息,管理员可以及时删除。
图5.1 成绩信息管理界面
5.1.2 课程信息管理
该功能主要用于实现对课程基本信息的管理,课程信息管理界面的运行效果见图5.2。在此界面,管理员对课程名称,课程类型,课程编号等信息进行登记,对于登记出错误的课程信息也能通过修改功能及时更正信息,课程信息已经失效也能通过删除功能进行删除等。管理员在添加课程信息时,需要对课程文件进行上传,上传成功的课程文件也能在本界面进行下载。
图5.2 课程信息管理界面
5.1.3 学生管理
该功能主要用于实现对学生信息的管理,学生管理界面的运行效果见图5.3。在此界面,管理员负责添加学生信息,学生信息包括生日,邮箱,班级,性别,头像,学生姓名等,对于学生信息,管理员有权利进行错误信息的更改以及失效信息的删除等。
图5.3 学生管理界面
5.1.4 公告信息管理
该功能主要用于实现对公告基本信息的管理,公告信息管理界面的运行效果见图5.4。在此界面,管理员对公告增删改查管理。
图5.4 公告信息管理界面
5.1.5 班级管理
该功能主要用于实现对班级信息的管理。班级管理界面的运行效果见图5.5。在此界面,管理员新增班级信息,班级信息主要包括班级名称信息,班级名称信息登记有误可以通过修改功能更正,班级信息失效,可以通过删除功能删除等。
图5.5 班级管理界面
5.2 学生功能实现
5.2.1 成绩信息查看
成绩信息查看界面的运行效果见图5.6。在此界面,学生查看课程成绩信息,学生点击详情链接可以对课程成绩的详细内容进行查看,当成绩信息较多时,学生可以使用查询功能来查询成绩,需要选择查询方式,比如选择通过课程名称查询,通过课程类型来筛选成绩等,查询功能可以帮助学生更快速的找到需要查看的成绩信息。
图5.6 成绩信息查看界面
5.2.2 课程信息查看
课程信息查看界面的运行效果见图5.7。在此界面,学生下载课程文件,查询课程,对课程的详细内容进行查看。
图5.7 课程信息查看界面
5.2.3 个人信息
个人信息界面的运行效果见图5.8。在此界面,学生可以更改头像,生日,班级,性别等信息。修改完成的个人信息需要及时保存。
图5.8 个人信息界面
核心代码
package com.controller;
import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;
/**
* 成绩信息
* 后端接口
* @author
* @email
*/
@RestController
@Controller
@RequestMapping("/chengji")
public class ChengjiController {
private static final Logger logger = LoggerFactory.getLogger(ChengjiController.class);
@Autowired
private ChengjiService chengjiService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private KechengService kechengService;
@Autowired
private YonghuService yonghuService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("学生".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = chengjiService.queryPage(params);
//字典表数据转换
List<ChengjiView> list =(List<ChengjiView>)page.getList();
for(ChengjiView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
ChengjiEntity chengji = chengjiService.selectById(id);
if(chengji !=null){
//entity转view
ChengjiView view = new ChengjiView();
BeanUtils.copyProperties( chengji , view );//把实体数据重构到view中
//级联表
KechengEntity kecheng = kechengService.selectById(chengji.getKechengId());
if(kecheng != null){
BeanUtils.copyProperties( kecheng , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setKechengId(kecheng.getId());
}
//级联表
YonghuEntity yonghu = yonghuService.selectById(chengji.getYonghuId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody ChengjiEntity chengji, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,chengji:{}",this.getClass().getName(),chengji.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
else if("学生".equals(role))
chengji.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
Wrapper<ChengjiEntity> queryWrapper = new EntityWrapper<ChengjiEntity>()
.eq("kecheng_id", chengji.getKechengId())
.eq("yonghu_id", chengji.getYonghuId())
.eq("chengji_number", chengji.getChengjiNumber())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ChengjiEntity chengjiEntity = chengjiService.selectOne(queryWrapper);
if(chengjiEntity==null){
chengji.setCreateTime(new Date());
chengjiService.insert(chengji);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody ChengjiEntity chengji, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,chengji:{}",this.getClass().getName(),chengji.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("学生".equals(role))
// chengji.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
//根据字段查询是否有相同数据
Wrapper<ChengjiEntity> queryWrapper = new EntityWrapper<ChengjiEntity>()
.notIn("id",chengji.getId())
.andNew()
.eq("kecheng_id", chengji.getKechengId())
.eq("yonghu_id", chengji.getYonghuId())
.eq("chengji_number", chengji.getChengjiNumber())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ChengjiEntity chengjiEntity = chengjiService.selectOne(queryWrapper);
if(chengjiEntity==null){
chengjiService.updateById(chengji);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
chengjiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
List<ChengjiEntity> chengjiList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
ChengjiEntity chengjiEntity = new ChengjiEntity();
// chengjiEntity.setKechengId(Integer.valueOf(data.get(0))); //课程 要改的
// chengjiEntity.setYonghuId(Integer.valueOf(data.get(0))); //学生 要改的
// chengjiEntity.setChengjiNumber(Integer.valueOf(data.get(0))); //成绩 要改的
// chengjiEntity.setChengjiContent("");//详情和图片
// chengjiEntity.setCreateTime(date);//时间
chengjiList.add(chengjiEntity);
//把要查询是否重复的字段放入map中
}
//查询是否重复
chengjiService.insertBatch(chengjiList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
}
论文参考
目 录
1 绪论 1
1.1 选题背景 1
1.2 选题意义 1
1.3 研究内容 2
2 系统开发技术 3
2.1 MySQL数据库 3
2.2 IDEA简介 3
2.3 SSM框架 4
2.4 Vue框架 4
3 系统分析 5
3.1 可行性研究 5
3.1.1 经济可行性 5
3.1.2 时间可行性 5
3.1.3 操作可行性 5
3.2 系统性能分析 6
3.2.1 系统的安全性 6
3.2.2 系统的易用性 6
3.2.3 系统的健壮性 6
3.3 系统流程分析 7
3.4 系统功能分析 9
4 系统设计 12
4.1 系统设计原则 12
4.2 功能模块设计 13
4.3 数据库设计 14
4.3.1 数据库E-R图 15
4.3.2 数据库表结构 17
5 系统实现 20
5.1 管理员功能实现 20
5.1.1 成绩信息管理 20
5.1.2 课程信息管理 20
5.1.3 学生管理 21
5.1.4 公告信息管理 21
5.1.5 班级管理 22
5.2 学生功能实现 23
5.2.1 成绩信息查看 23
5.2.2 课程信息查看 23
5.2.3 个人信息 24
6 系统测试 25
6.1 功能测试 25
6.2 可用性测试 25
6.3 测试结果分析 26
结 论 27
参考文献 29
致 谢 30