天天看點

IT社群|基于SpringBoot的IT社群平台

作者簡介:全棧開發工程,從事Java、Python、前端、小程式方面的開發和研究,對大資料應用與開發比較感興趣,

主要内容:Java項目、前端項目、Python項目、小程式開發、大資料項目、單片機

收藏點贊不迷路  關注作者有好處

文末擷取源碼 

感謝您的關注,請收藏以免忘記,點贊以示鼓勵,評論給以建議,愛你喲

作者首頁:程式設計指南針

作者簡介:Java領域優質創作者、CSDN部落格專家 、掘金特邀作者、多年架構師設計經驗、騰訊課堂常駐講師

主要内容:Java項目、畢業設計、履歷模闆、學習資料、面試題庫、技術互助

收藏點贊不迷路  關注作者有好處

文末擷取源碼 

項目編号:BS-PT-098

前言:

随着國家的發展,網絡的普及,以及IT行業的高薪就職,導緻越來越多的人進入IT行業,分一杯羹,但是由于衆多的人數,肯定會存在技術參差不齊的現象,在書寫代碼上出現了錯誤,有問題解決不出來時,不知道找誰詢問。是以IT社群平台應景而生,不同的IT大神,小白,都可以釋出文章,對文章進行客觀、實在的評價,不同的觀點,不同的思想,能夠碰發出不一樣的火花。本系統的設計目的主要是為了友善同學們在論壇上進行溝通,與網友進行思維碰撞。友善大家在學習生活上有疑難的時候可以詢問他人。

本社群平台屬于前後端分離的項目,前台包含了首頁、文章子產品、論貼子產品、搜尋子產品、視訊子產品、排行子產品、篩選子產品、個人中心子產品(個人資料、我的文章、我的視訊、我的文章、消息通知、收藏、關注、評論、粉絲),背景包含了首頁、論貼管理子產品、視訊管理子產品、論貼類型子產品、文章管理子產品,使用者管理,文章标簽管理,日志管理。其中每個主子產品中又包含多個子子產品。

一,項目簡介

本社群平台提供了兩個可使用的角色:使用者、管理者。本平台包含了前台系統和背景管理系統兩個系統,前台系統供使用者使用,而背景管理系統則供管理者使用。前台系統分為登入注冊子產品、首頁、文章子產品、論貼子產品、搜尋子產品、視訊子產品、排行子產品、篩選子產品、個人中心子產品;背景系統分為首頁、論貼管理子產品、視訊管理子產品、論貼類型子產品、文章管理子產品,使用者管理,文章标簽管理,日志管理等。

1.前台系統

文章子產品:使用者可以檢視自己感興趣的文章,可以對文章點贊,收藏,轉發,評論等。

論貼子產品:使用者對其他使用者提出的問題進行回答讨論,該子產品沒限制,使用者可以自行發言。

搜尋子產品:使用者可以在前台系統中輸入相關資訊進行全局查詢。

視訊子產品:使用者可以釋出教學視訊,知識視訊等。

排行子產品:對論貼類型進行各種排行,評分,點選量,收藏量等等。

個人中心子產品:包含各種子子產品:個人資料、我的文章、我的視訊、我的文章、消息通知、收藏、關注、評論、粉絲、私信等。

2.背景系統

論貼管理:管理者可以對論貼進行稽核,駁回操作。

文章管理:管理者對文章,轉發,評論進行管理。

論貼類型子產品:管理者對論貼的種類進行管理操作。

使用者管理子產品:管理者對使用者進行認證。

文章标簽維護:管理者對前台顯示的文章标簽進行禁用啟動編輯等操作。

日志管理:記錄使用者的各種操作。

IT社群|基于SpringBoot的IT社群平台

本系統的具體功能分析如下:

  1. 前台系統子產品功能

表3-1 前台系統子產品描述

