SpringBoot + vue 管理系统

SpringBoot + vue 管理系统

文章目录
      • SpringBoot + vue 管理系统
        • 1、成品效果展示
        • 2、项目准备
        • 3、项目开发
          • 3.1、部门管理
            • 3.1.1、前端核心代码
            • 3.1.2、后端代码实现
          • 3.2、员工管理
            • 3.2.1、前端核心代码
            • 3.2.2、后端代码实现
          • 3.3、班级管理
            • 3.3.1、前端核心代码
            • 3.3.2、后端代码实现
          • 3.4、学生管理
            • 3.4.1、前端核心代码
            • 3.4.2、后端代码实现
          • 3.5、数据统计
            • 3.5.1、前端核心代码
            • 3.5.2、后端代码实现
          • 3.6、登录功能
            • 3.6.1、前端核心代码
            • 3.6.2、后端代码实现
1、成品效果展示

SpringBoot + vue 管理系统

2、项目准备

环境准备

SpringBoot + vue 管理系统_第1张图片

步骤:

  1. 准备数据库表

  2. 创建springboot工程,引入对应的起步依赖(web、mybatis、mysql驱动、lombok)

  3. 配置文件application.properties中引入mybatis的配置信息,准备对应的实体类

  4. 准备对应的Mapper、Service(接口、实现类)、Controller基础结构

    – 部门管理
    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());

    CREATE TABLE clazz (
    id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ‘ID,主键’,
    name varchar(30) NOT NULL UNIQUE COMMENT ‘班级名称’,
    room varchar(20) DEFAULT NULL COMMENT ‘班级教室’,
    begin_date date NOT NULL COMMENT ‘开课时间’,
    end_date date NOT NULL COMMENT ‘结课时间’,
    master_id int unsigned NOT NULL COMMENT ‘班主任ID, 关联员工表ID’,
    create_time datetime NOT NULL COMMENT ‘创建时间’,
    update_time datetime NOT NULL COMMENT ‘修改时间’
    ) COMMENT ‘班级表’;

    INSERT INTO clazz VALUES (1,‘黄埔班一期’,‘212’,‘2023-04-30’,‘2023-06-29’,10,‘2023-06-01 17:08:23’,‘2023-06-01 17:39:58’),
    (2,‘黄埔班二期’,‘211’,‘2023-06-25’,‘2023-12-31’,1,‘2023-06-01 17:34:16’,‘2023-06-01 17:43:43’),
    (3,‘黄埔班三期’,‘210’,‘2023-07-10’,‘2024-01-20’,3,‘2023-06-01 17:45:12’,‘2023-06-01 17:45:12’),
    (4,‘JavaEE就业165期’,‘108’,‘2023-06-15’,‘2023-12-25’,6,‘2023-06-01 17:45:40’,‘2023-06-01 17:45:40’),
    (5,‘JavaEE就业166期’,‘105’,‘2023-07-20’,‘2024-02-20’,20,‘2023-06-01 17:46:10’,‘2023-06-01 17:46:10’),
    (6,‘黄埔四期’,‘209’,‘2023-08-01’,‘2024-02-15’,7,‘2023-06-01 17:51:21’,‘2023-06-01 17:51:21’);

    CREATE TABLE student (
    id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ‘ID,主键’,
    name varchar(10) NOT NULL COMMENT ‘姓名’,
    no char(10) NOT NULL UNIQUE COMMENT ‘学号’,
    gender tinyint unsigned NOT NULL COMMENT ‘性别, 1: 男, 2: 女’,
    phone varchar(11) NOT NULL UNIQUE COMMENT ‘手机号’,
    degree tinyint unsigned DEFAULT NULL COMMENT ‘最高学历, 1:初中, 2:高中, 3:大专, 4:本科, 5:硕士, 6:博士’,
    violation_count tinyint unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘违纪次数’,
    violation_score tinyint unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘违纪扣分’,
    clazz_id int unsigned NOT NULL COMMENT ‘班级ID, 关联班级表ID’,
    create_time datetime NOT NULL COMMENT ‘创建时间’,
    update_time datetime NOT NULL COMMENT ‘修改时间’
    ) COMMENT ‘学生表’;

    INSERT INTO student VALUES (1,‘Tom’,‘2023001001’,1,‘18909091212’,4,0,0,1,‘2023-06-01 18:28:58’,‘2023-06-01 18:28:58’),
    (2,‘Cat’,‘2023001002’,2,‘18909092345’,3,0,0,1,‘2023-06-01 18:34:57’,‘2023-06-01 18:34:57’),
    (3,‘Lily’,‘2023001003’,2,‘13309230912’,4,2,5,1,‘2023-06-01 18:35:23’,‘2023-06-01 19:37:42’),
    (4,‘Jerry’,‘2023001004’,1,‘15309232323’,4,1,2,1,‘2023-06-01 18:35:48’,‘2023-06-01 19:37:35’),
    (6,‘Nacos’,‘2023002001’,1,‘18809091212’,1,3,10,2,‘2023-06-01 18:57:32’,‘2023-06-01 19:37:29’);

