跟我一起学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="com.jfok.server.hibernate.system._ModuleGridSchemeGroup" />
		<mapping class="com.jfok.server.hibernate.system._ModuleGridSchemeGroupField" />

		<mapping class="com.jfok.server.hibernate.system._ModuleFormScheme" />
		<mapping class="com.jfok.server.hibernate.system._ModuleFormSchemeGroup" />
		<mapping class="com.jfok.server.hibernate.system._ModuleFormSchemeGroupField" />

至此这7个模块的数据表已经加好了,下面是根据类的标注信息自动生成上述7个类中数据的过程。也就是说你新建一个类,用自定义的标识语言来标注各个字段之后,可以根据标注的信息把各个字段的内容写到数据库中,并且可以生成一个默认的列表方案和一个表单方案,在方案下面可以加入一个分组,分组下面把字段都加进去。

在此之前先要加入无数个支持类,现在类的规模和复杂度有些增加了,博客现在倒是很难写了,但也不能没有下文,我一定会把模块的列表和表单的这些前后台操作的基本内容写完。

此系统的大多数配置全是全台完成的,因此自动生成模块数据也是根据前台调用来完成。因此我们先建立一个SystemFrameController来完成这个事。这个类是spring mvc的控制类。

package com.jfok.server.controller;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jfok.server.common.ModuleServiceFunction;
import com.jfok.server.common.annotation.TableDefine;
import com.jfok.server.service.SystemFrameService;

@Controller
@RequestMapping("/systemframe")
public class SystemFrameController {

	@Resource
	private SystemFrameService systemFrameService;

	/**
	 * 根据类名加入module 定义以及字段定义,生成grid form 的缺省
	 *
	 * @param moduleName
	 * @return
	 */

	@RequestMapping(value = "/addmodule.do", produces = "application/json;text/plain;charset=UTF-8")
	// @Override
	public @ResponseBody
	String addModuleWithName(String moduleName) {
		Class<?> moduleClass = ModuleServiceFunction.getModuleBeanClass(moduleName);
		if (moduleClass == null)
			return "未在指定的包中找到类:" + moduleName + "!";

		TableDefine tableDefine = (TableDefine) moduleClass.getAnnotation(TableDefine.class);
		if (tableDefine == null)
			return "未在指定的类中找到tableDefine的标注定义";

		String result = systemFrameService.addModuleWithName(moduleName, moduleClass, tableDefine);
		if (result == null) {
			// 生成此模块的字段
			systemFrameService.refreshModuleField(String.valueOf(tableDefine.id()));
			// 创建新的列表数据
			systemFrameService.createNewGridScheme(String.valueOf(tableDefine.id()), moduleClass);
			// 创建新的表单数据
			systemFrameService.createNewFormScheme(String.valueOf(tableDefine.id()), moduleClass);
		}
		return null;
	}

}

也就是在前台调用 /systemframe/addmodule.do?moduleName=_ModuleGroup ,就可以自动加入“模块分组”的所有字段信息到表中,并且生成一个列表方案和一个表单方案。在浏览器里输入:http://localhost:8888/app/systemframe/addmodule.do?moduleName=_ModuleGroup,就会完成上述工作。我们来看看完成后各表增加的数据。(你现在输入还不能增加,因此还有好多个支撑类你没有,等以后下载了源码就可以了)

为了能把这些数据加入到_ModuleGroup的模块定义之下,需要修改类

package com.jfok.server.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.jfok.server.DAO.SystemBaseDAO;
import com.jfok.server.common.info.ApplicationInfo;
import com.jfok.server.common.info.ServiceInfo;
import com.jfok.server.common.info.SystemInfo;
import com.jfok.server.common.info.UserInfo;

import com.jfok.server.hibernate.system._MenuGroup;
import com.jfok.server.hibernate.system._Module;
import com.jfok.server.hibernate.system._ModuleFormScheme;
import com.jfok.server.hibernate.system._ModuleFormSchemeGroup;
import com.jfok.server.hibernate.system._ModuleGridScheme;
import com.jfok.server.hibernate.system._ModuleGridSchemeGroup;

