فهرست منبع

新增期刊目录管理

liyan 2 ماه پیش
والد
کامیت
d575179a4f

+ 1 - 0
ruoyi-admin/build.gradle

@@ -20,6 +20,7 @@ dependencies {
     implementation project(':ruoyi-ext')
     implementation project(':ruoyi-register')
     implementation project(':ruoyi-cms')
+    implementation project(':ruoyi-journal')
     runtimeOnly 'mysql:mysql-connector-java'
 }
 

+ 26 - 0
ruoyi-journal/README.md

@@ -0,0 +1,26 @@
+# 期刊管理实现方式
+1. 使用CMS管理中的栏目管理,在CmsTerm新建`taxonomy`为`journal`,`type`为`dictionary`的栏目,代表该栏目是用于`期刊管理`,绑定的为`期刊管理的目录JournalCatalog`,每一条数据代表一个期刊,为树状层级结构,可以表示月刊、年刊。例如:
+```
+2024年刊
+    2024-01月刊
+    2024-02月刊
+2025年刊
+# 每一条代表一个栏目数据
+```
+2. 新增期刊目录管理`JournalCatalog`,用于实现与CmsTerm绑定。`JournalCatalog`为层级结构,可以用来表示指定期刊中任意级目录。
+```
+西方哲学
+    欧阳谦 当代哲学叙事的“伦理转向”
+    陈德中 魅力型与合理化的历史二元性
+    蓝 江 身份与生命: 政治哲学与生命政治学的路径差异
+    [美] 埃里克·尼尔森 海德格尔、米施和哲学的起源
+产业发展趋势研究
+    石敏俊 夏梦寒 张红霞制造业服务化对制造业劳动生产率的影响
+    赵 放 刘雨佳人工智能引发中国产业分化及对策研究
+金融风险与治理
+    刘力臻 全球金融治理的困境、变革及中国参与方式
+    唐云锋 毛 军 房地产与地方政府债务风险叠加机制及其 金融空间溢出效应
+...
+英文摘要
+# 每一条数据代表一个JournalCatalog数据
+```

+ 16 - 0
ruoyi-journal/build.gradle

@@ -0,0 +1,16 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * This project uses @Incubating APIs which are subject to change.
+ */
+
+plugins {
+    id 'com.ruoyi.java-library'
+    id 'com.ruoyi.kotlin-library'
+}
+
+dependencies {
+    api project(':ruoyi-common')
+}
+group = 'cc-lotus.ruoyi'
+description = 'ruoyi-journal 期刊管理模块'

+ 91 - 0
ruoyi-journal/src/main/kotlin/com/cclotus/journal/controller/admin/JournalCatalogController.kt

@@ -0,0 +1,91 @@
+package com.cclotus.journal.controller.admin
+
+import com.cclotus.journal.domain.JournalCatalog
+import com.cclotus.journal.service.IJournalCatalogService
+import com.ruoyi.common.annotation.Log
+import com.ruoyi.common.core.controller.BaseController
+import com.ruoyi.common.core.domain.AjaxResult
+import com.ruoyi.common.core.page.TableDataInfo
+import com.ruoyi.common.enums.BusinessType
+import com.ruoyi.common.reqParam.PageParam
+import com.ruoyi.common.utils.TableDataInfoUtil
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.web.bind.annotation.*
+
+@RestController
+@RequestMapping("/journal/catalog")
+class JournalCatalogController : BaseController() {
+
+    @Autowired
+    lateinit var journalCatalogService: IJournalCatalogService
+
+
+    /**
+     * 查询期刊目录列表
+     *
+     * @param paging    是否分页,默认分页
+     * @param journalCatalog 查询参数
+     * @param pageParam 分页参数
+     */
+    @GetMapping(path = ["/list"])
+    fun list(
+        journalCatalog: JournalCatalog,
+        pageParam: PageParam?,
+        @RequestParam(required = false) paging: Boolean?
+    ): TableDataInfo {
+        // 根据paging参数确定是否采用分页参数
+        val page = if (paging == null || paging) pageParam else null
+        val list = journalCatalogService.list(journalCatalog, page)
+        return TableDataInfoUtil.getDataTable(list)
+    }
+
+    /**
+     * 根据ID获取目录详情
+     *
+     * @param id 期刊目录ID
+     * @return 期刊目录详情信息
+     */
+    @GetMapping("/{id}")
+    fun getById(
+        @PathVariable("id") id: Int,
+    ): AjaxResult {
+        return try {
+            AjaxResult.success(journalCatalogService.getById(id))
+        } catch (ex: Exception) {
+            AjaxResult.error("指定期刊目录不存在")
+        }
+    }
+
+    /**
+     * 新增期刊目录
+     */
+    @Log(title = "期刊目录管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    fun create(@RequestBody journalCatalog: JournalCatalog): AjaxResult {
+        return toAjax(journalCatalogService.create(journalCatalog))
+    }
+
+    /**
+     * 修改期刊目录
+     */
+    @Log(title = "期刊目录管理", businessType = BusinessType.UPDATE)
+    @PutMapping("/{id}")
+    fun update(@PathVariable("id") id: Int, @RequestBody journalCatalog: JournalCatalog): AjaxResult {
+        journalCatalog.id = id
+        return toAjax(journalCatalogService.update(journalCatalog))
+    }
+
+    /**
+     * 删除期刊目录
+     *
+     * @param ids 待删除的期刊目录ID列表
+     */
+    @Log(title = "期刊目录管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    fun delete(
+        @PathVariable("ids") ids: Array<Int>,
+    ): AjaxResult {
+        return toAjax(journalCatalogService.delete(ids))
+    }
+
+}

