• OA项目(一)之用户管理[登录+分页查询]


    目录

    一.数据表设计

     二.代码(后台)

     2.1 实体类

    2.2 dao层

     2.2.1 JUnit测试

    2.3 action

     2.4 mvc.xml配置

    三.代码(前台)

    3.1 登录界面

    3.1.1 登录界面js编写

     3.1.2 运行界面

    3.2 用户界面

    3.2.1 用户分页查询js编写

    3.2.2 运行界面


    一.数据表设计

    用户表(t_oa_user)
    序号列名数据类型长度允许空说明
    1idintNO主键 用户编号
    2namevarchar100NO真实姓名
    3loginNamevarchar100NO用户名
    4pwdvarchar20NO密码
    5ridintNO权限

     二.代码(后台)

     2.1 实体类

    1. package com.zking.oapro.entity;
    2. import java.io.Serializable;
    3. public class Users implements Serializable {
    4. private Integer id;// 用户编号
    5. private String name;// 真实姓名
    6. private String loginName;// 用户名
    7. private String pwd;// 密码
    8. private int rid;
    9. public Users() {
    10. super();
    11. // TODO Auto-generated constructor stub
    12. }
    13. public Users(String loginName, String pwd) {
    14. super();
    15. this.loginName = loginName;
    16. this.pwd = pwd;
    17. }
    18. public Users(Integer id, String name, String loginName, String pwd, int rid) {
    19. super();
    20. this.id = id;
    21. this.name = name;
    22. this.loginName = loginName;
    23. this.pwd = pwd;
    24. this.rid = rid;
    25. }
    26. public Integer getId() {
    27. return id;
    28. }
    29. public void setId(Integer id) {
    30. this.id = id;
    31. }
    32. public String getName() {
    33. return name;
    34. }
    35. public void setName(String name) {
    36. this.name = name;
    37. }
    38. public String getLoginName() {
    39. return loginName;
    40. }
    41. public void setLoginName(String loginName) {
    42. this.loginName = loginName;
    43. }
    44. public String getPwd() {
    45. return pwd;
    46. }
    47. public void setPwd(String pwd) {
    48. this.pwd = pwd;
    49. }
    50. public int getRid() {
    51. return rid;
    52. }
    53. public void setRid(int rid) {
    54. this.rid = rid;
    55. }
    56. @Override
    57. public String toString() {
    58. return "Users [id=" + id + ", name=" + name + ", loginName=" + loginName + ", pwd=" + pwd + ", rid=" + rid
    59. + "]";
    60. }
    61. }

    2.2 dao层

    1. package com.zking.oapro.dao;
    2. import java.sql.ResultSet;
    3. import java.sql.SQLException;
    4. import java.util.List;
    5. import java.util.Map;
    6. import com.mysql.jdbc.Connection;
    7. import com.mysql.jdbc.PreparedStatement;
    8. import com.mysql.jdbc.StringUtils;
    9. import com.zking.oapro.entity.Users;
    10. import com.zking.oapro.utils.CommonUtils;
    11. import com.zking.oapro.utils.DBHelper;
    12. import com.zking.oapro.utils.MD5;
    13. import com.zking.oapro.utils.PageBean;
    14. public class UserDao extends BaseDao{
    15. /**
    16. * 分页查询用户信息
    17. * @param user
    18. * @param pageBean
    19. * @return
    20. */
    21. @SuppressWarnings("unchecked")
    22. public List> queryUserPager(Users user,PageBean pageBean){
    23. String sql="select id,name,loginName,pwd,rid,\r\n" +
    24. "(case rid\r\n" +
    25. " when '1' then '管理员'\r\n" +
    26. " when '2' then '发起者'\r\n" +
    27. " when '3' then '审批者'\r\n" +
    28. " when '4' then '参与者'\r\n" +
    29. " when '5' then '会议管理员'\r\n" +
    30. " else '其他' end\r\n" +
    31. ") rname\r\n" +
    32. "from t_oa_user where 1=1";
    33. //按照登录账号模糊查询
    34. if(!StringUtils.isNullOrEmpty(user.getLoginName()))
    35. sql+=" and loginName like '"+user.getLoginName()+"%'";
    36. //按照用户编号降序排序
    37. sql+=" order by id desc";
    38. System.out.println(sql);
    39. return super.executeQuery(sql, pageBean, new CallBack>() {
    40. @Override
    41. public List> forEach(ResultSet rs) throws SQLException {
    42. return CommonUtils.toList(rs);
    43. }
    44. });
    45. }
    46. /**
    47. * 登录
    48. */
    49. public Users userLogin(Users use) {
    50. // 连接对象
    51. Connection conn = null;
    52. // 执行对象
    53. PreparedStatement ps = null;
    54. // 结果集对象
    55. ResultSet rs = null;
    56. // SQL语句
    57. String sql = "select * from t_oa_user where loginName=?";
    58. // 用户实体
    59. Users users = null;
    60. try {
    61. // 获取连接
    62. conn = (Connection) DBHelper.getConnection();
    63. // 将SQL语句传到执行语句中
    64. ps = (PreparedStatement) conn.prepareStatement(sql);
    65. // 给占位符赋值
    66. ps.setString(1, use.getLoginName());
    67. // 遍历结果集对象
    68. rs = ps.executeQuery();
    69. // 判断是否存在用户数据
    70. if (rs.next()) {
    71. users = new Users(rs.getInt("id"), rs.getString("name"), rs.getString("loginName"), rs.getString("pwd"), rs.getInt("rid"));
    72. }
    73. } catch (Exception e) {
    74. e.printStackTrace();
    75. } finally {
    76. DBHelper.close(conn, ps, rs);
    77. }
    78. return users;
    79. }
    80. public static void main(String[] args) {
    81. System.out.println(new UserDao().userLogin(new Users("zhangsan","1234")) );
    82. }
    83. }

     2.2.1 JUnit测试

    1. package com.zking.oapro.dao;
    2. import static org.junit.Assert.fail;
    3. import java.util.List;
    4. import java.util.Map;
    5. import org.junit.Before;
    6. import org.junit.Test;
    7. import com.zking.oapro.entity.Users;
    8. import com.zking.oapro.utils.PageBean;
    9. public class UserDaoTest {
    10. UserDao ud=new UserDao();
    11. Users user=null;
    12. @Before
    13. public void setUp() throws Exception {
    14. user=new Users();
    15. }
    16. @Test
    17. public void testQueryUserPager() {
    18. PageBean pageBean=new PageBean();
    19. user.setLoginName("a");
    20. List> list = ud.queryUserPager(user, pageBean);
    21. System.out.println("总记录数:"+pageBean.getTotal());
    22. list.forEach(System.out::println);
    23. }
    24. }

    2.3 action

    1. package com.zking.oapro.action;
    2. import java.io.IOException;
    3. import java.util.List;
    4. import java.util.Map;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import javax.servlet.http.HttpSession;
    9. import com.mysql.jdbc.StringUtils;
    10. import com.zking.mvc.framework.DispatcherAction;
    11. import com.zking.mvc.framework.DriverModel;
    12. import com.zking.oapro.dao.UserDao;
    13. import com.zking.oapro.entity.Users;
    14. import com.zking.oapro.utils.CommonUtils;
    15. import com.zking.oapro.utils.MD5;
    16. import com.zking.oapro.utils.PageBean;
    17. public class UserAction extends DispatcherAction implements DriverModel {
    18. private Users user = new Users();
    19. private UserDao ud = new UserDao();
    20. @Override
    21. public Users getModel() {
    22. return user;
    23. }
    24. /**
    25. * 分页查询
    26. *
    27. * @param req
    28. * @param resp
    29. * @return
    30. * @throws ServletException
    31. * @throws IOException
    32. */
    33. public String queryUserPager(HttpServletRequest req, HttpServletResponse resp)
    34. throws ServletException, IOException {
    35. try {
    36. PageBean pageBean = new PageBean();
    37. pageBean.setRequest(req);
    38. List> list = ud.queryUserPager(user, pageBean);
    39. CommonUtils.toJson(200, "OK", pageBean.getTotal(), list, resp);
    40. } catch (Exception e) {
    41. e.printStackTrace();
    42. CommonUtils.toJson(500, "分页查询用户信息失败", 0, null, resp);
    43. }
    44. return null;
    45. }
    46. /**
    47. * 用户登录
    48. *
    49. * @param req
    50. * @param resp
    51. * @return
    52. * @throws ServletException
    53. * @throws IOException
    54. */
    55. public String UserLogin(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    56. // 1.判断登录账号和密码是否为空
    57. if (StringUtils.isNullOrEmpty(user.getLoginName()) || StringUtils.isNullOrEmpty(user.getPwd())) {
    58. CommonUtils.toJson(false, "登录账号或者密码不能为空", resp);
    59. } else {
    60. Users u = ud.userLogin(user);
    61. System.out.println(u);
    62. // 判断u是否为空 账号不存在
    63. if (u == null) {
    64. CommonUtils.toJson(false, "账号不存在", resp);
    65. return null;
    66. }
    67. // 将前端输入的密码首先进行MD5加密处理
    68. String pwd = new MD5().getMD5ofStr(user.getPwd());
    69. // 判断密码是否正确
    70. if (!u.getPwd().equals(pwd)) {
    71. CommonUtils.toJson(false, "密码不正确", resp);
    72. } else {
    73. HttpSession session = req.getSession();
    74. session.setAttribute("user", u);
    75. CommonUtils.toJson(true, "OK", resp);
    76. }
    77. }
    78. return null;
    79. }
    80. }

     2.4 mvc.xml配置

    1. config [
    2. config (action*)>
    3. action (forward*)>
    4. action
    5. path CDATA "/"
    6. type CDATA #REQUIRED
    7. >
    8. forward
    9. name CDATA #REQUIRED
    10. path CDATA "/"
    11. redirect (false|true) "false"
    12. >
    13. ]>
    14. <config>
    15. <action type="com.zking.oapro.action.UserAction" path="/userAction">action>
    16. config>

    三.代码(前台)

    3.1 登录界面

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    4. <html>
    5. <head>
    6. <%@include file="/common/head.jsp" %>
    7. <meta name="viewport" content="width=device-width,initial-scale=1.33,minimum-scale=1.0,maximum-scale=1.0">
    8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    9. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    10. <meta name="renderer" content="webkit">
    11. <meta http-equiv="Content-Language" content="zh-CN">
    12. <link rel="stylesheet" rev="stylesheet" href="css/iconfont.css" type="text/css" media="all">
    13. <link rel="stylesheet" rev="stylesheet" href="css/login.css" type="text/css" media="all">
    14. <style> body{color:#;}a{color:#;}a:hover{color:#;}.bg-black{background-color:#;}.tx-login-bg{background:url(images/bg.jpg) no-repeat 0 0;}style>
    15. <script type="text/javascript" src="js/login.js">script>
    16. head>
    17. <body class="tx-login-bg">
    18. <div class="tx-login-box">
    19. <div class="login-avatar bg-black"><i class="iconfont icon-wode">i>div>
    20. <ul class="tx-form-li row">
    21. <li class="col-24 col-m-24"><p><input type="text" id="username" name="uname" value="zhangsan" placeholder="登录账号" class="tx-input">p>li>
    22. <li class="col-24 col-m-24"><p><input type="password" id="password" name="upwd" value="1234" placeholder="登录密码" class="tx-input">p>li>
    23. <li class="col-24 col-m-24"><p class="tx-input-full"><button id="login" class="tx-btn tx-btn-big bg-black">登录button>p>li>
    24. <li class="col-12 col-m-12"><p><a href="#" class="f-12 f-gray">新用户注册a>p>li>
    25. <li class="col-12 col-m-12"><p class="ta-r"><a href="#" class="f-12 f-gray">忘记密码a>p>li>
    26. ul>
    27. div>
    28. body>
    29. html>

    3.1.1 登录界面js编写

    1. let layer,$;
    2. layui.use(['layer','jquery'],function(){
    3. layer=layui.layer,
    4. $=layui.jquery;
    5. $('#login').click(function(){
    6. //禁用按钮
    7. $('#login').attr('disabled','disabled').css({'background':'gray'});
    8. //获取账号和密码
    9. let username=$('#username').val();
    10. let password=$('#password').val();
    11. console.log('username=%s,password=%s',username,password);
    12. //发起ajax请求
    13. $.post('userAction.action',{
    14. 'methodName':'UserLogin',
    15. 'loginName':username,
    16. 'pwd':password
    17. },function(rs){
    18. console.log(rs);
    19. if(rs.success){
    20. layer.msg('登录成功',{icon:6},function(){
    21. location.href='index.jsp';
    22. });
    23. }else{
    24. layer.msg(rs.msg,{icon:5},function(){});
    25. $('#login').removeAttr('disabled','disabled').css({'background':'#009688'});
    26. }
    27. },'json');
    28. });
    29. });

     3.1.2 运行界面

    3.2 用户界面

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <html>
    4. <head>
    5. <%@ include file="/common/head.jsp" %>
    6. <script type="text/javascript" src="js/system/userManage.js">script>
    7. head>
    8. <body>
    9. <div class="layui-form-item" style="margin: 15px 0px;text-align: center;">
    10. <div class="layui-inline">
    11. <label class="layui-form-label">用户账号label>
    12. <div class="layui-input-inline">
    13. <input type="text" id="loginName" autocomplete="off" class="layui-input" style="width: 150px">
    14. div>
    15. <div class="layui-inline">
    16. <button id="btn_search" type="button" class="layui-btn" ><i class="layui-icon">i>查询button>
    17. <button id="btn_add" type="button" class="layui-btn" ><i class="layui-icon">i>新增button>
    18. div>
    19. div>
    20. <table id="tb" lay-filter="tb" class="layui-table">table>
    21. <script type="text/html" id="tbar">
    22. <a class="layui-btn layui-btn-xs" lay-event="reset">重置密码a>
    23. <a class="layui-btn layui-btn-xs" lay-event="edit">修改a>
    24. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除a>
    25. script>
    26. body>
    27. html>

    3.2.1 用户分页查询js编写

    1. let layer,$,table;
    2. var row;
    3. layui.use(['layer','table','jquery'],function(){
    4. layer=layui.layer,
    5. table=layui.table,
    6. $=layui.jquery;
    7. initTable();
    8. //查询事件
    9. $('#btn_search').click(function(){
    10. query();
    11. });
    12. //点击事件
    13. $('#btn_add').click(function(){
    14. row=null;
    15. openLayer('用户新增');
    16. });
    17. });
    18. //初始化数据表格
    19. function initTable(){
    20. table.render({ //执行渲染
    21. elem: '#tb', //指定原始表格元素选择器(推荐id选择器)
    22. height: 420, //自定义高度
    23. loading: false, //是否显示加载条(默认 true)
    24. cols: [[ //设置表头
    25. {field: 'id', title: '用户编号', width: 180},
    26. {field: 'name', title: '用户名称', width: 120},
    27. {field: 'loginName', title: '用户账号', width: 140},
    28. {field: 'rname', title: '用户角色', width: 120},
    29. {field: '', title: '操作', width: 200,toolbar:'#tbar'}
    30. ]]
    31. });
    32. }
    33. //点击查询
    34. function query(){
    35. table.reload('tb', {
    36. url: 'userAction.action', //请求地址
    37. method: 'POST', //请求方式,GET或者POST
    38. loading: true, //是否显示加载条(默认 true)
    39. page: true, //是否分页
    40. where: { //设定异步数据接口的额外参数,任意设
    41. 'loginName':$('#loginName').val(),
    42. 'methodName':'queryUserPager'
    43. },
    44. request: { //自定义分页请求参数名
    45. pageName: 'page', //页码的参数名称,默认:page
    46. limitName: 'rows' //每页数据量的参数名,默认:limit
    47. },
    48. //parseData数据格式解析的回调函数,用于将返回的任意数据格式解析成 table 组件规定的数据格式。
    49. parseData: function (res) { //res 即为原始返回的数据
    50. console.log(res);
    51. return {
    52. "code": res.code == 200 ? 0 : res.code, //解析接口状态,返回结果的code值必须为0
    53. "msg": res.msg, //解析提示文本
    54. "count": res.total, //解析数据长度
    55. "data": res.data //解析数据列表
    56. };
    57. },
    58. done: function (res, curr, count) {
    59. console.log(res);
    60. }
    61. });
    62. //监听工具条
    63. table.on('tool(tb)', function(obj){ //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"
    64. row = obj.data; //获得当前行数据
    65. var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
    66. var tr = obj.tr; //获得当前行 tr 的DOM对象
    67. console.log(row);
    68. if(layEvent === 'reset'){ //重置密码
    69. layer.confirm('您确定要重置密码吗?', {icon: 3, title:'提示'}, function(index){
    70. $.post('userAction.action',{
    71. 'methodName':'resetPwd',
    72. 'id':row.id
    73. },function(rs){
    74. if(rs.success){
    75. //刷新父页面的列表
    76. query();
    77. }else{
    78. layer.msg(rs.msg,function(){});
    79. }
    80. },'json');
    81. layer.close(index);
    82. });
    83. } else if(layEvent === 'del'){ //删除
    84. layer.confirm('您确定要删除吗?', {icon: 3, title:'提示'}, function(index){
    85. $.post('userAction.action',{
    86. 'methodName':'delUser',
    87. 'id':row.id
    88. },function(rs){
    89. if(rs.success){
    90. //刷新父页面的列表
    91. query();
    92. }else{
    93. layer.msg(rs.msg,function(){});
    94. }
    95. },'json');
    96. layer.close(index);
    97. });
    98. } else if(layEvent === 'edit'){ //编辑
    99. openLayer('用户修改');
    100. }
    101. });
    102. }
    103. //对话框 用户新增和修改共用
    104. function openLayer(title){
    105. layer.open({
    106. type: 2, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    107. title:title,
    108. area: ['640px', '360px'], //宽高
    109. skin: 'layui-layer-rim', //样式类名
    110. content: 'jsp/system/userEdit.jsp', //书本编辑页面
    111. btn:['保存','关闭'],
    112. yes:function(index,laypro){
    113. //调用子页面中提供的getData方法,快速获取子页面的form表单数据
    114. let data= $(laypro).find("iframe")[0].contentWindow.getData();
    115. console.log(data);
    116. let methodName="addUser";
    117. if(title=="用户修改")
    118. methodName="editUser";
    119. data['methodName']=methodName;
    120. console.log(data);
    121. $.post('userAction.action',data,function(rs){
    122. if(rs.success){
    123. //关闭对话框
    124. layer.closeAll();
    125. //刷新父页面的列表
    126. query();
    127. }else{
    128. layer.msg(rs.msg,function(){});
    129. }
    130. },'json');
    131. },
    132. btn2:function(){
    133. //layer.msg('关闭');
    134. layer.closeAll();
    135. }
    136. });
    137. }

    3.2.2 运行界面

     模糊查询

  • 相关阅读:
    MySQL在线修改表结构-PerconaTookit工具
    Optimize(程序优化)
    Ubuntu18.04启动出现Starting Gnome Display Manager问题
    【计算机网络系列】物理层②:信道复用技术(频分复用、时分复用、波分复用及码分复用)
    RabbitMQ实现数据库与ElasticSearch的数据同步和分享文件过期处理
    无需公网IP、简单3步,直连远程NAS实现高速访问
    ubuntu 20.04 qemu u-boot-2022.10 开发环境搭建
    微软POWERBI连接SAP HANA数据库
    手把手教你做一个天猫精灵(四)
    【每天学习一点新知识】HTTP各个响应状态所表示的含义
  • 原文地址:https://blog.csdn.net/m0_63579794/article/details/126000924