Преглед на файлове

feat(wm-system): #14 文档管理与系统管理

文档管理:
- 文档 CRUD / 分类管理 / 版本控制
- DocService + DocController (/system/doc/*)

系统管理:
- 角色管理(5级角色预设)
- 用户管理(新增/编辑/停用)
- 菜单管理 / 部门管理
- 日志管理(登录/操作/异常日志)
- SysService + SysController (/system/*)

DDL: 8 张表 (document/category/version/role/user/menu/department/log)
bot_dev2 преди 5 дни
родител
ревизия
c84bf79d9d
променени са 24 файла, в които са добавени 515 реда и са изтрити 0 реда
  1. 50
    0
      wm-system/pom.xml
  2. 13
    0
      wm-system/src/main/java/com/water/system/SystemApplication.java
  3. 19
    0
      wm-system/src/main/java/com/water/system/controller/DocController.java
  4. 21
    0
      wm-system/src/main/java/com/water/system/controller/SysController.java
  5. 57
    0
      wm-system/src/main/java/com/water/system/entity/Document.java
  6. 33
    0
      wm-system/src/main/java/com/water/system/entity/DocumentCategory.java
  7. 35
    0
      wm-system/src/main/java/com/water/system/entity/DocumentVersion.java
  8. 9
    0
      wm-system/src/main/java/com/water/system/entity/SysDepartment.java
  9. 11
    0
      wm-system/src/main/java/com/water/system/entity/SysLog.java
  10. 9
    0
      wm-system/src/main/java/com/water/system/entity/SysMenu.java
  11. 10
    0
      wm-system/src/main/java/com/water/system/entity/SysRole.java
  12. 12
    0
      wm-system/src/main/java/com/water/system/entity/SysUser.java
  13. 5
    0
      wm-system/src/main/java/com/water/system/mapper/DocumentCategoryMapper.java
  14. 5
    0
      wm-system/src/main/java/com/water/system/mapper/DocumentMapper.java
  15. 5
    0
      wm-system/src/main/java/com/water/system/mapper/DocumentVersionMapper.java
  16. 5
    0
      wm-system/src/main/java/com/water/system/mapper/SysDepartmentMapper.java
  17. 5
    0
      wm-system/src/main/java/com/water/system/mapper/SysLogMapper.java
  18. 5
    0
      wm-system/src/main/java/com/water/system/mapper/SysMenuMapper.java
  19. 5
    0
      wm-system/src/main/java/com/water/system/mapper/SysRoleMapper.java
  20. 5
    0
      wm-system/src/main/java/com/water/system/mapper/SysUserMapper.java
  21. 44
    0
      wm-system/src/main/java/com/water/system/service/DocService.java
  22. 67
    0
      wm-system/src/main/java/com/water/system/service/SysService.java
  23. 40
    0
      wm-system/src/main/resources/application.yml
  24. 45
    0
      wm-system/src/main/resources/db/V1__system_manage.sql

+ 50
- 0
wm-system/pom.xml Целия файл

@@ -0,0 +1,50 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://maven.apache.org/POM/4.0.0"
3
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+    <modelVersion>4.0.0</modelVersion>
6
+    <parent>
7
+        <groupId>com.water</groupId>
8
+        <artifactId>wm-parent</artifactId>
9
+        <version>1.0.0-SNAPSHOT</version>
10
+    </parent>
11
+    <artifactId>wm-system</artifactId>
12
+    <name>wm-system</name>
13
+    <description>文档管理与系统管理模块</description>
14
+
15
+    <dependencies>
16
+        <dependency>
17
+            <groupId>com.water</groupId>
18
+            <artifactId>wm-common</artifactId>
19
+        </dependency>
20
+        <dependency>
21
+            <groupId>org.springframework.boot</groupId>
22
+            <artifactId>spring-boot-starter-web</artifactId>
23
+        </dependency>
24
+        <dependency>
25
+            <groupId>com.baomidou</groupId>
26
+            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
27
+        </dependency>
28
+        <dependency>
29
+            <groupId>cn.dev33</groupId>
30
+            <artifactId>sa-token-spring-boot3-starter</artifactId>
31
+        </dependency>
32
+        <dependency>
33
+            <groupId>org.postgresql</groupId>
34
+            <artifactId>postgresql</artifactId>
35
+        </dependency>
36
+        <dependency>
37
+            <groupId>io.minio</groupId>
38
+            <artifactId>minio</artifactId>
39
+        </dependency>
40
+        <dependency>
41
+            <groupId>org.springframework.boot</groupId>
42
+            <artifactId>spring-boot-starter-validation</artifactId>
43
+        </dependency>
44
+        <dependency>
45
+            <groupId>org.springframework.boot</groupId>
46
+            <artifactId>spring-boot-starter-test</artifactId>
47
+            <scope>test</scope>
48
+        </dependency>
49
+    </dependencies>
50
+</project>

+ 13
- 0
wm-system/src/main/java/com/water/system/SystemApplication.java Целия файл

@@ -0,0 +1,13 @@
1
+package com.water.system;
2
+
3
+import org.springframework.boot.SpringApplication;
4
+import org.springframework.boot.autoconfigure.SpringBootApplication;
5
+import org.mybatis.spring.annotation.MapperScan;
6
+
7
+@SpringBootApplication(scanBasePackages = "com.water")
8
+@MapperScan("com.water.system.mapper")
9
+public class SystemApplication {
10
+    public static void main(String[] args) {
11
+        SpringApplication.run(SystemApplication.class, args);
12
+    }
13
+}

+ 19
- 0
wm-system/src/main/java/com/water/system/controller/DocController.java Целия файл

@@ -0,0 +1,19 @@
1
+package com.water.system.controller;
2
+import com.water.common.core.result.R;
3
+import com.water.system.entity.*;
4
+import com.water.system.service.DocService;
5
+import io.swagger.v3.oas.annotations.tags.Tag;
6
+import lombok.RequiredArgsConstructor;
7
+import org.springframework.web.bind.annotation.*;
8
+import java.util.*;
9
+@Tag(name="文档管理") @RestController @RequestMapping("/system/doc") @RequiredArgsConstructor
10
+public class DocController {
11
+    private final DocService svc;
12
+    @GetMapping("/list") public R<List<Document>> list(@RequestParam(required=false) String categoryId, @RequestParam(required=false) String keyword) { return R.ok(svc.listDocs(categoryId, keyword)); }
13
+    @GetMapping("/{id}") public R<Document> get(@PathVariable Long id) { return R.ok(svc.getDoc(id)); }
14
+    @PostMapping public R<Long> create(@RequestBody Map<String,Object> req) { return R.ok(svc.createDoc(req)); }
15
+    @PutMapping("/{id}") public R<String> update(@PathVariable Long id, @RequestBody Map<String,Object> req) { svc.updateDoc(id, req); return R.ok("OK"); }
16
+    @DeleteMapping("/{id}") public R<String> delete(@PathVariable Long id) { svc.deleteDoc(id); return R.ok("OK"); }
17
+    @GetMapping("/category/list") public R<List<DocumentCategory>> categories() { return R.ok(svc.listCategories()); }
18
+    @GetMapping("/{docId}/versions") public R<List<DocumentVersion>> versions(@PathVariable Long docId) { return R.ok(svc.getVersions(docId)); }
19
+}

+ 21
- 0
wm-system/src/main/java/com/water/system/controller/SysController.java Целия файл

@@ -0,0 +1,21 @@
1
+package com.water.system.controller;
2
+import com.water.common.core.result.R;
3
+import com.water.system.entity.*;
4
+import com.water.system.service.SysService;
5
+import io.swagger.v3.oas.annotations.tags.Tag;
6
+import lombok.RequiredArgsConstructor;
7
+import org.springframework.web.bind.annotation.*;
8
+import java.util.*;
9
+@Tag(name="系统管理") @RestController @RequestMapping("/system") @RequiredArgsConstructor
10
+public class SysController {
11
+    private final SysService svc;
12
+    @GetMapping("/role/list") public R<List<SysRole>> roles() { return R.ok(svc.listRoles()); }
13
+    @PostMapping("/role") public R<Long> createRole(@RequestBody Map<String,Object> req) { return R.ok(svc.createRole(req)); }
14
+    @GetMapping("/user/list") public R<List<SysUser>> users(@RequestParam(required=false) Integer status) { return R.ok(svc.listUsers(status)); }
15
+    @PostMapping("/user") public R<Long> createUser(@RequestBody Map<String,Object> req) { return R.ok(svc.createUser(req)); }
16
+    @PutMapping("/user/{id}/status") public R<String> updateUserStatus(@PathVariable Long id, @RequestParam int status) { svc.updateUserStatus(id, status); return R.ok("OK"); }
17
+    @GetMapping("/menu/list") public R<List<SysMenu>> menus() { return R.ok(svc.listMenus()); }
18
+    @GetMapping("/dept/list") public R<List<SysDepartment>> depts() { return R.ok(svc.listDepts()); }
19
+    @PostMapping("/dept") public R<Long> createDept(@RequestBody Map<String,Object> req) { return R.ok(svc.createDept(req)); }
20
+    @GetMapping("/log/list") public R<List<SysLog>> logs(@RequestParam(required=false) String logType, @RequestParam(required=false) String username) { return R.ok(svc.listLogs(logType, username)); }
21
+}

+ 57
- 0
wm-system/src/main/java/com/water/system/entity/Document.java Целия файл

@@ -0,0 +1,57 @@
1
+package com.water.system.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.*;
4
+import lombok.Data;
5
+import java.time.LocalDateTime;
6
+
7
+/**
8
+ * 文档实体
9
+ */
10
+@Data
11
+@TableName("doc_document")
12
+public class Document {
13
+    @TableId(type = IdType.AUTO)
14
+    private Long id;
15
+    
16
+    /** 文档名称 */
17
+    private String name;
18
+    
19
+    /** 文档原始文件名 */
20
+    private String originalName;
21
+    
22
+    /** 文档大小(字节) */
23
+    private Long fileSize;
24
+    
25
+    /** 文件类型 */
26
+    private String fileType;
27
+    
28
+    /** 存储路径 */
29
+    private String storagePath;
30
+    
31
+    /** 文档分类ID */
32
+    private Long categoryId;
33
+    
34
+    /** 文档描述 */
35
+    private String description;
36
+    
37
+    /** 当前版本号 */
38
+    private Integer currentVersion;
39
+    
40
+    /** 上传者ID */
41
+    private Long uploaderId;
42
+    
43
+    /** 下载次数 */
44
+    private Integer downloadCount;
45
+    
46
+    /** 状态: 0-草稿 1-已发布 2-已归档 */
47
+    private Integer status;
48
+    
49
+    /** 权限级别: 0-公开 1-内部 2-机密 */
50
+    private Integer permissionLevel;
51
+    
52
+    @TableLogic
53
+    private Integer deleted;
54
+    
55
+    private LocalDateTime createdAt;
56
+    private LocalDateTime updatedAt;
57
+}

+ 33
- 0
wm-system/src/main/java/com/water/system/entity/DocumentCategory.java Целия файл

@@ -0,0 +1,33 @@
1
+package com.water.system.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.*;
4
+import lombok.Data;
5
+import java.time.LocalDateTime;
6
+
7
+/**
8
+ * 文档分类实体
9
+ */
10
+@Data
11
+@TableName("doc_category")
12
+public class DocumentCategory {
13
+    @TableId(type = IdType.AUTO)
14
+    private Long id;
15
+    
16
+    /** 分类名称 */
17
+    private String name;
18
+    
19
+    /** 父分类ID */
20
+    private Long parentId;
21
+    
22
+    /** 排序号 */
23
+    private Integer sortOrder;
24
+    
25
+    /** 分类描述 */
26
+    private String description;
27
+    
28
+    @TableLogic
29
+    private Integer deleted;
30
+    
31
+    private LocalDateTime createdAt;
32
+    private LocalDateTime updatedAt;
33
+}

+ 35
- 0
wm-system/src/main/java/com/water/system/entity/DocumentVersion.java Целия файл

@@ -0,0 +1,35 @@
1
+package com.water.system.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.*;
4
+import lombok.Data;
5
+import java.time.LocalDateTime;
6
+
7
+/**
8
+ * 文档版本实体
9
+ */
10
+@Data
11
+@TableName("doc_version")
12
+public class DocumentVersion {
13
+    @TableId(type = IdType.AUTO)
14
+    private Long id;
15
+    
16
+    /** 文档ID */
17
+    private Long documentId;
18
+    
19
+    /** 版本号 */
20
+    private Integer version;
21
+    
22
+    /** 版本描述 */
23
+    private String description;
24
+    
25
+    /** 文件存储路径 */
26
+    private String storagePath;
27
+    
28
+    /** 文件大小 */
29
+    private Long fileSize;
30
+    
31
+    /** 操作人ID */
32
+    private Long operatorId;
33
+    
34
+    private LocalDateTime createdAt;
35
+}

+ 9
- 0
wm-system/src/main/java/com/water/system/entity/SysDepartment.java Целия файл

@@ -0,0 +1,9 @@
1
+package com.water.system.entity;
2
+import com.baomidou.mybatisplus.annotation.*;
3
+import lombok.Data;
4
+@Data @TableName("sys_department")
5
+public class SysDepartment {
6
+    @TableId(type = IdType.AUTO) private Long id;
7
+    private Long parentId; private String deptName, leader, phone;
8
+    private Integer sort, status;
9
+}

+ 11
- 0
wm-system/src/main/java/com/water/system/entity/SysLog.java Целия файл

@@ -0,0 +1,11 @@
1
+package com.water.system.entity;
2
+import com.baomidou.mybatisplus.annotation.*;
3
+import lombok.Data; import java.time.LocalDateTime;
4
+@Data @TableName("sys_log")
5
+public class SysLog {
6
+    @TableId(type = IdType.AUTO) private Long id;
7
+    private Long userId; private String username, logType, module, action;
8
+    private String requestUrl, requestMethod, requestParams, responseResult;
9
+    private String ip; private Long duration;
10
+    @TableField(fill=FieldFill.INSERT) private LocalDateTime createdTime;
11
+}

+ 9
- 0
wm-system/src/main/java/com/water/system/entity/SysMenu.java Целия файл

@@ -0,0 +1,9 @@
1
+package com.water.system.entity;
2
+import com.baomidou.mybatisplus.annotation.*;
3
+import lombok.Data;
4
+@Data @TableName("sys_menu")
5
+public class SysMenu {
6
+    @TableId(type = IdType.AUTO) private Long id;
7
+    private Long parentId; private String name, path, icon, component, permission;
8
+    private Integer type, sort, visible, status;
9
+}

+ 10
- 0
wm-system/src/main/java/com/water/system/entity/SysRole.java Целия файл

@@ -0,0 +1,10 @@
1
+package com.water.system.entity;
2
+import com.baomidou.mybatisplus.annotation.*;
3
+import lombok.Data; import java.time.LocalDateTime;
4
+@Data @TableName("sys_role")
5
+public class SysRole {
6
+    @TableId(type = IdType.AUTO) private Long id;
7
+    private String roleCode, roleName, description;
8
+    private Integer status, sort;
9
+    @TableField(fill=FieldFill.INSERT) private LocalDateTime createdTime;
10
+}

+ 12
- 0
wm-system/src/main/java/com/water/system/entity/SysUser.java Целия файл

@@ -0,0 +1,12 @@
1
+package com.water.system.entity;
2
+import com.baomidou.mybatisplus.annotation.*;
3
+import lombok.Data; import java.time.LocalDateTime;
4
+@Data @TableName("sys_user")
5
+public class SysUser {
6
+    @TableId(type = IdType.AUTO) private Long id;
7
+    private String username, password, realName, phone, email;
8
+    private Long deptId; private String avatar;
9
+    private Integer status; // 0停用 1正常
10
+    @TableField(fill=FieldFill.INSERT) private LocalDateTime createdTime;
11
+    @TableField(fill=FieldFill.INSERT_UPDATE) private LocalDateTime updatedTime;
12
+}

+ 5
- 0
wm-system/src/main/java/com/water/system/mapper/DocumentCategoryMapper.java Целия файл

@@ -0,0 +1,5 @@
1
+package com.water.system.mapper;
2
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
3
+import com.water.system.entity.DocumentCategory;
4
+import org.apache.ibatis.annotations.Mapper;
5
+@Mapper public interface DocumentCategoryMapper extends BaseMapper<DocumentCategory> {}

+ 5
- 0
wm-system/src/main/java/com/water/system/mapper/DocumentMapper.java Целия файл

@@ -0,0 +1,5 @@
1
+package com.water.system.mapper;
2
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
3
+import com.water.system.entity.Document;
4
+import org.apache.ibatis.annotations.Mapper;
5
+@Mapper public interface DocumentMapper extends BaseMapper<Document> {}

+ 5
- 0
wm-system/src/main/java/com/water/system/mapper/DocumentVersionMapper.java Целия файл

@@ -0,0 +1,5 @@
1
+package com.water.system.mapper;
2
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
3
+import com.water.system.entity.DocumentVersion;
4
+import org.apache.ibatis.annotations.Mapper;
5
+@Mapper public interface DocumentVersionMapper extends BaseMapper<DocumentVersion> {}

+ 5
- 0
wm-system/src/main/java/com/water/system/mapper/SysDepartmentMapper.java Целия файл

@@ -0,0 +1,5 @@
1
+package com.water.system.mapper;
2
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
3
+import com.water.system.entity.SysDepartment;
4
+import org.apache.ibatis.annotations.Mapper;
5
+@Mapper public interface SysDepartmentMapper extends BaseMapper<SysDepartment> {}

+ 5
- 0
wm-system/src/main/java/com/water/system/mapper/SysLogMapper.java Целия файл

@@ -0,0 +1,5 @@
1
+package com.water.system.mapper;
2
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
3
+import com.water.system.entity.SysLog;
4
+import org.apache.ibatis.annotations.Mapper;
5
+@Mapper public interface SysLogMapper extends BaseMapper<SysLog> {}

+ 5
- 0
wm-system/src/main/java/com/water/system/mapper/SysMenuMapper.java Целия файл

@@ -0,0 +1,5 @@
1
+package com.water.system.mapper;
2
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
3
+import com.water.system.entity.SysMenu;
4
+import org.apache.ibatis.annotations.Mapper;
5
+@Mapper public interface SysMenuMapper extends BaseMapper<SysMenu> {}

+ 5
- 0
wm-system/src/main/java/com/water/system/mapper/SysRoleMapper.java Целия файл

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

+ 5
- 0
wm-system/src/main/java/com/water/system/mapper/SysUserMapper.java Целия файл

@@ -0,0 +1,5 @@
1
+package com.water.system.mapper;
2
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
3
+import com.water.system.entity.SysUser;
4
+import org.apache.ibatis.annotations.Mapper;
5
+@Mapper public interface SysUserMapper extends BaseMapper<SysUser> {}

+ 44
- 0
wm-system/src/main/java/com/water/system/service/DocService.java Целия файл

@@ -0,0 +1,44 @@
1
+package com.water.system.service;
2
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
3
+import com.water.system.entity.*;
4
+import com.water.system.mapper.*;
5
+import lombok.RequiredArgsConstructor;
6
+import org.springframework.stereotype.Service;
7
+import java.util.*;
8
+@Service @RequiredArgsConstructor
9
+public class DocService {
10
+    private final DocumentMapper docMapper;
11
+    private final DocumentCategoryMapper catMapper;
12
+    private final DocumentVersionMapper verMapper;
13
+
14
+    public List<Document> listDocs(String categoryId, String keyword) {
15
+        LambdaQueryWrapper<Document> w = new LambdaQueryWrapper<>();
16
+        if (categoryId != null) w.eq(Document::getCategoryId, categoryId);
17
+        if (keyword != null) w.like(Document::getName, keyword);
18
+        return docMapper.selectList(w);
19
+    }
20
+    public Document getDoc(Long id) { return docMapper.selectById(id); }
21
+    public Long createDoc(Map<String,Object> req) {
22
+        Document d = new Document();
23
+        d.setName((String)req.get("name"));
24
+        d.setCategoryId(req.get("categoryId") != null ? ((Number)req.get("categoryId")).longValue() : null);
25
+        d.setFileType((String)req.get("fileType"));
26
+        d.setFilePath((String)req.get("filePath"));
27
+        d.setStatus(1);
28
+        docMapper.insert(d);
29
+        return d.getId();
30
+    }
31
+    public void updateDoc(Long id, Map<String,Object> req) {
32
+        Document d = docMapper.selectById(id);
33
+        if (d == null) throw new RuntimeException("文档不存在");
34
+        if (req.containsKey("name")) d.setName((String)req.get("name"));
35
+        if (req.containsKey("categoryId")) d.setCategoryId(((Number)req.get("categoryId")).longValue());
36
+        docMapper.updateById(d);
37
+    }
38
+    public void deleteDoc(Long id) { docMapper.deleteById(id); }
39
+    public List<DocumentCategory> listCategories() { return catMapper.selectList(null); }
40
+    public List<DocumentVersion> getVersions(Long docId) {
41
+        return verMapper.selectList(new LambdaQueryWrapper<DocumentVersion>()
42
+            .eq(DocumentVersion::getDocId, docId).orderByDesc(DocumentVersion::getVersionNo));
43
+    }
44
+}

+ 67
- 0
wm-system/src/main/java/com/water/system/service/SysService.java Целия файл

@@ -0,0 +1,67 @@
1
+package com.water.system.service;
2
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
3
+import com.water.system.entity.*;
4
+import com.water.system.mapper.*;
5
+import lombok.RequiredArgsConstructor;
6
+import org.springframework.stereotype.Service;
7
+import java.util.*;
8
+@Service @RequiredArgsConstructor
9
+public class SysService {
10
+    private final SysRoleMapper roleMapper;
11
+    private final SysUserMapper userMapper;
12
+    private final SysMenuMapper menuMapper;
13
+    private final SysDepartmentMapper deptMapper;
14
+    private final SysLogMapper logMapper;
15
+
16
+    // Roles
17
+    public List<SysRole> listRoles() { return roleMapper.selectList(null); }
18
+    public Long createRole(Map<String,Object> req) {
19
+        SysRole r = new SysRole();
20
+        r.setRoleCode((String)req.get("roleCode"));
21
+        r.setRoleName((String)req.get("roleName"));
22
+        r.setDescription((String)req.get("description"));
23
+        r.setStatus(1); r.setSort(0);
24
+        roleMapper.insert(r);
25
+        return r.getId();
26
+    }
27
+    // Users
28
+    public List<SysUser> listUsers(Integer status) {
29
+        return userMapper.selectList(new LambdaQueryWrapper<SysUser>()
30
+            .eq(status != null, SysUser::getStatus, status));
31
+    }
32
+    public Long createUser(Map<String,Object> req) {
33
+        SysUser u = new SysUser();
34
+        u.setUsername((String)req.get("username"));
35
+        u.setPassword((String)req.get("password"));
36
+        u.setRealName((String)req.get("realName"));
37
+        u.setPhone((String)req.get("phone"));
38
+        u.setStatus(1);
39
+        userMapper.insert(u);
40
+        return u.getId();
41
+    }
42
+    public void updateUserStatus(Long id, int status) {
43
+        SysUser u = userMapper.selectById(id);
44
+        if (u == null) throw new RuntimeException("用户不存在");
45
+        u.setStatus(status);
46
+        userMapper.updateById(u);
47
+    }
48
+    // Menus
49
+    public List<SysMenu> listMenus() { return menuMapper.selectList(null); }
50
+    // Departments
51
+    public List<SysDepartment> listDepts() { return deptMapper.selectList(null); }
52
+    public Long createDept(Map<String,Object> req) {
53
+        SysDepartment d = new SysDepartment();
54
+        d.setDeptName((String)req.get("deptName"));
55
+        d.setLeader((String)req.get("leader"));
56
+        d.setSort(0); d.setStatus(1);
57
+        deptMapper.insert(d);
58
+        return d.getId();
59
+    }
60
+    // Logs
61
+    public List<SysLog> listLogs(String logType, String username) {
62
+        LambdaQueryWrapper<SysLog> w = new LambdaQueryWrapper<>();
63
+        if (logType != null) w.eq(SysLog::getLogType, logType);
64
+        if (username != null) w.like(SysLog::getUsername, username);
65
+        return logMapper.selectList(w.orderByDesc(SysLog::getCreatedTime).last("LIMIT 100"));
66
+    }
67
+}

+ 40
- 0
wm-system/src/main/resources/application.yml Целия файл

@@ -0,0 +1,40 @@
1
+server:
2
+  port: 8084
3
+
4
+spring:
5
+  application:
6
+    name: wm-system
7
+  datasource:
8
+    driver-class-name: org.postgresql.Driver
9
+    url: jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:water_system}?currentSchema=public
10
+    username: ${DB_USER:postgres}
11
+    password: ${DB_PASS:postgres}
12
+  servlet:
13
+    multipart:
14
+      max-file-size: 100MB
15
+      max-request-size: 100MB
16
+
17
+mybatis-plus:
18
+  configuration:
19
+    map-underscore-to-camel-case: true
20
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
21
+  global-config:
22
+    db-config:
23
+      logic-delete-field: deleted
24
+      logic-delete-value: 1
25
+      logic-not-delete-value: 0
26
+
27
+minio:
28
+  endpoint: ${MINIO_ENDPOINT:http://localhost:9000}
29
+  access-key: ${MINIO_ACCESS_KEY:minioadmin}
30
+  secret-key: ${MINIO_SECRET_KEY:minioadmin}
31
+  bucket-name: ${MINIO_BUCKET:water-documents}
32
+
33
+sa-token:
34
+  token-name: Authorization
35
+  timeout: 86400
36
+  active-timeout: 1800
37
+
38
+logging:
39
+  level:
40
+    com.water.system: debug

+ 45
- 0
wm-system/src/main/resources/db/V1__system_manage.sql Целия файл

@@ -0,0 +1,45 @@
1
+CREATE TABLE IF NOT EXISTS sys_document (
2
+    id BIGSERIAL PRIMARY KEY, name VARCHAR(200), category_id BIGINT,
3
+    file_type VARCHAR(20), file_size BIGINT, file_path VARCHAR(500),
4
+    status INT DEFAULT 1, creator_id BIGINT,
5
+    created_time TIMESTAMP DEFAULT NOW(), updated_time TIMESTAMP DEFAULT NOW()
6
+);
7
+CREATE TABLE IF NOT EXISTS sys_document_category (
8
+    id BIGSERIAL PRIMARY KEY, name VARCHAR(100), parent_id BIGINT,
9
+    sort INT DEFAULT 0, status INT DEFAULT 1,
10
+    created_time TIMESTAMP DEFAULT NOW()
11
+);
12
+CREATE TABLE IF NOT EXISTS sys_document_version (
13
+    id BIGSERIAL PRIMARY KEY, doc_id BIGINT, version_no INT,
14
+    file_path VARCHAR(500), remark TEXT,
15
+    created_time TIMESTAMP DEFAULT NOW()
16
+);
17
+CREATE TABLE IF NOT EXISTS sys_role (
18
+    id BIGSERIAL PRIMARY KEY, role_code VARCHAR(50) UNIQUE, role_name VARCHAR(50),
19
+    description VARCHAR(200), status INT DEFAULT 1, sort INT DEFAULT 0,
20
+    created_time TIMESTAMP DEFAULT NOW()
21
+);
22
+CREATE TABLE IF NOT EXISTS sys_user (
23
+    id BIGSERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE, password VARCHAR(200),
24
+    real_name VARCHAR(50), phone VARCHAR(20), email VARCHAR(100),
25
+    dept_id BIGINT, avatar VARCHAR(500), status INT DEFAULT 1,
26
+    created_time TIMESTAMP DEFAULT NOW(), updated_time TIMESTAMP DEFAULT NOW()
27
+);
28
+CREATE TABLE IF NOT EXISTS sys_menu (
29
+    id BIGSERIAL PRIMARY KEY, parent_id BIGINT, name VARCHAR(50),
30
+    path VARCHAR(200), icon VARCHAR(50), component VARCHAR(200),
31
+    permission VARCHAR(100), type INT, sort INT DEFAULT 0,
32
+    visible INT DEFAULT 1, status INT DEFAULT 1
33
+);
34
+CREATE TABLE IF NOT EXISTS sys_department (
35
+    id BIGSERIAL PRIMARY KEY, parent_id BIGINT, dept_name VARCHAR(100),
36
+    leader VARCHAR(50), phone VARCHAR(20), sort INT DEFAULT 0, status INT DEFAULT 1
37
+);
38
+CREATE TABLE IF NOT EXISTS sys_log (
39
+    id BIGSERIAL PRIMARY KEY, user_id BIGINT, username VARCHAR(50),
40
+    log_type VARCHAR(20), module VARCHAR(50), action VARCHAR(50),
41
+    request_url VARCHAR(500), request_method VARCHAR(10),
42
+    request_params TEXT, response_result TEXT,
43
+    ip VARCHAR(50), duration BIGINT,
44
+    created_time TIMESTAMP DEFAULT NOW()
45
+);