Przeglądaj źródła

fix 新增导航,新增文章

tjf 3 lat temu
rodzic
commit
e0c5671fa4
25 zmienionych plików z 2426 dodań i 8 usunięć
  1. 163 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ColumnNavigationBarController.java
  2. 126 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ColumnNewsController.java
  3. 1 1
      ruoyi-admin/src/main/resources/application-druid.yml
  4. 5 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
  5. 7 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
  6. 138 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/ColumnNavigationBar.java
  7. 8 0
      ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java
  8. 5 1
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java
  9. 137 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/ColumnNews.java
  10. 111 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/ColumnNavigationBarMapper.java
  11. 68 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/ColumnNewsMapper.java
  12. 107 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IColumnNavigationBarService.java
  13. 68 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IColumnNewsService.java
  14. 296 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ColumnNavigationBarServiceImpl.java
  15. 108 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ColumnNewsServiceImpl.java
  16. 135 0
      ruoyi-system/src/main/resources/mapper/system/ColumnNavigationBarMapper.xml
  17. 107 0
      ruoyi-system/src/main/resources/mapper/system/ColumnNewsMapper.xml
  18. 1 1
      ruoyi-ui/.env.development
  19. 1 1
      ruoyi-ui/.env.production
  20. 58 0
      ruoyi-ui/src/api/system/column.js
  21. 61 0
      ruoyi-ui/src/api/system/news.js
  22. 7 1
      ruoyi-ui/src/settings.js
  23. 308 0
      ruoyi-ui/src/views/system/column/index.vue
  24. 395 0
      ruoyi-ui/src/views/system/news/index.vue
  25. 5 3
      ruoyi-ui/vue.config.js

+ 163 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ColumnNavigationBarController.java

@@ -0,0 +1,163 @@
+package com.ruoyi.web.controller.system;
+
+import java.util.Iterator;
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.utils.StringUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.core.domain.entity.ColumnNavigationBar;
+import com.ruoyi.system.service.IColumnNavigationBarService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 栏目导航Controller
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+@RestController
+@RequestMapping("/system/column")
+public class ColumnNavigationBarController extends BaseController
+{
+    @Autowired
+    private IColumnNavigationBarService columnNavigationBarService;
+
+    /**
+     * 查询栏目导航列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:column:list')")
+    @GetMapping("/list")
+    public AjaxResult list(ColumnNavigationBar columnNavigationBar)
+    {
+        List<ColumnNavigationBar> list = columnNavigationBarService.selectColumnNavigationBarList(columnNavigationBar);
+        return AjaxResult.success(list);
+    }
+
+
+    /**
+     * 查询栏目导航列表(排除节点)
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list/exclude/{columnId}")
+    public AjaxResult excludeChild(@PathVariable(value = "columnId", required = false) Long columnId)
+    {
+        List<ColumnNavigationBar> columnNavigationBars = columnNavigationBarService.selectColumnNavigationBarList(new ColumnNavigationBar());
+        Iterator<ColumnNavigationBar> it = columnNavigationBars.iterator();
+        while (it.hasNext())
+        {
+            ColumnNavigationBar d = (ColumnNavigationBar) it.next();
+            if (d.getColumnId().intValue() == columnId
+                    || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), columnId + ""))
+            {
+                it.remove();
+            }
+        }
+        return AjaxResult.success(columnNavigationBars);
+    }
+
+    /**
+     * 导出栏目导航列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:column:export')")
+    @Log(title = "栏目导航", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ColumnNavigationBar columnNavigationBar)
+    {
+        List<ColumnNavigationBar> list = columnNavigationBarService.selectColumnNavigationBarList(columnNavigationBar);
+        ExcelUtil<ColumnNavigationBar> util = new ExcelUtil<ColumnNavigationBar>(ColumnNavigationBar.class);
+        util.exportExcel(response, list, "栏目导航数据");
+    }
+
+    /**
+     * 获取栏目导航详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:column:query')")
+    @GetMapping(value = "/{columnId}")
+    public AjaxResult getInfo(@PathVariable("columnId") Long columnId)
+    {
+        ColumnNavigationBar columnNavigationBar = columnNavigationBarService.selectColumnNavigationBarByColumnId(columnId);
+        return AjaxResult.success(columnNavigationBar);
+    }
+
+    /**
+     * 获取栏目导航下拉树列表
+     */
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(ColumnNavigationBar columnNavigationBar)
+    {
+        List<ColumnNavigationBar> columnNavigationBars = columnNavigationBarService.selectColumnNavigationBarList(columnNavigationBar);
+        return AjaxResult.success(columnNavigationBarService.buildColumnTreeSelect(columnNavigationBars));
+    }
+    /**
+     * 新增栏目导航
+     */
+    @PreAuthorize("@ss.hasPermi('system:column:add')")
+    @Log(title = "栏目导航", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ColumnNavigationBar columnNavigationBar)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(columnNavigationBarService.checkColumnNameUnique(columnNavigationBar)))
+        {
+            return AjaxResult.error("新增栏目导航'" + columnNavigationBar.getColumnName() + "'失败,栏目导航名称已存在");
+        }
+        columnNavigationBar.setCreateBy(getUsername());
+        return toAjax(columnNavigationBarService.insertColumnNavigationBar(columnNavigationBar));
+    }
+
+    /**
+     * 修改栏目导航
+     */
+    @PreAuthorize("@ss.hasPermi('system:column:edit')")
+    @Log(title = "栏目导航", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ColumnNavigationBar columnNavigationBar)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(columnNavigationBarService.checkColumnNameUnique(columnNavigationBar)))
+        {
+            return AjaxResult.error("修改栏目导航'" + columnNavigationBar.getColumnName() + "'失败,栏目导航名称已存在");
+        }
+        else if (columnNavigationBar.getParentId() != null && columnNavigationBar.getParentId().equals(columnNavigationBar.getColumnId()))
+        {
+            return AjaxResult.error("修改栏目导航'" + columnNavigationBar.getColumnName() + "'失败,上级栏目导航不能是自己");
+        }
+        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, columnNavigationBar.getStatus())
+                && columnNavigationBarService.selectNormalChildrenColumnById(columnNavigationBar.getColumnId()) > 0)
+        {
+            return AjaxResult.error("该栏目导航包含未停用的栏目导航!");
+        }
+        columnNavigationBar.setUpdateBy(getUsername());
+        return toAjax(columnNavigationBarService.updateColumnNavigationBar(columnNavigationBar));
+    }
+
+    /**
+     * 删除栏目导航
+     */
+    @PreAuthorize("@ss.hasPermi('system:column:remove')")
+    @Log(title = "栏目导航", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{columnId}")
+    public AjaxResult remove(@PathVariable Long columnId)
+    {
+        if (columnNavigationBarService.hasChildByColumnId(columnId))
+        {
+            return AjaxResult.error("存在下级部门,不允许删除");
+        }
+        return toAjax(columnNavigationBarService.deleteColumnNavigationBarByColumnId(columnId));
+    }
+}

+ 126 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ColumnNewsController.java