生成的pom.xml文件



    4.0.0
    com.tlias
    web-tlias
    0.0.1-SNAPSHOT
    web-tlias
    web-tlias
    
        1.8
        UTF-8
        UTF-8
        2.7.6
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.3.0
        

        
            com.mysql
            mysql-connector-j
            runtime
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            com.github.pagehelper
            pagehelper-spring-boot-starter
            1.4.2
        


        
            com.aliyun.oss
            aliyun-sdk-oss
            3.15.2
        

        
            io.jsonwebtoken
            jjwt
            0.9.1
        
        
            com.alibaba
            fastjson
            1.2.76
        

        
            org.springframework.boot
            spring-boot-starter-aop
        
    
    
        
            
                org.springframework.boot
                spring-boot-dependencies
                ${spring-boot.version}
                pom
                import
            
        
    

    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.8.1
                
                    1.8
                    1.8
                    UTF-8
                
            
            
                org.springframework.boot
                spring-boot-maven-plugin
                ${spring-boot.version}
                
                    com.tlias.WebTliasApplication
                    true
                
                
                    
                        repackage
                        
                            repackage
                        
                    
                
            
        
    

创建项目工程目录结构

SpringBoot + vue 管理系统_第2张图片

配置文件application.yml

server:
  port: 8080

mybatis:
  mapper-locations: classpath:mappers/*xml
  type-aliases-package: com.tlias.entity
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tlias
    username: root
    password: 123456
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 100MB

pagehelper:
  reasonable: true

aliyun:
  oss:
    endpoint: https://oss-cn-beijing.aliyuncs.com
    accessKeyId: you_acesskey
    accessKeySecret: you_accessKeySecret
    bucketName: tlias-lwj

设置统一返回数据

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
    private int code;
    private String msg;
    private Object data;

    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(String msg) {
        return new Result(0,msg,null);
    }

}

构建一个vue项目

SpringBoot + vue 管理系统_第3张图片

3、项目开发

功能模块分为六部分:班级管理、学员管理、部门管理、员工管理、员工信息统计、学员信息统计

3.1、部门管理

开发的部门管理功能包含:

  1. 查询部门
  2. 删除部门
  3. 新增部门
  4. 更新部门
3.1.1、前端核心代码



3.1.2、后端代码实现

实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {
    private Integer id;
    private String name;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

controller层

@RestController
@RequestMapping("depts")
@Slf4j
public class DeptController {

    @Autowired
    private DeptService service;

    /**
     * 查询部门
     * @return
     */
    @GetMapping
    public Result getDept(){
        log.info("查询部门数据");
        List list = service.getDeptList();
        return Result.success(list);
    }

    /**
     * 根据id删除部门
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")

    public Result deleteDeptById(@PathVariable("id") Integer id){
        log.info("删除部门id {}",id);
        service.deleteDeptById(id);
        return Result.success();
    }

    /**
     * 新增部门
     * @param dept
     * @return
     */
    @PostMapping
    public Result save(@RequestBody Dept dept){
        log.info("新增部门 {}",dept);
        service.save(dept);
        return Result.success();
    }

    /**
     * 根据id查询部门
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result selectDeptById(@PathVariable("id") Integer id){
        log.info("根据id查询部门{}",id);
        Dept dept = service.selectDeptById(id);
        return Result.success(dept);
    }

    /**
     * 修改部门
     * @param dept
     * @return
     */
    @PutMapping
    public Result update(@RequestBody Dept dept){
        log.info("修改部门信息{}",dept);
        service.update(dept);
        return Result.success();
    }
}

