基于springboot+vue的后台用户管理系统(一)

一、项目背景

1.springboot

        springboot是所有基于spring开发项目的起点。springboot的设计是为了尽可能快的启动spring应用程序,并且尽可能的减少配置文件。约定优于配置,一种软件设计范式。

        spring是javaEE的轻量化替代品,同时通过依赖注入和面向切面编程,使其功能强大;不过它的组件代码虽然是轻量化的,但是它的配置文件却是重量级的。尽管在后续的更新开发中,通过引入基于注解的组件扫描、基于java的可重构配置,一定程度上降低了程度;不过项目的依赖管理也还是一种耗时耗力的事情。

        springboot对于spring的问题进行了改善和优化,同时基于约定优于配置的思想,可以使得开发人员不必在配置和逻辑业务中进行思维的转换,全身心投入逻辑业务的代码编写中,从而大大提高开发效率,一定程度上缩短了项目周期。

2.vue

        vue是一个构建数据驱动的web界面的渐进式框架。

        vue的目标是通过尽可能简单的API实现响应的数据绑定和组合视图组件。易于上手,同时易于与第三方库或既有项目的整合。

        vue专注于MVVM的view层;它的核心是MVVM中的VM,即ViewModel,负责连接view和model,保证视图与数据的一致性,这种轻量化的架构让前端开发更加高效、便捷。

3.选择

        开发一个项目,选择更加高校、便捷而且轻量化配置的框架,能够使得开发过程中减少除业务逻辑的代码开发外的所有时间,使得开发人员能够只用专注于代码开发,能够使得开发过程十分高效。

二、项目开发配置

1.开发工具:idea 2022

        idea作为一款业界评价甚高的开发工具,具有十分强大的功能,包括智能代码助手、代码自动提示、重构、javaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析等等,同时,用户体验不够良好的eclipse、集成度不高的Vim、不够稳定的VS Code,开发者更愿意偏向使用idea作为开发工具。

2.数据库:Mysql

        Mysql是一个关系型数据库管理系统。由于其的简单易用、价格低(对于多数个人用户而言是免费的)、小巧、支持查询语言(支持Sql)、性能高校、连接稳定、安全可靠、可移植性、开放式的分发、运行速度快。

3.数据库工具:MybatisPlus

(1)Mybatis

        优点:

        简单易学,容易上手;较JDBC代码量少;并不需要手动开关连接;很好的与各种数据库兼容;提供了很多第三方插件;同时能够与spring有很好的集成;想当灵活。sql语句编写在xml文件中,与程度代码分离,减少耦合,便于管理和优化,易与重用;能够利用xml文件更好的编写动态sql语句;提供映射标签,支持关系映射。

        缺点:

        sql语句编写工作量大、sql语句依赖于数据库,移植性差。

(2)MybatisPlus

        简单来说就是一款Mybatis的增强工具,用于简化开发、提高效率。它并不需要编写sql语句、配置xml文件,只需要创捷查询类,就能够迅速连接数据库。也正因此,将service层、dao层、entity层绑定一起,耦合度太高。

三、项目开发

1.新建idea项目

        填写名称、设定项目路径、选择JDK、点击下一步;

基于springboot+vue的后台用户管理系统(一)_第1张图片

         选择springboot的版本(建议3.0以下)、选择是否下载JDK以及Maven库、选择所需的依赖项目(勾选web->spring web)(其余依赖后续通过maven快速配置)、点击创建;

基于springboot+vue的后台用户管理系统(一)_第2张图片

2.配置pom.xml



    4.0.0

    
        org.springframework.boot
        spring-boot-starter-parent
        2.7.12
         
    

    com.example
    System
    0.0.1-SNAPSHOT
    System
    System

    
        UTF-8
        UTF-8
        11
        3.2.0
    

    
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.1.4
        

        
        
            com.baomidou
            mybatis-plus-boot-starter
            ${mybatis-plus.version}
        
        
            com.baomidou
            mybatis-plus-generator
            ${mybatis-plus.version}
        

        
        
            org.springframework.boot
            spring-boot-starter-websocket
        

        
        
            com.alibaba
            druid
            1.2.2
        

        
        
            mysql
            mysql-connector-java
            8.0.30
        

        
            cn.hutool
            hutool-all
            5.5.4
        

        
        
            org.apache.poi
            poi-ooxml
            4.1.2
        

        
            org.projectlombok
            lombok
        

        
            io.springfox
            springfox-swagger2
            2.9.2
        
        
            io.springfox
            springfox-swagger-ui
            2.9.2
        

        
            org.projectlombok
            lombok
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                2.7.12
                
                    true
                
            
        
    

    
        
            public
            aliyun nexus
            http://maven.aliyun.com/nexus/content/groups/public/
            
                true
            
        
    

    
        
            public
            aliyun nexus
            http://maven.aliyun.com/nexus/content/groups/public/
            
                true
            
            
                false
            
        
    

