论坛首页 Web前端技术论坛

Struts+Hibernate/JDBC+ExtJS实现人力资源管理系统(一)

浏览 28859 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-01   最后修改:2009-04-01
   前期利用毕业实习的时间开发人力资源系统,实现了基本的组织机构管理,包括部门、职务、岗位管理,时间关系没有实现人员信息的各种操作。前端利用ExtJS框架完成同一个页面的所有操作(完全利用JS代码实现),后台本来利用Spring和Hibernate,无奈Spring用的不够熟练且时间不允许,所以改为Struts了。考虑到一部分数据库访问操作逻辑较简单且频率较低,故利用JDBC处理,而其他的则有Hibernate来处理。
   以下为系统各部分主干代码,稍后会放出代码供下载:
   配置文件:
   struts-config.xml
  
...
<struts-config>
	<data-sources />
	<form-beans>
		<form-bean name="loginForm"
			type="com.idealab.struts.form.LoginForm" />
		<form-bean name="newCorpForm"
			type="com.idealab.struts.form.NewCorpForm" />
		<form-bean name="newUserForm"
			type="com.idealab.struts.form.NewUserForm">
		</form-bean>
	</form-beans>

	<global-exceptions />
	<global-forwards>
		<forward name="index" path="/index.jsp"></forward>
	</global-forwards>
	<action-mappings>
		<!-- 登录 -->
		<action attribute="loginForm" input="/login.jsp"
			name="loginForm" path="/logon" scope="request"
			type="com.idealab.struts.action.LoginAction" />

		<!-- 新建不同种类(部门,职务,岗位) -->
		<action path="/new" scope="request"
			type="com.idealab.struts.action.NewAction" />

		<!-- 系统初始化中新建用户 -->
		<action attribute="newUserForm" name="newUserForm"
			path="/newUser" scope="request"
			type="com.idealab.struts.action.NewUserAction" />

		<!-- 获得公司 -->
		<action path="/getCorp" scope="request"
			type="com.idealab.struts.action.GetCorpAction" />

		<!-- 加载各种类型的树节点 -->
		<action path="/getNodes"
			type="com.idealab.struts.action.GetNodesAction" />

		<!-- 根据树节点Id加载信息到表单中 -->
		<action path="/getById"
			type="com.idealab.struts.action.GetByIdAction" />

		<!-- 更新信息 -->
		<action path="/update"
			type="com.idealab.struts.action.UpdateAction" />
		<!-- 删除 -->
		<action path="/delete"
			type="com.idealab.struts.action.DeleteAction" />

	</action-mappings>
	<message-resources
		parameter="com.idealab.struts.ApplicationResources" />
</struts-config>
...

hibernate.cfg.xml
...
<session-factory>
		<property name="connection.username">root</property>
		<property name="connection.url">
			jdbc:mysql://localhost:3306/ehr
		</property>
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="myeclipse.connection.profile">
			MysqlDriver
		</property>
		<property name="connection.password">ideal</property>
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<mapping resource="com/idealab/dao/Sysuser.hbm.xml" />
		<mapping resource="com/idealab/dao/Corp.hbm.xml" />
		<mapping resource="com/idealab/dao/Emp.hbm.xml" />
		<mapping resource="com/idealab/dao/Empdoc.hbm.xml" />
