前言:
登录模块涉及到的功能在jsp的时候其实就已经有写到过了,这边就不做过多的讲解代码意思了。
管理员模块,这边主要是书籍管理模块,涉及到了最基础增删改查。
目录
一、登录模块
1、主要功能:
2、实现对象:
3、界面展示
4、代码:
二、书籍管理模块
1、主要功能:
2、界面展示:
3、代码:
一、登录模块
1、主要功能:
①七天免登陆
②记住密码
2、实现对象:
cookie,session
3、界面展示
4、代码:
UserDao.java
package com.dao; import com.entity.PO.UserPo; import com.zking.util.baseDao; public class UserDao extends baseDao{ public UserPo Login(UserPo u) throws Exception { String sql="select * from t_easyui_user where name = '"+u.getName()+"' and pwd = '"+u.getPwd()+"'"; return super.executeQuery(sql, UserPo.class, null).get(0); } }
UserAction.java
package com.web; import java.lang.reflect.Field; import java.net.URLEncoder; import javax.servlet.http.cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.dao.UserDao; import com.entity.DO.UserDo; import com.entity.PO.UserPo; import com.zking.framework.ActionSupport; import com.zking.framework.ModelDriver; import com.zking.util.Change; import com.zking.util.ResponseUtil; public class UserAction extends ActionSupport implements ModelDriver{ private UserDo userDo = new UserDo(); private UserPo userPo = new UserPo(); private UserDao ud = new UserDao(); @Override public UserDo getModel() { return userDo; } public void login(HttpServletRequest req, HttpServletResponse resp) { try { Change u = new Change(); userPo = (UserPo) u.change(userDo, x -> { UserPo po = null; try { po = UserPo.class.newInstance(); Field[] fs = po.getClass().getDeclaredFields(); for (Field f : fs) { f.setAccessible(true); Field ff = userDo.getClass().getDeclaredField(f.getName()); ff.setAccessible(true); f.set(po, ff.get(userDo)); } } catch (Exception e) { e.printStackTrace(); } return po; }); UserPo user = ud.Login(userPo); boolean bremember = "true".equals(userDo.getRememberPwd()); boolean bseven = "true".equals(userDo.getSevenLogin()); if(user != null) {//如果账号验证成功 if(bremember || bseven) { cookie name = new cookie("name", URLEncoder.encode(userDo.getName(), "utf-8")); cookie pwd = new cookie("pwd", URLEncoder.encode(userDo.getPwd(), "utf-8")); name.setMaxAge(60 * 60 * 24 * 7); pwd.setMaxAge(60 * 60 * 24 * 7); resp.addcookie(name); resp.addcookie(pwd); System.out.println("cook1"); } if(bseven) { //如果勾选了七天免登陆 cookie seven = new cookie("seven", URLEncoder.encode("true", "utf-8")); seven.setMaxAge(60 * 60 * 24 * 7); resp.addcookie(seven); System.out.println("cook2"); } if(bremember) { //如果勾选了记住密码 cookie remember = new cookie("remember", URLEncoder.encode("true", "utf-8")); remember.setMaxAge(60 * 60 * 24 * 7); resp.addcookie(remember); System.out.println("cook3"); }else { cookie remember = new cookie("remember", URLEncoder.encode("false", "utf-8")); remember.setMaxAge(0); resp.addcookie(remember); } req.getSession().setAttribute("user", userPo); }else { ResponseUtil.writeJson(resp, 0); } ResponseUtil.writeJson(resp, user.getType()); } catch (Exception e) { e.printStackTrace(); } } }
Change.java
package com.zking.util;
import java.util.function.Function;
public class Change {
public Object change(Object t,Function f) throws Exception {
return f.apply(t);
}
}
UserPo.java
package com.entity.PO;
public class UserPo {
private long id;
private String name;
private String pwd;
private int type;
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 UserPo(long id, String name, String pwd, int type) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
this.type = type;
}
public UserPo() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + ", type=" + type + "]";
}
}
登录模块使用的是无刷新写法,前端接收响应码决定跳转的界面。
Login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="common.jsp"%>登录界面
Login.js
function login(){
$.ajax({
url : "user.action?methodName=login",
type : "post",
dataType : "json",
data: {
name : $("#name").val(),
pwd : $("#pwd").val(),
sevenLogin : $("#sevenLogin")[0].checked,
rememberPwd : $("#rememberPwd")[0].checked
},
success : function(msg) {
if(msg == '0'){
layer.msg('密码错误!请重试!')
}else if(msg == '1'){//用户
layer.msg('欢迎光临!')
location.href='index.jsp';
}else{//管理员
layer.msg('欢迎光临!')
location.href='admin.jsp';
}
}
})
}
你们可能会发现一个问题,如果涉及到的角色多了,那么这里就会造成代码臃肿,写法是不太准确的!
这里我会设计一张表,专门存储不通过角色用户跳转的页面路径,在加载登录界面时就将该表的数据读取出来然后存储到js中定义的map集合之中,那么登录成功回调就根据响应码获取都对应路径。
二、书籍管理模块 1、主要功能:
①上架书籍
②下架书籍
③关键字搜索
④修改书籍
⑤新增书籍
2、界面展示:
修改
3、代码:
BookDao.java
package com.dao; import java.util.List; import com.entity.PO.Book; import com.zking.util.baseDao; import com.zking.util.PageBean; import com.zking.util.StringUtils; public class BookDao extends baseDao{ public void add(Book b) throws Exception { String sql="insert into t_easyui_book(name,pinyin,cid,author,price,image,publishing,description,deployTime) values(?,?,?,?,?,?,?,?,?)"; String[] attrs = new String[] {"name","pinyin","cid","author","price","image","publishing","description","deployTime"}; super.executeUpdate(sql, b, attrs); } public void upd(Book b) throws Exception { String sql="update t_easyui_book set name=?,pinyin=?,cid=?,author=?,price=?,image=?,publishing=?,description=?,deployTime=? where id="+b.getId(); String[] attrs = new String[] {"name","pinyin","cid","author","price","image","publishing","description","deployTime"}; super.executeUpdate(sql, b, attrs); } }
BookVoDao.java
package com.dao; import java.util.List; import com.entity.VO.BookVo; import com.zking.util.baseDao; import com.zking.util.PageBean; import com.zking.util.StringUtils; public class BookVoDao extends baseDao{ public List list(BookVo b,PageBean p) throws Exception{ String sql="select b.*,c.name cname from t_easyui_book b,t_easyui_category c where b.cid = c.id"; if(StringUtils.isNotBlank(b.getName())) { System.out.println(b.getName()); sql+=" and b.name like '%"+b.getName()+"%'"; } if(b.getState() != 0) { sql+=" and b.state = "+b.getState(); } return super.executeQuery(sql, BookVo.class, p); } public void updState(BookVo b) throws Exception { String sql="update t_easyui_book set state="+b.getState()+" where id ="+b.getId(); super.executeUpdate(sql, b, null); } }
为什么查询是在BookVoDao中?
数据表格需要显示的数据不仅仅是一张表格需要展示的数据!这里需要用的连表查询。仅仅是实体类是不能满足数据表格显示需求,所以有一个BookVo实体类来满足前端显示。
admin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="common.jsp"%>后台管理 书城后台管理
- 控制台
- 商品管理
- 用户
- 其它系统
- 贤心
- 基本资料
- 安全设置
- 退了
admin.js
var html = '';
$(function() {
layui.use([ 'tree', 'element', 'jquery' ],function() {
var tree = layui.tree;
var element = layui.element;
var $ = layui.jquery;
var url = $('#ctx').val();
$.ajax({
type : 'post',
url : url + '/menu.action?methodName=tree',
dataType : 'json',
async : true,
success : function(data) {
tree.render({
elem : '#bookMenu',
data: data,
click : function(node) {
var exist = $("li[lay-id='"+ node.data.id +"']").length;
if (exist > 0) {
element.tabChange('tabs',node.data.id);// 切换到已有的选项卡
} else if (node.data.menuURL != null && node.data.menuURL != "") {
element.tabAdd('tabs',{
title : node.data.title,
content : '',// 支持传入html
id : node.data.id
});
element.tabChange('tabs',node.data.id);
}
}
})
}
});
})
})
function Buildtree(obj) {
var a = 1;
$.each(obj, function(i, n) {
var url = n.menuURL
if (n.hasParent == false) {
html += '- '; Buildtree(n.children); html += '
右侧数点击会打开一个内嵌页面,对应js代码如下
listBook1.js
var URL = $('#ctx').val();
var OpenId;
var table;
var $;
var form;
var bookTypeval;
layui.use([ 'table', 'jquery', 'form' ], function() {
table = layui.table;
$ = layui.jquery;
form = layui.form;
$(function() {
table.render({
elem : '#listBook1',
height : 315,
tool : 'true',
url : URL + '/bookvo.action?methodName=list&state=1' // 数据接口
,
page : true // 开启分页
,
cols : [ [ // 表头
{
checkbox : 'true'
}, {
field : 'id',
title : 'ID',
width : 100,
sort : true,
}, {
field : 'name',
title : '书籍名',
width : 100
}, {
field : 'pinyin',
title : '拼音',
width : 100,
sort : true
}, {
field : 'cname',
title : '书籍类别',
width : 100
}, {
field : 'author',
title : '作者',
width : 100
}, {
field : 'price',
title : '价格',
width : 100,
sort : true
}, {
field : 'image',
title : '图片路径',
width : 120,
sort : true
}, {
field : 'publishing',
title : '出版社',
width : 120
}, {
field : 'sales',
title : '销量',
width : 100,
sort : true
}, {
title : '操作',
align : 'center',
toolbar : '#barDemo',
fixed : 'right'
} ] ]
});
var html = '';
$.ajax({
url : URL + '/category.action?methodName=list',
type : 'post',
dataType : 'json',
async:false,
success : function(msg) {
$.each(msg, function(i, n) {
html += '';
});
}
})
$('#type').append(html);
form.render();
form.render('select');
})
table.on('tool(listBook1)', function(obj) {
var book = obj.data; // 获得当前行数据
var layEvent = obj.event; // 获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
if (layEvent === 'sj') {
$.ajax({
type : 'post',
dataType : 'json',
url : URL + '/bookvo.action?methodName=updState&state=2&id='
+ book.id,
success : function(msg) {
if (msg == '1') {
layer.msg('上架成功')
table.reload('listBook1');
}
}
})
}else if(layEvent == 'upd'){
$('#kind').val('upd')
var ts = $('#type option')
console.log(ts)
$.each(ts, function(i, n) {
if(n.text == book.cname){
n.selected = true;
bookTypeval = n.value;
}
});
$('#bookId').val(book.id)
$('#name').val(book.name)
$('#description').val(book.description)
$('#publishing').val(book.publishing)
$('#price').val(book.price)
$('#type').val(book.cname)
$('#author').val(book.author)
openx('');
}
});
form.on('select(bookType)', function(data) {
bookTypeval = data.value
});
form.on('submit(form1)', function(data) {
var k = $('#kind').val()
var url;
if (k == 'add') {
url = URL + '/book.action?methodName=add&description='+$('#description').val()+'&publishing='+$('#publishing').val()+'&price='+$('#price').val()+'&cid='+bookTypeval+'&name='+$('#name').val()+'&author='+$('#author').val();
} else {
url = URL + '/book.action?methodName=upd&id='+$('#bookId').val()+'&description='+$('#description').val()+'&publishing='+$('#publishing').val()+'&price='+$('#price').val()+'&cid='+bookTypeval+'&name='+$('#name').val()+'&author='+$('#author').val();
}
$.ajax({
type : 'post',
url : url,
dataType : 'json',
success : function(msg) {
if (msg == '1') {
if(k == 'add'){
layer.msg('增加成功')
}else{
layer.msg('修改成功')
}
clear();
layer.close(OpenId);
table.reload('listBook1');
}
}
})
return false;
});
})
function seachByName() {
table.reload('listBook1', {
url : URL + '/bookvo.action?methodName=list&state=1',
where : {
name : $('#bookName').val()
}
});
}
function openx(id) {
if(id == '1'){
$('#kind').val('add')
console.log(1)
}
layer.open({
type : 1,
content : $('#caozuo'),
success : function(layero, index) {
OpenId = index;
},
cancel : function(index, layero) {
if (confirm('确定要关闭么')) { // 只有当点击/confirm/i框的确定时,该层才会关闭
layer.close(index);
clear();
}
return false;
}
});
}
function clear() {
$("#f input,textarea").val('')
}



