当前位置:   article > 正文

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

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

2.配置pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.7.12</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>System</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>System</name>
  15. <description>System</description>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <java.version>11</java.version>
  20. <mybatis-plus.version>3.2.0</mybatis-plus.version>
  21. </properties>
  22. <dependencies>
  23. <!-- 添加springmvc依赖 -->
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. <!-- Mybatis -->
  29. <dependency>
  30. <groupId>org.mybatis.spring.boot</groupId>
  31. <artifactId>mybatis-spring-boot-starter</artifactId>
  32. <version>2.1.4</version>
  33. </dependency>
  34. <!-- Mybatis-plus -->
  35. <dependency>
  36. <groupId>com.baomidou</groupId>
  37. <artifactId>mybatis-plus-boot-starter</artifactId>
  38. <version>${mybatis-plus.version}</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>com.baomidou</groupId>
  42. <artifactId>mybatis-plus-generator</artifactId>
  43. <version>${mybatis-plus.version}</version>
  44. </dependency>
  45. <!-- websocket -->
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-websocket</artifactId>
  49. </dependency>
  50. <!-- 数据库连接池 druid -->
  51. <dependency>
  52. <groupId>com.alibaba</groupId>
  53. <artifactId>druid</artifactId>
  54. <version>1.2.2</version>
  55. </dependency>
  56. <!-- mysql -->
  57. <dependency>
  58. <groupId>mysql</groupId>
  59. <artifactId>mysql-connector-java</artifactId>
  60. <version>8.0.30</version>
  61. </dependency>
  62. <dependency>
  63. <groupId>cn.hutool</groupId>
  64. <artifactId>hutool-all</artifactId>
  65. <version>5.5.4</version>
  66. </dependency>
  67. <!-- excel导出 -->
  68. <dependency>
  69. <groupId>org.apache.poi</groupId>
  70. <artifactId>poi-ooxml</artifactId>
  71. <version>4.1.2</version>
  72. </dependency>
  73. <dependency>
  74. <groupId>org.projectlombok</groupId>
  75. <artifactId>lombok</artifactId>
  76. </dependency>
  77. <dependency>
  78. <groupId>io.springfox</groupId>
  79. <artifactId>springfox-swagger2</artifactId>
  80. <version>2.9.2</version>
  81. </dependency>
  82. <dependency>
  83. <groupId>io.springfox</groupId>
  84. <artifactId>springfox-swagger-ui</artifactId>
  85. <version>2.9.2</version>
  86. </dependency>
  87. <dependency>
  88. <groupId>org.projectlombok</groupId>
  89. <artifactId>lombok</artifactId>
  90. </dependency>
  91. </dependencies>
  92. <build>
  93. <plugins>
  94. <plugin>
  95. <groupId>org.springframework.boot</groupId>
  96. <artifactId>spring-boot-maven-plugin</artifactId>
  97. <version>2.7.12</version>
  98. <configuration>
  99. <fork>true</fork>
  100. </configuration>
  101. </plugin>
  102. </plugins>
  103. </build>
  104. <repositories>
  105. <repository>
  106. <id>public</id>
  107. <name>aliyun nexus</name>
  108. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  109. <releases>
  110. <enabled>true</enabled>
  111. </releases>
  112. </repository>
  113. </repositories>
  114. <pluginRepositories>
  115. <pluginRepository>
  116. <id>public</id>
  117. <name>aliyun nexus</name>
  118. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  119. <releases>
  120. <enabled>true</enabled>
  121. </releases>
  122. <snapshots>
  123. <enabled>false</enabled>
  124. </snapshots>
  125. </pluginRepository>
  126. </pluginRepositories>
  127. </project>

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

  1. # 服务器端口设置
  2. server:
  3. port: 9999
  4. spring:
  5. # 数据库连接
  6. datasource:
  7. driver-class-name: com.mysql.cj.jdbc.Driver
  8. username: root
  9. password: 123456
  10. url: jdbc:mysql://localhost:3306/workdatabase?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8
  11. type: com.alibaba.druid.pool.DruidDataSource
  12. # 网络服务
  13. servlet:
  14. multipart:
  15. max-file-size: 100MB
  16. max-request-size: 100MB
  17. # mybatis配置
  18. mybatis:
  19. mapper-locations: classpath:mapper/*.xml
  20. logging:
  21. level:
  22. com:
  23. example:
  24. mapper:
  25. debug

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

四、配置类

1.ListHandler类

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

  1. package com.example.system.common.handle;
  2. import cn.hutool.json.JSONUtil;
  3. import org.apache.ibatis.type.BaseTypeHandler;
  4. import org.apache.ibatis.type.JdbcType;
  5. import java.sql.CallableStatement;
  6. import java.sql.PreparedStatement;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import java.util.List;
  10. /**
  11. * list转换string
  12. */
  13. public class ListHandler extends BaseTypeHandler<List> {
  14. @Override
  15. public void setNonNullParameter(PreparedStatement preparedStatement, int i, List list, JdbcType jdbcType) throws SQLException {
  16. preparedStatement.setObject(i, JSONUtil.toJsonStr(list));
  17. }
  18. @Override
  19. public List getNullableResult(ResultSet resultSet, String s) throws SQLException {
  20. return JSONUtil.parseArray(resultSet.getString(s));
  21. }
  22. @Override
  23. public List getNullableResult(ResultSet resultSet, int i) throws SQLException {
  24. return JSONUtil.parseArray(resultSet.getString(i));
  25. }
  26. @Override
  27. public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
  28. return JSONUtil.parseArray(callableStatement.getString(i));
  29. }
  30. }

