初始化代码 2022-02-11前 最新版本

This commit is contained in:
itheinjury@163.com
2022-02-11 19:30:50 +08:00
commit bf8f8d9382
1399 changed files with 165963 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
package cn.lili;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
/**
* 买家API
*
* @author Chopper
* @since 2020/11/16 10:03 下午
*/
@SpringBootApplication
@EnableCaching
@EnableAsync
public class BuyerApiApplication {
@Primary
@Bean
public TaskExecutor primaryTaskExecutor() {
return new ThreadPoolTaskExecutor();
}
public static void main(String[] args) {
System.setProperty("es.set.netty.runtime.available.processors", "false");
SpringApplication.run(BuyerApiApplication.class, args);
}
}

View File

@@ -0,0 +1,70 @@
package cn.lili.controller.distribution;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.distribution.entity.dos.Distribution;
import cn.lili.modules.distribution.entity.dos.DistributionOrder;
import cn.lili.modules.distribution.entity.dto.DistributionApplyDTO;
import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams;
import cn.lili.modules.distribution.service.DistributionOrderService;
import cn.lili.modules.distribution.service.DistributionService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 买家端,分销员接口
*
* @author pikachu
* @since 2020/11/16 10:03 下午
*/
@RestController
@Api(tags = "买家端,分销员接口")
@RequestMapping("/buyer/distribution")
public class DistributionBuyerController {
/**
* 分销员
*/
@Autowired
private DistributionService distributionService;
/**
* 分销员订单
*/
@Autowired
private DistributionOrderService distributionOrderService;
@ApiOperation(value = "申请分销员")
@PostMapping
public ResultMessage<Object> applyDistribution(DistributionApplyDTO distributionApplyDTO) {
return ResultUtil.data(distributionService.applyDistribution(distributionApplyDTO));
}
@ApiOperation(value = "获取分销员分页订单列表")
@GetMapping("/distributionOrder")
public ResultMessage<IPage<DistributionOrder>> distributionOrderPage(DistributionOrderSearchParams distributionOrderSearchParams) {
distributionOrderSearchParams.setDistributionId(distributionService.getDistribution().getId());
return ResultUtil.data(distributionOrderService.getDistributionOrderPage(distributionOrderSearchParams));
}
@ApiOperation(value = "获取当前会员的分销员信息", notes = "可根据分销员信息查询待提现金额以及冻结金额等信息")
@GetMapping
public ResultMessage<Distribution> getDistribution() {
//检查分销开关
distributionService.checkDistributionSetting();
return ResultUtil.data(distributionService.getDistribution());
}
@ApiOperation(value = "绑定分销员")
@ApiImplicitParam(name = "distributionId", value = "分销员ID", required = true, paramType = "path")
@GetMapping("/bindingDistribution/{distributionId}")
public ResultMessage<Object> bindingDistribution(@PathVariable String distributionId){
distributionService.bindingDistribution(distributionId);
return ResultUtil.success();
}
}

View File

@@ -0,0 +1,75 @@
package cn.lili.controller.distribution;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.distribution.entity.dos.DistributionCash;
import cn.lili.modules.distribution.service.DistributionCashService;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* 买家端,分销商品佣金提现接口
*
* @author pikachu
* @since 2020/11/16 10:03 下午
*/
@RestController
@Api(tags = "买家端,分销商品佣金提现接口")
@RequestMapping("/buyer/distribution/cash")
@Validated
public class DistributionCashBuyerController {
/**
* 分销佣金
*/
@Autowired
private DistributionCashService distributionCashService;
/**
* 分销员提现
*/
@Autowired
private DistributionCashService distributorCashService;
@PreventDuplicateSubmissions
@ApiOperation(value = "分销员提现")
@ApiImplicitParams({
@ApiImplicitParam(name = "price", value = "申请金额", required = true, paramType = "query", dataType = "double")
})
@PostMapping
public ResultMessage<Object> cash(@Validated @Max(value = 9999, message = "提现金额单次最多允许提现9999元")
@Min(value = 1, message = "提现金额单次最少提现金额为1元")
@NotNull @ApiIgnore Double price) {
if (Boolean.TRUE.equals(distributionCashService.cash(price))) {
return ResultUtil.success();
}
throw new ServiceException(ResultCode.ERROR);
}
@ApiOperation(value = "分销员提现历史")
@GetMapping
public ResultMessage<IPage<DistributionCash>> casHistory(PageVO page) {
return ResultUtil.data(distributorCashService.getDistributionCash(page));
}
}

View File

@@ -0,0 +1,77 @@
package cn.lili.controller.distribution;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.distribution.entity.dto.DistributionGoodsSearchParams;
import cn.lili.modules.distribution.entity.vos.DistributionGoodsVO;
import cn.lili.modules.distribution.service.DistributionGoodsService;
import cn.lili.modules.distribution.service.DistributionSelectedGoodsService;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
/**
* 买家端,分销商品接口
*
* @author Bulbasaur
* @since 2020/11/16 10:06 下午
*/
@RestController
@Api(tags = "买家端,分销商品接口")
@RequestMapping("/buyer/distributionGoods")
public class DistributionGoodsBuyerController {
/**
* 分销商品
*/
@Autowired
private DistributionGoodsService distributionGoodsService;
/**
* 选择分销商品
*/
@Autowired
private DistributionSelectedGoodsService distributionSelectedGoodsService;
@ApiOperation(value = "获取分销商商品列表")
@GetMapping
public ResultMessage<IPage<DistributionGoodsVO>> distributionGoods(DistributionGoodsSearchParams distributionGoodsSearchParams) {
return ResultUtil.data(distributionGoodsService.goodsPage(distributionGoodsSearchParams));
}
@PreventDuplicateSubmissions
@ApiOperation(value = "选择分销商品")
@ApiImplicitParams({
@ApiImplicitParam(name = "distributionGoodsId", value = "分销ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "checked", value = "是否选择", required = true, dataType = "boolean", paramType = "query")
})
@GetMapping(value = "/checked/{distributionGoodsId}")
public ResultMessage<Object> distributionCheckGoods(
@NotNull(message = "分销商品不能为空") @PathVariable("distributionGoodsId") String distributionGoodsId,Boolean checked) {
Boolean result=false;
if(checked){
result=distributionSelectedGoodsService.add(distributionGoodsId);
}else {
result=distributionSelectedGoodsService.delete(distributionGoodsId);
}
//判断操作结果
if(result){
return ResultUtil.success(ResultCode.SUCCESS);
}else{
throw new ServiceException(ResultCode.ERROR);
}
}
}

View File

@@ -0,0 +1,50 @@
package cn.lili.controller.distribution;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.distribution.entity.dos.DistributionOrder;
import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams;
import cn.lili.modules.distribution.service.DistributionOrderService;
import cn.lili.modules.distribution.service.DistributionService;
import com.baomidou.mybatisplus.core.metadata.IPage;
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;
/**
* 买家端,分销商品佣金提现接口
*
* @author pikachu
* @since 2020/11/16 10:03 下午
*/
@RestController
@Api(tags = "买家端,分销订单接口")
@RequestMapping("/buyer/distribution/order")
public class DistributionOrderBuyerController {
/**
* 分销订单
*/
@Autowired
private DistributionOrderService distributionOrderService;
/**
* 分销员
*/
@Autowired
private DistributionService distributionService;
@ApiOperation(value = "分销员订单")
@GetMapping
public ResultMessage<IPage<DistributionOrder>> casHistory(DistributionOrderSearchParams distributionOrderSearchParams) {
//获取当前登录的分销员
distributionOrderSearchParams.setDistributionId(distributionService.getDistribution().getId());
return ResultUtil.data(distributionOrderService.getDistributionOrderPage(distributionOrderSearchParams));
}
}

View File

@@ -0,0 +1,43 @@
package cn.lili.controller.goods;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.goods.entity.vos.CategoryVO;
import cn.lili.modules.goods.service.CategoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 买家端,商品分类接口
*
* @author Chopper
* @since 2020/11/16 10:05 下午
*/
@RestController
@Api(tags = "买家端,商品分类接口")
@RequestMapping("/buyer/category")
public class CategoryBuyerController {
/**
* 商品分类
*/
@Autowired
private CategoryService categoryService;
@ApiOperation(value = "获取商品分类列表")
@ApiImplicitParam(name = "parentId", value = "上级分类ID全部分类为0", required = true, dataType = "Long", paramType = "path")
@GetMapping(value = "/get/{parentId}")
public ResultMessage<List<CategoryVO>> list(@NotNull(message = "分类ID不能为空") @PathVariable String parentId) {
return ResultUtil.data(categoryService.listAllChildren(parentId));
}
}

View File

@@ -0,0 +1,124 @@
package cn.lili.controller.goods;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.goods.entity.dos.Goods;
import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
import cn.lili.modules.goods.entity.vos.GoodsVO;
import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo;
import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
import cn.lili.modules.search.service.EsGoodsSearchService;
import cn.lili.modules.statistics.aop.PageViewPoint;
import cn.lili.modules.statistics.aop.enums.PageViewEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.core.SearchPage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
/**
* 买家端,商品接口
*
* @author Chopper
* @since 2020/11/16 10:06 下午
*/
@Slf4j
@Api(tags = "买家端,商品接口")
@RestController
@RequestMapping("/buyer/goods")
public class GoodsBuyerController {
/**
* 商品
*/
@Autowired
private GoodsService goodsService;
/**
* 商品SKU
*/
@Autowired
private GoodsSkuService goodsSkuService;
/**
* ES商品搜索
*/
@Autowired
private EsGoodsSearchService goodsSearchService;
@ApiOperation(value = "通过id获取商品信息")
@ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path", dataType = "Long")
@GetMapping(value = "/get/{goodsId}")
public ResultMessage<GoodsVO> get(@NotNull(message = "商品ID不能为空") @PathVariable("goodsId") String id) {
return ResultUtil.data(goodsService.getGoodsVO(id));
}
@ApiOperation(value = "通过id获取商品信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path"),
@ApiImplicitParam(name = "skuId", value = "skuId", required = true, paramType = "path")
})
@GetMapping(value = "/sku/{goodsId}/{skuId}")
@PageViewPoint(type = PageViewEnum.SKU, id = "#id")
public ResultMessage<Map<String, Object>> getSku(@NotNull(message = "商品ID不能为空") @PathVariable("goodsId") String goodsId,
@NotNull(message = "SKU ID不能为空") @PathVariable("skuId") String skuId) {
try {
// 读取选中的列表
Map<String, Object> map = goodsSkuService.getGoodsSkuDetail(goodsId, skuId);
return ResultUtil.data(map);
} catch (ServiceException se) {
log.info(se.getMsg(), se);
throw se;
} catch (Exception e) {
log.error(ResultCode.GOODS_ERROR.message(), e);
return ResultUtil.error(ResultCode.GOODS_ERROR);
}
}
@ApiOperation(value = "获取商品分页列表")
@GetMapping
public ResultMessage<IPage<Goods>> getByPage(GoodsSearchParams goodsSearchParams) {
return ResultUtil.data(goodsService.queryByParams(goodsSearchParams));
}
@ApiOperation(value = "从ES中获取商品信息")
@GetMapping("/es")
public ResultMessage<SearchPage<EsGoodsIndex>> getGoodsByPageFromEs(EsGoodsSearchDTO goodsSearchParams, PageVO pageVO) {
pageVO.setNotConvert(true);
SearchPage<EsGoodsIndex> esGoodsIndices = goodsSearchService.searchGoods(goodsSearchParams, pageVO);
return ResultUtil.data(esGoodsIndices);
}
@ApiOperation(value = "从ES中获取相关商品品牌名称分类名称及属性")
@GetMapping("/es/related")
public ResultMessage<EsGoodsRelatedInfo> getGoodsRelatedByPageFromEs(EsGoodsSearchDTO goodsSearchParams, PageVO pageVO) {
pageVO.setNotConvert(true);
EsGoodsRelatedInfo selector = goodsSearchService.getSelector(goodsSearchParams, pageVO);
return ResultUtil.data(selector);
}
@ApiOperation(value = "获取搜索热词")
@GetMapping("/hot-words")
public ResultMessage<List<String>> getGoodsHotWords(Integer count) {
List<String> hotWords = goodsSearchService.getHotWords(count);
return ResultUtil.data(hotWords);
}
}

View File

@@ -0,0 +1,63 @@
package cn.lili.controller.member;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.service.FootprintService;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 买家端,浏览历史接口
*
* @author Chopper
* @since 2020/11/16 10:06 下午
*/
@RestController
@Api(tags = "买家端,浏览历史接口")
@RequestMapping("/buyer/footprint")
public class FootprintController {
/**
* 会员足迹
*/
@Autowired
private FootprintService footprintService;
@ApiOperation(value = "分页获取")
@GetMapping
public ResultMessage<List<EsGoodsIndex>> getByPage(PageVO page) {
return ResultUtil.data(footprintService.footPrintPage(page));
}
@ApiOperation(value = "根据id删除")
@ApiImplicitParam(name = "ids", value = "商品ID", required = true, allowMultiple = true, dataType = "String", paramType = "path")
@DeleteMapping(value = "/delByIds/{ids}")
public ResultMessage<Object> delAllByIds(@NotNull(message = "商品ID不能为空") @PathVariable("ids") List ids) {
footprintService.deleteByIds(ids);
return ResultUtil.success();
}
@ApiOperation(value = "清空足迹")
@DeleteMapping
public ResultMessage<Object> deleteAll() {
footprintService.clean();
return ResultUtil.success();
}
@ApiOperation(value = "获取当前会员足迹数量")
@GetMapping(value = "/getFootprintNum")
public ResultMessage<Object> getFootprintNum() {
return ResultUtil.data(footprintService.getFootprintNum());
}
}

View File

@@ -0,0 +1,83 @@
package cn.lili.controller.member;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.MemberAddress;
import cn.lili.modules.member.service.MemberAddressService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Objects;
/**
* 买家端,会员地址接口
*
* @author Bulbasaur
* @since 2020/11/16 10:07 下午
*/
@RestController
@Api(tags = "买家端,会员地址接口")
@RequestMapping("/buyer/memberAddress")
public class MemberAddressBuyerController {
/**
* 会员收件地址
*/
@Autowired
private MemberAddressService memberAddressService;
@ApiOperation(value = "获取会员收件地址分页列表")
@GetMapping
public ResultMessage<IPage<MemberAddress>> page(PageVO page) {
return ResultUtil.data(memberAddressService.getAddressByMember(page, UserContext.getCurrentUser().getId()));
}
@ApiOperation(value = "根据ID获取会员收件地址")
@ApiImplicitParam(name = "id", value = "会员地址ID", dataType = "String", paramType = "path")
@GetMapping(value = "/get/{id}")
public ResultMessage<MemberAddress> getShippingAddress(@PathVariable String id) {
return ResultUtil.data(memberAddressService.getMemberAddress(id));
}
@ApiOperation(value = "获取当前会员默认收件地址")
@GetMapping(value = "/get/default")
public ResultMessage<MemberAddress> getDefaultShippingAddress() {
return ResultUtil.data(memberAddressService.getDefaultMemberAddress());
}
@ApiOperation(value = "新增会员收件地址")
@PostMapping
public ResultMessage<MemberAddress> addShippingAddress(@Valid MemberAddress shippingAddress) {
//添加会员地址
shippingAddress.setMemberId(Objects.requireNonNull(UserContext.getCurrentUser()).getId());
if(shippingAddress.getIsDefault()==null){
shippingAddress.setIsDefault(false);
}
return ResultUtil.data(memberAddressService.saveMemberAddress(shippingAddress));
}
@ApiOperation(value = "修改会员收件地址")
@PutMapping
public ResultMessage<MemberAddress> editShippingAddress(@Valid MemberAddress shippingAddress) {
return ResultUtil.data(memberAddressService.updateMemberAddress(shippingAddress));
}
@ApiOperation(value = "删除会员收件地址")
@ApiImplicitParam(name = "id", value = "会员地址ID", dataType = "String", paramType = "path")
@DeleteMapping(value = "/delById/{id}")
public ResultMessage<Object> delShippingAddressById(@PathVariable String id) {
OperationalJudgment.judgment(memberAddressService.getById(id));
memberAddressService.removeMemberAddress(id);
return ResultUtil.success();
}
}