@@ -0,0 +1,126 @@
+package com.ruoyi.web.controller.system;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ColumnNews;
+import com.ruoyi.system.service.IColumnNewsService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 文章信息Controller
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+@RestController
+@RequestMapping("/system/news")
+public class ColumnNewsController extends BaseController
+{
+    @Autowired
+    private IColumnNewsService columnNewsService;
+
+    /**
+     * 查询文章信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:news:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ColumnNews columnNews)
+    {
+        startPage();
+        List<ColumnNews> list = columnNewsService.selectColumnNewsList(columnNews);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出文章信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:news:export')")
+    @Log(title = "文章信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ColumnNews columnNews)
+    {
+        List<ColumnNews> list = columnNewsService.selectColumnNewsList(columnNews);
+        ExcelUtil<ColumnNews> util = new ExcelUtil<ColumnNews>(ColumnNews.class);
+        util.exportExcel(response, list, "文章信息数据");
+    }
+
+    /**
+     * 获取文章信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:news:query')")
+    @GetMapping(value = "/{newsId}")
+    public AjaxResult getInfo(@PathVariable("newsId") Integer newsId)
+    {
+        return AjaxResult.success(columnNewsService.selectColumnNewsByNewsId(newsId));
+    }
+
+    /**
+     * 新增文章信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:news:add')")
+    @Log(title = "文章信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ColumnNews columnNews)
+    {
+        return toAjax(columnNewsService.insertColumnNews(columnNews));
+    }
+
+    /**
+     * 修改文章信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:news:edit')")
+    @Log(title = "文章信息", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ColumnNews columnNews)
+    {
+        return toAjax(columnNewsService.updateColumnNews(columnNews));
+    }
+
+    /**
+     * 删除文章信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:news:remove')")
+    @Log(title = "文章信息", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{newsIds}")
+    public AjaxResult remove(@PathVariable Integer[] newsIds)
+    {
+        return toAjax(columnNewsService.deleteColumnNewsByNewsIds(newsIds));
+    }
+    /**
+     * 文章审核通过
+     */
+    @PreAuthorize("@ss.hasPermi('system:news:examine')")
+    @Log(title = "文章信息", businessType = BusinessType.EXAMINE)
+    @GetMapping(value = "/examine/{newsId}")
+    public AjaxResult examine(@PathVariable("newsId") Integer newsId)
+    {
+        return toAjax(columnNewsService.examineColumnNews(newsId));
+    }
+    /**
+     * 驳回文章信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:news:reject')")
+    @Log(title = "驳回文章信息", businessType = BusinessType.REJECT)
+    @PostMapping("/reject")
+    public AjaxResult reject(@RequestBody ColumnNews columnNews)
+    {
+        //驳回
+        columnNews.setStatus("2");
+        return toAjax(columnNewsService.updateColumnNews(columnNews));
+    }
+}

+ 1 - 1
ruoyi-admin/src/main/resources/application-druid.yml

@@ -6,7 +6,7 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://192.168.101.10:3306/coco?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://192.168.101.10:3306/yinshuapin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
                 password: Boman123
             # 从库数据源

+ 5 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java

@@ -134,6 +134,11 @@ public class Constants
      */
     public static final String SYS_DICT_KEY = "sys_dict:";
 
+    /**
+     * 门户栏目
+     */
+    public static final String COLUMN_KEY = "column_:";
+
     /**
      * 资源映射路径 前缀
      */

+ 7 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java

@@ -4,6 +4,7 @@ import java.io.Serializable;
 import java.util.List;
 import java.util.stream.Collectors;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.ruoyi.common.core.domain.entity.ColumnNavigationBar;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysMenu;
 
@@ -45,6 +46,12 @@ public class TreeSelect implements Serializable
         this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
     }
 