2.Result类

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

  1. package com.example.system.common.handle;
  2. /**
  3. * 处理结果
  4. * @param <T>
  5. */
  6. public class Result<T> {
  7. private String code; // 状态码
  8. private String msg; // 信息
  9. private T data; // 数据
  10. public String getCode() {
  11. return code;
  12. }
  13. public void setCode(String code) {
  14. this.code = code;
  15. }
  16. public String getMsg() {
  17. return msg;
  18. }
  19. public void setMsg(String msg) {
  20. this.msg = msg;
  21. }
  22. public T getData() {
  23. return data;
  24. }
  25. public void setData(T data) {
  26. this.data = data;
  27. }
  28. public Result() {
  29. }
  30. public Result(T data) {
  31. this.data = data;
  32. }
  33. // 结果成功
  34. public static Result success() {
  35. Result result = new Result<>();
  36. result.setCode("0");
  37. result.setMsg("成功");
  38. return result;
  39. }
  40. public static <T> Result<T> success(T data) {
  41. Result<T> result = new Result<>(data);
  42. result.setCode("0");
  43. result.setMsg("成功");
  44. return result;
  45. }
  46. // 结果失败
  47. public static Result error(String code, String msg) {
  48. Result result = new Result();
  49. result.setCode(code);
  50. result.setMsg(msg);
  51. return result;
  52. }
  53. }

五、用户实体类entity

1.用户类User

(1)需求分析

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

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

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

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

        属性值:

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

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

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

(2)源码:

  1. package com.example.system.entity;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableName;
  6. import com.baomidou.mybatisplus.extension.activerecord.Model;
  7. import com.example.system.common.handle.ListHandler;
  8. import lombok.Data;
  9. import java.util.List;
  10. /**
  11. * 用户:访问系统需要具备一个的身份
  12. */
  13. @Data
  14. @TableName(value = "user", autoResultMap = true)
  15. public class User extends Model<User> {
  16. /**
  17. * 主键
  18. */
  19. @TableId(value = "id", type = IdType.AUTO)
  20. private long id;
  21. private String username;
  22. private String password;
  23. private String nickName;
  24. private String email;
  25. private String phone;
  26. private String avatar;
  27. private String address;
  28. private Integer age;
  29. // 设置权限
  30. @TableField(typeHandler = ListHandler.class)
  31. private List<Long> role;
  32. @TableField(exist = false)
  33. private List<Permission> permission;
  34. }

