成就等界面接口调整
This commit is contained in:
@@ -8,7 +8,7 @@ import org.xyzh.api.usercenter.collection.UserCollectionService;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.dto.usercenter.TbUserCollection;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.vo.UserCollectionVO;
|
||||
import org.xyzh.system.utils.LoginUtil;
|
||||
/**
|
||||
* @description 用户收藏控制器
|
||||
@@ -26,14 +26,13 @@ public class UserCollectionController {
|
||||
private UserCollectionService userCollectionService;
|
||||
|
||||
/**
|
||||
* 获取用户收藏列表
|
||||
* 获取用户收藏列表(扁平化VO,包含资源/课程详情)
|
||||
*/
|
||||
@GetMapping("/user/{userID}")
|
||||
public ResultDomain<TbUserCollection> getUserCollections(
|
||||
public ResultDomain<UserCollectionVO> getUserCollections(
|
||||
@PathVariable("userID") String userID,
|
||||
@RequestParam(required = false) Integer resourceType,
|
||||
@RequestParam(required = false) String resourceID) {
|
||||
return userCollectionService.getUserCollections(userID, resourceType);
|
||||
@RequestParam(required = false, name = "collectionType") Integer collectionType) {
|
||||
return userCollectionService.getUserCollections(userID, collectionType);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -57,8 +56,8 @@ public class UserCollectionController {
|
||||
*/
|
||||
@GetMapping("/check")
|
||||
public ResultDomain<Boolean> isCollected(
|
||||
@RequestParam(value = "collectionID", required = false) String collectionID,
|
||||
@RequestParam(value = "collectionType", required = false) Integer collectionType) {
|
||||
@RequestParam(name = "collectionID", required = false) String collectionID,
|
||||
@RequestParam(name = "collectionType", required = false) Integer collectionType) {
|
||||
ResultDomain<Boolean> resultDomain = new ResultDomain<>();
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user == null) {
|
||||
@@ -74,8 +73,8 @@ public class UserCollectionController {
|
||||
@GetMapping("/count/{userID}")
|
||||
public ResultDomain<Integer> getCollectionCount(
|
||||
@PathVariable("userID") String userID,
|
||||
@RequestParam(required = false) Integer resourceType,
|
||||
@RequestParam(required = false) String resourceID) {
|
||||
return userCollectionService.getCollectionCount(userID, resourceType, resourceID);
|
||||
@RequestParam(name = "collectionType", required = false) Integer collectionType,
|
||||
@RequestParam(name = "collectionID", required = false) String collectionID) {
|
||||
return userCollectionService.getCollectionCount(userID, collectionType, collectionID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.xyzh.common.core.page.PageParam;
|
||||
import org.xyzh.common.dto.usercenter.TbUserCollection;
|
||||
import org.xyzh.common.vo.UserCollectionVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -26,6 +27,16 @@ public interface UserCollectionMapper extends BaseMapper<TbUserCollection> {
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
List<TbUserCollection> selectUserCollections(TbUserCollection filter);
|
||||
|
||||
/**
|
||||
* @description 查询用户收藏列表(包含资源/课程详情)
|
||||
* @param userID 用户ID
|
||||
* @param collectionType 收藏类型(可选)
|
||||
* @return List<UserCollectionVO> 用户收藏VO列表
|
||||
* @author yslg
|
||||
* @since 2025-10-31
|
||||
*/
|
||||
List<UserCollectionVO> selectUserCollectionsVO(@Param("userID") String userID, @Param("collectionType") Integer collectionType);
|
||||
|
||||
/**
|
||||
* @description 根据用户ID查询收藏记录
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.xyzh.usercenter.service.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@@ -7,9 +8,13 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.xyzh.api.news.resource.ResourceService;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.resource.TbResource;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.dto.usercenter.TbUserCollection;
|
||||
import org.xyzh.common.vo.UserCollectionVO;
|
||||
import org.xyzh.system.utils.LoginUtil;
|
||||
import org.xyzh.usercenter.mapper.UserCollectionMapper;
|
||||
import org.xyzh.usercenter.service.UCUserCollectionService;
|
||||
@@ -29,26 +34,31 @@ public class UCUserCollectionServiceImpl implements UCUserCollectionService {
|
||||
@Autowired
|
||||
private UserCollectionMapper userCollectionMapper;
|
||||
|
||||
@Autowired
|
||||
private ResourceService resourceService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ResultDomain<TbUserCollection> addCollection(TbUserCollection userCollection) {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user == null) {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
resultDomain.fail("请先登录");
|
||||
return resultDomain;
|
||||
throw new RuntimeException("请先登录");
|
||||
}
|
||||
userCollection.setUserID(user.getID());
|
||||
userCollection.setCreateTime(new Date());
|
||||
int result = userCollectionMapper.insertUserCollection(userCollection);
|
||||
if (result > 0) {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
userCollection.setCollectionValue(1);
|
||||
ResultDomain<TbResource> resultDomainResource = resourceService.resourceCollect(userCollection);
|
||||
if (!resultDomainResource.isSuccess()) {
|
||||
throw new RuntimeException(resultDomainResource.getMessage());
|
||||
}
|
||||
resultDomain.success("添加收藏成功", userCollection);
|
||||
return resultDomain;
|
||||
} else {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
resultDomain.fail("添加收藏失败");
|
||||
return resultDomain;
|
||||
}
|
||||
resultDomain.fail("添加收藏失败");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -58,20 +68,24 @@ public class UCUserCollectionServiceImpl implements UCUserCollectionService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<TbUserCollection> getUserCollections(String userID, Integer collectionType) {
|
||||
TbUserCollection filter = new TbUserCollection();
|
||||
filter.setUserID(userID);
|
||||
filter.setCollectionType(collectionType);
|
||||
List<TbUserCollection> list = userCollectionMapper.selectUserCollections(filter);
|
||||
if (list != null && list.size() > 0) {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
resultDomain.success("获取收藏列表成功", list);
|
||||
return resultDomain;
|
||||
} else {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
public ResultDomain<UserCollectionVO> getUserCollections(String userID, Integer collectionType) {
|
||||
ResultDomain<UserCollectionVO> resultDomain = new ResultDomain<>();
|
||||
|
||||
try {
|
||||
// 直接通过SQL JOIN一次性查询所有数据,避免N+1查询问题
|
||||
List<UserCollectionVO> voList = userCollectionMapper.selectUserCollectionsVO(userID, collectionType);
|
||||
|
||||
if (voList == null || voList.isEmpty()) {
|
||||
resultDomain.success("获取收藏列表成功", new ArrayList<>());
|
||||
} else {
|
||||
resultDomain.success("获取收藏列表成功", voList);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("获取收藏列表失败: userID={}, collectionType={}", userID, collectionType, e);
|
||||
resultDomain.fail("获取收藏列表失败");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -93,9 +107,22 @@ public class UCUserCollectionServiceImpl implements UCUserCollectionService {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ResultDomain<Boolean> removeCollection(TbUserCollection userCollection) {
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user == null) {
|
||||
throw new RuntimeException("请先登录");
|
||||
}
|
||||
userCollection.setUserID(user.getID());
|
||||
userCollection.setCollectionValue(-1);
|
||||
int result = userCollectionMapper.deleteUserCollection(userCollection);
|
||||
|
||||
if (result > 0) {
|
||||
userCollection.setCollectionValue(-1);
|
||||
ResultDomain<TbResource> resultDomainResource = resourceService.resourceCollect(userCollection);
|
||||
if (!resultDomainResource.isSuccess()) {
|
||||
throw new RuntimeException(resultDomainResource.getMessage());
|
||||
}
|
||||
ResultDomain<Boolean> resultDomain = new ResultDomain<>();
|
||||
resultDomain.success("删除收藏成功", true);
|
||||
return resultDomain;
|
||||
|
||||
@@ -5,11 +5,47 @@
|
||||
<!-- 结果映射 -->
|
||||
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.usercenter.TbUserCollection">
|
||||
<id column="id" property="id" />
|
||||
<result column="user_id" property=".userID" />
|
||||
<result column="user_id" property="userID" />
|
||||
<result column="collection_type" property="collectionType" />
|
||||
<result column="collection_id" property="collectionID" />
|
||||
<result column="create_time" property="createTime" />
|
||||
</resultMap>
|
||||
|
||||
<!-- UserCollectionVO结果映射 -->
|
||||
<resultMap id="UserCollectionVOResultMap" type="org.xyzh.common.vo.UserCollectionVO">
|
||||
<!-- 收藏基本信息 -->
|
||||
<id column="id" property="id" />
|
||||
<result column="user_id" property="userID" />
|
||||
<result column="collection_type" property="collectionType" />
|
||||
<result column="collection_id" property="collectionID" />
|
||||
<result column="collection_time" property="collectionTime" />
|
||||
<result column="create_time" property="createTime" />
|
||||
|
||||
<!-- 资源详情(collection_type=1时有效) -->
|
||||
<result column="resource_id" property="resourceID" />
|
||||
<result column="resource_title" property="title" />
|
||||
<result column="resource_content" property="content" />
|
||||
<result column="resource_summary" property="summary" />
|
||||
<result column="resource_cover_image" property="coverImage" />
|
||||
<result column="resource_tag_id" property="tagID" />
|
||||
<result column="resource_author" property="author" />
|
||||
<result column="resource_source" property="source" />
|
||||
<result column="resource_view_count" property="viewCount" />
|
||||
<result column="resource_like_count" property="likeCount" />
|
||||
<result column="resource_collect_count" property="collectCount" />
|
||||
<result column="resource_status" property="status" />
|
||||
<result column="resource_publish_time" property="publishTime" />
|
||||
|
||||
<!-- 课程详情(collection_type=2时有效) -->
|
||||
<result column="course_id" property="courseID" />
|
||||
<result column="course_name" property="courseName" />
|
||||
<result column="course_description" property="description" />
|
||||
<result column="course_duration" property="duration" />
|
||||
<result column="course_teacher" property="teacher" />
|
||||
<result column="course_status" property="courseStatus" />
|
||||
<result column="course_view_count" property="viewCount" />
|
||||
<result column="course_learn_count" property="learnCount" />
|
||||
</resultMap>
|
||||
|
||||
<!-- 字段列表 -->
|
||||
<sql id="Base_Column_List">
|
||||
@@ -291,5 +327,50 @@
|
||||
FROM tb_user_collection
|
||||
<include refid="Base_Where_Clause" />
|
||||
</select>
|
||||
|
||||
<!-- 查询用户收藏列表(包含资源/课程详情)- 一次性JOIN查询 -->
|
||||
<select id="selectUserCollectionsVO" resultMap="UserCollectionVOResultMap">
|
||||
SELECT
|
||||
uc.id,
|
||||
uc.user_id,
|
||||
uc.collection_type,
|
||||
uc.collection_id,
|
||||
uc.create_time as collection_time,
|
||||
uc.create_time,
|
||||
|
||||
<!-- 资源字段 -->
|
||||
r.resource_id,
|
||||
r.title as resource_title,
|
||||
r.content as resource_content,
|
||||
r.summary as resource_summary,
|
||||
r.cover_image as resource_cover_image,
|
||||
r.tag_id as resource_tag_id,
|
||||
r.author as resource_author,
|
||||
r.source as resource_source,
|
||||
r.view_count as resource_view_count,
|
||||
r.like_count as resource_like_count,
|
||||
r.collect_count as resource_collect_count,
|
||||
r.status as resource_status,
|
||||
r.publish_time as resource_publish_time,
|
||||
|
||||
<!-- 课程字段 -->
|
||||
c.course_id,
|
||||
c.name as course_name,
|
||||
c.description as course_description,
|
||||
c.cover_image as course_cover_image,
|
||||
c.duration as course_duration,
|
||||
c.teacher as course_teacher,
|
||||
c.status as course_status,
|
||||
c.view_count as course_view_count,
|
||||
c.learn_count as course_learn_count
|
||||
FROM tb_user_collection uc
|
||||
LEFT JOIN tb_resource r ON uc.collection_type = 1 AND uc.collection_id = r.resource_id
|
||||
LEFT JOIN tb_course c ON uc.collection_type = 2 AND uc.collection_id = c.course_id
|
||||
WHERE uc.user_id = #{userID}
|
||||
<if test="collectionType != null">
|
||||
AND uc.collection_type = #{collectionType}
|
||||
</if>
|
||||
ORDER BY uc.create_time DESC
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user