亨利王 1 жил өмнө
parent
commit
f42324e790
53 өөрчлөгдсөн 2098 нэмэгдсэн , 36 устгасан
  1. 1 0
      .idea/misc.xml
  2. 80 24
      .idea/workspace.xml
  3. 43 0
      README.md
  4. 13 2
      pom.xml
  5. BIN
      screenshots/2.26-01.png
  6. BIN
      screenshots/2.26-02.png
  7. BIN
      screenshots/api.png
  8. 32 0
      src/main/java/com/om/config/MyApplicationRunner.java
  9. 111 0
      src/main/java/com/om/config/MybatisRedisCache.java
  10. 57 0
      src/main/java/com/om/controller/user/ApproveAccountController.java
  11. 84 0
      src/main/java/com/om/controller/user/DepartmentController.java
  12. 82 0
      src/main/java/com/om/controller/user/DictController.java
  13. 250 0
      src/main/java/com/om/controller/user/EmployeeController.java
  14. 85 0
      src/main/java/com/om/controller/user/MenuController.java
  15. 79 0
      src/main/java/com/om/controller/user/RoleController.java
  16. 38 0
      src/main/java/com/om/controller/user/RoleMenuController.java
  17. 38 0
      src/main/java/com/om/entity/dto/EmployeeDto.java
  18. 29 0
      src/main/java/com/om/entity/dto/LoginDto.java
  19. 17 0
      src/main/java/com/om/entity/dto/UpdatePassDTO.java
  20. 27 0
      src/main/java/com/om/entity/po/Department.java
  21. 43 0
      src/main/java/com/om/entity/po/Dict.java
  22. 69 0
      src/main/java/com/om/entity/po/Employee.java
  23. 60 0
      src/main/java/com/om/entity/po/Menu.java
  24. 43 0
      src/main/java/com/om/entity/po/Role.java
  25. 21 0
      src/main/java/com/om/entity/po/RoleMenu.java
  26. 15 0
      src/main/java/com/om/mapper/DepartmentMapper.java
  27. 22 0
      src/main/java/com/om/mapper/DictMapper.java
  28. 48 0
      src/main/java/com/om/mapper/EmployeeMapper.java
  29. 21 0
      src/main/java/com/om/mapper/MenuMapper.java
  30. 25 0
      src/main/java/com/om/mapper/RoleMapper.java
  31. 20 0
      src/main/java/com/om/mapper/RoleMenuMapper.java
  32. 9 0
      src/main/java/com/om/service/IDepartmentService.java
  33. 8 0
      src/main/java/com/om/service/IDictService.java
  34. 43 0
      src/main/java/com/om/service/IEmployeeService.java
  35. 14 0
      src/main/java/com/om/service/IMenuService.java
  36. 8 0
      src/main/java/com/om/service/IRoleMenuService.java
  37. 14 0
      src/main/java/com/om/service/IRoleService.java
  38. 15 0
      src/main/java/com/om/service/impl/DepartmentServiceImpl.java
  39. 21 0
      src/main/java/com/om/service/impl/DictServiceImpl.java
  40. 86 0
      src/main/java/com/om/service/impl/EmployeeServiceImpl.java
  41. 76 0
      src/main/java/com/om/service/impl/MenuServiceImpl.java
  42. 12 0
      src/main/java/com/om/service/impl/RoleMenuServiceImpl.java
  43. 70 0
      src/main/java/com/om/service/impl/RoleServiceImpl.java
  44. 16 0
      src/main/java/com/om/utils/Constants.java
  45. 39 10
      src/main/java/com/om/utils/Result.java
  46. 32 0
      src/main/java/com/om/utils/SpringUtil.java
  47. 54 0
      src/main/java/com/om/utils/TokenUtils.java
  48. 7 0
      src/main/resources/mapper/DepartmentMapper.xml
  49. 5 0
      src/main/resources/mapper/DictMapper.xml
  50. 86 0
      src/main/resources/mapper/EmployeeMapper.xml
  51. 5 0
      src/main/resources/mapper/MenuMapper.xml
  52. 10 0
      src/main/resources/mapper/RoleMapper.xml
  53. 15 0
      src/main/resources/mapper/RoleMenuMapper.xml

+ 1 - 0
.idea/misc.xml

@@ -7,6 +7,7 @@
         <option value="$PROJECT_DIR$/pom.xml" />
       </list>
     </option>
+    <option name="workspaceImportForciblyTurnedOn" value="true" />
   </component>
   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8.0_102" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/out" />

+ 80 - 24
.idea/workspace.xml

@@ -5,8 +5,59 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="46b159bd-08ca-42f0-b80f-41d4944a8a29" name="Changes" comment="web维修厂管理接口">
+      <change afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/screenshots/2.26-01.png" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/screenshots/2.26-02.png" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/screenshots/api.png" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/config/MyApplicationRunner.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/config/MybatisRedisCache.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/user/ApproveAccountController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/user/DepartmentController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/user/DictController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/user/EmployeeController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/user/MenuController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/user/RoleController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/user/RoleMenuController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/dto/EmployeeDto.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/dto/LoginDto.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/dto/UpdatePassDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/po/Department.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/po/Dict.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/po/Employee.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/po/Menu.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/po/Role.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/po/RoleMenu.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/mapper/DepartmentMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/mapper/DictMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/mapper/EmployeeMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/mapper/MenuMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/mapper/RoleMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/mapper/RoleMenuMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/IDepartmentService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/IDictService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/IEmployeeService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/IMenuService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/IRoleMenuService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/IRoleService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/impl/DepartmentServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/impl/DictServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/impl/EmployeeServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/impl/MenuServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/impl/RoleMenuServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/impl/RoleServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/Constants.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/SpringUtil.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/TokenUtils.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/resources/mapper/DepartmentMapper.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/resources/mapper/DictMapper.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/resources/mapper/EmployeeMapper.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/resources/mapper/MenuMapper.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/resources/mapper/RoleMapper.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/resources/mapper/RoleMenuMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/controller/user/APPDistributorController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/user/APPDistributorController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/utils/Result.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/Result.java" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -22,6 +73,11 @@
   </component>
   <component name="Git.Settings">
     <option name="PUSH_AUTO_UPDATE" value="true" />
+    <option name="RECENT_BRANCH_BY_REPOSITORY">
+      <map>
+        <entry key="$PROJECT_DIR$" value="master" />
+      </map>
+    </option>
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
     <option name="UPDATE_TYPE" value="REBASE" />
   </component>
@@ -31,8 +87,7 @@
   <component name="MavenImportPreferences">
     <option name="generalSettings">
       <MavenGeneralSettings>
-        <option name="mavenHome" value="B:\apache-maven-3.8.8" />
-        <option name="userSettingsFile" value="B:\apache-maven-3.8.8\conf\settings.xml" />
+        <option name="userSettingsFile" value="$USER_HOME$/.m2/settings.xml" />
       </MavenGeneralSettings>
     </option>
   </component>
