源代码+数据库+LW文档(1万字以上)+开题报告+答辩稿ppt+部署教程+代码讲解+代码时间修改工具
技术实现
- 开发语言:后端:Java 前端:vue
- 框架:springboot
- 数据库:mysql
开发工具
JDK版本:JDK1.8
数据库:mysql 数据库工具:Navicat
开发软件:idea
主要角色及功能介绍
针对现存的问题和需要,通过功能需求的分析,特建立了数字化、信息化的学生选课系统。
本系统主要包含了系统用户管理、学生管理、教师管理、选课管理、成绩管理、系统管理等多个功能模块。下面分别简单阐述一下这几个功能模块需求。
表3-1功能需求表
编号 功能名称 功能描述
- 用户登录 保证用户通过身份验证进入系统进行操作
- 数据备份 超级管理员对系统的数据进行备份
- 批量删除 超级管理员选择系统某个数据表进行数据清空
- 修改个人信息 用户可以根据自己当前的情况修改个人的信息
- 后台登录 仅管理员能够登录后台
- 添加选课记录 学生添加选课记录
- 编辑选课记录 学生修改选课记录信息
- 删除选课记录 学生删除选课记录
- 选课审核 教师给学生添加的选课进行审核
- 成绩审核 教师给学生的成绩进行审核
- 添加选课成绩信息 教师添加选课成绩信息
- 编辑选课成绩信息 教师修改选课成绩信息
- 删除选课成绩信息 教师删除选课成绩信息
本系统使用的角色主要有系统管理员、学生、教师,本系统分为学生端、教师端和管理员端,首先学生用账号密码登录系统用户端,进行课程查询、在线选课、成绩查询,学生可以通过标题和类别进行信息的搜索。
管理员端主要由管理员使用,以管理员的身份在登录页面输入账号和密码,经过数据库身份验证,验证成功后登录系统主页,可以使用系统用户管理、学生管理、教师管理、选课管理、成绩管理、课程信息管理、系统管理等功能操作。同时管理员可以通过关键字搜索可以搜索相应的信息,打印各种详细信息,导出各类信息列表至excel中。
系统的功能结构图如下图所示。
图4-1系统功能结构图
1.用户管理模块
该模块包括普通用户管理和系统用户管理,系统用户主要是普通管理员,对用户信息进行管理,只有普通用户才可在该系统上进行相应的操作。用户对个人信息可进行修改;管理员可对自己的个人信息进行维护,同时可对用户的密码信息进行修改,也可删除系统中的用户
2.登录模块
根据用户输入的 Id 和密码到数据库中查找该用户,如果未能找到该用户则做出 提醒“用户名或密码错误”,如果找到该用户,则要判断用户的类别然后根据用户类别进入相应的页面。
3.课程信息管理模块
(1)课程添加:必须填写课程编号、课程名称、课程负责账号、课程负责人必须是唯一的, 提交后判断某一项是否为填写, 如果是则做出提醒, 填写符合规则后方可添加到数据库。
(2)课程规查询:可以根据课程编号等信息对课程进行查询,查询结果可能有多个。
(3)课程修改:除了课程编号外,其他信息均可以修改。
(4)课程删除:首先找到要删除的课程(一个或多个),然后删除即可。
4.课程成绩管理模块
教师选中某个选课,点击添加成绩,填写成绩数据,点击添加按钮,完成选课成绩操作,每次成绩录入,列表将生成新的成绩信息,供管理员管理。
5.选课模块
用户查询课程规划信息,选择课程规划进入该课程规划的详细页面,点击选课按钮,填写选课表单,添加选课记录。
6.选课管理模块
用户选课课程规划模块主要实现的是对课程规划的选课功能,同时可查看自己的选课记录,并对选课可进行取消选课操作。管理员登录系统后,可查看用户的选课信息,也可搜索选课信息,同时可对选课信息进行确认或删除的操作。
数据库
概念设计是整个数据库设计的关键,在概念设计阶段,由需求分析得到了E-R模型。E-R图是识别功能模型与数据模型间关联关系的,在主题数据库的抽取和规范化的过程中,采用的是简化的E-R图表示方法,从而避免过繁过细的E-R图表示影响规划的直观和可用性。是对现实世界的抽象和概括,是数据库设计人员进行数据可设计的有力工具,能够方便直接地表达应用中的各种语义知识,令一方面它简单、清晰、易于用户理解。
系统总体ER图如下图所示。
图4-10系统总体ER图
系统功能实现及截图
学生选课系统的系统入口就是用户登录功能,在浏览器输系统地址跳转至系统前台首页,系统前台的登录窗口在首页左面,包括用户名、密码、权限、验证码,除了权限框使用下拉列表,其他使用文本框,验证码下方为登录和重置两个按钮,用户点击登录按钮,则进行登录验证。
登录流程图如下所示。
图5-1登录流程图
系统登录界面如下所示。
图5-2系统登录
用户登录的逻辑代码如下:
/**-
登录
-
@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, “账号或密码不正确”);
}
}
5.2学生子系统模块的实现
5.2.1课程信息模块的实现
学生点击某个课程点进入课程信息详细页,点击搜索按钮进入课程信息页,提交搜索信息,成功搜索。
课程信息流程图如下所示。
图5-3课程信息流程图
课程信息界面如图所示。
图5-4课程信息
课程管理界面如图所示。
图5-5课程管理
-
课程添加关键代码为:
@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();
}
5.2.2选课模块的实现
学生点击某个课程规划点进入课程规划详细页,点击选课按钮进入选课页,提交选课信息,成功选课后,教师管理学生的选课信息,审核选课信息。
学生选课流程图如下所示。
图5-6学生选课流程图
课程选课界面如图所示。
图5-7课程选课
选课管理界面如图所示。
图5-8选课管理
选课添加关键代码为:
@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());
}
5.2.3成绩信息模块的实现
根据学生的选课对应所属的教师,该教师可对选择该门课程的学生录入课程成绩,学生查看个人课程成绩。
成绩录入流程图如下所示。
图5-9成绩录入流程图
成绩信息界面如图所示。
图5-10成绩信息
成绩管理界面如图所示。
图5-11成绩管理
成绩添加关键代码为:
@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);
}
5.2.45.3管理员子系统模块的实现
5.3.1用户管理模块的实现
系统用户管理主要是对新用户的添加和旧用户的删除。新用户的添加主要是指添加用户名称并确定其密码;旧用户的删除也是从下拉菜单中找到对应的用户名称将其删除。不论是新用户添加还是旧用户的删除,这个权限只有管理员具有。
系统用户管理界面如下图所示。
图5-12系统用户管理
系统用户管理关键代码为:
@RestController
@RequestMapping(“auth”)
public class AuthController extends BaseController<Auth, AuthService> {
/**
* 服务对象
*/
@Autowired
public AuthController(AuthService service) {
setService(service);
}
}
5.3.2密码修改模块的实现
密码修改是对当前登录用户的密码进行修改,在用户登录后右上方也能进行密码修改。
密码修改流程图如下所示。
图5-13密码修改流程图
5.3.3学院信息模块的实现
学院信息功能主要指对其学院名称、学院简介、学院地址、学院图片等一些基本信息的添加、删除和修改。
学院信息流程图如下所示。
图5-14学院信息流程图
学院信息添加如下图所示:
图5-15学院信息添加
学院信息管理如下图所示:
图5-16学院信息管理
学院信息添加关键代码为:
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";
}
5.3.4课程信息管理模块的实现
管理员发布新的课程信息,系统前台显示课程信息,课程信息添加功能主要指对其课程编号、课程名称、授课老师等一些基本信息的添加、删除和修改。课程信息查询能根据课程信息id、竞赛名称等多种条件对课程信息进行查询。
课程信息管理流程图如下所示。
图5-17课程信息管理流程图
课程信息添加如下图所示:
图5-18课程信息添加
课程信息管理如下图所示:
图5-19课程信息管理
课程信息管理关键代码为:
@SpringBootApplication
@EnableJpaRepositories
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
5.3.5选课管理模块的实现
学生选择课程添加课程选课记录,教师审核课程选课信息,教师所以学生的课程选课记录。
课程选课查管理流程图如下所示。
图5-20选课管理流程图
选课审核如下图所示。
图5-21选课审核
选课审核关键代码为:
@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());
}