【SSH项目实战】国税协同平台-4.用户管理需求分析&CRUD方法1

上次我们完成了日志模块的配置和基础增删改查类,下面我们根据用户的需求来正式开发项目的业务模块。

下面我们主要来开发系统用户管理的模块
我们有用户的功能说明书,打开功能说明书来看看这个模块需要什么功能:

功能说明
用户管理:可以根据用户名查询系统用户;在页面中点击“新增”可以添加用户、点击删除可以批量删除选中的用户。“导出”则导出所有的用户列表到excel文件中并弹出下载提示框给用户下载;“导入”将需要用户将本地的用户列表按照一定格式将excel中的用户导入到系统中(导入用户的密码默认为123456)。在用户列表中显示用户名、帐号、所属部门、性别、电子邮箱、操作;其中操作列中包括编辑、删除两个功能;点击“编辑”则编辑用户信息,删除则删除该用户。
编辑用户:编辑用户的所属部门(部门A/B)、用户名、帐号、密码、性别、角色(一般用户、管理员)、手机号码、电子邮箱、生日、备注。

我们的角色分配以后在进行讲解,这次我们主要做user的单表增删改查。

我们新建一个实体类user:

package cn.edu.hpu.tax.user.entity;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{
	private String id;
	private String name;

	private String account;
	private String password;
	//所属部门
	private String dept;
	//头像(相对地址)
	private String headImg;
	//性别
	private boolean gender;
	private String email;
	private String mobile;
	//备注
	private String memo;
	private Date birthday;
	private String state;

	//用户状态
	public final static String USER_STATE_VALID = "1";//有效
	public final static String USER_STATE_INVALID = "0";//无效

	public User() {

	}
	public User(String id, String name, String account, String password, String dept, String headImg, boolean gendar, String email, String mobile, String memo, Date birthday, String state) {
		this.id = id;
		this.name = name;
		this.account = account;
		this.password = password;
		this.dept = dept;
		this.headImg = headImg;
		this.gender = gendar;
		this.email = email;
		this.mobile = mobile;
		this.memo = memo;
		this.birthday = birthday;
		this.state = state;
	}
	//get与set方法省略
}

接下来写我们的映射文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="cn.edu.hpu.tax.user.entity.User" table="user">
		<id name="id" type="java.lang.String">
			<column name="id" length="32" />
			<generator class="uuid.hex" />
		</id>
		<property name="name" type="java.lang.String">
			<column name="name" length="20" not-null="true" />
		</property>
		<property name="dept" type="java.lang.String">
			<column name="dept" length="20" not-null="true" />
		</property>
		<property name="account" type="java.lang.String">
			<column name="account" length="50" not-null="true" />
		</property>
		<property name="password" type="java.lang.String">
			<column name="password" length="50" not-null="true" />
		</property>
		<property name="headImg" type="java.lang.String">
			<column name="headImg" length="100" />
		</property>
		<property name="gender" type="java.lang.Boolean">
			<column name="gender" />
		</property>
		<property name="email" type="java.lang.String">
			<column name="email" length="50" />
		</property>
		<property name="mobile" type="java.lang.String">
			<column name="mobile" length="20" />
		</property>
		<property name="birthday" type="java.util.Date">
			<column name="birthday" length="10" />
		</property>
		<property name="state" type="java.lang.String">
			<column name="state" length="1" />
		</property>
		<property name="memo" type="java.lang.String">
			<column name="memo" length="200" />
		</property>
	</class>

</hibernate-mapping>

接下来编写我们的Dao层:

package cn.edu.hpu.tax.user.dao;

import cn.edu.hpu.tax.core.dao.BaseDao;
import cn.edu.hpu.tax.user.entity.User;

public interface UserDao extends BaseDao<User>{

}

实现类:

package cn.edu.hpu.tax.user.dao.impl;

import cn.edu.hpu.tax.core.dao.impl.BaseDaoImpl;
import cn.edu.hpu.tax.user.dao.UserDao;
import cn.edu.hpu.tax.user.entity.User;

public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{

}

接下来写我们的Service业务层:

package cn.edu.hpu.tax.user.service;

import java.io.Serializable;
import java.util.List;

import cn.edu.hpu.tax.user.entity.User;

public interface UserService {
	//新增
	public void save(User user);
	//更新
	public void update(User user);
	//根据id删除
	public void delete(Serializable id);
	//根据id查找
	public User findObjectById(Serializable id);
	//查找列表
	public List<User> findObjects();
}

实现类:

package cn.edu.hpu.tax.user.service.impl;

import java.io.Serializable;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import cn.edu.hpu.tax.user.dao.UserDao;
import cn.edu.hpu.tax.user.entity.User;
import cn.edu.hpu.tax.user.service.UserService;

@Service("userService")
public class UserServiceImpl implements UserService{

	@Resource
	private UserDao userDao;

	@Override
	public void save(User user) {
		userDao.save(user);
	}

	@Override
	public void update(User user) {
		userDao.update(user);
	}

	@Override
	public void delete(Serializable id) {
		userDao.delete(id);
	}

	@Override
	public User findObjectById(Serializable id) {
		return userDao.findObjectById(id);
	}

	@Override
	public List<User> findObjects() {
		return userDao.findObjects();
	}

}

记下来写我们的Action层:
首先来分析,一个CRUD的Action中包含:
(1)列表页面
(2)跳转到新增页面
(3)保存新增
(4)跳转到编辑界面
(5)保存编辑
(6)删除
(7)批量删除
所以:

package cn.edu.hpu.tax.user.action;

import java.util.List;

import javax.annotation.Resource;

import cn.edu.hpu.tax.user.entity.User;
import cn.edu.hpu.tax.user.service.UserService;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{

	@Resource
	private UserService userService;
	private List<User> userList;
	private User user;

	//列表页面
	public String listUI(){
		userList=userService.findObjects();
		return "listUI";
	}
	//跳转到新增页面
	public String addUI(){
		return "addUI";
	}
	//保存新增
	public String add(){
		if(user!=null){
			userService.save(user);
		}
		return listUI();
	}
	//跳转到编辑界面
	public String editUI(){
		if(user!=null && user.getId()!=null){
			user=userService.findObjectById(user.getId());
		}
		return "editUI";
	}
	//保存编辑
	public String edit(){
		if(user!=null){
			userService.update(user);
		}
		return listUI();
	}
	//删除
	public String delete(){
		if(user!=null && user.getId()!=null){
			userService.delete(user.getId());
		}
		return listUI();
	}
	//批量删除
	public String deleteSelected(){
		return listUI();
	}

	public UserService getUserService() {
		return userService;
	}
	public void setUserService(UserService userService) {
		this.userService = userService;
	}
	public List<User> getUserList() {
		return userList;
	}
	public void setUserList(List<User> userList) {
		this.userList = userList;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
}

基础的我们都写完了,以后需要添加新的代码,我们暂时先写这些。

加下来写我们User的user-struts.xml和user-spring.xml配置文件:
先在总的spring配置文件中加:

<!-- 用来注入sessionFactory的抽象类 -->
<bean id="xDao" abstract="true">
	<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

然后编写user-spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- 继承了注入sessionFactory的抽象类,不用反复出入sessionFactory -->
    <bean id="userDao" class="cn.edu.hpu.tax.user.dao.impl.UserDaoImpl" parent="xDao"></bean>

    <!-- 扫描Service -->
    <context:component-scan base-package="cn.edu.hpu.tax.user.service.impl"></context:component-scan>
</beans>

接下来配置struts的配置文件user-struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<package name="user-action" namespace="/tax" extends="struts-default">
		<action name="user_*" class="cn.edu.hpu.tax.user.action.UserAction" method="{1}">
			<result name="{1}">/WEB-INF/jsp/tax/user/{1}.jsp</result>
		</action>
	</package>
</struts>

然后将user-struts.xml加入到总配置文件中:

<!-- 包含user的struts配置文件 -->
<include file="cn/edu/hpu/tax/user/conf/user-struts.xml"/>

至此我们后台全部工作完成。
接下来将美工给我们的前台页面引入(js/css/jsp/),因为我们每一个jsp页面都要使用一些相同的js和css,所以我们先把这些引入写在一个header中,然后在每个页面头部引用它,就可以防止代码冗余,同时使修改更容易:
heander.jsp(放在了common文件夹下):

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
    pageContext.setAttribute("basePath", request.getContextPath()+"/") ;
%>
<script type="text/javascript" src="${basePath}js/jquery/jquery-1.10.2.min.js"></script>
<link href="${basePath}css/skin1.css" rel="stylesheet" type="text/css" />

我们在其他所有需要引入这些配置的页面使用静态引入:

 <%@include file="/common/header.jsp" %>

我们的用户列表界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户管理</title>
    <%@include file="/common/header.jsp" %>
    <script type="text/javascript">
      	//全选、全反选
		function doSelectAll(){
			// jquery 1.6 前
			//$("input[name=selectedRow]").attr("checked", $("#selAll").is(":checked"));
			//prop jquery 1.6+建议使用
			$("input[name=selectedRow]").prop("checked", $("#selAll").is(":checked"));
		}
    </script>
</head>
<body class="rightBody">
<form name="form1" action="" method="post" enctype="multipart/form-data">
    <div class="p_d_1">
        <div class="p_d_1_1">
            <div class="content_info">
                <div class="c_crumbs"><div><b></b><strong>用户管理</strong></div> </div>
                <div class="search_art">
                    <li>
                        用户名:<s:textfield name="user.name" cssClass="s_text" id="userName"  cssStyle="width:160px;"/>
                    </li>
                    <li><input type="button" class="s_button" value="搜 索" onclick="doSearch()"/></li>
                    <li style="float:right;">
                        <input type="button" value="新增" class="s_button" onclick="doAdd()"/> 
                        <input type="button" value="删除" class="s_button" onclick="doDeleteAll()"/> 
                        <input type="button" value="导出" class="s_button" onclick="doExportExcel()"/> 
                    	<input name="userExcel" type="file"/>
                        <input type="button" value="导入" class="s_button" onclick="doImportExcel()"/> 

                    </li>
                </div>

                <div class="t_list" style="margin:0px; border:0px none;">
                    <table width="100%" border="0">
                        <tr class="t_tit">
                            <td width="30" align="center"><input type="checkbox" id="selAll" onclick="doSelectAll()" /></td>
                            <td width="140" align="center">用户名</td>
                            <td width="140" align="center">帐号</td>
                            <td width="160" align="center">所属部门</td>
                            <td width="80" align="center">性别</td>
                            <td align="center">电子邮箱</td>
                            <td width="100" align="center">操作</td>
                        </tr>

                            <tr bgcolor="f8f8f8">
                                <td align="center"><input type="checkbox" name="selectedRow" value=""/></td>
                                <td align="center">xxx</td>
                                <td align="center"></td>
                                <td align="center"></td>
                                <td align="center"></td>
                                <td align="center"></td>
                                <td align="center">
                                    <a href="javascript:doEdit(id)">编辑</a>
                                    <a href="javascript:doDelete(id)">删除</a>
                                </td>
                            </tr>

                    </table>
                </div>
            </div>
        <div class="c_pate" style="margin-top: 5px;">
		<table width="100%" class="pageDown" border="0" cellspacing="0"
			cellpadding="0">
			<tr>
				<td align="right">
                 	总共1条记录,当前第 1 页,共 1 页   
                            <a href="#">上一页</a>  <a href="#">下一页</a>
					到 <input type="text" style="width: 30px;" onkeypress="if(event.keyCode == 13){doGoPage(this.value);}" min="1"
					max="" value="1" />   
			    </td>
			</tr>
		</table>
        </div>
        </div>
    </div>
</form>

</body>
</html>

我们把项目运行之后,看一下我们这个页面:

现在还是什么都没有的状态,我们下一次完善我们的这些操作包括输出信息。

源代码在下一篇文章中:http://blog.csdn.net/acmman/article/details/49331915

转载请注明出处:http://blog.csdn.net/acmman/article/details/49329509

时间: 2024-11-08 19:17:00

【SSH项目实战】国税协同平台-4.用户管理需求分析&amp;CRUD方法1的相关文章

【SSH项目实战】国税协同平台-13.用户与角色关系

上一次写到角色权限管理,我们设定的角色是要使用的,我们接下来写用户与角色的关系. 角色与权限:多对多 一个角色可以有多个权限,一个权限可以被多个角色使用. 那我们下面就来使用我们完成的角色. 我们先来看一下需求,记不记得之前的用户编辑界面: 可以看到,我们注册用户的时候是要给用户安排一个角色的,而我们的角色在角色管理系统里面已经创建好了,可以从创建好的角色中挑选需要的角色(该角色拥有自己特有的权限). 所以,我们说一下用户与角色的关系设计: 用户:用户1,用户2 角色:管理员,一般用户 用户与角

【SSH项目实战】国税协同平台-28.投诉受理需求分析&amp;amp;CDM&amp;amp;PDM

我们接下来编写"投诉受理"模块的功能. 首先进行需求分析,我们来看一下我们的需求: 界面描述: 2.7.2功能说明 (1)投诉受理管理:查询用户提交的投诉信息,可以根据投诉部门(部门A/B).投诉时间段.状态进行查询.在列表信息中展示投诉标题.被投诉部门.被投诉人.投诉时间.状态(待受理.已受理.已失效).操作:其中操作栏内内容为"处理",点击"处理"则在打开的查询页面中查看具体的投诉信息并且可以多次回复投诉信息:一旦回复则说明已受理该投诉. (

【SSH项目实战】国税协同平台-1.项目介绍

项目介绍 1.1项目背景 国税协同办公平台包括了行政管理.后勤服务.在线学习.纳税服务.我的空间等几个子系统:我们本次主要的开发功能是纳税服务子系统的部分模块和基于纳税服务子系统信息的个人工作台首页.纳税服务子系统是办税PC前端或移动端的后台管理系统,主要包括的功能有系统角色管理.用户管理.信息发布管理.投诉受理.纳税咨询.易告知.服务预约.服务调查等模块. 系统的主界面: 我们要做的模块界面: 1.2项目前期 项目前期:一般是由客户经理从客户那边了解到有关该项目的招标信息,然后开发公司再组织竞

【SSH项目实战】国税协同平台-14.系统、子系统首页&amp;amp;登录功能1

我们做完了用户与角色的分配,在设置用户在相应的角色下的操作之前,我们先完成用户的登录功能. 首先,我们先加载我们的系统的首页和子首页.很简单,就是转发到一个jsp页面而已,我们先写一个HomeAction来设置跳转功能: package cn.edu.hpu.tax.core.action; import com.opensymphony.xwork2.ActionSupport; public class HomeAction extends ActionSupport{ //跳转到首页 pu

【SSH项目实战】国税协同平台-15.系统、子系统首页&amp;amp;登录功能2

接上一篇:http://blog.csdn.net/acmman/article/details/49614841 我们的子系统界面已经加载出来: 我们找到左边菜单页,给它加链接: <dl class=""> <dt><a class="yh" href="${ctx }tax/role_listUI.action" target="mainFrame"><b></b>

【SSH项目实战】国税协同平台-26.分页功能编写

可以看到,我们之前的用户管理.角色管理和信息发布管理的列表下均有这些东西: 总共1条记录,当前第 1 页,共 1 页    上一页  下一页 到  这个就是美工留给我们做分页的,我们接下来就以信息发布管理模块为例做一个分页功能. 我们在做之前首先分析一下我们分页的规则: 总共1条记录,当前第 1 页,共 1 页    上一页  下一页 到   属性有: 总记录数 当前页号 总页数 页大小 列表记录 使用例子: 共6条记录,每页3条,共2页 总页数 = 总记录数/页大小 共7条记录,每页3条,共3

【SSH项目实战】国税协同平台-27.分页对象应用&amp;amp;抽取pageNavigator

上次我们完成了信息发布管理模块的分页功能.但是我们还没给其它的模块做分页,所以我们也要去完成其它模块的分页功能. 按照我们给信息发布管理模块编写分页功能的方式去编写,需要大费周章,我们不如把分页功能封装起来,这样这些模块包括以后扩充的模块都能使用分页的功能了. 我们回顾一下我们的InfoAction,关于分页的属性有: //分页对象 protected PageResult pageResult; //页号 private int pageNo; //页大小 private int pageSi

【SSH项目实战】国税协同平台-8.户帐号唯一性校验

我们之前完成了用户管理列表的增删改查以及头像上传,之后又使用POI技术完成了用户列表信息的Excel导入和Excel文件导出工作.接下来我们来编写与账号有关的业务. 可以看到我们添加用户要指派一个账号 但是我们的账号一定是不能重复的,如果账号已经存在,我们不就能让它保存在系统中,要告诉用户账号已经存在.所以我们这次要进行用户账号唯一性的校验. 校验用户帐号唯一性: 需要校验的地方:新增与编辑:其中编辑页面时,帐号是已经存在的需要将当前帐号排除在校验范围内 校验时机:当帐号的值发生变化时:保存的时

【SSH项目实战】国税协同平台-5.头像上传功能

之前我们完成了用户管理的增删改查功能,来回顾一下我们获取用户列表时的过程: 记得用户添加的时候没有上传头像,下面我们来完成添加用户时,头像上传的功能. 我们上传头像有以下步骤: 1.获取头像(file,contentType,filename) 2.保存头像 2.1.保存头像到指定的文件目录中 2.2.设置用户头像路径 下面是详细实现: 在用户管理的添加.编辑页面中,可以上传用户的头像:页面中对头像字段引用type=file的文本域. <input type="file" nam