Administrator
2025-04-22 f0755617c4fb6869cbead7e57528aa9ff020dd8d
后台管理页面完成
1个文件已删除
3 文件已重命名
13个文件已修改
1个文件已添加
737 ■■■■■ 已修改文件
src/main/java/com/taoke/autopay/controller/admin/credit/CreditExchangeRateAdminController.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/controller/admin/credit/CreditSettingAdminController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/controller/admin/credit/UserCreditExchangeRecordAdminController.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/controller/admin/credit/UserCreditRecordAdminController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/entity/credit/CreditExchangeRecord.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/entity/credit/ExchangeRate.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/service/credit/CreditSettingService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/service/impl/credit/CreditSettingServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/vo/admin/UserCreditExchangeRecordSearchVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/vo/admin/UserCreditRecordSearchVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/admin/credit-exchange-record-list.html 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/admin/credit-record-list.html 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/admin/credit-setting-edit.html 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/admin/credit-setting-list.html 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/admin/credit/exchange-rate-list.html 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/admin/exchange-rate-list.html 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/admin/exchange-rate-update.html 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/admin/index.html 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/taoke/autopay/controller/admin/credit/CreditExchangeRateAdminController.java
@@ -26,37 +26,53 @@
public class CreditExchangeRateAdminController {
    private Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new TypeAdapter<Date>() {
        @Override
        public void write(JsonWriter out, Date value) throws IOException {
            String desc = "";
            if (value != null) {
                // 判断是否是同一天
                desc = TimeUtil.getGernalTime(value.getTime(), "yyyy-MM-dd HH:mm:ss");
                out.value(desc);
            } else {
                out.value("");
            }
        }
                @Override
                public void write(JsonWriter out, Date value) throws IOException {
                    String desc = "";
                    if (value != null) {
                        // 判断是否是同一天
                        desc = TimeUtil.getGernalTime(value.getTime(), "yyyy-MM-dd HH:mm:ss");
                        out.value(desc);
                    } else {
                        out.value("");
                    }
                }
        @Override
        public Date read(JsonReader in) throws IOException {
            return new Date();
        }
    }).registerTypeAdapter(BigDecimal.class, new TypeAdapter<BigDecimal>() {
        @Override
        public void write(JsonWriter out, BigDecimal value) throws IOException {
            if (value != null) {
                out.value(value.toString());
            } else {
                out.value("");
            }
        }
                @Override
                public Date read(JsonReader in) throws IOException {
                    return new Date();
                }
            }).registerTypeAdapter(BigDecimal.class, new TypeAdapter<BigDecimal>() {
                @Override
                public void write(JsonWriter out, BigDecimal value) throws IOException {
                    if (value != null) {
                        out.value(value.toString());
                    } else {
                        out.value("");
                    }
                }
        @Override
        public BigDecimal read(JsonReader in) throws IOException {
            return new BigDecimal("0.00");
        }
    }).create();
                @Override
                public BigDecimal read(JsonReader in) throws IOException {
                    return new BigDecimal("0.00");
                }
            }).registerTypeAdapter(ExchangeRate.ExchangeRateType.class, new TypeAdapter<ExchangeRate.ExchangeRateType>() {
                @Override
                public void write(JsonWriter out, ExchangeRate.ExchangeRateType value) throws IOException {
                    if (value != null) {
                        out.value(value.getDesc());
                    } else {
                        out.value("");
                    }
                }
                @Override
                public ExchangeRate.ExchangeRateType read(JsonReader in) throws IOException {
                    return ExchangeRate.ExchangeRateType.GENERAL_EXCHANGE;
                }
            })
            .create();
    @Resource
    private ExchangeRateService exchangeRateService;