@Service
public class ApplicationService {

	@Resource
	private SystemBaseDAO systemBaseDAO;

	private static List<_Module> modules = null;

	// 事务注释
	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
	public ApplicationInfo getApplicationInfo(HttpServletRequest request) {

		ApplicationInfo result = new ApplicationInfo();

		// 以上内容暂时为自定义的,以后会改为从数据库和登录信息中读取。
		SystemInfo systemInfo = new SystemInfo();
		systemInfo.setTf_systemName("自定义的中小型管理系统");
		systemInfo.setTf_systemVersion("2014.09.28");
		result.setSystemInfo(systemInfo);

		UserInfo userInfo = new UserInfo();
		userInfo.setTf_userdwmc("无锡市宏宇电子有限公司");
		userInfo.setTf_userStartdate(new Date());
		userInfo.setTf_userName("管理员");
		userInfo.setTf_loginName("admin");
		userInfo.setTf_userId(0);
		userInfo.setTf_departmentId("00");
		userInfo.setTf_departmentName("工程部");
		result.setUserInfo(userInfo);

		ServiceInfo serviceInfo = new ServiceInfo();
		serviceInfo.setTf_serviceDepartment("熙旺公司");
		serviceInfo.setTf_serviceMen("蒋锋");
		serviceInfo.setTf_serviceTelnumber("1320528xxxx");
		serviceInfo.setTf_serviceFaxnumber("0510-88888888");
		serviceInfo.setTf_serviceQQ("7858xxxx");
		serviceInfo.setTf_serviceEmail("[email protected]");
		serviceInfo.setTf_serviceHomepage("www.www.net");
		serviceInfo.setTf_copyrightInfo("熙旺公司版权所有");
		serviceInfo.setTf_copyrightOwner("熙旺软件");

		result.setServiceInfo(serviceInfo);

		// 把所有的模块定义信息加进去
		result
				.setTf_Modules(new HashSet<_Module>((List<_Module>) systemBaseDAO.findAll(_Module.class)));

		// 加入这一条是为了让菜单组下面的菜单也执行sql 语句加进来,不然的话,返回以后mvc要加入菜单,
		// 就会在执行sql的时候因为session已经关闭而报错
		for (_Module module : result.getTf_Modules()) {
			module.getModuleFields().size();
			for (_ModuleGridScheme scheme : module.getModuleGridSchemes()) {
				for (_ModuleGridSchemeGroup group : scheme.getModuleGridSchemeGroups()) {
					group.getModuleGridSchemeGroupFields().size();
				}
			}
			for (_ModuleFormScheme scheme : module.getModuleFormSchemes()) {
				for (_ModuleFormSchemeGroup group : scheme.getModuleFormSchemeGroups()) {
					group.getModuleFormSchemeGroupFields().size();
				}
			}

		}

		// 加入菜单分组
		result.setTf_MenuGroups((List<_MenuGroup>) systemBaseDAO.findAll(_MenuGroup.class));

		for (_MenuGroup mg : result.getTf_MenuGroups()) {
			// 加入这一条是为了让菜单组下面的菜单也执行sql 语句加进来,不然的话,返回以后mvc要加入菜单,
			// 就会在执行sql的时候因为session已经关闭而报错
			mg.getTf_menuModules().size();
		}

		modules = new ArrayList<_Module>(result.getTf_Modules());

		return result;
	}

	// 根据模块 name 号取得模块定义
	public static _Module getModuleWithName(String name) {
		for (_Module module : getModules())
			if (module.getTf_moduleName().equals(name))
				return module;
		return null;
	}

	public static List<_Module> getModules() {
		return modules;
	}

	public static void setModules(List<_Module> modules) {
		ApplicationService.modules = modules;
	}

}

