共计 11186 个字符,预计需要花费 28 分钟才能阅读完成。
博主介绍:✌退职 Java 研发工程师、专一于程序设计、源码分享、技术交换、专一于 Java 技术畛域和毕业设计✌
项目名称
计算机课程个性化内容举荐零碎的设计与实现 + 文档等
下载地址
https://ym.maptoface.com/archives/57553
视频演示
计算机课程个性化内容举荐零碎的设计与实现
零碎介绍
计算机课程个性化内容举荐零碎的设计与实现
摘 要:在以后疫情局势下,网络课程的需要一直减少。随着技术的成熟,网络课程变得越来越不便和实用。课程举荐零碎彻底辞别传统模式,使得治理不再简单和艰难,缩小雷同和繁琐的操作,使用科学技术解决重复呈现的问题,让治理标准、灵活化。应用 Java 开发的课程举荐零碎可能不便学生进行线上学习,有助于老师在线安排作业并治理批改学生作业,同学们在线上即可实现或缴纳作业,缩小接触,还有不便老师们对立的治理和查看。自定义化的晋升,让老师和同学们都更灵便的工夫安顿。
依据查阅的材料和结合实际需要加上参考大量的我的项目来进行剖析和设计,采纳 B / S 框架联合 JSP 技术来开发。为了保证数据长久化须要应用数据库保留数据,应用 MySQL 数据库来保留,本零碎的设计施行为课程举荐零碎的运行做根底,并且应用基于用户的协同过滤算法对向用户举荐更加感兴趣的课程,做到个性化举荐的目标。
关键词:课程举荐零碎;Java;个性化举荐
3 需要剖析
- 1 性能需要剖析
依据需要进行功能模块剖析,明确所需实现的性能明细点模块,而后将其连成一个闭环,确保每个流程环环相扣,同时排除耦合的状况。接着,将逻辑需要转换为理论内容,并依照指定好的模型进行开发。零碎设计不仅要明确需要和性能,还要在功能模块的前提下设计好页面交互,良好的页面交互能够让数据库设计更加得心应手。零碎次要包含前台和后盾两个局部。后盾人员次要负责保护根底解决的初始化和数据管理等保护工作,而前台用户分为学生和老师两种角色,登录验证胜利后即可对应权限操作系统。
3.1.1 零碎用户确定
本课程举荐零碎的次要性能包含课程学习、作业提交、签到治理和答疑治理等。为了实现这些性能,须要对用户角色进行划分。
依据零碎的设计,次要分为学生用户模块、老师用户模块和管理员模块三个局部。其中,学生用户次要应用课程学习模块和作业实现模块进行学习、作业提交和签到等操作;而老师用户则次要进行作业审批、课程公布、答疑回复等治理操作。最初,管理员角色次要对系统的根底数据进行保护和零碎架构进行治理。
在具体开发过程中,须要依据需要剖析来明确各个功能模块,并设计好相应的页面交互,从而使得零碎的性能环环相扣,每个流程都可能顺畅运行。同时,须要依据所制订的模型进行开发,保障逻辑需要可能顺利转换成理论内容。零碎设计不仅须要思考功能模块,还要思考页面交互以及数据库设计的优化,以进步零碎的应用效率和用户体验。
在具体实现中,前台次要面向学生和老师两种用户,须要进行权限治理;而后盾则由管理员进行保护,负责解决零碎的初始化、数据管理等保护工作。因而,须要在零碎设计中思考到这些不同角色的需要和操作,并为其提供相应的功能模块和权限治理。
所以本零碎的用户角色包含三类用户角色:学生、老师、管理员。
3.1.2 零碎用例词汇表
(1)管理员:系统管理员次要是为了对系统的根底数据作出保护、次要包含用户名、明码、权限等信息。
(2)学生:学生用户是零碎的主体服务对象,对课程学习、作业下载、签到治理、在线测评性能做应用角色。
(3)老师:老师用户是零碎对于课程、章、节、作业批阅、答疑等性能的保护。
(4)课程:本零碎的课程就是为了提供给用户进行学习并且老师进行数据保护的,次要包含编号、名称、图片等信息。
(5)章:一个课程上面能够分为多个章节,章节上面次要包含编号、课程 ID、名称、图片等信息。
(6)节:一个章上面有能够分为多个节,节上面次要包含编号、课程 ID、章 ID、图片、名称、简介、视频信息等内容。
3.1.3 零碎用例模型
零碎包含了三种用户角色,用户的用例图也须要有三个用户角色。
管理员的功能模块次要包含人员治理、课程管理、章节治理、签到治理、测评治理、答疑治理、作业管理等性能,管理员用例图 3 - 1 如下所示。
图 3 -1 管理员用例图
学生的功能模块次要是为学生用户设计的,包含了教学信息的查看、在线自测、学生登录、下载作业、学生签到、批改个人资料、批改明码等性能。学生用户是零碎的前台次要应用人员,他们的操作数据将为零碎的根底数据提供保障,学生用例图如下 3 - 2 所示。
图 3 -2 学生用例图
老师的功能模块次要是针对课程信息的保护和学生作业、测评的评判与打分。包含课程管理、章节治理、签到治理、测评治理、答疑治理、作业管理等性能。老师作为课程的主讲人和学生的辅导者,须要对学生的学习状况和作业实现状况进行跟踪和评估,并对学生提出问题进行答疑解惑,为学生提供更好的学习体验和教学效果,老师用例图如下 3 - 3 所示。
编辑
编辑
编辑
编辑
编辑
技术栈
- 后端:Spring+SpringMVC+Mybatis
- 前端:JSP+CSS+JavaScript+jQuery
应用阐明
- 应用 Navicat 或者其它工具,在 mysql 中创立对应名称的数据库,并导入我的项目的 sql 文件;
- 应用 IDEA/Eclipse/MyEclipse 导入我的项目,Eclipse/MyEclipse 导入时,若为 maven 我的项目请抉择 maven;
若为 maven 我的项目,导入胜利后请执行 maven clean;maven install 命令,而后运行; - 将我的项目中 springmvc-servlet.xml 配置文件中的数据库配置改为本人的配置;
- 运行我的项目,在浏览器中输出 http://localhost:8080/ 登录
运行截图
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
用户管理控制层:
package com.houserss.controller;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.houserss.common.Const;
import com.houserss.common.Const.Role;
import com.houserss.common.ServerResponse;
import com.houserss.pojo.User;
import com.houserss.service.IUserService;
import com.houserss.service.impl.UserServiceImpl;
import com.houserss.util.MD5Util;
import com.houserss.util.TimeUtils;
import com.houserss.vo.DeleteHouseVo;
import com.houserss.vo.PageInfoVo;
/**
- Created by admin
*/
@Controller
@RequestMapping(“/user/”)
public class UserController {
@Autowired
private IUserService iUserService;
/**
* 用户登录
* @param username
* @param password
* @param session
* @return
*/
@RequestMapping(value = "login.do",method = RequestMethod.POST)
@ResponseBody
public ServerResponse<User> login(User user,String uvcode, HttpSession session){String code = (String)session.getAttribute("validationCode");
if(StringUtils.isNotBlank(code)) {if(!code.equalsIgnoreCase(uvcode)) {return ServerResponse.createByErrorMessage("验证码不正确");
}
}
ServerResponse<User> response = iUserService.login(user.getUsername(),user.getPassword());
if(response.isSuccess()){session.setAttribute(Const.CURRENT_USER,response.getData());
}
return response;
}
}
管理员管理控制层:
package com.sxl.controller.admin;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.sxl.controller.MyController;
@Controller(“adminController”)
@RequestMapping(value = “/admin”)
public class AdminController extends MyController {
@RequestMapping(value = "/index")
public String frame(Model model, HttpServletRequest request)throws Exception {return "/admin/index";}
@RequestMapping(value = "/main")
public String main(Model model, HttpServletRequest request)throws Exception {return "/admin/main";}
@RequestMapping(value = "/tj1")
public String tj1(Model model, HttpServletRequest request)throws Exception {String sql="select DATE_FORMAT(insertDate,'%Y-%m-%d') dates,sum(allPrice) price from t_order order by DATE_FORMAT(insertDate,'%Y-%m-%d') desc";
List<Map> list = db.queryForList(sql);
model.addAttribute("list", list);
System.out.println(list);
return "/admin/tj/tj1";
}
@RequestMapping(value = "/password")
public String password(Model model, HttpServletRequest request)throws Exception {return "/admin/password";}
@RequestMapping(value = "/changePassword")
public ResponseEntity<String> loginSave(Model model,HttpServletRequest request,String oldPassword,String newPassword) throws Exception {Map admin = getAdmin(request);
if(oldPassword.equals(admin.get("password").toString())){
String sql="update t_admin set password=? where id=?";
db.update(sql, new Object[]{newPassword,admin.get("id")});
return renderData(true,"1",null);
}else{return renderData(false,"1",null);
}
}
}
批改明码业务逻辑:
package com.sxl.controller.admin;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.sxl.controller.MyController;
@Controller(“userController”)
@RequestMapping(value = “/user”)
public class UserController extends MyController {
@RequestMapping(value = "/index")
public String frame(Model model, HttpServletRequest request)throws Exception {return "/user/index";}
@RequestMapping(value = "/main")
public String main(Model model, HttpServletRequest request)throws Exception {return "/user/main";}
@RequestMapping(value = "/password")
public String password(Model model, HttpServletRequest request)throws Exception {return "/user/password";}
@RequestMapping(value = "/changePassword")
public ResponseEntity<String> loginSave(Model model,HttpServletRequest request,String oldPassword,String newPassword) throws Exception {Map user = getUser(request);
if(oldPassword.equals(user.get("password").toString())){
String sql="update t_user set password=? where id=?";
db.update(sql, new Object[]{newPassword,user.get("id")});
return renderData(true,"1",null);
}else{return renderData(false,"1",null);
}
}
@RequestMapping(value = "/mine")
public String mine(Model model, HttpServletRequest request)throws Exception {
Map user =getUser(request);Map map = db.queryForMap(“select * from t_user where id=?”,new Object[]{user.get(“id”)});model.addAttribute(“map”, map); return “/user/mine”;
}
@RequestMapping(value = "/mineSave")
public ResponseEntity<String> mineSave(Model model,HttpServletRequest request,Long id
,String username,String password,String name,String gh,String mobile) throws Exception{
int result = 0;
String sql="update t_user set name=?,gh=?,mobile=? where id=?";
result = db.update(sql, new Object[]{name,gh,mobile,id});
if(result==1){return renderData(true,"操作胜利",null);
}else{return renderData(false,"操作失败",null);
}
}
}
通用治理模块:
package com.sxl.controller;
import java.nio.charset.Charset;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import com.sxl.util.JacksonJsonUtil;
import com.sxl.util.StringUtil;
import com.sxl.util.SystemProperties;
public class BaseController {
public static final Long EXPIRES_IN = 1000 * 3600 * 24 * 1L;// 1 天
@Autowired
private SystemProperties systemProperties;
/**
* 取得配置文件内容
*/
public String getConfig(String key) {return systemProperties.getProperties(key);
}
/**
* 返回服务器地址 like http://192.168.1.1:8441/UUBean/
*/
public String getHostUrl(HttpServletRequest request) {String hostName = request.getServerName();
Integer hostPort = request.getServerPort();
String path = request.getContextPath();
if (hostPort == 80) {return "http://" + hostName + path + "/";} else {return "http://" + hostName + ":" + hostPort + path + "/";}
}
/***
* 获取以后的 website 门路 String
*/
public static String getWebSite(HttpServletRequest request) {String returnUrl = request.getScheme() + "://"
+ request.getServerName();
if (request.getServerPort() != 80) {returnUrl += ":" + request.getServerPort();
}
returnUrl += request.getContextPath();
return returnUrl;
}
/**
* 初始化 HTTP 头.
*
* @return HttpHeaders
*/
public HttpHeaders initHttpHeaders() {HttpHeaders headers = new HttpHeaders();
MediaType mediaType = new MediaType("text", "html",
Charset.forName("utf-8"));
headers.setContentType(mediaType);
return headers;
}
/**
* 返回 信息数据
*
* @param status
* @param msg
* @return
*/
public ResponseEntity<String> renderMsg(Boolean status, String msg) {if (StringUtils.isEmpty(msg)) {msg = "";}
String str = "{\"status\":\"" + status + "\",\"msg\":\""+ msg +"\"}";
ResponseEntity<String> responseEntity = new ResponseEntity<String>(str,
initHttpHeaders(), HttpStatus.OK);
return responseEntity;
}
/**
* 返回 obj 数据
*
* @param status
* @param msg
* @param obj
* @return
*/
public ResponseEntity<String> renderData(Boolean status, String msg,
Object obj) {if (StringUtils.isEmpty(msg)) {msg = "";}
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"status\":\"" + status + "\",\"msg\":\""+ msg +"\",");
sb.append("\"data\":" + JacksonJsonUtil.toJson(obj) + "");
sb.append("}");
ResponseEntity<String> responseEntity = new ResponseEntity<String>(sb.toString(), initHttpHeaders(), HttpStatus.OK);
return responseEntity;
}
/***
* 获取 IP(如果是多级代理,则失去的是一串 IP 值)*/
public static String getIpAddr(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();
}
if (ip != null && ip.length() > 0) {String[] ips = ip.split(",");
for (int i = 0; i < ips.length; i++) {if (!"unknown".equalsIgnoreCase(ips[i])) {ip = ips[i];
break;
}
}
}
return ip;
}
/**
* 国际化取得语言内容
*
* @param key
* 语言 key
* @param args
* @param argsSplit
* @param defaultMessage
* @param locale
* @return
*/
public static String getLanguage(String key, String args, String argsSplit,
String defaultMessage, String locale) {
String language = "zh";
String contry = "cn";
String returnValue = defaultMessage;
if (!StringUtil.isEmpty(locale)) {
try {String[] localeArray = locale.split("_");
language = localeArray[0];
contry = localeArray[1];
} catch (Exception e) {}}
try {
ResourceBundle resource = ResourceBundle.getBundle("lang.resource",
new Locale(language, contry));
returnValue = resource.getString(key);
if (!StringUtil.isEmpty(args)) {String[] argsArray = args.split(argsSplit);
for (int i = 0; i < argsArray.length; i++) {returnValue = returnValue.replace("{" + i + "}",
argsArray[i]);
}
}
} catch (Exception e) { }
return returnValue;
}
}