From e459023e11f5b7be2d86662722b70605aee7992b Mon Sep 17 00:00:00 2001
From: nidapeng <jp@doumee.com>
Date: 星期二, 30 四月 2024 11:17:46 +0800
Subject: [PATCH] 最新版本

---
 server/system_service/src/main/java/com/doumee/api/cloud/SystemDepartmentController.java       |  110 ++++
 server/system_service/src/main/java/com/doumee/api/cloud/SystemDictDataController.java         |   98 ++++
 server/system_service/src/main/java/com/doumee/api/cloud/SystemController.java                 |   50 ++
 server/system_service/src/main/java/com/doumee/api/cloud/SystemPositionController.java         |  106 ++++
 server/system_service/src/main/java/com/doumee/api/cloud/SystemMenuController.java             |  101 ++++
 server/system_service/src/main/java/com/doumee/api/cloud/SystemRoleController.java             |  111 ++++
 admin/.env.production                                                                          |    2 
 admin/vue.config.js                                                                            |   13 
 server/system_service/src/main/java/com/doumee/api/cloud/SystemLoginLogController.java         |   47 ++
 server/system_service/src/main/java/com/doumee/api/cloud/NoticesController.java                |   91 +++
 admin/src/api/system/common.js                                                                 |   20 
 server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java |    2 
 server/system_service/src/main/java/com/doumee/api/cloud/SystemPermissionController.java       |   92 ++++
 server/system_service/src/main/java/com/doumee/api/cloud/SystemDictController.java             |   83 +++
 admin/.env.development                                                                         |    1 
 server/system_service/src/main/java/com/doumee/api/cloud/SystemUserController.java             |  140 ++++++
 admin/src/views/login.vue                                                                      |    4 
 server/system_service/src/main/java/com/doumee/api/BaseController.java                         |   28 +
 server/system_service/src/main/java/com/doumee/api/cloud/SystemTraceLogController.java         |   46 ++
 admin/src/api/system/menu.js                                                                   |    4 
 admin/package.json                                                                             |    4 
 server/system_service/src/main/java/com/doumee/api/cloud/SystemMonitorController.java          |   33 +
 /dev/null                                                                                      |    2 
 admin/src/utils/request.js                                                                     |    7 
 admin/.env.test                                                                                |    4 
 server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java                    |   13 
 server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java              |   31 +
 server/system_gateway/src/main/resources/application.yml                                       |    1 
 server/system_service/src/main/java/com/doumee/api/cloud/SystemDataPermissionController.java   |  109 ++++
 29 files changed, 1,319 insertions(+), 34 deletions(-)

diff --git a/admin/.env.development b/admin/.env.development
index 313f893..ef1bcb5 100644
--- a/admin/.env.development
+++ b/admin/.env.development
@@ -1,2 +1,3 @@
 # 寮�鍙戠幆澧冮厤缃�
 NODE_ENV = 'development'
+VUE_APP_API_URL  = 'http://192.168.0.109:10010'
diff --git a/admin/.env.production b/admin/.env.production
index dc6dc7f..091b660 100644
--- a/admin/.env.production
+++ b/admin/.env.production
@@ -1,2 +1,4 @@
 # 鐢熶骇鐜閰嶇疆
 NODE_ENV = 'production'
+
+VUE_APP_API_URL  = 'http://192.168.0.109:10010'
diff --git a/admin/.env.staging b/admin/.env.staging
deleted file mode 100644
index bd33547..0000000
--- a/admin/.env.staging
+++ /dev/null
@@ -1,2 +0,0 @@
-# 娴嬭瘯鐜閰嶇疆
-NODE_ENV = 'production'
diff --git a/admin/.env.test b/admin/.env.test
new file mode 100644
index 0000000..c45c4ce
--- /dev/null
+++ b/admin/.env.test
@@ -0,0 +1,4 @@
+# 娴嬭瘯鐜閰嶇疆
+NODE_ENV = 'production'
+
+VUE_APP_API_URL  = 'http://192.168.0.109:10010'
diff --git a/admin/package.json b/admin/package.json
index 8a4a61b..d7e43de 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -4,8 +4,8 @@
   "private": true,
   "scripts": {
     "serve": "vue-cli-service serve",
-    "build": "vue-cli-service build",
-    "build:staging": "vue-cli-service build --mode staging",
+    "build": "vue-cli-service build --mode production",
+    "build:staging": "vue-cli-service build --mode test",
     "lint": "vue-cli-service lint",
     "fix": "eslint --ext .js,.vue src --fix"
   },
diff --git a/admin/src/api/system/common.js b/admin/src/api/system/common.js
index fcd999b..3bf560c 100644
--- a/admin/src/api/system/common.js
+++ b/admin/src/api/system/common.js
@@ -2,29 +2,29 @@
 
 // 鑾峰彇鍥剧墖楠岃瘉鐮�
 export function getCaptcha () {
-  return request.get('/common/captcha')
+  return request.get('/captcha')
 }
 
 // 鏍规嵁瀵嗙爜鐧诲綍
 export function loginByPassword (data) {
-  return request.post('/system/login', data)
+  return request.post('/login', data)
+}
+
+// 鑾峰彇宸茬櫥褰曠殑鐢ㄦ埛淇℃伅
+export function getUserInfo () {
+  return request.get('/getUserInfo', {
+    autoLogin: false
+  })
 }
 
 // 鐧诲嚭
 export function logout (data) {
-  return request.post('/system/logout', data)
+  return request.post('/logout', data)
 }
 
 // 淇敼瀵嗙爜
 export function updatePwd (data) {
   return request.post('/system/updatePwd', data)
-}
-
-// 鑾峰彇宸茬櫥褰曠殑鐢ㄦ埛淇℃伅
-export function getUserInfo () {
-  return request.get('/system/getUserInfo', {
-    autoLogin: false
-  })
 }
 
 // 璁垮鏉ヨ閰嶇疆