@@ -68,13 +84,13 @@
    @RequestMapping("list")
    public String listExchangeRates(int page, int limit) {
        List<ExchangeRate> exchangeRates = exchangeRateService.listExchangeRates(ExchangeRateMapper.DaoQuery.builder()
                        .start((long) (page - 1) * limit)
                        .count(limit)
                .start((long) (page - 1) * limit)
                .count(limit)
                .build());
        long count = exchangeRateService.countExchangeRates(ExchangeRateMapper.DaoQuery.builder().build());
        JSONObject root=new JSONObject();
        root.put("list",gson.toJson(exchangeRates));
        root.put("count",count);
        JSONObject root = new JSONObject();
        root.put("list", gson.toJson(exchangeRates));
        root.put("count", count);
        return JsonUtil.loadTrueResult(root);
    }
@@ -96,9 +112,12 @@
     */
    @ResponseBody
    @RequestMapping("update")
    public String updateExchangeRate(ExchangeRate exchangeRate) {
        int success = exchangeRateService.updateExchangeRate(exchangeRate);
        if (success>0) {
    public String updateExchangeRate(Long id, BigDecimal rate) {
        int success = exchangeRateService.updateExchangeRate(ExchangeRate.builder()
                .id(id)
                .rate(rate)
                .build());
        if (success > 0) {
            return JsonUtil.loadTrueResult("更新成功");
        } else {
            return JsonUtil.loadFalseResult("更新失败");
src/main/java/com/taoke/autopay/controller/admin/credit/CreditSettingAdminController.java
@@ -84,4 +84,16 @@
            return JsonUtil.loadFalseResult("修改失败");
        }
    }
    @ResponseBody
    @RequestMapping("get")
    public String get(Long id) {
        CreditSetting setting = creditSettingService.selectByPrimaryKey(id);
        if (setting!=null) {
            return JsonUtil.loadTrueResult(gson.toJson(setting));
        } else {
            return JsonUtil.loadFalseResult("ID不存在");
        }
    }
}
src/main/java/com/taoke/autopay/controller/admin/credit/UserCreditExchangeRecordAdminController.java
@@ -32,7 +32,8 @@
    @Resource
    private UserCreditExchangeManager userCreditExchangeManager;
    private Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new TypeAdapter<Date>() {
    private Gson gson = new GsonBuilder()
            .registerTypeAdapter(Date.class, new TypeAdapter<Date>() {
        @Override
        public void write(JsonWriter out, Date value) throws IOException {
            String desc = "";
@@ -48,7 +49,23 @@
        public Date read(JsonReader in) throws IOException {
            return new Date();
        }
    }).create();
    }) .registerTypeAdapter(CreditExchangeRecord.ExchangeType.class, new TypeAdapter<CreditExchangeRecord.ExchangeType>() {
                @Override
                public void write(JsonWriter out, CreditExchangeRecord.ExchangeType value) throws IOException {
                    String desc = "";
                    if (value != null) {
                        desc = value.getDesc();
                        out.value(desc);
                    } else {
                        out.value("");
                    }
                }
                @Override
                public CreditExchangeRecord.ExchangeType read(JsonReader in) throws IOException {
                    return null;
                }
            }).create();
    @Resource
    private CreditExchangeRecordService userCreditExchangeRecordService;
@@ -63,16 +80,16 @@
        if (!StringUtil.isNullOrEmpty(search.getUid())) {
            query.uid = Long.parseLong(search.getUid());
        }
        if (search.getStatus() != null) {
            query.exchangeStatus = search.getStatus();
        if (!StringUtil.isNullOrEmpty(search.getStatus())) {
            query.exchangeStatus =Integer.parseInt(search.getStatus());
        }
        if (search.getStartDate() != null) {
            query.minCreateTime = new Date(TimeUtil.convertToTimeTemp(search.getStartDate(), "yyyy-MM-dd"));
        if (!StringUtil.isNullOrEmpty(search.getStart_date())) {
            query.minCreateTime = new Date(TimeUtil.convertToTimeTemp(search.getStart_date(), "yyyy-MM-dd"));
        }
        if (search.getEndDate() != null) {
            query.maxCreateTime = new Date(TimeUtil.convertToTimeTemp(search.getEndDate(), "yyyy-MM-dd"));
        if (!StringUtil.isNullOrEmpty(search.getEnd_date())) {
            query.maxCreateTime = new Date(TimeUtil.convertToTimeTemp(search.getEnd_date(), "yyyy-MM-dd")+1000*60*60*24L);
        }
        query.sortList = Arrays.asList(new String[]{"_create_time desc"});
        query.start = (long) (page - 1) * limit;
src/main/java/com/taoke/autopay/controller/admin/credit/UserCreditRecordAdminController.java
@@ -16,6 +16,7 @@
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.yeshi.utils.DateUtil;
import javax.annotation.Resource;
import java.io.IOException;
@@ -74,16 +75,16 @@
        if(!StringUtil.isNullOrEmpty(search.getUid())){
            query.uid = Long.parseLong(search.getUid());
        }
        if(search.getDirection()!=null){
            query.direction = search.getDirection();
        if(!org.yeshi.utils.StringUtil.isNullOrEmpty(search.getDirection())){
            query.direction = Integer.parseInt(search.getDirection());
        }
        if(search.getStartDate()!=null){
            query.minCreateTime = new Date(TimeUtil.convertToTimeTemp(search.getStartDate(),"yyyy-MM-dd"));
        if(!StringUtil.isNullOrEmpty(search.getStart_date())){
            query.minCreateTime = new Date(TimeUtil.convertToTimeTemp(search.getStart_date(),"yyyy-MM-dd"));
        }
        if(search.getEndDate()!=null){
            query.maxCreateTime = new Date(TimeUtil.convertToTimeTemp(search.getEndDate(),"yyyy-MM-dd"));
        if(!StringUtil.isNullOrEmpty(search.getEnd_date())){
            query.maxCreateTime = new Date(TimeUtil.convertToTimeTemp(search.getEnd_date(),"yyyy-MM-dd")+1000*60*60*24L);
        }
        query.sortList = Arrays.asList(new String[]{ "_create_time desc"});
        query.start = (long) (page - 1) * limit;
src/main/java/com/taoke/autopay/entity/credit/CreditExchangeRecord.java
@@ -64,6 +64,16 @@
    }
    public enum ExchangeType {
        FUND_EXCHANGE // 资金兑换
        FUND_EXCHANGE("红包兑换"); // 资金兑换
        private String desc;
        private ExchangeType(String desc) {
            this.desc = desc;
        }
        public String getDesc() {
            return desc;
        }
    }
}
src/main/java/com/taoke/autopay/entity/credit/ExchangeRate.java
@@ -16,12 +16,21 @@
public class ExchangeRate {
    public enum ExchangeRateType {
        NEW_USER_EXCHANGE, // 新人兑换
        GENERAL_EXCHANGE   // 一般兑换
        NEW_USER_EXCHANGE("新人兑换"), // 新人兑换
        GENERAL_EXCHANGE("一般兑换");  // 一般兑换
        private String desc;
        private ExchangeRateType(String desc) {
            this.desc = desc;
        }
        public String getDesc() {
            return desc;
        }
    }
    @Tolerate
    public ExchangeRate(){
    public ExchangeRate() {
    }
src/main/java/com/taoke/autopay/service/credit/CreditSettingService.java
@@ -43,4 +43,11 @@
     */
    CreditSetting  getSettingCacheByType(CreditSetting.CreditSettingType type, Date date);
    /**
     * 根据id获取设置
     * @param id
     * @return
     */
    CreditSetting selectByPrimaryKey(Long id);
}
src/main/java/com/taoke/autopay/service/impl/credit/CreditSettingServiceImpl.java
@@ -54,4 +54,9 @@
        }
        return settings.get(0);
    }
    @Override
    public CreditSetting selectByPrimaryKey(Long id) {
        return creditSettingMapper.selectByPrimaryKey(id);
    }
}
src/main/java/com/taoke/autopay/vo/admin/UserCreditExchangeRecordSearchVO.java
@@ -8,7 +8,7 @@
public class UserCreditExchangeRecordSearchVO {
    private String uid; // 用户ID
    private Integer status; // 状态(未审核/已通过/已拒绝)
    private String startDate; // 最小日期
    private String endDate; // 最大日期
    private String status; // 状态(未审核/已通过/已拒绝)
    private String start_date; // 最小日期
    private String end_date; // 最大日期
}
src/main/java/com/taoke/autopay/vo/admin/UserCreditRecordSearchVO.java
@@ -8,7 +8,7 @@
public class UserCreditRecordSearchVO {
    private String uid; // 用户ID
    private Integer direction; // 类型(获得/消耗)
    private String startDate; // 最小日期
    private String endDate; // 最大日期
    private String direction; // 类型(获得/消耗)
    private String start_date; // 最小日期
    private String end_date; // 最大日期
}
src/main/resources/static/admin/credit-exchange-record-list.html
File was renamed from src/main/resources/static/admin/credit/credit-exchange-record-list.html
@@ -28,10 +28,10 @@
                </select>
            </div>
            <div class="layui-inline">
                <input type="text" name="minCreateTime" id="minCreateTime" placeholder="开始日期" autocomplete="off" class="layui-input">
                <input type="text" name="start_date" id="start_date" placeholder="开始日期" autocomplete="off" class="layui-input">
            </div>
            <div class="layui-inline">
                <input type="text" name="maxCreateTime" id="maxCreateTime" placeholder="结束日期" autocomplete="off" class="layui-input">
                <input type="text" name="end_date" id="end_date" placeholder="结束日期" autocomplete="off" class="layui-input">
            </div>
            <div class="layui-inline">
                <button class="layui-btn layui-btn-normal" lay-submit lay-filter="search" id="search"><i
@@ -63,8 +63,8 @@
        var laydate = layui.laydate;
        // 初始化日期选择器
        laydate.render({elem: '#minCreateTime', type: 'date'});
        laydate.render({elem: '#maxCreateTime', type: 'date'});
        laydate.render({elem: '#start_date', type: 'date'});
        laydate.render({elem: '#end_date', type: 'date'});
        let table_option = {
            elem: '#table',
@@ -73,8 +73,8 @@
                return {
                    "code": res.code, // 解析接口状态
                    "msg": res.msg, // 解析提示文本
                    "count": res.count, // 解析数据长度
                    "data": res.data // 解析数据列表
                    "count": res.data.count, // 解析数据长度
                    "data": res.data.list // 解析数据列表
                };
            },
            page: true, // 开启分页
@@ -87,7 +87,16 @@
                    {field: 'consumedCredits', title: '消耗积分', width: 150},
                    {field: 'creditBalance', title: '积分余额', width: 150},
                    {field: 'status', title: '状态', width: 150, templet: function (d) {
                        return d.status === 0 ? '未审核' : (d.status === 1 ? '已通过' : '已拒绝');
                        if(d.exchangeStatus === 0){
                            return '<span style="color: #FF5722;">未审核</span>';
                        }
                       else if(d.exchangeStatus===1){
                            return '<span style="color: #5FB878;">已通过</span>';
                        }
                       else if(d.exchangeStatus===2){
                            return '<span style="color: #FFB800;">已拒绝</span>';
                        }
                        return "未知";
                    }},
                    {field: 'createTime', title: '创建时间', width: 180}
                ]
src/main/resources/static/admin/credit-record-list.html
File was renamed from src/main/resources/static/admin/credit/credit-record-list.html
@@ -27,10 +27,10 @@
                </select>
            </div>
            <div class="layui-inline">
                <input type="text" name="minCreateTime" id="minCreateTime" placeholder="开始日期" autocomplete="off" class="layui-input">
                <input type="text" name="start_date" id="start_date" placeholder="开始日期" autocomplete="off" class="layui-input">
            </div>
            <div class="layui-inline">
                <input type="text" name="maxCreateTime" id="maxCreateTime" placeholder="结束日期" autocomplete="off" class="layui-input">
                <input type="text" name="end_date" id="end_date" placeholder="结束日期" autocomplete="off" class="layui-input">
            </div>
            <div class="layui-inline">
                <button class="layui-btn layui-btn-normal" lay-submit lay-filter="search" id="search"><i
@@ -56,8 +56,8 @@
        var laydate = layui.laydate;
        // 初始化日期选择器
        laydate.render({elem: '#minCreateTime', type: 'date'});
        laydate.render({elem: '#maxCreateTime', type: 'date'});
        laydate.render({elem: '#start_date', type: 'date'});
        laydate.render({elem: '#end_date', type: 'date'});
        let table_option = {
            elem: '#table',
@@ -66,8 +66,8 @@
                return {
                    "code": res.code, // 解析接口状态
                    "msg": res.msg, // 解析提示文本
                    "count": res.count, // 解析数据长度
                    "data": res.data // 解析数据列表
                    "count": res.data.count, // 解析数据长度
                    "data": res.data.list // 解析数据列表
                };
            },
            page: true, // 开启分页
@@ -90,6 +90,8 @@
        // 监听搜索
        form.on('submit(search)', function (data) {
            tableIns.reload({
                where: data.field,
                page: {curr: 1}
src/main/resources/static/admin/credit-setting-edit.html
@@ -11,16 +11,13 @@
<body>
    <form class="layui-form" lay-filter="edit">
        <div class="layui-form-item">
            <label class="layui-form-label">类型</label>
            <div class="layui-input-block">
                <input type="text" name="type" required lay-verify="required" autocomplete="off" class="layui-input">
            </div>
        </div>
        <input type="hidden" name="id" required>
        <div class="layui-form-item">
            <label class="layui-form-label">名称</label>
            <div class="layui-input-block">
                <input type="text" name="name" required lay-verify="required" autocomplete="off" class="layui-input">
                <input type="text" name="name" required readonly="readonly" lay-verify="required" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
@@ -29,26 +26,22 @@
                <input type="text" name="value" required lay-verify="required" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">开始时间</label>
            <div class="layui-input-block">
                <input type="text" name="startTime" required lay-verify="required" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">结束时间</label>
            <div class="layui-input-block">
                <input type="text" name="endTime" required lay-verify="required" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn" lay-submit lay-filter="submit">提交</button>
            </div>
        <div class="layui-input-block" style="display: none">
            <button class="layui-btn layui-btn-normal" lay-submit lay-filter="sure" id="sure">确定</button>
        </div>
    </form>
    <script>
        var listener;
        function submit(callback) {
            //暂存回调方法
            listener = callback;
            //表单提交按钮
            $("#sure").click();
        }
        layui.use(['form', 'laydate'], function () {
            var form = layui.form;
            var laydate = layui.laydate;
@@ -59,24 +52,22 @@
            // 加载数据
            var id = getUrlParam('id');
            $.get('/admin/api/credit/setting/get', { id: id }, function (res) {
                if (res.code === 0) {
                    form.val('edit', res.data);
            $.post("/admin/api/credit/setting/get", {
                "id":id
            }, function(response) {
                if (response.code == 0) {
                    form.val("edit", response.data);
                } else {
                    layer.msg('加载数据失败:' + res.msg);
                    layer.msg(response.msg);
                }
            }, 'json').fail(function(jqXHR, textStatus, errorThrown) {
                layer.msg("网络请求失败");
            });
            // 提交表单
            form.on('submit(submit)', function (data) {
                $.post('/admin/api/credit/setting/update', data.field, function (res) {
                    if (res.code === 0) {
                        layer.msg('修改成功');
                        parent.layer.close(parent.layer.getFrameIndex(window.name));
                    } else {
                        layer.msg('修改失败:' + res.msg);
                    }
                });
            form.on('submit(sure)', function(data) {
                listener(data.field);
                return false;
            });
        });
src/main/resources/static/admin/credit-setting-list.html
@@ -12,15 +12,9 @@
<body>
    <table id="table" lay-filter="table"></table>
    <script type="text/html" id="toolbar">
        <div class="layui-btn-container">
            <button class="layui-btn layui-btn-sm" lay-event="add">添加</button>
        </div>
    </script>
    <script type="text/html" id="bar">
        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
    </script>
    <script>
@@ -35,59 +29,81 @@
                toolbar: '#toolbar',
                cols: [[
                    { field: 'id', title: 'ID', width: 80 },
                    { field: 'type', title: '类型', width: 120 },
                    { field: 'name', title: '名称', width: 150 },
                    { field: 'value', title: '值', width: 150 },
                    { field: 'startTime', title: '开始时间', width: 180 },
                    { field: 'endTime', title: '结束时间', width: 180 },
                    { fixed: 'right', title: '操作', toolbar: '#bar', width: 150 }
                ]],
                page: true
            });
            // 工具栏事件
            table.on('toolbar(table)', function (obj) {
                if (obj.event === 'add') {
                    layer.open({
                        type: 2,
                        title: '添加积分设置',
                        area: ['600px', '400px'],
                        content: 'credit-setting-add.html',
                        btn: ['确定', '取消'],
                        yes: function (index, layero) {
                            var iframeWin = window[layero.find('iframe')[0]['name']];
                            iframeWin.submitForm();
                        }
                    });
                }
            });
            // 行操作事件
            table.on('tool(table)', function (obj) {
                var data = obj.data;
                if (obj.event === 'edit') {
                    layer.open({
                    var layerIndex = layer.open({
                        title: "修改积分设置",
                        type: 2,
                        title: '修改积分设置',
                        area: ['600px', '400px'],
                        shade: 0.3,
                        shadeClose: false, //默认开启遮罩关闭
                        resize: false, //默认重设大小是否
                        //如果不让iframe出现滚动条,
                        //可以content: ['http://sentsin.com', 'no']
                        content: 'credit-setting-edit.html?id=' + data.id,
                        btn: ['确定', '取消'],
                        yes: function (index, layero) {
                            var iframeWin = window[layero.find('iframe')[0]['name']];
                            iframeWin.submitForm();
                        yes: function (index) {
                            //submit方法为弹框内容中的方法
                            window["layui-layer-iframe" + index].submit(function (res) {
                                console.log(res);
                                let fdata = {
                                    id: data.id
                                };
                                for (let key in res) {
                                    if (key.indexOf(".") >= 0) {
                                        let k1 = key.split(".")[0];
                                        let k2 = key.split(".")[1];
                                        if (k1 in fdata) {
                                        } else {
                                            fdata[k1] = {};
                                        }
                                        fdata[k1][k2] = res[key];
                                    } else {
                                        fdata[key] = res[key]
                                    }
                                }
                                for (let key in fdata) {
                                    console.log(typeof (fdata[key]))
                                    if (typeof (fdata[key]) == 'object') {
                                        fdata[key] = JSON.stringify(fdata[key]);
                                    }
                                }
                                console.log(fdata);
                                try {
                                    var index = layer.load(1);
                                    $.post('/admin/api/credit/setting/update', fdata, function (res) {
                                        layer.close(index);
                                        if (res.code === 0) {
                                            layer.close(layerIndex);
                                            layer.msg('修改成功');
                                        } else {
                                            layer.msg('修改失败:' + res.msg);
                                        }
                                    },'json').fail(function(jqXHR, textStatus, errorThrown) {
                                        layer.msg("网络请求失败");
                                        layer.close(index);
                                    });
                                } catch (e) {
                                    console.log(e);
                                }
                            });
                        },
                        cancel: function () {
                        }
                    });
                } else if (obj.event === 'delete') {
                    layer.confirm('确定删除该积分设置吗?', function (index) {
                        $.post('/admin/api/credit/setting/delete', { id: data.id }, function (res) {
                            if (res.code === 0) {
                                layer.msg('删除成功');
                                table.reload('table');
                            } else {
                                layer.msg('删除失败:' + res.msg);
                            }
                        });
                    });
                }
            });
        });
src/main/resources/static/admin/credit/exchange-rate-list.html
File was deleted
src/main/resources/static/admin/exchange-rate-list.html
New file
@@ -0,0 +1,160 @@
<!DOCTYPE html>
<html>
<head>
    <meta 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,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
    <title>积分汇率设置</title>
    <link rel="stylesheet" type="text/css" href="layui/css/layui.css"/>
    <link rel="stylesheet" type="text/css" href="css/admin.css"/>
</head>
<body>
<div class="page-content-wrap">
    <form class="layui-form" action="" lay-filter='search'>
        <div class="layui-form-item">
            <div class="layui-inline">
                <input type="text" name="key" id="key" placeholder="按汇率类型搜索" autocomplete="off"
                       class="layui-input">
            </div>
            <div class="layui-inline">
                <button class="layui-btn layui-btn-normal" lay-submit lay-filter="search" id="search"><i
                        class="layui-icon layui-icon-search"></i>搜索
                </button>
            </div>
        </div>
    </form>
    <div class="layui-form" id="table-list">
        <table id="table" lay-filter="table"></table>
    </div>
</div>
<script src="layui/layui.js" type="text/javascript" charset="utf-8"></script>
<script src="js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/http_api.js"></script>
<script type="text/html" id="bar">
    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
</script>
<script>
    layui.use(['form', 'jquery', 'layer', 'table', 'laydate'], function () {
        var table = layui.table;
        var form = layui.form;
        var $ = layui.jquery;
        let table_option = {
            elem: '#table',
            url: '/admin/api/credit/exchangeRate/list', // 数据接口
            parseData: function (res) {
                return {
                    "code": res.code, // 解析接口状态
                    "msg": res.msg, // 解析提示文本
                    "count": res.data.count, // 解析数据长度
                    "data": res.data.list // 解析数据列表
                };
            },
            page: true, // 开启分页
            cols: [
                [
                    {field: 'id', title: 'ID', width: 100, fixed: 'left'},
                    {field: 'exchangeType', title: '兑换类型', width: 150},
                    {field: 'rate', title: '汇率', width: 150},
                    { fixed: 'right', title: '操作', toolbar: '#bar', width: 150 }
                ]
            ]
        };
        // 初始化表格
        let tableIns = table.render(table_option);
        // 监听搜索
        form.on('submit(search)', function (data) {
            tableIns.reload({
                where: data.field,
                page: {curr: 1}
            });
            return false;
        });
        // 编辑积分汇率
        // 行操作事件
        table.on('tool(table)', function (obj) {
            var data = obj.data;
            if (obj.event === 'edit') {
                var layerIndex = layer.open({
                    title: "修改积分汇率",
                    type: 2,
                    area: ['600px', '400px'],
                    shade: 0.3,
                    shadeClose: false, //默认开启遮罩关闭
                    resize: false, //默认重设大小是否
                    //如果不让iframe出现滚动条,
                    //可以content: ['http://sentsin.com', 'no']
                    content: 'exchange-rate-update.html?id=' + data.id,
                    btn: ['确定', '取消'],
                    yes: function (index) {
                        //submit方法为弹框内容中的方法
                        window["layui-layer-iframe" + index].submit(function (res) {
                            console.log(res);
                            let fdata = {
                                id: data.id
                            };
                            for (let key in res) {
                                if (key.indexOf(".") >= 0) {
                                    let k1 = key.split(".")[0];
                                    let k2 = key.split(".")[1];
                                    if (k1 in fdata) {
                                    } else {
                                        fdata[k1] = {};
                                    }
                                    fdata[k1][k2] = res[key];
                                } else {
                                    fdata[key] = res[key]
                                }
                            }
                            for (let key in fdata) {
                                console.log(typeof (fdata[key]))
                                if (typeof (fdata[key]) == 'object') {
                                    fdata[key] = JSON.stringify(fdata[key]);
                                }
                            }
                            console.log(fdata);
                            delete  fdata["exchangeType"]
                            try {
                                var index = layer.load(1);
                                $.post('/admin/api/credit/exchangeRate/update', fdata, function (res) {
                                    layer.close(index);
                                    if (res.code === 0) {
                                        layer.close(layerIndex);
                                        layer.msg('修改成功');
                                        tableIns.reload({
                                            where: data.field,
                                            page: {curr: 1}
                                        });
                                    } else {
                                        layer.msg('修改失败:' + res.msg);
                                    }
                                },'json').fail(function(jqXHR, textStatus, errorThrown) {
                                    layer.msg("网络请求失败");
                                    layer.close(index);
                                });
                            } catch (e) {
                                console.log(e);
                            }
                        });
                    },
                    cancel: function () {
                    }
                });
            }
        });
    });
</script>
</body>
</html>
src/main/resources/static/admin/exchange-rate-update.html
File was renamed from src/main/resources/static/admin/credit/exchange-rate-update.html
@@ -15,9 +15,9 @@
    <div class="layui-form-item">
        <label class="layui-form-label">兑换类型:</label>
        <div class="layui-input-inline">
            <select name="exchangeType" required lay-verify="required">
                <option value="NEW_USER_EXCHANGE">新人兑换</option>
                <option value="GENERAL_EXCHANGE">一般兑换</option>
            <select name="exchangeType" required lay-verify="required" readonly="readonly">
                <option value="新人兑换">新人兑换</option>
                <option value="一般兑换">一般兑换</option>
            </select>
        </div>
    </div>
@@ -30,25 +30,10 @@
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">开始时间:</label>
        <div class="layui-input-inline">
            <input type="text" name="startTime" required lay-verify="required" placeholder="请选择开始时间" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">结束时间:</label>
        <div class="layui-input-inline">
            <input type="text" name="endTime" required lay-verify="required" placeholder="请选择结束时间" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
    <div class="layui-form-item" style="display: none">
        <div class="layui-input-block">
            <button class="layui-btn layui-btn-normal" lay-submit lay-filter="sure">确定</button>
            <button class="layui-btn layui-btn-normal" lay-submit lay-filter="sure" id="sure">确定</button>
        </div>
    </div>
</form>
@@ -57,13 +42,22 @@
<script src="js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/http_api.js"></script>
<script>
    var listener;
    function submit(callback) {
        //暂存回调方法
        listener = callback;
        //表单提交按钮
        $("#sure").click();
    }
    layui.use(['form', 'laydate'], function () {
        var form = layui.form;
        var laydate = layui.laydate;
        // 初始化日期选择器
        laydate.render({elem: 'input[name=startTime]', type: 'datetime'});
        laydate.render({elem: 'input[name=endTime]', type: 'datetime'});
        // laydate.render({elem: 'input[name=startTime]', type: 'datetime'});
        // laydate.render({elem: 'input[name=endTime]', type: 'datetime'});
        // 获取当前ID并填充表单
        let id = http_util.getQueryString("id");
@@ -80,10 +74,8 @@
        }
        // 提交表单
        form.on('submit(sure)', function (data) {
            parent.layer.getFrameIndex(window.name); // 先得到当前iframe层的索引
            parent.layer.closeAll(); // 再执行关闭
            parent.location.reload(); // 刷新父页面
        form.on('submit(sure)', function(data) {
            listener(data.field);
            return false;
        });
    });
src/main/resources/static/admin/index.html
@@ -45,6 +45,17 @@
                      <dd><a href="javascript:;" data-url="order-list.html" data-id='30' data-text="订单列表"><span class="l-line"></span>订单列表</a></dd>
                    </dl>
                  </li>
                    <li class="layui-nav-item">
                        <a href="javascript:;"><i class="iconfont">&#xe608;</i>积分系统</a>
                        <dl class="layui-nav-child">
                            <dd><a href="javascript:;" data-url="credit-exchange-record-list.html" data-id='73' data-text="兑换记录"><span class="l-line"></span>兑换记录</a></dd>
                            <dd><a href="javascript:;" data-url="credit-setting-list.html" data-id='70' data-text="积分设置"><span class="l-line"></span>积分设置</a></dd>
                            <dd><a href="javascript:;" data-url="exchange-rate-list.html" data-id='71' data-text="积分汇率"><span class="l-line"></span>积分汇率</a></dd>
                            <dd><a href="javascript:;" data-url="credit-record-list.html" data-id='72' data-text="积分记录"><span class="l-line"></span>积分记录</a></dd>
                        </dl>
                    </li>
                  <li class="layui-nav-item">
                    <a href="javascript:;"><i class="iconfont">&#xe60b;</i>系统设置</a>
                    <dl class="layui-nav-child">