xiaoyong931011
2020-07-07 0f326acd413279d2c3fccb27ee1a5723e1387bcf
20200707  代码提交
19 files modified
4 files added
1683 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/controller/ViewController.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/entity/AgentFriendRelationEntity.java 91 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/mapper/AgentFriendRelationMapper.java 19 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/mapper/MemberCoinChargeMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/mapper/MemberCoinWithdrawMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/mapper/MemberMapper.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/mapper/MemberQuickBuySaleMapper.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/IMemberService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java 70 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/AgentFriendRelationMapper.xml 25 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MemberCoinChargeMapper.xml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MemberCoinWithdrawMapper.xml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MemberMapper.xml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MemberQuickBuySaleMapper.xml 13 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/error/403.html 78 ●●●● patch | view | raw | blame | history
src/main/resources/templates/error/404.html 82 ●●●● patch | view | raw | blame | history
src/main/resources/templates/error/500.html 82 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/index.html 708 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/layout.html 354 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/login.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/member/agentInfo.html 109 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/index.html 2 ●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
@@ -6,6 +6,7 @@
import com.xcong.excoin.common.entity.QueryRequest;
import com.xcong.excoin.modules.member.dto.MemberDataInfoDto;
import com.xcong.excoin.modules.member.dto.MemberDetailConfirmDto;
import com.xcong.excoin.modules.member.entity.AgentFriendRelationEntity;
import com.xcong.excoin.modules.member.entity.MemberCoinChargeEntity;
import com.xcong.excoin.modules.member.entity.MemberCoinWithdrawEntity;
import com.xcong.excoin.modules.member.entity.MemberEntity;
@@ -38,6 +39,16 @@
public class MemberController extends BaseController {
    private final IMemberService memberService;
    /**
     * 代理关系---列表
     * @return
     */
    @GetMapping("agentInfoList")
    public FebsResponse agentInfoList(AgentFriendRelationEntity agentFriendRelationEntity, QueryRequest request) {
        Map<String, Object> data = getDataTable(memberService.findAgentInfoListInPage(agentFriendRelationEntity, request));
        return new FebsResponse().success().data(data);
    }
    @GetMapping("getList")
    public FebsResponse getList(MemberEntity member, QueryRequest request) {
src/main/java/com/xcong/excoin/modules/member/controller/ViewController.java
@@ -28,6 +28,16 @@
    private final IMemberService memberService;
    
    /**
     * 代理关系
     * @return
     */
    @GetMapping("agentInfo")
    @RequiresPermissions("agentInfo:view")
    public String agentInfo() {
        return FebsUtil.view("modules/member/agentInfo");
    }
    /**
     * 个人信息
     * @return
     */
src/main/java/com/xcong/excoin/modules/member/entity/AgentFriendRelationEntity.java
New file
@@ -0,0 +1,91 @@
package com.xcong.excoin.modules.member.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xcong.excoin.common.entity.BaseEntity;
import lombok.Data;
@Data
@TableName("agent_friend_relation")
public class AgentFriendRelationEntity extends BaseEntity {/**
     *
     */
    private static final long serialVersionUID = 1L;
    /**
     * 后台用户ID
     */
    private Long userId;
    /**
     * 会员ID
     */
    private Long memberId;
    /**
     * 会员邀请码
     */
    private String inviteId;
    /**
     * 上级会员ID
     */
    private Long refererMemberId;
    /**
     * 上级邀请码
     */
    private String refererId;
    /**
     * 上级链
     */
    private String refererIds;
    /**
     * 返佣比例
     */
    private BigDecimal returnRatio;
    /**
     * 代理等级
     */
    private int levelId;
    /**
     * 手续费是否设置自己 1是2否
     */
    private int feeIsSelf;
    /**
     * 查询条件:第一查询条件
     */
    @TableField(exist = false)
    private String account;
    /**
     * 手机号(包含国际手机号)
     */
    @TableField(exist = false)
    private String phone;
    /**
     * 邮箱
     */
    @TableField(exist = false)
    private String email;
    /**
     * 推广人数
     */
    @TableField(exist = false)
    private int promotionNumber;
    /**
     * 总充值
     */
    @TableField(exist = false)
    private String totalRecharge;
    /**
     * 总提现
     */
    @TableField(exist = false)
    private String totalWithdrawal;
    /**
     * 总业绩
     */
    @TableField(exist = false)
    private String totalPerformance;
}
src/main/java/com/xcong/excoin/modules/member/mapper/AgentFriendRelationMapper.java
New file
@@ -0,0 +1,19 @@
package com.xcong.excoin.modules.member.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xcong.excoin.modules.member.entity.AgentFriendRelationEntity;
public interface AgentFriendRelationMapper  extends BaseMapper<AgentFriendRelationEntity> {
    IPage<AgentFriendRelationEntity> findAgentFriendRelationListInPage(Page<AgentFriendRelationEntity> page,
            @Param("record")AgentFriendRelationEntity agentFriendRelationEntity);
    List<AgentFriendRelationEntity> selectAgentFriendRelationByMap(@Param("inviteId")String inviteId);
}
src/main/java/com/xcong/excoin/modules/member/mapper/MemberCoinChargeMapper.java
@@ -13,4 +13,6 @@
    IPage<MemberCoinChargeVo> findMemberApplyCoinListInPage(Page<MemberCoinChargeEntity> page,
            @Param("record")MemberCoinChargeEntity memberCoinChargeEntity);
    String selectCBByMemberId(String memberId);
}
src/main/java/com/xcong/excoin/modules/member/mapper/MemberCoinWithdrawMapper.java
@@ -13,4 +13,6 @@
    IPage<MemberCoinWithdrawVo> findmemberWithdrawCoinListInPage(Page<MemberCoinWithdrawEntity> page,
            @Param("record")MemberCoinWithdrawEntity memberCoinWithdrawEntity);
    String selectTBByMemberId(@Param("memberId")String memberId);
}
src/main/java/com/xcong/excoin/modules/member/mapper/MemberMapper.java
@@ -7,6 +7,8 @@
import com.xcong.excoin.modules.member.vo.MemberDataInfoVo;
import com.xcong.excoin.modules.trademanage.vo.MemberAccountInfoVo;
import java.util.List;
import org.apache.ibatis.annotations.Param;
/**
@@ -58,5 +60,7 @@
    String selectHYZCForBasicRealData();
    String selectDLZCForBasicRealData();
    List<String> selectMemberBylowLevelInviteId(String lowLevelInviteId);
    
}
src/main/java/com/xcong/excoin/modules/member/mapper/MemberQuickBuySaleMapper.java
@@ -17,4 +17,8 @@
    IPage<MemberQuickSaleVo> findmemberQuickSaleListInPage(Page<MemberQuickBuySaleEntity> page,
            @Param("record")MemberQuickBuySaleEntity memberQuickBuySaleEntity);
    String selectCZByMemberId(@Param("memberId")String memberId);
    String selectTXByMemberId(@Param("memberId")String memberId);
}
src/main/java/com/xcong/excoin/modules/member/service/IMemberService.java
@@ -10,6 +10,7 @@
import com.xcong.excoin.common.entity.FebsResponse;
import com.xcong.excoin.common.entity.QueryRequest;
import com.xcong.excoin.modules.member.dto.MemberDetailConfirmDto;
import com.xcong.excoin.modules.member.entity.AgentFriendRelationEntity;
import com.xcong.excoin.modules.member.entity.MemberCoinChargeEntity;
import com.xcong.excoin.modules.member.entity.MemberCoinWithdrawEntity;
import com.xcong.excoin.modules.member.entity.MemberEntity;
@@ -60,4 +61,6 @@
    FebsResponse memberDataInfoList(@NotNull(message = "{required}") long id);
    IPage<AgentFriendRelationEntity> findAgentInfoListInPage(AgentFriendRelationEntity agentFriendRelationEntity, QueryRequest request);
}
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -7,6 +7,7 @@
import com.xcong.excoin.common.entity.FebsResponse;
import com.xcong.excoin.common.entity.QueryRequest;
import com.xcong.excoin.modules.member.dto.MemberDetailConfirmDto;
import com.xcong.excoin.modules.member.entity.AgentFriendRelationEntity;
import com.xcong.excoin.modules.member.entity.MemberAccountMoneyChangeEntity;
import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity;
import com.xcong.excoin.modules.member.entity.MemberCoinChargeEntity;
@@ -14,6 +15,7 @@
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.member.entity.MemberQuickBuySaleEntity;
import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
import com.xcong.excoin.modules.member.mapper.AgentFriendRelationMapper;
import com.xcong.excoin.modules.member.mapper.MemberAccountMoneyChangeMapper;
import com.xcong.excoin.modules.member.mapper.MemberAuthenticationMapper;
import com.xcong.excoin.modules.member.mapper.MemberCoinAddressMapper;
@@ -32,10 +34,13 @@
import lombok.RequiredArgsConstructor;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@@ -66,6 +71,71 @@
    
    private final MemberAuthenticationMapper memberAuthenticationMapper;
    
    private final AgentFriendRelationMapper agentFriendRelationMapper;
    @Override
    public IPage<AgentFriendRelationEntity> findAgentInfoListInPage(AgentFriendRelationEntity agentFriendRelationEntity,
            QueryRequest request) {
        Page<AgentFriendRelationEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<AgentFriendRelationEntity> findmemberQuickBuySaleListInPage = agentFriendRelationMapper.findAgentFriendRelationListInPage(page, agentFriendRelationEntity);
        List<AgentFriendRelationEntity> records = findmemberQuickBuySaleListInPage.getRecords();
        if(records != null && records.size() > 0) {
            for(AgentFriendRelationEntity agentFriendRelation : records) {
                List<String> arrayList = new ArrayList<>();
                String inviteId = agentFriendRelation.getInviteId();
                String inviteIdCZ = null;
                String inviteIdTX = null;
                String inviteIdSY = null;
                // 当前邀请码下的所有代理MemberID
                List<AgentFriendRelationEntity> lowLevelList = agentFriendRelationMapper.selectAgentFriendRelationByMap(inviteId);
                List<String> memberLevel = memberMapper.selectMemberBylowLevelInviteId(inviteId);
                arrayList.addAll(memberLevel);
                if(lowLevelList != null && lowLevelList.size() > 0) {
                    for(AgentFriendRelationEntity lowLevelMemberId : lowLevelList) {
                        Long memberId = lowLevelMemberId.getMemberId();
                        arrayList.add(memberId.toString());
                        List<String> memberlowLevel = memberMapper.selectMemberBylowLevelInviteId(lowLevelMemberId.getInviteId());
                        arrayList.addAll(memberlowLevel);
                    }
                    Set<String> set = new HashSet<>();
                    List<String> newList = new ArrayList<>();
                    set.addAll(arrayList);
                    newList.addAll(set);
                    //获取对应的充值提现
                    double czNumber = 0;
                    double txNumber = 0;
                    if(newList != null && newList.size() > 0) {
                        agentFriendRelation.setPromotionNumber(newList.size());
                        for(String memberId : newList) {
                            //充币
                            String selectCBByMemberId = memberCoinChargeMapper.selectCBByMemberId(memberId);
                            //充值
                            String selectCZByMemberI = memberQuickBuySaleMapper.selectCZByMemberId(memberId);
                            //提币
                            String selectTBByMemberId = memberCoinWithdrawMapper.selectTBByMemberId(memberId);
                            //提现
                            String selectTXByMemberId = memberQuickBuySaleMapper.selectTXByMemberId(memberId);
                            czNumber = czNumber + (selectCBByMemberId == null ? 0 : Double.parseDouble(selectCBByMemberId));
                            czNumber = czNumber + (selectCZByMemberI == null ? 0 : Double.parseDouble(selectCZByMemberI));
                            txNumber = txNumber + (selectTBByMemberId == null ? 0 : Double.parseDouble(selectTBByMemberId));
                            txNumber = txNumber + (selectTXByMemberId == null ? 0 : Double.parseDouble(selectTXByMemberId));
                        }
                    }
                    inviteIdCZ = czNumber+"";
                    inviteIdTX = txNumber+"";
                    inviteIdSY = (czNumber-txNumber)+"";
                }
                agentFriendRelation.setTotalRecharge(inviteIdCZ == null ? "0.0" : inviteIdCZ);
                agentFriendRelation.setTotalWithdrawal(inviteIdTX == null ? "0.0" : inviteIdTX);
                agentFriendRelation.setTotalPerformance(inviteIdSY == null ? "0.0" : inviteIdSY);
            }
        }
        return findmemberQuickBuySaleListInPage;
    }
    @Override
    public IPage<MemberEntity> findMemberListInPage(MemberEntity memberEntity, QueryRequest request) {
src/main/resources/mapper/modules/AgentFriendRelationMapper.xml
New file
@@ -0,0 +1,25 @@
<?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="com.xcong.excoin.modules.member.mapper.AgentFriendRelationMapper">
    <select id="findAgentFriendRelationListInPage" resultType="com.xcong.excoin.modules.member.entity.AgentFriendRelationEntity">
        select * from agent_friend_relation s left join member m on m.id = s.member_id
        <where>
            <if test="record != null" >
                <if test="record.account!=null and record.account!=''">
                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
                </if>
            </if>
        </where>
    </select>
    <select id="selectAgentFriendRelationByMap" resultType="com.xcong.excoin.modules.member.entity.AgentFriendRelationEntity">
         SELECT
            *
        FROM
            agent_friend_relation
        WHERE
            FIND_IN_SET(#{inviteId}, referer_ids)
    </select>
</mapper>
src/main/resources/mapper/modules/MemberCoinChargeMapper.xml
@@ -16,5 +16,9 @@
        </where>
        order by s.create_time desc
    </select>
    <select id="selectCBByMemberId" resultType="java.lang.String">
         select IFNULL(sum(amount),'0') from member_coin_charge where member_id = #{memberId}
    </select>
</mapper>
src/main/resources/mapper/modules/MemberCoinWithdrawMapper.xml
@@ -22,5 +22,9 @@
        </where>
        order by s.create_time desc    
    </select>
     <select id="selectTBByMemberId" resultType="java.lang.String">
         select IFNULL(sum(amount),'0') from member_coin_withdraw where member_id = #{memberId} and status = 2
    </select>
</mapper>
src/main/resources/mapper/modules/MemberMapper.xml
@@ -346,4 +346,8 @@
            )
    </select>
    
    <select id="selectMemberBylowLevelInviteId" resultType="java.lang.String">
         select id from member where FIND_IN_SET(#{inviteId},referer_ids)
    </select>
</mapper>
src/main/resources/mapper/modules/MemberQuickBuySaleMapper.xml
@@ -2,6 +2,19 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xcong.excoin.modules.member.mapper.MemberQuickBuySaleMapper">
    <select id="selectCZByMemberId" resultType="java.lang.String">
         select IFNULL(sum(amount_usdt),'0') from member_quick_buy_sale s
         where s.order_type = 'B'
         and s.member_id = #{memberId}
         and s.order_status = 3
    </select>
    <select id="selectTXByMemberId" resultType="java.lang.String">
         select IFNULL(sum(amount_usdt),'0') from member_quick_buy_sale s
         where s.order_type = 'S'
         and s.member_id = #{memberId}
         and s.order_status = 3
    </select>
    <select id="findmemberQuickBuySaleListInPage" resultType="com.xcong.excoin.modules.member.vo.MemberQuickBuySaleVo">
        select * from member_quick_buy_sale s left join member m on m.id = s.member_id
src/main/resources/templates/error/403.html
@@ -1,40 +1,40 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>FEBS 权限系统</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">
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="stylesheet" th:href="@{layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{febs/css/febs.css}" media="all">
    <link rel="icon" th:href="@{febs/images/favicon.ico}" type="image/x-icon"/>
</head>
<body>
<div class="layui-fluid" id="febs-error-403" lay-title="403">
    <div class="layui-row layui-col-space10" style="margin-top:100px">
        <div class="layui-col-xs3 layui-col-xs-offset2">
            <img data-th-src="@{febs/images/error/403.svg}" alt="" width="85%"/>
        </div>
        <div class="layui-col-xs7">
            <h1 style="font-size: 60px">403</h1>
            <h2 class="febs-mar-b20 febs-c-gray">抱歉,你无权访问该页面</h2>
            <button class="layui-btn layui-btn-normal" id="home">返回首页</button>
        </div>
    </div>
</div>
<script th:src="@{layui/layui.js}"></script>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['jquery'], function () {
        var $ = layui.jquery,
            ctx = [[@{/}]],
            $view = $('#febs-error-403');
        $view.on('click', 'button', function () {
            window.location.href = ctx + 'index';
        });
    });
</script>
</body>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>Biue 后台系统</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">
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="stylesheet" th:href="@{layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{febs/css/febs.css}" media="all">
    <link rel="icon" th:href="@{febs/images/favicon.ico}" type="image/x-icon"/>
</head>
<body>
<div class="layui-fluid" id="febs-error-403" lay-title="403">
    <div class="layui-row layui-col-space10" style="margin-top:100px">
        <div class="layui-col-xs3 layui-col-xs-offset2">
            <img data-th-src="@{febs/images/error/403.svg}" alt="" width="85%"/>
        </div>
        <div class="layui-col-xs7">
            <h1 style="font-size: 60px">403</h1>
            <h2 class="febs-mar-b20 febs-c-gray">抱歉,你无权访问该页面</h2>
            <button class="layui-btn layui-btn-normal" id="home">返回首页</button>
        </div>
    </div>
</div>
<script th:src="@{layui/layui.js}"></script>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['jquery'], function () {
        var $ = layui.jquery,
            ctx = [[@{/}]],
            $view = $('#febs-error-403');
        $view.on('click', 'button', function () {
            window.location.href = ctx + 'index';
        });
    });
</script>
</body>
</html>
src/main/resources/templates/error/404.html
@@ -1,42 +1,42 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>FEBS 权限系统</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">
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="stylesheet" th:href="@{layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{febs/css/febs.css}" media="all">
    <link rel="icon" th:href="@{febs/images/favicon.ico}" type="image/x-icon"/>
</head>
<body>
<div class="layui-fluid" id="febs-error-404" lay-title="页面不存在">
    <div class="layui-row layui-col-space10" style="margin-top:100px">
        <div class="layui-col-xs3 layui-col-xs-offset2">
            <img data-th-src="@{febs/images/error/404.svg}" alt="" width="85%"/>
        </div>
        <div class="layui-col-xs7">
            <h1 style="font-size: 60px">404</h1>
            <h2 class="febs-mar-b20 febs-c-gray">抱歉,你访问的页面不存在</h2>
            <button class="layui-btn layui-btn-normal">
                返回首页
            </button>
        </div>
    </div>
</div>
<script th:src="@{layui/layui.js}"></script>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['jquery'], function () {
        var $ = layui.jquery,
            ctx = [[@{/}]],
            $view = $('#febs-error-404');
        $view.on('click', 'button', function () {
            window.location.href = ctx + 'index';
        });
    });
</script>
</body>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>Biue 后台系统</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">
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="stylesheet" th:href="@{layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{febs/css/febs.css}" media="all">
    <link rel="icon" th:href="@{febs/images/favicon.ico}" type="image/x-icon"/>
</head>
<body>
<div class="layui-fluid" id="febs-error-404" lay-title="页面不存在">
    <div class="layui-row layui-col-space10" style="margin-top:100px">
        <div class="layui-col-xs3 layui-col-xs-offset2">
            <img data-th-src="@{febs/images/error/404.svg}" alt="" width="85%"/>
        </div>
        <div class="layui-col-xs7">
            <h1 style="font-size: 60px">404</h1>
            <h2 class="febs-mar-b20 febs-c-gray">抱歉,你访问的页面不存在</h2>
            <button class="layui-btn layui-btn-normal">
                返回首页
            </button>
        </div>
    </div>
</div>
<script th:src="@{layui/layui.js}"></script>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['jquery'], function () {
        var $ = layui.jquery,
            ctx = [[@{/}]],
            $view = $('#febs-error-404');
        $view.on('click', 'button', function () {
            window.location.href = ctx + 'index';
        });
    });
</script>
</body>
</html>
src/main/resources/templates/error/500.html
@@ -1,42 +1,42 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>FEBS 权限系统</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">
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="stylesheet" th:href="@{layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{febs/css/febs.css}" media="all">
    <link rel="icon" th:href="@{febs/images/favicon.ico}" type="image/x-icon"/>
</head>
<body>
<div class="layui-fluid" id="febs-error-500" lay-title="500">
    <div class="layui-row layui-col-space10" style="margin-top:100px">
        <div class="layui-col-xs4 layui-col-xs-offset2">
            <img data-th-src="@{febs/images/error/500.svg}" alt="" width="85%"/>
        </div>
        <div class="layui-col-xs6">
            <h1 style="font-size: 60px">500</h1>
            <h2 class="febs-mar-b20 febs-c-gray">抱歉,服务器出错了</h2>
            <button class="layui-btn layui-btn-normal">
                返回首页
            </button>
        </div>
    </div>
</div>
<script th:src="@{layui/layui.js}"></script>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['jquery'], function () {
        var $ = layui.jquery,
            ctx = [[@{/}]],
            $view = $('#febs-error-500');
        $view.on('click', 'button', function () {
            window.location.href = ctx + 'index';
        });
    });
</script>
</body>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>Biue 后台系统</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">
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="stylesheet" th:href="@{layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{febs/css/febs.css}" media="all">
    <link rel="icon" th:href="@{febs/images/favicon.ico}" type="image/x-icon"/>
</head>
<body>
<div class="layui-fluid" id="febs-error-500" lay-title="500">
    <div class="layui-row layui-col-space10" style="margin-top:100px">
        <div class="layui-col-xs4 layui-col-xs-offset2">
            <img data-th-src="@{febs/images/error/500.svg}" alt="" width="85%"/>
        </div>
        <div class="layui-col-xs6">
            <h1 style="font-size: 60px">500</h1>
            <h2 class="febs-mar-b20 febs-c-gray">抱歉,服务器出错了</h2>
            <button class="layui-btn layui-btn-normal">
                返回首页
            </button>
        </div>
    </div>
</div>
<script th:src="@{layui/layui.js}"></script>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['jquery'], function () {
        var $ = layui.jquery,
            ctx = [[@{/}]],
            $view = $('#febs-error-500');
        $view.on('click', 'button', function () {
            window.location.href = ctx + 'index';
        });
    });
</script>
</body>
</html>
src/main/resources/templates/febs/views/index.html
@@ -1,428 +1,280 @@
<style>
    #febs-index .welcome-info {
        border: 1px solid #f1f1f1;
        margin-bottom: .5rem;
        padding: .5rem;
    }
    #febs-index .welcome-info-wrapper {
        padding: .2rem;
        display: inline-block
    }
    #febs-index .welcome-info-wrapper .user-header {
        display: inline-block;
        vertical-align: middle
    }
    #febs-index .welcome-info-wrapper .user-header img {
        width: 5rem;
        margin: .5rem 1rem;
        border-radius: 50%
    }
    #febs-index .welcome-info-wrapper .user-info {
        display: inline-block;
        vertical-align: middle
    }
    #febs-index .welcome-info-wrapper .user-info .random-message {
        font-size: 1rem;
        margin-bottom: .2rem;
        max-width: 21rem
    }
    #febs-index .welcome-info-wrapper .user-info .user-dept, #febs-index .welcome-info-wrapper .user-info .user-login-info {
        color: rgba(0, 0, 0, 0.45);
    }
    #febs-index .login-count-table {
        width: 100%;
        margin: 1rem;
    }
    #febs-index .login-count-table .count {
        padding-top: .8rem;
        font-size: 1rem;
        font-weight: 600;
        color: #1890ff
    }
    #febs-index .project-table {
        padding: .5rem;
        border: 1px solid #f1f1f1;
        width: 100%
    }
    #febs-index .project-table-td {
        padding: .5rem 0.7rem;
        border: 1px solid #f1f1f1;
    }
    #febs-index .project-table-td a {
        color: #42b983;
        font-size: .9rem;
        font-weight: 600;
    }
    #febs-index .project-desc {
        color: rgba(0, 0, 0, 0.45);
    }
</style>
<div class="layui-fluid layui-anim febs-anim-up" id="febs-index" lay-title="系统首页">
    <div class="layui-row layui-col-space8 febs-container">
        <div class="layui-col-md12 layui-col-sm12 layui-col-xs12">
            <div class="layui-card">
                <div class="layui-card-body layui-anim layui-anim-fadein">
                    <div class="layui-row welcome-info">
                        <div class="layui-col-md6 layui-col-sm12 layui-col-xs12">
                            <div class="layui-row welcome-info-wrapper">
                                <div class="user-header">
                                    <img alt="头像" id="user-avatar" data-th-src="@{febs/images/avatar/empty.jpg}">
                                </div>
                                <div class="user-info">
                                    <div class="layui-row">
                                        <div class="random-message">
                                            <span id="welcome-message"></span>
                                        </div>
                                        <div class="user-dept">
                                            <span id="user-dept"></span> | <span id="user-role"></span>
                                        </div>
                                        <div class="user-login-info">
                                            上次登录时间:<span id="last-login-time">2019-05-23 18:45:12</span>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md6 layui-col-sm12 layui-col-xs12">
                            <div class="layui-col-md-offset5">
                                <table class="login-count-table">
                                    <tr>
                                        <td>注册用户数量</td>
                                        <td>持仓用户数量</td>
                                        <td>当前平台总金额</td>
                                    </tr>
                                    <tr>
                                        <td class="count" id="today-ip">
                                            0
                                        </td>
                                        <td class="count" id="today-visit-count">
                                            0
                                        </td>
                                        <td class="count" id="total-visit-count">
                                            0
                                        </td>
                                    </tr>
                                </table>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div class="layui-col-md6 layui-col-sm6 layui-col-xs12">
            <div class="layui-card">
                <div class="layui-card-body">
                    <div id="chart" style="height: 350px"></div>
                </div>
            </div>
        </div>
        <div class="layui-col-md6 layui-col-sm6 layui-col-xs12">
            <div class="layui-card">
                <div class="layui-card-body">
                    <table class="project-table">
                        <tr>
                            <td style="padding: .8rem;">进行中的项目</td>
                            <td style="padding: .8rem;text-align: right">
                                <a target="_blank" href="https://github.com/wuyouzhuguli?tab=repositories">所有项目</a>
                            </td>
                        </tr>
                        <tr>
                            <td class="project-table-td">
                                <div class="layui-row">
                                    <div class="layui-col-md12 layui-col-xs12">
                                        <div class="layui-row">
                                            <div class="layui-col-md12">
                                                <a target="_blank" href="https://github.com/wuyouzhuguli/FEBS-Cloud">FEBS
                                                    Cloud</a>
                                            </div>
                                            <div class="project-desc">
                                                Spring Cloud 微服务权限管理系统。
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </td>
                            <td class="project-table-td">
                                <div class="layui-row">
                                    <div class="layui-col-md12 layui-col-xs12">
                                        <div class="layui-row">
                                            <div class="layui-col-md12">
                                                <a target="_blank" href="https://github.com/wuyouzhuguli/FEBS-Cloud-Web">FEBS
                                                    Cloud Web</a>
                                            </div>
                                            <div class="project-desc">
                                                FEBS-Cloud前端,使用 vue-element-admin 构建。
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td class="project-table-td">
                                <div class="layui-row">
                                    <div class="layui-col-md12 layui-col-xs12">
                                        <div class="layui-row">
                                            <div class="layui-col-md12">
                                                <a target="_blank" href="https://github.com/wuyouzhuguli/FEBS-Shiro">FEBS
                                                    Shiro</a>
                                            </div>
                                            <div class="project-desc">
                                                Spring Boot 2.0.4 & Shiro1.4.0 权限管理系统。
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </td>
                            <td class="project-table-td">
                                <div class="layui-row">
                                    <div class="layui-col-md12 layui-col-xs12">
                                        <div class="layui-row">
                                            <div class="layui-col-md12">
                                                <a target="_blank" href="https://github.com/wuyouzhuguli/FEBS-Security">FEBS
                                                    Security</a>
                                            </div>
                                            <div class="project-desc">
                                                Spring Boot 2.0.4 & Spring Security 5.0.7 权限管理系统。
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td class="project-table-td">
                                <div class="layui-row">
                                    <div class="layui-col-md12 layui-col-xs12">
                                        <div class="layui-row">
                                            <div class="layui-col-md12">
                                                <a target="_blank" href="https://github.com/wuyouzhuguli/FEBS-Actuator">FEBS
                                                    Cloud K8S</a>
                                            </div>
                                            <div class="project-desc">
                                                FEBS Cloud K8S集群部署脚本。
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </td>
                            <td class="project-table-td">
                                <div class="layui-row">
                                    <div class="layui-col-md12 layui-col-xs12">
                                        <div class="layui-row">
                                            <div class="layui-col-md12">
                                                <a target="_blank" href="https://github.com/wuyouzhuguli/SpringAll">SpringAll</a>
                                            </div>
                                            <div class="project-desc">
                                                循序渐进学习Spring Boot、Spring Cloud与Spring Security。
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td class="project-table-td">
                                <div class="layui-row">
                                    <div class="layui-col-md12 layui-col-xs12">
                                        <div class="layui-row">
                                            <div class="layui-col-md12">
                                                <a target="_blank" href="https://github.com/wuyouzhuguli/FEBS-Vue">FEBS
                                                    Vue</a>
                                            </div>
                                            <div class="project-desc">
                                                FEBS-Shiro前后端分离版本,前端架构采用Vue全家桶。
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </td>
                            <td class="project-table-td">
                                <div class="layui-row">
                                    <div class="layui-col-md12 layui-col-xs12">
                                        <div class="layui-row">
                                            <div class="layui-col-md12">
                                                <a target="_blank" href="https://github.com/wuyouzhuguli/FEBS-Actuator">FEBS Actuator</a>
                                            </div>
                                            <div class="project-desc">
                                                使用Spring Boot Admin 2.0.2构建,用于监控FEBS。
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </td>
                        </tr>
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['apexcharts', 'febs', 'jquery', 'util'], function () {
        var $ = layui.jquery,
            util = layui.util,
            $view = $('#febs-index'),
            febs = layui.febs;
        febs.get(ctx + 'index/' + currentUser.username, null, function (r) {
            handleSuccess(r.data);
        });
        function handleSuccess(data) {
            var hour = new Date().getHours();
            var time = hour < 6 ? '早上好' : (hour <= 11 ? '上午好' : (hour <= 13 ? '中午好' : (hour <= 18 ? '下午好' : '晚上好')));
            var welcomeArr = [
                '喝杯咖啡休息下吧☕',
                '要不要和朋友打局LOL',
                '今天又写了几个Bug呢',
                '今天在群里吹水了吗',
                '今天吃了什么好吃的呢',
                '今天您微笑了吗😊',
                '今天帮助别人了吗',
                '准备吃些什么呢',
                '周末要不要去看电影?'
            ];
            var index = Math.floor((Math.random() * welcomeArr.length));
            var welcomeMessage = time + ',<a id="febs-index-user">' + currentUser.username + '</a>,' + welcomeArr[index];
            $view.find('#today-ip').text(data.todayIp).end()
                .find('#today-visit-count').text(data.todayVisitCount).end()
                .find('#total-visit-count').text(data.totalVisitCount).end()
                .find('#user-dept').text(currentUser.deptName ? currentUser.deptName : '暂无所属部门').end()
                .find('#user-role').text(currentUser.roleName ? currentUser.roleName : '暂无角色').end()
                .find('#last-login-time').text(currentUser.lastLoginTime ? currentUser.lastLoginTime : '第一次访问系统').end()
                .find('#welcome-message').html(welcomeMessage).end()
                .find('#user-avatar').attr('src', ctx + "febs/images/avatar/" + currentUser.avatar);
            var currentTime = new Date().getTime();
            var yourVisitCount = [];
            var totalVisitCount = [];
            var lastTenDays = [
                util.toDateString(new Date(currentTime - 1000 * 9 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 8 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 7 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 6 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 5 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 4 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 3 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 2 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime), 'MM-dd')
            ];
            layui.each(lastTenDays, function (k, i) {
                var contain = false;
                layui.each(data.lastSevenUserVisitCount, function (key, item) {
                    if (i === item.days) {
                        yourVisitCount.push(item.count);
                        contain = true;
                    }
                });
                if (!contain) yourVisitCount.push(0);
                contain = false;
                layui.each(data.lastSevenVisitCount, function (key, item) {
                    if (i === item.days) {
                        totalVisitCount.push(item.count);
                        contain = true;
                    }
                });
                if (!contain) totalVisitCount.push(0);
            });
            var options = {
                chart: {
                    height: 350,
                    type: 'area',
                    toolbar: {
                        show: false
                    }
                },
                colors: ['#1890ff', '#0acf97'],
                plotOptions: {
                    bar: {
                        horizontal: false,
                        columnWidth: '32rem'
                    }
                },
                dataLabels: {
                    enabled: false
                },
                stroke: {
                    width: [3, 3],
                    curve: 'smooth'
                },
                series: [{
                    name: '总数',
                    data: totalVisitCount
                }, {
                    name: '您',
                    data: yourVisitCount
                }],
                xaxis: {
                    categories: lastTenDays,
                    axisTicks: {
                        show: true
                    },
                    axisBorder: {
                        show: true,
                        color: '#f1f1f1'
                    }
                },
                fill: {
                    type: 'gradient',
                    gradient: {
                        shadeIntensity: 1,
                        inverseColors: false,
                        opacityFrom: 0.5,
                        opacityTo: 0,
                        stops: [0, 90, 100]
                    }
                },
                title: {
                    text: '近10天系统访问记录',
                    align: 'left',
                    style: {
                        color: 'rgba(0, 0, 0, .65)'
                    }
                },
                tooltip: {
                    y: {
                        formatter: function (val) {
                            return "访问次数 " + val + " 次"
                        }
                    }
                },
                grid: {
                    row: {
                        colors: ['transparent', 'transparent'],
                        opacity: 0.2
                    },
                    borderColor: '#f1f1f1'
                }
            };
            new ApexCharts(
                document.querySelector("#chart"),
                options
            ).render();
        }
        $view.on('click', '#febs-index-user',function () {
            febs.navigate("/user/profile");
        })
    });
</script>
<style>
    #febs-index .welcome-info {
        border: 1px solid #f1f1f1;
        margin-bottom: .5rem;
        padding: .5rem;
    }
    #febs-index .welcome-info-wrapper {
        padding: .2rem;
        display: inline-block
    }
    #febs-index .welcome-info-wrapper .user-header {
        display: inline-block;
        vertical-align: middle
    }
    #febs-index .welcome-info-wrapper .user-header img {
        width: 5rem;
        margin: .5rem 1rem;
        border-radius: 50%
    }
    #febs-index .welcome-info-wrapper .user-info {
        display: inline-block;
        vertical-align: middle
    }
    #febs-index .welcome-info-wrapper .user-info .random-message {
        font-size: 1rem;
        margin-bottom: .2rem;
        max-width: 21rem
    }
    #febs-index .welcome-info-wrapper .user-info .user-dept, #febs-index .welcome-info-wrapper .user-info .user-login-info {
        color: rgba(0, 0, 0, 0.45);
    }
    #febs-index .login-count-table {
        width: 100%;
        margin: 1rem;
    }
    #febs-index .login-count-table .count {
        padding-top: .8rem;
        font-size: 1rem;
        font-weight: 600;
        color: #1890ff
    }
    #febs-index .project-table {
        padding: .5rem;
        border: 1px solid #f1f1f1;
        width: 100%
    }
    #febs-index .project-table-td {
        padding: .5rem 0.7rem;
        border: 1px solid #f1f1f1;
    }
    #febs-index .project-table-td a {
        color: #42b983;
        font-size: .9rem;
        font-weight: 600;
    }
    #febs-index .project-desc {
        color: rgba(0, 0, 0, 0.45);
    }
</style>
<div class="layui-fluid layui-anim febs-anim-up" id="febs-index" lay-title="系统首页">
    <div class="layui-row layui-col-space8 febs-container">
        <div class="layui-col-md12 layui-col-sm12 layui-col-xs12">
            <div class="layui-card">
                <div class="layui-card-body layui-anim layui-anim-fadein">
                    <div class="layui-row welcome-info">
                        <div class="layui-col-md6 layui-col-sm12 layui-col-xs12">
                            <div class="layui-row welcome-info-wrapper">
                                <div class="user-header">
                                    <img alt="头像" id="user-avatar" data-th-src="@{febs/images/avatar/empty.jpg}">
                                </div>
                                <div class="user-info">
                                    <div class="layui-row">
                                        <div class="random-message">
                                            <span id="welcome-message"></span>
                                        </div>
                                        <div class="user-dept">
                                            <span id="user-dept"></span> | <span id="user-role"></span>
                                        </div>
                                        <div class="user-login-info">
                                            上次登录时间:<span id="last-login-time">2019-05-23 18:45:12</span>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md6 layui-col-sm12 layui-col-xs12">
                            <div class="layui-col-md-offset5">
                                <table class="login-count-table">
                                    <tr>
                                        <td>注册用户数量</td>
                                    </tr>
                                    <tr>
                                        <td class="count" id="today-ip">
                                            0
                                        </td>
                                    </tr>
                                </table>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div class="layui-col-md6 layui-col-sm6 layui-col-xs12">
            <div class="layui-card">
                <div class="layui-card-body">
                    <div id="chart" style="height: 350px"></div>
                </div>
            </div>
        </div>
    </div>
</div>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['apexcharts', 'febs', 'jquery', 'util'], function () {
        var $ = layui.jquery,
            util = layui.util,
            $view = $('#febs-index'),
            febs = layui.febs;
        febs.get(ctx + 'index/' + currentUser.username, null, function (r) {
            handleSuccess(r.data);
        });
        function handleSuccess(data) {
            var hour = new Date().getHours();
            var time = hour < 6 ? '早上好' : (hour <= 11 ? '上午好' : (hour <= 13 ? '中午好' : (hour <= 18 ? '下午好' : '晚上好')));
            var welcomeArr = [
                '喝杯咖啡休息下吧☕',
                '要不要和朋友打局LOL',
                '今天又写了几个Bug呢',
                '今天在群里吹水了吗',
                '今天吃了什么好吃的呢',
                '今天您微笑了吗😊',
                '今天帮助别人了吗',
                '准备吃些什么呢',
                '周末要不要去看电影?'
            ];
            var index = Math.floor((Math.random() * welcomeArr.length));
            var welcomeMessage = time + ',<a id="febs-index-user">' + currentUser.username + '</a>,' + welcomeArr[index];
            $view.find('#today-ip').text(data.todayIp).end()
                .find('#today-visit-count').text(data.todayVisitCount).end()
                .find('#total-visit-count').text(data.totalVisitCount).end()
                .find('#user-dept').text(currentUser.deptName ? currentUser.deptName : '暂无所属部门').end()
                .find('#user-role').text(currentUser.roleName ? currentUser.roleName : '暂无角色').end()
                .find('#last-login-time').text(currentUser.lastLoginTime ? currentUser.lastLoginTime : '第一次访问系统').end()
                .find('#welcome-message').html(welcomeMessage).end()
                .find('#user-avatar').attr('src', ctx + "febs/images/avatar/" + currentUser.avatar);
            var currentTime = new Date().getTime();
            var yourVisitCount = [];
            var totalVisitCount = [];
            var lastTenDays = [
                util.toDateString(new Date(currentTime - 1000 * 9 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 8 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 7 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 6 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 5 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 4 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 3 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 2 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime - 1000 * 86400), 'MM-dd'),
                util.toDateString(new Date(currentTime), 'MM-dd')
            ];
            layui.each(lastTenDays, function (k, i) {
                var contain = false;
                layui.each(data.lastSevenUserVisitCount, function (key, item) {
                    if (i === item.days) {
                        yourVisitCount.push(item.count);
                        contain = true;
                    }
                });
                if (!contain) yourVisitCount.push(0);
                contain = false;
                layui.each(data.lastSevenVisitCount, function (key, item) {
                    if (i === item.days) {
                        totalVisitCount.push(item.count);
                        contain = true;
                    }
                });
                if (!contain) totalVisitCount.push(0);
            });
            var options = {
                chart: {
                    height: 350,
                    type: 'area',
                    toolbar: {
                        show: false
                    }
                },
                colors: ['#1890ff', '#0acf97'],
                plotOptions: {
                    bar: {
                        horizontal: false,
                        columnWidth: '32rem'
                    }
                },
                dataLabels: {
                    enabled: false
                },
                stroke: {
                    width: [3, 3],
                    curve: 'smooth'
                },
                series: [{
                    name: '总数',
                    data: totalVisitCount
                }, {
                    name: '您',
                    data: yourVisitCount
                }],
                xaxis: {
                    categories: lastTenDays,
                    axisTicks: {
                        show: true
                    },
                    axisBorder: {
                        show: true,
                        color: '#f1f1f1'
                    }
                },
                fill: {
                    type: 'gradient',
                    gradient: {
                        shadeIntensity: 1,
                        inverseColors: false,
                        opacityFrom: 0.5,
                        opacityTo: 0,
                        stops: [0, 90, 100]
                    }
                },
                title: {
                    text: '近10天系统访问记录',
                    align: 'left',
                    style: {
                        color: 'rgba(0, 0, 0, .65)'
                    }
                },
                tooltip: {
                    y: {
                        formatter: function (val) {
                            return "访问次数 " + val + " 次"
                        }
                    }
                },
                grid: {
                    row: {
                        colors: ['transparent', 'transparent'],
                        opacity: 0.2
                    },
                    borderColor: '#f1f1f1'
                }
            };
            new ApexCharts(
                document.querySelector("#chart"),
                options
            ).render();
        }
        $view.on('click', '#febs-index-user',function () {
            febs.navigate("/user/profile");
        })
    });
</script>
src/main/resources/templates/febs/views/layout.html
@@ -1,178 +1,178 @@
<div class="layui-layout layui-layout-admin" id="febs-layout">
    <div class="layui-header layui-anim febs-anim-down" id="app-header">
        <script type="text/html"
                template
                lay-done="layui.element.render('nav','febs-header')">
            <ul class="layui-nav layui-layout-left" lay-filter="febs-header">
                <li class="layui-nav-item" lay-unselect>
                    <a febs-event="flexible" title="侧边伸缩">
                        <i class="layui-icon layui-icon-shrink-right"></i>
                    </a>
                </li>
                 <span class="febs-breadcrumb"></span>
            </ul>
            <ul class="layui-nav layui-layout-right" lay-filter="febs-header">
                <li class="layui-nav-item layui-hide-xs" id="fullscreen" lay-unselect>
                    <a title="切换全屏">
                        <i class="layui-icon layui-icon-screen-full"></i>
                    </a>
                </li>
                <li class="layui-nav-item layui-user" lay-unselect>
                    <a>
                        <img style="width: 1.9rem;margin-right:.5rem;border-radius: 50%"
                             src="{{= ctx + 'febs/images/avatar/' + currentUser.avatar }}" title="头像">
                        {{ currentUser.username }}
                    </a>
                    <dl class="layui-nav-child">
                        <dd><a class="layui-nav-child-href" id="user-profile">个人中心</a></dd>
                        <dd><a class="layui-nav-child-href" id="password-update">密码修改</a></dd>
                        <dd><a class="layui-nav-child-href" data-th-href="@{logout}">退出登录</a></dd>
                    </dl>
                </li>
            </ul>
        </script>
    </div>
    <div class="febs-tabs-hidden">
        <script type="text/html" id="TPL-app-tabsmenu" template>
            {{# if(layui.conf.viewTabs){ }}
            <div class="febs-tabs-wrap">
          <span class="febs-tabs-btn febs-tabs-action febs-tabs-prev" data-type="prev">
              <i class="layui-icon layui-icon-left"></i>
          </span>
                <span class="febs-tabs-btn febs-tabs-action febs-tabs-next" data-type="next">
              <i class="layui-icon layui-icon-right"></i>
          </span>
                <span class="febs-tabs-btn febs-tabs-action febs-tabs-down" data-type="down">
              <i class="layui-icon layui-icon-close"></i>
          </span>
                <ul class="febs-tabs-menu">
                    {{# layui.each(layui.view.tab.data,function(i, item){ }}
                    <li data-type="page" class="febs-tabs-btn" lay-url="{{item.fileurl}}">
                        <i class="febs-tabs-ball"></i>{{ item.title }}<b class="layui-icon layui-icon-close febs-tabs-close"></b>
                    </li>
                    {{# }) }}
                </ul>
            </div>
            {{# } }}
        </script>
    </div>
    <!-- 侧边菜单 -->
    <div class="layui-side" id="app-sidebar">
        <div class="layui-side-scroll">
            <div class="layui-logo" style="cursor: pointer">
                <img data-th-src="@{febs/images/logo.png}">
                <span>ExCoin 管理系统</span>
            </div>
            <script
                    type="text/html"
                    template
                    lay-api="getMenus"
                    lay-done="layui.element.render('nav','febs-sidebar');layui.febs.sidebarFocus()">
                <ul class="layui-nav layui-nav-tree" lay-filter="febs-sidebar" lay-shrink="all">
                    {{#
                    function __createSlidebar(data,index){
                    if(!data || data.length == 0) return '';
                    var html = '
                    <dl class="layui-nav-child">';
                        layui.each(data, function(i, child) {
                        var left = index == 0 ? 50 : 50 + index * 20;
                        var title = child.title;
                        if (child.icon) {
                            title = '<i class="layui-icon '+child.icon+'"></i>' + child.title
                        }
                        html += '
                        <dd><a style="padding-left:' + left + 'px" target="'+(child.target||'')+'"
                               lay-href="'+ (child.href||'') +'">' + title + '</a>';
                            if(child.childs) html += __createSlidebar(child.childs,index+1);
                            html += '</dd>';
                        });
                        html = html +'</dl>';
                    return html;
                    }
                    layui.each(d.childs, function(i,child){
                    }}
                    <li class="layui-nav-item">
                        <a lay-href="{{child.href||''}}" target="{{child.target||''}}" title="{{child.title}}"><i
                                class="layui-icon {{child.icon}}"></i>{{child.title}} {{# if(child.notice){ }}<span
                                class="layui-badge">{{ child.notice }}</span>{{# } }}</a>
                        {{ __createSlidebar(child.childs,0) }}
                    </li>
                    {{# }) }}
                </ul>
            </script>
        </div>
    </div>
    <!-- 主体内容 -->
    <div class="layui-body" id="febs-body"></div>
</div>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['jquery', 'febs', 'element'], function () {
        var $ = layui.jquery,
            $view = $('#febs-layout'),
            febs = layui.febs;
        var element = layui.element;
        initTheme();
        $view.find('#user-avatar').attr('src', ctx + "febs/images/avatar/" + currentUser.avatar);
        $view.on('click', '.layui-logo', function () {
            febs.navigate("/index");
        });
        $view.on('click', '#fullscreen', function () {
            var $this = $(this);
            var normalCls = 'layui-icon-screen-full';
            var activeCls = 'layui-icon-screen-restore';
            var ico = $this.find('.layui-icon');
            if (ico.hasClass(normalCls)) {
                var a = document.body;
                a.webkitRequestFullScreen
                    ? a.webkitRequestFullScreen()
                    : a.mozRequestFullScreen
                    ? a.mozRequestFullScreen()
                    : a.requestFullScreen && a.requestFullscreen();
                ico.removeClass(normalCls).addClass(activeCls)
            } else {
                var b = document;
                b.webkitCancelFullScreen
                    ? b.webkitCancelFullScreen()
                    : b.mozCancelFullScreen
                    ? b.mozCancelFullScreen()
                    : b.cancelFullScreen
                        ? b.cancelFullScreen()
                        : b.exitFullscreen && b.exitFullscreen();
                ico.removeClass(activeCls).addClass(normalCls)
            }
        });
        $view.on('click', '#password-update', function () {
            febs.modal.view('密码修改', 'password/update', {
                area: $(window).width() <= 750 ? '90%' : '500px',
                btn: ['确定'],
                yes: function () {
                    $('#user-password-update').find('#submit').trigger('click');
                }
            });
        });
        $view.on('click', '#user-profile', function () {
            febs.navigate("/user/profile");
        });
        function initTheme() {
            var theme = currentUser.theme;
            var $sidebar = $('#app-sidebar');
            if (theme === 'black') {
                $sidebar.removeClass('febs-theme-white');
            }
            if (theme === 'white') {
                $sidebar.addClass('febs-theme-white');
            }
        }
    });
<div class="layui-layout layui-layout-admin" id="febs-layout">
    <div class="layui-header layui-anim febs-anim-down" id="app-header">
        <script type="text/html"
                template
                lay-done="layui.element.render('nav','febs-header')">
            <ul class="layui-nav layui-layout-left" lay-filter="febs-header">
                <li class="layui-nav-item" lay-unselect>
                    <a febs-event="flexible" title="侧边伸缩">
                        <i class="layui-icon layui-icon-shrink-right"></i>
                    </a>
                </li>
                 <span class="febs-breadcrumb"></span>
            </ul>
            <ul class="layui-nav layui-layout-right" lay-filter="febs-header">
                <li class="layui-nav-item layui-hide-xs" id="fullscreen" lay-unselect>
                    <a title="切换全屏">
                        <i class="layui-icon layui-icon-screen-full"></i>
                    </a>
                </li>
                <li class="layui-nav-item layui-user" lay-unselect>
                    <a>
                        <img style="width: 1.9rem;margin-right:.5rem;border-radius: 50%"
                             src="{{= ctx + 'febs/images/avatar/' + currentUser.avatar }}" title="头像">
                        {{ currentUser.username }}
                    </a>
                    <dl class="layui-nav-child">
                        <dd><a class="layui-nav-child-href" id="user-profile">个人中心</a></dd>
                        <dd><a class="layui-nav-child-href" id="password-update">密码修改</a></dd>
                        <dd><a class="layui-nav-child-href" data-th-href="@{logout}">退出登录</a></dd>
                    </dl>
                </li>
            </ul>
        </script>
    </div>
    <div class="febs-tabs-hidden">
        <script type="text/html" id="TPL-app-tabsmenu" template>
            {{# if(layui.conf.viewTabs){ }}
            <div class="febs-tabs-wrap">
          <span class="febs-tabs-btn febs-tabs-action febs-tabs-prev" data-type="prev">
              <i class="layui-icon layui-icon-left"></i>
          </span>
                <span class="febs-tabs-btn febs-tabs-action febs-tabs-next" data-type="next">
              <i class="layui-icon layui-icon-right"></i>
          </span>
                <span class="febs-tabs-btn febs-tabs-action febs-tabs-down" data-type="down">
              <i class="layui-icon layui-icon-close"></i>
          </span>
                <ul class="febs-tabs-menu">
                    {{# layui.each(layui.view.tab.data,function(i, item){ }}
                    <li data-type="page" class="febs-tabs-btn" lay-url="{{item.fileurl}}">
                        <i class="febs-tabs-ball"></i>{{ item.title }}<b class="layui-icon layui-icon-close febs-tabs-close"></b>
                    </li>
                    {{# }) }}
                </ul>
            </div>
            {{# } }}
        </script>
    </div>
    <!-- 侧边菜单 -->
    <div class="layui-side" id="app-sidebar">
        <div class="layui-side-scroll">
            <div class="layui-logo" style="cursor: pointer">
                <img data-th-src="@{febs/images/logo.png}">
                <span>Biue 管理系统</span>
            </div>
            <script
                    type="text/html"
                    template
                    lay-api="getMenus"
                    lay-done="layui.element.render('nav','febs-sidebar');layui.febs.sidebarFocus()">
                <ul class="layui-nav layui-nav-tree" lay-filter="febs-sidebar" lay-shrink="all">
                    {{#
                    function __createSlidebar(data,index){
                    if(!data || data.length == 0) return '';
                    var html = '
                    <dl class="layui-nav-child">';
                        layui.each(data, function(i, child) {
                        var left = index == 0 ? 50 : 50 + index * 20;
                        var title = child.title;
                        if (child.icon) {
                            title = '<i class="layui-icon '+child.icon+'"></i>' + child.title
                        }
                        html += '
                        <dd><a style="padding-left:' + left + 'px" target="'+(child.target||'')+'"
                               lay-href="'+ (child.href||'') +'">' + title + '</a>';
                            if(child.childs) html += __createSlidebar(child.childs,index+1);
                            html += '</dd>';
                        });
                        html = html +'</dl>';
                    return html;
                    }
                    layui.each(d.childs, function(i,child){
                    }}
                    <li class="layui-nav-item">
                        <a lay-href="{{child.href||''}}" target="{{child.target||''}}" title="{{child.title}}"><i
                                class="layui-icon {{child.icon}}"></i>{{child.title}} {{# if(child.notice){ }}<span
                                class="layui-badge">{{ child.notice }}</span>{{# } }}</a>
                        {{ __createSlidebar(child.childs,0) }}
                    </li>
                    {{# }) }}
                </ul>
            </script>
        </div>
    </div>
    <!-- 主体内容 -->
    <div class="layui-body" id="febs-body"></div>
</div>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['jquery', 'febs', 'element'], function () {
        var $ = layui.jquery,
            $view = $('#febs-layout'),
            febs = layui.febs;
        var element = layui.element;
        initTheme();
        $view.find('#user-avatar').attr('src', ctx + "febs/images/avatar/" + currentUser.avatar);
        $view.on('click', '.layui-logo', function () {
            febs.navigate("/index");
        });
        $view.on('click', '#fullscreen', function () {
            var $this = $(this);
            var normalCls = 'layui-icon-screen-full';
            var activeCls = 'layui-icon-screen-restore';
            var ico = $this.find('.layui-icon');
            if (ico.hasClass(normalCls)) {
                var a = document.body;
                a.webkitRequestFullScreen
                    ? a.webkitRequestFullScreen()
                    : a.mozRequestFullScreen
                    ? a.mozRequestFullScreen()
                    : a.requestFullScreen && a.requestFullscreen();
                ico.removeClass(normalCls).addClass(activeCls)
            } else {
                var b = document;
                b.webkitCancelFullScreen
                    ? b.webkitCancelFullScreen()
                    : b.mozCancelFullScreen
                    ? b.mozCancelFullScreen()
                    : b.cancelFullScreen
                        ? b.cancelFullScreen()
                        : b.exitFullscreen && b.exitFullscreen();
                ico.removeClass(activeCls).addClass(normalCls)
            }
        });
        $view.on('click', '#password-update', function () {
            febs.modal.view('密码修改', 'password/update', {
                area: $(window).width() <= 750 ? '90%' : '500px',
                btn: ['确定'],
                yes: function () {
                    $('#user-password-update').find('#submit').trigger('click');
                }
            });
        });
        $view.on('click', '#user-profile', function () {
            febs.navigate("/user/profile");
        });
        function initTheme() {
            var theme = currentUser.theme;
            var $sidebar = $('#app-sidebar');
            if (theme === 'black') {
                $sidebar.removeClass('febs-theme-white');
            }
            if (theme === 'white') {
                $sidebar.addClass('febs-theme-white');
            }
        }
    });
</script>
src/main/resources/templates/febs/views/login.html
@@ -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>ExCoin</b> 后台系统</span></div>
                    <div class="layui-logo"><span><b>Biue</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/member/agentInfo.html
New file
@@ -0,0 +1,109 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-user" 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="account" 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-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="userTable" lay-data="{id: 'userTable'}"></table>
                </div>
            </div>
        </div>
    </div>
</div>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs'], function () {
        var $ = layui.jquery,
            laydate = layui.laydate,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            dropdown = layui.dropdown,
            $view = $('#febs-user'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'createTime', type: null},
            tableIns;
        form.render();
        // 表格初始化
        initTable();
        // 查询按钮
        $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: 'userTable',
                url: ctx + 'member/agentInfoList',
                totalRow: true,
                cols: [[
                    {field: 'phone', title: '手机号码', minWidth: 120,align:'left',totalRowText: '合计'},
                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
                    {field: 'inviteId', title: '邀请码UID', minWidth: 80,align:'center'},
                    {field: 'returnRatio', title: '返佣比例', minWidth: 200,align:'center'},
                    {field: 'promotionNumber', title: '推广人数', minWidth: 200,align:'center'},
                    {field: 'totalRecharge', title: '总充值', minWidth: 200,align:'center'},
                    {field: 'totalWithdrawal', title: '总提现', minWidth: 200,align:'center'},
                    {field: 'totalPerformance', title: '总业绩', minWidth: 200,align:'center'},
                    {field: 'levelId', title: '代理等级',
                        templet: function (d) {
                                 return '<span style="color:green;">第'+d.levelId+'级</span>'
                        }, minWidth: 200,align:'center'},
                    {field: 'feeIsSelf', title: '手续费是否设置自己',
                        templet: function (d) {
                            if(d.feeIsSelf === 1){
                                  return '<span style="color:green;">是</span>'
                            }else{
                                  return '<span style="color:red;">否</span>'
                            }
                        }, minWidth: 200,align:'center'},
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                account: $searchForm.find('input[name="account"]').val().trim(),
            };
        }
    })
</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>ExCoin 后台系统</title>
    <title>Biue 后台系统</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">