Browse Source

Add Article V2

Mure 8 months ago
parent
commit
47083786ab
18 changed files with 506 additions and 33 deletions
  1. 0 23
      db/sys_user_role_module_relation.sql
  2. 13 7
      pom.xml
  3. 0 1
      src/main/java/com/backendsys/entity/Cms/CmsArticleDTO.java
  4. 37 0
      src/main/java/com/backendsys/modules/cms/article/controller/ArticleController.java
  5. 9 0
      src/main/java/com/backendsys/modules/cms/article/dao/ArticleCategoryDao.java
  6. 15 0
      src/main/java/com/backendsys/modules/cms/article/dao/ArticleDao.java
  7. 9 0
      src/main/java/com/backendsys/modules/cms/article/dao/ArticleTranslationsDao.java
  8. 53 0
      src/main/java/com/backendsys/modules/cms/article/entity/Article.java
  9. 39 0
      src/main/java/com/backendsys/modules/cms/article/entity/ArticleCategory.java
  10. 24 0
      src/main/java/com/backendsys/modules/cms/article/entity/ArticleTranslations.java
  11. 7 0
      src/main/java/com/backendsys/modules/cms/article/service/ArticleCategoryService.java
  12. 15 0
      src/main/java/com/backendsys/modules/cms/article/service/ArticleService.java
  13. 4 0
      src/main/java/com/backendsys/modules/cms/article/service/ArticleTranslationsService.java
  14. 11 0
      src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleCategoryServiceImpl.java
  15. 43 0
      src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleServiceImpl.java
  16. 8 0
      src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleTranslationsServiceImpl.java
  17. 2 2
      src/main/java/com/backendsys/modules/system/service/impl/SysUserV2ServiceImpl.java
  18. 217 0
      src/main/resources/mapper/cms.article/ArticleDao.xml

+ 0 - 23
db/sys_user_role_module_relation.sql