+    public TreeSelect(ColumnNavigationBar columnNavigationBar) {
+        this.id = columnNavigationBar.getColumnId();
+        this.label = columnNavigationBar.getColumnName();
+        this.children = columnNavigationBar.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
     public Long getId()
     {
         return id;

+ 138 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/ColumnNavigationBar.java

@@ -0,0 +1,138 @@
+package com.ruoyi.common.core.domain.entity;
+
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 栏目导航对象 column_navigation_bar
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+public class ColumnNavigationBar extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 栏目id */
+    private Long columnId;
+
+    /** 父栏目id */
+    @Excel(name = "父栏目id")
+    private Long parentId;
+
+    /** 祖级列表 */
+    @Excel(name = "祖级列表")
+    private String ancestors;
+
+    /** 栏目名称 */
+    @Excel(name = "栏目名称")
+    private String columnName;
+
+    /** 显示顺序 */
+    @Excel(name = "显示顺序")
+    private Integer orderNum;
+
+    /** 栏目状态(0正常 1停用) */
+    @Excel(name = "栏目状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /** 删除标志(N代表存在 Y代表删除) */
+    private String delFlag;
+
+    /** 子部门 */
+    private List<ColumnNavigationBar> children = new ArrayList<ColumnNavigationBar>();
+
+    public List<ColumnNavigationBar> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<ColumnNavigationBar> children) {
+        this.children = children;
+    }
+
+    public void setColumnId(Long columnId)
+    {
+        this.columnId = columnId;
+    }
+
+    public Long getColumnId() 
+    {
+        return columnId;
+    }
+    public void setParentId(Long parentId) 
+    {
+        this.parentId = parentId;
+    }
+
+    public Long getParentId() 
+    {
+        return parentId;
+    }
+    public void setAncestors(String ancestors) 
+    {
+        this.ancestors = ancestors;
+    }
+
+    public String getAncestors() 
+    {
+        return ancestors;
+    }
+
+    public String getColumnName() {
+        return columnName;
+    }
+
+    public void setColumnName(String columnName) {
+        this.columnName = columnName;
+    }
+
+    public void setOrderNum(Integer orderNum)
+    {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getOrderNum() 
+    {
+        return orderNum;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("columnId", getColumnId())
+            .append("parentId", getParentId())
+            .append("ancestors", getAncestors())
+            .append("columnName", getColumnName())
+            .append("orderNum", getOrderNum())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 8 - 0
ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java

@@ -56,4 +56,12 @@ public enum BusinessType
      * 清空数据
      */
     CLEAN,
+    /**
+     * 审核通过
+     */
+    EXAMINE,
+    /**
+     * 驳回
+     */
+    REJECT
 }

+ 5 - 1
ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java

@@ -1,3 +1,4 @@
+/*
 package com.ruoyi.quartz.config;
 
 import org.springframework.context.annotation.Bean;
@@ -6,11 +7,13 @@ import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import javax.sql.DataSource;
 import java.util.Properties;
 
+*/
 /**
  * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效)
  * 
  * @author ruoyi
- */
+ *//*
+
 @Configuration
 public class ScheduleConfig
 {
@@ -55,3 +58,4 @@ public class ScheduleConfig
         return factory;
     }
 }
+*/

+ 137 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/ColumnNews.java

@@ -0,0 +1,137 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 新闻信息对象 column_news
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+public class ColumnNews extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 新闻ID */
+    private Integer newsId;
+
+    /** 新闻标题 */
+    @Excel(name = "新闻标题")
+    private String newsTitle;
+
+    /** 所属栏目id */
+    private Long columnId;
+    /**
+     * 所属栏目名称
+     */
+    private String columnName;
+
+    /** 新闻内容 */
+    @Excel(name = "新闻内容")
+    private String newsContent;
+
+    /** 新闻状态(0审核通过 1待审核 2驳回) */
+    @Excel(name = "新闻状态", readConverterExp = "0=审核通过,1=待审核,2=驳回")
+    private String status;
+
+    /** 是否删除(N正常 Y删除) */
+    @Excel(name = "是否删除", readConverterExp = "N=正常,Y=删除")
+    private String isDel;
+
+    /** 原因 */
+    @Excel(name = "原因")
+    private String reason;
+
+    public String getColumnName() {
+        return columnName;
+    }
+
+    public void setColumnName(String columnName) {
+        this.columnName = columnName;
+    }
+
+    public void setNewsId(Integer newsId)
+    {
+        this.newsId = newsId;
+    }
+
+    public Integer getNewsId() 
+    {
+        return newsId;
+    }
+    public void setNewsTitle(String newsTitle) 
+    {
+        this.newsTitle = newsTitle;
+    }
+
+    public String getNewsTitle() 
+    {
+        return newsTitle;
+    }
+    public void setColumnId(Long columnId) 
+    {
+        this.columnId = columnId;
+    }
+
+    public Long getColumnId() 
+    {
+        return columnId;
+    }
+    public void setNewsContent(String newsContent) 
+    {
+        this.newsContent = newsContent;
+    }
+
+    public String getNewsContent() 
+    {
+        return newsContent;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setIsDel(String isDel) 
+    {
+        this.isDel = isDel;
+    }
+
+    public String getIsDel() 
+    {
+        return isDel;
+    }
+    public void setReason(String reason) 
+    {
+        this.reason = reason;
+    }
+
+    public String getReason() 
+    {
+        return reason;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("newsId", getNewsId())
+            .append("newsTitle", getNewsTitle())
+            .append("columnId", getColumnId())
+            .append("newsContent", getNewsContent())
+            .append("status", getStatus())
+            .append("isDel", getIsDel())
+            .append("reason", getReason())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 111 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/ColumnNavigationBarMapper.java

@@ -0,0 +1,111 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.common.core.domain.entity.ColumnNavigationBar;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 栏目导航Mapper接口
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+public interface ColumnNavigationBarMapper 
+{
+    /**
+     * 查询栏目导航
+     *
+     * @param columnId 栏目导航主键
+     * @return 栏目导航
+     */
+    public ColumnNavigationBar selectColumnNavigationBarByColumnId(Long columnId);
+
+    /**
+     * 查询栏目导航列表
+     *
+     * @param columnNavigationBar 栏目导航
+     * @return 栏目导航集合
+     */
+    public List<ColumnNavigationBar> selectColumnNavigationBarList(ColumnNavigationBar columnNavigationBar);
+
+    /**
+     * 新增栏目导航
+     *
+     * @param columnNavigationBar 栏目导航
+     * @return 结果
+     */
+    public int insertColumnNavigationBar(ColumnNavigationBar columnNavigationBar);
+
+    /**
+     * 修改栏目导航
+     *
+     * @param columnNavigationBar 栏目导航
+     * @return 结果
+     */
+    public int updateColumnNavigationBar(ColumnNavigationBar columnNavigationBar);
+
+    /**
+     * 删除栏目导航
+     *
+     * @param columnId 栏目导航主键
+     * @return 结果
+     */
+    public int deleteColumnNavigationBarByColumnId(Long columnId);
+
+    /**
+     * 批量删除栏目导航
+     *
+     * @param columnIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteColumnNavigationBarByColumnIds(Long[] columnIds);
+
+    /**
+     * 校验栏目导航名称是否唯一
+     *
+     * @param columnName 栏目导航名称
+     * @param parentId 父部门ID
+     * @return 结果
+     */
+    public ColumnNavigationBar checkColumnNameUnique(@Param("columnName") String columnName, @Param("parentId") Long parentId);
+
+    /**
+     * 根据ID查询所有子栏目导航(正常状态)
+     *
+     * @param columnId 栏目导航ID
+     * @return 子栏目导航数
+     */
+    public int selectNormalChildrenColumnById(Long columnId);
+
+    /**
+     * 根据ID查询所有子栏目导航
+     * @param columnId
+     * @return
+     */
+    public List<ColumnNavigationBar> selectChildrenColumnById(Long columnId);
+
+    /**
+     * 修改子元素关系
+     *
+     * @param columns 子元素
+     * @return 结果
+     */
+    public int updateColumnChildren(@Param("columns") List<ColumnNavigationBar> columns);
+
+    /**
+     * 修改所在栏目导航正常状态
+     *
+     * @param columnIds 栏目导航ID组
+     */
+    public void updateColumnStatusNormal(Long[] columnIds);
+
+
+    /**
+     * 是否存在栏目导航子节点
+     * @param columnId
+     * @return
+     */
+    public int hasChildByColumnId(Long columnId);
+
+}

+ 68 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/ColumnNewsMapper.java

@@ -0,0 +1,68 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.ColumnNews;
+
+/**
+ * 新闻信息Mapper接口
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+public interface ColumnNewsMapper 
+{
+    /**
+     * 查询新闻信息
+     * 
+     * @param newsId 新闻信息主键
+     * @return 新闻信息
+     */
+    public ColumnNews selectColumnNewsByNewsId(Integer newsId);
+
+    /**
+     * 查询新闻信息列表
+     * 
+     * @param columnNews 新闻信息
+     * @return 新闻信息集合
+     */
+    public List<ColumnNews> selectColumnNewsList(ColumnNews columnNews);
+
+    /**
+     * 新增新闻信息
+     * 
+     * @param columnNews 新闻信息
+     * @return 结果
+     */
+    public int insertColumnNews(ColumnNews columnNews);
+
+    /**
+     * 修改新闻信息
+     * 
+     * @param columnNews 新闻信息
+     * @return 结果
+     */
+    public int updateColumnNews(ColumnNews columnNews);
+
+    /**
+     * 删除新闻信息
+     * 
+     * @param newsId 新闻信息主键
+     * @return 结果
+     */
+    public int deleteColumnNewsByNewsId(Integer newsId);
+
+    /**
+     * 批量删除新闻信息
+     * 
+     * @param newsIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteColumnNewsByNewsIds(Integer[] newsIds);
+
+    /**
+     * 审核通过
+     * @param newsId
+     * @return
+     */
+    public int examineColumnNews(Integer newsId);
+}

+ 107 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IColumnNavigationBarService.java

@@ -0,0 +1,107 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.domain.entity.ColumnNavigationBar;
+import com.ruoyi.common.core.domain.entity.SysDept;
+
+/**
+ * 栏目导航Service接口
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+public interface IColumnNavigationBarService 
+{
+    /**
+     * 查询栏目导航
+     * 
+     * @param columnId 栏目导航主键
+     * @return 栏目导航
+     */
+    public ColumnNavigationBar selectColumnNavigationBarByColumnId(Long columnId);
+
+    /**
+     * 查询栏目导航列表
+     * 
+     * @param columnNavigationBar 栏目导航
+     * @return 栏目导航集合
+     */
+    public List<ColumnNavigationBar> selectColumnNavigationBarList(ColumnNavigationBar columnNavigationBar);
+
+    /**
+     * 新增栏目导航
+     * 
+     * @param columnNavigationBar 栏目导航
+     * @return 结果
+     */
+    public int insertColumnNavigationBar(ColumnNavigationBar columnNavigationBar);
+
+    /**
+     * 修改栏目导航
+     * 
+     * @param columnNavigationBar 栏目导航
+     * @return 结果
+     */
+    public int updateColumnNavigationBar(ColumnNavigationBar columnNavigationBar);
+
+    /**
+     * 批量删除栏目导航
+     * 
+     * @param columnIds 需要删除的栏目导航主键集合
+     * @return 结果
+     */
+    public int deleteColumnNavigationBarByColumnIds(Long[] columnIds);
+
+    /**
+     * 删除栏目导航信息
+     * 
+     * @param columnId 栏目导航主键
+     * @return 结果
+     */
+    public int deleteColumnNavigationBarByColumnId(Long columnId);
+
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param columnNavigationBars 栏目导航列表
+     * @return 下拉树结构列表
+     */
+    public List<TreeSelect> buildColumnTreeSelect(List<ColumnNavigationBar> columnNavigationBars);
+
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param columnNavigationBars 栏目导航列表
+     * @return 树结构列表
+     */
+    public List<ColumnNavigationBar> buildColumnTree(List<ColumnNavigationBar> columnNavigationBars);
+
+    /**
+     * 校验栏目导航名称是否唯一
+     *
+     * @param columnNavigationBar 栏目导航信息
+     * @return 结果
+     */
+    public String checkColumnNameUnique(ColumnNavigationBar columnNavigationBar);
+
+    /**
+     * 根据ID查询所有子栏目导航(正常状态)
+     *
+     * @param columnId 栏目导航ID
+     * @return 子栏目导航数
+     */
+    public int selectNormalChildrenColumnById(Long columnId);
+
+    /**
+     * 是否存在栏目导航子节点
+     *
+     * @param columnId 栏目导航ID
+     * @return 结果
+     */
+    public boolean hasChildByColumnId(Long columnId);
+
+}

+ 68 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IColumnNewsService.java

@@ -0,0 +1,68 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.ColumnNews;
+
+/**
+ * 新闻信息Service接口
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+public interface IColumnNewsService 
+{
+    /**
+     * 查询新闻信息
+     * 
+     * @param newsId 新闻信息主键
+     * @return 新闻信息
+     */
+    public ColumnNews selectColumnNewsByNewsId(Integer newsId);
+
+    /**
+     * 查询新闻信息列表
+     * 
+     * @param columnNews 新闻信息
+     * @return 新闻信息集合
+     */
+    public List<ColumnNews> selectColumnNewsList(ColumnNews columnNews);
+
+    /**
+     * 新增新闻信息
+     * 
+     * @param columnNews 新闻信息
+     * @return 结果
+     */
+    public int insertColumnNews(ColumnNews columnNews);
+
+    /**
+     * 修改新闻信息
+     * 
+     * @param columnNews 新闻信息
+     * @return 结果
+     */
+    public int updateColumnNews(ColumnNews columnNews);
+
+    /**
+     * 批量删除新闻信息
+     * 
+     * @param newsIds 需要删除的新闻信息主键集合
+     * @return 结果
+     */
+    public int deleteColumnNewsByNewsIds(Integer[] newsIds);
+
+    /**
+     * 删除新闻信息信息
+     * 
+     * @param newsId 新闻信息主键
+     * @return 结果
+     */
+    public int deleteColumnNewsByNewsId(Integer newsId);
+
+    /**
+     * 审核通过
+     * @param newsId
+     * @return
+     */
+    public int examineColumnNews(Integer newsId);
+}

+ 296 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ColumnNavigationBarServiceImpl.java

@@ -0,0 +1,296 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.core.text.Convert;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.core.domain.entity.ColumnNavigationBar;
+import com.ruoyi.system.service.IColumnNavigationBarService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.ColumnNavigationBarMapper;
+
+
+/**
+ * 栏目导航Service业务层处理
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+@Service
+public class ColumnNavigationBarServiceImpl implements IColumnNavigationBarService
+{
+    @Autowired
+    private ColumnNavigationBarMapper columnNavigationBarMapper;
+
+    /**
+     * 查询栏目导航
+     * 
+     * @param columnId 栏目导航主键
+     * @return 栏目导航
+     */
+    @Override
+    public ColumnNavigationBar selectColumnNavigationBarByColumnId(Long columnId)
+    {
+        return columnNavigationBarMapper.selectColumnNavigationBarByColumnId(columnId);
+    }
+
+    /**
+     * 查询栏目导航列表
+     * 
+     * @param columnNavigationBar 栏目导航
+     * @return 栏目导航
+     */
+    @Override
+    public List<ColumnNavigationBar> selectColumnNavigationBarList(ColumnNavigationBar columnNavigationBar)
+    {
+        return columnNavigationBarMapper.selectColumnNavigationBarList(columnNavigationBar);
+    }
+
+    /**
+     * 新增栏目导航
+     * 
+     * @param columnNavigationBar 栏目导航
+     * @return 结果
+     */
+    @Override
+    public int insertColumnNavigationBar(ColumnNavigationBar columnNavigationBar)
+    {
+        Long parentId = columnNavigationBar.getParentId();
+        if (parentId != null){
+            ColumnNavigationBar info = columnNavigationBarMapper.selectColumnNavigationBarByColumnId(columnNavigationBar.getParentId());
+            // 如果父节点不为正常状态,则不允许新增子节点
+            if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
+            {
+                throw new ServiceException("上级栏目导航停用,不允许新增");
+            }
+            columnNavigationBar.setAncestors(info.getAncestors() + "," + columnNavigationBar.getParentId());
+        }else {
+            columnNavigationBar.setParentId(0L);
+            columnNavigationBar.setAncestors(String.valueOf(columnNavigationBar.getParentId()));
+        }
+        columnNavigationBar.setCreateTime(DateUtils.getNowDate());
+        return columnNavigationBarMapper.insertColumnNavigationBar(columnNavigationBar);
+    }
+
+    /**
+     * 修改栏目导航
+     * 
+     * @param columnNavigationBar 栏目导航
+     * @return 结果
+     */
+    @Override
+    public int updateColumnNavigationBar(ColumnNavigationBar columnNavigationBar)
+    {
+        Long parentId = columnNavigationBar.getParentId();
+        if (parentId == null){
+            columnNavigationBar.setParentId(0L);
+        }
+        ColumnNavigationBar newParentColumn = columnNavigationBarMapper.selectColumnNavigationBarByColumnId(columnNavigationBar.getParentId());
+        ColumnNavigationBar oldColumnNavigationBar = columnNavigationBarMapper.selectColumnNavigationBarByColumnId(columnNavigationBar.getColumnId());
+        if (StringUtils.isNotNull(newParentColumn) && StringUtils.isNotNull(oldColumnNavigationBar))
+        {
+            String newAncestors = newParentColumn.getAncestors() + "," + newParentColumn.getColumnId();
+            String oldAncestors = oldColumnNavigationBar.getAncestors();
+            columnNavigationBar.setAncestors(newAncestors);
+            updateDeptChildren(columnNavigationBar.getColumnId(), newAncestors, oldAncestors);
+        }
+        int result = columnNavigationBarMapper.updateColumnNavigationBar(columnNavigationBar);
+        if (UserConstants.DEPT_NORMAL.equals(columnNavigationBar.getStatus()) && StringUtils.isNotEmpty(columnNavigationBar.getAncestors())
+                && !StringUtils.equals("0", columnNavigationBar.getAncestors()))
+        {
+            // 如果该部门是启用状态,则启用该部门的所有上级部门
+            updateParentColumnStatusNormal(columnNavigationBar);
+        }
+        columnNavigationBar.setUpdateTime(DateUtils.getNowDate());
+        return columnNavigationBarMapper.updateColumnNavigationBar(columnNavigationBar);
+    }
+
+    /**
+     * 修改子元素关系
+     *
+     * @param deptId 被修改的部门ID
+     * @param newAncestors 新的父ID集合
+     * @param oldAncestors 旧的父ID集合
+     */
+    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors)
+    {
+        List<ColumnNavigationBar> children = columnNavigationBarMapper.selectChildrenColumnById(deptId);
+        for (ColumnNavigationBar child : children)
+        {
+            child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
+        }
+        if (children.size() > 0)
+        {
+            columnNavigationBarMapper.updateColumnChildren(children);
+        }
+    }
+
+    /**
+     * 批量删除栏目导航
+     * 
+     * @param columnIds 需要删除的栏目导航主键
+     * @return 结果
+     */
+    @Override
+    public int deleteColumnNavigationBarByColumnIds(Long[] columnIds)
+    {
+        return columnNavigationBarMapper.deleteColumnNavigationBarByColumnIds(columnIds);
+    }
+
+    /**
+     * 删除栏目导航信息
+     * 
+     * @param columnId 栏目导航主键
+     * @return 结果
+     */
+    @Override
+    public int deleteColumnNavigationBarByColumnId(Long columnId)
+    {
+        return columnNavigationBarMapper.deleteColumnNavigationBarByColumnId(columnId);
+    }
+
+    /**
+     * 构建前端所需要下拉树结构
+     * @param columnNavigationBars 栏目导航列表
+     * @return
+     */
+    @Override
+    public List<TreeSelect> buildColumnTreeSelect(List<ColumnNavigationBar> columnNavigationBars) {
+        List<ColumnNavigationBar> columnTrees = buildColumnTree(columnNavigationBars);
+        return columnTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param columnNavigationBars 部门列表
+     * @return 树结构列表
+     */
+    @Override
+    public List<ColumnNavigationBar> buildColumnTree(List<ColumnNavigationBar> columnNavigationBars)
+    {
+        List<ColumnNavigationBar> returnList = new ArrayList<ColumnNavigationBar>();
+        List<Long> tempList = new ArrayList<Long>();
+        for (ColumnNavigationBar columnNavigationBar : columnNavigationBars)
+        {
+            tempList.add(columnNavigationBar.getColumnId());
+        }
+        for (Iterator<ColumnNavigationBar> iterator = columnNavigationBars.iterator(); iterator.hasNext();)
+        {
+            ColumnNavigationBar columnNavigationBar = (ColumnNavigationBar) iterator.next();
+            // 如果是顶级节点, 遍历该父节点的所有子节点
+            if (!tempList.contains(columnNavigationBar.getParentId()))
+            {
+                recursionFn(columnNavigationBars, columnNavigationBar);
+                returnList.add(columnNavigationBar);
+            }
+        }
+        if (returnList.isEmpty())
+        {
+            returnList = columnNavigationBars;
+        }
+        return returnList;
+    }
+
+    /**
+     * 校验栏目导航名称是否唯一
+     * @param columnNavigationBar 栏目导航信息
+     * @return
+     */
+    @Override
+    public String checkColumnNameUnique(ColumnNavigationBar columnNavigationBar) {
+        Long columnId = StringUtils.isNull(columnNavigationBar.getColumnId()) ? -1L : columnNavigationBar.getColumnId();
+        ColumnNavigationBar info = columnNavigationBarMapper.checkColumnNameUnique(columnNavigationBar.getColumnName(), columnNavigationBar.getParentId());
+        if (StringUtils.isNotNull(info) && info.getColumnId().longValue() != columnId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 根据ID查询所有子栏目导航(正常状态)
+     * @param columnId 栏目导航ID
+     * @return
+     */
+    @Override
+    public int selectNormalChildrenColumnById(Long columnId) {
+        return columnNavigationBarMapper.selectNormalChildrenColumnById(columnId);
+    }
+
+    /**
+     * @param columnId 栏目导航ID
+     * @return
+     */
+    @Override
+    public boolean hasChildByColumnId(Long columnId) {
+        int result = columnNavigationBarMapper.hasChildByColumnId(columnId);
+        return result > 0;
+    }
+
+    /**
+     * 递归列表
+     */
+    private void recursionFn(List<ColumnNavigationBar> list, ColumnNavigationBar t)
+    {
+        // 得到子节点列表
+        List<ColumnNavigationBar> childList = getChildList(list, t);
+        t.setChildren(childList);
+        for (ColumnNavigationBar tChild : childList)
+        {
+            if (hasChild(list, tChild))
+            {
+                recursionFn(list, tChild);
+            }
+        }
+    }
+
+    /**
+     * 得到子节点列表
+     */
+    private List<ColumnNavigationBar>  getChildList(List<ColumnNavigationBar>  list, ColumnNavigationBar t)
+    {
+        List<ColumnNavigationBar> tlist = new ArrayList<ColumnNavigationBar>();
+        Iterator<ColumnNavigationBar> it = list.iterator();
+        while (it.hasNext())
+        {
+            ColumnNavigationBar n = (ColumnNavigationBar) it.next();
+            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getColumnId().longValue())
+            {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 判断是否有子节点
+     */
+    private boolean hasChild(List<ColumnNavigationBar> list, ColumnNavigationBar t)
+    {
+        return getChildList(list, t).size() > 0;
+    }
+
+
+    /**
+     * 修改该栏目导航的父级栏目导航状态
+     *
+     * @param columnNavigationBar 当前栏目导航
+     */
+    private void updateParentColumnStatusNormal(ColumnNavigationBar columnNavigationBar)
+    {
+        String ancestors = columnNavigationBar.getAncestors();
+        Long[] columnIds = Convert.toLongArray(ancestors);
+        columnNavigationBarMapper.updateColumnStatusNormal(columnIds);
+    }
+}

+ 108 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ColumnNewsServiceImpl.java

@@ -0,0 +1,108 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.ColumnNewsMapper;
+import com.ruoyi.system.domain.ColumnNews;
+import com.ruoyi.system.service.IColumnNewsService;
+
+/**
+ * 新闻信息Service业务层处理
+ * 
+ * @author boman
+ * @date 2021-12-24
+ */
+@Service
+public class ColumnNewsServiceImpl implements IColumnNewsService 
+{
+    @Autowired
+    private ColumnNewsMapper columnNewsMapper;
+
+    /**
+     * 查询新闻信息
+     * 
+     * @param newsId 新闻信息主键
+     * @return 新闻信息
+     */
+    @Override
+    public ColumnNews selectColumnNewsByNewsId(Integer newsId)
+    {
+        return columnNewsMapper.selectColumnNewsByNewsId(newsId);
+    }
+
+    /**
+     * 查询新闻信息列表
+     * 
+     * @param columnNews 新闻信息
+     * @return 新闻信息
+     */
+    @Override
+    public List<ColumnNews> selectColumnNewsList(ColumnNews columnNews)
+    {
+        return columnNewsMapper.selectColumnNewsList(columnNews);
+    }
+
+    /**
+     * 新增新闻信息
+     * 
+     * @param columnNews 新闻信息
+     * @return 结果
+     */
+    @Override
+    public int insertColumnNews(ColumnNews columnNews)
+    {
+        columnNews.setCreateTime(DateUtils.getNowDate());
+        return columnNewsMapper.insertColumnNews(columnNews);
+    }
+
+    /**
+     * 修改新闻信息
+     * 
+     * @param columnNews 新闻信息
+     * @return 结果
+     */
+    @Override
+    public int updateColumnNews(ColumnNews columnNews)
+    {
+        columnNews.setUpdateTime(DateUtils.getNowDate());
+        return columnNewsMapper.updateColumnNews(columnNews);
+    }
+
+    /**
+     * 批量删除新闻信息
+     * 
+     * @param newsIds 需要删除的新闻信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteColumnNewsByNewsIds(Integer[] newsIds)
+    {
+        return columnNewsMapper.deleteColumnNewsByNewsIds(newsIds);
+    }
+
+    /**
+     * 删除新闻信息信息
+     * 
+     * @param newsId 新闻信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteColumnNewsByNewsId(Integer newsId)
+    {
+        return columnNewsMapper.deleteColumnNewsByNewsId(newsId);
+    }
+
+    /**
+     * 审核通过
+     * @param newsId
+     * @return
+     */
+    @Override
+    public int examineColumnNews(Integer newsId) {
+        return columnNewsMapper.examineColumnNews(newsId);
+    }
+
+
+}

+ 135 - 0
ruoyi-system/src/main/resources/mapper/system/ColumnNavigationBarMapper.xml

@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.ColumnNavigationBarMapper">
+    
+    <resultMap type="ColumnNavigationBar" id="ColumnNavigationBarResult">
+        <result property="columnId"    column="column_id"    />
+        <result property="parentId"    column="parent_id"    />
+        <result property="ancestors"    column="ancestors"    />
+        <result property="columnName"    column="column_name"    />
+        <result property="orderNum"    column="order_num"    />
+        <result property="status"    column="status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectColumnNavigationBarVo">
+        select column_id, parent_id, ancestors, column_name, order_num, status, del_flag, create_by, create_time, update_by, update_time from column_navigation_bar
+    </sql>
+
+    <select id="selectColumnNavigationBarList" parameterType="ColumnNavigationBar" resultMap="ColumnNavigationBarResult">
+        <include refid="selectColumnNavigationBarVo"/>
+        <where>  
+            <if test="parentId != null "> and parent_id = #{parentId}</if>
+            <if test="ancestors != null  and ancestors != ''"> and ancestors = #{ancestors}</if>
+            <if test="columnName != null  and columnName != ''"> and column_name like concat('%', #{columnName}, '%')</if>
+            <if test="orderNum != null "> and order_num = #{orderNum}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectColumnNavigationBarByColumnId" parameterType="Long" resultMap="ColumnNavigationBarResult">
+        <include refid="selectColumnNavigationBarVo"/>
+        where column_id = #{columnId}
+    </select>
+        
+    <insert id="insertColumnNavigationBar" parameterType="ColumnNavigationBar" useGeneratedKeys="true" keyProperty="columnId">
+        insert into column_navigation_bar
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="parentId != null">parent_id,</if>
+            <if test="ancestors != null">ancestors,</if>
+            <if test="columnName != null">column_name,</if>
+            <if test="orderNum != null">order_num,</if>
+            <if test="status != null">status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="parentId != null">#{parentId},</if>
+            <if test="ancestors != null">#{ancestors},</if>
+            <if test="columnName != null">#{columnName},</if>
+            <if test="orderNum != null">#{orderNum},</if>
+            <if test="status != null">#{status},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateColumnNavigationBar" parameterType="ColumnNavigationBar">
+        update column_navigation_bar
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="parentId != null">parent_id = #{parentId},</if>
+            <if test="ancestors != null">ancestors = #{ancestors},</if>
+            <if test="columnName != null">column_name = #{columnName},</if>
+            <if test="orderNum != null">order_num = #{orderNum},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where column_id = #{columnId}
+    </update>
+
+    <delete id="deleteColumnNavigationBarByColumnId" parameterType="Long">
+    	update column_navigation_bar set del_flag = 'Y' where column_id = #{columnId}
+    </delete>
+
+    <delete id="deleteColumnNavigationBarByColumnIds" parameterType="String">
+        delete from column_navigation_bar where column_id in 
+        <foreach item="columnId" collection="array" open="(" separator="," close=")">
+            #{columnId}
+        </foreach>
+    </delete>
+
+
+    <select id="checkColumnNameUnique" resultMap="ColumnNavigationBarResult">
+        <include refid="selectColumnNavigationBarVo"/>
+        where column_name = #{columnName} and parent_id = #{parentId} limit 1
+    </select>
+
+    <select id="selectNormalChildrenColumnById" parameterType="Long" resultType="int">
+		select count(*) from column_navigation_bar where status = 0 and del_flag = 'N' and find_in_set(#{columnId}, ancestors)
+	</select>
+
+    <select id="selectChildrenColumnById" parameterType="Long" resultMap="ColumnNavigationBarResult">
+		select * from column_navigation_bar where find_in_set(#{columnId}, ancestors)
+	</select>
+
+    <update id="updateColumnChildren" parameterType="java.util.List">
+        update column_navigation_bar set ancestors =
+        <foreach collection="columns" item="item" index="index"
+                 separator=" " open="case column_id" close="end">
+            when #{item.columnId} then #{item.ancestors}
+        </foreach>
+        where column_id in
+        <foreach collection="columns" item="item" index="index"
+                 separator="," open="(" close=")">
+            #{item.columnId}
+        </foreach>
+    </update>
+
+    <update id="updateColumnStatusNormal" parameterType="Long">
+        update column_navigation_bar set status = '0' where column_id in
+        <foreach collection="array" item="columnId" open="(" separator="," close=")">
+            #{columnId}
+        </foreach>
+    </update>
+
+    <select id="hasChildByColumnId" parameterType="Long" resultType="int">
+		select count(1) from column_navigation_bar
+		where del_flag = 'N' and parent_id = #{columnId} limit 1
+	</select>
+</mapper>

+ 107 - 0
ruoyi-system/src/main/resources/mapper/system/ColumnNewsMapper.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.ColumnNewsMapper">
+    
+    <resultMap type="ColumnNews" id="ColumnNewsResult">
+        <result property="newsId"    column="news_id"    />
+        <result property="newsTitle"    column="news_title"    />
+        <result property="columnId"    column="column_id"    />
+        <result property="columnName"    column="column_name"    />
+        <result property="newsContent"    column="news_content"    />
+        <result property="status"    column="status"    />
+        <result property="isDel"    column="is_del"    />
+        <result property="reason"    column="reason"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectColumnNewsVo">
+        select n.news_id, n.news_title, n.column_id, n.news_content, n.status, n.is_del, n.reason, n.create_by, n.create_time, n.update_by, n.update_time, n.remark,c.column_name from column_news n
+        left join column_navigation_bar c on n.column_id = c.column_id
+    </sql>
+
+    <select id="selectColumnNewsList" parameterType="ColumnNews" resultMap="ColumnNewsResult">
+        <include refid="selectColumnNewsVo"/>
+        <where>  
+            <if test="newsTitle != null  and newsTitle != ''"> and n.news_title like concat('%', #{newsTitle}, '%')</if>
+            <if test="newsContent != null  and newsContent != ''"> and n.news_content like concat('%', #{newsContent}, '%')</if>
+            <if test="status != null  and status != ''"> and n.status = #{status}</if>
+            <if test="isDel != null  and isDel != ''"> and n.is_del = #{isDel}</if>
+            <if test="columnName != null  and columnName != ''"> and c.column_name = #{columnName}</if>
+        </where>
+    </select>
+    
+    <select id="selectColumnNewsByNewsId" parameterType="Integer" resultMap="ColumnNewsResult">
+        <include refid="selectColumnNewsVo"/>
+        where n.news_id = #{newsId}
+    </select>
+        
+    <insert id="insertColumnNews" parameterType="ColumnNews" useGeneratedKeys="true" keyProperty="newsId">
+        insert into column_news
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="newsTitle != null and newsTitle != ''">news_title,</if>
+            <if test="columnId != null">column_id,</if>
+            <if test="newsContent != null and newsContent != ''">news_content,</if>
+            <if test="status != null">status,</if>
+            <if test="isDel != null">is_del,</if>
+            <if test="reason != null">reason,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="newsTitle != null and newsTitle != ''">#{newsTitle},</if>
+            <if test="columnId != null">#{columnId},</if>
+            <if test="newsContent != null and newsContent != ''">#{newsContent},</if>
+            <if test="status != null">#{status},</if>
+            <if test="isDel != null">#{isDel},</if>
+            <if test="reason != null">#{reason},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateColumnNews" parameterType="ColumnNews">
+        update column_news
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="newsTitle != null and newsTitle != ''">news_title = #{newsTitle},</if>
+            <if test="columnId != null">column_id = #{columnId},</if>
+            <if test="newsContent != null and newsContent != ''">news_content = #{newsContent},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="isDel != null">is_del = #{isDel},</if>
+            <if test="reason != null">reason = #{reason},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where news_id = #{newsId}
+    </update>
+
+    <delete id="deleteColumnNewsByNewsId" parameterType="Integer">
+        delete from column_news where news_id = #{newsId}
+    </delete>
+
+    <delete id="deleteColumnNewsByNewsIds" parameterType="String">
+        delete from column_news where news_id in 
+        <foreach item="newsId" collection="array" open="(" separator="," close=")">
+            #{newsId}
+        </foreach>
+    </delete>
+
+    <update id="examineColumnNews" parameterType="ColumnNews">
+        update column_news set  status = '0'
+        where news_id = #{newsId}
+    </update>
+</mapper>

+ 1 - 1
ruoyi-ui/.env.development

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 若依管理系统
+VUE_APP_TITLE = 印刷制品质量监督检验平台
 
 # 开发环境配置
 ENV = 'development'

+ 1 - 1
ruoyi-ui/.env.production

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 若依管理系统
+VUE_APP_TITLE = 印刷制品质量监督检验平台
 
 # 生产环境配置
 ENV = 'production'

+ 58 - 0
ruoyi-ui/src/api/system/column.js

@@ -0,0 +1,58 @@
+import request from '@/utils/request'
+
+// 查询栏目导航列表(排除节点)
+export function listColumnExcludeChild(columnId) {
+  return request({
+    url: '/system/column/list/exclude/' + columnId,
+    method: 'get'
+  })
+}
+
+// 查询栏目导航列表
+export function listColumn(query) {
+  return request({
+    url: '/system/column/list',
+    method: 'get',
+    params: query
+  })
+}
+// 查询栏目导航详细
+export function getColumn(columnId) {
+  return request({
+    url: '/system/column/' + columnId,
+    method: 'get'
+  })
+}
+
+// 查询栏目导航下拉树结构
+export function treeselect() {
+  return request({
+    url: '/system/column/treeselect',
+    method: 'get'
+  })
+}
+// 新增栏目导航
+export function addColumn(data) {
+  return request({
+    url: '/system/column',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改栏目导航
+export function updateColumn(data) {
+  return request({
+    url: '/system/column',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除栏目导航
+export function delColumn(columnId) {
+  return request({
+    url: '/system/column/' + columnId,
+    method: 'delete'
+  })
+}

+ 61 - 0
ruoyi-ui/src/api/system/news.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询文章信息列表
+export function listNews(query) {
+  return request({
+    url: '/system/news/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询文章信息详细
+export function getNews(newsId) {
+  return request({
+    url: '/system/news/' + newsId,
+    method: 'get'
+  })
+}
+
+// 新增文章信息
+export function addNews(data) {
+  return request({
+    url: '/system/news',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改文章信息
+export function updateNews(data) {
+  return request({
+    url: '/system/news',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除文章信息
+export function delNews(newsId) {
+  return request({
+    url: '/system/news/' + newsId,
+    method: 'delete'
+  })
+}
+
+// 审核通过文章信息
+export function examineNews(newsId) {
+  return request({
+    url: '/system/news/examine'+ newsId,
+    method: 'get',
+  })
+}
+
+// 驳回文章信息
+export function rejectNews(data) {
+  return request({
+    url: '/system/news/reject',
+    method: 'post',
+    data: data
+  })
+}

+ 7 - 1
ruoyi-ui/src/settings.js

@@ -1,4 +1,8 @@
 module.exports = {
+  title: '印刷制品质量监督检验平台',
+
+  urls: 'http://192.168.101.11:8090',
+
   /**
    * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
    */
@@ -40,5 +44,7 @@ module.exports = {
    * The default is only used in the production env
    * If you want to also use it in dev, you can pass ['production', 'development']
    */
-  errorLog: 'production'
+  errorLog: 'production',
+  apiUrl: 'http://192.168.101.11:8090'
+
 }

+ 308 - 0
ruoyi-ui/src/views/system/column/index.vue

@@ -0,0 +1,308 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+
+      <el-form-item label="栏目名称" prop="deptName">
+        <el-input
+          v-model="queryParams.deptName"
+          placeholder="请输入栏目名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="栏目状态" clearable size="small">
+          <el-option
+            v-for="dict in dict.type.sys_normal_disable"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:column:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-sort"
+          size="mini"
+          @click="toggleExpandAll"
+        >展开/折叠</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-if="refreshTable"
+      v-loading="loading"
+      :data="columnList"
+      row-key="columnId"
+      :default-expand-all="isExpandAll"
+      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+    >
+      <el-table-column label="栏目名称" align="center" prop="columnName" />
+      <el-table-column label="显示顺序" align="center" prop="orderNum" />
+      <el-table-column prop="status" label="状态" width="100">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="200">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:column:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:column:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改栏目导航对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="24" v-if="form.parentId !== 0">
+            <el-form-item label="上级栏目" prop="parentId">
+              <treeselect v-model="form.parentId" :options="columnOptions" :normalizer="normalizer" placeholder="选择上级栏目" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="栏目名称" prop="deptName">
+              <el-input v-model="form.columnName" placeholder="请输入栏目名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="显示排序" prop="orderNum">
+              <el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="栏目状态">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in dict.type.sys_normal_disable"
+                  :key="dict.value"
+                  :label="dict.value"
+                >{{dict.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listColumn, getColumn, delColumn, addColumn, updateColumn, listColumnExcludeChild } from "@/api/system/column";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "Column",
+  dicts: ['sys_normal_disable'],
+  components: { Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 栏目导航表格数据
+      columnList: [],
+      // 栏目树选项
+      columnOptions: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 是否展开,默认全部展开
+      isExpandAll: true,
+      // 重新渲染表格状态
+      refreshTable: true,
+      // 查询参数
+      queryParams: {
+        deptName: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        columnName: [
+          { required: true, message: "栏目名称不能为空", trigger: "blur" }
+        ],
+        orderNum: [
+          { required: true, message: "显示排序不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询栏目导航列表 */
+    getList() {
+      this.loading = true;
+      listColumn(this.queryParams).then(response => {
+        if (response.data != null){
+          this.columnList = this.handleTree(response.data, "columnId");
+        }
+        this.loading = false;
+      });
+    },
+    /** 转换栏目数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.columnId,
+        label: node.columnName,
+        children: node.children
+      };
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        columnId: null,
+        parentId: null,
+        ancestors: null,
+        deptName: null,
+        orderNum: null,
+        status: "0",
+        delFlag: "N"
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd(row) {
+      this.reset();
+      if (row != undefined) {
+        this.form.parentId = row.columnId;
+      }
+      this.open = true;
+      this.title = "添加栏目导航";
+      listColumn().then(response => {
+        if (response.data != null) {
+          this.columnOptions = this.handleTree(response.data, "columnId");
+        }
+      });
+    },
+    /** 展开/折叠操作 */
+    toggleExpandAll() {
+      this.refreshTable = false;
+      this.isExpandAll = !this.isExpandAll;
+      this.$nextTick(() => {
+        this.refreshTable = true;
+      });
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      getColumn(row.columnId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改栏目导航";
+      });
+      listColumnExcludeChild(row.columnId).then(response => {
+        if (response.data != null){
+          this.columnOptions = this.handleTree(response.data, "columnId");
+        }
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.columnId != null) {
+            updateColumn(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addColumn(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const columnIds = row.columnId || this.ids;
+      this.$modal.confirm('是否确认删除栏目导航编号为"' + columnIds + '"的数据项?').then(function() {
+        return delColumn(columnIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    }
+  }
+};
+</script>

+ 395 - 0
ruoyi-ui/src/views/system/news/index.vue

@@ -0,0 +1,395 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="文章标题" prop="newsTitle">
+        <el-input
+          v-model="queryParams.newsTitle"
+          placeholder="请输入文章标题"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="文章状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择文章状态" clearable size="small">
+          <el-option
+            v-for="dict in dict.type.column_news"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="是否删除" prop="isDel">
+        <el-select v-model="queryParams.status" placeholder="请选择是否删除" clearable size="small">
+          <el-option
+            v-for="dict in dict.type.is_del"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:news:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:news:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:news:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:news:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="newsList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="栏目名称" align="center" prop="columnName" />
+      <el-table-column label="文章标题" align="center" prop="newsTitle" />
+      <el-table-column label="文章内容" align="center" prop="newsContent" />
+      <el-table-column label="文章状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.column_news" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="原因" align="center" prop="reason" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="examine(scope.row)"
+            v-hasPermi="['system:news:examine']"
+          >审核通过</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="reject(scope.row)"
+            v-hasPermi="['system:news:reject']"
+          >驳回</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:news:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:news:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改文章信息对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="780px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="文章标题" prop="newsTitle">
+          <el-input v-model="form.newsTitle" placeholder="请输入文章标题" />
+        </el-form-item>
+          <el-form-item label="选择栏目"  prop="columnId">
+            <treeselect v-model="form.columnId" :options="columnOptions" :normalizer="normalizer" placeholder="选择栏目" />
+          </el-form-item>
+        <el-form-item label="文章内容" prop="newsContent">
+          <editor v-model="form.newsContent" :min-height="192"/>
+        </el-form-item>
+<!--        <el-form-item label="文章状态">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.column_news"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="原因" prop="reason">
+          <el-input v-model="form.reason" placeholder="请输入原因" />
+        </el-form-item>-->
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listNews, getNews, delNews, addNews, updateNews,rejectNews,examineNews } from "@/api/system/news";
+import { listColumn } from '@/api/system/column'
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "News",
+  dicts: ['column_news','is_del'],
+  components: { Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 文章信息表格数据
+      newsList: [],
+      //栏目树选项
+      columnOptions: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        newsTitle: null,
+        newsContent: null,
+        columnId: null,
+        status: null,
+        isDel: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        newsTitle: [
+          { required: true, message: "文章标题不能为空", trigger: "blur" }
+        ],
+        columnId: [
+          { required: true, message: "所属栏目不能为空", trigger: "blur" }
+        ],
+        newsContent: [
+          { required: true, message: "文章内容不能为空", trigger: "blur" }
+        ],
+      },
+      boh:{}  //驳回原因
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询文章信息列表 */
+    getList() {
+      this.loading = true;
+      listNews(this.queryParams).then(response => {
+        this.newsList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        newsId: null,
+        newsTitle: null,
+        columnId: null,
+        newsContent: null,
+        status: "0",
+        isDel: null,
+        reason: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.newsId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加文章信息";
+      listColumn().then(response => {
+        if (response.data != null) {
+          this.columnOptions = this.handleTree(response.data, "columnId");
+        }
+      });
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const newsId = row.newsId || this.ids
+      getNews(newsId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改文章信息";
+        listColumn().then(response => {
+          if (response.data != null) {
+            this.columnOptions = this.handleTree(response.data, "columnId");
+          }
+        });
+      });
+    },
+
+    /** 审核通过按钮操作 */
+    examine(row) {
+      const newsId = row.newsId || this.ids
+      examineNews(newsId).then(response => {
+        this.$modal.msgSuccess("审核成功");
+        this.open = false;
+        this.getList();
+      });
+    },
+
+    /** 驳回按钮操作 */
+    reject(row) {
+      const newsId = row.newsId || this.ids
+      this.$prompt('请输入驳回原因', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+      }).then(({ value }) => {
+        this.boh.reason = value
+        this.boh.newsId = newsId
+        this.rejectNews(this.boh).then(response => {
+          this.$modal.msgSuccess("驳回成功");
+          this.open = false;
+          this.getList();
+        });
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '取消输入'
+        });
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.newsId != null) {
+            updateNews(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addNews(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const newsIds = row.newsId || this.ids;
+      this.$modal.confirm('是否确认删除文章信息编号为"' + newsIds + '"的数据项?').then(function() {
+        return delNews(newsIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/news/export', {
+        ...this.queryParams
+      }, `news_${new Date().getTime()}.xlsx`)
+    },
+
+
+    /** 转换栏目数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.columnId,
+        label: node.columnName,
+        children: node.children
+      };
+    }
+  }
+};
+</script>

+ 5 - 3
ruoyi-ui/vue.config.js

@@ -1,15 +1,17 @@
 'use strict'
 const path = require('path')
+const defaultSettings = require('./src/settings.js')
 
 function resolve(dir) {
   return path.join(__dirname, dir)
 }
 
+
 const CompressionPlugin = require('compression-webpack-plugin')
 
-const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
+const name = defaultSettings.title || '若依管理系统' // 网页标题
 
-const port = process.env.port || process.env.npm_config_port || 80 // 端口
+const port = process.env.port || process.env.npm_config_port || 8090 // 端口
 
 // vue.config.js 配置说明
 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
@@ -35,7 +37,7 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target: `http://localhost:8080`,
+        target: defaultSettings.urls,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''