2.权限类Role

(1)需求分析

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

        属性值:

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

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

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

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

(2)源码

  1. package com.example.system.entity;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableName;
  6. import com.baomidou.mybatisplus.extension.activerecord.Model;
  7. import com.example.system.common.handle.ListHandler;
  8. import lombok.Data;
  9. import java.util.List;
  10. /**
  11. * 权限角色:用户访问系统内部不同功能。需要具备不同权限,设置不同的权限角色,具备不同功能所需要的许可;
  12. * <p>具体解释</p>
  13. * 访问功能 ----> 需要权限 ----> 权限角色具备一定的许可 ---->
  14. * 用户被设定为权限角色 ----> 用户具备权限角色所具备的权限许可 ----> 用户得以访问功能
  15. */
  16. @Data
  17. @TableName(value = "role", autoResultMap = true)
  18. public class Role extends Model<Role> {
  19. @TableId(value = "id", type = IdType.AUTO)
  20. public Long id;
  21. private String name;
  22. private String description;
  23. @TableField(typeHandler = ListHandler.class)
  24. private List<Long> permission;
  25. }

3.许可类Premission

(1)需求分析

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

        属性值:

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

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

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

                d.访问路径:path;

                e.权限图片:icon;

(2)源码

  1. package com.example.system.entity;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableId;
  4. import com.baomidou.mybatisplus.annotation.TableName;
  5. import com.baomidou.mybatisplus.extension.activerecord.Model;
  6. import lombok.Data;
  7. /**
  8. * 权限的许可:具备许可的权限角色能够访问对应的功能
  9. */
  10. @Data
  11. @TableName("permission")
  12. public class Permission extends Model<Permission> {
  13. /**
  14. * 主键
  15. */
  16. @TableId(value = "id", type = IdType.AUTO)
  17. private Long id;
  18. private String name;
  19. private String path;
  20. private String description;
  21. private String icon;
  22. }

六、异常处理

1.CustomException类

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

  1. package com.example.system.exception;
  2. /**
  3. * 运行异常的处理
  4. */
  5. public class CustomException extends RuntimeException {
  6. private String code; // 状态码
  7. private String msg; // 信息
  8. public CustomException(String code, String msg) {
  9. this.code = code;
  10. this.msg = msg;
  11. }
  12. public String getCode() {
  13. return code;
  14. }
  15. public void setCode(String code) {
  16. this.code = code;
  17. }
  18. public String getMsg() {
  19. return msg;
  20. }
  21. public void setMsg(String msg) {
  22. this.msg = msg;
  23. }
  24. }

2.GlobalExceptionHandler类

        全局异常统一处理

  1. package com.example.system.exception;
  2. import cn.hutool.log.Log;
  3. import cn.hutool.log.LogFactory;
  4. import com.example.system.common.handle.Result;
  5. import org.springframework.validation.BindingResult;
  6. import org.springframework.validation.FieldError;
  7. import org.springframework.web.bind.MethodArgumentNotValidException;
  8. import org.springframework.web.bind.annotation.ControllerAdvice;
  9. import org.springframework.web.bind.annotation.ExceptionHandler;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11. import javax.servlet.http.HttpServletRequest;
  12. import java.util.List;
  13. /**
  14. * 全局异常的统一处理
  15. */
  16. @ControllerAdvice(basePackages="com.example.system.controller")
  17. public class GlobalExceptionHandler {
  18. private static final Log log = LogFactory.get();
  19. //统一异常处理@ExceptionHandler,主要用于Exception
  20. @ExceptionHandler(Exception.class)
  21. @ResponseBody//返回json串
  22. public Result<?> error(HttpServletRequest request, Exception e){
  23. log.error("异常信息:",e);
  24. return Result.error("-1", "系统异常");
  25. }
  26. // 方法参数无效异常
  27. @ExceptionHandler(MethodArgumentNotValidException.class)
  28. @ResponseBody//返回json串
  29. public Result<?> notValidExceptionError(MethodArgumentNotValidException e){
  30. BindingResult result = e.getBindingResult();
  31. StringBuilder errorMsg = new StringBuilder() ;
  32. // 提交错误信息
  33. if (result.hasErrors()) {
  34. List<FieldError> fieldErrors = result.getFieldErrors();
  35. errorMsg.append(fieldErrors.get(fieldErrors.size() - 1).getDefaultMessage()).append("!");
  36. }
  37. return Result.error("-1", errorMsg.toString());
  38. }
  39. // 运行时异常
  40. @ExceptionHandler(CustomException.class)
  41. @ResponseBody//返回json串
  42. public Result<?> customError(HttpServletRequest request, CustomException e){
  43. return Result.error(e.getCode(), e.getMsg());
  44. }
  45. }

