跟我一起学extjs5(29--加入模块和菜单定义[2建立java bean])

跟我一起学extjs5(29--加入模块和菜单定义[2建立java bean])

对上一节中加入的4个模块在java中建立相应的bean文件。

以上表建立好以后,需要建立java bean文件。在建立之前需要加入几个支持类。

先在com.jfok.server.common中建立包annotation,再在下面加入二个类库,这二个是自定义的注释类。分别用来注释每一个模块的信息和模块中每一字段的信息。

package com.jfok.server.common.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 用来注释模块
 *
 * @author jiangfeng
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface TableDefine {

	// 此表的id号,为一个4位数字
	int id();

	// 模块名称
	String title();

	// 模块简称
	String shortname() default "";

	// 模块分组名称
	String group();

	// 模块的主键是否可以是分级的,如果是可以分级的,可定义为"2,2,2",表示有三级,每级代码长为2位,
	// 比如会计科目可以这样来定义
	// 10
	// 1001
	// 100101
	// 100102
	// 100102
	// 1002
	// ......
	String codeLevel() default "";

	// 模块是否有附件
	boolean attachment() default false;

}
package com.jfok.server.common.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 用来注释模块中的每个字段
 *
 * @author jiangfeng
 *
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldDefine {

	String title();

	int number() default 0;

	String remark() default "";

	boolean nameField() default false;

	boolean hidden() default false;

	String fieldGroup() default "默认组";

}

在com.jfok.server.hibernate中建立包system,把系统用到的bean文件都放在这个目录下。先建立一个接口文件:

package com.jfok.server.hibernate.system;

/**
 * 有此接口的类,都是系统模块的控制类
 *
 * @author jfok
 *
 */
public interface _IModuleControlInterface {

}

再建立_ModuleGroup.java

package com.jfok.server.hibernate.system;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

import com.jfok.server.common.annotation.FieldDefine;
import com.jfok.server.common.annotation.TableDefine;

/**
 * 模块分组类,每一个模块都有一个大类分组
 *
 * @author jfok 2012.11.7
 */
@SuppressWarnings("serial")
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@TableDefine(group = "系统模块", id = 9901, title = "模块分组")
public class _ModuleGroup implements _IModuleControlInterface, Serializable {

	public static final String TITLE = "tf_title";

	@Id
	@FieldDefine(title = "模块分组序号", number = 10)
	@Column(nullable = false, length = 10)
	private String tf_moduleGroupId;

	@FieldDefine(title = "模块分组名称", nameField = true, number = 20)
	@Column(nullable = false, length = 50)
	private String tf_title;

	@FieldDefine(title = "描述", number = 30)
	private String tf_description;

	@FieldDefine(title = "图标地址", number = 40)
	private String tf_iconURL;

	@FieldDefine(title = "备注", number = 50)
	private String tf_remark;

	public _ModuleGroup() {

	}
  // setter and getter
}

上面这个类中,就用自定义的注释类来进行了注释,一个是注释在类名上,一个是注释在各个字段上。这二个类注释的功能是以后在增加一个模块的时候,会自动把这些注释的信息自动的加到保存的模块和模块字段的表中。

再加入_Module.java

package com.jfok.server.hibernate.system;

import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.codehaus.jackson.map.annotate.JsonSerialize;

import com.jfok.server.common.annotation.FieldDefine;
import com.jfok.server.common.annotation.TableDefine;

/**
 * 系统中每个模块的字义
 *
 * @author jfok 2012.11.7
 *
 */
@JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
@SuppressWarnings("serial")
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@TableDefine(group = "系统模块", id = 9902, title = "系统模块")
public class _Module implements _IModuleControlInterface, Serializable {

	public static final String MODULEID = "tf_moduleId";
	public static final String MODULENAME = "tf_moduleName";

	@Id
	@FieldDefine(title = "模块ID号", number = 10)
	@Column(nullable = false, length = 10)
	private String tf_moduleId; // 模块ID,模块序号