View File

@@ -0,0 +1,96 @@
package cn.lili.controller.member;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.service.GoodsCollectionService;
import cn.lili.modules.member.service.StoreCollectionService;
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.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
/**
* 买家端,会员收藏接口
*
* @author Chopper
* @since 2020/11/17 2:32 下午
*/
@RestController
@Api(tags = "买家端,会员收藏接口")
@RequestMapping("/buyer/member/collection")
public class MemberCollectionController {
/**
* 会员商品收藏
*/
@Autowired
private GoodsCollectionService goodsCollectionService;
/**
* 会员店铺
*/
@Autowired
private StoreCollectionService storeCollectionService;
/**
* 商品收藏关键字
*/
private String goods="GOODS";
@ApiOperation(value = "查询会员收藏列表")
@ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺")
@GetMapping("/{type}")
public ResultMessage<Object> goodsList(@PathVariable String type, PageVO page) {
if (goods.equals(type)) {
return ResultUtil.data(goodsCollectionService.goodsCollection(page));
}
return ResultUtil.data(storeCollectionService.storeCollection(page));
}
@ApiOperation(value = "添加会员收藏")
@ApiImplicitParams({
@ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺"),
@ApiImplicitParam(name = "num", value = "", dataType = "Long", paramType = "path")
})
@PostMapping("/add/{type}/{id}")
public ResultMessage<Object> addGoodsCollection(@PathVariable String type,
@NotNull(message = "值不能为空") @PathVariable String id) {
if (goods.equals(type)) {
return ResultUtil.data(goodsCollectionService.addGoodsCollection(id));
}
return ResultUtil.data(storeCollectionService.addStoreCollection(id));
}
@ApiOperation(value = "删除会员收藏")
@ApiImplicitParams({
@ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺"),
@ApiImplicitParam(name = "num", value = "", dataType = "Long", paramType = "path")
})
@DeleteMapping(value = "/delete/{type}/{id}")
public ResultMessage<Object> deleteGoodsCollection(@PathVariable String type,
@NotNull(message = "值不能为空") @PathVariable String id) {
if (goods.equals(type)) {
return ResultUtil.data(goodsCollectionService.deleteGoodsCollection(id));
}
return ResultUtil.data(storeCollectionService.deleteStoreCollection(id));
}
@ApiOperation(value = "查询会员是否收藏")
@ApiImplicitParams({
@ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺"),
@ApiImplicitParam(name = "id", value = "", dataType = "String", paramType = "path")
})
@GetMapping(value = "/isCollection/{type}/{id}")
public ResultMessage<Boolean> isCollection(@PathVariable String type,
@NotNull(message = "值不能为空") @PathVariable String id) {
if (goods.equals(type)) {
return ResultUtil.data(this.goodsCollectionService.isCollection(id));
}
return ResultUtil.data(this.storeCollectionService.isCollection(id));
}
}

View File

@@ -0,0 +1,81 @@
package cn.lili.controller.member;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.enums.SwitchEnum;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.MemberEvaluation;
import cn.lili.modules.member.entity.dto.EvaluationQueryParams;
import cn.lili.modules.member.entity.dto.MemberEvaluationDTO;
import cn.lili.modules.member.entity.vo.EvaluationNumberVO;
import cn.lili.modules.member.entity.vo.MemberEvaluationVO;
import cn.lili.modules.member.service.MemberEvaluationService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
/**
* 买家端,会员商品评价接口
*
* @author Bulbasaur
* @since 2020/11/16 10:08 下午
*/
@RestController
@Api(tags = "买家端,会员商品评价接口")
@RequestMapping("/buyer/memberEvaluation")
public class MemberEvaluationBuyerController {
/**
* 会员商品评价
*/
@Autowired
private MemberEvaluationService memberEvaluationService;
@PreventDuplicateSubmissions
@ApiOperation(value = "添加会员评价")
@PostMapping
public ResultMessage<MemberEvaluationDTO> save(@Valid MemberEvaluationDTO memberEvaluationDTO) {
return ResultUtil.data(memberEvaluationService.addMemberEvaluation(memberEvaluationDTO, true));
}
@ApiOperation(value = "查看会员评价详情")
@ApiImplicitParam(name = "id", value = "评价ID", required = true, paramType = "path")
@GetMapping(value = "/get/{id}")
public ResultMessage<MemberEvaluationVO> save(@NotNull(message = "评价ID不能为空") @PathVariable("id") String id) {
return ResultUtil.data(memberEvaluationService.queryById(id));
}
@ApiOperation(value = "查看当前会员评价列表")
@GetMapping
public ResultMessage<IPage<MemberEvaluation>> queryMineEvaluation(EvaluationQueryParams evaluationQueryParams) {
//设置当前登录会员
evaluationQueryParams.setMemberId(UserContext.getCurrentUser().getId());
return ResultUtil.data(memberEvaluationService.managerQuery(evaluationQueryParams));
}
@ApiOperation(value = "查看某一个商品的评价列表")
@ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, dataType = "Long", paramType = "path")
@GetMapping(value = "/{goodsId}/goodsEvaluation")
public ResultMessage<IPage<MemberEvaluation>> queryGoodsEvaluation(EvaluationQueryParams evaluationQueryParams,
@NotNull @PathVariable("goodsId") String goodsId) {
//设置查询查询商品
evaluationQueryParams.setGoodsId(goodsId);
evaluationQueryParams.setStatus(SwitchEnum.OPEN.name());
return ResultUtil.data(memberEvaluationService.managerQuery(evaluationQueryParams));
}
@ApiOperation(value = "查看某一个商品的评价数量")
@ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, dataType = "Long", paramType = "path")
@GetMapping(value = "/{goodsId}/evaluationNumber")
public ResultMessage<EvaluationNumberVO> queryEvaluationNumber(@NotNull @PathVariable("goodsId") String goodsId) {
return ResultUtil.data(memberEvaluationService.getEvaluationNumber(goodsId));
}
}

View File

@@ -0,0 +1,45 @@
package cn.lili.controller.member;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.MemberSign;
import cn.lili.modules.member.service.MemberSignService;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 会员签到控制器
*
* @author pikachu
* @since 2020/11/16 10:07 下午
*/
@RestController
@Api(tags = "买家端会员签到API")
@RequestMapping("/buyer/members/sign")
public class MemberSignBuyerController {
@Autowired
private MemberSignService memberSignService;
@PreventDuplicateSubmissions
@PostMapping
@ApiOperation(value = "会员签到")
public ResultMessage<Boolean> memberSign() {
return ResultUtil.data(memberSignService.memberSign());
}
@GetMapping
@ApiOperation(value = "根据时间查询会员签到表类型是YYYYmm")
public ResultMessage<List<MemberSign>> memberSign(String time) {
return ResultUtil.data(memberSignService.getMonthSignDay(time));
}
}

View File

@@ -0,0 +1,52 @@
package cn.lili.controller.member;
import cn.lili.common.security.context.UserContext;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.MemberPointsHistory;
import cn.lili.modules.member.entity.vo.MemberPointsHistoryVO;
import cn.lili.modules.member.service.MemberPointsHistoryService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,会员积分历史接口
*
* @author Bulbasaur
* @since 2020-02-25 14:10:16
*/
@RestController
@Api(tags = "买家端,会员积分历史接口")
@RequestMapping("/buyer/member/memberPointsHistory")
public class PointsHistoryBuyerController {
@Autowired
private MemberPointsHistoryService memberPointsHistoryService;
@ApiOperation(value = "分页获取")
@GetMapping(value = "/getByPage")
public ResultMessage<IPage<MemberPointsHistory>> getByPage(PageVO page) {
LambdaQueryWrapper<MemberPointsHistory> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(MemberPointsHistory::getMemberId, UserContext.getCurrentUser().getId());
queryWrapper.orderByDesc(MemberPointsHistory::getCreateTime);
return ResultUtil.data(memberPointsHistoryService.page(PageUtil.initPage(page), queryWrapper));
}
@ApiOperation(value = "获取会员积分VO")
@GetMapping(value = "/getMemberPointsHistoryVO")
public ResultMessage<MemberPointsHistoryVO> getMemberPointsHistoryVO() {
return ResultUtil.data(memberPointsHistoryService.getMemberPointsHistoryVO(UserContext.getCurrentUser().getId()));
}
}

View File

@@ -0,0 +1,58 @@
package cn.lili.controller.message;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.message.entity.dos.MemberMessage;
import cn.lili.modules.message.entity.enums.MessageStatusEnum;
import cn.lili.modules.message.entity.vos.MemberMessageQueryVO;
import cn.lili.modules.message.service.MemberMessageService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 买家端,会员站内消息接口
*
* @author Bulbasaur
* @since 2020/11/16 10:07 下午
*/
@RestController
@Api(tags = "买家端,会员站内消息接口")
@RequestMapping("/buyer/member/message")
public class MemberMessageBuyerController {
/**
* 会员站内消息
*/
@Autowired
private MemberMessageService memberMessageService;
@ApiOperation(value = "分页获取会员站内消息")
@GetMapping
public ResultMessage<IPage<MemberMessage>> page(MemberMessageQueryVO memberMessageQueryVO, PageVO page) {
memberMessageQueryVO.setMemberId(UserContext.getCurrentUser().getId());
return ResultUtil.data(memberMessageService.getPage(memberMessageQueryVO, page));
}
@ApiOperation(value = "消息已读")
@ApiImplicitParam(name = "messageId", value = "会员消息id", required = true, paramType = "path")
@PutMapping("/{message_id}")
public ResultMessage<Boolean> read(@PathVariable("message_id") String messageId) {
return ResultUtil.data(memberMessageService.editStatus(MessageStatusEnum.ALREADY_READY.name(), messageId));
}
@ApiOperation(value = "消息放入回收站")
@ApiImplicitParam(name = "messageId", value = "会员消息id", required = true, paramType = "path")
@DeleteMapping("/{message_id}")
public ResultMessage<Boolean> deleteMessage(@PathVariable("message_id") String messageId) {
return ResultUtil.data(memberMessageService.editStatus(MessageStatusEnum.ALREADY_REMOVE.name(), messageId));
}
}

View File

@@ -0,0 +1,137 @@
package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason;
import cn.lili.modules.order.aftersale.entity.dto.AfterSaleDTO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleApplyVO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO;
import cn.lili.modules.order.aftersale.service.AfterSaleLogService;
import cn.lili.modules.order.aftersale.service.AfterSaleReasonService;
import cn.lili.modules.order.aftersale.service.AfterSaleService;
import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
/**
* 买家端,售后管理接口
*
* @author Chopper
* @since 2020/11/16 10:02 下午
*/
@RestController
@Api(tags = "买家端,售后管理接口")
@RequestMapping("/buyer/afterSale")
public class AfterSaleBuyerController {
/**
* 售后
*/
@Autowired
private AfterSaleService afterSaleService;
/**
* 售后原因
*/
@Autowired
private AfterSaleReasonService afterSaleReasonService;
/**
* 售后日志
*/
@Autowired
private AfterSaleLogService afterSaleLogService;
@ApiOperation(value = "查看售后服务详情")
@ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path")
@GetMapping(value = "/get/{sn}")
public ResultMessage<AfterSaleVO> get(@NotNull(message = "售后单号") @PathVariable("sn") String sn) {
AfterSaleVO afterSale = OperationalJudgment.judgment(afterSaleService.getAfterSale(sn));
return ResultUtil.data(afterSale);
}
@ApiOperation(value = "分页获取售后服务")
@GetMapping(value = "/page")
public ResultMessage<IPage<AfterSaleVO>> getByPage(AfterSaleSearchParams searchParams) {
return ResultUtil.data(afterSaleService.getAfterSalePages(searchParams));
}
@ApiOperation(value = "获取申请售后页面信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "sn", value = "订单货物编号", required = true, dataType = "String", paramType = "path")
})
@GetMapping(value = "/applyAfterSaleInfo/{sn}")
public ResultMessage<AfterSaleApplyVO> applyAfterSaleInfo(@PathVariable String sn) {
return ResultUtil.data(afterSaleService.getAfterSaleVO(sn));
}
@PreventDuplicateSubmissions
@PostMapping(value = "/save/{orderItemSn}")
@ApiImplicitParam(name = "orderItemSn", value = "订单货物编号", required = true, paramType = "query")
@ApiOperation(value = "申请售后")
public ResultMessage<AfterSale> save(AfterSaleDTO afterSaleDTO) {
return ResultUtil.data(afterSaleService.saveAfterSale(afterSaleDTO));
}
@ApiOperation(value = "买家 退回 物流信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "logisticsNo", value = "发货单号", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "logisticsId", value = "物流公司id", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "mDeliverTime", value = "买家发货时间", required = true, dataType = "date", paramType = "query")
})
@PostMapping(value = "/delivery/{afterSaleSn}")
public ResultMessage<AfterSale> delivery(@NotNull(message = "售后编号不能为空") @PathVariable("afterSaleSn") String afterSaleSn,
@NotNull(message = "发货单号不能为空") @RequestParam String logisticsNo,
@NotNull(message = "请选择物流公司") @RequestParam String logisticsId,
@NotNull(message = "请选择发货时间") @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date mDeliverTime) {
return ResultUtil.data(afterSaleService.buyerDelivery(afterSaleSn, logisticsNo, logisticsId, mDeliverTime));
}
@PreventDuplicateSubmissions
@ApiOperation(value = "售后,取消售后")
@ApiImplicitParams({
@ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, dataType = "String", paramType = "path")
})
@PostMapping(value = "/cancel/{afterSaleSn}")
public ResultMessage<AfterSale> cancel(@NotNull(message = "参数非法") @PathVariable("afterSaleSn") String afterSaleSn) {
return ResultUtil.data(afterSaleService.cancel(afterSaleSn));
}
@ApiOperation(value = "获取商家售后收件地址")
@ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path")
@GetMapping(value = "/getStoreAfterSaleAddress/{sn}")
public ResultMessage<StoreAfterSaleAddressDTO> getStoreAfterSaleAddress(@NotNull(message = "售后单号") @PathVariable("sn") String sn) {
return ResultUtil.data(afterSaleService.getStoreAfterSaleAddressDTO(sn));
}
@ApiOperation(value = "获取售后原因")
@ApiImplicitParam(name = "serviceType", value = "售后类型", required = true, paramType = "path", allowableValues = "CANCEL,RETURN_GOODS,RETURN_MONEY,COMPLAIN")
@GetMapping(value = "/get/afterSaleReason/{serviceType}")
public ResultMessage<List<AfterSaleReason>> getAfterSaleReason(@PathVariable String serviceType) {
return ResultUtil.data(afterSaleReasonService.afterSaleReasonList(serviceType));
}
@ApiOperation(value = "获取售后日志")
@ApiImplicitParam(name = "sn", value = "售后编号", required = true, paramType = "path")
@GetMapping(value = "/get/getAfterSaleLog/{sn}")
public ResultMessage<List<AfterSaleLog>> getAfterSaleLog(@PathVariable String sn) {
return ResultUtil.data(afterSaleLogService.getAfterSaleLog(sn));
}
}

View File

