forked from iVMiku/guidance-backend
Merge pull request 'main' (#5) from iVMiku/guidance-backend:main into main
Reviewed-on: https://gitea.xinxijishubu.asia/miaozerun/guidance-backend/pulls/5
This commit was merged in pull request #5.
This commit is contained in:
24
.idea/mybatisx/templates.xml
generated
24
.idea/mybatisx/templates.xml
generated
@@ -39,6 +39,26 @@
|
|||||||
<option name="modulePath" value="$PROJECT_DIR$/community-8073" />
|
<option name="modulePath" value="$PROJECT_DIR$/community-8073" />
|
||||||
<option name="packageName" value="mapper" />
|
<option name="packageName" value="mapper" />
|
||||||
</ModuleInfoGo>
|
</ModuleInfoGo>
|
||||||
|
<ModuleInfoGo>
|
||||||
|
<option name="basePath" value="${domain.basePath}" />
|
||||||
|
<option name="configFileName" value="serviceImpl.ftl" />
|
||||||
|
<option name="configName" value="serviceImpl" />
|
||||||
|
<option name="encoding" value="${domain.encoding}" />
|
||||||
|
<option name="fileName" value="${domain.fileName}ServiceImpl" />
|
||||||
|
<option name="fileNameWithSuffix" value="${domain.fileName}ServiceImpl.java" />
|
||||||
|
<option name="modulePath" value="$PROJECT_DIR$/community-8073" />
|
||||||
|
<option name="packageName" value="${domain.basePackage}.service.impl" />
|
||||||
|
</ModuleInfoGo>
|
||||||
|
<ModuleInfoGo>
|
||||||
|
<option name="basePath" value="${domain.basePath}" />
|
||||||
|
<option name="configFileName" value="serviceInterface.ftl" />
|
||||||
|
<option name="configName" value="serviceInterface" />
|
||||||
|
<option name="encoding" value="${domain.encoding}" />
|
||||||
|
<option name="fileName" value="${domain.fileName}Service" />
|
||||||
|
<option name="fileNameWithSuffix" value="${domain.fileName}Service.java" />
|
||||||
|
<option name="modulePath" value="$PROJECT_DIR$/community-8073" />
|
||||||
|
<option name="packageName" value="${domain.basePackage}.service" />
|
||||||
|
</ModuleInfoGo>
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
<option name="needsModel" value="true" />
|
<option name="needsModel" value="true" />
|
||||||
@@ -47,8 +67,8 @@
|
|||||||
<option name="tableUIInfoList">
|
<option name="tableUIInfoList">
|
||||||
<list>
|
<list>
|
||||||
<TableUIInfo>
|
<TableUIInfo>
|
||||||
<option name="className" value="Usercommunity" />
|
<option name="className" value="BrowingHistory" />
|
||||||
<option name="tableName" value="usercommunity" />
|
<option name="tableName" value="browing_history" />
|
||||||
</TableUIInfo>
|
</TableUIInfo>
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.ivmiku.tutorial.config;
|
||||||
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
@Configuration
|
||||||
|
public class MpConfig {
|
||||||
|
@Bean
|
||||||
|
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||||
|
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||||
|
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
|
||||||
|
return interceptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package com.ivmiku.tutorial.controller;
|
|||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.ivmiku.tutorial.entity.Comment;
|
import com.ivmiku.tutorial.entity.Comment;
|
||||||
import com.ivmiku.tutorial.entity.Pages;
|
import com.ivmiku.tutorial.entity.Pages;
|
||||||
@@ -209,8 +210,7 @@ public class CommentController {
|
|||||||
public Result getPostComments(@PathVariable("postId") Long postId, @RequestBody Pages pages) {
|
public Result getPostComments(@PathVariable("postId") Long postId, @RequestBody Pages pages) {
|
||||||
logger.info("获取帖子ID:{}的评论列表", postId);
|
logger.info("获取帖子ID:{}的评论列表", postId);
|
||||||
logger.info("获取pageSize:{}", pages.getPageSize());
|
logger.info("获取pageSize:{}", pages.getPageSize());
|
||||||
System.out.println("aaaaaa" + pages.getPageSize());
|
IPage<Comment> comments = commentService.getPostComments(postId, pages.getPageNum(), pages.getPageSize());
|
||||||
PageInfo<Comment> comments = commentService.getPostComments(postId, pages.getPageNum(), pages.getPageSize());
|
|
||||||
return Result.ok(comments);
|
return Result.ok(comments);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,7 +224,7 @@ public class CommentController {
|
|||||||
@Operation(summary = "获取评论下的所有回复")
|
@Operation(summary = "获取评论下的所有回复")
|
||||||
public Result getCommentReplies(@PathVariable Long commentId, @RequestBody Pages pages) {
|
public Result getCommentReplies(@PathVariable Long commentId, @RequestBody Pages pages) {
|
||||||
logger.info("获取评论ID:{}的回复列表", commentId);
|
logger.info("获取评论ID:{}的回复列表", commentId);
|
||||||
PageInfo<Comment> replies = commentService.getCommentReplies(commentId, pages.getPageNum(), pages.getPageSize());
|
IPage<Comment> replies = commentService.getCommentReplies(commentId, pages.getPageNum(), pages.getPageSize());
|
||||||
return Result.ok(replies);
|
return Result.ok(replies);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
|
|||||||
import com.ivmiku.tutorial.entity.Community;
|
import com.ivmiku.tutorial.entity.Community;
|
||||||
import com.ivmiku.tutorial.response.Result;
|
import com.ivmiku.tutorial.response.Result;
|
||||||
import com.ivmiku.tutorial.service.CommunityService;
|
import com.ivmiku.tutorial.service.CommunityService;
|
||||||
|
import com.ivmiku.tutorial.service.CommunitytagService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.models.annotations.OpenAPI30;
|
import io.swagger.v3.oas.models.annotations.OpenAPI30;
|
||||||
import org.apiguardian.api.API;
|
import org.apiguardian.api.API;
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package com.ivmiku.tutorial.controller;
|
||||||
|
|
||||||
|
import com.ivmiku.tutorial.entity.Communitytag;
|
||||||
|
import com.ivmiku.tutorial.response.Result;
|
||||||
|
import com.ivmiku.tutorial.service.CommunitytagService;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/communityTags")
|
||||||
|
public class CommunitytagController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CommunitytagService communitytagService;
|
||||||
|
|
||||||
|
@PostMapping("/create")
|
||||||
|
public Result createCommunityTag(@RequestBody Communitytag communityTag) {
|
||||||
|
communitytagService.createCommunityTag(communityTag);
|
||||||
|
return Result.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/update/{id}")
|
||||||
|
public Result updateCommunityTag(@PathVariable Long id, @RequestBody Communitytag communityTag) {
|
||||||
|
communitytagService.updateCommunityTag(id, communityTag);
|
||||||
|
return Result.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/delete/{id}")
|
||||||
|
public Result deleteCommunityTag(@PathVariable Long id) {
|
||||||
|
communitytagService.deleteCommunityTag(id);
|
||||||
|
return Result.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/get/{id}")
|
||||||
|
public Result getCommunityTag(@PathVariable Long id) {
|
||||||
|
Communitytag communityTag = communitytagService.getCommunityTagById(id);
|
||||||
|
return Result.ok(communityTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/list/{communityId}")
|
||||||
|
public Result getCommunityTagListByCommunityId(@PathVariable Long communityId) {
|
||||||
|
List<Communitytag> tags = communitytagService.getCommunityTagListByCommunityId(communityId);
|
||||||
|
return Result.ok(tags);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,12 +2,17 @@ package com.ivmiku.tutorial.controller;
|
|||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import cn.hutool.core.lang.hash.Hash;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.ivmiku.tutorial.entity.Post;
|
||||||
import com.ivmiku.tutorial.response.Result;
|
import com.ivmiku.tutorial.response.Result;
|
||||||
import com.ivmiku.tutorial.service.InteractionService;
|
import com.ivmiku.tutorial.service.InteractionService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* InteractionController 是处理用户与帖子的收藏、点赞以及对评论的点赞功能的控制器类。
|
* InteractionController 是处理用户与帖子的收藏、点赞以及对评论的点赞功能的控制器类。
|
||||||
@@ -104,4 +109,35 @@ public class InteractionController {
|
|||||||
interactionService.unlikeComment(userOpenid, commentId);
|
interactionService.unlikeComment(userOpenid, commentId);
|
||||||
return Result.ok();
|
return Result.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 我的收藏接口
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@GetMapping("/getFavoritePosts")
|
||||||
|
public Result getFavoritePosts() {
|
||||||
|
String userOpenid = StpUtil.getLoginIdAsString();
|
||||||
|
log.info("用户 {} 正在获取收藏的帖子", userOpenid);
|
||||||
|
IPage<Post> favoritePost = interactionService.getFavoritePosts(userOpenid);
|
||||||
|
HashMap<String, Object> data = new HashMap<>();
|
||||||
|
if (favoritePost != null) {
|
||||||
|
log.info("用户 {} 收藏的帖子获取成功", userOpenid);
|
||||||
|
data.put("total", favoritePost.getTotal());
|
||||||
|
data.put("list", favoritePost.getRecords());
|
||||||
|
return Result.ok(data);
|
||||||
|
}
|
||||||
|
return Result.ok("用户未发表帖子");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计我的获赞数量 笔记数量 收藏数量
|
||||||
|
*/
|
||||||
|
@GetMapping("/getLikeCount")
|
||||||
|
public Result getLikeCount() {
|
||||||
|
String userOpenid = StpUtil.getLoginIdAsString();
|
||||||
|
log.info("用户 {} 正在获取用户获赞的数量", userOpenid);
|
||||||
|
HashMap<String, Object> res = interactionService.getLikeCount(userOpenid);
|
||||||
|
return Result.ok();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.ivmiku.tutorial.controller;
|
|||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.ivmiku.tutorial.entity.Pages;
|
import com.ivmiku.tutorial.entity.Pages;
|
||||||
import com.ivmiku.tutorial.entity.Post;
|
import com.ivmiku.tutorial.entity.Post;
|
||||||
@@ -15,7 +16,9 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 帖子控制器,用于处理帖子相关的HTTP请求。
|
* 帖子控制器,用于处理帖子相关的HTTP请求。
|
||||||
@@ -81,7 +84,8 @@ public class PostController {
|
|||||||
@GetMapping("/get/{id}")
|
@GetMapping("/get/{id}")
|
||||||
public Result getPost(@PathVariable Long id) {
|
public Result getPost(@PathVariable Long id) {
|
||||||
logger.info("开始获取帖子ID:{}的详细信息", id);
|
logger.info("开始获取帖子ID:{}的详细信息", id);
|
||||||
Post post = postService.getPostById(id); // 调用服务层根据ID查询帖子
|
String userId = StpUtil.getLoginIdAsString();
|
||||||
|
Post post = postService.getPostById(id, userId); // 调用服务层根据ID查询帖子
|
||||||
if (post != null) {
|
if (post != null) {
|
||||||
logger.info("帖子ID:{}的详细信息获取成功", id);
|
logger.info("帖子ID:{}的详细信息获取成功", id);
|
||||||
} else {
|
} else {
|
||||||
@@ -110,24 +114,27 @@ public class PostController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户获取自己所有帖子的信息
|
* 用户获取自己所有帖子的信息
|
||||||
* @return 当前用户帖子列表
|
* @return 当前用户帖子列表与该用户的总发布数量
|
||||||
*/
|
*/
|
||||||
@GetMapping("/getPostList")
|
@GetMapping("/getPostList")
|
||||||
public Result getPostList(@RequestBody Pages pages) {
|
public Result getPostList(@RequestBody Pages pages) {
|
||||||
logger.info("开始获取帖子列表");
|
logger.info("开始获取帖子列表");
|
||||||
String userId = StpUtil.getLoginIdAsString(); // 获取当前登录用户的ID
|
String userId = StpUtil.getLoginIdAsString(); // 获取当前登录用户的ID
|
||||||
PageInfo<Post> posts = postService.getPostList(userId, pages.getPageNum(), pages.getPageSize());
|
IPage<Post> posts = postService.getPostList(userId, pages.getPageNum(), pages.getPageSize());
|
||||||
return Result.ok(posts); // 调用服务层获取帖子列表
|
Map<String, Object> data = new HashMap<>();
|
||||||
|
data.put("total", posts.getTotal());
|
||||||
|
data.put("posts", posts);
|
||||||
|
return Result.ok(data); // 调用服务层获取帖子列表
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 社区获取自己所有帖子的信息
|
* 社区获取自己所有帖子的信息
|
||||||
* @return 当前用户帖子列表
|
* @return 当前用户帖子列表
|
||||||
*/
|
*/
|
||||||
@GetMapping("/getCommunityPostList{communityId}")
|
@GetMapping("/getCommunityPostList/{communityId}")
|
||||||
public Result getCommunityPostList(@PathVariable("communityId") Long communityId, @RequestBody Pages pages) {
|
public Result getCommunityPostList(@PathVariable("communityId") Long communityId, @RequestBody Pages pages) {
|
||||||
logger.info("开始获取帖子列表");
|
logger.info("开始获取帖子列表");
|
||||||
PageInfo<Post> posts = postService.getCommunityPostList(communityId, pages.getPageNum(), pages.getPageSize());
|
IPage<Post> posts = postService.getCommunityPostList(communityId, pages.getPageNum(), pages.getPageSize());
|
||||||
return Result.ok(posts); // 调用服务层获取帖子列表
|
return Result.ok(posts); // 调用服务层获取帖子列表
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +143,7 @@ public class PostController {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/official")
|
@GetMapping("/official")
|
||||||
public PageInfo<Post> getOfficialPosts(@RequestBody Pages pages) {
|
public IPage<Post> getOfficialPosts(@RequestBody Pages pages) {
|
||||||
return postService.getOfficialPosts(pages.getPageNum(), pages.getPageSize());
|
return postService.getOfficialPosts(pages.getPageNum(), pages.getPageSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +152,7 @@ public class PostController {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/nonOfficial")
|
@GetMapping("/nonOfficial")
|
||||||
public PageInfo<Post> getNonOfficialPosts(@RequestBody Pages pages) {
|
public IPage<Post> getNonOfficialPosts(@RequestBody Pages pages) {
|
||||||
return postService.getNonOfficialPosts(pages.getPageNum(), pages.getPageSize());
|
return postService.getNonOfficialPosts(pages.getPageNum(), pages.getPageSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @TableName browing_history
|
||||||
|
*/
|
||||||
|
@TableName(value ="browing_history")
|
||||||
|
@Data
|
||||||
|
public class BrowingHistory implements Serializable {
|
||||||
|
@TableId(type = IdType.AUTO)
|
||||||
|
private Long browingId;
|
||||||
|
|
||||||
|
private String userOpenid;
|
||||||
|
|
||||||
|
|
||||||
|
private Long postId;
|
||||||
|
|
||||||
|
|
||||||
|
private Date createAt;
|
||||||
|
|
||||||
|
@TableLogic
|
||||||
|
private Integer isDelete;
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @TableName communitytag
|
||||||
|
*/
|
||||||
|
@TableName(value ="communitytag")
|
||||||
|
@Data
|
||||||
|
public class Communitytag implements Serializable {
|
||||||
|
|
||||||
|
@TableId
|
||||||
|
private Long smallCTagId;
|
||||||
|
|
||||||
|
private String cTagName;
|
||||||
|
|
||||||
|
private Long cId;
|
||||||
|
|
||||||
|
private Integer isDelete;
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.ivmiku.tutorial.mapper;
|
||||||
|
|
||||||
|
import com.ivmiku.tutorial.entity.BrowingHistory;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author rog
|
||||||
|
* @description 针对表【browing_history】的数据库操作Mapper
|
||||||
|
* @createDate 2024-08-23 11:29:33
|
||||||
|
* @Entity com.ivmiku.tutorial.entity.BrowingHistory
|
||||||
|
*/
|
||||||
|
public interface BrowingHistoryMapper extends BaseMapper<BrowingHistory> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.ivmiku.tutorial.mapper;
|
||||||
|
|
||||||
|
import com.ivmiku.tutorial.entity.Communitytag;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author rog
|
||||||
|
* @description 针对表【communitytag】的数据库操作Mapper
|
||||||
|
* @createDate 2024-08-16 09:40:06
|
||||||
|
* @Entity com.ivmiku.tutorial.entity.Communitytag
|
||||||
|
*/
|
||||||
|
public interface CommunitytagMapper extends BaseMapper<Communitytag> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -2,6 +2,8 @@ package com.ivmiku.tutorial.mapper;
|
|||||||
|
|
||||||
import com.ivmiku.tutorial.entity.Likee;
|
import com.ivmiku.tutorial.entity.Likee;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author rog
|
* @author rog
|
||||||
@@ -11,6 +13,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
*/
|
*/
|
||||||
public interface LikeMapper extends BaseMapper<Likee> {
|
public interface LikeMapper extends BaseMapper<Likee> {
|
||||||
|
|
||||||
|
// 获取帖子获赞数
|
||||||
|
@Select("SELECT SUM(like_count) FROM posts WHERE user_openid = #{userOpenid}")
|
||||||
|
Long getPostLikeCount(@Param("userOpenid") String userOpenid);
|
||||||
|
|
||||||
|
// 获取评论获赞数
|
||||||
|
@Select("SELECT SUM(like_count) FROM comments WHERE user_openid = #{userOpenid}")
|
||||||
|
Long getCommentLikeCount(@Param("userOpenid") String userOpenid);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.ivmiku.tutorial.service;
|
||||||
|
|
||||||
|
import com.ivmiku.tutorial.entity.BrowingHistory;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author rog
|
||||||
|
* @description 针对表【browing_history】的数据库操作Service
|
||||||
|
* @createDate 2024-08-23 11:29:33
|
||||||
|
*/
|
||||||
|
public interface BrowingHistoryService extends IService<BrowingHistory> {
|
||||||
|
|
||||||
|
void deleteBrowingRecordById(Long browingId);
|
||||||
|
|
||||||
|
void deleteBrowingRecordsByIds(List<Long> browingIds);
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.ivmiku.tutorial.service;
|
package com.ivmiku.tutorial.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.ivmiku.tutorial.entity.Comment;
|
import com.ivmiku.tutorial.entity.Comment;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
@@ -50,9 +51,9 @@ public interface CommentService extends IService<Comment> {
|
|||||||
|
|
||||||
void deleteComment(Long commentId, String userId);
|
void deleteComment(Long commentId, String userId);
|
||||||
|
|
||||||
PageInfo<Comment> getPostComments(Long postId, int pageNum, int pageSize);
|
IPage<Comment> getPostComments(Long postId, int pageNum, int pageSize);
|
||||||
|
|
||||||
PageInfo<Comment> getCommentReplies(Long commentId, int pageNum, int pageSize);
|
IPage<Comment> getCommentReplies(Long commentId, int pageNum, int pageSize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 回复评论。
|
* 回复评论。
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.ivmiku.tutorial.service;
|
||||||
|
|
||||||
|
import com.ivmiku.tutorial.entity.Communitytag;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author rog
|
||||||
|
* @description 针对表【communitytag】的数据库操作Service
|
||||||
|
* @createDate 2024-08-16 09:40:06
|
||||||
|
*/
|
||||||
|
public interface CommunitytagService extends IService<Communitytag> {
|
||||||
|
|
||||||
|
void createCommunityTag(Communitytag communityTag);
|
||||||
|
|
||||||
|
void updateCommunityTag(Long id, Communitytag communityTag);
|
||||||
|
|
||||||
|
void deleteCommunityTag(Long id);
|
||||||
|
|
||||||
|
Communitytag getCommunityTagById(Long id);
|
||||||
|
|
||||||
|
List<Communitytag> getCommunityTagListByCommunityId(Long communityId);
|
||||||
|
}
|
||||||
@@ -1,5 +1,11 @@
|
|||||||
package com.ivmiku.tutorial.service;
|
package com.ivmiku.tutorial.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.ivmiku.tutorial.entity.Post;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* InteractionService接口定义用户对帖子和评论的收藏与点赞操作。
|
* InteractionService接口定义用户对帖子和评论的收藏与点赞操作。
|
||||||
*/
|
*/
|
||||||
@@ -10,4 +16,8 @@ public interface InteractionService {
|
|||||||
void unlikePost(String userOpenid, Long postId);
|
void unlikePost(String userOpenid, Long postId);
|
||||||
void likeComment(String userOpenid, Long commentId);
|
void likeComment(String userOpenid, Long commentId);
|
||||||
void unlikeComment(String userOpenid, Long commentId);
|
void unlikeComment(String userOpenid, Long commentId);
|
||||||
|
|
||||||
|
IPage<Post> getFavoritePosts(String userOpenid);
|
||||||
|
|
||||||
|
HashMap<String, Object> getLikeCount(String userOpenid);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.ivmiku.tutorial.service;
|
package com.ivmiku.tutorial.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.ivmiku.tutorial.entity.Post;
|
import com.ivmiku.tutorial.entity.Post;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
@@ -8,17 +9,18 @@ import java.util.List;
|
|||||||
|
|
||||||
public interface PostService extends IService<Post> {
|
public interface PostService extends IService<Post> {
|
||||||
void createPost(Post post);
|
void createPost(Post post);
|
||||||
Post getPostById(Long postId);
|
Post getPostById(Long postId, String userOpenid);
|
||||||
|
|
||||||
void updatePost(Long postId, String userId, Post post);
|
void updatePost(Long postId, String userId, Post post);
|
||||||
void deletePost(Long postId, String userId);
|
void deletePost(Long postId, String userId);
|
||||||
|
|
||||||
PageInfo<Post> getPostList(String userId, int pageNum, int pageSize);
|
IPage<Post> getPostList(String userId, int pageNum, int pageSize);
|
||||||
|
|
||||||
PageInfo<Post> getCommunityPostList(Long communityId, int pageNum, int pageSize);
|
IPage<Post> getCommunityPostList(Long communityId, int pageNum, int pageSize);
|
||||||
|
|
||||||
PageInfo<Post> getOfficialPosts(int pageNum, int pageSize);
|
IPage<Post> getOfficialPosts(int pageNum, int pageSize);
|
||||||
|
|
||||||
PageInfo<Post> getNonOfficialPosts(int pageNum, int pageSize);
|
IPage<Post> getNonOfficialPosts(int pageNum, int pageSize);
|
||||||
|
|
||||||
void changePublic(Long postId, Integer isPublic);
|
void changePublic(Long postId, Integer isPublic);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package com.ivmiku.tutorial.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.ivmiku.tutorial.entity.BrowingHistory;
|
||||||
|
import com.ivmiku.tutorial.service.BrowingHistoryService;
|
||||||
|
import com.ivmiku.tutorial.mapper.BrowingHistoryMapper;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author rog
|
||||||
|
* @description 针对表【browing_history】的数据库操作Service实现
|
||||||
|
* @createDate 2024-08-23 11:29:33
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Slf4j
|
||||||
|
public class BrowingHistoryServiceImpl extends ServiceImpl<BrowingHistoryMapper, BrowingHistory>
|
||||||
|
implements BrowingHistoryService{
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(BrowingHistoryServiceImpl.class);
|
||||||
|
@Override
|
||||||
|
public void deleteBrowingRecordById(Long browingId) {
|
||||||
|
logger.info("开始删除浏览记录,浏览记录ID:{}", browingId);
|
||||||
|
BrowingHistory browingHistory = getById(browingId);
|
||||||
|
if (browingHistory != null) {
|
||||||
|
browingHistory.setIsDelete(1); // 标记为已删除
|
||||||
|
updateById(browingHistory);
|
||||||
|
logger.info("浏览记录ID:{} 删除成功", browingId);
|
||||||
|
} else {
|
||||||
|
logger.warn("浏览记录ID:{} 不存在", browingId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteBrowingRecordsByIds(List<Long> browingIds) {
|
||||||
|
logger.info("开始批量删除浏览记录,浏览记录ID列表:{}", browingIds);
|
||||||
|
if (browingIds != null && !browingIds.isEmpty()) {
|
||||||
|
List<BrowingHistory> browingHistories = listByIds(browingIds);
|
||||||
|
if (!browingHistories.isEmpty()) {
|
||||||
|
for (BrowingHistory browingHistory : browingHistories) {
|
||||||
|
browingHistory.setIsDelete(1); // 标记为已删除
|
||||||
|
}
|
||||||
|
updateBatchById(browingHistories); // 批量更新删除状态
|
||||||
|
logger.info("批量删除浏览记录成功");
|
||||||
|
} else {
|
||||||
|
logger.warn("提供的浏览记录ID列表中没有找到匹配的记录");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.warn("浏览记录ID列表为空,无法删除");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -2,6 +2,8 @@ package com.ivmiku.tutorial.service.impl;
|
|||||||
|
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.ivmiku.tutorial.entity.Comment;
|
import com.ivmiku.tutorial.entity.Comment;
|
||||||
@@ -103,16 +105,17 @@ public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> impl
|
|||||||
* @return List<Comment> 返回评论列表
|
* @return List<Comment> 返回评论列表
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public PageInfo<Comment> getPostComments(Long postId, int pageNum, int pageSize) {
|
public IPage<Comment> getPostComments(Long postId, int pageNum, int pageSize) {
|
||||||
logger.info("开始获取帖子ID:{}的评论列表,第{}页,每页{}条", postId, pageNum, pageSize);
|
logger.info("开始获取帖子ID:{}的评论列表,第{}页,每页{}条", postId, pageNum, pageSize);
|
||||||
|
|
||||||
// 设置分页参数
|
// 设置分页参数
|
||||||
PageHelper.startPage(pageNum, pageSize);
|
// PageHelper.startPage(pageNum, pageSize);
|
||||||
|
IPage<Comment> page = new Page<>(pageNum, pageSize);
|
||||||
|
|
||||||
// 查询评论
|
// 查询评论
|
||||||
LambdaQueryWrapper<Comment> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<Comment> wrapper = new LambdaQueryWrapper<>();
|
||||||
wrapper.eq(Comment::getPostId, postId).eq(Comment::getIsDeleted, 0);
|
wrapper.eq(Comment::getPostId, postId).eq(Comment::getIsDeleted, 0);
|
||||||
List<Comment> comments = commentMapper.selectList(wrapper);
|
IPage<Comment> comments = commentMapper.selectPage(page, wrapper);
|
||||||
|
|
||||||
if (comments != null) {
|
if (comments != null) {
|
||||||
logger.info("获取帖子ID:{}的评论列表成功", postId);
|
logger.info("获取帖子ID:{}的评论列表成功", postId);
|
||||||
@@ -121,7 +124,7 @@ public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 使用 PageInfo 包装结果
|
// 使用 PageInfo 包装结果
|
||||||
return new PageInfo<>(comments);
|
return comments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -132,16 +135,16 @@ public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> impl
|
|||||||
* @return List<Comment> 返回回复列表
|
* @return List<Comment> 返回回复列表
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public PageInfo<Comment> getCommentReplies(Long commentId, int pageNum, int pageSize) {
|
public IPage<Comment> getCommentReplies(Long commentId, int pageNum, int pageSize) {
|
||||||
logger.info("开始获取评论ID:{}的回复列表,第{}页,每页{}条", commentId, pageNum, pageSize);
|
logger.info("开始获取评论ID:{}的回复列表,第{}页,每页{}条", commentId, pageNum, pageSize);
|
||||||
|
|
||||||
// 设置分页参数
|
// 设置分页参数
|
||||||
PageHelper.startPage(pageNum, pageSize);
|
// PageHelper.startPage(pageNum, pageSize);
|
||||||
|
IPage<Comment> page = new Page<>(pageNum, pageSize);
|
||||||
// 查询回复
|
// 查询回复
|
||||||
LambdaQueryWrapper<Comment> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<Comment> wrapper = new LambdaQueryWrapper<>();
|
||||||
wrapper.eq(Comment::getParentCommentId, commentId).eq(Comment::getIsDeleted, 0);
|
wrapper.eq(Comment::getParentCommentId, commentId).eq(Comment::getIsDeleted, 0);
|
||||||
List<Comment> replies = commentMapper.selectList(wrapper);
|
IPage<Comment> replies = commentMapper.selectPage(page, wrapper);
|
||||||
|
|
||||||
if (replies != null) {
|
if (replies != null) {
|
||||||
logger.info("获取评论ID:{}的回复列表成功", commentId);
|
logger.info("获取评论ID:{}的回复列表成功", commentId);
|
||||||
@@ -150,7 +153,7 @@ public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 使用 PageInfo 包装结果
|
// 使用 PageInfo 包装结果
|
||||||
return new PageInfo<>(replies);
|
return replies;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 回复评论。
|
* 回复评论。
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package com.ivmiku.tutorial.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.ivmiku.tutorial.entity.Communitytag;
|
||||||
|
import com.ivmiku.tutorial.service.CommunitytagService;
|
||||||
|
import com.ivmiku.tutorial.mapper.CommunitytagMapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author rog
|
||||||
|
* @description 针对表【communitytag】的数据库操作Service实现
|
||||||
|
* @createDate 2024-08-16 09:40:06
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class CommunitytagServiceImpl extends ServiceImpl<CommunitytagMapper, Communitytag>
|
||||||
|
implements CommunitytagService{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createCommunityTag(Communitytag communityTag) {
|
||||||
|
this.save(communityTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateCommunityTag(Long id, Communitytag communityTag) {
|
||||||
|
communityTag.setSmallCTagId(id);
|
||||||
|
this.updateById(communityTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteCommunityTag(Long id) {
|
||||||
|
this.removeById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Communitytag getCommunityTagById(Long id) {
|
||||||
|
return this.getById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Communitytag> getCommunityTagListByCommunityId(Long communityId) {
|
||||||
|
return this.lambdaQuery().eq(Communitytag::getCId, communityId).list();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,15 +1,22 @@
|
|||||||
package com.ivmiku.tutorial.service.impl;
|
package com.ivmiku.tutorial.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.lang.hash.Hash;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.ivmiku.tutorial.entity.Favorite;
|
import com.ivmiku.tutorial.entity.Favorite;
|
||||||
import com.ivmiku.tutorial.entity.Likee;
|
import com.ivmiku.tutorial.entity.Likee;
|
||||||
|
import com.ivmiku.tutorial.entity.Post;
|
||||||
import com.ivmiku.tutorial.mapper.FavoriteMapper;
|
import com.ivmiku.tutorial.mapper.FavoriteMapper;
|
||||||
import com.ivmiku.tutorial.mapper.LikeMapper;
|
import com.ivmiku.tutorial.mapper.LikeMapper;
|
||||||
import com.ivmiku.tutorial.service.InteractionService;
|
import com.ivmiku.tutorial.service.InteractionService;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.ivmiku.tutorial.service.PostService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* InteractionServiceImpl 实现了 InteractionService 接口,处理用户对帖子和评论的收藏与点赞操作。
|
* InteractionServiceImpl 实现了 InteractionService 接口,处理用户对帖子和评论的收藏与点赞操作。
|
||||||
@@ -24,6 +31,9 @@ public class InteractionServiceImpl implements InteractionService {
|
|||||||
@Resource
|
@Resource
|
||||||
private LikeMapper likeMapper;
|
private LikeMapper likeMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PostService postService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void favoritePost(String userOpenid, Long postId) {
|
public void favoritePost(String userOpenid, Long postId) {
|
||||||
log.info("User {} is favoriting post {}", userOpenid, postId);
|
log.info("User {} is favoriting post {}", userOpenid, postId);
|
||||||
@@ -95,4 +105,60 @@ public class InteractionServiceImpl implements InteractionService {
|
|||||||
likeMapper.updateById(likee);
|
likeMapper.updateById(likee);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPage<Post> getFavoritePosts(String userOpenid) {
|
||||||
|
LambdaQueryWrapper<Favorite> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
wrapper.eq(Favorite::getUserOpenid, userOpenid);
|
||||||
|
List<Favorite> favorites = favoriteMapper.selectList(wrapper);
|
||||||
|
if (favorites != null && !favorites.isEmpty()) {
|
||||||
|
List<Long> postIds = favorites.stream().map(Favorite::getPostId).toList();
|
||||||
|
return postService.getPostList(userOpenid, 1, 10);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HashMap<String, Object> getLikeCount(String userOpenid) {
|
||||||
|
HashMap<String, Object> res = new HashMap<>();
|
||||||
|
|
||||||
|
// 获取帖子获赞数
|
||||||
|
Long postLikeCount = likeMapper.getPostLikeCount(userOpenid);
|
||||||
|
// 获取评论获赞数
|
||||||
|
Long commentLikeCount = likeMapper.getCommentLikeCount(userOpenid);
|
||||||
|
|
||||||
|
// 如果帖子获赞数不为空,加入结果
|
||||||
|
if (postLikeCount != null) {
|
||||||
|
res.put("postLikeCount", postLikeCount);
|
||||||
|
} else {
|
||||||
|
res.put("postLikeCount", 0L); // 如果为空,设置为0
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果评论获赞数不为空,加入结果
|
||||||
|
if (commentLikeCount != null) {
|
||||||
|
res.put("commentLikeCount", commentLikeCount);
|
||||||
|
} else {
|
||||||
|
res.put("commentLikeCount", 0L); // 如果为空,设置为0
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算总的获赞数
|
||||||
|
Long totalLikeCount = (postLikeCount == null ? 0 : postLikeCount) +
|
||||||
|
(commentLikeCount == null ? 0 : commentLikeCount);
|
||||||
|
|
||||||
|
res.put("totalLikeCount", totalLikeCount);
|
||||||
|
|
||||||
|
// 获取收藏数量
|
||||||
|
LambdaQueryWrapper<Favorite> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
wrapper.eq(Favorite::getUserOpenid, userOpenid);
|
||||||
|
Long favoriteCount = favoriteMapper.selectCount(wrapper);
|
||||||
|
|
||||||
|
if (favoriteCount != null) {
|
||||||
|
res.put("favoriteCount", favoriteCount);
|
||||||
|
} else {
|
||||||
|
res.put("favoriteCount", 0L); // 如果为空,设置为0
|
||||||
|
}
|
||||||
|
Long myTotalPost = getFavoritePosts(userOpenid).getTotal();
|
||||||
|
res.put("myTotalPost", myTotalPost);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,20 @@
|
|||||||
package com.ivmiku.tutorial.service.impl;
|
package com.ivmiku.tutorial.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.ivmiku.tutorial.entity.BrowingHistory;
|
||||||
import com.ivmiku.tutorial.entity.Post;
|
import com.ivmiku.tutorial.entity.Post;
|
||||||
import com.ivmiku.tutorial.mapper.PostMapper;
|
import com.ivmiku.tutorial.mapper.PostMapper;
|
||||||
|
import com.ivmiku.tutorial.service.BrowingHistoryService;
|
||||||
import com.ivmiku.tutorial.service.PostService;
|
import com.ivmiku.tutorial.service.PostService;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.List;
|
import java.util.Date;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements PostService {
|
public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements PostService {
|
||||||
@@ -23,6 +24,9 @@ public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements Po
|
|||||||
@Autowired
|
@Autowired
|
||||||
private PostMapper postMapper;
|
private PostMapper postMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BrowingHistoryService browingHistoryService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createPost(Post post) {
|
public void createPost(Post post) {
|
||||||
logger.info("开始创建帖子");
|
logger.info("开始创建帖子");
|
||||||
@@ -34,15 +38,24 @@ public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements Po
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Post getPostById(Long postId) {
|
public Post getPostById(Long postId, String userOpenid) {
|
||||||
logger.info("开始根据ID获取帖子详情,帖子ID:{}", postId);
|
logger.info("用户openid:{} 开始根据ID获取帖子详情,帖子ID:{}", userOpenid, postId);
|
||||||
LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<>();
|
|
||||||
wrapper.eq(Post::getIsPublic, 1);
|
// 查找帖子信息
|
||||||
Post post = postMapper.selectById(wrapper);
|
Post post = postMapper.selectById(postId);
|
||||||
if (post == null) {
|
if (post == null || post.getIsDeleted() == 1) {
|
||||||
logger.warn("帖子ID:{}不存在", postId);
|
logger.warn("帖子ID:{}不存在或已删除", postId);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 创建浏览记录
|
||||||
|
BrowingHistory browingHistory = new BrowingHistory();
|
||||||
|
browingHistory.setUserOpenid(userOpenid);
|
||||||
|
browingHistory.setPostId(postId);
|
||||||
|
browingHistory.setCreateAt(new Date());
|
||||||
|
browingHistory.setIsDelete(0); // 未删除标记
|
||||||
|
browingHistoryService.save(browingHistory);
|
||||||
|
logger.info("用户openid:{}的浏览记录创建成功", userOpenid);
|
||||||
return post;
|
return post;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,83 +83,83 @@ public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements Po
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageInfo<Post> getPostList(String userId, int pageNum, int pageSize) {
|
public IPage<Post> getPostList(String userId, int pageNum, int pageSize) {
|
||||||
logger.info("用户ID:{}开始获取帖子列表,第{}页,每页{}条", userId, pageNum, pageSize);
|
logger.info("用户ID:{}开始获取帖子列表,第{}页,每页{}条", userId, pageNum, pageSize);
|
||||||
|
|
||||||
// 设置分页参数
|
// 设置分页参数
|
||||||
PageHelper.startPage(pageNum, pageSize);
|
// PageHelper.startPage(pageNum, pageSize);
|
||||||
|
IPage<Post> page = new Page<>(pageNum, pageSize);
|
||||||
LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<>();
|
||||||
wrapper.eq(Post::getUserOpenid, userId);
|
wrapper.eq(Post::getUserOpenid, userId);
|
||||||
wrapper.eq(Post::getIsDeleted, 0);
|
wrapper.eq(Post::getIsDeleted, 0);
|
||||||
wrapper.eq(Post::getIsPublic, 1);
|
wrapper.eq(Post::getIsPublic, 1);
|
||||||
|
|
||||||
List<Post> posts = postMapper.selectList(wrapper);
|
IPage<Post> posts = postMapper.selectPage(page, wrapper);
|
||||||
|
|
||||||
// 使用PageInfo封装分页结果
|
// 使用PageInfo封装分页结果
|
||||||
PageInfo<Post> pageInfo = new PageInfo<>(posts);
|
// PageInfo<Post> pageInfo = new PageInfo<>(posts);
|
||||||
|
|
||||||
return pageInfo;
|
return posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageInfo<Post> getCommunityPostList(Long communityId, int pageNum, int pageSize) {
|
public IPage<Post> getCommunityPostList(Long communityId, int pageNum, int pageSize) {
|
||||||
logger.info("开始获取社区ID:{}的帖子列表,第{}页,每页{}条", communityId, pageNum, pageSize);
|
logger.info("开始获取社区ID:{}的帖子列表,第{}页,每页{}条", communityId, pageNum, pageSize);
|
||||||
|
|
||||||
// 设置分页参数
|
// 设置分页参数
|
||||||
PageHelper.startPage(pageNum, pageSize);
|
// PageHelper.startPage(pageNum, pageSize);
|
||||||
|
IPage<Post> page = new Page<>(pageNum, pageSize);
|
||||||
LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<>();
|
||||||
wrapper.eq(Post::getCommunityId, communityId);
|
wrapper.eq(Post::getCommunityId, communityId);
|
||||||
wrapper.eq(Post::getIsDeleted, 0);
|
wrapper.eq(Post::getIsDeleted, 0);
|
||||||
wrapper.eq(Post::getIsPublic, 1);
|
wrapper.eq(Post::getIsPublic, 1);
|
||||||
|
|
||||||
List<Post> posts = postMapper.selectList(wrapper);
|
IPage<Post> posts = postMapper.selectPage(page, wrapper);
|
||||||
|
|
||||||
// 使用PageInfo封装分页结果
|
// 使用PageInfo封装分页结果
|
||||||
PageInfo<Post> pageInfo = new PageInfo<>(posts);
|
// PageInfo<Post> pageInfo = new PageInfo<>(posts);
|
||||||
|
|
||||||
return pageInfo;
|
return posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageInfo<Post> getOfficialPosts(int pageNum, int pageSize) {
|
public IPage<Post> getOfficialPosts(int pageNum, int pageSize) {
|
||||||
logger.info("开始获取所有官方创建的帖子,第{}页,每页{}条", pageNum, pageSize);
|
logger.info("开始获取所有官方创建的帖子,第{}页,每页{}条", pageNum, pageSize);
|
||||||
|
|
||||||
// 设置分页参数
|
// 设置分页参数
|
||||||
PageHelper.startPage(pageNum, pageSize);
|
// PageHelper.startPage(pageNum, pageSize);
|
||||||
|
IPage<Post> page = new Page<>(pageNum, pageSize);
|
||||||
LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<>();
|
||||||
wrapper.eq(Post::getIsOfficial, 1);
|
wrapper.eq(Post::getIsOfficial, 1);
|
||||||
wrapper.eq(Post::getIsDeleted, 0);
|
wrapper.eq(Post::getIsDeleted, 0);
|
||||||
wrapper.eq(Post::getIsPublic, 1);
|
wrapper.eq(Post::getIsPublic, 1);
|
||||||
|
|
||||||
List<Post> posts = postMapper.selectList(wrapper);
|
IPage<Post> posts = postMapper.selectPage(page, wrapper);
|
||||||
|
|
||||||
// 使用PageInfo封装分页结果
|
// 使用PageInfo封装分页结果
|
||||||
PageInfo<Post> pageInfo = new PageInfo<>(posts);
|
// PageInfo<Post> pageInfo = new PageInfo<>(posts);
|
||||||
|
|
||||||
return pageInfo;
|
return posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageInfo<Post> getNonOfficialPosts(int pageNum, int pageSize) {
|
public IPage<Post> getNonOfficialPosts(int pageNum, int pageSize) {
|
||||||
logger.info("开始获取所有非官方创建的帖子,第{}页,每页{}条", pageNum, pageSize);
|
logger.info("开始获取所有非官方创建的帖子,第{}页,每页{}条", pageNum, pageSize);
|
||||||
|
|
||||||
// 设置分页参数
|
// 设置分页参数
|
||||||
PageHelper.startPage(pageNum, pageSize);
|
// PageHelper.startPage(pageNum, pageSize);
|
||||||
|
IPage<Post> page = new Page<>(pageNum, pageSize);
|
||||||
LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<>();
|
||||||
wrapper.eq(Post::getIsOfficial, 0);
|
wrapper.eq(Post::getIsOfficial, 0);
|
||||||
wrapper.eq(Post::getIsDeleted, 0);
|
wrapper.eq(Post::getIsDeleted, 0);
|
||||||
wrapper.eq(Post::getIsPublic, 1);
|
wrapper.eq(Post::getIsPublic, 1);
|
||||||
|
|
||||||
List<Post> posts = postMapper.selectList(wrapper);
|
IPage<Post> posts = postMapper.selectPage(page, wrapper);
|
||||||
|
|
||||||
// 使用PageInfo封装分页结果
|
// 使用PageInfo封装分页结果
|
||||||
PageInfo<Post> pageInfo = new PageInfo<>(posts);
|
// PageInfo<Post> pageInfo = new PageInfo<>(posts);
|
||||||
|
|
||||||
return pageInfo;
|
return posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -27,3 +27,7 @@ minio.accessKey=minio_root
|
|||||||
minio.secretKey=minio_123456
|
minio.secretKey=minio_123456
|
||||||
minio.bucketName=haixia
|
minio.bucketName=haixia
|
||||||
|
|
||||||
|
## Nacos??
|
||||||
|
#spring.cloud.nacos.discovery.server-addr=/192.168.146.1:8848
|
||||||
|
#dubbo.registry.address=nacos:///192.168.146.1:8848
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.ivmiku.tutorial.mapper.BrowingHistoryMapper">
|
||||||
|
|
||||||
|
<resultMap id="BaseResultMap" type="com.ivmiku.tutorial.entity.BrowingHistory">
|
||||||
|
<id property="browingId" column="browing_id" jdbcType="BIGINT"/>
|
||||||
|
<result property="userOpenid" column="user_openid" jdbcType="VARCHAR"/>
|
||||||
|
<result property="postId" column="post_id" jdbcType="BIGINT"/>
|
||||||
|
<result property="createAt" column="create_at" jdbcType="TIMESTAMP"/>
|
||||||
|
<result property="isDelete" column="is_delete" jdbcType="TINYINT"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<sql id="Base_Column_List">
|
||||||
|
browing_id,user_openid,post_id,
|
||||||
|
create_at,is_delete
|
||||||
|
</sql>
|
||||||
|
</mapper>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.ivmiku.tutorial.mapper.CommunitytagMapper">
|
||||||
|
|
||||||
|
<resultMap id="BaseResultMap" type="com.ivmiku.tutorial.entity.Communitytag">
|
||||||
|
<id property="smallCTagId" column="small_c_tag_id" jdbcType="BIGINT"/>
|
||||||
|
<result property="cTagName" column="c_tag_name" jdbcType="VARCHAR"/>
|
||||||
|
<result property="cId" column="c_id" jdbcType="BIGINT"/>
|
||||||
|
<result property="isDelete" column="is_delete" jdbcType="TINYINT"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<sql id="Base_Column_List">
|
||||||
|
small_c_tag_id,c_tag_name,c_id,
|
||||||
|
is_delete
|
||||||
|
</sql>
|
||||||
|
</mapper>
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
|
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
|
||||||
|
<version>3.5.7</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba.cloud</groupId>
|
<groupId>com.alibaba.cloud</groupId>
|
||||||
@@ -103,5 +104,10 @@
|
|||||||
<artifactId>tencentcloud-sdk-java-tts</artifactId>
|
<artifactId>tencentcloud-sdk-java-tts</artifactId>
|
||||||
<version>3.1.1076</version>
|
<version>3.1.1076</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.tencentcloudapi</groupId>
|
||||||
|
<artifactId>tencentcloud-sdk-java-asr</artifactId>
|
||||||
|
<version>3.1.1083</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
@@ -24,11 +24,4 @@ public class AssistantController {
|
|||||||
}
|
}
|
||||||
return Result.ok(map);
|
return Result.ok(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/tts")
|
|
||||||
public Object textToSpeech(@RequestParam String input) {
|
|
||||||
Map<String, Object> map = new HashMap<>();
|
|
||||||
map.put("content", assistantService.textToSpeech(input));
|
|
||||||
return Result.ok(map);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@TableName("guidance")
|
||||||
|
@Data
|
||||||
|
public class Guidance {
|
||||||
|
@TableId
|
||||||
|
private String id;
|
||||||
|
private String tag;
|
||||||
|
private String content;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.ivmiku.tutorial.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.ivmiku.tutorial.entity.Guidance;
|
||||||
|
|
||||||
|
public interface GuidanceMapper extends BaseMapper<Guidance> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,11 +2,15 @@ package com.ivmiku.tutorial.service;
|
|||||||
|
|
||||||
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpRequest;
|
||||||
import cn.hutool.http.HttpResponse;
|
import cn.hutool.http.HttpResponse;
|
||||||
import com.alibaba.fastjson2.JSON;
|
|
||||||
import com.alibaba.fastjson2.JSONArray;
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.ivmiku.tutorial.entity.Guidance;
|
||||||
|
import com.ivmiku.tutorial.mapper.GuidanceMapper;
|
||||||
import com.ivmiku.tutorial.utils.SnowflakeUtil;
|
import com.ivmiku.tutorial.utils.SnowflakeUtil;
|
||||||
import com.tencentcloudapi.common.AbstractModel;
|
import com.tencentcloudapi.asr.v20190614.AsrClient;
|
||||||
|
import com.tencentcloudapi.asr.v20190614.models.SentenceRecognitionRequest;
|
||||||
|
import com.tencentcloudapi.asr.v20190614.models.SentenceRecognitionResponse;
|
||||||
import com.tencentcloudapi.common.Credential;
|
import com.tencentcloudapi.common.Credential;
|
||||||
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
|
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
|
||||||
import com.tencentcloudapi.common.profile.ClientProfile;
|
import com.tencentcloudapi.common.profile.ClientProfile;
|
||||||
@@ -14,18 +18,23 @@ import com.tencentcloudapi.common.profile.HttpProfile;
|
|||||||
import com.tencentcloudapi.tts.v20190823.TtsClient;
|
import com.tencentcloudapi.tts.v20190823.TtsClient;
|
||||||
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceRequest;
|
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceRequest;
|
||||||
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceResponse;
|
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceResponse;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class AssistantService {
|
public class AssistantService {
|
||||||
|
@Resource
|
||||||
|
private GuidanceMapper guidanceMapper;
|
||||||
|
|
||||||
private final String auth = "bad1f6cad39a4c26aa9fe9e4324e096f:ZDczMDIwOTg3NjlhODdmYWVjYTY0YjM1";
|
private final String auth = "bad1f6cad39a4c26aa9fe9e4324e096f:ZDczMDIwOTg3NjlhODdmYWVjYTY0YjM1";
|
||||||
private final String secretId = "AKID09INNYxYEFFJH3g9VhljVF3qbDiFdx50";
|
private final String secretId = "AKID09INNYxYEFFJH3g9VhljVF3qbDiFdx50";
|
||||||
private final String secretKey = "KajjcNyNaaUCqQroqpzNoMtTHNj4Lbil";
|
private final String secretKey = "KajjcNyNaaUCqQroqpzNoMtTHNj4Lbil";
|
||||||
|
|
||||||
public Map<String, Object> getResponse(String userInput) {
|
public Map<String, Object> getAiResponse(String userInput) {
|
||||||
Map<String, Object> message1 = new HashMap<>();
|
Map<String, Object> message1 = new HashMap<>();
|
||||||
message1.put("role", "system");
|
message1.put("role", "system");
|
||||||
message1.put("content", "模仿语音助手,对用户的问题给出简短的回答");
|
message1.put("content", "模仿语音助手,对用户的问题给出简短的回答");
|
||||||
@@ -74,4 +83,75 @@ public class AssistantService {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String speechRecognition(String content, Integer length) {
|
||||||
|
try{
|
||||||
|
Credential cred = new Credential(secretId, secretKey);
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("asr.tencentcloudapi.com");
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
AsrClient client = new AsrClient(cred, "", clientProfile);
|
||||||
|
SentenceRecognitionRequest req = new SentenceRecognitionRequest();
|
||||||
|
req.setEngSerViceType("16k_zh");
|
||||||
|
req.setSourceType(1L);
|
||||||
|
req.setVoiceFormat("wav");
|
||||||
|
req.setData(content);
|
||||||
|
req.setDataLen(Long.valueOf(length));
|
||||||
|
SentenceRecognitionResponse resp = client.SentenceRecognition(req);
|
||||||
|
return resp.getResult();
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String searchGuidance(String tag) {
|
||||||
|
QueryWrapper<Guidance> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.like("tag", tag);
|
||||||
|
List<Guidance> list = guidanceMapper.selectList(queryWrapper);
|
||||||
|
if (list.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return list.getFirst().getContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String extractTag(String query) {
|
||||||
|
Map<String, Object> message1 = new HashMap<>();
|
||||||
|
message1.put("role", "system");
|
||||||
|
message1.put("content", "根据给出的句子的意思,从以下标签中返回最匹配的一个:安全带、安检、飞机");
|
||||||
|
Map<String, Object> message2 = new HashMap<>();
|
||||||
|
message2.put("role", "user");
|
||||||
|
message2.put("content", query);
|
||||||
|
JSONArray array = new JSONArray();
|
||||||
|
array.add(message1);
|
||||||
|
array.add(message2);
|
||||||
|
JSONObject params = new JSONObject();
|
||||||
|
params.put("model", "general");
|
||||||
|
params.put("messages", array);
|
||||||
|
HttpResponse response = HttpRequest.post("https://spark-api-open.xf-yun.com/v1/chat/completions")
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
|
.header("Authorization", "Bearer " + auth)
|
||||||
|
.body(params.toJSONString())
|
||||||
|
.execute();
|
||||||
|
JSONObject result = JSONObject.parseObject(response.body());
|
||||||
|
response.close();
|
||||||
|
if (result.getInteger("code") != 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
JSONArray choices = result.getJSONArray("choices");
|
||||||
|
JSONObject message = choices.getJSONObject(0);
|
||||||
|
return String.valueOf(message.getJSONObject("message"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Object> getResponse(String query) {
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
String tag = extractTag(query);
|
||||||
|
String content;
|
||||||
|
content = searchGuidance(tag);
|
||||||
|
if (content != null) {
|
||||||
|
result.put("content", content);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return getAiResponse(query);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,6 +117,14 @@
|
|||||||
<artifactId>commons</artifactId>
|
<artifactId>commons</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-amqp</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.ivmiku.tutorial.config;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||||
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@MapperScan("com.ivmiku.tutorial.mapper")
|
||||||
|
public class MybatisPlusConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加分页插件
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||||
|
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||||
|
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
|
||||||
|
//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
|
||||||
|
return interceptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.ivmiku.tutorial.config;
|
||||||
|
|
||||||
|
import org.springframework.amqp.core.Binding;
|
||||||
|
import org.springframework.amqp.core.BindingBuilder;
|
||||||
|
import org.springframework.amqp.core.FanoutExchange;
|
||||||
|
import org.springframework.amqp.core.Queue;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class RabbitMqConfig {
|
||||||
|
@Bean
|
||||||
|
public Queue queue1() {
|
||||||
|
return new Queue("queue1",true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FanoutExchange exchange1() {
|
||||||
|
return new FanoutExchange("exchange1",true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Binding binding1() {
|
||||||
|
return BindingBuilder.bind(queue1()).to(exchange1());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.ivmiku.tutorial.config;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.interceptor.SaInterceptor;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class SaTokenConfigure implements WebMvcConfigurer {
|
||||||
|
@Override
|
||||||
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
|
// 注册 Sa-Token 拦截器,打开注解式鉴权功能
|
||||||
|
registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.ivmiku.tutorial.config;
|
||||||
|
|
||||||
|
import jakarta.servlet.ServletContext;
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import org.springframework.boot.web.servlet.ServletContextInitializer;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||||
|
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;
|
||||||
|
import org.springframework.web.util.WebAppRootListener;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class WebSocketConfig implements ServletContextInitializer {
|
||||||
|
@Bean
|
||||||
|
public ServerEndpointExporter serverEndpointExporter (){
|
||||||
|
return new ServerEndpointExporter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartup(ServletContext servletContext) throws ServletException {
|
||||||
|
servletContext.addListener(WebAppRootListener.class);
|
||||||
|
servletContext.setInitParameter("org.apache.tomcat.websocket.textBufferSize","102400000");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ServletServerContainerFactoryBean createWebSocketContainer() {
|
||||||
|
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
|
||||||
|
// 在此处设置bufferSize
|
||||||
|
container.setMaxTextMessageBufferSize(50*1024*1024);
|
||||||
|
container.setMaxBinaryMessageBufferSize(50*1024*1024);
|
||||||
|
container.setMaxSessionIdleTimeout(15 * 60000L);
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package com.ivmiku.tutorial.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.ivmiku.tutorial.entity.HistoryQuery;
|
||||||
|
import com.ivmiku.tutorial.response.Result;
|
||||||
|
import com.ivmiku.tutorial.service.MessageService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.text.ParseException;
|
||||||
|
|
||||||
|
@SaCheckLogin
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/message")
|
||||||
|
public class MessageController {
|
||||||
|
@Autowired
|
||||||
|
private MessageService messageService;
|
||||||
|
|
||||||
|
@PostMapping("/history")
|
||||||
|
public Object getChatHistory(@RequestBody HistoryQuery input) throws ParseException {
|
||||||
|
Result result = Result.ok();
|
||||||
|
if (input.getStartDate() != null && input.getEndDate() != null) {
|
||||||
|
result.setData(messageService.getChatHistoryByDate(input.getUser1Id(), input.getUser2Id(), input.getStartDate(), input.getEndDate(), input.getPage(), input.getSize()));
|
||||||
|
} else {
|
||||||
|
if (input.getPage() <= 0 || input.getSize() <=0) {
|
||||||
|
return Result.error("请输入合法分页参数");
|
||||||
|
} else {
|
||||||
|
result.setData(messageService.getChatHistory(input.getUser1Id(), input.getUser2Id(), input.getPage(), input.getSize()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return JSON.toJSON(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/list")
|
||||||
|
public Object getChatList(@RequestParam String user_id, @RequestParam int page, @RequestParam int size) {
|
||||||
|
return Result.ok(messageService.getChatList(user_id, page, size));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.ivmiku.tutorial.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import com.ivmiku.tutorial.entity.IgnoreUser;
|
||||||
|
import com.ivmiku.tutorial.response.Result;
|
||||||
|
import com.ivmiku.tutorial.service.RelationService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
@SaCheckLogin
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/relation")
|
||||||
|
public class RelationController {
|
||||||
|
@Autowired
|
||||||
|
private RelationService relationService;
|
||||||
|
|
||||||
|
@PostMapping("/ignore")
|
||||||
|
public Object ignoreUser(@RequestBody IgnoreUser input) {
|
||||||
|
relationService.IgnoreUser(input.getUserId(), input.getToIgnore());
|
||||||
|
return Result.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("subscribe")
|
||||||
|
public Object subscribe(@RequestParam String subId) {
|
||||||
|
String userId = (String) StpUtil.getLoginId();
|
||||||
|
relationService.subscribe(userId, subId);
|
||||||
|
return Result.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("fan")
|
||||||
|
public Object getFanList(@RequestParam int page, @RequestParam int size) {
|
||||||
|
String userId = (String) StpUtil.getLoginId();
|
||||||
|
return Result.ok(relationService.getFanList(userId, page, size));
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("follow")
|
||||||
|
public Object getFollowList(@RequestParam int page, @RequestParam int size) {
|
||||||
|
String userId = (String) StpUtil.getLoginId();
|
||||||
|
return Result.ok(relationService.getSubList(userId, page, size));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
package com.ivmiku.tutorial.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.ivmiku.tutorial.entity.Message;
|
||||||
|
import com.ivmiku.tutorial.service.MessageService;
|
||||||
|
import com.ivmiku.tutorial.service.RelationService;
|
||||||
|
import com.ivmiku.tutorial.utils.DateUtil;
|
||||||
|
import com.ivmiku.tutorial.utils.MessageUtil;
|
||||||
|
import jakarta.websocket.*;
|
||||||
|
import jakarta.websocket.server.PathParam;
|
||||||
|
import jakarta.websocket.server.ServerEndpoint;
|
||||||
|
import org.springframework.amqp.core.ExchangeTypes;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.Exchange;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.Queue;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.QueueBinding;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
import static jakarta.websocket.CloseReason.CloseCodes.CLOSED_ABNORMALLY;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@ServerEndpoint(value = "/chat/{satoken}")
|
||||||
|
public class WebSocketServer implements ApplicationContextAware {
|
||||||
|
public static Map<String, Session> sessionMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
public static Map<String, Integer> controlMap = new HashMap<>();
|
||||||
|
|
||||||
|
private static ApplicationContext applicationContext;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MessageService messageService;
|
||||||
|
|
||||||
|
private RabbitTemplate rabbitTemplate;
|
||||||
|
|
||||||
|
private RelationService relationService;
|
||||||
|
|
||||||
|
@OnMessage
|
||||||
|
public void onMessage(String message, Session session) throws IOException {
|
||||||
|
Message msg = JSON.parseObject(message, Message.class);
|
||||||
|
msg.setDate(DateUtil.getCurrentTime());
|
||||||
|
if (MessageUtil.checkMessage(msg.getMessage())) {
|
||||||
|
session.getBasicRemote().sendText("发送的信息含有敏感词,请进行调整");
|
||||||
|
if (!controlMap.containsKey(msg.getFromId())){
|
||||||
|
controlMap.put(msg.getFromId(), 0);
|
||||||
|
}
|
||||||
|
if (controlMap.get(msg.getFromId()) == 4){
|
||||||
|
session.getBasicRemote().sendText("由于多次违反社区规则,您已被封禁1小时");
|
||||||
|
session.close(new CloseReason(CLOSED_ABNORMALLY, "账号被封禁"));
|
||||||
|
StpUtil.kickout(msg.getFromId());
|
||||||
|
StpUtil.disable(msg.getFromId(), 3600);
|
||||||
|
controlMap.put(msg.getFromId(), 0);
|
||||||
|
}
|
||||||
|
controlMap.put(msg.getFromId(), controlMap.get(msg.getFromId())+1);
|
||||||
|
} else
|
||||||
|
if (relationService.ifIgnored(msg.getToId(), msg.getFromId())) {
|
||||||
|
session.getBasicRemote().sendText("您已被对方屏蔽");
|
||||||
|
} else {
|
||||||
|
rabbitTemplate.convertAndSend("exchange1", "", JSON.toJSONString(msg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@OnOpen
|
||||||
|
public void onOpen(Session session, EndpointConfig endpointConfig, @PathParam("satoken") String satoken) throws IOException {
|
||||||
|
String userId = (String) StpUtil.getLoginIdByToken(satoken);
|
||||||
|
if (userId == null) {
|
||||||
|
session.getBasicRemote().sendText("Invalid Token");
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
this.messageService = WebSocketServer.applicationContext.getBean(MessageService.class);
|
||||||
|
this.rabbitTemplate = WebSocketServer.applicationContext.getBean(RabbitTemplate.class);
|
||||||
|
this.relationService = WebSocketServer.applicationContext.getBean(RelationService.class);
|
||||||
|
sessionMap.put(userId, session);
|
||||||
|
List<Message> unreadList = messageService.getUnreadMsg(userId);
|
||||||
|
for(Message msg : unreadList) {
|
||||||
|
session.getBasicRemote().sendText(JSON.toJSONString(msg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClose
|
||||||
|
public void onClose(CloseReason closeReason, Session session){
|
||||||
|
sessionMap.remove(session.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnError
|
||||||
|
public void onError(Throwable throwable) throws IOException {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendToUser(Message msg) throws IOException, ParseException {
|
||||||
|
if (sessionMap.containsKey(msg.getToId())){
|
||||||
|
sessionMap.get(msg.getToId()).getBasicRemote().sendText(JSON.toJSONString(msg));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
messageService.insertUnreadMsg(msg.getToId(), msg);
|
||||||
|
}
|
||||||
|
msg.setChatId(messageService.getChatId(msg.getFromId(), msg.getToId()));
|
||||||
|
messageService.insertToMysql(msg);
|
||||||
|
messageService.insertToRedis(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendToPublic(Message msg) throws IOException, ParseException {
|
||||||
|
for (Session session : sessionMap.values()) {
|
||||||
|
session.getBasicRemote().sendText(JSON.toJSONString(msg));
|
||||||
|
}
|
||||||
|
msg.setChatId(messageService.getChatId(msg.getFromId(), msg.getToId()));
|
||||||
|
messageService.insertToMysql(msg);
|
||||||
|
messageService.insertToRedis(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||||
|
WebSocketServer.applicationContext = applicationContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RabbitHandler
|
||||||
|
@RabbitListener(bindings = @QueueBinding(
|
||||||
|
value = @Queue(),
|
||||||
|
exchange = @Exchange(value = "exchange1",type = ExchangeTypes.FANOUT)
|
||||||
|
))
|
||||||
|
public void sendMsg(String message) throws IOException, ParseException {
|
||||||
|
Message msg = JSON.parseObject(message, Message.class);
|
||||||
|
if (sessionMap.containsKey(msg.getToId())) {
|
||||||
|
sessionMap.get(msg.getToId()).getBasicRemote().sendText(JSON.toJSONString(msg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName("chatid")
|
||||||
|
public class ChatId {
|
||||||
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
|
private String id;
|
||||||
|
private String user1Id;
|
||||||
|
private String user2Id;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TableName("friend")
|
||||||
|
public class Friend {
|
||||||
|
private String user1Id;
|
||||||
|
private String user2Id;
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class FriendQuery {
|
||||||
|
private String user1Id;
|
||||||
|
private String user2Id;
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class HistoryQuery {
|
||||||
|
private String user1Id;
|
||||||
|
private String user2Id;
|
||||||
|
private int page;
|
||||||
|
private int size;
|
||||||
|
private String startDate;
|
||||||
|
private String endDate;
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.annotation.JSONField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TableName("blacklist")
|
||||||
|
public class IgnoreUser {
|
||||||
|
@JSONField(ordinal = 1)
|
||||||
|
private String userId;
|
||||||
|
@JSONField(ordinal = 2)
|
||||||
|
private String toIgnore;
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.annotation.JSONField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName("message")
|
||||||
|
public class Message implements Serializable {
|
||||||
|
@JSONField(ordinal = 1)
|
||||||
|
private String chatId;
|
||||||
|
@JSONField(ordinal = 2)
|
||||||
|
private String fromId;
|
||||||
|
@JSONField(ordinal = 3)
|
||||||
|
private String toId;
|
||||||
|
@JSONField(ordinal = 4)
|
||||||
|
private String message;
|
||||||
|
@JSONField(ordinal = 5)
|
||||||
|
private String date;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class SubUser {
|
||||||
|
private String id;
|
||||||
|
private String username;
|
||||||
|
private String avatarUrl;
|
||||||
|
|
||||||
|
public static SubUser setUser(User user) {
|
||||||
|
SubUser subUser = new SubUser();
|
||||||
|
subUser.setId(user.getOpenid());
|
||||||
|
subUser.setUsername(user.getNickname());
|
||||||
|
subUser.setAvatarUrl(user.getAvatarUrl());
|
||||||
|
return subUser;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.ivmiku.tutorial.entity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@TableName("subscribe")
|
||||||
|
@Data
|
||||||
|
public class Subscribe {
|
||||||
|
private Long id;
|
||||||
|
private Long subId;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.ivmiku.tutorial.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.ivmiku.tutorial.entity.IgnoreUser;
|
||||||
|
|
||||||
|
public interface BlackListMapper extends BaseMapper<IgnoreUser> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.ivmiku.tutorial.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.ivmiku.tutorial.entity.ChatId;
|
||||||
|
|
||||||
|
public interface ChatIdMapper extends BaseMapper<ChatId> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.ivmiku.tutorial.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.ivmiku.tutorial.entity.Friend;
|
||||||
|
|
||||||
|
public interface FriendMapper extends BaseMapper<Friend> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.ivmiku.tutorial.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.ivmiku.tutorial.entity.Message;
|
||||||
|
|
||||||
|
public interface MessageMapper extends BaseMapper<Message> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.ivmiku.tutorial.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.ivmiku.tutorial.entity.Subscribe;
|
||||||
|
|
||||||
|
public interface SubscribeMapper extends BaseMapper<Subscribe> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
package com.ivmiku.tutorial.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.ivmiku.tutorial.entity.ChatId;
|
||||||
|
import com.ivmiku.tutorial.entity.Message;
|
||||||
|
import com.ivmiku.tutorial.mapper.ChatIdMapper;
|
||||||
|
import com.ivmiku.tutorial.mapper.MessageMapper;
|
||||||
|
import com.ivmiku.tutorial.utils.RedisUtil;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class MessageService {
|
||||||
|
@Autowired
|
||||||
|
private MessageMapper messageMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ChatIdMapper chatIdMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取会话id
|
||||||
|
* @param user1Id 用户1id
|
||||||
|
* @param user2Id 用户2id
|
||||||
|
* @return 查询结果
|
||||||
|
*/
|
||||||
|
public String getChatId(String user1Id, String user2Id) {
|
||||||
|
if (Objects.equals(user1Id, "public") || Objects.equals(user2Id, "public")) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
String id1, id2;
|
||||||
|
if (user1Id.compareTo(user2Id) < 0) {
|
||||||
|
id1 = user1Id;
|
||||||
|
id2 = user2Id;
|
||||||
|
} else {
|
||||||
|
id1 = user2Id;
|
||||||
|
id2 = user1Id;
|
||||||
|
}
|
||||||
|
QueryWrapper<ChatId> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("user1_id", id1);
|
||||||
|
queryWrapper.eq("user2_id", id2);
|
||||||
|
ChatId chatId = chatIdMapper.selectOne(queryWrapper);
|
||||||
|
if (chatId == null) {
|
||||||
|
chatId = new ChatId();
|
||||||
|
chatId.setUser1Id(id1);
|
||||||
|
chatId.setUser2Id(id2);
|
||||||
|
chatIdMapper.insert(chatId);
|
||||||
|
}
|
||||||
|
return chatIdMapper.selectOne(queryWrapper).getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 聊天记录写redis
|
||||||
|
* @param msg 要写入的信息
|
||||||
|
* @throws ParseException
|
||||||
|
*/
|
||||||
|
@Async
|
||||||
|
public void insertToRedis(Message msg) throws ParseException {
|
||||||
|
if (!(msg.getMessage().length() >1000)) {
|
||||||
|
if (redisUtil.getZsetSize("history:" + msg.getChatId()) >= 50) {
|
||||||
|
redisUtil.zsetRightPop("history:" + msg.getChatId());
|
||||||
|
}
|
||||||
|
redisUtil.zsetAdd("history:" + msg.getChatId(), msg);
|
||||||
|
redisUtil.setExpireTime("history:" + msg.getChatId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 聊天记录写入mysql
|
||||||
|
* @param msg 要写入的消息
|
||||||
|
*/
|
||||||
|
@Async
|
||||||
|
public void insertToMysql(Message msg) {
|
||||||
|
if (!(msg.getMessage().length() >1000)) {
|
||||||
|
messageMapper.insert(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 未读消息写入redis
|
||||||
|
* @param userId 用户id
|
||||||
|
* @param msg 未读消息
|
||||||
|
*/
|
||||||
|
@Async
|
||||||
|
public void insertUnreadMsg(String userId, Message msg) {
|
||||||
|
redisUtil.listAdd("unread:" + userId, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取未读消息列表
|
||||||
|
* @param userId 用户id
|
||||||
|
* @return 查询结果
|
||||||
|
*/
|
||||||
|
public List<Message> getUnreadMsg(String userId) {
|
||||||
|
List<Message> result = redisUtil.listGet("unread:" + userId, 0, -1);
|
||||||
|
redisUtil.listClear(userId);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从数据库获取聊天记录
|
||||||
|
* @param chatId 会话id
|
||||||
|
* @param current 分页参数
|
||||||
|
* @param size 分页参数
|
||||||
|
* @return 返回的查询结果
|
||||||
|
*/
|
||||||
|
public List<Message> getChatHistoryFromDB(String chatId, int current, int size) {
|
||||||
|
QueryWrapper<Message> queryWrapper = new QueryWrapper<>();
|
||||||
|
Page<Message> page = new Page<>(current, size);
|
||||||
|
queryWrapper.eq("chat_id", chatId);
|
||||||
|
queryWrapper.orderByDesc("date");
|
||||||
|
return messageMapper.selectPage(page, queryWrapper).getRecords();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从数据库获取聊天记录,查询一定范围内
|
||||||
|
* @param chatId 会话id
|
||||||
|
* @param current 分页参数
|
||||||
|
* @param size 分页参数
|
||||||
|
* @param startDate 开始日期
|
||||||
|
* @param endDate 结束日期
|
||||||
|
* @return 返回的查询结果
|
||||||
|
*/
|
||||||
|
public List<Message> getChatHistoryFromDBByDate(String chatId, int current, int size, String startDate, String endDate) {
|
||||||
|
QueryWrapper<Message> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.between("date", startDate, endDate);
|
||||||
|
Page<Message> page = new Page<>(current, size);
|
||||||
|
queryWrapper.eq("chat_id", chatId);
|
||||||
|
queryWrapper.orderByDesc("date");
|
||||||
|
return messageMapper.selectPage(page, queryWrapper).getRecords();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* redis获取聊天记录
|
||||||
|
* @param chatId 会话id
|
||||||
|
* @param s 开始
|
||||||
|
* @param e 结束
|
||||||
|
* @return 查询结果
|
||||||
|
*/
|
||||||
|
public List<Message> getChatHistoryFromRedis(String chatId, int s, int e) {
|
||||||
|
return redisUtil.zsetGet("history:" + chatId, s, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询聊天记录
|
||||||
|
* @param user1Id 用户1id
|
||||||
|
* @param user2Id 用户2id
|
||||||
|
* @param page 分页参数
|
||||||
|
* @param size 分页参数
|
||||||
|
* @return 查询结果
|
||||||
|
* @throws ParseException
|
||||||
|
*/
|
||||||
|
public List<Message> getChatHistory(String user1Id, String user2Id, int page, int size) throws ParseException {
|
||||||
|
int start = page * size - size;
|
||||||
|
int end = page * size - 1;
|
||||||
|
String chatId = getChatId(user1Id, user2Id);
|
||||||
|
loadCache(chatId);
|
||||||
|
List<Message> result = new ArrayList<>(redisUtil.zsetGet("history:" + chatId, start, end));
|
||||||
|
if ((end -start + 1) == result.size()) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
int redisSize = result.size();
|
||||||
|
List<Message> dbList = getChatHistoryFromDB(chatId, ((end - result.size()) / size) + 1, size);
|
||||||
|
result.addAll(dbList.subList(redisSize, dbList.size()));
|
||||||
|
redisUtil.refreshExpire("history:" + chatId);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在一定时间范围内查询聊天记录
|
||||||
|
* @param user1Id 用户1id
|
||||||
|
* @param user2Id 用户2id
|
||||||
|
* @param startDate 开始日期
|
||||||
|
* @param endDate 结束日期
|
||||||
|
* @param page 分页参数
|
||||||
|
* @param size 分页参数
|
||||||
|
* @return 查询结果
|
||||||
|
* @throws ParseException
|
||||||
|
*/
|
||||||
|
public List<Message> getChatHistoryByDate(String user1Id, String user2Id, String startDate, String endDate, int page, int size) throws ParseException {
|
||||||
|
int start = page * size - size;
|
||||||
|
int end = page * size - 1;
|
||||||
|
String chatId = getChatId(user1Id, user2Id);
|
||||||
|
loadCache(chatId);
|
||||||
|
List<Message> result = new ArrayList<>(redisUtil.zsetGetByDate("history:" + chatId, startDate, endDate, start, size));
|
||||||
|
redisUtil.refreshExpire("history:" + chatId);
|
||||||
|
if (result.size() == (end - start + 1)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
int redisSize = result.size();
|
||||||
|
List<Message> dbList = getChatHistoryFromDBByDate(chatId, ((end - result.size()) / size) + 1, size, startDate, endDate).subList(result.size(), size);
|
||||||
|
result.addAll(dbList.subList(redisSize, dbList.size()));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取会话列表
|
||||||
|
* @param userId 用户id
|
||||||
|
* @param current 分页参数
|
||||||
|
* @param size 分页参数
|
||||||
|
* @return 查询结果
|
||||||
|
*/
|
||||||
|
public List<ChatId> getChatList(String userId, int current, int size) {
|
||||||
|
QueryWrapper<ChatId> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("user1_id", userId).or().eq("user2_id", userId);
|
||||||
|
queryWrapper.orderByDesc("id");
|
||||||
|
Page<ChatId> page = new Page<>(current, size);
|
||||||
|
return chatIdMapper.selectPage(page, queryWrapper).getRecords();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载聊天记录到redis
|
||||||
|
* @param chatId 会话id
|
||||||
|
* @throws ParseException
|
||||||
|
*/
|
||||||
|
public void loadCache(String chatId) throws ParseException {
|
||||||
|
if (!redisUtil.ifExist("history:" + chatId)) {
|
||||||
|
List<Message> list = getChatHistoryFromDB(chatId, 1, 20);
|
||||||
|
for (Message message : list) {
|
||||||
|
insertToRedis(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
package com.ivmiku.tutorial.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
|
||||||
|
import com.ivmiku.tutorial.entity.*;
|
||||||
|
import com.ivmiku.tutorial.mapper.BlackListMapper;
|
||||||
|
import com.ivmiku.tutorial.mapper.FriendMapper;
|
||||||
|
import com.ivmiku.tutorial.mapper.SubscribeMapper;
|
||||||
|
import com.ivmiku.tutorial.utils.RedisUtil;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class RelationService {
|
||||||
|
@Autowired
|
||||||
|
private BlackListMapper blackListMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FriendMapper friendMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SubscribeMapper subscribeMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 屏蔽用户
|
||||||
|
* @param userId 用户id
|
||||||
|
* @param toIgnore 要屏蔽的用户id
|
||||||
|
*/
|
||||||
|
public void IgnoreUser(String userId, String toIgnore) {
|
||||||
|
blackListMapper.insert(new IgnoreUser(userId, toIgnore));
|
||||||
|
if (redisUtil.ifExist("blacklist:" + userId)) {
|
||||||
|
redisUtil.listAdd("blacklist:" + userId, toIgnore);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询用户是否屏蔽了该用户
|
||||||
|
* @param userId 用户id
|
||||||
|
* @param ignoreId 要查询的id
|
||||||
|
* @return 查询结果
|
||||||
|
*/
|
||||||
|
public boolean ifIgnored(String userId, String ignoreId) {
|
||||||
|
loadCache(userId);
|
||||||
|
List<String> blackList = redisUtil.getStringList("blacklist:" + userId, 0, -1);
|
||||||
|
redisUtil.refreshExpire("blacklist:" + userId);
|
||||||
|
return blackList.contains(ignoreId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载缓存
|
||||||
|
* @param userId 用户id
|
||||||
|
*/
|
||||||
|
public void loadCache(String userId) {
|
||||||
|
if (!redisUtil.ifExist("blacklist:" + userId)) {
|
||||||
|
QueryWrapper<IgnoreUser> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("user_id", userId);
|
||||||
|
List<IgnoreUser> list = blackListMapper.selectList(queryWrapper);
|
||||||
|
List<String> result = new ArrayList<>();
|
||||||
|
if (list != null) {
|
||||||
|
for (IgnoreUser object : list) {
|
||||||
|
result.add(object.getToIgnore());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (String toIgnore : result) {
|
||||||
|
redisUtil.listAdd("blacklist:" + userId, toIgnore);
|
||||||
|
}
|
||||||
|
redisUtil.setExpireTime("blacklist:" + userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void subscribe(String id, String toId) {
|
||||||
|
Subscribe subscribe = new Subscribe();
|
||||||
|
subscribe.setId(Long.valueOf(id));
|
||||||
|
subscribe.setSubId(Long.valueOf(toId));
|
||||||
|
subscribeMapper.insert(subscribe);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SubUser> getFanList(String userId, int page, int size) {
|
||||||
|
List<SubUser> list = new ArrayList<>();
|
||||||
|
QueryWrapper<Subscribe> queryWrapper = new QueryWrapper<>();
|
||||||
|
Page<Subscribe> pager = new Page<>(page, size);
|
||||||
|
queryWrapper.eq("sub_id", userId);
|
||||||
|
List<Subscribe> array = subscribeMapper.selectPage(pager, queryWrapper).getRecords();
|
||||||
|
for (Subscribe subscribe : array) {
|
||||||
|
String queryId = String.valueOf(subscribe.getId());
|
||||||
|
User user = userService.selectUserById(queryId);
|
||||||
|
SubUser subUser = SubUser.setUser(user);
|
||||||
|
list.add(subUser);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SubUser> getSubList(String userId, int page, int size) {
|
||||||
|
List<SubUser> list = new ArrayList<>();
|
||||||
|
QueryWrapper<Subscribe> queryWrapper = new QueryWrapper<>();
|
||||||
|
Page<Subscribe> pager = new Page<>(page, size);
|
||||||
|
queryWrapper.eq("id", userId);
|
||||||
|
List<Subscribe> array = subscribeMapper.selectPage(pager, queryWrapper).getRecords();
|
||||||
|
for (Subscribe subscribe : array) {
|
||||||
|
String queryId = String.valueOf(subscribe.getSubId());
|
||||||
|
User user = userService.selectUserById(queryId);
|
||||||
|
SubUser subUser = SubUser.setUser(user);
|
||||||
|
list.add(subUser);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.ivmiku.tutorial.service;
|
||||||
|
|
||||||
|
import com.ivmiku.tutorial.entity.User;
|
||||||
|
import com.ivmiku.tutorial.mapper.UserMapper;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class UserService {
|
||||||
|
@Resource
|
||||||
|
private UserMapper userMapper;
|
||||||
|
|
||||||
|
public User selectUserById(String id) {
|
||||||
|
return userMapper.selectById(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.ivmiku.tutorial.utils;
|
||||||
|
|
||||||
|
import jakarta.annotation.PostConstruct;
|
||||||
|
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
public class DateUtil {
|
||||||
|
/**
|
||||||
|
* 获取当前时间
|
||||||
|
* @return 当前时间字符串
|
||||||
|
*/
|
||||||
|
public static String getCurrentTime() {
|
||||||
|
Date date = new Date();
|
||||||
|
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
return ft.format(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为时间戳
|
||||||
|
* @param time 时间字符串
|
||||||
|
* @return 时间戳
|
||||||
|
* @throws ParseException
|
||||||
|
*/
|
||||||
|
public static long toTimeSig(String time) throws ParseException {
|
||||||
|
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
Date date = ft.parse(time);
|
||||||
|
return date.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置当前时区GMT+8
|
||||||
|
*/
|
||||||
|
@PostConstruct
|
||||||
|
public void setTimeZone() {
|
||||||
|
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package com.ivmiku.tutorial.utils;
|
||||||
|
|
||||||
|
import com.ivmiku.tutorial.service.RelationService;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 敏感词检测
|
||||||
|
* @author Aurora
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class MessageUtil {
|
||||||
|
private static final String[] SENSITIVE = {"你妈", "你妈逼的"};
|
||||||
|
|
||||||
|
private static RelationService relationService = null;
|
||||||
|
|
||||||
|
public MessageUtil(RelationService relationService) {
|
||||||
|
MessageUtil.relationService = relationService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查看发送的信息是否含有敏感词
|
||||||
|
* @param message 要发送的信息
|
||||||
|
* @return 检查结果
|
||||||
|
*/
|
||||||
|
public static boolean checkMessage(String message) {
|
||||||
|
if (message != null) {
|
||||||
|
for(String keyword : SENSITIVE) {
|
||||||
|
if (message.contains(keyword)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,9 +1,18 @@
|
|||||||
package com.ivmiku.tutorial.utils;
|
package com.ivmiku.tutorial.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.ivmiku.tutorial.entity.Message;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Aurora
|
* @author Aurora
|
||||||
*/
|
*/
|
||||||
@@ -12,11 +21,97 @@ public class RedisUtil {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
public void insertKey(String userId, String sessionKey) {
|
public void listAdd(String key, Object value) {
|
||||||
redisTemplate.opsForValue().set("sessionkey:" + userId, sessionKey);
|
redisTemplate.opsForList().leftPush(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getKey(String userId) {
|
public List<Message> listGet(String key, int s, int e) {
|
||||||
return (String) redisTemplate.opsForValue().get("sessionkey:" + userId);
|
List<Object> list = redisTemplate.opsForList().range(key, s, e);
|
||||||
|
List<Message> result = new ArrayList<>();
|
||||||
|
if (list != null) {
|
||||||
|
for (Object json : list) {
|
||||||
|
result.add(JSON.parseObject(JSON.toJSONString(json), Message.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void listClear(String key) {
|
||||||
|
redisTemplate.opsForList().trim(key, 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getListSize(String key) {
|
||||||
|
return redisTemplate.opsForList().size(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getKey() {
|
||||||
|
return redisTemplate.keys("history:*");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object rightPop(String key) {
|
||||||
|
return redisTemplate.opsForList().rightPop(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void zsetAdd(String key, Message value) throws ParseException {
|
||||||
|
redisTemplate.opsForZSet().add(key, value, DateUtil.toTimeSig(value.getDate()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Message> zsetGet(String key, int s, int e) {
|
||||||
|
Set<Object> list = redisTemplate.opsForZSet().reverseRange(key, s, e);
|
||||||
|
List<Message> result = new ArrayList<>();
|
||||||
|
if (list != null) {
|
||||||
|
for (Object json : list) {
|
||||||
|
result.add(JSON.parseObject(JSON.toJSONString(json), Message.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getzsetSize(String key) {
|
||||||
|
return redisTemplate.opsForZSet().size(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Message> zsetGetByDate(String key, String startDate, String endDate, int offset, int count) throws ParseException {
|
||||||
|
Set<Object> list = redisTemplate.opsForZSet().reverseRangeByScore(key, DateUtil.toTimeSig(startDate), DateUtil.toTimeSig(endDate), offset, count);
|
||||||
|
List<Message> result = new ArrayList<>();
|
||||||
|
if (list != null) {
|
||||||
|
for (Object json : list) {
|
||||||
|
result.add(JSON.parseObject(JSON.toJSONString(json), Message.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Message zsetRightPop(String key) {
|
||||||
|
return JSON.parseObject(JSON.toJSONString(Objects.requireNonNull(redisTemplate.opsForZSet().popMin(key)).getValue()), Message.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getZsetSize(String key) {
|
||||||
|
return redisTemplate.opsForZSet().size(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExpireTime(String key) {
|
||||||
|
if (redisTemplate.opsForValue().getOperations().getExpire(key) > 0) {
|
||||||
|
redisTemplate.expire(key, 3, TimeUnit.DAYS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refreshExpire(String key) {
|
||||||
|
redisTemplate.persist(key);
|
||||||
|
redisTemplate.expire(key, 3, TimeUnit.DAYS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean ifExist(String key) {
|
||||||
|
return Boolean.TRUE.equals(redisTemplate.hasKey(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getStringList(String key, int s, int e) {
|
||||||
|
List<Object> list = redisTemplate.opsForList().range(key, s, e);
|
||||||
|
List<String> result = new ArrayList<>();
|
||||||
|
assert list != null;
|
||||||
|
for (Object object : list) {
|
||||||
|
result.add((String) object);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user