From 4f7945b4e06215ededb18c44220fe7c7677c7d43 Mon Sep 17 00:00:00 2001 From: "udf_admin@163.com" Date: Tue, 5 May 2020 12:10:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/App.vue | 97 +++++++++++--- admin/src/api/file.js | 4 + admin/src/api/rbac.js | 1 + admin/src/components/userCenter.vue | 120 ++++++++++++++++++ .../udf/api/rbac/service/RbacService.java | 6 +- .../udf/api/rbac/service/UserService.java | 23 +++- .../itkk/udf/api/rbac/web/UserController.java | 2 +- .../src/main/resources/rbac/api.properties | 8 ++ .../resources/rbac/role-public.properties | 2 +- .../main/resources/application-dev.properties | 8 +- .../resources/application-prod.properties | 8 +- 11 files changed, 245 insertions(+), 34 deletions(-) create mode 100644 admin/src/api/file.js create mode 100644 admin/src/components/userCenter.vue diff --git a/admin/src/App.vue b/admin/src/App.vue index 1f21fb8..57ddd41 100644 --- a/admin/src/App.vue +++ b/admin/src/App.vue @@ -52,7 +52,7 @@
- + {{userDto.nickName}} @@ -60,14 +60,15 @@ - 个人中心 + 个人中心 退出登录
- + @@ -109,9 +110,9 @@ :show-close="false" :visible.sync="leftMenuDrawerShow" direction="ltr"> -
+
-
+
功能菜单 @@ -120,6 +121,23 @@
+ +
+ +
+ + 个人中心 + +
+ +
+
+
@@ -128,10 +146,12 @@ import api_rbac from "./api/rbac"; import glob from "./assets/js/glob"; import leftMenu from "./components/leftMenu"; + import userCenter from "./components/userCenter"; export default { name: 'App', components: { + userCenter, leftMenu }, data() { @@ -186,7 +206,8 @@ menu: [], elAsideShow: true, leftMenuDrawerShow: false, - leftMenuDrawerStyle: {} + drawerStyle: {}, + rightUserCenterDrawerShow: false } }, mounted() { @@ -208,7 +229,6 @@ //主动调用一次resize监听 this.resizeListener(); //检查登陆 - glob glob.checkLogin(); //获得用户信息 const userDtoResponse = await api_rbac.infoByToken(glob.getToken()); @@ -238,7 +258,7 @@ this.appStyle.height = window.innerHeight + 'px'; this.mainElContainerStyle.height = window.innerHeight + 'px'; this.mainChildElContainerStyle.height = (window.innerHeight - 50) + 'px'; - this.leftMenuDrawerStyle.height = window.innerHeight + 'px'; + this.drawerStyle.height = window.innerHeight + 'px'; //设定框宽度 this.searchInputStyle.width = window.innerWidth - 200 - 10 + 'px'; //判断是否显示菜单栏 @@ -257,9 +277,16 @@ const loading = this.$loading({lock: true, text: '操作中'}); api_rbac.logout().then(response => window.location.href = '/').finally(() => loading.close()); }, + //个人中心按钮点击事件 + userCenterBtnClick() { + this.rightUserCenterDrawerShow = true; + this.$nextTick(() => { + this.$refs.userCenter.init(); + }); + }, //菜单按钮点击 mainMenuBtnClick() { - this.leftMenuDrawerShow = !this.leftMenuDrawerShow; + this.leftMenuDrawerShow = true; } } } @@ -268,6 +295,48 @@ .el-drawer { background-color: #F5F5F5; } + + .drawerHeader { + padding: 10px 20px; + text-align: left; + font-size: 20px; + + .el-divider--horizontal { + margin: 10px 0px 0px 0px; + } + } + + .top-form { + .el-form { + .el-form-item { + margin-bottom: 0px !important; + + label { + margin-bottom: 0px !important; + } + + .el-form-item__label { + padding: 0 0 0px !important; + } + + .el-button { + margin-top: 15px; + } + } + } + } + + .avatar-uploader .el-upload { + border: 1px dashed #d9d9d9; + border-radius: 6px; + cursor: pointer; + position: relative; + overflow: hidden; + } + + .avatar-uploader .el-upload:hover { + border-color: #409EFF; + } diff --git a/admin/src/api/file.js b/admin/src/api/file.js new file mode 100644 index 0000000..2b69c79 --- /dev/null +++ b/admin/src/api/file.js @@ -0,0 +1,4 @@ +const api_file = { + upload: (formData = {}) => axios.post('/private/file/upload', formData, {'Content-Type': 'multipart/form-data'}) +}; +export default api_file; diff --git a/admin/src/api/rbac.js b/admin/src/api/rbac.js index ec5b0bb..a1672b8 100644 --- a/admin/src/api/rbac.js +++ b/admin/src/api/rbac.js @@ -1,5 +1,6 @@ const api_rbac = { logout: () => axios.delete('/private/rbac/user/logout'), + save: (data = {}) => axios.put('/private/rbac/user/save', data), infoByToken: (token = '') => axios.get('/private/rbac/user/info/by/token/' + token), menu: () => axios.get('/private/rbac/menu') }; diff --git a/admin/src/components/userCenter.vue b/admin/src/components/userCenter.vue new file mode 100644 index 0000000..0c8af24 --- /dev/null +++ b/admin/src/components/userCenter.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/service/RbacService.java b/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/service/RbacService.java index 12735f9..4567ef0 100644 --- a/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/service/RbacService.java +++ b/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/service/RbacService.java @@ -207,15 +207,15 @@ public class RbacService { //判断 if (MapUtils.isEmpty(api)) { log.warn("该用户无任何权限 : traceId -> {} , userId -> {} , URI -> {} , METHOD -> {}", CoreUtil.getTraceId(), userId, uri, method); - throw new ParameterValidException("无权限访问此接口"); + throw new ParameterValidException("无请求权限"); } if (!api.containsKey(uri)) { log.warn("无URI权限 : traceId -> {} , userId -> {} , URI -> {} , METHOD -> {}", CoreUtil.getTraceId(), userId, uri, method); - throw new ParameterValidException("无权限访问此接口"); + throw new ParameterValidException("无请求权限"); } if (!api.get(uri).contains(method.toUpperCase())) { log.warn("无METHOD权限 : traceId -> {} , userId -> {} , URI -> {} , METHOD -> {}", CoreUtil.getTraceId(), userId, uri, method); - throw new ParameterValidException("无权限访问此接口"); + throw new ParameterValidException("无请求权限"); } } diff --git a/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/service/UserService.java b/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/service/UserService.java index 2fe5f01..41b9acf 100644 --- a/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/service/UserService.java +++ b/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/service/UserService.java @@ -20,6 +20,8 @@ import org.itkk.udf.starter.cache.db.service.DbCacheService; import org.itkk.udf.starter.core.CoreUtil; import org.itkk.udf.starter.core.exception.ParameterValidException; import org.itkk.udf.starter.core.id.IdWorker; +import org.itkk.udf.starter.file.db.dto.DbFileInfoDto; +import org.itkk.udf.starter.file.db.service.DbFileService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -54,6 +56,12 @@ public class UserService implements IUserService { @Autowired private DbCacheService dbCacheService; + /** + * dbFileService + */ + @Autowired + private DbFileService dbFileService; + /** * 登陆 * @@ -184,17 +192,18 @@ public class UserService implements IUserService { * 用户信息更新 * * @param userSaveDto userSaveDto + * @param token token * @param userId userId */ @Transactional - public void save(UserSaveDto userSaveDto, String userId) { + public void save(UserSaveDto userSaveDto, String token, String userId) { //获得用户信息 UserDto userDto = this.info(userSaveDto.getUserId()); //校验 if (userDto == null) { throw new ParameterValidException("用户不存在"); } - if (iUserRepository.selectCount(new QueryWrapper().lambda().eq(UserEntity::getNickName, userSaveDto.getNickName())) > 0) { + if (iUserRepository.selectCount(new QueryWrapper().lambda().ne(UserEntity::getUserId, userDto.getUserId()).eq(UserEntity::getNickName, userSaveDto.getNickName())) > 0) { throw new ParameterValidException("昵称已经存在,请重新输入"); } //定义锁 @@ -210,6 +219,9 @@ public class UserService implements IUserService { .set(UserEntity::getUpdateDate, new Date()) .eq(UserEntity::getUserId, userSaveDto.getUserId()) ); + //淘汰缓存 + final String cacheKey = "userDto_" + token; + cache.invalidate(cacheKey); } finally { //释放锁 dbCacheService.delete(key); @@ -247,6 +259,13 @@ public class UserService implements IUserService { userDto = new UserDto(); //转换 CoreUtil.copyPropertiesIgnoreNull(userEntity, userDto); + //获得头像路径 + if (StringUtils.isNotBlank(userDto.getAvatarFileId())) { + DbFileInfoDto dbFileInfoDto = dbFileService.get(userDto.getAvatarFileId()); + if (dbFileInfoDto != null) { + userDto.setAvatarFilePath("/file/" + dbFileInfoDto.getRootPathCode() + "/" + dbFileInfoDto.getPhysicalRelativePath() + "/" + dbFileInfoDto.getPhysicalFileName()); + } + } } //返回 return userDto; diff --git a/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/web/UserController.java b/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/web/UserController.java index 51dd94c..b1149ac 100644 --- a/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/web/UserController.java +++ b/udf-api/udf-api-rbac/src/main/java/org/itkk/udf/api/rbac/web/UserController.java @@ -61,7 +61,7 @@ public class UserController { */ @PutMapping("save") public RestResponse save(@RequestBody @Valid UserSaveDto userSaveDto, String userId) { - userService.save(userSaveDto, CommonUtil.getUser(httpServletRequest).getUserId()); + userService.save(userSaveDto, CommonUtil.getToken(httpServletRequest), CommonUtil.getUser(httpServletRequest).getUserId()); return RestResponse.success(); } diff --git a/udf-api/udf-api-rbac/src/main/resources/rbac/api.properties b/udf-api/udf-api-rbac/src/main/resources/rbac/api.properties index e154eca..5e68df2 100644 --- a/udf-api/udf-api-rbac/src/main/resources/rbac/api.properties +++ b/udf-api/udf-api-rbac/src/main/resources/rbac/api.properties @@ -10,3 +10,11 @@ org.itkk.udf.api.rbac.api.menu.name=\u83DC\u5355 org.itkk.udf.api.rbac.api.menu.uri=/api/udf/web/private/rbac/menu org.itkk.udf.api.rbac.api.menu.method=GET # +org.itkk.udf.api.rbac.api.fileUpload.name=\u6587\u4EF6\u4E0A\u4F20 +org.itkk.udf.api.rbac.api.fileUpload.uri=/api/udf/web/private/file/upload +org.itkk.udf.api.rbac.api.fileUpload.method=POST +# +org.itkk.udf.api.rbac.api.updateUser.name=\u66F4\u65B0\u7528\u6237\u4FE1\u606F +org.itkk.udf.api.rbac.api.updateUser.uri=/api/udf/web/private/rbac/user/save +org.itkk.udf.api.rbac.api.updateUser.method=PUT +# diff --git a/udf-api/udf-api-rbac/src/main/resources/rbac/role-public.properties b/udf-api/udf-api-rbac/src/main/resources/rbac/role-public.properties index 1673e48..fd2c8a8 100644 --- a/udf-api/udf-api-rbac/src/main/resources/rbac/role-public.properties +++ b/udf-api/udf-api-rbac/src/main/resources/rbac/role-public.properties @@ -1,3 +1,3 @@ org.itkk.udf.api.rbac.rolePublic.publicRole.name=\u516C\u5171\u89D2\u8272 -org.itkk.udf.api.rbac.rolePublic.publicRole.apis=infoByToken,logout,menu +org.itkk.udf.api.rbac.rolePublic.publicRole.apis=infoByToken,logout,menu,fileUpload,updateUser diff --git a/udf-api/udf-api-server/src/main/resources/application-dev.properties b/udf-api/udf-api-server/src/main/resources/application-dev.properties index a702529..483b6c3 100644 --- a/udf-api/udf-api-server/src/main/resources/application-dev.properties +++ b/udf-api/udf-api-server/src/main/resources/application-dev.properties @@ -10,10 +10,10 @@ logging.file.name=d:/app/application-log/${spring.application.name}_${server.por logging.file.max-size=100MB logging.file.max-history=31 # FILE DB -com.imaxus.db.file.properties.mapping.public=D:/app/file/store/pubic/ -com.imaxus.db.file.properties.mapping.temp=D:/app/file/store/temp/ -com.imaxus.db.file.properties.fileUploadSupportType=pdf,jpg,jpeg,png -com.imaxus.db.file.properties.previewSupportContentType=application/pdf,image/jpeg,image/png +org.itkk.udf.starter.db.file.properties.mapping.common=D:/app/file/common/ +org.itkk.udf.starter.db.file.properties.mapping.temp=D:/app/file/temp/ +org.itkk.udf.starter.db.file.properties.fileUploadSupportType=pdf,jpg,jpeg,png +org.itkk.udf.starter.db.file.properties.previewSupportContentType=application/pdf,image/jpeg,image/png # EXCEPTION org.itkk.udf.starter.core.properties.outputExceptionStackTrace=true # DataSource Dynamic diff --git a/udf-api/udf-api-server/src/main/resources/application-prod.properties b/udf-api/udf-api-server/src/main/resources/application-prod.properties index d310191..2dd0253 100644 --- a/udf-api/udf-api-server/src/main/resources/application-prod.properties +++ b/udf-api/udf-api-server/src/main/resources/application-prod.properties @@ -10,10 +10,10 @@ logging.file.name=/usr/local/share/app/application-log/${spring.application.name logging.file.max-size=100MB logging.file.max-history=31 # FILE DB -com.imaxus.db.file.properties.mapping.public=/usr/local/share/nginx/file/store/pubic/ -com.imaxus.db.file.properties.mapping.temp=/usr/local/share/nginx/file/store/temp/ -com.imaxus.db.file.properties.fileUploadSupportType=pdf,jpg,jpeg,png -com.imaxus.db.file.properties.previewSupportContentType=application/pdf,image/jpeg,image/png +org.itkk.udf.starter.db.file.properties.mapping.common=/usr/local/share/nginx/file/common/ +org.itkk.udf.starter.db.file.properties.mapping.temp=/usr/local/share/nginx/file/temp/ +org.itkk.udf.starter.db.file.properties.fileUploadSupportType=pdf,jpg,jpeg,png +org.itkk.udf.starter.db.file.properties.previewSupportContentType=application/pdf,image/jpeg,image/png # EXCEPTION org.itkk.udf.starter.core.properties.outputExceptionStackTrace=false # DataSource Dynamic