@@ -0,0 +1,254 @@
package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
import cn.lili.modules.order.cart.entity.vo.TradeParams;
import cn.lili.modules.order.cart.service.CartService;
import cn.lili.modules.order.order.entity.vo.ReceiptVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* 买家端,购物车接口
*
* @author Chopper
* @since 2020/11/16 10:04 下午
*/
@Slf4j
@RestController
@Api(tags = "买家端,购物车接口")
@RequestMapping("/buyer/trade/carts")
public class CartController {
/**
* 购物车
*/
@Autowired
private CartService cartService;
@ApiOperation(value = "向购物车中添加一个产品")
@PostMapping
@ApiImplicitParams({
@ApiImplicitParam(name = "skuId", value = "产品ID", required = true, dataType = "Long", paramType = "query"),
@ApiImplicitParam(name = "num", value = "此产品的购买数量", required = true, dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "cartType", value = "购物车类型,默认加入购物车", paramType = "query")
})
public ResultMessage<Object> add(@NotNull(message = "产品id不能为空") String skuId,
@NotNull(message = "购买数量不能为空") @Min(value = 1, message = "加入购物车数量必须大于0") Integer num,
String cartType) {
try {
//读取选中的列表
cartService.add(skuId, num, cartType, false);
return ResultUtil.success();
} catch (ServiceException se) {
log.info(se.getMsg(), se);
throw se;
} catch (Exception e) {
log.error(ResultCode.CART_ERROR.message(), e);
throw new ServiceException(ResultCode.CART_ERROR);
}
}
@ApiOperation(value = "获取购物车页面购物车详情")
@GetMapping("/all")
public ResultMessage<TradeDTO> cartAll() {
return ResultUtil.data(this.cartService.getAllTradeDTO());
}
@ApiOperation(value = "获取购物车数量")
@GetMapping("/count")
public ResultMessage<Long> cartCount(@RequestParam(required = false) Boolean checked) {
return ResultUtil.data(this.cartService.getCartNum(checked));
}
@ApiOperation(value = "获取购物车可用优惠券数量")
@GetMapping("/coupon/num")
@ApiImplicitParams({
@ApiImplicitParam(name = "way", value = "购物车购买CART/立即购买BUY_NOW/拼团购买PINTUAN / 积分购买POINT ", required = true, paramType = "query")
})
public ResultMessage<Long> cartCouponNum(String way) {
return ResultUtil.data(this.cartService.getCanUseCoupon(CartTypeEnum.valueOf(way)));
}
@ApiOperation(value = "更新购物车中单个产品数量", notes = "更新购物车中的多个产品的数量或选中状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "skuId", value = "产品id数组", required = true, dataType = "Long", paramType = "path"),
@ApiImplicitParam(name = "num", value = "产品数量", dataType = "int", paramType = "query"),
})
@PostMapping(value = "/sku/num/{skuId}")
public ResultMessage<Object> update(@NotNull(message = "产品id不能为空") @PathVariable(name = "skuId") String skuId,
Integer num) {
cartService.add(skuId, num, CartTypeEnum.CART.name(), true);
return ResultUtil.success();
}
@ApiOperation(value = "更新购物车中单个产品", notes = "更新购物车中的多个产品的数量或选中状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "skuId", value = "产品id数组", required = true, dataType = "Long", paramType = "path")
})
@PostMapping(value = "/sku/checked/{skuId}")
public ResultMessage<Object> updateChecked(@NotNull(message = "产品id不能为空") @PathVariable(name = "skuId") String skuId,
boolean checked) {
cartService.checked(skuId, checked);
return ResultUtil.success();
}
@ApiOperation(value = "购物车选中设置")
@PostMapping(value = "/sku/checked", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultMessage<Object> updateAll(boolean checked) {
cartService.checkedAll(checked);
return ResultUtil.success();
}
@ApiOperation(value = "批量设置某商家的商品为选中或不选中")
@ApiImplicitParams({
@ApiImplicitParam(name = "storeId", value = "卖家id", required = true, dataType = "Long", paramType = "path"),
@ApiImplicitParam(name = "checked", value = "是否选中", required = true, dataType = "int", paramType = "query", allowableValues = "0,1")
})
@ResponseBody
@PostMapping(value = "/store/{storeId}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultMessage<Object> updateStoreAll(@NotNull(message = "卖家id不能为空") @PathVariable(name = "storeId") String storeId, boolean checked) {
cartService.checkedStore(storeId, checked);
return ResultUtil.success();
}
@ApiOperation(value = "清空购物车")
@DeleteMapping()
public ResultMessage<Object> clean() {
cartService.clean();
return ResultUtil.success();
}
@ApiOperation(value = "删除购物车中的一个或多个产品")
@ApiImplicitParams({
@ApiImplicitParam(name = "skuIds", value = "产品id", required = true, dataType = "Long", paramType = "path", allowMultiple = true)
})
@DeleteMapping(value = "/sku/remove")
public ResultMessage<Object> delete(String[] skuIds) {
cartService.delete(skuIds);
return ResultUtil.success();
}
@ApiOperation(value = "获取结算页面购物车详情")
@ApiImplicitParams({
@ApiImplicitParam(name = "way", value = "购物车购买CART/立即购买BUY_NOW/拼团购买PINTUAN / 积分购买POINT ", required = true, paramType = "query")
})
@GetMapping("/checked")
public ResultMessage<TradeDTO> cartChecked(@NotNull(message = "读取选中列表") String way) {
try {
//读取选中的列表
return ResultUtil.data(this.cartService.getCheckedTradeDTO(CartTypeEnum.valueOf(way)));
} catch (ServiceException se) {
log.error(se.getMsg(), se);
throw se;
} catch (Exception e) {
log.error(ResultCode.CART_ERROR.message(), e);
throw new ServiceException(ResultCode.CART_ERROR);
}
}
@ApiOperation(value = "选择收货地址")
@ApiImplicitParams({
@ApiImplicitParam(name = "shippingAddressId", value = "收货地址id ", required = true, paramType = "query"),
@ApiImplicitParam(name = "way", value = "购物车类型 ", paramType = "query")
})
@GetMapping("/shippingAddress")
public ResultMessage<Object> shippingAddress(@NotNull(message = "收货地址ID不能为空") String shippingAddressId,
String way) {
try {
cartService.shippingAddress(shippingAddressId, way);
return ResultUtil.success();
} catch (ServiceException se) {
log.error(ResultCode.SHIPPING_NOT_APPLY.message(), se);
throw new ServiceException(ResultCode.SHIPPING_NOT_APPLY);
} catch (Exception e) {
log.error(ResultCode.CART_ERROR.message(), e);
throw new ServiceException(ResultCode.CART_ERROR);
}
}
@ApiOperation(value = "选择配送方式")
@ApiImplicitParams({
@ApiImplicitParam(name = "shippingMethod", value = "配送方式SELF_PICK_UP(自提)," +
"LOCAL_TOWN_DELIVERY(同城配送)," +
"LOGISTICS(物流) ", required = true, paramType = "query"),
@ApiImplicitParam(name = "selleId", value = "店铺id", paramType = "query"),
@ApiImplicitParam(name = "way", value = "购物车类型 ", paramType = "query")
})
@GetMapping("/shippingMethod")
public ResultMessage<Object> shippingMethod(@NotNull(message = "配送方式不能为空") String shippingMethod,
String selleId,
String way) {
try {
cartService.shippingMethod(selleId, shippingMethod, way);
return ResultUtil.success();
} catch (ServiceException se) {
log.error(se.getMsg(), se);
throw se;
} catch (Exception e) {
log.error(ResultCode.CART_ERROR.message(), e);
throw new ServiceException(ResultCode.CART_ERROR);
}
}
@ApiOperation(value = "选择发票")
@ApiImplicitParams({
@ApiImplicitParam(name = "way", value = "购物车购买CART/立即购买BUY_NOW/拼团购买PINTUAN / 积分购买POINT ", required = true, paramType = "query"),
})
@GetMapping("/select/receipt")
public ResultMessage<Object> selectReceipt(String way, ReceiptVO receiptVO) {
this.cartService.shippingReceipt(receiptVO, way);
return ResultUtil.success();
}
@ApiOperation(value = "选择优惠券")
@ApiImplicitParams({
@ApiImplicitParam(name = "way", value = "购物车购买CART/立即购买BUY_NOW/拼团购买PINTUAN / 积分购买POINT ", required = true, paramType = "query"),
@ApiImplicitParam(name = "memberCouponId", value = "优惠券id ", required = true, paramType = "query"),
@ApiImplicitParam(name = "used", value = "使用true 弃用false ", required = true, paramType = "query")
})
@GetMapping("/select/coupon")
public ResultMessage<Object> selectCoupon(String way, @NotNull(message = "优惠券id不能为空") String memberCouponId, boolean used) {
this.cartService.selectCoupon(memberCouponId, way, used);
return ResultUtil.success();
}
@PreventDuplicateSubmissions
@ApiOperation(value = "创建交易")
@PostMapping(value = "/create/trade", consumes = "application/json", produces = "application/json")
public ResultMessage<Object> crateTrade(@RequestBody TradeParams tradeParams) {
try {
//读取选中的列表
return ResultUtil.data(this.cartService.createTrade(tradeParams));
} catch (ServiceException se) {
log.info(se.getMsg(), se);
throw se;
} catch (Exception e) {
log.error(ResultCode.ORDER_ERROR.message(), e);
throw e;
}
}
}

View File

@@ -0,0 +1,132 @@
package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dto.OrderSearchParams;
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
import cn.lili.modules.order.order.entity.vo.OrderSimpleVO;
import cn.lili.modules.order.order.service.OrderService;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Objects;
/**
* 买家端,订单接口
*
* @author Chopper
* @since 2020/11/16 10:08 下午
*/
@RestController
@Api(tags = "买家端,订单接口")
@RequestMapping("/buyer/orders")
public class OrderBuyerController {
/**
* 订单
*/
@Autowired
private OrderService orderService;
@ApiOperation(value = "查询会员订单列表")
@GetMapping
public ResultMessage<IPage<OrderSimpleVO>> queryMineOrder(OrderSearchParams orderSearchParams) {
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
orderSearchParams.setMemberId(currentUser.getId());
return ResultUtil.data(orderService.queryByParams(orderSearchParams));
}
@ApiOperation(value = "订单明细")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, paramType = "path")
})
@GetMapping(value = "/{orderSn}")
public ResultMessage<OrderDetailVO> detail(@NotNull(message = "订单编号不能为空") @PathVariable("orderSn") String orderSn) {
OrderDetailVO orderDetailVO = orderService.queryDetail(orderSn);
OperationalJudgment.judgment(orderDetailVO.getOrder());
return ResultUtil.data(orderDetailVO);
}
@PreventDuplicateSubmissions
@ApiOperation(value = "确认收货")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, paramType = "path")
})
@PostMapping(value = "/{orderSn}/receiving")
public ResultMessage<Object> receiving(@NotNull(message = "订单编号不能为空") @PathVariable("orderSn") String orderSn) {
Order order = orderService.getBySn(orderSn);
if (order == null) {
throw new ServiceException(ResultCode.ORDER_NOT_EXIST);
}
//判定是否是待收货状态
if (!order.getOrderStatus().equals(OrderStatusEnum.DELIVERED.name())) {
throw new ServiceException(ResultCode.ORDER_DELIVERED_ERROR);
}
orderService.complete(orderSn);
return ResultUtil.success();
}
@PreventDuplicateSubmissions
@ApiOperation(value = "取消订单")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "reason", value = "取消原因", required = true, dataType = "String", paramType = "query")
})
@PostMapping(value = "/{orderSn}/cancel")
public ResultMessage<Object> cancel(@ApiIgnore @PathVariable String orderSn, @RequestParam String reason) {
orderService.cancel(orderSn, reason);
return ResultUtil.success();
}
@PreventDuplicateSubmissions
@ApiOperation(value = "删除订单")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path")
})
@DeleteMapping(value = "/{orderSn}")
public ResultMessage<Object> deleteOrder(@PathVariable String orderSn) {
OperationalJudgment.judgment(orderService.getBySn(orderSn));
orderService.deleteOrder(orderSn);
return ResultUtil.success();
}
@ApiOperation(value = "查询物流踪迹")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path")
})
@PostMapping(value = "/getTraces/{orderSn}")
public ResultMessage<Object> getTraces(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) {
OperationalJudgment.judgment(orderService.getBySn(orderSn));
return ResultUtil.data(orderService.getTraces(orderSn));
}
@PreventDuplicateSubmissions
@ApiOperation(value = "开票")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path")
})
@PostMapping(value = "/receipt/{orderSn}")
public ResultMessage<Object> invoice(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) {
OperationalJudgment.judgment(orderService.getBySn(orderSn));
return ResultUtil.data(orderService.invoice(orderSn));
}
}

View File

@@ -0,0 +1,100 @@
package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.order.order.entity.dos.OrderComplaint;
import cn.lili.modules.order.order.entity.dto.OrderComplaintDTO;
import cn.lili.modules.order.order.entity.enums.CommunicationOwnerEnum;
import cn.lili.modules.order.order.entity.vo.OrderComplaintCommunicationVO;
import cn.lili.modules.order.order.entity.vo.OrderComplaintSearchParams;
import cn.lili.modules.order.order.entity.vo.OrderComplaintVO;
import cn.lili.modules.order.order.service.OrderComplaintCommunicationService;
import cn.lili.modules.order.order.service.OrderComplaintService;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Objects;
/**
* 买家端,交易投诉接口
*
* @author paulG
* @since 2020/12/7
**/
@RestController
@Api(tags = "买家端,交易投诉接口")
@RequestMapping("/buyer/complain")
public class OrderComplaintBuyerController {
/**
* 交易投诉
*/
@Autowired
private OrderComplaintService orderComplaintService;
/**
* 交易投诉沟通
*/
@Autowired
private OrderComplaintCommunicationService orderComplaintCommunicationService;
@ApiOperation(value = "通过id获取")
@ApiImplicitParam(name = "id", value = "投诉单ID", required = true, paramType = "path")
@GetMapping(value = "/{id}")
public ResultMessage<OrderComplaintVO> get(@PathVariable String id) {
OrderComplaintVO orderComplaintVO = OperationalJudgment.judgment(orderComplaintService.getOrderComplainById(id));
return ResultUtil.data(orderComplaintVO);
}
@ApiOperation(value = "分页获取")
@GetMapping
public ResultMessage<IPage<OrderComplaint>> get(OrderComplaintSearchParams searchParams, PageVO pageVO) {
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
searchParams.setMemberId(currentUser.getId());
return ResultUtil.data(orderComplaintService.getOrderComplainByPage(searchParams, pageVO));
}
@PreventDuplicateSubmissions
@ApiOperation(value = "添加交易投诉")
@PostMapping
public ResultMessage<OrderComplaint> add(@Valid OrderComplaintDTO orderComplaintDTO) {
return ResultUtil.data(orderComplaintService.addOrderComplain(orderComplaintDTO));
}
@ApiOperation(value = "添加交易投诉对话")
@ApiImplicitParams({
@ApiImplicitParam(name = "complainId", value = "投诉单ID", required = true, paramType = "query"),
@ApiImplicitParam(name = "content", value = "内容", required = true, paramType = "query")
})
@PostMapping("/communication")
public ResultMessage<OrderComplaintCommunicationVO> addCommunication(@RequestParam String complainId, @RequestParam String content) {
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
OrderComplaintCommunicationVO communicationVO = new OrderComplaintCommunicationVO(complainId, content, CommunicationOwnerEnum.BUYER.name(), currentUser.getId(), currentUser.getNickName());
orderComplaintCommunicationService.addCommunication(communicationVO);
return ResultUtil.data(communicationVO);
}
@PreventDuplicateSubmissions
@ApiOperation(value = "取消售后")
@ApiImplicitParam(name = "id", value = "投诉单ID", required = true, paramType = "path")
@PutMapping(value = "/status/{id}")
public ResultMessage<Object> cancel(@PathVariable String id) {
orderComplaintService.cancel(id);
return ResultUtil.success();
}
}

