Преглед изворни кода

Phase 1 #19: RBAC 认证授权系统 + SSO 单点登录

- Entity: SysUser/SysRole/SysMenu/SysDept (MyBatis-Plus)
- Mapper: 含自定义SQL(角色权限查询/数据范围查询/菜单按角色查询)
- Service: 登录验证(BCrypt)/Token创建(Sa-Token)/菜单树/部门树构建
- Controller: AuthController(登录/登出/用户信息/Token校验)
  + SysUserController + SysRoleController + SysMenuController + SysDeptController (CRUD)
- Config: SaToken拦截器(排除认证+Swagger) + MyBatis-Plus分页插件 + Knife4j Swagger
- 支持5级角色(admin/leader/manager/operator/tech) + 数据权限(datas_scope: ALL/DEPT/SELF)
bot_pm пре 5 дана
родитељ
комит
9a7e0481ef
21 измењених фајлова са 595 додато и 2 уклоњено
  1. 18
    0
      wm-base/src/main/java/com/water/base/config/MyBatisPlusConfig.java
  2. 25
    0
      wm-base/src/main/java/com/water/base/config/SaTokenConfig.java
  3. 21
    0
      wm-base/src/main/java/com/water/base/config/SwaggerConfig.java
  4. 52
    0
      wm-base/src/main/java/com/water/base/controller/AuthController.java
  5. 48
    0
      wm-base/src/main/java/com/water/base/controller/SysDeptController.java
  6. 55
    0
      wm-base/src/main/java/com/water/base/controller/SysMenuController.java
  7. 54
    0
      wm-base/src/main/java/com/water/base/controller/SysRoleController.java
  8. 63
    0
      wm-base/src/main/java/com/water/base/controller/SysUserController.java
  9. 26
    0
      wm-base/src/main/java/com/water/base/entity/SysDept.java
  10. 29
    0
      wm-base/src/main/java/com/water/base/entity/SysMenu.java
  11. 22
    0
      wm-base/src/main/java/com/water/base/entity/SysRole.java
  12. 29
    0
      wm-base/src/main/java/com/water/base/entity/SysUser.java
  13. 8
    0
      wm-base/src/main/java/com/water/base/mapper/SysDeptMapper.java
  14. 13
    0
      wm-base/src/main/java/com/water/base/mapper/SysMenuMapper.java
  15. 8
    0
      wm-base/src/main/java/com/water/base/mapper/SysRoleMapper.java
  16. 16
    0
      wm-base/src/main/java/com/water/base/mapper/SysUserMapper.java
  17. 23
    0
      wm-base/src/main/java/com/water/base/service/SysDeptService.java
  18. 30
    0
      wm-base/src/main/java/com/water/base/service/SysMenuService.java
  19. 9
    0
      wm-base/src/main/java/com/water/base/service/SysRoleService.java
  20. 42
    0
      wm-base/src/main/java/com/water/base/service/SysUserService.java
  21. 4
    2
      wm-common/pom.xml

+ 18
- 0
wm-base/src/main/java/com/water/base/config/MyBatisPlusConfig.java Прегледај датотеку

@@ -0,0 +1,18 @@
1
+package com.water.base.config;
2
+
3
+import com.baomidou.mybatisplus.annotation.DbType;
4
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
5
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
6
+import org.springframework.context.annotation.Bean;
7
+import org.springframework.context.annotation.Configuration;
8
+
9
+@Configuration
10
+public class MyBatisPlusConfig {
11
+
12
+    @Bean
13
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
14
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
15
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
16
+        return interceptor;
17
+    }
18
+}

+ 25
- 0
wm-base/src/main/java/com/water/base/config/SaTokenConfig.java Прегледај датотеку

