目录
1.系统的受众说明
2 总体设计
2.1 需求概述
2.2 软件结构
3 模块设计
3.1 模块基本信息
3.2 功能概述
3.3 算法
3.4 模块处理逻辑
4 数据库设计
4.1 E-R图
4.2 表设计
4.2.1 管理员信息表
4.2.2 课程基本信息表
4.2.3 课程扩展信息表
4.2.4 专业信息表
4.2.5 页面主题表
4.2.6 学生信息表
4.2.7 学生-课程关联表
4.2.8 教师信息表
4.2.9 教师-课程关联表
4.2.10 排课时间表
4.2.11 文件信息表
4.2.12 周课程表信息表
5 接口设计
5.1 外部接口
5.1.1 登录界面
5.1.5 课程表
5.1.6 成绩查询界面
5.1.7 成绩统计界面
5.1.8 课程管理
5.1.9 成绩管理
5.1.10 用户管理
5.2 内部接口
5.2.1 登录接口
5.2.2 课程管理接口
5.2.3 成绩管理接口
5.2.4 用户管理接口
5.2.5 文件管理接口
6 性能
6.1 精度
6.2 时间特性
6.3 灵活性
7 测试
1.系统的受众说明
1 在校学习的学生,可用于日常学习使用或是毕业设计使用
2 毕业一到两年的开发人员,用于锻炼自己的独立功能模块设计能力,增强代码编写能力。
3 亦可以部署为商化项目使用。
4 需要完整资料及源码,请在文末获取联系方式领取。
2 总体设计
2.1 需求概述
(1) 课程信息的管理,包括课程信息的条件查询、录入、修改和删除。
(2) 课程表的管理,包括排课、录入课程表、修改课程表。
(3) 用户信息管理。包括对系统管理员、教师和学生的信息进行维护管理,可以新增、修改、删除和条件分页查询用户信息。
(4) 成绩信息管理,可以查询对应成绩信息,教师和管理员可以录入和修改成绩。
(5) 用户登录,读者可以通过登录页面注册新账号,管理员、教师、学生可以使用用户名和密码登录系统。
2.2 软件结构
学生成绩管理系统的软件结构图
描述:学生成绩管理系统向下划分为课程管理、课程表管理、成绩管理、用户管理四个模块。课程管理主要负责对课程的信息进行管理,以及管理员和教师进行课程的查询;课程表管理主要关联教师排课、任课信息、学生获取上课信息;成绩管理中,管理员和教师可以录入或修改对应权限的成绩信息,学生可以查询对应的成绩信息;用户信息管理可以针对管理员、教师和学生的信息进行管理。
3 模块设计
3.1 模块基本信息
名称 | 编号 | 设计者 | 所在文件 |
课程管理 | 001 | 无名 | com/rabbiter/sms/controller/Course/CourseController.java |
课程表管理 | 002 | 无名 | com/rabbiter/sms/controller/Timetable/TimetableController.java |
成绩管理 | 003 | 无名 | com/rabbiter/sms/controller/Score/ScoreController.java |
用户管理 | 004 | 无名 | com/rabbiter/sms/controller/User/*.java |
3.2 功能概述
名称 | 编号 | 说明 |
课程管理 | 001 | 对课程的信息进行管理,以及管理员和教师进行课程的查询。 |
课程表管理 | 002 | 关联教师排课、任课信息、学生获取上课信息,管理员可以针对课程表信息进行编辑,实现排课功能。 |
成绩管理 | 003 | 管理员和教师可以录入或修改对应权限的成绩信息,学生可以查询对应的成绩信息 |
用户管理 | 004 | 针对管理员、教师和学生的信息进行管理 |
3.3 算法
无
3.4 模块处理逻辑
用户登录系统程序流程图
图为用户登录系统的程序流程图,选择登录,已经存在系统的管理员、教师或者学生可以直接进行登录,登录之后进入主页面。
查询课程信息程序流程图
图为查询课程信息的程序流程图,该模块首先进入等待用户输入搜索信息状态。如果用户已经输入则获取用户输入并根据输入的搜索关键字在课程信息表中匹配课程信息,最后退出。如果用户未输入则模块继续处于等待用户输入搜索信息状态。
查询用户信息程序流程图
图为查询用户信息的程序流程图,该模块首先进入等待用户输入搜索信息状态。如果用户已经输入则获取用户输入并根据输入的搜索关键字在课程信息表中匹配学生用户、教师用户、管理员用户的信息,最后退出。如果用户未输入则模块继续处于等待用户输入搜索信息状态。
录入课程表(排课)程序流程图
图为录入课程表程序流程图,管理员具有课程表编辑和排课的权限,登录系统后,选择对应的学年和学期条件,系统回显课程表信息,管理员可以选中对应的课程去排课,未选中课程则对应课程表位置留空,确认保存,则可以生成最终课程表。
4 数据库设计
4.1 E-R图
4.2 表设计
4.2.1 管理员信息表
数据名称 | 数据类型 | 数据描述 |
Id | Int | 管理员id |
Username | Varchar | 用户名 |
Password | Varchar | 密码 |
Real_name | Varchar | 姓名 |
Level | Tinyint | 级别 |
School | Varchar | 所属学校 |
| Varchar | 邮箱 |
Phone | Varchar | 联系电话 |
Sex | Tinyint | 性别 |
Create_time | timestamp | 创建时间 |
4.2.2 课程基本信息表
数据名称 | 数据类型 | 数据描述 |
Id | Varchar | 课程基本信息id |
Name | Varchar | 课程名称 |
Credits | Decimal | 学分 |
Score | Int | 分数 |
Number | Int | 课时 |
Year | Int | 学年 |
Term | Tinyint | 学期 |
Type | Tinyint | 类型。1必修课 2选修课 |
Profession | Varchar | 专业 |
Create_time | Timestamp | 创建时间 |
4.2.3 课程扩展信息表
数据名称 | 数据类型 | 数据描述 |
Id | Varchar | 课程扩展信息id |
Course_id | Varchar | 课程基本信息id |
Start | Int | 开始时间 |
End | Int | 结束时间 |
Room | Varchar | 教室信息 |
Profession | Varchar | 专业 |
4.2.4 专业信息表
数据名称 | 数据类型 | 数据描述 |
Id | Varchar | 专业信息id |
Name | Varchar | 专业名称 |
4.2.5 页面主题表
数据名称 | 数据类型 | 数据描述 |
Id | Varchar | 页面主题信息id |
State | Tinyint | 主题标记。0正常模式 1静默模式 |
4.2.6 学生信息表
数据名称 | 数据类型 | 数据描述 |
Id | Varchar | 学生信息id |
Username | Varchar | 用户名 |
Password | Varchar | 密码 |
Real_name | Varchar | 姓名 |
Level | Tinyint | 级别 |
School | Varchar | 学校 |
Admission_time | Varchar | 入校时间 |
| Varchar | 电子邮箱 |
Profession | Varchar | 专业 |
Grade | Int | 年级 |
4.2.7 学生-课程关联表
数据名称 | 数据类型 | 数据描述 |
Id | int | 关联id |
Student_id | varchar | 学生id |
Course_id | Varchar | 课程id |
Name | Varchar | 课程名称 |
Score | Varchar | 分数 |
Point | Decimal | 绩点 |
Credits | Decimal | 学分 |
Term | Tinyint | 学期 |
Year | Int | 学年 |
4.2.8 教师信息表
数据名称 | 数据类型 | 数据描述 |
Id | Varchar | 教师信息id |
Username | Varchar | 用户名 |
Password | Varchar | 密码 |
Real_name | Varchar | 姓名 |
Level | Tinyint | 级别 |
School | Varchar | 学校名称 |
| Varchar | 邮箱 |
Phone | Varchar | 联系电话 |
Sex | Tinyint | 性别 |
Create_time | Timestamp | 创建时间 |
4.2.9 教师-课程关联表
数据名称 | 数据类型 | 数据描述 |
Id | int | 关联id |
Teacher_id | varchar | 教师id |
Username | Varchar | 教师用户名 |
Name | Varchar | 课程名称 |
Profession | Varchar | 专业 |
Grade | Varchar | 年级 |
Term | Tinyint | 学期 |
Course_id | Varchar | 课程id |
4.2.10 排课时间表
数据名称 | 数据类型 | 数据描述 |
Id | Varchar | 排课时间id |
Week_id | Int | 周课程表id |
Profession | Varchar | 专业 |
Grade | Varchar | 年级 |
Year | Int | 学年 |
Term | Tinyint | 学期 |
4.2.11 文件信息表
数据名称 | 数据类型 | 数据描述 |
Id | Int | 文件信息id |
User_id | Varchar | 上传用户id |
Level | Int | 级别 |
url | Varchar | 文件地址 |
4.2.12 周课程表信息表
数据名称 | 数据类型 | 数据描述 |
Id | Varchar | 周课程表信息id |
Monday | Varchar | 周一课程 |
Tuesday | Varchar | 周二课程 |
Wednesday | Varchar | 周三课程 |
Thurday | Varchar | 周四课程 |
Friday | Varchar | 周五课程 |
Saturday | Varchar | 周六课程 |
Sunday | Varchar | 周日课程 |
5 接口设计
5.1 外部接口
5.1.1 登录界面
5.1.2管理员首页
5.1.3 教师首页
5.1.4 学生首页
5.1.5 课程表
5.1.6 成绩查询界面
5.1.7 成绩统计界面
5.1.8 课程管理
5.1.9 成绩管理
5.1.10 用户管理
5.2 内部接口
5.2.1 登录接口
@GetMapping("/login")
@PassToken
public User getStudentInfo(@RequestParam Map<String, Object> condition) {
Map<String, Object> map = new HashMap<>();
map.put("username", condition.get("username").toString());
map.put("password", condition.get("password").toString());
map.put("level", condition.get("level"));
User user = userService.getStudentInfo(map);
String token = userService.getToken(user, 24 * 60 * 60 * 1000);
String refreshToken = userService.getToken(user, 24 * 60 * 60 * 1000); // 有效期一天
user.setToken(token);
user.setRefreshToken(refreshToken);
return user;
}
5.2.2 课程管理接口
@PostMapping
public void addCourse(@RequestBody Course course) {
courseService.addCourse(course);
}
@DeleteMapping("/{ids}")
public void delete(@PathVariable("ids") Integer[] ids) {
List<Integer> idsList = Arrays.asList(ids);
courseService.delete(idsList);
}
@PutMapping
public void update(@RequestBody Course course) {
courseService.update(course);
}
@GetMapping("/getCourseList")
private PagingResult<Course> getCourseList(@RequestParam Map<String, Object> condition,
@RequestParam(required = false, name = "$limit", defaultValue = "10") Integer limit,
@RequestParam(required = false, name = "$offset", defaultValue = "0") Integer offset) {
RowBounds rowBounds = new RowBounds(offset, limit);
return courseService.getCourseList(rowBounds, condition);
}
@GetMapping("/getCourseByMap")
private List<Course> getCourseByMap(@RequestParam Map<String, Object> condition) {
return courseService.getCourseByMap(condition);
}
5.2.3 成绩管理接口
@GetMapping("/getCourseList")
public PagingResult<Course> getCourseList(@RequestParam Map<String, Object> condition,
@RequestParam(required = false, name = "$limit", defaultValue = "10") Integer limit,
@RequestParam(required = false, name = "$offset", defaultValue = "0") Integer offset) {
RowBounds rowBounds = new RowBounds(offset, limit);
return scoreService.getCourseList(rowBounds, condition);
}
@PostMapping
private void addEntry(@RequestBody JSONArray UserScore) {
List<Score> list = JSONObject.parseArray(UserScore.toJSONString(), Score.class);
scoreService.addEntry(list);
}
@GetMapping("/export")
public List<Course> getExportList(@RequestParam Map<String, Object> condition) {
return scoreService.getExportList(condition);
}
@GetMapping("/getUserNum")
public List<Map<String, Object>> getUserNum(@RequestParam Map<String, Object> condition) {
return scoreService.getUserNum(condition);
}
@GetMapping("/getUserTotal")
public Map<String, Object> getUserTotal(@RequestParam Map<String, Object> condition) {
return scoreService.getUserTotal(condition);
}
5.2.4 用户管理接口
@GetMapping("/edit/password")
public boolean update(@RequestParam Map<String, Object> condition) {
Map<String, Object> map = new HashMap<>();
map.put("username", condition.get("username").toString());
map.put("password", condition.get("password").toString());
map.put("passwordAgain", condition.get("passwordAgain").toString());
;
map.put("level", condition.get("level").toString());
return userService.update(map);
}
@GetMapping("/getTree")
public List<Object> getTree() {
return userService.getTree();
}
@PassToken
@GetMapping("/getSilent")
public boolean getSilent() {
return userService.getSilent();
}
@PutMapping("/setSilent/{state}")
public boolean setSilent(@PathVariable("state") Integer state) {
return userService.setSilent(state);
}
5.2.5 文件管理接口
@PostMapping("/headImg")
@ResponseBody
public String upload(MultipartFile file, HttpServletRequest request) throws IOException {
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
// 储存位置
String staticDir = ResourceUtil.getPath();
// 图片名
String ImgName = file.getOriginalFilename();
String uid = UUID.randomUUID().toString();
assert ImgName != null;
// 获取后缀名
String str = ImgName.substring(ImgName.lastIndexOf("."));
// 重定义文件名
String newName = uid + str;
// 图片存储地址
Path path = Paths.get(staticDir + newName);
// 写入文件
Files.write(path, bytes);
String imgUrl = "/files/" + newName;
String userId = request.getParameter("id");
int level = parseInt(request.getParameter("level"));
Upload upload = new Upload();
upload.setUserId(userId);
upload.setLevel(level);
upload.setUrl(imgUrl);
uploadService.upload(upload);
// url去除"sms"
return imgUrl;
} catch (IOException e) {
e.printStackTrace();
}
}
return "";
}
@GetMapping("/getHeadImg")
@UserLoginToken
public String getAdminList(@RequestParam Map<String, Object> condition, HttpServletRequest httpServletRequest) {
return uploadService.getHeader(condition);
}
6 性能
6.1 精度
要按照严格的数据格式输入,不能输入非法字符,否则系统不给予响应进行处理,查询时要保证准确率为100%,所有包含查询关键字的书籍都应能查到,不能有遗漏。
6.2 时间特性
(1)响应时间:用户任意操作后5秒内系统给予反馈信息。
(2)更新处理时间:由系统运行状态来决定。
(3)数据的转换和传送时间:能够在20秒内完成。
6.3 灵活性
当需求发生某些变化时,该软件的基本操作、数据结构、运行环境等等基本不会发生变化,只是对系统的数据库的文件和记录进行处理,就可以满足需求。
7 测试
功能点 | 测试用例 | 输出结果 |
管理员用户登录 | 选择管理员角色,输入管理员的用户名和密码,点击登录 | 跳转到学生成绩管理系统首页,并展示管理员相关功能菜单 |
教师用户登录 | 选择教师角色,输入管理员的用户名和密码,点击登录 | 跳转到学生成绩管理系统首页,并展示教师相关功能菜单 |
学生用户登录 | 选择管理员角色,输入管理员的用户名和密码,点击登录 | 跳转到学生成绩管理系统首页,并展示读者相关功能菜单 |
课程信息新增 | 点击新增,输入课程信息,点击确认新增 | 未填写完整表单,提示对应异常,填写完整表单,提示新增成功 |
课程信息查询 | 输入对应查询条件,点击查询 | 课程信息列表 |
课程信息修改 | 选中课程信息,弹出课程信息修改框,修改对应信息,点击修改 | 未填写完整表单,提示对应异常,填写完整表单,提示修改成功 |
课程信息删除 | 选中删除的数据 | 提示删除成功 |
录入课程表 | 选中对应学年对应学期的课程表,录入对应课程 | 出现下拉框录入课程信息 |
成绩信息查询 | 输入对应查询条件,点击查询 | 成绩信息列表 |
录入成绩 | 选中对应成绩信息 | 录入成绩 |
修改成绩 | 选中对应成绩信息 | 修改成绩 |
修改课程表 | 选中对应学年学期的课程表,修改已有的课程表信息 | 出现下拉框修改课程信息 |
用户新增 | 点击新增,输入用户信息,点击确认新增 | 未填写完整表单,提示对应异常,填写完整表单,提示新增成功 |
用户信息查询 | 输入对应查询条件,点击查询 | 用户信息列表 |
用户修改 | 选中用户信息,弹出用户信息修改框,修改对应信息,点击修改 | 未填写完整表单,提示对应异常,填写完整表单,提示修改成功 |
用户删除 | 选中删除的数据 | 提示删除成功 |