七、用户mapper层

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

1.UserMapper类

  1. package com.example.system.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.example.system.entity.User;
  4. public interface UserMapper extends BaseMapper<User> {}

2.RoleMapper类

  1. package com.example.system.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.example.system.entity.Role;
  4. public interface RoleMapper extends BaseMapper<Role> {}

3.PermissionMapper类

  1. package com.example.system.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.example.system.entity.Permission;
  4. public interface PermissionMapper extends BaseMapper<Permission> {}

八、用户service层

1.UserService类

(1)需求分析

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

(2)源码

  1. package com.example.system.service;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.example.system.entity.Permission;
  7. import com.example.system.entity.Role;
  8. import com.example.system.entity.User;
  9. import com.example.system.exception.CustomException;
  10. import com.example.system.mapper.UserMapper;
  11. import org.springframework.stereotype.Service;
  12. import javax.annotation.Resource;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. @Service
  16. public class UserService extends ServiceImpl<UserMapper, User> {
  17. @Resource
  18. private RoleService roleService;
  19. @Resource
  20. private PermissionService permissionService;
  21. /**
  22. * 登录
  23. *
  24. * @param user
  25. * @return
  26. */
  27. public User login(User user) {
  28. // 获取用户登录表单数据,并查询数据库
  29. LambdaQueryWrapper<User> queryWrapper = Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()).eq(User::getPassword, user.getPassword());
  30. User one = getOne(queryWrapper);
  31. // 数据库中没有此数据
  32. if (one == null) {
  33. throw new CustomException("-1", "账号或密码错误");
  34. }
  35. // 设置用户角色权限
  36. one.setPermission(getPermissions(one.getId()));
  37. return one;
  38. }
  39. /**
  40. * 注册
  41. *
  42. * @param user
  43. * @return
  44. */
  45. public User register(User user) {
  46. // 获取表单数据,并查询数据库
  47. User one = getOne((Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername())));
  48. // 数据库有此数据
  49. if (one != null) {
  50. throw new CustomException("-1", "用户已注册");
  51. }
  52. // 未设置密码,默认设置123456
  53. if (user.getPassword() == null) {
  54. user.setPassword("123456");
  55. }
  56. // 默认普通用户角色
  57. user.setRole(CollUtil.newArrayList(2L));
  58. save(user);
  59. return getOne((Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername())));
  60. }
  61. /**
  62. * 设置权限
  63. *
  64. * @param userId
  65. * @return
  66. */
  67. public List<Permission> getPermissions(Long userId) {
  68. // 查询此用户,获得用户的权限角色
  69. User user = getById(userId);
  70. List<Long> role = user.getRole();
  71. // 创建空许可对象
  72. List<Permission> permissions = new ArrayList<>();
  73. // 判断,用户的权限角色所具备的许可,与权限角色id对应库中的权限角色的许可,少则添加
  74. if (role != null) {
  75. for (Object roleId : role) {
  76. Role realRole = roleService.getById((int) roleId);
  77. if (CollUtil.isNotEmpty(realRole.getPermission())) {
  78. for (Object permissionId : realRole.getPermission()) {
  79. Permission permission = permissionService.getById((int) permissionId);
  80. if (permission != null && permissions.stream().noneMatch(p -> p.getPath().equals(permission.getPath()))) {
  81. permissions.add(permission);
  82. }
  83. }
  84. }
  85. }
  86. // 将许可分配给用户
  87. user.setPermission(permissions);
  88. }
  89. return permissions;
  90. }
  91. /**
  92. * 根据用户名查询
  93. *
  94. * @param username
  95. * @return
  96. */
  97. public User getByUsername(String username) {
  98. // 获取用户名
  99. User one = getOne((Wrappers.<User>lambdaQuery().eq(User::getUsername, username)));
  100. // 设置权限
  101. one.setPermission(getPermissions(one.getId()));
  102. return one;
  103. }
  104. }