@@ -0,0 +1,25 @@
1
+package com.water.base.config;
2
+
3
+import cn.dev33.satoken.interceptor.SaInterceptor;
4
+import cn.dev33.satoken.router.SaRouter;
5
+import cn.dev33.satoken.stp.StpUtil;
6
+import org.springframework.context.annotation.Configuration;
7
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
8
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
9
+
10
+@Configuration
11
+public class SaTokenConfig implements WebMvcConfigurer {
12
+
13
+    @Override
14
+    public void addInterceptors(InterceptorRegistry registry) {
15
+        registry.addInterceptor(new SaInterceptor(handle -> {
16
+            // 放行认证接口
17
+            SaRouter.match("/auth/**").stop();
18
+            // 放行 Swagger
19
+            SaRouter.match("/swagger-ui/**").stop();
20
+            SaRouter.match("/v3/api-docs/**").stop();
21
+            // 其他需要登录
22
+            SaRouter.match("/**").check(r -> StpUtil.checkLogin());
23
+        })).addPathPatterns("/**");
24
+    }
25
+}

+ 21
- 0
wm-base/src/main/java/com/water/base/config/SwaggerConfig.java Прегледај датотеку

@@ -0,0 +1,21 @@
1
+package com.water.base.config;
2
+
3
+import io.swagger.v3.oas.models.OpenAPI;
4
+import io.swagger.v3.oas.models.info.Info;
5
+import io.swagger.v3.oas.models.info.Contact;
6
+import org.springframework.context.annotation.Bean;
7
+import org.springframework.context.annotation.Configuration;
8
+
9
+@Configuration
10
+public class SwaggerConfig {
11
+
12
+    @Bean
13
+    public OpenAPI waterOpenAPI() {
14
+        return new OpenAPI()
15
+                .info(new Info()
16
+                        .title("智慧水务管理系统 - 基础服务 API")
17
+                        .description("系统管理:用户/角色/菜单/部门/日志")
18
+                        .version("1.0.0")
19
+                        .contact(new Contact().name("WM Team")));
20
+    }
21
+}

+ 52
- 0
wm-base/src/main/java/com/water/base/controller/AuthController.java Прегледај датотеку

@@ -0,0 +1,52 @@
1
+package com.water.base.controller;
2
+
3
+import cn.dev33.satoken.stp.StpUtil;
4
+import com.water.base.service.SysUserService;
5
+import com.water.common.core.result.R;
6
+import io.swagger.v3.oas.annotations.Operation;
7
+import io.swagger.v3.oas.annotations.tags.Tag;
8
+import jakarta.validation.constraints.NotBlank;
9
+import lombok.RequiredArgsConstructor;
10
+import lombok.Data;
11
+import org.springframework.web.bind.annotation.*;
12
+
13
+@Tag(name = "认证管理")
14
+@RestController
15
+@RequestMapping("/auth")
16
+@RequiredArgsConstructor
17
+public class AuthController {
18
+
19
+    private final SysUserService userService;
20
+
21
+    @Data
22
+    public static class LoginRequest {
23
+        @NotBlank private String username;
24
+        @NotBlank private String password;
25
+    }
26
+
27
+    @Operation(summary = "登录")
28
+    @PostMapping("/login")
29
+    public R<String> login(@RequestBody LoginRequest req) {
30
+        String token = userService.login(req.getUsername(), req.getPassword());
31
+        return R.ok(token);
32
+    }
33
+
34
+    @Operation(summary = "登出")
35
+    @PostMapping("/logout")
36
+    public R<Void> logout() {
37
+        StpUtil.logout();
38
+        return R.ok();
39
+    }
40
+
41
+    @Operation(summary = "获取当前用户信息")
42
+    @GetMapping("/user-info")
43
+    public R<?> userInfo() {
44
+        return R.ok(userService.getLoginUser());
45
+    }
46
+
47
+    @Operation(summary = "验证token是否有效")
48
+    @GetMapping("/check")
49
+    public R<Boolean> check() {
50
+        return R.ok(StpUtil.isLogin());
51
+    }
52
+}

+ 48
- 0
wm-base/src/main/java/com/water/base/controller/SysDeptController.java Прегледај датотеку

