JEECG 页面多个用户选择器只显示最后一个

本文介绍了一种解决页面上多个用户选择器共存时,只能在最后一个输入框中显示数据的问题的方法。通过对标签生成代码的修改,实现了每个用户选择器独立工作的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个页面当中,我们可能会需要有多个的用户选择器进行快速的录入,此时会发现所有的输入都会在最后一个用户选择器的地方显示 
这里写图片描述 
查看页面代码当中的ID也是不一致: 
这里写图片描述

查看通过标签生成之后的源码,可以发现所有的用户选择器都会生成一个

<input readonly="readonly" type="text" id="userName_1" name="userName_1" style="width: 150px" onclick="openUserSelect()"  />
<input id="userId_1" name="userId_1" type="hidden" />
function openUserSelect() {
    $.dialog({
        content: 'url:userController.do?userSelect',
        zIndex: getzIndex(),
        title: '用户名称',
        lock: true,
        width: '400px',
        height: '350px',
        opacity: 0.4,
        button: [{
                name: '确定',
                callback: callbackUserSelect,
                focus: true
            }, {
                name: '取消',
                callback: function () {}
            }]
    });
}
function callbackUserSelect() {
    var iframe = this.iframe.contentWindow;
    var rowsData = iframe.$('#userList1').datagrid('getSelections');
    if (!rowsData || rowsData.length == 0) {
        tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
        return;
    }
    var ids = '',
        names = '';
    for (i = 0; i < rowsData.length; i++) {
        var node = rowsData[i];
        ids += node.id + ',';
        names += node.realName + ',';
    }
    $('#userName_1').val(names);
    $('#userName_1').blur();
    $('#userId_1').val(ids);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

点击输入框调用的js方法都是一样的,看到这里也就可以明白为什么都是只有最后一个用户选择输入框当中有数据了。

因此我们对后台当中标签代码生成部分进行改造,让其支持多个用户选择器: 
修订类:src/main/java/org/jeecgframework/tag/core/easyui/UserSelectTag.java 
当中的end方法:

public StringBuffer end() {

        ……
        sb.append("<input readonly=\""+readonly+"\" type=\"text\" id=\"" + selectedNamesInputId + "\" name=\"" + selectedNamesInputId + "\" style=\"width: "+inputWidth+"\" onclick=\"open"+StringUtil.firstUpperCase(selectedNamesInputId)+"UserSelect()\" ");
        if(StringUtils.isNotBlank(userNamesDefalutVal)){
            sb.append(" value=\""+userNamesDefalutVal+"\"");
        }
        sb.append(" />");

        if(oConvertUtils.isNotEmpty(selectedIdsInputId)){
            sb.append("<input id=\"" + selectedIdsInputId + "\" name=\"" + selectedIdsInputId + "\" type=\"hidden\" ");
            if(StringUtils.isNotBlank(userIdsDefalutVal)){
                sb.append(" value=\""+userIdsDefalutVal+"\"");
            }
            sb.append("/>");
        }

        ……

        sb.append("function open"+StringUtil.firstUpperCase(selectedNamesInputId)+"UserSelect() {");
        sb.append("    $.dialog({content: 'url:userController.do?userSelect', zIndex: getzIndex(), title: '" + title + "', lock: true, width: '" + windowWidth + "', height: '" + windowHeight + "', opacity: 0.4, button: [");
        sb.append("       {name: '" + commonConfirm + "', callback: callback"+StringUtil.firstUpperCase(selectedNamesInputId)+"UserSelect, focus: true},");
        sb.append("       {name: '" + commonCancel + "', callback: function (){}}");
        sb.append("   ]});");
        sb.append("}");

        sb.append("function callback"+StringUtil.firstUpperCase(selectedNamesInputId)+"UserSelect() {");
        sb.append("var iframe = this.iframe.contentWindow;");
        sb.append("var rowsData = iframe.$('#userList1').datagrid('getSelections');");

        ……

        sb.append("}");
        sb.append("</script>");
        return sb;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

主要修订当中的js方法名称

<think>好的,用户问的是关于JeecgBoot的数据权限配置,特别是部门多级情况下只能看到自己部门数据的问题。我需要先回忆JeecgBoot的数据权限机制。记得JeecgBoot是基于MyBatis-Plus和Spring Boot的,数据权限通常通过注解或SQL拦截器实现。 用户提到部门有多个层级,可能需要考虑部门树结构,比如使用父部门ID来构建层级。数据权限配置可能涉及用户角色和部门ID的关联。常见的做法是在查询时自动添加WHERE条件,限制只能访问自己部门及其子部门的数据。 需要确认JeecgBoot中的具体实现方式,比如@PermissionData注解的使用,或者后台如何配置角色权限规则。可能需要指导用户如何在角色管理中设置数据规则,选择“本部门及以下”这样的选项,并且确保部门实体中有对应的字段,比如sys_org_code的层级结构。 另外,用户可能遇到的问题是即使配置了部门权限,但查询结果不符合预期。这时候可能需要检查部门编码的结构是否正确,比如是否是树形结构,用逗号分隔,或者是否有正确的父部门ID。同时,需要确保用户所在的部门正确,以及权限配置是否应用到了对应的菜单或按钮上。 可能还需要提到自定义SQL片段的情况,如果用户有复杂的查询,可能需要手动添加数据权限的条件,使用${ew.customSqlSegment}来集成MyBatis-Plus的Wrapper条件。 最后,总结步骤:配置角色数据权限规则,选择部门范围,检查部门结构,确认用户部门,应用权限到菜单,以及处理自定义SQL的情况。如果有问题,建议用户检查日志中的SQL语句,确认条件是否正确添加。</think>JeecgBoot 的数据权限配置支持基于部门层级的精细化控制,尤其适用于多级部门结构的场景。以下是实现 **“用户只能看到本部门及下属部门数据”** 的配置方法: --- ### **1. 核心配置步骤** #### **1.1 部门结构要求** - 确保部门表(如 `sys_depart`)中存在层级编码字段(如 `sys_org_code`),格式类似 `父部门编码,当前部门编码`(例如:`A01,A01B02`)。 - 层级编码需维护父子关系,JeecgBoot 默认通过 `sys_org_code` 实现树形结构。 #### **1.2 角色数据权限配置** 1. **进入角色管理** 路径:`系统管理 -> 角色管理 -> 编辑角色 -> 数据权限`。 2. **设置数据规则** - **规则类型**:选择 `本部门及以下部门数据` 或 `自定义部门`。 - **部门范围**:若选择“自定义部门”,可手动勾选允许访问的部门树节点。 - **绑定菜单**:将该数据权限规则关联到具体菜单(如某个查询页面)。 #### **1.3 实体类注解配置** 在需要数据隔离的实体类字段上添加 `@Dict` 和权限注解,标识部门字段: ```java // 示例:实体类中标识部门编码字段 @TableName("your_table") public class YourEntity { @Excel(name = "所属部门", width = 15, dictTable = "sys_depart", dicCode = "id", dicText = "depart_name") @Dict(dictTable = "sys_depart", dicCode = "id", dicText = "depart_name") private String sysOrgCode; // 关联部门编码字段 } ``` #### **1.4 前端页面配置** 在 Vue 列表页面的 `created` 钩子中,添加权限标签 `{ key: 'sysOrgCode', rule: 'sysOrgCode' }`,与后端规则匹配: ```javascript // 示例:Vue 页面声明数据权限字段 created() { this.dataPermissions.push({ key: 'sysOrgCode', rule: 'sysOrgCode' }); } ``` --- ### **2. 实现原理** JeecgBoot 通过 **MyBatis 拦截器**动态修改 SQL: - 自动追加 `WHERE` 条件,限制 `sys_org_code` 的访问范围。 - 根据用户所属部门的 `sys_org_code`,匹配其自身及子部门数据(如 `sys_org_code LIKE '当前部门编码%'`)。 --- ### **3. 常见问题排查** - **数据未隔离** 检查角色数据权限是否绑定到正确菜单,部门编码层级是否正确。 - **SQL 条件未生效** 查看执行 SQL 日志,确认 `sys_org_code` 条件是否自动注入。 - **自定义 SQL 处理** 若使用手写 SQL,需手动拼接 `${ew.customSqlSegment}` 继承数据权限条件: ```xml <select id="yourQuery"> SELECT * FROM your_table WHERE 1=1 <if test="ew.customSqlSegment != null"> ${ew.customSqlSegment} </if> </select> ``` --- ### **4. 扩展场景** - **跨部门数据共享**:通过“自定义部门”规则,手动指定多个部门节点。 - **字段级权限**:结合 `@PermissionData` 注解实现更细粒度的控制。 通过以上配置,JeecgBoot 可灵活实现多级部门的数据隔离,确保用户仅访问权限范围内的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值