+ 83 - 0
ruoyi-journal/src/main/kotlin/com/cclotus/journal/domain/JournalCatalog.kt

@@ -0,0 +1,83 @@
+package com.cclotus.journal.domain
+
+import com.baomidou.mybatisplus.annotation.IdType
+import com.baomidou.mybatisplus.annotation.TableField
+import com.baomidou.mybatisplus.annotation.TableId
+import com.baomidou.mybatisplus.annotation.TableName
+import com.fasterxml.jackson.annotation.JsonFormat
+import java.time.LocalDateTime
+
+/**
+ * 期刊目录信息,每个实体代表一个目录项
+ *
+ */
+@TableName("journal_catalog")
+class JournalCatalog {
+
+    /**
+     * ID
+     */
+    @TableId(type = IdType.AUTO, value = "id")
+    var id: Int? = null
+
+    /**
+     * 标题
+     */
+    @TableField("title")
+    var title: String? = null
+
+    /**
+     * 作者
+     */
+    @TableField("author")
+    var author: String? = null
+
+    /**
+     * 内容
+     */
+    @TableField("content")
+    var content: String? = null
+
+    /**
+     * 所属期刊栏目ID
+     */
+    @TableField("term_id")
+    var termId: Int? = null
+
+    /**
+     * 上级Id
+     */
+    @TableField("parent_id")
+    var parentId: Int? = null
+
+    /**
+     * 祖级列表
+     */
+    @TableField("ancestors")
+    var ancestors: String? = null
+
+    /**
+     * 排序字段
+     */
+    @TableField("sort")
+    var sort: Float? = null
+
+    /**
+     * 是否为叶子节点
+     */
+    @TableField("leaf")
+    var leaf: Int? = null
+
+    /**
+     * 发布时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "publish_time")
+    var publishTime: LocalDateTime? = null
+
+    /**
+     * 附件
+     */
+    @TableField("attachment")
+    var attachment: String? = null
+}

+ 7 - 0
ruoyi-journal/src/main/kotlin/com/cclotus/journal/mapper/JournalCatalogMapper.kt

@@ -0,0 +1,7 @@
+package com.cclotus.journal.mapper
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper
+import com.cclotus.journal.domain.JournalCatalog
+
+interface JournalCatalogMapper : BaseMapper<JournalCatalog> {
+}

+ 17 - 0
ruoyi-journal/src/main/kotlin/com/cclotus/journal/service/IJournalCatalogService.kt

@@ -0,0 +1,17 @@
+package com.cclotus.journal.service
+
+import com.baomidou.mybatisplus.extension.service.IService
+import com.cclotus.journal.domain.JournalCatalog
+import com.ruoyi.common.reqParam.PageParam
+
+interface IJournalCatalogService : IService<JournalCatalog> {
+
+    fun list(journalCatalog: JournalCatalog, pageParam: PageParam?): List<JournalCatalog>
+
+    fun create(journalCatalog: JournalCatalog): Int
+
+    fun update(journalCatalog: JournalCatalog): Int
+
+    fun delete(ids: Array<Int>): Boolean
+
+}

+ 112 - 0
ruoyi-journal/src/main/kotlin/com/cclotus/journal/service/impl/JournalCatalogServiceImpl.kt