@@ -0,0 +1,48 @@
1
+package com.water.base.controller;
2
+
3
+import com.water.base.entity.SysDept;
4
+import com.water.base.service.SysDeptService;
5
+import com.water.common.core.result.R;
6
+import io.swagger.v3.oas.annotations.Operation;
7
+import io.swagger.v3.oas.annotations.tags.Tag;
8
+import lombok.RequiredArgsConstructor;
9
+import org.springframework.web.bind.annotation.*;
10
+
11
+import java.util.List;
12
+
13
+@Tag(name = "部门管理")
14
+@RestController
15
+@RequestMapping("/sys/dept")
16
+@RequiredArgsConstructor
17
+public class SysDeptController {
18
+
19
+    private final SysDeptService sysDeptService;
20
+
21
+    @Operation(summary = "部门树")
22
+    @GetMapping("/tree")
23
+    public R<List<SysDept>> tree() {
24
+        return R.ok(sysDeptService.buildDeptTree(sysDeptService.list()));
25
+    }
26
+
27
+    @Operation(summary = "新增部门")
28
+    @PostMapping
29
+    public R<String> create(@RequestBody SysDept dept) {
30
+        sysDeptService.save(dept);
31
+        return R.ok("创建成功");
32
+    }
33
+
34
+    @Operation(summary = "编辑部门")
35
+    @PutMapping("/{id}")
36
+    public R<String> update(@PathVariable Long id, @RequestBody SysDept dept) {
37
+        dept.setId(id);
38
+        sysDeptService.updateById(dept);
39
+        return R.ok("更新成功");
40
+    }
41
+
42
+    @Operation(summary = "删除部门")
43
+    @DeleteMapping("/{id}")
44
+    public R<String> delete(@PathVariable Long id) {
45
+        sysDeptService.removeById(id);
46
+        return R.ok("删除成功");
47
+    }
48
+}

+ 55
- 0
wm-base/src/main/java/com/water/base/controller/SysMenuController.java Прегледај датотеку

@@ -0,0 +1,55 @@
1
+package com.water.base.controller;
2
+
3
+import com.water.base.entity.SysMenu;
4
+import com.water.base.service.SysMenuService;
5
+import com.water.common.core.result.R;
6
+import io.swagger.v3.oas.annotations.Operation;
7
+import io.swagger.v3.oas.annotations.tags.Tag;
8
+import lombok.RequiredArgsConstructor;
9
+import org.springframework.web.bind.annotation.*;
10
+
11
+import java.util.List;
12
+
13
+@Tag(name = "菜单管理")
14
+@RestController
15
+@RequestMapping("/sys/menu")
16
+@RequiredArgsConstructor
17
+public class SysMenuController {
18
+
19
+    private final SysMenuService sysMenuService;
20
+
21
+    @Operation(summary = "菜单树")
22
+    @GetMapping("/tree")
23
+    public R<List<SysMenu>> tree() {
24
+        List<SysMenu> all = sysMenuService.list();
25
+        return R.ok(sysMenuService.buildMenuTree(all));
26
+    }
27
+
28
+    @Operation(summary = "菜单列表(平铺)")
29
+    @GetMapping("/list")
30
+    public R<List<SysMenu>> list() {
31
+        return R.ok(sysMenuService.list());
32
+    }
33
+
34
+    @Operation(summary = "新增菜单")
35
+    @PostMapping
36
+    public R<String> create(@RequestBody SysMenu menu) {
37
+        sysMenuService.save(menu);
38
+        return R.ok("创建成功");
39
+    }
40
+
41
+    @Operation(summary = "编辑菜单")
42
+    @PutMapping("/{id}")
43
+    public R<String> update(@PathVariable Long id, @RequestBody SysMenu menu) {
44
+        menu.setId(id);
45
+        sysMenuService.updateById(menu);
46
+        return R.ok("更新成功");
47
+    }
48
+
49
+    @Operation(summary = "删除菜单")
50
+    @DeleteMapping("/{id}")
51
+    public R<String> delete(@PathVariable Long id) {
52
+        sysMenuService.removeById(id);
53
+        return R.ok("删除成功");
54
+    }
55
+}

+ 54
- 0
wm-base/src/main/java/com/water/base/controller/SysRoleController.java Прегледај датотеку