service层

service接口

public interface DeptService {
    /**
     * 查询部门
     * @return
     */
    List getDeptList();

    /**
     * 删除部门
     * @param id
     */
    void deleteDeptById(Integer id);

    /**
     * 新增部门
     * @param dept
     */
    void save(Dept dept);

    /**
     * 根据id查询部门
     * @param id
     * @return
     */
    Dept selectDeptById(Integer id);

    /**
     * 修改部门信息
     * @param dept
     */
    void update(Dept dept);
}

serviceImpl

@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private EmpMapper empMapper;

    /**
     * 查询部门
     *
     * @return
     */
    @Override
    public List getDeptList() {
        List list =  deptMapper.getDeptList();
        return list;
    }

    /**
     * 删除部门
     *
     * @param id
     */
    @Override
    public void deleteDeptById(Integer id) {
        Integer result = empMapper.selectEmpByDeptId(id);
        if (result < 1 ){
            throw new RuntimeException("不能删除部门,部门下面存在员工");
        }
        deptMapper.deleteDeptById(id);
    }

    /**
     * 新增部门
     *
     * @param dept
     */
    @Override
    public void save(Dept dept) {
        //添加修改时间
        dept.setCreateTime(LocalDateTime.now());
        dept.setUpdateTime(LocalDateTime.now());

        deptMapper.save(dept);
    }

    /**
     * 根据id查询部门
     *
     * @param id
     * @return
     */
    @Override
    public Dept selectDeptById(Integer id) {
        Dept dept =  deptMapper.selectDeptById(id);
        return dept;
    }

    /**
     * 修改部门信息
     *
     * @param dept
     */
    @Override
    public void update(Dept dept) {
        dept.setUpdateTime(LocalDateTime.now());
        deptMapper.update(dept);
    }
}

mapper层

@Mapper
public interface DeptMapper {
    /**
     * 查询部门
     * @return
     */
    @Select("select * from dept")
    List getDeptList();

    /**
     * 删除部门
     * @param id
     */
    @Delete("delete from dept where id = #{id}")
    void deleteDeptById(Integer id);

    /**
     * 新增部门
     * @param dept
     */
    @Insert("insert into dept values (null,#{name},#{createTime},#{updateTime})")
    void save(Dept dept);

    /**
     * 根据id查询部门
     * @param id
     * @return
     */
    @Select("select * from dept where id = #{id}")
    Dept selectDeptById(Integer id);

    /**
     * 修改部门信息
     * @param dept
     */
    @Update("update dept set name = #{name},update_time = #{updateTime} where id = #{id}")
    void update(Dept dept);
}
3.2、员工管理

我们可以把员工管理功能分为:

  1. 分页查询
  2. 带条件的分页查询
  3. 删除员工
  4. 新增员工
  5. 修改员工
3.2.1、前端核心代码




3.2.2、后端代码实现

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private Short gender;
    private String image;
    private Short job;
    private LocalDate entrydate;
    private Integer deptId;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

controller

@RestController
@RequestMapping("/emps")
@Slf4j
public class EmpController {

    @Autowired
    private EmpService service;