3.配置application.yml(老版本为application.properties,可修改后缀名来修改文件格式)

# 服务器端口设置
server:
  port: 9999
spring:
  # 数据库连接
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/workdatabase?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8
    type: com.alibaba.druid.pool.DruidDataSource
  # 网络服务
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

# mybatis配置
mybatis:
  mapper-locations: classpath:mapper/*.xml

logging:
  level:
    com:
      example:
        mapper:
          debug

#.前期项目的后端具体结构

基于springboot+vue的后台用户管理系统(一)_第3张图片

四、配置类

1.ListHandler类

        项目路径common.handle下,新建类,实现list转换string的类型转换。

package com.example.system.common.handle;

import cn.hutool.json.JSONUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * list转换string
 */
public class ListHandler extends BaseTypeHandler {

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, List list, JdbcType jdbcType) throws SQLException {
        preparedStatement.setObject(i, JSONUtil.toJsonStr(list));
    }

    @Override
    public List getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return JSONUtil.parseArray(resultSet.getString(s));
    }

    @Override
    public List getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return JSONUtil.parseArray(resultSet.getString(i));
    }

    @Override
    public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return JSONUtil.parseArray(callableStatement.getString(i));
    }
}

2.Result类

        结果信息处理类,实现对各类处理信息的响应。

package com.example.system.common.handle;

/**
 * 处理结果
 * @param 
 */
public class Result {
    private String code; // 状态码
    private String msg; // 信息
    private T data; // 数据

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Result() {
    }

    public Result(T data) {
        this.data = data;
    }

    // 结果成功
    public static Result success() {
        Result result = new Result<>();
        result.setCode("0");
        result.setMsg("成功");
        return result;
    }

    public static  Result success(T data) {
        Result result = new Result<>(data);
        result.setCode("0");
        result.setMsg("成功");
        return result;
    }

    // 结果失败
    public static Result error(String code, String msg) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
}

五、用户实体类entity

1.用户类User

(1)需求分析

        作为一个管理系统,首先得要有用户(基础属性),无论是管理员(权限属性),还是普通用户,在访问系统时都是一名用户。

        而用户所具备的属性应该有:用户登录账号(用户名、密码)、用户使用系统时个性化(昵称、头像)、用户的个人信息(邮箱、手机号码、地址、年龄)。

        同时对于权限属性应该有:权限、许可(对于权限属性分析具备两个属性,需求分析见权限类)。

        基于此,实体类User的创建:

        属性值:

                a.数据库表主键:数据库对应的id;

                b.基础属性:用户名username、用户密码password、用户昵称nickName、用户邮箱email、用户手机号码phone、用户头像avatar、用户地址address、用户年龄age;

                c.权限属性:权限role、许可premission。

(2)源码:

package com.example.system.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.example.system.common.handle.ListHandler;
import lombok.Data;

import java.util.List;

/**
 * 用户:访问系统需要具备一个的身份
 */

@Data
@TableName(value = "user", autoResultMap = true)
public class User extends Model {

    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private long id;

    private String username;
    private String password;
    private String nickName;
    private String email;
    private String phone;
    private String avatar;
    private String address;
    private Integer age;

    // 设置权限
    @TableField(typeHandler = ListHandler.class)
    private List role;

    @TableField(exist = false)
    private List permission;

}

2.权限类Role

(1)需求分析

        不同用户访问系统,所能够访问的功能应有所不同,因此需要给用户添加权限设置;系统功能可添加删除,具备多样性,可面向不同用户,因此权限类不是指用户具有的访问不同功能的权限,而是一个权限角色;对于许多的功能,为了完成不同用户访问功能时的限制,给予不同功能设置许可;而对于权限角色,则是不同权限角色具备一定的功能许可;为角色添加限制时,是为角色绑定上权限角色,从而获取所绑定的权限角色所具有的许可,以此具备访问功能的权限。

        属性值:

                a.数据库表主键:数据库对应的id;

                b.权限角色的名字:name;

                c.对权限角色的描述:description;

                d.具有的功能许可:permission。

