【附源码】实验报告管理系统(源码+数据库+毕业论文齐全)java开发springboot+vue框架,可做毕业设计或课程设计
🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习。自有计算机毕设的工作室团队,专注计算机毕设开发、定制、远程、文档编写指导等。
🍅 欢迎点赞 👍 收藏 ⭐留言 📝
🍅 Java毕设项目精品实战案例《3000+套》🍅
⬇️文章末尾获取联系方式,需要源码+毕设论文或者演示视频可以联系⬇️
⚡感兴趣大家可以点点关注收藏,后续更新更多项目资料。⚡
本系统包含(源码+数据库+万字毕业论文) 文末可获取本项目java源码和数据库参考。
系统程序文件列表

在上一章节中分析了实验报告管理系统的功能性需求,并且根据需求分析了实验报告管理系统中的用例以及系统的增删改查流程。那么接下来就要开始对实验报告管理系统架构、主要功能和数据库开始进行设计。
系统的整体架构确定以后,再来看实验报告管理系统的主要功能模块图。整体的功能模块包括登录、管理员、用户管理、实验课程管理、实验报告管理、实验成绩管理这几大功能,图3.1就是实验报告管理系统的功能模块图。

图3.1 实验报告管理系统功能模块图
数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有E-R模型和逻辑结构设计两部分。
一个完美的系统是需要一个强大的数据库对其进行支持的,数据库里面储存了系统的所有字段,在涉及数据库的时候,我们一般都采用E-R图来表示各个数据库表含有的字段名称,下面介绍实验报告管理系统储存数据的E-R图,在此罗列出来一些主要的数据库E-R模型图。

图3.2 实验课程信息E-R关系图

图3.3 实验报告E-R关系图

