进阶SpringBoot之员工管理系统(5)展示员工列表和添加员工

news2024/11/16 19:37:36

Employee.java:模拟员工表

package com.demo.web.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

//员工表
@Data
@NoArgsConstructor
public class Employee {
    private Integer id;
    private String lastName;
    private String email;
    private Integer gender;  //0:女  1:男
    private Department department;
    private Date birthday;

    public Employee(Integer id, String lastName, String email, Integer gender, Department department) {
        this.id = id;
        this.lastName = lastName;
        this.email = email;
        this.gender = gender;
        this.department = department;
        //默认创建日期
        this.birthday = new Date();
    }
}

EmployeeDao.java:模拟员工数据库数据

package com.demo.web.dao;

import com.demo.web.pojo.Department;
import com.demo.web.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

//员工dao
@Repository
public class EmployeeDao {

    //模拟数据库中的数据
    private static Map<Integer, Employee> employees = null;

    //员工所属部门
    @Autowired  //自动装配
    private DepartmentDao departmentDao;

    static {
        employees = new HashMap<Integer, Employee>(); //创建一个员工表

        employees.put(1001,new Employee(1001,"张三1","123@qq.com",1,new Department(101,"研发部")));
        employees.put(1002,new Employee(1002,"张三2","123@qq.com",0,new Department(102,"测试部")));
        employees.put(1003,new Employee(1003,"张三3","123@qq.com",1,new Department(103,"运维部")));
        employees.put(1004,new Employee(1004,"张三4","123@qq.com",0,new Department(104,"产品部")));
    }

    //主键自增
    private static Integer initId = 1005;

    //增加一个员工
    public void save(Employee employee) {
        if(employee.getId()==null){
            employee.setId(initId++);
        }
        employee.setDepartment(departmentDao.getDepartmentById(employee.getDepartment().getId()));
        employees.put(employee.getId(),employee);
    }

    //查询所有员工信息
    public Collection<Employee> getAll() {
        return employees.values();
    }

    //通过id查询员工
    public Employee getEmployeeById(Integer id) {
        return employees.get(id);
    }

    //通过id删除员工
    public void delete(Integer id) {
        employees.remove(id);
    }

}

EmployeeController.java:

把模拟数据库的类 @Autowired 自动装配 Bean

调用 EmployeeDao 的方法查询所有员工信息

addAttribute 用于将数据绑定到请求对象中的方法,以便在后续的页面中获取这些数据

返回 emp 目录下的 list.html 页面

import com.demo.web.dao.EmployeeDao;
import com.demo.web.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;

import java.util.Collection;

@Controller
public class EmployeeController {
    @Autowired //自动装配
    EmployeeDao employeeDao;

    @RequestMapping("/emps")
    public String list(Model model){
        Collection<Employee> employees = employeeDao.getAll();
        model.addAttribute("emps",employees);
        return "emp/list";
    }
}

list.html:

<div th:insert="~{commons/commons::topbar}"></div>

<div class="container-fluid">
	<div class="row">

		<div th:insert="~{commons/commons::sidebar(active='list.html')}"></div>

		<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
			<h2><a class="btn btn-sm btn-success" th:href="@{/emp}">添加员工</a></h2>


		<div class="table-responsive">
			<table class="table table-striped table-sm">
				<thead>
					<tr>
						<th>id</th>
						<th>lastName</th>
						<th>email</th>
						<th>gender</th>
						<th>department</th>
						<th>birthday</th>
						<th>option</th>
					</tr>
				</thead>
				<tbody>
					<tr th:each="emp:${emps}">
						<td th:text="${emp.getId()}"></td>
						<td>[[${emp.getLastName()}]]</td>
						<td th:text="${emp.getEmail()}"></td>
						<td th:text="${emp.getGender()==0?'女':'男'}"></td>
						<td th:text="${emp.getDepartment()}"></td>
						<td th:text="${#dates.format(emp.getBirthday(), 'yyyy-MM-dd HH:mm:ss')}"></td>
						<td>
							<!-- <a class="btn btn-sm btn-primary" th:href="@{/emp/}+${emp.getId()}">编辑</a> -->
							<a class="btn btn-sm btn-primary">编辑</a>
							<a class="btn btn-sm btn-danger">删除</a>
						</td>
					</tr>
				</tbody>
			</table>
		</div>
		</main>
	</div>