功能名稱 功能描述
文章子產品 該子產品中主要功能包括檢視文章詳情,釋出文章,對文章進行評論,轉發文章,對文章點贊。釋出文章時選擇文章标簽然後進行釋出。
搜尋子產品 通過輸入關鍵字進行模糊查詢,查詢的範圍包含論貼類型,論貼,文章,視訊,使用者。一輸多查。
論貼子產品 釋出文章,通過選擇不同的文章類型進行釋出不同的文章,有面試貼,技術貼,内推貼等等。進入某個文章專區,可以檢視全部屬于該專區的文章,以及屬于該專區的視訊。
排行子產品 排行中包含評分排行,點選量排行,收藏量排行等功能。
視訊子產品 主要功能有釋出視訊,觀看視訊,和類型表關聯。可以在專區中檢視該專區所屬的視訊。
個人中心子產品 該子產品中的功能有:個人資料的修改檢視、個人論貼、個人視訊、個人文章、個人轉發、個人消息(系統消息、動态消息、評論消息、私信消息)、個人收藏、個人評論、個人關注、個人粉絲等若幹個功能。

2.背景系統子產品功能

表3-2 背景系統子產品描述

子產品名稱 功能描述
文章管理子產品 原創文章,轉發文章,評論進行删除,重寫釋出操作。
使用者管理子產品 對使用者進行認證,查詢,删除操作。
論貼管理子產品 該子產品功能對使用者釋出的文章進行稽核,駁回操作。
視訊管理子產品 該子產品的主要功能是對使用者釋出的視訊進行稽核,駁回等操作。
文章标簽維護子產品 對标簽的禁用啟用,編輯,徹底删除,查詢,添加等操作
日志管理子產品 查詢使用者的日志,删除日志。

二,環境介紹

語言環境:Java:  jdk1.8

資料庫:Mysql: mysql5.7

應用伺服器:Tomcat:  tomcat8.5.31

開發工具:IDEA或eclipse

背景開發:Springboot+Mybatis-plus

前台開發:VUE

三,系統展示

5.1 登入注冊界面的實作

登入界面如圖5-1,使用者輸入使用者名和密碼進行賬号的登入。

注冊界面如圖5-2,使用者輸入郵箱等資訊,通過服務端發送驗證碼到使用者郵箱中,将驗證碼同時存入redis緩存中,使用者填寫驗證碼以及其他相關資訊,将輸入的驗證碼與redis中的驗證碼進行比對,一緻則注冊成功。

IT社群|基于SpringBoot的IT社群平台

圖5-1 登入首頁面

IT社群|基于SpringBoot的IT社群平台

 圖5-2 注冊首頁面

5.2文章子產品的實作

文章子產品界面如圖5-3,5-4,該子產品具體包含文章清單,文章詳情,文章轉發,使用者釋出文章,以及對文章進行的點贊,評論操作都在該子產品中進行,展示文章清單,釋出文章,文章詳情是對文章表的增,删,查操作,另外隻有使用者本人可以對自己釋出的文章進行删除,編輯權限,其他使用者無次類權限,所有該功能的實作同時需要使用者表的關聯,評論需要與評論表關聯。

IT社群|基于SpringBoot的IT社群平台

圖5-3 文章清單展示頁面

IT社群|基于SpringBoot的IT社群平台
IT社群|基于SpringBoot的IT社群平台

圖5-4 文章詳情頁面

5.3搜尋子產品的實作

檢索子產品界面如圖5-5,使用者輸入關鍵詞,通過模糊查詢,包含多條查詢語句,對論貼類型,論貼,文章,視訊,使用者的模糊查詢,前端查詢函數同時執行多條查詢sql語句,使其達到目的。

IT社群|基于SpringBoot的IT社群平台

圖5-5 檢索子產品界面

5.4 論貼子產品的實作

論貼界面如圖5-6、5-7。通過對論貼表,使用者表進行查詢顯示全部文章,及其詳細内容,使用者登入後才能釋出文章,實作文章的釋出是對論貼表的增操作,内容包含文字和圖檔,使用者釋出的文章資料庫表state預設為0,需要管理者稽核,當管理者稽核通過後,state變為1,才算正在的釋出,其他使用者才能看見。

IT社群|基于SpringBoot的IT社群平台

圖5-6 論貼頁面實作

IT社群|基于SpringBoot的IT社群平台

圖5-7 釋出論貼實作

5.5 排行子產品的實作

排行子產品如圖5-8,該子產品通過對資料庫話題标(論貼類型表)進行查詢,分别對評分,點選量,收藏量進行排序,通過sql語句查詢出前10條資料傳回頁面,進行頁面渲染。

