首页 > 其他 > 详细

用户模块

时间:2020-08-01 12:12:15      阅读:98      评论:0      收藏:0      [点我收藏+]

用户模块

 

  • 项目角色分配

    • 项目经理

      • 只懂业务

      • 跟进进度

      • 人员、财务预算

    • 技术总监

    • 项目组长 teamLeader

    • 后端开发

    • 设计师 UI/UE

    • 产品经理

    • 前端

  • 开发流程

    • 需求 %30

    • 设计 %20

    • 实现 %50

  • 用户管理

    • 登录

    • 异步提交

    • 对未登录用户做控制

  • 前端页面美化一下

数据库连接池

默认连接池

 @Autowired
 DataSource dataSource;
 
  System.out.println("数据源>>>>>>" + dataSource.getClass());
         Connection connection;
  try {
  connection = dataSource.getConnection();
  System.out.println("连接>>>>>>>>>" + connection);
  System.out.println("连接地址>>>>>" + connection.getMetaData().getURL());
  } catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 ?
 ?

以前版本,如 Spring Boot 1.5 默认使用 org.apache.tomcat.jdbc.pool.DataSource 作为数据源;

HikariDataSource 号称 Java WEB 当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加优秀;

 

 

 

 ?
 spring.datasource.type=com.zaxxer.hikari.HikariDataSource1
 ## 最小空闲连接数量
 spring.datasource.hikari.minimum-idle=5
 ## 连接池最大连接数,默认是10  池中最大连接数,包括闲置和使用中的连接
 spring.datasource.hikari.maximum-pool-size=15
 spring.datasource.hikari.auto-commit=true
 ## 空闲连接存活最大时间,默认600000(10分钟)
 spring.datasource.hikari.idle-timeout=30000
 ## 连接池名称
 spring.datasource.hikari.pool-name=22DatebookHikariCP
 ## 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
 spring.datasource.hikari.max-lifetime=1800000
 spring.datasource.hikari.connection-timeout=30000
 spring.datasource.hikari.connection-test-query=SELECT 1

 

 

Druid

官方地址

https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

 

https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter/1.1.17

加入依赖

         <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid-spring-boot-starter</artifactId>
     <version>1.1.17</version>
 </dependency>

 

配置

 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 # 初始化大小,最小,最大
 spring.datasource.initial-size=5
 spring.datasource.max-active=20
 spring.datasource.min-idle=5
 # 配置获取连接等待超时的时间
 spring.datasource.max-wait=60000
 # 配置一个连接在池中最小生存的时间,单位是毫秒
 spring.datasource.min-evictable-idle-time-millis=60000
 spring.datasource.validation-query=SELECT 1
 spring.datasource.validation-query-timeout=2000
 ?

 

web监控

 package com.mashibing.springboot.controller;
 import com.alibaba.druid.pool.DruidDataSource;
 import com.alibaba.druid.support.http.StatViewServlet;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.web.servlet.ServletRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 ?
 import javax.sql.DataSource;
 import java.util.HashMap;
 import java.util.Map;
 ?
 ?
 @Configuration
 public class DruidConfig {
 ?
     /**
      * 将自定义的 Druid 数据源添加到容器中,不再让 Spring Boot 自动创建
      * 这样做的目的是:绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource
      * 从而让它们生效
      *
      * @return
      * @ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中 前缀为 spring.datasource
      * 的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
      */
     @ConfigurationProperties(prefix = "spring.datasource")
     @Bean
     public DataSource druidDataSource() {
         return new DruidDataSource();
    }
 ?
     /**
      * 配置 Druid 监控 之 管理后台的 Servlet
      * 内置 Servler 容器时没有web.xml 文件,所以使用 Spring Boot 的注册 Servlet 方式
      */
     @Bean
     public ServletRegistrationBean statViewServlet() {
         ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),
                 "/druid/*");
 ?
         /**
          * loginUsername:Druid 后台管理界面的登录账号
          * loginPassword:Druid 后台管理界面的登录密码
          * allow:Druid 后台允许谁可以访问
          *     initParams.put("allow", "localhost"):表示只有本机可以访问
          *     initParams.put("allow", ""):为空或者为null时,表示允许所有访问
          * deny:Druid 后台拒绝谁访问
          *     initParams.put("deny", "192.168.1.20");表示禁止此ip访问
          */
         Map<String, String> initParams = new HashMap<>();
         initParams.put("loginUsername", "admin");
         initParams.put("loginPassword", "123456");
         initParams.put("allow", "");
 ?
         /** 设置初始化参数*/
         bean.setInitParameters(initParams);
         return bean;
    }
 }
 ?