</div>

效果如下:

员工列表展示:

1.提取公共页面

th:fragment="sidebar"

th:replace="~{commons/commons::topbar}"

如果要传递参数,直接使用 () 传参,接收判断即可

2.列表循环展示

添加员工:

1.按钮提交

2.跳转到添加页面

3.添加员工成功

4.返回首页

DepartmentDao.java:

package com.demo.web.dao;

import com.demo.web.pojo.Department;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

//部门dao
@Repository
public class DepartmentDao {

    //模拟数据库中的数据
    private static Map<Integer, Department> departments = null;
    static {
        departments = new HashMap<Integer,Department>(); //创建一个部门表

        departments.put(101,new Department(101,"研发部"));
        departments.put(102,new Department(102,"测试部"));
        departments.put(103,new Department(103,"运维部"));
        departments.put(104,new Department(104,"产品部"));
    }

    //获取所有部门信息
    public Collection<Department> getDepartments() {
        return departments.values();
    }

    //通过id获取部门信息
    public Department getDepartmentById(Integer id) {
        return departments.get(id);
    }
}

EmployeeController.java:

import com.demo.web.dao.DepartmentDao;
import com.demo.web.dao.EmployeeDao;
import com.demo.web.pojo.Department;
import com.demo.web.pojo.Employee;
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 org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Collection;

@Controller
public class EmployeeController {
    @Autowired //自动装配
    EmployeeDao employeeDao;
    @Autowired
    DepartmentDao departmentDao;

    @RequestMapping("/emps")
    public String list(Model model){
        Collection<Employee> employees = employeeDao.getAll();
        model.addAttribute("emps",employees);
        return "emp/list";
    }

    @GetMapping("/emp")
    public String toAddpage(Model model){
        //查出所有部门信息
        Collection<Department> departments = departmentDao.getDepartments();
        model.addAttribute("departments",departments);
        return "emp/add";
    }

    @PostMapping("/emp")
    public String addEmp(Employee employee){
        employeeDao.save(employee); //调用底层业务方法保存员工信息
        return "redirect:/emps";
    }
}

emp 目录下 add.html:

<div th:insert="~{commons/commons::topbar}"></div>
<div class="container-fluid">
	<div class="row">

		<div th:insert="~{commons/commons::sidebar(active='list.html')}"></div>

		<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
			<form th:action="@{/emp}" method="post" >
				<div class="form-group" ><label>LastName</label>
					<input class="form-control" placeholder="名字" type="text" name="lastName">
				</div>
				<div class="form-group" ><label>Email</label>
					<input class="form-control" placeholder="123@qq.com" type="email" name="email">
				</div>
				<div class="form-group"><label>Gender</label><br/>
					<div class="form-check form-check-inline">
						<input class="form-check-input" name="gender" type="radio" value="1">
						<label class="form-check-label">男</label>
					</div>
					<div class="form-check form-check-inline">
						<input class="form-check-input" name="gender" type="radio" value="0">
						<label class="form-check-label">女</label>
					</div>
				</div>
				<div class="form-group" ><label>department</label>
					<select class="form-control" name="department.id">
						<option th:each="dept:${departments}" th:text="${dept.getDepartmentName()}" th:value="${dept.getId()}"></option>
					</select>
				</div>
				<div class="form-group" >
					<label>Birthday</label>
					<input class="form-control" placeholder="2024-08-15" type="text" name="birthday">
				</div>
				<button class="btn btn-primary" type="submit">添加</button>
			</form>
		</main>
	</div>
</div>

效果如下:

时间日期格式化:

# 时间日期格式化
spring.mvc.date-format=yyyy-MM-dd

添加成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十五章 数据管理成熟度评估5分

15.0 语境关系图 活动&#xff1a; 计划评估活动&#xff08;P&#xff09;。进行成熟度评估&#xff08;C&#xff09;。拟定建议&#xff08;D&#xff09;。制定有针对性的改进计划&#xff08;P&#xff09;。 5. 重新评估成熟度&#xff08;C&#xff09; 应定期进行重新…

18308 最长公共子序列长度

### 分析 1. **问题描述**&#xff1a; - 给定两个字符串&#xff0c;要求找到它们的最长公共子序列的长度。 2. **解决方案**&#xff1a; - 使用动态规划&#xff08;Dynamic Programming, DP&#xff09;来解决这个问题。 - 定义一个二维数组dp&#xff0c;其中d…

使用AWS Lambda轻松开启Amazon Rekognition之旅

这是本系列文章的第一篇&#xff0c;旨在通过动手实践&#xff0c;帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章&#xff0c;大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧&#xff01; 介绍 什么是Amazon Rekognition&…

Java基础之循环嵌套

循环嵌套 在一个循环内部可以嵌套另一个或多个循环。 外部循环每执行1次&#xff0c;内层循环会执行1轮(全部)。 案例1&#xff1a; 连续3天&#xff0c;每天都要表白5次。 package com.briup.chap03;public class Test03_Nest {public static void main(String[] args) {…

MyBatis-Plus 自动填充字段详细教程

所以&#xff0c;接受事实&#xff0c;调整下略微悲观的态度。未来&#xff0c;也不一定就只会发生不好的变化。这变化&#xff0c;说不定也有好的&#xff0c;不是吗&#xff1f; 今天编写一个详细的教程来介绍如何在 Spring Boot 项目中使用 MyBatis-Plus 实现自动填充时间字…

补充线程结束方式,资源回收与线程的相互竞争

一.补充线程结束的方式 1.pthread_exit //pthread_jion 2.从线程执行函数中return //此时效果等价于pthread_exit 3. int pthread_ cancel &#xff08;pthread _ t thread&#xff09; 功能&#xff1a;发送取消请求 参数&#xff1a;thread 表示要发送的线程tid号 4.…

cv2,PIL绘制矩形框与图片的切片(易错)

目录 1. cv2绘制矩形框代码 2. PIL绘制矩形 3. cv2图片的切片 1. cv2绘制矩形框 import cv2# 读取图像 img cv2.imread(img.png)# 绘制矩形框 cv2.rectangle(img, (100, 200), (300, 300), (0, 255, 0), 3)# 显示图像 cv2.imshow(Image with Rectangle, img) cv2.waitKey(0…

LeetCode.20.有效的括号

题目描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有…

云原生和安装Ubuntu 22系统

一.云原生简介 2004年开始&#xff0c;Google已在内部大规模地使用容器技术。 2008年&#xff0c;Google将 Cgroups合并进入了Linux内核。2013年&#xff0c;Docker项目正式发布。2014年&#xff0c;Kubernetes项目正式发布。2015年&#xff0c;由Google、Redhat 以及微软等大…

【电路笔记】-π 型衰减器

π 型衰减器 文章目录 π 型衰减器1、概述2、等阻抗π-型衰减器3、π-型衰减器示例14、不等阻抗π-型衰减器5、π-型衰减器示例26、平衡π-型衰减器π-型衰减器常用于射频和微波传输线路中,可以是平衡或非平衡设计 1、概述 π-型衰减器之所以如此命名,是因为其基本布局和设计…

图书借阅会员员工管理小程序开发

图书借阅微信小程序全面升级方案 本图书借阅微信小程序旨在打造一站式、高效便捷的图书管理与借阅平台&#xff0c;支持多书馆无缝切换与一键同步图书信息&#xff0c;为会员提供流畅的在线借书体验&#xff0c;同时赋予员工强大的管理工具&#xff0c;确保从会员到书馆的每一…

