Pārlūkot izejas kodu

完成article接口

tsurumure 8 mēneši atpakaļ
vecāks
revīzija
d23ef6ebee
22 mainītis faili ar 297 papildinājumiem un 138 dzēšanām
  1. 4 21
      db/cms_article.sql
  2. 12 10
      db/cms_article_i18n.sql
  3. 16 16
      db/sys_user_role_module.sql
  4. 7 7
      db/sys_user_role_module_relation.sql
  5. 11 0
      src/main/java/com/backendsys/config/Mybatis/mapper/BasePlusMapper.java
  6. 1 1
      src/main/java/com/backendsys/entity/Cms/CmsArticleTranslationsDTO.java
  7. 12 0
      src/main/java/com/backendsys/exception/GlobalExceptionHandler.java
  8. 6 6
      src/main/java/com/backendsys/mapper/Cms/CmsArticleMapper.xml
  9. 28 3
      src/main/java/com/backendsys/modules/cms/article/controller/ArticleController.java
  10. 16 0
      src/main/java/com/backendsys/modules/cms/article/dao/ArticleI18nDao.java
  11. 0 9
      src/main/java/com/backendsys/modules/cms/article/dao/ArticleTranslationsDao.java
  12. 2 7
      src/main/java/com/backendsys/modules/cms/article/entity/Article.java
  13. 6 2
      src/main/java/com/backendsys/modules/cms/article/entity/ArticleI18n.java
  14. 1 1
      src/main/java/com/backendsys/modules/cms/article/service/ArticleI18nService.java
  15. 8 0
      src/main/java/com/backendsys/modules/cms/article/service/ArticleService.java
  16. 8 0
      src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleI18nServiceImpl.java
  17. 96 1
      src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleServiceImpl.java
  18. 0 8
      src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleTranslationsServiceImpl.java
  19. 1 0
      src/main/resources/application-local.yml
  20. 1 0
      src/main/resources/application-prod.yml
  21. 18 46
      src/main/resources/mapper/cms.article/ArticleDao.xml
  22. 43 0
      src/main/resources/mapper/cms.article/ArticleI18nDao.xml

+ 4 - 21
db/cms_article.sql