spring boot + mybatis 用户管理

 

1. 登录验证

登录页面

前端异步提交及登录跳转 js

     
  $(".login_btn").click(function(){
 
  console.log("val:" + $("#loginName").val())
  console.log("val:" + $("#password").val())
 
  var loginName = $("#loginName").val();
  var password = $("#password").val();
 
  if(loginName == ‘‘ || password == ‘‘){
  $(".tip").html("用户名或密码不能为空")
 
  $(".tip").css("display","block")
  }else{
 
  var url = "/account/login";
  var method = {loginName:loginName,password:password};
  $.post(url,method,function(data){
  console.log("data:" + JSON.stringify(data))
 
  if(data.code == 200){
  //登录成功
  window.location.href = "/index";
 
  }else{
 
  $(".tip").html(data.msg)
  $(".tip").css("display","block")
  }
  });
 
  console.log("提交")
  }
 
  })
 

首页

 <!DOCTYPE html>
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
 <meta charset="UTF-8">
 <title>人力资源管理系统</title>
 ?
 <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}">
 <script type="text/javascript" th:src="@{/js/common/jquery.min.js}"></script>
 
 ?
 <script type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script>
 </head>
 <body>
 ?
 <!-- 页头 开始 ↓ -->
 ?
 <nav class="navbar navbar-default">
   <div class="container-fluid">
     <!-- Brand and toggle get grouped for better mobile display -->
     <div class="navbar-header">
       <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
         <span class="sr-only">Toggle navigation</span>
         <span class="icon-bar"></span>
         <span class="icon-bar"></span>
         <span class="icon-bar"></span>
       </button>
       <a class="navbar-brand" href="/">首页</a>
     </div>
 ?
     <!-- 人员管理 -->
     <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
     
       <ul class="nav navbar-nav">
         <li class="dropdown">
           <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
          人员管理 <span class="caret"></span>
           
           </a>
           <ul class="dropdown-menu">
             <li><a href="#">Action</a></li>
             <li><a href="#">Another action</a></li>
             <li><a href="#">Something else here</a></li>
             <li role="separator" class="divider"></li>
             <li><a href="#">Separated link</a></li>
             <li role="separator" class="divider"></li>
             <li><a href="#">One more separated link</a></li>
           </ul>
         </li>
       </ul>
       
     <!-- 系统设置 -->
       
        <ul class="nav navbar-nav">
         <li class="dropdown">
           <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">系统设置 <span class="caret"></span></a>
           <ul class="dropdown-menu">
             <li><a href="/account/list">用户列表</a></li>
             <li><a href="#">Another action</a></li>
             <li><a href="#">Something else here</a></li>
             <li role="separator" class="divider"></li>
             <li><a href="#">Separated link</a></li>
             <li role="separator" class="divider"></li>
             <li><a href="#">One more separated link</a></li>
           </ul>
         </li>
       </ul>
       
       <form class="navbar-form navbar-left">
         <div class="form-group">
           <input type="text" class="form-control" placeholder="Search">
         </div>
         <button type="submit" class="btn btn-default">搜索</button>
       </form>
       
       
       <!-- 当前用户 已登录 -->
       
       <ul th:if="${session.account}!=null" class="nav navbar-nav navbar-right"
       <li class="dropdown"
         <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"
        欢迎回来:  
        [[${session.account}==null?‘‘:${session.account.loginName}]] 
          
          
          <span class="caret"></span></a
         <ul class="dropdown-menu"
           <li><a href="#">Action</a></li
           <li><a href="#">Another action</a></li
           <li><a href="#">Something else here</a></li
           <li role="separator" class="divider"></li
           <li><a href="/account/logOut">退出登录</a></li
         </ul
       </li
     </ul
      
     <!-- 当前用户未登录 --> 
      
     <ul th:if="${session.account}==null" class="nav navbar-nav navbar-right"
       <li><a href="/login">登录</a></li
       <li><a href="/register">注册</a></li
     </ul
      
      
      
      
   </div><!-- /.navbar-collapse --> 
 </div><!-- /.container-fluid --> 