    /**
     * 分页查询
     * @param page
     * @param pageSize
     * @param name
     * @param gender
     * @param begin
     * @param end
     * @return
     */
    @GetMapping
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize,
                       String name, Short gender,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
        log.info("员工分页查询 page = {},pageSize = {}", page, pageSize);
        PageBean pageBean = service.page(page,pageSize,name,gender,begin,end);
        return Result.success(pageBean);
    }

    /**
     * 删除
     * @param ids
     * @return
     */
    @DeleteMapping("/{ids}")
    public Result deleteByIds(@PathVariable("ids") List ids){
        log.info("删除 ids = {}", ids);
        service.deleteByIds(ids);
        return Result.success();
    }

    /**
     * 新增员工
     * @param emp
     * @return
     */
    @PostMapping
    public Result save(@RequestBody Emp emp){
        log.info("新增员工 {}", emp);
        service.save(emp);
        return Result.success();
    }

    /**
     * 根据id查询员工
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result selectById(@PathVariable Integer id){
        log.info("根据id查询员工");
        Emp emp = service.selectById(id);
        return Result.success(emp);
    }

    @PutMapping
    public Result update(@RequestBody Emp emp){
        log.info("修改员工{}",emp);
        service.update(emp);
        return Result.success();
    }

    @GetMapping("/list")
    public Result selectAll(){
        log.info("查询全部员工");
        List list = service.selectAll();
        return Result.success(list);
    }
}

service层

public interface EmpService {
    /**
     * 员工分页查询
     *
     * @param page
     * @param pageSize
     * @param name
     * @param gender
     * @param begin
     * @param end
     * @return
     */
    PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end);

    /**
     * 删除
     * @param ids
     */
    void deleteByIds(List ids);

    /**
     * 新增员工
     * @param emp
     */
    void save(Emp emp);

    /**
     * 根据id查询员工
     * @param id
     * @return
     */
    Emp selectById(Integer id);

    /**
     * 修改员工
     * @param emp
     */
    void update(Emp emp);

    /**
     * 查询全部员工
     * @return
     */
    List selectAll();

    /**
     * 员工登录
     * @param emp
     * @return
     */
    Emp login(Emp emp);
}


@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;


    @Override
    public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {
        //设置分页参数
        PageHelper.startPage(page,pageSize);
        //进行查询
        List list = empMapper.list(name,gender,begin,end);

        //获取分页结果
        Page empPage = (Page) list;

        return new PageBean(empPage.getTotal(),empPage.getResult());
    }

    /**
     * 删除
     *
     * @param ids
     */
    @Override
    public void deleteByIds(List ids) {
        empMapper.deleteByIds(ids);
    }

    /**
     * 新增员工
     *
     * @param emp
     */
    @Override
    public void save(Emp emp) {
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.save(emp);
    }

    /**
     * 根据id查询员工
     *
     * @param id
     * @return
     */
    @Override
    public Emp selectById(Integer id) {
        Emp emp = empMapper.selectById(id);
        return emp;
    }

    /**
     * 修改员工
     *
     * @param emp
     */
    @Override
    public void update(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);
    }

    /**
     * 查询全部员工
     *
     * @return
     */
    @Override
    public List selectAll() {
        List list = empMapper.selectAll();
        return list;
    }

    /**
     * 员工登录
     *
     * @param emp
     * @return
     */
    @Override
    public Emp login(Emp emp) {
        return empMapper.getEmpByUsernameAndPassword(emp);
    }
}

mapper层

@Mapper
public interface EmpMapper {
    /**
     * 查询部门下是否有员工
     * @param id
     * @return
     */
    @Select("select  count(*) from emp where dept_id = #{id}")
    Integer selectEmpByDeptId(Integer id);
    /**
     * 查询
     */
//    @Select("select * from emp")
    List list(@Param("name") String name,@Param("gender") Short gender,
                   @Param("begin") LocalDate begin,@Param("end") LocalDate end);

    /**
     * 删除
     * @param ids
     */
    void deleteByIds(@Param("ids") List ids);

    /**
     * 新增员工
     * @param emp
     */
    @Insert("insert into emp values (null,#{username},#{password},#{name},#{gender}" +
            ",#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    void save(Emp emp);

    /**
     * 根据id查询员工
     * @param id
     * @return
     */
    @Select("select * from emp where id = #{id}")
    Emp selectById(Integer id);

    /**
     * 修改员工
     * @param emp
     */
    @Update("update emp set username = #{username},password = #{password}," +
            "name = #{name},gender = #{gender},image = #{image},job = #{job}," +
            "entrydate = #{entrydate},dept_id = #{deptId},create_time = #{createTime}," +
            "emp.update_time = #{updateTime} where id = #{id}")
    void update(Emp emp);

    /**
     * 查询全部员工
     * @return
     */
    @Select("select * from emp")
    List selectAll();

    /**
     * 员工性别统计
     * @return
     */
    List getEmpGenderData();


    /**
     * 员工职位统计
     * @return
     */

    @Select("select (case job
" +
            "            when 1 then '班主任'" +
            "            when 2 then '讲师'" +
            "            when 3 then '学工主管'" +
            "            when 4 then '教研主管'" +
            "            when 4 then '咨询师'" +
            "            else '无' end) as job," +
            "       count(*) as jobcount" +
            " from emp" +
            " group by job")
   List> getEmpJobData();

    /**
     * 员工登录
     * @param emp
     * @return
     */
    @Select("select * from emp where username = #{username} and  password = #{password}")
    Emp getEmpByUsernameAndPassword(Emp emp);
}

mapper.xml






    
        delete from emp
        where id in
        
