吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3234|回复: 34
收起左侧

[其他原创] 毕业设计源码:学生综合素质评价WEB系统

  [复制链接]
夸克逃逸 发表于 2022-11-24 00:08
本帖最后由 夸克逃逸 于 2023-5-25 10:07 编辑

—————————————————————

高校学生综合素质评价管理系统毕业设计源码

—————————————————————


一、介绍

本科毕业设计,可以帮助高校更好的开展学生综合素质评价工作。

系统特色功能
  • 预先配置加分规则,根据加分规则提交学分申请、审核学分申请,非常丝滑~
  • 可视化呈现学生的综合素质成长情况(尚处于开发阶段),形成一份”第二课堂成绩单“。
  • 根据学生的各种赛事经历形成一份简历,后续可能考虑开发一个简单的简历制作模块
  • 自动计分并基于”学分法“给出排名。后续可能会增加质性评价模块,实现质性评价和量化评价相结合。
  • 自由配置综合素质评价指标,满足不同专业的学生培养要求。
  • 各项功能均比较完善,包括学生申请与审核、异议提交和审核、自动化加分与排名、评价结果和配置文件导出、学生名单和成绩文件导入、学生账号管理等。


系统设计理念说明
  • 系统的核心设计理念理解起来可能会比较生涩,专门研究过学生综合素质评价这一块的应该会比较清楚。综合素质评价说简单点可以看作是期末综评、评优评奖的时候需要做的事情。
  • 一般来说,学校会根据学生的比赛获奖、社会实践等给学生加分,排名靠前的可以获得奖学金、荣誉称号甚至保研资格。
  • 这些比赛、社会实践加分以往基本都是通过学生复印纸质材料,然后提交excel表格,然后由学委汇总这一套流程实现的。一些学生已经有了信息化的系统,但是迄今为止的本科和现在研究生院校都没怎么用。原因可能是学习这个系统的成本比较高吧;也可能是已有的系统不够灵活,不能满足不同学院、不同专业的个性化要求。
  • 这个系统会将比赛单独出来,因为根据我个人的经历,比赛在高校加分中占比算是比较大的。除了比赛之外的加分项,称之为”其他“,比如班干部加分、团日活动加分等。
  • 由于一些高校会给不同的比赛不同的加分等级,同一个比赛获奖的不同级别加分肯定也是不同的,因此可以通过配置文件来提前配置好。
  • 比如我写个json文件,国家级一等奖加多少分,国家级二等奖加多少分,先配置好,学生提交学分申请的时候只需要选择对应的等级就可以了;同时,老师审核的时候,只需要关注学生选择的等级是否与学生提交的证明材料(电子版)能够对应上就行了,不需要关注这个过程中到底加了多少分(前提是对应等级和加分分值对应且无误)。




详细安装、配置教程
https://www.bilibili.com/video/BV1TD4y1Y7CV?share_source=copy_web


二、核心功能说明

系统一共有三个使用角色,相当于有三套系统,在这里只介绍核心的一些功能及实现。

导入学生名单或者成绩名单
  • 这个功能实现的是教师上传学生名单或者学生成绩的时候,后端能够自动读取文件并将数据处理后存入数据库。这里需要提前确定好学生名单和成绩文件的格式。核心代码如下:
public class ReadStudentXlsFiles {
    private static String basePath = "G:\\Projects\\Materials\\cqes4cs\\files\\students\\";
    public static List<HashMap<String, Object>> readStudentXlsx(String fileFinalName) throws FileNotFoundException {
        // 将文件存入本地,便于读取
        String filePath = basePath + fileFinalName;
        File file = new File(filePath);
        FileInputStream fs = new FileInputStream(file);
        List<HashMap<String, Object>> lst = new ArrayList<>();
        try {
            String fileName = file.getName();
            String[] fileParts = fileName.split("\\.");
            Workbook sheets;
            if (fileParts[fileParts.length - 1].equals("xls")) {
                sheets = new HSSFWorkbook(fs);
            } else {
                sheets = new XSSFWorkbook(fs);
            }
            Sheet sheet = sheets.getSheetAt(0);
            int rowCount = sheet.getLastRowNum();
            int colNum = sheet.getRow(0).getPhysicalNumberOfCells();
            // 遍历行
            for (int i=1; i<=rowCount; i++) {
                HashMap<String, Object> map = new HashMap<>();
                Row row = sheet.getRow(i);
                // 遍历列
                for(int j = 0; j < colNum; j++){
                    if(row.getCell(j) != null){
                        row.getCell(j).setCellType(CellType.STRING);
                        String cellValue = row.getCell(j).getStringCellValue();
                        switch (j) {
                            case 0:
                                map.put("userid", cellValue);
                                break;
                            case 1:
                                map.put("name", cellValue);
                                break;
                            case 2:
                                map.put("major_code", cellValue);
                                break;
                            case 3:
                                map.put("class", cellValue);
                                break;
                            case 4:
                                map.put("year", cellValue);
                                break;
                            default: break;
                        }
                    }
                }
                lst.add(map);
            }
            fs.close();
            return lst;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}



处理加分规则配置
  • 这个功能实现的是教师修改加分规则的时候,后端进行请求处理。与简单的请求处理不同,这个接口会在处理数据之前把数据存储到一个临时表中。这是因为加分规则配置比较复杂(但是配置完成之后用起来非常丝滑),需要确保数据存取过程中不会出。
[Java] 纯文本查看 复制代码
// notation
@RequestMapping("/modifyContestConfig")
@Transactional
@RequiresRoles("manager")
public ResponseEntity modifyContestConfig(@RequestParam Map<String, String> map) {
                List<HashMap<String, Object>> list = new ArrayList<>();
                Map<String, String> nameMap = new HashMap<>();
                Map<String, String> indexMap = new HashMap<>();
                for (Map.Entry<String, String> entry : map.entrySet()) {
                                if (entry.getKey().equals("name")) {
                                                nameMap = JSON.parseObject(entry.getValue(), HashMap.class);
                                }
                                if (entry.getKey().equals("index")) {
                                                indexMap = JSON.parseObject(entry.getValue(), HashMap.class);
                                }
                }

                // 清空配置表
                if (nameMap.size() == 0 || indexMap.size() == 0) {
                                basicInfoMapper.deleteContestConfig();
                                return ResponseEntity.ok().body(ResultVOUtil.successSimple());
                }
                // 组装list
                for (Map.Entry<String, String> entry : map.entrySet()) {
                                if (entry.getKey().equals("name")) break;
                                if (entry.getKey().equals("index")) break;
                                HashMap<String, Object> mapp = new HashMap<>();
                                mapp.put("uuid", entry.getKey());
                                mapp.put("config", entry.getValue());
                                mapp.put("name", nameMap.get(entry.getKey()));
                                mapp.put("indexid", indexMap.get(entry.getKey()));
                                list.add(mapp);
                }
                Boolean flag = false;
                try {
                                // 先存入临时表
                                basicInfoMapper.updateContestConfigTemp(list);
                                // 再删除原始表里面的所有数据
                                basicInfoMapper.deleteAllContestConfig();
                                // 最后将临时表的数据复制到原始表中
                                basicInfoMapper.updateContestConfig();
                                // 最后删除临时的规则表,方便下一次的数据存储
                                basicInfoMapper.deleteContestsConfigTemp();
                } catch (Exception e) {
                                flag = true;
                                throw new RuntimeException("New Error");
                }
                if (flag) return ResponseEntity.ok().body(ResultVOUtil.error(1, "操作失败,请联系管理员"));
                return ResponseEntity.ok().body(ResultVOUtil.successSimple());
}


编辑加分规则:
  • 这是系统最主要的功能,也是比较复杂的部分。一是因为整个实现的思路并不常见,而是有比较多的东西可以/需要配置,所以稍显复杂。以设置叶子节点为例,代码如下。其实可以看到,首先要遍历配置数据(JSON格式),然后再给叶子节点设置新的属性,同时还要判断用户的输入是否合法。设置根节点仅仅是加分规则配置的好多个功能之一而已!
[JavaScript] 纯文本查看 复制代码
setroot(node, data) {
        // 取消设置为叶子节点
        if (data.tag == 'root') {
                let parent = node.parent
                let newChild = { uuid: data.uuid, name: data.name, children: [] }
                let children = parent.data.children || parent.data
                let index = children.findIndex(d => d.uuid === data.uuid)
                children.splice(index, 1)
                if (!parent.data.children) {
                        this.$set(parent.data, 'children', [])
                }
                parent.data.children.push(newChild)
                return
        }
        // 设置叶子节点
        if (data.children.length > 0) return this.$msg.error("存在下一级的时候不能设置为叶子节点")
        let temp = {
                uuid: data.uuid,
                name: data.name,
                tag: 'root',
                score: 0
        }
        this.$prompt('请为叶子节点设置分值,最多保留两位小数', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消'
        }).then(({ value }) => {
                if (isNaN(value) || value.trim().length == 0) return this.$msg.error("请输入正确的数值")
                temp.score = value
                let parent = node.parent
                let children = parent.data.children || parent.data
                let index = children.findIndex(d => d.uuid === data.uuid)
                children.splice(index, 1)
                parent.data.children.push(temp)
        }).catch(()=>{return this.$msg.error("输入加分分值才能设置为叶子节点")})
}


学分申请:
  • 这是系统最核心的功能之一。实现起来也是比较复杂的,因为系统需要根据配置文件去自动形成多级选择菜单,同时要根据用户的选择去读取该菜单下的加分分值到底是多少;用户切换主规则的时候,还需要动态的去加载配置,然后进行处理。这个也只算是学分申请的一小部分而已!
[JavaScript] 纯文本查看 复制代码
// 选择某个比赛后搜索比赛的相关配置
async handleSelect(item) {
        let {data: res} = await this.$http.post('/getContestConfigById', this.$qs.stringify({id: item.id}))
        if (!res) return
        if (res.code != 0) return this.$msg.error(res.message)
        this.curLevelConfig = JSON.parse('[' + res.data.classconfig + ']')
        this.stepForm.ruleid = res.data.uuid
        this.stepForm.name = res.data.name
        this.toNext()
},


三、系统界面一览


登陆页面:

登录页

登录页


教师端:

教师端

教师端


学生端:

学生端

学生端
管理员端:

管理员端

管理员端
学分申请:

学分申请

学分申请



学分评价结果总览:

评价总览

评价总览


处理学分申请异议:

异议处理

异议处理



管理常见专业赛事配置:

赛事管理

赛事管理




加分规则配置:

配置加分规则

配置加分规则



学生综合素质可视化分析:

可视化分析

可视化分析



四、配置运行

项目下载
  • github克隆:前端地址https://github.com/quarkape/cqes4cs,后端地址https://github.com/quarkape/cqes4csbe(包含了SQL、静态资源文件、接口文档)
  • gitee镜像:前端地址https://gitee.com/quarkape/cqes4cs,后端地址https://gitee.com/quarkape/cqes4csbe(包含了SQL、静态资源文件、接口文档)


运行环境
  • MySQL5.7
  • Redis3.0
  • Vue2.6
  • SpringBoot4


运行说明
  • 如果你上手起来比较困难,可以看看视频版本的教程:https://www.bilibili.com/video/BV1KG4y1Z7Pd?share_source=copy_web


前端搭建
  • 安装各种依赖。在项目根目录下面的package.conf中可以找到开发依赖和生产依赖的列表。开发环境依赖使用npm install 依赖名称 -D进行安装,生产环境依赖可以使用npm install 依赖名称 -S进行安装。
  • 运行。安装完成后,运行npm run serve没有问题的话就可以了。地址栏输入http://localhost:8080就可以进入登录页。


后端搭建
  • 安装各类依赖。在项目根目录下面的pom.xml中可以看到依赖列表,使用maven下载下来就可以了。如果你使用的是IDEA的话,你可以导入项目文件,IDEA会自动给你下载pom文件里面的各个依赖。
  • 运行。安装完成后,运行项目,没有报错即可。


数据导入
  • 将后端项目中的SQL文件导入到数据库中即可。我是用的MySQL WorkBench工具导入的。具体操作是:连接本地MySQL,新建一个名为cqes4cs的数据库,软件右上角file-open SQL Script-选择本项目的sql文件,在打开的脚本中前20行都是注释,在注释结束后、正式的SQL语句之前,加上use cqes4cs;这行代码,执行即可。

数据库

数据库



Redis和数据库
  • 我用的phpstudy最新版来安装MySQL,数据库用户名和密码都为root。
  • 我参照网上的教程把下载安装的Redis,Redis端口默认,密码设置的是kkty。注意你安装的时候要么修改redis的配置文件,把密码改为kkty;要么你自己在redis的配置文件中设置别的密码,然后在后端项目中的application.yml中把redis密码那一行的配置给修改了。
  • 记得运行的时候启动Redis。
  • 你也可以使用php study安装和配置redis,不过我没有用过这个功能。


静态资源映射
  • 系统用的静态资源映射做静态资源管理。
  • 静态资源文件夹结构请参照项目文件中Readme.md部分的说明。另外完整的文件夹结构在后端项目的assets里面可以找到。
  • 静态资源文件夹的位置必须要与后端项目中MvcConfig.java文件中的文件地址要一致,不然静态资源文件无法正常访问。

静态资源配置

静态资源配置



系统使用入门
  • 初次使用的时候,需要登录管理员账号:用户名admin,密码admin,然后新增一个教师账号,管理年级建议设置为2021,因为我给的静态资源里面有一些预先提供的数据,大家到时候可以直接用。
  • 右上角头像点击,然后退出管理员账号,使用上一步新建的教师账号登录系统。在学生管理中,上传静态资源文件夹student目录下的文件,系统会自动导入学生账号,学生学号为学生系统的登录用户名和账号。
  • 在教师系统中,在学生评价页面,点击上传学生成绩,选择静态资源文件夹grades目录下面的默认文件,可以导入默认的成绩数据,导入后,可以切换年份为2021-2022年,查看学生成绩。
  • 第2步导入学生账号之后,登录学生账号,已51214108037为例,登陆后可以查看综合素质评价结果,在学分管理页面可以申请学分。


【重要说明】
  • 因为加分规则比较难配置,所以数据库会预先配置好一些加分规则,建议不要删除。如果真正要用的时候再删除也不迟。
  • 必须要先上传学生成绩之后,学生评价页面才会有结果,因为当初设计的时候就默认学业成绩必须是综合素质评价的一部分。其他加分可以没有,但是学生学业成绩必须要有。



五、写在后面