图3.4 实验成绩E-R关系图
通过前面E-R关系图一共需要创建很多个数据表。在此罗列这几个主要数据库表的关系模型如下:
(1)表jiaoshi实体用来存放系统教师用户信息,教师信息包括:教师工号、教师姓名、性别、职称、联系电话等;
表3.1 教师信息jiaoshi表
|
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
|
id |
bigint |
主键 |
主键 |
||
|
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
|
jiaoshigonghao |
varchar |
200 |
教师工号 |
||
|
mima |
varchar |
200 |
密码 |
||
|
jiaoshixingming |
varchar |
200 |
教师姓名 |
||
|
xingbie |
varchar |
200 |
性别 |
||
|
zhicheng |
varchar |
200 |
职称 |
||
|
lianxidianhua |
varchar |
200 |
联系电话 |
||
|
touxiang |
longtext |
4294967295 |
头像 |
||
|
xueyuan |
varchar |
200 |
学院 |
(2)表xuesheng实体用来存放学生信息,主要包括:学生学号、姓名、性别、手机号、学院、年级班级、专业、头像等;
表3.2 学生信息xuesheng表
|
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
|
id |
bigint |
主键 |
主键 |
||
|
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
|
xuehao |
varchar |
200 |
学号 |
||
|
xingming |
varchar |
200 |
姓名 |
||
|
mima |
varchar |
200 |
密码 |
||
|
xingbie |
varchar |
200 |
性别 |
||
|
shoujihao |
varchar |
200 |
手机号 |
||
|
xueyuan |
varchar |
200 |
学院 |
||
|
nianjibanji |
varchar |
200 |
年级班级 |
||
|
zhuanye |
varchar |
200 |
专业 |
||
|
touxiang |
longtext |
4294967295 |
头像 |
(3)表shiyankecheng实体用来存放教师添加的实验课程信息中的实验编号、实验名称、课程类型、实验人数、图片、实验日期、实验教室、教室姓名、教室工号、实验仪器、实验内容等;
表3.3实验课程信息shiyankecheng表
|
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
|
id |
bigint |
主键 |
主键 |
||
|
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
|
shiyanbianhao |
varchar |
200 |
实验编号 |
||
|
shiyanmingcheng |
varchar |
200 |
实验名称 |
||
|
kechengleixing |
varchar |
200 |
课程类型 |
||
|
tupian |
longtext |
4294967295 |
图片 |
||
|
shiyanrenshu |
varchar |
200 |
实验人数 |
||
|
shiyanriqi |
date |
实验日期 |
|||
|
shiyanjiaoshi |
varchar |
200 |
实验教室 |
||
|
shiyanyiqi |
longtext |
4294967295 |
实验仪器 |
||
|
jiaoshigonghao |
varchar |
200 |
教师工号 |
||
|
jiaoshixingming |
varchar |
200 |
教师姓名 |
||
|
shiyanneirong |
longtext |
4294967295 |
实验内容 |
||
|
discussnum |
int |
评论数 |
0 |
||
|
storeupnum |
int |
收藏数 |
0 |
(4)表shiyanbaogao实体用来存放系统中学生上传的实验报告信息中的实验编号、实验名称、课程类型、实验日期、教师工号、教师姓名、学号、姓名、年级班级、学院、专业、实验报告等;
表3.4实验报告信息shiyanbaogao表
|
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
|
id |
bigint |
主键 |
主键 |
||
|
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
|
shiyanbianhao |
varchar |
200 |
实验编号 |
||
|
shiyanmingcheng |
varchar |
200 |
实验名称 |
||
|
kechengleixing |
varchar |
200 |
课程类型 |
||
|
shiyanriqi |
varchar |
200 |
实验日期 |
||
|
tupian |
longtext |
4294967295 |
图片 |
||
|
jiaoshigonghao |
varchar |
200 |
教师工号 |
||
|
jiaoshixingming |
varchar |
200 |
教师姓名 |
||
|
xuehao |
varchar |
200 |
学号 |
||
|
xingming |
varchar |
200 |
姓名 |
||
|
nianjibanji |
varchar |
200 |
年级班级 |
||
|
xueyuan |
varchar |
200 |
学院 |
||
|
zhuanye |
varchar |
200 |
专业 |
||
|
tijiaoshijian |
datetime |
提交时间 |
|||
|
shiyanbaogao |
longtext |
4294967295 |
实验报告 |
(5)表shiyanchengji实体用来存放系统教师发布的实验成绩信息,主要包括实验编号、实验名称、课程类型、实验日期、教师信息、学生信息以及实验成绩等;
表3.5实验成绩信息shiyanchengji表
|
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
|
id |
bigint |
主键 |
主键 |
||
|
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
|
shiyanbianhao |
varchar |
200 |
实验编号 |
||
|
shiyanmingcheng |
varchar |
200 |
实验名称 |
||
|
kechengleixing |
varchar |
200 |
课程类型 |
||
|
shiyanriqi |
varchar |
200 |
实验日期 |
||
|
tupian |
longtext |
4294967295 |
图片 |
||
|
jiaoshigonghao |
varchar |
200 |
教师工号 |
||
|
jiaoshixingming |
varchar |
200 |
教师姓名 |
||
|
xuehao |
varchar |
200 |
学号 |
||
|
xingming |
varchar |
200 |
姓名 |
||
|
nianjibanji |
varchar |
200 |
年级班级 |
||
|
xueyuan |
varchar |
200 |
学院 |
||
|
zhuanye |
varchar |
200 |
专业 |
||
|
fabushijian |
datetime |
发布时间 |
|||
|
shiyanchengji |
double |
实验成绩 |
|||
|
jiaoshipingjia |
longtext |
4294967295 |
教师评价 |
(6)表news实体用来存放系统管理员添加的公告信息,主要包括:标题、简介、分类名称、发布人、头像、内容等;
表3.6公告信息news表
|
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
|
id |
bigint |
主键 |
主键 |
||
|
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
|
title |
varchar |
200 |
标题 |
||
|
introduction |
longtext |
4294967295 |
简介 |
||
|
typename |
varchar |
200 |
分类名称 |
||
|
name |
varchar |
200 |
发布人 |
||
|
headportrait |
longtext |
4294967295 |
头像 |
||
|
clicknum |
int |
点击次数 |
0 |
||
|
clicktime |
datetime |
最近点击时间 |
|||
|
thumbsupnum |
int |
赞 |
0 |
||
|
crazilynum |
int |
踩 |
0 |
||
|
storeupnum |
int |
收藏数 |
0 |
||
|
picture |
longtext |
4294967295 |
图片 |
||
|
content |
longtext |
4294967295 |
内容 |
(7)表systemintro实体用来存放系统管理员添加的关于我们信息内容,包括标题、副标题、内容,图片等;
表3.7关于我们信息systemintro表
|
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
|
id |
bigint |
主键 |
主键 |
||
|
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
|
title |
varchar |
200 |
标题 |
||
|
subtitle |
varchar |
200 |
副标题 |
||
|
content |
longtext |
4294967295 |
内容 |
||
|
picture1 |
longtext |
4294967295 |
图片1 |
||
|
picture2 |
longtext |
4294967295 |
图片2 |
||
|
picture3 |
longtext |
4294967295 |
图片3 |
(8)表discussshiyankecheng实体用来存放用户提交的实验课程评论内容等;
表3.8实验课程评论信息discussshiyankecheng表
|
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
|
id |
bigint |
主键 |
主键 |
||
|
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
|
refid |
bigint |
关联表id |
|||
|
userid |
bigint |
用户id |
|||
|
avatarurl |
longtext |
4294967295 |
头像 |
||
|
nickname |
varchar |
200 |
用户名 |
||
|
content |
longtext |
4294967295 |
评论内容 |
||
|
reply |
longtext |
4294967295 |
回复内容 |
管理员,在登录界面输入用户名+密码,然后选择对应的角色,点击“登录”按钮,系统在用户数据库表中会对管理员的账号进行匹配,用户名+密码正确的话,就会登录到系统中各个用户的主管理界面,否则提示对应的信息,返回到登录的界面,如果忘记密码的话,可以点击登录按钮下面的忘记密码,根据提示进行找回密码;其主界面展示如下图4.1所示。