2.RoleService类

  1. package com.example.system.service;
  2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  3. import com.example.system.entity.Role;
  4. import com.example.system.mapper.RoleMapper;
  5. import org.springframework.stereotype.Service;
  6. @Service
  7. public class RoleService extends ServiceImpl<RoleMapper, Role> { }

3.PermissionService类

(1)需求分析

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

(2)源码

  1. package com.example.system.service;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.example.system.entity.Permission;
  5. import com.example.system.entity.Role;
  6. import com.example.system.mapper.PermissionMapper;
  7. import org.springframework.stereotype.Service;
  8. import org.springframework.transaction.annotation.Transactional;
  9. import javax.annotation.Resource;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. @Service
  13. public class PermissionService extends ServiceImpl<PermissionMapper, Permission> {
  14. @Resource
  15. private RoleService roleService;
  16. /**
  17. * 根据权限角色查询许可
  18. *
  19. * @param roles
  20. * @return
  21. */
  22. public List<Permission> getByRoles(List<Role> roles) {
  23. // 新建空许可对象
  24. List<Permission> permissions = new ArrayList<>();
  25. // 判断,权限角色所具备的许可,与其id对应的库中权限角色所具备的许可,少则添加
  26. for (Role role : roles) {
  27. Role r = roleService.getById(role.getId());
  28. if (CollUtil.isNotEmpty(r.getPermission())) {
  29. for (Object permissionId : r.getPermission()) {
  30. Permission permission = getById((int) permissionId);
  31. if (permissions.stream().noneMatch(p -> p.getPath().equals(permission.getPath()))) {
  32. permissions.add(permission);
  33. }
  34. }
  35. }
  36. }
  37. return permissions;
  38. }
  39. @Transactional
  40. public void delete(Long id) {
  41. // 删除角色分配的菜单
  42. removeById(id);
  43. List<Role> list = roleService.list();
  44. // 重新分配权限
  45. for (Role role : list) {
  46. List<Long> newP = new ArrayList<>();
  47. for (Object p : role.getPermission()) {
  48. Long pl = Long.valueOf(p + "");
  49. if (!id.equals(pl)) {
  50. newP.add(Long.valueOf(p + ""));
  51. }
  52. }
  53. role.setPermission(newP);
  54. roleService.updateById(role);
  55. }
  56. }
  57. }

九.用户controller层

1.UserController类

(1)需求分析

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

