diff --git a/nla-common/pom.xml b/nla-common/pom.xml index c65b71f..c0c03cd 100644 --- a/nla-common/pom.xml +++ b/nla-common/pom.xml @@ -89,6 +89,11 @@ jaxb-api 2.3.1 + + com.alibaba + fastjson + 1.2.75 + diff --git a/nla-common/src/main/java/cn/nla/common/config/RedisConfig.java b/nla-common/src/main/java/cn/nla/common/config/RedisConfig.java new file mode 100644 index 0000000..c12bfcc --- /dev/null +++ b/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 redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate 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; + } +} diff --git a/nla-common/src/main/java/cn/nla/common/config/SwaggerConfiguration.java b/nla-common/src/main/java/cn/nla/common/config/SwaggerConfiguration.java index 3acc6f7..d5c3185 100644 --- a/nla-common/src/main/java/cn/nla/common/config/SwaggerConfiguration.java +++ b/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()); + } /** * 接口基本信息配置 */ diff --git a/nla-common/src/main/java/cn/nla/common/config/WebConfig.java b/nla-common/src/main/java/cn/nla/common/config/WebConfig.java index 4e82d87..88ff9c1 100644 --- a/nla-common/src/main/java/cn/nla/common/config/WebConfig.java +++ b/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", diff --git a/nla-common/src/main/java/cn/nla/common/constant/CacheKey.java b/nla-common/src/main/java/cn/nla/common/constant/CacheKey.java index e58ef5d..55aa9bd 100644 --- a/nla-common/src/main/java/cn/nla/common/constant/CacheKey.java +++ b/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"; } diff --git a/nla-common/src/main/java/cn/nla/common/model/PageResult.java b/nla-common/src/main/java/cn/nla/common/model/PageResult.java new file mode 100644 index 0000000..37f60ad --- /dev/null +++ b/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 { + + @JsonProperty("total_record") + private Long totalRecord; + + @JsonProperty("total_page") + private Long totalPage; + + @JsonProperty("current_data") + private List currentData; + +} diff --git a/nla-common/src/test/java/tools/MyBatisPlusGenerator.java b/nla-common/src/test/java/tools/MyBatisPlusGenerator.java index 30f3ce6..2674bc3 100644 --- a/nla-common/src/test/java/tools/MyBatisPlusGenerator.java +++ b/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") diff --git a/nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponController.java b/nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponController.java index 961e385..adce067 100644 --- a/nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponController.java +++ b/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); + } + } diff --git a/nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponRecordController.java b/nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponRecordController.java index 16f929c..3e83b76 100644 --- a/nla-coupon-service/src/main/java/cn/nla/coupon/controller/CouponRecordController.java +++ b/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; /** *