diff --git a/admin/src/api/system/menu.js b/admin/src/api/system/menu.js
index 19f25a0..cb1e05c 100644
--- a/admin/src/api/system/menu.js
+++ b/admin/src/api/system/menu.js
@@ -36,10 +36,10 @@
 
 // 鏌ヨ鑿滃崟鏍�
 export function fetchMenuTree () {
-  return request.get('/system/menu/treeNodes')
+  return request.get('/visitsAdmin/system/menu/treeNodes')
 }
 
 // 鎺掑簭
 export function sort (data) {
-  return request.post('/system/menu/updateSort', data)
+  return request.post('/visitsAdmin/system/menu/updateSort', data)
 }
diff --git a/admin/src/utils/request.js b/admin/src/utils/request.js
index e73f3ae..19be2e3 100644
--- a/admin/src/utils/request.js
+++ b/admin/src/utils/request.js
@@ -30,9 +30,9 @@
   // 璁剧疆鎿嶄綔骞冲彴
   config.headers['eva-platform'] = `pc-${pkg.version}`
   // 璁剧疆璁よ瘉澶�
-  const authToken = Cookies.get('eva-auth-token')
+  const authToken = Cookies.get('dm_user_token')
   if (authToken != null) {
-    config.headers['eva-auth-token'] = authToken
+    config.headers['dm_user_token'] = authToken
   }
   return config
 }, function (error) {
@@ -52,7 +52,8 @@
   // 鏈櫥褰�
   if (response.data.code === 401) {
     if (response.config.autoLogin !== false) {
-      window.location.href = process.env.VUE_APP_ROUTER_MODE === 'history' ? '/#/login' : '/login'
+      Cookies.set('dm_user_token','')
+      window.location.href = process.env.VUE_APP_ROUTER_MODE === 'hash' ? (process.env.VUE_APP_CONTEXT_PATH +'/#/login') : (process.env.VUE_APP_CONTEXT_PATH+'/login')
     }
     return Promise.reject(response.data)
   }
diff --git a/admin/src/views/login.vue b/admin/src/views/login.vue
index c343084..87b3f52 100644
--- a/admin/src/views/login.vue
+++ b/admin/src/views/login.vue
@@ -23,6 +23,7 @@
 <script>
 import { mapMutations } from 'vuex'
 import { getCaptcha, loginByPassword } from '@/api/system/common'
+import Cookies from "js-cookie";
 
 export default {
   name: 'Login',
@@ -58,8 +59,9 @@
         code: this.captcha.value.trim(),
         uuid: this.captcha.uuid
       })