	@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
	@JoinColumn(name = "tf_moduleGroupId")
	@FieldDefine(title = "模块分组", number = 20)
	private _ModuleGroup tf_ModuleGroup;

	@FieldDefine(title = "模块标识", number = 30)
	@Column(nullable = false, length = 50, updatable = false)
	private String tf_moduleName; // 模块英文名称

	@FieldDefine(title = "模块名称", nameField = true, number = 40)
	@Column(nullable = false, length = 50)
	private String tf_title; // 模块中文名称

	@FieldDefine(title = "模块简称", number = 50)
	@Column(length = 20)
	private String tf_shortname; // 简称

	@FieldDefine(title = "英文简称", number = 60)
	@Column(length = 20)
	private String tf_englishname; // 英文简称,在新增序号的时候,可以把这字母加进去

	@FieldDefine(title = "表名", number = 70)
	@Column(length = 50)
	private String tf_tableName;

	@FieldDefine(title = "主键", number = 80)
	@Column(nullable = false, length = 50)
	private String tf_primaryKey;// 模块主键

	@FieldDefine(title = "显示标志字段", number = 81)
	@Column(nullable = false, length = 50)
	private String tf_nameFields;// 模块主要关键内容的字段,如合同的是合同名称,部门的是部门名称

	@FieldDefine(title = "记录标题tpl", number = 82, remark = "如果显示标志字段不能描述记录,需要设置此内容")
	@Column(length = 200)
	private String tf_titleTpl;// 模块主要关键内容的字段,如合同的是合同名称,部门的是部门名称

	@FieldDefine(title = "编码字段", number = 91)
	@Column(length = 50)
	private String tf_codeField;// 模块编码字段,如果有的话

	@FieldDefine(title = "顺序号字段", number = 97)
	@Column(length = 50)
	private String tf_orderField;// 模块编码字段,如果有的话

	@FieldDefine(title = "日期字段", number = 92)
	@Column(length = 50)
	private String tf_dateField;

	@FieldDefine(title = "年度字段", number = 93)
	@Column(length = 50)
	private String tf_yearfield;

	@FieldDefine(title = "月度字段", number = 94)
	@Column(length = 50)
	private String tf_monthField;

	@FieldDefine(title = "季度字段", number = 95)
	@Column(length = 50)
	private String tf_seasonField;

	@FieldDefine(title = "文件字段", number = 96)
	@Column(length = 50)
	private String tf_fileField;

	@FieldDefine(title = "主页上顺序", number = 99)
	@Column(length = 50)
	private String tf_homePageTag;

	@FieldDefine(title = "模块描述", number = 100)
	@Column(length = 50)
	private String tf_description;

	@FieldDefine(title = "请求地址", number = 110)
	@Column(nullable = false, length = 50)
	private String tf_requestMapping;// 系统中后台服务的调用接入点 user.do,employee.do 等

	@FieldDefine(title = "图标地址", number = 120)
	@Column(length = 50)
	private String tf_iconURL;

	@FieldDefine(title = "默认排序字段", number = 130)
	private String tf_defaultOrderField;

	@FieldDefine(title = "行操作", remark = "新增及修改操作都行内完成", number = 140)
	@Column(nullable = false)
	private Boolean tf_isInlineOper;

	// 如部门编码为 2,2,2,2,2
	@FieldDefine(title = "编码级次", remark = "如果设置了编码级次,则主键的长度必须是此级次中的,并且必须有父级编码存在", number = 150)
	@Column(length = 50)
	String tf_codeLevel;

	@FieldDefine(title = "联动模块", remark = "在本模块的数据增删改后,打开的联动模块都要刷新数据。", number = 155)
	@Column(length = 200)
	private String tf_linkedModule;

	@FieldDefine(title = "可用", number = 160)
	@Column(nullable = false)
	private Boolean tf_isEnable = false;

	@FieldDefine(title = "可浏览", number = 170)
	@Column(nullable = false)
	private Boolean tf_hasBrowse = false;

