Java全栈开发---Java ERP系统开发:商业ERP(七)登录与密码管理
发布日期:2021-06-29 15:02:57 浏览次数:2 分类:技术文章

本文共 14982 字,大约阅读时间需要 49 分钟。

登录与密码管理

一、登录与退出

(一)页面的创建于修改

1、管理主界面的构建

(1)在网上找一个后台管理的模板(拷贝到webapp的目录下面)

点击这里下载:

在这里插入图片描述
在这里插入图片描述

(2)访问主界面

在这里插入图片描述

2、登录主界面的构建

(1)在网上找一个后台管理的模板(拷贝到webapp的目录下面)

点击这里下载:

在这里插入图片描述

(2)访问登录界面

在这里插入图片描述

3、修改login.html

在这里插入图片描述

(二)DAO层的实现

1、在接口当中创建对应登录的方法

在这里插入图片描述

2、在实现类当中实现接口的方法,查询对应用户名以及返回对应

在这里插入图片描述

/** 用户登录*/public Emp findByUsernameAndPwd(String username, String pwd) {
String hql = "from Emp where username = ? and pwd = ?"; List
list = (List
) this.getHibernateTemplate().find(hql, username, pwd);//通过向数据库访问的方式查询对应的内容是否符合 //能够匹配上,侧返回第一个元素 if (list.size() > 0) {
return list.get(0); } //如果登录名或密码不正确 return null;}

(三)业务层的实现

1、在IEmpBiz接口当中

在这里插入图片描述

Emp findByUsernameAndPwd(String username, String pwd);

2、EmpBiz实现类当中

在这里插入图片描述

@Overridepublic Emp findByUsernameAndPwd(String username, String pwd) {
return empDao.findByUsernameAndPwd(username, pwd);}

(四)Action层的实现

1、在erp_web下面创建一个LoginAction :登录的时候单独创建一个Action

package com.itzheng.erp.action;import java.io.IOException;import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.ServletActionContext;import com.alibaba.fastjson.JSON;import com.itzheng.erp.biz.IEmpBiz;import com.itzheng.erp.biz.impl.EmpBiz;import com.itzheng.erp.entity.Emp;import com.opensymphony.xwork2.ActionContext;//登录的时候在创建一个Action public class LoginAction {
private String username;// 登录用户名 private String pwd;// 输入的密码 private IEmpBiz empBiz; public IEmpBiz getEmpBiz() {
return empBiz; } public void setEmpBiz(IEmpBiz empBiz) {
this.empBiz = empBiz; } public String getUsername() {
return username; } public void setUsername(String username) {
this.username = username; } public String getPwd() {
return pwd; } public void setPwd(String pwd) {
this.pwd = pwd; } public void checkUser() {
// 查询是否存在 Emp loginUser = empBiz.findByUsernameAndPwd(username, pwd); if (loginUser != null) {
//记录当前登录的用户 ActionContext.getContext().getSession().put("loginUser", loginUser); ajaxReturn(true, "用户名或密码正确"); } else {
ajaxReturn(false, "用户名或密码不正确"); } } public void ajaxReturn(boolean success, String message) {
Map map = new HashMap(); map.put("success", success); map.put("message", message); write(JSON.toJSONString(map)); } public void write(String jsonString) {
HttpServletResponse response = ServletActionContext.getResponse(); response.setCharacterEncoding("UTF-8"); try {
response.getWriter().print(jsonString); } catch (IOException e) {
// TODO Auto-generated catch block e.printStackTrace(); } }}

2、配置对应的Action

(1)在struts.xml当中配置

在这里插入图片描述

(2)applicationContext_action.xml

在这里插入图片描述

3、运行项目在浏览器上面测试

在这里插入图片描述

(五)登录功能前端的实现

1、在login.html当中引入easyUI的依赖

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、在login.html当中设置对应的属性

Zeo·ERP企业资源管理系统

3、在业务层处理异常信息

在这里插入图片描述

4、登录功能的实现以及测试

访问登录页面http://localhost:8080/erp/login.html

在这里插入图片描述
访问成功
在这里插入图片描述

(六)显示用户登录名

1、action的修改

增加showName方法

在这里插入图片描述

/** 显示登录用户 */	public void showName() {
// 获取当前登录的用户 Emp emp = (Emp) ActionContext.getContext().getSession().get("loginUser");// 先把用户的信息放到session当中 // session是否会超时,用户是否登录过 if (null != emp) {
ajaxReturn(true, emp.getName()); }else {
ajaxReturn(false, ""); } }

2、前端页面的实现

(1)修改index.html页面当中的内容

在这里插入图片描述

欢迎:   修改密码 安全退出
(2)修改index.jsp页面当中的内容

在这里插入图片描述

$(function(){
//显示登录用户名 showName(); InitLeftMenu(); tabClose(); tabCloseEven();})/* * 显示登录用户名 */function showName(){
$.ajax({
url:'login_showName', dataType:'json', type:'post', success:function(rtn){
//判断是否存在用户登录用户 if(rtn.success){
$('#username').html(rtn.name); }else{
location.href="login.html"; } } });}

(七)退出登录

1、修改LoginAction:增加loginOut方法

在这里插入图片描述

/** 退出登录 */	public void loginOut() {
ActionContext.getContext().getSession().remove("loginUser"); }

2、修改index.jsp

在这里插入图片描述

$(function(){
//显示登陆用户名 showName(); tabClose(); tabCloseEven(); //安全退出登录 $('#loginOut').bind('click',function(){
$.ajax({
url:'login_loginOut', success:function(){
location.href="login.html"; } }); });})

