NutzBook - 增删改查都要有

NutzBook - 增删改查都要有

Tags: Nutz

摘要

NutzBook - 增删改查都要有

添加一个校验方法

protected String checkUser(User user, boolean create) {
        if (user == null) {
            return "空对象";
        }
        if (create) {
            if (Strings.isBlank(user.getName()) || Strings.isBlank(user.getPassword()))
                return "用户名/密码不能为空";
        } else {
            if (Strings.isBlank(user.getPassword()))
                return "密码不能为空";
        }
        String passwd = user.getPassword().trim();
        if (6 > passwd.length() || passwd.length() > 12) {
            return "密码长度错误";
        }
        user.setPassword(passwd);
        if (create) {
            int count = dao.count(User.class, Cnd.where("name", "=", user.getName()));
            if (count != 0) {
                return "用户名已经存在";
            }
        } else {
            if (user.getId() < 1) {
                return "用户Id非法";
            }
        }
        if (user.getName() != null)
            user.setName(user.getName().trim());
        return null;
    }

增删改查

  @At
    public Object add(@Param("..") User user) {
        NutMap re = new NutMap();
        String msg = checkUser(user, true);
        if (msg != null) {
            return re.setv("ok", false).setv("msg", msg);
        }
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        user = dao.insert(user);
        return re.setv("ok", true).setv("data", user);
    }

    @At
    public Object update(@Param("..") User user) {
        NutMap re = new NutMap();
        String msg = checkUser(user, false);
        if (msg != null) {
            return re.setv("ok", false).setv("msg", msg);
        }
        user.setName(null);// 不允许更新用户名
        user.setCreateTime(null);//也不允许更新创建时间
        user.setUpdateTime(new Date());// 设置正确的更新时间
        dao.updateIgnoreNull(user);// 真正更新的其实只有password和salt
        return re.setv("ok", true);
    }

    @At
    public Object delete(@Param("id") int id, @Attr("me") int me) {
        if (me == id) {
            return new NutMap().setv("ok", false).setv("msg", "不能删除当前用户!!");
        }
        dao.delete(User.class, id); // 再严谨一些的话,需要判断是否为>0
        return new NutMap().setv("ok", true);
    }


//    直接查询
//    http://127.0.0.1:8080/nutzbook/user/query
//    带条件查询
//    http://127.0.0.1:8080/nutzbook/user/query?name=ad
//    带分页查询
//    http://127.0.0.1:8080/nutzbook/user/query?pageNumber=1&pageSize=2

    @At
    public Object query(@Param("name") String name, @Param("..") Pager pager) {
        Cnd cnd = Strings.isBlank(name) ? null : Cnd.where("name", "like", "%" + name + "%");
        QueryResult qr = new QueryResult();
        qr.setList(dao.query(User.class, cnd, pager));
        pager.setRecordCount(dao.count(User.class, cnd));
        qr.setPager(pager);
        return qr; //默认分页是第1页,每页20条
    }

加强安全性

UserModule添加一个注解,含义是,如果当前Session没有带me这个attr,就跳转到/页面,即首页.

@Filters(@By(type=CheckSession.class, args={"me", "/"}))

同时,为login方法设置为空的过滤器,不然就没法登陆了

@Filters()

页面中转方法

除了登陆页面 index.jsp 之外的其它页面都放在WEB-INF下的jsp文件夹。这样比较安全,因为WEB-INF下的文件是不能直接访问的。

用户登陆后,跳转到 /user ,使用/WEB-INF/jsp/user/list.jsp 展示

@At("/")
    @Ok("jsp:jsp.user.list") // 真实路径是 /WEB-INF/jsp/user/list.jsp
    public void index() {
    }

index.jsp跳转到用户列表页

//                            location.reload();
                            location.href = "/user";

UserModule全貌

package net.javablog.module;

import net.javablog.bean.User;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.QueryResult;
import org.nutz.dao.pager.Pager;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.*;
import org.nutz.mvc.filter.CheckSession;

import javax.servlet.http.HttpSession;
import java.util.Date;

@IocBean
@At("/user")
@Ok("json:{locked:'password|salt',ignoreNull:true}")
@Fail("http:500")
@Filters(@By(type = CheckSession.class, args = {"me", "/"}))
public class UserModule {

    @Inject
    protected Dao dao;

    @At
    public int count() {
        return dao.count(User.class);
    }


    //index.jsp 就是登陆页面
    //登陆成功后会重定向到 /user,就显示了  jsp.user.list 页面了
    @At("/")
    @Ok("jsp:jsp.user.list") // 真实路径是 /WEB-INF/jsp/user/list.jsp
    public void index() {
    }


    @At
    @Filters()
    public Object login(@Param("username") String name, @Param("password") String password, HttpSession session) {
        User user = dao.fetch(User.class, Cnd.where("name", "=", name).and("password", "=", password));
        if (user == null) {
            return false;
        } else {
            session.setAttribute("me", user.getId());
            return true;
        }
    }

    @At
    @Ok(">>:/")
    public void logout(HttpSession session) {
        session.invalidate();
    }

    @At
    public Object add(@Param("..") User user) {
        NutMap re = new NutMap();
        String msg = checkUser(user, true);
        if (msg != null) {
            return re.setv("ok", false).setv("msg", msg);
        }
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        user = dao.insert(user);
        return re.setv("ok", true).setv("data", user);
    }

