Java 全栈开发 ---Java ERP 系统开发:商业 ERP(七
[](()2、菜单动态前端的实现
[](()(1)修改 index.jsp 当中的内容
// 获取菜单数据
$.ajax({
url : 'menu_getMenuTree',
type : 'post',
dataType : 'json',
success : function(rtn) {
// 给菜单赋值
_menus = rtn;
InitLeftMenu();
}
});
测试运行运行成功
[](()三、密码加密
[](()1、添加 shiro 依赖
修改 erp_parent 下的 POM.xml 文件
[](()(1)定义 shiro 版本常量
<shiro.ver>1.2.3</shiro.ver>
[](()(2)加入 shiro 的依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.ver}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>${shiro.ver}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.ver}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-aspectj</artifactId>
<version>${shiro.ver}</version>
</dependency>
[](()(3)修改 EmpDao,创建 add 方法重写父类的 add,通过 super 的方式调用父类的 add
/*
新增员工
*/
public void add(Emp emp) {
String pwd = emp.getPwd();
// source : 原密码
// salt;盐-》搅乱码
// hashIterations:散列次数,加密次数
Md5Hash md5 = new Md5Hash(pwd, emp.getUsername(), 2);
// 取出加密后的密码
String newPwd = md5.toString();
System.out.println(newPwd);
//设置为加密后的密码
emp.setPwd(newPwd);
//保存倒数数据库当中
super.add(emp);//将
}
[](()2、登录密码的加密
[](()(1)在 EmpDao 当中,需要单独将加密的方法抽取出来
替换 add 方法当中的加密
[](()(2)在 EmpDao 当中,修改 findByUsernameAndPwd 方法来实现查询登录时加密
上面的方式虽然实现了功能但是密码的加密应该在业务层进行
抽取加密方法到业务层当中
将 empdao 当中所有的加密抽取到业务层
package com.itzheng.erp.dao.impl;
import java.util.List;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import com.itzheng.erp.dao.IEmpDao;
import com.itzheng.erp.entity.Emp;
/**
员工数据访问类
@author Administrator
*/
public class EmpDao extends BaseDao<Emp> implements IEmpDao {
/*
用户登录
*/
public Emp findByUsernameAndPwd(String username, String pwd) {
String hql = "from Emp where username = ? and pwd = ?";
System.out.println(pwd);
List<Emp> list = (List<Emp>) this.getHibernateTemplate().find(hql, username, pwd);// 通过向数据库访问的方式查询对应的内容是否符合
// 能够匹配上,侧返回第一个元素
if (list.size() > 0) {
return list.get(0);
}
// 如果登录名或密码不正确
return null;
}
/**
构建查询条件
*/
public DetachedCriteria getDetachedCriteria(Emp emp1, Emp emp2, Object param) {
DetachedCriteria dc = DetachedCriteria.forClass(Emp.class);
if (emp1 != null) {
if (emp1.getUsername() != null && emp1.getUsername().trim().length() > 0) {
dc.add(Restrictions.like("username", emp1.getUsername(), MatchMode.ANYWHERE));
}
if (emp1.getPwd() != null && emp1.getPwd().trim().length() > 0) {
dc.add(Restrictions.like("pwd", emp1.getPwd(), MatchMode.ANYWHERE));
}
if (emp1.getName() != null && emp1.getName().trim().length() > 0) {
dc.add(Restrictions.like("name", emp1.getName(), MatchMode.ANYWHERE));
}
if (emp1.getEmail() != null && emp1.getEmail().trim().length() > 0) {
dc.add(Restrictions.like("email", emp1.getEmail(), MatchMode.ANYWHERE));
}
if (emp1.getTele() != null && emp1.getTele().trim().length() > 0) {
dc.add(Restrictions.like("tele", emp1.getTele(), MatchMode.ANYWHERE));
}
if (emp1.getAddress() != null && emp1.getAddress().trim().length() > 0) {
dc.add(Restrictions.like("address", emp1.getAddress(), MatchMode.ANYWHERE));
}
// 根据部门查询
if (null != emp1.getDep() && null != emp1.getDep().getUuid()) {
dc.add(Restrictions.eq("dep", emp1.getDep()));
}
// 根据出生年月日查询,其实日期
if (null != emp1.getBirthday()) {
dc.add(Restrictions.ge("birthday", emp1.getBirthday()));
}
}
if (null != emp2) {
// 根据出生年月日查询,结束日期
if (null != emp2.getBirthday()) {
dc.add(Restrictions.le("birthday", emp2.getBirthday()));
}
}
return dc;
}
//修改密码
@Override
public void updatePwd(Long uuid, String newPwd) {
String hql = "update Emp set pwd = ? where uuid = ?";
this.getHibernateTemplate().bulkUpdate(hql, newPwd,uuid);
}
}
[](()四、修改密码
[](()(一)后端的实现
[](()1、修改 IEmpDao 接口
void updatePwd(Long uuid, String newPwd);
[](()2、对应的实现类
//修改密码
@Override
public void updatePwd(Long uuid, String newPwd) {
String hql = "update Emp set pwd = ? where uuid = ?";
this.getHibernateTemplate().bulkUpdate(hql, newPwd,uuid);
}
[](()3、在 IEmpBiz 当中设置对应的接口
public void updatePwd(Long uuid, String oldPwd, String newPwd);
[](()4、在 com.itzheng.erp.exception 下创建 ErpException 并继承 RuntimeException (自定义异常类型)
package com.itzheng.erp.exception;
public class ErpException extends RuntimeException {
public ErpException(String message) {
super(message);
}
}
[](()5、在实现类 EmpBiz 当中
@Override
public void updatePwd(Long uuid, String oldPwd, String newPwd) {
// 取出员工信息
Emp emp = empDao.get(uuid);
// 加密旧密码
String encrypted = encrypt(oldPwd, emp.getUsername());
if (!encrypted.equals(emp.getPwd())) {
// 抛出自定义异常
throw new ErpException("旧密码不正确");
}
newPwd = encrypt(newPwd, emp.getUsername());
// 如果相同就更新对应的密码
empDao.updatePwd(uuid, newPwd);
}
[](()6、修改 BaseActopn
/*
获取登录的用户信息
*/
public Emp getLoginUser() {
Emp emp = (Emp) ActionContext.getContext().getSession().get("loginUser");
return emp;
}
[](()7、在 EmpAction 当中
// 修改密码调用的方法
// 修改密码调用的方法
public void updatePwd() {
Emp loginUser = getLoginUser();
System.out.println(loginUser);
if (null == loginUser) {
write(ajaxReturn(false, "亲!你还没有登录"));
return;
}
try {
empBiz.updatePwd(loginUser.getUuid(), oldPwd, newPwd);
write(ajaxReturn(true, "修改密码成功"));
} catch (Exception e) {
e.printStackTrace();
write(ajaxReturn(false, "修改密码失败"));
}
}
[](()(二)前端的实现
[](()1、修改 index.html
<div id="w" class="easyui-dialog">
<div class="easyui-layout" fit="true">
<div region="center" border="false"
style="padding: 10px; background: #fff;">
<table cellpadding=3>
<tr>
<td>旧密码:</td>
<td><input id="txtOldPass" type="password" class="txt01" /></td>
</tr>
<tr>
<td>新密码:</td>
<td><input id="txtNewPass" type="password" class="txt01" /></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input id="txtRePass" type="password" class="txt01" /></td>
</tr>
</table>
</div>
</div>
</div>
[](()2、修改 index.js 当中的内容
$.ajax({
url : 'emp_updatePwd',
data : {
'oldPwd' : oldPwd,
'newPwd' : newPwd
},
dataType : 'json',
type : 'post',
success : function(rtn) {
$.messager.alert('提示', rtn.message, 'info', function() {
if (rtn.success) {
$('#w').dialog('close');
//清空内容
$('#txtOldPass').val('');
$('#txtNewPass').val('');
$('#txtRePass').val('');
}
});
}
});
[](()3、测试修改密码
[](()五、管理员重置密码
[](()(一)后端的实现
[](()1、在业务层的接口当中创建对应的接口
[](()2、在对应的实现类当中实现
[](()3、在 EmpAction 当中
[](()(二)前端的实现
[](()1、创建 pwd.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>员工管理</title>
<link rel="stylesheet" type="text/css" href="ui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="ui/themes/icon.css">
<script type="text/javascript" src="ui/jquery.min.js"></script>
<script type="text/javascript" src="ui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="ui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="ui/jquery.serializejson.min.js"></script>
<script type="text/javascript" src="js/crud.js"></script>
<script type="text/javascript" src="ui/date.js"></script>
<script type="text/javascript">
var name="emp";
var height = 300;
var width = 300;
var columns=[[
{field:'uuid',title:'编号',width:100},
{field:'username',title:'登陆名',width:100},
{field:'name',title:'真实姓名',width:100},
{field:'gender',title:'性别',width:100,formatter:function(value,row,index){
if(1 == value * 1 ){
return '男';
}
if(0 == value * 1){
return '女';
}
} },
{field:'email',title:'邮件地址',width:100},
{field:'tele',title:'联系电话',width:100},
{field:'address',title:'联系地址',width:100},
{field:'birthday',title:'出生年月日',width:100,formatter:function(value){
return new Date(value).Format("yyyy-MM-dd");
} },
{field:'dep',title:'部门编号',width:100,formatter:function(value){
return value.name;
} },
{field:'-',title:'操作',width:200,formatter:function(value,row,index)
{
return "<a href='#' οnclick='edit("+row.uuid+")'>修改</a> <a href='#' οnclick='dele("+row.uuid+")'>删除</a>";
}}
]];
</script>
</head>
<body>
<div class="easyui-panel">
<form id="searchForm">
登陆名:<input name="t1.username" >
登陆密码:<input name="t1.pwd" >
真实姓名:<input name="t1.name" >
性别:<input name="t1.gender" type="radio" value="" >全部
<input name="t1.gender" type="radio" value="0" >女
<input name="t1.gender" type="radio" value="1" >男<br>
邮件地址:<input name="t1.email" >
联系电话:<input name="t1.tele" >
联系地址:<input name="t1.address" >
出生年月日:<input name="t1.birthday" class="easyui-datebox" editable="false" > -> <input name="t2.birthday" class="easyui-datebox" editable="false" >
部门:<input name="t1.dep.uuid" class="easyui-combobox" data-options="
url:'dep_list',textField:'name',valueField:'uuid'
" >
<button type="button" id="btnSearch">查询</button>
</form>
</div>
<table id="grid"></table>
<div id="editWindow" class="easyui-window" title="员工编辑" data-options="closed:true">
<form id="editForm">
<input name="t.uuid" type="hidden">
<table>
<tr>
<td>登陆名</td><td><input name="t.username" class="easyui-validatebox" data-options="
required:true,missingMessage:'登录名不能为空!'
">
</td>
</tr>
<tr>
<td>登陆密码</td><td><input name="t.pwd"> </td>
</tr>
<tr>
<td>真实姓名</td><td><input name="t.name"> </td>
</tr>
<tr>
<td>性别</td>
<td>
<input name="t.gender" type="radio" value="0" > 女
<input name="t.gender" type="radio" value="1" > 男
</td>
</tr>
<tr>
<td>邮件地址</td><td><input name="t.email" class="easyui-validatebox" data-options="
required:true,validType:'email',invalidMessage:'Email 格式不正确'
"> </td>
</tr>
<tr>
<td>联系电话</td><td><input name="t.tele"> </td>
</tr>
<tr>
<td>联系地址</td><td><input name="t.address"> </td>
</tr>
<tr>
<td>出生年月日</td><td><input name="t.birthday" class="easyui-datebox" editable="false" > </td>
</tr>
<tr>
<td>部门</td><td><input name="t.dep.uuid" class="easyui-combobox" data-options="
url:'dep_list',textField:'name',valueField:'uuid',required:'true'
" > </td>
</tr>
</table>
<button id="btnSave" type="button">保存</button>
</form>
</div>
</body>
</html>
[](()2、创建 pwd.js
$(function(){
//加载表格数据
$('#grid').datagrid({
url:'emp_listByPage',
columns:[[
{field:'uuid',title:'编号',width:100},
{field:'username',title:'登陆名',width:100},
{field:'name',title:'真实姓名',width:100},
{field:'gender',title:'性别',width:100,formatter:function(value, row, index){
value = row.gender;
if(1 == value * 1){
return '男';
}
if(0 == value * 1){
return '女';
}
}},
{field:'email',title:'邮件地址',width:100},
{field:'tele',title:'联系电话',width:100},
{field:'address',title:'联系地址',width:100},
{field:'birthday',title:'出生年月日',width:100,formatter:function(value){
return new Date(value).Format("yyyy-MM-dd");
}},
{field:'dep',title:'部门编号',width:100,formatter:function(value){
return value.name;
}},
{field:'-',title:'操作',width:200,formatter: function(value,row,index){
var oper = "<a href="javascript:void(0)" οnclick="updatePwd_reset(" + row.uuid + ')">重置密码</a>';
return oper;
}}
]],
singleSelect: true,
pagination: true
});
//重置密码的窗口
$('#editDlg').dialog({
title: '重置密码',//窗口标题
width: 260,//窗口宽度
height: 120,//窗口高度
closed: true,//窗口是是否为关闭状态, true:表示关闭
modal: true,//模式窗口
iconCls: 'icon-save',
buttons: [
{
text: '保存',
iconCls: 'icon-save',
handler:function(){
var formdata = $('#editForm').serializeJSON();
$.ajax({
url: 'emp_updatePwd_reset',
data : formdata,
dataType: 'json',
type: 'post',
success:function(rtn){
$.messager.alert('提示',rtn.message,'info',function(){
if(rtn.success){
$('#editDlg').dialog('close');
}
});
}
});
}
}
]
});
});
//打开重置密码窗口
function updatePwd_reset(uuid){
$('#editDlg').dialog('open');
//清空表单
$('#editForm').form('clear');
//加载数据
$('#editForm').form('load',{id: uuid, newPwd:""});
}
[](()(三)访问前端页面
访问 pwd.html 点击重置密码
重新登录设置成功
[](()(四)设置初始密码
[](()1、修改 biz 层的 add 方法
String newPwd = encrypt(emp.getUsername(), emp.getUsername());
[](()2、修改 emp.html 当中的内容
[](()六、解决更新员工信息,密码丢失
修改用户信息后密码丢失
数据库当中密码丢失
使用 session 的持久化不更新 pwd 字段,Hbm.xml 里面加入 update=false 属性,不更新 pwd 字段
上面在更新密码订单时候是使用的 SQL 语句来更新的密码,设置该属性的时候在映射文件当中设置 update=false 属性后是不会影响 SQL 语句更新密码的方法的,所以在更新用户信息的时候设置该属性后就不会更新密码
[](()七、静态页面传参数
[](()1、在 emp_web 下的 ui 当中创建 request.js
var url=location.search;//获取?号后面的字符串
var Request = new Object();//创建 Object 对象
if(url.indexOf("?")!=-1)//判断是否后?号 有?号的时候
{
var str = url.substr(1);//截取字符串当中第 2 个后的字符串(不包括? 的字符串)
strs = str.split("&");//按照 &号分隔字符串,赋值给一个数组
for(var i=0;i<strs.length;i++)//遍历循环
{
//Request 类型的数组,的第分隔前面字符串部分按照=号分隔,
Request[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);
}
}
[](()2、在 supplier.html 当中引入 crud.js
[](()3、在 supplier.html 当中添加一些数据
[](()4、修改 crud.js
[](()5、修改 supplier.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>供应商管理</title>
<link rel="stylesheet" type="text/css" href="ui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="ui/themes/icon.css">
<script type="text/javascript" src="ui/jquery.min.js"></script>
<script type="text/javascript" src="ui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="ui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="ui/jquery.serializejson.min.js"></script>
<script type="text/javascript" src="ui/request.js"></script>
<script type="text/javascript" src="js/crud.js"></script>
<script type="text/javascript">
if(Request['type'] == 1){
document.title = "供应商管理";
listParam = "?t1.type=1";
}
if(Request['type'] == 2){
document.title = "客户管理";
listParam = "?t1.type=2";
}
var name="supplier";
var columns=[[
{field:'uuid',title:'编号',width:100},
{field:'name',title:'名称',width:100},
{field:'address',title:'联系地址',width:100},
{field:'contact',title:'联系人',width:100},
{field:'tele',title:'联系电话',width:100},
{field:'email',title:'邮件地址',width:100},
{
return "<a href='#' οnclick='edit("+row.uuid+")'>修改</a> <a href='#' οnclick='dele("+row.uuid+")'>删除</a>";
}}
]];
</script>
</head>
<body>
<div class="easyui-panel">
<form id="searchForm">
名称:<input name="t1.name" >
联系地址:<input name="t1.address" >
联系人:<input name="t1.contact" >
联系电话:<input name="t1.tele" >
邮件地址:<input name="t1.email" >
<button type="button" id="btnSearch">查询</button>
</form>
</div>
<table id="grid"></table>
<div id="editWindow" class="easyui-window" title="供应商编辑"
style="width: 320px;height: 250px" data-options="closed:true">
<form id="editForm">
<input name="t.uuid" type="hidden">
<table>
<tr>
<td>名称</td><td><input name="t.name"> </td>
</tr>
<tr>
<td>联系地址</td><td><input name="t.address"> </td>
</tr>
<tr>
<td>联系人</td><td><input name="t.contact"> </td>
</tr>
<tr>
<td>联系电话</td><td><input name="t.tele"> </td>
</tr>
<tr>
评论