File的概述和构造方法

一.路径&#xff1a; 相对路径开头不带盘符。 二.File&#xff1a; 1.File对象&#xff1a; File对象就表示一个路径&#xff0c;可以是文件的路径&#xff0c;也可以是文件夹的路径&#xff0c; 这个路径可以是存在的&#xff0c;也可以是不存在的。 2.File对象常见的构造…

C:指针学习-指针变量—学习笔记

今日伊雷娜&#xff1a; 目录 前言&#xff1a; 1、字符指针变量 1.1 使用字符指针存放字符 1.2 使用字符指针变量存放字符串 2、数组指针变量 2.1 什么是数组指针变量&#xff1f; 2.2 数组指针变量初始化 2.3 关于数组指针类型的解析 3、函数指针变量 3.1 函数地址 …

如何将CSDN文章导出为pdf文件

第一步&#xff1a; 打开想要导出的页面&#xff0c;空白处点击鼠标右键⇒点击“检查”或“check”&#xff0c;或直接在页面按F12键。 第二步&#xff1a; 复制以下代码粘贴到控制台&#xff0c;并按回车。 若提示让输入“允许粘贴”或“allow pasting”&#xff0c;按提示…

InnoDB锁机制和事务管理介绍_案例解答

前言 本文对《Innodb 锁机制和事务管理介绍》这篇文章中的思考题进行解答。查看完解答后如果对原理有疑问的&#xff0c;可以重新看下原文帮助理解。 初始化信息 验证环境&#xff1a;8.0.28 MySQL Community Server&#xff0c;InnoDB引擎&#xff0c;RR隔离级别。 初始化信…

苍穹外卖项目DAY03

苍穹外卖项目Day03 1、菜品管理 1.1、公共字段自动填充 1.1.1、问题分析 业务表中的公共字段&#xff1a; 问题&#xff1a;代码冗余、不便于后期维护 1.1.2、实现思路 自定义注解AutoFill&#xff0c;用于标识需要进行公共字段自动填充的方法自定义切面类AutoFillAspect&…

Mybatis和Mybatis-plus区别和联系

MyBatis 和 MyBatis-Plus 是两个用于 Java 数据持久层的框架&#xff0c;它们在功能和使用场景上有所不同。如果项目需要高度自定义和复杂的 SQL 逻辑处理&#xff0c;且开发团队熟悉 SQL&#xff0c;那么 MyBatis 是一个更好的选择。相反&#xff0c;如果希望提高开发效率&…

EPLAN P8 2024-操作记录

目录 设备标识符包含页面 效果如下​编辑 步骤如下 连接点代号的分隔符创建 效果如下 步骤如下 中断点连接排序 效果如下 步骤如下 触点关联参考位置调整、 效果如下 步骤如下 端子排定义 效果如下 步骤如下 端子排连接 效果如下 离散端子操作如下 连接…

操作系统基础知识:调度器、闲逛进程,闲逛进程的特性,什么事件会触发“调度程序”?

被调度程序选中和时间用完由调度程序引起&#xff0c;调度程序决定&#xff1a; 让谁运行由调度算法决定&#xff1b;运行多长时间由时间片大小决定。 什么事件会触发“调度程序”? 1.创建新进程 2.进程退出 3.运行进程阻塞 4.I/0中断发生(可能唤醒某些阻塞进程) 非抢占式调…

「每周只上一天班」谷歌散漫制度遭前CEO怒斥:输给OpenAI,再下去要输创业公司了

「谷歌决定拥抱生活与工作平衡&#xff1a;更早下班、远程工作&#xff0c;胜过在竞争中取胜。」施密特说道。「而说到初创公司&#xff0c;他们之所以能成功&#xff0c;是因为人们在拼命地工作。」 在本周三公布的一份斯坦福大学公开课视频中&#xff0c;谷歌前 CEO 埃里克・…