View File

@@ -0,0 +1,52 @@
package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.order.order.entity.dos.Receipt;
import cn.lili.modules.order.order.entity.dto.OrderReceiptDTO;
import cn.lili.modules.order.order.entity.dto.ReceiptSearchParams;
import cn.lili.modules.order.order.service.ReceiptService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* 买家端,发票接口
*
* @author paulG
* @since 2021/1/12
**/
@RestController
@Api(tags = "买家端,发票接口")
@RequestMapping("/buyer/trade/receipt")
public class ReceiptBuyerController {
@Autowired
private ReceiptService receiptService;
@ApiOperation(value = "获取发票详情")
@GetMapping("/{id}")
public ResultMessage<Receipt> getDetail(@PathVariable String id) {
return ResultUtil.data(this.receiptService.getDetail(id));
}
@ApiOperation(value = "获取发票分页信息")
@GetMapping
public ResultMessage<IPage<OrderReceiptDTO>> getPage(ReceiptSearchParams searchParams, PageVO pageVO) {
return ResultUtil.data(this.receiptService.getReceiptData(searchParams, pageVO));
}
@PreventDuplicateSubmissions
@ApiOperation(value = "保存发票信息")
@PostMapping
public ResultMessage<Receipt> save(@Valid Receipt receipt) {
return ResultUtil.data(receiptService.saveReceipt(receipt));
}
}

View File

@@ -0,0 +1,46 @@
package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.wallet.entity.dos.Recharge;
import cn.lili.modules.wallet.service.RechargeService;
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.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
/**
* 买家端,预存款充值记录接口
*
* @author paulG
* @since 2020/11/16 10:07 下午
*/
@RestController
@Api(tags = "买家端,预存款充值记录接口")
@RequestMapping("/buyer/trade/recharge")
public class RechargeTradeBuyerController {
@Autowired
private RechargeService rechargeService;
@PreventDuplicateSubmissions
@PostMapping
@ApiOperation(value = "创建余额充值订单")
@ApiImplicitParams({
@ApiImplicitParam(name = "price", value = "充值金额", required = true, dataType = "double", paramType = "query")
})
public ResultMessage<Recharge> create(@Max(value = 10000, message = "充值金额单次最多允许充值10000元") @Min(value = 1, message = "充值金额单次最少充值金额为1元") Double price) {
Recharge recharge = this.rechargeService.recharge(price);
return ResultUtil.data(recharge);
}
}

View File

@@ -0,0 +1,50 @@
package cn.lili.controller.other;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.system.entity.dos.AppVersion;
import cn.lili.modules.system.service.AppVersionService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,APP版本
*
* @author Bulbasaur
* @since 2021/5/21 11:15 上午
*/
@RestController
@Api(tags = "买家端,APP版本")
@RequestMapping("/buyer/appVersion")
public class AppVersionBuyerController {
@Autowired
private AppVersionService appVersionService;
@ApiOperation(value = "获取版本号")
@ApiImplicitParam(name = "appType", value = "app类型", required = true, paramType = "path")
@GetMapping("/{appType}")
public ResultMessage<Object> getAppVersion(@PathVariable String appType) {
return ResultUtil.data(appVersionService.getAppVersion(appType));
}
@ApiOperation(value = "获取版本号列表")
@ApiImplicitParam(name = "appType", value = "app类型", required = true, paramType = "path")
@GetMapping("/appVersion/{appType}")
public ResultMessage<IPage<AppVersion>> appVersion(@PathVariable String appType, PageVO pageVO) {
IPage<AppVersion> page = appVersionService.page(PageUtil.initPage(pageVO), new LambdaQueryWrapper<AppVersion>().eq(AppVersion::getType, appType));
return ResultUtil.data(page);
}
}

View File

@@ -0,0 +1,72 @@
package cn.lili.controller.other;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.page.entity.dos.Article;
import cn.lili.modules.page.entity.dto.ArticleSearchParams;
import cn.lili.modules.page.entity.vos.ArticleCategoryVO;
import cn.lili.modules.page.entity.vos.ArticleVO;
import cn.lili.modules.page.service.ArticleCategoryService;
import cn.lili.modules.page.service.ArticleService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 买家端,文章接口
*
* @author Chopper
* @since 2020/11/16 10:02 下午
*/
@RestController
@Api(tags = "买家端,文章接口")
@RequestMapping("/buyer/article")
public class ArticleBuyerController {
/**
* 文章
*/
@Autowired
private ArticleService articleService;
/**
* 文章分类
*/
@Autowired
private ArticleCategoryService articleCategoryService;
@ApiOperation(value = "获取文章分类列表")
@GetMapping(value = "/articleCategory/list")
public ResultMessage<List<ArticleCategoryVO>> getArticleCategoryList() {
return ResultUtil.data(articleCategoryService.allChildren());
}
@ApiOperation(value = "分页获取")
@GetMapping
public ResultMessage<IPage<ArticleVO>> getByPage(ArticleSearchParams articleSearchParams) {
return ResultUtil.data(articleService.articlePage(articleSearchParams));
}
@ApiOperation(value = "通过id获取文章")
@ApiImplicitParam(name = "id", value = "文章ID", required = true, paramType = "path")
@GetMapping(value = "/get/{id}")
public ResultMessage<Article> get(@NotNull(message = "文章ID") @PathVariable("id") String id) {
return ResultUtil.data(articleService.customGet(id));
}
@ApiOperation(value = "通过类型获取文章")
@ApiImplicitParam(name = "type", value = "文章类型", required = true, paramType = "path")
@GetMapping(value = "/type/{type}")
public ResultMessage<Article> getByType(@NotNull(message = "文章类型") @PathVariable("type") String type) {
return ResultUtil.data(articleService.customGetByType(type));
}
}

View File

@@ -0,0 +1,44 @@
package cn.lili.controller.other;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.page.entity.dos.Feedback;
import cn.lili.modules.page.service.FeedbackService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* 买家端,意见反馈接口
*
* @author Bulbasaur
* @since 2020-05-5 15:10:16
*/
@RestController
@Api(tags = "买家端,意见反馈接口")
@RequestMapping("/buyer/feedback")
public class FeedbackBuyerController {
/**
* 意见反馈
*/
@Autowired
private FeedbackService feedbackService;
@PreventDuplicateSubmissions
@ApiOperation(value = "添加意见反馈")
@PostMapping()
public ResultMessage<Object> save(@Valid Feedback feedback) {
feedback.setUserName(UserContext.getCurrentUser().getNickName());
feedbackService.save(feedback);
return ResultUtil.success();
}
}

View File

@@ -0,0 +1,37 @@
package cn.lili.controller.other;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.system.entity.dos.Logistics;
import cn.lili.modules.system.service.LogisticsService;
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 java.util.List;
/**
* 买家端,物流公司接口
*
* @author Bulbasaur
* @since 2020-05-5 15:10:16
*/
@RestController
@Api(tags = "买家端,物流公司接口")
@RequestMapping("/buyer/logistics")
public class LogisticsBuyerController {
@Autowired
private LogisticsService logisticsService;
@ApiOperation(value = "分页获取物流公司")
@GetMapping
public ResultMessage<List<Logistics>> getByPage() {
return ResultUtil.data(logisticsService.getOpenLogistics());
}
}

View File

@@ -0,0 +1,47 @@
package cn.lili.controller.other;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.page.entity.dto.PageDataDTO;
import cn.lili.modules.page.entity.enums.PageEnum;
import cn.lili.modules.page.entity.vos.PageDataVO;
import cn.lili.modules.page.service.PageDataService;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,页面接口
*
* @author Chopper
* @since 2020/11/16 10:08 下午
*/
@RestController
@Api(tags = "买家端,页面接口")
@RequestMapping("/buyer/pageData")
public class PageBuyerController {
/**
* 页面管理
*/
@Autowired
private PageDataService pageService;
@ApiOperation(value = "获取首页数据")
@GetMapping("/getIndex")
public ResultMessage<PageDataVO> getIndex(@RequestParam String clientType) {
PageDataDTO pageDataDTO = new PageDataDTO(PageEnum.INDEX.name());
pageDataDTO.setPageClientType(clientType);
return ResultUtil.data(pageService.getPageData(pageDataDTO));
}
@ApiOperation(value = "获取页面数据")
@GetMapping
public ResultMessage<PageDataVO> get(PageDataDTO pageDataDTO) {
return ResultUtil.data(pageService.getPageData(pageDataDTO));
}
}

View File

@@ -0,0 +1,48 @@
package cn.lili.controller.other.broadcast;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.goods.entity.dos.Studio;
import cn.lili.modules.goods.service.StudioService;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,直播间接口
*
* @author Bulbasaur
* @since 2021/5/20 12:03 下午
*/
@RestController
@Api(tags = "买家端,直播间接口")
@RequestMapping("/buyer/broadcast/studio")
public class StudioController {
@Autowired
private StudioService studioService;
@ApiOperation(value = "获取店铺直播间列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "recommend", value = "是否推荐", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "status", value = "直播间状态", paramType = "query", dataType = "String")
})
@GetMapping
public ResultMessage<IPage<Studio>> page(PageVO pageVO, Integer recommend, String status) {
return ResultUtil.data(studioService.studioList(pageVO, recommend, status));
}
@ApiOperation(value = "获取店铺直播间回放地址")
@GetMapping("/getLiveInfo/{roomId}")
public ResultMessage<Object> getLiveInfo(Integer roomId) {
return ResultUtil.data(studioService.getLiveInfo(roomId));
}
}

View File

@@ -0,0 +1,89 @@
package cn.lili.controller.other.purchase;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.goods.entity.dos.GoodsUnit;
import cn.lili.modules.goods.service.GoodsUnitService;
import cn.lili.modules.purchase.entity.dos.PurchaseOrder;
import cn.lili.modules.purchase.entity.params.PurchaseOrderSearchParams;
import cn.lili.modules.purchase.entity.vos.PurchaseOrderVO;
import cn.lili.modules.purchase.service.PurchaseOrderService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
/**
* 买家端,采购接口
*
* @author Chopper
* @since 2020/11/16 10:06 下午
*/
@Api(tags = "买家端,采购接口")
@RestController
@RequestMapping("/buyer/purchase")
public class PurchaseBuyerController {
/**
* 采购单
*/
@Autowired
private PurchaseOrderService purchaseOrderService;
@Autowired
private GoodsUnitService goodsUnitService;
@ApiOperation(value = "分页获取商品计量单位")
@GetMapping("/goodsUnit")
public ResultMessage<IPage<GoodsUnit>> goodsUnitPage(PageVO pageVO) {
return ResultUtil.data(goodsUnitService.page(PageUtil.initPage(pageVO)));
}
@PreventDuplicateSubmissions
@ApiOperation(value = "添加采购单")
@PostMapping
public ResultMessage<PurchaseOrderVO> addPurchaseOrderVO(@RequestBody PurchaseOrderVO purchaseOrderVO) {
return ResultUtil.data(purchaseOrderService.addPurchaseOrder(purchaseOrderVO));
}
@ApiOperation(value = "采购单分页")
@GetMapping
public ResultMessage<IPage<PurchaseOrder>> get(PurchaseOrderSearchParams purchaseOrderSearchParams) {
return ResultUtil.data(purchaseOrderService.page(purchaseOrderSearchParams));
}
@ApiOperation(value = "采购单详情")
@ApiImplicitParam(name = "id", value = "采购单ID", required = true, dataType = "Long", paramType = "path")
@GetMapping("/{id}")
public ResultMessage<PurchaseOrderVO> getPurchaseOrder(@NotNull @PathVariable String id) {
return ResultUtil.data(purchaseOrderService.getPurchaseOrder(id));
}
@ApiOperation(value = "会员采购单分页")
@GetMapping("/getByMember")
public ResultMessage<IPage<PurchaseOrder>> getByMember(PurchaseOrderSearchParams purchaseOrderSearchParams) {
purchaseOrderSearchParams.setMemberId(UserContext.getCurrentUser().getId());
return ResultUtil.data(purchaseOrderService.page(purchaseOrderSearchParams));
}
@PreventDuplicateSubmissions
@ApiOperation(value = "关闭采购单")
@ApiImplicitParam(name = "id", value = "采购单ID", required = true, dataType = "Long", paramType = "path")
@PutMapping("/{id}")
public ResultMessage<Object> close(@NotNull @PathVariable String id) {
purchaseOrderService.close(id);
return ResultUtil.success(ResultCode.SUCCESS);
}
}

View File

@@ -0,0 +1,69 @@
package cn.lili.controller.other.purchase;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.purchase.entity.dos.PurchaseOrder;
import cn.lili.modules.purchase.entity.dos.PurchaseQuoted;
import cn.lili.modules.purchase.entity.vos.PurchaseQuotedVO;
import cn.lili.modules.purchase.service.PurchaseOrderService;
import cn.lili.modules.purchase.service.PurchaseQuotedService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 买家端,采购报价接口
*
* @author Bulbasaur
* @since 2020/11/16 10:06 下午
*/
@Api(tags = "买家端,采购报价接口")
@RestController
@RequestMapping("/buyer/purchaseQuoted")
public class PurchaseQuotedController {
/**
* 采购单报价
*/
@Autowired
private PurchaseQuotedService purchaseQuotedService;
/**
* 采购单
*/
@Autowired
private PurchaseOrderService purchaseOrderService;
@ApiOperation(value = "添加采购单报价")
@PostMapping
public ResultMessage<PurchaseQuoted> addPurchaseOrderVO(@RequestBody PurchaseQuotedVO purchaseQuotedVO) {
PurchaseOrder purchaseOrder=purchaseOrderService.getById(purchaseQuotedVO.getPurchaseOrderId());
if(DateUtil.compare(purchaseOrder.getDeadline(),new DateTime())< 0){
ResultUtil.error(ResultCode.PURCHASE_ORDER_DEADLINE_ERROR);
}
return ResultUtil.data(purchaseQuotedService.addPurchaseQuoted(purchaseQuotedVO));
}
@ApiOperation(value = "报价列表")
@ApiImplicitParam(name = "purchaseOrderId", value = "报价单ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/purchaseOrder/{purchaseOrderId}")
public ResultMessage<List<PurchaseQuoted>> get(@NotNull @PathVariable String purchaseOrderId) {
return ResultUtil.data(purchaseQuotedService.getByPurchaseOrderId(purchaseOrderId));
}
@ApiOperation(value = "报价单详情")
@ApiImplicitParam(name = "id", value = "报价单ID", required = true, dataType = "String", paramType = "path")
@GetMapping(value = "purchaseQuoted/{id}")
public ResultMessage<PurchaseQuotedVO> getPurchaseQuoted(@NotNull @PathVariable String id) {
return ResultUtil.data(purchaseQuotedService.getById(id));
}
}

View File

