表格内编辑插件 · X-editable 使用实例教程

先上效果:

image.png
image.png

添加 js,css 依赖

<link href="plugins/x-editable-develop/dist/bootstrap-editable/css/bootstrap-editable.css" rel="stylesheet" />
<link href="plugins/x-editable-develop/src/inputs/select2/lib/select2-bootstrap.css" rel="stylesheet" />

<script src="plugins/x-editable-develop/dist/bootstrap3-editable/js/bootstrap-editable.min.js"></script>

JS代码:

function doAjax(data) {
    $.get({
        url: 'updateAppBaseValue',
        data: data,
        success: (result) => {
            debugger;
            if (result.success == true) {
                new PNotify({
                    title: '设置基线值',
                    styling: 'bootstrap3',
                    text: '更新成功!',
                    type: 'success',
                    delay: 3000
                });
            } else {
                new PNotify({
                    title: '设置基线值',
                    styling: 'bootstrap3',
                    text: '服务器出错,请联系管理员!',
                    type: 'error',
                    delay: 3000
                });
            }
        },
        error: (a, b, c) => {
            debugger;
        }
    })
}

var appList = {

    getAppendTextUp: (x, y) => {
        var color = x >= y ? 'green' : 'red';
        var text = Math.round((x - y) * 1.0, 2);

        var flgHtml = "";
        return x + '<div style="display:flex;justify-content: center;">' +
            '<span style="width:25px;text-align:center;vertical-align:middle;color:' + color + '">(' + text + ')</span></div>';
    },


    getAppendTextUpWithPercentage: (x, y) => {
        var color = x >= y ? 'green' : 'red';
        var text = Math.round((x - y) * 100.0, 2);

        var flgHtml = "";
        return Math.round(x * 100.0, 2) + '<div style="display:flex;justify-content: center;">' +
            '<span style="width:25px;text-align:center;vertical-align:middle;color:' + color + '">(' + text + ')</span></div>';
    },


    getAppendTextDown: (x, y) => {
        var color = x <= y ? 'green' : 'red';
        var text = Math.round((x - y) * 1.0, 2);

        var flgHtml = "";
        return Math.round(x * 1.0, 2) + '<div style="display:flex;justify-content: center;">' +
            '<span style="width:25px;text-align:center;vertical-align:middle;color:' + color + '">(' + text + ')</span></div>';
    },

    getAppendTextDownWithPercentage: (x, y) => {
        var color = x <= y ? 'green' : 'red';
        var text = Math.round(1.0 * (x - y), 2);

        var flgHtml = "";
        return Math.round(x * 100.0, 2) + '<div style="display:flex;justify-content: center;">' +
            '<span style="width:25px;text-align:center;vertical-align:middle;color:' + color + '">(' + text + ')</span></div>';
    },

    events: () => {
        $("#searchBtn").unbind().bind("click", () => {
            $('#appTable').bootstrapTable('refresh');
        });
        $("#clsBtn").unbind().bind("click", () => {
            $("#deptNo").select2().val("");
            $("#aoneProductId").select2().val("");
        });

        $("[name=aoneProductId]").html(appList.productHtml).select2({allowClear: true});
        $("[name=deptNo]").html(appList.departmentHtml).select2({allowClear: true});



    },
    initData: () => {
        $.ajax({
            url: "integratedFindAll",
            data: {},
            dataType: "json",
            type: "POST",
            async: false,
            success: function (data) {
                var products = data.products;
                var departmentList = data.departmentList;

                var productHtml = "";
                var departmentHtml = "";

                $(products).each(function (key, value) {
                    productHtml += '<option value="' + value.aoneProductId + '">' + value.aoneProductName + '</option>'
                });

                $(departmentList).each(function (key, value) {
                    departmentHtml += '<option value="' + value.deptNo + '">' + value.deptName + '</option>'
                });

                appList.productHtml = '<option></option>' + productHtml;
                appList.departmentHtml = '<option></option>' + departmentHtml;
            }
        })
    },
    initBootstrapTable: () => {
        $('#appTable').bootstrapTable({
            detailView: false,//父子表
            url: 'findQualityDataOfAppDtoByDeptNoAndAoneProductId',
            sidePagination: "server",
            queryParamsType: 'pageSize,pageNum',
            contentType: "application/x-www-form-urlencoded",
            method: 'GET',
            striped: true,      //是否显示行间隔色
            cache: false,      //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
            pagination: true,     //是否显示分页(*)
            paginationLoop: false,
            sortable: true,      //是否启用排序
            sortOrder: "desc",    //排序方式
            sortName: "lineCount",
            pageNumber: 1,      //初始化加载第一页,默认第一页
            pageSize: 10,      //每页的记录行数(*)
            pageList: [5, 10, 20, 50, 100],// 可选的每页数据
            silent: true,
            totalField: 'total',
            dataField: 'list', //后端 json 对应的表格数据 key
            columns: [
                {
                    title: '产品线',
                    field: 'aoneProductName',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        return value;
                    }
                },
                {
                    title: '应用',
                    field: 'appName',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        return value;
                    }
                }, {
                    title: '偏离度',
                    field: 'deviation',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        var deviation = value;
                        var html = Math.round(value * 100, 2) + "%";
                        var level = '优';
                        var background = '#10b510ba';

                        if (deviation < 0.2) {
                            level = '优';
                            background = '#10b510ba';
                        } else if (deviation >= 0.2 && deviation < 0.4) {
                            level = '良';
                            background = '#6e6eff';
                        } else if (deviation >= 0.4 && deviation < 0.6) {
                            level = '差';
                            background = '#f39c12';
                        } else {
                            level = '很差';
                            background = '#ff000099';
                        }

                        var baseValue = row.appScoreBaseValue;
                        html += '<div style="display:flex;justify-content: center;">' +
                            '<div style="border:1px solid #e8e8e8;padding-left:5px;padding-right:5px;">' +
                            '<a href="#" name="noteEditable" id="' + row.appId + '" data-type="text">' + baseValue + '</a>' +
                            '基线值</div>' +
                            '<span style="background:' + background + ';width:2rem;text-align:center;vertical-align:middle;color:white;border-radius: 1rem;">' + level + '</span></div>';
                        return html;
                    }
                }, {
                    field: 'appScore',
                    title: '应用代码评分',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        var html = value;
                        var rate = 0.0;
                        var appScoreRelative = row.appScoreRelative
                        if (value != 0) {
                            rate = Math.round((value - appScoreRelative) / value * 100, 2);
                        }
                        if (rate >= 0) {
                            html += '<div style="display:flex;justify-content: center;">环比<span style="width:25px;text-align:center;vertical-align:middle;color:green">' + rate + '%<i class="fa fa-long-arrow-up"></i></span></div>';
                        } else {
                            html += '<div style="display:flex;justify-content: center;">环比<span style="width:25px;text-align:center;vertical-align:middle;color:red">' + rate + '%<i class="fa fa-long-arrow-down"></i></span></div>';
                        }
                        return html
                    }
                }, {
                    field: 'lineCount',
                    title: '代码行数',
                    align: 'center',
                    valign: 'middle'
                }, {
                    field: 'complexity',
                    title: '复杂度',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        return appList.getAppendTextDown(value, row.complexityRelative);
                    }
                }, {
                    field: 'duplication',
                    title: '重复率%',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        return appList.getAppendTextDown(value, row.duplicationRelative);
                    }
                }, {
                    field: 'commentRate',
                    title: '注释率%',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        var html = appList.getAppendTextUp(value, row.commentRateRelative);
                        return html
                    }
                }, {
                    field: 'uiRate',
                    title: 'UI通过率%',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        var html = appList.getAppendTextUpWithPercentage(value, row.uiRateRelative);
                        return html
                    }

                }, {
                    field: 'itRate',
                    title: 'API通过率%',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        var html = appList.getAppendTextUpWithPercentage(value, row.itRateRelative);
                        return html
                    }
                }, {
                    field: 'utRate',
                    title: 'UT通过率%',
                    align: 'center',
                    valign: 'middle',
                    formatter: (value, row, index) => {
                        var html = appList.getAppendTextUpWithPercentage(value, row.utRateRelative);
                        return html
                    }
                }, {
                    field: 'staticCodeCheckValue4',
                    title: '静态扫描',
                    align: 'center',
                    valign: 'middle'
                }, {
                    field: 'staticCodeCheckValue2',
                    title: '集团规约',
                    align: 'center',
                    valign: 'middle'
                }, {
                    field: 'staticCodeCheckValue3',
                    title: 'CR 规则',
                    align: 'center',
                    valign: 'middle'
                }

            ],
            queryParams: function (params) {
                return {
                    pageSize: params.pageSize,
                    pageNum: params.pageNumber,
                    sortName: params.sortName,
                    sortOrder: params.sortOrder,
                    searchText: params.searchText,
                    deptNo: $("#deptNo").val(),
                    aoneProductId: $("#aoneProductId").val()
                }
            },
            //注册加载子表的事件。注意下这里的三个参数!
            onExpandRow: function (index, row, $detail) {

            },
            // 当表格加载完毕才可以绑定的事件
            onPostBody: (rows) => {
                let rowsList = rows;
                $('[name=noteEditable]').each(function (index, item) {

                    $(this).editable({
                        title: '请输入基线值',
                        placeholder: '必填,请输入基线值...',
                    });

                    $(this).on('hidden', function (e, reason) {
                        if (reason === 'save') {
                            debugger;
                            //doAjax
                            let ajaxData = {
                                appId: $(e.currentTarget).attr("id"),
                                baseValue: e.currentTarget.text
                            };

                            doAjax(ajaxData)
                        }
                    });
                });
            }

        })
    },

    init: () => {
        appList.initData();
        appList.events();
        appList.initBootstrapTable();
    }
}

$(() => {
    appList.init();
})

后端 Ajax HTTP 接口的代码

package com.alibaba.swork.info.web.controller.qualitydata;

import com.alibaba.swork.info.common.mapper.QualityDataAppBaseValueMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.math.BigDecimal;

@Controller
public class QualityDataAppBaseValueController {
    @Autowired
    QualityDataAppBaseValueMapper qualityDataAppBaseValueMapper;

    @RequestMapping(value = "updateAppBaseValue", method = RequestMethod.GET)
    @ResponseBody
    public Result<String> updateAppBaseValue(@RequestParam("appId") Long appId,
                                             @RequestParam("baseValue") String baseValue){
        Result<String> result = new Result<>();
        BigDecimal baseV = BigDecimal.valueOf(Double.valueOf(baseValue));

        try {
            qualityDataAppBaseValueMapper.updateBaseValueByAppId(appId, baseV);
            result.setSuccess(true);
            result.setResult("更新成功");
        } catch (Exception e){
            result.setSuccess(true);
            result.setResult("更新失败" + e.getMessage());
        }
        return result;
    }

}

class Result<T>{
    T result;
    Boolean success = false;

    public T getResult() {
        return result;
    }

    public void setResult(T result) {
        this.result = result;
    }

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }
}

文档参考:

X-editable

http://vitalets.github.io/x-editable/docs.html#date

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容