@@ -14,29 +14,6 @@ CREATE TABLE `sys_user_role_module_relation` (
     INDEX `idx_role_id` (`role_id`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统角色模块关系表';
 
-
-# # 使用 存储过程 循环插入
-# DROP PROCEDURE IF EXISTS backendsys.insert_multiple_rows;
-# DELIMITER //
-# CREATE PROCEDURE insert_multiple_rows()
-# BEGIN
-#     DECLARE counter INT DEFAULT 1;
-#     DECLARE counter2 INT DEFAULT 1;
-#
-#     WHILE counter <= 52 DO
-#         INSERT INTO sys_user_role_module_relation(role_id, module_id) VALUES (1, counter);
-#         SET counter = counter + 1;
-#     END WHILE;
-#
-#     WHILE counter2 <= 14 DO
-#         INSERT INTO sys_user_role_module_relation(role_id, module_id) VALUES (2, counter2);
-#         SET counter2 = counter2 + 1;
-#     END WHILE;
-#
-# END //
-# DELIMITER ;
-# CALL insert_multiple_rows();
-
 INSERT INTO sys_user_role_module_relation(role_id, module_id) VALUES
     (1, '1'),
         (1, '1.1'),

+ 13 - 7
pom.xml

@@ -308,18 +308,18 @@
         </dependency>
 
         <!-- 紫鸟科技SDK (私有库)-->
+        <!--<dependency>-->
+        <!--    <groupId>com.ziniao</groupId>-->
+        <!--    <artifactId>ziniao-sdk-java</artifactId>-->
+        <!--    <version>5.1.0</version>-->
+        <!--</dependency>-->
         <dependency>
             <groupId>com.ziniao</groupId>
             <artifactId>ziniao-sdk-java</artifactId>
             <version>5.1.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/configuration/.m2/repository/ziniao-sdk-java-5.1.0.jar</systemPath>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>com.ziniao</groupId>-->
-<!--            <artifactId>ziniao-sdk-java</artifactId>-->
-<!--            <version>5.1.0</version>-->
-<!--            <scope>system</scope>-->
-<!--            <systemPath>${project.basedir}/libs/ziniao-sdk-java-5.1.0.jar</systemPath>-->
-<!--        </dependency>-->
 
         <!-- 火山AI SDK 测试-->
 <!--        <dependency>-->
@@ -382,6 +382,12 @@
             <version>2.8.7</version>
         </dependency>
 
+        <!-- 模板引擎 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+
     </dependencies>
 
 

+ 0 - 1
src/main/java/com/backendsys/entity/Cms/CmsArticleDTO.java

@@ -53,7 +53,6 @@ public class CmsArticleDTO {
     // private Integer audit_status;
 
     private Integer is_top;
-
     private String create_time;
     private String update_time;
 

+ 37 - 0
src/main/java/com/backendsys/modules/cms/article/controller/ArticleController.java

@@ -0,0 +1,37 @@
+package com.backendsys.modules.cms.article.controller;
+
+import com.backendsys.entity.Cms.CmsArticleDTO;
+import com.backendsys.modules.cms.article.entity.Article;
+import com.backendsys.modules.cms.article.service.ArticleService;
+import com.backendsys.modules.common.utils.Result;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Validated
+@RestController
+@Tag(name = "资讯管理")
+public class ArticleController {
+
+    @Autowired
+    private ArticleService articleService;
+
+    @Operation(summary = "获取资讯列表")
+    @PreAuthorize("@ss.hasPermi('10.3')")
+    @GetMapping("/api/v2/cms/article/getArticle")
+    public Result getArticle(@Validated Article article) {
+        return Result.success().put("data", articleService.selectArticleList(article));
+    }
+
+    @Operation(summary = "获取资讯详情")
+    @PreAuthorize("@ss.hasPermi('10.3.1')")
+    @GetMapping("/api/v2/cms/article/getArticleDetail")
+    public Result getArticleDetail(@Validated(Article.Detail.class) Article article) {
+        return Result.success().put("data", articleService.selectArticleDetail(article));
+    }
+
+}

+ 9 - 0
src/main/java/com/backendsys/modules/cms/article/dao/ArticleCategoryDao.java

@@ -0,0 +1,9 @@
+package com.backendsys.modules.cms.article.dao;
+
+import com.backendsys.modules.cms.article.entity.ArticleCategory;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ArticleCategoryDao extends BaseMapper<ArticleCategory> {
+}

+ 15 - 0
src/main/java/com/backendsys/modules/cms/article/dao/ArticleDao.java

@@ -0,0 +1,15 @@
+package com.backendsys.modules.cms.article.dao;
+
+import com.backendsys.modules.cms.article.entity.Article;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface ArticleDao extends BaseMapper<Article> {
+
+    List<Article> selectArticleList(Article article);
+    Map<String, Object> selectArticleDetail(Article article);
+}

+ 9 - 0
src/main/java/com/backendsys/modules/cms/article/dao/ArticleTranslationsDao.java

@@ -0,0 +1,9 @@
+package com.backendsys.modules.cms.article.dao;
+
+import com.backendsys.modules.cms.article.entity.ArticleTranslations;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ArticleTranslationsDao extends BaseMapper<ArticleTranslations> {
+}

+ 53 - 0
src/main/java/com/backendsys/modules/cms/article/entity/Article.java

@@ -0,0 +1,53 @@
+package com.backendsys.modules.cms.article.entity;
+
+import com.backendsys.entity.validator.RangeArray;
+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 jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@TableName("cms_article")
+public class Article {
+
+    public static interface Detail{}
+    public static interface Create{}
+    public static interface Update{}
+    public static interface Delete{}
+
+    @TableField(exist = false)
+    private String lang;
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    @TableField("id")
+    @NotNull(message="article_id 不能为空", groups = { Detail.class, Update.class })
+    private Long article_id;
+    @TableField(exist = false)
+    private List<Long> article_ids;
+    @TableField(exist = false)
+    private String title;
+
+    @TableField(exist = false)
+    @NotEmpty(message="内容不能为空", groups = { Create.class, Update.class})
+    private List<ArticleTranslations> translations;
+
+    private Long user_id;
+    private Long category_id;
+    @Size(max = 100, message = "关键词长度不超过 {max} 字符", groups = { Create.class, Update.class})
+    private String meta_keyword;
+    @Size(max = 200, message = "关键词描述长度不超过 {max} 字符", groups = { Create.class, Update.class})
+    private String meta_description;
+    @RangeArray(message="资讯状态取值有误,范围应是(-1禁用, 1启用)", value = {"-1", "1"}, groups = { Create.class, Update.class})
+    private Integer status;
+
+    private Integer is_top;
+    private String create_time;
+    private String update_time;
+}

+ 39 - 0
src/main/java/com/backendsys/modules/cms/article/entity/ArticleCategory.java

@@ -0,0 +1,39 @@
+package com.backendsys.modules.cms.article.entity;
+
+import com.backendsys.entity.Cms.CmsArticleCategoryDTO;
+import com.backendsys.entity.validator.RangeArray;
+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 jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+
+@Data
+@TableName("cms_article_category")
+public class ArticleCategory {
+
+    public static interface Detail{}
+    public static interface Create{}
+    public static interface Update{}
+    public static interface Delete{}
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    @TableField("id")
+    @NotNull(message="article_category_id 不能为空", groups = { Detail.class, Update.class })
+    private Long article_category_id;
+    private Long parent_id;
+    @Size(max = 20, message = "资讯分类名称长度不超过 {max} 字符", groups = {CmsArticleCategoryDTO.Create.class, CmsArticleCategoryDTO.Update.class})
+    @NotBlank(message="资讯分类名称不能为空", groups = {CmsArticleCategoryDTO.Create.class, CmsArticleCategoryDTO.Update.class, })
+    private String category_name;
+    @Size(max = 200, message = "资讯分类描述长度不超过 {max} 字符", groups = {CmsArticleCategoryDTO.Create.class, CmsArticleCategoryDTO.Update.class})
+    private String category_description;
+    @Range(min = 1, max = 9999, message = "排序必须在 {min} 到 {max} 之间", groups = {CmsArticleCategoryDTO.Create.class, CmsArticleCategoryDTO.Update.class})
+    private Integer sort;
+    @RangeArray(message="状态取值有误,范围应是(-1禁用, 1启用)", value = {"-1", "1"}, groups = {CmsArticleCategoryDTO.Create.class, CmsArticleCategoryDTO.Update.class})
+    private Integer status;
+}

+ 24 - 0
src/main/java/com/backendsys/modules/cms/article/entity/ArticleTranslations.java

@@ -0,0 +1,24 @@
+package com.backendsys.modules.cms.article.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+@Data
+@TableName("cms_article_translations")
+public class ArticleTranslations {
+    @NotNull(message="article_id 不能为空")
+    private Long article_id;
+    @NotEmpty(message="语言不能为空")
+    private String language;
+    @Size(max = 100, message = "资讯标题长度不超过 {max} 字符")
+    @NotEmpty(message="资讯标题不能为空")
+    private String title;
+    @Size(max = 200, message = "资讯描述长度不超过 {max} 字符")
+    private String description;
+    @Size(max = 10000, message = "资讯内容长度不超过 {max} 字符")
+    @NotEmpty(message="资讯内容不能为空")
+    private String content;
+}

+ 7 - 0
src/main/java/com/backendsys/modules/cms/article/service/ArticleCategoryService.java

@@ -0,0 +1,7 @@
+package com.backendsys.modules.cms.article.service;
+
+import com.backendsys.modules.cms.article.entity.ArticleCategory;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface ArticleCategoryService extends IService<ArticleCategory> {
+}

+ 15 - 0
src/main/java/com/backendsys/modules/cms/article/service/ArticleService.java

@@ -0,0 +1,15 @@
+package com.backendsys.modules.cms.article.service;
+
+import com.backendsys.modules.cms.article.entity.Article;
+import com.backendsys.utils.response.PageEntity;
+
+import java.util.Map;
+
+public interface ArticleService {
+
+    // 获取资讯列表
+    PageEntity selectArticleList(Article article);
+    // 获取资讯详情
+    Map<String, Object> selectArticleDetail(Article article);
+
+}

+ 4 - 0
src/main/java/com/backendsys/modules/cms/article/service/ArticleTranslationsService.java

@@ -0,0 +1,4 @@
+package com.backendsys.modules.cms.article.service;
+
+public interface ArticleTranslationsService {
+}

+ 11 - 0
src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleCategoryServiceImpl.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.cms.article.service.impl;
+
+import com.backendsys.modules.cms.article.dao.ArticleCategoryDao;
+import com.backendsys.modules.cms.article.entity.ArticleCategory;
+import com.backendsys.modules.cms.article.service.ArticleCategoryService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ArticleCategoryServiceImpl extends ServiceImpl<ArticleCategoryDao, ArticleCategory> implements ArticleCategoryService {
+}

+ 43 - 0
src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleServiceImpl.java

@@ -0,0 +1,43 @@
+package com.backendsys.modules.cms.article.service.impl;
+
+import com.backendsys.exception.CustException;
+import com.backendsys.modules.cms.article.dao.ArticleDao;
+import com.backendsys.modules.cms.article.entity.Article;
+import com.backendsys.modules.cms.article.service.ArticleService;
+import com.backendsys.utils.response.PageEntity;
+import com.backendsys.utils.response.PageInfoResult;
+import com.backendsys.utils.v2.PageUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Service
+public class ArticleServiceImpl implements ArticleService {
+
+    @Autowired
+    private ArticleDao articleDao;
+
+    /**
+     * 获取资讯列表
+     */
+    @Override
+    public PageEntity selectArticleList(Article article) {
+        PageUtils.startPage();  // 分页
+        List<Article> list = articleDao.selectArticleList(article);
+        return new PageInfoResult(list).toEntity();
+    }
+
+    /**
+     * 获取资讯详情
+     */
+    @Override
+    public Map<String, Object> selectArticleDetail(Article article) {
+        Map<String, Object> articleDetail = articleDao.selectArticleDetail(article);
+        if (articleDetail == null) throw new CustException("资讯不存在");
+        return articleDetail;
+    }
+
+}

+ 8 - 0
src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleTranslationsServiceImpl.java

@@ -0,0 +1,8 @@
+package com.backendsys.modules.cms.article.service.impl;
+
+import com.backendsys.modules.cms.article.service.ArticleTranslationsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ArticleTranslationsServiceImpl implements ArticleTranslationsService {
+}

+ 2 - 2
src/main/java/com/backendsys/modules/system/service/impl/SysUserV2ServiceImpl.java

@@ -85,11 +85,11 @@ public class SysUserV2ServiceImpl extends ServiceImpl<SysUserDao, SysUser> imple
 
         // 获得 用户账号信息
         SysUser sysUser = sysUserDao.selectOne(new QueryWrapper<SysUser>().eq("id", user_id));
-        Objects.requireNonNull(sysUser, "用户不存在");
+        if (sysUser == null) throw new CustException("用户不存在");
 
         // 获得 用户基本信息
         SysUserInfo sysUserInfo = sysUserInfoDao.selectOne(new QueryWrapper<SysUserInfo>().eq("user_id", user_id));
-        Objects.requireNonNull(sysUserInfo, "用户不存在");
+        if (sysUserInfo == null) throw new CustException("用户不存在");
 
         // 用户账号信息 赋值到 用户基本信息
         BeanUtils.copyProperties(sysUser, sysUserInfo);

+ 217 - 0
src/main/resources/mapper/cms.article/ArticleDao.xml

@@ -0,0 +1,217 @@
+<?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.backendsys.modules.cms.article.dao.ArticleDao">
+
+    <sql id="includeArticle">
+        a.id id,
+        a.id article_id,
+        sf.user_id user_id,
+        COALESCE(sf.nickname, '') user_nickname,
+        ac.id category_id,
+        ac.category_name category_name,
+        at.title title,
+        COALESCE(at.description, '') description,
+        a.status status,
+        a.is_top is_top,
+        a.create_time create_time,
+        a.update_time update_time
+    </sql>
+
+    <sql id="includeArticleDetail">
+        a.id id,
+        a.id article_id,
+        sf.user_id user_id,
+        COALESCE(sf.nickname, '') user_nickname,
+        ac.id category_id,
+        ac.category_name category_name,
+        COALESCE(a.meta_keyword, '') meta_keyword,
+        COALESCE(a.meta_description, '') meta_description,
+        a.status status,
+        a.is_top is_top,
+        a.create_time create_time,
+        a.update_time update_time
+    </sql>
+    <sql id="includeArticleTranslation">
+        id, article_id, language, title, description, content
+    </sql>
+    <sql id="leftJoinCategory">
+        LEFT JOIN cms_article_category ac ON a.category_id = ac.id
+    </sql>
+    <sql id="leftJoinUser">
+        LEFT JOIN sys_user_info sf ON a.user_id = sf.user_id
+    </sql>
+    <sql id="leftJoinTranslations">
+        LEFT JOIN cms_article_translations at ON a.id = at.article_id
+    </sql>
+
+    <resultMap id="resultMapArticle" type="java.util.LinkedHashMap">
+        <id property="id" column="id" jdbcType="BIGINT" />
+        <result property="article_id" column="article_id" javaType="java.lang.Long" />
+        <result property="user_id" column="user_id" javaType="java.lang.Long" />
+        <result property="user_nickname" column="user_nickname" />
+        <result property="category_id" column="category_id" javaType="java.lang.Long" />
+        <result property="category_name" column="category_name" />
+        <result property="title" column="title" />
+        <result property="description" column="description" />
+        <result property="status" column="status" javaType="java.lang.Integer" />
+        <result property="is_top" column="is_top" javaType="java.lang.Integer" />
+        <result property="create_time" column="create_time" />
+        <result property="update_time" column="update_time" />
+    </resultMap>
+
+    <resultMap id="resultMapArticleDetail" type="java.util.LinkedHashMap">
+        <id property="id" column="id" jdbcType="BIGINT" />
+        <result property="article_id" column="article_id" javaType="java.lang.Long" />
+        <result property="user_id" column="user_id" javaType="java.lang.Long" />
+        <result property="user_nickname" column="user_nickname" />
+        <result property="category_id" column="category_id" javaType="java.lang.Long" />
+        <result property="category_name" column="category_name" />
+        <result property="meta_keyword" column="meta_keyword" />
+        <result property="meta_description" column="meta_description" />
+        <result property="status" column="status" javaType="java.lang.Integer" />
+        <result property="is_top" column="is_top" javaType="java.lang.Integer" />
+        <result property="create_time" column="create_time" />
+        <result property="update_time" column="update_time" />
+        <collection property="translations" javaType="java.util.List"
+            select="queryTranslationsById" column="id">
+            <id property="id" column="id" />
+            <result property="title" column="title" />
+            <result property="content" column="content" />
+            <result property="description" column="description" />
+        </collection>
+    </resultMap>
+
+
+    <!-- 查 列表 -->
+    <select id="selectArticleList" resultMap="resultMapArticle">
+        SELECT <include refid="includeArticle" /> FROM cms_article a
+        <include refid="leftJoinCategory" />
+        <include refid="leftJoinUser" />
+        <include refid="leftJoinTranslations" />
+        <where>
+            at.language = #{lang}
+            <if test="title != null and title != ''">
+                AND at.title LIKE CONCAT('%', #{title}, '%')
+            </if>
+            <if test="user_id != null and user_id != ''">
+                AND a.user_id = #{user_id}
+            </if>
+            <if test="category_id != null and category_id != ''">
+                AND a.category_id = #{category_id}
+            </if>
+            <if test="status != null and status != ''">
+                AND a.status = #{status}
+            </if>
+            <if test="create_time != null and create_time != ''">
+                AND a.create_time >= #{create_time}
+            </if>
+        </where>
+        ORDER BY a.is_top = 1 DESC, a.update_time DESC
+    </select>
+
+    <!-- 查 详情 (二次查询,带翻译) -->
+    <select id="selectArticleDetail" resultMap="resultMapArticleDetail">
+         SELECT <include refid="includeArticleDetail" />
+        FROM cms_article a
+        <include refid="leftJoinCategory" />
+        <include refid="leftJoinUser" />
+        WHERE a.id = #{article_id}
+    </select>
+    <!--<include refid="leftJoinTranslations" />-->
+    <!-- and at.language = #{lang} -->
+
+    <!-- 查 翻译集合 (子查询) -->
+    <select id="queryTranslationsById" resultType="java.util.LinkedHashMap">
+        SELECT <include refid="includeArticleTranslation" />
+        FROM cms_article_translations
+        WHERE article_id = #{id}
+    </select>
+
+
+    <!--&lt;!&ndash; 查 详情 (公共) (带翻译 Object) (关联查询) &ndash;&gt;-->
+    <!--<select id="queryArticleDetailPublic" resultMap="resultMapArticle">-->
+    <!--    SELECT <include refid="includeArticle" />, content-->
+    <!--    FROM cms_article a-->
+    <!--    <include refid="leftJoinCategory" />-->
+    <!--    <include refid="leftJoinUser" />-->
+    <!--    <include refid="leftJoinTranslations" />-->
+    <!--    WHERE a.id = #{article_id} AND at.language = #{lang}-->
+    <!--</select>-->
+
+
+    <!--&lt;!&ndash; 审核功能,参考 /System/SysUserMapper.xml &ndash;&gt;-->
+
+    <!--<insert id="insertArticle" parameterType="com.backendsys.entity.Cms.CmsArticleDTO"-->
+    <!--        useGeneratedKeys="true" keyProperty="article_id">-->
+    <!--    INSERT INTO cms_article (-->
+    <!--    user_id, category_id-->
+    <!--    <if test="meta_keyword != null and meta_keyword != ''">, meta_keyword</if>-->
+    <!--    <if test="meta_description != null and meta_description != ''">, meta_description</if>-->
+    <!--    <if test="status != null and status != ''">, status</if>-->
+    <!--    <if test="is_top != null and is_top != ''">, is_top</if>-->
+    <!--    )-->
+    <!--    VALUES (-->
+    <!--    #{user_id}, #{category_id}-->
+    <!--    <if test="meta_keyword != null and meta_keyword != ''">, #{meta_keyword}</if>-->
+    <!--    <if test="meta_description != null and meta_description != ''">, #{meta_description}</if>-->
+    <!--    <if test="status != null and status != ''">, #{status}</if>-->
+    <!--    <if test="is_top != null and is_top != ''">, #{is_top}</if>-->
+    <!--    );-->
+    <!--</insert>-->
+    <!--<insert id="insertArticleTranslations" parameterType="java.util.List">-->
+    <!--    INSERT INTO cms_article_translations (-->
+    <!--    article_id, language, title, content, description-->
+    <!--    )-->
+    <!--    VALUES-->
+    <!--    <foreach collection="translations" item="translation" separator=",">-->
+    <!--        (#{translation.article_id}, #{translation.language}, #{translation.title}, #{translation.content}, #{translation.description})-->
+    <!--    </foreach>-->
+    <!--</insert>-->
+
+
+    <!--<update id="updateArticle" parameterType="com.backendsys.entity.Cms.CmsArticleDTO"-->
+    <!--        useGeneratedKeys="true" keyProperty="article_id">-->
+    <!--    UPDATE cms_article-->
+    <!--    SET-->
+    <!--    category_id = #{category_id}-->
+    <!--    <if test="meta_keyword != null and meta_keyword != ''">, meta_keyword = #{meta_keyword}</if>-->
+    <!--    <if test="meta_description != null and meta_description != ''">, meta_description = #{meta_description}</if>-->
+    <!--    <if test="status != null and status != ''">, status = #{status}</if>-->
+    <!--    <if test="is_top != null and is_top != ''">, is_top = #{is_top}</if>-->
+    <!--    WHERE id = #{article_id};-->
+
+    <!--    <foreach collection="translations" item="translation" separator=";">-->
+    <!--        UPDATE cms_article_translations-->
+    <!--        <set>-->
+    <!--            title = #{translation.title},-->
+    <!--            content = #{translation.content},-->
+    <!--            <if test="translation.description != null and translation.description != ''">-->
+    <!--                description = #{translation.description}-->
+    <!--            </if>-->
+    <!--        </set>-->
+    <!--        WHERE article_id = ${article_id} AND language = #{translation.language}-->
+    <!--    </foreach>-->
+
+    <!--</update>-->
+    <!--&lt;!&ndash; <if test="audit_status != null and audit_status != ''">, audit_status = #{audit_status}</if> &ndash;&gt;-->
+
+    <!--&lt;!&ndash; 删除 &ndash;&gt;-->
+    <!--<delete id="deleteArticle" parameterType="java.lang.Long">-->
+    <!--    DELETE FROM cms_article WHERE id = #{article_id};-->
+    <!--    DELETE FROM cms_article_translations WHERE article_id = #{article_id};-->
+    <!--</delete>-->
+
+    <!--&lt;!&ndash; 删除 (批量) &ndash;&gt;-->
+    <!--<delete id="deleteArticleBatch" parameterType="java.lang.Long">-->
+    <!--    DELETE FROM cms_article WHERE id IN-->
+    <!--    <foreach collection="ids" item="id" open="(" separator="," close=")">-->
+    <!--        #{id}-->
+    <!--    </foreach>;-->
+
+    <!--    DELETE FROM cms_article_translations WHERE article_id IN-->
+    <!--    <foreach collection="ids" item="id" open="(" separator="," close=")">-->
+    <!--        #{id}-->
+    <!--    </foreach>;-->
+    <!--</delete>-->
+
+</mapper>