@@ -11,8 +11,6 @@ CREATE TABLE `cms_article` (
     `id` BIGINT(10) AUTO_INCREMENT COMMENT 'ID',
     `user_id` BIGINT(10) NOT NULL COMMENT '作者/用户ID',
     `category_id` BIGINT(10) NOT NULL COMMENT '资讯分类ID',
-    `meta_keyword` VARCHAR(255) COMMENT 'SEO-Keyword',
-    `meta_description` VARCHAR(500) COMMENT 'SEO-Description',
     `is_top` TINYINT(1) DEFAULT '-1' COMMENT '是否置顶 (-1否, 1是)',
     `status` TINYINT(1) DEFAULT '1' COMMENT '资讯状态 (-1禁用, 1启用)',
     -- `audit_status` TINYINT(1) DEFAULT '1' COMMENT '审核状态 (-1审核拒绝, 1待审核, 2审核通过)',
@@ -22,23 +20,8 @@ CREATE TABLE `cms_article` (
     INDEX `idx_user_id` (`user_id`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='资讯表';
 
-INSERT INTO cms_article(user_id, category_id, meta_keyword, meta_description, is_top) VALUES
-    (1, 3, '音乐,舞台,年轻人,盛事', '每个音乐节都有其独特的风格和魅力,成为年轻人追捧的狂欢盛事', 1),
-    (1, 2, 'metaKeyword-2', 'metaDescription-2', -1),
-    (1, 2, 'metaKeyword-3', 'metaDescription-3', -1)
+INSERT INTO cms_article(user_id, category_id, is_top) VALUES
+    (1, 3, 1),
+    (1, 2, -1),
+    (1, 2, -1)
 ;
-
--- INSERT INTO cms_article(user_id, category_id, title, description, content, meta_keyword, meta_description, audit_status) VALUES
---     (1, 3, '时下流行的音乐节盛况', '随着夏季的到来,各种音乐节热情洋溢', '无数欢乐的人们聚集在户外,在舞台上欢呼跳跃,享受着音乐的魔力。从摇滚、电子到流行音乐,每个音乐节都有其独特的风格和魅力,成为年轻人追捧的狂欢盛事。', '音乐,舞台,年轻人,盛事', '每个音乐节都有其独特的风格和魅力,成为年轻人追捧的狂欢盛事', 2),
---     (1, 5, '旅行中的美食探索', 'a', '旅行不仅是探索风景的机会,也是品尝各地美食的机会。从小吃摊到高级餐厅,品味当地的特色美食是旅行中的一大乐趣。每个地方都有独特的美食文化,通过品尝当地的传统佳肴,我们可以更好地了解这个地方的历史、文化和人民生活方式。', '美食,旅游,文化,传统', '通过品尝当地的传统佳肴,我们可以更好地了解这个地方的历史、文化和人民生活方式', 2),
---     (1, 1, '测试标题-3', 'a', '测试长内容-3', 'SEO页面关键词-3', 'SEO页面描述长内容-3', 2),
---     (1, 1, '测试标题-4', 'a', '测试长内容-4', 'SEO页面关键词-4', 'SEO页面描述长内容-4', 2),
---     (1, 2, '测试标题-5', 'a', '测试长内容-5', 'SEO页面关键词-5', 'SEO页面描述长内容-5', 2),
---     (1, 2, '测试标题-6', 'a', '测试长内容-6', 'SEO页面关键词-6', 'SEO页面描述长内容-6', 2),
---     (1, 1, '测试标题-7', 'a', '测试长内容-7', 'SEO页面关键词-7', 'SEO页面描述长内容-7', 2),
---     (1, 1, '测试标题-8', 'a', '测试长内容-8', 'SEO页面关键词-8', 'SEO页面描述长内容-8', 2),
---     (1, 1, '测试标题-9', 'a', '测试长内容-9', 'SEO页面关键词-9', 'SEO页面描述长内容-9', 2),
---     (1, 1, '测试标题-10', 'a', '测试长内容-10', 'SEO页面关键词-10', 'SEO页面描述长内容-10', 2),
---     (1, 1, '测试标题-11', 'a', '测试长内容-11', 'SEO页面关键词-11', 'SEO页面描述长内容-11', 2),
---     (1, 1, '测试标题-12', 'a', '测试长内容-12', 'SEO页面关键词-12', 'SEO页面描述长内容-12', 2)
--- ;

+ 12 - 10
db/cms_article_translations.sql → db/cms_article_i18n.sql

@@ -1,20 +1,22 @@
-DROP TABLE IF EXISTS `cms_article_translations`;
+DROP TABLE IF EXISTS `cms_article_i18n`;
 
-CREATE TABLE `cms_article_translations` (
+CREATE TABLE `cms_article_i18n` (
     PRIMARY KEY (`id`),
     `id` BIGINT(10) AUTO_INCREMENT COMMENT 'ID',
     `article_id` BIGINT(10) NOT NULL COMMENT '作者/用户ID',
     `language` VARCHAR(10) NOT NULL COMMENT '语种',
     `title` VARCHAR(255) NOT NULL COMMENT '资讯标题',
     `description` VARCHAR(500) COMMENT '资讯描述',
-    `content` TEXT NOT NULL COMMENT '资讯详情'
+    `content` TEXT NOT NULL COMMENT '资讯详情',
+    `meta_keyword` VARCHAR(255) COMMENT 'SEO-Keyword',
+    `meta_description` VARCHAR(500) COMMENT 'SEO-Description'
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='资讯翻译表';
 
-INSERT INTO cms_article_translations(article_id, language, title, description, content) VALUES
-    (1, 'zh', '时下流行的音乐节盛况', '随着夏季的到来,各种音乐节热情洋溢', '无数欢乐的人们聚集在户外,在舞台上欢呼跳跃,享受着音乐的魔力。从摇滚、电子到流行音乐,每个音乐节都有其独特的风格和魅力,成为年轻人追捧的狂欢盛事。'),
-    (1, 'en', 'The current popularity of music festivals', 'With the arrival of summer, various music festivals are in full swing', 'Countless happy people gathered outdoors, cheering and jumping on the stage, enjoying the magic of the music. From rock, electronic to pop music, each music festival has its own unique style and charm, and has become a carnival event sought after by young people.'),
-    (2, 'zh', '阿阿2', '阿阿阿阿', '阿'),
-    (2, 'en', 'aa2', 'aaaaaaaa', 'a'),
-    (3, 'zh', '吧吧3', '吧吧吧吧', '吧'),
-    (3, 'en', 'bb2', 'bbbbbbb', 'b')
+INSERT INTO cms_article_i18n(article_id, language, title, description, content, meta_keyword, meta_description) VALUES
+    (1, 'zh', '时下流行的音乐节盛况', '随着夏季的到来,各种音乐节热情洋溢', '无数欢乐的人们聚集在户外,在舞台上欢呼跳跃,享受着音乐的魔力。从摇滚、电子到流行音乐,每个音乐节都有其独特的风格和魅力,成为年轻人追捧的狂欢盛事。', '音乐,舞台,年轻人,盛事', '每个音乐节都有其独特的风格和魅力,成为年轻人追捧的狂欢盛事'),
+    (1, 'en', 'The current popularity of music festivals', 'With the arrival of summer, various music festivals are in full swing', 'Countless happy people gathered outdoors, cheering and jumping on the stage, enjoying the magic of the music. From rock, electronic to pop music, each music festival has its own unique style and charm, and has become a carnival event sought after by young people.', 'Music, stage, young people, events', 'Each music festival has its own unique style and charm, and has become a carnival event sought after by young people'),
+    (2, 'zh', '阿阿2', '阿阿阿阿', '阿', 'metaKeyword-2', 'metaDescription-2'),
+    (2, 'en', 'aa2', 'aaaaaaaa', 'a', 'metaKeyword-2', 'metaDescription-2'),
+    (3, 'zh', '吧吧3', '吧吧吧吧', '吧', 'metaKeyword-3', 'metaDescription-3'),
+    (3, 'en', 'bb2', 'bbbbbbb', 'b', 'metaKeyword-3', 'metaDescription-3')
 ;

+ 16 - 16
db/sys_user_role_module.sql

@@ -78,22 +78,22 @@ INSERT INTO sys_user_role_module(id, parent_id, module_name, sort) VALUES
     ('5', -1, '系统日志管理', 901),
         ('5.1', '5', '系统日志-列表', null),
 
-    -- ('10', -1, '资讯管理', null),
-    --     ('10.1', '10', '幻灯片-列表', null),
-    --         ('10.1.1', '10.1', '幻灯片-详情', null),
-    --         ('10.1.2', '10.1', '幻灯片-创建', null),
-    --         ('10.1.3', '10.1', '幻灯片-编辑', null),
-    --         ('10.1.4', '10.1', '幻灯片-删除', null),
-    --     ('10.2', '10', '资讯分类-列表', null),
-    --         ('10.2.1', '10.2', '资讯分类-详情', null),
-    --         ('10.2.2', '10.2', '资讯分类-创建', null),
-    --         ('10.2.3', '10.2', '资讯分类-编辑', null),
-    --         ('10.2.4', '10.2', '资讯分类-删除', null),
-    --     ('10.3', '10', '资讯-列表', null),
-    --         ('10.3.1', '10.3', '资讯-详情', null),
-    --         ('10.3.2', '10.3', '资讯-创建', null),
-    --         ('10.3.3', '10.3', '资讯-编辑', null),
-    --         ('10.3.4', '10.3', '资讯-删除', null),
+    ('10', -1, '资讯管理', null),
+        ('10.1', '10', '幻灯片-列表', null),
+            ('10.1.1', '10.1', '幻灯片-详情', null),
+            ('10.1.2', '10.1', '幻灯片-创建', null),
+            ('10.1.3', '10.1', '幻灯片-编辑', null),
+            ('10.1.4', '10.1', '幻灯片-删除', null),
+        ('10.2', '10', '资讯分类-列表', null),
+            ('10.2.1', '10.2', '资讯分类-详情', null),
+            ('10.2.2', '10.2', '资讯分类-创建', null),
+            ('10.2.3', '10.2', '资讯分类-编辑', null),
+            ('10.2.4', '10.2', '资讯分类-删除', null),
+        ('10.3', '10', '资讯-列表', null),
+            ('10.3.1', '10.3', '资讯-详情', null),
+            ('10.3.2', '10.3', '资讯-创建', null),
+            ('10.3.3', '10.3', '资讯-编辑', null),
+            ('10.3.4', '10.3', '资讯-删除', null),
 
     -- ('11', -1, '商品管理', null),
     --     ('11.1', '11', '商品-列表', null),

+ 7 - 7
db/sys_user_role_module_relation.sql

@@ -38,13 +38,13 @@ INSERT INTO sys_user_role_module_relation(role_id, module_id) VALUES
             (1, '4.1.1'), (1, '4.1.2'), (1, '4.1.3'), (1, '4.1.4'), (1, '4.1.5'),
     (1, '5'),
         (1, '5.1'),
-#     (1, '10'),
-#         (1, '10.1'),
-#             (1, '10.1.1'), (1, '10.1.2'), (1, '10.1.3'), (1, '10.1.4'),
-#         (1, '10.2'),
-#             (1, '10.2.1'), (1, '10.2.2'), (1, '10.2.3'), (1, '10.2.4'),
-#         (1, '10.3'),
-#             (1, '10.3.1'), (1, '10.3.2'), (1, '10.3.3'), (1, '10.3.4'),
+    (1, '10'),
+        (1, '10.1'),
+            (1, '10.1.1'), (1, '10.1.2'), (1, '10.1.3'), (1, '10.1.4'),
+        (1, '10.2'),
+            (1, '10.2.1'), (1, '10.2.2'), (1, '10.2.3'), (1, '10.2.4'),
+        (1, '10.3'),
+            (1, '10.3.1'), (1, '10.3.2'), (1, '10.3.3'), (1, '10.3.4'),
 #     (1, '11'),
 #         (1, '11.1'),
 #             (1, '11.1.1'), (1, '11.1.2'), (1, '11.1.3'), (1, '11.1.4'),

+ 11 - 0
src/main/java/com/backendsys/config/Mybatis/mapper/BasePlusMapper.java

@@ -0,0 +1,11 @@
+package com.backendsys.config.Mybatis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+public interface BasePlusMapper<T> extends BaseMapper<T> {
+
+    int insertBatchSomeColumn(List<T> entityList);
+
+}

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

@@ -9,7 +9,7 @@ import lombok.Data;
 public class CmsArticleTranslationsDTO {
 
     /**
-     * cms_article_translations
+     * cms_article_i18n
      */
     @NotNull(message="article_id 不能为空")
     private Long article_id;

+ 12 - 0
src/main/java/com/backendsys/exception/GlobalExceptionHandler.java

@@ -11,6 +11,7 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.ConstraintViolation;
 import jakarta.validation.ConstraintViolationException;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.binding.BindingException;
 import org.apache.ibatis.exceptions.PersistenceException;
 import org.apache.ibatis.exceptions.TooManyResultsException;
 import org.mybatis.spring.MyBatisSystemException;
@@ -210,6 +211,17 @@ public class GlobalExceptionHandler implements ResponseBodyAdvice<Object> {
         );
     }
 
+    // 无效?
+    @ExceptionHandler(IllegalStateException.class)
+    public Result handleIllegalStateException(IllegalStateException e) {
+        printErrorException(e, true);
+        return Result.error(ResultEnum.PARAMETER_EXCEPTION.getCode(), e.getMessage());
+    }
+    @ExceptionHandler(BindingException.class)
+    public Result handleBindingException(BindingException e) {
+        printErrorException(e, true);
+        return Result.error(ResultEnum.PARAMETER_EXCEPTION.getCode(), e.getMessage());
+    }
 
 
     /**

+ 6 - 6
src/main/java/com/backendsys/mapper/Cms/CmsArticleMapper.xml

@@ -96,7 +96,7 @@
         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
+        LEFT JOIN cms_article_i18n at ON a.id = at.article_id
     </sql>
 
     <!-- 查 列表 -->
@@ -144,7 +144,7 @@
      <!-- 查 翻译集合 (子查询) -->
     <select id="queryTranslationsById" resultType="java.util.LinkedHashMap">
         SELECT <include refid="includeArticleTranslation" />
-        FROM cms_article_translations
+        FROM cms_article_i18n
         WHERE article_id = #{id}
     </select>
 
@@ -180,7 +180,7 @@
         );
     </insert>
     <insert id="insertArticleTranslations" parameterType="java.util.List">
-        INSERT INTO cms_article_translations (
+        INSERT INTO cms_article_i18n (
             article_id, language, title, content, description
         )
         VALUES 
@@ -202,7 +202,7 @@
         WHERE id = #{article_id};
 
         <foreach collection="translations" item="translation" separator=";">
-            UPDATE cms_article_translations
+            UPDATE cms_article_i18n
             <set>
                 title = #{translation.title},
                 content = #{translation.content},
@@ -219,7 +219,7 @@
     <!-- 删除 -->
     <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 FROM cms_article_i18n WHERE article_id = #{article_id};
     </delete>
 
     <!-- 删除 (批量) -->
@@ -229,7 +229,7 @@
             #{id}
         </foreach>;
 
-        DELETE FROM cms_article_translations WHERE article_id IN
+        DELETE FROM cms_article_i18n WHERE article_id IN
         <foreach collection="ids" item="id" open="(" separator="," close=")">
             #{id}
         </foreach>;

+ 28 - 3
src/main/java/com/backendsys/modules/cms/article/controller/ArticleController.java

@@ -1,6 +1,5 @@
 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;
@@ -9,8 +8,7 @@ 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;
+import org.springframework.web.bind.annotation.*;
 
 @Validated
 @RestController
@@ -34,4 +32,31 @@ public class ArticleController {
         return Result.success().put("data", articleService.selectArticleDetail(article));
     }
 
+    @Operation(summary = "创建资讯")
+    @PreAuthorize("@ss.hasPermi('10.3.2')")
+    @PostMapping("/api/v2/cms/article/createArticle")
+    public Result createArticle(@Validated(Article.Create.class) @RequestBody Article article) {
+        return Result.success().put("data", articleService.insertArticle(article));
+    }
+
+    @Operation(summary = "编辑资讯")
+    @PreAuthorize("@ss.hasPermi('10.3.3')")
+    @PutMapping("/api/v2/cms/article/updateArticle")
+    public Result updateArticle(@Validated(Article.Update.class) @RequestBody Article article) {
+        return Result.success().put("data", articleService.updateArticle(article));
+    }
+
+    @Operation(summary = "删除资讯")
+    @PreAuthorize("@ss.hasPermi('10.3.4')")
+    @DeleteMapping("/api/v2/cms/article/deleteArticle")
+    public Result deleteArticle(@Validated(Article.Delete.class) @RequestBody Article article) {
+        return Result.success().put("data", articleService.deleteArticle(article));
+    }
+
+    @PreAuthorize("@ss.hasPermi('10.3.4')")
+    @DeleteMapping("/api/v2/cms/article/deleteArticleBatch")
+    public Result deleteArticleBatch(@Validated(Article.Delete.class) @RequestBody Article article) {
+        return Result.success().put("data", articleService.deleteArticleBatch(article));
+    }
+
 }

+ 16 - 0
src/main/java/com/backendsys/modules/cms/article/dao/ArticleI18nDao.java

@@ -0,0 +1,16 @@
+package com.backendsys.modules.cms.article.dao;
+
+import com.backendsys.modules.cms.article.entity.ArticleI18n;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface ArticleI18nDao extends BaseMapper<ArticleI18n> {
+
+    // 批量插入
+    int insertBatch(List<ArticleI18n> translations);
+    int updateBatch(List<ArticleI18n> translations);
+
+}

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

@@ -1,9 +0,0 @@
-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> {
-}

+ 2 - 7
src/main/java/com/backendsys/modules/cms/article/entity/Article.java

@@ -7,7 +7,6 @@ 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;
@@ -36,17 +35,13 @@ public class Article {
 
     @TableField(exist = false)
     @NotEmpty(message="内容不能为空", groups = { Create.class, Update.class})
-    private List<ArticleTranslations> translations;
+    private List<ArticleI18n> 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;

+ 6 - 2
src/main/java/com/backendsys/modules/cms/article/entity/ArticleTranslations.java → src/main/java/com/backendsys/modules/cms/article/entity/ArticleI18n.java

@@ -7,8 +7,8 @@ import jakarta.validation.constraints.Size;
 import lombok.Data;
 
 @Data
-@TableName("cms_article_translations")
-public class ArticleTranslations {
+@TableName("cms_article_i18n")
+public class ArticleI18n {
     @NotNull(message="article_id 不能为空")
     private Long article_id;
     @NotEmpty(message="语言不能为空")
@@ -21,4 +21,8 @@ public class ArticleTranslations {
     @Size(max = 10000, message = "资讯内容长度不超过 {max} 字符")
     @NotEmpty(message="资讯内容不能为空")
     private String content;
+    @Size(max = 100, message = "关键词长度不超过 {max} 字符")
+    private String meta_keyword;
+    @Size(max = 200, message = "关键词描述长度不超过 {max} 字符")
+    private String meta_description;
 }

+ 1 - 1
src/main/java/com/backendsys/modules/cms/article/service/ArticleTranslationsService.java → src/main/java/com/backendsys/modules/cms/article/service/ArticleI18nService.java

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

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

@@ -11,5 +11,13 @@ public interface ArticleService {
     PageEntity selectArticleList(Article article);
     // 获取资讯详情
     Map<String, Object> selectArticleDetail(Article article);
+    // 创建资讯
+    Map<String, Object> insertArticle(Article article);
+    // 编辑资讯
+    Map<String, Object> updateArticle(Article article);
+    // 删除资讯
+    Map<String, Object> deleteArticle(Article article);
+    // 删除资讯 (批量)
+    Map<String, Object> deleteArticleBatch(Article article);
 
 }

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

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

+ 96 - 1
src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleServiceImpl.java

@@ -2,23 +2,34 @@ 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.dao.ArticleI18nDao;
 import com.backendsys.modules.cms.article.entity.Article;
+import com.backendsys.modules.cms.article.entity.ArticleI18n;
 import com.backendsys.modules.cms.article.service.ArticleService;
+import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.v2.PageUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
+import java.util.stream.Collectors;
 
 @Service
 public class ArticleServiceImpl implements ArticleService {
 
+    @Autowired
+    private HttpRequestUtil httpRequestUtil;
+
     @Autowired
     private ArticleDao articleDao;
+    @Autowired
+    private ArticleI18nDao articleI18nDao;
 
     /**
      * 获取资讯列表
@@ -26,6 +37,7 @@ public class ArticleServiceImpl implements ArticleService {
     @Override
     public PageEntity selectArticleList(Article article) {
         PageUtils.startPage();  // 分页
+        System.out.println(article);
         List<Article> list = articleDao.selectArticleList(article);
         return new PageInfoResult(list).toEntity();
     }
@@ -40,4 +52,87 @@ public class ArticleServiceImpl implements ArticleService {
         return articleDetail;
     }
 
+    /**
+     * 创建资讯
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> insertArticle(Article article) {
+
+        // 插入
+        article.setUser_id(httpRequestUtil.getUserId());
+        articleDao.insert(article);
+
+        Long article_id = article.getId();
+
+        // 批量插入 (翻译字段)
+        List<ArticleI18n> translations = article.getTranslations().stream()
+            .map(t -> { t.setArticle_id(article_id); return t; })
+            .collect(Collectors.toList());
+        articleI18nDao.insertBatch(translations);
+
+        return Map.of("article_id", article_id);
+    }
+
+    /**
+     * 编辑资讯
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> updateArticle(Article article) {
+
+        Long article_id = article.getArticle_id();
+
+        Article articleDetail = articleDao.selectById(article_id);
+        if (articleDetail == null) throw new CustException("资讯不存在");
+
+        // 更新
+        article.setId(article_id);
+        article.setUser_id(httpRequestUtil.getUserId());
+        articleDao.updateById(article);
+
+        // 批量更新 (翻译字段)
+        List<ArticleI18n> translations = article.getTranslations().stream()
+            .map(t -> { t.setArticle_id(article_id); return t; })
+            .collect(Collectors.toList());
+        articleI18nDao.updateBatch(translations);
+
+        return Map.of("article_id", article_id);
+    }
+
+
+    /**
+     * 删除资讯
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> deleteArticle(Article article) {
+
+        Long article_id = article.getArticle_id();
+
+        Article articleDetail = articleDao.selectById(article_id);
+        if (articleDetail == null) throw new CustException("资讯不存在");
+
+        articleDao.deleteById(article_id);
+        articleI18nDao.delete(new QueryWrapper<ArticleI18n>().eq("article_id", article_id));
+
+        return Map.of("article_id", article_id);
+    }
+
+    /**
+     * 删除资讯 (批量)
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> deleteArticleBatch(Article article) {
+
+        List<Long> article_ids = article.getArticle_ids();
+
+        articleDao.deleteBatchIds(article_ids);
+        articleI18nDao.delete(new QueryWrapper<ArticleI18n>().in("article_id", article_ids));
+
+        return Map.of("article_ids", article_ids);
+    }
+
+
 }

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

@@ -1,8 +0,0 @@
-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 {
-}

+ 1 - 0
src/main/resources/application-local.yml

@@ -31,6 +31,7 @@ spring:
       useLegacyDatetimeCode=false&
       serverTimezone=Asia/Shanghai&
       allowMultiQueries=true&
+      rewriteBatchedStatements=true&
       useAffectedRows=true
     username: root
     password: 123456

+ 1 - 0
src/main/resources/application-prod.yml

@@ -31,6 +31,7 @@ spring:
       useLegacyDatetimeCode=false&
       serverTimezone=Asia/Shanghai&
       allowMultiQueries=true&
+      rewriteBatchedStatements=true&
       useAffectedRows=true
     username: root
     password: Yqo%gGAK5!NSr!Pv

+ 18 - 46
src/main/resources/mapper/cms.article/ArticleDao.xml

@@ -24,15 +24,20 @@
         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
+        id,
+        article_id,
+        language,
+        title,
+        description,
+        content,
+        COALESCE(meta_keyword, '') meta_keyword,
+        COALESCE(meta_description, '') meta_description
     </sql>
     <sql id="leftJoinCategory">
         LEFT JOIN cms_article_category ac ON a.category_id = ac.id
@@ -41,7 +46,7 @@
         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
+        LEFT JOIN cms_article_i18n at ON a.id = at.article_id
     </sql>
 
     <resultMap id="resultMapArticle" type="java.util.LinkedHashMap">
@@ -66,8 +71,6 @@
         <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" />
@@ -78,6 +81,8 @@
             <result property="title" column="title" />
             <result property="content" column="content" />
             <result property="description" column="description" />
+            <result property="meta_keyword" column="meta_keyword" />
+            <result property="meta_description" column="meta_description" />
         </collection>
     </resultMap>
 
@@ -106,10 +111,10 @@
                 AND a.create_time >= #{create_time}
             </if>
         </where>
-        ORDER BY a.is_top = 1 DESC, a.update_time DESC
+        ORDER BY a.is_top = 1 DESC, a.create_time DESC
     </select>
 
-    <!-- 查 详情 (二次查询,带翻译) -->
+    <!-- 查 详情 -->
     <select id="selectArticleDetail" resultMap="resultMapArticleDetail">
          SELECT <include refid="includeArticleDetail" />
         FROM cms_article a
@@ -117,13 +122,11 @@
         <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
+        FROM cms_article_i18n
         WHERE article_id = #{id}
     </select>
 
@@ -138,37 +141,6 @@
     <!--    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-->
@@ -181,7 +153,7 @@
     <!--    WHERE id = #{article_id};-->
 
     <!--    <foreach collection="translations" item="translation" separator=";">-->
-    <!--        UPDATE cms_article_translations-->
+    <!--        UPDATE cms_article_i18n-->
     <!--        <set>-->
     <!--            title = #{translation.title},-->
     <!--            content = #{translation.content},-->
@@ -198,7 +170,7 @@
     <!--&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 FROM cms_article_i18n WHERE article_id = #{article_id};-->
     <!--</delete>-->
 
     <!--&lt;!&ndash; 删除 (批量) &ndash;&gt;-->
@@ -208,7 +180,7 @@
     <!--        #{id}-->
     <!--    </foreach>;-->
 
-    <!--    DELETE FROM cms_article_translations WHERE article_id IN-->
+    <!--    DELETE FROM cms_article_i18n WHERE article_id IN-->
     <!--    <foreach collection="ids" item="id" open="(" separator="," close=")">-->
     <!--        #{id}-->
     <!--    </foreach>;-->

+ 43 - 0
src/main/resources/mapper/cms.article/ArticleI18nDao.xml

@@ -0,0 +1,43 @@
+<?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.ArticleI18nDao">
+
+    <!-- 批量插入 -->
+    <insert id="insertBatch" parameterType="java.util.List">
+        INSERT INTO cms_article_i18n (
+            article_id, language, title, description, content, meta_keyword, meta_description
+        )
+        VALUES
+        <foreach collection="translations" item="item" separator=",">
+        (
+            #{item.article_id}, #{item.language}, #{item.title},
+            #{item.description}, #{item.content},
+            #{item.meta_keyword}, #{item.meta_description}
+        )
+        </foreach>
+    </insert>
+
+    <!-- 批量更新 -->
+    <update id="updateBatch" parameterType="com.backendsys.modules.cms.article.entity.ArticleI18n">
+        <foreach collection="translations" item="item" separator=";">
+            UPDATE cms_article_i18n
+            <set>
+                <trim suffixOverrides="," suffix=" ">
+                    title = #{item.title},
+                    content = #{item.content},
+                    <if test="item.description != null and item.description != ''">
+                        description = #{item.description},
+                    </if>
+                    <if test="item.meta_keyword != null and item.meta_keyword != ''">
+                        meta_keyword = #{item.meta_keyword},
+                    </if>
+                    <if test="item.meta_description != null and item.meta_description != ''">
+                        meta_description = #{item.meta_description},
+                    </if>
+                </trim>
+            </set>
+            WHERE article_id = #{item.article_id} AND language = #{item.language}
+        </foreach>
+    </update>
+
+</mapper>