From 36f45aa751f88dbb1b09ca01cc9559f716d97e8c Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Wed, 20 Dec 2023 16:22:40 +0800 Subject: [PATCH] 富文本框输入版本变化 --- src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java | 106 +++ src/main/java/cc/mrbird/febs/mall/dto/ApiAddOrderItemDto.java | 21 src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java | 1 src/main/resources/templates/febs/views/modules/goods/goodsAppList.html | 229 ++++++ src/main/java/cc/mrbird/febs/mall/entity/MallAppMember.java | 15 src/main/java/cc/mrbird/febs/mall/controller/ApiMallAppController.java | 58 + src/main/java/cc/mrbird/febs/mall/dto/ApiAddOrderDto.java | 19 src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml | 34 + src/main/java/cc/mrbird/febs/mall/entity/MallGoodsCategory.java | 2 src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java | 4 src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java | 4 src/main/java/cc/mrbird/febs/mall/dto/ApiMallAppMemberInfoDto.java | 17 src/main/java/cc/mrbird/febs/mall/dto/ApiMallGoodsQueryDto.java | 14 src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java | 4 src/main/java/cc/mrbird/febs/mall/vo/ApiMallGoodsListVo.java | 34 + src/main/resources/templates/febs/views/modules/goods/goodsAppAddNew.html | 234 +++++++ src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java | 104 +++ src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java | 34 + src/main/resources/templates/febs/views/modules/product/categoryAppList.html | 174 +++++ src/main/resources/mapper/modules/MallAppMemberMapper.xml | 24 src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java | 30 src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java | 9 src/main/java/cc/mrbird/febs/mall/mapper/MallAppMemberMapper.java | 18 src/main/java/cc/mrbird/febs/mall/service/IApiMallGoodsCategoryService.java | 2 src/main/resources/templates/febs/views/modules/goods/goodsAppUpdateNew.html | 280 ++++++++ src/main/resources/application-test.yml | 2 src/main/resources/templates/febs/views/modules/product/categoryAppUpdate.html | 149 ++++ src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java | 4 src/main/resources/mapper/modules/MallGoodsMapper.xml | 54 + src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java | 43 + src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java | 32 src/main/java/cc/mrbird/febs/mall/vo/ApiMallAppMemberInfoVo.java | 26 src/main/resources/templates/febs/views/modules/product/categoryAppAdd.html | 130 +++ src/main/java/cc/mrbird/febs/common/utils/AppContants.java | 6 src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java | 32 src/main/java/cc/mrbird/febs/mall/service/IApiMallAppService.java | 19 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsCategoryServiceImpl.java | 5 37 files changed, 1,971 insertions(+), 2 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/utils/AppContants.java b/src/main/java/cc/mrbird/febs/common/utils/AppContants.java index 43d6356..07f5e07 100644 --- a/src/main/java/cc/mrbird/febs/common/utils/AppContants.java +++ b/src/main/java/cc/mrbird/febs/common/utils/AppContants.java @@ -17,6 +17,12 @@ * app用户登陆redis前缀 */ public static final String APP_LOGIN_PREFIX = "app_"; + public static final String SY_APP_LOGIN_PREFIX = "sy_app_"; + /** + * 是否是收银APP类目 1:是 + */ + public static final Integer IS_APP_CATEGORY = 1; + public static final Integer IS_APP_GOODS = 1; public static final String XCX_LOGIN_PREFIX = "xcx_"; public static final String XCX_LOGIN_PHONE_PREFIX = "xcx_p"; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java index cd8b4b0..333b3fa 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java @@ -4,6 +4,7 @@ import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.mall.entity.MallGoodsCategory; import cc.mrbird.febs.mall.service.IAdminMallGoodsCategoryService; import cc.mrbird.febs.mall.service.IApiMallGoodsCategoryService; @@ -51,6 +52,11 @@ return new FebsResponse().success().data(mallGoodsCategoryService.findAllCategoryList()); } + @GetMapping(value = "/categoryAppTree") + public FebsResponse categoryAppTree() { + return new FebsResponse().success().data(mallGoodsCategoryService.findAllAppCategoryList()); + } + /** * 商品分类-选择 */ @@ -96,5 +102,42 @@ return goodsCategoryService.delCategary(id); } + /** + * APP商品分类列表 + * @param mallGoodsCategory + * @param request + * @return + */ + @GetMapping("categoryAppList") + public FebsResponse categoryAppList(MallGoodsCategory mallGoodsCategory, QueryRequest request) { + mallGoodsCategory.setIsApp(AppContants.IS_APP_CATEGORY); + Map<String, Object> data = getDataTable(goodsCategoryService.getCategoryList(mallGoodsCategory, request)); + return new FebsResponse().success().data(data); + } + /** + * 商品分类-新增 + */ + @PostMapping("addAppCategory") + @ControllerEndpoint(operation = " 商品分类-新增", exceptionMessage = "操作失败") + public FebsResponse addAppCategory(@Valid MallGoodsCategory mallGoodsCategory) { + return goodsCategoryService.addAppCategory(mallGoodsCategory); + } + /** + * 商品分类-编辑 + */ + @PostMapping("updateAppCategory") + @ControllerEndpoint(operation = " 商品分类-编辑", exceptionMessage = "操作失败") + public FebsResponse updateAppCategory(@Valid MallGoodsCategory mallGoodsCategory) { + return goodsCategoryService.updateAppCategory(mallGoodsCategory); + } + /** + * 商品分类-删除 + */ + @GetMapping("delAppCategary/{id}") + @ControllerEndpoint(operation = " 商品分类-删除", exceptionMessage = "操作失败") + public FebsResponse delAppCategary(@NotNull(message = "{required}") @PathVariable Long id) { + return goodsCategoryService.delAppCategary(id); + } + } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java index 567ff86..5dcd755 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java @@ -96,6 +96,36 @@ return new FebsResponse().success().data(data); } + + /** + * app商品列表 + * @param mallGoods + * @param request + * @return + */ + @GetMapping("goodsAppList") + public FebsResponse goodsAppList(MallGoods mallGoods, QueryRequest request) { + Map<String, Object> data = getDataTable(adminMallGoodsService.getAppCategoryListInPage(mallGoods, request)); + return new FebsResponse().success().data(data); + } + /** + * app商品-新增 + */ + @PostMapping("addMallAppGoods") + @ControllerEndpoint(operation = " 商品-新增", exceptionMessage = "新增失败") + public FebsResponse addMallAppGoods(@RequestBody @Valid AddMallGoodsDto addMallGoodsDto) { + return adminMallGoodsService.addMallAppGoods(addMallGoodsDto); + } + + /** + * app商品-编辑 + */ + @PostMapping("updateAppMallGoods") + @ControllerEndpoint(operation = "商品-编辑", exceptionMessage = "操作失败") + public FebsResponse updateAppMallGoods(@RequestBody @Valid MallGoodsUpdateDto mallGoodsUpdateDto) { + return adminMallGoodsService.updateAppMallGoods(mallGoodsUpdateDto); + } + /** * 商品-新增 */ diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java index c04557c..9204eee 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java @@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.dto.*; +import cc.mrbird.febs.mall.service.IApiMallAppService; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.pay.model.WxGenerateQrCodeDto; import cc.mrbird.febs.pay.service.IXcxPayService; @@ -39,6 +40,7 @@ public class ApiLoginController { private final IApiMallMemberService memberService; + private final IApiMallAppService mallAppService; private final IXcxPayService iXcxPayService; private final RedisUtils redisUtils; @@ -56,6 +58,13 @@ } + @ApiOperation(value = "app账号密码登录接口", notes = "app账号密码登录接口") + @PostMapping(value = "/appToLogin") + public FebsResponse appToLogin(@RequestBody LoginDto loginDto) { + return mallAppService.appToLogin(loginDto); + } + + @ApiOperation(value = "忘记/修改密码", notes = "忘记/修改密码") @PostMapping(value = "/forgetPwd") public FebsResponse forgetPwd(@RequestBody ForgetPwdDto forgetPwdDto) { diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAppController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAppController.java new file mode 100644 index 0000000..2049bfc --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAppController.java @@ -0,0 +1,58 @@ +package cc.mrbird.febs.mall.controller; + +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.mall.dto.*; +import cc.mrbird.febs.mall.service.IApiMallAppService; +import cc.mrbird.febs.mall.service.IApiMallGoodsCategoryService; +import cc.mrbird.febs.mall.vo.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@CrossOrigin("*") +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/api/syApp") +@Api(value = "ApiMallAppController", tags = "收银APP") +public class ApiMallAppController { + + private final IApiMallAppService mallAppService; + + @ApiOperation(value = "根据手机尾号查询用户信息", notes = "根据手机尾号查询用户信息") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = ApiMallAppMemberInfoVo.class) + }) + @PostMapping(value = "/appMemberInfo") + public FebsResponse appMemberInfo(@RequestBody ApiMallAppMemberInfoDto apiMallAppMemberInfoDto) { + return mallAppService.appMemberInfo(apiMallAppMemberInfoDto); + } + + @ApiOperation(value = "获取商品分类", notes = "获取商品分类") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = MallGoodsCategoryVo.class) + }) + @GetMapping(value = "/findAllCategoryList") + public FebsResponse findAllCategoryList() { + return mallAppService.findAllCategoryList(); + } + + @ApiOperation(value = "获取分类下的商城商品", notes = "获取分类下的商城商品") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = ApiMallGoodsListVo.class) + }) + @PostMapping(value = "/goodsListNoPage") + public FebsResponse goodsListNoPage(@RequestBody ApiMallGoodsQueryDto queryDto) { + return mallAppService.findMallGoodsListNoPage(queryDto); + } + + @ApiOperation(value = "创建订单", notes = "创建订单") + @PostMapping(value = "/createAppOrder") + public FebsResponse createAppOrder(@RequestBody ApiAddOrderDto addOrderDto) { + return mallAppService.createAppOrder(addOrderDto); + } +} diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java index 1ea688b..98314c6 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java @@ -57,4 +57,36 @@ model.addAttribute("goodsCategoryVo", data); return FebsUtil.view("modules/product/categoryUpdate"); } + + /** + * App商品分类列表 + * @return + */ + @GetMapping("categoryAppList") + @RequiresPermissions("categoryAppList:view") + public String categoryAppList() { + return FebsUtil.view("modules/product/categoryAppList"); + } + /** + * 商品分类-新增 + * @return + */ + @GetMapping("categoryAppAdd") + @RequiresPermissions("categoryAppAdd:add") + public String categoryAppAdd() { + return FebsUtil.view("modules/product/categoryAppAdd"); + } + /** + * 商品分类-详情 + * @param id + * @param model + * @return + */ + @GetMapping("categoryAppUpdate/{id}") + @RequiresPermissions("categoryAppUpdate:update") + public String categoryAppUpdate(@PathVariable long id, Model model) { + AdminMallGoodsCategoryVo data = mallGoodsCategoryService.getMallGoodsCategoryInfoById(id); + model.addAttribute("goodsCategoryVo", data); + return FebsUtil.view("modules/product/categoryAppUpdate"); + } } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java index 28f8fc8..a406e27 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java @@ -46,6 +46,38 @@ } /** + * app商品列表 + * @return + */ + @GetMapping("goodsAppList") + @RequiresPermissions("goodsAppList:view") + public String goodsAppList() { + return FebsUtil.view("modules/goods/goodsAppList"); + } + /** + * app商品-新增 + * @return + */ + @GetMapping("goodsAppAddNew") + @RequiresPermissions("goodsAppAddNew:add") + public String goodsAppAddNew() { + return FebsUtil.view("modules/goods/goodsAppAddNew"); + } + /** + * app商品-编辑-详情 + * @param id + * @param model + * @return + */ + @GetMapping("goodsAppUpdateNew/{id}") + @RequiresPermissions("goodsAppUpdateNew:update") + public String goodsAppUpdateNew(@PathVariable long id, Model model) { + MallGoods data = mallGoodsService.selectGoodsById(id); + model.addAttribute("goodsInfo", data); + return FebsUtil.view("modules/goods/goodsAppUpdateNew"); + } + + /** * 商品-新增 * @return */ diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiAddOrderDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiAddOrderDto.java new file mode 100644 index 0000000..3d6b21a --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiAddOrderDto.java @@ -0,0 +1,19 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(value = "ApiAddOrderDto", description = "新增订单接口参数接收类") +public class ApiAddOrderDto { + + @ApiModelProperty(value = "订单结算方式 1:普通结算 2:会员结算", example = "1") + private Integer type; + + @ApiModelProperty(value = "商品明细") + private List<ApiAddOrderItemDto> items; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiAddOrderItemDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiAddOrderItemDto.java new file mode 100644 index 0000000..f85b652 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiAddOrderItemDto.java @@ -0,0 +1,21 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel(value = "ApiAddOrderItemDto", description = "新增订单明细参数接收类") +public class ApiAddOrderItemDto { + + @NotNull(message = "参数不能为空") + @ApiModelProperty(value = "skuID", example = "1") + private Long skuId; + + @NotNull(message = "参数不能为空") + @ApiModelProperty(value = "数量", example = "2") + private Integer cnt; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiMallAppMemberInfoDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiMallAppMemberInfoDto.java new file mode 100644 index 0000000..2b66552 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiMallAppMemberInfoDto.java @@ -0,0 +1,17 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel(value = "ApiMallAppMemberInfoDto", description = "参数接收类") +public class ApiMallAppMemberInfoDto { + + @NotNull(message = "电话号码不能为空") + @ApiModelProperty(value = "电话号码,支持尾号查询", example = "3560") + private String phone; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiMallGoodsQueryDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiMallGoodsQueryDto.java new file mode 100644 index 0000000..20d181c --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiMallGoodsQueryDto.java @@ -0,0 +1,14 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "ApiMallGoodsQueryDto", description = "商城商品参数接收类") +public class ApiMallGoodsQueryDto { + + @ApiModelProperty(value = "分类ID") + private Long categoryId; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallAppMember.java b/src/main/java/cc/mrbird/febs/mall/entity/MallAppMember.java new file mode 100644 index 0000000..133546c --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallAppMember.java @@ -0,0 +1,15 @@ +package cc.mrbird.febs.mall.entity; + +import cc.mrbird.febs.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +//app用户表 +@Data +@TableName("mall_app_member") +public class MallAppMember extends BaseEntity { + + private String account; + + private String password; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java index 8e4fd1e..937c350 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java @@ -31,6 +31,7 @@ private String goodsDetails; private Integer isSale; + private Integer isApp; /** * 上架 diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallGoodsCategory.java b/src/main/java/cc/mrbird/febs/mall/entity/MallGoodsCategory.java index 9c278d3..058dd6f 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallGoodsCategory.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallGoodsCategory.java @@ -23,5 +23,7 @@ private String image; private Integer indexNum; + // 是否是收银APP类目 1:是 否则为小程序类别 + private Integer isApp; } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallAppMemberMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallAppMemberMapper.java new file mode 100644 index 0000000..968e4f4 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallAppMemberMapper.java @@ -0,0 +1,18 @@ +package cc.mrbird.febs.mall.mapper; + +import cc.mrbird.febs.mall.dto.ApiMallAppMemberInfoDto; +import cc.mrbird.febs.mall.entity.MallAppMember; +import cc.mrbird.febs.mall.entity.MallMember; +import cc.mrbird.febs.mall.vo.ApiMallAppMemberInfoVo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface MallAppMemberMapper extends BaseMapper<MallAppMember> { + + MallAppMember selectByAccountAndPassword(@Param("account") String account, @Param("password") String password); + + List<ApiMallAppMemberInfoVo> selectMemberInfoLikePhone(@Param("phone")String phone); + +} diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java index 61646ad..d1f1517 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java @@ -21,6 +21,8 @@ List<MallGoodsCategoryVo> selectAllCategoryList(); + List<MallGoodsCategoryVo> selectAllAppCategoryList(); + List<MallGoodsCategory> selectCategoryListByParentId(@Param("id") Long id); List<MallGoodsCategory> selectRecommendCategoryList(); @@ -32,4 +34,6 @@ List<MallGoodsCategory> selectChildCategaryById(@Param("id")Long id); List<AdminMallGoodsCategoryTreeVo> getAllCategorys(); + + List<MallGoodsCategoryVo> selectAllCategoryListByIsApp(@Param("isApp")Integer isAppCategory); } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java index e0e1c42..dc70036 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java @@ -1,5 +1,6 @@ package cc.mrbird.febs.mall.mapper; +import cc.mrbird.febs.mall.dto.ApiMallGoodsQueryDto; import cc.mrbird.febs.mall.dto.MallGoodsQueryDto; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; import cc.mrbird.febs.mall.entity.MallGoods; @@ -22,6 +23,8 @@ MallGoods selectGoodsDetailById(@Param("id") Long id); IPage<AdminMallGoodsVo> selectMallGoodsInPage(Page<AdminMallGoodsVo> page, @Param("record")MallGoods mallGoods); + + IPage<AdminMallGoodsVo> selectMallAppGoodsInPage(Page<AdminMallGoodsVo> page, @Param("record")MallGoods mallGoods); Integer selectMallGoodsCountByGoodsName(@Param("goodsName")String goodsName); @@ -55,4 +58,5 @@ List<MallGoodsListVo> selectMallGoodsListQueryNoPage(@Param("record")MallGoodsQueryDto queryDto); + List<ApiMallGoodsListVo> selectMallGoodsListQueryNoPageIsApp(@Param("record") ApiMallGoodsQueryDto queryDto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java index 179a00a..ee26496 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java @@ -17,6 +17,8 @@ FebsResponse addCategory(MallGoodsCategory mallGoodsCategory); + FebsResponse addAppCategory(MallGoodsCategory mallGoodsCategory); + List<MallGoodsCategory> getCategorys(MallGoodsCategory mallGoodsCategory); AdminMallGoodsCategoryVo getMallGoodsCategoryInfoById(long id); @@ -24,8 +26,10 @@ List<AdminMallGoodsCategoryTreeVo> getParentCategorys(); FebsResponse updateCategory(MallGoodsCategory mallGoodsCategory); + FebsResponse updateAppCategory(MallGoodsCategory mallGoodsCategory); FebsResponse delCategary(Long id); + FebsResponse delAppCategary(Long id); List<AdminMallGoodsCategoryTreeVo> getAllCategorys(); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java index 8f50189..0f27857 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java @@ -16,8 +16,11 @@ public interface IAdminMallGoodsService extends IService<MallGoods> { IPage<AdminMallGoodsVo> getCategoryListInPage(MallGoods mallGoods, QueryRequest request); + IPage<AdminMallGoodsVo> getAppCategoryListInPage(MallGoods mallGoods, QueryRequest request); FebsResponse addMallGoods(AddMallGoodsDto addMallGoodsDto); + + FebsResponse addMallAppGoods(AddMallGoodsDto addMallGoodsDto); FebsResponse upMallGoods(Long id); @@ -32,6 +35,7 @@ MallGoods selectGoodsById(long id); FebsResponse updateMallGoods(MallGoodsUpdateDto mallGoodsUpdateDto); + FebsResponse updateAppMallGoods(MallGoodsUpdateDto mallGoodsUpdateDto); List<AdminMallGoodsTreeVo> getAllGoodsTree(); diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallAppService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallAppService.java new file mode 100644 index 0000000..a2d3219 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallAppService.java @@ -0,0 +1,19 @@ +package cc.mrbird.febs.mall.service; + +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.mall.dto.*; +import cc.mrbird.febs.mall.entity.MallAppMember; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface IApiMallAppService extends IService<MallAppMember> { + + FebsResponse appToLogin(LoginDto loginDto); + + FebsResponse appMemberInfo(ApiMallAppMemberInfoDto apiMallAppMemberInfoDto); + + FebsResponse findAllCategoryList(); + + FebsResponse findMallGoodsListNoPage(ApiMallGoodsQueryDto queryDto); + + FebsResponse createAppOrder(ApiAddOrderDto addOrderDto); +} diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallGoodsCategoryService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallGoodsCategoryService.java index 70b88e6..e50802a 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallGoodsCategoryService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallGoodsCategoryService.java @@ -10,6 +10,8 @@ List<MallGoodsCategoryVo> findAllCategoryList(); + List<MallGoodsCategoryVo> findAllAppCategoryList(); + List<MallGoodsCategory> findChildCategoryListById(Long id); List<MallGoodsCategory> findRecommendCategory(); diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java index 78a8d9c..a74487c 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java @@ -2,6 +2,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.entity.MallGoodsCategory; import cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper; @@ -77,6 +78,46 @@ } @Override + public FebsResponse addAppCategory(MallGoodsCategory mallGoodsCategory) { + + String name = mallGoodsCategory.getName(); + if(StrUtil.isEmpty(name)){ + return new FebsResponse().fail().message("分类名称不能为空"); + } + List<MallGoodsCategory> categorys = mallGoodsCategoryMapper.selectCategoryByName(name); + if(CollUtil.isNotEmpty(categorys)){ + return new FebsResponse().fail().message("分类名称不能重复"); + } +// Long parentIdParam = mallGoodsCategory.getParentId() == null ? 0L:mallGoodsCategory.getParentId(); +// Integer isRecommendParam = mallGoodsCategory.getIsRecommend(); +// if(parentIdParam > 0 && isRecommendParam == 1){ +// return new FebsResponse().fail().message("子分类不能选择【是否推荐】为【是】"); +// } + + MallGoodsCategory goodsCategory = new MallGoodsCategory(); + goodsCategory.setName(name); + goodsCategory.setIsApp(AppContants.IS_APP_CATEGORY); + goodsCategory.setImage(mallGoodsCategory.getImage()); + goodsCategory.setIndexNum(mallGoodsCategory.getIndexNum()); +// if(ObjectUtil.isNotEmpty(mallGoodsCategory.getParentId())){ +// Long parentId = mallGoodsCategory.getParentId(); +// MallGoodsCategory mallGoodsCategoryParent = mallGoodsCategoryMapper.selectById(parentId); +// goodsCategory.setParentId(mallGoodsCategory.getParentId()); +// if(StrUtil.isNotEmpty(mallGoodsCategoryParent.getParentIds())){ +// goodsCategory.setParentIds(mallGoodsCategoryParent.getParentIds()+","+mallGoodsCategory.getParentId()+","); +// }else{ +// goodsCategory.setParentIds(mallGoodsCategory.getParentId()+","); +// } +// goodsCategory.setIsRecommend(0); +// }else{ +// goodsCategory.setParentId(0L); +// goodsCategory.setIsRecommend(mallGoodsCategory.getIsRecommend()); +// } + mallGoodsCategoryMapper.insert(goodsCategory); + return new FebsResponse().success(); + } + + @Override public List<MallGoodsCategory> getCategorys(MallGoodsCategory mallGoodsCategory) { List<MallGoodsCategory> mallGoodsCategorys = mallGoodsCategoryMapper.getCategorys(); return mallGoodsCategorys; @@ -130,6 +171,42 @@ } @Override + public FebsResponse updateAppCategory(MallGoodsCategory mallGoodsCategoryParam) { + String name = mallGoodsCategoryParam.getName(); + if(StrUtil.isEmpty(name)){ + return new FebsResponse().fail().message("名称不能为空"); + } +// Long parentIdParam = mallGoodsCategoryParam.getParentId() == null ? 0L:mallGoodsCategoryParam.getParentId(); +// Integer isRecommendParam = mallGoodsCategoryParam.getIsRecommend(); +// if(parentIdParam > 0 && isRecommendParam == 1){ +// return new FebsResponse().fail().message("子分类不能选择【是否推荐】为【是】"); +// } + + Long id = mallGoodsCategoryParam.getId(); + MallGoodsCategory mallGoodsCategory = mallGoodsCategoryMapper.selectById(id); + mallGoodsCategory.setName(mallGoodsCategoryParam.getName()); + mallGoodsCategory.setImage(mallGoodsCategoryParam.getImage()); + mallGoodsCategory.setIndexNum(mallGoodsCategoryParam.getIndexNum()); +// if(ObjectUtil.isNotEmpty(mallGoodsCategoryParam.getParentId())){ +// Long parentId = mallGoodsCategoryParam.getParentId(); +// MallGoodsCategory mallGoodsCategoryParent = mallGoodsCategoryMapper.selectById(parentId); +// mallGoodsCategory.setParentId(mallGoodsCategoryParam.getParentId()); +// if(StrUtil.isNotEmpty(mallGoodsCategoryParent.getParentIds())){ +// mallGoodsCategory.setParentIds(mallGoodsCategoryParent.getParentIds()+","+mallGoodsCategory.getParentId()+","); +// }else{ +// mallGoodsCategory.setParentIds(mallGoodsCategory.getParentId()+","); +// } +// mallGoodsCategory.setIsRecommend(0); +// }else{ +// mallGoodsCategory.setParentId(0L); +// mallGoodsCategory.setIsRecommend(mallGoodsCategoryParam.getIsRecommend()); +// } + mallGoodsCategoryMapper.updateById(mallGoodsCategory); + + return new FebsResponse().success(); + } + + @Override public FebsResponse delCategary(Long id) { MallGoodsCategory mallGoodsCategory = mallGoodsCategoryMapper.selectById(id); if(ObjectUtil.isEmpty(mallGoodsCategory)){ @@ -159,6 +236,35 @@ } @Override + public FebsResponse delAppCategary(Long id) { + MallGoodsCategory mallGoodsCategory = mallGoodsCategoryMapper.selectById(id); + if(ObjectUtil.isEmpty(mallGoodsCategory)){ + return new FebsResponse().fail().message("系统繁忙,请刷新页面重试"); + } + List<MallGoodsCategory> childCategarys = mallGoodsCategoryMapper.selectChildCategaryById(id); + if(CollUtil.isNotEmpty(childCategarys)){ + for(MallGoodsCategory childCategary : childCategarys){ + Long childCategaryId = childCategary.getId(); + List<MallGoods> mallChildGoods = mallGoodsMapper.selectMallGoodsByCategaryId(childCategaryId); + if(CollUtil.isNotEmpty(mallChildGoods)){ + return new FebsResponse().fail().message("该分类下的子类【"+childCategary.getName()+"】还有商品,请先删除商品或者修改商品分类"); + } + } + } + + if(CollUtil.isNotEmpty(childCategarys)){ + return new FebsResponse().fail().message("该分类下还有子类,请先删除子类"); + } + + List<MallGoods> mallGoods = mallGoodsMapper.selectMallGoodsByCategaryId(id); + if(CollUtil.isNotEmpty(mallGoods)){ + return new FebsResponse().fail().message("该分类下还有商品,请先删除商品或者修改商品分类"); + } + mallGoodsCategoryMapper.deleteById(mallGoodsCategory); + return new FebsResponse().success(); + } + + @Override public List<AdminMallGoodsCategoryTreeVo> getAllCategorys() { List<AdminMallGoodsCategoryTreeVo> adminMallGoodsCategoryTreeVos = mallGoodsCategoryMapper.getAllCategorys(); return adminMallGoodsCategoryTreeVos; diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java index a65ff45..fb462ea 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java @@ -2,6 +2,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.mall.conversion.MallGoodsConversion; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; @@ -44,6 +45,13 @@ public IPage<AdminMallGoodsVo> getCategoryListInPage(MallGoods mallGoods, QueryRequest request) { Page<AdminMallGoodsVo> page = new Page<>(request.getPageNum(), request.getPageSize()); IPage<AdminMallGoodsVo> adminMallGoodsVos = this.baseMapper.selectMallGoodsInPage(page, mallGoods); + return adminMallGoodsVos; + } + + @Override + public IPage<AdminMallGoodsVo> getAppCategoryListInPage(MallGoods mallGoods, QueryRequest request) { + Page<AdminMallGoodsVo> page = new Page<>(request.getPageNum(), request.getPageSize()); + IPage<AdminMallGoodsVo> adminMallGoodsVos = this.baseMapper.selectMallAppGoodsInPage(page, mallGoods); return adminMallGoodsVos; } @@ -194,6 +202,23 @@ } return new FebsResponse().success().message("操作成功"); + } + + @Override + @Transactional + public FebsResponse addMallAppGoods(AddMallGoodsDto addMallGoodsDto) { + String goodsNo = addMallGoodsDto.getGoodsNo(); + Integer mallGoodsByGoodsNo = mallGoodsMapper.selectMallGoodsCountByGoodsNo(goodsNo); + if (mallGoodsByGoodsNo > 0) { + return new FebsResponse().fail().message("商品编号不能重复"); + } + //新增商品 + MallGoods mallGoods = MallGoodsConversion.INSTANCE.dtoToEntity(addMallGoodsDto); + mallGoods.setIsSale(MallGoods.ISSALE_STATUS_DISABLED); + mallGoods.setIsApp(AppContants.IS_APP_GOODS); + mallGoodsMapper.insert(mallGoods); + return new FebsResponse().success().message("添加成功"); + } @Override @@ -470,6 +495,15 @@ } @Override + public FebsResponse updateAppMallGoods(MallGoodsUpdateDto mallGoodsUpdateDto) { + //新增商品 + MallGoods mallGoods = mallGoodsMapper.selectById(mallGoodsUpdateDto.getId()); + BeanUtil.copyProperties(mallGoodsUpdateDto, mallGoods); + mallGoodsMapper.updateById(mallGoods); + return new FebsResponse().success().message("操作成功"); + } + + @Override public List<AdminMallGoodsTreeVo> getAllGoodsTree() { return mallGoodsMapper.getAllGoodsTree(); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java new file mode 100644 index 0000000..c43e24b --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java @@ -0,0 +1,104 @@ +package cc.mrbird.febs.mall.service.impl; + +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.exception.FebsException; +import cc.mrbird.febs.common.utils.AppContants; +import cc.mrbird.febs.common.utils.LoginUserUtil; +import cc.mrbird.febs.common.utils.RedisUtils; +import cc.mrbird.febs.mall.dto.*; +import cc.mrbird.febs.mall.entity.MallAppMember; +import cc.mrbird.febs.mall.entity.MallMember; +import cc.mrbird.febs.mall.mapper.MallAppMemberMapper; +import cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper; +import cc.mrbird.febs.mall.mapper.MallGoodsMapper; +import cc.mrbird.febs.mall.mapper.MallMemberMapper; +import cc.mrbird.febs.mall.service.IApiMallAppService; +import cc.mrbird.febs.mall.vo.ApiMallAppMemberInfoVo; +import cc.mrbird.febs.mall.vo.ApiMallGoodsListVo; +import cc.mrbird.febs.mall.vo.MallGoodsCategoryVo; +import cc.mrbird.febs.mall.vo.MallGoodsListVo; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ApiMallAppServiceImpl extends ServiceImpl<MallAppMemberMapper, MallAppMember> implements IApiMallAppService { + + private final RedisUtils redisUtils; + private final MallMemberMapper mallMemberMapper; + private final MallGoodsCategoryMapper mallGoodsCategoryMapper; + private final MallGoodsMapper mallGoodsMapper; + + @Override + public FebsResponse appToLogin(LoginDto loginDto) { + String md5Pwd = SecureUtil.md5(loginDto.getPassword()); + + MallMember mallMember = mallMemberMapper.selectInfoByAccountAndPwd(loginDto.getAccount(), md5Pwd); + if (mallMember == null) { + throw new FebsException("用户不存在或账号密码错误"); + } + + String redisKey = AppContants.SY_APP_LOGIN_PREFIX + mallMember.getId(); + String existToken = redisUtils.getString(redisKey); + if (StrUtil.isNotBlank(existToken)) { + Object o = redisUtils.get(existToken); + if (ObjectUtil.isNotEmpty(o)) { + redisUtils.del(existToken); + } + } + + String token = IdUtil.simpleUUID(); + redisUtils.set(token, JSONObject.toJSONString(mallMember)); + redisUtils.set(redisKey, token); + Map<String, Object> authInfo = new HashMap<>(); + authInfo.put("token", token); + authInfo.put("rasToken", generateAsaToken(token)); + return new FebsResponse().success().data(authInfo); + } + + @Override + public FebsResponse appMemberInfo(ApiMallAppMemberInfoDto apiMallAppMemberInfoDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + List<ApiMallAppMemberInfoVo> mallMembers = this.baseMapper.selectMemberInfoLikePhone(apiMallAppMemberInfoDto.getPhone()); + return new FebsResponse().success().data(mallMembers); + } + + @Override + public FebsResponse findAllCategoryList() { + List<MallGoodsCategoryVo> mallGoodsCategoryVos = mallGoodsCategoryMapper.selectAllCategoryListByIsApp(AppContants.IS_APP_CATEGORY); + return new FebsResponse().success().data(mallGoodsCategoryVos); + } + + @Override + public FebsResponse findMallGoodsListNoPage(ApiMallGoodsQueryDto queryDto) { + List<ApiMallGoodsListVo> mallGoodsListVos = mallGoodsMapper.selectMallGoodsListQueryNoPageIsApp(queryDto); + return new FebsResponse().success().data(mallGoodsListVos); + } + + @Override + public FebsResponse createAppOrder(ApiAddOrderDto addOrderDto) { + +// return new FebsResponse().success().data(orderId).message("创建订单成功"); + return new FebsResponse().success().message("创建订单成功"); + } + + public String generateAsaToken(String token) { + RSA rsa = new RSA(null, AppContants.PUBLIC_KEY); + return rsa.encryptBase64(token + "_" + System.currentTimeMillis(), KeyType.PublicKey); + } + +} diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsCategoryServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsCategoryServiceImpl.java index b2aeb8b..eecf9aa 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsCategoryServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsCategoryServiceImpl.java @@ -27,6 +27,11 @@ } @Override + public List<MallGoodsCategoryVo> findAllAppCategoryList() { + return this.baseMapper.selectAllAppCategoryList(); + } + + @Override public List<MallGoodsCategory> findChildCategoryListById(Long id) { return this.baseMapper.selectCategoryListByParentId(id); } diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ApiMallAppMemberInfoVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiMallAppMemberInfoVo.java new file mode 100644 index 0000000..0e07ceb --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiMallAppMemberInfoVo.java @@ -0,0 +1,26 @@ +package cc.mrbird.febs.mall.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "ApiMallAppMemberInfoVo", description = "返回参数类") +public class ApiMallAppMemberInfoVo { + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "昵称") + private String nickname; + + @ApiModelProperty(value = "电话号码") + private String phone; + + @ApiModelProperty(value = "余额") + private String balance; + + @ApiModelProperty(value = "积分") + private String score; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ApiMallGoodsListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiMallGoodsListVo.java new file mode 100644 index 0000000..8e00aa4 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiMallGoodsListVo.java @@ -0,0 +1,34 @@ +package cc.mrbird.febs.mall.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(value = "ApiMallGoodsListVo", description = "商城商品列表") +public class ApiMallGoodsListVo { + + @ApiModelProperty(value = "id") + private Long id; + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "主图") + private String thumb; + + @ApiModelProperty(value = "原价") + private String originalPrice; + + @ApiModelProperty(value = "现价") + private String presentPrice; + + @ApiModelProperty(value = "1:按数量计价 2:按重量计价") + private String unit; + + @ApiModelProperty(value = "积分") + private BigDecimal score; + +} diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index cd2f814..f7c47ff 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -30,7 +30,7 @@ # Redis服务器地址 host: 120.27.238.55 # Redis服务器连接端口 - port: 6379 + port: 6479 # Redis 密码 password: d3y6dsdl;f.327 lettuce: diff --git a/src/main/resources/mapper/modules/MallAppMemberMapper.xml b/src/main/resources/mapper/modules/MallAppMemberMapper.xml new file mode 100644 index 0000000..4410182 --- /dev/null +++ b/src/main/resources/mapper/modules/MallAppMemberMapper.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cc.mrbird.febs.mall.mapper.MallAppMemberMapper"> + + <select id="selectByAccountAndPassword" resultType="cc.mrbird.febs.mall.entity.MallAppMember"> + select * from mall_app_member + where + account = #{account} + and password = #{password} + </select> + + <select id="selectMemberInfoLikePhone" resultType="cc.mrbird.febs.mall.vo.ApiMallAppMemberInfoVo"> + select + a.avatar phone, + a.name nickname, + a.phone phone, + IFNULL(b.balance,0) balance, + IFNULL(b.score,0) score + from mall_member a + left join mall_member_wallet b on a.id = b.member_id + where + a.phone like concat('%', #{phone}) + </select> +</mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml b/src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml index 6b2ba37..f551b23 100644 --- a/src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml +++ b/src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml @@ -11,6 +11,9 @@ <if test="record.name!=null and record.name!=''"> and m.name like concat('%', #{record.name},'%') </if> + <if test="record.isApp != null and record.isApp != ''"> + and m.is_app = #{record.isApp} + </if> </if> </where> order by m.parent_id,m.index_num asc @@ -49,6 +52,16 @@ from mall_goods_category a left join mall_goods_category b on a.id=b.parent_id where a.parent_id = 0 + and a.is_app is NULL + order by a.index_num asc + </select> + + <select id="selectAllAppCategoryList" resultMap="mallGoodsCategoryVoMap"> + select + a.id, + a.name + from mall_goods_category a + where a.is_app = 1 order by a.index_num asc </select> @@ -60,7 +73,9 @@ <select id="selectRecommendCategoryList" resultType="cc.mrbird.febs.mall.entity.MallGoodsCategory"> select * from mall_goods_category - where parent_id=0 and is_recommend = 1 + where parent_id=0 + and is_recommend = 1 + and is_app is NULL order by index_num asc </select> @@ -81,4 +96,21 @@ <select id="getAllCategorys" resultType="cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryTreeVo"> SELECT m.id parentId,m.name name FROM mall_goods_category m ; </select> + + + <select id="selectAllCategoryListByIsApp" resultMap="mallGoodsCategoryVoMap"> + select + a.id, + a.name, + a.image, + a.parent_id, + b.id child_id, + b.name child_name, + b.parent_id child_parent_id + from mall_goods_category a + left join mall_goods_category b on a.id=b.parent_id + where a.parent_id = 0 + and a.is_app = #{isApp} + order by a.index_num asc + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallGoodsMapper.xml b/src/main/resources/mapper/modules/MallGoodsMapper.xml index faa756b..332985a 100644 --- a/src/main/resources/mapper/modules/MallGoodsMapper.xml +++ b/src/main/resources/mapper/modules/MallGoodsMapper.xml @@ -81,6 +81,7 @@ left join mall_goods_category c on a.category_id=c.id <where> a.is_sale=1 + and a.is_app is null <if test="record != null"> <if test="record.isHot != null and record.isHot != ''"> and a.is_hot = #{record.isHot} @@ -146,12 +147,41 @@ left join mall_goods_category b on b.id = a.category_id left join mall_goods_sku c on c.goods_id = a.id <where> + a.is_app is null <if test="record != null"> <if test="record.goodsName != null and record.goodsName != ''"> and a.goods_name like CONCAT('%', CONCAT(#{record.goodsName}, '%')) </if> <if test="record.goodsType != null and record.goodsType != ''"> and a.goods_type=#{record.goodsType} + </if> + </if> + </where> + group by a.id + order by a.created_time desc + </select> + + <select id="selectMallAppGoodsInPage" resultType="cc.mrbird.febs.mall.vo.AdminMallGoodsVo"> + select + a.id, + a.goods_name, + a.goods_no, + a.unit, + a.thumb, + a.is_sale, + a.original_price, + a.present_price, + a.score, + a.volume saleVolume, + b.name categaryName, + a.stock + from mall_goods a + left join mall_goods_category b on b.id = a.category_id + <where> + a.is_app = 1 + <if test="record != null"> + <if test="record.goodsName != null and record.goodsName != ''"> + and a.goods_name like CONCAT('%', CONCAT(#{record.goodsName}, '%')) </if> </if> </where> @@ -298,6 +328,8 @@ left join mall_goods_category c on a.category_id=c.id <where> a.is_sale=1 + and + a.is_app is null <if test="record != null"> <if test="record.isHot != null and record.isHot != ''"> and a.is_hot = #{record.isHot} @@ -341,4 +373,26 @@ </if> </select> + <select id="selectMallGoodsListQueryNoPageIsApp" resultType="cc.mrbird.febs.mall.vo.ApiMallGoodsListVo"> + select + a.id, + a.goods_name, + a.thumb, + a.original_price, + a.present_price, + a.unit, + a.score + from mall_goods a + left join mall_goods_category c on a.category_id=c.id + <where> + <if test="record != null"> + <if test="record.categoryId != null and record.categoryId != ''"> + and (c.id = #{record.categoryId} or c.parent_id=#{record.categoryId}) + </if> + </if> + </where> + group by a.id + order by a.id desc + </select> + </mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsAppAddNew.html b/src/main/resources/templates/febs/views/modules/goods/goodsAppAddNew.html new file mode 100644 index 0000000..e045d53 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/goods/goodsAppAddNew.html @@ -0,0 +1,234 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-goods-app-add" lay-title="新增APP商品"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-fluid" id="goods-app-add"> + <form class="layui-form" action="" lay-filter="goods-app-add-form"> + <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> + <ul class="layui-tab-title"> + <li class="layui-this">基础信息</li> + </ul> + <div class="layui-tab-content"> + <div class="layui-tab-item layui-show"> + <blockquote class="layui-elem-quote blue-border">基本信息设置</blockquote> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">商品名称:</label> + <div class="layui-input-block"> + <input type="text" name="goodsName" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">商品编号:</label> + <div class="layui-input-block"> + <input type="text" name="goodsNo" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">商品分类:</label> + <div class="layui-input-block"> + <div id="goods-category"></div> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">单位</label> + <div class="layui-input-block"> + <select name="unit"> + <option value="1">按数量</option> + <option value="2">按重量</option> + </select> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">原价:</label> + <div class="layui-input-block"> + <input type="text" name="originalPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">现价:</label> + <div class="layui-input-block"> + <input type="text" name="presentPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> +<!-- <div class="layui-form-mid layui-word-aux">现价设置为0进入零撸专区</div>--> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">成本价:</label> + <div class="layui-input-block"> + <input type="text" name="costPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">库存:</label> + <div class="layui-input-block"> + <input type="text" name="stock" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">销量:</label> + <div class="layui-input-block"> + <input type="text" name="volume" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">缩略图:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="test2">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="demo2"></div> + </blockquote> +<!-- <div class="layui-word-aux">双击图片删除</div>--> + </div> + </div> + </div> + + <div class="layui-form-item"> +<!-- <div class="layui-form-item febs-hide">--> + <label class="layui-form-label">缩略图链接:</label> + <div class="layui-input-block"> + <input type="text" id="thumb" lay-verify="required" name="thumb" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="goods-app-add-form-submit" id="submit">保存</button> + </div> + </form> + </div> + </div> + </div> +</div> +<style> + .blue-border { + border-left-color: #2db7f5; + font-size: 18px; + } + .layui-table-cell { + height:auto; + } + .layui-upload-list { + margin: 0 !important; + } + .multi-images { + margin: 0 5px !important; + } +</style> +<script type="text/html" id="toolbar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" lay-event="delSku">删除</button> + </div> +</script> +<script type="text/html" id="tableImgUpload"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn-xs sku-img" id="skuImg{{d.index}}">上传</button></br> + <img class="layui-upload-img" id="imageUrls{{d.index}}" style="width: 100px; display:none;" src="{{d.skuImage}}" > + <input type="text" id="skuImage{{d.index}}" name="skuImage{{d.index}}" autocomplete="off" value="{{d.skuImage}}" class="layui-input febs-hide"> + </div> +</script> +<!-- 表格操作栏 end --> +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + table = layui.table, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + laydate = layui.laydate, + eleTree = layui.eleTree, + $view = $('#goods-app-add'), + layedit = layui.layedit, + upload = layui.upload, + validate = layui.validate, + element = layui.element; + + form.render(); + formSelects.render(); + var category = xmSelect.render({ + el: '#goods-category', + language: 'zn', + prop : { + value : 'id', + children : 'child' + }, + iconfont: { + parent: 'hidden', + }, + radio: true, + clickClose: true, + tree: { + show: true, + //非严格模式 + strict: false, + }, + data: [] + }) + + febs.get(ctx + 'admin/goodsCategory/categoryAppTree', null, function(res) { + category.update({ + data : res.data, + autoRow: true, + }); + }) + + //图片上传 + upload.render({ + elem: '#test2' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,multiple: true + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + if ($("#thumb").val()) { + $('#demo2').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + } else { + $('#demo2').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + } + + }); + } + ,done: function(res){ + $("#thumb").val(res.data.src); + } + }); + + form.on('submit(goods-app-add-form-submit)', function (data) { + data.field.goodsType = 1; + data.field.categoryId = category.getValue('valueStr'); + $.ajax({ + 'url':ctx + 'admin/goods/addMallAppGoods', + 'type':'post', + 'dataType':'json', + 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 + 'traditional': true,//ajax传递数组必须添加属性 + 'data':JSON.stringify(data.field), + 'success':function (data) { + if(data.code==200){ + layer.closeAll(); + febs.alert.success(data.message); + $('#febs-app-goods').find('#reset').click(); + }else{ + febs.alert.warn(data.message); + } + }, + 'error':function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsAppList.html b/src/main/resources/templates/febs/views/modules/goods/goodsAppList.html new file mode 100644 index 0000000..9c1d0f2 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/goods/goodsAppList.html @@ -0,0 +1,229 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-app-goods" lay-title="APP商品列表"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-body febs-table-full"> + <form class="layui-form layui-table-form" lay-filter="user-table-form"> + <div class="layui-row"> + <div class="layui-col-md10"> + <div class="layui-form-item"> + <div class="layui-inline"> + <div class="layui-input-inline"> + <input type="text" placeholder="名称" name="goodsName" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + </div> + <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="add"> + 新增 + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> + <i class="layui-icon"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="appGoodsTable" lay-data="{id: 'appGoodsTable'}"></table> + <style type="text/css"> + .layui-table-cell{ + text-align:center; + height: auto; + white-space: nowrap; /*文本不会换行,在同一行显示*/ + overflow: hidden; /*超出隐藏*/ + text-overflow: ellipsis; /*省略号显示*/ + } + .layui-table img{ + max-width:100px + } + </style> + </div> + </div> + </div> + </div> +</div> +<!-- 表格操作栏 start --> +<script type="text/html" id="user-option"> + <span shiro:lacksPermission="user:view,user:update,user:delete"> + <span class="layui-badge-dot febs-bg-orange"></span> 无权限 + </span> + <a lay-event="edit" shiro:hasPermission="user:update"><i + class="layui-icon febs-edit-area febs-blue"></i></a> +</script> +<script type="text/html" id="upOrDownSwitch"> + {{# if(d.isSale === 1) { }} + <input type="checkbox" value={{d.id}} lay-text="上架|下架" checked lay-skin="switch" lay-filter="upOrDownSwitch"> + {{# } else { }} + <input type="checkbox" value={{d.id}} lay-text="上架|下架" lay-skin="switch" lay-filter="upOrDownSwitch"> + {{# } }} +</script> + +<style> + .layui-form-onswitch { + background-color: #5FB878 !important; + } +</style> +<!-- 表格操作栏 end --> +<script data-th-inline="none" type="text/javascript"> + // 引入组件并初始化 + layui.use([ 'jquery', 'form', 'table', 'febs'], function () { + var $ = layui.jquery, + febs = layui.febs, + form = layui.form, + table = layui.table, + $view = $('#febs-app-goods'), + $query = $view.find('#query'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + $add = $view.find('#add'), + sortObject = {field: 'phone', type: null}, + tableIns; + + form.render(); + + // 表格初始化 + initTable(); + + // 初始化表格操作栏各个按钮功能 + table.on('tool(appGoodsTable)', function (obj) { + var data = obj.data, + layEvent = obj.event; + if (layEvent === 'downGoods') { + febs.modal.confirm('下架', '确认下架该商品?', function () { + downGoods(data.id); + }); + } + if (layEvent === 'upGoods') { + febs.modal.confirm('上架', '确认上架该商品?', function () { + upGoods(data.id); + }); + } + if (layEvent === 'delGoods') { + febs.modal.confirm('删除', '确认删除该商品?', function () { + delGoods(data.id); + }); + } + if (layEvent === 'goodsAppUpdate') { + febs.modal.open('编辑', 'modules/goods/goodsAppUpdateNew/' + data.id, { + btn: ['提交', '取消'], + area:['100%','100%'], + yes: function (index, layero) { + $('#febs-app-update').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + if (layEvent === 'seeImgThumb') { + var t = $view.find('#seeImgThumb'+data.id+''); + //页面层 + layer.open({ + type: 1, + title: "图片", + skin: 'layui-layer-rim', //加上边框 + area: ['80%', '80%'], //宽高 + shadeClose: true, //开启遮罩关闭 + end: function (index, layero) { + return false; + }, + content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>' + }); + } + }); + function downGoods(id) { + febs.get(ctx + 'admin/goods/downMallGoods/' + id, null, function () { + febs.alert.success('下架成功'); + $query.click(); + }); + } + function delGoods(id) { + febs.get(ctx + 'admin/goods/delMallGoods/' + id, null, function () { + febs.alert.success('删除成功'); + $query.click(); + }); + } + function upGoods(id) { + febs.get(ctx + 'admin/goods/upMallGoods/' + id, null, function () { + febs.alert.success('上架成功'); + $query.click(); + }); + } + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: 1}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); + }); + + $add.on('click', function () { + febs.modal.open('新增商品', 'modules/goods/goodsAppAddNew/', { + btn: ['提交', '取消'], + area:['100%','100%'], + yes: function (index, layero) { + $('#febs-goods-app-add').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + }); + + function initTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'appGoodsTable', + url: ctx + 'admin/goods/goodsAppList', + cols: [[ + {field: 'goodsNo', title: '商品编号', minWidth: 100,align:'left'}, + {field: 'goodsName', title: '商品名称', minWidth: 140,align:'left'}, + {field: 'thumb', title: '缩略图', + templet: function (d) { + return '<a lay-event="seeImgThumb"><img id="seeImgThumb'+d.id+'" src="'+d.thumb+'" alt=""></a>'; + }, minWidth: 150,align:'center'}, + {field: 'categaryName', title: '分类', minWidth: 140,align:'left'}, + {field: 'isSale', title: '是否上架', templet: '#upOrDownSwitch', minWidth: 100,align:'center'}, + {field: 'presentPrice', title: '现价', minWidth: 100,align:'left'}, + {field: 'originalPrice', title: '原价', minWidth: 100,align:'left'}, + {field: 'stock', title: '商品库存', minWidth: 100,align:'left'}, + {field: 'saleVolume', title: '商品销量', minWidth: 100,align:'left'}, + {title: '操作', + templet: function (d) { + if (d.isSale === 1) { + return ''; + }else{ + return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="goodsAppUpdate" shiro:hasPermission="user:update">编辑</button>' + + '<button class="layui-btn layui-btn-normal layui-btn-xs febs-bg-red" lay-event="delGoods" shiro:hasPermission="user:update">删除</button>' + + } + },minWidth: 160,align:'center'} + ]] + }); + } + + form.on('switch(upOrDownSwitch)', function (data) { + if (data.elem.checked) { + upGoods(data.value); + } else { + downGoods(data.value); + } + }) + // 获取查询参数 + function getQueryParams() { + return { + goodsName: $searchForm.find('input[name="goodsName"]').val().trim(), + }; + } + + }) +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsAppUpdateNew.html b/src/main/resources/templates/febs/views/modules/goods/goodsAppUpdateNew.html new file mode 100644 index 0000000..ab2738e --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/goods/goodsAppUpdateNew.html @@ -0,0 +1,280 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-app-update" lay-title="编辑商品"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"><div class="layui-fluid" id="goods-app-update"> + <form class="layui-form" action="" lay-filter="goods-app-update-form"> + <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> + <ul class="layui-tab-title"> + <li class="layui-this">基础信息</li> + </ul> + <input type="text" name="id" + placeholder="" autoComplete="off" class="layui-input febs-hide"> + <div class="layui-tab-content"> + <div class="layui-tab-item layui-show"> + <blockquote class="layui-elem-quote blue-border">基本信息设置</blockquote> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">商品名称:</label> + <div class="layui-input-block"> + <input type="text" name="goodsName" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">商品编号:</label> + <div class="layui-input-block"> + <input type="text" name="goodsNo" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">商品分类:</label> + <div class="layui-input-block"> + <div id="goods-category"></div> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">单位</label> + <div class="layui-input-block"> + <select name="unit"> + <option value="1">按数量</option> + <option value="2">按重量</option> + </select> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">原价:</label> + <div class="layui-input-block"> + <input type="text" name="originalPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">现价:</label> + <div class="layui-input-block"> + <input type="text" name="presentPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + <!-- <div class="layui-form-mid layui-word-aux">现价设置为0进入零撸专区</div>--> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">成本价:</label> + <div class="layui-input-block"> + <input type="text" name="costPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">库存:</label> + <div class="layui-input-block"> + <input type="text" name="stock" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">销量:</label> + <div class="layui-input-block"> + <input type="text" name="volume" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">缩略图:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="test2">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="demo2"></div> + </blockquote> + <!-- <div class="layui-word-aux">双击图片删除</div>--> + </div> + </div> + </div> + + <div class="layui-form-item"> + <!-- <div class="layui-form-item febs-hide">--> + <label class="layui-form-label">缩略图链接:</label> + <div class="layui-input-block"> + <input type="text" id="thumb" lay-verify="required" name="thumb" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + </div> + </div> + <div class="layui-form-item febs-hide" style="text-align:center"> + <button class="layui-btn" lay-submit="" lay-filter="goods-app-update-form-submit" + id="submit"> + </button> + </div> + </form> + </div> + </div> + </div> +</div> +<style> + .blue-border { + border-left-color: #2db7f5; + font-size: 18px; + } + + .layui-table-cell { + height: auto; + } + + .layui-upload-list { + margin: 0 !important; + } + .multi-images { + margin: 0 5px !important; + } +</style> +<script type="text/html" id="toolbar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" lay-event="delSku">删除</button> + </div> +</script> +<script type="text/html" id="tableImgUpload"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn-xs sku-img" id="skuImg{{d.index}}">上传 + </button> + </br> + <img class="layui-upload-img" id="imageUrls{{d.index}}" style="width: 100px; display:none;" + src="{{d.skuImage}}"> + <input type="text" id="skuImage{{d.index}}" name="skuImage{{d.index}}" autoComplete="off" value="{{d.skuImage}}" + class="layui-input febs-hide"> + </div> +</script> +<!-- 表格操作栏 end --> +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + table = layui.table, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + laydate = layui.laydate, + eleTree = layui.eleTree, + goodsInfo = [[${goodsInfo}]], + $view = $('#goods-app-update'), + layedit = layui.layedit, + upload = layui.upload, + validate = layui.validate, + element = layui.element; + + form.render(); + + formSelects.render(); + + var category = xmSelect.render({ + el: '#goods-category', + language: 'zn', + prop : { + value : 'id', + children : 'child' + }, + iconfont: { + parent: 'hidden', + }, + radio: true, + clickClose: true, + tree: { + show: true, + //非严格模式 + strict: false, + }, + data: [] + }) + + febs.get(ctx + 'admin/goodsCategory/categoryAppTree', null, function(res) { + category.update({ + data : res.data, + autoRow: true, + }); + + initValue(); + }) + + //图片上传 + upload.render({ + elem: '#test2' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,multiple: true + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + if ($("#thumb").val()) { + $('#demo2').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + } else { + $('#demo2').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + } + + }); + } + ,done: function(res){ + $("#thumb").val(res.data.src); + } + }); + + + function initValue() { + form.val("goods-app-update-form", { + "id": goodsInfo.id, + "goodsName": goodsInfo.goodsName, + "goodsNo": goodsInfo.goodsNo, + "unit": goodsInfo.unit, + "stock": goodsInfo.stock, + "volume": goodsInfo.volume, + "originalPrice": goodsInfo.originalPrice, + "presentPrice": goodsInfo.presentPrice, + "costPrice": goodsInfo.costPrice, + "thumb": goodsInfo.thumb + }); + + var arr = []; + arr.push(goodsInfo.categoryId) + category.setValue(arr); + + $('#demo2').append('<img src="' + goodsInfo.thumb + '" alt="" class="layui-upload-img single-image" style="width: 130px">') + } + + form.on('submit(goods-app-update-form-submit)', function (data) { + data.field.categoryId = category.getValue('valueStr'); + $.ajax({ + 'url': ctx + 'admin/goods/updateAppMallGoods', + 'type': 'post', + 'dataType': 'json', + 'headers': {'Content-Type': 'application/json;charset=utf-8'}, //接口json格式 + 'traditional': true,//ajax传递数组必须添加属性 + 'data': JSON.stringify(data.field), + 'success': function (data) { + if (data.code == 200) { + layer.closeAll(); + febs.alert.success(data.message); + $('#febs-app-goods').find('#reset').click(); + } else { + febs.alert.warn(data.message); + } + }, + 'error': function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + + form.on('select(goods-type-select)', function (data) { + $('.tc-set').each(function () { + if (data.value == 2) { + $(this).show(); + } else { + $(this).hide(); + } + }) + }); + + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/product/categoryAppAdd.html b/src/main/resources/templates/febs/views/modules/product/categoryAppAdd.html new file mode 100644 index 0000000..27240ce --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/product/categoryAppAdd.html @@ -0,0 +1,130 @@ +<style> + #categary-app-add { + padding: 20px 25px 25px 0; + } + + #categary-app-add .layui-treeSelect .ztree li a, .ztree li span { + margin: 0 0 2px 3px !important; + } + #categary-app-add #data-permission-tree-block { + border: 1px solid #eee; + border-radius: 2px; + padding: 3px 0; + } + #categary-app-add .layui-treeSelect .ztree li span.button.switch { + top: 1px; + left: 3px; + } + #categary-app-add img{ + max-width:100px + } + +</style> +<div class="layui-fluid" id="categary-app-add"> + <form class="layui-form" action="" lay-filter="categary-app-add-form"> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">名称:</label> + <div class="layui-input-block"> + <input type="text" name="name" + lay-verify="required" autocomplete="off" class="layui-input" > + </div> + </div> + +<!-- <div class="layui-form-item">--> +<!-- <label class="layui-form-label">父类:</label>--> +<!-- <div class="layui-input-inline">--> +<!-- <select name="parentId" class="categary-app-add-category">--> +<!-- <option value="">请选择</option>--> +<!-- </select>--> +<!-- </div>--> +<!-- </div>--> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">图片:</label> + <div class="layui-upload"> + <button type="button" class="layui-btn" id="test1">上传图片</button> + <div class="layui-input-block"> + <div class="layui-upload-list"> + <img class="layui-upload-img" id="imageUrls" width="100%" > + </div> + </div> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label ">图片链接:</label> + <div class="layui-input-block"> + <input type="text" id="imageUrl" lay-verify="required" name="image" class="layui-input" readonly> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">排序:</label> + <div class="layui-input-block"> + <input type="number" name="indexNum" + lay-verify="indexNum" autocomplete="off" class="layui-input" > + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="categary-app-add-form-submit" id="submit"></button> + </div> + </form> +</div> + +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate','upload'], function () { + var $ = layui.$, + febs = layui.febs, + layer = layui.layer, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + laydate = layui.laydate, + eleTree = layui.eleTree, + member = [[${member}]], + $view = $('#categary-app-add'), + upload = layui.upload, + validate = layui.validate; + + form.render(); + laydate.render({ + elem: '#febs-form-group-date' + }); + + formSelects.render(); + + //普通图片上传 + var uploadInst = upload.render({ + elem: '#test1' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#imageUrls').attr('src', result); //图片链接(base64) + }); + } + ,done: function(res){ + febs.alert.success(res.data.src); + $("#imageUrl").val(res.data.src); + } + }); + + //(下拉框) + // $.get(ctx + 'admin/goodsCategory/categorys/tree', function (data) { + // for (var k in data) + // { + // $(".categary-app-add-category").append("<option value='" + data[k].parentId + "'>" + data[k].name + "</option>"); + // } + // layui.use('form', function () { + // var form = layui.form; + // form.render(); + // }); + // }); + + form.on('submit(categary-app-add-form-submit)', function (data) { + febs.post(ctx + 'admin/goodsCategory/addAppCategory', data.field, function () { + layer.closeAll(); + febs.alert.success('新增成功'); + $('#febs-app-category').find('#reset').click(); + }); + return false; + }); + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/product/categoryAppList.html b/src/main/resources/templates/febs/views/modules/product/categoryAppList.html new file mode 100644 index 0000000..0154dae --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/product/categoryAppList.html @@ -0,0 +1,174 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-app-category" lay-title="APP商品分类"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-body febs-table-full"> + <form class="layui-form layui-table-form" lay-filter="user-table-form"> + <div class="layui-row"> + <div class="layui-col-md10"> + <div class="layui-form-item"> + <div class="layui-inline"> + <div class="layui-input-inline"> + <input type="text" placeholder="名称" name="name" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + </div> + <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="add"> + 新增 + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> + <i class="layui-icon"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="appCategoryTable" lay-data="{id: 'appCategoryTable'}"></table> + <style type="text/css"> + .layui-table-cell{ + text-align:center; + height: auto; + white-space: normal; + } + .layui-table img{ + max-width:100px + } + </style> + </div> + </div> + </div> + </div> +</div> +<!-- 表格操作栏 start --> +<script type="text/html" id="user-option"> + <span shiro:lacksPermission="user:view,user:update,user:delete"> + <span class="layui-badge-dot febs-bg-orange"></span> 无权限 + </span> + <a lay-event="edit" shiro:hasPermission="user:update"><i + class="layui-icon febs-edit-area febs-blue"></i></a> +</script> +<!-- 表格操作栏 end --> +<script data-th-inline="none" type="text/javascript"> + // 引入组件并初始化 + layui.use([ 'jquery', 'form', 'table', 'febs'], function () { + var $ = layui.jquery, + febs = layui.febs, + form = layui.form, + table = layui.table, + $view = $('#febs-app-category'), + $query = $view.find('#query'), + $add = $view.find('#add'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + sortObject = {field: 'phone', type: null}, + tableIns; + + form.render(); + + // 表格初始化 + initTable(); + + // 初始化表格操作栏各个按钮功能 + table.on('tool(appCategoryTable)', function (obj) { + var data = obj.data, + layEvent = obj.event; + + if (layEvent === 'see') { + febs.modal.open('编辑', 'modules/product/categoryAppUpdate/' + data.id, { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#categary-app-update').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + if (layEvent === 'delCategary') { + febs.modal.confirm('删除', '确认删除?', function () { + delCategary(data.id); + }); + } + if (layEvent === 'seeImges') { + var t = $view.find('#seeImges'+data.id+''); + //页面层 + layer.open({ + type: 1, + title: "图片", + skin: 'layui-layer-rim', //加上边框 + area: ['80%', '80%'], //宽高 + shadeClose: true, //开启遮罩关闭 + end: function (index, layero) { + return false; + }, + content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>' + }); + } + }); + + function delCategary(id) { + febs.get(ctx + 'admin/goodsCategory/delAppCategary/' + id, null, function () { + febs.alert.success('操作成功'); + $query.click(); + }); + } + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: 1}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); + }); + + $add.on('click', function () { + febs.modal.open('新增', 'modules/product/categoryAppAdd/', { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#categary-app-add').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + }); + + function initTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'appCategoryTable', + url: ctx + 'admin/goodsCategory/categoryAppList', + cols: [[ + {field: 'name', title: '名称', minWidth: 150,align:'left'}, + {field: 'image', title: '图片', + templet: function (d) { + return '<a lay-event="seeImges"><img id="seeImges'+d.id+'" src="'+d.image+'" alt=""></a>'; + }, minWidth: 100,align:'center'}, + {field: 'indexNum', title: '排序', minWidth: 150,align:'left'}, + {title: '操作', + templet: function (d) { + return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="see" shiro:hasPermission="user:update">编辑</button>' + +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="delCategary" shiro:hasPermission="user:update">删除</button>' + },minWidth: 300,align:'center'} + ]] + }); + } + + // 获取查询参数 + function getQueryParams() { + return { + name: $searchForm.find('input[name="name"]').val().trim(), + }; + } + + }) +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/product/categoryAppUpdate.html b/src/main/resources/templates/febs/views/modules/product/categoryAppUpdate.html new file mode 100644 index 0000000..2c54caa --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/product/categoryAppUpdate.html @@ -0,0 +1,149 @@ +<style> + #categary-app-update { + padding: 20px 25px 25px 0; + } + + #categary-app-update .layui-treeSelect .ztree li a, .ztree li span { + margin: 0 0 2px 3px !important; + } + #categary-app-update #data-permission-tree-block { + border: 1px solid #eee; + border-radius: 2px; + padding: 3px 0; + } + #categary-app-update .layui-treeSelect .ztree li span.button.switch { + top: 1px; + left: 3px; + } + #categary-app-update img{ + max-width:100px + } + +</style> +<div class="layui-fluid" id="categary-app-update"> + <form class="layui-form" action="" lay-filter="categary-app-update-form"> + <div class="layui-form-item febs-hide"> + <label class="layui-form-label febs-form-item-require">id:</label> + <div class="layui-input-block"> + <input type="text" name="id" data-th-value="${goodsCategoryVo.id}"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">名称:</label> + <div class="layui-input-block"> + <input type="text" name="name" + lay-verify="name" autocomplete="off" class="layui-input" > + </div> + </div> + +<!-- <div class="layui-form-item">--> +<!-- <label class="layui-form-label">父类:</label>--> +<!-- <div class="layui-input-inline">--> +<!-- <select name="parentId" class="categary-app-update-category" id="categarySelect">--> +<!-- <option value="">请选择</option>--> +<!-- </select>--> +<!-- </div>--> +<!-- </div>--> + <div class="layui-form-item"> + <label class="layui-form-label">图片:</label> + <div class="layui-upload"> + <button type="button" class="layui-btn" id="test1">上传图片</button> + <div class="layui-input-block"> + <div class="layui-upload-list"> + <img class="layui-upload-img" id="imageUrls" width="100%" > + </div> + </div> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">图片链接:</label> + <div class="layui-input-block"> + <input type="text" id="imageUrl" name="image" class="layui-input" readonly> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">排序:</label> + <div class="layui-input-block"> + <input type="number" name="indexNum" + lay-verify="indexNum" autocomplete="off" class="layui-input" > + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="categary-app-update-form-submit" id="submit"></button> + </div> + </form> +</div> + +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate','upload'], function () { + var $ = layui.$, + febs = layui.febs, + layer = layui.layer, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + laydate = layui.laydate, + eleTree = layui.eleTree, + goodsCategoryVo = [[${goodsCategoryVo}]], + $view = $('#categary-app-update'), + upload = layui.upload, + validate = layui.validate; + + form.render(); + laydate.render({ + elem: '#febs-form-group-date' + }); + + formSelects.render(); + + //普通图片上传 + var uploadInst = upload.render({ + elem: '#test1' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#imageUrls').attr('src', result); //图片链接(base64) + }); + } + ,done: function(res){ + febs.alert.success(res.data.src); + $("#imageUrl").val(res.data.src); + } + }); + + //(下拉框) + // $.get(ctx + 'admin/goodsCategory/categorys/tree', function (data) { + // for (var k in data) + // { + // $(".categary-app-update-category").append("<option value='" + data[k].parentId + "'>" + data[k].name + "</option>"); + // } + // layui.use('form', function () { + // var form = layui.form; + // $("#categarySelect").val(goodsCategoryVo.parentId) + // form.render(); + // }); + // }); + initUserValue(); + + function initUserValue() { + $('#imageUrls').attr('src', goodsCategoryVo.image); + form.val("categary-app-update-form", { + "id": goodsCategoryVo.id, + "name": goodsCategoryVo.name, + // "parentId": goodsCategoryVo.parentId, + "image": goodsCategoryVo.image, + "indexNum": goodsCategoryVo.indexNum + }); + } + + form.on('submit(categary-app-update-form-submit)', function (data) { + febs.post(ctx + 'admin/goodsCategory/updateAppCategory', data.field, function () { + layer.closeAll(); + febs.alert.success('操作成功'); + $('#febs-app-category').find('#reset').click(); + }); + return false; + }); + }); +</script> \ No newline at end of file -- Gitblit v1.9.1