	@FieldDefine(title = "可增加", number = 180)
	@Column(nullable = false)
	private Boolean tf_hasInsert = false;

	@FieldDefine(title = "可修改", number = 190)
	@Column(nullable = false)
	private Boolean tf_hasEdit = false;

	@FieldDefine(title = "可删除", number = 200)
	@Column(nullable = false)
	private Boolean tf_hasDelete = false;

	@FieldDefine(title = "可执行", number = 210)
	@Column(nullable = false)
	private Boolean tf_hasExec = false;

	@FieldDefine(title = "可审核", number = 220)
	@Column(nullable = false)
	private Boolean tf_hasAuditing = false;

	@FieldDefine(title = "可审批", number = 230)
	@Column(nullable = false)
	private Boolean tf_hasApprove = false;

	@FieldDefine(title = "可支付", number = 240)
	@Column(nullable = false)
	private Boolean tf_hasPayment = false;

	@FieldDefine(title = "有附件", number = 250)
	@Column(nullable = false)
	private Boolean tf_hasAddition = false; // 是否需要附件

	@FieldDefine(title = "可权限设置", remark = "用户可对此模块设置权限,选定的才可以浏览与操作", number = 260)
	@Column(nullable = false)
	private Boolean tf_canLimit = false; // 此模块是否能进行权限设置

	@FieldDefine(title = "Excel导入", remark = "是否可以通过Excel导入新增记录", number = 270)
	@Column(nullable = false)
	private Boolean tf_allowInsertExcel = false;

	@FieldDefine(title = "Excel修改", remark = "是否可以导出的Excel修改后再导入", number = 280)
	@Column(nullable = false)
	private Boolean tf_allowEditExcel = false;

	@FieldDefine(title = "可图表", number = 290)
	@Column(nullable = false)
	private Boolean tf_hasChart = false;

	@FieldDefine(title = "系统模块", number = 300, remark = "如果是系统模块,用户没有浏览权限,就不把模块定义发送到前端")
	@Column(nullable = false)
	private Boolean tf_isSystem = false;

	@FieldDefine(title = "查询条件顺序号", number = 310, remark = "此模块放在综合查询的条件选择栏中的顺序")
	private Integer tf_searchCondOrder;

	@FieldDefine(title = "备注", number = 800)
	private String tf_remark;

	public _Module() {

	}
  // setter and getter
}

_MenuGroup.java

package com.jfok.server.hibernate.system;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;
import com.jfok.server.common.annotation.FieldDefine;
import com.jfok.server.common.annotation.TableDefine;

/**
 * 菜单分组
 *
 * @author jfok
 *
 */
@SuppressWarnings("serial")
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@TableDefine(group = "系统模块", id = 9920, title = "菜单分组")
public class _MenuGroup implements _IModuleControlInterface, Serializable {

	@Id
	@FieldDefine(title = "顺序号", remark = "菜单分组按顺序号显示在菜单条上", number = 10)
	@Column(length = 10, nullable = false)
	private String tf_menuGroupId;

	@FieldDefine(title = "分组名称", nameField = true, number = 20)
	@Column(length = 50, nullable = false)
	private String tf_title;

	@FieldDefine(title = "展开", remark = "在树状菜单下默认是否展开", number = 30)
	private Boolean tf_expand;

	@FieldDefine(title = "图标glyph", number = 40)
	private Boolean tf_glyph;

	@FieldDefine(title = "图标文件名", remark = "图标放置于/images/module/目录下", number = 50)
	@Column(length = 50)
	private String tf_iconURL;

	@FieldDefine(title = "分组描述", number = 60)
	@Column(length = 50)
	private String tf_description;

	@FieldDefine(title = "备注", number = 70)
	private String tf_remark;

	@Transient
	private List<_MenuModule> tf_menuModules;

	public _MenuGroup() {
	}

	//setter and getter
}

_MenuModule.java

package com.jfok.server.hibernate.system;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.hibernate.annotations.GenericGenerator;
import com.jfok.server.common.annotation.FieldDefine;
import com.jfok.server.common.annotation.TableDefine;