    @At
    public Object update(@Param("..") User user) {
        NutMap re = new NutMap();
        String msg = checkUser(user, false);
        if (msg != null) {
            return re.setv("ok", false).setv("msg", msg);
        }
        user.setName(null);// 不允许更新用户名
        user.setCreateTime(null);//也不允许更新创建时间
        user.setUpdateTime(new Date());// 设置正确的更新时间
        dao.updateIgnoreNull(user);// 真正更新的其实只有password和salt
        return re.setv("ok", true);
    }

    @At
    public Object delete(@Param("id") int id, @Attr("me") int me) {
        if (me == id) {
            return new NutMap().setv("ok", false).setv("msg", "不能删除当前用户!!");
        }
        dao.delete(User.class, id); // 再严谨一些的话,需要判断是否为>0
        return new NutMap().setv("ok", true);
    }


//    直接查询
//    http://127.0.0.1:8080/nutzbook/user/query
//    带条件查询
//    http://127.0.0.1:8080/nutzbook/user/query?name=ad
//    带分页查询
//    http://127.0.0.1:8080/nutzbook/user/query?pageNumber=1&pageSize=2

    @At
    public Object query(@Param("name") String name, @Param("..") Pager pager) {
        Cnd cnd = Strings.isBlank(name) ? null : Cnd.where("name", "like", "%" + name + "%");
        QueryResult qr = new QueryResult();
        qr.setList(dao.query(User.class, cnd, pager));
        pager.setRecordCount(dao.count(User.class, cnd));
        qr.setPager(pager);
        return qr; //默认分页是第1页,每页20条
    }

    protected String checkUser(User user, boolean create) {
        if (user == null) {
            return "空对象";
        }
        if (create) {
            if (Strings.isBlank(user.getName()) || Strings.isBlank(user.getPassword()))
                return "用户名/密码不能为空";
        } else {
            if (Strings.isBlank(user.getPassword()))
                return "密码不能为空";
        }
        String passwd = user.getPassword().trim();
        if (6 > passwd.length() || passwd.length() > 12) {
            return "密码长度错误";
        }
        user.setPassword(passwd);
        if (create) {
            int count = dao.count(User.class, Cnd.where("name", "=", user.getName()));
            if (count != 0) {
                return "用户名已经存在";
            }
        } else {
            if (user.getId() < 1) {
                return "用户Id非法";
            }
        }
        if (user.getName() != null)
            user.setName(user.getName().trim());
        return null;
    }


}

列表页

<%@ 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>用户列表</title>
    <script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/2.0.3/jquery-2.0.3.min.js"></script>
    <script type="text/javascript">
        var pageNumber = 1;
        var pageSize = 10;
        var base = '<%=request.getAttribute("base")%>';
        function user_reload() {
            $.ajax({
                url: base + "/user/query",
                data: $("#user_query_form").serialize(),
                dataType: "json",
                success: function (data) {
                    console.log(data);
                    $("#user_count").html("共" + data.pager.recordCount + "个用户, 总计" + data.pager.pageCount + "页");
                    var list_html = "";
                    console.log(data.list);
                    for (var i = 0; i < data.list.length; i++) {
                        var user = data.list[i];
                        console.log(user);
                        var tmp = "\n<p>" + user.id + " " + user.name
                                + " <button onclick='user_update(" + user.id + ");'>修改</button> "
                                + " <button onclick='user_delete(" + user.id + ");'>删除</button> "
                                + "</p>";
                        list_html += tmp;
                    }
                    $("#user_list").html(list_html);
                }
            });
        }
        $(function () {
            user_reload();
            $("#user_query_btn").click(function () {
                user_reload();
            });
            $("#user_add_btn").click(function () {
                $.ajax({
                    url: base + "/user/add",
                    data: $("#user_add_form").serialize(),
                    dataType: "json",
                    success: function (data) {
                        if (data.ok) {
                            user_reload();
                            alert("添加成功");
                        } else {
                            alert(data.msg);
                        }
                    }
                });
            });
        });
        function user_update(userId) {
            var passwd = prompt("请输入新的密码");
            if (passwd) {
                $.ajax({
                    url: base + "/user/update",
                    data: {"id": userId, "password": passwd},
                    dataType: "json",
                    success: function (data) {
                        if (data.ok) {
                            user_reload();
                            alert("修改成功");
                        } else {
                            alert(data.msg);
                        }
                    }
                });
            }
        }
        ;
        function user_delete(userId) {
            var s = prompt("请输入y确认删除");
            if (s == "y") {
                $.ajax({
                    url: base + "/user/delete",
                    data: {"id": userId},
                    dataType: "json",
                    success: function (data) {
                        if (data.ok) {
                            user_reload();
                            alert("删除成功");
                        } else {
                            alert(data.msg);
                        }
                    }
                });
            }
        }
        ;
    </script>
</head>
<body>
<div>
    <form action="#" id="user_query_form">
        条件<input type="text" name="name">
        页数<input type="text" name="pageNumber" value="1">
        每页<input type="text" name="pageSize" value="10">
    </form>
    <button id="user_query_btn">查询</button>
    <p>---------------------------------------------------------------</p>

    <p id="user_count"></p>

    <div id="user_list">

    </div>
</div>
<div>
    <p>---------------------------------------------------------------</p>
</div>
<div id="user_add">
    <form action="#" id="user_add_form">
        用户名<input name="name">
        密码<input name="password">
    </form>
    <button id="user_add_btn">新增</button>
</div>
<div>
    <p>---------------------------------------------------------------</p>
</div>
<a href="${base}/user/logout">登出</a>

</body>
</html>

测试效果