@@ -0,0 +1,162 @@
package cn.lili.controller.passport;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.MemberEditDTO;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.sms.SmsUtil;
import cn.lili.modules.verification.entity.enums.VerificationEnums;
import cn.lili.modules.verification.service.VerificationService;
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.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
/**
* 买家端,会员接口
*
* @author Chopper
* @since 2020/11/16 10:07 下午
*/
@RestController
@Api(tags = "买家端,会员接口")
@RequestMapping("/buyer/members")
public class MemberBuyerController {
@Autowired
private MemberService memberService;
@Autowired
private SmsUtil smsUtil;
@Autowired
private VerificationService verificationService;
@ApiOperation(value = "登录接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "username", value = "用户名", required = true, paramType = "query"),
@ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query")
})
@PostMapping("/userLogin")
public ResultMessage<Object> userLogin(@NotNull(message = "用户名不能为空") @RequestParam String username,
@NotNull(message = "密码不能为空") @RequestParam String password,
@RequestHeader String uuid) {
verificationService.check(uuid, VerificationEnums.LOGIN);
return ResultUtil.data(this.memberService.usernameLogin(username, password));
}
@ApiOperation(value = "注销接口")
@PostMapping("/logout")
public ResultMessage<Object> logout() {
this.memberService.logout(UserEnums.MEMBER);
return ResultUtil.success();
}
@ApiOperation(value = "短信登录接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "query"),
@ApiImplicitParam(name = "code", value = "验证码", required = true, paramType = "query")
})
@PostMapping("/smsLogin")
public ResultMessage<Object> smsLogin(@NotNull(message = "手机号为空") @RequestParam String mobile,
@NotNull(message = "验证码为空") @RequestParam String code,
@RequestHeader String uuid) {
if (smsUtil.verifyCode(mobile, VerificationEnums.LOGIN, uuid, code)) {
return ResultUtil.data(memberService.mobilePhoneLogin(mobile));
} else {
throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR);
}
}
@ApiOperation(value = "注册用户")
@ApiImplicitParams({
@ApiImplicitParam(name = "username", value = "用户名", required = true, paramType = "query"),
@ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query"),
@ApiImplicitParam(name = "mobilePhone", value = "手机号", required = true, paramType = "query"),
@ApiImplicitParam(name = "code", value = "验证码", required = true, paramType = "query")
})
@PostMapping("/register")
public ResultMessage<Object> register(@NotNull(message = "用户名不能为空") @RequestParam String username,
@NotNull(message = "密码不能为空") @RequestParam String password,
@NotNull(message = "手机号为空") @RequestParam String mobilePhone,
@RequestHeader String uuid,
@NotNull(message = "验证码不能为空") @RequestParam String code) {
if (smsUtil.verifyCode(mobilePhone, VerificationEnums.REGISTER, uuid, code)) {
return ResultUtil.data(memberService.register(username, password, mobilePhone));
} else {
throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR);
}
}
@ApiOperation(value = "获取当前登录用户接口")
@GetMapping
public ResultMessage<Member> getUserInfo() {
return ResultUtil.data(memberService.getUserInfo());
}
@ApiOperation(value = "通过短信重置密码")
@ApiImplicitParams({
@ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "query"),
@ApiImplicitParam(name = "password", value = "是否保存登录", required = true, paramType = "query")
})
@PostMapping("/resetByMobile")
public ResultMessage<Member> resetByMobile(@NotNull(message = "手机号为空") @RequestParam String mobile,
@NotNull(message = "验证码为空") @RequestParam String code,
@RequestHeader String uuid) {
//校验短信验证码是否正确
if (smsUtil.verifyCode(mobile, VerificationEnums.FIND_USER, uuid, code)) {
//校验是否通过手机号可获取会员,存在则将会员信息存入缓存有效时间3分钟
memberService.findByMobile(uuid, mobile);
return ResultUtil.success();
} else {
throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR);
}
}
@ApiOperation(value = "修改密码")
@ApiImplicitParams({
@ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "query"),
@ApiImplicitParam(name = "password", value = "是否保存登录", required = true, paramType = "query")
})
@PostMapping("/resetPassword")
public ResultMessage<Object> resetByMobile(@NotNull(message = "密码为空") @RequestParam String password, @RequestHeader String uuid) {
return ResultUtil.data(memberService.resetByMobile(uuid, password));
}
@ApiOperation(value = "修改用户自己资料")
@PutMapping("/editOwn")
public ResultMessage<Member> editOwn(MemberEditDTO memberEditDTO) {
return ResultUtil.data(memberService.editOwn(memberEditDTO));
}
@ApiOperation(value = "修改密码")
@ApiImplicitParams({
@ApiImplicitParam(name = "password", value = "旧密码", required = true, paramType = "query"),
@ApiImplicitParam(name = "newPassword", value = "新密码", required = true, paramType = "query")
})
@PutMapping("/modifyPass")
public ResultMessage<Member> modifyPass(@NotNull(message = "旧密码不能为空") @RequestParam String password,
@NotNull(message = "新密码不能为空") @RequestParam String newPassword) {
return ResultUtil.data(memberService.modifyPass(password, newPassword));
}
@ApiOperation(value = "刷新token")
@GetMapping("/refresh/{refreshToken}")
public ResultMessage<Object> refreshToken(@NotNull(message = "刷新token不能为空") @PathVariable String refreshToken) {
return ResultUtil.data(this.memberService.refreshToken(refreshToken));
}
}

View File

@@ -0,0 +1,55 @@
package cn.lili.controller.passport.connect;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.connect.service.ConnectService;
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.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 买家端,app/小程序 联合登录
*
* @author Chopper
* @since 2020-11-25 19:29
*/
@RestController
@Api(tags = "买家端,app/小程序 联合登录")
@RequestMapping("/buyer/connect/bind")
public class ConnectBuyerBindController {
@Autowired
private ConnectService connectService;
@ApiOperation(value = "unionID 绑定")
@ApiImplicitParams({
@ApiImplicitParam(name = "unionID", value = "unionID", required = true, paramType = "query"),
@ApiImplicitParam(name = "type", value = "type", required = true, paramType = "query")
})
@PostMapping
public void unionIDBind(@RequestParam String unionID, @RequestParam String type) {
connectService.bind(unionID, type);
}
@ApiOperation(value = "unionID 解绑")
@ApiImplicitParam(name = "type", value = "type", required = true, paramType = "query")
@PostMapping("/unbind")
public void unionIDBind(@RequestParam String type) {
connectService.unbind(type);
}
@GetMapping("/list")
@ApiOperation(value = "绑定列表")
public ResultMessage<List<String>> bindList() {
return ResultUtil.data(connectService.bindList());
}
}

View File

@@ -0,0 +1,102 @@
package cn.lili.controller.passport.connect;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.token.Token;
import cn.lili.common.utils.UuidUtils;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.connect.entity.dto.AuthCallback;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.request.AuthRequest;
import cn.lili.modules.connect.service.ConnectService;
import cn.lili.modules.connect.util.ConnectUtil;
import cn.lili.modules.member.service.MemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 买家端,web联合登录
*
* @author Chopper
*/
@Slf4j
@RestController
@Api(tags = "买家端,web联合登录")
@RequestMapping("/buyer/connect")
public class ConnectBuyerWebController {
@Autowired
private ConnectService connectService;
@Autowired
private MemberService memberService;
@Autowired
private ConnectUtil connectUtil;
@GetMapping("/login/web/{type}")
@ApiOperation(value = "WEB信任登录授权")
@ApiImplicitParams({
@ApiImplicitParam(name = "type", value = "登录方式:QQ,微信,微信_PC",
allowableValues = "QQ,WECHAT,WECHAT_PC", paramType = "path")
})
public ResultMessage<String> webAuthorize(@PathVariable String type, HttpServletResponse response) throws IOException {
AuthRequest authRequest = connectUtil.getAuthRequest(type);
String authorizeUrl = authRequest.authorize(UuidUtils.getUUID());
response.sendRedirect(authorizeUrl);
return ResultUtil.data(authorizeUrl);
}
@ApiOperation(value = "信任登录统一回调地址", hidden = true)
@GetMapping("/callback/{type}")
public void callBack(@PathVariable String type, AuthCallback callback, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
connectUtil.callback(type, callback, httpServletRequest, httpServletResponse);
}
@ApiOperation(value = "信任登录响应结果获取")
@GetMapping("/result")
public ResultMessage<Object> callBackResult(String state) {
if (state == null) {
throw new ServiceException(ResultCode.USER_CONNECT_LOGIN_ERROR);
}
return connectUtil.getResult(state);
}
@GetMapping("/register/auto")
@ApiOperation(value = "WEB信任登录授权")
public ResultMessage<Token> webAuthorize() {
Token token = memberService.autoRegister();
return ResultUtil.data(token);
}
@ApiOperation(value = "unionID登录")
@ApiImplicitParams({
@ApiImplicitParam(name = "openId", value = "openid", required = true, paramType = "query"),
@ApiImplicitParam(name = "type", value = "联合类型", required = true,
allowableValues = "WECHAT,QQ,ALIPAY,WEIBO,APPLE", paramType = "query"),
@ApiImplicitParam(name = "uniAccessToken", value = "联合登陆返回的accessToken", required = true, paramType = "query")
})
@GetMapping("/app/login")
public ResultMessage<Token> unionLogin(ConnectAuthUser authUser, @RequestHeader("uuid") String uuid) {
try {
return ResultUtil.data(connectService.appLoginCallback(authUser, uuid));
} catch (Exception e) {
log.error("unionID登录错误", e);
}
return null;
}
}

View File

@@ -0,0 +1,74 @@
package cn.lili.controller.passport.connect;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.token.Token;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.connect.entity.dto.WechatMPLoginParams;
import cn.lili.modules.connect.service.ConnectService;
import cn.lili.modules.message.service.ShortLinkService;
import cn.lili.modules.wechat.entity.dos.WechatMPMessage;
import cn.lili.modules.wechat.service.WechatMPMessageService;
import cn.lili.modules.wechat.util.WechatMpCodeUtil;
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.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 买家端,小程序登录接口
*
* @author Chopper
* @since 2021/2/19 09:28
*/
@RestController
@RequestMapping("/buyer/mini-program")
@Api(tags = "买家端,小程序登录接口")
public class MiniProgramBuyerController {
@Autowired
public ConnectService connectService;
@Autowired
public WechatMpCodeUtil wechatMpCodeUtil;
@SuppressWarnings("AlibabaLowerCamelCaseVariableNaming")
@Autowired
public WechatMPMessageService wechatMPMessageService;
@Autowired
public ShortLinkService shortLinkService;
@GetMapping("/auto-login")
@ApiOperation(value = "小程序自动登录")
public ResultMessage<Token> autoLogin(@RequestHeader String uuid, WechatMPLoginParams params) {
params.setUuid(uuid);
return ResultUtil.data(this.connectService.miniProgramAutoLogin(params));
}
@GetMapping("/subscribeMessage")
@ApiOperation(value = "消息订阅")
public ResultMessage<List<WechatMPMessage>> autoLogin() {
return ResultUtil.data(wechatMPMessageService.list());
}
@GetMapping("/mp/unlimited")
@ApiOperation(value = "小程序二维码生成不限制数量但是限制长度只能存放32为长度")
public ResultMessage<String> unlimited(String page, String scene) {
return ResultUtil.data(wechatMpCodeUtil.createCode(page, scene));
}
@GetMapping("/mp/qrcode")
@ApiOperation(value = "小程序二维码生成:只适用于少量场景多数场景需要unlimited接口实现")
public ResultMessage<String> qrcode(String page) {
return ResultUtil.data(wechatMpCodeUtil.createQrCode(page));
}
@GetMapping("/mp/unlimited/scene")
@ApiOperation(value = "根据shortlink 获取页面参数")
public ResultMessage<String> getScene(String id) {
return ResultUtil.data(shortLinkService.getById(id).getOriginalParams());
}
}

View File

@@ -0,0 +1,105 @@
package cn.lili.controller.payment;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.payment.kit.CashierSupport;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.entity.enums.PaymentClientEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.params.dto.CashierParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 买家端,收银台接口
*
* @author Chopper
* @since 2020-12-18 16:59
*/
@Slf4j
@RestController
@Api(tags = "买家端,收银台接口")
@RequestMapping("/buyer/cashier")
public class CashierController {
@Autowired
private CashierSupport cashierSupport;
@ApiImplicitParams({
@ApiImplicitParam(name = "client", value = "客户端类型", paramType = "path", allowableValues = "PC,H5,WECHAT_MP,APP")
})
@GetMapping(value = "/tradeDetail")
@ApiOperation(value = "获取支付详情")
public ResultMessage paymentParams(@Validated PayParam payParam) {
CashierParam cashierParam = cashierSupport.cashierParam(payParam);
return ResultUtil.data(cashierParam);
}
@ApiImplicitParams({
@ApiImplicitParam(name = "paymentMethod", value = "支付方式", paramType = "path", allowableValues = "WECHAT,ALIPAY"),
@ApiImplicitParam(name = "paymentClient", value = "调起方式", paramType = "path", allowableValues = "APP,NATIVE,JSAPI,H5,MP")
})
@GetMapping(value = "/pay/{paymentMethod}/{paymentClient}")
@ApiOperation(value = "支付")
public ResultMessage payment(
HttpServletRequest request,
HttpServletResponse response,
@PathVariable String paymentMethod,
@PathVariable String paymentClient,
@Validated PayParam payParam) {
PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
PaymentClientEnum paymentClientEnum = PaymentClientEnum.valueOf(paymentClient);
try {
return cashierSupport.payment(paymentMethodEnum, paymentClientEnum, request, response, payParam);
} catch (ServiceException se) {
log.info("支付异常", se);
throw se;
} catch (Exception e) {
log.error("收银台支付错误", e);
}
return null;
}
@ApiOperation(value = "支付回调")
@RequestMapping(value = "/callback/{paymentMethod}", method = {RequestMethod.GET, RequestMethod.POST})
public ResultMessage<Object> callback(HttpServletRequest request, @PathVariable String paymentMethod) {
PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
cashierSupport.callback(paymentMethodEnum, request);
return ResultUtil.success(ResultCode.PAY_SUCCESS);
}
@ApiOperation(value = "支付异步通知")
@RequestMapping(value = "/notify/{paymentMethod}", method = {RequestMethod.GET, RequestMethod.POST})
public void notify(HttpServletRequest request, @PathVariable String paymentMethod) {
PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
cashierSupport.notify(paymentMethodEnum, request);
}
@ApiOperation(value = "查询支付结果")
@GetMapping(value = "/result")
public ResultMessage<Boolean> paymentResult(PayParam payParam) {
return ResultUtil.data(cashierSupport.paymentResult(payParam));
}
}

View File

@@ -0,0 +1,36 @@
package cn.lili.controller.payment;
import cn.lili.modules.payment.kit.RefundSupport;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* 买家端,退款回调
*
* @author Chopper
* @since 2020-12-18 16:59
*/
@Api(tags = "买家端,退款回调")
@RestController
@RequestMapping("/buyer/cashier/refund")
public class CashierRefundController {
@Autowired
private RefundSupport refundSupport;
@ApiOperation(value = "退款通知")
@RequestMapping(value = "/notify/{paymentMethod}", method = {RequestMethod.GET, RequestMethod.POST})
public void notify(HttpServletRequest request, @PathVariable String paymentMethod) {
PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
refundSupport.notify(paymentMethodEnum, request);
}
}

View File