(2)源码

  1. package com.example.controller;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.io.FileUtil;
  4. import cn.hutool.core.io.IoUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import cn.hutool.poi.excel.ExcelUtil;
  7. import cn.hutool.poi.excel.ExcelWriter;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.core.metadata.IPage;
  10. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  11. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  12. import com.example.common.Result;
  13. import com.example.entity.User;
  14. import com.example.exception.CustomException;
  15. import com.example.service.LogService;
  16. import com.example.service.UserService;
  17. import org.springframework.web.bind.annotation.*;
  18. import javax.annotation.Resource;
  19. import javax.servlet.ServletOutputStream;
  20. import javax.servlet.http.HttpServletRequest;
  21. import javax.servlet.http.HttpServletResponse;
  22. import java.io.IOException;
  23. import java.net.URLEncoder;
  24. import java.util.*;
  25. import java.util.concurrent.ConcurrentHashMap;
  26. @RestController
  27. @RequestMapping("/api/user")
  28. public class UserController {
  29. public static final ConcurrentHashMap<String, User> MAP = new ConcurrentHashMap<>();
  30. @Resource
  31. private UserService userService;
  32. @Resource
  33. private LogService logService;
  34. @Resource
  35. private HttpServletRequest request;
  36. public User getUser() {
  37. User user = (User) request.getSession().getAttribute("user");
  38. if (user == null) {
  39. throw new CustomException("-1", "请登录");
  40. }
  41. return user;
  42. }
  43. /**
  44. * 登录
  45. *
  46. * @param user
  47. * @param request
  48. * @return
  49. */
  50. @PostMapping("/login")
  51. public Result<User> login(@RequestBody User user, HttpServletRequest request) {
  52. User res = userService.login(user);
  53. request.getSession().setAttribute("user", res);
  54. MAP.put(res.getUsername(), res);
  55. logService.log(StrUtil.format("用户 {} 登录系统", user.getUsername()));
  56. return Result.success(res);
  57. }
  58. /**
  59. * 注册
  60. *
  61. * @param user
  62. * @param request
  63. * @return
  64. */
  65. @PostMapping("/register")
  66. public Result<User> register(@RequestBody User user, HttpServletRequest request) {
  67. if (user.getPassword() == null) {
  68. user.setPassword("123456");
  69. }
  70. User dbUser = userService.register(user);
  71. request.getSession().setAttribute("user", user);
  72. logService.log(StrUtil.format("用户 {} 注册账号成功", user.getUsername()));
  73. return Result.success(dbUser);
  74. }
  75. @GetMapping("/logout")
  76. public Result<?> logout(HttpServletRequest request) {
  77. User user = (User) request.getSession().getAttribute("user");
  78. if (user != null) {
  79. logService.log(StrUtil.format("用户 {} 退出系统", user.getUsername()));
  80. request.getSession().removeAttribute("user");
  81. MAP.remove(user.getUsername());
  82. }
  83. return Result.success();
  84. }
  85. @GetMapping("/online")
  86. public Result<Collection<User>> online(HttpServletRequest request) {
  87. return Result.success(MAP.values());
  88. }
  89. @GetMapping("/session")
  90. public Result<User> session() {
  91. return Result.success(getUser());
  92. }
  93. @PostMapping
  94. public Result<?> save(@RequestBody User user) {
  95. if (user.getPassword() == null) {
  96. user.setPassword("123456");
  97. }
  98. logService.log(StrUtil.format("新增用户:{} ", user.getUsername()));
  99. return Result.success(userService.save(user));
  100. }
  101. @PutMapping
  102. public Result<?> update(@RequestBody User user) {
  103. logService.log(StrUtil.format("更新用户:{} ", user.getUsername()));
  104. return Result.success(userService.updateById(user));
  105. }
  106. @DeleteMapping("/{id}")
  107. public Result<?> delete(@PathVariable Long id) {
  108. User user = userService.getById(id);
  109. logService.log(StrUtil.format("删除用户 {} ", user.getUsername()));
  110. userService.removeById(id);
  111. return Result.success();
  112. }
  113. @GetMapping("/{id}")
  114. public Result<User> findById(@PathVariable Long id) {
  115. return Result.success(userService.getById(id));
  116. }
  117. @GetMapping("/detail/{username}")
  118. public Result<User> findByUsername(@PathVariable String username) {
  119. return Result.success(userService.getbyUsername(username));
  120. }
  121. @GetMapping
  122. public Result<List<User>> findAll() {
  123. return Result.success(userService.list( Wrappers.<User>lambdaQuery().ne(User::getUsername, "admin")));
  124. }
  125. @GetMapping("/page")
  126. public Result<IPage<User>> findPage(@RequestParam(required = false, defaultValue = "") String name,
  127. @RequestParam(required = false, defaultValue = "1") Integer pageNum,
  128. @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
  129. LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery().ne(User::getUsername, "admin").like(User::getUsername, name).orderByDesc(User::getId);
  130. return Result.success(userService.page(new Page<>(pageNum, pageSize), wrapper));
  131. }
  132. @GetMapping("/export")
  133. public void export(HttpServletResponse response) throws IOException {
  134. List<Map<String, Object>> list = CollUtil.newArrayList();
  135. List<User> all = userService.list();
  136. for (User user : all) {
  137. Map<String, Object> row1 = new LinkedHashMap<>();
  138. row1.put("名称", user.getUsername());
  139. row1.put("手机", user.getPhone());
  140. row1.put("邮箱", user.getEmail());
  141. list.add(row1);
  142. }
  143. // 2. 写excel
  144. ExcelWriter writer = ExcelUtil.getWriter(true);
  145. writer.write(list, true);
  146. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
  147. String fileName = URLEncoder.encode("用户信息", "UTF-8");
  148. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  149. ServletOutputStream out = response.getOutputStream();
  150. writer.flush(out, true);
  151. writer.close();
  152. IoUtil.close(System.out);
  153. }
  154. @GetMapping("/upload/{fileId}")
  155. public Result<?> upload(@PathVariable String fileId) {
  156. String basePath = System.getProperty("user.dir") + "/src/main/resources/static/file/";
  157. List<String> fileNames = FileUtil.listFileNames(basePath);
  158. String file = fileNames.stream().filter(name -> name.contains(fileId)).findAny().orElse("");
  159. List<List<Object>> lists = ExcelUtil.getReader(basePath + file).read(1);
  160. List<User> saveList = new ArrayList<>();
  161. for (List<Object> row : lists) {
  162. User user = new User();
  163. user.setUsername((String) row.get(0));
  164. user.setNickName((String) row.get(1));
  165. user.setEmail((String) row.get(2));
  166. user.setPhone((String) row.get(3));
  167. saveList.add(user);
  168. }
  169. userService.saveBatch(saveList);
  170. return Result.success();
  171. }
  172. }