图4.1 首页界面图
登录的逻辑代码如下:
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.select(map, new HashMap<>()).getResultList();
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
String res = String.valueOf(service.runCountSql(sql).getSingleResult());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
tokenService.save(accessToken);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
管理员进入到实验报告管理系统以后,点击“用户管理”下的“管理员”这个按钮就会显示出管理员的信息,如果想要填写新的管理员,点击右上角“添加”按钮,然后输入用户名、密码、昵称、手机号码等信息,点击“提交”按钮进行提交,其中用户名和密码是必须填写的,同时也支持对已有的管理员进行编辑、删除和查询。界面如下图4.2所示。

图4.2 管理员界面图
点击“关于我们”这个按钮就会显示出系统所有的“关于我们”的信息,如果想要填写新的关于我们,点击左上角“添加”按钮,然后输入标题、内容、图片,点击“提交”按钮进行提交,同时也支持对已有的关于我们进行编辑、删除和查询。界面如下图4.3所示。

图4.3 关于我们界面图
关于我们的逻辑代码如下:
public class FindConfig {
public static String PAGE = "page";
public static String SIZE = "size";
public static String LIKE = "like";
public static String ORDER_BY = "orderby";
public static String FIELD = "field";
public static String GROUP_BY = "groupby";
public static String MIN_ = "_min";
public static String MAX_ = "_max";
}
点击“系统公告”这个按钮就会显示出所有的系统公告的信息,如果想要填写新的系统公告,点击上方的“添加”按钮,然后输入标题、分类、内容,点击“提交”按钮进行提交,同时也支持对已有的系统公告进行编辑、删除和查询。界面如下图4.4所示。

图4.4 系统公告界面图
点击“公告分类”这个按钮就会显示出所有的分类信息,管理员可以对分类进行增删改查。界面如下图4.5所示。

图4.5 项目申报界面图
点击“实验课程”这个按钮就会显示出所有的实验课程的信息,如果想要填写新的实验课程,点击上方的“添加”按钮,然后输入实验编号、实验名称、课程类型、实验人数、图片、实验日期、实验教室、教室姓名、教室工号、实验仪器、实验内容,点击“提交”按钮进行提交,同时也支持对已有的实验课程信息进行编辑、删除和查询。界面如下图4.6所示。

