增加demo模块。优化提示词文档

This commit is contained in:
lpd
2026-01-22 17:56:09 +08:00
parent 2863c963ca
commit cd5093d602
24 changed files with 2899 additions and 28 deletions

View File

@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>cn.iocoder.boot</groupId>
<artifactId>lyzsys</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>lyzsys-module-demo</artifactId>
<packaging>jar</packaging>
<name>${project.artifactId}</name>
<description>
demo 模块,演示业务功能。
例如:项目管理等
</description>
<dependencies>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>lyzsys-module-infra</artifactId>
<version>${revision}</version>
</dependency>
<!-- 业务组件 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>lyzsys-spring-boot-starter-biz-tenant</artifactId>
</dependency>
<!-- Web 相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>lyzsys-spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- DB 相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>lyzsys-spring-boot-starter-mybatis</artifactId>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>lyzsys-spring-boot-starter-redis</artifactId>
</dependency>
<!-- Test 测试相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>lyzsys-spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>lyzsys-spring-boot-starter-excel</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,102 @@
package cn.iocoder.lyzsys.module.demo.controller.admin.project;
import cn.iocoder.lyzsys.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.lyzsys.framework.common.pojo.CommonResult;
import cn.iocoder.lyzsys.framework.common.pojo.PageParam;
import cn.iocoder.lyzsys.framework.common.pojo.PageResult;
import cn.iocoder.lyzsys.framework.common.util.object.BeanUtils;
import cn.iocoder.lyzsys.framework.excel.core.util.ExcelUtils;
import cn.iocoder.lyzsys.module.demo.controller.admin.project.vo.ProjectPageReqVO;
import cn.iocoder.lyzsys.module.demo.controller.admin.project.vo.ProjectRespVO;
import cn.iocoder.lyzsys.module.demo.controller.admin.project.vo.ProjectSaveReqVO;
import cn.iocoder.lyzsys.module.demo.dal.dataobject.project.ProjectDO;
import cn.iocoder.lyzsys.module.demo.service.project.ProjectService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.lyzsys.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.lyzsys.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 项目管理")
@RestController
@RequestMapping("/demo/project")
@Validated
public class ProjectController {
@Resource
private ProjectService projectService;
@PostMapping("/create")
@Operation(summary = "创建项目")
@PreAuthorize("@ss.hasPermission('demo:project:create')")
public CommonResult<Long> createProject(@Valid @RequestBody ProjectSaveReqVO createReqVO) {
Long projectId = projectService.createProject(createReqVO);
return success(projectId);
}
@PutMapping("/update")
@Operation(summary = "修改项目")
@PreAuthorize("@ss.hasPermission('demo:project:update')")
public CommonResult<Boolean> updateProject(@Valid @RequestBody ProjectSaveReqVO updateReqVO) {
projectService.updateProject(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除项目")
@Parameter(name = "id", description = "编号", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('demo:project:delete')")
public CommonResult<Boolean> deleteProject(@RequestParam("id") Long id) {
projectService.deleteProject(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Operation(summary = "批量删除项目")
@Parameter(name = "ids", description = "编号列表", required = true)
@PreAuthorize("@ss.hasPermission('demo:project:delete')")
public CommonResult<Boolean> deleteProjectList(@RequestParam("ids") List<Long> ids) {
projectService.deleteProjectList(ids);
return success(true);
}
@GetMapping("/page")
@Operation(summary = "获得项目分页列表")
@PreAuthorize("@ss.hasPermission('demo:project:query')")
public CommonResult<PageResult<ProjectRespVO>> getProjectPage(@Valid ProjectPageReqVO pageReqVO) {
PageResult<ProjectDO> pageResult = projectService.getProjectPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ProjectRespVO.class));
}
@GetMapping("/get")
@Operation(summary = "获得项目详情")
@Parameter(name = "id", description = "编号", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('demo:project:query')")
public CommonResult<ProjectRespVO> getProject(@RequestParam("id") Long id) {
ProjectDO project = projectService.getProject(id);
return success(BeanUtils.toBean(project, ProjectRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出项目")
@PreAuthorize("@ss.hasPermission('demo:project:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportProject(HttpServletResponse response, @Valid ProjectPageReqVO exportReqVO) throws IOException {
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ProjectDO> list = projectService.getProjectPage(exportReqVO).getList();
// 导出
ExcelUtils.write(response, "项目管理.xls", "数据", ProjectRespVO.class,
BeanUtils.toBean(list, ProjectRespVO.class));
}
}

View File

@@ -0,0 +1,28 @@
package cn.iocoder.lyzsys.module.demo.controller.admin.project.vo;
import cn.iocoder.lyzsys.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.lyzsys.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 项目管理分页列表 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class ProjectPageReqVO extends PageParam {
@Schema(description = "项目名称,模糊匹配", example = "示例项目")
private String projectName;
@Schema(description = "项目编号,模糊匹配", example = "PROJ-2024-001")
private String projectCode;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@Schema(description = "立项时间")
private LocalDateTime[] establishDate;
}

View File

@@ -0,0 +1,35 @@
package cn.iocoder.lyzsys.module.demo.controller.admin.project.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 项目管理信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ProjectRespVO {
@Schema(description = "项目ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("项目ID")
private Long id;
@Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "示例项目")
@ExcelProperty("项目名称")
private String projectName;
@Schema(description = "项目编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "PROJ-2024-001")
@ExcelProperty("项目编号")
private String projectCode;
@Schema(description = "立项时间", example = "2024-01-01 00:00:00")
@ExcelProperty("立项时间")
private LocalDateTime establishDate;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,34 @@
package cn.iocoder.lyzsys.module.demo.controller.admin.project.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import static cn.iocoder.lyzsys.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 项目管理创建/修改 Request VO")
@Data
public class ProjectSaveReqVO {
@Schema(description = "项目ID", example = "1")
private Long id;
@Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "示例项目")
@NotBlank(message = "项目名称不能为空")
@Size(max = 100, message = "项目名称长度不能超过100个字符")
private String projectName;
@Schema(description = "项目编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "PROJ-2024-001")
@NotBlank(message = "项目编号不能为空")
@Size(max = 50, message = "项目编号长度不能超过50个字符")
private String projectCode;
@Schema(description = "立项时间", example = "2024-01-01 00:00:00")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime establishDate;
}

View File

@@ -0,0 +1,44 @@
package cn.iocoder.lyzsys.module.demo.dal.dataobject.project;
import cn.iocoder.lyzsys.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 项目管理 DO
*
* @author lyzsys
*/
@TableName("demo_project")
@KeySequence("demo_project_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
public class ProjectDO extends BaseDO {
/**
* 项目ID
*/
@TableId
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* 项目编号
*/
private String projectCode;
/**
* 立项时间
*/
private LocalDateTime establishDate;
}

View File

@@ -0,0 +1,30 @@
package cn.iocoder.lyzsys.module.demo.dal.mysql.project;
import cn.iocoder.lyzsys.framework.common.pojo.PageResult;
import cn.iocoder.lyzsys.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.lyzsys.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.lyzsys.module.demo.controller.admin.project.vo.ProjectPageReqVO;
import cn.iocoder.lyzsys.module.demo.dal.dataobject.project.ProjectDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 项目管理 Mapper
*
* @author lyzsys
*/
@Mapper
public interface ProjectMapper extends BaseMapperX<ProjectDO> {
default PageResult<ProjectDO> selectPage(ProjectPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ProjectDO>()
.likeIfPresent(ProjectDO::getProjectName, reqVO.getProjectName())
.likeIfPresent(ProjectDO::getProjectCode, reqVO.getProjectCode())
.betweenIfPresent(ProjectDO::getEstablishDate, reqVO.getEstablishDate())
.orderByDesc(ProjectDO::getId));
}
default ProjectDO selectByProjectCode(String projectCode) {
return selectOne(ProjectDO::getProjectCode, projectCode);
}
}

View File

@@ -0,0 +1,16 @@
package cn.iocoder.lyzsys.module.demo.enums;
import cn.iocoder.lyzsys.framework.common.exception.ErrorCode;
/**
* Demo 错误码枚举类
*
* demo 模块,使用 1-010-000-000 段
*/
public interface ErrorCodeConstants {
// ========== 项目管理模块 1-010-001-000 ==========
ErrorCode PROJECT_NOT_EXISTS = new ErrorCode(1_010_001_000, "项目不存在");
ErrorCode PROJECT_CODE_DUPLICATE = new ErrorCode(1_010_001_001, "已经存在该项目编号");
}

View File

@@ -0,0 +1,62 @@
package cn.iocoder.lyzsys.module.demo.service.project;
import cn.iocoder.lyzsys.framework.common.pojo.PageResult;
import cn.iocoder.lyzsys.module.demo.controller.admin.project.vo.ProjectPageReqVO;
import cn.iocoder.lyzsys.module.demo.controller.admin.project.vo.ProjectSaveReqVO;
import cn.iocoder.lyzsys.module.demo.dal.dataobject.project.ProjectDO;
import java.util.List;
/**
* 项目管理 Service 接口
*
* @author lyzsys
*/
public interface ProjectService {
/**
* 创建项目
*
* @param createReqVO 项目信息
* @return 项目编号
*/
Long createProject(ProjectSaveReqVO createReqVO);
/**
* 更新项目
*
* @param updateReqVO 项目信息
*/
void updateProject(ProjectSaveReqVO updateReqVO);
/**
* 删除项目
*
* @param id 项目编号
*/
void deleteProject(Long id);
/**
* 批量删除项目
*
* @param ids 项目编号列表
*/
void deleteProjectList(List<Long> ids);
/**
* 获得项目分页列表
*
* @param pageReqVO 分页请求
* @return 项目分页列表
*/
PageResult<ProjectDO> getProjectPage(ProjectPageReqVO pageReqVO);
/**
* 获得项目详情
*
* @param id 项目编号
* @return 项目详情
*/
ProjectDO getProject(Long id);
}

View File

@@ -0,0 +1,102 @@
package cn.iocoder.lyzsys.module.demo.service.project;
import cn.iocoder.lyzsys.framework.common.pojo.PageResult;
import cn.iocoder.lyzsys.framework.common.util.object.BeanUtils;
import cn.iocoder.lyzsys.module.demo.controller.admin.project.vo.ProjectPageReqVO;
import cn.iocoder.lyzsys.module.demo.controller.admin.project.vo.ProjectSaveReqVO;
import cn.iocoder.lyzsys.module.demo.dal.dataobject.project.ProjectDO;
import cn.iocoder.lyzsys.module.demo.dal.mysql.project.ProjectMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.lyzsys.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.lyzsys.module.demo.enums.ErrorCodeConstants.*;
/**
* 项目管理 Service 实现类
*
* @author lyzsys
*/
@Service
@Validated
public class ProjectServiceImpl implements ProjectService {
@Resource
private ProjectMapper projectMapper;
@Override
public Long createProject(ProjectSaveReqVO createReqVO) {
// 校验项目编号的唯一性
validateProjectCodeUnique(null, createReqVO.getProjectCode());
// 插入项目
ProjectDO project = BeanUtils.toBean(createReqVO, ProjectDO.class);
projectMapper.insert(project);
return project.getId();
}
@Override
public void updateProject(ProjectSaveReqVO updateReqVO) {
// 校验项目存在
validateProjectExists(updateReqVO.getId());
// 校验项目编号的唯一性
validateProjectCodeUnique(updateReqVO.getId(), updateReqVO.getProjectCode());
// 更新项目
ProjectDO updateObj = BeanUtils.toBean(updateReqVO, ProjectDO.class);
projectMapper.updateById(updateObj);
}
@Override
public void deleteProject(Long id) {
// 校验项目存在
validateProjectExists(id);
// 删除项目
projectMapper.deleteById(id);
}
@Override
public void deleteProjectList(List<Long> ids) {
// 校验项目存在
ids.forEach(this::validateProjectExists);
// 批量删除
projectMapper.deleteBatchIds(ids);
}
@Override
public PageResult<ProjectDO> getProjectPage(ProjectPageReqVO pageReqVO) {
return projectMapper.selectPage(pageReqVO);
}
@Override
public ProjectDO getProject(Long id) {
return projectMapper.selectById(id);
}
// ==================== 校验方法 ====================
private void validateProjectExists(Long id) {
if (projectMapper.selectById(id) == null) {
throw exception(PROJECT_NOT_EXISTS);
}
}
private void validateProjectCodeUnique(Long id, String projectCode) {
ProjectDO project = projectMapper.selectByProjectCode(projectCode);
if (project == null) {
return;
}
// 如果 id 为空,说明是新增,项目编号已存在则报错
if (id == null) {
throw exception(PROJECT_CODE_DUPLICATE);
}
// 如果有 id说明是修改判断是否是自己
if (!project.getId().equals(id)) {
throw exception(PROJECT_CODE_DUPLICATE);
}
}
}