(2)源码

package com.example.system.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.example.system.common.handle.ListHandler;
import lombok.Data;

import java.util.List;

/**
 * 权限角色:用户访问系统内部不同功能。需要具备不同权限,设置不同的权限角色,具备不同功能所需要的许可;
 * 

具体解释

* 访问功能 ----> 需要权限 ----> 权限角色具备一定的许可 ----> * 用户被设定为权限角色 ----> 用户具备权限角色所具备的权限许可 ----> 用户得以访问功能 */ @Data @TableName(value = "role", autoResultMap = true) public class Role extends Model { @TableId(value = "id", type = IdType.AUTO) public Long id; private String name; private String description; @TableField(typeHandler = ListHandler.class) private List permission; }

3.许可类Premission

(1)需求分析

        根据对系统用户的权限的需求分析,了解到需要对用户访问系统的功能添加许可,再利用权限角色间接限制用户对系统功能的访问。

        属性值:

                a.数据库表主键:数据库对应的id;

                b.许可所对应的功能名字:name;

                c.对改功能的描述:description;

                d.访问路径:path;

                e.权限图片:icon;

(2)源码

package com.example.system.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;

/**
 * 权限的许可:具备许可的权限角色能够访问对应的功能
 */

@Data
@TableName("permission")
public class Permission extends Model {

    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    private String name;
    private String path;
    private String description;
    private String icon;

}

六、异常处理

1.CustomException类

        用户在访问系统时,并不总是能够完成网络的请求与响应,当发生运行时错误,应当有响应的错误提示信息。

package com.example.system.exception;

/**
 * 运行异常的处理
 */
public class CustomException extends RuntimeException {

    private String code; // 状态码
    private String msg; // 信息

    public CustomException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

2.GlobalExceptionHandler类

        全局异常统一处理

package com.example.system.exception;

import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.example.system.common.handle.Result;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 全局异常的统一处理
 */
@ControllerAdvice(basePackages="com.example.system.controller")
public class GlobalExceptionHandler {

    private static final Log log = LogFactory.get();

    //统一异常处理@ExceptionHandler,主要用于Exception
    @ExceptionHandler(Exception.class)
    @ResponseBody//返回json串
    public Result error(HttpServletRequest request, Exception e){
        log.error("异常信息:",e);
        return Result.error("-1", "系统异常");
    }

    // 方法参数无效异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody//返回json串
    public Result notValidExceptionError(MethodArgumentNotValidException e){

        BindingResult result = e.getBindingResult();
        StringBuilder errorMsg = new StringBuilder() ;

        // 提交错误信息
        if (result.hasErrors()) {
            List fieldErrors = result.getFieldErrors();
            errorMsg.append(fieldErrors.get(fieldErrors.size() - 1).getDefaultMessage()).append("!");
        }

        return Result.error("-1", errorMsg.toString());
    }

    // 运行时异常
    @ExceptionHandler(CustomException.class)
    @ResponseBody//返回json串
    public Result customError(HttpServletRequest request, CustomException e){
        return Result.error(e.getCode(), e.getMsg());
    }

}

七、用户mapper层

        通过继承mybatis-plus的BaseMapper来完成接口的创建。

1.UserMapper类

package com.example.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.system.entity.User;

public interface UserMapper extends BaseMapper {}

2.RoleMapper类

package com.example.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.system.entity.Role;

public interface RoleMapper extends BaseMapper {}

3.PermissionMapper类

package com.example.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.system.entity.Permission;

public interface PermissionMapper extends BaseMapper {}

八、用户service层

1.UserService类

(1)需求分析

        用户进入系统访问系统功能,需要拥有一个系统认可的访问角色——用户user;而拥有一个这样的身份需要进行注册register;因为用户注册是面向用户的,仅需要用户提交一定的用户信息,此时需要系统自行对用户的权限进行设置getPermissions;当用户完成身份的注册后,访问系统需要进行登录login;最后,还需要确认用户名是否重复,进行对用户名的查询。

(2)源码

package com.example.system.service;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.system.entity.Permission;
import com.example.system.entity.Role;
import com.example.system.entity.User;
import com.example.system.exception.CustomException;
import com.example.system.mapper.UserMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service
public class UserService extends ServiceImpl {

    @Resource
    private RoleService roleService;
    @Resource
    private PermissionService permissionService;

