毕业设计|基于SpringBoot+Vue的校园交友平台

作者主页:编程指南针

作者简介: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等

前台主要功能:

  1. 首页:展示轮播图、动态排行榜、最新动态以及校园资讯等内容,吸引用户的注意。
  2. 全局动态搜索:允许用户根据描述、话题或标题进行搜索,方便用户快速找到感兴趣的内容。
  3. 聊天室:提供在线聊天的功能,让用户可以与其他用户进行实时交流和互动。
  4. 积分商城:通过点赞等行为获取积分,并提供积分换购商品的功能,增加用户积极参与平台活动的动力。
  5. 积分消费订单:展示用户的积分消费记录和订单信息,方便用户了解自己的消费情况。
  6. 消息通知:向用户发送系统通知和个人消息,及时告知用户动态和重要信息。
  7. 个人中心:用户可以管理自己的动态、收货地址、收藏内容,查看个人资料并修改密码等。

后台主要功能:

  1. 系统管理:包括角色管理、用户管理、权限管理、文件管理和日志管理等,确保系统的安全和可控。
  2. 首页管理:对首页内容进行管理,包括轮播图、动态排行榜、最新动态和校园资讯等的编辑和发布。
  3. 校园资讯管理:允许管理员发布和管理校园资讯,包括标题、内容和发布时间等。
  4. 话题管理:管理平台上的话题,包括创建、编辑、删除话题,并可对话题进行分类和排序。
  5. 动态管理:对用户发布的动态进行管理,包括审核、删除和置顶等操作。
  6. 收藏管理:管理用户的收藏内容,包括浏览和删除等功能。
  7. 评论管理:对用户的评论进行审核和删除,确保平台上的评论秩序。
  8. 通知管理:向用户发送系统通知和个人消息,进行编辑、发送和删除等操作。
  9. 积分商城管理:管理商品信息,包括商品的添加、编辑、下架和库存管理等操作。
  10. 数据统计:通过图形化展示拆线图、柱状图和饼图等方式,对用户活跃度和交互数据进行分析和统计。
  11. 个人资料和修改密码:管理员可以查看和修改用户的个人资料,并重置密码等。

三,系统展示

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智能应用

基于大数据实现的各类数据管理和推荐系统

 

 

猜你喜欢

转载自blog.csdn.net/whirlwind526/article/details/134383209