测试退出登录

在这里插入图片描述
成功返回到了登录页面
在这里插入图片描述

二、主界面(菜单的动态读取)

1、菜单动态读取后端的实现

(1)修改Menu实体类

在这里插入图片描述

private List
menus; public List
getMenus() {
return menus; } public void setMenus(List
menus) {
this.menus = menus; }
(2)修改Menu实体类

在这里插入图片描述

(3)修改映射文件

在这里插入图片描述

(4)在IBaseDao当中get方法

在这里插入图片描述

(5)在BaseDao当中重载get方法

在这里插入图片描述

public T get(String id){
return getHibernateTemplate().get(entityClass, id); }
(6)在IBaseBiz接口当中

在这里插入图片描述

(7)在BaseBiz类当中

在这里插入图片描述

(8)在MenuAction当中添加一个方法

在这里插入图片描述

/* * 获取菜单数据 */public void getMenuTree() {
//通过获取主菜单,资关联就会带出旗下所有的菜单 System.out.println("==============="); Menu menu = menuBiz.get("0"); System.out.println(menu); write(JSON.toJSONString(menu));}

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版本常量

在这里插入图片描述

1.2.3
(2)加入shiro的依赖

在这里插入图片描述

org.apache.shiro
shiro-core
${
shiro.ver}
org.apache.shiro
shiro-web
${
shiro.ver}
org.apache.shiro
shiro-spring
${
shiro.ver}
org.apache.shiro
shiro-aspectj
${
shiro.ver}
(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
implements IEmpDao {
/* * 用户登录 */ public Emp findByUsernameAndPwd(String username, String pwd) {
String hql = "from Emp where username = ? and pwd = ?"; System.out.println(pwd); List
list = (List
) 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

在这里插入图片描述

旧密码:
新密码:
确认密码:

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

员工管理
登陆名:
登陆密码:
真实姓名:
性别:
全部
邮件地址:
联系电话:
联系地址:
出生年月日:
->
部门:
登陆名
登陆密码
真实姓名
性别
邮件地址
联系电话
联系地址
出生年月日
部门

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 = "重置密码'; 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

2、在supplier.html当中引入crud.js

在这里插入图片描述

3、在supplier.html当中添加一些数据

在这里插入图片描述

4、修改crud.js

在这里插入图片描述

5、修改supplier.html

供应商管理
名称:
联系地址:
联系人:
联系电话:
邮件地址:
名称
联系地址
联系人
联系电话
邮件地址

6、修改SupplierDao

在这里插入图片描述

7、实现在列表当中的类型选择,修改supplier.html

在这里插入图片描述

8、修改crud.js

在这里插入图片描述

9、在MENU插入数据

insert into menu values('103','供应商管理','icon-sys','supplier.html?type=1','100');insert into menu values('104','客户管理','icon-sys','supplier.html?type=2','100');

在这里插入图片描述

在这里插入图片描述

转载地址:https://code100.blog.csdn.net/article/details/109340663 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java全栈开发---Java ERP系统开发:商业ERP(八)采购申请
下一篇:Java全栈开发---Java ERP系统开发:商业ERP(六)商品功能的完善

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月08日 22时47分03秒