/**
 * 系统可使用的菜单项
 *
 * @author jfok
 *
 */
@SuppressWarnings("serial")
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@TableDefine(group = "系统模块", id = 9921, title = "系统菜单")
public class _MenuModule implements _IModuleControlInterface, Serializable {
	@Id
	@FieldDefine(title = "ID号", hidden = true, number = 10)
	@GeneratedValue(generator = "increment")
	@GenericGenerator(name = "increment", strategy = "increment")
	private Integer tf_menuModuleId;

	@FieldDefine(title = "顺序号", remark = "按顺序号显示在菜单中", number = 20)
	@Column(nullable = false)
	private Integer tf_orderId;

	@JsonIgnore
	@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
	@JoinColumn(name = "tf_menuGroupId", nullable = false)
	@FieldDefine(title = "菜单分组", nameField = true, number = 30)
	private _MenuGroup tf_MenuGroup;

	@JsonIgnore
	@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
	@JoinColumn(name = "tf_moduleId", nullable = false)
	@FieldDefine(title = "系统模块", number = 40)
	private _Module tf_Module;

	@FieldDefine(title = "父菜单标题", number = 50)
	@Column(length = 20)
	private String tf_parentMenu;

	@FieldDefine(title = "分隔下一条", number = 60)
	private Boolean tf_addSeparator;

	@FieldDefine(title = "菜单标题", number = 70)
	@Column(length = 50)
	private String tf_title;

	@FieldDefine(title = "父模块约束设置", number = 80)
	private String tf_parentFilter;

	// 这个字段用于传送json到前台,放在json中
	@Column(insertable = false, updatable = false)
	private String tf_ModuleId;

	public _MenuModule() {

	}

	// setter and getter

}

再修改 hibernate.cfg.xml,把上面4个class加入到配置文件中。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>

		<property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
		<property name="hibernate.connection.url">jdbc:sqlserver://10.211.55.5:1433;databaseName=extjs5</property>

		<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
		<property name="hibernate.connection.username">sa</property>
		<property name="hibernate.connection.password"></property>

		<property name="hibernate.connection.autocommit">false</property>
		<property name="format_sql">true</property>
		<property name="show_sql">true</property>

		<!-- 系统模块 -->
		<mapping class="com.jfok.server.hibernate.system._ModuleGroup" />
		<mapping class="com.jfok.server.hibernate.system._Module" />
		<mapping class="com.jfok.server.hibernate.system._MenuGroup" />
		<mapping class="com.jfok.server.hibernate.system._MenuModule" />

	</session-factory>
</hibernate-configuration>

到现在为止,我们建立好了数据表以及java bean文件,下面可以开发前后台进行协同工作的内容了。

各个文件的目录结构:

时间: 2024-10-13 21:15:22

跟我一起学extjs5(29--加入模块和菜单定义[2建立java bean])的相关文章

跟我一起学extjs5(28--加入模块和菜单定义[1建立数据库和表])

跟我一起学extjs5(28--加入模块和菜单定义[1建立数据库和表]) 下面我们开始进入自定义系统的设计和各个组成部分的搭建工作. 首先在sql server中建立数据库,这里的数据的名字我定义为extjs5,然后需要建立模块的定义表,这个表里将存着系统中所有模块的定义信息.为了能有个直观的前后台的互动,先把模块和菜单这二个部分加进去,可以把菜单数据组织好后发送到前台去进行展示. 由于系统中的模块很多,需要分类,因此在先要设计一个"模块分组"的表,对于菜单也是一样,需要有一个&quo

跟我一起学extjs5(30--加入模块和菜单定义[3后台系统数据的组织和生成])

跟我一起学extjs5(30--加入模块和菜单定义[3后台系统数据的组织和生成]) 对于大多web程序来说,后台是完成控制和处理的,前台就是一个展示工具,这个系统也是这样.在上一节中建立了四个模块,下面开始设计前后台的交互.将系统信息和模块.菜单信息传到前台,由前台来进行展示. 首先新建一个java bean类用来存放各种需要传到前台的数据,里面包括:系统信息.操作人员信息.服务人员信息.模块信息.菜单.现在只加入了这几个,以后还要加入各种 各样的权限设置.在com.jfok.server.co

