Browse Source

feat: 更新业务逻辑

master
xc-yjs 8 months ago
parent
commit
20ba3dc1fb
  1. 5
      nla-common/pom.xml
  2. 33
      nla-common/src/main/java/cn/nla/common/config/RedisConfig.java
  3. 22
      nla-common/src/main/java/cn/nla/common/config/SwaggerConfiguration.java
  4. 2
      nla-common/src/main/java/cn/nla/common/config/WebConfig.java
  5. 4
      nla-common/src/main/java/cn/nla/common/constant/CacheKey.java
  6. 25
      nla-common/src/main/java/cn/nla/common/model/PageResult.java
  7. 8
      nla-common/src/test/java/tools/MyBatisPlusGenerator.java
  8. 10
      nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponController.java
  9. 31
      nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponRecordController.java
  10. 67
      nla-coupon-service/src/main/java/cn/nla/coupon/model/VO/CouponRecordVO.java
  11. 20
      nla-coupon-service/src/main/java/cn/nla/coupon/model/request/NewUserCouponRequest.java
  12. 8
      nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponRecordService.java
  13. 9
      nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponService.java
  14. 40
      nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponRecordServiceImpl.java
  15. 26
      nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponServiceImpl.java
  16. 28
      nla-product-service/pom.xml
  17. 15
      nla-product-service/src/main/java/cn/nla/product/ProductApplication.java
  18. 38
      nla-product-service/src/main/java/cn/nla/product/controller/BannerController.java
  19. 56
      nla-product-service/src/main/java/cn/nla/product/controller/CartController.java
  20. 49
      nla-product-service/src/main/java/cn/nla/product/controller/ProductController.java
  21. 16
      nla-product-service/src/main/java/cn/nla/product/mapper/BannerMapper.java
  22. 16
      nla-product-service/src/main/java/cn/nla/product/mapper/ProductMapper.java
  23. 42
      nla-product-service/src/main/java/cn/nla/product/model/VO/CartItemVO.java
  24. 72
      nla-product-service/src/main/java/cn/nla/product/model/VO/CartVO.java
  25. 37
      nla-product-service/src/main/java/cn/nla/product/model/VO/ProductVO.java
  26. 44
      nla-product-service/src/main/java/cn/nla/product/model/entity/BannerEntity.java
  27. 71
      nla-product-service/src/main/java/cn/nla/product/model/entity/ProductEntity.java
  28. 20
      nla-product-service/src/main/java/cn/nla/product/model/request/CartItemRequest.java
  29. 16
      nla-product-service/src/main/java/cn/nla/product/service/BannerService.java
  30. 32
      nla-product-service/src/main/java/cn/nla/product/service/CartService.java
  31. 33
      nla-product-service/src/main/java/cn/nla/product/service/ProductService.java
  32. 20
      nla-product-service/src/main/java/cn/nla/product/service/impl/BannerServiceImpl.java
  33. 163
      nla-product-service/src/main/java/cn/nla/product/service/impl/CartServiceImpl.java
  34. 56
      nla-product-service/src/main/java/cn/nla/product/service/impl/ProductServiceImpl.java
  35. 26
      nla-product-service/src/main/resources/application.yml
  36. 71
      nla-product-service/src/main/resources/logback.xml
  37. 18
      nla-product-service/src/main/resources/mapper/BannerMapper.xml
  38. 23
      nla-product-service/src/main/resources/mapper/ProductMapper.xml
  39. 1
      pom.xml

5
nla-common/pom.xml

@ -89,6 +89,11 @@
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
</dependencies>
</project>

33
nla-common/src/main/java/cn/nla/common/config/RedisConfig.java

@ -0,0 +1,33 @@
package cn.nla.common.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis配置解决乱码问题
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 使用StringRedisSerializer序列化键
template.setKeySerializer(new StringRedisSerializer());
// 使用GenericJackson2JsonRedisSerializer序列化值
ObjectMapper om = new ObjectMapper();
// 可以自定义ObjectMapper配置,确保满足你项目的需求
template.setValueSerializer(new GenericJackson2JsonRedisSerializer(om));
// 设置hash的键和值的序列化器
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer(om));
// 使序列化器生效
template.afterPropertiesSet();
return template;
}
}

22
nla-common/src/main/java/cn/nla/common/config/SwaggerConfiguration.java

@ -67,6 +67,28 @@ public class SwaggerConfiguration {
.globalResponses(HttpMethod.POST, getGlobalResponseMessage());
}
/**
* 对商品服务端的接口文档
*/
@Bean
public Docket productApiDoc() {
return new Docket(DocumentationType.OAS_30) // 版本3.0
.groupName("商品端接口文档")
.pathMapping("/")
//定义是否开启Swagger,false是关闭,可以通过变量去控制,线上关闭
.enable(true)
//配置文档的元信息
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("cn.nla"))
//正则匹配请求路径,并分配到当前项目组
.paths(PathSelectors.ant("/pdt/**"))
.build()
// 新版SwaggerUI3.0
.globalRequestParameters(globalRequestParameters())
.globalResponses(HttpMethod.GET, getGlobalResponseMessage())
.globalResponses(HttpMethod.POST, getGlobalResponseMessage());
}
/**
* 接口基本信息配置
*/