    /**
     * 登录
     *
     * @param user
     * @return
     */
    public User login(User user) {

        // 获取用户登录表单数据,并查询数据库
        LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().eq(User::getUsername, user.getUsername()).eq(User::getPassword, user.getPassword());
        User one = getOne(queryWrapper);

        // 数据库中没有此数据
        if (one == null) {
            throw new CustomException("-1", "账号或密码错误");
        }

        // 设置用户角色权限
        one.setPermission(getPermissions(one.getId()));
        return one;

    }

    /**
     * 注册
     *
     * @param user
     * @return
     */
    public User register(User user) {

        // 获取表单数据,并查询数据库
        User one = getOne((Wrappers.lambdaQuery().eq(User::getUsername, user.getUsername())));

        // 数据库有此数据
        if (one != null) {
            throw new CustomException("-1", "用户已注册");
        }

        // 未设置密码,默认设置123456
        if (user.getPassword() == null) {
            user.setPassword("123456");
        }

        // 默认普通用户角色
        user.setRole(CollUtil.newArrayList(2L));
        save(user);

        return getOne((Wrappers.lambdaQuery().eq(User::getUsername, user.getUsername())));

    }

    /**
     * 设置权限
     *
     * @param userId
     * @return
     */
    public List getPermissions(Long userId) {

        // 查询此用户,获得用户的权限角色
        User user = getById(userId);
        List role = user.getRole();

        // 创建空许可对象
        List permissions = new ArrayList<>();

        // 判断,用户的权限角色所具备的许可,与权限角色id对应库中的权限角色的许可,少则添加
        if (role != null) {
            for (Object roleId : role) {
                Role realRole = roleService.getById((int) roleId);
                if (CollUtil.isNotEmpty(realRole.getPermission())) {
                    for (Object permissionId : realRole.getPermission()) {
                        Permission permission = permissionService.getById((int) permissionId);
                        if (permission != null && permissions.stream().noneMatch(p -> p.getPath().equals(permission.getPath()))) {
                            permissions.add(permission);
                        }
                    }
                }
            }
            // 将许可分配给用户
            user.setPermission(permissions);
        }

        return permissions;

    }

    /**
     * 根据用户名查询
     *
     * @param username
     * @return
     */
    public User getByUsername(String username) {

        // 获取用户名
        User one = getOne((Wrappers.lambdaQuery().eq(User::getUsername, username)));

        // 设置权限
        one.setPermission(getPermissions(one.getId()));

        return one;

    }

}

2.RoleService类

package com.example.system.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.system.entity.Role;
import com.example.system.mapper.RoleMapper;
import org.springframework.stereotype.Service;

@Service
public class RoleService extends ServiceImpl { }

3.PermissionService类

(1)需求分析

        功能许可类,根据权限角色查询功能的许可;重新分配权限事务。

(2)源码

package com.example.system.service;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.system.entity.Permission;
import com.example.system.entity.Role;
import com.example.system.mapper.PermissionMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service
public class PermissionService extends ServiceImpl {

    @Resource
    private RoleService roleService;

    /**
     * 根据权限角色查询许可
     *
     * @param roles
     * @return
     */
    public List getByRoles(List roles) {

        // 新建空许可对象
        List permissions = new ArrayList<>();

        // 判断,权限角色所具备的许可,与其id对应的库中权限角色所具备的许可,少则添加
        for (Role role : roles) {
            Role r = roleService.getById(role.getId());
            if (CollUtil.isNotEmpty(r.getPermission())) {
                for (Object permissionId : r.getPermission()) {
                    Permission permission = getById((int) permissionId);
                    if (permissions.stream().noneMatch(p -> p.getPath().equals(permission.getPath()))) {
                        permissions.add(permission);
                    }
                }
            }
        }

        return permissions;

    }

    @Transactional
    public void delete(Long id) {

        // 删除角色分配的菜单
        removeById(id);

        List list = roleService.list();

        // 重新分配权限
        for (Role role : list) {
            List newP = new ArrayList<>();
            for (Object p : role.getPermission()) {
                Long pl = Long.valueOf(p + "");
                if (!id.equals(pl)) {
                    newP.add(Long.valueOf(p + ""));
                }
            }
            role.setPermission(newP);
            roleService.updateById(role);
        }
    }

}

九.用户controller层

1.UserController类

(1)需求分析