@@ -49,6 +104,9 @@
   </component>
   <component name="PropertiesComponent"><![CDATA[{
   "keyToString": {
+    "ASKED_ADD_EXTERNAL_FILES": "true",
+    "Maven.OperationSystem [clean].executor": "Run",
+    "Maven.OperationSystem [validate].executor": "Run",
     "RequestMappingsPanelOrder0": "0",
     "RequestMappingsPanelOrder1": "1",
     "RequestMappingsPanelWidth0": "75",
@@ -58,9 +116,9 @@
     "SHARE_PROJECT_CONFIGURATION_FILES": "true",
     "Spring Boot.OperationApplication.executor": "Run",
     "WebServerToolWindowFactoryState": "false",
-    "git-widget-placeholder": "master",
+    "git-widget-placeholder": "permission-wxy",
     "kotlin-language-version-configured": "true",
-    "last_opened_file_path": "B:/WorkSpace/PracticalRojects/OperationSystem/src/main/resources",
+    "last_opened_file_path": "/Users/wangwulin/IdeaProjects/OperationSystem/src/main/java/com/om/controller/user",
     "node.js.detected.package.eslint": "true",
     "node.js.detected.package.tslint": "true",
     "node.js.selected.package.eslint": "(autodetect)",
@@ -80,16 +138,21 @@
   </component>
   <component name="RecentsManager">
     <key name="CopyFile.RECENT_KEYS">
-      <recent name="B:\WorkSpace\PracticalRojects\OperationSystem\src\main\resources" />
-      <recent name="B:\WorkSpace\PracticalRojects\OperationSystem\src\main\java\com\om\utils" />
-      <recent name="B:\WorkSpace\PracticalRojects\OperationSystem\src\main\java\com\om" />
+      <recent name="$PROJECT_DIR$/src/main/java/com/om/controller/user" />
+      <recent name="$PROJECT_DIR$/src/main/java/com/om/service" />
+      <recent name="$PROJECT_DIR$/src/main/java/com/om/entity/po" />
+      <recent name="$PROJECT_DIR$/src/main/java/com/om/service/impl" />
+      <recent name="$PROJECT_DIR$/src/main/java/com/om/mapper" />
+    </key>
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$/screenshots" />
     </key>
     <key name="CopyClassDialog.RECENTS_KEY">
-      <recent name="com.om.entity.dto" />
-      <recent name="com.om.entity.vo" />
-      <recent name="com.om.exception" />
+      <recent name="com.om.controller.user" />
+      <recent name="com.om.config" />
       <recent name="com.om.utils" />
-      <recent name="com.om.interceptor" />
+      <recent name="com.om.entity.dto" />
+      <recent name="com.om.controller" />
     </key>
   </component>
   <component name="RunManager" selected="Spring Boot.OperationApplication">
@@ -126,7 +189,8 @@
   <component name="SharedIndexes">
     <attachedChunks>
       <set>
-        <option value="jdk-1.8.0_402-corretto-1.8.0_402-4caba194b151-ae57be32" />
+        <option value="jdk-1.8.0_392-corretto-1.8.0_392-4caba194b151-3820a516" />
+        <option value="jdk-20.0.2-corretto-20.0.2.1-4caba194b151-d89c1816" />
       </set>
     </attachedChunks>
   </component>
@@ -168,6 +232,8 @@
       <workItem from="1707388468820" duration="1399000" />
       <workItem from="1707438514767" duration="8903000" />
       <workItem from="1708670527995" duration="3132000" />
+      <workItem from="1708916949997" duration="4355000" />
+      <workItem from="1708925853376" duration="14224000" />
     </task>
     <task id="LOCAL-00001" summary="管理员登录">
       <option name="closed" value="true" />
@@ -246,6 +312,7 @@
     <option name="version" value="3" />
   </component>
   <component name="VcsManagerConfiguration">
+    <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
     <MESSAGE value="管理员登录" />
     <MESSAGE value="初始化运维项目" />
     <MESSAGE value="管理员电话和邮箱修改" />
@@ -253,15 +320,4 @@
     <MESSAGE value="web维修厂管理接口" />
     <option name="LAST_COMMIT_MESSAGE" value="web维修厂管理接口" />
   </component>
-  <component name="XDebuggerManager">
-    <breakpoint-manager>
-      <breakpoints>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/om/interceptor/JwtTokenAdminInterceptor.java</url>
-          <line>75</line>
-          <option name="timeStamp" value="10" />
-        </line-breakpoint>
-      </breakpoints>
-    </breakpoint-manager>
-  </component>
 </project>

+ 43 - 0
README.md

@@ -0,0 +1,43 @@
+
+**2.26日修改说明:**
+
+完成了用户角色权限模块对开发,初步测试,现在正确登陆后,可以看到用户权限关联的菜单,
+随后的API调用会自行带上token。
+
+前端用户查询API可以自行使用 http://47.113.197.148:8888/doc.html 
+
+![01](./screenshots/api.png)
+
+> 登陆请使用员工控制类。
+
+### 用户角色权限模块
+
+增加了用户角色权限模块,具体增加了如下文件
+
+![01](./screenshots/2.26-01.png)
+
+![01](./screenshots/2.26-02.png)
+
+- 绿色式新增文件,对现有代码没有任何影响
+- pom.xml增加了如下依赖:
+    ```xml
+    <dependency>
+        <groupId>cn.afterturn</groupId>
+        <artifactId>easypoi-spring-boot-starter</artifactId>
+        <version>4.4.0</version>
+    </dependency>
+    <!--jwt-->
+    <dependency>
+        <groupId>com.auth0</groupId>
+        <artifactId>java-jwt</artifactId>
+        <version>3.18.3</version>
+    </dependency>
+    ```
+  <mybatis-plus.version>3.4.1</mybatis-plus.version>版本改为了
+  <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
+
+- 修改了Result.java,为了与前端返回方式一致,用版本对比可以看到差异
+- config目录下 新增了 MyApplicationRunner.java 用以每次重启后清除Redis缓存
+- config目录下 新增了 MybatisRedisCache.java
+
+### 用户角色权限模块相关数据库表也做了整理

+ 13 - 2
pom.xml

@@ -18,7 +18,7 @@
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.target>8</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <mybatis-plus.version>3.4.1</mybatis-plus.version>
+        <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
         <mysql.version>8.0.33</mysql.version>
         <knife4j.version>3.0.3</knife4j.version>
         <jwt.version>0.9.1</jwt.version>
@@ -136,7 +136,18 @@
             <artifactId>hibernate-validator</artifactId>
             <version>${hibernate-validator.version}</version>
         </dependency>
-
+        <!--导出-->
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.4.0</version>
+        </dependency>
+        <!--jwt-->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.18.3</version>
+        </dependency>
     </dependencies>
 
     <build>

BIN
screenshots/2.26-01.png


BIN
screenshots/2.26-02.png


BIN
screenshots/api.png


+ 32 - 0
src/main/java/com/om/config/MyApplicationRunner.java

@@ -0,0 +1,32 @@
+package com.om.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.util.Set;
+
+/**
+ * 启动清理缓存
+ */
+@Configuration
+@Slf4j
+public class MyApplicationRunner implements ApplicationRunner {
+
+    @Autowired
+    RedisTemplate redisTemplate;
+
+    @Autowired
+    MybatisRedisCache mybatisRedisCache;
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        Set keys = redisTemplate.keys("*");
+        mybatisRedisCache.removeObject(keys);
+        redisTemplate.delete(keys);
+        log.info("清理redis缓存");
+    }
+}

+ 111 - 0
src/main/java/com/om/config/MybatisRedisCache.java

@@ -0,0 +1,111 @@
+package com.om.config;
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.om.utils.SpringUtil;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.cache.Cache;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisServerCommands;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.util.Set;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+@Configuration
+@Slf4j
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class MybatisRedisCache implements Cache {
+    // 读写锁
+    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
+
+    //这里使用了redis缓存,使用springboot自动注入
+    private RedisTemplate<String, Object> redisTemplate;
+
+    private String id;
+
+    public MybatisRedisCache(final String id) {
+        if (id == null) {
+            throw new IllegalArgumentException("Cache instances require an ID");
+        }
+        this.id = id;
+    }
+
+    @Override
+    public String getId() {
+        return this.id;
+    }
+
+    @Override
+    public void putObject(Object key, Object value) {
+        if (redisTemplate == null) {
+            //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
+            redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
+        }
+        if (value != null) {
+            redisTemplate.opsForValue().set(key.toString(), value);
+        }
+    }
+
+    @Override
+    public Object getObject(Object key) {
+        if (redisTemplate == null) {
+            //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
+            redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
+        }
+        try {
+            if (key != null) {
+                return redisTemplate.opsForValue().get(key.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("缓存出错 ");
+        }
+        return null;
+    }
+
+    @Override
+    public Object removeObject(Object key) {
+        if (redisTemplate == null) {
+            //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
+            redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
+        }
+        if (key != null) {
+            redisTemplate.delete(key.toString());
+        }
+        return null;
+    }
+
+    @Override
+    public void clear() {
+        log.debug("清空缓存");
+        if (redisTemplate == null) {
+            redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
+        }
+        Set<String> keys = redisTemplate.keys("*:" + this.id + "*");
+        if (!CollectionUtils.isEmpty(keys)) {
+            redisTemplate.delete(keys);
+        }
+    }
+
+    @Override
+    public int getSize() {
+        if (redisTemplate == null) {
+            //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
+            redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
+        }
+        Long size = redisTemplate.execute(RedisServerCommands::dbSize);
+        return size.intValue();
+    }
+
+    @Override
+    public ReadWriteLock getReadWriteLock() {
+        return this.readWriteLock;
+    }
+}
+

+ 57 - 0
src/main/java/com/om/controller/user/ApproveAccountController.java

@@ -0,0 +1,57 @@
+package com.om.controller.user;
+
+import com.om.service.IEmployeeService;
+import com.om.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/approve")
+@Api(tags = "管理员审批控制类")
+public class ApproveAccountController {
+
+    //待批准状态码为0
+    public static final Integer PENDING_APPROVE = 0;
+    @Autowired
+    IEmployeeService employeeService;
+
+    /**
+     * 查询所有未审批的用户
+     *
+     * @return
+     */
+    @ApiOperation("查询所有未审批的用户接口")
+    @PostMapping("getStatus")
+    public Result getStatus() {
+        return Result.succ(employeeService.getByStatus(PENDING_APPROVE));
+    }
+
+    /**
+     * 根据ID通过注册审批
+     *
+     * @param employeeid
+     * @return
+     */
+    @ApiOperation("根据ID通过注册审批接口")
+    @PostMapping("/updateStatusAdopt/{employeeid}")
+    public Result updateStatusAdopt(@PathVariable(name = "employeeid") Long employeeid) {
+        return Result.succ(employeeService.updateStatusAdopt(employeeid));
+    }
+
+    /**
+     * 根据ID不通过注册审批
+     *
+     * @param employeeid
+     * @return
+     */
+    @ApiOperation("根据ID不通过注册审批接口")
+    @PostMapping("/updateStatusFail/{employeeid}")
+    public Result updateStatusFail(@PathVariable(name = "employeeid") Long employeeid) {
+        return Result.succ(employeeService.updateStatusFail(employeeid));
+    }
+}

+ 84 - 0
src/main/java/com/om/controller/user/DepartmentController.java

@@ -0,0 +1,84 @@
+package com.om.controller.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.om.entity.po.Department;
+import com.om.service.IDepartmentService;
+import com.om.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/department")
+@Api(tags = "部门控制类")
+public class DepartmentController {
+
+    @Autowired
+    IDepartmentService departmentService;
+
+    /**
+     * 获取全部部门、分页查询
+     *
+     * @return
+     */
+    @ApiOperation("分页查询所有部门接口")
+    @GetMapping("/page")
+    public Result findPage(@RequestParam Integer pageNum,
+                           @RequestParam Integer pageSize,
+                           @RequestParam(defaultValue = "") String departmentname) {
+        QueryWrapper<Department> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like("departmentname", departmentname);
+        return Result.succ(departmentService.page(new Page<>(pageNum, pageSize), queryWrapper));
+    }
+
+    /**
+     * 新增和编辑部门
+     *
+     * @param department
+     * @return
+     */
+    @ApiOperation("新增和编辑部门接口")
+    @PostMapping("/save")
+    public Result save(@RequestBody Department department) {
+        return Result.succ(departmentService.saveOrUpdate(department));
+    }
+
+    /**
+     * 根据id删除单个部门
+     *
+     * @param departmentid
+     * @return
+     */
+    @ApiOperation("根据ID删除单个部门接口")
+    @DeleteMapping("/delete/{departmentid}")
+    public Result delete(@PathVariable(name = "departmentid") Integer departmentid) {
+        return Result.succ(departmentService.removeById(departmentid));
+    }
+
+    /**
+     * 批量删除多个部门
+     *
+     * @param ids
+     * @return
+     */
+    @ApiOperation("批量删除多个部门接口")
+    @PostMapping("/delete/batch")
+    public Result batch(@RequestBody List<Integer> ids) {
+        return Result.succ(departmentService.removeBatchByIds(ids));
+    }
+
+    /**
+     * 查询所有部门
+     *
+     * @return
+     */
+    @ApiOperation("查询所有部门接口")
+    @GetMapping("/all")
+    public Result all() {
+        return Result.succ(departmentService.list());
+    }
+}

+ 82 - 0
src/main/java/com/om/controller/user/DictController.java

@@ -0,0 +1,82 @@
+package com.om.controller.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.om.entity.po.Dict;
+import com.om.service.IDictService;
+import com.om.utils.Constants;
+import com.om.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-23
+ */
+@RestController
+@RequestMapping("/dict")
+@Api(tags = "图标模块")
+public class DictController {
+
+    @Autowired
+    private IDictService dictService;
+
+    //新增或修改
+    @ApiOperation("新增或修改接口")
+    @PostMapping("/save")
+    public Result save(@RequestBody Dict dict) {
+        return Result.succ(dictService.saveOrUpdate(dict));
+    }
+
+    //根据ID删除
+    @ApiOperation("根据ID删除接口")
+    @DeleteMapping("/delete/{id}")
+    public Result delete(@PathVariable Integer id) {
+
+        return Result.succ(dictService.removeById(id));
+    }
+
+    @ApiOperation("根据ID批量删除接口")
+    @PostMapping("/delete/batch")
+    public Result deleteBatch(@RequestBody List<Integer> ids) {
+
+        return Result.succ(dictService.removeByIds(ids));
+    }
+
+    //查询全部
+    @ApiOperation("根据类型查询图标接口")
+    @GetMapping("/getAll")
+    public Result findAll() {
+        QueryWrapper<Dict> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("type", Constants.DICT_ICON);
+        List<Dict> list = dictService.list(queryWrapper);
+        return Result.succ(list);
+    }
+
+    //根据ID查询
+    @ApiOperation("根据ID查询接口")
+    @GetMapping("/dict/{id}")
+    public Result findOne(@PathVariable Integer id) {
+        return Result.succ(dictService.getById(id));
+    }
+
+    @ApiOperation("分页查询全部接口")
+    @GetMapping("/page")
+    public Result findPage(@RequestParam Integer pageNum,
+                           @RequestParam Integer pageSize,
+                           @RequestParam String name) {
+        QueryWrapper<Dict> dictQueryWrapper = new QueryWrapper<>();
+        dictQueryWrapper.like("name", name);
+        return Result.succ(dictService.page(new Page<>(pageNum, pageSize), dictQueryWrapper));
+    }
+}
+

+ 250 - 0
src/main/java/com/om/controller/user/EmployeeController.java

@@ -0,0 +1,250 @@
+package com.om.controller.user;
+
+import cn.afterturn.easypoi.entity.vo.NormalExcelConstants;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import cn.afterturn.easypoi.view.PoiBaseView;
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.om.entity.dto.EmployeeDto;
+import com.om.entity.dto.LoginDto;
+import com.om.entity.dto.UpdatePassDTO;
+import com.om.entity.po.Employee;
+import com.om.service.IDepartmentService;
+import com.om.service.IEmployeeService;
+import com.om.service.IMenuService;
+import com.om.utils.Constants;
+import com.om.utils.Result;
+import com.om.utils.TokenUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/employee")
+@Api(tags = "员工控制类")
+public class EmployeeController {
+    IEmployeeService employeeService;
+    IDepartmentService departmentService;
+    RedisTemplate redisTemplate;
+    IMenuService menuService;
+
+
+    @Autowired
+    public EmployeeController(IEmployeeService employeeService,
+                              IDepartmentService departmentService,
+                              RedisTemplate redisTemplate,
+                              IMenuService menuService) {
+        this.employeeService = employeeService;
+        this.departmentService = departmentService;
+        this.redisTemplate = redisTemplate;
+        this.menuService = menuService;
+    }
+
+    /**
+     * 登录接口
+     *
+     * @return Result
+     */
+    @ApiOperation("登录接口")
+    @PostMapping("/login")
+    public Result login(@Validated @RequestBody LoginDto loginDto) {
+
+        Employee employee = employeeService.getOne(new QueryWrapper<Employee>().eq("username", loginDto.getUsername()));
+
+        if (employee == null) {
+            return Result.fail("账号不存在,请先注册");
+        } else if (!employee.getPassword().equals(DigestUtils.md5Hex(loginDto.getPassword() + Constants.SALT))) {
+            return Result.fail("账号或密码不正确");
+        } else if (employee.getStatus().equals(0)) {
+            return Result.fail("账号未审批,请联系管理员");
+        } else if (employee.getStatus().equals(2)) {
+            return Result.fail("账号审批未通过,请联系管理员");
+        }
+        copyObject(loginDto, employee, redisTemplate, menuService);
+
+        return Result.succ(loginDto);
+    }
+
+    static void copyObject(@RequestBody @Validated LoginDto loginDto, Employee employee,
+                           RedisTemplate redisTemplate, IMenuService menuService) {
+        BeanUtil.copyProperties(employee, loginDto, true);
+        String jwt = TokenUtils.genToken(employee.getEmployeeid().toString(), employee.getPassword());
+        redisTemplate.opsForValue().set("JWT_" + jwt, JSON.toJSON(employee), 2, TimeUnit.HOURS);
+        loginDto.setToken(jwt);
+        loginDto.setMenus(menuService.getRoleMenu(employee.getRole()));
+    }
+
+    /**
+     * 注册请求
+     *
+     * @return Result
+     */
+    @ApiOperation("注册接口")
+    @PostMapping("/register")
+    public Result register(@RequestBody Employee employee) {
+        Employee username = employeeService.queryUsername(employee.getUsername());
+        if (username != null) {
+            return Result.fail("用户已存在,换个账号名试试");
+        } else {
+            return Result.succ(employeeService.register(employee));
+        }
+    }
+
+    /**
+     * 修改密码
+     *
+     * @return Result
+     */
+    @ApiOperation("修改密码接口")
+    @PostMapping("/updatePass")
+    public Result updatePass(@RequestBody UpdatePassDTO updatePassDTO) {
+        int pass = employeeService.updatePass(updatePassDTO);
+        if (pass < 1) {
+            return Result.fail("原密码错误");
+        } else {
+            return Result.succ(null);
+        }
+    }
+
+    /**
+     * 根据账号查询
+     *
+     * @return Result
+     */
+    @ApiOperation("根据账号查询接口")
+    @GetMapping("/username/{username}")
+    public Result findOne(@PathVariable(name = "username") String username) {
+        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("username", username);
+        return Result.succ(employeeService.getOne(queryWrapper));
+    }
+
+    /**
+     * 个人信息修改和保存
+     *
+     * @return Result
+     */
+    @ApiOperation("个人信息修改和保存接口")
+    @PostMapping("/personalSave")
+    public Result personalSave(@RequestBody Employee employee) {
+        return Result.succ(employeeService.saveOrUpdate(employee));
+    }
+
+    /**
+     * 分页查询全部数据
+     *
+     * @param pageNum      页码
+     * @param pageSize     多少条数据
+     * @param employeename
+     * @param phone
+     * @param email
+     * @return
+     */
+    @ApiOperation("分页查询全部员工信息接口")
+    @GetMapping("/page")
+    public Result findPage(@RequestParam Integer pageNum,
+                           @RequestParam Integer pageSize,
+                           @RequestParam(defaultValue = "") String employeename,
+                           @RequestParam(defaultValue = "") String phone,
+                           @RequestParam(defaultValue = "") String email,
+                           @RequestParam(defaultValue = "") String departmentname) {
+        return Result.succ(employeeService.findEmployee(new Page<>(pageNum, pageSize), employeename, phone, email, departmentname));
+    }
+
+    /**
+     * 根据id删除单个用户
+     *
+     * @param employeeid
+     * @return
+     */
+    @ApiOperation("根据ID删除单个用户接口")
+    @DeleteMapping("/delete/{employeeid}")
+    public Result delete(@PathVariable(name = "employeeid") Integer employeeid) {
+        return Result.succ(employeeService.removeById(employeeid));
+    }
+
+    /**
+     * 批量删除多个用户
+     *
+     * @param ids
+     * @return
+     */
+    @ApiOperation("批量删除多个用户接口")
+    @PostMapping("/delete/batch")
+    public Result batch(@RequestBody List<Integer> ids) {
+        return Result.succ(employeeService.removeBatchByIds(ids));
+//        return Result.succ(employeeService.removeByIds(ids));
+    }
+
+    /**
+     * 编辑员工
+     *
+     * @param employee
+     * @return
+     */
+    @ApiOperation("编辑员工接口")
+    @PostMapping("/edit")
+    public Result edit(@RequestBody Employee employee) {
+        return Result.succ(employeeService.saveOrUpdate(employee));
+    }
+
+    /**
+     * 增加员工,默认密码为111111
+     *
+     * @param employee
+     * @return
+     */
+    @ApiOperation("增加员工接口")
+    @PostMapping("/save")
+    public Result save(@RequestBody Employee employee) {
+        employee.setPassword(DigestUtils.md5Hex(111111 + Constants.SALT));
+        return Result.succ(employeeService.save(employee));
+    }
+
+    /**
+     * 查询所有员工
+     *
+     * @return
+     */
+    @ApiOperation("查询所有员工接口")
+    @PostMapping("/list")
+    public Result list() {
+        return Result.succ(employeeService.getAll());
+    }
+
+    /**
+     * 导出功能
+     *
+     * @param response
+     * @throws IOException
+     */
+    @ApiOperation("导出功能接口")
+    @GetMapping("/export")
+    public void export(ModelMap map, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        List<EmployeeDto> list = employeeService.export();
+        ExportParams params = new ExportParams("员工信息", "员工信息", ExcelType.XSSF);
+        map.put(NormalExcelConstants.DATA_LIST, list);
+        map.put(NormalExcelConstants.CLASS, EmployeeDto.class);
+        map.put(NormalExcelConstants.PARAMS, params);
+        map.put(NormalExcelConstants.FILE_NAME, "员工信息表");
+        PoiBaseView.render(map, request, response, NormalExcelConstants.EASYPOI_EXCEL_VIEW);
+    }
+
+}

+ 85 - 0
src/main/java/com/om/controller/user/MenuController.java

@@ -0,0 +1,85 @@
+package com.om.controller.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.om.entity.po.Menu;
+import com.om.service.IMenuService;
+import com.om.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-22
+ */
+@RestController
+@RequestMapping("/menu")
+@Api(tags = "系统菜单模块")
+public class MenuController {
+
+    @Autowired
+    private IMenuService menuService;
+
+    //新增或修改
+    @ApiOperation("新增或修改接口")
+    @PostMapping("/save")
+    public Result save(@RequestBody Menu menu) {
+        menuService.saveOrUpdate(menu);
+        return Result.succ(null);
+    }
+
+    //根据ID删除
+    @ApiOperation("根据ID删除接口")
+    @DeleteMapping("/delete/{id}")
+    public Result delete(@PathVariable Integer id) {
+        menuService.removeById(id);
+        return Result.succ(null);
+    }
+
+    @ApiOperation("根据ID批量删除接口")
+    @PostMapping("/delete/batch")
+    public Result deleteBatch(@RequestBody List<Integer> ids) {
+        menuService.removeByIds(ids);
+        return Result.succ(null);
+    }
+
+    @GetMapping("/ids")
+    public Result findAllIds() {
+        return Result.succ(menuService.list().stream().map(Menu::getId));
+    }
+
+    //查询全部
+    @GetMapping
+    @ApiOperation("查询全部接口")
+    public Result findAll(@RequestParam(defaultValue = "") String name) {
+        return Result.succ(menuService.findMenus(name));
+    }
+
+    //根据ID查询
+    @ApiOperation("根据ID查询接口")
+    @GetMapping("/{id}")
+    public Result findOne(@PathVariable Integer id) {
+        return Result.succ(menuService.getById(id));
+    }
+
+    @ApiOperation("分页查询接口")
+    @GetMapping("/page")
+    public Result findPage(@RequestParam String name,
+                           @RequestParam Integer pageNum,
+                           @RequestParam Integer pageSize) {
+        QueryWrapper<Menu> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like("name", name);
+        queryWrapper.orderByDesc("id");
+        return Result.succ(menuService.page(new Page<>(pageNum, pageSize), queryWrapper));
+    }
+}
+

+ 79 - 0
src/main/java/com/om/controller/user/RoleController.java

@@ -0,0 +1,79 @@
+package com.om.controller.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.om.entity.po.Role;
+import com.om.service.IRoleService;
+import com.om.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-22
+ */
+@RestController
+@RequestMapping("/role")
+@Api(tags = "角色模块")
+public class RoleController {
+
+    @Autowired
+    private IRoleService roleService;
+
+    //新增或修改
+    @ApiOperation("新增或修改接口")
+    @PostMapping
+    public Result save(@RequestBody Role role) {
+        roleService.saveOrUpdate(role);
+        return Result.succ(null);
+    }
+
+    //根据ID删除
+    @ApiOperation("根据ID删除")
+    @DeleteMapping("/delete/{id}")
+    public Result delete(@PathVariable Integer id) {
+        roleService.removeById(id);
+        return Result.succ(null);
+    }
+
+    @ApiOperation("根据ID批量删除")
+    @PostMapping("/delete/batch")
+    public Result deleteBatch(@RequestBody List<Integer> ids) {
+        roleService.removeByIds(ids);
+        return Result.succ(null);
+    }
+
+    //查询全部
+    @ApiOperation("查询全部接口")
+    @GetMapping
+    public Result findAll() {
+        return Result.succ(roleService.list());
+    }
+
+    //根据ID查询
+    @ApiOperation("根据ID查询接口")
+    @GetMapping("/{id}")
+    public Result findOne(@PathVariable Integer id) {
+        return Result.succ(roleService.getById(id));
+    }
+
+    @ApiOperation("分页查询全部数据接口")
+    @GetMapping("/page")
+    public Result findPage(@RequestParam Integer pageNum,
+                           @RequestParam Integer pageSize,
+                           @RequestParam String name) {
+        QueryWrapper<Role> roleQueryWrapper = new QueryWrapper<>();
+        roleQueryWrapper.like("name", name);
+        return Result.succ(roleService.page(new Page<>(pageNum, pageSize), roleQueryWrapper));
+    }
+}
+

+ 38 - 0
src/main/java/com/om/controller/user/RoleMenuController.java

@@ -0,0 +1,38 @@
+package com.om.controller.user;
+
+import com.om.service.IRoleMenuService;
+import com.om.service.IRoleService;
+import com.om.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/roleMenu")
+@Api(tags = "角色与菜单模块")
+public class RoleMenuController {
+
+    @Autowired
+    IRoleMenuService roleMenuService;
+
+    @Autowired
+    IRoleService roleService;
+
+    //绑定角色和菜单的关系
+    @ApiOperation("绑定角色和菜单的关系接口")
+    @PostMapping("/{roleId}")
+    public Result roleMenu(@PathVariable Integer roleId, @RequestBody List<Integer> menuIds) {
+        roleService.setRoleMenu(roleId, menuIds);
+        return Result.succ(null);
+    }
+
+    @GetMapping("/{roleId}")
+    @ApiOperation("根据角色ID查询菜单接口")
+    public Result getRoleMenu(@PathVariable Integer roleId) {
+        Object roleMenu = roleService.getRoleMenu(roleId);
+        return Result.succ(roleMenu);
+    }
+}

+ 38 - 0
src/main/java/com/om/entity/dto/EmployeeDto.java

@@ -0,0 +1,38 @@
+package com.om.entity.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class EmployeeDto implements Serializable {
+
+    @Excel(name = "员工ID")
+    private Long employeeid;
+
+    @Excel(name = "员工姓名")
+    private String employeename;
+
+    @Excel(name = "登录账号")
+    private String username;
+
+    @Excel(name = "手机号")
+    private String phone;
+
+    @Excel(name = "邮箱")
+    private String email;
+
+    @Excel(name = "所属部门")
+    private String departmentname;
+
+    @Excel(name = "角色", replace = {"普通用户_1", "管理员_2"})
+    private String role;
+
+    @Excel(name = "账号状态", replace = {"未审批_0", "正常_1", "审批未通过_2"})
+    private Integer status;
+}

+ 29 - 0
src/main/java/com/om/entity/dto/LoginDto.java

@@ -0,0 +1,29 @@
+package com.om.entity.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.util.List;
+
+import com.om.entity.po.Menu;
+
+@Data
+public class LoginDto implements Serializable {
+
+    private long employeeid;
+
+    @NotBlank(message = "账号不能为空")
+    private String username;
+
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+    private String employeename;
+
+    private String token;
+
+    private String role;
+
+    private List<Menu> menus;
+}

+ 17 - 0
src/main/java/com/om/entity/dto/UpdatePassDTO.java

@@ -0,0 +1,17 @@
+package com.om.entity.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UpdatePassDTO implements Serializable {
+
+    private String username;
+    private String password;
+    private String newPassword;
+}

+ 27 - 0
src/main/java/com/om/entity/po/Department.java

@@ -0,0 +1,27 @@
+package com.om.entity.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@TableName("department")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Department implements Serializable {
+
+    //部门编号
+    @ApiModelProperty("部门编号")
+    @TableId(value = "departmentid", type = IdType.AUTO)
+    private Integer departmentid;
+
+    //部门名称
+    @ApiModelProperty("部门名称")
+    private String departmentname;
+}

+ 43 - 0
src/main/java/com/om/entity/po/Dict.java

@@ -0,0 +1,43 @@
+package com.om.entity.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-23
+ */
+@Getter
+@Setter
+@TableName("sys_dict")
+@ApiModel(value = "Dict对象", description = "")
+public class Dict implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("内容")
+    private String value;
+
+    @ApiModelProperty("类型")
+    private String type;
+
+
+}

+ 69 - 0
src/main/java/com/om/entity/po/Employee.java

@@ -0,0 +1,69 @@
+package com.om.entity.po;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@TableName("employee")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Employee implements Serializable {
+
+    //员工ID
+    @ApiModelProperty("员工ID")
+    @TableId(value = "employeeid", type = IdType.AUTO)
+    private Long employeeid;
+
+    //员工姓名
+    @ApiModelProperty("员工姓名")
+    private String employeename;
+
+    //用户名(登录的账号)
+    @ApiModelProperty("用户名(登录的账号)")
+    @NotBlank(message = "账号不能为空")
+    private String username;
+
+    //员工手机号
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    //账号状态(1表示账号正常,2表示账号已被冻结)
+    @ApiModelProperty("账号状态")
+    private Integer status;
+
+    //员工邮箱
+    @ApiModelProperty("邮箱")
+    @Email(message = "邮箱格式不正确")
+    private String email;
+
+    //员工所属部门
+    @ApiModelProperty("员工所属部门")
+    private Integer departmentid;
+
+    @TableField(exist = false)
+    private String departmentname;
+
+    //登录密码
+    @ApiModelProperty("登录密码")
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+    //角色(1表示普通用户,2表示管理员)
+    @ApiModelProperty("角色")
+    private String role;
+
+    @ApiModelProperty("人脸照片")
+    private String faceimg;
+
+    @ApiModelProperty("逻辑删除 0是未删除 1是已删除")
+    @TableLogic
+    private Integer isDelete;
+
+}

+ 60 - 0
src/main/java/com/om/entity/po/Menu.java

@@ -0,0 +1,60 @@
+package com.om.entity.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-22
+ */
+@Getter
+@Setter
+@TableName("sys_menu")
+@ApiModel(value = "Menu对象", description = "")
+public class Menu implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("路劲")
+    private String path;
+
+    @ApiModelProperty("图标")
+    private String icon;
+
+    @ApiModelProperty("描述")
+    private String description;
+
+    @ApiModelProperty("父级ID")
+    private Integer pid;
+
+    @ApiModelProperty("页面路径")
+    private String pagePath;
+
+    @TableField(exist = false)
+    private List<Menu> children;
+
+    @ApiModelProperty("顺序")
+    private Integer sortNum;
+
+
+}

+ 43 - 0
src/main/java/com/om/entity/po/Role.java

@@ -0,0 +1,43 @@
+package com.om.entity.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-22
+ */
+@Getter
+@Setter
+@TableName("sys_role")
+@ApiModel(value = "Role对象", description = "")
+public class Role implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("描述")
+    private String description;
+
+    @ApiModelProperty("唯一标识")
+    private String flag;
+
+
+}

+ 21 - 0
src/main/java/com/om/entity/po/RoleMenu.java

@@ -0,0 +1,21 @@
+package com.om.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@TableName("sys_role_menu")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RoleMenu implements Serializable {
+
+    @ApiModelProperty("角色ID")
+    private Integer roleId;
+    @ApiModelProperty("菜单ID")
+    private Integer menuId;
+}

+ 15 - 0
src/main/java/com/om/mapper/DepartmentMapper.java

@@ -0,0 +1,15 @@
+package com.om.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.om.config.MybatisRedisCache;
+import com.om.entity.po.Department;
+
+import org.apache.ibatis.annotations.CacheNamespace;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+@CacheNamespace(implementation = MybatisRedisCache.class, eviction = MybatisRedisCache.class)
+public interface DepartmentMapper extends BaseMapper<Department> {
+
+
+}

+ 22 - 0
src/main/java/com/om/mapper/DictMapper.java

@@ -0,0 +1,22 @@
+package com.om.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.om.config.MybatisRedisCache;
+
+import com.om.entity.po.Dict;
+import org.apache.ibatis.annotations.CacheNamespace;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-23
+ */
+@Mapper
+@CacheNamespace(implementation = MybatisRedisCache.class, eviction = MybatisRedisCache.class)
+public interface DictMapper extends BaseMapper<Dict> {
+
+}

+ 48 - 0
src/main/java/com/om/mapper/EmployeeMapper.java

@@ -0,0 +1,48 @@
+package com.om.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.om.config.MybatisRedisCache;
+import com.om.entity.dto.EmployeeDto;
+import com.om.entity.dto.UpdatePassDTO;
+import com.om.entity.po.Employee;
+import org.apache.ibatis.annotations.CacheNamespace;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+@CacheNamespace(implementation = MybatisRedisCache.class, eviction = MybatisRedisCache.class)
+public interface EmployeeMapper extends BaseMapper<Employee> {
+
+    //注册
+    int register(Employee employee);
+
+    //查询用户名是否存在
+    Employee queryUsername(@Param("username") String username);
+
+    //修改密码
+    int updatePass(UpdatePassDTO updatePassDTO);
+
+    //查询全部
+    Page<Employee> findEmployee(Page<Employee> page, @Param("employeename") String employeename, @Param("phone") String phone, @Param("email") String email, @Param("departmentname") String departmentname);
+
+    //查看未审批
+    List<Employee> getByStatus(Integer status);
+
+    //管理员通过审批
+    Integer updateStatusAdopt(@Param("employeeid") Long employeeid);
+
+    //管理员不通过审批
+    Integer updateStatusFail(Long employeeid);
+
+    //查询员工,状态为1的
+    List<Employee> getAll();
+
+    //导出功能方法
+    List<EmployeeDto> export();
+
+
+}

+ 21 - 0
src/main/java/com/om/mapper/MenuMapper.java

@@ -0,0 +1,21 @@
+package com.om.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.om.config.MybatisRedisCache;
+import com.om.entity.po.Menu;
+import org.apache.ibatis.annotations.CacheNamespace;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-22
+ */
+@Mapper
+@CacheNamespace(implementation = MybatisRedisCache.class, eviction = MybatisRedisCache.class)
+public interface MenuMapper extends BaseMapper<Menu> {
+
+}

+ 25 - 0
src/main/java/com/om/mapper/RoleMapper.java

@@ -0,0 +1,25 @@
+package com.om.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import com.om.config.MybatisRedisCache;
+import com.om.entity.po.Role;
+import org.apache.ibatis.annotations.CacheNamespace;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-22
+ */
+@Mapper
+@CacheNamespace(implementation = MybatisRedisCache.class, eviction = MybatisRedisCache.class)
+public interface RoleMapper extends BaseMapper<Role> {
+
+    Integer selectByFlag(@Param("flag") String flag);
+
+}

+ 20 - 0
src/main/java/com/om/mapper/RoleMenuMapper.java

@@ -0,0 +1,20 @@
+package com.om.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import com.om.config.MybatisRedisCache;
+import com.om.entity.po.RoleMenu;
+import org.apache.ibatis.annotations.CacheNamespace;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+@CacheNamespace(implementation = MybatisRedisCache.class, eviction = MybatisRedisCache.class)
+public interface RoleMenuMapper extends BaseMapper<RoleMenu> {
+
+    int deleteByRoleId(@Param("roleId") Integer roleId);
+
+    List<Integer> selectByRoleId(@Param("roleId") Integer roleId);
+}

+ 9 - 0
src/main/java/com/om/service/IDepartmentService.java

@@ -0,0 +1,9 @@
+package com.om.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.om.entity.po.Department;
+
+public interface IDepartmentService extends IService<Department> {
+
+
+}

+ 8 - 0
src/main/java/com/om/service/IDictService.java

@@ -0,0 +1,8 @@
+package com.om.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.om.entity.po.Dict;
+
+public interface IDictService extends IService<Dict> {
+
+}

+ 43 - 0
src/main/java/com/om/service/IEmployeeService.java

@@ -0,0 +1,43 @@
+package com.om.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.om.entity.dto.EmployeeDto;
+import com.om.entity.dto.UpdatePassDTO;
+import com.om.entity.po.Employee;
+
+
+import java.util.List;
+
+public interface IEmployeeService extends IService<Employee> {
+
+    //注册功能
+    int register(Employee employee);
+
+    //查询用户名是否存在
+    Employee queryUsername(String username);
+
+    //修改密码
+    int updatePass(UpdatePassDTO updatePassDTO);
+
+    //分页查询全部
+    Page<Employee> findEmployee(Page<Employee> page, String employeename, String phone, String email, String departmentname);
+
+    //查看未审批
+    List<Employee> getByStatus(Integer status);
+
+    //管理员通过审批
+    Integer updateStatusAdopt(Long employeeid);
+
+    //管理员不通过审批
+    Integer updateStatusFail(Long employeeid);
+
+    //根据ID查询参会人员
+    //List<ParticipantsDto> getEmpsById(Integer meetingid);
+
+    //查询员工,状态为1的
+    List<Employee> getAll();
+
+    //导出方法
+    List<EmployeeDto> export();
+}

+ 14 - 0
src/main/java/com/om/service/IMenuService.java

@@ -0,0 +1,14 @@
+package com.om.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.om.entity.po.Menu;
+
+import java.util.List;
+
+public interface IMenuService extends IService<Menu> {
+
+    List<Menu> getRoleMenu(String roleFlag);
+
+    List<Menu> findMenus(String name);
+
+}

+ 8 - 0
src/main/java/com/om/service/IRoleMenuService.java

@@ -0,0 +1,8 @@
+package com.om.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.om.entity.po.RoleMenu;
+
+public interface IRoleMenuService extends IService<RoleMenu> {
+
+}

+ 14 - 0
src/main/java/com/om/service/IRoleService.java

@@ -0,0 +1,14 @@
+package com.om.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.om.entity.po.Role;
+
+import java.util.List;
+
+public interface IRoleService extends IService<Role> {
+
+    void setRoleMenu(Integer roleId, List<Integer> menuIds);
+
+    Object getRoleMenu(Integer roleId);
+
+}

+ 15 - 0
src/main/java/com/om/service/impl/DepartmentServiceImpl.java

@@ -0,0 +1,15 @@
+package com.om.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.om.mapper.DepartmentMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.om.entity.po.Department;
+import com.om.service.IDepartmentService;
+
+@Service
+@Transactional
+public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Department> implements IDepartmentService {
+
+}

+ 21 - 0
src/main/java/com/om/service/impl/DictServiceImpl.java

@@ -0,0 +1,21 @@
+package com.om.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.om.entity.po.Dict;
+import com.om.mapper.DictMapper;
+import com.om.service.IDictService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-23
+ */
+@Service
+public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements IDictService {
+
+}

+ 86 - 0
src/main/java/com/om/service/impl/EmployeeServiceImpl.java

@@ -0,0 +1,86 @@
+package com.om.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.om.entity.dto.UpdatePassDTO;
+import com.om.entity.po.Employee;
+import com.om.mapper.EmployeeMapper;
+import com.om.service.IEmployeeService;
+import com.om.utils.Constants;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.om.entity.dto.EmployeeDto;
+import java.util.List;
+
+@Service
+@Transactional
+public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements IEmployeeService {
+
+    @Autowired
+    EmployeeMapper employeeMapper;
+
+    //注册
+    @Override
+    public int register(Employee employee) {
+        employee.setStatus(Constants.STATUS);
+        employee.setRole(Constants.ROLE);
+        employee.setPassword(DigestUtils.md5Hex(employee.getPassword() + Constants.SALT));
+        return employeeMapper.register(employee);
+    }
+
+
+    //查询用户名是否存在
+    @Override
+    public Employee queryUsername(String username) {
+        return employeeMapper.queryUsername(username);
+    }
+
+    //修改密码
+    @Override
+    public int updatePass(UpdatePassDTO updatePassDTO) {
+        updatePassDTO.setPassword(DigestUtils.md5Hex(updatePassDTO.getPassword() + Constants.SALT));
+        updatePassDTO.setNewPassword(DigestUtils.md5Hex(updatePassDTO.getNewPassword() + Constants.SALT));
+        return employeeMapper.updatePass(updatePassDTO);
+    }
+
+    //分页查询
+    @Override
+    public Page<Employee> findEmployee(Page<Employee> page, String employeename, String phone, String email, String departmentname) {
+        return employeeMapper.findEmployee(page, employeename, phone, email, departmentname);
+    }
+
+    //查询所有审批状态为0的员工
+    @Override
+    public List<Employee> getByStatus(Integer status) {
+        return employeeMapper.getByStatus(status);
+    }
+
+    //根据ID通过审批
+    @Override
+    public Integer updateStatusAdopt(Long employeeid) {
+        return employeeMapper.updateStatusAdopt(employeeid);
+    }
+
+    //根据ID不通过审批
+    @Override
+    public Integer updateStatusFail(Long employeeid) {
+        return employeeMapper.updateStatusFail(employeeid);
+    }
+
+    //查询员工,状态为1的
+    @Override
+    public List<Employee> getAll() {
+        return employeeMapper.getAll();
+    }
+
+    //导出
+    @Override
+    public List<EmployeeDto> export() {
+        return employeeMapper.export();
+    }
+
+
+}

+ 76 - 0
src/main/java/com/om/service/impl/MenuServiceImpl.java

@@ -0,0 +1,76 @@
+package com.om.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.om.entity.po.Menu;
+import com.om.mapper.MenuMapper;
+import com.om.service.IMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.om.mapper.RoleMapper;
+import com.om.mapper.RoleMenuMapper;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-22
+ */
+@Service
+public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
+
+    @Autowired
+    RoleMapper roleMapper;
+
+    @Autowired
+    RoleMenuMapper roleMenuMapper;
+
+    @Autowired
+    IMenuService menuService;
+
+    @Override
+    public List<Menu> getRoleMenu(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();
+            children.removeIf(child -> !menuIds.contains(child.getId()));
+        }
+        return roleMenus;
+    }
+
+    @Override
+    public List<Menu> findMenus(String name) {
+        QueryWrapper<Menu> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByAsc("sort_num");
+        if (StrUtil.isNotBlank(name)) {
+            queryWrapper.like("name", name);
+        }
+        // 查询所有数据
+        List<Menu> list = list(queryWrapper);
+        // 找出pid为null的一级菜单
+        List<Menu> parentNodes = list.stream().filter(menu -> menu.getPid() == null).collect(Collectors.toList());
+        // 找出一级菜单的子菜单
+        for (Menu menu : parentNodes) {
+            // 筛选所有数据中pid=父级id的数据就是二级菜单
+            menu.setChildren(list.stream().filter(m -> menu.getId().equals(m.getPid())).collect(Collectors.toList()));
+        }
+        return parentNodes;
+    }
+}