</session-factory>
...

   
前端主页面JS脚本:
Ext.ns('Ext.mypanels');
Ext.onReady(function() {
	Ext.QuickTips.init();
        Ext.form.Field.prototype.msgTarget = 'side';
	Ext.mypanels.contentPanel = new Ext.TabPanel({
		region : 'center',
		id : 'tabPanel',
		autoDestroy:false,/*处理页签关闭后无法再次打开的问题*/
		deferredRender : false,
		activeTab : 0,
		iconCls : 'tabs',
		items : {
			title : '主页',
			autoScroll : true,
			layout : 'table',
			layoutConfig : {
				columns : 1
			},
			items : [{
				title : '公告信息',
				html : '<img src="lib/images/arch_eHR.jpg" width=830 height=450/>'
			}]
		}
	});

	/* 导航栏面板定义 */
	var navPanel = new Ext.Panel({
				region : 'west',
				id : 'nav_panel',
				name : 'navPanel',
				title : '导航栏',
				split : true,
				border : true,
				collapsible : false,
				width : 170,
				minSize : 170,
				maxSize : 170,
				layout : 'accordion',
				layoutConfig : {
					animate : true,
					fill : true,
					autoWidth : true
				},
				items : [{
							title : '系统管理',
							items : [Ext.mypanels.tree.navAdminTree]
						}, {
							title : '自助操作',
							items : [Ext.mypanels.tree.navSelfinfoTree]
						}]
			});
	Ext.mypanels.tree.navAdminTree.on('click', onClickTreeNode);
	Ext.mypanels.tree.navSelfinfoTree.on('click', onClickTreeNode);

	/* 主面板 */
	var viewport = new Ext.Viewport({
				layout : 'border',
				items : [{
							region : 'north',
							contentEl : 'header',
							split : true, // 可改变框体大小
							border : true,
							collapsible : true, // 可收缩
							height : 72,
							minSize : 72,
							maxSize : 72
						}, {
							region : 'south',
							contentEl : 'footer',
							split : true,
							border : true,
							collapsible : true,
							height : 35,
							minSize : 30,
							maxSize : 30
						}, navPanel, Ext.mypanels.contentPanel]
			});
});
/*动态导入js文件*/
function importJS(src) {
	/*
	 * fpath = fpath.replace(/\./g,'\/'); document.write('<script
	 * type="text/javascript" src="'+ fpath + '.js"></script>');
	 */
	src=src.replace(/\./g,'\/');
	jpath=src+'.js';
	var headerDom = document.getElementsByTagName('head').item(0);
	var jsDom = document.createElement('script');
	jsDom.type = 'text/javascript';
	jsDom.src = jpath;
	headerDom.appendChild(jsDom);
}

function onClickTreeNode(node) {
	if (node.getDepth() > 1) {
		importJS('lib.main.'+node.id);
		var n = Ext.mypanels.contentPanel.getComponent(node.id);
		if (!n) { // 判断是否已经打开该面板
			n = Ext.mypanels.contentPanel.add({
						'id' : node.id,
						'title' : node.text,
						contentEl : 'tab_'+node.id,/*各个模块分别在nav_*.js中定义,且每个模块相应的显示在tab_*区域中*/
						closable : true,
						iconCls : 'tabs'
						/*
						 * autoLoad : { url : 'nodes.jsp?url='+node.id, scope :
						 * this, scripts : true } //
						 * 通过autoLoad属性载入目标页,如果要用到脚本,必须加上scripts属性
						 */});
		}
		Ext.mypanels.contentPanel.setActiveTab(n);
	}
}

   发表时间:2009-04-01  
今天没法上传附件,待明天再来上传。
0 请登录后投票
   发表时间:2009-04-01   最后修改:2009-04-01
根据信息类型和id查询不同类型信息(如部门、职务、岗位等):
ps:其中用到了Hibernate和JDBC以对数据库进行访问,处理结果格式化为JSON回传至页面端
public class GetByIdAction extends Action {
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter writer = response.getWriter();
		String getType = request.getParameter("type");
		String id = request.getParameter("id");
		
		JdbcUtil jdbc = new JdbcUtil();
		JSONArray jsonInner = new JSONArray();

