From 685544755bb848e8a8c292b5800030796c2c85f7 Mon Sep 17 00:00:00 2001
From: Raod <1130305001@qq.com>
Date: Fri, 23 Jul 2021 14:22:02 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../gaea/business/code/ResponseCode.java      | 18 ++++-
 .../controller/AccessUserController.java      | 13 +++-
 .../controller/dto/AccessUserDto.java         |  7 +-
 .../controller/dto/UpdatePasswordDto.java     | 25 +++++++
 .../accessuser/service/AccessUserService.java | 10 ++-
 .../service/impl/AccessUserServiceImpl.java   | 66 +++++++++++++++++-
 .../src/main/resources/bootstrap-dev.yml      |  4 ++
 .../resources/i18n/messages_en_US.properties  |  3 +
 .../resources/i18n/messages_zh_CN.properties  |  3 +
 report-ui/config/dev.env.js                   |  4 +-
 report-ui/src/api/login.js                    | 14 ++--
 report-ui/src/views/accessUser/index.vue      | 28 ++++----
 .../src/views/layout/components/Navbar.vue    | 67 ++++++++++++++-----
 13 files changed, 211 insertions(+), 51 deletions(-)
 create mode 100644 report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/dto/UpdatePasswordDto.java

diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/code/ResponseCode.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/code/ResponseCode.java
index 92fb5eb2..eadf6f4c 100644
--- a/report-core/src/main/java/com/anjiplus/template/gaea/business/code/ResponseCode.java
+++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/code/ResponseCode.java
@@ -19,6 +19,23 @@ public interface ResponseCode {
      */
     String LOGIN_ERROR = "login.error";
 
+    /**
+     * 新密码不能和原密码一致
+     */
+    String USER_PASSWORD_CONFIG_PASSWORD_CANOT_EQUAL = "user.password.config.password.canot.equal";
+
+    /**
+     * 密码和确认密码不一致
+     */
+    String USER_INCONSISTENT_PASSWORD_ERROR = "user.inconsistent.password.error";
+
+    /**
+     * 旧密码不正确
+     */
+    String USER_OLD_PASSWORD_ERROR = "user.old.password.error";
+
+
+
     /**
      * 用户token过期
      */
@@ -84,7 +101,6 @@ public interface ResponseCode {
     String COMPONENT_NOT_LOAD = "Component.load.check.error";
 
     String AUTH_PASSWORD_NOTSAME = "1001";
-    String USER_PASSWORD_CONFIG_PASSWORD_CANOT_EQUAL = "1002";
     String OLD_PASSWORD_ERROR = "1003";
     String USER_ONTEXIST_ORGINFO = "1004";
     String USER_ONTEXIST_ROLEINFO = "1005";
diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/AccessUserController.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/AccessUserController.java
index 49d53664..4db42aa2 100755
--- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/AccessUserController.java
+++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/AccessUserController.java
@@ -7,6 +7,7 @@ import com.anji.plus.gaea.curd.controller.GaeaBaseController;
 import com.anji.plus.gaea.curd.service.GaeaBaseService;
 import com.anji.plus.gaea.holder.UserContentHolder;
 import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto;
+import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto;
 import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
 import com.anjiplus.template.gaea.business.modules.accessuser.service.AccessUserService;
 import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
@@ -99,4 +100,14 @@ public class AccessUserController extends GaeaBaseController<AccessUserParam, Ac
         return responseSuccessWithData(accessUserService.login(dto));
     }
 
-}
\ No newline at end of file
+    /**
+     * 修改自己的密码
+     * @param dto
+     * @return
+     */
+    @PostMapping("/updatePassword")
+    public ResponseBean updatePassword(@RequestBody UpdatePasswordDto dto) {
+        return responseSuccessWithData(accessUserService.updatePassword(dto));
+    }
+
+}
diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/dto/AccessUserDto.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/dto/AccessUserDto.java
index 0a696679..11d1fb95 100755
--- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/dto/AccessUserDto.java
+++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/dto/AccessUserDto.java
@@ -27,11 +27,6 @@ public class AccessUserDto extends GaeaBaseDTO implements Serializable {
     @NotEmpty(message = "6002")
     private String loginName;
 
-    /** 密码 */
-    @ApiModelProperty(value = "密码")
-    @NotEmpty(message = "6002")
-    private String password;
-
     /** 真实用户 */
     @ApiModelProperty(value = "真实用户")
     @NotEmpty(message = "6002")
@@ -68,4 +63,4 @@ public class AccessUserDto extends GaeaBaseDTO implements Serializable {
 
     /** 用户勾选的角色 */
     private List<String> roleCodeList;
-}
\ No newline at end of file
+}
diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/dto/UpdatePasswordDto.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/dto/UpdatePasswordDto.java
new file mode 100644
index 00000000..daf84175
--- /dev/null
+++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/controller/dto/UpdatePasswordDto.java
@@ -0,0 +1,25 @@
+package com.anjiplus.template.gaea.business.modules.accessuser.controller.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+@ApiModel(value = "修改密码")
+@Data
+public class UpdatePasswordDto {
+
+    @ApiModelProperty(value = "旧密码密码")
+    @NotBlank
+    private String oldPassword;
+
+    @ApiModelProperty(value = "密码")
+    @NotBlank
+    private String password;
+
+    @ApiModelProperty(value = "密码")
+    @NotBlank
+    private String confirmPassword;
+}
diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/AccessUserService.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/AccessUserService.java
index 3a1bbb96..900cee3a 100755
--- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/AccessUserService.java
+++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/AccessUserService.java
@@ -3,6 +3,7 @@ package com.anjiplus.template.gaea.business.modules.accessuser.service;
 
 import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
 import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto;