@@ -0,0 +1,107 @@
package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dto.search.CouponSearchParams;
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
import cn.lili.modules.promotion.entity.enums.CouponGetEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponVO;
import cn.lili.modules.promotion.service.CouponService;
import cn.lili.modules.promotion.service.MemberCouponService;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
import java.util.Objects;
/**
* 买家端,买家优惠券接口
*
* @author paulG
* @since 2020/11/17 3:35 下午
*/
@RestController
@Api(tags = "买家端,买家优惠券接口")
@RequestMapping("/buyer/promotion/coupon")
public class CouponBuyerController {
/**
* 优惠券
*/
@Autowired
private CouponService couponService;
/**
* 会员优惠券
*/
@Autowired
private MemberCouponService memberCouponService;
@GetMapping
@ApiOperation(value = "获取可领取优惠券列表")
public ResultMessage<IPage<CouponVO>> getCouponList(CouponSearchParams queryParam, PageVO page) {
queryParam.setPromotionStatus(PromotionsStatusEnum.START.name());
queryParam.setGetType(CouponGetEnum.FREE.name());
IPage<CouponVO> canUseCoupons = couponService.pageVOFindAll(queryParam, page);
return ResultUtil.data(canUseCoupons);
}
@ApiOperation(value = "获取当前会员的优惠券列表")
@GetMapping("/getCoupons")
public ResultMessage<IPage<MemberCoupon>> getCoupons(MemberCouponSearchParams param, PageVO pageVo) {
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
param.setMemberId(currentUser.getId());
return ResultUtil.data(memberCouponService.getMemberCoupons(param, pageVo));
}
@ApiOperation(value = "获取当前会员的对于当前商品可使用的优惠券列表")
@GetMapping("/canUse")
public ResultMessage<IPage<MemberCoupon>> getCouponsByCanUse(MemberCouponSearchParams param, Double totalPrice, PageVO pageVo) {
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
param.setMemberId(currentUser.getId());
return ResultUtil.data(memberCouponService.getMemberCouponsByCanUse(param, totalPrice, pageVo));
}
@ApiOperation(value = "获取当前会员可使用的优惠券数量")
@GetMapping("/getCouponsNum")
public ResultMessage<Object> getMemberCouponsNum() {
return ResultUtil.data(memberCouponService.getMemberCouponsNum());
}
@ApiOperation(value = "会员领取优惠券")
@ApiImplicitParams({
@ApiImplicitParam(name = "couponId", value = "优惠券ID", required = true, dataType = "Long", paramType = "path")
})
@GetMapping("/receive/{couponId}")
public ResultMessage<Object> receiveCoupon(@NotNull(message = "优惠券ID不能为空") @PathVariable("couponId") String couponId) {
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
memberCouponService.receiveBuyerCoupon(couponId, currentUser.getId(), currentUser.getNickName());
return ResultUtil.success();
}
@ApiOperation(value = "通过id获取")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "优惠券ID", required = true, dataType = "Long", paramType = "path")
})
@GetMapping(value = "/get/{id}")
public ResultMessage<MemberCoupon> get(@NotNull(message = "优惠券ID不能为空") @PathVariable("id") String id) {
MemberCoupon memberCoupon = OperationalJudgment.judgment(memberCouponService.getById(id));
return ResultUtil.data(memberCoupon);
}
}

View File

@@ -0,0 +1,113 @@
package cn.lili.controller.promotion;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog;
import cn.lili.modules.promotion.entity.dto.search.KanJiaActivityLogQuery;
import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityGoodsParams;
import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityQuery;
import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO;
import cn.lili.modules.promotion.service.KanjiaActivityGoodsService;
import cn.lili.modules.promotion.service.KanjiaActivityLogService;
import cn.lili.modules.promotion.service.KanjiaActivityService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 买家端,砍价活动商品
*
* @author qiuqiu
* @date 2021/7/12
**/
@RestController
@Api(tags = "买家端,砍价商品接口")
@RequestMapping("/buyer/promotion/kanjiaGoods")
public class KanjiaGoodsActivityBuyerController {
/**
* 砍价活动商品
*/
@Autowired
private KanjiaActivityGoodsService kanJiaActivityGoodsService;
/**
* 帮砍记录
*/
@Autowired
private KanjiaActivityLogService kanJiaActivityLogService;
/**
* 砍价活动
*/
@Autowired
private KanjiaActivityService kanJiaActivityService;
@GetMapping
@ApiOperation(value = "分页获取砍价商品")
public ResultMessage<IPage<KanjiaActivityGoodsListVO>> kanjiaActivityGoodsPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO page) {
// 会员端查询到的肯定是已经开始的活动商品
kanjiaActivityGoodsParams.setPromotionStatus(PromotionsStatusEnum.START.name());
// kanjiaActivityGoodsParams.setStartTime(System.currentTimeMillis());
// kanjiaActivityGoodsParams.setEndTime(System.currentTimeMillis());
return ResultUtil.data(kanJiaActivityGoodsService.kanjiaGoodsVOPage(kanjiaActivityGoodsParams, page));
}
@GetMapping("/{id}")
@ApiOperation(value = "获取砍价活动商品")
@ApiImplicitParam(name = "id", value = "砍价活动商品ID", required = true, paramType = "path")
public ResultMessage<KanjiaActivityGoodsVO> getKanjiaActivityGoods(@PathVariable String id) {
return ResultUtil.data(kanJiaActivityGoodsService.getKanJiaGoodsVO(id));
}
@GetMapping("/getKanjiaActivity/logs")
@ApiOperation(value = "分页获取砍价活动-帮砍记录")
public ResultMessage<IPage<KanjiaActivityLog>> getKanjiaActivityLog(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO page) {
return ResultUtil.data(kanJiaActivityLogService.getForPage(kanJiaActivityLogQuery, page));
}
@PostMapping("/getKanjiaActivity")
@ApiOperation(value = "获取砍价活动")
public ResultMessage<KanjiaActivityVO> getKanJiaActivity(KanjiaActivitySearchParams kanjiaActivitySearchParams) {
//如果是非被邀请关系则填写会员ID
if (CharSequenceUtil.isEmpty(kanjiaActivitySearchParams.getKanjiaActivityId())) {
kanjiaActivitySearchParams.setMemberId(UserContext.getCurrentUser().getId());
}
return ResultUtil.data(kanJiaActivityService.getKanjiaActivityVO(kanjiaActivitySearchParams));
}
@PostMapping
@ApiImplicitParam(name = "id", value = "砍价活动商品ID", required = true, paramType = "path")
@ApiOperation(value = "发起砍价活动")
public ResultMessage<KanjiaActivityLog> launchKanJiaActivity(String id) {
KanjiaActivityLog kanjiaActivityLog = kanJiaActivityService.add(id);
return ResultUtil.data(kanjiaActivityLog);
}
@PostMapping("/help/{kanjiaActivityId}")
@ApiImplicitParam(name = "kanJiaActivityId", value = "砍价活动ID", required = true, paramType = "path")
@ApiOperation(value = "帮砍一刀")
public ResultMessage<KanjiaActivityLog> helpKanJia(@PathVariable String kanjiaActivityId) {
KanjiaActivityLog kanjiaActivityLog = kanJiaActivityService.helpKanJia(kanjiaActivityId);
return ResultUtil.data(kanjiaActivityLog);
}
@GetMapping("/kanjiaActivity/mine/")
@ApiOperation(value = "分页获取已参与的砍价活动")
public ResultMessage<IPage<KanjiaActivity>> getPointsGoodsPage(KanjiaActivityQuery kanjiaActivityQuery, PageVO page) {
// 会员端查询到的肯定是已经开始的活动商品
kanjiaActivityQuery.setMemberId(UserContext.getCurrentUser().getId());
IPage<KanjiaActivity> kanjiaActivity = kanJiaActivityService.getForPage(kanjiaActivityQuery, page);
return ResultUtil.data(kanjiaActivity);
}
}

View File

@@ -0,0 +1,64 @@
package cn.lili.controller.promotion;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.PintuanMemberVO;
import cn.lili.modules.promotion.entity.vos.PintuanShareVO;
import cn.lili.modules.promotion.service.PintuanService;
import cn.lili.modules.promotion.service.PromotionGoodsService;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 买家端,拼团接口
*
* @author paulG
* @since 2021/2/20
**/
@Api(tags = "买家端,拼团接口")
@RestController
@RequestMapping("/buyer/promotion/pintuan")
public class PintuanBuyerController {
@Autowired
private PromotionGoodsService promotionGoodsService;
@Autowired
private PintuanService pintuanService;
@ApiOperation(value = "获取拼团商品")
@GetMapping
public ResultMessage<IPage<PromotionGoods>> getPintuanCategory(String goodsName, String categoryPath, PageVO pageVo) {
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setGoodsName(goodsName);
searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name());
searchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
searchParams.setCategoryPath(categoryPath);
return ResultUtil.data(promotionGoodsService.pageFindAll(searchParams, pageVo));
}
@ApiOperation(value = "获取当前拼团活动的未成团的会员")
@GetMapping("/{pintuanId}/members")
public ResultMessage<List<PintuanMemberVO>> getPintuanMember(@PathVariable String pintuanId) {
return ResultUtil.data(pintuanService.getPintuanMember(pintuanId));
}
@ApiOperation(value = "获取当前拼团订单的拼团分享信息")
@GetMapping("/share")
public ResultMessage<PintuanShareVO> share(String parentOrderSn, String skuId) {
return ResultUtil.data(pintuanService.getPintuanShareInfo(parentOrderSn, skuId));
}
}

View File

@@ -0,0 +1,59 @@
package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.PointsGoods;
import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory;
import cn.lili.modules.promotion.entity.dto.search.PointsGoodsSearchParams;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
import cn.lili.modules.promotion.service.PointsGoodsCategoryService;
import cn.lili.modules.promotion.service.PointsGoodsService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,积分商品接口
*
* @author paulG
* @since 2021/1/19
**/
@RestController
@Api(tags = "买家端,积分商品接口")
@RequestMapping("/buyer/promotion/pointsGoods")
public class PointsGoodsBuyerController {
@Autowired
private PointsGoodsService pointsGoodsService;
@Autowired
private PointsGoodsCategoryService pointsGoodsCategoryService;
@GetMapping
@ApiOperation(value = "分页获取积分商品")
public ResultMessage<IPage<PointsGoods>> getPointsGoodsPage(PointsGoodsSearchParams searchParams, PageVO page) {
searchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
IPage<PointsGoods> pointsGoodsByPage = pointsGoodsService.pageFindAll(searchParams, page);
return ResultUtil.data(pointsGoodsByPage);
}
@GetMapping("/category")
@ApiOperation(value = "获取积分商品分类分页")
public ResultMessage<IPage<PointsGoodsCategory>> page(String name, PageVO page) {
return ResultUtil.data(pointsGoodsCategoryService.getCategoryByPage(name, page));
}
@GetMapping("/{id}")
@ApiOperation(value = "获取积分活动商品")
@ApiImplicitParam(name = "id", value = "积分商品ID", required = true, paramType = "path")
public ResultMessage<PointsGoodsVO> getPointsGoodsPage(@PathVariable String id) {
return ResultUtil.data(pointsGoodsService.getPointsGoodsDetail(id));
}
}

View File

@@ -0,0 +1,48 @@
package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.vos.SeckillGoodsVO;
import cn.lili.modules.promotion.entity.vos.SeckillTimelineVO;
import cn.lili.modules.promotion.service.SeckillApplyService;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 买家端,秒杀活动接口
*
* @author paulG
* @since 2020/11/17 2:30 下午
*/
@Api(tags = "买家端,秒杀活动接口")
@RestController
@RequestMapping("/buyer/promotion/seckill")
public class SeckillBuyerController {
/**
* 秒杀活动
*/
@Autowired
private SeckillApplyService seckillApplyService;
@ApiOperation(value = "获取当天秒杀活动信息")
@GetMapping
public ResultMessage<List<SeckillTimelineVO>> getSeckillTime() {
return ResultUtil.data(seckillApplyService.getSeckillTimeline());
}
@ApiOperation(value = "获取某个时刻的秒杀活动商品信息")
@GetMapping("/{timeline}")
public ResultMessage<List<SeckillGoodsVO>> getSeckillGoods(@PathVariable Integer timeline) {
return ResultUtil.data(seckillApplyService.getSeckillGoods(timeline));
}
}

View File

@@ -0,0 +1,109 @@
package cn.lili.controller.store;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO;
import cn.lili.modules.goods.service.StoreGoodsLabelService;
import cn.lili.modules.store.entity.dto.StoreBankDTO;
import cn.lili.modules.store.entity.dto.StoreCompanyDTO;
import cn.lili.modules.store.entity.dto.StoreOtherInfoDTO;
import cn.lili.modules.store.entity.vos.*;
import cn.lili.modules.store.service.StoreDetailService;
import cn.lili.modules.store.service.StoreService;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 买家端,店铺接口
*
* @author Bulbasaur
* @since 2020/11/17 2:32 下午
*/
@RestController
@RequestMapping("/buyer/store")
@Api(tags = "买家端,店铺接口")
public class StoreBuyerController {
/**
* 店铺
*/
@Autowired
private StoreService storeService;
/**
* 店铺商品分类
*/
@Autowired
private StoreGoodsLabelService storeGoodsLabelService;
/**
* 店铺详情
*/
@Autowired
private StoreDetailService storeDetailService;
@ApiOperation(value = "获取店铺列表分页")
@GetMapping
public ResultMessage<IPage<StoreVO>> getByPage(StoreSearchParams entity, PageVO page) {
return ResultUtil.data(storeService.findByConditionPage(entity, page));
}
@ApiOperation(value = "通过id获取店铺信息")
@ApiImplicitParam(name = "id", value = "店铺ID", required = true, paramType = "path")
@GetMapping(value = "/get/detail/{id}")
public ResultMessage<StoreBasicInfoVO> detail(@NotNull @PathVariable String id) {
return ResultUtil.data(storeDetailService.getStoreBasicInfoDTO(id));
}
@ApiOperation(value = "通过id获取店铺详细信息-营业执照")
@ApiImplicitParam(name = "id", value = "店铺ID", required = true, paramType = "path")
@GetMapping(value = "/get/licencePhoto/{id}")
public ResultMessage<StoreOtherVO> licencePhoto(@NotNull @PathVariable String id) {
return ResultUtil.data(storeDetailService.getStoreOtherVO(id));
}
@ApiOperation(value = "通过id获取店铺商品分类")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "店铺ID", required = true, paramType = "path")
})
@GetMapping(value = "/label/get/{id}")
public ResultMessage<List<StoreGoodsLabelVO>> storeGoodsLabel(@NotNull @PathVariable String id) {
return ResultUtil.data(storeGoodsLabelService.listByStoreId(id));
}
@ApiOperation(value = "申请店铺第一步-填写企业信息")
@PutMapping(value = "/apply/first")
public ResultMessage<Object> applyFirstStep(StoreCompanyDTO storeCompanyDTO) {
storeService.applyFirstStep(storeCompanyDTO);
return ResultUtil.success();
}
@ApiOperation(value = "申请店铺第二步-填写银行信息")
@PutMapping(value = "/apply/second")
public ResultMessage<Object> applyFirstStep(StoreBankDTO storeBankDTO) {
storeService.applySecondStep(storeBankDTO);
return ResultUtil.success();
}
@ApiOperation(value = "申请店铺第三步-填写其他信息")
@PutMapping(value = "/apply/third")
public ResultMessage<Object> applyFirstStep(StoreOtherInfoDTO storeOtherInfoDTO) {
storeService.applyThirdStep(storeOtherInfoDTO);
return ResultUtil.success();
}
@ApiOperation(value = "获取当前登录会员的店铺信息-入驻店铺")
@GetMapping(value = "/apply")
public ResultMessage<StoreDetailVO> apply() {
return ResultUtil.data(storeDetailService.getStoreDetailVOByMemberId(UserContext.getCurrentUser().getId()));
}
}

View File

