项目整体情况
数据库表
表名 | 注释 |
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)管理员在登录页面输入账号、密码
2)输入不存在的账号,提示”不存在此用户“
3)输入错误密码,提示”密码或账号输入错误“
4)输入正确,提示”提示登录成功“,跳转到主页面