tsurumure преди 1 месец
родител
ревизия
a670515fa1

+ 22 - 22
db/b2c_good_i18n.sql

@@ -21,26 +21,26 @@ CREATE TABLE `b2c_good_i18n` (
 INSERT INTO b2c_good_i18n(good_id, language, good_name, good_description, good_content) VALUES
     (1, 'zh', '测试商品-1', '测试商品描述描述-1', '测试商品详情内容内容内容内容-1'),
     (1, 'en', 'Debug Good-1', 'Debug Good description-1', 'Debug Good content-1'),
-    (1, 'zh', '测试商品-2', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-2', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-3', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-3', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-4', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-4', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-5', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-5', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-6', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-6', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-7', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-7', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-8', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-8', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-9', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-9', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-10', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-10', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-11', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-11', 'Debug Good description', 'Debug Good content'),
-    (1, 'zh', '测试商品-12', '测试商品描述描述', '测试商品详情内容内容内容内容'),
-    (1, 'en', 'Debug Good-12', 'Debug Good description', 'Debug Good content')
+    (2, 'zh', '测试商品-2', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (2, 'en', 'Debug Good-2', 'Debug Good description', 'Debug Good content'),
+    (3, 'zh', '测试商品-3', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (3, 'en', 'Debug Good-3', 'Debug Good description', 'Debug Good content'),
+    (4, 'zh', '测试商品-4', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (4, 'en', 'Debug Good-4', 'Debug Good description', 'Debug Good content'),
+    (5, 'zh', '测试商品-5', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (5, 'en', 'Debug Good-5', 'Debug Good description', 'Debug Good content'),
+    (6, 'zh', '测试商品-6', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (6, 'en', 'Debug Good-6', 'Debug Good description', 'Debug Good content'),
+    (7, 'zh', '测试商品-7', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (7, 'en', 'Debug Good-7', 'Debug Good description', 'Debug Good content'),
+    (8, 'zh', '测试商品-8', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (8, 'en', 'Debug Good-8', 'Debug Good description', 'Debug Good content'),
+    (9, 'zh', '测试商品-9', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (9, 'en', 'Debug Good-9', 'Debug Good description', 'Debug Good content'),
+    (10, 'zh', '测试商品-10', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (10, 'en', 'Debug Good-10', 'Debug Good description', 'Debug Good content'),
+    (11, 'zh', '测试商品-11', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (11, 'en', 'Debug Good-11', 'Debug Good description', 'Debug Good content'),
+    (12, 'zh', '测试商品-12', '测试商品描述描述', '测试商品详情内容内容内容内容'),
+    (12, 'en', 'Debug Good-12', 'Debug Good description', 'Debug Good content')
 ;

+ 28 - 2
src/main/java/com/backendsys/modules/b2c/good/controller/GoodController.java

@@ -8,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
@@ -26,4 +25,31 @@ public class GoodController {
         return Result.success().put("data", goodService.selectGoodList(good));
     }
 
+    @Operation(summary = "获取商品详情")
+    @PreAuthorize("@sr.hasPermission('11.1.1')")
+    @GetMapping("/api/b2c/good/getGoodDetail")
+    public Result getGoodDetail(@Validated(Good.Detail.class) Good good) {
+        return Result.success().put("data", goodService.selectGoodDetail(good));
+    }
+
+    @Operation(summary = "创建商品")
+    @PreAuthorize("@sr.hasPermission('11.1.2')")
+    @PostMapping("/api/b2c/good/createGood")
+    public Result createGood(@Validated(Good.Create.class) @RequestBody Good good) {
+        return Result.success().put("data", goodService.insertGood(good));
+    }
+
+    @Operation(summary = "编辑商品")
+    @PreAuthorize("@sr.hasPermission('11.1.3')")
+    @PutMapping("/api/b2c/good/updateGood")
+    public Result updateGood(@Validated(Good.Update.class) @RequestBody Good good) {
+        return Result.success();
+    }
+
+    @Operation(summary = "删除商品")
+    @PreAuthorize("@sr.hasPermission('11.1.4')")
+    @DeleteMapping("/api/b2c/good/deleteGood")
+    public Result deleteGood(@Validated(Good.Delete.class) @RequestBody Good good) {
+        return Result.success();
+    }
 }

+ 2 - 0
src/main/java/com/backendsys/modules/b2c/good/dao/GoodDao.java

@@ -12,5 +12,7 @@ public interface GoodDao extends BaseMapper<Good> {
 
     // 获取商品列表
     List<Map<String, Object>> selectGoodList(Good good);
+    // 获取商品详情
+    Map<String, Object> selectGoodDetail(Good good);
 
 }

+ 15 - 0
src/main/java/com/backendsys/modules/b2c/good/dao/GoodI18nDao.java

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

+ 5 - 1
src/main/java/com/backendsys/modules/b2c/good/entity/Good.java

@@ -3,7 +3,6 @@ package com.backendsys.modules.b2c.good.entity;
 import com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeAdapter;
 import com.backendsys.entity.B2c.B2cGoodDTO;
 import com.backendsys.entity.validator.RangeArray;
-import com.backendsys.modules.cms.article.entity.Article;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -16,6 +15,7 @@ import jakarta.validation.constraints.Size;
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Data
 @TableName("b2c_good")
@@ -71,6 +71,10 @@ public class Good {
     @Size(max = 200, message = "关键词描述长度不超过 {max} 字符", groups = { B2cGoodDTO.Create.class, B2cGoodDTO.Update.class })
     private String meta_description;
 
+    @TableField(exist = false)
+    @NotEmpty(message="内容不能为空", groups = { Create.class, Update.class})
+    private List<GoodI18n> translations;
+
     @RangeArray(message="商品状态取值有误,范围应是(-1禁用, 1启用)", value = {"-1", "1"}, groups = { B2cGoodDTO.Create.class, B2cGoodDTO.Update.class })
     private Integer status;
 

+ 39 - 0
src/main/java/com/backendsys/modules/b2c/good/entity/GoodI18n.java

@@ -0,0 +1,39 @@
+package com.backendsys.modules.b2c.good.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+@Data
+@TableName("b2c_good_i18n")
+public class GoodI18n {
+
+    public static interface Detail{}
+    public static interface Create{}
+    public static interface Update{}
+    public static interface Delete{}
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long good_id;
+    @NotEmpty(message="语言不能为空", groups = { Create.class, Update.class })
+    private String language;
+
+    @Size(max = 100, message = "商品名称长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    @NotEmpty(message="商品名称不能为空", groups = { Create.class, Update.class })
+    private String good_name;
+    @Size(max = 200, message = "资讯描述长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    private String good_description;
+    @Size(max = 10000, message = "资讯内容长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    @NotEmpty(message="资讯内容不能为空")
+    private String good_content;
+    @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;
+
+}

+ 6 - 1
src/main/java/com/backendsys/modules/b2c/good/service/GoodService.java

@@ -3,9 +3,14 @@ package com.backendsys.modules.b2c.good.service;
 import com.backendsys.modules.b2c.good.entity.Good;
 import com.backendsys.utils.response.PageEntity;
 
+import java.util.Map;
+
 public interface GoodService {
 
     // 获取商品列表
     PageEntity selectGoodList(Good good);
-
+    // 获取商品详情
+    Map<String, Object> selectGoodDetail(Good good);
+    // 创建商品
+    Map<String, Object> insertGood(Good good);
 }

+ 43 - 0
src/main/java/com/backendsys/modules/b2c/good/service/impl/GoodServiceImpl.java

@@ -1,22 +1,33 @@
 package com.backendsys.modules.b2c.good.service.impl;
 
+import cn.hutool.core.util.IdUtil;
+import com.backendsys.exception.CustException;
 import com.backendsys.modules.b2c.good.dao.GoodDao;
+import com.backendsys.modules.b2c.good.dao.GoodI18nDao;
 import com.backendsys.modules.b2c.good.entity.Good;
+import com.backendsys.modules.b2c.good.entity.GoodI18n;
 import com.backendsys.modules.b2c.good.service.GoodService;
+import com.backendsys.modules.cms.article.entity.Article;
+import com.backendsys.modules.cms.article.entity.ArticleI18n;
+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 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 GoodServiceImpl implements GoodService {
 
     @Autowired
     private GoodDao goodDao;
+    @Autowired
+    private GoodI18nDao goodI18nDao;
 
     /**
      * 获取商品列表
@@ -28,4 +39,36 @@ public class GoodServiceImpl implements GoodService {
         return new PageInfoResult(list).toEntity();
     }
 
+    /**
+     * 获取商品详情
+     */
+    @Override
+    public Map<String, Object> selectGoodDetail(Good good) {
+        Map<String, Object> detail = goodDao.selectGoodDetail(good);
+        if (detail == null) throw new CustException("商品不存在");
+        return detail;
+    }
+
+    /**
+     * 创建商品
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> insertGood(Good good) {
+
+        // 生成随机UUID
+        good.setUid(IdUtil.simpleUUID().substring(0, 10));
+        goodDao.insert(good);
+
+        // 批量插入 (翻译字段)
+        Long good_id = good.getId();
+        List<GoodI18n> translations = good.getTranslations().stream()
+                .peek(item -> { ValidationUtil.validateObject(item, GoodI18n.Create.class); })
+                .map(item -> { item.setGood_id(good_id); return item; })
+                .collect(Collectors.toList());
+        goodI18nDao.insertBatch(translations);
+
+        return Map.of("good_id", good_id);
+    }
+
 }

+ 44 - 0
src/main/resources/mapper/b2c/good/GoodI18nDao.xml

@@ -0,0 +1,44 @@
+<?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.b2c.good.dao.GoodI18nDao">
+
+    <!-- 批量插入 -->
+    <insert id="insertBatch" parameterType="java.util.List">
+        INSERT INTO b2c_good_i18n (
+            good_id, language,
+            good_name, good_description, good_content, meta_keyword, meta_description
+        )
+        VALUES
+        <foreach collection="translations" item="item" separator=",">
+        (
+            #{item.good_id}, #{item.language},
+            #{item.good_name}, #{item.good_description}, #{item.good_content},
+            #{item.meta_keyword}, #{item.meta_description}
+        )
+        </foreach>
+    </insert>
+
+    <!-- 批量更新 -->
+    <update id="updateBatch" parameterType="com.backendsys.modules.b2c.good.entity.GoodI18n">
+        <foreach collection="translations" item="item" separator=";">
+            UPDATE b2c_good_i18n
+            <set>
+                <trim suffixOverrides="," suffix=" ">
+                    good_name = #{item.good_name},
+                    good_content = #{item.good_content},
+                    <if test="item.good_description != null and item.good_description != ''">
+                        good_description = #{item.good_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 good_id = #{item.good_id} AND language = #{item.language}
+        </foreach>
+    </update>
+
+</mapper>