            #{id}
        
    


    
    


因为需要涉及到oss文件上传所以我们还需要整合

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class aliyunOssProperties {

    private String endpoint;

    private String accessKeyId;

    private String accessKeySecret;

    private String bucketName;
}


@Component
public class aliyunUtils {
    @Autowired
    private aliyunOssProperties properties;

    public String upload(MultipartFile multipartFile) throws IOException {

        String endpoint = properties.getEndpoint();
        String accessKeyId = properties.getAccessKeyId();
        String accessKeySecret = properties.getAccessKeySecret();
        String bucketName = properties.getBucketName();


        //生成上传名称
        String originalFilename = multipartFile.getOriginalFilename();
        String objectName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);

        try {
            InputStream inputStream = multipartFile.getInputStream();
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);

            // 上传文件。
            PutObjectResult result = ossClient.putObject(putObjectRequest);

            return endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "//" +objectName;
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
3.3、班级管理

开发的班级管理功能包含:

  1. 查询班级
  2. 删除班级
  3. 新增班级
  4. 更新班级
3.3.1、前端核心代码




3.3.2、后端代码实现

实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Clazz {
    private Integer id;
    private String name;
    private String room;
    private LocalDate beginDate;
    private LocalDate endDate;
    private Integer masterId;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

controller层

@RestController
@RequestMapping("/clazzs")
@Slf4j
public class ClazzController {

    @Autowired
    private ClazzService clazzService;

    /**
     * 查询所有
     * @return
     */
    @GetMapping
    public Result findAll(){
        log.info("findAll...");
        List list = clazzService.findAll();
        return Result.success(list);
    }

    /**
     * 新增班级
     * @param clazz
     * @return
     */
    @PostMapping
    public Result save(@RequestBody Clazz clazz){
        log.info("save{}",clazz);
        clazzService.save(clazz);
        return Result.success();
    }

    /**
     * 根据id删除班级
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    public Result deleteById(@PathVariable Long id){
        log.info("deleteById...{}",id);
        clazzService.deleteById(id);
        return Result.success();
    }

    /**
     * 根据id查询班级
     */
    @GetMapping("/{id}")
    public Result findById(@PathVariable Long id){
        log.info("findById...{}",id);
        Clazz clazz = clazzService.findById(id);
        return Result.success(clazz);
    }

    /**
     * 更新班级
     * @param clazz
     * @return
     */
    @PutMapping
    public Result update(@RequestBody Clazz clazz){
        log.info("update...{}",clazz);
        clazzService.update(clazz);
        return Result.success();
    }
}

service

public interface ClazzService {
    /**
     * 查询所有班级
     * @return
     */
    List findAll();

    /**
     * 新增班级
     * @param clazz
     */
    void save(Clazz clazz);

    /**
     * 根据id删除班级
     * @param id
     */
    void deleteById(Long id);

    /**
     * 根据id查询班级
     * @param id
     * @return
     */
    Clazz findById(Long id);

    /**
     * 更新班级
     * @param clazz
     */
    void update(Clazz clazz);
}


@Service
public class ClazzServiceImpl implements ClazzService {

    @Autowired
    private ClazzMapper clazzMapper;

    /**
     * 查询所有班级
     *
     * @return
     */
    @Override
    public List findAll() {
        List clazzList = clazzMapper.findAll();
        return clazzList;
    }

    /**
     * 新增班级
     *
     * @param clazz
     */
    @Override
    public void save(Clazz clazz) {
        clazz.setCreateTime(LocalDateTime.now());
        clazz.setUpdateTime(LocalDateTime.now());
        clazzMapper.save(clazz);
    }

    /**
     * 根据id删除班级
     *
     * @param id
     */
    @Override
    public void deleteById(Long id) {
        clazzMapper.deleteById(id);
    }

    /**
     * 根据id查询班级
     *
     * @param id
     * @return
     */
    @Override
    public Clazz findById(Long id) {
        Clazz clazz = clazzMapper.findById(id);
        return clazz;
    }

    /**
     * 更新班级
     *
     * @param clazz
     */
    @Override
    public void update(Clazz clazz) {
        clazz.setUpdateTime(LocalDateTime.now());
        clazzMapper.update(clazz);
    }
}

mapper层

@Mapper
public interface ClazzMapper {
    /**
     * 查询所有班级
     * @return
     */
    @Select("select * from clazz")
    List findAll();

    /**
     * 新增班级
     * @param clazz
     */
    @Insert("insert into clazz values (null,#{name},#{room},#{beginDate},#{endDate},#{masterId}," +
            "#{createTime},#{updateTime})")
    void save(Clazz clazz);

    /**
     * 根据id删除班级
     * @param id
     */
    @Delete("delete from clazz where id = #{id}")
    void deleteById(Long id);

    /**
     * 根据id查询班级
     * @param id
     * @return
     */
    @Select("select * from clazz where id = #{id};")
    Clazz findById(Long id);

    /**
     * 更新班级
     * @param clazz
     */
    @Update("update clazz set name = #{name},room = #{room},begin_date = #{beginDate}," +
            "end_date = #{endDate},master_id = #{masterId} where id = #{id}")
    void update(Clazz clazz);
}
3.4、学生管理

我们可以把员工管理功能分为:

  1. 分页查询
  2. 带条件的分页查询
  3. 删除员工
  4. 新增员工
  5. 修改员工
3.4.1、前端核心代码




3.4.2、后端代码实现

实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private Integer id;
    private String name;
    private String no;
    private Short gender;
    private String phone;
    private Short degree;
    private Short violationCount;
    private Short violationScore;
    private Short clazzId;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}


@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentData {
    private List categoryList;
    private List dataList;
}

controller

package com.tlias.controller;

import com.github.pagehelper.Page;
import com.tlias.entity.PageBean;
import com.tlias.entity.Student;
import com.tlias.result.Result;
import com.tlias.service.StudentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/students")
@Slf4j
public class StudentController {