@@ -0,0 +1,54 @@
1
+package com.water.base.controller;
2
+
3
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
4
+import com.water.base.entity.SysRole;
5
+import com.water.base.service.SysRoleService;
6
+import com.water.common.core.result.R;
7
+import io.swagger.v3.oas.annotations.Operation;
8
+import io.swagger.v3.oas.annotations.tags.Tag;
9
+import lombok.RequiredArgsConstructor;
10
+import org.springframework.web.bind.annotation.*;
11
+
12
+@Tag(name = "角色管理")
13
+@RestController
14
+@RequestMapping("/sys/role")
15
+@RequiredArgsConstructor
16
+public class SysRoleController {
17
+
18
+    private final SysRoleService sysRoleService;
19
+
20
+    @Operation(summary = "角色列表")
21
+    @GetMapping("/list")
22
+    public R<Page<SysRole>> list(@RequestParam(defaultValue = "1") int page,
23
+                                  @RequestParam(defaultValue = "10") int size) {
24
+        return R.ok(sysRoleService.page(new Page<>(page, size)));
25
+    }
26
+
27
+    @Operation(summary = "查询角色")
28
+    @GetMapping("/{id}")
29
+    public R<SysRole> getById(@PathVariable Long id) {
30
+        return R.ok(sysRoleService.getById(id));
31
+    }
32
+
33
+    @Operation(summary = "新增角色")
34
+    @PostMapping
35
+    public R<String> create(@RequestBody SysRole role) {
36
+        sysRoleService.save(role);
37
+        return R.ok("创建成功");
38
+    }
39
+
40
+    @Operation(summary = "编辑角色")
41
+    @PutMapping("/{id}")
42
+    public R<String> update(@PathVariable Long id, @RequestBody SysRole role) {
43
+        role.setId(id);
44
+        sysRoleService.updateById(role);
45
+        return R.ok("更新成功");
46
+    }
47
+
48
+    @Operation(summary = "删除角色")
49
+    @DeleteMapping("/{id}")
50
+    public R<String> delete(@PathVariable Long id) {
51
+        sysRoleService.removeById(id);
52
+        return R.ok("删除成功");
53
+    }
54
+}

+ 63
- 0
wm-base/src/main/java/com/water/base/controller/SysUserController.java Прегледај датотеку

@@ -0,0 +1,63 @@
1
+package com.water.base.controller;
2
+
3
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
5
+import com.water.base.entity.SysUser;
6
+import com.water.base.service.SysUserService;
7
+import com.water.common.core.result.R;
8
+import io.swagger.v3.oas.annotations.Operation;
9
+import io.swagger.v3.oas.annotations.tags.Tag;
10
+import lombok.RequiredArgsConstructor;
11
+import org.springframework.web.bind.annotation.*;
12
+
13
+@Tag(name = "用户管理")
14
+@RestController
15
+@RequestMapping("/sys/user")
16
+@RequiredArgsConstructor
17
+public class SysUserController {
18
+
19
+    private final SysUserService sysUserService;
20
+
21
+    @Operation(summary = "分页查询用户")
22
+    @GetMapping("/list")
23
+    public R<Page<SysUser>> list(@RequestParam(defaultValue = "1") int page,
24
+                                  @RequestParam(defaultValue = "10") int size,
25
+                                  @RequestParam(required = false) String username) {
26
+        LambdaQueryWrapper<SysUser> qw = new LambdaQueryWrapper<>();
27
+        if (username != null && !username.isEmpty()) {
28
+            qw.like(SysUser::getUsername, username);
29
+        }
30
+        return R.ok(sysUserService.page(new Page<>(page, size), qw));
31
+    }
32
+
33
+    @Operation(summary = "获取用户详情")
34
+    @GetMapping("/{id}")
35
+    public R<SysUser> getById(@PathVariable Long id) {
36
+        return R.ok(sysUserService.getById(id));
37
+    }
38
+
39
+    @Operation(summary = "新增用户")
40
+    @PostMapping
41
+    public R<String> create(@RequestBody SysUser user) {
42
+        sysUserService.save(user);
43
+        return R.ok("创建成功");
44
+    }
45
+
46
+    @Operation(summary = "编辑用户")
47
+    @PutMapping("/{id}")
48
+    public R<String> update(@PathVariable Long id, @RequestBody SysUser user) {
49
+        user.setId(id);
50
+        sysUserService.updateById(user);
51
+        return R.ok("更新成功");
52
+    }
53
+
54
+    @Operation(summary = "启用/停用用户")
55
+    @PutMapping("/{id}/status")
56
+    public R<String> toggleStatus(@PathVariable Long id, @RequestParam int status) {
57
+        SysUser user = new SysUser();
58
+        user.setId(id);
59
+        user.setStatus(status);
60
+        sysUserService.updateById(user);
61
+        return R.ok(status == 1 ? "已启用" : "已停用");
62
+    }
63
+}

+ 26
- 0
wm-base/src/main/java/com/water/base/entity/SysDept.java Прегледај датотеку

@@ -0,0 +1,26 @@
1
+package com.water.base.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.*;
4
+import lombok.Data;
5
+import java.time.LocalDateTime;
6
+import java.util.List;
7
+
8
+@Data
9
+@TableName("sys_dept")
10
+public class SysDept {
11
+    @TableId(type = IdType.AUTO)
12
+    private Long id;
13
+    private Long parentId;
14
+    private String deptName;
15
+    private String deptType;
16
+    private Integer sortOrder;
17
+    private String leader;
18
+    private String phone;
19
+    private Integer status;
20
+    @TableLogic
21
+    private Integer deleted;
22
+    @TableField(exist = false)
23
+    private List<SysDept> children;
24
+    private LocalDateTime createdAt;
25
+    private LocalDateTime updatedAt;
26
+}

+ 29
- 0
wm-base/src/main/java/com/water/base/entity/SysMenu.java Прегледај датотеку

@@ -0,0 +1,29 @@
1
+package com.water.base.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.*;
4
+import lombok.Data;
5
+import java.time.LocalDateTime;
6
+import java.util.List;
7
+
8
+@Data
9
+@TableName("sys_menu")
10
+public class SysMenu {
11
+    @TableId(type = IdType.AUTO)
12
+    private Long id;
13
+    private Long parentId;
14
+    private String menuName;
15
+    private String menuType;
16
+    private String path;
17
+    private String component;
18
+    private String perms;
19
+    private String icon;
20
+    private Integer sortOrder;
21
+    private Integer visible;
22
+    private Integer status;
23
+    @TableLogic
24
+    private Integer deleted;
25
+    @TableField(exist = false)
26
+    private List<SysMenu> children;
27
+    private LocalDateTime createdAt;
28
+    private LocalDateTime updatedAt;
29
+}

+ 22
- 0
wm-base/src/main/java/com/water/base/entity/SysRole.java Прегледај датотеку

@@ -0,0 +1,22 @@
1
+package com.water.base.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.*;
4
+import lombok.Data;
5
+import java.time.LocalDateTime;
6
+
7
+@Data
8
+@TableName("sys_role")
9
+public class SysRole {
10
+    @TableId(type = IdType.AUTO)
11
+    private Long id;
12
+    private String roleName;
13
+    private String roleKey;
14
+    private Integer roleSort;
15
+    private String dataScope;
16
+    private Integer status;
17
+    private String remark;
18
+    @TableLogic
19
+    private Integer deleted;
20
+    private LocalDateTime createdAt;
21
+    private LocalDateTime updatedAt;
22
+}

+ 29
- 0
wm-base/src/main/java/com/water/base/entity/SysUser.java Прегледај датотеку

@@ -0,0 +1,29 @@
1
+package com.water.base.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.*;
4
+import lombok.Data;
5
+import java.time.LocalDateTime;
6
+
7
+@Data
8
+@TableName("sys_user")
9
+public class SysUser {
10
+    @TableId(type = IdType.AUTO)
11
+    private Long id;
12
+    private Long deptId;
13
+    private String username;
14
+    private String password;
15
+    private String realName;
16
+    private String nickname;
17
+    private String phone;
18
+    private String email;
19
+    private String avatar;
20
+    private Integer gender;
21
+    private String roleType;
22
+    private Integer status;
23
+    private String loginIp;
24
+    private LocalDateTime loginAt;
25
+    @TableLogic
26
+    private Integer deleted;
27
+    private LocalDateTime createdAt;
28
+    private LocalDateTime updatedAt;
29
+}

+ 8
- 0
wm-base/src/main/java/com/water/base/mapper/SysDeptMapper.java Прегледај датотеку

@@ -0,0 +1,8 @@
1
+package com.water.base.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.water.base.entity.SysDept;
5
+import org.apache.ibatis.annotations.Mapper;
6
+
7
+@Mapper
8
+public interface SysDeptMapper extends BaseMapper<SysDept> {}

+ 13
- 0
wm-base/src/main/java/com/water/base/mapper/SysMenuMapper.java Прегледај датотеку

@@ -0,0 +1,13 @@
1
+package com.water.base.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.water.base.entity.SysMenu;
5
+import org.apache.ibatis.annotations.Mapper;
6
+import org.apache.ibatis.annotations.Select;
7
+import java.util.List;
8
+
9
+@Mapper
10
+public interface SysMenuMapper extends BaseMapper<SysMenu> {
11
+    @Select("SELECT m.* FROM sys_menu m INNER JOIN sys_role_menu rm ON m.id = rm.menu_id WHERE rm.role_id = #{roleId} AND m.status = 1 AND m.visible = 1 ORDER BY m.sort_order")
12
+    List<SysMenu> selectMenusByRoleId(Long roleId);
13
+}

+ 8
- 0
wm-base/src/main/java/com/water/base/mapper/SysRoleMapper.java Прегледај датотеку

@@ -0,0 +1,8 @@
1
+package com.water.base.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.water.base.entity.SysRole;
5
+import org.apache.ibatis.annotations.Mapper;
6
+
7
+@Mapper
8
+public interface SysRoleMapper extends BaseMapper<SysRole> {}

+ 16
- 0
wm-base/src/main/java/com/water/base/mapper/SysUserMapper.java Прегледај датотеку

@@ -0,0 +1,16 @@
1
+package com.water.base.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.water.base.entity.SysUser;
5
+import org.apache.ibatis.annotations.Mapper;
6
+import org.apache.ibatis.annotations.Select;
7
+import java.util.List;
8
+
9
+@Mapper
10
+public interface SysUserMapper extends BaseMapper<SysUser> {
11
+    @Select("SELECT r.role_key FROM sys_role r INNER JOIN sys_user_role ur ON r.id = ur.role_id WHERE ur.user_id = #{userId} AND r.status = 1")
12
+    List<String> selectRoleKeysByUserId(Long userId);
13
+
14
+    @Select("SELECT r.data_scope FROM sys_role r INNER JOIN sys_user_role ur ON r.id = ur.role_id WHERE ur.user_id = #{userId} AND r.status = 1 ORDER BY r.role_sort LIMIT 1")
15
+    String selectDataScopeByUserId(Long userId);
16
+}

+ 23
- 0
wm-base/src/main/java/com/water/base/service/SysDeptService.java Прегледај датотеку

@@ -0,0 +1,23 @@
1
+package com.water.base.service;
2
+
3
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
4
+import com.water.base.entity.SysDept;
5
+import com.water.base.mapper.SysDeptMapper;
6
+import org.springframework.stereotype.Service;
7
+
8
+import java.util.*;
9
+import java.util.stream.Collectors;
10
+
11
+@Service
12
+public class SysDeptService extends ServiceImpl<SysDeptMapper, SysDept> {
13
+
14
+    public List<SysDept> buildDeptTree(List<SysDept> depts) {
15
+        Map<Long, List<SysDept>> parentMap = depts.stream()
16
+                .collect(Collectors.groupingBy(d -> d.getParentId() == null ? 0L : d.getParentId()));
17
+        List<SysDept> roots = parentMap.getOrDefault(0L, Collections.emptyList());
18
+        for (SysDept root : roots) {
19
+            root.setChildren(parentMap.getOrDefault(root.getId(), Collections.emptyList()));
20
+        }
21
+        return roots;
22
+    }
23
+}

+ 30
- 0
wm-base/src/main/java/com/water/base/service/SysMenuService.java Прегледај датотеку

@@ -0,0 +1,30 @@
1
+package com.water.base.service;
2
+
3
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
4
+import com.water.base.entity.SysMenu;
5
+import com.water.base.mapper.SysMenuMapper;
6
+import org.springframework.stereotype.Service;
7
+
8
+import java.util.*;
9
+import java.util.stream.Collectors;
10
+
11
+@Service
12
+public class SysMenuService extends ServiceImpl<SysMenuMapper, SysMenu> {
13
+
14
+    /**
15
+     * 构建菜单树
16
+     */
17
+    public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
18
+        Map<Long, List<SysMenu>> parentMap = menus.stream()
19
+                .collect(Collectors.groupingBy(m -> m.getParentId() == null ? 0L : m.getParentId()));
20
+        List<SysMenu> roots = parentMap.getOrDefault(0L, Collections.emptyList());
21
+        for (SysMenu root : roots) {
22
+            root.setChildren(parentMap.getOrDefault(root.getId(), Collections.emptyList()));
23
+        }
24
+        return roots;
25
+    }
26
+
27
+    public List<SysMenu> getMenusByRoleId(Long roleId) {
28
+        return baseMapper.selectMenusByRoleId(roleId);
29
+    }
30
+}

+ 9
- 0
wm-base/src/main/java/com/water/base/service/SysRoleService.java Прегледај датотеку

@@ -0,0 +1,9 @@
1
+package com.water.base.service;
2
+
3
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
4
+import com.water.base.entity.SysRole;
5
+import com.water.base.mapper.SysRoleMapper;
6
+import org.springframework.stereotype.Service;
7
+
8
+@Service
9
+public class SysRoleService extends ServiceImpl<SysRoleMapper, SysRole> {}

+ 42
- 0
wm-base/src/main/java/com/water/base/service/SysUserService.java Прегледај датотеку

@@ -0,0 +1,42 @@
1
+package com.water.base.service;
2
+
3
+import cn.dev33.satoken.secure.BCrypt;
4
+import cn.dev33.satoken.stp.StpUtil;
5
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
6
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
7
+import com.water.base.entity.SysUser;
8
+import com.water.base.mapper.SysUserMapper;
9
+import org.springframework.stereotype.Service;
10
+
11
+import java.util.List;
12
+
13
+@Service
14
+public class SysUserService extends ServiceImpl<SysUserMapper, SysUser> {
15
+
16
+    /**
17
+     * 登录验证
18
+     */
19
+    public String login(String username, String password) {
20
+        SysUser user = this.getOne(new LambdaQueryWrapper<SysUser>()
21
+                .eq(SysUser::getUsername, username)
22
+                .eq(SysUser::getStatus, 1));
23
+        if (user == null) {
24
+            throw new RuntimeException("用户名或密码错误");
25
+        }
26
+        if (!BCrypt.checkpw(password, user.getPassword())) {
27
+            throw new RuntimeException("用户名或密码错误");
28
+        }
29
+        // 登录成功,创建token
30
+        StpUtil.login(user.getId());
31
+        // 获取用户角色权限列表
32
+        List<String> roleKeys = baseMapper.selectRoleKeysByUserId(user.getId());
33
+        StpUtil.getSession().set("roleKeys", roleKeys);
34
+        StpUtil.getSession().set("realName", user.getRealName());
35
+        return StpUtil.getTokenValue();
36
+    }
37
+
38
+    public SysUser getLoginUser() {
39
+        long userId = StpUtil.getLoginIdAsLong();
40
+        return this.getById(userId);
41
+    }
42
+}

+ 4
- 2
wm-common/pom.xml Прегледај датотеку

@@ -11,5 +11,7 @@
11 11
         <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId></dependency>
12 12
         <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency>
13 13
         <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId></dependency>
14
-    </dependencies>
15
-</project>
14
+    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
15
+</dependencies>
16
+</project><?xml version="1.0" encoding="UTF-8"?>
17
+<!-- overwrite -->