🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习。自有计算机毕设的工作室团队,专注计算机毕设开发、定制、远程、文档编写指导等。

🍅 查看主页更多项目 | 毕业设计工作室🍅

🍅 欢迎点赞 👍 收藏 ⭐留言 📝

🍅 Java毕设项目精品实战案例《3000+套》🍅 

⬇️文章末尾获取联系方式,需要源码+毕设论文或者演示视频可以联系⬇️

⚡感兴趣大家可以点点关注收藏,后续更新更多项目资料。⚡          

本系统包含(源码+数据库+万字毕业论文)  文末可获取本项目java源码和数据库参考。

系统程序文件列表

  • 1 章 实验报告管理系统总体设计

在上一章节中分析了实验报告管理系统的功能性需求,并且根据需求分析了实验报告管理系统中的用例以及系统的增删改查流程。那么接下来就要开始对实验报告管理系统架构、主要功能和数据库开始进行设计。

    1. 系统功能模块设计

系统的整体架构确定以后,再来看实验报告管理系统的主要功能模块图整体的功能模块包括登录、管理员、用户管理实验课程管理、实验报告管理、实验成绩管理这几大功能,图3.1就是实验报告管理系统的功能模块图。

图3.1 实验报告管理系统功能模块图

    1. 数据库设计

数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有E-R模型和逻辑结构设计两部分。

      1. 数据库概念结构设计

一个完美的系统是需要一个强大的数据库对其进行支持的,数据库里面储存了系统的所有字段,在涉及数据库的时候,我们一般都采用E-R图来表示各个数据库表含有的字段名称,下面介绍实验报告管理系统储存数据的E-R图,在此罗列出来一些主要的数据库E-R模型图。

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

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

图3.4 实验成绩E-R关系图

      1. 数据库逻辑结构设计

通过前面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, "账号或密码不正确");

        }

}

    1. 管理员模块

管理员进入到实验报告管理系统以后,点击“用户管理”下的“管理员”这个按钮就会显示出管理员的信息,如果想要填写新的管理员,点击右上角“添加”按钮,然后输入用户名、密码、昵称、手机号码等信息,点击“提交”按钮进行提交,其中用户名和密码是必须填写的,同时也支持对已有的管理员进行编辑、删除和查询。界面如下图4.2所示。

图4.2 管理员界面图

    1. 关于我们模块

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

}

    1. 系统公告管理界面

点击“系统公告”这个按钮就会显示出所有的系统公告的信息,如果想要填写新的系统公告,点击上方的“添加”按钮,然后输入标题、分类、内容,点击“提交”按钮进行提交,同时也支持对已有的系统公告进行编辑、删除和查询。界面如下图4.4所示。

图4.4 系统公告界面图

    1. 公告分类界面

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

图4.5 项目申报界面图

    1. 实验课程管理界面

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

    }

    1. 实验报告管理界面

点击“实验报告管理”这个按钮就会显示出所有的实验报告的信息,教师可以对实验报告进行查看,管理员对报告信息进行维护管理。界面如下图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);

}

    1. 实验成绩管理界面

点击“实验成绩管理”这个按钮就会显示出所有的实验成绩的信息,如果想要填写新的实验成绩信息,点击上方的“添加”按钮,然后输入实验编号、实验名称、课程类型、实验日期、教师信息、学生信息以及实验成绩,点击“提交”按钮进行提交,同时也支持对已有的实验成绩信息进行编辑、删除和查询。界面如下图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());

    }

    1. 实验课程模块

学生点击“实验课程”这个按钮就会显示出实验课程列表,学生也可以在搜索框输入某个关键字眼进行搜索查看,学生还可以在课程下方输入评论发布。界面如下图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());

}

    1. 系统公告界面

点击“系统公告”这个按钮就会显示出所有的公告信息,可以对内容进行电子收藏。界面如下图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();

    }

    1. 实验报告界面

学生可以进行实验报告的上传。界面如下图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());

}

    1. 实验成绩界面

学生点击“实验成绩”这个按钮就会显示出教师发布的实验报告成绩,学生可以查看成绩详情。界面如下图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());

}

 🙊项目介绍:已获导师指导并通过的高分项目。本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。

⬇️文章末尾获取联系方式,需要源码+毕设论文或者演示视频可以联系⬇️

⚡感兴趣大家可以点点关注收藏,后续更新更多项目资料。⚡          

源码、数据库获取↓↓↓↓

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