diff --git a/src/main/java/com/example/copykamanotes/model/dto/note/CreateNoteRequest.java b/src/main/java/com/example/copykamanotes/model/dto/note/CreateNoteRequest.java new file mode 100644 index 0000000..ec30c08 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/dto/note/CreateNoteRequest.java @@ -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; +} \ No newline at end of file diff --git a/src/main/java/com/example/copykamanotes/model/dto/note/NoteHeatMapItem.java b/src/main/java/com/example/copykamanotes/model/dto/note/NoteHeatMapItem.java new file mode 100644 index 0000000..64d66b2 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/dto/note/NoteHeatMapItem.java @@ -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; +} diff --git a/src/main/java/com/example/copykamanotes/model/dto/note/NoteQueryParams.java b/src/main/java/com/example/copykamanotes/model/dto/note/NoteQueryParams.java new file mode 100644 index 0000000..6b175b3 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/dto/note/NoteQueryParams.java @@ -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; +} diff --git a/src/main/java/com/example/copykamanotes/model/dto/note/NoteRankListItem.java b/src/main/java/com/example/copykamanotes/model/dto/note/NoteRankListItem.java new file mode 100644 index 0000000..4223167 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/dto/note/NoteRankListItem.java @@ -0,0 +1,8 @@ +package com.example.copykamanotes.model.dto.note; + +import lombok.Data; + +@Data +public class NoteRankListItem { + +} diff --git a/src/main/java/com/example/copykamanotes/model/dto/note/Top3Count.java b/src/main/java/com/example/copykamanotes/model/dto/note/Top3Count.java new file mode 100644 index 0000000..57e5c4e --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/dto/note/Top3Count.java @@ -0,0 +1,10 @@ +package com.example.copykamanotes.model.dto.note; + +import lombok.Data; + +@Data +public class Top3Count { + private Integer lastMonthTop3Count; + private Integer thisMonthTop3Count; +} + diff --git a/src/main/java/com/example/copykamanotes/model/dto/note/UpdateNoteRequest.java b/src/main/java/com/example/copykamanotes/model/dto/note/UpdateNoteRequest.java new file mode 100644 index 0000000..651178c --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/dto/note/UpdateNoteRequest.java @@ -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; +} diff --git a/src/main/java/com/example/copykamanotes/model/entity/Note.java b/src/main/java/com/example/copykamanotes/model/entity/Note.java new file mode 100644 index 0000000..0cadfd4 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/entity/Note.java @@ -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; +} diff --git a/src/main/java/com/example/copykamanotes/model/vo/note/CreateNoteVO.java b/src/main/java/com/example/copykamanotes/model/vo/note/CreateNoteVO.java new file mode 100644 index 0000000..b9b15eb --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/vo/note/CreateNoteVO.java @@ -0,0 +1,9 @@ +package com.example.copykamanotes.model.vo.note; + +import lombok.Data; + +@Data +public class CreateNoteVO { + private Integer noteId; +} + diff --git a/src/main/java/com/example/copykamanotes/model/vo/note/DownloadNoteVO.java b/src/main/java/com/example/copykamanotes/model/vo/note/DownloadNoteVO.java new file mode 100644 index 0000000..bf906ad --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/vo/note/DownloadNoteVO.java @@ -0,0 +1,8 @@ +package com.example.copykamanotes.model.vo.note; + +import lombok.Data; + +@Data +public class DownloadNoteVO { + private String markdown; +} diff --git a/src/main/java/com/example/copykamanotes/model/vo/note/NoteVO.java b/src/main/java/com/example/copykamanotes/model/vo/note/NoteVO.java new file mode 100644 index 0000000..d37bb18 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/model/vo/note/NoteVO.java @@ -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; + } +} diff --git a/src/main/java/com/example/copykamanotes/service/CategoryService.java b/src/main/java/com/example/copykamanotes/service/CategoryService.java new file mode 100644 index 0000000..974616c --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/CategoryService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface CategoryService { +} diff --git a/src/main/java/com/example/copykamanotes/service/CollectionNoteService.java b/src/main/java/com/example/copykamanotes/service/CollectionNoteService.java new file mode 100644 index 0000000..4c6f87a --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/CollectionNoteService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface CollectionNoteService { +} diff --git a/src/main/java/com/example/copykamanotes/service/CollectionService.java b/src/main/java/com/example/copykamanotes/service/CollectionService.java new file mode 100644 index 0000000..1dd9cf3 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/CollectionService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface CollectionService { +} diff --git a/src/main/java/com/example/copykamanotes/service/CommentService.java b/src/main/java/com/example/copykamanotes/service/CommentService.java new file mode 100644 index 0000000..5759462 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/CommentService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface CommentService { +} diff --git a/src/main/java/com/example/copykamanotes/service/MessageService.java b/src/main/java/com/example/copykamanotes/service/MessageService.java new file mode 100644 index 0000000..124c67f --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/MessageService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface MessageService { +} diff --git a/src/main/java/com/example/copykamanotes/service/NoteCommentService.java b/src/main/java/com/example/copykamanotes/service/NoteCommentService.java new file mode 100644 index 0000000..e6b8f3f --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/NoteCommentService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface NoteCommentService { +} diff --git a/src/main/java/com/example/copykamanotes/service/NoteLikeService.java b/src/main/java/com/example/copykamanotes/service/NoteLikeService.java new file mode 100644 index 0000000..a38f780 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/NoteLikeService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface NoteLikeService { +} diff --git a/src/main/java/com/example/copykamanotes/service/NoteService.java b/src/main/java/com/example/copykamanotes/service/NoteService.java new file mode 100644 index 0000000..3d9e603 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/NoteService.java @@ -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> getNotes(NoteQueryParams noteQueryParams); + + ApiResponse createNote(CreateNoteRequest createNoteRequest); + + ApiResponse updateNote(Integer noteId, UpdateNoteRequest updateNoteRequest); + + ApiResponse deleteNote(Integer noteId); + + ApiResponse downloadNote(Integer noteId); + + ApiResponse> submitNoteRank(); + + ApiResponse> submitNoteHeatMap(); + + ApiResponse submitNoteTop3Count(); +} diff --git a/src/main/java/com/example/copykamanotes/service/QuestionListItemService.java b/src/main/java/com/example/copykamanotes/service/QuestionListItemService.java new file mode 100644 index 0000000..adbeaa6 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/QuestionListItemService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface QuestionListItemService { +} diff --git a/src/main/java/com/example/copykamanotes/service/QuestionListService.java b/src/main/java/com/example/copykamanotes/service/QuestionListService.java new file mode 100644 index 0000000..35a7caa --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/QuestionListService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface QuestionListService { +} diff --git a/src/main/java/com/example/copykamanotes/service/QuestionService.java b/src/main/java/com/example/copykamanotes/service/QuestionService.java new file mode 100644 index 0000000..02ea561 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/QuestionService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface QuestionService { +} diff --git a/src/main/java/com/example/copykamanotes/service/RedisService.java b/src/main/java/com/example/copykamanotes/service/RedisService.java new file mode 100644 index 0000000..1974c1c --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/RedisService.java @@ -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); +} diff --git a/src/main/java/com/example/copykamanotes/service/SearchService.java b/src/main/java/com/example/copykamanotes/service/SearchService.java new file mode 100644 index 0000000..be21448 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/SearchService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface SearchService { +} diff --git a/src/main/java/com/example/copykamanotes/service/StatisticService.java b/src/main/java/com/example/copykamanotes/service/StatisticService.java new file mode 100644 index 0000000..0fb1392 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/StatisticService.java @@ -0,0 +1,4 @@ +package com.example.copykamanotes.service; + +public interface StatisticService { +} diff --git a/src/main/java/com/example/copykamanotes/service/UploadService.java b/src/main/java/com/example/copykamanotes/service/UploadService.java new file mode 100644 index 0000000..43ab552 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/UploadService.java @@ -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 uploadImage(MultipartFile file); +} diff --git a/src/main/java/com/example/copykamanotes/service/impl/NoteServiceImpl.java b/src/main/java/com/example/copykamanotes/service/impl/NoteServiceImpl.java new file mode 100644 index 0000000..038033d --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/impl/NoteServiceImpl.java @@ -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> getNotes(NoteQueryParams noteQueryParams) { + return null; + } + + @Override + public ApiResponse createNote(CreateNoteRequest createNoteRequest) { + return null; + } + + @Override + public ApiResponse updateNote(Integer noteId, UpdateNoteRequest updateNoteRequest) { + return null; + } + + @Override + public ApiResponse deleteNote(Integer noteId) { + return null; + } + + @Override + public ApiResponse downloadNote(Integer noteId) { + return null; + } + + @Override + public ApiResponse> submitNoteRank() { + return null; + } + + @Override + public ApiResponse> submitNoteHeatMap() { + return null; + } + + @Override + public ApiResponse submitNoteTop3Count() { + return null; + } +} diff --git a/src/main/java/com/example/copykamanotes/service/impl/RedisServiceImpl.java b/src/main/java/com/example/copykamanotes/service/impl/RedisServiceImpl.java new file mode 100644 index 0000000..73ecfd7 --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/impl/RedisServiceImpl.java @@ -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 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); + } +} diff --git a/src/main/java/com/example/copykamanotes/service/impl/UploadServiceImpl.java b/src/main/java/com/example/copykamanotes/service/impl/UploadServiceImpl.java new file mode 100644 index 0000000..95d927a --- /dev/null +++ b/src/main/java/com/example/copykamanotes/service/impl/UploadServiceImpl.java @@ -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 uploadImage(MultipartFile file) { + String url = fileService.uploadImage(file); + ImageVO imageVO = new ImageVO(); + imageVO.setUrl(url); + return ApiResponseUtil.success("上传成功", imageVO); + } +}