作者主页:编程指南针
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师
主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互助
收藏点赞不迷路 关注作者有好处
文末获取源码
项目编号:
一,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
二,项目简介
随着社交媒体的普及和校园生活的丰富多彩,校园交友平台成为了大学生活中的重要组成部分。该项目旨在为校园内的学生提供一个安全、便捷、互动性强的交友平台,帮助他们结识新朋友、扩大社交圈子,并且通过共同兴趣爱好的匹配,促进更深层次的交流和互动。
项目技术栈:
前端:Vue.js、Element UI、HTML5、CSS3、JavaScript等
后端:SpringBoot、MySQL、MyBatis、Spring Security等
前台主要功能:
- 首页:展示轮播图、动态排行榜、最新动态以及校园资讯等内容,吸引用户的注意。
- 全局动态搜索:允许用户根据描述、话题或标题进行搜索,方便用户快速找到感兴趣的内容。
- 聊天室:提供在线聊天的功能,让用户可以与其他用户进行实时交流和互动。
- 积分商城:通过点赞等行为获取积分,并提供积分换购商品的功能,增加用户积极参与平台活动的动力。
- 积分消费订单:展示用户的积分消费记录和订单信息,方便用户了解自己的消费情况。
- 消息通知:向用户发送系统通知和个人消息,及时告知用户动态和重要信息。
- 个人中心:用户可以管理自己的动态、收货地址、收藏内容,查看个人资料并修改密码等。
后台主要功能:
- 系统管理:包括角色管理、用户管理、权限管理、文件管理和日志管理等,确保系统的安全和可控。
- 首页管理:对首页内容进行管理,包括轮播图、动态排行榜、最新动态和校园资讯等的编辑和发布。
- 校园资讯管理:允许管理员发布和管理校园资讯,包括标题、内容和发布时间等。
- 话题管理:管理平台上的话题,包括创建、编辑、删除话题,并可对话题进行分类和排序。
- 动态管理:对用户发布的动态进行管理,包括审核、删除和置顶等操作。
- 收藏管理:管理用户的收藏内容,包括浏览和删除等功能。
- 评论管理:对用户的评论进行审核和删除,确保平台上的评论秩序。
- 通知管理:向用户发送系统通知和个人消息,进行编辑、发送和删除等操作。
- 积分商城管理:管理商品信息,包括商品的添加、编辑、下架和库存管理等操作。
- 数据统计:通过图形化展示拆线图、柱状图和饼图等方式,对用户活跃度和交互数据进行分析和统计。
- 个人资料和修改密码:管理员可以查看和修改用户的个人资料,并重置密码等。
三,系统展示
3.1 登录与注册
3.2 数据展示
3.3 公告动态点赞管理
3.4 收藏新闻评论管理
3.5 积分商城管理
3.6 系统管理
3.7 用户前端首页
3.8 聊天窗口
3.9 积分商城和积分订单
3.10 查看动态
四,核心代码展示
4.1 聊天核心代码
/**
* @author websocket服务
*/
@ServerEndpoint(value = "/imserver/{uid}")
@Component
public class WebSocketServer {
private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
/**
* 记录当前在线连接数
*/
public static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();
@Resource
IUserService userService;
@Resource
IImService imService;
private static IUserService staticUserService;
private static IImService staticImService;
// 程序初始化的时候触发这个方法 赋值
@PostConstruct
public void setStaticUser() {
staticUserService = userService;
staticImService = imService;
}
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("uid") String uid) {
sessionMap.put(uid, session);
log.info("有新用户加入,uid={}, 当前在线人数为:{}", uid, sessionMap.size());
Dict dict = Dict.create().set("nums", sessionMap.size());
sendAllMessage(JSONUtil.toJsonStr(dict)); // 后台发送消息给所有的客户端
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session, @PathParam("uid") String uid) {
sessionMap.remove(uid);
log.info("有一连接关闭,uid={}的用户session, 当前在线人数为:{}", uid, sessionMap.size());
Dict dict = Dict.create().set("nums", sessionMap.size());
sendAllMessage(JSONUtil.toJsonStr(dict)); // 后台发送消息给所有的客户端
}
/**
* 收到客户端消息后调用的方法
* 后台收到客户端发送过来的消息
* onMessage 是一个消息的中转站
* 接受 浏览器端 socket.send 发送过来的 json数据
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session fromSession, @PathParam("uid") String uid) throws JsonProcessingException {
log.info("服务端收到用户uid={}的消息:{}", uid, message);
// 处理msg
// 存储数据库
// 添加创建时间
if (staticUserService == null) {
return;
}
User user = staticUserService.getOne(new QueryWrapper<User>().eq("uid", uid));
if (user == null) {
log.error("获取用户信息失败,uid={}", uid);
return;
}
Im im = Im.builder().uid(uid).username(user.getName()).avatar(user.getAvatar()).sign("")
.createTime(LocalDateTime.now()).text(message).build();
// 存储数据到数据库
staticImService.save(im);
String jsonStr = new ObjectMapper().writeValueAsString(im); // 处理后的消息体
this.sendAllMessage(jsonStr);
log.info("发送消息:{}", jsonStr);
}
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误");
error.printStackTrace();
}
/**
* 服务端发送消息给除了自己的其他客户端
*/
private void sendMessage(Session fromSession, String message) {
sessionMap.values().forEach(session -> {
if (fromSession != session) {
log.info("服务端给客户端[{}]发送消息{}", session.getId(), message);
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
log.error("服务端发送消息给客户端异常", e);
}
}
});
}
/**
* 服务端发送消息给所有客户端
*/
private void sendAllMessage(String message) {
try {
for (Session session : sessionMap.values()) {
log.info("服务端给客户端[{}]发送消息{}", session.getId(), message);
session.getBasicRemote().sendText(message);
}
} catch (Exception e) {
log.error("服务端发送消息给客户端失败", e);
}
}
}
4.2 登录日志核心代码
@Component
@Aspect
@Slf4j
public class LogAspect {
@Resource
private ILogService logService;
@Around("@annotation(autoLog)")
public Object autoLog(ProceedingJoinPoint joinPoint, AutoLog autoLog) throws Throwable {
long beginTime = SystemClock.now();
//执行方法
Object result = joinPoint.proceed();
//执行时长(毫秒)
long time = SystemClock.now() - beginTime;
// 操作
String name = autoLog.value();
HttpServletRequest request = getRequest();
// 请求的url
String url = request.getRequestURL().toString();
if (url.contains("/file/download")) {
return result;
}
// 请求参数
String params = "";
Object[] args = joinPoint.getArgs();
if (args.length > 0) {
Object arg0 = args[0];
if (arg0 instanceof MultipartFile) {
params = "文件流";
} else if (arg0 instanceof String || arg0 instanceof Long || arg0 instanceof Integer) {
params = arg0.toString();
} else {
params = JSONUtil.toJsonStr(args[0]);
}
}
// 返回数据
String returnValue = JSONUtil.toJsonStr(result);
if (returnValue.length() > 1000) {
returnValue = "数据过大,返回状态码:" + JSONUtil.parseObj(returnValue).getStr("code");
}
// ip 和地址
Dict ipAndCity = IpUtils.getIPAndCity();
String ip = ipAndCity.getStr("ip");
String city = ipAndCity.getStr("city");
// 操作人
String username = "";
User user = SessionUtils.getUser();
if (user != null) {
username = user.getUsername();
}
// 保存到数据库
Log log = Log.builder().name(name).params(params).output(returnValue).url(url).ip(ip)
.address(city).duration((int) time).username(username).build();
logService.save(log);
return result;
}
private HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
}
五,相关作品展示
基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目
基于Nodejs、Vue等前端技术开发的前端实战项目
基于微信小程序和安卓APP应用开发的相关作品
基于51单片机等嵌入式物联网开发应用
基于各类算法实现的AI智能应用
基于大数据实现的各类数据管理和推荐系统