		if (getType.equals("dept")) {// 获得部门信息
			jdbc.openConn();
			if (id == null) {// 若id为空,则查询全部数据,返回数据供comboBox使用
				String sql = "select * from dept";
				ResultSet rs = jdbc.executeQuery(sql);
				while (rs.next()) {
					JSONObject jsonObj = new JSONObject();
					jsonObj.put("id", rs.getString("pk_dept"));
					jsonObj.put("deptname", rs.getString("deptname"));
					jsonInner.add(jsonObj);
				}
				rs.close();
				jdbc.closeConn();

			} else {
				String sql = "select * from dept where pk_dept =" + id;
				ResultSet rs = jdbc.executeQuery(sql);
				Map map = new HashMap();
				if (rs.first()) {
					map.put("deptname", rs.getString("deptname"));
					map.put("depttype", rs.getString("depttype"));
					map.put("deptduty", rs.getString("deptduty"));
					map.put("addr", rs.getString("addr"));
					map.put("tel", rs.getString("tel"));
				}
				jsonInner = JSONArray.fromObject(map);
				rs.close();
				jdbc.closeConn();
				System.out.println("JsonInner is:"+jsonInner.toString());
			}

		} else if (getType.equals("post")) {// 获得职务信息
			jdbc.openConn();
			if (id == null) {// 若id为空,则查询全部数据
				String sql = "select * from post";
				ResultSet rs = jdbc.executeQuery(sql);
				while (rs.next()) {
					JSONObject jsonObj = new JSONObject();
					jsonObj.put("id", rs.getString("pk_post"));
					jsonObj.put("postname", rs.getString("postname"));
					jsonInner.add(jsonObj);
					System.out.println("pk_post=" + rs.getString("pk_post")
							+ "\t" + rs.getString("postname"));
				}
				rs.close();
				jdbc.closeConn();

			} else {
				String sql = "select * from post where pk_post =" + id;
				ResultSet rs = jdbc.executeQuery(sql);
				Map map = new HashMap();
				if (rs.first()) {
					map.put("postname", rs.getString("postname"));
					map.put("posttype", rs.getString("posttype"));
					map.put("postdesc", rs.getString("postdesc"));
					map.put("postgoal", rs.getString("postgoal"));
					map.put("postduty", rs.getString("postduty"));
				}
				rs.close();
				jdbc.closeConn();
				jsonInner = JSONArray.fromObject(map);
			}
		} else if (getType.equals("job")) {// 获得岗位信息
			jdbc.openConn();
			if (id == null) {
				String sql = "select * from job";
				ResultSet rs = jdbc.executeQuery(sql);
				while (rs.next()) {
					JSONObject jsonObj = new JSONObject();
					jsonObj.put("id", rs.getInt("pk_outer_post"));
					jsonObj.put("jobname", rs.getString("jobname"));
					jsonInner.add(jsonObj);
				}
				rs.close();
				jdbc.closeConn();
				
			} else {
				// Note:此时的id为部门主键,此查询响应部门树点击事件
				String sql = "select * from job where pk_dept=" + id;
				ResultSet rs = jdbc.executeQuery(sql);

				while (rs.next()) {
					JSONObject jsonObj = new JSONObject();

					jsonObj.put("jobcode", rs.getString("jobcode"));
					jsonObj.put("jobname", rs.getString("jobname"));
					jsonObj.put("pk_outer_post", rs.getInt("pk_outer_post"));
					jsonObj.put("jobtype", rs.getString("jobtype"));
					jsonObj.put("jobdesc", rs.getString("jobdesc"));
					jsonInner.add(jsonObj);
				}
				rs.close();
				jdbc.closeConn();
				
			}

		} else if (getType.equals("emptype")) {// 获得人员类别信息
			jdbc.openConn();
			if (id == null) {
				String sql = "select * from emptype";
				ResultSet rs = jdbc.executeQuery(sql);
				while (rs.next()) {
					JSONObject jsonObj = new JSONObject();
					jsonObj.put("id", rs.getString("pk_emptype"));
					jsonObj.put("typename", rs.getString("typename"));
					jsonInner.add(jsonObj);
				}
				rs.close();
				jdbc.closeConn();
				
			} else {
				String sql = "select * from emptype where pk_emptype=" + id;
				ResultSet rs = jdbc.executeQuery(sql);
				if (rs.first()) {
					JSONObject jsonObj = new JSONObject();
					jsonObj.put("typecode", rs.getString("typecode"));
					jsonObj.put("typename", rs.getString("typename"));
					jsonObj.put("typedesc", rs.getString("typedesc"));
					jsonInner.add(jsonObj);
				}
				rs.close();
				jdbc.closeConn();
				
			}
		} else if (getType.equals("emp")) {// 根据部门查询
			if (id == null) {
				// TODO
				EmpDAO dao = new EmpDAO();
				List<Emp> list = dao.findAll();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					JSONObject jsonObj = new JSONObject();
					Emp emp = (Emp) iterator.next();
					jsonObj.put("pk_emp", emp.getPkEmp());
					jsonObj.put("empname", emp.getName());
					jsonInner.add(jsonObj);
				}
				
			} else {
				EmpdocDAO dao = new EmpdocDAO();
				List<Empdoc> list = dao.findByPkOuterDept(Integer.valueOf(id));
				jsonInner.fromObject(list);
			}
		}
		JSONObject json = new JSONObject();
		json.put("success", true);
		json.put("data", jsonInner);
		writer.write(json.toString());
		return null;
	}
}

