- 后端:临时解决 Dubbo 内嵌在 Spring Boot 时,对本地的 Dubbo Service 引用报错的问题。

- 前端:完善商品推荐
- 前端:完善优惠劵
This commit is contained in:
YunaiV
2019-05-07 19:33:16 +08:00
parent ab5d051f75
commit d39a416080
69 changed files with 743 additions and 202 deletions

View File

@@ -20,12 +20,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
AdminSecurityInterceptor.class, AdminAccessLogInterceptor.class})
public class MVCConfiguration implements WebMvcConfigurer {
// @Autowired
// private SecurityInterceptor securityInterceptor;
// @Reference
// private OAuth2Service oauth2Service;
@Autowired
private AdminSecurityInterceptor adminSecurityInterceptor;
@Autowired

View File

@@ -13,30 +13,29 @@ import cn.iocoder.mall.product.application.vo.admins.AdminsProductAttrPageVO;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductAttrSimpleVO;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductAttrVO;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductAttrValueVO;
import org.apache.dubbo.config.annotation.Reference;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static cn.iocoder.common.framework.vo.CommonResult.*;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@RestController
@RequestMapping("admins")
@Api("商品规格")
public class AdminsProductAttrController {
@Reference(validation = "true")
@Autowired
@Reference(validation = "true", version = "${dubbo.provider.ProductAttrService.version}")
private ProductAttrService productAttrService;
@GetMapping("/attr/page")
@ApiOperation("获得规格分页")
public CommonResult<AdminsProductAttrPageVO> attrPage(@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// 创建 ProductAttrPageDTO 对象
ProductAttrPageDTO productAttrPageDTO = new ProductAttrPageDTO().setName(name).setPageNo(pageNo).setPageSize(pageSize);

View File

@@ -15,7 +15,6 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
@@ -31,8 +30,7 @@ import static cn.iocoder.common.framework.vo.CommonResult.success;
@Api("商品分类")
public class AdminsProductCategoryController {
@Reference(validation = "true")
@Autowired
@Reference(validation = "true", version = "${dubbo.provider.ProductCategoryService.version}")
private ProductCategoryService productCategoryService;
@GetMapping("/tree")

View File

@@ -3,26 +3,23 @@ package cn.iocoder.mall.product.application.controller.admins;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder;
import cn.iocoder.mall.product.api.ProductSpuService;
import cn.iocoder.mall.product.api.bo.ProductSpuBO;
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
import cn.iocoder.mall.product.api.bo.ProductSpuPageBO;
import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
import cn.iocoder.mall.product.api.dto.*;
import cn.iocoder.mall.product.application.convert.ProductSpuConvert;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuDetailVO;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuPageVO;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuVO;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@@ -32,13 +29,9 @@ import static cn.iocoder.common.framework.vo.CommonResult.success;
@Api("商品 SPU + SKU")
public class AdminsProductSpuController {
@Reference(validation = "true")
@Autowired
@Reference(validation = "true", version = "${dubbo.provider.ProductSpuService.version}")
private ProductSpuService productSpuService;
@Autowired
private ObjectMapper objectMapper; // jackson 解析
@PostMapping("/spu/add")
@ApiOperation("创建商品")
@ApiImplicitParams({
@@ -109,15 +102,15 @@ public class AdminsProductSpuController {
@ApiOperation("商品 SPU 分页列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "商品名称,模糊匹配", example = "小王"),
@ApiImplicitParam(name = "pageNo", value = "页码,从 1 开始", example = "1"),
@ApiImplicitParam(name = "status", value = "状态", example = "可选值1-在售中2-已售罄3-仓库中;"),
@ApiImplicitParam(name = "cid", value = "商品分类编号", example = "10"),
@ApiImplicitParam(name = "pageNo", value = "页码,从 1 开始", example = "1"),
@ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"),
})
public CommonResult<AdminsProductSpuPageVO> spuPage(@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "status") Integer status,
@RequestParam(value = "cid", required = false) Integer cid,
@RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// 创建 ProductSpuPageDTO 对象
ProductSpuPageDTO productSpuPageDTO = new ProductSpuPageDTO().setName(name).setCid(cid).setPageNo(pageNo).setPageSize(pageSize);
@@ -136,20 +129,40 @@ public class AdminsProductSpuController {
return success(ProductSpuConvert.INSTANCE.convert2(result));
}
@GetMapping("/spu/search_list")
@ApiOperation("商品 SPU 搜索列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "商品名称,模糊匹配", example = "小王"),
})
public CommonResult<List<AdminsProductSpuVO>> spuSearchList(@RequestParam(value = "name", required = false) String name) {
// 创建 ProductSpuSearchListDTO 对象
ProductSpuSearchListDTO productSpuSearchListDTO = new ProductSpuSearchListDTO().setName(name);
// 执行搜索
List<ProductSpuBO> list = productSpuService.getProductSpuSearchList(productSpuSearchListDTO);
// 转换返回
return success(ProductSpuConvert.INSTANCE.convert3(list));
}
@GetMapping("/spu/info")
@ApiOperation("商品 SPU 明细")
@ApiImplicitParam(name = "id", value = "SPU 编号", required = true, example = "100")
public CommonResult<AdminsProductSpuDetailVO> info(@RequestParam("id") Integer id) {
public CommonResult<AdminsProductSpuDetailVO> spuInfo(@RequestParam("id") Integer id) {
return success(ProductSpuConvert.INSTANCE.convert(productSpuService.getProductSpuDetail(id)));
}
@GetMapping("/spu/list")
@ApiOperation("商品 SPU 列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "商品 SPU 编号数组", example = "1,2,3"),
})
public CommonResult<List<AdminsProductSpuVO>> spuList(@RequestParam("ids") Collection<Integer> ids) {
List<ProductSpuBO> list = productSpuService.getProductSpuList(ids);
// 转换返回
return success(ProductSpuConvert.INSTANCE.convert3(list));
}
private <T> List<T> parseSkus(String skuStr, Class<T> clazz) {
JavaType type = objectMapper.getTypeFactory().constructParametricType(List.class, clazz);
try {
return objectMapper.readValue(skuStr, type);
} catch (IOException e) {
throw new RuntimeException(e);
}
return JSON.parseArray(skuStr, clazz);
}
}

View File

@@ -23,7 +23,7 @@ import java.util.List;
@Api("商品分类")
public class UsersProductCategoryController {
@Reference(validation = "true")
@Reference(validation = "true", version = "${dubbo.provider.ProductCategoryService.version}")
@Autowired
private ProductCategoryService productCategoryService;

View File

@@ -8,12 +8,11 @@ import cn.iocoder.mall.product.application.convert.ProductSpuConvert;
import cn.iocoder.mall.product.application.vo.users.UsersProductSpuDetailVO;
import cn.iocoder.mall.product.application.vo.users.UsersProductSpuPageVO;
import cn.iocoder.mall.user.sdk.annotation.PermitAll;
import org.apache.dubbo.config.annotation.Reference;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@@ -26,8 +25,7 @@ import static cn.iocoder.common.framework.vo.CommonResult.success;
@Api("商品 SPU + SKU")
public class UsersProductSpuController {
@Reference(validation = "true")
@Autowired
@Reference(validation = "true", version = "${dubbo.provider.ProductSpuService.version}")
private ProductSpuService productSpuService;
@GetMapping("/info")

View File

@@ -1,15 +1,19 @@
package cn.iocoder.mall.product.application.convert;
import cn.iocoder.mall.product.api.bo.ProductSpuBO;
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
import cn.iocoder.mall.product.api.bo.ProductSpuPageBO;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuDetailVO;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuPageVO;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuVO;
import cn.iocoder.mall.product.application.vo.users.UsersProductSpuDetailVO;
import cn.iocoder.mall.product.application.vo.users.UsersProductSpuPageVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface ProductSpuConvert {
@@ -24,6 +28,9 @@ public interface ProductSpuConvert {
@Mappings({})
AdminsProductSpuPageVO convert2(ProductSpuPageBO result);
@Mappings({})
List<AdminsProductSpuVO> convert3(List<ProductSpuBO> result);
@Mappings({})
UsersProductSpuPageVO convert3(ProductSpuPageBO result);

View File

@@ -3,6 +3,7 @@ package cn.iocoder.mall.product.api;
import cn.iocoder.mall.product.api.bo.*;
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuSearchListDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
import java.util.Collection;
@@ -23,6 +24,8 @@ public interface ProductSpuService {
ProductSpuPageBO getProductSpuPage(ProductSpuPageDTO productSpuPageDTO);
List<ProductSpuBO> getProductSpuSearchList(ProductSpuSearchListDTO productSpuSearchListDTO);
List<ProductSpuBO> getProductSpuList(Collection<Integer> ids);
ProductSkuBO getProductSku(Integer id);

View File

@@ -0,0 +1,20 @@
package cn.iocoder.mall.product.api.dto;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 商品 Spu 搜索列表 DTO
*/
@Data
@Accessors(chain = true)
public class ProductSpuSearchListDTO {
/**
* 商品名
*
* 模糊匹配
*/
private String name;
}

View File

@@ -27,7 +27,7 @@ import java.util.stream.Collectors;
* @see cn.iocoder.mall.product.dataobject.ProductAttrValueDO
*/
@Service
@org.apache.dubbo.config.annotation.Service(validation = "true")
@org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.ProductAttrService.version}")
public class ProductAttrServiceImpl implements ProductAttrService {
@Autowired

View File

@@ -19,7 +19,7 @@ import java.util.Date;
import java.util.List;
@Service // 实际上不用添加。添加的原因是,必须 Spring 报错提示
@org.apache.dubbo.config.annotation.Service(validation = "true")
@org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.ProductCategoryService.version}")
public class ProductCategoryServiceImpl implements ProductCategoryService {
@Autowired

View File

@@ -9,10 +9,7 @@ import cn.iocoder.mall.product.api.bo.*;
import cn.iocoder.mall.product.api.constant.ProductCategoryConstants;
import cn.iocoder.mall.product.api.constant.ProductErrorCodeEnum;
import cn.iocoder.mall.product.api.constant.ProductSpuConstants;
import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
import cn.iocoder.mall.product.api.dto.*;
import cn.iocoder.mall.product.api.message.ProductUpdateMessage;
import cn.iocoder.mall.product.convert.ProductSpuConvert;
import cn.iocoder.mall.product.dao.ProductSkuMapper;
@@ -31,7 +28,7 @@ import java.util.*;
import java.util.stream.Collectors;
@Service // 实际上不用添加。添加的原因是,必须 Spring 报错提示
@org.apache.dubbo.config.annotation.Service(validation = "true", version = "1.0.0")
@org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.ProductSpuService.version}")
public class ProductSpuServiceImpl implements ProductSpuService {
@Autowired
@@ -237,6 +234,14 @@ public class ProductSpuServiceImpl implements ProductSpuService {
return productSpuPage;
}
@Override
public List<ProductSpuBO> getProductSpuSearchList(ProductSpuSearchListDTO productSpuSearchListDTO) {
return ProductSpuConvert.INSTANCE.convert(
productSpuMapper.selectListByNameLikeOrderBySortAsc(productSpuSearchListDTO.getName(), null, null,
null, null, null)
);
}
@Override
public List<ProductSpuBO> getProductSpuList(Collection<Integer> ids) {
List<ProductSpuDO> spus = productSpuMapper.selectByIds(ids);

View File

@@ -23,7 +23,13 @@ dubbo:
name: dubbo
scan:
base-packages: cn.iocoder.mall.product.service
provider:
ProductAttrService:
version: 1.0.0
ProductCategoryService:
version: 1.0.0
ProductSpuService:
version: 1.0.0
# rocketmq
rocketmq:

View File

@@ -113,7 +113,9 @@
AND deleted = 0
</where>
ORDER BY sort ASC
LIMIT #{offset}, #{limit}
<if test="offset != null and limit != null">
LIMIT #{offset}, #{limit}
</if>
</select>
<select id="selectCountByNameLike" resultType="Integer">