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

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




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

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

我们新建一个实体类user:
[java]  view plain copy
  1. package cn.edu.hpu.tax.user.entity;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.Date;  
  5.   
  6. public class User implements Serializable{  
  7.     private String id;  
  8.     private String name;  
  9.       
  10.     private String account;  
  11.     private String password;  
  12.     //所属部门  
  13.     private String dept;  
  14.     //头像(相对地址)  
  15.     private String headImg;  
  16.     //性别  
  17.     private boolean gender;  
  18.     private String email;  
  19.     private String mobile;  
  20.     //备注  
  21.     private String memo;  
  22.     private Date birthday;  
  23.     private String state;  
  24.       
  25.     //用户状态  
  26.     public final static String USER_STATE_VALID = "1";//有效  
  27.     public final static String USER_STATE_INVALID = "0";//无效  
  28.       
  29.     public User() {  
  30.           
  31.     }  
  32.     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) {  
  33.         this.id = id;  
  34.         this.name = name;  
  35.         this.account = account;  
  36.         this.password = password;  
  37.         this.dept = dept;  
  38.         this.headImg = headImg;  
  39.         this.gender = gendar;  
  40.         this.email = email;  
  41.         this.mobile = mobile;  
  42.         this.memo = memo;  
  43.         this.birthday = birthday;  
  44.         this.state = state;  
  45.     }  
  46.     //get与set方法省略  
  47. }  

接下来写我们的映射文件:
[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4.   
  5.   
  6. <hibernate-mapping>  
  7.     <class name="cn.edu.hpu.tax.user.entity.User" table="user">  
  8.         <id name="id" type="java.lang.String">  
  9.             <column name="id" length="32" />  
  10.             <generator class="uuid.hex" />  
  11.         </id>  
  12.         <property name="name" type="java.lang.String">  
  13.             <column name="name" length="20" not-null="true" />  
  14.         </property>  
  15.         <property name="dept" type="java.lang.String">  
  16.             <column name="dept" length="20" not-null="true" />  
  17.         </property>         
  18.         <property name="account" type="java.lang.String">  
  19.             <column name="account" length="50" not-null="true" />  
  20.         </property>  
  21.         <property name="password" type="java.lang.String">  
  22.             <column name="password" length="50" not-null="true" />  
  23.         </property>  
  24.         <property name="headImg" type="java.lang.String">  
  25.             <column name="headImg" length="100" />  
  26.         </property>  
  27.         <property name="gender" type="java.lang.Boolean">  
  28.             <column name="gender" />  
  29.         </property>  
  30.         <property name="email" type="java.lang.String">  
  31.             <column name="email" length="50" />  
  32.         </property>  
  33.         <property name="mobile" type="java.lang.String">  
  34.             <column name="mobile" length="20" />  
  35.         </property>  
  36.         <property name="birthday" type="java.util.Date">  
  37.             <column name="birthday" length="10" />  
  38.         </property>  
  39.         <property name="state" type="java.lang.String">  
  40.             <column name="state" length="1" />  
  41.         </property>  
  42.         <property name="memo" type="java.lang.String">  
  43.             <column name="memo" length="200" />  
  44.         </property>  
  45.     </class>  
  46.   
  47.   
  48. </hibernate-mapping>  

接下来编写我们的Dao层:
[java]  view plain copy
  1. package cn.edu.hpu.tax.user.dao;  
  2.   
  3. import cn.edu.hpu.tax.core.dao.BaseDao;  
  4. import cn.edu.hpu.tax.user.entity.User;  
  5.   
  6. public interface UserDao extends BaseDao<User>{  
  7.   
  8. }  

实现类:
[java]  view plain copy
  1. package cn.edu.hpu.tax.user.dao.impl;  
  2.   
  3. import cn.edu.hpu.tax.core.dao.impl.BaseDaoImpl;  
  4. import cn.edu.hpu.tax.user.dao.UserDao;  
  5. import cn.edu.hpu.tax.user.entity.User;  
  6.   
  7. public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{  
  8.   
  9.   
  10. }  

接下来写我们的Service业务层:
[java]  view plain copy
  1. package cn.edu.hpu.tax.user.service;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import cn.edu.hpu.tax.user.entity.User;  
  7.   
  8.   
  9. public interface UserService {  
  10.     //新增  
  11.     public void save(User user);  
  12.     //更新  
  13.     public void update(User user);  
  14.     //根据id删除  
  15.     public void delete(Serializable id);  
  16.     //根据id查找  
  17.     public User findObjectById(Serializable id);  
  18.     //查找列表  
  19.     public List<User> findObjects();  
  20. }  

实现类:
[java]  view plain copy
  1. package cn.edu.hpu.tax.user.service.impl;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import javax.annotation.Resource;  
  7.   
  8. import org.springframework.stereotype.Service;  
  9.   
  10. import cn.edu.hpu.tax.user.dao.UserDao;  
  11. import cn.edu.hpu.tax.user.entity.User;  
  12. import cn.edu.hpu.tax.user.service.UserService;  
  13.   
  14. @Service("userService")  
  15. public class UserServiceImpl implements UserService{  
  16.   
  17.   
  18.     @Resource  
  19.     private UserDao userDao;  
  20.       
  21.     @Override  
  22.     public void save(User user) {  
  23.         userDao.save(user);  
  24.     }  
  25.   
  26.   
  27.     @Override  
  28.     public void update(User user) {  
  29.         userDao.update(user);  
  30.     }  
  31.       
  32.     @Override  
  33.     public void delete(Serializable id) {  
  34.         userDao.delete(id);  
  35.     }  
  36.   
  37.   
  38.     @Override  
  39.     public User findObjectById(Serializable id) {  
  40.         return userDao.findObjectById(id);  
  41.     }  
  42.   
  43.   
  44.     @Override  
  45.     public List<User> findObjects() {  
  46.         return userDao.findObjects();  
  47.     }  
  48.   
  49.   
  50. }  

记下来写我们的Action层:
首先来分析,一个CRUD的Action中包含:
(1)列表页面
(2)跳转到新增页面
(3)保存新增
(4)跳转到编辑界面
(5)保存编辑
(6)删除
(7)批量删除
所以:
[java]  view plain copy
  1. package cn.edu.hpu.tax.user.action;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6.   
  7. import cn.edu.hpu.tax.user.entity.User;  
  8. import cn.edu.hpu.tax.user.service.UserService;  
  9.   
  10. import com.opensymphony.xwork2.ActionSupport;  
  11.   
  12. public class UserAction extends ActionSupport{  
  13.       
  14.     @Resource  
  15.     private UserService userService;  
  16.     private List<User> userList;  
  17.     private User user;  
  18.       
  19.     //列表页面  
  20.     public String listUI(){  
  21.         userList=userService.findObjects();  
  22.         return "listUI";  
  23.     }  
  24.     //跳转到新增页面  
  25.     public String addUI(){  
  26.         return "addUI";  
  27.     }  
  28.     //保存新增  
  29.     public String add(){  
  30.         if(user!=null){  
  31.             userService.save(user);  
  32.         }  
  33.         return listUI();  
  34.     }  
  35.     //跳转到编辑界面  
  36.     public String editUI(){  
  37.         if(user!=null && user.getId()!=null){  
  38.             user=userService.findObjectById(user.getId());  
  39.         }  
  40.         return "editUI";  
  41.     }  
  42.     //保存编辑  
  43.     public String edit(){  
  44.         if(user!=null){  
  45.             userService.update(user);  
  46.         }  
  47.         return listUI();  
  48.     }  
  49.     //删除  
  50.     public String delete(){  
  51.         if(user!=null && user.getId()!=null){  
  52.             userService.delete(user.getId());  
  53.         }  
  54.         return listUI();  
  55.     }  
  56.     //批量删除  
  57.     public String deleteSelected(){  
  58.         return listUI();  
  59.     }  
  60.   
  61.   
  62.     public UserService getUserService() {  
  63.         return userService;  
  64.     }  
  65.     public void setUserService(UserService userService) {  
  66.         this.userService = userService;  
  67.     }  
  68.     public List<User> getUserList() {  
  69.         return userList;  
  70.     }  
  71.     public void setUserList(List<User> userList) {  
  72.         this.userList = userList;  
  73.     }  
  74.     public User getUser() {  
  75.         return user;  
  76.     }  
  77.     public void setUser(User user) {  
  78.         this.user = user;  
  79.     }  
  80. }  
基础的我们都写完了,以后需要添加新的代码,我们暂时先写这些。

加下来写我们User的user-struts.xml和user-spring.xml配置文件:
先在总的spring配置文件中加:
[html]  view plain copy
  1. <!-- 用来注入sessionFactory的抽象类 -->  
  2. <bean id="xDao" abstract="true">  
  3.     <property name="sessionFactory" ref="sessionFactory"></property>  
  4. </bean>  

然后编写user-spring.xml:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  7.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
  8.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  9.     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  10.       
  11.     <!-- 继承了注入sessionFactory的抽象类,不用反复出入sessionFactory -->  
  12.     <bean id="userDao" class="cn.edu.hpu.tax.user.dao.impl.UserDaoImpl" parent="xDao"></bean>  
  13.       
  14.     <!-- 扫描Service -->  
  15.     <context:component-scan base-package="cn.edu.hpu.tax.user.service.impl"></context:component-scan>  
  16. </beans>  

接下来配置struts的配置文件user-struts.xml:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5.   
  6.   
  7. <struts>  
  8.     <package name="user-action" namespace="/tax" extends="struts-default">  
  9.         <action name="user_*" class="cn.edu.hpu.tax.user.action.UserAction" method="{1}">  
  10.             <result name="{1}">/WEB-INF/jsp/tax/user/{1}.jsp</result>  
  11.         </action>  
  12.     </package>  
  13. </struts>  

然后将user-struts.xml加入到总配置文件中:
[html]  view plain copy
  1. <!-- 包含user的struts配置文件 -->  
  2. <include file="cn/edu/hpu/tax/user/conf/user-struts.xml"/>  

至此我们后台全部工作完成。
接下来将美工给我们的前台页面引入(js/css/jsp/),因为我们每一个jsp页面都要使用一些相同的js和css,所以我们先把这些引入写在一个header中,然后在每个页面头部引用它,就可以防止代码冗余,同时使修改更容易:
heander.jsp(放在了common文件夹下):
[html]  view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%@ taglib prefix="s" uri="/struts-tags"%>  
  3. <%  
  4.     pageContext.setAttribute("basePath", request.getContextPath()+"/") ;  
  5. %>  
  6. <script type="text/javascript" src="${basePath}js/jquery/jquery-1.10.2.min.js"></script>  
  7. <link href="${basePath}css/skin1.css" rel="stylesheet" type="text/css" />  

我们在其他所有需要引入这些配置的页面使用静态引入:
[html]  view plain copy
  1. <%@include file="/common/header.jsp" %>  


我们的用户列表界面:

[html]  view plain copy
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  2. <html>  
  3. <head>  
  4.     <title>用户管理</title>  
  5.     <%@include file="/common/header.jsp" %>  
  6.     <script type="text/javascript">  
  7.         //全选、全反选  
  8.         function doSelectAll(){  
  9.             // jquery 1.6 前  
  10.             //$("input[name=selectedRow]").attr("checked", $("#selAll").is(":checked"));  
  11.             //prop jquery 1.6+建议使用  
  12.             $("input[name=selectedRow]").prop("checked", $("#selAll").is(":checked"));        
  13.         }  
  14.     </script>  
  15. </head>  
  16. <body class="rightBody">  
  17. <form name="form1" action="" method="post" enctype="multipart/form-data">  
  18.     <div class="p_d_1">  
  19.         <div class="p_d_1_1">  
  20.             <div class="content_info">  
  21.                 <div class="c_crumbs"><div><b></b><strong>用户管理</strong></div> </div>  
  22.                 <div class="search_art">  
  23.                     <li>  
  24.                         用户名:<s:textfield name="user.name" cssClass="s_text" id="userName"  cssStyle="width:160px;"/>  
  25.                     </li>  
  26.                     <li><input type="button" class="s_button" value="搜 索" onclick="doSearch()"/></li>  
  27.                     <li style="float:right;">  
  28.                         <input type="button" value="新增" class="s_button" onclick="doAdd()"/>   
  29.                         <input type="button" value="删除" class="s_button" onclick="doDeleteAll()"/>   
  30.                         <input type="button" value="导出" class="s_button" onclick="doExportExcel()"/>   
  31.                         <input name="userExcel" type="file"/>  
  32.                         <input type="button" value="导入" class="s_button" onclick="doImportExcel()"/>   
  33.   
  34.   
  35.                     </li>  
  36.                 </div>  
  37.   
  38.   
  39.                 <div class="t_list" style="margin:0px; border:0px none;">  
  40.                     <table width="100%" border="0">  
  41.                         <tr class="t_tit">  
  42.                             <td width="30" align="center"><input type="checkbox" id="selAll" onclick="doSelectAll()" /></td>  
  43.                             <td width="140" align="center">用户名</td>  
  44.                             <td width="140" align="center">帐号</td>  
  45.                             <td width="160" align="center">所属部门</td>  
  46.                             <td width="80" align="center">性别</td>  
  47.                             <td align="center">电子邮箱</td>  
  48.                             <td width="100" align="center">操作</td>  
  49.                         </tr>  
  50.                           
  51.                             <tr bgcolor="f8f8f8">  
  52.                                 <td align="center"><input type="checkbox" name="selectedRow" value=""/></td>  
  53.                                 <td align="center">xxx</td>  
  54.                                 <td align="center"></td>  
  55.                                 <td align="center"></td>  
  56.                                 <td align="center"></td>  
  57.                                 <td align="center"></td>  
  58.                                 <td align="center">  
  59.                                     <a href="javascript:doEdit(id)">编辑</a>  
  60.                                     <a href="javascript:doDelete(id)">删除</a>  
  61.                                 </td>  
  62.                             </tr>  
  63.                           
  64.                     </table>  
  65.                 </div>  
  66.             </div>  
  67.         <div class="c_pate" style="margin-top: 5px;">  
  68.         <table width="100%" class="pageDown" border="0" cellspacing="0"  
  69.             cellpadding="0">  
  70.             <tr>  
  71.                 <td align="right">  
  72.                     总共1条记录,当前第 1 页,共 1 页     
  73.                             <a href="#">上一页</a>  <a href="#">下一页</a>  
  74.                     到 <input type="text" style="width: 30px;" onkeypress="if(event.keyCode == 13){doGoPage(this.value);}" min="1"  
  75.                     max="" value="1" />     
  76.                 </td>  
  77.             </tr>  
  78.         </table>    
  79.         </div>  
  80.         </div>  
  81.     </div>  
  82. </form>  
  83.   
  84.   
  85. </body>  
  86. </html>  

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值