+import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto;
 import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
 import com.anjiplus.template.gaea.business.modules.accessuser.controller.param.AccessUserParam;
 import com.anji.plus.gaea.curd.service.GaeaBaseService;
@@ -41,4 +42,11 @@ public interface AccessUserService extends GaeaBaseService<AccessUserParam, Acce
      * @return
      */
     GaeaUserDto login(GaeaUserDto gaeaUserDto);
-}
\ No newline at end of file
+
+    /**
+     * 修改密码
+     * @param dto
+     * @return
+     */
+    Boolean updatePassword(UpdatePasswordDto dto);
+}
diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/impl/AccessUserServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/impl/AccessUserServiceImpl.java
index 1874b44e..444ec39a 100755
--- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/impl/AccessUserServiceImpl.java
+++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/impl/AccessUserServiceImpl.java
@@ -4,9 +4,11 @@ package com.anjiplus.template.gaea.business.modules.accessuser.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.anji.plus.gaea.bean.TreeNode;
 import com.anji.plus.gaea.cache.CacheHelper;
+import com.anji.plus.gaea.constant.BaseOperationEnum;
+import com.anji.plus.gaea.exception.BusinessException;
 import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
-import com.anji.plus.gaea.utils.GaeaBeanUtils;
 import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
+import com.anji.plus.gaea.holder.UserContentHolder;
 import com.anji.plus.gaea.utils.GaeaUtils;
 import com.anji.plus.gaea.utils.JwtBean;
 import com.anjiplus.template.gaea.business.code.ResponseCode;
@@ -15,6 +17,7 @@ import com.anjiplus.template.gaea.business.modules.accessrole.dao.AccessRoleMapp
 import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
 import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
 import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto;
+import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto;
 import com.anjiplus.template.gaea.business.modules.accessuser.dao.AccessUserRoleMapper;
 import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
 import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUserRole;