+ 12 - 0
src/main/java/com/om/service/impl/RoleMenuServiceImpl.java

@@ -0,0 +1,12 @@
+package com.om.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.om.entity.po.RoleMenu;
+import com.om.mapper.RoleMenuMapper;
+import org.springframework.stereotype.Service;
+import com.om.service.IRoleMenuService;
+@Service
+public class RoleMenuServiceImpl extends ServiceImpl<RoleMenuMapper, RoleMenu> implements IRoleMenuService {
+
+}

+ 70 - 0
src/main/java/com/om/service/impl/RoleServiceImpl.java

@@ -0,0 +1,70 @@
+package com.om.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.om.entity.po.Menu;
+import com.om.entity.po.Role;
+import com.om.entity.po.RoleMenu;
+import com.om.mapper.RoleMapper;
+import com.om.mapper.RoleMenuMapper;
+import com.om.service.IMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.om.service.IRoleService;
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 何超
+ * @since 2022-08-22
+ */
+@Service
+public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {
+
+    @Autowired
+    RoleMenuMapper roleMenuMapper;
+
+    @Autowired
+    IMenuService menuService;
+
+    @Transactional
+    @Override
+    public void setRoleMenu(Integer roleId, List<Integer> menuIds) {
+        //QueryWrapper<RoleMenu> queryWrapper = new QueryWrapper<>();
+        //queryWrapper.eq("role_id", roleId);
+        //roleMenuMapper.delete(queryWrapper);
+
+        // 先删除当前角色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);
+    }
+
+}

