0

我正在使用日食侦察员!现在我要列出所有用户!很好,但我的数据库结构是这样的:

+----+--------+-----------+---------------+-----------+--------+----------+
| ID |  Name  |  Surname  | Administrator | Moderator | Editor | Operator |
+----+--------+-----------+---------------+-----------+--------+----------+
|  1 | myname | mysurname |             1 |         1 |      0 |        0 |
+----+--------+-----------+---------------+-----------+--------+----------+

所以,当我填充表格时,我需要显示单个用户的所有角色!例如:如果用户“test”具有管理员、版主的角色,表格行必须是这样的:

╔════╦═════════════╦══════════╦══════════════════════════╗
║ ID ║ Usernameame ║ Password ║          Roles           ║
╠════╬═════════════╬══════════╬══════════════════════════╣
║  1 ║ test        ║ test     ║ administrator, moderator ║
╚════╩═════════════╩══════════╩══════════════════════════╝

做这个的最好方式是什么?

4

1 回答 1

0

你有不同的可能性这样做。一种可能性是在客户端进行;这是我将在这里描述的解决方案:

创建一个包含这些行的表:

  • ID:长列
  • 名称:字符串列
  • 姓氏:字符串列
  • 管理员:布尔列(不可显示)
  • 主持人:布尔列(不可显示)
  • 编辑器:布尔列(不可显示)
  • 运算符:布尔列(不可显示)
  • 作用:字符串列,从表数据中忽略(在formData或TablePageData中)

在此示例中,表位于 TableField 中,但它对 TablePage 的工作方式完全相同。

@Order(10.0)
@FormData(sdkCommand = FormData.SdkCommand.USE, value = AbstractTableFieldBeanData.class, defaultSubtypeSdkCommand = FormData.DefaultSubtypeSdkCommand.CREATE)
public class PersonsTableField extends AbstractTableField<PersonsTableField.Table> {

  @Override
  protected int getConfiguredGridH() {
    return 5;
  }

  @Override
  protected int getConfiguredGridW() {
    return 2;
  }

  @Override
  protected String getConfiguredLabel() {
    return TEXTS.get("Persons");
  }

  @Order(10.0)
  public class Table extends AbstractExtensibleTable {

    public NameColumn getNameColumn() {
      return getColumnSet().getColumnByClass(NameColumn.class);
    }

    public SurnameColumn getSurnameColumn() {
      return getColumnSet().getColumnByClass(SurnameColumn.class);
    }

    public ModeratorColumn getModeratorColumn() {
      return getColumnSet().getColumnByClass(ModeratorColumn.class);
    }

    public EditorColumn getEditorColumn() {
      return getColumnSet().getColumnByClass(EditorColumn.class);
    }

    public OperatorColumn getOperatorColumn() {
      return getColumnSet().getColumnByClass(OperatorColumn.class);
    }

    public RolesColumn getRolesColumn() {
      return getColumnSet().getColumnByClass(RolesColumn.class);
    }

    public AdministratorColumn getAdministratorColumn() {
      return getColumnSet().getColumnByClass(AdministratorColumn.class);
    }

    public IdColumn getIdColumn() {
      return getColumnSet().getColumnByClass(IdColumn.class);
    }

    @Order(10.0)
    public class IdColumn extends AbstractLongColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("id");
      }
    }

    @Order(20.0)
    public class NameColumn extends AbstractStringColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("Name");
      }
    }

    @Order(30.0)
    public class SurnameColumn extends AbstractStringColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("Surname");
      }
    }

    @Order(40.0)
    public class AdministratorColumn extends AbstractBooleanColumn {

      @Override
      protected boolean getConfiguredDisplayable() {
        return false;
      }
    }

    @Order(50.0)
    public class ModeratorColumn extends AbstractBooleanColumn {
      @Override
      protected boolean getConfiguredDisplayable() {
        return false;
      }
    }

    @Order(60.0)
    public class EditorColumn extends AbstractBooleanColumn {
      @Override
      protected boolean getConfiguredDisplayable() {
        return false;
      }
    }

    @Order(70.0)
    public class OperatorColumn extends AbstractBooleanColumn {
      @Override
      protected boolean getConfiguredDisplayable() {
        return false;
      }
    }

    @Order(80.0)
    @ColumnData(SdkColumnCommand.IGNORE)
    public class RolesColumn extends AbstractStringColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("Roles");
      }

      @Override
      protected void execDecorateCell(Cell cell, ITableRow row) throws ProcessingException {
        cell.setText(StringUtility.join(", ",
            BooleanUtility.nvl(getAdministratorColumn().getValue(row)) ? TEXTS.get("Administrator") : null,
            BooleanUtility.nvl(getModeratorColumn().getValue(row)) ? TEXTS.get("Moderator") : null,
            BooleanUtility.nvl(getEditorColumn().getValue(row)) ? TEXTS.get("Editor") : null,
            BooleanUtility.nvl(getOperatorColumn().getValue(row)) ? TEXTS.get("Operator") : null
            ));
      }
    }
  }
}

注意中的execDecorateCell实现RolesColumn。文本的计算取决于不可见列中包含的值。还要注意ColumnData此列顶部的注释。

4 个不可见列的属性Displayable设置为false

在服务器上,如果你想放一些数据,你可以这样做:

PersonsTable tableData = formData.getPersonsTable();
PersonsTableRowData rowData = tableData.addRow();
rowData.setId(42L);
rowData.setName("John");
rowData.setSurname("Johnny");
rowData.setAdministrator(Boolean.TRUE);
rowData.setModerator(Boolean.TRUE);
rowData.setEditor(Boolean.FALSE);
rowData.setOperator(Boolean.FALSE);

请注意,客户端中没有rowData.setRoles(String)rowData.getRoles()因为@ColumnData(SdkColumnCommand.IGNORE)

当然,我认为您想使用 SQL 语句来执行此操作。你会以这样的方式结束:

SQL.selectInto("SELECT " +
    " id, " +
    " name, " +
    " surname, " +
    " administrator, " +
    " moderator, " +
    " editor, " +
    " operator " +
    " FROM persons " +
    " INTO " +
    " :{personsTable.id}, " +
    " :{personsTable.name}, " +
    " :{personsTable.surname}, " +
    " :{personsTable.administrator}, " +
    " :{personsTable.moderator}, " +
    " :{personsTable.editor}, " +
    " :{personsTable.operator}",
    formData);

这是我的结果:

MyForm 示例 - Eclipse Scout

于 2015-04-02T20:50:46.263 回答