feat: 添加笔记本

This commit is contained in:
yulinling 2025-08-03 09:44:23 +08:00
parent 717c3509b4
commit f964e37531
9 changed files with 246 additions and 25 deletions

View File

@ -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<PageResult<NotebookVO>> notebooksGet(@Valid PageParam pageParam) {
PageResult<NotebookVO> 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) {
}
}

View File

@ -0,0 +1,41 @@
package asia.yulinling.workflow.exception;
import lombok.Getter;
/**
* <p>
* 业务异常
* </p>
*
* @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;
}
}

View File

@ -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);
}
/**
* 统一 页面 异常处理
*

View File

@ -42,13 +42,13 @@ public class Notebook {
* 创建时间
*/
@TableField("created_at")
Date createTime;
Date createdTime;
/**
* 更新时间
*/
@TableField("update_at")
Date updateTime;
@TableField("updated_at")
Date updatedTime;
/**
* 笔记本内的笔记数量

View File

@ -0,0 +1,56 @@
package asia.yulinling.workflow.model.vo;
import lombok.Data;
import java.util.Date;
/**
* <p>
* 笔记本VO
* </p>
*
* @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;
}

View File

@ -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<Notebook> getNotebookList();
PageResult<NotebookVO> getNotebookList(PageParam pageParam);
/**
* 获取指定用户的笔记本列表
*
* @param userId 用户id
* @return 笔记本列表
*/
List<Notebook> getNotebookListByUserId(Long userId);
/**
* 检测笔记本Id存在
*
* @param notebookId 笔记本id
* @return 结果
*/
boolean checkNotebookIdExist(Long notebookId);
}

View File

@ -18,6 +18,8 @@ import org.springframework.transaction.annotation.Transactional;
@Transactional
public interface UserService {
boolean checkUserIdExist(Long userId);
/**
* 获取用户列表分页
*

View File

@ -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<Notebook> getNotebookList() {
return List.of();
public PageResult<NotebookVO> getNotebookList(PageParam pageParam) {
Page<Notebook> page = new Page<>(pageParam.getPageNum(), pageParam.getPageSize());
Page<Notebook> notebookPage = notebookMapper.selectPage(page, null);
List<NotebookVO> 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<Notebook> getNotebookListByUserId(Long userId) {
if (!userService.checkUserIdExist(userId)) {
throw new ServiceException("用户不存在");
}
return notebookMapper.selectList(new LambdaQueryWrapper<Notebook>().eq(Notebook::getUserId, userId));
}
/**
* 检测笔记本Id存在
*
* @param notebookId 笔记本id
* @return 结果
*/
@Override
public boolean checkNotebookIdExist(Long notebookId) {
return notebookMapper.exists(new LambdaQueryWrapper<Notebook>().eq(Notebook::getId, notebookId));
}
}

View File

@ -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<User>().eq(User::getId, userId));
}
/**
* 获取用户列表分页
*