博主介绍:✌退职 Java 研发工程师、专一于程序设计、源码分享、技术交换、专一于 Java 技术畛域和毕业设计✌
[项目名称
基于 Java 微信小程序的学习交流平台
视频演示
基于 Java 微信小程序的学习交流平台_哔哩哔哩_bilibili](https://ym.maptoface.com/archives/59095)
零碎介绍
随着网络技术的一直倒退,大学生学习交流平台曾经从繁多的文字交换倒退到了包含图文、音视频、直播等多种形式的交换形式。同时,越来越多的论坛开始退出社交网络和挪动端利用,进步用户体验和便捷性。大学生学习交流平台将越来越趋向于社交化,减少更多社交元素,如个人资料、关注、粉丝、私信等性能,使得用户之间的分割更加严密,并且随着人工智能和大数据技术的一直倒退,大学生学习交流平台将会更加重视数据分析和用户画像,为用户提供更智能化的举荐和服务。
本文应用 SpringBoot 框架作为主体框架,MySQL 数据库进行数据贮存,Vue 框架进行前端的渲染,最初应用了微信小程序开发技术进行用户端的开发。零碎应用协同过滤算法进行帖子的举荐。协同过滤算法是一种罕用的举荐算法,它能够依据用户的历史行为和偏好,向用户举荐与之类似的内容。在大学生学习交流平台中,协同过滤算法能够利用于举荐用户感兴趣的帖子和话题。
本文构建的基于协同过滤算法的大学生学习交流平台能够帮忙用户更疾速地找到趣味的帖子和话题,进步用户体验和论坛活跃度,同时也为管理员提供了更好的数据分析和决策反对。
关键词:大学生交换;SpringBoot;Vue;MySQL;协同过滤
3.2 需要剖析
3.2.1 业务流程
在应用大学生学习交流平台时,首先,用户须要进行注册和受权登录,以便在平台上创立个人账户。登录后,用户将进入首页,这里展现了各种热门话题、最新动静和举荐资源。同时,平台提供广场性能,让用户能够在这里浏览不同主题的帖子,发现感兴趣的学术讨论和资源共享。
此外,用户能够依据趣味和需要关注其余用户,关注列表中将展现这些用户的最新动静和帖子。用户还能够查看最新列表,理解平台上的最新话题和热门探讨。在个人信息页面,用户能够欠缺个人资料,治理本人的帖子、关注和粉丝。
平台激励用户踊跃发帖、分享资源和参加探讨。在创作广场上,用户能够公布本人的观点、教训和资源,以便其余用户学习和交换。发帖达人性能将展现平台上的优良创作者,激励用户积极参与创作和互动。大学生学习交流平台的业务流程图如图 3.1 所示:
图 3.1 大学生学习交流平台零碎业务流程图
3.2.2 性能构造剖析
管理员用户次要是在 PC 端进行零碎的所有数据的管控,次要性能如下:
1. 登录。管理员应用零碎中保留的账号登录 WEB 零碎后盾对系统所有数据进行对立治理。
2. 首页。首页能够查看用户综述、帖子总数、用户新增数量。
3. 动静治理。该模块上面包含了对于帖子的条件查问、批改、删除、批量删除操作,管理员还能够对系统中的评论进行查看并进行删除操作
4. 利用治理。该模块下包含了对于轮播图的减少、删除、批改、查问操作。
5. 用户治理。该模块上面包含了对于零碎用户的分页查看、批改以及禁用的操作。
6. 内容治理。该模块下包含了分类的增删改查、圈子的批改删除、音讯的查看以及删除操作。
7. 系统管理。系统管理模块下包含了管理员增删改查、角色用户的增删改查、菜单的增删改查以及零碎的日志查看操作。
管理员用例图如图 3.2 所示:
图 3.2 管理员用例图
学生用户次要是在小程序端进行操作,次要性能如下:
1. 我的治理模块。零碎进入小程序后首先须要进行微信登录,登陆之后即可查看集体的各种数据,包含粉丝、关注人、公布的帖子、积分以及点赞数据。
2. 首页。小程序首页首先是展示最新的零碎帖子,用户能够针对各个帖子进行点赞、评论、关注发帖人的操作,并且用户也能够公布本人的帖子供所有用户进行查看。
3. 广场。广场模块中展现的是各个类型的帖子的分类信息,并且用户也能够针对所有帖子进行评论、点赞、关注等操作,针对发帖数量多的用户也会展现在发帖达人当中提供给用户进行查看。
学生用户用例图如图 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;
}
}