  • 其实整个系统实现起来还是很耗费时间的,功能个人角色也比较完善,作用也比较突出,但是配置起来确实需要一定的时间和精力
  • 整个系统的核心思想囿于篇幅不能详细说明,个人认为初次理解起来比较费劲,毕竟这个系统功能和作用在那里对吧。反正感兴趣的小伙伴可以私戳~
  • 其实本来有线上的体验地址的,但是服务器过期了,没办法让大家即时访问查看效果~

结果公示

结果公示

管理学分

管理学分

免费评分

参与人数 7威望 +1 吾爱币 +20 热心值 +6 收起 理由
CNASA + 1 + 1 热心回复!
YFxbxb888 + 1 + 1 谢谢@Thanks!
Edith123 + 1 热心回复!
Love8899 + 1 + 1 我很赞同!
C9969 + 1 我很赞同!
vbnewer + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
苏紫方璇 + 1 + 15 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 夸克逃逸 发表于 2022-11-26 17:54
本帖最后由 夸克逃逸 于 2022-11-26 17:55 编辑
Hmily 发表于 2022-11-26 16:27
@苏紫方璇 这种帖子明显不符合要求啊

一、本版块仅限分享编程技术和源码相关内容,发布帖子必须带上关键 ...

管理员,这个系统功能还是蛮复杂的,三个用户角色,三套小系统,每套系统可能有大大小小十几个功能。或者象征性的贴出来一两个就可以了吗?如果可以的话我再重新编辑一下。但是我今天重新编辑某个帖子的时候,那个帖子被发出去了,导致我以为更新了帖子,其实是重新发了一个帖子。
 楼主| 夸克逃逸 发表于 2022-11-28 22:07
xhzi2002 发表于 2022-11-28 21:07
这种代码不看视频真的好难懂啊,感觉要学习的真的好多啊

感谢支持~如果要把源码看懂的话,估计比较困难。而且我自己觉得自己代码的质量或者规范都不太好。如果你看了视频,觉得这东西有用的话,可以私戳我,我可以帮忙带你部署和配置一下
头像被屏蔽
lvruina 发表于 2022-11-24 22:49
hemingway111 发表于 2022-11-25 10:44
谢谢分享,很实用!
370 发表于 2022-11-25 12:11

感谢楼主分享
 楼主| 夸克逃逸 发表于 2022-11-26 16:00
感觉这个系统挺好用的呀,我都打算跟系里面老师说说,以后试试用上,咋没人关注
Hmily 发表于 2022-11-26 16:27
@苏紫方璇 这种帖子明显不符合要求啊

一、本版块仅限分享编程技术和源码相关内容,发布帖子必须带上关键代码和具体功能介绍【20220924强制执行】,详见『代码插入规范』。

点评

ok收到,@夸克逃逸 请在帖子中补上部分关键代码  详情 回复 发表于 2022-11-26 17:54
苏紫方璇 发表于 2022-11-26 17:54
Hmily 发表于 2022-11-26 16:27
@苏紫方璇 这种帖子明显不符合要求啊

一、本版块仅限分享编程技术和源码相关内容,发布帖子必须带上关键 ...

ok收到,@夸克逃逸 请在帖子中补上部分关键代码
 楼主| 夸克逃逸 发表于 2022-11-26 17:56
苏紫方璇 发表于 2022-11-26 17:54
ok收到,@夸克逃逸 请在帖子中补上部分关键代码

直接重新编辑就可以了吗?

点评

恩,重新编辑一下吧  详情 回复 发表于 2022-11-26 17:58
苏紫方璇 发表于 2022-11-26 17:58
夸克逃逸 发表于 2022-11-26 17:56
直接重新编辑就可以了吗?

恩,重新编辑一下吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-5 01:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表