feat(service): 新增服务接口和实现类

- 新增 CategoryService、CollectionNoteService、CollectionService、CommentService、MessageService、NoteCommentService、NoteLikeService、QuestionListItemService、QuestionListService、SearchService、StatisticService 服务接口
- 新增 NoteService 接口及其实现类 NoteServiceImpl
- 新增 RedisService 接口及其实现类 RedisServiceImpl
- 新增 UploadService 接口及其实现
This commit is contained in:
LingandRX 2025-03-26 21:17:41 +08:00
parent fa92f20aca
commit e3656d20ec
28 changed files with 507 additions and 0 deletions

View File

@ -0,0 +1,27 @@
package com.example.copykamanotes.model.dto.note;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 发布笔记请求DTO
*/
@Data
public class CreateNoteRequest {
/*
* 问题ID
*/
@NotNull(message = "问题 ID 不能为空")
@Min(value = 1, message = "问题 ID 必须为正整数")
private Integer questionId;
/*
* 笔记内容
*/
@NotBlank(message = "笔记内容不能为空")
@NotNull(message = "笔记内容不能为空")
private String content;
}

View File

@ -0,0 +1,12 @@
package com.example.copykamanotes.model.dto.note;
import lombok.Data;
import java.time.LocalDate;
@Data
public class NoteHeatMapItem {
private LocalDate data;
private Integer count;
private Integer rank;
}

View File

@ -0,0 +1,81 @@
package com.example.copykamanotes.model.dto.note;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
/**
* 笔记查询参数DTO
*/
@Data
public class NoteQueryParams {
/*
* 问题ID
* 必须是正整数
*/
@Min(value = 1, message = "问题ID必须是正整数")
private Integer questionId;
/*
* 作者ID
* 必须是正整数且符合系统生成的范围
*/
@Min(value = 1, message = "作者ID必须是正整数")
private Long authorId;
/*
* 收藏夹ID
* 必须是正整数
*/
@Min(value = 1, message = "收藏夹ID必须是正整数")
private Integer collectionId;
/*
* 排序字段
* 只能是固定的枚举值比如 "create", "update"
*/
@Pattern(
regexp = "create",
message = "create"
)
private String sort;
/*
* 排序方向
* 只能是 "asc" "desc"区分大小写
*/
@Pattern(
regexp = "asc|desc",
message = "排序方向必须是 asc 或 desc"
)
private String order;
/*
* 最近天数
* 必须是1到365之间的整数默认限制为一年内
*/
@Min(value = 1, message = "最近天数必须至少为1天")
@Max(value = 365, message = "最近天数不能超过365天")
private Integer recentDays;
/*
* 当前页码
* 必须是正整数默认为1
*/
@NotNull(message = "当前页码不能为空")
@Min(value = 1, message = "当前页码必须大于等于1")
@Max(value = 10000, message = "当前页码不能超过10,000")
private Integer page = 1;
/*
* 每页大小
* 必须是正整数限制范围在 1到100之间
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页大小必须大于等于1")
@Max(value = 200, message = "每页大小不能超过100")
private Integer pageSize = 10;
}

View File

@ -0,0 +1,8 @@
package com.example.copykamanotes.model.dto.note;
import lombok.Data;
@Data
public class NoteRankListItem {
}

View File

@ -0,0 +1,10 @@
package com.example.copykamanotes.model.dto.note;
import lombok.Data;
@Data
public class Top3Count {
private Integer lastMonthTop3Count;
private Integer thisMonthTop3Count;
}

View File

@ -0,0 +1,16 @@
package com.example.copykamanotes.model.dto.note;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class UpdateNoteRequest {
/*
* 笔记内容
*/
@NotNull(message = "笔记内容不能为空")
@NotBlank(message = "笔记内容不能为空")
private String content;
}

View File

@ -0,0 +1,60 @@
package com.example.copykamanotes.model.entity;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @ClassName Note
* @Description 笔记实体类
* @Author Tong
* @LastChangeDate 2024-12-16 20:01
* @Version v1.0
*/
@Data
public class Note {
/**
* 笔记ID
*/
private Integer noteId;
/**
* 作者ID
*/
private Long authorId;
/**
* 问题ID
*/
private Integer questionId;
/**
* 笔记内容
*/
private String content;
/**
* 点赞数
*/
private Integer likeCount;
/**
* 评论数
*/
private Integer commentCount;
/**
* 收藏数
*/
private Integer collectCount;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
}

View File

@ -0,0 +1,9 @@
package com.example.copykamanotes.model.vo.note;
import lombok.Data;
@Data
public class CreateNoteVO {
private Integer noteId;
}

View File

@ -0,0 +1,8 @@
package com.example.copykamanotes.model.vo.note;
import lombok.Data;
@Data
public class DownloadNoteVO {
private String markdown;
}

View File