    @Autowired
    private StudentService studentService;

    @GetMapping
    public Result page(String name, Short gender,
                       @RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize){
        log.info("员工分页查询 page={},pageSize={}", page, pageSize);
        PageBean pageBean = studentService.page(page,pageSize,name,gender);
        return Result.success(pageBean);
    }

    /**
     * 查询全部
     * @return
     */
    @GetMapping("/list")
    public Result findAll(){
        log.info("findAll...");
        List studentList = studentService.findAll();
        return Result.success(studentList);
    }

    /**
     * 新增学生
     * @param student
     * @return
     */
    @PostMapping()
    public Result save(@RequestBody Student student){
        log.info("save student...{}",student);
        studentService.save(student);
        return Result.success();
    }

    /**
     * 根据id查询学生
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result findById(@PathVariable Long id){
        log.info("findById...{}",id);
        Student student = studentService.findById(id);
        return Result.success(student);
    }

    /**
     * 修改学生
     * @param student
     * @return
     */
    @PutMapping
    public Result update(@RequestBody Student student){
        log.info("update student...{}",student);
        studentService.update(student);
        return Result.success();
    }

    /**
     * 删除
     * @param ids
     * @return
     */
    @DeleteMapping("/{ids}")
    public Result deleteById(@PathVariable List ids){
        log.info("deleteById...{}",ids);
        studentService.deleteById(ids);
        return Result.success();
    }

}

service

public interface StudentService {
    /**
     * 分页查询
     * @param page
     * @param pageSize
     * @param name
     * @param gender
     * @return
     */
    PageBean page(Integer page, Integer pageSize, String name, Short gender);

    /**
     * 查询全部
     * @return
     */
    List findAll();

    /**
     * 新增学生
     * @param student
     */
    void save(Student student);

    /**
     * 根据id查询学生
     * @param id
     * @return
     */
    Student findById(Long id);

    /**
     * 修改学生
     * @param student
     */
    void update(Student student);

    /**
     * 根据id删除
     * @param ids
     */
    void deleteById(List ids);
}



@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper studentMapper;