</nav


<!-- 页头 结束 ↑ --> 

<div class="jumbotron"
 <h1 align="center">人力资源管理系统</h1
 <p>...</p
</div
 <p
 <a class="btn btn-primary btn-lg" href="#" role="button">首页</a
 <a class="btn btn-primary btn-lg" href="#" role="button">登录</a
 <a class="btn btn-primary btn-lg" href="#" role="button">注册</a
 <a class="btn btn-primary btn-lg" href="#" role="button">用户管理</a
  
  
 </p

</body
</html>

 

Filter

 package com.mashibing.springboot.filter;
 ?
 import java.io.IOException;
 ?
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.annotation.WebFilter;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 ?
 import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.stereotype.Component;
 ?
 @Component
 @WebFilter(urlPatterns = "/*")
 public class LoginFilter implements Filter {
 ?
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
 ?
 
 
  HttpServletRequest req = (HttpServletRequest)request;
  Object attribute = req.getSession().getAttribute("account");
 
 
  String loginURI = "/login";
  System.out.println(req.getRequestURI());;
  HttpServletResponse rep = (HttpServletResponse)response;
 
  if(req.getRequestURI().equals(loginURI)) {
  chain.doFilter(request, response);
  return;
  }
  if(null == attribute ) {
 
  rep.sendRedirect("/login");
  return;
  }else {
 
  chain.doFilter(request, response);
  }
 
 
 
  }
 ?
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  // TODO Auto-generated method stub
 
  System.out.println("---init");
  Filter.super.init(filterConfig);
  }
 
 ?
 }
 ?

controller

     @RequestMapping("/login")
  public String login(@RequestParam(required = false) String loginName,@RequestParam(required = false) String password ,
  HttpServletRequest request
  ,Model model) {
 ?
  boolean canLogin = false;
  if(StringUtils.isEmpty(loginName) || StringUtils.isEmpty(password)) {
  System.out.println("111");
  return "login";
  }
 
  Account account = accSrv.login(loginName,password);
  if(null != account) {
  System.out.println("22");
  request.getSession().setAttribute("account", account);
  return "redirect:list";
  }
 
  System.out.println("canLogin:" + canLogin);
  model.addAttribute("msg", "请重试");
  return "login";
  }

 

用户列表

html

 <table class="table table-hover">
   <tr>
 
     <th data-field="id">ID</th>
     <th data-field="loginName">loginName</th>
     <th data-field="nickName">nickName</th>
     <th data-field="age">age</th>
     <th data-field="location">location</th>
     <th data-field="price">操作</th>
   </tr>
  <tr th:each="row : ${page.list}">
  <!-- EL JSTL-->
  <td th:text = "${row.id}"></td>
  <td th:text = "${row.loginName}"></td>
  <td th:text = "${row.nickName}"></td>
  <td th:text = "${row.age}"></td>
  <td th:text = "${row.location}"></td>
  <td >crud</td>
  </tr>

controller

     @RequestMapping("/list")
  public String list (@RequestParam(defaultValue = "asc") String order,@RequestParam(defaultValue = "1")int offset,@RequestParam(defaultValue = "10")int limit,Model model) {
  PageInfo<Account> page = accSrv.findAllByPage(offset,limit,order);
  model.addAttribute("page", page);
  return "list";
  }
 ?
 ?
  public PageInfo<Account> findAllByPage(int offset, int limit, String order) {
 
  PageHelper.startPage(offset, limit);
 
  AccountExample example = new AccountExample();
  example.setOrderByClause("id " + order);
  List<Account> list = mapper.selectByExample(example );
 
 
  return new PageInfo<Account>(list);
  }

 

 

JSON相关操作

对象转字符串

JSON.stringify(data)

字符串转对象

JSON.parse(jsonBook);

常见错误

The alias ‘GeneratedCriteria‘ is already mapped to the value

mybatis.type-aliases-package=com.mashibing.springboot.mapper引起

解决方法:把实体类和Example分开放

 

用户模块

原文:https://www.cnblogs.com/Liguangyang/p/13413392.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!