@@ -0,0 +1,61 @@
package cn.lili.controller.wallet;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.vo.MemberReceiptAddVO;
import cn.lili.modules.member.entity.vo.MemberReceiptVO;
import cn.lili.modules.member.service.MemberReceiptService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 买家端,会员发票接口
*
* @author paulG
* @since 2021-03-29 14:10:16
*/
@RestController
@Api(tags = "买家端,会员发票接口")
@RequestMapping("/buyer/member/receipt")
public class MemberReceiptController {
@Autowired
private MemberReceiptService memberReceiptService;
@ApiOperation(value = "查询会员发票列表")
@GetMapping
public ResultMessage<Object> page(MemberReceiptVO memberReceiptVO, PageVO page) {
return ResultUtil.data(memberReceiptService.getPage(memberReceiptVO, page));
}
@PreventDuplicateSubmissions
@ApiOperation(value = "新增会员发票")
@PostMapping
public ResultMessage<Object> add(MemberReceiptAddVO memberReceiptAddVO) {
return ResultUtil.data(memberReceiptService.addMemberReceipt(memberReceiptAddVO, UserContext.getCurrentUser().getId()));
}
@ApiOperation(value = "修改会员发票")
@ApiImplicitParam(name = "id", value = "会员发票id", required = true, paramType = "path")
@PutMapping
public ResultMessage<Object> update(@PathVariable String id, MemberReceiptAddVO memberReceiptAddVO) {
memberReceiptAddVO.setId(id);
return ResultUtil.data(memberReceiptService.editMemberReceipt(memberReceiptAddVO, id));
}
@ApiOperation(value = "会员发票删除")
@ApiImplicitParam(name = "id", value = "会员发票id", required = true, paramType = "path")
@DeleteMapping
public ResultMessage<Boolean> deleteMessage(@PathVariable String id) {
return ResultUtil.data(memberReceiptService.deleteMemberReceipt(id));
}
}

View File

@@ -0,0 +1,134 @@
package cn.lili.controller.wallet;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.verification.entity.enums.VerificationEnums;
import cn.lili.modules.verification.service.VerificationService;
import cn.lili.modules.wallet.entity.dos.MemberWallet;
import cn.lili.modules.wallet.entity.vo.MemberWalletVO;
import cn.lili.modules.wallet.service.MemberWalletService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Pattern;
/**
* 买家端,会员余额接口
*
* @author pikachu
* @since 2020/11/16 10:07 下午
*/
@RestController
@Api(tags = "买家端,会员余额接口")
@RequestMapping("/buyer/members/wallet")
public class MemberWalletBuyerController {
/**
* 会员
*/
@Autowired
private MemberService memberService;
/**
* 会员余额
*/
@Autowired
private MemberWalletService memberWalletService;
/**
* 验证码
*/
@Autowired
private VerificationService verificationService;
@GetMapping
@ApiOperation(value = "查询会员预存款余额")
public ResultMessage<MemberWalletVO> get() {
AuthUser authUser = UserContext.getCurrentUser();
if (authUser != null) {
return ResultUtil.data(memberWalletService.getMemberWallet(authUser.getId()));
}
throw new ServiceException(ResultCode.USER_NOT_LOGIN);
}
@PostMapping(value = "/set-password")
@ApiOperation(value = "设置支付密码")
@ApiImplicitParams({
@ApiImplicitParam(name = "password", value = "支付密码", required = true, dataType = "String", paramType = "query")
})
public ResultMessage<Object> setPassword(String password, @RequestHeader String uuid) {
AuthUser authUser = UserContext.getCurrentUser();
//校验当前用户是否存在
Member member = memberService.getById(authUser.getId());
if (member == null) {
throw new ServiceException(ResultCode.USER_NOT_EXIST);
}
//校验验证码
if (verificationService.check(uuid, VerificationEnums.WALLET_PASSWORD)) {
memberWalletService.setMemberWalletPassword(member, password);
throw new ServiceException(ResultCode.SUCCESS);
} else {
throw new ServiceException(ResultCode.VERIFICATION_ERROR);
}
}
@PostMapping(value = "/update-password/ordinary")
@ApiOperation(value = "普通方式进行支付密码的修改")
@ApiImplicitParams({
@ApiImplicitParam(name = "oldPassword", value = "旧支付密码", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "newPassword", value = "新支付密码", required = true, dataType = "String", paramType = "query")
})
public ResultMessage updatePassword(@RequestParam @Pattern(regexp = "[a-fA-F0-9]{32}", message = "旧密码格式不正确") String oldPassword,
@RequestParam @Pattern(regexp = "[a-fA-F0-9]{32}", message = "新密码格式不正确") String newPassword) {
AuthUser authUser = UserContext.getCurrentUser();
//校验当前用户是否存在
Member member = memberService.getById(authUser.getId());
if (member == null) {
throw new ServiceException(ResultCode.USER_NOT_EXIST);
}
MemberWallet memberWallet = this.memberWalletService.getOne(new QueryWrapper<MemberWallet>().eq("member_id", member.getId()));
//校验新旧密码是否一致
if (memberWallet != null) {
if (!new BCryptPasswordEncoder().matches(oldPassword, memberWallet.getWalletPassword())) {
throw new ServiceException(ResultCode.USER_OLD_PASSWORD_ERROR);
}
this.memberWalletService.setMemberWalletPassword(member, newPassword);
return ResultUtil.data("修改成功");
} else {
throw new ServiceException(ResultCode.WALLET_NOT_EXIT_ERROR);
}
}
@GetMapping(value = "/check")
@ApiOperation(value = "检测会员是否设置过支付密码,会员中心设置或者修改密码时使用")
public Boolean checkPassword() {
return memberWalletService.checkPassword();
}
@PreventDuplicateSubmissions
@PostMapping(value = "/withdrawal")
@ApiOperation(value = "会员中心余额提现")
@ApiImplicitParams({
@ApiImplicitParam(name = "price", value = "提现金额", required = true, dataType = "double", paramType = "query")
})
public ResultMessage<Boolean> withdrawal(@Max(value = 9999, message = "充值金额单次最多允许提现9999元") @Min(value = 1, message = "充值金额单次最少提现金额为1元") Double price) {
return ResultUtil.data(memberWalletService.applyWithdrawal(price));
}
}

View File

@@ -0,0 +1,44 @@
package cn.lili.controller.wallet;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply;
import cn.lili.modules.wallet.entity.vo.MemberWithdrawApplyQueryVO;
import cn.lili.modules.wallet.service.MemberWithdrawApplyService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,余额提现记录接口
*
* @author pikachu
* @since 2020/11/16 10:07 下午
*/
@RestController
@Api(tags = "买家端,余额提现记录接口")
@RequestMapping("/buyer/member/withdrawApply")
public class MemberWithdrawApplyBuyerController {
@Autowired
private MemberWithdrawApplyService memberWithdrawApplyService;
@ApiOperation(value = "分页获取提现记录")
@GetMapping
public ResultMessage<IPage<MemberWithdrawApply>> getByPage(PageVO page, MemberWithdrawApplyQueryVO memberWithdrawApplyQueryVO) {
memberWithdrawApplyQueryVO.setMemberId(UserContext.getCurrentUser().getId());
//构建查询 返回数据
IPage<MemberWithdrawApply> memberWithdrawApplyPage = memberWithdrawApplyService.getMemberWithdrawPage(page, memberWithdrawApplyQueryVO);
return ResultUtil.data(memberWithdrawApplyPage);
}
}

View File

@@ -0,0 +1,43 @@
package cn.lili.controller.wallet;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.order.trade.entity.vo.RechargeQueryVO;
import cn.lili.modules.wallet.entity.dos.Recharge;
import cn.lili.modules.wallet.service.RechargeService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,预存款充值记录接口
*
* @author pikachu
* @since 2020/11/16 10:07 下午
*/
@RestController
@Api(tags = "买家端,预存款充值记录接口")
@RequestMapping("/buyer/member/recharge")
public class RechargeBuyerController {
@Autowired
private RechargeService rechargeService;
@ApiOperation(value = "分页获取预存款充值记录")
@GetMapping
public ResultMessage<IPage<Recharge>> getByPage(PageVO page) {
//构建查询参数
RechargeQueryVO rechargeQueryVO = new RechargeQueryVO();
rechargeQueryVO.setMemberId(UserContext.getCurrentUser().getId());
//构建查询 返回数据
IPage<Recharge> rechargePage = rechargeService.rechargePage(page, rechargeQueryVO);
return ResultUtil.data(rechargePage);
}
}

View File

@@ -0,0 +1,44 @@
package cn.lili.controller.wallet;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.wallet.entity.dos.WalletLog;
import cn.lili.modules.wallet.service.WalletLogService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
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;
/**
* 买家端,预存款变动日志记录接口
*
* @author pikachu
* @since 2020/11/16 10:07 下午
*/
@RestController
@Api(tags = "买家端,预存款变动日志记录接口")
@RequestMapping("/buyer/wallet/log")
public class WalletLogBuyerController {
@Autowired
private WalletLogService walletLogService;
@ApiOperation(value = "分页获取预存款变动日志")
@GetMapping
public ResultMessage<IPage<WalletLog>> getByPage(PageVO page) {
//获取当前登录用户
AuthUser authUser = UserContext.getCurrentUser();
//构建查询 返回数据
IPage<WalletLog> depositLogPage = walletLogService.page(PageUtil.initPage(page),
new QueryWrapper<WalletLog>().eq("member_id", authUser.getId()).orderByDesc("create_time"));
return ResultUtil.data(depositLogPage);
}
}

View File

@@ -0,0 +1,121 @@
package cn.lili.security;
import cn.hutool.core.util.StrUtil;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.enums.SecurityEnum;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.SecretKeyUtil;
import cn.lili.common.utils.ResponseUtil;
import com.google.gson.Gson;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 认证结果过滤器
*
* @author Chopper
* @version v4.1
* @since 2020/11/17 3:37 下午
* @since
*/
@Slf4j
public class BuyerAuthenticationFilter extends BasicAuthenticationFilter {
/**
* 缓存
*/
@Autowired
private Cache cache;
/**
* 自定义构造器
*
* @param authenticationManager
* @param cache
*/
public BuyerAuthenticationFilter(AuthenticationManager authenticationManager,
Cache cache) {
super(authenticationManager);
this.cache = cache;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
//从header中获取jwt
String jwt = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue());
try {
//如果没有token 则return
if (StrUtil.isBlank(jwt)) {
chain.doFilter(request, response);
return;
}
//获取用户信息存入context
UsernamePasswordAuthenticationToken authentication = getAuthentication(jwt, response);
SecurityContextHolder.getContext().setAuthentication(authentication);
} catch (Exception e) {
log.error("BuyerAuthenticationFilter-> member authentication exception:", e);
}
chain.doFilter(request, response);
}
/**
* 解析用户
*
* @param jwt
* @param response
* @return
*/
private UsernamePasswordAuthenticationToken getAuthentication(String jwt, HttpServletResponse response) {
try {
Claims claims
= Jwts.parser()
.setSigningKey(SecretKeyUtil.generalKeyByDecoders())
.parseClaimsJws(jwt).getBody();
//获取存储在claims中的用户信息
String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString();
AuthUser authUser = new Gson().fromJson(json, AuthUser.class);
//校验redis中是否有权限
if (cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER) + jwt)) {
//构造返回信息
List<GrantedAuthority> auths = new ArrayList<>();
auths.add(new SimpleGrantedAuthority("ROLE_" + authUser.getRole().name()));
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(authUser.getUsername(), null, auths);
authentication.setDetails(authUser);
return authentication;
}
ResponseUtil.output(response, 403, ResponseUtil.resultMap(false, 403, "登录已失效,请重新登录"));
return null;
} catch (ExpiredJwtException e) {
log.debug("user analysis exception:", e);
} catch (Exception e) {
log.error("user analysis exception:", e);
}
return null;
}
}

View File

@@ -0,0 +1,83 @@
package cn.lili.security;
import cn.lili.cache.Cache;
import cn.lili.common.security.CustomAccessDeniedHandler;
import cn.lili.common.utils.SpringContextUtil;
import cn.lili.common.properties.IgnoredUrlsProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.web.cors.CorsConfigurationSource;
/**
* spring Security 核心配置类 Buyer安全配置中心
*
* @author Chopper
* @version v4.0
* @since 2020/11/14 16:20
*/
@Slf4j
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class BuyerSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 忽略验权配置
*/
@Autowired
private IgnoredUrlsProperties ignoredUrlsProperties;
/**
* spring security -》 权限不足处理
*/
@Autowired
private CustomAccessDeniedHandler accessDeniedHandler;
@Autowired
private Cache<String> cache;
@Override
protected void configure(HttpSecurity http) throws Exception {
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = http
.authorizeRequests();
//配置的url 不需要授权
for (String url : ignoredUrlsProperties.getUrls()) {
registry.antMatchers(url).permitAll();
}
registry
.and()
//禁止网页iframe
.headers().frameOptions().disable()
.and()
.logout()
.permitAll()
.and()
.authorizeRequests()
//任何请求
.anyRequest()
//需要身份认证
.authenticated()
.and()
//允许跨域
.cors().configurationSource((CorsConfigurationSource) SpringContextUtil.getBean("corsConfigurationSource")).and()
//关闭跨站请求防护
.csrf().disable()
//前后端分离采用JWT 不需要session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
//自定义权限拒绝处理类
.exceptionHandling().accessDeniedHandler(accessDeniedHandler)
.and()
//添加JWT认证过滤器
.addFilter(new BuyerAuthenticationFilter(authenticationManager(), cache));
}
}

View File

