设计公司logo公司文化_兰州装修公司有哪些_创意网课_免费咨询图片素材
第4章 系统设计 系统结构设计
目前B/S体系的系统主要的数据访问方式是:通过浏览器页面用户可以进入系统,系统可以自动对用户向服务器发送的请求进行处理,处理请求是在系统后台中进行的,用户在浏览器页面上进行相应操作,就能够看到服务端传递的处理结果。教务系统网站主要分为视图-模型-控制三层架构设计。在视图层中,主要是操作在服务器端向客户端反馈并显示的数据,在模型层中,主要处理相关的业务逻辑、数据整合等,最后的控制层它介于视图和模型之间,主要是调整两层之间的关系,最终落实数据的传递。
系统架构图如下图所示。
图4-1系统架构图
功能模块设计
系统设计的目的是分析系统包括的所有功能结构,为开发人员设计开发和实现系统做好准备工作。经过前期的需求调查、分析和整理之后,确定的总体需求主要包括多个模块,分别是:系统用户设置、学生管理、教师管理、课程管理、学生选课管理、课程评价管理。系统整体角色分为三个部分,一是学生、二是教师、最后是管理员。权限分布也是很明显,学生用户是在除去浏览信息之外还具有查询和管理自己账户信息、选课申请等权限;管理员是最高权限拥有者。
系统功能结构图如下图所示。
图4-2系统功能结构图
数据库设计
概念模型设计
对于一个要开发的系统来说,E-R图可以让别人能更快更轻松的了解此系统的事务及它们之间的关系。根据系统分析阶段所得出的结论确定了在教务系统网站中存在着多个实体分别是用教师、管理员、课程、选课、学生。
系统总体ER图如下图所示。
图4-4系统总体ER图
数据表设计
数据库逻辑结构就是将E-R图在数据库中用具体的字段进行描述。用字段和数据类型描述来使对象特征实体化,最后形成具有一定逻辑关系的数据库表结构。教务系统网站所需要的部分数据结构表如下表所示。
course_information | | | | |
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
course_information_id | int | 11 | 否 | 主键 | 课程信息ID |
course_number | varchar | 64 | 是 | | 课程编号 |
course_type | varchar | 64 | 是 | | 课程类型 |
course_name | varchar | 64 | 是 | | 课程名称 |
course_video | varchar | 255 | 是 | | 课程视频 |
picture | varchar | 255 | 是 | | 图片 |
teacher | int | 11 | 是 | | 教师 |
course_introduction | text | 0 | 是 | | 课程简介 |
hits | int | 11 | 否 | | 点击数 |
recommend | int | 11 | 否 | | 智能推荐 |
create_time | datetime | 0 | 否 | | 创建时间 |
update_time | timestamp | 0 | 否 | | 更新时间 |
| | | | |
course_recommendation | | | | |
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
course_recommendation_id | int | 11 | 否 | 主键 | 课程推荐ID |
course_number | varchar | 64 | 是 | | 课程编号 |
course_type | varchar | 64 | 是 | | 课程类型 |
course_name | varchar | 64 | 是 | | 课程名称 |
picture | varchar | 255 | 是 | | 图片 |
teacher | int | 11 | 是 | | 教师 |
score | int | 11 | 是 | | 评分 |
rank | int | 11 | 是 | | 排位 |
course_introduction | text | 0 | 是 | | 课程简介 |
hits | int | 11 | 否 | | 点击数 |
praise_len | int | 11 | 否 | | 点赞数 |
recommend | int | 11 | 否 | | 智能推荐 |
create_time | datetime | 0 | 否 | | 创建时间 |
update_time | timestamp | 0 | 否 | | 更新时间 |
| | | | |
curriculum_evaluation | | | | |
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
curriculum_evaluation_id | int | 11 | 否 | 主键 | 课程评价ID |
course_number | varchar | 64 | 是 | | 课程编号 |
course_type | varchar | 64 | 是 | | 课程类型 |
course_name | varchar | 64 | 是 | | 课程名称 |
teacher | int | 11 | 是 | | 教师 |
score | varchar | 64 | 是 | | 评分 |
student | int | 11 | 是 | | 学生 |
whether_to_evaluate | varchar | 64 | 是 | | 是否评价 |
evaluation_details | text | 0 | 是 | | 评价详情 |
recommend | int | 11 | 否 | | 智能推荐 |
create_time | datetime | 0 | 否 | | 创建时间 |
update_time | timestamp | 0 | 否 | | 更新时间 |
| | | | |
notice | | | | |
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
notice_id | mediumint | 8 | 否 | 主键 | 公告id |
title | varchar | 125 | 否 | | 标题 |
content | longtext | 0 | 是 | | 正文 |
create_time | timestamp | 0 | 否 | | 创建时间 |
update_time | timestamp | 0 | 否 | | 更新时间 |
| | | | |
slides | | | | |
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
slides_id | int | 10 | 否 | 主键 | 轮播图ID |
title | varchar | 64 | 是 | | 标题 |
content | varchar | 255 | 是 | | 内容 |
url | varchar | 255 | 是 | | 链接 |
img | varchar | 255 | 是 | | 轮播图 |
hits | int | 10 | 否 | | 点击量 |
create_time | timestamp | 0 | 否 | | 创建时间 |
update_time | timestamp | 0 | 否 | | 更新时间 |
| | | | |
student_user | | | | |
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
student_user_id | int | 11 | 否 | 主键 | 学生用户ID |
gender | varchar | 64 | 是 | | 性别 |
examine_state | varchar | 16 | 否 | | 审核状态 |
recommend | int | 11 | 否 | | 智能推荐 |
user_id | int | 11 | 否 | | 用户ID |
create_time | datetime | 0 | 否 | | 创建时间 |
update_time | timestamp | 0 | 否 | | 更新时间 |
| | | | |
teacher_user | | | | |
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
teacher_user_id | int | 11 | 否 | 主键 | 教师用户ID |
gender | varchar | 64 | 是 | | 性别 |
examine_state | varchar | 16 | 否 | | 审核状态 |
recommend | int | 11 | 否 | | 智能推荐 |
user_id | int | 11 | 否 | | 用户ID |
create_time | datetime | 0 | 否 | | 创建时间 |
update_time | timestamp | 0 | 否 | | 更新时间 |
本章节详细介绍了系统各大功能模块的实现过程和实现方法,对每个功能进行实现,设计详细的根本目标是确定应该具体实现所要求的系统,每个模块都对应着相应的界面和显示的配图。主要从主页面的实现、登录模块的实现、教师管理模块的实现、学生管理模块的实现、课程管理模块的实现、学生选课管理模块的实现、课程评价管理模块的实现的实现等方面来描述。
系统呈现出一种简洁大方的后台:界面简约、鳞次栉比,用户能轻车熟路的使用。出于对系统使用群体广泛的顾虑,应有良好性能的后台。
5.2登录模块的实现
系统的登录窗口是用户的入口,用户只有在登录成功后才可以进入访问。通过在登录提交表单,后台处理判断是否为合法用户,进行页面跳转,进入系统中去。
登录合法性判断过程:用户输入账号和密码后,系统首先确定输入输入数据合法性,然后在login.jsp页面发送登录请求,调用src下的mainctrl类的dopost方法来验证。
用户登录模块的IPO如下所示:
输入:用户名和密码。
处理:
1)检测用户输入的账号、密码是否正确及在数据库已对应存在。
2)从数据库中提取记录,并储存在本地的session中(timeout默认=30min)。
3)根据用户名,将其显示在系统首页上。
输出:是否成功的信息。
登录流程图如下所示。
图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;
QueryWrapper wrapper = new QueryWrapper<User>();
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}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.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());
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, "账号或密码不正确");
}
}
public String 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 sql.toString();
}
public List selectBaseList(String select) {
List<Map<String,Object>> mapList = baseMapper.selectBaseList(select);
List<E> list = new ArrayList<>();
for (Map<String,Object> map:mapList) {
list.add(JSON.parseObject(JSON.toJSONString(map),eClass));
}
return list;
}
5.3管理员功能模块
管理员登录教务系统网站,管理员后台功能为:首页、轮播图、公告栏、管理员、论坛列表、论坛分类列表、课程资讯、课程资讯分类、学生用户、教师用户、课程信息、课程评价、课程推荐等功能,如下图所示:
图 5-3 管理员后台功能界面图
学生管理,在学生管理界面图可添加学生信息内容:昵称、用户名、性别等信息,并可在学生管理查询页面进行编辑删除详情等操作,如图5-4
图5-4学生管理界面图
教师管理,在教师管理页面中对教师进行添加:昵称、用户名、性别等内容,还可在教师查询页面对已有的教师信息进行编辑删除详情等操作,如图5-5所示:
图5-5 教师信息管理界面图
课程管理,在课程管理页面图中可以添加课程内容:课程类型、课程编号、课程名称、课程视频、图片、教师、课程简介等内容,还可在课程管理查询页面对已有的课程进行评价,编辑删除详情等操作 如图5-6
图5-6课程管理界面图
课程推荐管理,在课程推荐管理可查询、课程编号、课程名称、教师类型、课程名称、图片、教师、评分、排位等内容,还可在该页面进行编辑删除详细等操作,如图5-7
图5-7 课程推荐管理界面图
课程评价管理,在课程评价管理页面列表可查询评价信息:课程编号、课程名称、教师工号、教师姓名、评分、评价详情、添加时间等内容,还可在该页面进行编辑删除详细等操作,如5-8
图5-8课程评价管理界面图
5.4教师功能模块
教师登录教务系统网站,教师后台功能为:首页、课程信息、课程评价等功能,如下图所示:
图5-9教师功能界面图
课程管理,在课程管理页面图中可以添加课程内容:课程类型、课程编号、课程名称、课程视频、图片、教师、课程简介等内容,还可在课程管理查询页面已有的课程,修改、编辑、删除详情等操作。
图5-10课程管理界面图
5.4学生功能模块
学生登录教务系统网站,教师后台功能为:首页、课程评价等功能,如下图所示:
图5-11学生功能界面图
">