2.RoleController类

(1)需求分析

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

(2)源码

  1. package com.example.system.controller;
  2. import com.baomidou.mybatisplus.core.metadata.IPage;
  3. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.example.system.common.handle.Result;
  6. import com.example.system.entity.Role;
  7. import com.example.system.service.RoleService;
  8. import org.springframework.web.bind.annotation.*;
  9. import javax.annotation.Resource;
  10. import java.util.List;
  11. @RestController
  12. @RequestMapping("/api/role")
  13. public class RoleController {
  14. @Resource
  15. private RoleService roleService;
  16. /**
  17. * 增加权限角色
  18. *
  19. * @param role
  20. * @return
  21. */
  22. @PostMapping
  23. public Result<?> save(@RequestBody Role role) {
  24. return Result.success(roleService.save(role));
  25. }
  26. /**
  27. * 更新权限角色
  28. *
  29. * @param role
  30. * @return
  31. */
  32. @PutMapping
  33. public Result<?> update(@RequestBody Role role) {
  34. return Result.success(roleService.updateById(role));
  35. }
  36. /**
  37. * 根据id删除权限角色
  38. *
  39. * @param id
  40. * @return
  41. */
  42. @DeleteMapping("/{id}")
  43. public Result<?> delete(@PathVariable Long id) {
  44. roleService.removeById(id);
  45. return Result.success();
  46. }
  47. /**
  48. * 根据id查询
  49. *
  50. * @param id
  51. * @return
  52. */
  53. @GetMapping("/{id}")
  54. public Result<Role> findById(@PathVariable Long id) {
  55. return Result.success(roleService.getById(id));
  56. }
  57. /**
  58. * 查询所有
  59. *
  60. * @return
  61. */
  62. @GetMapping
  63. public Result<List<Role>> findAll() {
  64. return Result.success(roleService.list());
  65. }
  66. /**
  67. * 分页查询
  68. *
  69. * @param name
  70. * @param pageNum
  71. * @param pageSize
  72. * @return
  73. */
  74. @GetMapping("/page")
  75. public Result<IPage<Role>> findPage(@RequestParam(required = false, defaultValue = "") String name,
  76. @RequestParam(required = false, defaultValue = "1") Integer pageNum,
  77. @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
  78. return Result.success(roleService.page(new Page<>(pageNum, pageSize), Wrappers.<Role>lambdaQuery().like(Role::getName, name)));
  79. }
  80. }

