Sfoglia il codice sorgente

Merge branch 'dev-yhq'

tsurumure 5 mesi fa
parent
commit
de268f6e43

+ 4 - 4
db/cms_banner_i18n.sql

@@ -11,12 +11,12 @@ CREATE TABLE `cms_banner_i18n` (
     `banner_id` BIGINT NOT NULL COMMENT '幻灯片ID',
     `language` VARCHAR(10) NOT NULL COMMENT '语种',
     `title` VARCHAR(255) NOT NULL COMMENT '幻灯片标题',
-    `link` VARCHAR(500) COMMENT '链接',
-    `image` VARCHAR(500) NOT NULL COMMENT '图片',
-    `image_thumb` VARCHAR(500) NOT NULL COMMENT '图片 (缩略图)'
+    `link` VARCHAR(1000) COMMENT '链接',
+    `image` VARCHAR(1000) NOT NULL COMMENT '图片',
+    `image_thumb` VARCHAR(1000) NOT NULL COMMENT '图片 (缩略图)'
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='幻灯片表 (翻译)';
 
 INSERT INTO cms_banner_i18n(banner_id, language, title, link, image, image_thumb) VALUES
     (1, 'zh', '枯在斯柯达欠妥', '/page/index/index', '/uploads/banners/banners.1680162484582.png', '/uploads/banners/banners.1680162484582.png'),
-    (2, 'en', 'aaaadfqwea', '/page/index/index', '/uploads/banners/banners.1680162484582.png', '/uploads/banners/banners.1680162484582.png')
+    (1, 'en', 'aaaadfqwea', '/page/index/index', '/uploads/banners/banners.1680162484582.png', '/uploads/banners/banners.1680162484582.png')
 ;

+ 3 - 0
db/sys_dictionary.sql

@@ -30,6 +30,9 @@ INSERT INTO sys_dictionary(category_value, key_value, key_translation, key_trans
     ('MenuType', 1, '菜单', 'Menu'),
     ('MenuType', 2, '按钮', 'Button'),
 
+    ('CmsBannerType', 1, '首页幻灯片', 'Home Banner'),
+    ('CmsBannerType', 2, '内页幻灯片', 'Page Banner'),
+
     -- -1:本地, 1:腾讯云, 2:阿里云, 3.抖音云
     ('UploadTarget', -1, '本地', 'Local'),
     ('UploadTarget', 1, '腾讯云', 'Tencent Cos'),

+ 0 - 3
pom.xml

@@ -452,8 +452,6 @@
                 </includes>
             </resource>
         </resources>
-        <!--<finalName>backendsys</finalName>-->
-
 
         <plugins>
 
@@ -473,7 +471,6 @@
                 </configuration>
             </plugin>
 
-
             <!-- 如果不分包,则此处必填 -->
 <!--            <plugin>-->
 <!--                <groupId>org.springframework.boot</groupId>-->

+ 65 - 65
src/main/java/com/backendsys/controller/Cms/CmsBannerController.java

@@ -1,65 +1,65 @@
-package com.backendsys.controller.Cms;
-
-import com.backendsys.aspect.QueryNullCheck;
-import com.backendsys.aspect.QueryNullCheckAspect;
-import com.backendsys.entity.Cms.CmsBannerDTO;
-import com.backendsys.entity.PageDTO;
-import com.backendsys.service.Cms.CmsBannerService;
-import com.backendsys.utils.response.Result;
-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.*;
-
-/**
- * 幻灯片
- */
-@RestController
-public class CmsBannerController {
-
-    @Autowired
-    private CmsBannerService cmsBannerService;
-
-    @PreAuthorize("@sr.hasPermission('10.1')")
-    @GetMapping("/api/cms/banner/getBanner")
-    public Result getBanner(@Validated PageDTO pageDTO, @Validated CmsBannerDTO cmsBannerDTO) {
-        return Result.success(cmsBannerService.queryBanner(pageDTO.getPage_num(), pageDTO.getPage_size(), cmsBannerDTO));
-    }
-
-    @PreAuthorize("@sr.hasPermission('10.1.1')")
-    @QueryNullCheck(serviceClass = CmsBannerService.class, serviceMethod = "queryBannerDetail", argField = "banner_id", message = "幻灯片不存在")
-    @GetMapping("/api/cms/banner/getBannerDetail")
-    public Result getBannerDetail(@Validated(CmsBannerDTO.Detail.class) CmsBannerDTO cmsBannerDTO) {
-        return Result.success(QueryNullCheckAspect.getQueryResult());
-    }
-
-    @PreAuthorize("@sr.hasPermission('10.1.2')")
-    @PostMapping("/api/cms/banner/createBanner")
-    public Result createBanner(@Validated(CmsBannerDTO.Create.class) @RequestBody CmsBannerDTO cmsBannerDTO) {
-        return Result.success(cmsBannerService.insertBanner(cmsBannerDTO), "创建成功");
-    }
-
-    @PreAuthorize("@sr.hasPermission('10.1.3')")
-    @QueryNullCheck(serviceClass = CmsBannerService.class, serviceMethod = "queryBannerDetail", argField = "banner_id", message = "幻灯片不存在")
-    @PutMapping("/api/cms/banner/updateBanner")
-    public Result updateBanner(@Validated(CmsBannerDTO.Update.class) @RequestBody CmsBannerDTO cmsBannerDTO) {
-        return Result.success(cmsBannerService.updateBanner(cmsBannerDTO), "更新成功");
-    }
-
-    @PreAuthorize("@sr.hasPermission('10.1.4')")
-    @QueryNullCheck(serviceClass = CmsBannerService.class, serviceMethod = "queryBannerDetail", argField = "banner_id", message = "幻灯片不存在")
-    @DeleteMapping("/api/cms/banner/deleteBanner")
-    public Result deleteBanner(@Validated(CmsBannerDTO.Delete.class) @RequestBody CmsBannerDTO cmsBannerDTO) {
-        return Result.success(cmsBannerService.deleteBanner(cmsBannerDTO), "删除成功");
-    }
-
-    /**
-     * 幻灯片列表 (公共)
-     */
-    @GetMapping("/api/public/cms/banner/getBanner")
-    public Result getPublicBanner(@Validated PageDTO pageDTO, @Validated CmsBannerDTO cmsBannerDTO) {
-        cmsBannerDTO.setStatus(1); // 已启用
-        return Result.success(cmsBannerService.queryBanner(pageDTO.getPage_num(), pageDTO.getPage_size(), cmsBannerDTO));
-    }
-
-}
+//package com.backendsys.controller.Cms;
+//
+//import com.backendsys.aspect.QueryNullCheck;
+//import com.backendsys.aspect.QueryNullCheckAspect;
+//import com.backendsys.entity.Cms.CmsBannerDTO;
+//import com.backendsys.entity.PageDTO;
+//import com.backendsys.service.Cms.CmsBannerService;
+//import com.backendsys.utils.response.Result;
+//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.*;
+//
+///**
+// * 幻灯片
+// */
+//@RestController
+//public class CmsBannerController {
+//
+//    @Autowired
+//    private CmsBannerService cmsBannerService;
+//
+//    @PreAuthorize("@sr.hasPermission('10.1')")
+//    @GetMapping("/api/cms/banner/getBanner")
+//    public Result getBanner(@Validated PageDTO pageDTO, @Validated CmsBannerDTO cmsBannerDTO) {
+//        return Result.success(cmsBannerService.queryBanner(pageDTO.getPage_num(), pageDTO.getPage_size(), cmsBannerDTO));
+//    }
+//
+//    @PreAuthorize("@sr.hasPermission('10.1.1')")
+//    @QueryNullCheck(serviceClass = CmsBannerService.class, serviceMethod = "queryBannerDetail", argField = "banner_id", message = "幻灯片不存在")
+//    @GetMapping("/api/cms/banner/getBannerDetail")
+//    public Result getBannerDetail(@Validated(CmsBannerDTO.Detail.class) CmsBannerDTO cmsBannerDTO) {
+//        return Result.success(QueryNullCheckAspect.getQueryResult());
+//    }
+//
+//    @PreAuthorize("@sr.hasPermission('10.1.2')")
+//    @PostMapping("/api/cms/banner/createBanner")
+//    public Result createBanner(@Validated(CmsBannerDTO.Create.class) @RequestBody CmsBannerDTO cmsBannerDTO) {
+//        return Result.success(cmsBannerService.insertBanner(cmsBannerDTO), "创建成功");
+//    }
+//
+//    @PreAuthorize("@sr.hasPermission('10.1.3')")
+//    @QueryNullCheck(serviceClass = CmsBannerService.class, serviceMethod = "queryBannerDetail", argField = "banner_id", message = "幻灯片不存在")
+//    @PutMapping("/api/cms/banner/updateBanner")
+//    public Result updateBanner(@Validated(CmsBannerDTO.Update.class) @RequestBody CmsBannerDTO cmsBannerDTO) {
+//        return Result.success(cmsBannerService.updateBanner(cmsBannerDTO), "更新成功");
+//    }
+//
+//    @PreAuthorize("@sr.hasPermission('10.1.4')")
+//    @QueryNullCheck(serviceClass = CmsBannerService.class, serviceMethod = "queryBannerDetail", argField = "banner_id", message = "幻灯片不存在")
+//    @DeleteMapping("/api/cms/banner/deleteBanner")
+//    public Result deleteBanner(@Validated(CmsBannerDTO.Delete.class) @RequestBody CmsBannerDTO cmsBannerDTO) {
+//        return Result.success(cmsBannerService.deleteBanner(cmsBannerDTO), "删除成功");
+//    }
+//
+//    /**
+//     * 幻灯片列表 (公共)
+//     */
+//    @GetMapping("/api/public/cms/banner/getBanner")
+//    public Result getPublicBanner(@Validated PageDTO pageDTO, @Validated CmsBannerDTO cmsBannerDTO) {
+//        cmsBannerDTO.setStatus(1); // 已启用
+//        return Result.success(cmsBannerService.queryBanner(pageDTO.getPage_num(), pageDTO.getPage_size(), cmsBannerDTO));
+//    }
+//
+//}

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

@@ -104,8 +104,8 @@ public class ArticleCategoryServiceImpl implements ArticleCategoryService {
 
         Long article_category_id = articleCategory.getArticle_category_id();
 
-        ArticleCategory articleDetail = articleCategoryDao.selectById(article_category_id);
-        if (articleDetail == null) throw new CustException("资讯分类不存在");
+        ArticleCategory detail = articleCategoryDao.selectById(article_category_id);
+        if (detail == null) throw new CustException("资讯分类不存在");
 
         articleCategoryDao.deleteById(article_category_id);
         articleCategoryI18nDao.delete(new QueryWrapper<ArticleCategoryI18n>().eq("article_category_id", article_category_id));

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

@@ -67,9 +67,8 @@ public class ArticleServiceImpl implements ArticleService {
         article.setUser_id(httpRequestUtil.getUserId());
         articleDao.insert(article);
 
-        Long article_id = article.getId();
-
         // 批量插入 (翻译字段)
+        Long article_id = article.getId();
         List<ArticleI18n> translations = article.getTranslations().stream()
             .peek(item -> { ValidationUtil.validateObject(item, ArticleI18n.Create.class); })
             .map(item -> { item.setArticle_id(article_id); return item; })

+ 68 - 0
src/main/java/com/backendsys/modules/cms/banner/controller/BannerController.java

@@ -0,0 +1,68 @@
+package com.backendsys.modules.cms.banner.controller;
+
+import com.backendsys.modules.cms.banner.entity.Banner;
+import com.backendsys.modules.cms.banner.service.BannerService;
+import com.backendsys.modules.common.aspect.SysLog;
+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.*;
+
+@Validated
+@RestController
+@Tag(name = "幻灯片管理")
+public class BannerController {
+
+    @Autowired
+    private BannerService bannerService;
+
+    @Operation(summary = "获取幻灯片列表")
+    @PreAuthorize("@sr.hasPermission('10.1')")
+    @GetMapping("/api/cms/banner/getBanner")
+    public Result getBanner(@Validated Banner banner) {
+        return Result.success().put("data", bannerService.selectBannerList(banner));
+    }
+
+    @Operation(summary = "获取幻灯片详情")
+    @PreAuthorize("@sr.hasPermission('10.1.1')")
+    @GetMapping("/api/cms/banner/getBannerDetail")
+    public Result getBannerDetail(@Validated(Banner.Detail.class) Banner banner) {
+        return Result.success().put("data", bannerService.selectBannerDetail(banner));
+    }
+
+    @SysLog("创建幻灯片")
+    @Operation(summary = "创建幻灯片")
+    @PreAuthorize("@sr.hasPermission('10.1.2')")
+    @PostMapping("/api/cms/banner/createBanner")
+    public Result createBanner(@Validated(Banner.Create.class) @RequestBody Banner banner) {
+        return Result.success().put("data", bannerService.insertBanner(banner));
+    }
+
+    @SysLog("编辑资讯")
+    @Operation(summary = "编辑资讯")
+    @PreAuthorize("@sr.hasPermission('10.1.3')")
+    @PutMapping("/api/cms/banner/updateBanner")
+    public Result updateBanner(@Validated(Banner.Update.class) @RequestBody Banner banner) {
+        return Result.success().put("data", bannerService.updateBanner(banner));
+    }
+
+    @SysLog("删除资讯")
+    @Operation(summary = "删除资讯")
+    @PreAuthorize("@sr.hasPermission('10.1.4')")
+    @DeleteMapping("/api/cms/banner/deleteBanner")
+    public Result deleteBanner(@Validated(Banner.Delete.class) @RequestBody Banner banner) {
+        return Result.success().put("data", bannerService.deleteBanner(banner));
+    }
+
+    /*
+    @GetMapping("/api/public/cms/banner/getBanner")
+    public Result getPublicBanner(@Validated PageDTO pageDTO, @Validated CmsBannerDTO cmsBannerDTO) {
+        cmsBannerDTO.setStatus(1); // 已启用
+        return Result.success(cmsBannerService.queryBanner(pageDTO.getPage_num(), pageDTO.getPage_size(), cmsBannerDTO));
+    }
+     */
+
+}

+ 16 - 0
src/main/java/com/backendsys/modules/cms/banner/dao/BannerDao.java

@@ -0,0 +1,16 @@
+package com.backendsys.modules.cms.banner.dao;
+
+import com.backendsys.modules.cms.banner.entity.Banner;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface BannerDao extends BaseMapper<Banner> {
+
+    List<Banner> selectBannerList(Banner banner);
+    Map<String, Object> selectBannerDetail(Banner banner);
+
+}

+ 13 - 0
src/main/java/com/backendsys/modules/cms/banner/dao/BannerI18nDao.java

@@ -0,0 +1,13 @@
+package com.backendsys.modules.cms.banner.dao;
+
+import com.backendsys.modules.cms.banner.entity.BannerI18n;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface BannerI18nDao extends BaseMapper<BannerI18n> {
+    int insertBatch(List<BannerI18n> translations);
+    int updateBatch(List<BannerI18n> translations);
+}

+ 20 - 0
src/main/java/com/backendsys/modules/cms/banner/entity/Banner.java

@@ -5,10 +5,13 @@ 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 lombok.Data;
 import org.hibernate.validator.constraints.Range;
 
+import java.util.List;
+
 @Data
 @TableName("cms_banner")
 public class Banner {
@@ -21,14 +24,31 @@ public class Banner {
     private String lang;
     @TableId(type = IdType.AUTO)
     private Long id;
+
+    @TableField("id")
     @NotNull(message="banner_id 不能为空", groups = { Detail.class, Update.class, Delete.class })
     private Long banner_id;
+
+    @TableField(exist = false)
+    private String title;
+    @TableField(exist = false)
+    private String link;
+    @TableField(exist = false)
+    private String image;
+    @TableField(exist = false)
+    private String image_thumb;
+
     @RangeArray(message="幻灯片类型取值有误,范围应是(1首页幻灯片, 2内页幻灯片)", value = {"1", "2"}, groups = { Create.class })
     private Integer type;
     @Range(min = 1, max = 9999, message = "排序必须在 {min} 到 {max} 之间", groups = { Create.class, Update.class})
     private Integer sort;
     @RangeArray(message="幻灯片状态取值有误,范围应是(-1禁用, 1启用)", value = {"-1", "1"}, groups = { Create.class, Update.class})
     private Integer status;
+
+    @TableField(exist = false)
+    @NotEmpty(message="内容不能为空", groups = { Create.class, Update.class})
+    private List<BannerI18n> translations;
+
     private String create_time;
     private String update_time;
 

+ 3 - 3
src/main/java/com/backendsys/modules/cms/banner/entity/BannerI18n.java

@@ -29,12 +29,12 @@ public class BannerI18n {
     @Size(max = 20, message = "资讯标题长度不超过 {max} 字符", groups = { Create.class, Update.class })
     @NotNull(message="幻灯片标题不能为空", groups = { Create.class, Update.class })
     private String title;
-    @Size(max = 500, message = "链接路径长度不超过 {max} 字符", groups = { Create.class, Update.class})
+    @Size(max = 1000, message = "链接路径长度不超过 {max} 字符", groups = { Create.class, Update.class})
     private String link;
-    @Size(max = 500, message = "图片路径长度不超过 {max} 字符", groups = { Create.class, Update.class})
+    @Size(max = 1000, message = "图片路径长度不超过 {max} 字符", groups = { Create.class, Update.class})
     @NotNull(message="图片路径不能为空", groups = { Create.class, Update.class })
     private String image;
-    @Size(max = 500, message = "图片(缩略图)路径长度不超过 {max} 字符", groups = { Create.class, Update.class})
+    @Size(max = 1000, message = "图片(缩略图)路径长度不超过 {max} 字符", groups = { Create.class, Update.class})
     @NotNull(message="图片(缩略图)路径不能为空", groups = { Create.class, Update.class })
     private String image_thumb;
 

+ 20 - 0
src/main/java/com/backendsys/modules/cms/banner/service/BannerService.java

@@ -0,0 +1,20 @@
+package com.backendsys.modules.cms.banner.service;
+
+import com.backendsys.modules.cms.banner.entity.Banner;
+import com.backendsys.utils.response.PageEntity;
+
+import java.util.Map;
+
+public interface BannerService {
+
+    // 获取幻灯片列表
+    PageEntity selectBannerList(Banner banner);
+    // 获取幻灯片详情
+    Map<String, Object> selectBannerDetail(Banner banner);
+    // 创建幻灯片
+    Map<String, Object> insertBanner(Banner banner);
+    // 编辑幻灯片
+    Map<String, Object> updateBanner(Banner banner);
+    // 删除幻灯片
+    Map<String, Object> deleteBanner(Banner banner);
+}

+ 120 - 0
src/main/java/com/backendsys/modules/cms/banner/service/impl/BannerServiceImpl.java

@@ -0,0 +1,120 @@
+package com.backendsys.modules.cms.banner.service.impl;
+
+import com.backendsys.exception.CustException;
+import com.backendsys.modules.cms.article.entity.Article;
+import com.backendsys.modules.cms.banner.dao.BannerDao;
+import com.backendsys.modules.cms.banner.dao.BannerI18nDao;
+import com.backendsys.modules.cms.banner.entity.Banner;
+import com.backendsys.modules.cms.banner.entity.BannerI18n;
+import com.backendsys.modules.cms.banner.service.BannerService;
+import com.backendsys.modules.common.utils.ValidationUtil;
+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.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.stream.Collectors;
+
+@Service
+public class BannerServiceImpl implements BannerService {
+
+    @Autowired
+    private BannerDao bannerDao;
+    @Autowired
+    private BannerI18nDao bannerI18nDao;
+
+    /**
+     * 获取幻灯片列表
+     */
+    @Override
+    public PageEntity selectBannerList(Banner banner) {
+        PageUtils.startPage();  // 分页
+        List<Banner> list = bannerDao.selectBannerList(banner);
+        return new PageInfoResult(list).toEntity();
+    }
+
+    /**
+     * 获取幻灯片详情
+     */
+    @Override
+    public Map<String, Object> selectBannerDetail(Banner banner) {
+        return bannerDao.selectBannerDetail(banner);
+    }
+
+
+    /**
+     * 创建幻灯片
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> insertBanner(Banner banner) {
+
+        // 插入
+        bannerDao.insert(banner);
+
+        // 批量插入 (翻译字段)
+        Long banner_id = banner.getId();
+        List<BannerI18n> translations = banner.getTranslations().stream()
+            .peek(item -> { ValidationUtil.validateObject(item, BannerI18n.Create.class); })
+            .map(item -> { item.setBanner_id(banner_id); return item; })
+            .collect(Collectors.toList());
+        bannerI18nDao.insertBatch(translations);
+
+        return Map.of("banner_id", banner_id);
+    }
+
+    /**
+     * 编辑幻灯片
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> updateBanner(Banner banner) {
+
+        System.out.println(banner);
+
+        Long banner_id = banner.getBanner_id();
+
+        Banner detail = bannerDao.selectById(banner_id);
+        if (detail == null) throw new CustException("幻灯片不存在");
+
+        // 更新
+        banner.setId(banner_id);
+        bannerDao.updateById(banner);
+
+        // 批量更新 (翻译字段)
+        List<BannerI18n> translations = banner.getTranslations().stream()
+            .peek(item -> { ValidationUtil.validateObject(item, BannerI18n.Create.class); })
+            .map(item -> { item.setBanner_id(banner_id); return item; })
+            .collect(Collectors.toList());
+
+        System.out.println(translations);
+
+        bannerI18nDao.updateBatch(translations);
+
+        return Map.of("banner_id", banner_id);
+    }
+
+    /**
+     * 删除幻灯片
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> deleteBanner(Banner banner) {
+
+        Long banner_id = banner.getBanner_id();
+
+        Banner detail = bannerDao.selectById(banner_id);
+        if (detail == null) throw new CustException("幻灯片不存在");
+
+        bannerDao.deleteById(banner_id);
+        bannerI18nDao.delete(new QueryWrapper<BannerI18n>().eq("banner_id", banner_id));
+
+        return Map.of("banner_id", banner_id);
+    }
+
+}

+ 2 - 2
src/main/java/com/backendsys/modules/cms/siteinfo/controller/SiteInfoController.java

@@ -23,14 +23,14 @@ public class SiteInfoController {
 
     @Operation(summary = "获取站点信息")
     @PreAuthorize("@sr.hasPermission('13')")
-    @GetMapping("/api/v2/cms/site/getSiteInfo")
+    @GetMapping("/api/cms/site/getSiteInfo")
     public Result getSiteInfo() {
         return Result.success().put("data", siteInfoService.selectSiteInfo());
     }
 
     @Operation(summary = "编辑站点信息")
     @PreAuthorize("@sr.hasPermission('13.1')")
-    @PutMapping("/api/v2/cms/site/updateSiteInfo")
+    @PutMapping("/api/cms/site/updateSiteInfo")
     public Result updateSiteInfo(@Validated(SiteInfo.Update.class) @RequestBody SiteInfo siteInfo) {
         siteInfo.setId(1L);
         return Result.success().put("data", siteInfoService.updateSiteInfo(siteInfo));

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

@@ -127,7 +127,7 @@
 
     <!-- 查 详情 -->
     <select id="selectArticleDetail" resultMap="resultMapArticleDetail">
-         SELECT <include refid="includeArticleDetail" />
+        SELECT <include refid="includeArticleDetail" />
         FROM cms_article a
         <include refid="leftJoinCategory" />
         <include refid="leftJoinUser" />

+ 118 - 0
src/main/resources/mapper/cms/banner/BannerDao.xml

@@ -0,0 +1,118 @@
+<?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.banner.dao.BannerDao">
+
+    <sql id="includeBanner">
+        b.id id,
+        b.id banner_id,
+        b.type,
+        bt.title title,
+        COALESCE(bt.link, '') link,
+        bt.image image,
+        bt.image_thumb image_thumb,
+        b.sort,
+        b.status,
+        b.create_time,
+        b.update_time
+    </sql>
+    <sql id="includeBannerDetail">
+        b.id id,
+        b.id banner_id,
+        b.type,
+        b.sort,
+        b.status,
+        b.create_time,
+        b.update_time
+    </sql>
+    <sql id="includeBannerTranslation">
+        id,
+        banner_id,
+        language,
+        title,
+        COALESCE(link, '') link,
+        image,
+        image_thumb
+    </sql>
+
+    <sql id="leftJoinTranslations">
+        LEFT JOIN cms_banner_i18n bt ON b.id = bt.banner_id
+    </sql>
+
+    <resultMap id="resultMapBanner" type="java.util.LinkedHashMap">
+        <id property="id" column="id" jdbcType="BIGINT" />
+        <result property="banner_id" column="banner_id" javaType="java.lang.Long" />
+        <result property="type" column="type" javaType="java.lang.Integer" />
+        <result property="title" column="title" />
+        <result property="link" column="link" />
+        <result property="image" column="image" />
+        <result property="image_thumb" column="image_thumb" />
+        <result property="sort" column="sort" javaType="java.lang.Integer" />
+        <result property="status" column="status" javaType="java.lang.Integer" />
+        <result property="create_time" column="create_time" />
+        <result property="update_time" column="update_time" />
+    </resultMap>
+
+    <resultMap id="resultMapBannerDetail" type="java.util.LinkedHashMap">
+        <id property="id" column="id" jdbcType="BIGINT" />
+        <result property="banner_id" column="banner_id" javaType="java.lang.Long" />
+        <result property="title" column="title" />
+        <result property="link" column="link" />
+        <result property="image" column="image" />
+        <result property="image_thumb" column="image_thumb" />
+        <result property="type" column="type" javaType="java.lang.Integer" />
+        <result property="sort" column="sort" javaType="java.lang.Integer" />
+        <result property="status" column="status" 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">
+            <result property="title" column="title" />
+            <result property="link" column="link" />
+            <result property="image" column="image" />
+            <result property="image_thumb" column="image_thumb" />
+        </collection>
+    </resultMap>
+
+
+    <!-- 查 列表 -->
+    <select id="selectBannerList" resultMap="resultMapBanner">
+        SELECT <include refid="includeBanner" />
+        FROM cms_banner b
+        <include refid="leftJoinTranslations" />
+        <where>
+            bt.language = #{lang}
+            <if test="title != null and title != ''">
+                AND bt.title LIKE CONCAT('%', #{title}, '%')
+            </if>
+        </where>
+    </select>
+
+    <!-- 查 详情 -->
+    <select id="selectBannerDetail" resultMap="resultMapBannerDetail">
+        SELECT <include refid="includeBannerDetail" />
+        FROM cms_banner b
+        <where>
+            <if test="banner_id != null and banner_id != ''">
+                AND b.id = #{banner_id}
+            </if>
+        </where>
+    </select>
+
+    <!-- 查 翻译详情 (子查询) -->
+    <select id="queryTranslationsById" resultType="java.util.LinkedHashMap">
+        SELECT <include refid="includeBannerTranslation" />
+        FROM cms_banner_i18n
+        WHERE banner_id = #{id}
+    </select>
+
+    <!-- 查 详情 (公共) (带翻译 Object) (关联查询) -->
+    <!--    <select id="queryBannerDetailPublic" resultMap="resultMapBanner">-->
+    <!--        SELECT <include refid="includeBanner" />, content-->
+    <!--        FROM cms_banner a-->
+    <!--        <include refid="leftJoinCategory" />-->
+    <!--        <include refid="leftJoinUser" />-->
+    <!--        <include refid="leftJoinTranslations" />-->
+    <!--        WHERE a.uid = #{uid} AND bt.language = #{lang}-->
+    <!--    </select>-->
+
+</mapper>

+ 40 - 0
src/main/resources/mapper/cms/banner/BannerI18nDao.xml

@@ -0,0 +1,40 @@
+<?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.banner.dao.BannerI18nDao">
+
+    <!-- 批量插入 -->
+    <insert id="insertBatch" parameterType="java.util.List">
+        INSERT INTO cms_banner_i18n (
+            banner_id, language, title, link, image, image_thumb
+        )
+        VALUES
+        <foreach collection="translations" item="item" separator=",">
+        (
+            #{item.banner_id}, #{item.language}, #{item.title}, #{item.link}, #{item.image}, #{item.image_thumb}
+        )
+        </foreach>
+    </insert>
+
+    <!-- 批量更新 -->
+    <update id="updateBatch" parameterType="com.backendsys.modules.cms.banner.entity.BannerI18n">
+        <foreach collection="translations" item="item" separator=";">
+            UPDATE cms_banner_i18n
+            <set>
+                <trim suffixOverrides="," suffix=" ">
+                    title = #{item.title},
+                    <if test="item.link != null and item.link != ''">
+                        link = #{item.link},
+                    </if>
+                    <if test="item.image != null and item.image != ''">
+                        image = #{item.image},
+                    </if>
+                    <if test="item.image_thumb != null and item.image_thumb != ''">
+                        image_thumb = #{item.image_thumb},
+                    </if>
+                </trim>
+            </set>
+            WHERE banner_id = #{item.banner_id} AND language = #{item.language}
+        </foreach>
+    </update>
+
+</mapper>