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">
-
+
-
@@ -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