跟我一起学extjs5(32--加入模块和菜单定义[4更新菜单(源码下载)])

跟我一起学extjs5(32--加入模块和菜单定义[4根据后台信息更新菜单]) 这一节根据后台传递过来的菜单分组和菜单定义,以及模块定义来更新4种类型的菜单. 按钮菜单和标准菜单的数据格式是一样的,生成的函数都在MainModel.js中,下面将其改一下: // 根据data.tf_MenuGroups生成菜单条和菜单按钮下面使用的菜单数据 getMenus : function() { var items = [], me = this; Ext.Array.each(this.get('tf

跟我一起学extjs5(31--加入模块和菜单定义[4前台通过ajax来调用数据与展示])

跟我一起学extjs5(31--加入模块和菜单定义[4前台通过ajax来调用数据与展示]) 上一节已经把到现在为止的后台做好了,启动tomcat ,在浏览器中打入网址:http://localhost:8888/app/applicationinfo.do,就可以取得系统参数值.下面看一下在chrome调试器中的结果. 到此为止,后台暂告一段落,又要开始对前台的extjs的程序进行修改了. 首先要修改的是MainModel.js,在此js文件中加入构造函数: constructor : func

跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])

跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据]) 写了几个月,总算有点盼头了,最终要从后台取得数据了.后台的spring mvc 和 service 仅仅能简单的说说了,里面加了几十个类.有兴趣的下载了源代码自己看.以下画张通用的模块列表取数据的流程,这个流程是适用于全部的模块.我这个后台处理程序也是对全部的模块进行统一处理,包含数据查找,新增,改动,删除都是同样的. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamZvaw==

跟我一起学extjs5(38--单个模块的设计[6取得模块列表数据])

跟我一起学extjs5(38--单个模块的设计[6取得模块列表数据]) 上一节中做好了前后台的程序,现在来看看取得数据的运行过程.在菜单中选择 "系统管理"--"模块分组".就可以看到下图,在渲染后grid后,会显示数据. 来看看ajax取得数据的url和数据. url的信息: Remote Address:[::1]:8888 Request URL:http://localhost:8888/app/rest/module/fetchdata.do?_dc=14

跟我一起学extjs5(42--单个模块的数据新增方式)

跟我一起学extjs5(42--单个模块的数据新增方式) 前面的章节中已经加入了一个自定义的模块,并且可以进行数据的新增.修改.删除的操作了,在这个基础上就可以大作文章了.这一节来设想几种新据新增的方式,并给出一些具体的解决方案. 看了我后台java源码的可以看出,所有的模块的新增.修改.删除全部是相同的处理,只是用了反射来生成各个实体bean,这样不管你有多少个业务bean,你的这部分代码是不用再增加了,只需要考虑一些逻辑处理上的操作即可,这些在后面会提到.基于这样的方式,我们可以定义多种数据

跟我一起学extjs5(36--单个模块的设计[4根据菜单建立相应的模块])

跟我一起学extjs5(36--单个模块的设计[4根据菜单建立相应的模块]) 前几节处理好了后台,现在又要处理前台了.首先是要修改菜单的选择事件,在创建一个module的时候将 moduleName参数传递进去. 修改MainController.js中的函数: // 选择了主菜单上的菜单后执行 onMainMenuClick : function(menuitem) { var maincenter = this.getView().down('maincenter'); maincenter

跟我一起学extjs5(35--单个模块的设计[3根据类的标注自动生成数据])

跟我一起学extjs5(35--单个模块的设计[3根据类的标注自动生成数据]) 然后在hibernate.cfg.xml中加入: <mapping class="com.jfok.server.hibernate.system._ModuleField" /> <mapping class="com.jfok.server.hibernate.system._ModuleGridScheme" /> <mapping class=&qu