转载请标明出处:https://blog.csdn.net/men_ma/article/details/106847165.
本文出自 不怕报错 就怕不报错的小猿猿 的博客
网上书城项目的注册、登录功能及按照权限登录功能(项目进度二)
前言
博主前面的博客中有关于网上书城这个项目的博客,今天我们接着上一篇的网上书城前端页面编写框架那篇博客继续,链接:网上书城项目的需求分析、数据库表设计及前端界面的编写.
现在我们来写登录注册功能,这是一个网站的开始,必不可少的部分,今天的登录功能要判断权限问题,为方便管理整个网上书城商城,权限则分为老板和门户(顾客),老板能够操作整个项目的功能,则用户只能操作自己的订单管理,所以这需要注意的一个梗,首先我们先来分析一下注册及登录的流程,博主以思维导图的方式讲解
1.实现目标效果
1.1 注册功能
1.2 登录功能(按权限区分)
去数据库表验证是否注册成功:
1.2.1 老板登录看到的菜单效果
1.2.2 门户(顾客)登录看到的菜单效果
2.实现登录的编码逻辑思路(还未分权限)
3.实现注册的编码逻辑思路
4.实现权限登录的逻辑思路
5.普通的登录注册代码实现
5.1 User实体类
package com.xiaoqing.entity;
public class User {
private long id;//id,标识列
private String name;//用户名:唯一键,登陆时使用
private String pwd;//密码
private int type;//用户类型:1 管理员 2 普通用户 注:管理员是直接添加到数据库的,注册时只能注册普通用户
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public User(long id, String name, String pwd, int type) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
this.type = type;
}
public User() {
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + ", type=" + type + "]";
}
}
5.2 UserDao
package com.xiaoqing.dao;
import java.sql.SQLException;
import java.util.List;
import javax.jws.soap.SOAPBinding.Use;
import com.xiaoqing.entity.Book;
import com.xiaoqing.entity.User;
import com.xiaoqing.util.BaseDao;
import com.xiaoqing.util.PageBean;
import com.xiaoqing.util.StringUtils;
public class UserDao extends BaseDao<User>{
/**
* 注册:增加方法
* @return
* @throws SQLException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws SecurityException
* @throws NoSuchFieldException
*/
public int addUser(User user) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, SQLException {
String sql="insert into t_easyui_user(name,pwd) values(?,?)";
return super.executeUpdate(sql, user, new String[] {"name","pwd"});
}
/**
* 登录:查询方法
* @param user
* @param pageBean
* @return
* @throws InstantiationException
* @throws IllegalAccessException
* @throws SQLException
*/
public List<User> login(User user,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
String sql="select * from t_easyui_user where true";
if(StringUtils.isNotBlank(user.getName())) {
sql+=" and name='"+user.getName()+"'";
}
if(StringUtils.isNotBlank(user.getPwd())) {
sql+=" and pwd='"+user.getPwd()+"'";
}
return super.executeQuery(sql, User.class,null);
}
}
5.3 UserAction处理业务逻辑类
package com.xiaoqing.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xiaoqing.dao.UserDao;
import com.xiaoqing.entity.Book;
import com.xiaoqing.entity.User;
import com.xiaoqing.frameWork.ActionSupport;
import com.xiaoqing.frameWork.ModelDriver;
import com.xiaoqing.util.PageBean;
public class UserAction extends ActionSupport implements ModelDriver<User>{
private UserDao ud=new UserDao();
private User user=new User();
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
public String login(HttpServletRequest req,HttpServletResponse resp) {
try {
User CustomerUser = this.ud.login(user,null).get(0);
if(CustomerUser==null) {
PrintWriter out = resp.getWriter();
out.print(11);
return "login";
}
req.getSession().setAttribute("CustomerUser", CustomerUser);
} catch (InstantiationException e) {
e.printStackTrace();
return "login";
} catch (IllegalAccessException e) {
e.printStackTrace();
return "login";
} catch (SQLException e) {
e.printStackTrace();
return "login";
} catch (IOException e) {
e.printStackTrace();
}
return "index";
}
public String register(HttpServletRequest req,HttpServletResponse resp) {
try {
this.ud.addUser(user);
} catch (NoSuchFieldException e) {
e.printStackTrace();
return "register";
} catch (SecurityException e) {
e.printStackTrace();
return "register";
} catch (IllegalArgumentException e) {
e.printStackTrace();
return "register";
} catch (IllegalAccessException e) {
e.printStackTrace();
return "register";
} catch (SQLException e) {
e.printStackTrace();
return "register";
}
return "login";
}
}
5.4 mvc.xml:配置结果码跳转相应的界面
<?xml version="1.0" encoding="UTF-8"?>
<config>
<!--permission:菜单及子菜单(左边类似树叶概念) -->
<action path="/permission" type="com.xiaoqing.web.PermissionAction">
<!-- <forward name="index" path="/index.jsp" redirect="false" /> -->
</action>
<!--menu:菜单 -->
<action path="/menu" type="com.xiaoqing.web.MenuAction">
<!-- <forward name="menu" path="/index.jsp" redirect="false" /> -->
</action>
<!--book:书籍 -->
<action path="/book" type="com.xiaoqing.web.BookAction">
<!-- <forward name="menu" path="/index.jsp" redirect="false" /> -->
</action>
<!--user:用户 -->
<action path="/user" type="com.xiaoqing.web.UserAction">
<!--false:如果需要提示密码错误这些就用false -->
<forward name="login" path="/login.jsp" redirect="false" />
<forward name="index" path="/index.jsp" redirect="false" />
<forward name="mainPag" path="/mainPag.jsp" redirect="false" />
<forward name="register" path="/register.jsp" redirect="false" />
</action>
<action path="/version" type="com.xiaoqing.web.User_Version2Action">
<!-- <forward name="menu" path="/index.jsp" redirect="false" /> -->
</action>
<!--category:书籍分类(下拉列表) -->
<action path="/category" type="com.xiaoqing.web.CategoryAction">
<!-- <forward name="menu" path="/index.jsp" redirect="false" /> -->
</action>
</config>
5.5 login.jsp登录界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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">
<!--全局样式 -->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/static/js/jquery-easyui-1.5.1/themes/default/easyui.css">
<!--定义图标 -->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/static/js/jquery-easyui-1.5.1/themes/icon.css">
<!--导入js -->
<script type="text/javascript" src="${pageContext.request.contextPath }/static/js/jquery-easyui-1.5.1/jquery.min.js"></script>
<!--组件库源码的js文件 -->
<script type="text/javascript" src="${pageContext.request.contextPath }/static/js/jquery-easyui-1.5.1/jquery.easyui.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/static/js/user.js"></script>
<!-- <link rel="stylesheet" type="text/css" href="css/bootstrap.css" /> -->
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="css/fg.css" />
<!--导入js -->
<script type="text/javascript" src="${pageContext.request.contextPath }/static/js/jquery-easyui-1.5.1/jquery.min.js"></script>
<title>网上书城登录</title>
<style>
.form-signin{
width: 400px;
/* 相对定位 :relative 绝对定位:absolute*/
position: relative;
top: 100px;
left: 50%;
margin-left: -200px;
}
</style>
</head>
<!--隐藏域:项目名 -->
<%-- <input type="hidden" id="ctx" value="${pageContext.request.contextPath }"> --%>
<body>
<form class="form-signin" action="${pageContext.request.contextPath }/user.action?methodName=login" method="post">
<div class="text-center mb-4">
<h1 class="h3 mb-3 font-weight-normal">用户登录</h1>
</div>
<div class="form-label-group">
<input type="text" id="name" name="name" class="form-control" placeholder="请输入用户名" required autofocus>
</div>
<div class="form-label-group">
<input type="password" id="pwd" name="pwd" class="form-control" placeholder="请输入密码" required>
</div>
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
<p class="mt-5 mb-3 text-muted text-center">© 2017-2020</p>
</form>
<!-- <script src="css/bootstrap.js" type="text/javascript" charset="utf-8"></script> -->
</body>
</html>
5.6 register注册界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>Insert title here</title>
<!-- <link rel="stylesheet" type="text/css" href="css/bootstrap.css" /> -->
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="css/fg.css" />
<!--导入js -->
<script type="text/javascript" src="${pageContext.request.contextPath }/static/js/jquery-easyui-1.5.1/jquery.min.js"></script>
<style>
.form-signin{
width: 400px;
/* 相对定位 :relative 绝对定位:absolute*/
position: relative;
top: 100px;
left: 50%;
margin-left: -200px;
}
</style>
</head>
<body>
<form class="form-signin" action="${pageContext.request.contextPath }/user.action?methodName=register" method="post">
<div class="text-center mb-4">
<h1 class="h3 mb-3 font-weight-normal">用户注册</h1>
</div>
<div class="form-label-group">
<input type="text" id="name" name="name" class="form-control" placeholder="请输入用户名" required autofocus>
</div>
<div class="form-label-group">
<input type="password" id="pwd" name="pwd" class="form-control" placeholder="请输入密码" required>
</div>
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">注册</button>
<p class="mt-5 mb-3 text-muted text-center">© 2017-2020</p>
</form>
</body>
</html>
6.按权限登录看到不同的菜单栏
6.1 权限中间表建立Role_Permission实体类
package com.xiaoqing.entity;
public class Role_Permission {
private long rid;
private long pid;
public long getRid() {
return rid;
}
public void setRid(long rid) {
this.rid = rid;
}
public long getPid() {
return pid;
}
public void setPid(long pid) {
this.pid = pid;
}
public Role_Permission(long rid, long pid) {
super();
this.rid = rid;
this.pid = pid;
}
public Role_Permission() {
super();
}
@Override
public String toString() {
return "Role_Permission [rid=" + rid + ", pid=" + pid + "]";
}
}
6.2 写Role_PermissionDao类:根据rid(角色编号)进行查询
package com.xiaoqing.dao;
import java.sql.SQLException;
import java.util.List;
import com.xiaoqing.entity.Role_Permission;
import com.xiaoqing.util.BaseDao;
import com.xiaoqing.util.PageBean;
public class Role_PermissionDao extends BaseDao<Role_Permission>{
public List<Role_Permission> list(Role_Permission role_Permission,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
String sql="select * from t_easyui_role_permission where true";
long rid = role_Permission.getRid();
if(rid!=0) {
sql+=" and rid="+rid;
}
return super.executeQuery(sql, Role_Permission.class, pageBean);
}
}
6.3 修改PermissionDao(根据pids(各菜单项的编号根据他查询不同的角色看到不同的菜单栏)进行查询):在原方法的基础上重载一个方法,参数不同
package com.xiaoqing.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xiaoqing.entity.Permission;
import com.xiaoqing.util.BaseDao;
import com.xiaoqing.util.BuildTree;
import com.xiaoqing.util.PageBean;
import com.xiaoqing.vo.TreeVo;
public class PermissionDao extends BaseDao<Permission> {
/**
* 直接从数据库获取到的数据
* @param permission
* @param pageBean
* @return
* @throws InstantiationException
* @throws IllegalAccessException
* @throws SQLException
*/
public List<Permission> list(Permission permission,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
String sql="select * from t_easyui_Permission ";
return super.executeQuery(sql, Permission.class, pageBean);
}
//重载list方法
public List<Permission> listPermission(String pids,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
String sql="select * from t_easyui_Permission where id in ("+pids+")";
return super.executeQuery(sql, Permission.class, pageBean);
}
// 方法二:代码少
// 得到数据节点,能够将数据库中的数据,体现父子结构
public List<TreeVo<Permission>> topNode(Permission permission,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
List<Permission> list = this.list(permission, pageBean);
List<TreeVo<Permission>> nodes=new ArrayList<TreeVo<Permission>>();
TreeVo treeVo=null;
for (Permission p : list) {
treeVo=new TreeVo<>();
treeVo.setId(p.getId()+"");
treeVo.setText(p.getName());
treeVo.setParentId(p.getPid()+"");
Map<String, Object> attributes=new HashMap<String, Object>();
attributes.put("self", p);
treeVo.setAttributes(attributes);
nodes.add(treeVo);
}
// 0 :可以指定哪个节点为父节点,选择自己想要的菜单
return BuildTree.buildList(nodes,"0");
}
public List<TreeVo<Permission>> topNodePermission(String pids,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
List<Permission> list = this.listPermission(pids, pageBean);
List<TreeVo<Permission>> nodes=new ArrayList<TreeVo<Permission>>();
TreeVo treeVo=null;
for (Permission p : list) {
treeVo=new TreeVo<>();
treeVo.setId(p.getId()+"");
treeVo.setText(p.getName());
treeVo.setParentId(p.getPid()+"");
Map<String, Object> attributes=new HashMap<String, Object>();
attributes.put("self", p);
treeVo.setAttributes(attributes);
nodes.add(treeVo);
}
// 0 :可以指定哪个节点为父节点,选择自己想要的菜单
return BuildTree.buildList(nodes,"0");
}
}
6.4 修改PermissionAction处理业务逻辑类(管理树形菜单)
package com.xiaoqing.web;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xiaoqing.dao.PermissionDao;
import com.xiaoqing.dao.Role_PermissionDao;
import com.xiaoqing.entity.Permission;
import com.xiaoqing.entity.Role_Permission;
import com.xiaoqing.entity.User;
import com.xiaoqing.frameWork.ActionSupport;
import com.xiaoqing.frameWork.DispatcherServlet;
import com.xiaoqing.frameWork.ModelDriver;
import com.xiaoqing.util.ResponseUtil;
import com.xiaoqing.vo.TreeVo;
public class PermissionAction extends ActionSupport implements ModelDriver<Permission>{
private PermissionDao pd=new PermissionDao();
private Permission permission=new Permission();
private Role_PermissionDao rpd=new Role_PermissionDao();
@Override
public Permission getModel() {
return permission;
}
public String menuTree(HttpServletRequest req,HttpServletResponse resp) {
try {
// TreeVo<Permission> topNode = this.pd.topNode(null, null);
// 放到一个容器里面 json格式数据
// List<TreeVo<Permission>> list=new ArrayList<TreeVo<Permission>>();
// list.add(topNode);
// 不管老板还是消费者都是看到所有的菜单
// 老板看老板的
// 消费者看消费者
// 获取当前用户
User CustomerUser = (User)req.getSession().getAttribute("CustomerUser");
Role_Permission rp=new Role_Permission();
rp.setRid(CustomerUser.getType());
List<Role_Permission> role_Permissions = this.rpd.list(rp, null);
// ,0,1,2,3,4,5......
StringBuilder pids=new StringBuilder();
for (Role_Permission r : role_Permissions) {
pids.append(",").append(r.getPid());
}
List<TreeVo<Permission>> topNodePermission = this.pd.topNodePermission(pids.substring(1), null);
// ResponseUtil.writeJson(resp, this.pd.topNode(null, null));
ResponseUtil.writeJson(resp,topNodePermission);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
// 结果码的配置就是为了,在mvc.xml中寻找到底是重定向还是转发
return null;
}
}
总结
博主下篇博客会发布后台的未上架、已上架、已下架功能,敬请期待!!!
有些功能已完成,一篇博客不能写太多,所以博主分批次写,不然很难消化
Thanks♪(・ω・)ノ