zoukankan      html  css  js  c++  java
  • 5.4 员工管理系统之CRUD、错误页面以及注销功能

    一.员工信息列表展示

    1.步骤:

    • 提取公共页面

    • 编写控制器

    • 列表循环展示

    2.提取公共页面

    (1)在template文件夹下建立common文件夹添加文件commons.html,将公共部分抽取出来

    • 使用 th:fragment="topbar" , th:fragment="sidebar" 将代码块生成片段

    • 其中 <a th:class="${active == 'main.html' ? 'nav-link active' : 'nav-link'}" th:href="@{/main.html}"> 和

       <a th:class="${active == 'list.html' ? 'nav-link active' : 'nav-link'}" th:href="@{/emps}"> 目的是从其他页面调用公共页面的片段可以传递参数,此处参数是为了高亮显示,如果用户点击首页则首页列表项显示高亮,如果用户点击员工管理页则其显示为高亮

    <!--顶部导航栏-->
    <nav class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0" th:fragment="topbar">
        <a class="navbar-brand col-sm-3 col-md-2 mr-0" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#" th:text="${session.loginUser}"></a>
        <input class="form-control form-control-dark w-100" type="text" placeholder="Search" aria-label="Search">
        <ul class="navbar-nav px-3">
            <li class="nav-item text-nowrap">
                <a class="nav-link" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">注销</a>
            </li>
        </ul>
    </nav>
    
    <!--侧边栏-->
    <nav class="col-md-2 d-none d-md-block bg-light sidebar" th:fragment="sidebar">
        <div class="sidebar-sticky">
            <ul class="nav flex-column">
                <li class="nav-item">
    
                    <a th:class="${active == 'main.html' ? 'nav-link active' : 'nav-link'}" th:href="@{/main.html}">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-home">
                            <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path>
                            <polyline points="9 22 9 12 15 12 15 22"></polyline>
                        </svg>
                        首页 <span class="sr-only">(current)</span>
                    </a>
    
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file">
                            <path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path>
                            <polyline points="13 2 13 9 20 9"></polyline>
                        </svg>
                        Orders
                    </a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-shopping-cart">
                            <circle cx="9" cy="21" r="1"></circle>
                            <circle cx="20" cy="21" r="1"></circle>
                            <path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path>
                        </svg>
                        Products
                    </a>
                </li>
                <li class="nav-item">
                    <a th:class="${active == 'list.html' ? 'nav-link active' : 'nav-link'}" th:href="@{/emps}">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-users">
                            <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
                            <circle cx="9" cy="7" r="4"></circle>
                            <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
                            <path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
                        </svg>
                        员工管理
                    </a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-bar-chart-2">
                            <line x1="18" y1="20" x2="18" y2="10"></line>
                            <line x1="12" y1="20" x2="12" y2="4"></line>
                            <line x1="6" y1="20" x2="6" y2="14"></line>
                        </svg>
                        Reports
                    </a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-layers">
                            <polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>
                            <polyline points="2 17 12 22 22 17"></polyline>
                            <polyline points="2 12 12 17 22 12"></polyline>
                        </svg>
                        Integrations
                    </a>
                </li>
            </ul>
    
            <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted">
                <span>Saved reports</span>
                <a class="d-flex align-items-center text-muted" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">
                    <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-plus-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line><line x1="8" y1="12" x2="16" y2="12"></line></svg>
                </a>
            </h6>
            <ul class="nav flex-column mb-2">
                <li class="nav-item">
                    <a class="nav-link" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text">
                            <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
                            <polyline points="14 2 14 8 20 8"></polyline>
                            <line x1="16" y1="13" x2="8" y2="13"></line>
                            <line x1="16" y1="17" x2="8" y2="17"></line>
                            <polyline points="10 9 9 9 8 9"></polyline>
                        </svg>
                        Current month
                    </a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text">
                            <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
                            <polyline points="14 2 14 8 20 8"></polyline>
                            <line x1="16" y1="13" x2="8" y2="13"></line>
                            <line x1="16" y1="17" x2="8" y2="17"></line>
                            <polyline points="10 9 9 9 8 9"></polyline>
                        </svg>
                        Last quarter
                    </a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text">
                            <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
                            <polyline points="14 2 14 8 20 8"></polyline>
                            <line x1="16" y1="13" x2="8" y2="13"></line>
                            <line x1="16" y1="17" x2="8" y2="17"></line>
                            <polyline points="10 9 9 9 8 9"></polyline>
                        </svg>
                        Social engagement
                    </a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">
                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text">
                            <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
                            <polyline points="14 2 14 8 20 8"></polyline>
                            <line x1="16" y1="13" x2="8" y2="13"></line>
                            <line x1="16" y1="17" x2="8" y2="17"></line>
                            <polyline points="10 9 9 9 8 9"></polyline>
                        </svg>
                        Year-end sale
                    </a>
                </li>
            </ul>
        </div>
    </nav>
    View Code

    (2)在dashboard.html和list.html中使用片段:th:replace="~{xxx}"

    • 向公共部分传递参数:使用小括号包含,中间使用键值对赋值 (active='main.html') ,此处active目的是被点到的列表项显示高亮

    <!--顶部导航栏-->
    <div th:replace="~{common/commons::topbar}"></div>
    
    <!--侧边栏-->
    <div th:replace="~{common/commons::sidebar(active='main.html')}"></div>

    3.编写控制器

    添加EmployeeController.java

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import ustc.wzh.dao.EmployeeDao;
    import ustc.wzh.pojo.Employee;
    
    import java.util.Collection;
    
    @Controller
    public class EmployeeController {
    
        @Autowired
        EmployeeDao employeeDao;
    
        //查询所有员工,返回列表页面
        @GetMapping("/emps")
        public String list(Model model){
            Collection<Employee> employees = employeeDao.getAll();
            //将结果放在请求中
            model.addAttribute("emps",employees);
            return "emp/list";
        }
    
    }

    4.列表循环展示

    • Thymeleaf的循环: th:each="emp:${emps}" ,emps为后台传递来的数据,emp为循环变量

    • Thymeleaf自带的日期处理工具: th:text="${#dates.format(emp.birth,'yyyy-MM-dd HH:mm')}" 

     1 <div class="table-responsive">
     2     <table class="table table-striped table-sm">
     3         <thead>
     4             <tr>
     5                 <th>id</th>
     6                 <th>lastName</th>
     7                 <th>email</th>
     8                 <th>gender</th>
     9                 <th>department</th>
    10                 <th>birth</th>
    11             </tr>
    12         </thead>
    13         <tbody>
    14             <tr th:each="emp:${emps}">
    15                 <td th:text="${emp.id}"></td>
    16                 <td>[[${emp.lastName}]]</td>
    17                 <td th:text="${emp.email}"></td>
    18                 <td th:text="${emp.gender==0?'女':'男'}"></td>
    19                 <td th:text="${emp.department.departmentName}"></td>
    20                 <!--<td th:text="${emp.birth}"></td>-->
    21                 <!--使用时间格式化工具-->
    22                 <td th:text="${#dates.format(emp.birth,'yyyy-MM-dd HH:mm')}"></td>
    23 
    24                 <!--操作-->
    25                 <td>
    26                     <button class="btn btn-sm btn-primary">编辑</button>
    27                     <button class="btn btn-sm btn-danger">删除</button>
    28                 </td>
    29             </tr>
    30         </tbody>
    31     </table>
    32 </div>

    二.添加员工信息

    1.步骤:

    • 添加按钮用于跳转到添加员工信息页面

    • 编写员工信息添加页面

    • 添加控制器方法

    • 配置文件中修改日期格式

    2.添加按钮用于跳转到添加员工信息页面

    •  th:href="@{/emp}" 默认为get请求跳转到 @GetMapping("/emp") 方法中

    <!--添加员工按钮-->
    <h2> <a class="btn btn-sm btn-success"th:href="@{/emp}">添加员工</a></h2>

    3.编写员工信息添加页面

    •  th:action="@{/emp}" method="post" 使用post方法跳转到 @PostMapping("/emp") 方法中

    • 需要提交的信息需要name属性

    • 部门显示内容使用部门名称,value为部门id,还要thymeleaf的循环表达式:
       th:each="dept:${departments}" th:text="${dept.departmentName}" th:value="${dept.id}" 

    • 部门提交时使用部门id: name="department.id" 

     1 <h2>添加员工</h2>
     2 <form th:action="@{/emp}" method="post">
     3     <div class="form-group">
     4         <label>LastName</label>
     5         <input type="text" name="lastName" class="form-control" placeholder="kuangshen">
     6     </div>
     7     <div class="form-group">
     8         <label>Email</label>
     9         <input type="email" name="email" class="form-control" placeholder="24736743@qq.com">
    10     </div>
    11     <div class="form-group">
    12         <label>Gender</label><br/>
    13         <div class="form-check form-check-inline">
    14             <input class="form-check-input" type="radio" name="gender"  value="1">
    15             <label class="form-check-label"></label>
    16         </div>
    17         <div class="form-check form-check-inline">
    18             <input class="form-check-input" type="radio" name="gender"  value="0">
    19             <label class="form-check-label"></label>
    20         </div>
    21     </div>
    22     <div class="form-group">
    23         <label>department</label>
    24         <!--提交的是部门的ID-->
    25         <select class="form-control" name="department.id">
    26             <option th:each="dept:${departments}" th:text="${dept.departmentName}" th:value="${dept.id}"></option>
    27         </select>
    28     </div>
    29     <div class="form-group">
    30         <label>Birth</label>
    31         <input type="text" name="birth" class="form-control" placeholder="kuangstudy">
    32     </div>
    33     <button type="submit" class="btn btn-primary">添加</button>
    34 </form>

    4.添加控制器方法

    • 使用RestFul风格提交方式 @PostMapping("/emp") , @GetMapping("/emp") 
     1 @Autowired
     2 DepartmentDao departmentDao;
     3 
     4 //跳转到员工添加页面
     5 @GetMapping("/emp")
     6 public String toAddPage(Model model){
     7     //查出所有的部门,提供选择
     8     Collection<Department> departments = departmentDao.getDepartments();
     9     model.addAttribute("departments",departments);
    10     return "emp/add";
    11 }
    12 
    13 //员工添加功能
    14 //接收前端传递的参数,自动封装成为对象[要求前端传递的参数名,和属性名一致]
    15 @PostMapping("/emp")
    16 public String addEmp(Employee employee){
    17     System.out.println(employee);
    18     employeeDao.save(employee); //保存员工信息
    19     //回到员工列表页面,可以使用redirect或者forward
    20     return "redirect:/emps";
    21 }

    5.配置文件中修改日期格式

    • 一旦修改就不能使用原来的yyyy/MM/dd的方式提交

    # 设置日期格式
    spring.mvc.date-format=yyyy-MM-dd

    三.员工信息修改

    1.步骤:

    • 修改编辑按钮

    • 添加修改页面

    • 添加控制器方法

    • 修改日期格式

    2.修改编辑按钮

    • 跳转路径 th:href="@{/emp/}+${emp.id}" ,Restful风格的参数传递

    <a class="btn btn-sm btn-primary" th:href="@{/emp/}+${emp.id}">编辑</a>
    • 官网文档推荐 th:href="@{/emp/{id}(id=${emp.id})}" 

    <a class="btn btn-sm btn-primary" th:href="@{/emp/{id}(id=${emp.id})}">编辑</a>

    3.添加修改页面

    •  th:action="@{/updateEmp}" method="post" ,跳转路径和post提交方式

    •  type="hidden" th:value="${emp.id}" ,隐藏值传回id值

    •  th:value="${emp.getLastName()}" ,input标签填充值

    •  th:checked="${emp.gender==1}" ,判断选择哪一个单选框

    •  th:selected="${dept.getId() == emp.getDepartment().getId()}" ,获得下拉列表中的值

    •  th:value="${#dates.format(emp.birth,'yyyy-MM-dd HH:mm:ss')}" ,设置日期值

    <main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
        <h2>修改员工信息</h2>
        <form th:action="@{/updateEmp}" method="post">
            <input name="id" type="hidden" class="form-control" th:value="${emp.id}">
            <div class="form-group">
                <label>LastName</label>
                <input th:value="${emp.getLastName()}" type="text" name="lastName" class="form-control" placeholder="kuangshen">
            </div>
            <div class="form-group">
                <label>Email</label>
                <input th:value="${emp.getEmail()}" type="email" name="email" class="form-control" placeholder="24736743@qq.com">
            </div>
            <div class="form-group">
                <label>Gender</label><br/>
                <div class="form-check form-check-inline">
                    <input  th:checked="${emp.gender==1}"  class="form-check-input" type="radio" name="gender" value="1">
                    <label class="form-check-label"></label>
                </div>
                <div class="form-check form-check-inline">
                    <input th:checked="${emp.gender==0}" class="form-check-input" type="radio" name="gender"  value="0">
                    <label class="form-check-label"></label>
                </div>
            </div>
            <div class="form-group">
                <label>department</label>
                <!--提交的是部门的ID-->
                <select class="form-control" name="department.id">
                    <option th:selected="${dept.getId() == emp.getDepartment().getId()}" th:each="dept:${departments}" th:text="${dept.departmentName}" th:value="${dept.id}"></option>
                </select>
            </div>
            <div class="form-group">
                <label>Birth</label>
                <input type="text" name="birth" class="form-control" th:value="${#dates.format(emp.birth,'yyyy-MM-dd HH:mm:ss')}" placeholder="kuangstudy">
            </div>
            <button type="submit" class="btn btn-primary">修改</button>
        </form>
    </main>

    4.添加控制器方法

    //跳转到员工修改页面
    @GetMapping("/emp/{id}")
    public String toUpdateEmp(@PathVariable("id") Integer id, Model model){
        //根据id查出来员工
        Employee employee = employeeDao.get(id);
        //将员工信息返回页面
        model.addAttribute("emp",employee);
        //查出所有的部门,提供修改选择
        Collection<Department> departments = departmentDao.getDepartments();
        model.addAttribute("departments",departments);
    
        return "emp/update";
    }
    
    // 修改员工信息
    @PostMapping("/updateEmp")
    public String updateEmp(Employee employee){
        employeeDao.save(employee);
        //回到员工列表页面
        return "redirect:/emps";
    }

    5.修改日期格式

    # 设置日期格式
    spring.mvc.date-format=yyyy-MM-dd HH:mm:ss

    四.员工信息删除

    1.步骤:

    • 添加删除按钮

    • 添加控制器方法

    2.添加删除按钮

    <a class="btn btn-sm btn-danger" th:href="@{/delEmp/{id}(id=${emp.id})}">删除</a>

    3.添加控制器方法

    @GetMapping("/delEmp/{id}")
    public String delEmp(@PathVariable("id") Integer id){
        employeeDao.delete(id);
        return "redirect:/emps";
    }

    五.错误页面

    1.在template目录下添加error文件夹

    • 添加404.html等错误页面即可,springboot会自动定位

    六.注销功能

    1.步骤:

    • 编写注销按钮

    • 控制器添加方法

    2.编写注销按钮

    <a class="nav-link" th:href="@{/user/loginOut}">注销</a>

    3.控制器添加方法

    • 在LoginController中添加方法

    @GetMapping("/user/loginOut")
    public String loginOut(HttpSession session){
        session.invalidate();
        return "redirect:/index.html";
    }
  • 相关阅读:
    Integer to English Words
    Word Ladder II
    Word Ladder
    Distinct Subsequences
    Interleaving String
    Scramble String
    【转】ROC和AUC介绍以及如何计算AUC
    Minimum Size Subarray Sum
    Minimum Window Substring
    Edit Distance
  • 原文地址:https://www.cnblogs.com/zhihaospace/p/12399313.html
Copyright © 2011-2022 走看看