@@ -0,0 +1,112 @@
+package com.cclotus.journal.service.impl
+
+import com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
+import com.cclotus.journal.domain.JournalCatalog
+import com.cclotus.journal.mapper.JournalCatalogMapper
+import com.cclotus.journal.service.IJournalCatalogService
+import com.ruoyi.common.reqParam.PageParam
+import com.ruoyi.common.utils.PageUtils
+import com.ruoyi.common.utils.bean.BeanUtils
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+import org.springframework.transaction.annotation.Transactional
+import org.springframework.util.Assert.hasText
+import org.springframework.util.Assert.notNull
+
+@Service
+class JournalCatalogServiceImpl : ServiceImpl<JournalCatalogMapper, JournalCatalog>(), IJournalCatalogService {
+
+    @Autowired
+    lateinit var journalCatalogMapper: JournalCatalogMapper
+
+    override fun list(journalCatalog: JournalCatalog, pageParam: PageParam?): List<JournalCatalog> {
+        val queryWrapper = KtQueryWrapper(JournalCatalog())
+        queryWrapper.like(!journalCatalog.title.isNullOrBlank(), JournalCatalog::title, journalCatalog.title)
+            .like(!journalCatalog.author.isNullOrBlank(), JournalCatalog::author, journalCatalog.author)
+            .eq(journalCatalog.termId != null, JournalCatalog::termId, journalCatalog.termId)
+            .eq(journalCatalog.parentId != null, JournalCatalog::parentId, journalCatalog.parentId)
+            .eq(journalCatalog.leaf != null, journalCatalog::leaf, journalCatalog.leaf)
+            .orderByAsc(JournalCatalog::sort)
+
+        // 查询post主表,并处理分页
+        pageParam?.let {
+            it.orderByColumn = null
+            PageUtils.startPage(it)
+        }
+
+        return journalCatalogMapper.selectList(queryWrapper)
+    }
+
+
+    @Transactional
+    override fun create(journalCatalog: JournalCatalog): Int {
+        hasText(journalCatalog.title, "期刊目录标题不可为空")
+        notNull(journalCatalog.termId, "所属期刊不可为空")
+        // 新增初始化节点默认为子节点
+        journalCatalog.leaf = 1
+        if (journalCatalog.parentId == null || journalCatalog.parentId == 0) {
+            journalCatalog.parentId = 0
+            journalCatalog.ancestors = "0"
+        } else { // 如果上级ID不为空,检查父级节点是否存在,并设置ancestors字段, 将父级节点的leaf更改为0
+            val parentNode = this.getById(journalCatalog.parentId)
+            notNull(parentNode, "指定的上级期刊目录节点不存在")
+            journalCatalog.ancestors = "${parentNode.ancestors},${parentNode.id.toString()}"
+            // 修改父级节点leaf字段
+            parentNode.leaf = 0
+            journalCatalogMapper.updateById(parentNode)
+        }
+        if (journalCatalog.sort == null) { // 如果排序字段为空,自动设置为最大排序字段
+            PageUtils.startPage(PageParam().apply {
+                this.pageNum = 1
+                this.pageSize = 1
+            })
+            val lastOne = this.list(KtQueryWrapper(JournalCatalog()).orderByDesc(JournalCatalog::sort)).firstOrNull()
+            journalCatalog.sort = if (lastOne != null) (lastOne.sort!! + 1) else 0f
+        }
+        return journalCatalogMapper.insert(journalCatalog)
+    }
+
+    override fun update(journalCatalog: JournalCatalog): Int {
+        hasText(journalCatalog.title, "期刊目录标题不可为空")
+        notNull(journalCatalog.termId, "所属期刊不可为空")
+        // 修改不变更是否是叶子节点属性
+        journalCatalog.leaf = null
+        val entity = this.getById(journalCatalog.id!!)
+        notNull(entity, "待修改的期刊目录不存在")
+        BeanUtils.copyProperties(journalCatalog, entity, "parentId")
+        if (journalCatalog.parentId != null) {
+            if (journalCatalog.parentId == 0) {
+                entity.ancestors = "0"
+            } else if (journalCatalog.parentId != entity.parentId) {
+                journalCatalog.parentId.let { // 如果上级ID不为空,检查父级节点是否存在,并设置ancestors字段
+                    val parentNode = this.getById(it)
+                    notNull(parentNode, "指定的上级期刊目录节点不存在")
+                    entity.parentId = parentNode.parentId
+                    entity.ancestors = "${parentNode.ancestors},${parentNode.id.toString()}"
+                }
+            }
+        }
+
+        return journalCatalogMapper.updateById(journalCatalog)
+    }
+
+    @Transactional
+    override fun delete(ids: Array<Int>): Boolean {
+        ids.forEach {
+            val entity = this.getById(it)
+            val parentId = entity.parentId
+            this.removeById(it)
+            // 查询其父节点是否还存在子节点
+            val nodes = this.list(KtQueryWrapper(JournalCatalog()).eq(JournalCatalog::parentId, parentId))
+            if (nodes.isEmpty()) { // 如果父节点不存在子节点,修改父节点是否为叶子节点状态
+                val parentNode = this.getById(parentId)
+                parentNode.leaf = 0
+                this.update(parentNode)
+            }
+        }
+        return true
+    }
+
+
+}

+ 1 - 0
settings.gradle

@@ -14,6 +14,7 @@ include(':ruoyi-framework')
 include(':ruoyi-ext')
 include(':ruoyi-register')
 include(':ruoyi-cms')
+include(':ruoyi-journal')
 includeBuild('platforms')
 includeBuild('build-logic')
 includeBuild('server-application')