-        .then(() => {
+        .then((res) => {
           // window.location.href = process.env.VUE_APP_CONTEXT_PATH
+          Cookies.set('dm_user_token',res)
           window.location.reload()
         })
         .catch(e => {
diff --git a/admin/vue.config.js b/admin/vue.config.js
index ef7665f..efad125 100644
--- a/admin/vue.config.js
+++ b/admin/vue.config.js
@@ -10,18 +10,7 @@
     port: 10012,
     proxy: {
       [process.env.VUE_APP_API_PREFIX]: {
-        // http://192.168.0.134:10028   浠诲悍
-        // http://192.168.0.110:10013   纾婄
-        // http://192.168.0.132:10013   甯呭摜
-        // http://192.168.0.176:10028   钀嶅
-        // http://192.168.0.186:10028   浠诲悍
-        // https://dmtest.ahapp.net/admin_api   娴嬭瘯鏈�
-        // http://10.10.99.63/admin_interface/  鏈�鏂版祴璇曟湇锛堝唴缃戯級
-        // http://218.23.218.228:8018/admin_interface   鏈�鏂版祴璇曟湇锛堝缃戯級
-        // target: 'http://218.23.218.228:8018/admin_interface',
-        // http://218.23.218.228:9912/admin_interface
-        // http://facepay.huasunsolar.com/admin_interface
-        target: 'http://facepay.huasunsolar.com/admin_interface',
+        target: process.env.VUE_APP_API_URL,
         changeOrigin: true,
         pathRewrite: {
          [`^${[process.env.VUE_APP_API_PREFIX]}`]: ''
diff --git a/server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java b/server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
index 2cbb365..7d06475 100644
--- a/server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
+++ b/server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
@@ -10,6 +10,7 @@
 import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.system.dto.LoginDTO;
+import com.doumee.service.common.CaptchaService;
 import com.doumee.service.system.SystemLoginService;
 import com.doumee.service.system.SystemUserService;
 import io.swagger.annotations.Api;
@@ -39,6 +40,18 @@
 
     @Autowired
     private SystemLoginService systemLoginService;
+    @Autowired
+    private CaptchaService captchaService;
+
+    /**
+     * @author Eva.Caesar Liu
+     * @date 2023/03/21 14:49
+     */
+    @ApiOperation("鑾峰彇鍥剧墖楠岃瘉鐮�")
+    @GetMapping("/captcha")
+    public ApiResponse<CaptchaService.Captcha> getCaptcha() {
+        return ApiResponse.success(captchaService.genCaptcha());
+    }
 
     @PreventRepeat(limit = 10, lockTime = 10000)
     @ApiOperation("鐧诲綍")
@@ -63,7 +76,7 @@
      */
     @PostMapping("/refreshtoken")
     @ApiOperation("鍒锋柊token")
-    public ApiResponse<String> refreshtoken(@RequestHeader("userToken") String oldToken){
+    public ApiResponse<String> refreshtoken(@RequestHeader(Constants.HEADER_USER_TOKEN) String oldToken){
         try {
             if(!jwtTokenUtil.isTokenExpired(oldToken)){
                 return ApiResponse.success(jwtTokenUtil.refreshToken(oldToken));
@@ -76,6 +89,22 @@
         }
 
     }
+    /**
+     * 鍒锋柊JWT浠ょ墝,鐢ㄦ棫鐨勪护鐗屾崲鏂扮殑浠ょ墝
+     */
+    @PostMapping("/logout")
+    @ApiOperation("閫�鍑虹櫥闄�")
+    public ApiResponse<String> logout(@RequestHeader(Constants.HEADER_USER_TOKEN) String oldToken){
+        try {
+             jwtTokenUtil.logout(oldToken);
+        }catch (BusinessException e){
+            return ApiResponse.failed(e.getCode(),e.getMessage());
+        }catch (Exception e){
+            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
+        }
+        return ApiResponse.success(null);
+
+    }
 
     /**
      * 鍒锋柊JWT浠ょ墝,鐢ㄦ棫鐨勪护鐗屾崲鏂扮殑浠ょ墝
diff --git a/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java b/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
index 1faef7c..b4a3835 100644
--- a/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
+++ b/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -104,6 +104,19 @@
         }
         return refreshedToken;
     }
+    /**
+     * 閫�鍑虹櫥闄�
+     *
+     * @param token 鍘熶护鐗�
+     * @return 鏂颁护鐗�
+     */
+    public void logout(String token) {
+        try {
+            redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);//鍒犻櫎鑰佺殑token
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 
     /**
      * 楠岃瘉浠ょ墝
diff --git a/server/system_gateway/src/main/resources/application.yml b/server/system_gateway/src/main/resources/application.yml
index 9be4661..dc68829 100644
--- a/server/system_gateway/src/main/resources/application.yml
+++ b/server/system_gateway/src/main/resources/application.yml
@@ -98,6 +98,7 @@
     - /meetingAdmin/**
     - /visitsAdmin/**
     - /login
+    - /captcha
     - /doc.html
     - /v2/api-docs/**
     - /**.js
diff --git a/server/system_service/src/main/java/com/doumee/api/BaseController.java b/server/system_service/src/main/java/com/doumee/api/BaseController.java
index a390450..61f1a43 100644
--- a/server/system_service/src/main/java/com/doumee/api/BaseController.java
+++ b/server/system_service/src/main/java/com/doumee/api/BaseController.java
@@ -1,8 +1,15 @@
 package com.doumee.api;
 
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.Constants;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -16,6 +23,8 @@
 @Slf4j
 public class BaseController {
 
+    @Autowired
+    private RedisTemplate<String,Object> stringRedisTemplate;
     /**
      * 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
      * @author Eva.Caesar Liu
@@ -24,6 +33,25 @@
     protected LoginUserInfo getLoginUser () {
         return (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
     }
+    /**
+     * 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+     * @author Eva.Caesar Liu
+     * @date 2023/03/21 14:49
+     */
+    protected LoginUserInfo getLoginUser (String token) {
+        if (token == null || token.isEmpty()) {
+            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"鏈櫥褰�");
+        }
+        String userinfo =(String) stringRedisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
+        if (StringUtils.isBlank(userinfo)) {
+            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"鏈櫥褰�");
+        }
+        LoginUserInfo user = JSONObject.toJavaObject(JSONObject.parseObject(userinfo),LoginUserInfo.class );
+        if(user ==null ){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛鐧婚檰宸插け鏁堬紝璇烽噸鏂扮櫥闄嗭紒");
+        }
+        return  user;
+    }
 
 
     /**
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/NoticesController.java b/server/system_service/src/main/java/com/doumee/api/cloud/NoticesController.java
new file mode 100644
index 0000000..6a4c93c
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/NoticesController.java
@@ -0,0 +1,91 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.model.Notices;
+import com.doumee.service.system.NoticesService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/01/16 10:03
+ */
+@Api(tags = "绯荤粺娑堟伅淇℃伅琛�")
+@RestController
+@RequestMapping("/cloudService/business/notices")
+public class NoticesController extends BaseController {
+
+    @Autowired
+    private NoticesService noticesService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:notices:create")
+    public ApiResponse create(@RequestBody Notices notices) {
+        return ApiResponse.success(noticesService.create(notices));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:notices:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        noticesService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:notices:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        noticesService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:notices:update")
+    public ApiResponse updateById(@RequestBody Notices notices) {
+        noticesService.updateById(notices);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:notices:query")
+    public ApiResponse<PageData<Notices>> findPage (@RequestBody PageWrap<Notices> pageWrap) {
+        pageWrap.getModel().setPalt(Constants.ZERO);
+        return ApiResponse.success(noticesService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:notices:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Notices> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Notices.class).export(noticesService.findPage(pageWrap).getRecords(), "绯荤粺娑堟伅淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:notices:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(noticesService.findById(id));
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemController.java
new file mode 100644
index 0000000..53ca39a
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemController.java
@@ -0,0 +1,50 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemUserBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.LoginDTO;
+import com.doumee.dao.system.dto.UpdatePwdDto;
+import com.doumee.service.system.SystemLoginService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺鍔熻兘")
+@Trace(exclude = true)
+@Slf4j
+@RestController
+@RequestMapping("/cloudService/system")
+public class SystemController extends BaseController {
+
+    @Autowired
+    private SystemUserBiz systemUserBiz;
+
+    @Autowired
+    private SystemLoginService systemLoginService;
+
+    @Trace(withRequestParameters = false)
+    @ApiOperation("淇敼褰撳墠鐢ㄦ埛瀵嗙爜")
+    @PostMapping("/updatePwd")
+    public ApiResponse updatePwd (@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated @RequestBody UpdatePwdDto dto) {
+        dto.setUserId(this.getLoginUser(token).getId());
+        systemUserBiz.updatePwd(dto);
+        return ApiResponse.success(null);
+    }
+
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemDataPermissionController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemDataPermissionController.java
new file mode 100644
index 0000000..cc5093d
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemDataPermissionController.java
@@ -0,0 +1,109 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDataPermissionBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.DataPermissionConstants;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.model.SystemDataPermission;
+import com.doumee.dao.system.vo.SystemDataPermissionListVO;
+import com.doumee.service.system.SystemDataPermissionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@RestController
+@RequestMapping("/cloudService/system/dataPermission")
+@Api(tags = "绯荤粺鏁版嵁鏉冮檺")
+public class SystemDataPermissionController extends BaseController {
+
+    @Autowired
+    private SystemDataPermissionService systemDataPermissionService;
+
+    @Autowired
+    private SystemDataPermissionBiz systemDataPermissionBiz;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:datapermission:create")
+    public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated(OperaType.Create.class) @RequestBody SystemDataPermission systemDataPermission) {
+        systemDataPermission.setCreateUser(this.getLoginUser(token).getId());
+        return ApiResponse.success(systemDataPermissionBiz.create(systemDataPermission));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:datapermission:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemDataPermissionService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:datapermission:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemDataPermissionService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:datapermission:update")
+    public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemDataPermission systemDataPermission) {
+        systemDataPermission.setCreateUser(this.getLoginUser(token).getId());
+        systemDataPermissionBiz.update(systemDataPermission);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼鐘舵��")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("system:datapermission:update")
+    public ApiResponse updateStatus(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.UpdateStatus.class) @RequestBody SystemDataPermission systemDataPermission) {
+        systemDataPermission.setCreateUser(this.getLoginUser(token).getId());
+        systemDataPermissionBiz.updateStatus(systemDataPermission);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:datapermission:query")
+    public ApiResponse<PageData<SystemDataPermissionListVO>> findPage (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestBody PageWrap<SystemDataPermission> pageWrap) {
+        return ApiResponse.success(systemDataPermissionService.findPage(pageWrap));
+    }
+
+    @Trace(exclude = true)
+    @ApiOperation("鏌ヨ鏁版嵁鏉冮檺绫诲瀷")
+    @GetMapping("/types")
+    public ApiResponse<List<Map<String, Object>>> findTypes (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(DataPermissionConstants.Type.valueList());
+    }
+    @Trace(exclude = true)
+    @ApiOperation("鏌ヨ鏁版嵁鏉冮檺妯″潡")
+    @GetMapping("/modules")
+    public ApiResponse<List<Map<String, Object>>> findModules (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(DataPermissionConstants.Module.valueList());
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemDepartmentController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemDepartmentController.java
new file mode 100644
index 0000000..315a229
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemDepartmentController.java
@@ -0,0 +1,110 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDepartmentBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.QuerySystemUserDTO;
+import com.doumee.dao.system.model.SystemDepartment;
+import com.doumee.dao.system.vo.SystemDepartmentListVO;
+import com.doumee.dao.system.vo.SystemUserListVO;
+import com.doumee.service.system.SystemUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "閮ㄩ棬")
+@RestController
+@RequestMapping("/cloudService/system/department")
+public class SystemDepartmentController extends BaseController {
+
+    @Autowired
+    private SystemDepartmentBiz systemDepartmentBiz;
+
+    @Autowired
+    private SystemUserService systemUserService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:department:create")
+    public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Create.class) @RequestBody SystemDepartment systemDepartment) {
+        systemDepartment.setCreateUser(getLoginUser().getId());
+        systemDepartment.setUpdateUser(getLoginUser().getId());
+        return ApiResponse.success(systemDepartmentBiz.create(systemDepartment));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:department:delete")
+    public ApiResponse deleteById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@PathVariable Integer id) {
+        systemDepartmentBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @PreventRepeat
+    @RequiresPermissions("system:department:delete")
+    public ApiResponse deleteByIdInBatch(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemDepartmentBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:department:update")
+    public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemDepartment systemDepartment) {
+        systemDepartment.setCreateUser(getLoginUser().getId());
+        systemDepartment.setUpdateUser(getLoginUser().getId());
+        systemDepartmentBiz.updateById(systemDepartment);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ閮ㄩ棬鍒楄〃")
+    @PostMapping("/tree")
+    @RequiresPermissions("system:department:query")
+    public ApiResponse<List<SystemDepartmentListVO>> findTree (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(systemDepartmentBiz.findTree());
+    }
+
+    @ApiOperation("鏌ヨ閮ㄩ棬鍒楄〃鍙婇儴闂ㄤ笅鐨勪汉鍛�")
+    @GetMapping("/findTreeUser")
+    @RequiresPermissions("system:department:query")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "parentId", value = "parentId", paramType = "query", dataType = "Integer"),
+    })
+    public ApiResponse<SystemDepartmentListVO> findTreeUser(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,Integer parentId) {
+        return ApiResponse.success(systemDepartmentBiz.findTreeUser(parentId));
+    }
+
+    @Trace(exclude = true)
+    @ApiOperation("鏌ヨ閮ㄩ棬浜哄憳")
+    @PostMapping("/users")
+    @RequiresPermissions("system:department:queryUsers")
+    public ApiResponse<PageData<SystemUserListVO>> findPage (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestBody PageWrap<QuerySystemUserDTO> pageWrap) {
+        return ApiResponse.success(systemUserService.findPage(pageWrap));
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemDictController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemDictController.java
new file mode 100644
index 0000000..57c8f99
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemDictController.java
@@ -0,0 +1,83 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDictBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.QuerySystemDictDTO;
+import com.doumee.dao.system.model.SystemDict;
+import com.doumee.dao.system.vo.SystemDictListVO;
+import com.doumee.service.system.SystemDictService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺瀛楀吀")
+@RestController
+@RequestMapping("/cloudService/system/dict")
+public class SystemDictController extends BaseController {
+
+    @Autowired
+    private SystemDictService systemDictService;
+
+    @Autowired
+    private SystemDictBiz systemDictBiz;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:dict:create")
+    public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated(OperaType.Create.class) @RequestBody SystemDict systemDict) {
+        return ApiResponse.success(systemDictBiz.create(systemDict));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:dict:delete")
+    public ApiResponse deleteById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@PathVariable Integer id) {
+        systemDictService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:dict:delete")
+    public ApiResponse deleteByIdInBatch(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemDictService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemDict systemDict) {
+        systemDictBiz.updateById(systemDict);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:dict:query")
+    public ApiResponse<PageData<SystemDictListVO>> findPage (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestBody PageWrap<QuerySystemDictDTO> pageWrap) {
+        return ApiResponse.success(systemDictService.findPage(pageWrap));
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemDictDataController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemDictDataController.java
new file mode 100644
index 0000000..9adc371
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemDictDataController.java
@@ -0,0 +1,98 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.QuerySystemDictDataDTO;
+import com.doumee.dao.system.model.SystemDictData;
+import com.doumee.dao.system.vo.SystemDictDataListVO;
+import com.doumee.service.system.SystemDictDataService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "瀛楀吀鏁版嵁")
+@RestController
+@RequestMapping("/cloudService/system/dictData")
+public class SystemDictDataController extends BaseController {
+
+    @Autowired
+    private SystemDictDataService systemDictDataService;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated(OperaType.Create.class) @RequestBody SystemDictData systemDictData) {
+        return ApiResponse.success(systemDictDataBiz.create(systemDictData));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse deleteById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@PathVariable Integer id) {
+        systemDictDataService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:dict:delete")
+    public ApiResponse deleteByIdInBatch(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemDictDataService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemDictData systemDictData) {
+        systemDictDataBiz.updateById(systemDictData);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse<PageData<SystemDictDataListVO>> findPage (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestBody PageWrap<QuerySystemDictDataDTO> pageWrap) {
+        return ApiResponse.success(systemDictDataService.findPage(pageWrap));
+    }
+
+
+    @ApiOperation(value = "鏌ヨ瀛楀吀鍊兼暟鎹�" )
+    @GetMapping("/getSystemDictData")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "label", value = "鏁版嵁瀛楀吀鍊糎5_LINK_ADDR", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "dictCode", value = "绯荤粺瀛楀吀鍊糞YSTEM", required = true)
+    })
+    public ApiResponse<SystemDictData> getSystemDictData(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String dictCode, @RequestParam String label) {
+        return ApiResponse.success(systemDictDataBiz.queryByCode(dictCode,label));
+    }
+
+
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemLoginLogController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemLoginLogController.java
new file mode 100644
index 0000000..b84ba28
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemLoginLogController.java
@@ -0,0 +1,47 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.QuerySystemLoginLogDTO;
+import com.doumee.dao.system.model.SystemLoginLog;
+import com.doumee.service.system.SystemLoginLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@RestController
+@RequestMapping("/cloudService/system/loginLog")
+@Api(tags = "鐧诲綍鏃ュ織")
+public class SystemLoginLogController extends BaseController {
+
+    @Autowired
+    private SystemLoginLogService systemLoginLogService;
+
+    @PostMapping("/page")
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @RequiresPermissions("system:loginLog:query")
+    public ApiResponse<PageData<SystemLoginLog>> findPage (@RequestBody PageWrap<QuerySystemLoginLogDTO> pageWrap) {
+        return ApiResponse.success(systemLoginLogService.findPage(pageWrap));
+    }
+
+    @PostMapping("/exportExcel")
+    @ApiOperation("瀵煎嚭Excel")
+    @RequiresPermissions("system:loginLog:query")
+    public void export (@RequestBody PageWrap<QuerySystemLoginLogDTO> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SystemLoginLog.class).export(systemLoginLogService.findPage(pageWrap).getRecords(), "鐧诲綍鏃ュ織", response);
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemMenuController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemMenuController.java
new file mode 100644
index 0000000..538915f
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemMenuController.java
@@ -0,0 +1,101 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemMenuBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.UpdateSystemMenuSortDTO;
+import com.doumee.dao.system.model.SystemMenu;
+import com.doumee.dao.system.vo.SystemMenuListVO;
+import com.doumee.dao.system.vo.SystemMenuNodeVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺鑿滃崟")
+@RestController
+@RequestMapping("/cloudService/system/menu")
+public class SystemMenuController extends BaseController {
+
+    @Autowired
+    private SystemMenuBiz systemMenuBiz;
+
+    @ApiOperation("鑿滃崟鎺掑簭")
+    @PostMapping("/updateSort")
+    @RequiresPermissions("system:menu:sort")
+    public ApiResponse updateSort (@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated @RequestBody UpdateSystemMenuSortDTO dto) {
+        systemMenuBiz.updateSort(dto);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ鑿滃崟鏍�")
+    @GetMapping("/treeNodes")
+    public ApiResponse<List<SystemMenuNodeVO>> getTreeMenu (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(systemMenuBiz.findTree(this.getLoginUser().getId()));
+    }
+
+    @ApiOperation("鏌ヨ鍒楄〃鏍�")
+    @PostMapping("/treeList")
+    @RequiresPermissions("system:menu:query")
+    public ApiResponse<List<SystemMenuListVO>> findTree (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(systemMenuBiz.findTree());
+    }
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:menu:create")
+    public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Create.class) @RequestBody SystemMenu systemMenu) {
+        return ApiResponse.success(systemMenuBiz.create(systemMenu));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:menu:delete")
+    public ApiResponse deleteById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@PathVariable Integer id) {
+        systemMenuBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:menu:delete")
+    public ApiResponse deleteByIdInBatch(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemMenuBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:menu:update")
+    public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemMenu systemMenu) {
+        systemMenuBiz.updateById(systemMenu);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼鑿滃崟鐘舵��")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("system:menu:update")
+    public ApiResponse updateStatus(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.UpdateStatus.class) @RequestBody SystemMenu systemMenu) {
+        systemMenuBiz.updateById(systemMenu);
+        return ApiResponse.success(null);
+    }
+
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemMonitorController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemMonitorController.java
new file mode 100644
index 0000000..14c123d
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemMonitorController.java
@@ -0,0 +1,33 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.Monitor;
+import com.doumee.core.utils.Utils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺鐩戝惉")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/cloudService/system/monitor")
+public class SystemMonitorController extends BaseController {
+
+    @ApiOperation("鑾峰彇绯荤粺淇℃伅")
+    @GetMapping("/getSystemInfo")
+    @RequiresPermissions("system:monitor:query")
+    public ApiResponse<Monitor> getSystemInfo (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(Utils.Monitor.current());
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemPermissionController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemPermissionController.java
new file mode 100644
index 0000000..341f835
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemPermissionController.java
@@ -0,0 +1,92 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemPermissionBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.QuerySystemPermissionDTO;
+import com.doumee.dao.system.model.SystemPermission;
+import com.doumee.dao.system.vo.SystemPermissionListVO;
+import com.doumee.service.system.SystemPermissionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺鏉冮檺")
+@RestController
+@RequestMapping("/cloudService/system/permission")
+public class SystemPermissionController extends BaseController {
+
+    @Autowired
+    private SystemPermissionService systemPermissionService;
+
+    @Autowired
+    private SystemPermissionBiz systemPermissionBiz;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:permission:create")
+    public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated(OperaType.Create.class) @RequestBody SystemPermission systemPermission) {
+        return ApiResponse.success(systemPermissionBiz.create(systemPermission));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:permission:delete")
+    public ApiResponse deleteById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@PathVariable Integer id) {
+        systemPermissionBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:permission:delete")
+    public ApiResponse deleteByIdInBatch(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemPermissionBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:permission:update")
+    public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemPermission systemPermission) {
+        systemPermissionBiz.updateById(systemPermission);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:permission:query")
+    public ApiResponse<PageData<SystemPermissionListVO>> findPage (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestBody PageWrap<QuerySystemPermissionDTO> pageWrap) {
+        return ApiResponse.success(systemPermissionService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏌ヨ鎵�鏈�")
+    @GetMapping("/all")
+    @RequiresPermissions("system:permission:query")
+    public ApiResponse<List<SystemPermission>> findAll (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        SystemPermission systemPermission = new SystemPermission();
+        systemPermission.setDeleted(Boolean.FALSE);
+        return ApiResponse.success(systemPermissionService.findList(systemPermission));
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemPositionController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemPositionController.java
new file mode 100644
index 0000000..c79f312
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemPositionController.java
@@ -0,0 +1,106 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemPositionBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.QuerySystemUserDTO;
+import com.doumee.dao.system.model.SystemPosition;
+import com.doumee.dao.system.vo.SystemPositionListVO;
+import com.doumee.dao.system.vo.SystemUserListVO;
+import com.doumee.service.system.SystemPositionService;
+import com.doumee.service.system.SystemUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * 宀椾綅鎺ュ彛
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "宀椾綅")
+@RestController
+@RequestMapping("/cloudService/system/position")
+public class SystemPositionController extends BaseController {
+
+    @Autowired
+    private SystemPositionService systemPositionService;
+
+    @Autowired
+    private SystemPositionBiz systemPositionBiz;
+
+    @Autowired
+    private SystemUserService systemUserService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:position:create")
+    public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated(OperaType.Create.class) @RequestBody SystemPosition systemPosition) {
+        return ApiResponse.success(systemPositionBiz.create(systemPosition));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:position:delete")
+    public ApiResponse deleteById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@PathVariable Integer id) {
+        systemPositionBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:position:delete")
+    public ApiResponse deleteByIdInBatch(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemPositionBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:position:update")
+    public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemPosition systemPosition) {
+        systemPositionBiz.updateById(systemPosition);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ宀椾綅鏍戝垪琛�")
+    @PostMapping("/tree")
+    @RequiresPermissions("system:position:query")
+    public ApiResponse<List<SystemPositionListVO>> findTree (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(systemPositionBiz.findTree());
+    }
+
+    @ApiOperation("鏌ヨ宀椾綅鍒楄〃")
+    @PostMapping("/all")
+    @RequiresPermissions("system:position:query")
+    public ApiResponse<List<SystemPosition>> findList (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        SystemPosition systemPosition = new SystemPosition();
+        systemPosition.setDeleted(Boolean.FALSE);
+        return ApiResponse.success(systemPositionService.findList(systemPosition));
+    }
+
+    @Trace(exclude = true)
+    @ApiOperation("鏌ヨ宀椾綅浜哄憳")
+    @PostMapping("/users")
+    @RequiresPermissions("system:position:queryUsers")
+    public ApiResponse<PageData<SystemUserListVO>> findPage (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestBody PageWrap<QuerySystemUserDTO> pageWrap) {
+        return ApiResponse.success(systemUserService.findPage(pageWrap));
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemRoleController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemRoleController.java
new file mode 100644
index 0000000..9a89915
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemRoleController.java
@@ -0,0 +1,111 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemRoleBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.CreateRoleMenuDTO;
+import com.doumee.dao.system.dto.CreateRolePermissionDTO;
+import com.doumee.dao.system.dto.QuerySystemRoleDTO;
+import com.doumee.dao.system.model.SystemRole;
+import com.doumee.dao.system.vo.SystemRoleListVO;
+import com.doumee.service.system.SystemRoleService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺瑙掕壊")
+@RestController
+@RequestMapping("/cloudService/system/role")
+public class SystemRoleController extends BaseController {
+
+    @Autowired
+    private SystemRoleService systemRoleService;
+
+    @Autowired
+    private SystemRoleBiz systemRoleBiz;
+
+    @PreventRepeat
+    @ApiOperation("閰嶇疆瑙掕壊鑿滃崟")
+    @PostMapping("/createRoleMenu")
+    @RequiresPermissions("system:role:createRoleMenu")
+    public ApiResponse createRoleMenu (@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated @RequestBody CreateRoleMenuDTO dto) {
+        systemRoleBiz.createRoleMenu(dto);
+        return ApiResponse.success(null);
+    }
+
+    @PreventRepeat
+    @ApiOperation("閰嶇疆瑙掕壊鏉冮檺")
+    @PostMapping("/createRolePermission")
+    @RequiresPermissions("system:role:createRolePermission")
+    public ApiResponse createRolePermission (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated @RequestBody CreateRolePermissionDTO dto) {
+        systemRoleBiz.createRolePermission(dto);
+        return ApiResponse.success(null);
+    }
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:role:create")
+    public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Create.class) @RequestBody SystemRole systemRole) {
+        return ApiResponse.success(systemRoleBiz.create(systemRole));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:role:delete")
+    public ApiResponse deleteById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@PathVariable Integer id) {
+        systemRoleBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:role:delete")
+    public ApiResponse deleteByIdInBatch(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemRoleBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:role:update")
+    public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemRole systemRole) {
+        systemRoleBiz.updateById(systemRole);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:role:query")
+    public ApiResponse<PageData<SystemRoleListVO>> findPage (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestBody PageWrap<QuerySystemRoleDTO> pageWrap) {
+        return ApiResponse.success(systemRoleService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏌ヨ鎵�鏈�")
+    @GetMapping("/all")
+    @RequiresPermissions("system:role:query")
+    public ApiResponse<List<SystemRole>> findAll (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        SystemRole systemRole = new SystemRole();
+        systemRole.setDeleted(Boolean.FALSE);
+        return ApiResponse.success(systemRoleService.findList(systemRole));
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemTraceLogController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemTraceLogController.java
new file mode 100644
index 0000000..3931748
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemTraceLogController.java
@@ -0,0 +1,46 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.QuerySystemTraceLogDTO;
+import com.doumee.dao.system.model.SystemTraceLog;
+import com.doumee.service.system.SystemTraceLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "璺熻釜鏃ュ織")
+@RestController
+@RequestMapping("/cloudService/system/traceLog")
+public class SystemTraceLogController extends BaseController {
+
+    @Autowired
+    private SystemTraceLogService systemTraceLogService;
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:traceLog:query")
+    public ApiResponse findPage (@RequestBody PageWrap<QuerySystemTraceLogDTO> pageWrap) {
+        return ApiResponse.success(systemTraceLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("system:traceLog:query")
+    public void exportExcel (@RequestBody PageWrap<QuerySystemTraceLogDTO> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SystemTraceLog.class).export(systemTraceLogService.findPage(pageWrap).getRecords(), "鎿嶄綔鏃ュ織", response);
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/api/cloud/SystemUserController.java b/server/system_service/src/main/java/com/doumee/api/cloud/SystemUserController.java
new file mode 100644
index 0000000..55d2c71
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/api/cloud/SystemUserController.java
@@ -0,0 +1,140 @@
+package com.doumee.api.cloud;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemUserBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.CreateSystemUserDTO;
+import com.doumee.dao.system.dto.CreateUserRoleDTO;
+import com.doumee.dao.system.dto.QuerySystemUserDTO;
+import com.doumee.dao.system.dto.ResetSystemUserPwdDTO;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.dao.system.vo.SystemUserListVO;
+import com.doumee.service.system.SystemUserService;
+import io.swagger.annotations.*;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "鐢ㄦ埛")
+@RestController
+@RequestMapping("/cloudService/system/user")
+public class SystemUserController extends BaseController {
+
+    @Autowired
+    private SystemUserService systemUserService;
+
+    @Autowired
+    private SystemUserBiz systemUserBiz;
+
+    @PreventRepeat
+    @ApiOperation("閰嶇疆鐢ㄦ埛瑙掕壊")
+    @PostMapping("/createUserRole")
+    @RequiresPermissions("system:user:createUserRole")
+    public ApiResponse createUserRole (@Validated @RequestBody CreateUserRoleDTO dto) {
+        systemUserBiz.createUserRole(dto);
+        return ApiResponse.success(null);
+    }
+
+    @Trace(withRequestParameters = false)
+    @PreventRepeat
+    @ApiOperation("閲嶇疆鐢ㄦ埛瀵嗙爜")
+    @PostMapping("/resetPwd")
+    @RequiresPermissions("system:user:resetPwd")
+    public ApiResponse resetPwd (@Validated @RequestBody ResetSystemUserPwdDTO dto) {
+        dto.setOperaUserId(this.getLoginUser().getId());
+        systemUserBiz.resetPwd(dto);
+        return ApiResponse.success(null);
+    }
+
+    @Trace(withRequestParameters = false)
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:user:create")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody CreateSystemUserDTO systemUser) {
+        systemUser.setCreateUser(this.getLoginUser().getId());
+        systemUserBiz.create(systemUser);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:user:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemUserBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:user:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemUserBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @Trace(withRequestParameters = false)
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:user:update")
+    public ApiResponse updateById( @RequestBody CreateSystemUserDTO systemUser) {
+        systemUser.setUpdateUser(this.getLoginUser().getId());
+        systemUserBiz.updateById(systemUser);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:user:query")
+    public ApiResponse<PageData<SystemUserListVO>> findPage (@RequestBody PageWrap<QuerySystemUserDTO> pageWrap) {
+        return ApiResponse.success(systemUserService.findPage(pageWrap));
+    }
+
+
+
+
+
+    @ApiOperation("鏌ヨ鎵�鏈夌郴缁熺敤鎴�")
+    @PostMapping("/findAllList")
+    @RequiresPermissions("system:user:query")
+    public ApiResponse<List<SystemUser>> findAllList (@RequestBody SystemUser pageWrap) {
+        return ApiResponse.success(systemUserService.findAllList(pageWrap));
+    }
+
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("system:user:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(systemUserService.findById(id));
+    }
+
+    @ApiOperation("鐢ㄦ埛瀵煎叆")
+    @PostMapping("/importSystemUserBatch")
+    @RequiresPermissions("system:user:query")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
+    })
+    public ApiResponse importSystemUserBatch(@ApiParam(value = "file") MultipartFile file){
+        return ApiResponse.success(systemUserBiz.importSystemUserBatch(file));
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
index 6b87b55..eeeea19 100644
--- a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
+++ b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -132,7 +132,7 @@
         }
         String pwd = Utils.Secure.encryptPassword(new String(dto.getPassword()), user.getSalt());
         // 姣旇緝瀵嗙爜
-        if( StringUtils.equals(pwd, user.getPassword())){
+        if( !StringUtils.equals(pwd, user.getPassword())){
             throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
         }
         // 鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅

--
Gitblit v1.9.3