@@ -23,9 +26,9 @@ import com.anjiplus.template.gaea.business.modules.accessuser.dao.AccessUserMapp
 import com.anjiplus.template.gaea.business.util.MD5Util;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.google.common.collect.Maps;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -51,6 +54,9 @@ public class AccessUserServiceImpl implements AccessUserService {
     @Autowired
     private AccessUserRoleMapper accessUserRoleMapper;
 
+    @Value("${customer.user.default.password:'123456'}")
+    private String defaultPassword;
+
     @Override
     public GaeaBaseMapper<AccessUser> getMapper() {
       return accessUserMapper;
@@ -172,4 +178,60 @@ public class AccessUserServiceImpl implements AccessUserService {
 
         return gaeaUser;
     }
+
+    /**
+     * 修改密码
+     *
+     * @param dto
+     * @return
+     */
+    @Override
+    public Boolean updatePassword(UpdatePasswordDto dto) {
+        if (!dto.getConfirmPassword().equals(dto.getPassword())) {
+            //密码和确认密码不一致
+            throw BusinessExceptionBuilder.build(ResponseCode.USER_INCONSISTENT_PASSWORD_ERROR);
+        }
+        //新密码不能与老密码一样
+        if(StringUtils.equals(dto.getOldPassword(), dto.getPassword())){
+            throw BusinessExceptionBuilder.build(ResponseCode.USER_PASSWORD_CONFIG_PASSWORD_CANOT_EQUAL);
+        }
+
+        String username = UserContentHolder.getUsername();
+
+
+        LambdaQueryWrapper<AccessUser> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(AccessUser::getLoginName, username);
+        AccessUser accessUser = selectOne(wrapper);
+        String password = accessUser.getPassword();
+        if (!MD5Util.encrypt(dto.getOldPassword()).equals(password)) {
+            throw BusinessExceptionBuilder.build(ResponseCode.USER_OLD_PASSWORD_ERROR);
+        }
+        accessUser.setPassword(MD5Util.encrypt(dto.getPassword()));
+
+        accessUserMapper.updateById(accessUser);
+        return true;
+    }
+
+    /**
+     * 操作前处理
+     *
+     * @param entity        前端传递的对象
+     * @param operationEnum 操作类型
+     * @throws BusinessException 阻止程序继续执行或回滚事务
+     */
+    @Override
+    public void processBeforeOperation(AccessUser entity, BaseOperationEnum operationEnum) throws BusinessException {
+        //过滤密码
+        switch (operationEnum) {
+            case INSERT:
+                //gaea是为了和前端加密保持一致
+                entity.setPassword(MD5Util.encrypt(MD5Util.encrypt(defaultPassword.concat("gaea"))));
+                break;
+            case UPDATE:
+                //更新用户不允许修改密码
+                entity.setPassword(null);
+                break;
+        }
+
+    }
 }
diff --git a/report-core/src/main/resources/bootstrap-dev.yml b/report-core/src/main/resources/bootstrap-dev.yml
index 1272340c..b9ccfea2 100644
--- a/report-core/src/main/resources/bootstrap-dev.yml
+++ b/report-core/src/main/resources/bootstrap-dev.yml
@@ -77,3 +77,7 @@ file:
 customer:
   # 跳过token验证和权限验证的url清单
   skip-authenticate-urls: /gaeaDict/all, /login, /static, /file/download/, /index.html
+  user:
+    ##新增用户默认密码
+    default:
+      password: 123456
diff --git a/report-core/src/main/resources/i18n/messages_en_US.properties b/report-core/src/main/resources/i18n/messages_en_US.properties
index c2a9cedf..e0ac3965 100644
--- a/report-core/src/main/resources/i18n/messages_en_US.properties
+++ b/report-core/src/main/resources/i18n/messages_en_US.properties
@@ -2,6 +2,9 @@
 200=success
 
 User.password.error=Password error
+user.password.config.password.canot.equal=user password config password canot equal
+user.inconsistent.password.error=user inconsistent password error
+user.old.password.error=user old password error
 
 1013=The code does not allow duplication
 2001=File names are not allowed to be empty
diff --git a/report-core/src/main/resources/i18n/messages_zh_CN.properties b/report-core/src/main/resources/i18n/messages_zh_CN.properties
index e68da4df..36ac0a42 100644
--- a/report-core/src/main/resources/i18n/messages_zh_CN.properties
+++ b/report-core/src/main/resources/i18n/messages_zh_CN.properties
@@ -2,6 +2,9 @@
 200=\u64CD\u4F5C\u6210\u529F
 
 User.password.error=\u5BC6\u7801\u4E0D\u6B63\u786E
+user.password.config.password.canot.equal=\u65B0\u5BC6\u7801\u4E0D\u80FD\u548C\u539F\u5BC6\u7801\u4E00\u81F4
+user.inconsistent.password.error=\u5BC6\u7801\u548C\u786E\u8BA4\u5BC6\u7801\u4E0D\u4E00\u81F4
+user.old.password.error=\u65E7\u5BC6\u7801\u4E0D\u6B63\u786E
 1013=\u7F16\u7801\u4E0D\u5141\u8BB8\u91CD\u590D
 2001=\u6587\u4EF6\u540D\u4E0D\u5141\u8BB8\u4E3A\u7A7A
 2002=\u6587\u4EF6\u7C7B\u578B\u4E0D\u652F\u6301
diff --git a/report-ui/config/dev.env.js b/report-ui/config/dev.env.js
index f50fc84e..ee3d90dc 100644
--- a/report-ui/config/dev.env.js
+++ b/report-ui/config/dev.env.js
@@ -4,6 +4,6 @@ const prodEnv = require('./prod.env')
 
 module.exports = merge(prodEnv, {
   NODE_ENV: '"development"',
-  // BASE_API: '"http://127.0.0.1:9095"'
-  BASE_API: '"http://10.108.26.197:9095"'
+  BASE_API: '"http://127.0.0.1:9095"'
+  // BASE_API: '"http://10.108.26.197:9095"'
 })
diff --git a/report-ui/src/api/login.js b/report-ui/src/api/login.js
index 7f4eaf5f..4d97713e 100644
--- a/report-ui/src/api/login.js
+++ b/report-ui/src/api/login.js
@@ -1,4 +1,4 @@
-import request from './axios'
+import request from '@/utils/request'
 
 export function login (data) {
   return request({
@@ -16,8 +16,10 @@ export function logout () {
 }
 
 // 登录之后   根据旧修改密码
-export const reqUpdatePassword = data => request({
-  url: '/auth-service/user/updatePassword',
-  method: 'post',
-  data: data
-})
+export function reqUpdatePassword (data) {
+  return request({
+    url: '/accessUser/updatePassword',
+    method: 'post',
+    data
+  })
+}
diff --git a/report-ui/src/views/accessUser/index.vue b/report-ui/src/views/accessUser/index.vue
index aecfe41b..86baaf7f 100755
--- a/report-ui/src/views/accessUser/index.vue
+++ b/report-ui/src/views/accessUser/index.vue
@@ -126,20 +126,20 @@ export default {
             ],
             disabled: false,
           },
-          {
-            label: '密码',
-            placeholder: '',
-            field: 'password',
-            tableHide: true, // 表格中不显示
-            editHide: true,
-            editField: 'password',
-            inputType: 'input',
-            rules: [
-              // { required: true, message: '密码必填', trigger: 'blur' },
-              { min: 1, max: 128, message: '不超过128个字符', trigger: 'blur' },
-            ],
-            disabled: false,
-          },
+          // {
+          //   label: '密码',
+          //   placeholder: '',
+          //   field: 'password',
+          //   tableHide: true, // 表格中不显示
+          //   editHide: true,
+          //   editField: 'password',
+          //   inputType: 'input',
+          //   rules: [
+          //     // { required: true, message: '密码必填', trigger: 'blur' },
+          //     { min: 1, max: 128, message: '不超过128个字符', trigger: 'blur' },
+          //   ],
+          //   disabled: false,
+          // },
           {
             label: '手机号码',
             placeholder: '',
diff --git a/report-ui/src/views/layout/components/Navbar.vue b/report-ui/src/views/layout/components/Navbar.vue
index 37182b69..68fb26f2 100644
--- a/report-ui/src/views/layout/components/Navbar.vue
+++ b/report-ui/src/views/layout/components/Navbar.vue
@@ -15,6 +15,10 @@
         </div>
         <el-dropdown-menu slot="dropdown"
                           class="user-dropdown">
+          <el-dropdown-item divided>
+            <span style="display:block;"
+                  @click="updatePassword">修改密码</span>
+          </el-dropdown-item>
           <el-dropdown-item divided>
             <span style="display:block;"
                   @click="logout">注销登录</span>
@@ -22,6 +26,32 @@
         </el-dropdown-menu>
       </el-dropdown>
     </el-menu>
+    <!-- 修改密码弹框 -->
+    <el-dialog
+      title="修改密码"
+      :visible.sync="wordVisible"
+      width="40%"
+      :close-on-click-modal='false'
+      top="20vh"
+      class="password-box"
+    >
+      <el-form ref="form" :model="form" label-width="100px" :rules="rules" :close-on-click-modal="false">
+        <el-form-item label="原密码" prop="oldPassword">
+          <el-input v-model.trim="form.oldPassword" type="password" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="新密码" prop="password">
+          <el-input v-model.trim="form.password" type="password" autocomplete="off"></el-input>
+          <!-- <span class="password-tips"><i class="el-icon-warning-outline"> 密码至少8位,切包含大写、小写字母、数字、特殊字符中的3种</i></span> -->
+        </el-form-item>
+        <el-form-item label="确认新密码" prop="confirmPassword">
+          <el-input v-model.trim="form.confirmPassword" type="password" autocomplete="off"></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+      <el-button @click="wordVisible = false">取 消</el-button>
+      <el-button type="primary" @click="confrimUpdate">确 定</el-button>
+    </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -30,8 +60,8 @@ import { mapGetters } from 'vuex'
 import Breadcrumb from '@/components/Breadcrumb'
 import Hamburger from '@/components/Hamburger'
 import { getStorageItem } from '@/utils/storage'
-import { aesEncrypt } from '@/utils/aes'
 import { reqUpdatePassword } from '@/api/login'
+import { transPsw } from '@/utils/encrypted'
 
 export default {
   data () {
@@ -41,17 +71,19 @@ export default {
         callback(new Error('请再次输入密码'))
       } else if (value !== this.form.password) {
         callback(new Error('两次输入密码不一致!'))
+      } else if (value.length < 6 || value.length > 20) {
+        callback(new Error('密码长度需要再6-20之间!'));
       } else {
-        callback()
+        callback();
       }
     }
-    // const validatePass = (rule, value, callback) => {
-    // 	if (!/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{6,}$/.test(value)) {
-    // 		callback(new Error('请按要求输入密码'))
-    // 	} else {
-    // 		callback()
-    // 	}
-    // };
+    const validatePass = (rule, value, callback) => {
+    	if (!/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{6,}$/.test(value)) {
+    		callback(new Error('请按要求输入密码'))
+    	} else {
+    		callback()
+    	}
+    };
     const validateOldPass = (rule, value, callback) => {
       if (value.length < 6 || value.length > 30) {
         callback(new Error('请输入原密码'))
@@ -111,23 +143,22 @@ export default {
     },
     // 发送请求 确认修改
     confrimUpdate () {
-      this.$refs.form.validate((valid) => {
+      this.$refs.form.validate(async (valid) => {
         if (valid) {
-          const { oldPassword, password, confirmPassword } = this.form
+          const {oldPassword, password, confirmPassword} = this.form
           let data = {
-            oldPassword: aesEncrypt(oldPassword),
-            password: aesEncrypt(password),
-            confirmPassword: aesEncrypt(confirmPassword),
+            oldPassword: transPsw(oldPassword),
+            password: transPsw(password),
+            confirmPassword: transPsw(confirmPassword),
           }
-          reqUpdatePassword(data).then((res) => {
-            if (res.repCode == '0000') {
+
+          const { code } = await reqUpdatePassword(data);
+          if (code != '200') return
               this.wordVisible = false
               this.$message.success('修改密码成功,请重新登录')
               sessionStorage.clear()
               localStorage.clear()
               this.$router.push('/login')
-            }
-          })
         } else {
           return false
         }