JDBC工具类:
public class JdbcUtil {
	private final String driver = "com.mysql.jdbc.Driver";
	private final String url="jdbc:mysql://localhost:3306/ehr?autoReconnect=true&useUnicode=true&characterEncoding=utf-8";
	private final String user = "root";
	private final String pwd = "ideal";
	private Connection conn = null;
	private Statement st = null;

	public void openConn(){
		try{
			Class.forName(driver);
			conn = DriverManager.getConnection(url,user,pwd);
			conn.setAutoCommit(true);
		}catch(SQLException e){
			e.printStackTrace();
			System.out.println("数据库连接失败!");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	public boolean executeUpdate(String sql)throws SQLException{ 
        try {
            /*判断必需的属性是否为空*/  
        	if(conn==null || sql == null||sql.equals("")){   
                return true;   
            }
        	st = conn.createStatement();
            int i = st.executeUpdate(sql); 
            System.out.println(i+"行受影响");
            return true;
        } catch (SQLException e) { 
            e.printStackTrace();
            System.out.println("更新失败!");
            return false;
        } 
    } 

    public ResultSet executeQuery(String sql){ 
    	ResultSet rs = null;
        try { 
        	st = conn.createStatement();
            rs = st.executeQuery(sql);
        } catch (SQLException e) { 
            e.printStackTrace(); 
            System.out.println("查询数据失败.未获得ResultSet!");
        }
        return rs;
    } 

    public void closeConn() { 
        try { 
            st.close(); 
            conn.close(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
            System.out.println("关闭数据库连接失败!");
        } 
    } 
}

ps:系统环境:Tomcat5.0.28+MySQL5,开发工具:MyEclipse6.5
系统实现图:


  • eHR.zip (7.3 MB)
  • 下载次数: 5887
  • 大小: 47.3 KB
0 请登录后投票
   发表时间:2009-04-20   最后修改:2009-04-20
加油!ui好像很nice!

怎么博客的回复跑到论坛来了???
0 请登录后投票
   发表时间:2009-04-20  
C_J 写道
加油!ui好像很nice!

用ExtJS做开发的初衷就是它可以让后台开发人员不必弄那些烦人的美工活!当然,Ajax的优势也是考虑因素之一。
0 请登录后投票
   发表时间:2009-05-21  
我想问一下,你的程序是怎样跳到后台去获取数据的?
0 请登录后投票
   发表时间:2009-05-22   最后修改:2009-05-22
逍遥郎 写道
我想问一下,你的程序是怎样跳到后台去获取数据的?

ExtJS提供后台数据请求控件,如JsonStore,通过配置url和method来对后台发送请求,后台将JSON格式的数据响应给前台。也可以利用请求函数做请求,给出系统中的一段代码:
Ext.Ajax.request({
	url : 'delete.do?type=dept&id=' + pk_dept,
	method : 'GET',
	success : function() {
		Ext.Msg.alert('info', '删除成功');
		deptTree.root.children = false;
		deptTree.root.reload();
	},
	failure : function() {
                //do something
	}
});
0 请登录后投票
   发表时间:2009-06-02  
嗯,学习了,光看贴出来的代码就很不错,比如动态载入JS什么的。
0 请登录后投票
   发表时间:2009-06-02  
bigeyex 写道
嗯,学习了,光看贴出来的代码就很不错,比如动态载入JS什么的。

多谢关注,共同学习~
0 请登录后投票
   发表时间:2009-06-04  
very nice!!!!!学习了 ,加油
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics