Springboot教你搭建后端管理系统

项目整体情况

数据库表

表名

注释

sys_menu

保存菜单信息

sys_role

保存角色信息

sys_user

保存用户信息

sys_role_menu

保存角色与菜单关系信息

sys_dict

图标信息

数据库sql文件

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 80026
 Source Host           : localhost:3306
 Source Schema         : test

 Target Server Type    : MySQL
 Target Server Version : 80026
 File Encoding         : 65001

 Date: 20/10/2023 22:20:16
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_dict
-- ----------------------------
DROP TABLE IF EXISTS `sys_dict`;
CREATE TABLE `sys_dict` (
  `name` varchar(255) DEFAULT NULL,
  `value` varchar(255) DEFAULT NULL,
  `type` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of sys_dict
-- ----------------------------
BEGIN;
INSERT INTO `sys_dict` (`name`, `value`, `type`) VALUES ('user', 'el-icon-user', 'icon');
INSERT INTO `sys_dict` (`name`, `value`, `type`) VALUES ('house', 'el-icon-house', 'icon');
INSERT INTO `sys_dict` (`name`, `value`, `type`) VALUES ('menu', 'el-icon-menu', 'icon');
INSERT INTO `sys_dict` (`name`, `value`, `type`) VALUES ('s-custom', 'el-icon-s-custom', 'icon');
INSERT INTO `sys_dict` (`name`, `value`, `type`) VALUES ('s-grid', 'el-icon-s-grid', 'icon');
INSERT INTO `sys_dict` (`name`, `value`, `type`) VALUES ('document', 'el-icon-document', 'icon');
INSERT INTO `sys_dict` (`name`, `value`, `type`) VALUES ('coffee', 'el-icon-coffee\r\n', 'icon');
INSERT INTO `sys_dict` (`name`, `value`, `type`) VALUES ('s-marketing', 'el-icon-s-marketing', 'icon');
COMMIT;

-- ----------------------------
-- Table structure for sys_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `path` varchar(255) DEFAULT NULL,
  `icon` varchar(255) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  `pid` int DEFAULT NULL,
  `pagePath` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `sortnum` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of sys_menu
-- ----------------------------
BEGIN;
INSERT INTO `sys_menu` (`id`, `name`, `path`, `icon`, `description`, `pid`, `pagePath`, `sortnum`) VALUES (1, '主页', '/home', 'ei-icon-home', NULL, NULL, 'Home', 1);
INSERT INTO `sys_menu` (`id`, `name`, `path`, `icon`, `description`, `pid`, `pagePath`, `sortnum`) VALUES (3, '系统管理', NULL, NULL, NULL, NULL, NULL, 2);
INSERT INTO `sys_menu` (`id`, `name`, `path`, `icon`, `description`, `pid`, `pagePath`, `sortnum`) VALUES (11, '用户管理', '/user', NULL, NULL, 3, 'User', NULL);
INSERT INTO `sys_menu` (`id`, `name`, `path`, `icon`, `description`, `pid`, `pagePath`, `sortnum`) VALUES (12, '角色管理', '/role', NULL, NULL, 3, 'Role', NULL);
INSERT INTO `sys_menu` (`id`, `name`, `path`, `icon`, `description`, `pid`, `pagePath`, `sortnum`) VALUES (13, '菜单管理', '/menu', NULL, NULL, 3, 'Menu', NULL);
INSERT INTO `sys_menu` (`id`, `name`, `path`, `icon`, `description`, `pid`, `pagePath`, `sortnum`) VALUES (20, '菜单', NULL, NULL, NULL, 14, NULL, NULL);
COMMIT;

-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  `flag` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of sys_role
-- ----------------------------
BEGIN;
INSERT INTO `sys_role` (`id`, `name`, `description`, `flag`) VALUES (1, '管理员', '管理员', 'ROLE_ADMIN');
INSERT INTO `sys_role` (`id`, `name`, `description`, `flag`) VALUES (2, '老师', '老师', 'ROLE_TEACHER');
INSERT INTO `sys_role` (`id`, `name`, `description`, `flag`) VALUES (10, '学生', NULL, 'ROLE_STUDENT');
COMMIT;

-- ----------------------------
-- Table structure for sys_role_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE `sys_role_menu` (
  `role_id` int NOT NULL,
  `menu_id` int NOT NULL,
  PRIMARY KEY (`role_id`,`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of sys_role_menu
-- ----------------------------
BEGIN;
INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1, 1);
INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1, 3);
INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1, 11);
INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1, 12);
INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1, 13);
INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1);
INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (8, 11);
COMMIT;

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '用户名',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '密码',
  `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '昵称',
  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '邮箱',
  `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '电话',
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '地址',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  `avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '头像',
  `role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '角色',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
BEGIN;
INSERT INTO `sys_user` (`id`, `username`, `password`, `nickname`, `email`, `phone`, `address`, `create_time`, `avatar_url`, `role`) VALUES (1, 'admin', '123456', '小雷', 'admin@qq.com', '13988997788', '安徽合肥1', '2022-01-22 21:10:27', 'http://localhost:9090/file/8d966b0e6cf84fe191a72a58b8293b23.png', 'ROLE_ADMIN');
INSERT INTO `sys_user` (`id`, `username`, `password`, `nickname`, `email`, `phone`, `address`, `create_time`, `avatar_url`, `role`) VALUES (2, 'zhangsan', '123456', '张三', '222111@qq.com', NULL, '花果山', NULL, NULL, 'ROLE_TEACHER');
INSERT INTO `sys_user` (`id`, `username`, `password`, `nickname`, `email`, `phone`, `address`, `create_time`, `avatar_url`, `role`) VALUES (9, 'xiaolei', NULL, '李四', '2452143632@qq.com', '15126251889', '重庆', NULL, NULL, 'ROLE_TEACHER');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

下面的代码顺序与目录相同

pom.xml 文件

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.1</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>2.3.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.18</version>
        </dependency>
        <!-- JWT -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.10.3</version>
        </dependency>
    </dependencies>
public interface Code {
    String CODE_200 = "200"; //成功
    String CODE_401 = "401";  // 权限不足
    String CODE_400 = "400";  // 参数错误
    String CODE_500 = "500"; // 系统错误
    String CODE_600 = "600"; // 其他业务异常

    String DICT_TYPE_ICON = "icon";

    String FILES_KEY = "FILES_FRONT_ALL";
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private String code;
    private String msg;
    private Object data;

    public static Result success() {
        return new Result(Code.CODE_200, "", null);
    }

    public static Result success(Object data) {
        return new Result(Code.CODE_200, "", data);
    }

    public static Result error(String code, String msg) {
        return new Result(code, msg, null);
    }

    public static Result error() {
        return new Result(Code.CODE_500, "系统错误", null);
    }

}

解决前端跨域问题

@Configuration
public class CorsConfig {

    // 当前跨域请求最大有效时长。这里默认1天
    private static final long MAX_AGE = 24 * 60 * 60;

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
        corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
        corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
        corsConfiguration.setMaxAge(MAX_AGE);
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
        return new CorsFilter(source);
    }
}
/**
 * 接受前端登录请求的参数
 */
@Data
public class UserDTO {
    private Integer id;
    private String username;
    private String password;
    private String nickname;
    private String avatarUrl;
    private String role;
    private List<Menu> menus;
}

@RestController
@RequestMapping("/menu")
public class MenuController {
    @Autowired
    private MenuService menuService;
    @Autowired
    private DictService dictService;

    //查询出所有的菜单和二级菜单
    @GetMapping
    public Result findAll(@RequestParam(defaultValue = "") String name){
        List<Menu> menuList = menuService.findMenus(name);
        return Result.success(menuList);
    }


    @GetMapping("/{id}")
    public Result findOne(@PathVariable Integer id) {
        return Result.success(menuService.getByid(id));
    }

    // 新增或者更新
    @PostMapping
    public Result save(@RequestBody Menu menu) {
        menuService.save(menu);
        return Result.success();
    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        menuService.deleteById(id);
        return Result.success();
    }

    //查询出图标
    @GetMapping("/icons")
    public Result getIcons() {
        List<Dict> dicts = dictService.getBytype(Code.DICT_TYPE_ICON);
        return Result.success(dicts);
    }

    //分页查询
    //分页查询接口
    @GetMapping("/page")
    public Result findPage(@RequestParam Integer pageNum,
                                       @RequestParam Integer pageSize,
                                       @RequestParam String username){
        pageNum = (pageNum -1)*pageSize;
        username = "%" + username +"%";
        List<Menu> data = menuService.selectPage(pageNum, pageSize,username);
        Integer total = menuService.selectTotal();
        Map<String,Object> res = new HashMap<>();
        res.put("data",data);
        res.put("total",total);
        return Result.success();
    }
}

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


    //查询出所有的菜单和二级菜单
    @GetMapping
    public Result findAll(){
        List<Role> roleList = roleService.findAll();
        return Result.success(roleList);
    }


    @GetMapping("/{id}")
    public Result findOne(@PathVariable Integer id) {
        return Result.success(roleService.getByid(id));
    }

    // 新增或者更新
    @PostMapping
    public Result save(@RequestBody Role role) {
        roleService.save(role);
        return Result.success();
    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        roleService.deleteById(id);
        return Result.success();
    }


    //分页查询
    //分页查询接口
    @GetMapping("/page")
    public Result findPage(@RequestParam Integer pageNum,
                                       @RequestParam Integer pageSize,
                                       @RequestParam String name){
        pageNum = (pageNum -1)*pageSize;
        name = "%" + name +"%";
        List<Role> data = roleService.selectPage(pageNum, pageSize,name);
        Integer total = roleService.selectTotal();
        Map<String,Object> res = new HashMap<>();
        res.put("data",data);
        res.put("total",total);
        return Result.success(res);
    }

    /**
     * 绑定角色和菜单的关系
     * @param roleId 角色id
     * @param menuIds 菜单id数组
     * @return
     */
    @PostMapping("/roleMenu/{roleId}")
    public Result roleMenu(@PathVariable Integer roleId, @RequestBody List<Integer> menuIds) {
        roleService.setRoleMenu(roleId, menuIds);
        return Result.success();
    }

    @GetMapping("/roleMenu/{roleId}")
    public Result getRoleMenu(@PathVariable Integer roleId) {
        List<Integer> idlist = roleService.getRoleMenu(roleId);
        return Result.success(idlist);
    }
}
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/login")
    public Result login(@RequestBody UserDTO userDTO) {
        String username = userDTO.getUsername();
        String password = userDTO.getPassword();
        if (StrUtil.isBlank(username) || StrUtil.isBlank(password)) {
            return Result.error(Code.CODE_400, "参数错误");
        }
        UserDTO dto = userService.login(userDTO);
        return Result.success(dto);
    }

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


    //查询出所有的菜单和二级菜单
    @GetMapping
    public Result findAll(){
        List<User> userList = userService.findAll();
        return Result.success(userList);
    }


    @GetMapping("/{id}")
    public Result findOne(@PathVariable Integer id) {
        return Result.success(userService.getByid(id));
    }

    // 新增或者更新
    @PostMapping
    public Result save(@RequestBody User user) {
        userService.save(user);
        return Result.success();
    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        userService.deleteById(id);
        return Result.success();
    }


    //分页查询
    //分页查询接口
    @GetMapping("/page")
    public Result findPage(@RequestParam Integer pageNum,
                                       @RequestParam Integer pageSize,
                                       @RequestParam String username){
        pageNum = (pageNum -1)*pageSize;
        username = "%" + username +"%";
        List<User> data = userService.selectPage(pageNum, pageSize,username);
        Integer total = userService.selectTotal();
        Map<String,Object> res = new HashMap<>();
        res.put("data",data);
        res.put("total",total);
        return Result.success(res);
    }


}
@Data
public class Dict {
    private String name;
    private String value;
    private String type;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Menu implements Serializable {
    private Integer id;
    private String name;
    private String path;
    private String icon;
    private String description;
    private Integer pid;
    private String pagePath;
    private String sortnum;
    private List<Menu> children;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Role {
    private Integer id;
    private String name;
    private String description;
    private String flag;
}
@Data
public class RoleMenu {
    private Integer roleId;
    private Integer menuId;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String nickname;
    private String email;
    private String phone;
    private String address;
    private Date createtime;
    private String avatarUrl;

    private String role;
    private List<Menu> menus;
}
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 如果抛出的的是ServiceException,则调用该方法
     * @param se 业务异常
     * @return Result
     */
    @ExceptionHandler(ServiceException.class)
    @ResponseBody
    public Result handle(ServiceException se){
        return Result.error(se.getCode(), se.getMessage());
    }

}
@Getter
public class ServiceException extends RuntimeException {
    private String code;

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

}
@Mapper
public interface DictMapper {
    //查询所有
    @Select("select * from sys_dict")
    List<Dict> findAll();

    //根据类型查询图标
    @Select("select * from sys_dict where type = #{type}")
    List<Dict> getBytype(String type);
}
@Mapper
public interface MenuMapper {
    //查询所有
    @Select("select * from sys_menu")
    List<Menu> findAll();

    //新增
    @Insert("INSERT INTO sys_menu (name, path, icon, description, pid, pagePath, sortnum) " +
            "VALUES (#{name}, #{path}, #{icon}, #{description}, #{pid}, #{pagePath}, #{sortnum})")
    int save(Menu menu);


    //删除
    @Delete("delete from sys_menu where id = #{id}")
    int deleteById(@Param("id") Integer id);

    //修改
    int update(Menu menu);

    //通过id查询
    @Select("select * from sys_menu where id = #{id}")
    Menu getByid(@Param("id") Integer id);

    @Select("select * from sys_menu where  name like #{name} limit #{pageNum},#{pageSize}")
    List<Menu> selectPage(Integer pageNum, Integer pageSize,String name);

    @Select("select count(*) from sys_menu")
    Integer selectTotal();

}
@Mapper
public interface RoleMapper {
    //查询所有
    @Select("select * from sys_role")
    List<Role> findAll();

    //新增
    @Insert("INSERT INTO sys_role (name, description, flag) " +
            "VALUES (#{name}, #{description}, #{flag})")
    int save(Role role);


    //删除
    @Delete("delete from sys_role where id = #{id}")
    int deleteById(@Param("id") Integer id);

    //修改
    int update(Role role);

    //通过id查询
    @Select("select * from sys_role where id = #{id}")
    List<Role> getByid(@Param("id") Integer id);

    @Select("select id from sys_role where flag = #{flag}")
    Integer selectByFlag(@Param("flag") String flag);

    @Select("select * from sys_role where  name like #{name} limit #{pageNum},#{pageSize}")
    List<Role> selectPage(Integer pageNum, Integer pageSize,String name);

    @Select("select count(*) from sys_role")
    Integer selectTotal();

}
@Mapper
public interface RoleMenuMapper {

    @Insert("INSERT into sys_role_menu(role_id, menu_id) VALUES (#{roleId}, #{menuId})")
    void insert(RoleMenu roleMenu);

    @Delete("delete from sys_role_menu where role_id = #{roleId}")
    int deleteByRoleId(@Param("roleId") Integer roleId);

    @Select("select menu_id from sys_role_menu where role_id = #{roleId}")
    List<Integer> selectByRoleId(@Param("roleId")Integer roleId);

}
@Mapper
public interface UserMapper {
    //查询所有
    @Select("select * from sys_user")
    List<User> findAll();

    //新增
    @Insert("INSERT INTO sys_user (username, password, nickname, email, phone, address, create_time, avatar_url, role) " +
            "VALUES (#{username}, #{password}, #{nickname}, #{email}, #{phone}, #{address}, #{create_time},#{avatar_url},#{role})")
    int save(User user);


    //删除
    @Delete("delete from sys_user where id = #{id}")
    int deleteById(@Param("id") Integer id);

    //修改
    int update(User user);

    //通过id查询
    @Select("select * from sys_user where id = #{id}")
    List<User> getByid(@Param("id") Integer id);

    @Select("select * from sys_user where  username like #{username} limit #{pageNum},#{pageSize}")
    List<User> selectPage(Integer pageNum, Integer pageSize,String username);

    @Select("select count(*) from sys_user")
    Integer selectTotal();

    @Select("SELECT * FROM sys_user WHERE username = #{username} AND password = #{password}")
    UserDTO getUserInfo(@Param("username") String username, @Param("password") String password);

    @Select("select * from sys_user where username = #{username}")
    List<User> getByname(@Param("username") String username);
}
public interface DictService {
    List<Dict> getBytype(String type);
}
public interface MenuService {
    //查询所有
    List<Menu> findAll();

    //新增
    int save(Menu menu);

    //删除
    int deleteById(@Param("id") Integer id);

    //修改
    int update(Menu menu);

    //通过id查询
    Menu getByid(@Param("id") Integer id);

    List<Menu> findMenus(String name);


    List<Menu> selectPage(Integer pageNum, Integer pageSize,String name);
    Integer selectTotal();
}
public interface RoleService {
    //查询所有

    List<Role> findAll();

    //新增
    int save(Role role);

    //删除
    int deleteById(@Param("id") Integer id);

    //修改
    int update(Role role);

    //通过id查询
    List<Role> getByid(@Param("id") Integer id);


    List<Role> selectPage(Integer pageNum, Integer pageSize,String name);
    Integer selectTotal();

    void setRoleMenu(Integer roleId, List<Integer> menuIds);

    List<Integer> getRoleMenu(Integer roleId);
}
public interface UserService {

    UserDTO getUserInfo(String username, String password);

    UserDTO login(UserDTO userDTO);
    //查询所有
    List<User> findAll();
    //新增
    int save(User user);
    //删除
    int deleteById(@Param("id") Integer id);
    //修改
    int update(User user);

    List<User> getByid(@Param("id") Integer id);

    List<User> getByname(@Param("username") String username);

    List<User> selectPage(Integer pageNum, Integer pageSize,String username);
    Integer selectTotal();

}
@Service
public class DictServiceImpl implements DictService {
    @Autowired
    private DictMapper dictMapper;

    @Override
    public List<Dict> getBytype(String type) {
        List<Dict> typeList = dictMapper.getBytype(type);
        return typeList;
    }
}
@Service
public class MenuServiceImpl implements MenuService {
    @Autowired
    private MenuMapper menuMapper;

    @Override
    public List<Menu> findAll() {
        List<Menu> menuList = menuMapper.findAll();
        return menuList;
    }

    //新增或者保存
    @Override
    public int save(Menu menu) {
        if (menu.getId() == null){
            return menuMapper.save(menu);
        }else {
            return menuMapper.update(menu);
        }
    }


    @Override
    public int deleteById(Integer id) {
        return menuMapper.deleteById(id);
    }

    @Override
    public int update(Menu menu) {
        return menuMapper.update(menu);
    }

    @Override
    public Menu getByid(Integer id) {
        Menu menu = menuMapper.getByid(id);
        return menu;
    }


    @Override
    public List<Menu> findMenus(String name) {
        //查询所有
        List<Menu> menuList = menuMapper.findAll();
        // 找出pid为null的一级菜单
        List<Menu> parentNodes = menuList.stream().filter(menu -> menu.getPid() == null).collect(Collectors.toList());
        //找出一级菜单的子菜单
        for (Menu menu : parentNodes) {
            // 筛选所有数据中pid=父级id的数据就是二级菜单
            menu.setChildren(menuList.stream().filter(m -> menu.getId().equals(m.getPid())).collect(Collectors.toList()));
        }
        return parentNodes;
    }

    @Override
    public List<Menu> selectPage(Integer pageNum, Integer pageSize, String name) {
        return menuMapper.selectPage(pageNum,pageSize,name);
    }

    @Override
    public Integer selectTotal() {
        return menuMapper.selectTotal();
    }


}
@Service
public class RoleServiceImpl implements RoleService {
    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private RoleMenuMapper roleMenuMapper;
    @Autowired
    private MenuService menuService;

    @Override
    public List<Role> findAll() {
        List<Role> roleList = roleMapper.findAll();
        return roleList;
    }

    @Override
    public int save(Role role) {
        if (role.getId() == null){
            return roleMapper.save(role);
        }else {
            return roleMapper.update(role);
        }
    }

    @Override
    public int deleteById(Integer id) {
        return roleMapper.deleteById(id);
    }

    @Override
    public int update(Role role) {
        return roleMapper.update(role);
    }

    @Override
    public List<Role> getByid(Integer id) {
        return roleMapper.getByid(id);
    }

    @Override
    public List<Role> selectPage(Integer pageNum, Integer pageSize, String name) {
        return roleMapper.selectPage(pageNum,pageSize,name);
    }

    @Override
    public Integer selectTotal() {
        return roleMapper.selectTotal();
    }

    @Override
    public void setRoleMenu(Integer roleId, List<Integer> menuIds) {
        // 先删除当前角色id所有的绑定关系
        roleMenuMapper.deleteByRoleId(roleId);
        // 再把前端传过来的菜单id数组绑定到当前的这个角色id上去
        List<Integer> menuIdsCopy = CollUtil.newArrayList(menuIds);
        for (Integer menuId : menuIds) {
            Menu menu = menuService.getByid(menuId);
            if (menu.getPid() != null && !menuIdsCopy.contains(menu.getPid())) { // 二级菜单 并且传过来的menuId数组里面没有它的父级id
                // 那么我们就得补上这个父级id
                RoleMenu roleMenu = new RoleMenu();
                roleMenu.setRoleId(roleId);
                roleMenu.setMenuId(menu.getPid());
                roleMenuMapper.insert(roleMenu);
                menuIdsCopy.add(menu.getPid());
            }
            RoleMenu roleMenu = new RoleMenu();
            roleMenu.setRoleId(roleId);
            roleMenu.setMenuId(menuId);
            roleMenuMapper.insert(roleMenu);
        }
    }

    @Override
    public List<Integer> getRoleMenu(Integer roleId) {
        return roleMenuMapper.selectByRoleId(roleId);
    }
}
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RoleMapper roleMapper;

    @Resource
    private RoleMenuMapper roleMenuMapper;

    @Resource
    private MenuService menuService;




    @Override
    public UserDTO login(UserDTO userDTO) {
        UserDTO userInfo = getUserInfo(userDTO.getUsername(), userDTO.getPassword());
        if (userInfo != null) {
            BeanUtil.copyProperties(userInfo, userDTO, true);
            String role = userInfo.getRole(); // ROLE_ADMIN
            // 设置用户的菜单列表
            List<Menu> roleMenus = getRoleMenus(role);
            userDTO.setMenus(roleMenus);
            return userDTO;
        } else {
            throw new ServiceException(Code.CODE_600, "用户名或密码错误");
        }
    }



    @Override
    public UserDTO getUserInfo(String username, String password) {
        UserDTO one = userMapper.getUserInfo(username, password);
        return one;
    }


    /**
     * 获取当前角色的菜单列表
     * @param roleFlag
     * @return
     */
    private List<Menu> getRoleMenus(String roleFlag) {
        Integer roleId = roleMapper.selectByFlag(roleFlag);
        // 当前角色的所有菜单id集合
        List<Integer> menuIds = roleMenuMapper.selectByRoleId(roleId);

        // 查出系统所有的菜单(树形)
        List<Menu> menus = menuService.findMenus("");
        // new一个最后筛选完成之后的list
        List<Menu> roleMenus = new ArrayList<>();
        // 筛选当前用户角色的菜单
        for (Menu menu : menus) {
            if (menuIds.contains(menu.getId())) {
                roleMenus.add(menu);
            }
            List<Menu> children = menu.getChildren();
            // removeIf()  移除 children 里面不在 menuIds集合中的 元素
            children.removeIf(child -> !menuIds.contains(child.getId()));
        }
        return roleMenus;
    }

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }

    public int save(User user) {
        if (user.getId() == null) {  // user没有id,则表示是新增
            return userMapper.save(user);
        } else { // 否则为更新
            return userMapper.update(user);
        }
    }


    @Override
    public int deleteById(Integer id) {
        return userMapper.deleteById(id);
    }

    @Override
    public int update(User user) {
        return userMapper.update(user);
    }

    @Override
    public List<User> getByid(Integer id) {
        return userMapper.getByid(id);
    }

    @Override
    public List<User> getByname(String username) {
        return userMapper.getByname(username);
    }

    @Override
    public List<User> selectPage(Integer pageNum, Integer pageSize, String username) {
        return userMapper.selectPage(pageNum,pageSize,username);
    }

    @Override
    public Integer selectTotal() {
        return userMapper.selectTotal();
    }
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springbootlx.mapper.MenuMapper">

    <update id="update">
        update sys_menu
        <set>
            <if test="name != null">
                name = #{name},
            </if>
            <if test="path != null">
                path = #{path},
            </if>
            <if test="icon != null">
                icon = #{icon},
            </if>
            <if test="description != null">
                description = #{description},
            </if>
            <if test="pid != null">
                pid = #{pid},
            </if>
            <if test="pagePath != null">
                pagePath = #{pagePath},
            </if>
            <if test="sortnum != null">
                sortnum = #{sortnum}
            </if>
        </set>
        <where>
            id = #{id}
        </where>
    </update>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springbootlx.mapper.RoleMapper">

    <update id="update">
        update sys_role
        <set>
            <if test="name != null">
                name = #{name},
            </if>
            <if test="description != null">
                description = #{description},
            </if>
            <if test="flag != null">
                flag = #{flag}
            </if>
        </set>
        <where>
            id = #{id}
        </where>
    </update>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springbootlx.mapper.UserMapper">
    <update id="update">
        update sys_user
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <!--            <if test="password != null">-->
            <!--                password = #{password}-->
            <!--            </if>-->
            <if test="nickname != null">
                nickname = #{nickname},
            </if>
            <if test="email != null">
                email = #{email},
            </if>
            <if test="phone != null">
                phone = #{phone},
            </if>
            <if test="address != null">
                address = #{address},
            </if>
            <if test="role != null">
                role = #{role}
            </if>
        </set>
        <where>
            id = #{id}
        </where>
    </update>


</mapper>
server:
  ip: localhost
  port: 9090

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2b8
    username: root
    password: 12345678
  redis:
    host: 127.0.0.1
    port: 6379
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
mybatis:
  mapper-locations: classpath:mapper/*.xml  #扫描所有mybatis的xml文件
  configuration:
   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

files:
  upload:
    path: D:/files/
#    path: /home/files/

字段名称

变量名

数据类型

默认值

值域

说明

输出参数

返回结果编码

code

String

具体代码查看接口响应

返回信息

msg

String

参数对象

data

json

响应参数json格式

业务参数

业务参数字符串,各业务接口定义

  1. 用户登录

功能描述

输入:账号密码

输出: 提示信息;登录成功(也可以不提示直接登录)

业务逻辑:

1)管理员在登录页面输入账号、密码

2)输入不存在的账号,提示”不存在此用户“

3)输入错误密码,提示”密码或账号输入错误“

4)输入正确,提示”提示登录成功“,跳转到主页面

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值