+ 16 - 0
src/main/java/com/om/utils/Constants.java

@@ -0,0 +1,16 @@
+package com.om.utils;
+
+public interface Constants {
+
+    int CODE_401 = 401;  //权限不足
+
+    int CODE_500 = 500;  //系统错误
+
+    String ROLE = "ROLE_NORMAL";
+
+    int STATUS = 0;
+
+    String DICT_ICON = "icon";
+
+    String SALT = "hechao!#$%@";
+}

+ 39 - 10
src/main/java/com/om/utils/Result.java

@@ -7,8 +7,8 @@ import lombok.Data;
  */
 @Data
 public class Result<T> {
-    private Integer result;//状态码
-    private String message;//返回消息
+    private Integer code;//状态码
+    private String msg;//返回消息
     private T data;//返回数据
     /**
      * 私有化构造方法,禁止在其它类创建对象
@@ -20,8 +20,8 @@ public class Result<T> {
      */
     public static<T> Result<T> ok(){
         Result<T> result = new Result<T>();
-        result.setResult(ResultCode.SUCCESS);
-        result.setMessage("执行成功");
+        result.setCode(ResultCode.SUCCESS);
+        result.setMsg("执行成功");
         return result;
     }
     /**
@@ -32,8 +32,8 @@ public class Result<T> {
      */
     public static<T> Result<T> ok(T data){
         Result<T> result = new Result<T>();
-        result.setResult(ResultCode.SUCCESS);
-        result.setMessage("执行成功");
+        result.setCode(ResultCode.SUCCESS);
+        result.setMsg("执行成功");
         result.setData(data);
         return result;
     }
@@ -43,8 +43,8 @@ public class Result<T> {
      */
     public static<T> Result<T> error(){
         Result<T> result = new Result<T>();
-        result.setResult(ResultCode.ERROR);
-        result.setMessage("执行失败");
+        result.setCode(ResultCode.ERROR);
+        result.setMsg("执行失败");
         return result;
     }
 
@@ -54,7 +54,7 @@ public class Result<T> {
      * @return
      */
     public Result<T> result(Integer code){
-        this.setResult(code);
+        this.setCode(code);
         return this;
     }
     /**
@@ -63,8 +63,37 @@ public class Result<T> {
      * @return
      */
     public Result<T> message(String message){
-        this.setMessage(message);
+        this.setMsg(message);
         return this;
     }
 
+    // Added By Wxy
+    public static Result<Object> fail(String msg) {
+        return fail(400, msg, null);
+    }
+    public static Result<Object> fail(String msg, Object data) {
+        return fail(400, msg, data);
+    }
+
+    public static Result<Object> fail(int code, String msg, Object data) {
+        Result<Object> rs = new Result<>();
+        rs.setCode(code);
+        rs.setMsg(msg);
+        rs.setData(data);
+
+        return rs;
+    }
+
+    public static Result<Object> succ(Object data) {
+        return succ(200, "操作成功", data);
+    }
+
+    public static Result<Object> succ(int code, String msg, Object data) {
+        Result<Object> rs = new Result<>();
+        rs.setCode(code);
+        rs.setMsg(msg);
+        rs.setData(data);
+
+        return rs;
+    }
 }

+ 32 - 0
src/main/java/com/om/utils/SpringUtil.java

@@ -0,0 +1,32 @@
+package com.om.utils;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * SpringUtil是手动获取bean的工具类
+ */
+@Component
+public class SpringUtil implements ApplicationContextAware {
+
+    private static ApplicationContext applicationContext;
+
+    public static Object getBean(String name) {
+        return applicationContext.getBean(name);
+    }
+
+    public static <T> T getBean(String name, Class<T> clazz) {
+        return applicationContext.getBean(name, clazz);
+    }
+
+    public static <T> T getBean(Class<T> clazz) {
+        return applicationContext.getBean(clazz);
+    }
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringUtil.applicationContext = applicationContext;
+    }
+}

+ 54 - 0
src/main/java/com/om/utils/TokenUtils.java

@@ -0,0 +1,54 @@
+package com.om.utils;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.algorithms.Algorithm;
+
+import com.om.entity.po.Employee;
+import com.om.service.IEmployeeService;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+@Component
+public class TokenUtils {
+
+    private static IEmployeeService staticEmployeeService;
+
+    @Resource
+    private IEmployeeService employeeService;
+
+    //生成Token
+    public static String genToken(String userId, String sign) {
+        return JWT.create().withAudience(userId)  //将userId保存到token里面,作为载荷
+                .withExpiresAt(DateUtil.offsetHour(new Date(), 2))  //两小时后token过期
+                .sign(Algorithm.HMAC256(sign));  //以password作为token的密钥
+    }
+
+    //获取当前登录的用户信息
+    public static Employee getCurrentUser() {
+        try {
+            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+            String token = request.getHeader("token");
+            if (StrUtil.isNotBlank(token)) {
+                String userId = JWT.decode(token).getAudience().get(0);
+                return staticEmployeeService.getById(Integer.valueOf(userId));
+            }
+        } catch (Exception e) {
+            return null;
+        }
+
+        return null;
+    }
+
+    @PostConstruct
+    public void setUserService() {
+        staticEmployeeService = employeeService;
+    }
+}

+ 7 - 0
src/main/resources/mapper/DepartmentMapper.xml

@@ -0,0 +1,7 @@
+<?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.om.mapper.DepartmentMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/DictMapper.xml

@@ -0,0 +1,5 @@
+<?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.om.mapper.DictMapper">
+
+</mapper>

+ 86 - 0
src/main/resources/mapper/EmployeeMapper.xml

@@ -0,0 +1,86 @@
+<?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.om.mapper.EmployeeMapper">
+
+
+    <insert id="register">
+        insert into employee (username, password, status, role, employeename, departmentid)
+        values (#{username}, #{password}, #{status}, #{role}, #{employeename}, #{departmentid})
+    </insert>
+
+
+    <update id="updateStatusAdopt">
+        update employee
+        set status = 1
+        where employeeid = #{employeeid}
+    </update>
+
+    <update id="updateStatusFail">
+        update employee
+        set status = 2
+        where employeeid = #{employeeid}
+    </update>
+
+    <update id="updatePass" parameterType="com.om.entity.dto.UpdatePassDTO">
+        update employee
+        set password = #{newPassword}
+        where username = #{username}
+          and password = #{password}
+    </update>
+
+    <select id="queryUsername" resultType="com.om.entity.po.Employee">
+        select *
+        from employee
+        where username = #{username}
+    </select>
+
+    <select id="findEmployee" resultType="com.om.entity.po.Employee">
+        select e.*,d.*
+        from employee as e,department as d
+        where e.departmentid = d.departmentid
+        and e.is_delete = 0
+        <if test="employeename != null and employeename != ''">
+            and e.employeename like concat('%',#{employeename},'%')
+        </if>
+        <if test="phone != null and phone != ''">
+            and e.phone like concat('%',#{phone},'%')
+        </if>
+        <if test="email != null and email != ''">
+            and e.email like concat('%',#{email},'%')
+        </if>
+        <if test="departmentname != null and departmentname != ''">
+            and d.departmentname like concat('%',#{departmentname},'%')
+        </if>
+    </select>
+
+    <select id="getByStatus" resultType="com.om.entity.po.Employee">
+        select *
+        from employee
+        where status = 0
+    </select>
+
+    <select id="getAll" resultType="com.om.entity.po.Employee">
+        select *
+        from employee
+        where status = 1
+          and is_delete = 0
+    </select>
+
+    <select id="export" resultType="com.om.entity.dto.EmployeeDto">
+        SELECT e.employeeid,
+               e.employeename,
+               e.username,
+               e.phone,
+               e.email,
+               d.departmentname,
+               e.role,
+               e.status
+        FROM employee as e,
+             department as d
+        WHERE e.departmentid = d.departmentid
+    </select>
+
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/MenuMapper.xml

@@ -0,0 +1,5 @@
+<?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.om.mapper.MenuMapper">
+
+</mapper>

+ 10 - 0
src/main/resources/mapper/RoleMapper.xml

@@ -0,0 +1,10 @@
+<?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.om.mapper.RoleMapper">
+
+    <select id="selectByFlag" resultType="java.lang.Integer">
+        select id
+        from sys_role
+        where flag = #{flag}
+    </select>
+</mapper>

+ 15 - 0
src/main/resources/mapper/RoleMenuMapper.xml

@@ -0,0 +1,15 @@
+<?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.om.mapper.RoleMenuMapper">
+
+    <delete id="deleteByRoleId">
+        delete
+        from sys_role_menu
+        where role_id = #{roleId}
+    </delete>
+    <select id="selectByRoleId" resultType="java.lang.Integer">
+        select menu_id
+        from sys_role_menu
+        where role_id = #{roleId}
+    </select>
+</mapper>