KKSU
2024-04-11 763d28cd26010a7e5bd382da2292e64d76de6535
检测报告
21 files added
9 files modified
1513 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java 83 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java 39 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java 72 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/conversion/MallStoreConversion.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/conversion/MallStoreMemberConversion.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/BindResultDto.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/BindStoreMemberDto.java 38 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/MallStoreDto.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/MallStoreItemDto.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallStore.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallStoreItem.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallStoreMember.java 24 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallStoreItemMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallStoreMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallStoreMemberMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java 62 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 189 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallStoreItemVo.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallStoreMemberVo.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallStoreVo.java 22 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml 37 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/product/storeAdd.html 71 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/product/storeItemAdd.html 107 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/product/storeItemList.html 177 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/product/storeItemUpdate.html 127 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/product/storeList.html 177 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/product/storeUpdate.html 87 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java
@@ -5,6 +5,8 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.entity.MallStore;
import cc.mrbird.febs.mall.entity.MallStoreItem;
import cc.mrbird.febs.mall.service.IAdminMallGoodsCategoryService;
import cc.mrbird.febs.mall.service.IApiMallGoodsCategoryService;
import cc.mrbird.febs.mall.vo.AdminAddAddressTreeVo;
@@ -30,6 +32,87 @@
    private final IApiMallGoodsCategoryService mallGoodsCategoryService;
    /**
     * 机器列表
     */
    @GetMapping("storeItemList")
    public FebsResponse storeItemList(MallStoreItem mallStoreItem, QueryRequest request) {
        Map<String, Object> data = getDataTable(goodsCategoryService.storeItemList(mallStoreItem, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 机器-选择
     */
    @GetMapping("storeItem/tree")
    @ControllerEndpoint(exceptionMessage = "获取分类失败")
    public FebsResponse getStore(){
        return new FebsResponse().success().data(goodsCategoryService.getStore());
    }
    /**
     * 机器-新增
     */
    @PostMapping("addStoreItem")
    @ControllerEndpoint(operation = "机器-新增", exceptionMessage = "操作失败")
    public FebsResponse addStoreItem(@Valid MallStoreItem mallStoreItem) {
        return goodsCategoryService.addStoreItem(mallStoreItem);
    }
    /**
     * 机器-编辑
     */
    @PostMapping("updateStoreItem")
    @ControllerEndpoint(operation = "机器-编辑", exceptionMessage = "操作失败")
    public FebsResponse updateStoreItem(@Valid MallStoreItem mallStoreItem) {
        return goodsCategoryService.updateStoreItem(mallStoreItem);
    }
    /**
     * 机器-删除
     */
    @GetMapping("delStoreItem/{id}")
    @ControllerEndpoint(operation = "机器-删除", exceptionMessage = "操作失败")
    public FebsResponse delStoreItem(@NotNull(message = "{required}") @PathVariable Long id) {
        return goodsCategoryService.delStoreItem(id);
    }
    /**
     * 店铺列表
     */
    @GetMapping("storeList")
    public FebsResponse storeList(MallStore mallStore, QueryRequest request) {
        Map<String, Object> data = getDataTable(goodsCategoryService.storeList(mallStore, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 店铺-新增
     */
    @PostMapping("addStore")
    @ControllerEndpoint(operation = "店铺-新增", exceptionMessage = "操作失败")
    public FebsResponse addStore(@Valid MallStore mallStore) {
        return goodsCategoryService.addStore(mallStore);
    }
    /**
     * 店铺-编辑
     */
    @PostMapping("updateStore")
    @ControllerEndpoint(operation = "店铺-编辑", exceptionMessage = "操作失败")
    public FebsResponse updateStore(@Valid MallStore mallStore) {
        return goodsCategoryService.updateStore(mallStore);
    }
    /**
     * 店铺-删除
     */
    @GetMapping("delStore/{id}")
    @ControllerEndpoint(operation = "店铺-删除", exceptionMessage = "操作失败")
    public FebsResponse delStore(@NotNull(message = "{required}") @PathVariable Long id) {
        return goodsCategoryService.delStore(id);
    }
    /**
     * 商品分类列表
     * @param mallGoodsCategory
     * @param request
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
@@ -286,4 +286,43 @@
        Map<String, Object> loginEvent = memberService.loginEvent();
        return new FebsResponse().success().data(loginEvent);
    }
    @ApiOperation(value = "店铺列表")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = MallStoreVo.class)
    })
    @PostMapping(value = "/storeList")
    public FebsResponse storeList(@RequestBody MallStoreDto mallStoreDto) {
        return memberService.storeList(mallStoreDto);
    }
    @ApiOperation(value = "店铺机器列表")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = MallStoreItemVo.class)
    })
    @PostMapping(value = "/storeItemList")
    public FebsResponse storeItemList(@RequestBody MallStoreItemDto mallStoreItemDto) {
        return memberService.storeItemList(mallStoreItemDto);
    }
    @ApiOperation(value = "绑定用户")
    @PostMapping(value = "/bindStoreMember")
    public FebsResponse bindStoreMember(@RequestBody @Validated BindStoreMemberDto bindStoreMemberDto) {
        return memberService.bindStoreMember(bindStoreMemberDto);
    }
    @ApiOperation(value = "绑定列表")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = MallStoreMemberVo.class)
    })
    @PostMapping(value = "/bindList")
    public FebsResponse bindList() {
        return memberService.bindList();
    }
    @ApiOperation(value = "获取检测结果")
    @PostMapping(value = "/bindResult")
    public FebsResponse bindResult(@RequestBody @Validated BindResultDto bindResultDto) {
        return memberService.bindResult(bindResultDto);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java
@@ -3,6 +3,10 @@
import cc.mrbird.febs.common.controller.BaseController;
import cc.mrbird.febs.common.entity.FebsConstant;
import cc.mrbird.febs.common.utils.FebsUtil;
import cc.mrbird.febs.mall.entity.MallStore;
import cc.mrbird.febs.mall.entity.MallStoreItem;
import cc.mrbird.febs.mall.mapper.MallStoreItemMapper;
import cc.mrbird.febs.mall.mapper.MallStoreMapper;
import cc.mrbird.febs.mall.service.IAdminMallGoodsCategoryService;
import cc.mrbird.febs.mall.service.IAdminMallMemberService;
import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryVo;
@@ -22,6 +26,74 @@
public class ViewMallGoodsCategoryController extends BaseController {
    private final IAdminMallGoodsCategoryService mallGoodsCategoryService;
    private final MallStoreMapper mallStoreMapper;
    private final MallStoreItemMapper mallStoreItemMapper;
    /**
     * 机器列表
     * @return
     */
    @GetMapping("storeItemList")
    @RequiresPermissions("storeItemList:view")
    public String storeItemList() {
        return FebsUtil.view("modules/product/storeItemList");
    }
    /**
     * 机器列表-新增
     * @return
     */
    @GetMapping("storeItemAdd")
    @RequiresPermissions("storeItemAdd:add")
    public String storeItemAdd() {
        return FebsUtil.view("modules/product/storeItemAdd");
    }
    /**
     * 机器列表-详情
     * @return
     */
    @GetMapping("storeItemUpdate/{id}")
    @RequiresPermissions("storeItemUpdate:update")
    public String storeItemUpdate(@PathVariable long id, Model model) {
        MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(id);
        model.addAttribute("storeItemUpdate", mallStoreItem);
        return FebsUtil.view("modules/product/storeItemUpdate");
    }
    /**
     * 店铺列表
     * @return
     */
    @GetMapping("storeList")
    @RequiresPermissions("storeList:view")
    public String storeList() {
        return FebsUtil.view("modules/product/storeList");
    }
    /**
     * 店铺列表-新增
     * @return
     */
    @GetMapping("storeAdd")
    @RequiresPermissions("storeAdd:add")
    public String storeAdd() {
        return FebsUtil.view("modules/product/storeAdd");
    }
    /**
     * 店铺列表-详情
     * @return
     */
    @GetMapping("storeUpdate/{id}")
    @RequiresPermissions("storeUpdate:update")
    public String storeUpdate(@PathVariable long id, Model model) {
        MallStore mallStore = mallStoreMapper.selectById(id);
        model.addAttribute("storeUpdate", mallStore);
        return FebsUtil.view("modules/product/storeUpdate");
    }
    /**
     * 商品分类列表
src/main/java/cc/mrbird/febs/mall/conversion/MallStoreConversion.java
New file
@@ -0,0 +1,15 @@
package cc.mrbird.febs.mall.conversion;
import cc.mrbird.febs.mall.entity.MallStore;
import cc.mrbird.febs.mall.vo.MallStoreVo;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public abstract class MallStoreConversion {
    public static final MallStoreConversion INSTANCE = Mappers.getMapper(MallStoreConversion.class);
    public abstract List<MallStoreVo> entitysToVos(List<MallStore> mallStores);
}
src/main/java/cc/mrbird/febs/mall/conversion/MallStoreMemberConversion.java
New file
@@ -0,0 +1,16 @@
package cc.mrbird.febs.mall.conversion;
import cc.mrbird.febs.mall.entity.MallStoreMember;
import cc.mrbird.febs.mall.vo.MallStoreMemberVo;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public abstract class MallStoreMemberConversion {
    public static final MallStoreMemberConversion INSTANCE = Mappers.getMapper(MallStoreMemberConversion.class);
    public abstract List<MallStoreMemberVo> entitysToVos(List<MallStoreMember> mallStores);
}
src/main/java/cc/mrbird/febs/mall/dto/BindResultDto.java
New file
@@ -0,0 +1,16 @@
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 = "BindResultDto", description = "检测结果")
public class BindResultDto {
    @NotNull(message = "绑定ID不能为空")
    @ApiModelProperty(value = "绑定ID")
    private Long bindId;
}
src/main/java/cc/mrbird/febs/mall/dto/BindStoreMemberDto.java
New file
@@ -0,0 +1,38 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@ApiModel(value = "BindStoreMemberDto", description = "绑定用户")
public class BindStoreMemberDto {
    @NotNull(message = "机器ID不能为空")
    @ApiModelProperty(value = "机器ID")
    private Long StoreItemId;
    @NotNull(message = "店铺ID不能为空")
    @ApiModelProperty(value = "店铺ID")
    private Long storeId;//店铺ID
    @NotBlank(message = "姓名不能为空")
    @ApiModelProperty(value = "姓名")
    private String name;//机器账号
    @NotBlank(message = "地址不能为空")
    @ApiModelProperty(value = "地址")
    private String address;//机器账号
    @NotNull(message = "年龄不能为空")
    @ApiModelProperty(value = "年龄")
    private Integer age;//机器账号
    @NotBlank(message = "电话不能为空")
    @ApiModelProperty(value = "电话")
    private String phone;//机器账号
}
src/main/java/cc/mrbird/febs/mall/dto/MallStoreDto.java
New file
@@ -0,0 +1,13 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MallStoreDto", description = "参数接收类")
public class MallStoreDto {
    @ApiModelProperty(value = "名称")
    private String name;
}
src/main/java/cc/mrbird/febs/mall/dto/MallStoreItemDto.java
New file
@@ -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 = "MallStoreDto", description = "参数接收类")
public class MallStoreItemDto {
    @ApiModelProperty(value = "店铺ID")
    private Long storeId;
}
src/main/java/cc/mrbird/febs/mall/entity/MallStore.java
New file
@@ -0,0 +1,14 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("mall_store")
public class MallStore extends BaseEntity {
    private String name;//店铺名称
    private String address;//店铺地址
    private String phone;//联系方式
}
src/main/java/cc/mrbird/febs/mall/entity/MallStoreItem.java
New file
@@ -0,0 +1,20 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("mall_store_item")
public class MallStoreItem extends BaseEntity {
    private String code;//机器名称
    private String account;//机器账号
    private String password;//机器密码
    private Long storeId;//店铺ID
    @TableField(exist = false)
    private String name;
}
src/main/java/cc/mrbird/febs/mall/entity/MallStoreMember.java
New file
@@ -0,0 +1,24 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("mall_store_member")
public class MallStoreMember extends BaseEntity {
    private String account;//机器账号
    private String password;//机器密码
    private Long storeItemId;//店铺ID
    private Long storeId;//店铺ID
    private Long memberId;//店铺ID
    private String name;//机器账号
    private String address;//机器账号
    private Integer age;//机器账号
    private String phone;//机器账号
    private Long bindId;//机器账号
}
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java
@@ -1,6 +1,8 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.entity.MallStore;
import cc.mrbird.febs.mall.entity.MallStoreItem;
import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryTreeVo;
import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryVo;
import cc.mrbird.febs.mall.vo.MallGoodsCategoryVo;
@@ -32,4 +34,10 @@
    List<MallGoodsCategory> selectChildCategaryById(@Param("id")Long id);
    List<AdminMallGoodsCategoryTreeVo> getAllCategorys();
    IPage<MallStore> selectStoreListInPage(Page<MallStore> page, @Param("record")MallStore mallStore);
    IPage<MallStoreItem> selectStoreItemListInPage(Page<MallStoreItem> page, @Param("record")MallStoreItem mallStoreItem);
    List<MallStore> getStore();
}
src/main/java/cc/mrbird/febs/mall/mapper/MallStoreItemMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallStoreItem;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface MallStoreItemMapper extends BaseMapper<MallStoreItem> {
}
src/main/java/cc/mrbird/febs/mall/mapper/MallStoreMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallStore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface MallStoreMapper extends BaseMapper<MallStore> {
}
src/main/java/cc/mrbird/febs/mall/mapper/MallStoreMemberMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallStoreMember;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface MallStoreMemberMapper extends BaseMapper<MallStoreMember> {
}
src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java
@@ -3,6 +3,8 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.entity.MallStore;
import cc.mrbird.febs.mall.entity.MallStoreItem;
import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryTreeVo;
import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryVo;
import cc.mrbird.febs.system.entity.Role;
@@ -28,4 +30,22 @@
    FebsResponse delCategary(Long id);
    List<AdminMallGoodsCategoryTreeVo> getAllCategorys();
    IPage<MallStore> storeList(MallStore mallStore, QueryRequest request);
    FebsResponse addStore(MallStore mallStore);
    FebsResponse updateStore(MallStore mallStore);
    FebsResponse delStore(Long id);
    IPage<MallStoreItem> storeItemList(MallStoreItem mallStoreItem, QueryRequest request);
    List<MallStore> getStore();
    FebsResponse addStoreItem(MallStoreItem mallStoreItem);
    FebsResponse updateStoreItem(MallStoreItem mallStoreItem);
    FebsResponse delStoreItem(Long id);
}
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
@@ -97,4 +97,14 @@
    FebsResponse setInvite(ApiSetInviteDto apiSetInviteDto);
    Map<String, Object> loginEvent();
    FebsResponse storeList(MallStoreDto mallStoreDto);
    FebsResponse storeItemList(MallStoreItemDto mallStoreItemDto);
    FebsResponse bindStoreMember(BindStoreMemberDto bindStoreMemberDto);
    FebsResponse bindList();
    FebsResponse bindResult(BindResultDto bindResultDto);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java
@@ -4,8 +4,12 @@
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.entity.MallGoods;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.entity.MallStore;
import cc.mrbird.febs.mall.entity.MallStoreItem;
import cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper;
import cc.mrbird.febs.mall.mapper.MallGoodsMapper;
import cc.mrbird.febs.mall.mapper.MallStoreItemMapper;
import cc.mrbird.febs.mall.mapper.MallStoreMapper;
import cc.mrbird.febs.mall.service.IAdminMallGoodsCategoryService;
import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryTreeVo;
import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryVo;
@@ -31,6 +35,8 @@
    private final MallGoodsCategoryMapper mallGoodsCategoryMapper;
    private final MallGoodsMapper mallGoodsMapper;
    private final MallStoreMapper mallStoreMapper;
    private final MallStoreItemMapper mallStoreItemMapper;
    @Override
    public IPage<MallGoodsCategory> getCategoryList(MallGoodsCategory mallGoodsCategory, QueryRequest request) {
@@ -164,4 +170,60 @@
        return adminMallGoodsCategoryTreeVos;
    }
    @Override
    public IPage<MallStore> storeList(MallStore mallStore, QueryRequest request) {
        Page<MallStore> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<MallStore> mallStoreIPage = mallGoodsCategoryMapper.selectStoreListInPage(page, mallStore);
        return mallStoreIPage;
    }
    @Override
    public FebsResponse addStore(MallStore mallStore) {
        mallStoreMapper.insert(mallStore);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse updateStore(MallStore mallStore) {
        mallStoreMapper.updateById(mallStore);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse delStore(Long id) {
        mallStoreMapper.deleteById(id);
        return new FebsResponse().success();
    }
    @Override
    public IPage<MallStoreItem> storeItemList(MallStoreItem mallStoreItem, QueryRequest request) {
        Page<MallStoreItem> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<MallStoreItem> mallStoreItemIPage = mallGoodsCategoryMapper.selectStoreItemListInPage(page, mallStoreItem);
        return mallStoreItemIPage;
    }
    @Override
    public List<MallStore> getStore() {
        List<MallStore> mallStores = mallGoodsCategoryMapper.getStore();
        return mallStores;
    }
    @Override
    public FebsResponse addStoreItem(MallStoreItem mallStoreItem) {
        mallStoreItemMapper.insert(mallStoreItem);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse updateStoreItem(MallStoreItem mallStoreItem) {
        mallStoreItemMapper.updateById(mallStoreItem);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse delStoreItem(Long id) {
        mallStoreItemMapper.deleteById(id);
        return new FebsResponse().success();
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -5,8 +5,7 @@
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.properties.XcxProperties;
import cc.mrbird.febs.common.utils.*;
import cc.mrbird.febs.mall.conversion.MallMemberConversion;
import cc.mrbird.febs.mall.conversion.MallShopApplyConversion;
import cc.mrbird.febs.mall.conversion.*;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
@@ -14,6 +13,8 @@
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
import cc.mrbird.febs.pay.service.IXcxPayService;
import cc.mrbird.febs.pay.util.MD5;
import cc.mrbird.febs.pay.util.Util;
import cc.mrbird.febs.vip.VipSettingUnAliveSettingBo;
import cc.mrbird.febs.vip.entity.MallVipConfig;
import cc.mrbird.febs.vip.mapper.MallVipConfigMapper;
@@ -27,6 +28,7 @@
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -36,6 +38,16 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.http.HttpStatus;
@@ -80,6 +92,9 @@
    private final MallGoodsMapper mallGoodsMapper;
    private final MallVipConfigMapper mallVipConfigMapper;
    private final MallStoreMapper mallStoreMapper;
    private final MallStoreItemMapper mallStoreItemMapper;
    private final MallStoreMemberMapper mallStoreMemberMapper;
    @Value("${spring.profiles.active}")
@@ -1155,5 +1170,175 @@
        return result;
    }
    @Override
    public FebsResponse storeList(MallStoreDto mallStoreDto) {
        QueryWrapper<MallStore> mallStoreQueryWrapper = new QueryWrapper<>();
        if(StrUtil.isNotEmpty(mallStoreDto.getName())){
            mallStoreQueryWrapper.like("name",mallStoreQueryWrapper);
        }
        List<MallStore> mallStores = mallStoreMapper.selectList(mallStoreQueryWrapper);
        List<MallStoreVo> mallStoreVos = MallStoreConversion.INSTANCE.entitysToVos(mallStores);
        return new FebsResponse().success().data(mallStoreVos);
    }
    @Override
    public FebsResponse storeItemList(MallStoreItemDto mallStoreItemDto) {
        QueryWrapper<MallStoreItem> mallStoreQueryWrapper = new QueryWrapper<>();
        mallStoreQueryWrapper.like("store_id",mallStoreItemDto.getStoreId());
        List<MallStoreItem> mallStores = mallStoreItemMapper.selectList(mallStoreQueryWrapper);
        return new FebsResponse().success().data(mallStores);
    }
    @Override
    public FebsResponse bindStoreMember(BindStoreMemberDto bindStoreMemberDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        Long storeItemId = bindStoreMemberDto.getStoreItemId();
        QueryWrapper<MallStoreMember> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("member_id",memberId);
        List<MallStoreMember> mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper);
        if(CollUtil.isNotEmpty(mallStoreMembers)){
            mallStoreMemberMapper.delete(objectQueryWrapper);
        }
        MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId);
        HashMap<String, String> objectObjectHashMap = new HashMap<>();
        String shopAccount = mallStoreItem.getAccount();
        String shopPwd = mallStoreItem.getPassword();
        String name = bindStoreMemberDto.getName();
        String address = bindStoreMemberDto.getAddress();
        Integer age = bindStoreMemberDto.getAge();
        String phoneNumber = bindStoreMemberDto.getPhone();
        objectObjectHashMap.put("shopAccount",shopAccount);
        objectObjectHashMap.put("shopPwd",shopPwd);
        objectObjectHashMap.put("name",name);
        objectObjectHashMap.put("address",address);
        objectObjectHashMap.put("age",age.toString());
        objectObjectHashMap.put("phoneNumber",phoneNumber);
        //sign= MD5(address+age+name+phoneNumber+shopAccount+shopPwd)
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(address);
        stringBuffer.append(age);
        stringBuffer.append(name);
        stringBuffer.append(phoneNumber);
        stringBuffer.append(shopAccount);
        stringBuffer.append(shopPwd);
        String sign = MD5.MD5Encode(stringBuffer.toString());
        objectObjectHashMap.put("sign",sign);
        String url = "https://data.muchun.co/api/bindCustomer";
        String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
        Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
        String message = JSONUtil.parseObj(result).getStr("message");
        if(0 != retCode || !"绑定成功".equals(message)){
            return new FebsResponse().fail().message(message);
        }
        Long bindId = JSONUtil.parseObj(result).getJSONObject("data").getLong("userId");
        MallStoreMember mallStoreMember = new MallStoreMember();
        mallStoreMember.setMemberId(memberId);
        mallStoreMember.setBindId(bindId);
        mallStoreMember.setStoreId(mallStoreItem.getStoreId());
        mallStoreMember.setStoreItemId(mallStoreItem.getId());
        mallStoreMember.setAccount(shopAccount);
        mallStoreMember.setPassword(shopPwd);
        mallStoreMember.setName(name);
        mallStoreMember.setAddress(address);
        mallStoreMember.setAge(age);
        mallStoreMember.setPhone(phoneNumber);
        mallStoreMemberMapper.insert(mallStoreMember);
        return new FebsResponse().success().message("绑定成功");
    }
    @Override
    public FebsResponse bindList() {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        QueryWrapper<MallStoreMember> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("member_id",memberId);
        List<MallStoreMember> mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper);
        ArrayList<MallStoreMemberVo> mallStoreMemberVos = new ArrayList<>();
        for(MallStoreMember mallStoreMember : mallStoreMembers){
            MallStoreMemberVo mallStoreMemberVo = new MallStoreMemberVo();
            Long storeId = mallStoreMember.getStoreId();
            Long storeItemId = mallStoreMember.getStoreItemId();
            MallStore mallStore = mallStoreMapper.selectById(storeId);
            MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId);
            mallStoreMemberVo.setId(mallStoreMember.getId());
            mallStoreMemberVo.setBindInfo(mallStore.getName()+"-"+mallStoreItem.getCode());
            mallStoreMemberVos.add(mallStoreMemberVo);
        }
        return new FebsResponse().success().data(mallStoreMemberVos);
    }
    @Override
    public FebsResponse bindResult(BindResultDto bindResultDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallStoreMember mallStoreMember = mallStoreMemberMapper.selectById(bindResultDto.getBindId());
        Long userld = mallStoreMember.getBindId();
        String shopAccount = mallStoreMember.getAccount();
        String shopPwd = mallStoreMember.getPassword();
        HashMap<String, String> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("shopAccount",shopAccount);
        objectObjectHashMap.put("shopPwd",shopPwd);
        objectObjectHashMap.put("userld",userld.toString());
        //sign= MD5(address+age+name+phoneNumber+shopAccount+shopPwd)
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(shopAccount);
        stringBuffer.append(shopPwd);
        stringBuffer.append(userld);
        String sign = MD5.MD5Encode(stringBuffer.toString());
        objectObjectHashMap.put("sign",sign);
        String url = "https://data.muchun.co/api/getCustomerCheckRecords";
        String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
        Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
        String message = JSONUtil.parseObj(result).getStr("message");
        if(0 != retCode){
            return new FebsResponse().fail().message(message);
        }
        JSONArray data = JSONUtil.parseObj(result).getJSONArray("data");
        return new FebsResponse().success().data(data);
    }
    public static void main(String[] args) {
        Long userld = 177L;
        String shopAccount = "luohu";
        String shopPwd = "123456";
        HashMap<String, String> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("shopAccount",shopAccount);
        objectObjectHashMap.put("shopPwd",shopPwd);
        objectObjectHashMap.put("userld",userld.toString());
        //sign= MD5(shopAccount+shopPwd+userId)
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(shopAccount);
        stringBuffer.append(shopPwd);
        stringBuffer.append(userld);
        String sign = MD5.MD5Encode(stringBuffer.toString());
        objectObjectHashMap.put("sign",sign);
        System.out.println(sign);
        System.out.println(objectObjectHashMap);
        String url = "https://data.muchun.co/api/getCustomerCheckRecords";
        String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
        Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
        String message = JSONUtil.parseObj(result).getStr("message");
        if(0 != retCode){
            System.out.println(message);
        }
        JSONArray data = JSONUtil.parseObj(result).getJSONArray("data");
        System.out.println(data);
    }
}
src/main/java/cc/mrbird/febs/mall/vo/MallStoreItemVo.java
New file
@@ -0,0 +1,17 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MallStoreVo", description = "店铺信息")
public class MallStoreItemVo {
    @ApiModelProperty(value = "机器id")
    private Long id;
    @ApiModelProperty(value = "机器名称")
    private String code;
}
src/main/java/cc/mrbird/febs/mall/vo/MallStoreMemberVo.java
New file
@@ -0,0 +1,17 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MallStoreMemberVo", description = "绑定信息")
public class MallStoreMemberVo {
    @ApiModelProperty(value = "绑定id")
    private Long id;
    @ApiModelProperty(value = "绑定信息")
    private String bindInfo;
}
src/main/java/cc/mrbird/febs/mall/vo/MallStoreVo.java
New file
@@ -0,0 +1,22 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MallStoreVo", description = "店铺信息")
public class MallStoreVo {
    @ApiModelProperty(value = "店铺id")
    private Long id;
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "地址")
    private String address;
    @ApiModelProperty(value = "电话")
    private String phone;
}
src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml
@@ -81,4 +81,41 @@
    <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="selectStoreListInPage" resultType="cc.mrbird.febs.mall.entity.MallStore">
        SELECT *
        FROM mall_store m
        <where>
            <if test="record != null" >
                <if test="record.name!=null and record.name!=''">
                    and m.name like concat('%',  #{record.name},'%')
                </if>
            </if>
        </where>
        order by m.created_time desc
    </select>
    <select id="selectStoreItemListInPage" resultType="cc.mrbird.febs.mall.entity.MallStoreItem">
        SELECT
               m.*,
               b.name
        FROM mall_store_item m
        left join mall_store b on b.id = m.store_id
        <where>
            <if test="record != null" >
                <if test="record.name!=null and record.name!=''">
                    and b.name like concat('%',  #{record.name},'%')
                </if>
            </if>
        </where>
        order by m.created_time desc
    </select>
    <select id="getStore" resultType="cc.mrbird.febs.mall.entity.MallStore">
        SELECT
               m.id id,
               m.name name
        FROM mall_store m
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/product/storeAdd.html
New file
@@ -0,0 +1,71 @@
<style>
    #store-add {
        padding: 20px 25px 25px 0;
    }
    #store-add .layui-treeSelect .ztree li a, .ztree li span {
        margin: 0 0 2px 3px !important;
    }
    #store-add #data-permission-tree-block {
        border: 1px solid #eee;
        border-radius: 2px;
        padding: 3px 0;
    }
    #store-add .layui-treeSelect .ztree li span.button.switch {
        top: 1px;
        left: 3px;
    }
    #store-add img{
        max-width:100px
    }
</style>
<div class="layui-fluid" id="store-add">
    <form class="layui-form" action="" lay-filter="store-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 febs-form-item-require">地址:</label>
            <div class="layui-input-block">
                <input type="text" name="address"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </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="phone"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <button class="layui-btn" lay-submit="" lay-filter="store-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,
            form = layui.form,
            $view = $('#store-add'),
            validate = layui.validate;
        form.render();
        form.on('submit(store-add-form-submit)', function (data) {
            febs.post(ctx + 'admin/goodsCategory/addStore', data.field, function () {
                layer.closeAll();
                febs.alert.success('操作成功');
                $('#febs-store').find('#reset').click();
            });
            return false;
        });
    });
</script>
src/main/resources/templates/febs/views/modules/product/storeItemAdd.html
New file
@@ -0,0 +1,107 @@
<style>
    #store-item-add {
        padding: 20px 25px 25px 0;
    }
    #store-item-add .layui-treeSelect .ztree li a, .ztree li span {
        margin: 0 0 2px 3px !important;
    }
    #store-item-add #data-permission-tree-block {
        border: 1px solid #eee;
        border-radius: 2px;
        padding: 3px 0;
    }
    #store-item-add .layui-treeSelect .ztree li span.button.switch {
        top: 1px;
        left: 3px;
    }
    #store-item-add img{
        max-width:100px
    }
</style>
<div class="layui-fluid" id="store-item-add">
    <form class="layui-form" action="" lay-filter="store-item-add-form">
        <div class="layui-form-item">
            <label class="layui-form-label">店铺:</label>
            <div class="layui-input-block">
                <div id="store-id"></div>
            </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="code"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </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="account"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </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="password"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <button class="layui-btn" lay-submit="" lay-filter="store-item-add-form-submit" id="submit"></button>
        </div>
    </form>
</div>
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate','upload', 'xmSelect'], function () {
        var $ = layui.$,
            febs = layui.febs,
            layer = layui.layer,
            form = layui.form,
            formSelects = layui.formSelects,
            $view = $('#store-item-add'),
            validate = layui.validate;
        var store = xmSelect.render({
            el: '#store-id',
            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/storeItem/tree', null, function(res) {
            store.update({
                data : res.data,
                autoRow: true,
            });
        })
        form.render();
        form.on('submit(store-item-add-form-submit)', function (data) {
            data.field.storeId = store.getValue('valueStr');
            febs.post(ctx + 'admin/goodsCategory/addStoreItem', data.field, function () {
                layer.closeAll();
                febs.alert.success('操作成功');
                $('#febs-store-item').find('#query').click();
            });
            return false;
        });
    });
</script>
src/main/resources/templates/febs/views/modules/product/storeItemList.html
New file
@@ -0,0 +1,177 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-store-item" lay-title="店铺机器">
    <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="store-item-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">店铺名称</label>
                                        <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">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="storeItemTable" lay-data="{id: 'storeItemTable'}"></table>
                    <style type="text/css">
                        .layui-table-cell{
                            text-align:center;
                            height: auto;
                            white-space: normal;
                        }
                        .layui-table img{
                            max-width:100px
                        }
                        ::-webkit-scrollbar {
                            height: 20px !important;
                            background-color: #f4f4f4;
                        }
                    </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">&#xe7a5;</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-store-item'),
            $query = $view.find('#query'),
            $add = $view.find('#add'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'phone', type: null},
            tableStoreIns;
        form.render();
        // 表格初始化
        initStoreItemTable();
        // 初始化表格操作栏各个按钮功能
        table.on('tool(storeItemTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'seeStoreItem') {
                febs.modal.open('编辑', 'modules/product/storeItemUpdate/' + data.id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#store-item-update').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'delStoreItem') {
                febs.modal.confirm('删除', '确认删除?', function () {
                    delStoreItem(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 delStoreItem(id) {
            febs.get(ctx + 'admin/goodsCategory/delStoreItem/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableStoreIns.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            tableStoreIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        $add.on('click', function () {
            febs.modal.open('新增', 'modules/product/storeItemAdd/', {
                btn: ['提交', '取消'],
                yes: function (index, layero) {
                    $('#store-item-add').find('#submit').trigger('click');
                },
                btn2: function () {
                    layer.closeAll();
                }
            });
        });
        function initStoreItemTable() {
            tableStoreIns = febs.table.init({
                elem: $view.find('table'),
                id: 'storeItemTable',
                url: ctx + 'admin/goodsCategory/storeItemList',
                cols: [[
                    {field: 'name', title: '店铺名称', minWidth: 150,align:'center'},
                    {field: 'code', title: '机器名称', minWidth: 150,align:'center'},
                    {field: 'account', title: '账号', minWidth: 150,align:'center'},
                    {field: 'password', title: '密码', minWidth: 300,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeStoreItem" >编辑</button>'
                            +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="delStoreItem">删除</button>'
                        },minWidth: 300,align:'center'}
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                name: $searchForm.find('input[name="name"]').val().trim(),
            };
        }
    })
</script>
src/main/resources/templates/febs/views/modules/product/storeItemUpdate.html
New file
@@ -0,0 +1,127 @@
<style>
    #store-item-update {
        padding: 20px 25px 25px 0;
    }
    #store-item-update .layui-treeSelect .ztree li a, .ztree li span {
        margin: 0 0 2px 3px !important;
    }
    #store-item-update #data-permission-tree-block {
        border: 1px solid #eee;
        border-radius: 2px;
        padding: 3px 0;
    }
    #store-item-update .layui-treeSelect .ztree li span.button.switch {
        top: 1px;
        left: 3px;
    }
    #store-item-update img{
        max-width:100px
    }
</style>
<div class="layui-fluid" id="store-item-update">
    <form class="layui-form" action="" lay-filter="store-item-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">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">店铺:</label>
            <div class="layui-input-block">
                <div id="store-id"></div>
            </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="code"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </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="account"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </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="password"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <button class="layui-btn" lay-submit="" lay-filter="store-item-update-form-submit" id="submit"></button>
        </div>
    </form>
</div>
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate','upload', 'xmSelect'], function () {
        var $ = layui.$,
            febs = layui.febs,
            layer = layui.layer,
            form = layui.form,
            storeItemUpdate = [[${storeItemUpdate}]];
        form.render();
        var store = xmSelect.render({
            el: '#store-id',
            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/storeItem/tree', null, function(res) {
            store.update({
                data : res.data,
                autoRow: true,
            });
            initUpdateValue();
        })
        initUpdateValue();
        function initUpdateValue() {
            form.val("store-item-update-form", {
                "id": storeItemUpdate.id,
                "code": storeItemUpdate.code,
                "account": storeItemUpdate.account,
                "password": storeItemUpdate.password,
                "storeId": storeItemUpdate.storeId
            });
            var arr = [];
            arr.push(storeItemUpdate.storeId)
            store.setValue(arr);
        }
        form.on('submit(store-item-update-form-submit)', function (data) {
            data.field.storeId = store.getValue('valueStr');
            febs.post(ctx + 'admin/goodsCategory/updateStoreItem', data.field, function () {
                layer.closeAll();
                febs.alert.success('操作成功');
                $('#febs-store-item').find('#query').click();
            });
            return false;
        });
    });
</script>
src/main/resources/templates/febs/views/modules/product/storeList.html
New file
@@ -0,0 +1,177 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-store" lay-title="店铺">
    <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="store-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">名称</label>
                                        <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">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="storeTable" lay-data="{id: 'storeTable'}"></table>
                    <style type="text/css">
                        .layui-table-cell{
                            text-align:center;
                            height: auto;
                            white-space: normal;
                        }
                        .layui-table img{
                            max-width:100px
                        }
                        ::-webkit-scrollbar {
                            height: 20px !important;
                            background-color: #f4f4f4;
                        }
                    </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">&#xe7a5;</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-store'),
            $query = $view.find('#query'),
            $add = $view.find('#add'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'phone', type: null},
            tableStoreIns;
        form.render();
        // 表格初始化
        initStoreTable();
        // 初始化表格操作栏各个按钮功能
        table.on('tool(storeTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'see') {
                febs.modal.open('编辑', 'modules/product/storeUpdate/' + data.id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#store-update').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'delStore') {
                febs.modal.confirm('删除', '确认删除?', function () {
                    delStore(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 delStore(id) {
            febs.get(ctx + 'admin/goodsCategory/delStore/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableStoreIns.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            tableStoreIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        $add.on('click', function () {
            febs.modal.open('新增', 'modules/product/storeAdd/', {
                btn: ['提交', '取消'],
                yes: function (index, layero) {
                    $('#store-add').find('#submit').trigger('click');
                },
                btn2: function () {
                    layer.closeAll();
                }
            });
        });
        function initStoreTable() {
            tableStoreIns = febs.table.init({
                elem: $view.find('table'),
                id: 'storeTable',
                // url: ctx + 'admin/goodsCategory/categoryList',
                url: ctx + 'admin/goodsCategory/storeList',
                cols: [[
                    {field: 'name', title: '名称', minWidth: 150,align:'center'},
                    {field: 'address', title: '地址', minWidth: 300,align:'center'},
                    {field: 'phone', title: '联系方式', minWidth: 150,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="see" >编辑</button>'
                            +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="delStore">删除</button>'
                        },minWidth: 300,align:'center'}
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                name: $searchForm.find('input[name="name"]').val().trim(),
            };
        }
    })
</script>
src/main/resources/templates/febs/views/modules/product/storeUpdate.html
New file
@@ -0,0 +1,87 @@
<style>
    #store-update {
        padding: 20px 25px 25px 0;
    }
    #store-update .layui-treeSelect .ztree li a, .ztree li span {
        margin: 0 0 2px 3px !important;
    }
    #store-update #data-permission-tree-block {
        border: 1px solid #eee;
        border-radius: 2px;
        padding: 3px 0;
    }
    #store-update .layui-treeSelect .ztree li span.button.switch {
        top: 1px;
        left: 3px;
    }
    #store-update img{
        max-width:100px
    }
</style>
<div class="layui-fluid" id="store-update">
    <form class="layui-form" action="" lay-filter="store-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">
            </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="required" autocomplete="off" class="layui-input" >
            </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="address"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </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="phone"
                       lay-verify="required" autocomplete="off" class="layui-input" >
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <button class="layui-btn" lay-submit="" lay-filter="store-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,
            form = layui.form,
            storeUpdate = [[${storeUpdate}]];
        form.render();
        initUpdateValue();
        function initUpdateValue() {
            form.val("store-update-form", {
                "id": storeUpdate.id,
                "name": storeUpdate.name,
                "address": storeUpdate.address,
                "phone": storeUpdate.phone
            });
        }
        form.on('submit(store-update-form-submit)', function (data) {
            febs.post(ctx + 'admin/goodsCategory/updateStore', data.field, function () {
                layer.closeAll();
                febs.alert.success('操作成功');
                $('#febs-store').find('#reset').click();
            });
            return false;
        });
    });
</script>