diff --git a/basic-app/src/main/java/ink/wgink/app/filter/AppTokenFilter.java b/basic-app/src/main/java/ink/wgink/app/filter/AppTokenFilter.java index 823fe591..44a72d92 100644 --- a/basic-app/src/main/java/ink/wgink/app/filter/AppTokenFilter.java +++ b/basic-app/src/main/java/ink/wgink/app/filter/AppTokenFilter.java @@ -41,11 +41,11 @@ public class AppTokenFilter extends GenericFilterBean implements InitializingBea /** * APP登录(用户名密码) */ - private static final String URL_LOGIN_DEFAULT = "/**/app/sign/login"; + private static final String URL_LOGIN_DEFAULT = "/**/app/sign/default"; /** * APP登录(手机验证码) */ - private static final String URL_LOGIN_PHONE = "/**/app/sign/loginphone"; + private static final String URL_LOGIN_PHONE = "/**/app/sign/phone"; /** * APP注册 */ diff --git a/basic-pojo/src/main/java/ink/wgink/pojo/result/ErrorResult.java b/basic-pojo/src/main/java/ink/wgink/pojo/result/ErrorResult.java index 939b5868..30d048f7 100644 --- a/basic-pojo/src/main/java/ink/wgink/pojo/result/ErrorResult.java +++ b/basic-pojo/src/main/java/ink/wgink/pojo/result/ErrorResult.java @@ -69,6 +69,7 @@ public class ErrorResult implements Serializable { ENCODE_ERROR(40002), DECODE_ERROR(40003), APP_DEPENDENCY_ERROR(40004), + PROPERTIES_ERROR(40005), TEXT_ILLEGAL(40101), PARAMS_ERROR(40102), QUERY_ERROR(40101), diff --git a/service-user/src/main/java/ink/wgink/service/user/controller/app/api/UserAppController.java b/service-user/src/main/java/ink/wgink/service/user/controller/app/api/UserAppController.java new file mode 100644 index 00000000..da966030 --- /dev/null +++ b/service-user/src/main/java/ink/wgink/service/user/controller/app/api/UserAppController.java @@ -0,0 +1,153 @@ +package ink.wgink.service.user.controller.app.api; + +import ink.wgink.annotation.CheckRequestBodyAnnotation; +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.exceptions.ParamsException; +import ink.wgink.exceptions.SearchException; +import ink.wgink.exceptions.UpdateException; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.pojo.result.SuccessResultData; +import ink.wgink.service.user.pojo.dtos.AppUserDTO; +import ink.wgink.service.user.pojo.vos.UpdatePasswordVO; +import ink.wgink.service.user.pojo.vos.UpdateUserVO; +import ink.wgink.service.user.service.IUserService; +import ink.wgink.util.ReflectUtil; +import ink.wgink.util.RegexUtil; +import io.swagger.annotations.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: UserAppController + * @Description: 用户 + * @Author: WangGeng + * @Date: 2019-08-14 14:24 + * @Version: 1.0 + **/ +@Api(tags = ISystemConstant.API_TAGS_APP_PREFIX + "用户") +@RestController +@RequestMapping(ISystemConstant.APP_PREFIX + "/user") +public class UserAppController extends DefaultBaseController { + + @Autowired + private IUserService userService; + + @ApiOperation(value = "修改用户信息", notes = "修改用户信息接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update-info") + @CheckRequestBodyAnnotation + public SuccessResultData updateInfo(@RequestHeader("token") String token, @RequestBody UpdateUserVO updateUserVO) throws Exception { + if (StringUtils.isBlank(updateUserVO.getName())) { + throw new ParamsException("昵称不能为空"); + } + if (!StringUtils.isBlank(updateUserVO.getPhone()) && !RegexUtil.isPhone(updateUserVO.getPhone())) { + throw new ParamsException("手机格式不正确"); + } + if (!StringUtils.isBlank(updateUserVO.getEmail()) && !RegexUtil.isEmail(updateUserVO.getEmail())) { + throw new ParamsException("邮箱格式不正确"); + } + return new SuccessResultData<>(userService.updateInfo(token, updateUserVO)); + } + + @ApiOperation(value = "修改头像", notes = "修改头像接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update-avatar") + public SuccessResultData updateAvatar(@RequestHeader("token") String token, @RequestBody UpdateUserVO updateUserVO) throws Exception { + if (StringUtils.isBlank(updateUserVO.getAvatar())) { + throw new ParamsException("头像不能为空"); + } + return new SuccessResultData<>(userService.updateInfo(token, updateUserVO)); + } + + @ApiOperation(value = "修改昵称", notes = "修改昵称接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update-name") + public SuccessResult updateName(@RequestHeader("token") String token, @RequestBody UpdateUserVO updateUserVO) throws Exception { + if (StringUtils.isBlank(updateUserVO.getName())) { + throw new ParamsException("昵称不能为空"); + } + return new SuccessResultData<>(userService.updateInfo(token, updateUserVO)); + } + + @ApiOperation(value = "修改电话", notes = "修改电话接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update-phone") + public SuccessResult updatePhone(@RequestHeader("token") String token, @RequestBody UpdateUserVO updateUserVO) throws Exception { + if (StringUtils.isBlank(updateUserVO.getPhone())) { + throw new ParamsException("电话不能为空"); + } + return new SuccessResultData<>(userService.updateInfo(token, updateUserVO)); + } + + @ApiOperation(value = "修改邮箱", notes = "修改邮箱接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update-email") + public SuccessResult updateEmail(@RequestHeader("token") String token, @RequestBody UpdateUserVO updateUserVO) throws Exception { + if (StringUtils.isBlank(updateUserVO.getEmail())) { + throw new ParamsException("邮箱不能为空"); + } + return new SuccessResultData<>(userService.updateInfo(token, updateUserVO)); + } + + @ApiOperation(value = "修改密码", notes = "修改密码接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update-password") + @CheckRequestBodyAnnotation + public SuccessResult updatePassword(@RequestHeader("token") String token, + @RequestBody UpdatePasswordVO updatePasswordVO) throws ParamsException, SearchException, UpdateException, ReflectUtil.ReflectException { + if (updatePasswordVO.getNewPassword().length() < 6) { + throw new ParamsException("新密码长度必须大于6位"); + } + userService.updatePassword(token, updatePasswordVO); + return new SuccessResult(); + } + + @ApiOperation(value = "获取APP用户", notes = "获取APP用户接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("get-app-user") + public AppUserDTO getAppUser(@RequestHeader("token") String token) throws ReflectUtil.ReflectException { + return userService.getAppUser(token); + } + + @ApiOperation(value = "下载用户头像", notes = "下载用户头像接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "用户Id", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("download-avatar/{userId}") + public void downLoadAvatar(@PathVariable("userId") String userId, HttpServletRequest request, HttpServletResponse response) { + userService.downLoadAvatar(userId, request, response); + } + +} diff --git a/service-user/src/main/java/ink/wgink/service/user/controller/route/UserRouteController.java b/service-user/src/main/java/ink/wgink/service/user/controller/route/UserRouteController.java index 01f2ed11..4db11bdf 100644 --- a/service-user/src/main/java/ink/wgink/service/user/controller/route/UserRouteController.java +++ b/service-user/src/main/java/ink/wgink/service/user/controller/route/UserRouteController.java @@ -1,9 +1,11 @@ package ink.wgink.service.user.controller.route; import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.interfaces.user.IUserExpandBaseService; import ink.wgink.util.ResourceUtil; import ink.wgink.util.request.RequestUtil; import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -28,9 +30,16 @@ import java.io.IOException; @RequestMapping(ISystemConstant.ROUTE_PREFIX + "/user") public class UserRouteController { + @Autowired(required = false) + private IUserExpandBaseService userExpandBaseService; + @GetMapping("list") public ModelAndView list() { - return new ModelAndView("user/list"); + ModelAndView mv = new ModelAndView("user/list"); + if (userExpandBaseService != null) { + mv.addObject("userExpand", userExpandBaseService.getRoute()); + } + return mv; } @GetMapping("save") diff --git a/service-user/src/main/java/ink/wgink/service/user/pojo/dtos/AppUserDTO.java b/service-user/src/main/java/ink/wgink/service/user/pojo/dtos/AppUserDTO.java new file mode 100644 index 00000000..561e7be3 --- /dev/null +++ b/service-user/src/main/java/ink/wgink/service/user/pojo/dtos/AppUserDTO.java @@ -0,0 +1,98 @@ +package ink.wgink.service.user.pojo.dtos; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: UserAppDTO + * @Description: APP用户 + * @Author: WangGeng + * @Date: 2020/6/7 11:20 + * @Version: 1.0 + **/ +@ApiModel +public class AppUserDTO { + + @ApiModelProperty(name = "userId", value = "用户ID") + private String userId; + @ApiModelProperty(name = "username", value = "用户名") + private String username; + @ApiModelProperty(name = "name", value = "昵称") + private String name; + @ApiModelProperty(name = "avatar", value = "头像") + private String avatar; + @ApiModelProperty(name = "phone", value = "手机") + private String phone; + @ApiModelProperty(name = "email", value = "邮箱") + private String email; + + public String getUserId() { + return userId == null ? "" : userId.trim(); + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUsername() { + return username == null ? "" : username.trim(); + } + + public void setUsername(String username) { + this.username = username; + } + + public String getName() { + return name == null ? "" : name.trim(); + } + + public void setName(String name) { + this.name = name; + } + + public String getAvatar() { + return avatar == null ? "" : avatar.trim(); + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getPhone() { + return phone == null ? "" : phone.trim(); + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getEmail() { + return email == null ? "" : email.trim(); + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"userId\":\"") + .append(userId).append('\"'); + sb.append(",\"username\":\"") + .append(username).append('\"'); + sb.append(",\"name\":\"") + .append(name).append('\"'); + sb.append(",\"avatar\":\"") + .append(avatar).append('\"'); + sb.append(",\"phone\":\"") + .append(phone).append('\"'); + sb.append(",\"email\":\"") + .append(email).append('\"'); + sb.append('}'); + return sb.toString(); + } +} diff --git a/service-user/src/main/java/ink/wgink/service/user/pojo/vos/UpdateUserVO.java b/service-user/src/main/java/ink/wgink/service/user/pojo/vos/UpdateUserVO.java new file mode 100644 index 00000000..aabb8b03 --- /dev/null +++ b/service-user/src/main/java/ink/wgink/service/user/pojo/vos/UpdateUserVO.java @@ -0,0 +1,77 @@ +package ink.wgink.service.user.pojo.vos; + +import ink.wgink.annotation.CheckEmptyAnnotation; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.ArrayList; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: AppUserVO + * @Description: app用户 + * @Author: WangGeng + * @Date: 2019-08-15 18:29 + * @Version: 1.0 + **/ +@ApiModel +public class UpdateUserVO { + + @ApiModelProperty(name = "avatar", value = "头像") + private String avatar; + @ApiModelProperty(name = "name", value = "昵称") + private String name; + @ApiModelProperty(name = "phone", value = "联系电话") + private String phone; + @ApiModelProperty(name = "email", value = "邮箱") + private String email; + + public String getAvatar() { + return avatar == null ? "" : avatar.trim(); + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getName() { + return name == null ? "" : name.trim(); + } + + public void setName(String name) { + this.name = name; + } + + public String getPhone() { + return phone == null ? "" : phone.trim(); + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getEmail() { + return email == null ? "" : email.trim(); + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"avatar\":\"") + .append(avatar).append('\"'); + sb.append(",\"name\":\"") + .append(name).append('\"'); + sb.append(",\"phone\":\"") + .append(phone).append('\"'); + sb.append(",\"email\":\"") + .append(email).append('\"'); + sb.append('}'); + return sb.toString(); + } +} diff --git a/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java b/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java index 9cdd6969..3a8f213a 100644 --- a/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java +++ b/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java @@ -5,12 +5,17 @@ import ink.wgink.exceptions.UpdateException; import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.interfaces.user.IUserCheckService; import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.service.user.pojo.dtos.AppUserDTO; import ink.wgink.service.user.pojo.pos.UserPO; import ink.wgink.service.user.pojo.vos.*; import ink.wgink.pojo.result.UploadExcelResultDTO; +import ink.wgink.util.ReflectUtil; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map; @@ -65,6 +70,15 @@ public interface IUserService extends IUserBaseService, IUserCheckService { */ void save(UserVO userVO); + /** + * 保存用户 + * + * @param userVO + * @param isRegister + * @return + */ + String saveAndReturnId(UserVO userVO, boolean isRegister); + /** * 注册用户 * @@ -90,6 +104,16 @@ public interface IUserService extends IUserBaseService, IUserCheckService { */ void update(String userId, UserVO userVO); + /** + * 修改用户,不包含密码,返回新token + * + * @param token + * @param updateUserVO + * @return + * @throws Exception + */ + String updateInfo(String token, UpdateUserVO updateUserVO) throws Exception; + /** * 重置用户密码 * @@ -115,6 +139,13 @@ public interface IUserService extends IUserBaseService, IUserCheckService { */ void updatePassword(UpdatePasswordVO updatePasswordVO); + /** + * 修改密码 + * + * @param token + */ + void updatePassword(String token, UpdatePasswordVO updatePasswordVO) throws ReflectUtil.ReflectException; + /** * 更新过期时间 * @@ -163,4 +194,20 @@ public interface IUserService extends IUserBaseService, IUserCheckService { */ Integer count(Map params); + /** + * APP用户 + * + * @param token + * @return + */ + AppUserDTO getAppUser(String token) throws ReflectUtil.ReflectException; + + /** + * 下载用户头像 + * + * @param userId + * @param request + * @param response + */ + void downLoadAvatar(String userId, HttpServletRequest request, HttpServletResponse response); } diff --git a/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java b/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java index 605614a9..980ce6e6 100644 --- a/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java +++ b/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java @@ -4,13 +4,17 @@ import com.alibaba.excel.EasyExcel; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.exceptions.FileException; import ink.wgink.exceptions.SearchException; import ink.wgink.exceptions.UpdateException; +import ink.wgink.exceptions.base.SystemException; +import ink.wgink.interfaces.app.IAppSignBaseService; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.interfaces.manager.ISystemConfigManager; import ink.wgink.module.file.excel.error.AbstractErrorExcelHandler; import ink.wgink.module.file.service.IFileService; import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.app.AppTokenUser; import ink.wgink.pojo.dtos.user.UserDTO; import ink.wgink.pojo.result.SuccessResultData; import ink.wgink.pojo.result.SuccessResultList; @@ -21,11 +25,14 @@ import ink.wgink.service.user.excel.UserExcel; import ink.wgink.service.user.excel.UserExcelError; import ink.wgink.service.user.excel.UserExcelListener; import ink.wgink.service.user.pojo.bos.UserAdjustmentBO; +import ink.wgink.service.user.pojo.dtos.AppUserDTO; import ink.wgink.service.user.pojo.pos.UserPO; import ink.wgink.service.user.pojo.vos.*; import ink.wgink.service.user.service.IUserAdjustmentService; import ink.wgink.service.user.service.IUserService; import ink.wgink.util.ArrayListUtil; +import ink.wgink.util.ReflectUtil; +import ink.wgink.util.ResourceUtil; import ink.wgink.util.UUIDUtil; import ink.wgink.util.date.DateUtil; import ink.wgink.util.map.HashMapUtil; @@ -39,7 +46,10 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -68,15 +78,17 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService private String defaultPassword; @Autowired private IFileService fileService; + @Autowired(required = false) + private IAppSignBaseService appSignBaseService; @Override public void save(UserVO userVO) { - saveUser(userVO, false); + saveAndReturnId(userVO, false); } @Override public void register(UserVO userVO) { - saveUser(userVO, true); + saveAndReturnId(userVO, true); } /** @@ -85,7 +97,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService * @param userVO * @param isRegister 是否注册 */ - private void saveUser(UserVO userVO, boolean isRegister) { + @Override + public String saveAndReturnId(UserVO userVO, boolean isRegister) { UserDTO userDTO = getByUsername(userVO.getUserUsername()); if (userDTO != null) { throw new SearchException("用户已经存在"); @@ -101,6 +114,7 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService setSaveInfo(params); } userDao.save(params); + return userId; } @Override @@ -122,6 +136,19 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService userDao.update(params); } + @Override + public String updateInfo(String token, UpdateUserVO updateUserVO) throws Exception { + if (appSignBaseService == null) { + throw new SystemException("未引入APP登录模块"); + } + String userId = securityComponent.getAppTokenUser(token).getId(); + Map params = HashMapUtil.beanToMap(updateUserVO); + params.put("userId", userId); + setAppUpdateInfo(token, params); + userDao.update(params); + return appSignBaseService.userIdSign(userId); + } + @Override public void resetPassword(String userId, RestPasswordVO restPasswordVO) { UserDTO userDTO = get(userId); @@ -190,6 +217,33 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService userAdjustmentService.save(userAdjustmentBO); } + @Override + public void updatePassword(String token, UpdatePasswordVO updatePasswordVO) throws ReflectUtil.ReflectException { + AppTokenUser appTokenUser = securityComponent.getAppTokenUser(token); + String oldPassword = DigestUtils.md5Hex(DigestUtils.md5Hex(DigestUtils.md5Hex(updatePasswordVO.getOldPassword()))); + String newPassword = DigestUtils.md5Hex(DigestUtils.md5Hex(DigestUtils.md5Hex(updatePasswordVO.getNewPassword()))); + UserPO userPO = getPO(appTokenUser.getId()); + if (!passwordEncoder.matches(oldPassword, userPO.getUserPassword())) { + throw new UpdateException("旧密码错误"); + } + Map params = getHashMap(4); + params.put("userPassword", passwordEncoder.encode(newPassword)); + params.put("gmtPasswordModified", DateUtil.getTime()); + params.put("userId", userPO.getUserId()); + userDao.updatePassword(params); + + // 日志 + UserAdjustmentBO userAdjustmentBO = new UserAdjustmentBO(); + userAdjustmentBO.setUserId(appTokenUser.getId()); + userAdjustmentBO.setUserName(appTokenUser.getName()); + userAdjustmentBO.setUpdateType(UserUpdateTypeEnum.PASSWORD.getValue()); + userAdjustmentBO.setUpdateReason("修改密码"); + userAdjustmentBO.setCreator(appTokenUser.getId()); + userAdjustmentBO.setCreatorName(appTokenUser.getName()); + userAdjustmentBO.setGmtCreate(DateUtil.getTime()); + userAdjustmentService.save(userAdjustmentBO); + } + @Override public void updateExpiredDate(String userId, UpdateExpiredDateVO updateExpiredDateVO) { UserDTO oldUserDTO = get(userId); @@ -232,7 +286,7 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService userVO.setUserEmail(userEmail); userVO.setUserType(2); userVO.setUserState(0); - saveUser(userVO, false); + saveAndReturnId(userVO, false); } catch (Exception e) { userExcelErrors.add(getUserExcelError(userExcel, e.getMessage())); } @@ -330,6 +384,40 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService return count == null ? 0 : count; } + @Override + public AppUserDTO getAppUser(String token) throws ReflectUtil.ReflectException { + String userId = securityComponent.getAppTokenUser(token).getId(); + UserPO userPO = getPO(userId); + if (userPO == null) { + throw new SearchException("用户不存在"); + } + AppUserDTO appUserDTO = new AppUserDTO(); + appUserDTO.setUserId(userPO.getUserId()); + appUserDTO.setAvatar(userPO.getUserAvatar()); + appUserDTO.setUsername(userPO.getUserUsername()); + appUserDTO.setName(userPO.getUserName()); + appUserDTO.setEmail(userPO.getUserEmail()); + appUserDTO.setPhone(userPO.getUserPhone()); + return appUserDTO; + } + + @Override + public void downLoadAvatar(String userId, HttpServletRequest request, HttpServletResponse response) { + UserDTO userDTO = get(userId); + if (userDTO == null) { + throw new SearchException("用户不存在"); + } + // 头像不存在,加载默认头像 + if (StringUtils.isBlank(userDTO.getUserAvatar())) { + downloadDefaultAvatar(response); + return; + } + Map params = getHashMap(4); + params.put("fileId", userDTO.getUserAvatar()); + params.put("isOpen", ISystemConstant.IS_TRUE); + fileService.downLoadFile(request, response, params); + } + @Override public int countDateRange(String startDate, String endDate) { Map params = getHashMap(4); @@ -482,4 +570,34 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService userAdjustmentService.save(userAdjustmentBO); } + /** + * 下载默认用户头像 + * + * @param response + */ + private void downloadDefaultAvatar(HttpServletResponse response) { + File file; + try { + file = ResourceUtil.getResourceFile("classpath:static/assets/images/profile-photo.jpg"); + response.setHeader("Content-Length", String.valueOf(file.length())); + response.setHeader("Content-Disposition", "inline;fileName=" + URLEncoder.encode("profile-photo.jpg", "UTF-8")); + response.setContentType("image/jpeg"); + } catch (IOException e) { + throw new FileException("默认头像不存在"); + } + try ( + BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file)); + BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream()); + ) { + int readSize; + for (byte[] buf = new byte[IFileService.INPUT_STREAM_SIZE]; (readSize = bufferedInputStream.read(buf)) > -1; ) { + System.out.println(readSize); + bufferedOutputStream.write(buf, 0, readSize); + } + bufferedOutputStream.flush(); + } catch (Exception e) { + LOG.error("默认头像不存在"); + } + } + } diff --git a/service-user/src/main/resources/templates/user/list.html b/service-user/src/main/resources/templates/user/list.html index 19046ba9..120e05bc 100644 --- a/service-user/src/main/resources/templates/user/list.html +++ b/service-user/src/main/resources/templates/user/list.html @@ -18,6 +18,7 @@
+
@@ -31,7 +32,7 @@ -
@@ -76,6 +77,111 @@ // 初始化表格 function initTable() { + var colsArray = [ + {type:'checkbox', fixed: 'left'}, + {field:'rowNum', width:80, title: '序号', fixed: 'left', align:'center', templet: '{{d.LAY_INDEX}}'}, + {field:'userUsername', width:140, title: '用户名', sort: true, align:'center', + templet: function(rowData) { + return ''+ rowData.userUsername +''; + } + }, + {field:'userName', width:140, title: '昵称', sort: true, align:'center'}, + {field:'userType', width:90, title: '类型', sort: true, align:'center', + templet: function(item) { + if(item.userType == 1) { + return '系统用户'; + } else if(item.userType == 2) { + return '普通用户'; + } + return '类型错误'; + } + }, + {field:'userState', width:80, title: '状态', sort: true, align:'center', + templet: function(item) { + var value; + switch (item.userState) { + case 1: + value = '冻结'; + break; + case 2: + value = '锁定'; + break; + default: + value = '正常'; + } + return value; + } + }, + {field:'userPhone', width:140, title: '手机', sort: true, align:'center', + templet: function(item) { + if(!item.userPhone) { + return '-'; + } + return item.userPhone; + } + }, + {field:'userEmail', width: 160, title: '邮箱', sort: true, align:'center', + templet: function(item) { + if(!item.userEmail) { + return '-'; + } + return item.userEmail; + } + }, + {field:'userExpiredDate', width:180, title: '账号过期时间', align:'center', + templet: function(item) { + if(!item.userExpiredDate) { + return ''; + } + return item.userExpiredDate; + } + }, + {field:'lastLoginAddress', width:140, title: '登录地址', align:'center', + templet: function(item) { + if(!item.lastLoginAddress) { + return '-'; + } + return item.lastLoginAddress; + } + }, + {field:'lastLoginTime', width:180, title: '最后登录系统时间', align:'center', + templet: function(item) { + if(!item.lastLoginTime) { + return '-'; + } + return item.lastLoginTime; + } + }, + {field:'gmtCreate', width:180, title: '创建时间', align:'center', + templet: function(item) { + if(!item.gmtCreate) { + return '-'; + } + return item.gmtCreate; + } + }, + + ]; + if($('#userExpand') && $('#userExpand').val()) { + colsArray.push({ + field:'opition', width:190, title: '操作', fixed:'right', align:'center', templet: function(item) { + return '
' + + ''+ + ''+ + '
'; + } + }); + } else { + colsArray.push({ + field:'opition', width:110, title: '操作', fixed:'right', align:'center', templet: function(item) { + return ''; + } + }); + } table.render({ elem: '#dataTable', id: 'dataTable', @@ -90,99 +196,7 @@ limitName: 'rows' }, cols: [ - [ - {type:'checkbox', fixed: 'left'}, - {field:'rowNum', width:80, title: '序号', fixed: 'left', align:'center', templet: '{{d.LAY_INDEX}}'}, - {field:'userUsername', width:140, title: '用户名', sort: true, align:'center', - templet: function(rowData) { - return ''+ rowData.userUsername +''; - } - }, - {field:'userName', width:140, title: '昵称', sort: true, align:'center'}, - {field:'userType', width:90, title: '类型', sort: true, align:'center', - templet: function(item) { - if(item.userType == 1) { - return '系统用户'; - } else if(item.userType == 2) { - return '普通用户'; - } - return '类型错误'; - } - }, - {field:'userState', width:80, title: '状态', sort: true, align:'center', - templet: function(item) { - var value; - switch (item.userState) { - case 1: - value = '冻结'; - break; - case 2: - value = '锁定'; - break; - default: - value = '正常'; - } - return value; - } - }, - {field:'userPhone', width:140, title: '手机', sort: true, align:'center', - templet: function(item) { - if(!item.userPhone) { - return '-'; - } - return item.userPhone; - } - }, - {field:'userEmail', width: 160, title: '邮箱', sort: true, align:'center', - templet: function(item) { - if(!item.userEmail) { - return '-'; - } - return item.userEmail; - } - }, - {field:'userExpiredDate', width:180, title: '账号过期时间', align:'center', - templet: function(item) { - if(!item.userExpiredDate) { - return ''; - } - return item.userExpiredDate; - } - }, - {field:'lastLoginAddress', width:140, title: '登录地址', align:'center', - templet: function(item) { - if(!item.lastLoginAddress) { - return '-'; - } - return item.lastLoginAddress; - } - }, - {field:'lastLoginTime', width:180, title: '最后登录系统时间', align:'center', - templet: function(item) { - if(!item.lastLoginTime) { - return '-'; - } - return item.lastLoginTime; - } - }, - {field:'gmtCreate', width:180, title: '创建时间', align:'center', - templet: function(item) { - if(!item.gmtCreate) { - return '-'; - } - return item.gmtCreate; - } - }, - {field:'opition', width:110, title: '操作', fixed:'right', align:'center', - templet: function(item) { - return ''; - } - }, - ] + colsArray ], page: true, parseData: function(data) { @@ -353,6 +367,14 @@ reloadTable(); } }); + } else if(layEvent === 'userExpandEvent') { + top.dialog.open({ + url: top.restAjax.path('{userExpand}?userId={userId}', [$('#userExpand').val(), data.userId]), + title: '【'+ data.userName +'】拓展属性', + width: '60%', + height: '80%', + onClose: function() {} + }); } }); // 事件-排序