diff --git a/src/main/java/asia/yulinling/workflow/controller/NotebookController.java b/src/main/java/asia/yulinling/workflow/controller/NotebookController.java index 535988c..014ccd4 100644 --- a/src/main/java/asia/yulinling/workflow/controller/NotebookController.java +++ b/src/main/java/asia/yulinling/workflow/controller/NotebookController.java @@ -2,8 +2,11 @@ package asia.yulinling.workflow.controller; import asia.yulinling.workflow.constant.Status; import asia.yulinling.workflow.dto.request.NotebookRequest; +import asia.yulinling.workflow.dto.request.PageParam; +import asia.yulinling.workflow.dto.response.PageResult; import asia.yulinling.workflow.model.ApiResponse; import asia.yulinling.workflow.model.entity.Notebook; +import asia.yulinling.workflow.model.vo.NotebookVO; import asia.yulinling.workflow.service.NotebookService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -27,18 +30,20 @@ public class NotebookController { } @GetMapping("/notebooks") - public void notebooksGet() { + public ApiResponse> notebooksGet(@Valid PageParam pageParam) { + PageResult notebookList = notebookService.getNotebookList(pageParam); + return ApiResponse.ofStatus(Status.SUCCESS, notebookList); } @GetMapping("/notebooks/{id}") - public void notebooksGet(@PathVariable String id) { + public void notebooksGet(@PathVariable Long id) { } @PutMapping("/notebooks/{id}") - public void notebooksPut(@PathVariable String id) { + public void notebooksPut(@PathVariable Long id) { } @DeleteMapping("/notebooks/{id}") - public void notebooksDelete(@PathVariable String id) { + public void notebooksDelete(@PathVariable Long id) { } } diff --git a/src/main/java/asia/yulinling/workflow/exception/ServiceException.java b/src/main/java/asia/yulinling/workflow/exception/ServiceException.java new file mode 100644 index 0000000..a277e40 --- /dev/null +++ b/src/main/java/asia/yulinling/workflow/exception/ServiceException.java @@ -0,0 +1,41 @@ +package asia.yulinling.workflow.exception; + +import lombok.Getter; + +/** + *

+ * 业务异常 + *

+ * + * @author YLL + * @since 2025/7/31 + */ +public class ServiceException extends RuntimeException { + + /** + * 错误提示 + */ + @Getter + private String message; + + @Getter + private String detailMessage; + + public ServiceException() { + + } + + public ServiceException(String message) { + this.message = message; + } + + public ServiceException setDetailMessage(String detailMessage) { + this.detailMessage = detailMessage; + return this; + } + + public ServiceException setMessage(String message) { + this.message = message; + return this; + } +} diff --git a/src/main/java/asia/yulinling/workflow/exception/handler/GlobalExceptionHandler.java b/src/main/java/asia/yulinling/workflow/exception/handler/GlobalExceptionHandler.java index d87c81d..0c568d7 100644 --- a/src/main/java/asia/yulinling/workflow/exception/handler/GlobalExceptionHandler.java +++ b/src/main/java/asia/yulinling/workflow/exception/handler/GlobalExceptionHandler.java @@ -1,6 +1,7 @@ package asia.yulinling.workflow.exception.handler; import asia.yulinling.workflow.exception.PageException; +import asia.yulinling.workflow.exception.ServiceException; import asia.yulinling.workflow.model.ApiResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -34,6 +35,19 @@ public class GlobalExceptionHandler { return ApiResponse.of(500, e.getMessage(), null); } + /** + * 统一 ServiceException 异常处理 + * + * @param e ServiceException + * @return 统一返回 json 格式 + */ + @ExceptionHandler(ServiceException.class) + @ResponseBody + public ApiResponse catchErrorHandler(ServiceException e) { + log.error("service error:{}", e.getMessage()); + return ApiResponse.of(500, e.getMessage(), null); + } + /** * 统一 页面 异常处理 * diff --git a/src/main/java/asia/yulinling/workflow/model/entity/Notebook.java b/src/main/java/asia/yulinling/workflow/model/entity/Notebook.java index 0c3ee1f..a7e38a0 100644 --- a/src/main/java/asia/yulinling/workflow/model/entity/Notebook.java +++ b/src/main/java/asia/yulinling/workflow/model/entity/Notebook.java @@ -42,13 +42,13 @@ public class Notebook { * 创建时间 */ @TableField("created_at") - Date createTime; + Date createdTime; /** * 更新时间 */ - @TableField("update_at") - Date updateTime; + @TableField("updated_at") + Date updatedTime; /** * 笔记本内的笔记数量 diff --git a/src/main/java/asia/yulinling/workflow/model/vo/NotebookVO.java b/src/main/java/asia/yulinling/workflow/model/vo/NotebookVO.java new file mode 100644 index 0000000..d1408bc --- /dev/null +++ b/src/main/java/asia/yulinling/workflow/model/vo/NotebookVO.java @@ -0,0 +1,56 @@ +package asia.yulinling.workflow.model.vo; + +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 笔记本VO + *

+ * + * @author YLL + * @since 2025/8/3 + */ +@Data +public class NotebookVO { + /** + * 主键 + */ + Long id; + + /** + * 用户id,外键 + */ + Long userId; + + /** + * 笔记本名称 + */ + String name; + + /** + * 笔记本颜色标识 + */ + String color; + + /** + * 笔记本图标标识 + */ + String icon; + + /** + * 创建时间 + */ + Date createdTime; + + /** + * 更新时间 + */ + Date updatedTime; + + /** + * 笔记本内的笔记数量 + */ + Integer notesCount; +} diff --git a/src/main/java/asia/yulinling/workflow/service/NotebookService.java b/src/main/java/asia/yulinling/workflow/service/NotebookService.java index 16a7665..5a57a0c 100644 --- a/src/main/java/asia/yulinling/workflow/service/NotebookService.java +++ b/src/main/java/asia/yulinling/workflow/service/NotebookService.java @@ -1,6 +1,9 @@ package asia.yulinling.workflow.service; +import asia.yulinling.workflow.dto.request.PageParam; +import asia.yulinling.workflow.dto.response.PageResult; import asia.yulinling.workflow.model.entity.Notebook; +import asia.yulinling.workflow.model.vo.NotebookVO; import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -12,34 +15,53 @@ public interface NotebookService { * * @param notebook 笔记本 */ - void addNotebook(Notebook notebook); + int addNotebook(Notebook notebook); /** * 删除笔记本 * - * @param id 笔记本id + * @param notebookId 笔记本id + * @return 结果 */ - void deleteNotebook(Long id); + int deleteNotebookById(Long notebookId); /** * 更新笔记本 * * @param notebook 笔记本 + * @return 结果 */ - void updateNotebook(Notebook notebook); + int updateNotebook(Notebook notebook); /** * 获取笔记本内容 * - * @param id 笔记本id - * @return 笔记本 + * @param notebookId 笔记本id + * @return 结果 */ - Notebook getNotebook(Long id); + Notebook getNotebook(Long notebookId); /** * 获取笔记本列表 * + * @param pageParam 分页参数 * @return 笔记本列表 */ - List getNotebookList(); + PageResult getNotebookList(PageParam pageParam); + + /** + * 获取指定用户的笔记本列表 + * + * @param userId 用户id + * @return 笔记本列表 + */ + List getNotebookListByUserId(Long userId); + + /** + * 检测笔记本Id存在 + * + * @param notebookId 笔记本id + * @return 结果 + */ + boolean checkNotebookIdExist(Long notebookId); } diff --git a/src/main/java/asia/yulinling/workflow/service/UserService.java b/src/main/java/asia/yulinling/workflow/service/UserService.java index 41b8618..76d9851 100644 --- a/src/main/java/asia/yulinling/workflow/service/UserService.java +++ b/src/main/java/asia/yulinling/workflow/service/UserService.java @@ -18,6 +18,8 @@ import org.springframework.transaction.annotation.Transactional; @Transactional public interface UserService { + boolean checkUserIdExist(Long userId); + /** * 获取用户列表分页 * diff --git a/src/main/java/asia/yulinling/workflow/service/impl/NotebookServiceImpl.java b/src/main/java/asia/yulinling/workflow/service/impl/NotebookServiceImpl.java index 80af121..913ab60 100644 --- a/src/main/java/asia/yulinling/workflow/service/impl/NotebookServiceImpl.java +++ b/src/main/java/asia/yulinling/workflow/service/impl/NotebookServiceImpl.java @@ -1,44 +1,114 @@ package asia.yulinling.workflow.service.impl; +import asia.yulinling.workflow.dto.request.PageParam; +import asia.yulinling.workflow.dto.response.PageResult; +import asia.yulinling.workflow.exception.ServiceException; import asia.yulinling.workflow.mapper.NotebookMapper; import asia.yulinling.workflow.model.entity.Notebook; +import asia.yulinling.workflow.model.vo.NotebookVO; import asia.yulinling.workflow.service.NotebookService; +import asia.yulinling.workflow.service.UserService; +import asia.yulinling.workflow.utils.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; +@Slf4j @Service @RequiredArgsConstructor public class NotebookServiceImpl implements NotebookService { private final NotebookMapper notebookMapper; + private final UserService userService; @Override - public void addNotebook(Notebook notebook) { - if (notebook == null) { - return; + public int addNotebook(Notebook notebook) { + + if (!userService.checkUserIdExist(notebook.getUserId())) { + throw new ServiceException("用户不存在"); } - notebookMapper.insert(notebook); + return notebookMapper.insert(notebook); } @Override - public void deleteNotebook(Long id) { + public int deleteNotebookById(Long notebookId) { + if (!userService.checkUserIdExist(notebookId)) { + throw new ServiceException("笔记本不存在"); + } + return notebookMapper.deleteById(notebookId); } @Override - public void updateNotebook(Notebook notebook) { + public int updateNotebook(Notebook notebook) { + if (!userService.checkUserIdExist(notebook.getUserId())) { + throw new ServiceException("笔记本不存在"); + } + return notebookMapper.updateById(notebook); } @Override - public Notebook getNotebook(Long id) { - return null; + public Notebook getNotebook(Long notebookId) { + if (!userService.checkUserIdExist(notebookId)) { + throw new ServiceException("笔记本不存在"); + } + + return notebookMapper.selectById(notebookId); } + /** + * 获取笔记本列表 + * + * @param pageParam 分页参数 + * @return 笔记本列表 + */ @Override - public List getNotebookList() { - return List.of(); + public PageResult getNotebookList(PageParam pageParam) { + + + Page page = new Page<>(pageParam.getPageNum(), pageParam.getPageSize()); + Page notebookPage = notebookMapper.selectPage(page, null); + + List notebookVOList = new ArrayList<>(); + for (Notebook notebook : notebookPage.getRecords()) { + NotebookVO notebookVO = new NotebookVO(); + BeanUtils.copyProperties(notebook, notebookVO); + notebookVOList.add(notebookVO); + } + + return PageUtil.buildPageResult(notebookPage, notebookVOList); + } + + /** + * 获取指定用户的笔记本列表 + * + * @param userId 用户id + * @return 笔记本列表 + */ + @Override + public List getNotebookListByUserId(Long userId) { + if (!userService.checkUserIdExist(userId)) { + throw new ServiceException("用户不存在"); + } + + return notebookMapper.selectList(new LambdaQueryWrapper().eq(Notebook::getUserId, userId)); + } + + /** + * 检测笔记本Id存在 + * + * @param notebookId 笔记本id + * @return 结果 + */ + @Override + public boolean checkNotebookIdExist(Long notebookId) { + return notebookMapper.exists(new LambdaQueryWrapper().eq(Notebook::getId, notebookId)); } } diff --git a/src/main/java/asia/yulinling/workflow/service/impl/UserServiceImpl.java b/src/main/java/asia/yulinling/workflow/service/impl/UserServiceImpl.java index a852759..740e7e6 100644 --- a/src/main/java/asia/yulinling/workflow/service/impl/UserServiceImpl.java +++ b/src/main/java/asia/yulinling/workflow/service/impl/UserServiceImpl.java @@ -47,6 +47,17 @@ public class UserServiceImpl implements UserService { private final RoleUserMapper roleUserMapper; private final RoleMapper roleMapper; + /** + * 校验用户id存在 + * + * @param userId 用户id + * @return 结果 + */ + @Override + public boolean checkUserIdExist(Long userId) { + return userMapper.exists(new LambdaQueryWrapper().eq(User::getId, userId)); + } + /** * 获取用户列表分页 *