2
nla-common/src/main/java/cn/nla/common/config/WebConfig.java

@ -22,7 +22,7 @@ public class WebConfig implements WebMvcConfigurer {
registry.addInterceptor(responseResultInterceptor);
registry.addInterceptor(loginInterceptor)
//拦截的路径
.addPathPatterns("/user/*/**", "/address/*/**", "/cop/*/**")
.addPathPatterns("/user/*/**", "/address/*/**", "/cop/*/**", "/pdt/*/**")
//排查不拦截的路径
.excludePathPatterns(
"/user/**/send",

4
nla-common/src/main/java/cn/nla/common/constant/CacheKey.java

@ -5,4 +5,8 @@ public class CacheKey {
* 注册验证码第一个是类型第二个是接收号码
*/
public static final String CHECK_CODE_KEY = "code:%s:%s";
/**
* 购物车 hash 结果key是用户唯一标识
*/
public static final String CART_KEY = "cart:%s";
}

25
nla-common/src/main/java/cn/nla/common/model/PageResult.java

@ -0,0 +1,25 @@
package cn.nla.common.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* 分页响应对象
*/
@Data
@AllArgsConstructor
public class PageResult<T> {
@JsonProperty("total_record")
private Long totalRecord;
@JsonProperty("total_page")
private Long totalPage;
@JsonProperty("current_data")
private List<T> currentData;
}

8
nla-common/src/test/java/tools/MyBatisPlusGenerator.java

@ -22,7 +22,7 @@ public class MyBatisPlusGenerator {
// 作者
.setAuthor("YJs")
// ⽣成路径,最好使⽤绝对路径,window路径是不⼀样的
.setOutputDir("D:\\workspace\\2024\\nla-shop\\nla-coupon-service\\src\\main\\java")
.setOutputDir("D:\\workspace\\2024\\nla-shop\\nla-product-service\\src\\main\\java")
// ⽂件覆盖
.setFileOverride(true)
// 主键策略
@ -43,7 +43,7 @@ public class MyBatisPlusGenerator {
// 设置数据库类型
dsConfig.setDbType(DbType.MYSQL)
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUrl("jdbc:mysql://117.72.43.105:3306/p_nla_coupon?useSSL=false")
.setUrl("jdbc:mysql://117.72.43.105:3306/p_nla_product?useSSL=false")
.setUsername("root")
.setPassword("Yuan625621105.");
@ -58,11 +58,11 @@ public class MyBatisPlusGenerator {
//使⽤restcontroller注解
.setRestControllerStyle(true)
// ⽣成的表, ⽀持多表⼀起⽣成,以数组形式填写
.setInclude("coupon","coupon_record");
.setInclude("product","banner");
//4. 包名策略配置
PackageConfig pkConfig = new PackageConfig();
pkConfig.setParent("cn.nla.coupon")
pkConfig.setParent("cn.nla.product")
.setMapper("mapper")
.setService("service")
.setController("controller")

10
nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponController.java

@ -2,6 +2,7 @@ package cn.nla.coupon.controller;
import cn.nla.common.enums.CouponCategoryEnum;
import cn.nla.common.util.JsonData;
import cn.nla.coupon.model.request.NewUserCouponRequest;
import cn.nla.coupon.service.CouponService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -41,4 +42,13 @@ public class CouponController {
public JsonData addPromotionCoupon(@ApiParam(value = "优惠券id", required = true) @PathVariable("coupon_id") long couponId) {
return couponService.addCoupon(couponId, CouponCategoryEnum.PROMOTION);
}
/**
* 新用户注册发放优惠券接口
*/
@ApiOperation("RPC-新用户注册接口")
@PostMapping("/new_user_coupon")
public JsonData addNewUserCoupon( @ApiParam("用户对象") @RequestBody NewUserCouponRequest newUserCouponRequest ){
return couponService.initNewUserCoupon(newUserCouponRequest);
}
}

31
nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponRecordController.java

@ -1,9 +1,15 @@
package cn.nla.coupon.controller;
import cn.nla.common.enums.BizCodeEnum;
import cn.nla.common.util.JsonData;
import cn.nla.coupon.model.VO.CouponRecordVO;
import cn.nla.coupon.service.CouponRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* <p>
@ -13,9 +19,26 @@ import org.springframework.web.bind.annotation.RestController;
* @author YJs
* @since 2024-08-08
*/
@Api(tags = "优惠券领劵记录控制器")
@RestController
@RequestMapping("/couponRecordEntity")
@RequestMapping("/cop/couponRecord/v1")
public class CouponRecordController {
@Resource
private CouponRecordService couponRecordService;
@ApiOperation("分页查询个人优惠券")
@GetMapping("page")
public JsonData page(@ApiParam(value = "当前页") @RequestParam(value = "page", defaultValue = "1") int page,
@ApiParam(value = "每页显示多少条") @RequestParam(value = "size", defaultValue = "10") int size) {
return JsonData.buildSuccess(couponRecordService.page(page, size));
}
@ApiOperation("查询优惠券记录详情")
@GetMapping("detail/{record_id}")
public JsonData getCouponRecordDetail(@ApiParam(value = "记录id") @PathVariable("record_id") long recordId) {
CouponRecordVO couponRecordVO = couponRecordService.findById(recordId);
return couponRecordVO == null ? JsonData.buildResult(BizCodeEnum.COUPON_NO_EXITS) : JsonData.buildSuccess(couponRecordVO);
}
}

67
nla-coupon-service/src/main/java/cn/nla/coupon/model/VO/CouponRecordVO.java

@ -0,0 +1,67 @@
package cn.nla.coupon.model.VO;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 个人领劵信息
*/
@Data
public class CouponRecordVO {
private Long id;
/**
* 优惠券id
*/
@JsonProperty("coupon_id")
private Long couponId;
/**
* 使用状态 可用 NEW,已使用USED,过期 EXPIRED;
*/
@JsonProperty("use_state")
private String useState;
/**
* 用户id
*/
@JsonProperty("user_id")
private Long userId;
/**
* 用户昵称
*/
@JsonProperty("user_name")
private String userName;
/**
* 优惠券标题
*/
@JsonProperty("coupon_title")
private String couponTitle;
/**
* 开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", locale = "zh", timezone = "GMT+8")
@JsonProperty("start_time")
private Date startTime;
/**
* 结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", locale = "zh", timezone = "GMT+8")
@JsonProperty("end_time")
private Date endTime;
/**
* 订单id
*/
@JsonProperty("order_id")
private Long orderId;
/**
* 抵扣价格
*/
private BigDecimal price;
/**
* 满多少才可以使用
*/
@JsonProperty("condition_price")
private BigDecimal conditionPrice;
}

20
nla-coupon-service/src/main/java/cn/nla/coupon/model/request/NewUserCouponRequest.java

@ -0,0 +1,20 @@
package cn.nla.coupon.model.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 新用户注册发放优惠卷
*/
@ApiModel(value = "新用户注册发放优惠卷对象", description = "新用户注册发放优惠卷请求对象")
@Data
public class NewUserCouponRequest {
@ApiModelProperty(value = "用户Id", example = "19")
@JsonProperty("user_id")
private long userId;
@ApiModelProperty(value = "名称", example = "二当家")
@JsonProperty("name")
private String name;
}

8
nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponRecordService.java

@ -1,5 +1,7 @@
package cn.nla.coupon.service;
import cn.nla.common.model.PageResult;
import cn.nla.coupon.model.VO.CouponRecordVO;
import cn.nla.coupon.model.entity.CouponRecordEntity;
import com.baomidou.mybatisplus.extension.service.IService;
@ -13,4 +15,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface CouponRecordService extends IService<CouponRecordEntity> {
/**
* 分页查询个人优惠券
*/
PageResult<CouponRecordVO> page(int page, int size);
CouponRecordVO findById(long recordId);
}

9
nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponService.java

@ -3,6 +3,7 @@ package cn.nla.coupon.service;
import cn.nla.common.enums.CouponCategoryEnum;
import cn.nla.common.util.JsonData;
import cn.nla.coupon.model.entity.CouponEntity;
import cn.nla.coupon.model.request.NewUserCouponRequest;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Map;
@ -27,4 +28,12 @@ public interface CouponService extends IService<CouponEntity> {
* 4保存领劵记录
*/
JsonData addCoupon(Long couponId, CouponCategoryEnum category);
/**
* 用户微服务调用的时候没传递token
*
* 本地直接调用发放优惠券的方法需要构造一个登录用户存储在threadlocal
*
*/
JsonData initNewUserCoupon(NewUserCouponRequest newUserCouponRequest);
}

40
nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponRecordServiceImpl.java

@ -1,11 +1,21 @@
package cn.nla.coupon.service.impl;
import cn.nla.common.interceptor.LoginInterceptor;
import cn.nla.common.model.LoginUser;
import cn.nla.common.model.PageResult;
import cn.nla.coupon.model.VO.CouponRecordVO;
import cn.nla.coupon.model.entity.CouponRecordEntity;
import cn.nla.coupon.mapper.CouponRecordMapper;
import cn.nla.coupon.service.CouponRecordService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.stream.Collectors;
/**
* <p>
* 优惠券领劵记录 服务实现类
@ -17,4 +27,34 @@ import org.springframework.stereotype.Service;
@Service
public class CouponRecordServiceImpl extends ServiceImpl<CouponRecordMapper, CouponRecordEntity> implements CouponRecordService {
@Override
public PageResult<CouponRecordVO> page(int page, int size) {
LoginUser loginUser = LoginInterceptor.threadLocal.get();
//封装分页信息
Page<CouponRecordEntity> pageInfo = new Page<>(page, size);
IPage<CouponRecordEntity> recordPage = baseMapper.selectPage(pageInfo,
Wrappers.<CouponRecordEntity>lambdaQuery().eq(CouponRecordEntity::getUserId, loginUser.getId())
.orderByDesc(CouponRecordEntity::getCreateTime));
return new PageResult<>(recordPage.getTotal(), recordPage.getPages(),
recordPage.getRecords().stream().map(item -> {
CouponRecordVO result = new CouponRecordVO();
BeanUtils.copyProperties(item, result);
return result;
}).collect(Collectors.toList()));
}
@Override
public CouponRecordVO findById(long recordId) {
LoginUser loginUser = LoginInterceptor.threadLocal.get();
CouponRecordEntity couponRecord = baseMapper.selectOne(
Wrappers.<CouponRecordEntity>lambdaQuery().
eq(CouponRecordEntity::getUserId, loginUser.getId())
.eq(CouponRecordEntity::getId, recordId));
if (couponRecord == null) {
return null;
}
CouponRecordVO result = new CouponRecordVO();
BeanUtils.copyProperties(couponRecord, result);
return result;
}
}

26
nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponServiceImpl.java

@ -14,6 +14,7 @@ import cn.nla.coupon.model.VO.CouponVO;
import cn.nla.coupon.model.entity.CouponEntity;
import cn.nla.coupon.mapper.CouponMapper;
import cn.nla.coupon.model.entity.CouponRecordEntity;
import cn.nla.coupon.model.request.NewUserCouponRequest;
import cn.nla.coupon.service.CouponService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -32,10 +33,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.Duration;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@ -64,7 +62,7 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, CouponEntity> i
Page<CouponEntity> pageInfo = new Page<>(page, size);
IPage<CouponEntity> couponDOIPage = baseMapper.selectPage(pageInfo,
Wrappers.<CouponEntity>lambdaQuery().eq(CouponEntity::getPublish, CouponPublishEnum.PUBLISH)
.eq(CouponEntity::getCategory, CouponCategoryEnum.PROMOTION)
.eq(CouponEntity::getCategory, CouponCategoryEnum.PROMOTION.name())
.orderByDesc(CouponEntity::getCreateTime));
Map<String, Object> pageMap = new HashMap<>(3);
//总条数
@ -75,7 +73,6 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, CouponEntity> i
return pageMap;
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
@Override
public JsonData addCoupon(Long couponId, CouponCategoryEnum category) {
@ -179,6 +176,23 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, CouponEntity> i
return JsonData.buildSuccess();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
@Override
public JsonData initNewUserCoupon(NewUserCouponRequest newUserCouponRequest) {
LoginUser loginUser = new LoginUser();
loginUser.setId(newUserCouponRequest.getUserId());
loginUser.setName(newUserCouponRequest.getName());
LoginInterceptor.threadLocal.set(loginUser);
//查询新用户有哪些优惠券
List<CouponEntity> couponList = baseMapper.selectList(
Wrappers.<CouponEntity>lambdaQuery().eq(CouponEntity::getCategory, CouponCategoryEnum.NEW_USER.name()));
for (CouponEntity coupon : couponList) {
//幂等操作,调用需要加锁
this.addCoupon(coupon.getId(), CouponCategoryEnum.NEW_USER);
}
return JsonData.buildSuccess();
}
private CouponVO beanProcess(CouponEntity entity) {
CouponVO couponVO = new CouponVO();
BeanUtils.copyProperties(entity, couponVO);

28
nla-product-service/pom.xml

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nla-shop</artifactId>
<groupId>cn.nla</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nla-product-service</artifactId>
<description>商品服务模块</description>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>cn.nla</groupId>
<artifactId>nla-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>

15
nla-product-service/src/main/java/cn/nla/product/ProductApplication.java

@ -0,0 +1,15 @@
package cn.nla.product;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@MapperScan("cn.nla.*.mapper")
@ComponentScan(basePackages = {"cn.nla.*"})
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}

38
nla-product-service/src/main/java/cn/nla/product/controller/BannerController.java

@ -0,0 +1,38 @@
package cn.nla.product.controller;
import cn.nla.common.util.JsonData;
import cn.nla.product.service.BannerService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* <p>
* banner表 前端控制器
* </p>
*
* @author YJs
* @since 2024-08-09
*/
@Api(tags = "轮播图控制器")
@RestController
@RequestMapping("/pdt/banner/v1")
public class BannerController {
@Resource
private BannerService bannerService;
@ApiOperation("轮播图列表接口")
@GetMapping("list")
public JsonData list() {
return JsonData.buildSuccess(bannerService.list());
}
}

56
nla-product-service/src/main/java/cn/nla/product/controller/CartController.java

@ -0,0 +1,56 @@
package cn.nla.product.controller;
import cn.nla.common.util.JsonData;
import cn.nla.product.model.request.CartItemRequest;
import cn.nla.product.service.CartService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* 购物车前端控制器
*/
@Api(tags = "购物车控制器")
@RestController
@RequestMapping("/pdt/cart/v1")
public class CartController {
@Resource
private CartService cartService;
@ApiOperation("添加到购物车")
@PostMapping("add")
public JsonData addToCart(@ApiParam("购物项") @RequestBody CartItemRequest cartItemRequest) {
cartService.addToCart(cartItemRequest);
return JsonData.buildSuccess();
}
@ApiOperation("清空购物车")
@DeleteMapping("/clear")
public JsonData cleanMyCart() {
cartService.clear();
return JsonData.buildSuccess();
}
@ApiOperation("查看我的购物车")
@GetMapping("/my-cart")
public JsonData findMyCart() {
return JsonData.buildSuccess(cartService.getMyCart());
}
@ApiOperation("修改购物车数量")
@PostMapping("change")
public JsonData changeItemNum(@ApiParam("购物项") @RequestBody CartItemRequest cartItemRequest) {
cartService.changeItemNum(cartItemRequest);
return JsonData.buildSuccess();
}
@ApiOperation("删除购物项")
@DeleteMapping("/delete/{product_id}")
public JsonData deleteItem(@ApiParam(value = "商品id", required = true) @PathVariable("product_id") long productId) {
cartService.deleteItem(productId);
return JsonData.buildSuccess();
}
}

49
nla-product-service/src/main/java/cn/nla/product/controller/ProductController.java

@ -0,0 +1,49 @@
package cn.nla.product.controller;
import cn.nla.common.util.JsonData;
import cn.nla.product.model.VO.ProductVO;
import cn.nla.product.service.ProductService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
/**
* <p>
* 商品表 前端控制器
* </p>
*
* @author YJs
* @since 2024-08-09
*/
@Api(tags = "商品控制器")
@RestController
@RequestMapping("//pdt/product/v1")
public class ProductController {
@Resource
private ProductService productService;
@ApiOperation("分页查询商品列表")
@GetMapping("page")
public JsonData pageProductList(
@ApiParam(value = "当前页") @RequestParam(value = "page", defaultValue = "1") int page,
@ApiParam(value = "每页显示多少条") @RequestParam(value = "size", defaultValue = "10") int size) {
return JsonData.buildSuccess(productService.page(page, size));
}
@ApiOperation("商品详情")
@GetMapping("/detail/{product_id}")
public JsonData detail(@ApiParam(value = "商品id", required = true) @PathVariable("product_id") long productId) {
return JsonData.buildSuccess(productService.findDetailById(productId));
}
}

16
nla-product-service/src/main/java/cn/nla/product/mapper/BannerMapper.java

@ -0,0 +1,16 @@
package cn.nla.product.mapper;
import cn.nla.product.model.entity.BannerEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* banner表 Mapper 接口
* </p>
*
* @author YJs
* @since 2024-08-09
*/
public interface BannerMapper extends BaseMapper<BannerEntity> {
}

16
nla-product-service/src/main/java/cn/nla/product/mapper/ProductMapper.java

@ -0,0 +1,16 @@
package cn.nla.product.mapper;
import cn.nla.product.model.entity.ProductEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 商品表 Mapper 接口
* </p>
*
* @author YJs
* @since 2024-08-09
*/
public interface ProductMapper extends BaseMapper<ProductEntity> {
}

42
nla-product-service/src/main/java/cn/nla/product/model/VO/CartItemVO.java

@ -0,0 +1,42 @@
package cn.nla.product.model.VO;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 购物项
*/
@Data
public class CartItemVO {
/**
* 商品id
*/
@JsonProperty("product_id")
private Long productId;
/**
* 购买数量
*/
@JsonProperty("buy_num")
private Integer buyNum;
/**
* 商品标题
*/
@JsonProperty("product_title")
private String productTitle;
/**
* 图片
*/
@JsonProperty("product_img")
private String productImg;
/**
* 商品单价
*/
private BigDecimal amount;
/**
* 总价格单价+数量
*/
@JsonProperty("total_amount")
private BigDecimal totalAmount;
}

72
nla-product-service/src/main/java/cn/nla/product/model/VO/CartVO.java

@ -0,0 +1,72 @@
package cn.nla.product.model.VO;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 购物车
*/
@Data
public class CartVO {
/**
* 购物项
*/
@JsonProperty("cart_items")
private List<CartItemVO> cartItems;
/**
* 购买总件数
*/
@JsonProperty("total_num")
private Integer totalNum;
/**
* 购物车总价格
*/
@JsonProperty("total_price")
private BigDecimal totalPrice;
/**
* 购物车实际支付价格
*/
@JsonProperty("real_pay_price")
private BigDecimal realPayPrice;
/**
* 总件数
*/
public Integer getTotalNum() {
if (this.cartItems != null) {
return cartItems.stream().mapToInt(CartItemVO::getBuyNum).sum();
}
return 0;
}
/**
* 总价格
*/
public BigDecimal getTotalPrice() {
BigDecimal amount = new BigDecimal("0");
if (this.cartItems != null) {
for (CartItemVO cartItemVO : cartItems) {
BigDecimal itemTotalAmount = cartItemVO.getTotalAmount();
amount = amount.add(itemTotalAmount);
}
}
return amount;
}
/**
* 购物车里面实际支付的价格
*/
public BigDecimal getRealPayPrice() {
BigDecimal amount = new BigDecimal("0");
if (this.cartItems != null) {
for (CartItemVO cartItemVO : cartItems) {
BigDecimal itemTotalAmount = cartItemVO.getTotalAmount();
amount = amount.add(itemTotalAmount);
}
}
return amount;
}
}

37
nla-product-service/src/main/java/cn/nla/product/model/VO/ProductVO.java

@ -0,0 +1,37 @@
package cn.nla.product.model.VO;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ProductVO {
private Long id;
/**
* 标题
*/
private String title;
/**
* 封面图
*/
@JsonProperty("cover_img")
private String coverImg;
/**
* 详情
*/
private String detail;
/**
* 老价格
*/
@JsonProperty("old_amount")
private BigDecimal oldAmount;
/**
* 新价格
*/
private BigDecimal amount;
/**
* 库存
*/
private Integer stock;
}

44
nla-product-service/src/main/java/cn/nla/product/model/entity/BannerEntity.java

@ -0,0 +1,44 @@
package cn.nla.product.model.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* banner表
* </p>
*
* @author YJs
* @since 2024-08-09
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("banner")
public class BannerEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 图片
*/
private String img;
/**
* 跳转地址
*/
private String url;
/**
* 权重
*/
private Integer weight;
}

71
nla-product-service/src/main/java/cn/nla/product/model/entity/ProductEntity.java

@ -0,0 +1,71 @@
package cn.nla.product.model.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 商品表
* </p>
*
* @author YJs
* @since 2024-08-09
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("product")
public class ProductEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 标题
*/
private String title;
/**
* 封面图
*/
private String coverImg;
/**
* 详情
*/
private String detail;
/**
* 老价格
*/
private BigDecimal oldPrice;
/**
* 新价格
*/
private BigDecimal price;
/**
* 库存
*/
private Integer stock;
/**
* 创建时间
*/
private Date createTime;
/**
* 锁定库存
*/
private Integer lockStock;
}

20
nla-product-service/src/main/java/cn/nla/product/model/request/CartItemRequest.java

@ -0,0 +1,20 @@
package cn.nla.product.model.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 添加购物车对象
*/
@ApiModel(value = "添加购物车对象", description = "添加购物车请求对象")
@Data
public class CartItemRequest {
@ApiModelProperty(value = "商品id", example = "11")
@JsonProperty("product_id")
private long productId;
@ApiModelProperty(value = "购买数量", example = "1")
@JsonProperty("buy_num")
private int buyNum;
}

16
nla-product-service/src/main/java/cn/nla/product/service/BannerService.java

@ -0,0 +1,16 @@
package cn.nla.product.service;
import cn.nla.product.model.entity.BannerEntity;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* banner表 服务类
* </p>
*
* @author YJs
* @since 2024-08-09
*/
public interface BannerService extends IService<BannerEntity> {
}

32
nla-product-service/src/main/java/cn/nla/product/service/CartService.java

@ -0,0 +1,32 @@
package cn.nla.product.service;
import cn.nla.product.model.VO.CartVO;
import cn.nla.product.model.request.CartItemRequest;
public interface CartService {
/**
* 添加到购物车(一直缓存到redis中没有创建购物车数据表)
*/
void addToCart(CartItemRequest cartItemRequest);
/**
* 清空购物车
*/
void clear();
/**
* 查询
*/
CartVO getMyCart();
/**
* 修改
*/
void changeItemNum(CartItemRequest cartItemRequest);
/**
* 删除
*/
void deleteItem(long productId);
}

33
nla-product-service/src/main/java/cn/nla/product/service/ProductService.java

@ -0,0 +1,33 @@
package cn.nla.product.service;
import cn.nla.common.model.PageResult;
import cn.nla.product.model.VO.ProductVO;
import cn.nla.product.model.entity.ProductEntity;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 商品表 服务类
* </p>
*
* @author YJs
* @since 2024-08-09
*/
public interface ProductService extends IService<ProductEntity> {
/**
* 根据id找商品详情
**/
ProductVO findDetailById(Long productId);
/**
* 分页查询商品列表
**/
PageResult<ProductVO> page(int page, int size);
/**
* 批量查询
*/
List<ProductVO> findProductsByIdBatch(List<Long> productIdList);
}

20
nla-product-service/src/main/java/cn/nla/product/service/impl/BannerServiceImpl.java

@ -0,0 +1,20 @@
package cn.nla.product.service.impl;
import cn.nla.product.model.entity.BannerEntity;
import cn.nla.product.mapper.BannerMapper;
import cn.nla.product.service.BannerService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* banner表 服务实现类
* </p>
*
* @author YJs
* @since 2024-08-09
*/
@Service
public class BannerServiceImpl extends ServiceImpl<BannerMapper, BannerEntity> implements BannerService {
}

163
nla-product-service/src/main/java/cn/nla/product/service/impl/CartServiceImpl.java

@ -0,0 +1,163 @@
package cn.nla.product.service.impl;
import cn.nla.common.constant.CacheKey;
import cn.nla.common.enums.BizCodeEnum;
import cn.nla.common.exception.BizException;
import cn.nla.common.interceptor.LoginInterceptor;
import cn.nla.common.model.LoginUser;
import cn.nla.product.model.VO.CartItemVO;
import cn.nla.product.model.VO.CartVO;
import cn.nla.product.model.VO.ProductVO;
import cn.nla.product.model.request.CartItemRequest;
import cn.nla.product.service.CartService;
import cn.nla.product.service.ProductService;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 购物车
*/
@Service
public class CartServiceImpl implements CartService {
@Resource
private ProductService productService;
@Resource
private RedisTemplate redisTemplate;
@Override
public void addToCart(CartItemRequest cartItemRequest) {
long productId = cartItemRequest.getProductId();
int buyNum = cartItemRequest.getBuyNum();
//获取购物车
BoundHashOperations<String, Object, Object> myCart = getMyCartOps();
Object cacheObj = myCart.get(String.valueOf(productId));
String result = "";
if (cacheObj != null) {
result = (String) cacheObj;
}
if (StringUtils.isBlank(result)) {
//不存在则新建一个商品
CartItemVO cartItemVO = new CartItemVO();
ProductVO product = productService.findDetailById(productId);
if (product == null) {
throw new BizException(BizCodeEnum.CART_FAIL);
}
cartItemVO.setAmount(product.getAmount());
cartItemVO.setBuyNum(buyNum);
cartItemVO.setProductId(productId);
cartItemVO.setProductImg(product.getCoverImg());
cartItemVO.setProductTitle(product.getTitle());
cartItemVO.setTotalAmount(product.getAmount().multiply(new BigDecimal(buyNum)));
myCart.put(String.valueOf(productId), JSON.toJSONString(cartItemVO));
} else {
//存在商品,修改数量
CartItemVO cartItem = JSON.parseObject(result, CartItemVO.class);
cartItem.setBuyNum(cartItem.getBuyNum() + buyNum);
myCart.put(String.valueOf(productId), JSON.toJSONString(cartItem));
}
}
@Override
public void clear() {
redisTemplate.delete(getCartKey());
}
/**
* 删除购物项
*/
@Override
public void deleteItem(long productId) {
getMyCartOps().delete(String.valueOf(productId));
}
@Override
public void changeItemNum(CartItemRequest cartItemRequest) {
BoundHashOperations<String, Object, Object> mycart = getMyCartOps();
Object cacheObj = mycart.get(String.valueOf(cartItemRequest.getProductId()));
if (cacheObj == null) {
throw new BizException(BizCodeEnum.CART_FAIL);
}
String obj = (String) cacheObj;
CartItemVO cartItemVO = JSON.parseObject(obj, CartItemVO.class);
cartItemVO.setBuyNum(cartItemRequest.getBuyNum());
cartItemVO.setTotalAmount(cartItemVO.getAmount().multiply(new BigDecimal(cartItemVO.getBuyNum())));
mycart.put(String.valueOf(cartItemRequest.getProductId()), JSON.toJSONString(cartItemVO));
}
@Override
public CartVO getMyCart() {
//获取全部购物项
List<CartItemVO> cartItemVOList = buildCartItem(false);
CartVO cartVO = new CartVO();
cartVO.setCartItems(cartItemVOList);
return cartVO;
}
/**
* 获取最新的购物项
*
* @param latestPrice 是否获取最新价格
*/
private List<CartItemVO> buildCartItem(boolean latestPrice) {
BoundHashOperations<String, Object, Object> myCart = getMyCartOps();
List<Object> itemList = myCart.values();
List<CartItemVO> cartItemVOList = new ArrayList<>();
//拼接id列表查询最新价格
List<Long> productIdList = new ArrayList<>();
assert itemList != null;
for (Object item : itemList) {
CartItemVO cartItemVO = JSON.parseObject((String) item, CartItemVO.class);
cartItemVOList.add(cartItemVO);
productIdList.add(cartItemVO.getProductId());
}
//查询最新的商品价格
if (latestPrice) {
setProductLatestPrice(cartItemVOList, productIdList);
}
return cartItemVOList;
}
/**
* 设置商品最新价格
*/
private void setProductLatestPrice(List<CartItemVO> cartItemVOList, List<Long> productIdList) {
//批量查询
List<ProductVO> productVOList = productService.findProductsByIdBatch(productIdList);
//分组
Map<Long, ProductVO> maps = productVOList.stream().collect(Collectors.toMap(ProductVO::getId, Function.identity()));
cartItemVOList.forEach(item -> {
ProductVO productVO = maps.get(item.getProductId());
item.setProductTitle(productVO.getTitle());
item.setProductImg(productVO.getCoverImg());
item.setAmount(productVO.getAmount());
});
}
/**
* 抽取我的购物车通用方法
*/
private BoundHashOperations<String, Object, Object> getMyCartOps() {
return redisTemplate.boundHashOps(getCartKey());
}
/**
* 购物车 key
*/
private String getCartKey() {
LoginUser loginUser = LoginInterceptor.threadLocal.get();
return String.format(CacheKey.CART_KEY, loginUser.getId());
}
}

56
nla-product-service/src/main/java/cn/nla/product/service/impl/ProductServiceImpl.java

@ -0,0 +1,56 @@
package cn.nla.product.service.impl;
import cn.nla.common.model.PageResult;
import cn.nla.product.model.VO.ProductVO;
import cn.nla.product.model.entity.ProductEntity;
import cn.nla.product.mapper.ProductMapper;
import cn.nla.product.service.ProductService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* <p>
* 商品表 服务实现类
* </p>
*
* @author YJs
* @since 2024-08-09
*/
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, ProductEntity> implements ProductService {
@Override
public ProductVO findDetailById(Long productId) {
return beanProcess(baseMapper.selectById(productId));
}
public PageResult<ProductVO> page(int page, int size) {
Page<ProductEntity> pageInfo = new Page<>(page, size);
IPage<ProductEntity> productPage = baseMapper.selectPage(pageInfo, null);
return new PageResult<>(productPage.getTotal(), productPage.getPages(),
productPage.getRecords().stream().map(this::beanProcess).collect(Collectors.toList()));
}
@Override
public List<ProductVO> findProductsByIdBatch(List<Long> productIdList) {
return baseMapper.selectList(new QueryWrapper<ProductEntity>().in("id", productIdList))
.stream().map(this::beanProcess).collect(Collectors.toList());
}
private ProductVO beanProcess(ProductEntity product) {
ProductVO result = new ProductVO();
BeanUtils.copyProperties(product, result);
result.setAmount(product.getPrice());
result.setStock(product.getStock() - product.getLockStock());
return result;
}
}

26
nla-product-service/src/main/resources/application.yml

@ -0,0 +1,26 @@
server:
port: 9003
spring:
application:
name: nla-product-service
redis:
host: 127.0.0.1
port: 6379
database: 0
password: yuan123456
#数据库配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://117.72.43.105:3306/p_nla_product?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: Yuan625621105.
#配置plus打印sql⽇志
mybatis-plus:
configuration:
log-impl:
org.apache.ibatis.logging.stdout.StdOutImpl
#设置⽇志级别,ERROR/WARN/INFO/DEBUG,默认是INFO以上才显示
#logging:
# level:
# root: INFO

71
nla-product-service/src/main/resources/logback.xml

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 自定义配置: 日志存放路径 -->
<property name="log.path" value="./logs/nla-product-service"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 自定义配置: 系统模块日志级别控制 -->
<logger name="cn.nla" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<logger name="io.lettuce.core.protocol" level="ERROR"/>
<!--自定义配置: mapper打印-->
<logger name="cn.nla.product.mapper" level="DEBUG"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

18
nla-product-service/src/main/resources/mapper/BannerMapper.xml

@ -0,0 +1,18 @@
<?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="cn.nla.product.mapper.BannerMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.nla.product.model.entity.BannerEntity">
<id column="id" property="id" />
<result column="img" property="img" />
<result column="url" property="url" />
<result column="weight" property="weight" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, img, url, weight
</sql>
</mapper>

23
nla-product-service/src/main/resources/mapper/ProductMapper.xml

@ -0,0 +1,23 @@
<?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="cn.nla.product.mapper.ProductMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.nla.product.model.entity.ProductEntity">
<id column="id" property="id" />
<result column="title" property="title" />
<result column="cover_img" property="coverImg" />
<result column="detail" property="detail" />
<result column="old_price" property="oldPrice" />
<result column="price" property="price" />
<result column="stock" property="stock" />
<result column="create_time" property="createTime" />
<result column="lock_stock" property="lockStock" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, title, cover_img, detail, old_price, price, stock, create_time, lock_stock
</sql>
</mapper>

1
pom.xml

@ -11,6 +11,7 @@
<module>nla-common</module>
<module>nla-user-service</module>
<module>nla-coupon-service</module>
<module>nla-product-service</module>
</modules>
<packaging>pom</packaging>
<description>拉新营销平台</description>

Loading…
Cancel
Save