045模块导航功能的重构(3)导航的定义
导航的配置也是保存在数据库中,一共有二张表来完成,主表是一个导航的定义,从表是这个导航里面各个层级的属性的定义。
一个模块的导航主表的定义:
@Entity
@TableDefine(group = "系统模块", id = 990205, title = "模块导航方案", shortName = "导航方案")
public class _ModuleGridNavigateScheme implements Serializable {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@FieldDefine(title = "ID号", number = 10)
private Integer tf_navigateSchemeId;
@JsonIgnore
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
@JoinColumn(name = "tf_moduleId", updatable = false, nullable = false)
@FieldDefine(title = "模块", number = 20)
private _Module tf_Module;
//显示在tabPanel中的导航的顺序
@FieldDefine(title = "顺序号", number = 30)
@Column(nullable = false)
private Integer tf_order;
@FieldDefine(title = "导航描述", number = 50, nameField = true)
@Column(nullable = false, length = 50)
private String tf_title;
@FieldDefine(title = "图标iconCls", number = 60)
@Column(length = 50)
private String tf_iconCls;
@FieldDefine(title = "层级", number = 70, remark = "默认树是层级显示还是并排显示")
private Boolean tf_cascading;
@FieldDefine(title = "可用", number = 90)
private Boolean tf_enabled;
// 这个功能还没有加入
@FieldDefine(title = "动态展开", number = 100, remark = "是否动态的展开子集的导航")
private Boolean tf_dynamicExpand;
@FieldDefine(title = "备注", number = 190)
private String tf_remark;
@OneToMany(targetEntity = _ModuleGridNavigateSchemeDetail.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "tf_navigateSchemeId")
@OrderBy("tf_order")
private List<_ModuleGridNavigateSchemeDetail> navigateSchemeDetails;
}
每个导航定义中又包括了若干级的具体导航属性:
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@TableDefine(group = "系统模块", id = 990206, title = "模块导航方案字段", shortName = "导航字段")
public class _ModuleGridNavigateSchemeDetail implements Serializable {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@FieldDefine(title = "ID号", number = 10)
private Integer tf_detailId;
@JsonIgnore
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
@JoinColumn(name = "tf_navigateSchemeId", updatable = false, nullable = false)
@FieldDefine(title = "模块导航方案", number = 20)
private _ModuleGridNavigateScheme tf_ModuleGridNavigateScheme;
//顺序号排在前在树的展示中级数更高
@FieldDefine(title = "顺序号", number = 30)
@Column(nullable = false)
private Integer tf_order;
@FieldDefine(title = "导航字段说明", number = 40, nameField = true)
@Column(nullable = false, length = 50)
private String tf_title;
@FieldDefine(title = "字段前缀", remark = "附加字段的模块路径", number = 50)
@Column(length = 255)
private String tf_fieldAhead;
@JsonIgnore
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
@JoinColumn(name = "tf_fieldId", nullable = false)
@FieldDefine(title = "模块字段", nameField = true, number = 60)
private _ModuleField tf_ModuleField;
@FieldDefine(title = "字段表达式", number = 70, remark = "导航字段参与的表达式,this表示此字段")
// 比如说 date_format(tf_createDate,'%Y年')
// date_format(this,'%Y年')
@Column(length = 255)
private String tf_fieldFunction;
@FieldDefine(title = "聚合类型", number = 80)
@Column(length = 20)
private String tf_aggregate;
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
@JoinColumn(name = "tf_numberGroupId")
@FieldDefine(title = "数值分组", number = 90)
private _NumberGroup tf_NumberGroup;
@FieldDefine(title = "加入上级筛选", number = 80, remark = "选中此记录后,是否需要加入上一级的筛先条件")
private Boolean tf_addParentFilter;
// 只对基本字段有效,对于manytoone 字段无效,主要是对日期的作用
@FieldDefine(title = "倒序", number = 100, remark = "显示的树是否倒序排列")
private Boolean tf_reverseOrder;
@FieldDefine(title = "折叠", number = 110, remark = "如果有children,默认是否展开")
private Boolean tf_collapsed;
// 如有部门 000001,000002, 是否加入 0001,00 这些节点
@FieldDefine(title = "上级节点", number = 120, remark = "如果导航模块有编码级次,是否加入上级编码的数据节点")
private Boolean tf_addCodeLevel;
@FieldDefine(title = "图标", number = 130)
@Column(length = 50)
private String tf_iconCls;
@FieldDefine(title = "样式cls", number = 140)
@Column(length = 50)
private String tf_cls;
@FieldDefine(title = "备注", number = 190)
private String tf_remark;
}
在这个定义导航具体属性的类中,顺序号确定了每个属性的上下位置,例如顺序号1为“省”,顺序号2为“市”,那么生成的导航树就是 省-市的结构。“数值分值”可以用来对数值字段或者日期字段来进行值的分段导航。“字段表达式”也是一个非常有用的功能,可以自定义一个sql表达式来生成导航的值。“加入上级筛选”这个选项用来确定是否要加入parent的筛选条件。
下面就几张图来具体的展示一下导航各个属性的定义。
下面显示一张各个属性并列的。
经过这样设计的导航模块,基本上可以满足绝大多数的需求了。如果再要进一步的话,就要加入节点动态展开,和导航值能够多选的功能了。因为导航是操作的时候限定记录,并不是综合查询,限定记录应该是越限越少,因此多选的功能好象是没有必要了。
整个导航还有一些其他的功能不能在文章中一一列举了,以后有机会录一个视频来讲解一下,会更加清楚。