        首先,应当需要处理用户的登录login;其次,应当需要处理用户的注册register;然后还有,用户退出系统的logout;用户的查询(在线、所有、根据id、根据用户名、分页);用户的增删改查。

(2)源码

package com.example.controller;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.common.Result;
import com.example.entity.User;
import com.example.exception.CustomException;
import com.example.service.LogService;
import com.example.service.UserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

@RestController
@RequestMapping("/api/user")
public class UserController {
    public static final ConcurrentHashMap MAP = new ConcurrentHashMap<>();

    @Resource
    private UserService userService;

    @Resource
    private LogService logService;
    @Resource
    private HttpServletRequest request;

    public User getUser() {
        User user = (User) request.getSession().getAttribute("user");
        if (user == null) {
            throw new CustomException("-1", "请登录");
        }
        return user;
    }


    /**
     * 登录
     *
     * @param user
     * @param request
     * @return
     */
    @PostMapping("/login")
    public Result login(@RequestBody User user, HttpServletRequest request) {
        User res = userService.login(user);
        request.getSession().setAttribute("user", res);
        MAP.put(res.getUsername(), res);

        logService.log(StrUtil.format("用户 {} 登录系统", user.getUsername()));
        return Result.success(res);
    }

    /**
     * 注册
     *
     * @param user
     * @param request
     * @return
     */
    @PostMapping("/register")
    public Result register(@RequestBody User user, HttpServletRequest request) {
        if (user.getPassword() == null) {
            user.setPassword("123456");
        }
        User dbUser = userService.register(user);
        request.getSession().setAttribute("user", user);

        logService.log(StrUtil.format("用户 {} 注册账号成功", user.getUsername()));
        return Result.success(dbUser);
    }

    @GetMapping("/logout")
    public Result logout(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        if (user != null) {
            logService.log(StrUtil.format("用户 {} 退出系统", user.getUsername()));
            request.getSession().removeAttribute("user");
            MAP.remove(user.getUsername());
        }
        return Result.success();
    }

    @GetMapping("/online")
    public Result> online(HttpServletRequest request) {
        return Result.success(MAP.values());
    }

    @GetMapping("/session")
    public Result session() {
        return Result.success(getUser());
    }

    @PostMapping
    public Result save(@RequestBody User user) {
        if (user.getPassword() == null) {
            user.setPassword("123456");
        }
        logService.log(StrUtil.format("新增用户:{} ", user.getUsername()));
        return Result.success(userService.save(user));
    }

    @PutMapping
    public Result update(@RequestBody User user) {
        logService.log(StrUtil.format("更新用户:{} ", user.getUsername()));
        return Result.success(userService.updateById(user));
    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Long id) {
        User user = userService.getById(id);
        logService.log(StrUtil.format("删除用户 {} ", user.getUsername()));

        userService.removeById(id);
        return Result.success();
    }

    @GetMapping("/{id}")
    public Result findById(@PathVariable Long id) {
        return Result.success(userService.getById(id));
    }

    @GetMapping("/detail/{username}")
    public Result findByUsername(@PathVariable String username) {
        return Result.success(userService.getbyUsername(username));
    }

    @GetMapping
    public Result> findAll() {
        return Result.success(userService.list( Wrappers.lambdaQuery().ne(User::getUsername, "admin")));
    }

    @GetMapping("/page")
    public Result> findPage(@RequestParam(required = false, defaultValue = "") String name,
                                        @RequestParam(required = false, defaultValue = "1") Integer pageNum,
                                        @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
        LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().ne(User::getUsername, "admin").like(User::getUsername, name).orderByDesc(User::getId);
        return Result.success(userService.page(new Page<>(pageNum, pageSize), wrapper));
    }

    @GetMapping("/export")
    public void export(HttpServletResponse response) throws IOException {

        List> list = CollUtil.newArrayList();

        List all = userService.list();
        for (User user : all) {
            Map row1 = new LinkedHashMap<>();
            row1.put("名称", user.getUsername());
            row1.put("手机", user.getPhone());
            row1.put("邮箱", user.getEmail());
            list.add(row1);
        }

        // 2. 写excel
        ExcelWriter writer = ExcelUtil.getWriter(true);
        writer.write(list, true);

        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        String fileName = URLEncoder.encode("用户信息", "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");

        ServletOutputStream out = response.getOutputStream();
        writer.flush(out, true);
        writer.close();
        IoUtil.close(System.out);
    }

    @GetMapping("/upload/{fileId}")
    public Result upload(@PathVariable String fileId) {
        String basePath = System.getProperty("user.dir") + "/src/main/resources/static/file/";
        List fileNames = FileUtil.listFileNames(basePath);
        String file = fileNames.stream().filter(name -> name.contains(fileId)).findAny().orElse("");
        List> lists = ExcelUtil.getReader(basePath + file).read(1);
        List saveList = new ArrayList<>();
        for (List row : lists) {
            User user = new User();
            user.setUsername((String) row.get(0));
            user.setNickName((String) row.get(1));
            user.setEmail((String) row.get(2));
            user.setPhone((String) row.get(3));
            saveList.add(user);
        }
        userService.saveBatch(saveList);
        return Result.success();
    }

}
 
  

2.RoleController类

(1)需求分析

        权限角色的增删改查;权限角色的查询(根据id、所有、分页)。

(2)源码

package com.example.system.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.system.common.handle.Result;
import com.example.system.entity.Role;
import com.example.system.service.RoleService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/api/role")
public class RoleController {
    @Resource
    private RoleService roleService;

    /**
     * 增加权限角色
     *
     * @param role
     * @return
     */
    @PostMapping
    public Result save(@RequestBody Role role) {
        return Result.success(roleService.save(role));
    }

    /**
     * 更新权限角色
     *
     * @param role
     * @return
     */
    @PutMapping
    public Result update(@RequestBody Role role) {
        return Result.success(roleService.updateById(role));
    }

    /**
     * 根据id删除权限角色
     *
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Long id) {

        roleService.removeById(id);
        return Result.success();

    }

    /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result findById(@PathVariable Long id) {
        return Result.success(roleService.getById(id));
    }

    /**
     * 查询所有
     *
     * @return
     */
    @GetMapping
    public Result> findAll() {
        return Result.success(roleService.list());
    }

    /**
     * 分页查询
     *
     * @param name
     * @param pageNum
     * @param pageSize
     * @return
     */
    @GetMapping("/page")
    public Result> findPage(@RequestParam(required = false, defaultValue = "") String name,
                                        @RequestParam(required = false, defaultValue = "1") Integer pageNum,
                                        @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
        return Result.success(roleService.page(new Page<>(pageNum, pageSize), Wrappers.lambdaQuery().like(Role::getName, name)));
    }

}

3.PermissionController类

(1)需求分析

        许可的增删改查;许可的查询(根据id、所有、分页、通过权限用户)。

(2)源码

package com.example.system.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.system.common.handle.Result;
import com.example.system.entity.Permission;
import com.example.system.entity.Role;
import com.example.system.service.PermissionService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/api/permission")
public class PermissionController {
    @Resource
    private PermissionService permissionService;

    /**
     * 新增许可
     * 
     * @param permission
     * @return
     */
    @PostMapping
    public Result save(@RequestBody Permission permission) {
        return Result.success(permissionService.save(permission));
    }

    /**
     * 更新许可
     * 
     * @param permission
     * @return
     */
    @PutMapping
    public Result update(@RequestBody Permission permission) {
        return Result.success(permissionService.updateById(permission));
    }

    /**
     * 删除许可
     * 
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Long id) {
        Permission permission = permissionService.getById(id);
        permissionService.delete(id);
        return Result.success();
    }

    /**
     * 根据id查询许可
     * 
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result findById(@PathVariable Long id) {
        return Result.success(permissionService.getById(id));
    }

    /**
     * 查询所有
     * 
     * @return
     */
    @GetMapping
    public Result> findAll() {
        return Result.success(permissionService.list());
    }

    /**
     * 分页查询许可
     * 
     * @param name
     * @param pageNum
     * @param pageSize
     * @return
     */
    @GetMapping("/page")
    public Result> findPage(@RequestParam(required = false, defaultValue = "") String name,
                                              @RequestParam(required = false, defaultValue = "1") Integer pageNum,
                                              @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
        return Result.success(permissionService.page(new Page<>(pageNum, pageSize), Wrappers.lambdaQuery().like(Permission::getName, name)));
    }

    /**
     * 通过权限角色查询权限角色所拥有的许可
     * 
     * @param roles
     * @return
     */
    @PostMapping("/getByRoles")
    public Result> getByRoles(@RequestBody List roles) {
        return Result.success(permissionService.getByRoles(roles));
    }

}

你可能感兴趣的:(项目开发,spring,boot,vue.js,java)