图4.6 实验课程界面图
实验课程管理逻辑代码如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
public Map<String,Object> readBody(BufferedReader reader){
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try{
br = reader;
String str;
while ((str = br.readLine()) != null){
sb.append(str);
}
br.close();
String json = sb.toString();
return JSONObject.parseObject(json, Map.class);
}catch (IOException e){
e.printStackTrace();
}finally{
if (null != br){
try{
br.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return null;
}
public void insert(Map<String,Object> body){
StringBuffer sql = new StringBuffer("INSERT INTO ");
sql.append("`").append(table).append("`").append(" (");
for (Map.Entry<String,Object> entry:body.entrySet()){
sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
}
sql.deleteCharAt(sql.length()-1);
sql.append(") VALUES (");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("'").append(entry.getValue()).append("'").append(",");
}else {
sql.append(entry.getValue()).append(",");
}
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
log.info("[{}] - 插入操作:{}",table,sql);
Query query = runCountSql(sql.toString());
query.executeUpdate();
}
点击“实验报告管理”这个按钮就会显示出所有的实验报告的信息,教师可以对实验报告进行查看,管理员对报告信息进行维护管理。界面如下图4.7所示。

图4.7 实验报告管理界面图
实验报告管理逻辑代码如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
点击“实验成绩管理”这个按钮就会显示出所有的实验成绩的信息,如果想要填写新的实验成绩信息,点击上方的“添加”按钮,然后输入实验编号、实验名称、课程类型、实验日期、教师信息、学生信息以及实验成绩,点击“提交”按钮进行提交,同时也支持对已有的实验成绩信息进行编辑、删除和查询。界面如下图4.8所示。

图4.8 实验成绩管理界面图
实验成绩管理逻辑代码如下:
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
Query select = service.select(service.readQuery(request), service.readConfig(request));
List resultList = select.getResultList();
if (resultList.size() > 0) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("obj",resultList.get(0));
return success(jsonObject);
} else {
return success(null);
}
}
public Query select(Map<String,String> query,Map<String,String> config){
StringBuffer sql = new StringBuffer("select ");
sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");
sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));
if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){
sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");
}
if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){
sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");
}
if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){
int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;
int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;
sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);
}
log.info("[{}] - 查询操作,sql: {}",table,sql);
return runEntitySql(sql.toString());
}
学生点击“实验课程”这个按钮就会显示出实验课程列表,学生也可以在搜索框输入某个关键字眼进行搜索查看,学生还可以在课程下方输入评论发布。界面如下图4.9所示。

图4.9 实验课程界面图
实验课程展示逻辑代码如下:
@RequestMapping(value = {"/count_group", "/count"})
public Map<String, Object> count(HttpServletRequest request) {
Query count = service.count(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
点击“系统公告”这个按钮就会显示出所有的公告信息,可以对内容进行电子收藏。界面如下图4.10所示。

图4.10 系统公告界面图
系统公告展示逻辑代码如下:
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
@Transactional
public void delete(Map<String,String> query,Map<String,String> config){
StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");
sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));
log.info("[{}] - 删除操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
学生可以进行实验报告的上传。界面如下图4.11所示。

s图4.11 实验报告界面图
实验报告上传逻辑代码如下:
@RequestMapping(value = {"/sum_group", "/sum"})
public Map<String, Object> sum(HttpServletRequest request) {
Query count = service.sum(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
学生点击“实验成绩”这个按钮就会显示出教师发布的实验报告成绩,学生可以查看成绩详情。界面如下图4.12所示。

图4.12 实验成绩界面图
实验成绩展示逻辑代码如下:
@RequestMapping(value = {"/avg_group", "/avg"})
public Map<String, Object> avg(HttpServletRequest request) {
Query count = service.avg(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
🙊项目介绍:已获导师指导并通过的高分项目。本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。
⬇️文章末尾获取联系方式,需要源码+毕设论文或者演示视频可以联系⬇️
⚡感兴趣大家可以点点关注收藏,后续更新更多项目资料。⚡
源码、数据库获取↓↓↓↓
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)