3.PermissionController类

(1)需求分析

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

(2)源码

  1. package com.example.system.controller;
  2. import com.baomidou.mybatisplus.core.metadata.IPage;
  3. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.example.system.common.handle.Result;
  6. import com.example.system.entity.Permission;
  7. import com.example.system.entity.Role;
  8. import com.example.system.service.PermissionService;
  9. import org.springframework.web.bind.annotation.*;
  10. import javax.annotation.Resource;
  11. import java.util.List;
  12. @RestController
  13. @RequestMapping("/api/permission")
  14. public class PermissionController {
  15. @Resource
  16. private PermissionService permissionService;
  17. /**
  18. * 新增许可
  19. *
  20. * @param permission
  21. * @return
  22. */
  23. @PostMapping
  24. public Result<?> save(@RequestBody Permission permission) {
  25. return Result.success(permissionService.save(permission));
  26. }
  27. /**
  28. * 更新许可
  29. *
  30. * @param permission
  31. * @return
  32. */
  33. @PutMapping
  34. public Result<?> update(@RequestBody Permission permission) {
  35. return Result.success(permissionService.updateById(permission));
  36. }
  37. /**
  38. * 删除许可
  39. *
  40. * @param id
  41. * @return
  42. */
  43. @DeleteMapping("/{id}")
  44. public Result<?> delete(@PathVariable Long id) {
  45. Permission permission = permissionService.getById(id);
  46. permissionService.delete(id);
  47. return Result.success();
  48. }
  49. /**
  50. * 根据id查询许可
  51. *
  52. * @param id
  53. * @return
  54. */
  55. @GetMapping("/{id}")
  56. public Result<Permission> findById(@PathVariable Long id) {
  57. return Result.success(permissionService.getById(id));
  58. }
  59. /**
  60. * 查询所有
  61. *
  62. * @return
  63. */
  64. @GetMapping
  65. public Result<List<Permission>> findAll() {
  66. return Result.success(permissionService.list());
  67. }
  68. /**
  69. * 分页查询许可
  70. *
  71. * @param name
  72. * @param pageNum
  73. * @param pageSize
  74. * @return
  75. */
  76. @GetMapping("/page")
  77. public Result<IPage<Permission>> findPage(@RequestParam(required = false, defaultValue = "") String name,
  78. @RequestParam(required = false, defaultValue = "1") Integer pageNum,
  79. @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
  80. return Result.success(permissionService.page(new Page<>(pageNum, pageSize), Wrappers.<Permission>lambdaQuery().like(Permission::getName, name)));
  81. }
  82. /**
  83. * 通过权限角色查询权限角色所拥有的许可
  84. *
  85. * @param roles
  86. * @return
  87. */
  88. @PostMapping("/getByRoles")
  89. public Result<List<Permission>> getByRoles(@RequestBody List<Role> roles) {
  90. return Result.success(permissionService.getByRoles(roles));
  91. }
  92. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/146595
推荐阅读
相关标签
  

闽ICP备14008679号