@@ -0,0 +1,296 @@
server:
port: 8885
servlet:
context-path: /
tomcat:
uri-encoding: UTF-8
threads:
min-spare: 50
max: 1000
# 与Spring Boot 2一样默认情况下大多数端点都不通过http公开我们公开了所有端点。对于生产您应该仔细选择要公开的端点。
management:
# health:
# elasticsearch:
# enabled: false
# datasource:
# enabled: false
endpoints:
web:
exposure:
include: '*'
spring:
# 要在其中注册的Spring Boot Admin Server的URL。
boot:
admin:
client:
url: http://127.0.0.1:8000
# 文件大小上传配置
servlet:
multipart:
max-file-size: 20MB
max-request-size: 20MB
cache:
type: redis
#jackson json解析
jackson:
time-zone: GMT+8
serialization:
#关闭jackson 对json做解析
fail-on-empty-beans: false
# mongodb
data:
mongodb:
host: 192.168.2.126
port: 27017
database: rx-shop
username: goboo
password: Gb84505016
authentication-database: admin
# replica-set-name: mongoreplset
# Redis
redis:
host: 192.168.2.126
port: 6379
password: Gb84505016
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制) 默认 8
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
max-wait: 20
# 连接池中的最大空闲连接 默认 8
max-idle: 10
# 连接池中的最小空闲连接 默认 8
min-idle: 8
#mysql
shardingsphere:
datasource:
# 数据库名称,可自定义,可以为多个,以逗号隔开,每个在这里定义的库,都要在下面定义连接属性
names: default-datasource
default-datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.2.126:3306/rx-shop?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&verifyServerCertificate=false&useSSL=false
username: rx-shop
password: J2xEZ42HwPXrDXt3
maxActive: 20
initialSize: 5
maxWait: 60000
minIdle: 5
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
#是否缓存preparedStatement也就是PSCache。在mysql下建议关闭。 PSCache对支持游标的数据库性能提升巨大比如说oracle。
poolPreparedStatements: false
#要启用PSCache-1为关闭 必须配置大于0当大于0时poolPreparedStatements自动触发修改为true 可以把这个数值配置大一些比如说100
maxOpenPreparedStatements: -1
#配置监控统计拦截的filters去掉后监控界面sql无法统计'wall'用于防火墙
filters: stat,wall,log4j2
#通过connectProperties属性来打开mergeSql功能慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
loginUsername: druid
loginPassword: druid
# sharding:
# default-data-source-name: default-datasource
# #需要拆分的表,可以设置多个 在 li_order 级别即可
# tables:
# #需要进行分表的逻辑表名
# li_order:
# #实际的表结点,下面代表的是li_order_为开头的所有表如果能确定表的范围例如按月份分表这里的写法是data2020.li_order_$->{2020..2021}_$->{01..12} 表示例如 li_order_2020_01 li_order_2020_03 li_order_2021_01
# actual-data-nodes: data2020.li_order_$->{2019..2021}_$->{01..12}
# table-strategy:
# # 分表策略,根据创建日期
# standard:
# sharding-column: create_time
# #分表策略
# precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm
# #范围查询实现
# range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: true
# 忽略TOKEN 鉴权 的url
ignored:
urls:
- /editor-app/**
- /actuator**
- /actuator/**
- /MP_verify_qSyvBPhDsPdxvOhC.txt
- /weixin/**
- /source/**
- /buyer/mini-program/**
- /buyer/cashier/**
- /buyer/pageData/**
- /buyer/article/**
- /buyer/goods/**
- /buyer/category/**
- /buyer/store
- /buyer/store/get**
- /buyer/store/get/**
- /buyer/store/label/get**
- /buyer/store/label/get/**
- /buyer/connect/**
- /buyer/members/**
- /buyer/promotion/pintuan/**
- /buyer/promotion/coupon/**
- /buyer/promotion/seckill/**
- /buyer/promotion/pointsGoods/**
- /buyer/memberEvaluation/**/goodsEvaluation
- /buyer/memberEvaluation/**/evaluationNumber
- /buyer/appVersion/**
- /buyer/broadcast/studio/**
- /druid/**
- /swagger-ui.html
- /doc.html
- /swagger-resources/**
- /swagger/**
- /webjars/**
- /v2/api-docs
- /configuration/ui
- /boot-admin
- /**/*.js
- /**/*.css
- /**/*.png
- /**/*.ico
# Swagger界面内容配置
swagger:
title: API接口文档
description: Api Documentation
version: 1.0.0
termsOfServiceUrl:
contact:
name: rx
url:
email:
# Mybatis-plus
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
configuration:
#缓存开启
cache-enabled: true
#日志
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 日志
logging:
# 输出级别
level:
cn.lili: debug
org.hibernate: debug
# org.springframework: debug
# org.springframework.data.mongodb.core: debug
file:
# 指定路径
path: lili-logs
# 最大保存天数
max-history: 7
# 每个文件最大大小
max-size: 5MB
#加密参数
jasypt:
encryptor:
password: lili
lili:
system:
isDemoSite: false
statistics:
# 在线人数统计 X 小时。这里设置48即统计过去48小时每小时在线人数
onlineMember: 48
# 当前在线人数刷新时间间隔单位秒设置为600则每10分钟刷新一次
currentOnlineUpdate: 600
#qq lbs 申请
lbs:
key: 4BYBZ-7MT6S-PUAOA-6BNWL-FJUD7-UUFXT
sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6
#域名
domain:
pc: https://pc-b2b2c.pickmall.cn
wap: https://m-b2b2c.pickmall.cn
store: https://store-b2b2c.pickmall.cn
admin: https://admin-b2b2c.pickmall.cn
#api地址
api:
buyer: https://buyer-api.pickmall.cn
common: https://common-api.pickmall.cn
manager: https://admin-api.pickmall.cn
store: https://store-api.pickmall.cn
# jwt 细节设定
jwt-setting:
# token过期时间分钟
tokenExpireTime: 60
# 使用Spring @Cacheable注解失效时间
cache:
# 过期时间 单位秒 永久不过期设为-1
timeout: 1500
#多线程配置
thread:
corePoolSize: 5
maxPoolSize: 50
queueCapacity: 50
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.2.126:9200
index:
number-of-replicas: 0
number-of-shards: 3
index-prefix: lili
schema: http
# account:
# username: elastic
# password: LiLiShopES
logstash:
server: 192.168.2.126:4560
rocketmq:
promotion-topic: lili_promotion_topic
promotion-group: lili_promotion_group
msg-ext-topic: lili_msg_topic
msg-ext-group: lili_msg_group
goods-topic: lili_goods_topic
goods-group: lili_goods_group
order-topic: lili_order_topic
order-group: lili_order_group
member-topic: lili_member_topic
member-group: lili_member_group
other-topic: lili_other_topic
other-group: lili_other_group
notice-topic: lili_notice_topic
notice-group: lili_notice_group
notice-send-topic: lili_send_notice_topic
notice-send-group: lili_send_notice_group
after-sale-topic: lili_after_sale_topic
after-sale-group: lili_after_sale_group
rocketmq:
name-server: 192.168.2.126:9876
producer:
group: lili_group
send-message-timeout: 30000
xxl:
job:
admin:
addresses: http://192.168.2.126:9001/xxl-job-admin
executor:
appname: xxl-job-executor-lilishop
address:
ip:
port: 8891
logpath: ./xxl-job/executor
logretentiondays: 7

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!--应用名称-->
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
<!--日志文件保存路径-->
<springProperty scope="context" name="LOG_FILE_PATH" source="logging.file.path"/>
<springProperty scope="context" name="LOGSTASH_SERVER" source="lili.data.logstash.server"/>
<contextName>${APP_NAME}</contextName>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--输出到elk的LOGSTASH-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 配置elk日志收集 配饰的是 LOGSTASH 的地址-->
<destination>${LOGSTASH_SERVER}</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
</providers>
<!--自定义字段 区分项目-->
<customFields>{"appName":"${APP_NAME}"}</customFields>
</encoder>
</appender>
<!-- <root level="INFO">-->
<root>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>

View File

@@ -0,0 +1 @@
qSyvBPhDsPdxvOhC

View File

@@ -0,0 +1,75 @@
package cn.lili.buyer.test.cart;
import cn.hutool.json.JSONUtil;
import cn.lili.modules.goods.entity.vos.CategoryVO;
import cn.lili.modules.goods.service.CategoryService;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
import cn.lili.modules.order.cart.entity.vo.TradeParams;
import cn.lili.modules.order.cart.service.CartService;
import cn.lili.modules.payment.service.PaymentService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.util.List;
/**
* @author paulG
* @since 2020/11/14
**/
@ExtendWith(SpringExtension.class)
@SpringBootTest
class CartTest {
@Autowired
private CartService cartService;
@Autowired
private CategoryService categoryService;
@Autowired
private PaymentService paymentService;
@Test
void getAll() {
TradeDTO allTradeDTO = cartService.getAllTradeDTO();
Assertions.assertNotNull(allTradeDTO);
System.out.println(JSONUtil.toJsonStr(allTradeDTO));
}
@Test
void deleteAll() {
cartService.delete(new String[]{"1344220459059404800"});
Assertions.assertTrue(true);
}
@Test
void createTrade() {
// TradeDTO allTradeDTO = cartService.getAllTradeDTO();
// Assert.assertNotNull(allTradeDTO);
// System.out.println(JsonUtil.objectToJson(allTradeDTO));
cartService.createTrade(new TradeParams());
}
@Test
void getAllCategory() {
List<CategoryVO> allCategory = categoryService.categoryTree();
for (CategoryVO categoryVO : allCategory) {
System.out.println(categoryVO);
}
Assertions.assertTrue(true);
}
@Test
void storeCoupon() {
cartService.selectCoupon("1333318596239843328", CartTypeEnum.CART.name(), true);
Assertions.assertTrue(true);
}
}

View File

@@ -0,0 +1,54 @@
package cn.lili.buyer.test.cart;
import cn.lili.modules.file.plugin.FileManagerPlugin;
import cn.lili.modules.goods.entity.dos.Brand;
import cn.lili.modules.goods.service.BrandService;
import com.xkcoding.http.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.io.*;
import java.net.URL;
import java.util.List;
/**
* @author paulG
* @since 2020/11/14
**/
@Slf4j
@ExtendWith(SpringExtension.class)
@SpringBootTest
class FileTest {
@Autowired
private FileManagerPlugin fileManagerPlugin;
@Autowired
private BrandService brandService;
@Test
void test() throws Exception {
List<Brand> categoryList = brandService.list();
for (Brand brand : categoryList) {
try {
if (StringUtil.isEmpty(brand.getLogo()) || brand.getLogo().indexOf("lilishop") > 1) {
continue;
}
URL url = new URL(brand.getLogo());
InputStream inputStream = url.openStream();
//上传至第三方云服务或服务器
brand.setLogo(fileManagerPlugin.inputStreamUpload(inputStream, brand.getId() + ".png"));
} catch (IOException e) {
log.error("上传你文件出错",e);
}
}
brandService.updateBatchById(categoryList);
}
}

View File

@@ -0,0 +1,30 @@
package cn.lili.buyer.test.cart;
import cn.lili.modules.promotion.service.MemberCouponService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* @author paulG
* @since 2020/11/27
**/
@ExtendWith(SpringExtension.class)
@SpringBootTest
class MemberCouponTest {
@Autowired
private MemberCouponService memberCouponService;
@Test
void receiveCoupon() {
memberCouponService.receiveCoupon("1333318596239843328", "1326834797335306240", "1");
assertTrue(true);
}
}

View File

@@ -0,0 +1,287 @@
server:
servlet:
context-path: /
tomcat:
uri-encoding: UTF-8
threads:
min-spare: 50
max: 1000
# 与Spring Boot 2一样默认情况下大多数端点都不通过http公开我们公开了所有端点。对于生产您应该仔细选择要公开的端点。
management:
# health:
# elasticsearch:
# enabled: false
# datasource:
# enabled: false
endpoints:
web:
exposure:
include: '*'
spring:
# 要在其中注册的Spring Boot Admin Server的URL。
boot:
admin:
client:
url: http://192.168.2.126:8000
# mongodb
data:
mongodb:
host: 192.168.2.126
port: 27017
database: rx-shop
username: goboo
password: Gb84505016
authentication-database: admin
# replica-set-name: mongoreplset
cache:
type: redis
#amqp
# rabbitmq:
# host: 192.168.2.126
# Redis
redis:
host: 192.168.2.126
port: 6379
password: Gb84505016
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制) 默认 8
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
max-wait: 20
# 连接池中的最大空闲连接 默认 8
max-idle: 10
# 连接池中的最小空闲连接 默认 8
min-idle: 8
# 文件大小上传配置
servlet:
multipart:
max-file-size: 20MB
max-request-size: 20MB
jackson:
time-zone: GMT+8
serialization:
#关闭jackson 对json做解析
fail-on-empty-beans: false
shardingsphere:
datasource:
# 数据库名称,可自定义,可以为多个,以逗号隔开,每个在这里定义的库,都要在下面定义连接属性
names: default-datasource
default-datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.2.126:3306/rx-shop?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&verifyServerCertificate=false&useSSL=false
username: rx-shop
password: J2xEZ42HwPXrDXt3
maxActive: 20
initialSize: 5
maxWait: 60000
minIdle: 5
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
#是否缓存preparedStatement也就是PSCache。在mysql下建议关闭。 PSCache对支持游标的数据库性能提升巨大比如说oracle。
poolPreparedStatements: false
#要启用PSCache-1为关闭 必须配置大于0当大于0时poolPreparedStatements自动触发修改为true 可以把这个数值配置大一些比如说100
maxOpenPreparedStatements: -1
#配置监控统计拦截的filters去掉后监控界面sql无法统计'wall'用于防火墙
filters: stat,wall,log4j2
#通过connectProperties属性来打开mergeSql功能慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
loginUsername: druid
loginPassword: druid
# sharding:
# default-data-source-name: default-datasource
# #需要拆分的表,可以设置多个 在 li_order 级别即可
# tables:
# #需要进行分表的逻辑表名
# li_order:
# #实际的表结点,下面代表的是li_order_为开头的所有表如果能确定表的范围例如按月份分表这里的写法是data2020.li_order_$->{2020..2021}_$->{01..12} 表示例如 li_order_2020_01 li_order_2020_03 li_order_2021_01
# actual-data-nodes: data2020.li_order_$->{2019..2021}_$->{01..12}
# table-strategy:
# # 分表策略,根据创建日期
# standard:
# sharding-column: create_time
# #分表策略
# precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm
# #范围查询实现
# range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: true
# 忽略鉴权url
ignored:
urls:
- /editor-app/**
- /actuator**
- /actuator/**
- /MP_verify_qSyvBPhDsPdxvOhC.txt
- /weixin/**
- /source/**
- /buyer/mini-program/**
- /buyer/cashier/**
- /buyer/pageData/**
- /buyer/article/**
- /buyer/goods/**
- /buyer/category/**
- /buyer/store/**
- /buyer/connect/**
- /buyer/members/**
- /buyer/promotion/pintuan/**
- /buyer/promotion/seckill/**
- /buyer/promotion/pointsGoods/**
- /buyer/memberEvaluation/**/goodsEvaluation
- /buyer/memberEvaluation/**/evaluationNumber
- /store/login/**
- /manager/user/login
- /manager/user/refresh/**
- /druid/**
- /swagger-ui.html
- /doc.html
- /swagger-resources/**
- /swagger/**
- /webjars/**
- /v2/api-docs
- /configuration/ui
- /boot-admin
- /**/*.js
- /**/*.css
- /**/*.png
- /**/*.ico
# Swagger界面内容配置
swagger:
title: API接口文档
description: Api Documentation
version: 1.0.0
termsOfServiceUrl:
contact:
name: rx
url:
email:
# Mybatis-plus
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
configuration:
#缓存开启
cache-enabled: true
#日志
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 日志
logging:
# 输出级别
level:
cn.lili: info
# org.hibernate: debug
# org.springframework: debug
# org.springframework.data.mongodb.core: debug
file:
# 指定路径
path: lili-logs
# 最大保存天数
max-history: 7
# 每个文件最大大小
max-size: 5MB
#加密参数
jasypt:
encryptor:
password: lili
lili:
system:
isDemoSite: false
statistics:
# 在线人数统计 X 小时。这里设置48即统计过去48小时每小时在线人数
onlineMember: 48
# 当前在线人数刷新时间间隔单位秒设置为600则每10分钟刷新一次
currentOnlineUpdate: 600
#qq lbs 申请
lbs:
key: 4BYBZ-7MT6S-PUAOA-6BNWL-FJUD7-UUFXT
sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6
#域名
domain:
pc: http://192.168.2.126:8885
wap: http://192.168.2.126:8885
seller: http://192.168.2.126:8885
admin: http://192.168.2.126:8885
#api地址
api:
buyer: https://z171l91606.51mypc.cn
base: http://192.168.2.126:8885
manager: http://192.168.2.126:8885
seller: http://192.168.2.126:8885
# jwt 细节设定
jwt-setting:
# token过期时间分钟
tokenExpireTime: 60
# 使用Spring @Cacheable注解失效时间
cache:
# 过期时间 单位秒 永久不过期设为-1
timeout: 1500
#多线程配置
thread:
corePoolSize: 5
maxPoolSize: 50
queueCapacity: 50
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.2.126:9200
index:
number-of-replicas: 0
number-of-shards: 3
index-prefix: lili
schema: http
# account:
# username: elastic
# password: LiLiShopES
rocketmq:
promotion-topic: lili_promotion_topic
promotion-group: lili_promotion_group
msg-ext-topic: lili_msg_topic
msg-ext-group: lili_msg_group
goods-topic: lili_goods_topic
goods-group: lili_goods_group
order-topic: lili_order_topic
order-group: lili_order_group
member-topic: lili_member_topic
member-group: lili_member_group
other-topic: lili_other_topic
other-group: lili_other_group
notice-topic: lili_notice_topic
notice-group: lili_notice_group
notice-send-topic: lili_send_notice_topic
notice-send-group: lili_send_notice_group
rocketmq:
name-server: 192.168.2.126:9876
producer:
group: lili_group
send-message-timeout: 30000
xxl:
job:
admin:
addresses: http://192.168.2.126:9001/xxl-job-admin
executor:
appname: xxl-job-executor-lilishop
address:
ip:
port: 8891
logpath: ./xxl-job/executor
logretentiondays: 7