IT社群|基于SpringBoot的IT社群平台

圖5-8 排行清單實作

5.6 視訊子產品的實作

     視訊子產品如圖5-9、5-10,該子產品通過阿裡雲第三方視訊點播服務來完成,通過擷取阿裡雲oss的endpoint,keyid,keysecret,bucketname進行綁定,擷取第三方api來實作具體的功能。使用者釋出視訊後,同樣需要管理者來稽核。      
IT社群|基于SpringBoot的IT社群平台

圖5-9 視訊清單實作

IT社群|基于SpringBoot的IT社群平台

 圖5-10 視訊播放實作

5.7 個人中心子產品的實作

個人中心子產品如圖5-11、5-12,該子產品是使用者最重要的子產品,裡面包含了許多子子產品,該子產品遊客無法通路,隻有當使用者登入後才能顯示,前端判斷使用者是否登入來實作,表格樣式通過使用者id來對相應各表的查詢顯示操作,收藏,私信,消息通知,個人資訊都在裡面顯示,同時可以進行相應的操作。

IT社群|基于SpringBoot的IT社群平台

圖5-11 個人中心頁面

IT社群|基于SpringBoot的IT社群平台

 圖5-12 我的文章頁面

5.8 文章管理子產品實作

文章管理子產品如圖5-13、5-14,該子產品主要是對文章表、評論表進行sql操作,文章顯示,邏輯删除,重新釋出等操作,包括轉發的文章,同時也包括評論語句。該子產品是對文章表,評論表的基本sql語句操作。      
IT社群|基于SpringBoot的IT社群平台

圖5-13文章管理清單頁面

圖5-14 文章評論管理頁面

四,核心代碼展示

public Result item(@RequestParam(defaultValue = "0L", name = "userId") Long userId, @RequestParam("thatId") Long thatId) {

        // 儲存收藏、關注、粉絲、動态、轉發、評論、消息數
        int collectionCount = collectionService.count(new QueryWrapper<Collection>().eq("user_id", thatId));
        int attentionCount = attentionService.count(new QueryWrapper<Attention>().eq("this_id", thatId));
        int fansCount = attentionService.count(new QueryWrapper<Attention>().eq("that_id", thatId));
        int essayCount = essayService.count(new QueryWrapper<Essay>().eq("user_id", thatId));
        int forwardCount = forwardService.count(new QueryWrapper<Forward>().eq("user_id", thatId));
        int commentCount = commentService.count(new QueryWrapper<Comment>().eq("user_id", thatId));
        int messageCount = messageService.count(new QueryWrapper<Message>().eq("this_id", thatId));
        int newsCount = newsService.count(new QueryWrapper<News>().eq("user_id", thatId).eq("zt", MapUtil.YFB));
        int videoCount = videoService.count(new QueryWrapper<Video>().eq("user_id", thatId).eq("zt", MapUtil.VIDEO_YFB));

        final Attention one = attentionService.getOne(new QueryWrapper<Attention>().eq("this_id", userId).eq("that_id", thatId));


        User user;
        Object obj = redisUtils.get(MapUtil.USER_KEY + thatId);
        if (obj != null) {
            user = (User) obj;
        } else {
            user = userService.getById(thatId);
            redisUtils.set(MapUtil.USER_KEY + thatId, user, MapUtil.USER_SXQ);
        }

        Item item = new Item();
        // 是否已關注
        item.setFlagAttention(one == null ? 0 : 1);
        item.setAttentionCount(attentionCount);
        item.setCollectionCount(collectionCount);
        item.setFansCount(fansCount);
        item.setEssayCount(essayCount);
        item.setForwardCount(forwardCount);
        item.setCommentCount(commentCount);
        item.setMessageCount(messageCount);
        item.setNewsCount(newsCount);
        item.setVideoCount(videoCount);
        BeanUtil.copyProperties(user, item);
        return Result.success(item);
    }
           
try {
            //accessKeyId, accessKeySecret
            //fileName:上傳檔案原始名稱
            String fileName = file.getOriginalFilename();
            //title:上傳之後顯示名稱
            String title = fileName.substring(0, fileName.lastIndexOf("."));
            //inputStream:上傳檔案輸入流
            InputStream inputStream = file.getInputStream();
            UploadStreamRequest request = new UploadStreamRequest(ConstantProperties.ACCESS_KEY_ID, ConstantProperties.ACCESS_KEY_SECRET, title, fileName, inputStream);

            UploadVideoImpl uploader = new UploadVideoImpl();
            UploadStreamResponse response = uploader.uploadStream(request);

            String videoId;
            if (response.isSuccess()) {
                videoId = response.getVideoId();
            } else {
                //如果設定回調URL無效,不影響視訊上傳,可以傳回VideoId同時會傳回錯誤碼。
                // 其他情況上傳失敗時,VideoId為空,此時需要根據傳回錯誤碼分析具體錯誤原因
                videoId = response.getVideoId();
            }
            return videoId;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    
           
package com.superb.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.superb.common.MapUtil;
import com.superb.entity.Message;
import com.superb.entity.News;
import com.superb.entity.Record;
import com.superb.entity.Video;
import com.superb.service.MessageService;
import com.superb.service.OssService;
import com.superb.service.RecordAdminService;
import com.superb.service.VideoService;
import com.superb.util.Result;
import com.superb.util.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * <p>
 *  前端控制器
 * </p>
 *

 */
@RestController
@RequestMapping("/video")
public class VideoController {

    @Autowired
    private OssService ossService;

    @Autowired
    private VideoService videoService;


    /**
     * 視訊清單 已釋出
     * @param current
     * @param size
     * @return
     */
    @GetMapping("/list")
    public Result list(@RequestParam(defaultValue = "1", name = "current") Integer current,
                       @RequestParam(defaultValue = "10", name = "size") Integer size){
        Page<Map<String, Object>> page = new Page<>(current, size);
        IPage<Map<String, Object>> mapIPage = videoService.listVideo(page, MapUtil.VIDEO_YFB);
        return Result.success(mapIPage);
    }

    /**
     * 相關視訊推薦清單 已釋出
     * @param current
     * @param size
     * @return
     */
    @GetMapping("/listVideoByStyleId")
    public Result listVideoByStyleId(@RequestParam(defaultValue = "1", name = "current") Integer current,
                       @RequestParam(defaultValue = "5", name = "size") Integer size, @RequestParam("styleId")Integer styleId){
        Page<Map<String, Object>> page = new Page<>(current, size);
        IPage<Map<String, Object>> mapIPage = videoService.listByStyleId(page, styleId);
        return Result.success(mapIPage);
    }

    /**
     * 查詢所有已駁回  video  附加user
     * @param current
     * @param size
     * @return
     */
    @GetMapping("/listAdminYbh")
    public Result listAdminYbh (@RequestParam(defaultValue = "1",value = "current") Integer current,
                                @RequestParam(defaultValue = "10",name = "size") Integer size) {
        Page<Map<String ,Object>> page = new Page<>(current, size);
        IPage<Map<String, Object>> list = videoService.listVideo(page, MapUtil.VIDEO_YBH);
        return Result.success(list);
    }

    /**
     * 查詢所有待稽核  video  附加user
     * @param current
     * @param size
     * @return
     */
    @GetMapping("/listAdminDsh")
    public Result listAdminDsh (@RequestParam(defaultValue = "1",value = "current") Integer current,
                                @RequestParam(defaultValue = "10",name = "size") Integer size) {
        Page<Map<String ,Object>> page = new Page<>(current, size);
        IPage<Map<String, Object>> list = videoService.listVideo(page, MapUtil.VIDEO_DSH);
        return Result.success(list);
    }

    /**
     * 視訊排行
     * @return
     */
    @GetMapping("/itemPh")
    public Result itemPh () {
        return Result.success(videoService.listPh(MapUtil.PHTS, MapUtil.VIDEO_YFB));
    }

    /**
     * 視訊詳情
     * @param id
     * @return
     */
    @GetMapping("/itemXq")
    public Result itemXq (@RequestParam("id") Integer id) {
        Map<String, Object> map = videoService.videoById(id);
        map.put("count", (Long)map.get("count") + 1L);
        // 通路量+1
        Video video = new Video();
        video.setId(id);
        video.setCount((Long)map.get("count"));
        videoService.updateById(video);
        return Result.success(map);
    }

    /**
     * 個人視訊
     * @param current
     * @param size
     * @return
     */
    @GetMapping("/listByUserId")
    public Result listByUserId(@RequestParam(defaultValue = "1", name = "current") Integer current,
                       @RequestParam(defaultValue = "8", name = "size") Integer size,
                       @RequestParam("userId") Long userId){
        Page<Map<String, Object>> page = new Page<>(current, size);
        IPage<Map<String, Object>> mapIPage = videoService.listByUserId(page, userId);
        return Result.success(mapIPage);
    }

    /**
     * 上傳視訊
     * @param file
     * @return
     */
    @PostMapping("/uploadAlyVideo")
    public Result uploadAlyVideo(MultipartFile file){
        String videoId = ossService.uploadVideoAly(file);
        return Result.success(videoId);
    }

    /**
     * 儲存
     * @param video
     * @return
     */
    @PostMapping("/saveVideo")
    public Result saveVideo(@RequestBody Video video){
        video.setZt(MapUtil.VIDEO_DSH);
        // 擷取視訊url
        String urlById = Utils.getUrlById(video.getVideoId());
        video.setVideoUrl(urlById);
        videoService.save(video);
        return Result.success();
    }

    /**
     * 删除視訊
     * @param video
     * @return
     */
    @PostMapping("/delete")
    public Result delete(@RequestBody Video video){
        ossService.removeMoreAlyVideo(video.getVideoId());
        return Result.success();
    }

    @Autowired
    private RecordAdminService recordAdminService;

    @Autowired
    private MessageService messageService;

    /**
     * 駁回視訊
     * @param video
     * @return
     */
    @PostMapping("/bhAdmin")
    public Result bhAdmin (@RequestBody Video video) {
        video.setZt(MapUtil.VIDEO_YBH);
        videoService.updateById(video);
        // 發消息
        Message message = new Message();
        message.setMessageTitle(MapUtil.XTTZ);
        message.setMessageText("你的視訊《" + video.getVideoTitle() + "》已被駁回");
        message.setMessageType(MapUtil.XXLX_XT);
        message.setThatId(MapUtil.GLYID);
        message.setThisId(video.getUserId());
        // 背景記錄
        recordAdminService.xr("駁回視訊:" + video.getVideoTitle());
        messageService.save(message);
        return Result.success("已駁回");
    }

    /**
     * 釋出
     * @param video
     * @return
     */
    @PostMapping("/fbAdmin")
    public Result fbAdmin (@RequestBody Video video) {
        video.setZt(MapUtil.VIDEO_YFB);
        videoService.updateById(video);
        // 發消息
        Message message = new Message();
        message.setMessageTitle(MapUtil.XTTZ);
        message.setMessageText("你的視訊《" + video.getVideoTitle() + "》已認證稽核");
        message.setMessageType(MapUtil.XXLX_XT);
        message.setThatId(MapUtil.GLYID);
        message.setThisId(video.getUserId());
        // 背景記錄
        recordAdminService.xr("審批通過:" + video.getVideoTitle());
        messageService.save(message);
        return Result.success("已釋出");
    }

    /**
     * 模糊查詢
     * @param text
     * @return
     */
    @GetMapping("/search")
    public Result search(@RequestParam(defaultValue = "", value = "text") String text,
                         @RequestParam(defaultValue = "1", name = "current") Integer current,
                         @RequestParam(defaultValue = "8", name = "size") Integer size){
        Page<Map<String, Object>> page = new Page<>(current, size);
        IPage<Map<String, Object>> search = videoService.search(page, text);
        return Result.success(search);
    }
}
           

五,項目總結

首先是論文的摘要部分,對整個項目進行了初步的了解,然後第一部分緒論,對項目的背景和目的内容出發,書寫項目的開發目的,第二部分,系統項目所使用的相關技術的介紹,第三部分對系統分析,可行性,需求進行深入分析,第四部分則是系統的具體設計,從架構到功能到資料庫,每個子產品的具體設計思路,流程等,第五部分是對系統的運作頁面功能,和核心代碼的具體實作思路的撰寫,最後就是總結緻謝等。