xiaoyong931011
2023-02-07 3c5d0550633c0549ac948f4e6a1b015377fa293f
代理人申请,后台审核
测试环境,数据库新建
后台系统名称修改
8 files added
15 files modified
573 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java 34 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java 17 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/conversion/MallAgentRecordConversion.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ApiAgentApplyDto.java 41 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallAgentRecord.java 40 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallAgentRecordMapper.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallAgentService.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java 41 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAgentServiceImpl.java 49 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 22 ●●●●● patch | view | raw | blame | history
src/main/resources/application-dev.yml 22 ●●●● patch | view | raw | blame | history
src/main/resources/application.yml 2 ●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallAgentRecordMapper.xml 34 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/error/403.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/error/404.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/error/500.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/layout.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/login.html 4 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/mallAgentRecord.html 194 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/index.html 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java
@@ -63,7 +63,7 @@
            log.info("/ /`  / / \\ | |\\/| | |_) | |   | |_   | |  | |_  ");
            log.info("\\_\\_, \\_\\_/ |_|  | |_|   |_|__ |_|__  |_|  |_|__ ");
            log.info("                                                      ");
            log.info("壹元蔬菜 权限系统启动完毕,地址:{}", url);
            log.info("钱阿姨 权限系统启动完毕,地址:{}", url);
            boolean auto = febsProperties.isAutoOpenBrowser();
            if (auto && StringUtils.equalsIgnoreCase(active, FebsConstant.DEVELOP)) {
src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
@@ -5,10 +5,7 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.AppVersion;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallNewsInfo;
import cc.mrbird.febs.mall.entity.MallShopApply;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.service.IAdminMallMemberService;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.vo.AdminAgentLevelOptionTreeVo;
@@ -368,4 +365,33 @@
        return new FebsResponse().success();
    }
    /**
     * 代理申请列表
     */
    @GetMapping("getAgentApplyList")
    public FebsResponse getAgentApplyList(MallAgentRecord mallAgentRecord, QueryRequest request) {
        Map<String, Object> data = getDataTable(mallMemberService.getAgentApplyList(mallAgentRecord, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 代理申请列表
     *      同意
     */
    @GetMapping("agreeAgentApply/{id}")
    @ControllerEndpoint(operation = "审核代理申请", exceptionMessage = "操作失败")
    public FebsResponse agreeAgentApply(@NotNull(message = "{required}") @PathVariable Long id) {
        return mallMemberService.agreeAgentApply(id);
    }
    /**
     * 代理申请列表
     *      拒绝
     */
    @GetMapping("disagreeAgentApply/{id}")
    @ControllerEndpoint(operation = "审核代理申请", exceptionMessage = "操作失败")
    public FebsResponse disagreeAgentApply(@NotNull(message = "{required}") @PathVariable Long id) {
        return mallMemberService.disagreeAgentApply(id);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
@@ -4,10 +4,7 @@
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallMemberPayment;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.ICommonService;
import cc.mrbird.febs.mall.service.IMallMemberWithdrawService;
import cc.mrbird.febs.mall.service.*;
import cc.mrbird.febs.mall.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -34,6 +31,7 @@
    private final IApiMallMemberService memberService;
    private final IMallMemberWithdrawService mallMemberWithdrawService;
    private final IApiMallMemberWalletService walletService;
    private final IApiMallAgentService iApiMallAgentService;
    /**
     * 小程序接收用户数据,更新用户信息
@@ -192,4 +190,15 @@
        return memberService.rechargeWallet(apiRechargeWalletDto);
    }
    /**
     * 申请代理
     * @param apiAgentApplyDto
     * @return
     */
    @ApiOperation(value = "申请代理")
    @PostMapping(value = "/agentApply")
    public FebsResponse agentApply(@RequestBody @Validated ApiAgentApplyDto apiAgentApplyDto) {
        return iApiMallAgentService.agentApply(apiAgentApplyDto);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java
@@ -267,6 +267,15 @@
        return FebsUtil.view("modules/mallMember/addMember");
    }
    /**
     * 代理申请列表
     */
    @GetMapping("mallAgentRecord")
    @RequiresPermissions("mallAgentRecord:view")
    public String mallAgentRecord() {
        return FebsUtil.view("modules/mallMember/mallAgentRecord");
    }
src/main/java/cc/mrbird/febs/mall/conversion/MallAgentRecordConversion.java
New file
@@ -0,0 +1,15 @@
package cc.mrbird.febs.mall.conversion;
import cc.mrbird.febs.mall.dto.ApiAgentApplyDto;
import cc.mrbird.febs.mall.entity.MallAgentRecord;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public abstract class MallAgentRecordConversion {
    public static final MallAgentRecordConversion INSTANCE = Mappers.getMapper(MallAgentRecordConversion.class);
    public abstract MallAgentRecord dtoToEntity(ApiAgentApplyDto apiAgentApplyDto);
}
src/main/java/cc/mrbird/febs/mall/dto/ApiAgentApplyDto.java
New file
@@ -0,0 +1,41 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(value = "ApiAgentApplyDto", description = "申请代理")
public class ApiAgentApplyDto {
    //申请人姓名
    @NotBlank(message = "姓名不能为空")
    @ApiModelProperty(value = "姓名")
    private String name;
    //电话
    @NotBlank(message = "电话不能为空")
    @ApiModelProperty(value = "电话")
    private String phone;
    //店铺名称(非必填)
    @ApiModelProperty(value = "店铺名称(非必填)")
    private String storeName;
    //省
    @NotBlank(message = "省不能为空")
    @ApiModelProperty(value = "省")
    private String province;
    //市
    @NotBlank(message = "市不能为空")
    @ApiModelProperty(value = "市")
    private String city;
    //区、县
    @NotBlank(message = "区、县不能为空")
    @ApiModelProperty(value = "区、县")
    private String area;
    //详细地址
    @NotBlank(message = "详细地址不能为空")
    @ApiModelProperty(value = "详细地址")
    private String storeAddress;
}
src/main/java/cc/mrbird/febs/mall/entity/MallAgentRecord.java
New file
@@ -0,0 +1,40 @@
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;
import java.math.BigDecimal;
@Data
@TableName("mall_agent_record")
public class MallAgentRecord extends BaseEntity {
    private Long memberId;
    //申请人姓名
    private String name;
    //电话
    private String phone;
    //店铺名称(非必填)
    private String storeName;
    //省
    private String province;
    //市
    private String city;
    //区、县
    private String area;
    //详细地址
    private String storeAddress;
    //状态 1::申请中 2:同意 3:拒绝
    private Integer state;
    public static final Integer APPLY_ING = 1;
    public static final Integer APPLY_AGREE = 2;
    public static final Integer APPLY_DISAGREE = 3;
    @TableField(exist = false)
    private String memberName;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallAgentRecordMapper.java
New file
@@ -0,0 +1,14 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallAgentRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
public interface MallAgentRecordMapper extends BaseMapper<MallAgentRecord> {
    MallAgentRecord selectByMemberIdAndState(@Param("memberId")Long memberId, @Param("state")Integer applyIng);
    IPage<MallAgentRecord> selectMallAgentRecordListInPage(Page<MallAgentRecord> page, @Param("record")MallAgentRecord mallAgentRecord);
}
src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
@@ -3,10 +3,7 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.AppVersion;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallNewsInfo;
import cc.mrbird.febs.mall.entity.MallShopApply;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.vo.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -93,4 +90,10 @@
    MallMember findByInviteId(String inviteId);
    void modifyReferer(MallMember member);
    IPage<MallAgentRecord> getAgentApplyList(MallAgentRecord mallAgentRecord, QueryRequest request);
    FebsResponse agreeAgentApply(Long id);
    FebsResponse disagreeAgentApply(Long id);
}
src/main/java/cc/mrbird/febs/mall/service/IApiMallAgentService.java
New file
@@ -0,0 +1,12 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.ApiAgentApplyDto;
import cc.mrbird.febs.mall.entity.MallAgentRecord;
import com.baomidou.mybatisplus.extension.service.IService;
public interface IApiMallAgentService extends IService<MallAgentRecord> {
    FebsResponse agentApply(ApiAgentApplyDto apiAgentApplyDto);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
@@ -68,6 +68,8 @@
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final MallTeamLeaderMapper mallTeamLeaderMapper;
    private final MallAgentRecordMapper mallAgentRecordMapper;
    @Override
    public IPage<MallMember> getMallMemberList(MallMember mallMember, QueryRequest request) {
        Page<MallMember> page = new Page<>(request.getPageNum(), request.getPageSize());
@@ -600,6 +602,45 @@
        }
    }
    @Override
    public IPage<MallAgentRecord> getAgentApplyList(MallAgentRecord mallAgentRecord, QueryRequest request) {
        Page<MallAgentRecord> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<MallAgentRecord> mallAgentRecords = mallAgentRecordMapper.selectMallAgentRecordListInPage(page, mallAgentRecord);
        return mallAgentRecords;
    }
    @Override
    @Transactional
    public FebsResponse agreeAgentApply(Long id) {
        MallAgentRecord mallAgentRecord = mallAgentRecordMapper.selectById(id);
        if(ObjectUtil.isEmpty(mallAgentRecord)){
            return new FebsResponse().fail().message("申请记录不存在");
        }
        mallAgentRecord.setState(MallAgentRecord.APPLY_AGREE);
        mallAgentRecordMapper.updateById(mallAgentRecord);
        //更新用户表中的LEVEL
        MallMember mallMember = this.baseMapper.selectById(mallAgentRecord.getMemberId());
        if(ObjectUtil.isEmpty(mallMember)){
            return new FebsResponse().fail().message("用户不存在");
        }
        mallMember.setLevel(AgentLevelEnum.FIRST_LEVEL.name());
        this.baseMapper.updateById(mallMember);
        return new FebsResponse().success();
    }
    @Override
    @Transactional
    public FebsResponse disagreeAgentApply(Long id) {
        MallAgentRecord mallAgentRecord = mallAgentRecordMapper.selectById(id);
        if(ObjectUtil.isEmpty(mallAgentRecord)){
            return new FebsResponse().fail().message("申请记录不存在");
        }
        mallAgentRecord.setState(MallAgentRecord.APPLY_DISAGREE);
        mallAgentRecordMapper.updateById(mallAgentRecord);
        return new FebsResponse().success();
    }
    private String refererIds(String parentId) {
        boolean flag = false;
        if (StrUtil.isBlank(parentId)) {
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAgentServiceImpl.java
New file
@@ -0,0 +1,49 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.mall.conversion.MallAgentRecordConversion;
import cc.mrbird.febs.mall.conversion.MallGoodsConversion;
import cc.mrbird.febs.mall.dto.ApiAgentApplyDto;
import cc.mrbird.febs.mall.entity.MallAgentRecord;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.mapper.MallAgentRecordMapper;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.service.IApiMallAgentService;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor
public class ApiMallAgentServiceImpl extends ServiceImpl<MallAgentRecordMapper, MallAgentRecord> implements IApiMallAgentService {
    private final MallAgentRecordMapper mallAgentRecordMapper;
    private final MallMemberMapper mallMemberMapper;
    @Override
    public FebsResponse agentApply(ApiAgentApplyDto apiAgentApplyDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        //判断用户当前的级别
        MallMember mallMember = mallMemberMapper.selectById(memberId);
        if(!AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())){
            return new FebsResponse().fail().message("用户已无法申请");
        }
        //判断用户是否正在申请
        MallAgentRecord mallAgentRecord = mallAgentRecordMapper.selectByMemberIdAndState(memberId,MallAgentRecord.APPLY_ING);
        if(ObjectUtil.isNotEmpty(mallAgentRecord)){
            return new FebsResponse().fail().message("用户已申请");
        }
        MallAgentRecord mallAgentRecordNew = MallAgentRecordConversion.INSTANCE.dtoToEntity(apiAgentApplyDto);
        mallAgentRecordNew.setMemberId(memberId);
        mallAgentRecordNew.setState(MallAgentRecord.APPLY_ING);
        mallAgentRecordMapper.insert(mallAgentRecordNew);
        return new FebsResponse().success().message("申请成功");
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -88,20 +88,24 @@
    public Long createOrder(AddOrderDto addOrderDto) {
//        synchronized(this){
        MallMember member = LoginUserUtil.getLoginUser();
        String takeUniqueCode = addOrderDto.getTakeUniqueCode();
        if(StrUtil.isEmpty(takeUniqueCode)){
            throw new FebsException("请选择自提点");
        //验证用户的等级
        if(AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())){
            throw new FebsException("请先申请成为代理人");
        }
//        String takeUniqueCode = addOrderDto.getTakeUniqueCode();
//        if(StrUtil.isEmpty(takeUniqueCode)){
//            throw new FebsException("请选择自提点");
//        }
        MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(takeUniqueCode);
        if(ObjectUtil.isEmpty(mallTeamLeader)){
            throw new FebsException("请重新选择团长");
        }
//        MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(takeUniqueCode);
//        if(ObjectUtil.isEmpty(mallTeamLeader)){
//            throw new FebsException("请重新选择团长");
//        }
        //订单范围内才允许下单
        MallAddressInfo address = mallAddressInfoMapper.selectAddressInfoByMemberIdAndId(member.getId(), addOrderDto.getAddressId());
        if(ObjectUtil.isEmpty(address)){
            throw new FebsException("请重新选择提货人信息");
            throw new FebsException("请重新选择收货地址信息");
        }
//        MallElectronicFence mallElectronicFence = mallElectronicFenceMapper.selectByTeamLeaderCode(mallTeamLeader.getUniqueCode());
//        if(ObjectUtil.isNotEmpty(mallElectronicFence)){
@@ -121,7 +125,7 @@
        orderInfo.setRemark(addOrderDto.getRemark());
        orderInfo.setOrderType(addOrderDto.getOrderType());
        orderInfo.setTakeUniqueCode(addOrderDto.getTakeUniqueCode());
//        orderInfo.setTakeUniqueCode(addOrderDto.getTakeUniqueCode());
        orderInfo.setDeliveryType(1);
        if (CollUtil.isEmpty(addOrderDto.getItems())) {
src/main/resources/application-dev.yml
@@ -19,10 +19,10 @@
#          password: 123456
#          driver-class-name: com.mysql.cj.jdbc.Driver
#          url: jdbc:mysql://120.27.238.55:3306/db_pingtuan?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
          username: db_yyg
          password: yyg123!@#
          username: db_mall_qianayi
          password: db_mall_qianayi123!@#123
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://121.37.162.173:3306/db_yyg?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
          url: jdbc:mysql://121.37.162.173:3306/db_mall_qianayi?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
#          username: db_mall
#          password: mall!@#123
#          driver-class-name: com.mysql.cj.jdbc.Driver
@@ -30,13 +30,13 @@
  redis:
    # Redis数据库索引(默认为 0)
    database: 3
    database: 8
    # Redis服务器地址
    host: 120.27.238.55
    host: 121.37.162.173
    # Redis服务器连接端口
    port: 6379
    # Redis 密码
    password: xcong123
    password: d32ncxe@i3#!dV
    lettuce:
      pool:
        # 连接池中的最小空闲连接
@@ -50,10 +50,10 @@
    # 连接超时时间(毫秒)
    timeout: 5000
  rabbitmq:
    host: 120.27.238.55
    host: 121.37.162.173
    port: 5672
    username: ct_rabbit
    password: 123456
    username: hibit
    password: hibit123
    publisher-confirm-type: correlated
pay:
@@ -69,8 +69,8 @@
xcx:
  wechar_login_url: https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
  xcx_appid: wx0b515f652282158e
  xcx_secret: 8d3d3c14221f7dc37650b861dc0fc570
  xcx_appid: wxfb1acf504eb9d058
  xcx_secret: 7ee226a964b1be7cfb96f5e0dc739c44
  debug: false
  wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback
  wecharRechargePaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/rechargeCallBack
src/main/resources/application.yml
@@ -5,7 +5,7 @@
spring:
  profiles:
    active: test
    active: dev
  servlet:
    multipart:
src/main/resources/mapper/modules/MallAgentRecordMapper.xml
New file
@@ -0,0 +1,34 @@
<?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.MallAgentRecordMapper">
    <select id="selectByMemberIdAndState" resultType="cc.mrbird.febs.mall.entity.MallAgentRecord">
        select a.* from mall_agent_record a
        where a.member_id = #{memberId}
            and a.state = #{state}
        limit 1
    </select>
    <select id="selectMallAgentRecordListInPage" resultType="cc.mrbird.febs.mall.entity.MallAgentRecord">
        SELECT
            a.*,
            b.name memberName
        FROM mall_agent_record a
        LEFT JOIN mall_member b on a.member_id = b.id
        <where>
            <if test="record != null" >
                <if test="record.name!=null and record.name!=''">
                    and a.name like concat('%',  #{record.name},'%')
                </if>
                <if test="record.memberName!=null and record.memberName!=''">
                    and b.name like concat('%',  #{record.memberName},'%')
                </if>
                <if test="record.state!=null">
                    and a.state = #{record.state}
                </if>
            </if>
        </where>
        GROUP BY a.id order by a.CREATED_TIME desc
    </select>
</mapper>
src/main/resources/templates/error/403.html
@@ -2,7 +2,7 @@
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>壹元蔬菜 权限系统</title>
    <title>钱阿姨 权限系统</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
src/main/resources/templates/error/404.html
@@ -2,7 +2,7 @@
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>壹元蔬菜 权限系统</title>
    <title>钱阿姨 权限系统</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
src/main/resources/templates/error/500.html
@@ -2,7 +2,7 @@
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>壹元蔬菜 权限系统</title>
    <title>钱阿姨 权限系统</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
src/main/resources/templates/febs/views/layout.html
@@ -64,7 +64,7 @@
        <div class="layui-side-scroll">
            <div class="layui-logo" style="cursor: pointer">
                <img data-th-src="@{febs/images/logo.png}">
                <span>壹元蔬菜 权限系统</span>
                <span>钱阿姨 权限系统</span>
            </div>
            <script
                    type="text/html"
src/main/resources/templates/febs/views/login.html
@@ -2,7 +2,7 @@
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>壹元蔬菜 权限系统</title>
    <title>钱阿姨 权限系统</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
@@ -19,7 +19,7 @@
        <div class="layui-container">
            <div class="layui-row">
                <div class="layui-col-xs12 layui-col-lg4 layui-col-lg-offset4 febs-tc">
                    <div class="layui-logo"><span><b>壹元蔬菜</b> 权限系统</span></div>
                    <div class="layui-logo"><span><b>钱阿姨</b> 权限系统</span></div>
                </div>
                <div class="layui-col-xs12 layui-col-lg4 layui-col-lg-offset4" id="login-div">
                    <div class="layui-form" lay-filter="login-form">
src/main/resources/templates/febs/views/modules/mallMember/mallAgentRecord.html
New file
@@ -0,0 +1,194 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-agent-apply-list" 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="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="memberName" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="姓名" name="name" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="电话" name="phone" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">申请状态</label>
                                        <div class="layui-input-inline">
                                            <select name="state">
                                                <option value="">请选择</option>
                                                <option value="1">申请中</option>
                                                <option value="2">通过</option>
                                                <option value="3">拒绝</option>
                                            </select>
                                        </div>
                                    </div>
<!--                                    <div class="layui-inline">-->
<!--                                        <label class="layui-form-label layui-form-label-sm">会员类型</label>-->
<!--                                        <div class="layui-input-inline">-->
<!--                                            <select name="level">-->
<!--                                                <option value="">请选择</option>-->
<!--                                                <option value="FIRST_LEVEL">普通会员</option>-->
<!--                                                <option value="SECOND_LEVEL">一星</option>-->
<!--                                                <option value="THIRD_LEVEL">二星</option>-->
<!--                                                <option value="FOUR_LEVEL">三星</option>-->
<!--                                                <option value="FIFTH_LEVEL">四星</option>-->
<!--                                            </select>-->
<!--                                        </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-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="agentApplyTable" lay-data="{id: 'agentApplyTable'}"></table>
                </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>
<style>
    .layui-form-onswitch {
        background-color: #5FB878 !important;
    }
</style>
<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-agent-apply-list'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'phone', type: null},
            tableIns;
        form.render();
        // 表格初始化
        initTable();
        // 初始化表格操作栏各个按钮功能
        table.on('tool(agentApplyTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'agree') {
                febs.modal.confirm('通过', '通过用户的代理申请?', function () {
                    agree(data.id);
                });
            }
            if (layEvent === 'disagree') {
                febs.modal.confirm('拒绝', '拒绝用户的代理申请?', function () {
                    disagree(data.id);
                });
            }
        });
        function agree(id) {
            febs.get(ctx + 'admin/mallMember/agreeAgentApply/' + id, null, function () {
                febs.alert.success('已同意');
                $query.click();
            });
        }
        function disagree(id) {
            febs.get(ctx + 'admin/mallMember/disagreeAgentApply/' + 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});
        });
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'agentApplyTable',
                url: ctx + 'admin/mallMember/getAgentApplyList',
                defaultToolbar:[],
                cols: [[
                    {field: 'memberName', title: '微信昵称', minWidth: 150,align:'left'},
                    {field: 'name', title: '姓名', minWidth: 100,align:'left'},
                    {field: 'phone', title: '电话', minWidth: 100,align:'left'},
                    {field: 'province', title: '省', minWidth: 100,align:'left'},
                    {field: 'city', title: '市', minWidth: 100,align:'left'},
                    {field: 'area', title: '区、县', minWidth: 100,align:'left'},
                    {field: 'storeAddress', title: '详细地址', minWidth: 100,align:'left'},
                    {field: 'storeName', title: '店铺名称', minWidth: 100,align:'left'},
                    {field: 'state', title: '申请状态',
                        templet: function (d) {
                            if (d.state === 1) {
                                return '<span style="color:green;">申请中</span>'
                            }else if (d.state === 2) {
                                return '<span style="color:blue;">通过</span>'
                            }else if (d.state === 3) {
                                return '<span style="color:red;">拒绝</span>'
                            }else{
                                return ''
                            }
                        }, minWidth: 100,align:'center'},
                    {field: 'createdTime', title: '申请时间', minWidth: 180,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            if(d.state === 1 ){
                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="agree" shiro:hasPermission="user:update">同意</button>'
                                +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="disagree" shiro:hasPermission="user:update">拒绝</button>'
                            }else{
                                return ''
                            }
                        },minWidth: 200,align:'center', fixed:"right"
                    }
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                memberName: $searchForm.find('input[name="memberName"]').val().trim(),
                name: $searchForm.find('input[name="name"]').val().trim(),
                phone: $searchForm.find('input[name="phone"]').val().trim(),
                state: $searchForm.find("select[name='state']").val()
            };
        }
    })
</script>
src/main/resources/templates/index.html
@@ -3,7 +3,7 @@
      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="utf-8">
    <title>壹元蔬菜 权限系统</title>
    <title>钱阿姨 权限系统</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">