EP框架之数据字典前后端联动机制

  |   0 评论   |   0 浏览

一、序

  数据字典是web开发中非常常用的一项功能,用来定义某个数据的分类,EP自带数据字典功能,封装了对应的js方法和java接口,可以在前端、后代码中直接使用,下面就EP的数据字典做一个简要说明。

二、系统功能

  EP框架启动后,自带数据字典功能,如下图所示:

1608005557045866496.png

  正常情况下,在数据字典中配置业务所需的字典,建议先配置上级编码为0的编码说明,这样大家才知道这个数据字典到底是用来干嘛的,如上图所示studentStatus,编码说明为“学生状态”。然后再配置studentStatus具体的编码值。

三、前端组件绑定数据字典

  前端会常用到数据字典的组件,大概有以下几类:表格(渲染某一列)、下拉框(单选、多选)、单选组、复选组,下面就前端组件与后端数据字典联动的代码说明一下。

前端代码引入必须的base.js

<script src="../../../eui/js/base.js"></script>
  • 表格table
    表格的渲染列,使用layui自带的templet进行渲染即可,配合封装好的方法。

    tableIns = table.render({
            elem: '#listTable'
            , url: appendCtx("/demo/table/students")
            , even: true
            , cols: [[
                {field: 'id', title: 'ID', align: 'center',width: 80},
                {field: 'studentName', title: '姓名', align: 'center',width: 100},
                {field: 'studentNo', title: '学号', align: 'center',width: 100},
                {field: 'birthday', title: '生日', align: 'center',width: 140},
                {field: 'status', title: '状态', align: 'center',width: 100,templet:
                	function(d)
                	{
                		return translate("studentStatus",d.status);  //translate方法为base.js中封装的数据字典转换方法
                	}
                },
                {title: '操作', align: 'center',width: 200,fixed:"right",toolbar: '#operBar'}
            ]]
        	, page: true
            , request: {
                pageName: 'pageNo' //页码的参数名称,默认:page
                , limitName: 'pageSize' //每页数据量的参数名,默认:limit
            }
            , parseData: function (res) { //res 即为原始返回的数据
                return {
                    "code": res.code, //解析接口状态
                    "msg": res.msg, //解析提示文本
                    "count": res.data.total, //解析数据长度
                    "data": res.data.list //解析数据列表
                    ,"attr":res.attr
                };
            }
        });
    
  • 下拉框-单选

    下拉框渲染主要有2种模式,第1种是进查询页面上的查询条件,第2种是编辑弹窗中的下拉菜单。这2种都需要下拉框渲染完毕后,再form.render()。其中编辑弹窗会涉及到数据回填,需要先渲染下拉框,然后再执行form.val进行数据回填操作。

    html代码:

    <div class="layui-inline">
        <label class="layui-form-label" >状态:</label>
        <div class="layui-input-inline" >
            <select id="status" name="status" lay-filter="status"></select>
        </div>
    </div>
    

    下面是js代码

        dict2Select("studentStatus","status");//将数据字典中的sdudentStatus,映射到id=status的元素中
        form.render();//渲染form表单
    
  • 下拉框-多选

    多选下拉框要用到其他组件,xm-select

html代码如下:

<div class="layui-inline">
     <label class="layui-form-label">业态:</label>
     <div class="layui-input-inline">
          <select type="text" id="busState" name="busState" xm-select="busState" multiple lay-verify="required" class="layui-input"></select>
      </div>
</div>

js代码如下:

dict2MSelect('busState', 'busState')

多选下拉框中,如果是在编辑弹窗中渲染,则可能涉及到数据回填,这时候需要多填一个参数selectedValues(用英文逗号隔开的字典值)

dict2MSelect('busState', 'busState',selectedValues)
  • 单选组(多选组)
    单选组要先拿到字典的map对象,再调用对应的js方法即可

    html代码

    <div class="layui-inline">
    	<label class="layui-form-label">状态:</label>
    	<div id="channels" class="layui-input-inline" ></div>
    </div>
    

    js代码

     	var map=dictionary("studentStatus");  //拿到map对象
    	arraysToRadios("channels",map,"studentStatus"); //如果是多选,则把arraysToRadios方法换成arraysToCheckbox即可
            form.render();
    

四、DictionaryService数据字典接口的使用

后端代码有时候也会是用数据字典,例如excel导出的时候,目前主要有2种方式去查字典,第1种就是直接在sql里面关联数据字典表去查,这样会多关联表,浪费数据库的资源,不推荐直接关联字典表查询。第2种就是查出来过后,在服务器端进行翻译,EP框架提供了DictionaryService,注入后可以很方便的查询数据字典。下面以常用的excel导出为例:


    @Autowired
    private EpDictQueryService dictService ;

    @GetMapping("/xls")
    public void exportInvestConvertList(InvestConvertListDto cond,HttpServletResponse response)
    {
        try
        {
            String fileName = "资产转让订单" ;
            String[] keys = new String[]{"loanId","loanNo","loanStatus","canDk","custName","coCustomer","overdueDays","projName","loanType","customer","loanMoney","blance","oriCoopCode","bcName"};
            String[] columnNames = new String[]{"贷款编号","合同号","贷款状态","启用代扣","客户姓名","共借人","逾期天数","项目名称","贷款产品","客户经理","放款金额","在贷余额","原资方","担保公司"};
            List<InvestConvertListVo> dataList =  investConvertSevice.getInvestConvertList(cond);
            Map<String, String> coopCode = dictService.getDictByParentCode("coopCode");
            dataList.forEach(e -> {
                        e.setOriCoopCode(coopCode.getOrDefault(e.getOriCoopCode(), "未知"));
                    });
            ExcelUtil.downloadExcel(response,dataList,fileName,columnNames,keys);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

以上就是EP框架封装的数据字典逻辑,经过大量实践,已经运行很稳定,各种场景都有遇到过,基本都没问题。


标题:EP框架之数据字典前后端联动机制
作者:michael
地址:https://blog.junxworks.cn/articles/2021/04/04/1617523786993.html