在上面的类中增加了一个静态变量存放所有的module,而不必在每次请求的时候都去数据库里面加载。

		// 加入这一条是为了让菜单组下面的菜单也执行sql 语句加进来,不然的话,返回以后mvc要加入菜单,
		// 就会在执行sql的时候因为session已经关闭而报错
		for (_Module module : result.getTf_Modules()) {
			module.getModuleFields().size();
			for (_ModuleGridScheme scheme : module.getModuleGridSchemes()) {
				for (_ModuleGridSchemeGroup group : scheme.getModuleGridSchemeGroups()) {
					group.getModuleGridSchemeGroupFields().size();
				}
			}
			for (_ModuleFormScheme scheme : module.getModuleFormSchemes()) {
				for (_ModuleFormSchemeGroup group : scheme.getModuleFormSchemeGroups()) {
					group.getModuleFormSchemeGroupFields().size();
				}
			}

		}

这一段也是新加上去的,作用就是在session没有关闭之前,将各个子模块的数据都读进来。

在加入了操作之后,我们再刷新网页,在模块_ModuleGroup的定义中会把字段和列表和表单方案都加进去。

太累了,满头大汗!

下面又开始要extjs5来处理这些后台传来的数据了。

时间: 2024-11-02 20:24:36

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

跟我一起学extjs5(11--自定义模块的设计)

跟我一起学extjs5(11--自定义模块的设计) 从这一节开始我们来设计并完成一个自定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息.以下信息只是我自己在开发过程中想到或用到的,希望有新的想法的或者有建议的跟贴回复. 一个独立模块包含以下信息: 1.模块的基本信息 模块ID号:一个数字的ID号,可以根据此ID号的顺序将相同分组的模块放在一块. 模块分组:模块分到哪个组里,比如说业务模块1.业务模块2.系统设置.系统管理等. 模块标识:系统中唯一的模块的标识,一般这个标识等同于数据库

跟我一起学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(36--单个模块的设计[4根据菜单建立相应的模块])

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

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

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

跟我一起学extjs5(39--单个模块的设计[7数据的增加修改删除])

跟我一起学extjs5(39--单个模块的设计[7数据的增加修改删除]) 从后台取得数据已经可以了,下面对记录的新增.修改和删除进行前后台的互动改造.首先将新增和修改在行内进行,也就是都是在grid上进行. 在grid上可以编辑行,需要在initComponent中增加一个plugins的修改,将原来cellEditing的删除掉,加入rowEditing: // 可以在grid中进行行编辑的设置 this.rowEditing = new Ext.grid.plugin.RowEditing(

跟我一起学extjs5(34--单个模块的设计[2建立表单表bean])

跟我一起学extjs5(34--单个模块的设计[2建立表单表及bean]) 建立表单方案表: CREATE TABLE [dbo].[_ModuleFormScheme]( [tf_formSchemeId] [int] NOT NULL, [tf_moduleId] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL, [tf_schemeOrder] [int] NOT NULL, [tf_schemeName] [nvarchar](50)

跟我一起学extjs5(33--单个模块的设计[1建立表和bean])

跟我一起学extjs5(33--单个模块的设计[1建立表和bean]) 现在开始进入这个系统的第一个核心部分,就是如何对模块的功能进行设计.请看下图,一个最简单的模块包括的内容有:模块属性,字段属性,列表定义和表单定义. 在上面的定义中,一个模块可以有n个字段组成,可以有若干个列表方案和表单方案:每一个列表和表单可以有若干个组组成,每个组下面又有若干个字段.这样的设计也符合这个教程的前20节中设计出来的功能.现在要做的就是把这些功能做成前后台交互的. 先开始模块字段和列表方案的定义.以上各个方案

跟我一起学extjs5(34--单个模块的设计[2建立表单表及bean])

[sql] view plaincopyprint? CREATE TABLE [dbo].[_ModuleFormScheme]( [tf_formSchemeId] [int] NOT NULL, [tf_moduleId] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL, [tf_schemeOrder] [int] NOT NULL, [tf_schemeName] [nvarchar](50) COLLATE Chinese_PRC_