Contents

MyTlias-员工信息管理系统(一)-整体框架的搭建

本小节主要完成项目文件准备, 以及第一个功能实现: 部门信息展示. 并使用PostMan/Apifox测试接口数据是否正常返回, 复习三层架构的实现以及当初引入三层架构的缘起.

1. 工作准备

1.1. 新建项目

在IDEA新建一个Springboot项目, 选择 Mybatis3 + JDK17, 勾选 lombok/Spring Web/Mybatis/MySQL Server等4个依赖.

1.2. 准备数据库表

IDEA连接上MySQL Server, 新建一个 db_tlias 数据库(schema): 执行建表语句和数据插入语句

-- 部门管理
create table dept(
    id int unsigned primary key auto_increment comment '主键ID',
    name varchar(10) not null unique comment '部门名称',
    create_time datetime not null comment '创建时间',
    update_time datetime not null comment '修改时间'
) comment '部门表';

insert into dept (id, name, create_time, update_time) values
(1,'学工部',now(),now()),
(2,'教研部',now(),now()),
(3,'咨询部',now(),now()),
(4,'就业部',now(),now()),
(5,'人事部',now(),now());

-- 员工管理(带约束)
create table emp (
    id int unsigned primary key auto_increment comment 'ID',
    username varchar(20) not null unique comment '用户名',
    password varchar(32) default '123456' comment '密码',
    name varchar(10) not null comment '姓名',
    gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
    image varchar(300) comment '图像',
    job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
    entrydate date comment '入职时间',
    dept_id int unsigned comment '部门ID',
    create_time datetime not null comment '创建时间',
    update_time datetime not null comment '修改时间'
) comment '员工表';

INSERT INTO emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,now(),now()),
(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());

1.3. 准备数据实体

员工实体: Employee 部门实体: Department 响应数据: Result 它们均位于package com.example.mytlias.pojo

// Employee.java
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Employee {
    Integer id;         // id, 主键, 非空, 自增长
    String username;    // 用户名
    String password;    // 密码
    String name;        // 姓名
    Short gender;       // 性别, 1: 男, 2: 女
    String image;       // 照片
    Short job;          // 职位, 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师
    LocalDate entrydate;    // 入职日期
    Integer deptId;         // 部门id
    LocalDateTime createTime;   // 条目创建时间
    LocalDateTime updateTime;   // 最后更新时间
}
// Department.java
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Department {
    Integer id;     // 部门 id
    String name;    // 部门名称
    LocalDateTime createTime;   // 创建时间
    LocalDateTime updateTime;   // 更新时间
}
// Result.java
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Result {
    private Integer code;   // 0: failure, 1: success
    private String msg;
    private Object data;
    // factory
    public static Result success(){
        return new Result(1, "success", null);
    }
    public static Result success(Object data){
        return new Result(1, "success", data);
    }
    public static Result error(Object data){
        return new Result(0, "error", null);
    }
}

2 完成部门信息展示

在部门信息展示页面中只需要查询得到所有部门的信息即可, 不需要分页, 也么有查询条件

2.1 properties

配置数据库连接信息

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_tlias
spring.datasource.username=root
spring.datasource.password=root226
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis.configuration.map-underscore-to-camel-case=true

2.2 DAO 层

也即数据访问层, 该层需要定义数据访问的接口和方法, 新建 mapper 包以存放数据访问代码(这里是通过MyBatis框架访问MySQL数据库的数据表得到的)

@Mapper
public interface DeptMapper {
    @Select("select id, name, create_time, update_time from dept")
    public List<Department> listDepartment();
}

如上所示, 仅包含一个方法, 也即列出所有的 Department 信息, SQL 语句被写在注解里

2.3 Service 层

Service 层调用 DAO 层以获取数据, 在这一层次, 原始数据已经得到了, 它不需要关心数据是具体如何获取, 只关心应该做怎样的处理以使得数据适合 Controller 层的需要: package com.example.mytlias.service

public interface DeptService {
    List<Department> listDepartment();
}

package com.example.mytlias.service.impl

@Service
public class DeptServiceImpl implements DeptService {
    @Autowired
    private DeptMapper deptMapper;
    @Override
    public List<Department> listDepartment() {
        return deptMapper.listDepartment();
    }
}

如上所示, 首先定义了 Service 接口, 这个接口用于与Controller的通信, 其次新建了 impl 子包, 它存放该接口的实现.

2.4 Controller 层

这一层负责与 web 相关的内容, 它接收web请求, 返回响应数据.

com.example.mytlias.controller

@RestController
public class DeptController {
    @Autowired
    private DeptService deptService;
    @GetMapping("/depts")
    public Result listDepartment(){
        return Result.success(deptService.listDepartment());
    }
}

利用 ApiFox 测试结果 访问 localhost:8080/depts, 使用 GET 方式, 获得数据:

{
    "code": 1,
    "msg": "success",
    "data": [
        {
            "id": 1,
            "name": "学工部",
            "createTime": "2023-07-13T15:10:25",
            "updateTime": "2023-07-13T15:10:25"
        },
        {
            "id": 2,
            "name": "教研部",
            "createTime": "2023-07-13T15:10:25",
            "updateTime": "2023-07-13T15:10:25"
        },
        {
            "id": 3,
            "name": "咨询部",
            "createTime": "2023-07-13T15:10:25",
            "updateTime": "2023-07-13T15:10:25"
        },
        {
            "id": 4,
            "name": "就业部",
            "createTime": "2023-07-13T15:10:25",
            "updateTime": "2023-07-13T15:10:25"
        },
        {
            "id": 5,
            "name": "人事部",
            "createTime": "2023-07-13T15:10:25",
            "updateTime": "2023-07-13T15:10:25"
        }
    ]
}

至此, 一个简单的初步的 SpringBoot 项目就弄好了, 以下为项目结构: 根目录: src/main/java/

com.example.mytlias
---- controller
---- ---- DeptController.java
---- ---- EmpController.java
---- mapper
---- ---- EmpMapper.java
---- ---- DeptMapper.java
---- pojo
---- ---- Employee.java
---- ---- Department.java
---- ---- Result.java
---- service
---- impl
---- ---- DeptServiceImpl.java
---- ---- EmpServiceImpl.java
---- DeptService.java
---- EmpService.java
---- MyTliasApplication.java