@@ -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); + } } diff --git a/nla-coupon-service/src/main/java/cn/nla/coupon/model/VO/CouponRecordVO.java b/nla-coupon-service/src/main/java/cn/nla/coupon/model/VO/CouponRecordVO.java new file mode 100644 index 0000000..941dac0 --- /dev/null +++ b/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; +} diff --git a/nla-coupon-service/src/main/java/cn/nla/coupon/model/request/NewUserCouponRequest.java b/nla-coupon-service/src/main/java/cn/nla/coupon/model/request/NewUserCouponRequest.java new file mode 100644 index 0000000..1c19cca --- /dev/null +++ b/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; +} diff --git a/nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponRecordService.java b/nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponRecordService.java index 595258d..1716277 100644 --- a/nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponRecordService.java +++ b/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 { + /** + * 分页查询个人优惠券 + */ + PageResult page(int page, int size); + + CouponRecordVO findById(long recordId); } diff --git a/nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponService.java b/nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponService.java index 749f79d..14f8da7 100644 --- a/nla-coupon-service/src/main/java/cn/nla/coupon/service/CouponService.java +++ b/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 { * 4、保存领劵记录 */ JsonData addCoupon(Long couponId, CouponCategoryEnum category); + + /** + * 用户微服务调用的时候,没传递token + * + * 本地直接调用发放优惠券的方法,需要构造一个登录用户存储在threadlocal + * + */ + JsonData initNewUserCoupon(NewUserCouponRequest newUserCouponRequest); } diff --git a/nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponRecordServiceImpl.java b/nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponRecordServiceImpl.java index 4c1e467..940d47d 100644 --- a/nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponRecordServiceImpl.java +++ b/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; + /** *

* 优惠券领劵记录 服务实现类 @@ -17,4 +27,34 @@ import org.springframework.stereotype.Service; @Service public class CouponRecordServiceImpl extends ServiceImpl implements CouponRecordService { + @Override + public PageResult page(int page, int size) { + LoginUser loginUser = LoginInterceptor.threadLocal.get(); + //封装分页信息 + Page pageInfo = new Page<>(page, size); + IPage recordPage = baseMapper.selectPage(pageInfo, + Wrappers.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.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; + } } diff --git a/nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponServiceImpl.java b/nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponServiceImpl.java index 7f9a178..089d98c 100644 --- a/nla-coupon-service/src/main/java/cn/nla/coupon/service/impl/CouponServiceImpl.java +++ b/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 i Page pageInfo = new Page<>(page, size); IPage couponDOIPage = baseMapper.selectPage(pageInfo, Wrappers.lambdaQuery().eq(CouponEntity::getPublish, CouponPublishEnum.PUBLISH) - .eq(CouponEntity::getCategory, CouponCategoryEnum.PROMOTION) + .eq(CouponEntity::getCategory, CouponCategoryEnum.PROMOTION.name()) .orderByDesc(CouponEntity::getCreateTime)); Map pageMap = new HashMap<>(3); //总条数 @@ -75,7 +73,6 @@ public class CouponServiceImpl extends ServiceImpl 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 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 couponList = baseMapper.selectList( + Wrappers.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); diff --git a/nla-product-service/pom.xml b/nla-product-service/pom.xml new file mode 100644 index 0000000..bbd98ab --- /dev/null +++ b/nla-product-service/pom.xml @@ -0,0 +1,28 @@ + + + + nla-shop + cn.nla + 1.0-SNAPSHOT + + 4.0.0 + nla-product-service + 商品服务模块 + + 11 + 11 + + + + cn.nla + nla-common + 1.0-SNAPSHOT + + + org.projectlombok + lombok + + + diff --git a/nla-product-service/src/main/java/cn/nla/product/ProductApplication.java b/nla-product-service/src/main/java/cn/nla/product/ProductApplication.java new file mode 100644 index 0000000..dbaf423 --- /dev/null +++ b/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); + } +} diff --git a/nla-product-service/src/main/java/cn/nla/product/controller/BannerController.java b/nla-product-service/src/main/java/cn/nla/product/controller/BannerController.java new file mode 100644 index 0000000..d1cd6b5 --- /dev/null +++ b/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; + +/** + *

+ * banner表 前端控制器 + *

+ * + * @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()); + } +} + diff --git a/nla-product-service/src/main/java/cn/nla/product/controller/CartController.java b/nla-product-service/src/main/java/cn/nla/product/controller/CartController.java new file mode 100644 index 0000000..214f4c3 --- /dev/null +++ b/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(); + } +} diff --git a/nla-product-service/src/main/java/cn/nla/product/controller/ProductController.java b/nla-product-service/src/main/java/cn/nla/product/controller/ProductController.java new file mode 100644 index 0000000..dc7ff13 --- /dev/null +++ b/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; + +/** + *

+ * 商品表 前端控制器 + *

+ * + * @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)); + } + +} + diff --git a/nla-product-service/src/main/java/cn/nla/product/mapper/BannerMapper.java b/nla-product-service/src/main/java/cn/nla/product/mapper/BannerMapper.java new file mode 100644 index 0000000..d9a829d --- /dev/null +++ b/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; + +/** + *

+ * banner表 Mapper 接口 + *

+ * + * @author YJs + * @since 2024-08-09 + */ +public interface BannerMapper extends BaseMapper { + +} diff --git a/nla-product-service/src/main/java/cn/nla/product/mapper/ProductMapper.java b/nla-product-service/src/main/java/cn/nla/product/mapper/ProductMapper.java new file mode 100644 index 0000000..3bec40d --- /dev/null +++ b/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; + +/** + *

+ * 商品表 Mapper 接口 + *

+ * + * @author YJs + * @since 2024-08-09 + */ +public interface ProductMapper extends BaseMapper { + +} diff --git a/nla-product-service/src/main/java/cn/nla/product/model/VO/CartItemVO.java b/nla-product-service/src/main/java/cn/nla/product/model/VO/CartItemVO.java new file mode 100644 index 0000000..78796e8 --- /dev/null +++ b/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; +} diff --git a/nla-product-service/src/main/java/cn/nla/product/model/VO/CartVO.java b/nla-product-service/src/main/java/cn/nla/product/model/VO/CartVO.java new file mode 100644 index 0000000..8f2ab06 --- /dev/null +++ b/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 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; + } +} diff --git a/nla-product-service/src/main/java/cn/nla/product/model/VO/ProductVO.java b/nla-product-service/src/main/java/cn/nla/product/model/VO/ProductVO.java new file mode 100644 index 0000000..4e7cb57 --- /dev/null +++ b/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; +} diff --git a/nla-product-service/src/main/java/cn/nla/product/model/entity/BannerEntity.java b/nla-product-service/src/main/java/cn/nla/product/model/entity/BannerEntity.java new file mode 100644 index 0000000..858ab7f --- /dev/null +++ b/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; + +/** + *

+ * banner表 + *

+ * + * @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; + + +} diff --git a/nla-product-service/src/main/java/cn/nla/product/model/entity/ProductEntity.java b/nla-product-service/src/main/java/cn/nla/product/model/entity/ProductEntity.java new file mode 100644 index 0000000..aaf6f3f --- /dev/null +++ b/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; + +/** + *

+ * 商品表 + *

+ * + * @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; + + +} diff --git a/nla-product-service/src/main/java/cn/nla/product/model/request/CartItemRequest.java b/nla-product-service/src/main/java/cn/nla/product/model/request/CartItemRequest.java new file mode 100644 index 0000000..3d0a91b --- /dev/null +++ b/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; +} diff --git a/nla-product-service/src/main/java/cn/nla/product/service/BannerService.java b/nla-product-service/src/main/java/cn/nla/product/service/BannerService.java new file mode 100644 index 0000000..e141aca --- /dev/null +++ b/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; + +/** + *

+ * banner表 服务类 + *

+ * + * @author YJs + * @since 2024-08-09 + */ +public interface BannerService extends IService { + +} diff --git a/nla-product-service/src/main/java/cn/nla/product/service/CartService.java b/nla-product-service/src/main/java/cn/nla/product/service/CartService.java new file mode 100644 index 0000000..17938fc --- /dev/null +++ b/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); +} diff --git a/nla-product-service/src/main/java/cn/nla/product/service/ProductService.java b/nla-product-service/src/main/java/cn/nla/product/service/ProductService.java new file mode 100644 index 0000000..5fb7ac9 --- /dev/null +++ b/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; + +/** + *

+ * 商品表 服务类 + *

+ * + * @author YJs + * @since 2024-08-09 + */ +public interface ProductService extends IService { + /** + * 根据id找商品详情 + **/ + ProductVO findDetailById(Long productId); + + /** + * 分页查询商品列表 + **/ + PageResult page(int page, int size); + + /** + * 批量查询 + */ + List findProductsByIdBatch(List productIdList); +} diff --git a/nla-product-service/src/main/java/cn/nla/product/service/impl/BannerServiceImpl.java b/nla-product-service/src/main/java/cn/nla/product/service/impl/BannerServiceImpl.java new file mode 100644 index 0000000..608d77c --- /dev/null +++ b/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; + +/** + *

+ * banner表 服务实现类 + *

+ * + * @author YJs + * @since 2024-08-09 + */ +@Service +public class BannerServiceImpl extends ServiceImpl implements BannerService { + +} diff --git a/nla-product-service/src/main/java/cn/nla/product/service/impl/CartServiceImpl.java b/nla-product-service/src/main/java/cn/nla/product/service/impl/CartServiceImpl.java new file mode 100644 index 0000000..07c08f7 --- /dev/null +++ b/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 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 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 cartItemVOList = buildCartItem(false); + CartVO cartVO = new CartVO(); + cartVO.setCartItems(cartItemVOList); + return cartVO; + } + + /** + * 获取最新的购物项, + * + * @param latestPrice 是否获取最新价格 + */ + private List buildCartItem(boolean latestPrice) { + BoundHashOperations myCart = getMyCartOps(); + List itemList = myCart.values(); + List cartItemVOList = new ArrayList<>(); + //拼接id列表查询最新价格 + List 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 cartItemVOList, List productIdList) { + //批量查询 + List productVOList = productService.findProductsByIdBatch(productIdList); + //分组 + Map 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 getMyCartOps() { + return redisTemplate.boundHashOps(getCartKey()); + } + + /** + * 购物车 key + */ + private String getCartKey() { + LoginUser loginUser = LoginInterceptor.threadLocal.get(); + return String.format(CacheKey.CART_KEY, loginUser.getId()); + } + +} diff --git a/nla-product-service/src/main/java/cn/nla/product/service/impl/ProductServiceImpl.java b/nla-product-service/src/main/java/cn/nla/product/service/impl/ProductServiceImpl.java new file mode 100644 index 0000000..6006e4a --- /dev/null +++ b/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; + +/** + *

+ * 商品表 服务实现类 + *

+ * + * @author YJs + * @since 2024-08-09 + */ +@Service +public class ProductServiceImpl extends ServiceImpl implements ProductService { + @Override + public ProductVO findDetailById(Long productId) { + return beanProcess(baseMapper.selectById(productId)); + } + + public PageResult page(int page, int size) { + Page pageInfo = new Page<>(page, size); + IPage productPage = baseMapper.selectPage(pageInfo, null); + return new PageResult<>(productPage.getTotal(), productPage.getPages(), + productPage.getRecords().stream().map(this::beanProcess).collect(Collectors.toList())); + } + + @Override + public List findProductsByIdBatch(List productIdList) { + return baseMapper.selectList(new QueryWrapper().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; + } + +} diff --git a/nla-product-service/src/main/resources/application.yml b/nla-product-service/src/main/resources/application.yml new file mode 100644 index 0000000..3cbccfa --- /dev/null +++ b/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 + diff --git a/nla-product-service/src/main/resources/logback.xml b/nla-product-service/src/main/resources/logback.xml new file mode 100644 index 0000000..992bc9c --- /dev/null +++ b/nla-product-service/src/main/resources/logback.xml @@ -0,0 +1,71 @@ + + + + + + + + + + ${log.pattern} + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + diff --git a/nla-product-service/src/main/resources/mapper/BannerMapper.xml b/nla-product-service/src/main/resources/mapper/BannerMapper.xml new file mode 100644 index 0000000..0769687 --- /dev/null +++ b/nla-product-service/src/main/resources/mapper/BannerMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + id, img, url, weight + + + diff --git a/nla-product-service/src/main/resources/mapper/ProductMapper.xml b/nla-product-service/src/main/resources/mapper/ProductMapper.xml new file mode 100644 index 0000000..f16ee63 --- /dev/null +++ b/nla-product-service/src/main/resources/mapper/ProductMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + id, title, cover_img, detail, old_price, price, stock, create_time, lock_stock + + + diff --git a/pom.xml b/pom.xml index 2bf372e..cfb0518 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ nla-common nla-user-service nla-coupon-service + nla-product-service pom 拉新营销平台