@ -0,0 +1,39 @@
package com.example.copykamanotes.model.vo.note;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class NoteVO {
private Integer noteId;
private String content;
private Boolean needCollapsed = false;
private String displayContent;
private Integer likeCount;
private Integer commentCount;
private Integer collectCount;
private LocalDateTime createdAt;
private SimpleAuthorVO author;
private UserActionsVO userActions;
private SimpleQuestionVO question;
@Data
public static class SimpleAuthorVO {
private Long userId;
private String username;
private String avatarUrl;
}
@Data
public static class UserActionsVO {
private Boolean isLiked = false;
private Boolean isCollected = false;
}
@Data
public static class SimpleQuestionVO {
private Integer questionId;
private String title;
}
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface CategoryService {
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface CollectionNoteService {
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface CollectionService {
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface CommentService {
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface MessageService {
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface NoteCommentService {
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface NoteLikeService {
}

View File

@ -0,0 +1,28 @@
package com.example.copykamanotes.service;
import com.example.copykamanotes.model.base.ApiResponse;
import com.example.copykamanotes.model.base.EmptyVO;
import com.example.copykamanotes.model.dto.note.*;
import com.example.copykamanotes.model.vo.note.CreateNoteVO;
import com.example.copykamanotes.model.vo.note.DownloadNoteVO;
import com.example.copykamanotes.model.vo.note.NoteVO;
import java.util.List;
public interface NoteService {
ApiResponse<List<NoteVO>> getNotes(NoteQueryParams noteQueryParams);
ApiResponse<CreateNoteVO> createNote(CreateNoteRequest createNoteRequest);
ApiResponse<EmptyVO> updateNote(Integer noteId, UpdateNoteRequest updateNoteRequest);
ApiResponse<EmptyVO> deleteNote(Integer noteId);
ApiResponse<DownloadNoteVO> downloadNote(Integer noteId);
ApiResponse<List<NoteRankListItem>> submitNoteRank();
ApiResponse<List<NoteHeatMapItem>> submitNoteHeatMap();
ApiResponse<Top3Count> submitNoteTop3Count();
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface QuestionListItemService {
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface QuestionListService {
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface QuestionService {
}

View File

@ -0,0 +1,19 @@
package com.example.copykamanotes.service;
public interface RedisService {
void set(String key, Object value);
void setWithExpire(String key, Object value, long expire);
Object get(String key);
void delete(String key);
boolean exists(String key);
Long increment(String key, long delta);
Object getHashValue(String hashKey, String key);
void setHashValue(String hashKey, String key, Object value);
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface SearchService {
}

View File

@ -0,0 +1,4 @@
package com.example.copykamanotes.service;
public interface StatisticService {
}

View File

@ -0,0 +1,9 @@
package com.example.copykamanotes.service;
import com.example.copykamanotes.model.base.ApiResponse;
import com.example.copykamanotes.model.vo.upload.ImageVO;
import org.springframework.web.multipart.MultipartFile;
public interface UploadService {
ApiResponse<ImageVO> uploadImage(MultipartFile file);
}

View File

@ -0,0 +1,55 @@
package com.example.copykamanotes.service.impl;
import com.example.copykamanotes.model.base.ApiResponse;
import com.example.copykamanotes.model.base.EmptyVO;
import com.example.copykamanotes.model.dto.note.*;
import com.example.copykamanotes.model.vo.note.CreateNoteVO;
import com.example.copykamanotes.model.vo.note.DownloadNoteVO;
import com.example.copykamanotes.model.vo.note.NoteVO;
import com.example.copykamanotes.service.NoteService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class NoteServiceImpl implements NoteService {
@Override
public ApiResponse<List<NoteVO>> getNotes(NoteQueryParams noteQueryParams) {
return null;
}
@Override
public ApiResponse<CreateNoteVO> createNote(CreateNoteRequest createNoteRequest) {
return null;
}
@Override
public ApiResponse<EmptyVO> updateNote(Integer noteId, UpdateNoteRequest updateNoteRequest) {
return null;
}
@Override
public ApiResponse<EmptyVO> deleteNote(Integer noteId) {
return null;
}
@Override
public ApiResponse<DownloadNoteVO> downloadNote(Integer noteId) {
return null;
}
@Override
public ApiResponse<List<NoteRankListItem>> submitNoteRank() {
return null;
}
@Override
public ApiResponse<List<NoteHeatMapItem>> submitNoteHeatMap() {
return null;
}
@Override
public ApiResponse<Top3Count> submitNoteTop3Count() {
return null;
}
}

View File

@ -0,0 +1,53 @@
package com.example.copykamanotes.service.impl;
import com.example.copykamanotes.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class RedisServiceImpl implements RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
@Override
public void setWithExpire(String key, Object value, long expire) {
redisTemplate.opsForValue().set(key, value, expire);
}
@Override
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
@Override
public void delete(String key) {
redisTemplate.delete(key);
}
@Override
public boolean exists(String key) {
return Boolean.TRUE.equals(redisTemplate.hasKey(key));
}
@Override
public Long increment(String key, long delta) {
return redisTemplate.opsForValue().increment(key, delta);
}
@Override
public Object getHashValue(String hashKey, String key) {
return redisTemplate.opsForHash().get(hashKey, key);
}
@Override
public void setHashValue(String hashKey, String key, Object value) {
redisTemplate.opsForHash().put(hashKey, key, value);
}
}

View File

@ -0,0 +1,25 @@
package com.example.copykamanotes.service.impl;
import com.example.copykamanotes.model.base.ApiResponse;
import com.example.copykamanotes.model.vo.upload.ImageVO;
import com.example.copykamanotes.service.FileService;
import com.example.copykamanotes.service.UploadService;
import com.example.copykamanotes.utils.ApiResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Service
public class UploadServiceImpl implements UploadService {
@Autowired
private FileService fileService;
@Override
public ApiResponse<ImageVO> uploadImage(MultipartFile file) {
String url = fileService.uploadImage(file);
ImageVO imageVO = new ImageVO();
imageVO.setUrl(url);
return ApiResponseUtil.success("上传成功", imageVO);
}
}