From 8c27bdfadf0edc26127b9806fae763a6b507cc3c Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 2 Sep 2025 13:36:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(oa):=20=E6=B7=BB=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增文章管理相关的实体类、Mapper、Service、Controller- 实现文章的增删改查、分页查询、导出等功能 - 添加数据校验和逻辑删除支持 --- .../oa/controller/OaArticleController.java | 101 ++++++++++++++++ .../java/com/ruoyi/oa/domain/OaArticle.java | 52 ++++++++ .../com/ruoyi/oa/domain/bo/OaArticleBo.java | 50 ++++++++ .../com/ruoyi/oa/domain/vo/OaArticleVo.java | 56 +++++++++ .../com/ruoyi/oa/mapper/OaArticleMapper.java | 15 +++ .../ruoyi/oa/service/IOaArticleService.java | 49 ++++++++ .../oa/service/impl/OaArticleServiceImpl.java | 111 ++++++++++++++++++ .../resources/mapper/oa/OaArticleMapper.xml | 21 ++++ 8 files changed, 455 insertions(+) create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaArticleController.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaArticle.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaArticleBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaArticleVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaArticleMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaArticleService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaArticleServiceImpl.java create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/OaArticleMapper.xml diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaArticleController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaArticleController.java new file mode 100644 index 0000000..35e8a47 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaArticleController.java @@ -0,0 +1,101 @@ +package com.ruoyi.oa.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.OaArticleVo; +import com.ruoyi.oa.domain.bo.OaArticleBo; +import com.ruoyi.oa.service.IOaArticleService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 文章 + * + * @author Joshi + * @date 2025-09-02 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/article") +public class OaArticleController extends BaseController { + + private final IOaArticleService iOaArticleService; + + /** + * 查询文章列表 + */ + @GetMapping("/list") + public TableDataInfo list(OaArticleBo bo, PageQuery pageQuery) { + return iOaArticleService.queryPageList(bo, pageQuery); + } + + /** + * 导出文章列表 + */ + @Log(title = "文章", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OaArticleBo bo, HttpServletResponse response) { + List list = iOaArticleService.queryList(bo); + ExcelUtil.exportExcel(list, "文章", OaArticleVo.class, response); + } + + /** + * 获取文章详细信息 + * + * @param articleId 主键 + */ + @GetMapping("/{articleId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long articleId) { + return R.ok(iOaArticleService.queryById(articleId)); + } + + /** + * 新增文章 + */ + @Log(title = "文章", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OaArticleBo bo) { + return toAjax(iOaArticleService.insertByBo(bo)); + } + + /** + * 修改文章 + */ + @Log(title = "文章", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OaArticleBo bo) { + return toAjax(iOaArticleService.updateByBo(bo)); + } + + /** + * 删除文章 + * + * @param articleIds 主键串 + */ + @Log(title = "文章", businessType = BusinessType.DELETE) + @DeleteMapping("/{articleIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] articleIds) { + return toAjax(iOaArticleService.deleteWithValidByIds(Arrays.asList(articleIds), true)); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaArticle.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaArticle.java new file mode 100644 index 0000000..f5237fd --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaArticle.java @@ -0,0 +1,52 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 文章对象 oa_article + * + * @author Joshi + * @date 2025-09-02 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("oa_article") +public class OaArticle extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 文章主键ID + */ + @TableId(value = "article_id") + private Long articleId; + /** + * 文章标题 + */ + private String title; + /** + * 文章内容 + */ + private String content; + /** + * 文章附件(存储附件路径等信息) + */ + private String accessory; + /** + * 备注 + */ + private String remark; + /** + * 删除标志(0正常 1删除) + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaArticleBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaArticleBo.java new file mode 100644 index 0000000..614b2e3 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaArticleBo.java @@ -0,0 +1,50 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 文章业务对象 oa_article + * + * @author Joshi + * @date 2025-09-02 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class OaArticleBo extends BaseEntity { + + /** + * 文章主键ID + */ + private Long articleId; + + /** + * 文章标题 + */ + private String title; + + /** + * 文章内容 + */ + private String content; + + /** + * 文章附件(存储附件路径等信息) + */ + private String accessory; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaArticleVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaArticleVo.java new file mode 100644 index 0000000..a9f2f99 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaArticleVo.java @@ -0,0 +1,56 @@ +package com.ruoyi.oa.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + + + +/** + * 文章视图对象 oa_article + * + * @author Joshi + * @date 2025-09-02 + */ +@Data +@ExcelIgnoreUnannotated +public class OaArticleVo { + + private static final long serialVersionUID = 1L; + + /** + * 文章主键ID + */ + @ExcelProperty(value = "文章主键ID") + private Long articleId; + + /** + * 文章标题 + */ + @ExcelProperty(value = "文章标题") + private String title; + + /** + * 文章内容 + */ + @ExcelProperty(value = "文章内容") + private String content; + + /** + * 文章附件(存储附件路径等信息) + */ + @ExcelProperty(value = "文章附件", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "存=储附件路径等信息") + private String accessory; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaArticleMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaArticleMapper.java new file mode 100644 index 0000000..a2f84ba --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaArticleMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.oa.domain.OaArticle; +import com.ruoyi.oa.domain.vo.OaArticleVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * 文章Mapper接口 + * + * @author Joshi + * @date 2025-09-02 + */ +public interface OaArticleMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaArticleService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaArticleService.java new file mode 100644 index 0000000..dcf10f6 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaArticleService.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.OaArticle; +import com.ruoyi.oa.domain.vo.OaArticleVo; +import com.ruoyi.oa.domain.bo.OaArticleBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 文章Service接口 + * + * @author Joshi + * @date 2025-09-02 + */ +public interface IOaArticleService { + + /** + * 查询文章 + */ + OaArticleVo queryById(Long articleId); + + /** + * 查询文章列表 + */ + TableDataInfo queryPageList(OaArticleBo bo, PageQuery pageQuery); + + /** + * 查询文章列表 + */ + List queryList(OaArticleBo bo); + + /** + * 新增文章 + */ + Boolean insertByBo(OaArticleBo bo); + + /** + * 修改文章 + */ + Boolean updateByBo(OaArticleBo bo); + + /** + * 校验并批量删除文章信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaArticleServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaArticleServiceImpl.java new file mode 100644 index 0000000..e18b507 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaArticleServiceImpl.java @@ -0,0 +1,111 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.OaArticleBo; +import com.ruoyi.oa.domain.vo.OaArticleVo; +import com.ruoyi.oa.domain.OaArticle; +import com.ruoyi.oa.mapper.OaArticleMapper; +import com.ruoyi.oa.service.IOaArticleService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 文章Service业务层处理 + * + * @author Joshi + * @date 2025-09-02 + */ +@RequiredArgsConstructor +@Service +public class OaArticleServiceImpl implements IOaArticleService { + + private final OaArticleMapper baseMapper; + + /** + * 查询文章 + */ + @Override + public OaArticleVo queryById(Long articleId){ + return baseMapper.selectVoById(articleId); + } + + /** + * 查询文章列表 + */ + @Override + public TableDataInfo queryPageList(OaArticleBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询文章列表 + */ + @Override + public List queryList(OaArticleBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OaArticleBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getTitle()), OaArticle::getTitle, bo.getTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getContent()), OaArticle::getContent, bo.getContent()); + lqw.eq(StringUtils.isNotBlank(bo.getAccessory()), OaArticle::getAccessory, bo.getAccessory()); + return lqw; + } + + /** + * 新增文章 + */ + @Override + public Boolean insertByBo(OaArticleBo bo) { + OaArticle add = BeanUtil.toBean(bo, OaArticle.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setArticleId(add.getArticleId()); + } + return flag; + } + + /** + * 修改文章 + */ + @Override + public Boolean updateByBo(OaArticleBo bo) { + OaArticle update = BeanUtil.toBean(bo, OaArticle.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OaArticle entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除文章 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaArticleMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaArticleMapper.xml new file mode 100644 index 0000000..ef41044 --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaArticleMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + +