feat: 知识库按点é赞数倒序
This commit is contained in:
parent
131e8e38a0
commit
6112361fba
|
@ -1,5 +1,6 @@
|
|||
package com.moyz.adi.chat.controller;
|
||||
|
||||
import com.moyz.adi.common.dto.ConvAddReq;
|
||||
import com.moyz.adi.common.dto.ConvDto;
|
||||
import com.moyz.adi.common.dto.ConvEditReq;
|
||||
import com.moyz.adi.common.service.ConversationService;
|
||||
|
@ -11,6 +12,7 @@ import jakarta.annotation.Resource;
|
|||
import jakarta.validation.constraints.Max;
|
||||
import jakarta.validation.constraints.Min;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -42,6 +44,11 @@ public class ConversationController {
|
|||
return conversationService.detail(uuid, maxMsgUuid, pageSize);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
public ConvDto add(@RequestBody @Validated ConvAddReq convAddReq) {
|
||||
return conversationService.add(convAddReq.getTitle(), convAddReq.getAiSystemMessage());
|
||||
}
|
||||
|
||||
@PostMapping("/edit/{uuid}")
|
||||
public boolean edit(@PathVariable String uuid, @RequestBody ConvEditReq convEditReq) {
|
||||
return conversationService.edit(uuid, convEditReq);
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
package com.moyz.adi.chat.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.moyz.adi.common.base.ThreadContext;
|
||||
import com.moyz.adi.common.dto.KbEditReq;
|
||||
import com.moyz.adi.common.dto.KbInfoResp;
|
||||
import com.moyz.adi.common.entity.AdiFile;
|
||||
import com.moyz.adi.common.entity.KnowledgeBase;
|
||||
import com.moyz.adi.common.service.KnowledgeBaseService;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.validation.constraints.Min;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
@ -38,12 +41,12 @@ public class KnowledgeBaseController {
|
|||
}
|
||||
|
||||
@GetMapping("/searchMine")
|
||||
public Page<KnowledgeBase> searchMine(@RequestParam(defaultValue = "") String keyword, @RequestParam(defaultValue = "false") Boolean includeOthersPublic, @NotNull @Min(1) Integer currentPage, @NotNull @Min(10) Integer pageSize) {
|
||||
public Page<KbInfoResp> searchMine(@RequestParam(defaultValue = "") String keyword, @RequestParam(defaultValue = "false") Boolean includeOthersPublic, @NotNull @Min(1) Integer currentPage, @NotNull @Min(10) Integer pageSize) {
|
||||
return knowledgeBaseService.searchMine(keyword, includeOthersPublic, currentPage, pageSize);
|
||||
}
|
||||
|
||||
@GetMapping("/searchPublic")
|
||||
public Page<KnowledgeBase> searchPublic(@RequestParam(defaultValue = "") String keyword, @NotNull @Min(1) Integer currentPage, @NotNull @Min(10) Integer pageSize) {
|
||||
public Page<KbInfoResp> searchPublic(@RequestParam(defaultValue = "") String keyword, @NotNull @Min(1) Integer currentPage, @NotNull @Min(10) Integer pageSize) {
|
||||
return knowledgeBaseService.searchPublic(keyword, currentPage, pageSize);
|
||||
}
|
||||
|
||||
|
@ -70,8 +73,8 @@ public class KnowledgeBaseController {
|
|||
*
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/star/{kbUuid}")
|
||||
public boolean star(@PathVariable String kbUuid) {
|
||||
return knowledgeBaseService.star(kbUuid);
|
||||
@PostMapping("/star/toggle")
|
||||
public boolean star(@RequestParam @NotBlank String kbUuid) {
|
||||
return knowledgeBaseService.toggleStar(ThreadContext.getCurrentUser(), kbUuid);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
package com.moyz.adi.chat.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.moyz.adi.common.base.ThreadContext;
|
||||
import com.moyz.adi.common.dto.KbStarInfoResp;
|
||||
import com.moyz.adi.common.service.KnowledgeBaseStarRecordService;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@Tag(name = "知识库点赞controller")
|
||||
@Validated
|
||||
@RequestMapping("/knowledge-base/star")
|
||||
@RestController
|
||||
public class KnowledgeBaseStarController {
|
||||
|
||||
@Resource
|
||||
private KnowledgeBaseStarRecordService knowledgeBaseStarRecordService;
|
||||
|
||||
@GetMapping("/mine")
|
||||
public Page<KbStarInfoResp> stars(int currentPage, int pageSize) {
|
||||
return knowledgeBaseStarRecordService.listStarInfo(ThreadContext.getCurrentUser(), currentPage, pageSize);
|
||||
}
|
||||
}
|
|
@ -61,9 +61,9 @@ public class UserController {
|
|||
userService.logout();
|
||||
}
|
||||
|
||||
@Operation(summary = "头像")
|
||||
@GetMapping(value = "/avatar", produces = MediaType.IMAGE_JPEG_VALUE)
|
||||
public void avatar(HttpServletResponse response) {
|
||||
@Operation(summary = "当前用户头像")
|
||||
@GetMapping(value = "/myAvatar", produces = MediaType.IMAGE_JPEG_VALUE)
|
||||
public void myAvatar(HttpServletResponse response) {
|
||||
User user = ThreadContext.getCurrentUser();
|
||||
Avatar avatar = CatAvatar.newAvatarBuilder().build();
|
||||
BufferedImage bufferedImage = avatar.create(user.getId());
|
||||
|
@ -74,4 +74,22 @@ public class UserController {
|
|||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Operation(summary = "用户头像")
|
||||
@GetMapping(value = "/avatar/{uuid}", produces = MediaType.IMAGE_JPEG_VALUE)
|
||||
public void avatar(@Validated @PathVariable String uuid, HttpServletResponse response){
|
||||
User user = userService.getByUuid(uuid);
|
||||
long userId = 0;
|
||||
if(null != user){
|
||||
userId = user.getId();
|
||||
}
|
||||
Avatar avatar = CatAvatar.newAvatarBuilder().build();
|
||||
BufferedImage bufferedImage = avatar.create(userId);
|
||||
//把图片写给浏览器
|
||||
try {
|
||||
ImageIO.write(bufferedImage, "png", response.getOutputStream());
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
package com.moyz.adi.common.dto;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
@Data
|
||||
@Validated
|
||||
public class ConvAddReq {
|
||||
|
||||
@NotBlank
|
||||
private String title;
|
||||
private String aiSystemMessage;
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package com.moyz.adi.common.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class KbInfoResp {
|
||||
private String uuid;
|
||||
private String title;
|
||||
private String remark;
|
||||
private Boolean isPublic;
|
||||
private Integer starCount;
|
||||
private String ownerUuid;
|
||||
private String ownerName;
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package com.moyz.adi.common.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class KbStarInfoResp {
|
||||
private String kbUuid;
|
||||
private String kbTitle;
|
||||
}
|
|
@ -57,4 +57,8 @@ public class ConversationMessage extends BaseEntity {
|
|||
@Schema(name = "上下文理解中携带的消息对数量(提示词及回复)")
|
||||
@TableField("understand_context_msg_pair_num")
|
||||
private Integer understandContextMsgPairNum;
|
||||
|
||||
@Schema(name = "LLM name")
|
||||
@TableField("language_model_name")
|
||||
private String languageModelName;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,11 @@ public class KnowledgeBase extends BaseEntity {
|
|||
|
||||
@Schema(title = "点赞数")
|
||||
@TableField("star_count")
|
||||
private Long starCount;
|
||||
private Integer starCount;
|
||||
|
||||
@Schema(title = "所属人uuid")
|
||||
@TableField("owner_uuid")
|
||||
private String ownerUuid;
|
||||
|
||||
@Schema(title = "所属人id")
|
||||
@TableField("owner_id")
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
package com.moyz.adi.common.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@TableName("adi_knowledge_base_star_record")
|
||||
@Schema(title = "知识库点赞记录实体", description = "知识库点赞记录表")
|
||||
public class KnowledgeBaseStarRecord extends BaseEntity {
|
||||
|
||||
@Schema(title = "Knowledge base id")
|
||||
@TableField("kb_id")
|
||||
private Long kbId;
|
||||
|
||||
@Schema(title = "Knowledge base uuid")
|
||||
@TableField("kb_uuid")
|
||||
private String kbUuid;
|
||||
|
||||
@Schema(title = "User id")
|
||||
@TableField("user_id")
|
||||
private Long userId;
|
||||
|
||||
@Schema(title = "User uuid")
|
||||
@TableField("user_uuid")
|
||||
private String userUuid;
|
||||
|
||||
}
|
|
@ -22,6 +22,7 @@ public enum ErrorEnum {
|
|||
A_UPLOAD_FAIL("A0018", "上传失败"),
|
||||
A_QA_ASK_LIMIT("A0019", "请求次数太多"),
|
||||
A_QA_ITEM_LIMIT("A0020", "知识点生成已超额度"),
|
||||
A_CONVERSATION_EXIST("A0021", "对话已存在"),
|
||||
B_UNCAUGHT_ERROR("B0001", "未捕捉异常"),
|
||||
B_COMMON_ERROR("B0002", "业务出错"),
|
||||
B_GLOBAL_ERROR("B0003", "全局异常"),
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package com.moyz.adi.common.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.moyz.adi.common.entity.KnowledgeBaseStarRecord;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface KnowledgeBaseStarRecordMapper extends BaseMapper<KnowledgeBaseStarRecord> {
|
||||
}
|
|
@ -43,7 +43,7 @@ public class GoogleSearchEngine extends AbstractSearchEngine<GoogleSetting> {
|
|||
result.setErrorMessage(googleSearchResp.getError().getMessage());
|
||||
} else {
|
||||
log.info("google response:{}", resp);
|
||||
items = MPPageUtil.convertTo(googleSearchResp.getItems(), SearchResultItem.class);
|
||||
items = MPPageUtil.convertToList(googleSearchResp.getItems(), SearchResultItem.class);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
|
|
@ -14,7 +14,6 @@ import com.moyz.adi.common.util.BizPager;
|
|||
import com.moyz.adi.common.util.MPPageUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -45,7 +44,7 @@ public class AiSearchRecordService extends ServiceImpl<AiSearchRecordMapper, AiS
|
|||
}
|
||||
AiSearchResp result = new AiSearchResp();
|
||||
BizPager.listByMaxId(maxId, wrapper, this, AiSearchRecord::getId, (recordList, minId) -> {
|
||||
List<AiSearchRecordResp> list = MPPageUtil.convertTo(recordList, AiSearchRecordResp.class);
|
||||
List<AiSearchRecordResp> list = MPPageUtil.convertToList(recordList, AiSearchRecordResp.class);
|
||||
list.forEach(item -> {
|
||||
if(null == item.getSearchEngineResp()){
|
||||
SearchEngineResp searchEngineResp = new SearchEngineResp();
|
||||
|
|
|
@ -228,6 +228,7 @@ public class ConversationMessageService extends ServiceImpl<ConversationMessageM
|
|||
aiAnswer.setTokens(answerMeta.getTokens());
|
||||
aiAnswer.setParentMessageId(promptMsg.getId());
|
||||
aiAnswer.setSecretKeyType(secretKeyType);
|
||||
aiAnswer.setLanguageModelName(askReq.getModelName());
|
||||
baseMapper.insert(aiAnswer);
|
||||
|
||||
calcTodayCost(user, conversation, questionMeta, answerMeta);
|
||||
|
|
|
@ -20,6 +20,7 @@ import org.springframework.stereotype.Service;
|
|||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.moyz.adi.common.enums.ErrorEnum.A_CONVERSATION_EXIST;
|
||||
import static com.moyz.adi.common.enums.ErrorEnum.A_CONVERSATION_NOT_EXIST;
|
||||
|
||||
@Slf4j
|
||||
|
@ -39,7 +40,7 @@ public class ConversationService extends ServiceImpl<ConversationMapper, Convers
|
|||
.orderByDesc(Conversation::getId)
|
||||
.last("limit " + sysConfigService.getConversationMaxNum())
|
||||
.list();
|
||||
return MPPageUtil.convertTo(list, ConvDto.class);
|
||||
return MPPageUtil.convertToList(list, ConvDto.class);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -80,7 +81,7 @@ public class ConversationService extends ServiceImpl<ConversationMapper, Convers
|
|||
return b;
|
||||
}).getUuid();
|
||||
//Wrap question content
|
||||
List<ConvMsgResp> userMessages = MPPageUtil.convertTo(questions, ConvMsgResp.class);
|
||||
List<ConvMsgResp> userMessages = MPPageUtil.convertToList(questions, ConvMsgResp.class);
|
||||
ConvMsgListResp result = new ConvMsgListResp(minUuid, userMessages);
|
||||
|
||||
//Wrap answer content
|
||||
|
@ -94,7 +95,7 @@ public class ConversationService extends ServiceImpl<ConversationMapper, Convers
|
|||
|
||||
//Fill AI answer to the request of user
|
||||
result.getMsgList().forEach(item -> {
|
||||
List<ConvMsgResp> children = MPPageUtil.convertTo(idToMessages.get(item.getId()), ConvMsgResp.class);
|
||||
List<ConvMsgResp> children = MPPageUtil.convertToList(idToMessages.get(item.getId()), ConvMsgResp.class);
|
||||
if (children.size() > 1) {
|
||||
children = children.stream().sorted(Comparator.comparing(ConvMsgResp::getCreateTime).reversed()).collect(Collectors.toList());
|
||||
}
|
||||
|
@ -122,6 +123,27 @@ public class ConversationService extends ServiceImpl<ConversationMapper, Convers
|
|||
return this.lambdaQuery().eq(Conversation::getUuid, uuid).oneOpt().orElse(null);
|
||||
}
|
||||
|
||||
public ConvDto add(String title, String systemMessage) {
|
||||
Conversation conversation = this.lambdaQuery()
|
||||
.eq(Conversation::getUserId, ThreadContext.getCurrentUserId())
|
||||
.eq(Conversation::getTitle, title)
|
||||
.eq(Conversation::getIsDeleted, false)
|
||||
.one();
|
||||
if (null != conversation) {
|
||||
throw new BaseException(A_CONVERSATION_EXIST);
|
||||
}
|
||||
String uuid = UUID.randomUUID().toString().replace("-", "");
|
||||
Conversation one = new Conversation();
|
||||
one.setUuid(uuid);
|
||||
one.setTitle(title);
|
||||
one.setAiSystemMessage(systemMessage);
|
||||
one.setUserId(ThreadContext.getCurrentUserId());
|
||||
baseMapper.insert(one);
|
||||
|
||||
Conversation conv = this.lambdaQuery().eq(Conversation::getUuid, uuid).one();
|
||||
return MPPageUtil.convertTo(conv, ConvDto.class);
|
||||
}
|
||||
|
||||
public boolean edit(String uuid, ConvEditReq convEditReq) {
|
||||
Conversation conversation = this.lambdaQuery()
|
||||
.eq(Conversation::getUuid, uuid)
|
||||
|
|
|
@ -16,7 +16,7 @@ public class KnowledgeBaseEmbeddingService extends ServiceImpl<KnowledgeBaseEmbe
|
|||
public Page<KbItemEmbeddingDto> listByItemUuid(String kbItemUuid, int currentPage, int pageSize) {
|
||||
Page<KnowledgeBaseEmbedding> sourcePage = baseMapper.selectByItemUuid(new Page<>(currentPage, pageSize), kbItemUuid);
|
||||
Page<KbItemEmbeddingDto> result = new Page<>();
|
||||
MPPageUtil.convertTo(sourcePage, result, KbItemEmbeddingDto.class, (source, target) -> {
|
||||
MPPageUtil.convertToPage(sourcePage, result, KbItemEmbeddingDto.class, (source, target) -> {
|
||||
target.setEmbedding(source.getEmbedding().toArray());
|
||||
return target;
|
||||
});
|
||||
|
|
|
@ -9,6 +9,7 @@ import com.moyz.adi.common.base.ThreadContext;
|
|||
import com.moyz.adi.common.cosntant.AdiConstant;
|
||||
import com.moyz.adi.common.cosntant.RedisKeyConstant;
|
||||
import com.moyz.adi.common.dto.KbEditReq;
|
||||
import com.moyz.adi.common.dto.KbInfoResp;
|
||||
import com.moyz.adi.common.dto.QAReq;
|
||||
import com.moyz.adi.common.entity.*;
|
||||
import com.moyz.adi.common.exception.BaseException;
|
||||
|
@ -16,6 +17,7 @@ import com.moyz.adi.common.helper.SSEEmitterHelper;
|
|||
import com.moyz.adi.common.mapper.KnowledgeBaseMapper;
|
||||
import com.moyz.adi.common.util.BizPager;
|
||||
import com.moyz.adi.common.util.LocalDateTimeUtil;
|
||||
import com.moyz.adi.common.util.MPPageUtil;
|
||||
import com.moyz.adi.common.vo.SseAskParams;
|
||||
import dev.langchain4j.data.document.Document;
|
||||
import dev.langchain4j.data.document.parser.TextDocumentParser;
|
||||
|
@ -33,6 +35,7 @@ import org.springframework.context.annotation.Lazy;
|
|||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
|
@ -65,6 +68,9 @@ public class KnowledgeBaseService extends ServiceImpl<KnowledgeBaseMapper, Knowl
|
|||
@Resource
|
||||
private KnowledgeBaseQaRecordService knowledgeBaseQaRecordService;
|
||||
|
||||
@Resource
|
||||
private KnowledgeBaseStarRecordService knowledgeBaseStarRecordService;
|
||||
|
||||
@Resource
|
||||
private FileService fileService;
|
||||
|
||||
|
@ -194,16 +200,20 @@ public class KnowledgeBaseService extends ServiceImpl<KnowledgeBaseMapper, Knowl
|
|||
return true;
|
||||
}
|
||||
|
||||
public Page<KnowledgeBase> searchMine(String keyword, Boolean includeOthersPublic, Integer currentPage, Integer pageSize) {
|
||||
public Page<KbInfoResp> searchMine(String keyword, Boolean includeOthersPublic, Integer currentPage, Integer pageSize) {
|
||||
Page<KbInfoResp> result = new Page<>();
|
||||
User user = ThreadContext.getCurrentUser();
|
||||
Page<KnowledgeBase> knowledgeBasePage;
|
||||
if (user.getIsAdmin()) {
|
||||
return baseMapper.searchByAdmin(new Page<>(currentPage, pageSize), keyword);
|
||||
knowledgeBasePage = baseMapper.searchByAdmin(new Page<>(currentPage, pageSize), keyword);
|
||||
} else {
|
||||
return baseMapper.searchByUser(new Page<>(currentPage, pageSize), user.getId(), keyword, includeOthersPublic);
|
||||
knowledgeBasePage = baseMapper.searchByUser(new Page<>(currentPage, pageSize), user.getId(), keyword, includeOthersPublic);
|
||||
}
|
||||
return MPPageUtil.convertToPage(knowledgeBasePage, result, KbInfoResp.class, null);
|
||||
}
|
||||
|
||||
public Page<KnowledgeBase> searchPublic(String keyword, Integer currentPage, Integer pageSize) {
|
||||
public Page<KbInfoResp> searchPublic(String keyword, Integer currentPage, Integer pageSize) {
|
||||
Page<KbInfoResp> result = new Page<>();
|
||||
LambdaQueryWrapper<KnowledgeBase> wrapper = new LambdaQueryWrapper();
|
||||
wrapper.eq(KnowledgeBase::getIsPublic, true);
|
||||
wrapper.eq(KnowledgeBase::getIsDeleted, false);
|
||||
|
@ -211,7 +221,8 @@ public class KnowledgeBaseService extends ServiceImpl<KnowledgeBaseMapper, Knowl
|
|||
wrapper.like(KnowledgeBase::getTitle, keyword);
|
||||
}
|
||||
wrapper.orderByDesc(KnowledgeBase::getStarCount, KnowledgeBase::getUpdateTime);
|
||||
return baseMapper.selectPage(new Page<>(currentPage, pageSize), wrapper);
|
||||
Page<KnowledgeBase> knowledgeBasePage = baseMapper.selectPage(new Page<>(currentPage, pageSize), wrapper);
|
||||
return MPPageUtil.convertToPage(knowledgeBasePage, result, KbInfoResp.class, null);
|
||||
}
|
||||
|
||||
public boolean softDelete(String uuid) {
|
||||
|
@ -247,12 +258,42 @@ public class KnowledgeBaseService extends ServiceImpl<KnowledgeBaseMapper, Knowl
|
|||
return sseEmitter;
|
||||
}
|
||||
|
||||
public boolean star(String kbUuid) {
|
||||
KnowledgeBase knowledgeBase = getOrThrow(kbUuid);
|
||||
return ChainWrappers.lambdaUpdateChain(baseMapper)
|
||||
.eq(KnowledgeBase::getId, knowledgeBase.getId())
|
||||
.set(KnowledgeBase::getStarCount, knowledgeBase.getStarCount() + 1)
|
||||
/**
|
||||
* Star or unstar
|
||||
*
|
||||
* @param user
|
||||
* @param kbUuid
|
||||
* @return true:star;false:unstar
|
||||
*/
|
||||
@Transactional
|
||||
public boolean toggleStar(User user, String kbUuid) {
|
||||
|
||||
KnowledgeBase knowledgeBase = _this.getOrThrow(kbUuid);
|
||||
boolean star;
|
||||
KnowledgeBaseStarRecord oldRecord = knowledgeBaseStarRecordService.getRecord(user.getId(), kbUuid);
|
||||
if (null == oldRecord) {
|
||||
KnowledgeBaseStarRecord starRecord = new KnowledgeBaseStarRecord();
|
||||
starRecord.setUserId(user.getId());
|
||||
starRecord.setUserUuid(user.getUuid());
|
||||
starRecord.setKbId(knowledgeBase.getId());
|
||||
starRecord.setKbUuid(kbUuid);
|
||||
knowledgeBaseStarRecordService.save(starRecord);
|
||||
|
||||
star = true;
|
||||
} else {
|
||||
//Deleted means unstar
|
||||
knowledgeBaseStarRecordService.lambdaUpdate()
|
||||
.eq(KnowledgeBaseStarRecord::getId, oldRecord.getId())
|
||||
.set(KnowledgeBaseStarRecord::getIsDeleted, !oldRecord.getIsDeleted())
|
||||
.update();
|
||||
star = oldRecord.getIsDeleted();
|
||||
}
|
||||
int starCount = star ? knowledgeBase.getStarCount() + 1 : knowledgeBase.getStarCount() - 1;
|
||||
ChainWrappers.lambdaUpdateChain(baseMapper)
|
||||
.eq(KnowledgeBase::getId, knowledgeBase.getId())
|
||||
.set(KnowledgeBase::getStarCount, starCount)
|
||||
.update();
|
||||
return star;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
package com.moyz.adi.common.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers;
|
||||
import com.moyz.adi.common.dto.KbStarInfoResp;
|
||||
import com.moyz.adi.common.entity.KnowledgeBaseStarRecord;
|
||||
import com.moyz.adi.common.entity.User;
|
||||
import com.moyz.adi.common.mapper.KnowledgeBaseStarRecordMapper;
|
||||
import com.moyz.adi.common.util.MPPageUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class KnowledgeBaseStarRecordService extends ServiceImpl<KnowledgeBaseStarRecordMapper, KnowledgeBaseStarRecord> {
|
||||
|
||||
public boolean isStarred(Long userId, String kbUuid) {
|
||||
return ChainWrappers.lambdaQueryChain(baseMapper)
|
||||
.eq(KnowledgeBaseStarRecord::getUserId, userId)
|
||||
.eq(KnowledgeBaseStarRecord::getKbUuid, kbUuid)
|
||||
.eq(KnowledgeBaseStarRecord::getIsDeleted, false)
|
||||
.exists();
|
||||
}
|
||||
|
||||
public KnowledgeBaseStarRecord getRecord(long userId, String kbUuid){
|
||||
return ChainWrappers.lambdaQueryChain(baseMapper)
|
||||
.eq(KnowledgeBaseStarRecord::getUserId, userId)
|
||||
.eq(KnowledgeBaseStarRecord::getKbUuid, kbUuid)
|
||||
.oneOpt()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public Page<KbStarInfoResp> listStarInfo(User user, int currentPage, int pageSize) {
|
||||
LambdaQueryWrapper<KnowledgeBaseStarRecord> wrapper = new LambdaQueryWrapper();
|
||||
wrapper.eq(KnowledgeBaseStarRecord::getIsDeleted, false);
|
||||
wrapper.eq(KnowledgeBaseStarRecord::getUserId, user.getId());
|
||||
wrapper.orderByDesc(KnowledgeBaseStarRecord::getId);
|
||||
Page<KnowledgeBaseStarRecord> list = baseMapper.selectPage(new Page<>(currentPage, pageSize), wrapper);
|
||||
|
||||
Page<KbStarInfoResp> result = new Page<>();
|
||||
return MPPageUtil.convertToPage(list, result, KbStarInfoResp.class);
|
||||
}
|
||||
|
||||
}
|
|
@ -26,7 +26,7 @@ public class PromptService extends ServiceImpl<PromptMapper, Prompt> {
|
|||
|
||||
public List<PromptDto> getAll(long userId) {
|
||||
List<Prompt> prompts = this.lambdaQuery().eq(Prompt::getUserId, userId).eq(Prompt::getIsDeleted, false).list();
|
||||
return MPPageUtil.convertTo(prompts, PromptDto.class);
|
||||
return MPPageUtil.convertToList(prompts, PromptDto.class);
|
||||
}
|
||||
|
||||
public Page<PromptDto> search(String keyword, int currentPage, int pageSize) {
|
||||
|
@ -43,7 +43,7 @@ public class PromptService extends ServiceImpl<PromptMapper, Prompt> {
|
|||
.eq(Prompt::getIsDeleted, false)
|
||||
.page(new Page<>(currentPage, pageSize));
|
||||
}
|
||||
return MPPageUtil.convertTo(promptPage, new Page<>(), PromptDto.class);
|
||||
return MPPageUtil.convertToPage(promptPage, new Page<>(), PromptDto.class);
|
||||
}
|
||||
|
||||
public List<PromptDto> autocomplete(String keyword) {
|
||||
|
@ -62,7 +62,7 @@ public class PromptService extends ServiceImpl<PromptMapper, Prompt> {
|
|||
.last("limit 10")
|
||||
.list();
|
||||
}
|
||||
return MPPageUtil.convertTo(promptPage, PromptDto.class);
|
||||
return MPPageUtil.convertToList(promptPage, PromptDto.class);
|
||||
}
|
||||
|
||||
public PromptListResp listByMinUpdateTime(LocalDateTime minUpdateTime) {
|
||||
|
@ -88,7 +88,7 @@ public class PromptService extends ServiceImpl<PromptMapper, Prompt> {
|
|||
}
|
||||
return b;
|
||||
}).get().getUpdateTime();
|
||||
List<PromptDto> promptDtos = MPPageUtil.convertTo(list, PromptDto.class);
|
||||
List<PromptDto> promptDtos = MPPageUtil.convertToList(list, PromptDto.class);
|
||||
resp.setMaxUpdateTime(LocalDateTimeUtil.format(maxUpdateTime));
|
||||
resp.setPrompts(promptDtos);
|
||||
return resp;
|
||||
|
@ -170,6 +170,6 @@ public class PromptService extends ServiceImpl<PromptMapper, Prompt> {
|
|||
.like(Prompt::getAct, keyword)
|
||||
.last("limit 10")
|
||||
.list();
|
||||
return MPPageUtil.convertTo(prompts, PromptDto.class);
|
||||
return MPPageUtil.convertToList(prompts, PromptDto.class);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -314,4 +314,10 @@ public class UserService extends ServiceImpl<UserMapper, User> {
|
|||
adiMailSender.send("欢迎注册AIDeepIn", "激活链接(" + AdiConstant.AUTH_ACTIVE_CODE_EXPIRE + "小时内有效):" + backendUrl + "/auth/active?code=" + activeCode, email);
|
||||
}
|
||||
|
||||
public User getByUuid(String uuid){
|
||||
return ChainWrappers.lambdaQueryChain(baseMapper)
|
||||
.eq(User::getUuid, uuid)
|
||||
.one();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -14,11 +14,11 @@ import java.util.function.BiFunction;
|
|||
@Slf4j
|
||||
public class MPPageUtil {
|
||||
|
||||
public static <T, U> Page<U> convertTo(Page<T> source, Page<U> target, Class<U> targetRecordClass) {
|
||||
return MPPageUtil.convertTo(source, target, targetRecordClass, null);
|
||||
public static <T, U> Page<U> convertToPage(Page<T> source, Page<U> target, Class<U> targetRecordClass) {
|
||||
return MPPageUtil.convertToPage(source, target, targetRecordClass, null);
|
||||
}
|
||||
|
||||
public static <T, U> Page<U> convertTo(Page<T> source, Page<U> target, Class<U> targetRecordClass, BiFunction<T, U, U> biFunction) {
|
||||
public static <T, U> Page<U> convertToPage(Page<T> source, Page<U> target, Class<U> targetRecordClass, BiFunction<T, U, U> biFunction) {
|
||||
BeanUtils.copyProperties(source, target);
|
||||
List<U> records = new ArrayList<>();
|
||||
target.setRecords(records);
|
||||
|
@ -40,7 +40,7 @@ public class MPPageUtil {
|
|||
return target;
|
||||
}
|
||||
|
||||
public static <T, U> List<U> convertTo(List<T> source, Class<U> targetRecordClass) {
|
||||
public static <T, U> List<U> convertToList(List<T> source, Class<U> targetRecordClass) {
|
||||
if (CollectionUtils.isEmpty(source)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue