当前位置: 首页 > 编程日记 > 正文

OA项目12:系统管理之用户管理

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明。谢谢。

一 之前在第8节时已经将User实体及映射文件建立好了,所以设计实体已经完成了,下面来做功能了。

二 我们对照静态页面看用户管理页面分析发现,增删改查功能跟之前一样,多了一个初始化密码的请求。当然,这不是问题,下面开始做功能吧!

三 开发:

1.写action及struts2映射,具体如下:

1)UserAction.java:

  1 package cn.clear.oa.view.action;
  2 
  3 import java.util.HashSet;
  4 import java.util.List;
  5 
  6 import org.springframework.context.annotation.Scope;
  7 import org.springframework.stereotype.Controller;
  8 
  9 import com.opensymphony.xwork2.ActionContext;
 10 
 11 import cn.clear.oa.base.BaseAction;
 12 import cn.clear.oa.domain.Department;
 13 import cn.clear.oa.domain.Role;
 14 import cn.clear.oa.domain.User;
 15 import cn.clear.oa.util.DepartmentUtil;
 16 
 17 @Controller
 18 @Scope("prototype")
 19 public class UserAction extends BaseAction<User> {
 20 
 21     /**
 22      * 
 23      */
 24     private static final long serialVersionUID = 1L;
 25 
 26     private Long departmentId;
 27     private Long[] roleIds;
 28 
 29     public String list() throws Exception {
 30         // 查询所有的用户
 31         List<User> userList = userService.findAll();
 32         // 将用户放集合
 33         ActionContext.getContext().put("userList", userList);
 34         return "list";
 35     }
 36 
 37     public String delete() throws Exception {
 38         userService.delete(model.getId());
 39         return "toList";
 40     }
 41 
 42     public String addUI() throws Exception {
 43         // 准备部门树状列表
 44         List<Department> topList = departmentService.findTopList();
 45         List<Department> departmentList = DepartmentUtil
 46                 .getAllDepartments(topList);
 47 
 48         ActionContext.getContext().put("departmentList", departmentList);
 49         // 准备roleList
 50         List<Role> roleList = roleService.findAll();
 51         ActionContext.getContext().put("roleList", roleList);
 52         return "saveUI";
 53     }
 54 
 55     public String add() throws Exception {
 56         // 设置部门
 57         model.setDepartment(departmentService.findById(departmentId));
 58         // 设置岗位
 59         model.setRoles(new HashSet<Role>(roleService.findByIds(roleIds)));
 60         // 设置密码
 61         model.setPassword("1234");
 62         userService.save(model);
 63         return "toList";
 64     }
 65 
 66     public String editUI() throws Exception {
 67         // 准备部门树状列表
 68         List<Department> topList = departmentService.findTopList();
 69         List<Department> departmentList = DepartmentUtil
 70                 .getAllDepartments(topList);
 71 
 72         ActionContext.getContext().put("departmentList", departmentList);
 73         // 准备roleList
 74         List<Role> roleList = roleService.findAll();
 75         ActionContext.getContext().put("roleList", roleList);
 76 
 77         // 准备回显的数据
 78         User user = userService.findById(model.getId());
 79         // 放在栈顶
 80         ActionContext.getContext().getValueStack().push(user);
 81         //部门回显
 82         if(user.getDepartment()!=null){
 83             departmentId = user.getDepartment().getId();
 84         }
 85         //岗位回显
 86         if(user.getRoles()!=null){
 87             roleIds = new Long[user.getRoles().size()];
 88             int index = 0;
 89             for (Role role : user.getRoles()) {
 90                 roleIds[index++] = role.getId();
 91             }
 92         }
 93         return "saveUI";
 94     }
 95 
 96     public String edit() throws Exception {
 97         User user = userService.findById(model.getId());
 98         user.setDescription(model.getDescription());
 99         user.setEmail(model.getEmail());
100         user.setGender(model.getGender());
101         user.setLoginName(model.getLoginName());
102         user.setName(model.getName());
103         user.setPhoneNumber(model.getPhoneNumber());
104         
105         List<Role> roleList = roleService.findByIds(roleIds);
106         user.setRoles(new HashSet<Role>(roleList));
107         user.setDepartment(departmentService.findById(departmentId));
108         userService.update(user);
109         return "toList";
110     }
111 
112     public String initPassword() throws Exception {
113         User user = userService.findById(model.getId());
114         user.setPassword("1234");
115         userService.update(user);
116         return "toList";
117     }
118 
119     // ------
120     public Long getDepartmentId() {
121         return departmentId;
122     }
123 
124     public void setDepartmentId(Long departmentId) {
125         this.departmentId = departmentId;
126     }
127 
128     public Long[] getRoleIds() {
129         return roleIds;
130     }
131 
132     public void setRoleIds(Long[] roleIds) {
133         this.roleIds = roleIds;
134     }
135 
136 }
UserAction.java

2)在struts.xml中添加映射:

1 <!-- 用户管理 -->
2         <action name="user_*" class="userAction" method="{1}">
3             <result name="list">/WEB-INF/jsp/userAction/list.jsp</result>
4             <result name="toList" type="redirectAction">user_list</result>
5             <result name="saveUI">/WEB-INF/jsp/userAction/saveUI.jsp</result>
6             
7         </action>
在struts.xml中添加action

2.写Service及实现类:

1)UserService.java

1 package cn.clear.oa.service;
2 
3 import cn.clear.oa.base.DaoSupport;
4 import cn.clear.oa.domain.User;
5 
6 public interface UserService extends DaoSupport<User>{
7 
8 }
UserService.java

2)UserServiceImpl.java

 1 package cn.clear.oa.service.impl;
 2 
 3 import org.springframework.stereotype.Service;
 4 
 5 import cn.clear.oa.base.DaoSupportImpl;
 6 import cn.clear.oa.domain.User;
 7 import cn.clear.oa.service.UserService;
 8 
 9 @Service
10 public class UserServiceImpl extends DaoSupportImpl<User> implements UserService{
11     
12 }
UserServiceImpl.java

3)在BaseAction.java中声明userService,如下:

@Resource

    protected UserService userService;

  3.写jsp页面:

    1)list.jsp:  

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
 2 
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5 <head>
 6     <title>用户列表</title>
 7     <%@ include file="/WEB-INF/jsp/public/commons.jspf" %>
 8 </head>
 9 <body>
10 
11 <div id="Title_bar">
12     <div id="Title_bar_Head"> 
13         <div id="Title_Head"></div>
14         <div id="Title"><!--页面标题-->
15             <img border="0" width="13" height="13" src="${pageContext.request.contextPath}/style/images/title_arrow.gif"/> 用户管理
16         </div>
17         <div id="Title_End"></div>
18     </div>
19 </div>
20 
21 <div id="MainArea">
22     <table cellspacing="0" cellpadding="0" class="TableStyle">
23        
24         <!-- 表头-->
25         <thead>
26             <tr align=center valign=middle id=TableTitle>
27                 <td width="100">登录名</td>
28                 <td width="100">姓名</td>
29                 <td width="100">所属部门</td>
30                 <td width="200">岗位</td>
31                 <td>备注</td>
32                 <td>相关操作</td>
33             </tr>
34         </thead>
35         
36         <!--显示数据列表-->
37         <tbody id="TableData" class="dataContainer" datakey="userList">
38         <s:iterator value="#userList">
39             <tr class="TableDetail1 template">
40                 <td>${loginName}&nbsp;</td>
41                 <td>${name}&nbsp;</td>
42                 <td>${department.name}&nbsp;</td>
43                 <td>
44                     <s:iterator value="#roles">
45                         ${name} 
46                     </s:iterator>
47                     </td>
48                 <td>${description}&nbsp;</td>
49                 <td><s:a onClick="return confirm('确定删除该用户吗?')" action="user_delete?id=%{id}">删除</s:a>
50                     <s:a action="user_editUI?id=%{id}">修改</s:a>
51                     <s:a action="user_initPassword?id=%{id}" onClick="return confirm('您确定要初始化密码为1234吗?')">初始化密码</s:a>
52                 </td>
53             </tr>
54         </s:iterator>    
55         </tbody>
56     </table>
57     
58     <!-- 其他功能超链接 -->
59     <div id="TableTail">
60         <div id="TableTail_inside">
61             <s:a action="user_addUI"><img src="${pageContext.request.contextPath}/style/images/createNew.png" /></s:a>
62         </div>
63     </div>
64 </div>
65 
66 </body>
67 </html>
list.jsp

    2)saveUI.jsp:

  1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
  2 
  3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4 
  5 <html>
  6 <head>
  7     <title>用户信息</title>
  8     <%@ include file="/WEB-INF/jsp/public/commons.jspf" %>
  9 </head>
 10 <body>
 11 
 12 <!-- 标题显示 -->
 13 <div id="Title_bar">
 14     <div id="Title_bar_Head">
 15         <div id="Title_Head"></div>
 16         <div id="Title"><!--页面标题-->
 17             <img border="0" width="13" height="13" src="${pageContext.request.contextPath}/style/images/title_arrow.gif"/> 用户信息
 18         </div>
 19         <div id="Title_End"></div>
 20     </div>
 21 </div>
 22 
 23 <!--显示表单内容-->
 24 <div id=MainArea>
 25     <s:form action="user_%{id == null ? 'add':'edit' }">
 26         <div class="ItemBlock_Title1"><!-- 信息说明 --><div class="ItemBlock_Title1">
 27             <img border="0" width="4" height="7" src="${pageContext.request.contextPath}/style/blue/images/item_point.gif" /> 用户信息 </div> 
 28         </div>
 29         <!-- 表单内容显示 -->
 30         <s:hidden name="id"></s:hidden>
 31         <div class="ItemBlockBorder">
 32             <div class="ItemBlock">
 33                 <table cellpadding="0" cellspacing="0" class="mainForm">
 34                     <tr><td width="100">所属部门</td>
 35                         <td><s:select name="departmentId" list="#departmentList" cssClass="SelectStyle" listKey="id" listValue="name"
 36                         headerKey="" headerValue="==请选择部门=="></s:select>
 37                         </td>
 38                     </tr>
 39                     <tr><td>登录名</td>
 40                         <td><s:textfield name="loginName" cssClass="InputStyle"></s:textfield> *
 41                             (登录名要唯一)
 42                         </td>
 43                     </tr>
 44                     <tr><td>姓名</td>
 45                         <td><s:textfield name="name" cssClass="InputStyle"/> *</td>
 46                     </tr>
 47                     <tr><td>性别</td>
 48                         <td>
 49                             <s:radio name="gender" list="{'男','女'}">
 50                             </s:radio>
 51                         </td>
 52                     </tr>
 53                     <tr><td>联系电话</td>
 54                         <td><s:textfield name="phoneNumber" cssClass="InputStyle"/></td>
 55                     </tr>
 56                     <tr><td>E-mail</td>
 57                         <td><s:textfield name="email" cssClass="InputStyle"/></td>
 58                     </tr>
 59                     <tr><td>备注</td>
 60                         <td><s:textarea name="description" cssClass="TextareaStyle"></s:textarea></td>
 61                     </tr>
 62                 </table>
 63             </div>
 64         </div>
 65         
 66         <div class="ItemBlock_Title1"><!-- 信息说明 --><div class="ItemBlock_Title1">
 67             <img border="0" width="4" height="7" src="${pageContext.request.contextPath}/style/blue/images/item_point.gif" /> 岗位设置 </div> 
 68         </div>
 69         
 70         <!-- 表单内容显示 -->
 71         <div class="ItemBlockBorder">
 72             <div class="ItemBlock">
 73                 <table cellpadding="0" cellspacing="0" class="mainForm">
 74                     <tr>
 75                         <td width="100">岗位</td>
 76                         <td><s:select name="roleIds" multiple="true" size="10"
 77                          list="#roleList" cssClass="SelectStyle" listKey="id" listValue="name"></s:select>
 78                             按住Ctrl键可以多选或取消选择
 79                         </td>
 80                     </tr>
 81                 </table>
 82             </div>
 83         </div>        
 84         
 85         <!-- 表单操作 -->
 86         <div id="InputDetailBar">
 87             <input type="image" src="${pageContext.request.contextPath}/style/images/save.png"/>
 88             <a href="javascript:history.go(-1);"><img src="${pageContext.request.contextPath}/style/images/goBack.png"/></a>
 89         </div>
 90     </s:form>
 91 </div>
 92 
 93 <div class="Description">
 94     说明:<br />
 95     1,用户的登录名要唯一,在填写时要同时检测是否可用。<br />
 96     2,新建用户后,密码被初始化为"1234"。<br />
 97     3,密码在数据库中存储的是MD5摘要(不是存储明文密码)。<br />
 98     4,用户登录系统后可以使用“个人设置→修改密码”功能修改密码。<br />
 99     5,新建用户后,会自动指定默认的头像。用户可以使用“个人设置→个人信息”功能修改自已的头像<br />
100     6,修改用户信息时,登录名不可修改。
101 </div>
102 
103 </body>
104 </html>
saveUI.jsp

3)在测试时发现roles显示有问题,经检查在外面之前写代码时发现问题,问题是在DaoSupportImpl.java中findByIds()方法这句:

return getSession().createQuery(//

    "FROM "+clazz.getSimpleName()+" WHERE id IN(:ids)")//

    .setParameter("ids", ids)//

    .list()setParameter有误,因为是集合所以修改后为:

return getSession().createQuery(//

    "FROM "+clazz.getSimpleName()+" WHERE id IN(:ids)")//

    .setParameterList("ids", ids)//

    .list()

以上用户管理的基本实现,关于在saveUI页面下角的要求将在下节实现。

转载于:https://www.cnblogs.com/clear5/p/4057356.html

相关文章:

16-flutter-Swiper 插件的使用

Flutter-Swiper 插件的使用 1 在pubspec.ymal 中去导入插件 dependencies:flutter:sdk: flutter# The following adds the Cupertino Icons font to your application.# Use with the CupertinoIcons class for iOS style icons.cupertino_icons: ^0.1.2flutter_swiper: ^1.1…

NPOI导Excel样式设置

一、创建一个Excel //创建一个工作簿 XSSFWorkbook workbook new XSSFWorkbook(); //创建一个页 ISheet sheet workbook.CreateSheet("sheet1"); //创建一行 IRow row sheet.CreateRow(0); //创建一列 ICell ce…

谢尔盖.布林的早期思想_谷歌联合创始人谢尔盖·布林(Sergey Brin)谈人工智能与自动化...

谢尔盖.布林的早期思想Here are three links worth your time:这是三个值得您花费时间的链接&#xff1a; Google cofounder Sergey Brin talks about AI, automation, and the future of education (34 minute watch) Google联合创始人谢尔盖布林(Sergey Brin)谈论人工智能&a…

17-flutter导航栏渐变效果

MediaQuery.removePadding 移除顶部的 padding import package:flutter/material.dart; // 导入swiper 组件 import package:flutter_swiper/flutter_swiper.dart;const APPBAR_SCROLL_OFFSET 200; class HomePage extends StatefulWidget {// 重写Create State 方法override…

链表之逆转链表

链表之逆转链表 传入一个Node指针&#xff0c;将它指向的链表进行逆置&#xff0c;返回逆置后的新链表&#xff0c;注意操作过程中不要额外申请空间&#xff0c;即在传入的链表中进行节点逆置. 代码&#xff1a; Node * reverse_list(Node *head){Node * preNULL;Node * curhea…

如何使用Redux-saga和ReactDnD测试React和Redux(哇!)

by Gregory Beaver通过格雷戈里海狸 如何使用Redux-saga和ReactDnD测试React和Redux(哇&#xff01;) (How to test React and Redux with Redux-saga and ReactDnD (whew!)) 帮助程序和系统使测试更加容易 (Helpers and systems to make testing easier) This article is the…

18-flutter的Future和FutureBuilder

Future 表示接卸来某个时间的值或者错误&#xff0c;借助Future可以在flutter 总实现异步操作。 其本事是dart&#xff1a;async 包中的一个类&#xff0c;使用它的时候需要导入dart:async 包&#xff0c;Future 有两种状态。 pending 执行中completed 执行结束 &#xff0c…

js控制使div自动适应居中

一直都在想怎么样使弹出的DIV能在任何时候都是居中显示的&#xff0c;刚开始的时候是用CSS样式直接定义好层的位置&#xff0c;但是当页面很长的时候&#xff0c;或是浏览器窗口大小不是固定的时候就不能正确的显示&#xff0c;所以只好用JS来控制DIV的显示位置。首先再次详细解…

【poj3420】 Quad Tiling

http://poj.org/problem?id3420 (题目链接) 题意 给出$n*m$的网格&#xff0c;用$1*2$的方块覆盖有多少种方案。 Solution 数据很大&#xff0c;不能直接搞了&#xff0c;我们矩乘一下。0表示已放置&#xff0c;1表示未放置。dfs跑出一个$16*16$的转移矩阵&#xff0c;然后矩乘…

bokeh pandas_使用Pandas和Bokeh将Rolling Stone的500张最伟大专辑可视化

bokeh pandasby Gautham Koorma通过Gautham Koorma 使用Pandas和Bokeh将Rolling Stone的500张最伟大专辑可视化 (Rolling Stone’s 500 Greatest Albums Visualized Using Pandas and Bokeh) In 2003, Rolling Stones Magazine polled musicians, producers, and industry exe…

使用WinINet和WinHTTP实现Http訪问

使用WinINet和WinHTTP实现Http訪问 飘飘白云 l_zhaohui163.com 2007-11-30 Http訪问有两种方式&#xff0c;GET和POST&#xff0c;就编程来说GET方式相对简单点&#xff0c;它不用向server提交数据&#xff0c;在这个例程中我使用POST方式&#xff0c;提交数据value1与value2&a…

19-flutter的ListView 和 GridView的使用

ListView 的水平样式 和垂直样式 1 水平列表 import package:flutter/material.dart;const CITY_LIST ["北京","上海","广州","深圳","南京","郑州","武汉"];void main() > runApp(MyApp());clas…

linux下ndk编译命令行程序及配置

1.在http://developer.android.com/tools/sdk/ndk/index.html下载Android-ndk-r8e-linux-x86.tar.bz2&#xff0c;解压后把android-ndk-r8e添加到环境变量PATH中,例如&#xff0c; export PATH$PATH:/opt/studydisk/android-ndk-r8e 2.新建一个文件夹&#xff0c;如helloword&a…

vs2017数据可视化建模_介绍数据可视化社区调查2017

vs2017数据可视化建模by lars verspohl由拉斯韦斯波尔 介绍数据可视化社区调查2017 (Introducing the Data Visualization Community Survey 2017) Data visualization is a funny fish. It sort of stands on its own feet (or fins), but is also intimately entangled with…

20-flutter下拉刷新与上拉加载

1 RefreshIndicator 下拉刷新控件 下拉刷新的时候会回调 onRefresh 方法 RefreshIndicator(onRefresh: _handleRefresh,child: ListView(children: _buildList(),), ),2 上拉加载多 上拉加载更多的时候 override void initState() { super.initState();_scrollController.a…

PHP+redis实现超迷你全文检索

2014年10月31日 11:45:39 情景: 我们平台有好多游戏, 运营的同事在查询某一款游戏的时候, 目前使用的是html的select下拉列表的展现形式, 运营的同事得一个个去找,然后选中,耗时又费眼 效果: 输入"三国"或者"国三", 将自动列出所有包含"三国"的游…

Linux下的Shell编程(2)环境变量和局部变量

Shell Script是一种弱类型语言&#xff0c;使用变量的时候无需首先声明其类型。 局部变量在本地数据区分配内存进行存储&#xff0c;这个变量归当前的Shell所有&#xff0c;任何子进 程都不能访问本地变量。这些变量与环境变量不同&#xff0c;环境变量被存储在另一内存区&…

上拉电阻和下拉电阻_硬件基础:下拉电阻和上拉电阻如何工作

上拉电阻和下拉电阻by Taron Foxworth通过塔伦福克斯沃思(Taron Foxworth) 硬件基础&#xff1a;下拉电阻和上拉电阻如何工作 (Hardware fundamentals: how pull-down and pull-up resistors work) If you’ve ever wired up a button to an Arduino, you’ve come across thi…

时间序列学习笔记4

6. 重采样及频率转换 重采样&#xff08;resample&#xff09;表示将时间序列的频率进行转换的过程。可以分为降采样和升采样等。 pandas对象都有一个resample方法&#xff0c;可以进行频率转换。 In [5]: rng pd.date_range(1/1/2000, periods100, freqD)In [6]: ts Series(…

linux驱动编程入门实例

编辑 /*****hello.c*******/ #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init() { printk("<1>hello\n"); return 0; } static void hello…

iOS UIView快速添加事件

给UIView 做一个延展 // // UIViewSKTap.h // MeiGouYouPin // // Created by coder on 2019/10/29. // Copyright © 2019 AlexanderYeah. All rights reserved. // #import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN typedef void(^TapBlock)(void); interfac…

node.js中模块_在Node.js中需要模块:您需要知道的一切

node.js中模块by Samer Buna通过Samer Buna 在Node.js中需要模块&#xff1a;您需要知道的一切 (Requiring modules in Node.js: Everything you need to know) Update: This article is now part of my book “Node.js Beyond The Basics”.更新&#xff1a;这篇文章现在是我…

Sublime Text3配置Node.js开发环境

下载Nodejs插件&#xff0c;下载zip压缩包后解压链接: http://pan.baidu.com/s/1hsBk60k 密码: jrcv打开Sublime Text3&#xff0c;点击菜单“首选项&#xff08;N&#xff09;” >“浏览插件&#xff08;B&#xff09;”打开“Packages”文件夹&#xff0c;并将第1部的Node…

修改mysql的root密码

use msyql; update user set passwordpassword(新密码) where userroot; flush privileges; quitnet stop mysql #如果提示 发生系统错误5&#xff0c;就用管理员身份启动cmd.exe 转载于:https://www.cnblogs.com/walter371/p/4065904.html

iOS 开发之便捷宏定义

#define URL(A/*str*/) [NSURL URLWithString:A]// 图片 #define IMAGE(A/*str*/) [UIImage imageNamed:A]// 快速转换字符串 #define LD_STR(A/*str*/) [NSString stringWithFormat:"%ld",A] #define F2_STR(A/*str*/) [NSString stringWithFormat:"%.2f"…

rspec 测试页面元素_如何使用共享示例使您的RSpec测试干燥

rspec 测试页面元素by Parth Modi由Parth Modi 如何使用共享示例使您的RSpec测试干燥 (How to DRY out your RSpec Tests using Shared Examples) “Give me six hours to chop down a tree and I will spend the first four sharpening the axe.” — Abraham Lincoln“ 给我…

Windows搭建以太坊的私有链环境

Windows搭建以太坊的私有链环境 1、下载Geth.exe 运行文件&#xff0c;并安装https://github.com/ethereum/go-ethereum/releases/下载后&#xff0c;只有一个Geth.exe的文件2、cmd进入按章目录运行&#xff1a;geth -help看看是否可用geth命令3、在Geth安装目录下放置初始化创…

前50个斐波那契数

它有一个递推关系&#xff0c;f(1)1f(2)1f(n)f(n-1)f(n-2),其中n>23f(n)f(n2)f(n-2)-------------------------------------------- F(1) 1 F(2) 1 F(3) 2 F(4) 3 F(5) 5 F(6) 8 F(7) 13 F(8) 21 F(9) 34 F(10) 55 F(11) 89 F(12) 144 F(13) 233 F(14) 377 F(…

RAC -代替OC 中的代理

学以致用&#xff0c; 有的时候学习了很多理论 却还是忘了实践 OC 中代替代理 简洁编程 #import "ViewController.h" #import <ReactiveObjC.h> #import "SKView.h" interface ViewController ()endimplementation ViewController- (void)viewDidL…

深度学习 免费课程_深入学习深度学习,提供15项免费在线课程

深度学习 免费课程by David Venturi大卫文图里(David Venturi) 深入学习深度学习&#xff0c;提供15项免费在线课程 (Dive into Deep Learning with 15 free online courses) Every day brings new headlines for how deep learning is changing the world around us. A few e…