仿b站微服务项目前后端完全运行环境与接口的文档
仿b站前后端分离微服务项目
实现了以下功能:
视频的上传、查看与上传时获取封面
视频的点赞、评论、可同时新增和删除多个收藏记录的收藏、多功能的弹幕
用户的个人信息查看编辑、用户之间的关注
用户的个人主页权限修改、查看、由个人主页权限动态决定的用户个人主页内容的获取
手机号、邮箱、图形验证码的多种方式登录
支持临时会话的服务器为代理的一对一实时私聊
基于讯飞星火的文生文、文生图、(全网首发)智能PPT
关注up动态视频、评论、点赞、私聊消息的生成与推送
基于es实现的视频和用户的聚合搜索、推荐视频
网关的路由和统一鉴权与授权
基于双token的七天内无感刷新token
防csrf、xss、抓包、恶意上传脚本攻击
统一处理异常和泛型封装响应体、自定义修改响应序列化值
简易的仿redis缓存读取与数据过期剔除实现
xxl-job+ redis+ rocketmq+ es+ 布隆过滤器的自定义es与mysql数据同步
slueth+zipkin的多服务间请求链路追踪
集中多服务日志到一个文件目录下与按需添加特定内容入日志
多服务的详细接口文档
前后端完全运行步骤:
1.运行中间件环境本机部署:
参考之前文章https://www.nowcoder.com/discuss/640368532730990592?sourceSSR=users
2.前后端项目本机启动
参考之前文章https://www.nowcoder.com/discuss/640865638906384384?sourceSSR=users
3.拉取项目后必要创建工作
修改配置
将连接MySQL的密码用户名密码改成实际密码,Redis默认连接无用户名密码,若未对Redis做出修改则不需修改springboot配置,es同Redis,Rocketmq同理,minio默认用户名密码minioadmin,未做minio修改则无需修改配置
创建MySQL数据库
执行github上的sql脚本(注意最好在远程连接软件如navicat、dbeaver上执行,直接在idea中连接MySQL作者并未测试且有人直接idea连接MySQL执行该脚本未成功)
创建ElasticSearch索引
启动搜索服务后在Postman中发送请求创建视频和用户的es索引
post请求:http://localhost:8201/search/createIndex
参数如下
{ "indexName": "video", "properties": { "video_id": "integer", "video_name": "text", "intro": "text", "cover":"text", "length":"text", "create_time":"date", "author_name":"text", "author_id":"integer", "url":"text", "play_count":"integer", "danmaku_count":"integer", "collect_count":"integer" } }
和post请求http://localhost:8201/search/createIndex
{ "indexName": "user", "properties": { "id": "integer", "nickname": "text", "intro": "text", "cover":"text", "fans_count":"integer", "video_count":"integer" } }
或将搜索服务中创建索引的接口createIndex上的@ApiIgnore注解去掉后浏览器输入localhost:8201/doc.html进入接口文档创建
package ljl.bilibili.search.controller; import com.fasterxml.jackson.core.JsonProcessingException; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import ljl.bilibili.client.pojo.RecommendVideo; import ljl.bilibili.search.service.SearchService; import ljl.bilibili.search.vo.request.EsKeywordRequest; import ljl.bilibili.search.vo.response.UserKeyWordSearchResponse; import ljl.bilibili.search.handler.MysqlToEsHandler; import ljl.bilibili.search.vo.response.TotalCountSearchResponse; import ljl.bilibili.search.vo.response.VideoKeywordSearchResponse; import ljl.bilibili.search.vo.request.EsIndexRequest; import ljl.bilibili.util.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; import javax.annotation.Resource; import java.io.IOException; import java.util.List; @RestController @RequestMapping("/search") @Api(tags = "搜索") @Slf4j @CrossOrigin(value = "*") public class SearchController { @Resource SearchService searchService; @Resource MysqlToEsHandler mysqlToEsHandler; @GetMapping("/test") public Boolean test() throws Exception { mysqlToEsHandler.mysqlToEsHandler(); return true; } @GetMapping("/totalKeywordSearch/{keyword}") @ApiOperation("关键字搜索后得出匹配视频和用户的总页数和总文档数") public Result<TotalCountSearchResponse> totalKeywordSearch(@PathVariable String keyword) { log.info("1"); return searchService.totalKeywordSearch(keyword); } @GetMapping("/videoKeywordSearch/{keyword}/{pageNumber}/{type}") @ApiOperation("关键字搜索后得出匹配度降序排列的视频列表,得到对应页码的视频数据") public Result<List<VideoKeywordSearchResponse>> videoPageKeywordSearch(@PathVariable String keyword, @PathVariable Integer pageNumber, @PathVariable Integer type) throws JsonProcessingException { log.info("1"); return searchService.videoPageKeywordSearch(keyword, pageNumber, type); } @GetMapping("/userKeywordSearch/{keyword}/{pageNumber}/{type}/{userId}") @ApiOperation("关键字搜索后得出匹配度降序排列的用户,得到对应页码的视频数据,传不同type决定再查询结果") public Result<List<UserKeyWordSearchResponse>> userPageKeywordSearch(@PathVariable String keyword, @PathVariable Integer pageNumber, @PathVariable Integer type, @PathVariable Integer userId) throws JsonProcessingException { log.info("1"); return searchService.userPageKeywordSearch(keyword, pageNumber, type,userId); } @GetMapping("/likelyKeyWordSearch/{keyword}") @ApiOperation("输入关键字时停顿且未点确认导致跳转搜索结果页时对应的匹配度前十的近似关键字") public Result<List<String>> LikelykeyWordSearch(@PathVariable String keyword) throws IOException { log.info("1"); return searchService.likelyKeywordSearch(keyword); } @GetMapping("/likelyVideoRecommend/{videoId}") @ApiOperation("推荐视频") @ApiIgnore public List<RecommendVideo> likelyVideoRecommend(@PathVariable String videoId) throws IOException { log.info("1"); return searchService.likelyVideoRecommend(videoId); } @PostMapping("/addKeywordSearchRecord") @ApiOperation("增加搜索的历史记录") public Result<Boolean> addKeywordSearchRecord(@RequestBody EsKeywordRequest esKeywordRequest) throws IOException { log.info("1"); return searchService.addKeywordSearchRecord(esKeywordRequest); } @PostMapping("/createIndex") @ApiIgnore 去掉 public void crateIndex(@RequestBody EsIndexRequest esIndexRequest) { log.info("1"); searchService.createIndex(esIndexRequest); } @PostMapping("/deleteIndex/{indexName}") @ApiIgnore public void deleteIndex(@PathVariable String indexName) throws IOException { log.info("1"); searchService.deleteIndex(indexName); } }
minio桶创建
快速方法:在minio控制台中创建,按上面教程启动minio并进入控制台后如图创建桶
然后点击video桶修改桶权限使minio运行直接访问路径
相同步骤创建并修改video-cover、user-cover桶
如上面教程提到启动环境、启动前端后启动六个后端服务
注册新账号并登录
接下来点击右上角头像处进入个人中心上传视频
上传视频后会自动截取封面,若不做修改则用该封面作为默认封面
添加视频标题和简介后上传视频
上传完成后会检测,若视频编码可以在浏览器中播放则不会转码,否则会在notice服务中进行转码再重新上传
评论
点赞
收藏
弹幕修改个人信息
修改个人主页对外开放权限
项目地址LABiliBili,github地址GitHub - aigcbilibili/aigcbilibili: 仿bilibili前后端实现,演示地址https://labilibili.com/video/演示.mp4,如果大家觉得有帮助的话可以去github点个小星星♪(・ω・)ノ
该专栏存放前后端分离仿b站微服务项目相关教程