    /**
     * 分页查询
     *
     * @param page
     * @param pageSize
     * @param name
     * @param gender
     * @return
     */
    @Override
    public PageBean page(Integer page, Integer pageSize, String name, Short gender) {
        PageHelper.startPage(page,pageSize);
        List list = studentMapper.page(name,gender);
        Page studentPage = (Page) list;
        return new PageBean(studentPage.getTotal(),studentPage.getResult());
    }

    /**
     * 查询全部
     *
     * @return
     */
    @Override
    public List findAll() {
        List studentList = studentMapper.findAll();
        return studentList;
    }

    /**
     * 新增学生
     *
     * @param student
     */
    @Override
    public void save(Student student) {
        student.setCreateTime(LocalDateTime.now());
        student.setUpdateTime(LocalDateTime.now());
        studentMapper.save(student);
    }

    /**
     * 根据id查询学生
     *
     * @param id
     * @return
     */
    @Override
    public Student findById(Long id) {
        return studentMapper.findById(id);
    }

    /**
     * 修改学生
     *
     * @param student
     */
    @Override
    public void update(Student student) {
        student.setUpdateTime(LocalDateTime.now());
        studentMapper.update(student);
    }

    /**
     * 根据id删除
     *
     * @param ids
     */
    @Override
    public void deleteById(List ids) {
        studentMapper.deleteById(ids);
    }

}

mapper

@Mapper
public interface StudentMapper {
    @Select("SELECT clazz.`name` as 'class',COUNT(student.clazz_id) as 'classcount' " +
            "FROM clazz LEFT JOIN student ON student.clazz_id = clazz.id GROUP BY clazz.`name` ;")
    List> getStudentData();

    /**
     * 分页查询
     * @param name
     * @param gender
     * @return
     */
    List page(@Param("name") String name,@Param("gender") Short gender);

    /**
     * 查询全部
     * @return
     */
    @Select("select * from student")
    List findAll();

    /**
     * 新增学生
     * @param student
     */
    @Insert("insert into student(name, no, gender, phone,clazz_id, create_time, update_time) " +
            "value(#{name},#{no},#{gender},#{phone},#{clazzId},#{createTime},#{updateTime})")
    void save(Student student);

    /**
     * 根据id查询学生
     * @param id
     * @return
     */
    @Select("select * from student where id = #{id};")
    Student findById(Long id);

    /**
     * 修改学生
     * @param student
     */
    @Update("update student set name = #{name},no = #{no},gender = #{gender}," +
            "phone = #{phone},clazz_id = #{clazzId} where id = #{id}")
    void update(Student student);

    /**
     * 根据id删除
     * @param ids
     */
    void deleteById(@Param("ids") List ids);
}






    
        delete from student where id in
        
            #{id}
        
    
    

3.5、数据统计
3.5.1、前端核心代码





3.5.2、后端代码实现

实体类

@Data
public class PieChartData {
    private String name;
    private String value;
}


@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentData {
    private List categoryList;
    private List dataList;
}

controller

@RestController
@RequestMapping("/report")
@Slf4j
public class ReportController {

    @Autowired
    private ReportService service;

    @GetMapping("/empGenderData")
    public Result getEmpGenderData(){
        log.info("员工性别信息信息");
        List list = service.getEmpGenderData();
        return Result.success(list);
    }

    @GetMapping("/empJobData")
    public Result getEmpJobData(){
        log.info("员工职位信息");
        JobData jobData  = service.getEmpJobData();
        return Result.success(jobData);
    }

    @GetMapping("/studentData")
    public Result getStudentData(){
        log.info("学员人数统计");
        StudentData studentData = service.getStudentData();
        return Result.success(studentData);
    }
}

service层

public interface ReportService {
    /**
     * 员工性别统计
     * @return
     */
    List getEmpGenderData();

    /**
     * 员工职位信息统计
     * @return
     */
    JobData getEmpJobData();

    /**
     * 学员统计
     * @return
     */
    StudentData getStudentData();
}


@Service
public class ReportServiceImpl implements ReportService {

    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private StudentMapper studentMapper;

    /**
     * 员工性别统计
     *
     * @return
     */
    @Override
    public List getEmpGenderData() {
        List list = empMapper.getEmpGenderData();
        return list;
    }

    /**
     * 员工职位信息统计
     *
     * @return
     */
    @Override
    public JobData getEmpJobData() {
        List> mapList = empMapper.getEmpJobData();
        System.out.println(mapList);
        if (!CollectionUtils.isEmpty(mapList)) {
            List categoryList = mapList.stream().map(map -> {
                return map.get("job");
            }).collect(Collectors.toList());

            List dataList = mapList.stream().map(map -> {
                return map.get("jobcount");
            }).collect(Collectors.toList());

            JobData jobData = new JobData();
            jobData.setCategoryList(categoryList);
            jobData.setDataList(dataList);
            System.out.println(jobData);
            return jobData;
        }

        return null;
    }

    /**
     * 学员统计
     *
     * @return
     */
    @Override
    public StudentData getStudentData() {
        List> mapList = studentMapper.getStudentData();
        System.out.println(mapList);

        if (!CollectionUtils.isEmpty(mapList)){
            List categoryList = mapList.stream().map(map -> {
                return map.get("class");
            }).collect(Collectors.toList());

            List dataList = mapList.stream().map(map -> {
                return map.get("classcount");
            }).collect(Collectors.toList());

            return new StudentData(categoryList,dataList);
        }
        return null;
    }
}
 
  
3.6、登录功能

我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了后台。 这是不安全的,所以要做登录认证。 最终我们要实现的效果就是用户必须登录之后,才可以访问后台系统中的功能

JWT令牌最典型的应用场景就是登录认证:

  1. 在浏览器发起请求来执行登录操作,此时会访问登录的接口,如果登录成功之后,我们需要生成一个jwt令牌,将生成的 jwt令牌返回给前端。
  2. 前端拿到jwt令牌之后,会将jwt令牌存储起来。在后续的每一次请求中都会将jwt令牌携带到服务端。
  3. 服务端统一拦截请求之后,先来判断一下这次请求有没有把令牌带过来,如果没有带过来,直接拒绝访问,如果带过来了,还要校验一下令牌是否是有效。如果有效,就直接放行进行请求的处理。

在JWT登录认证的场景中我们发现,整个流程当中涉及到两步操作:

  1. 在登录成功之后,要生成令牌。
  2. 每一次请求当中,要接收令牌并对令牌进行校验。
3.6.1、前端核心代码







3.6.2、后端代码实现

创建工具类,实现jwt令牌的发放和解析

public class JwtUtils {

    private static String signKey = "jwtHelloWorld";
    private static Long expire = 60 * 60 * 1000L;

    public static String generateToken(Map claims) {
        String token = Jwts.builder()
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return token;
    }

    public static Claims parseToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(token)
                .getBody();
        return claims;
    }
}

创建拦截器,进行拦截

/**
 * 自定义拦截器
 */
@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //1、获取请求url
        String url = request.getRequestURI().toString();

        //3、获取请求头中的token
        String token = request.getHeader("token");
        if (!StringUtils.hasLength(token)){ //不存在
            log.info("获取令牌为空");
            Result notLogin = Result.error("NOT_LOGIN");
            String json = JSONObject.toJSONString(notLogin);
            response.getWriter().write(json);
            return false;
        }

        //4、解析token,失败则未登录
        try {
            Claims claims = JwtUtils.parseToken(token);
        } catch (Exception e) {
            log.info("解析令牌错误");
            Result notLogin = Result.error("NOT_LOGIN");
            String json = JSONObject.toJSONString(notLogin);
            response.getWriter().write(json);
            return false;
        }
        //5、放行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

controller层

@RestController
@Slf4j
public class LoginController {

    @Autowired
    private EmpService empService;

    @PostMapping("/login")
    public Result login(@RequestBody Emp emp){
        log.info("员工登录{}",emp);
        Emp empLogin = empService.login(emp);
        if (empLogin != null){
            Map map = new HashMap<>();
            map.put("id", empLogin.getId());
            map.put("username", empLogin.getUsername());
            String token = JwtUtils.generateToken(map);
            return Result.success(token);
        }
        return Result.error("查无此用户");
    }
}

你可能感兴趣的:(面试,学习路线,阿里巴巴,spring,boot,vue.js,后端)