package com.mossle.user.web; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import javax.annotation.Resource; import javax.imageio.ImageIO; import com.mossle.api.avatar.AvatarConnector; import com.mossle.api.avatar.AvatarDTO; import com.mossle.api.store.StoreConnector; import com.mossle.api.store.StoreDTO; import com.mossle.api.tenant.TenantHolder; import com.mossle.core.auth.CurrentUserHolder; import com.mossle.core.mapper.BeanMapper; import com.mossle.core.page.Page; import com.mossle.core.spring.MessageHelper; import com.mossle.core.store.InputStreamDataSource; import com.mossle.core.store.MultipartFileDataSource; import com.mossle.core.util.IoUtils; import com.mossle.user.ImageUtils; import com.mossle.user.persistence.domain.AccountDevice; import com.mossle.user.persistence.domain.AccountInfo; import com.mossle.user.persistence.domain.PersonInfo; import com.mossle.user.persistence.manager.AccountDeviceManager; import com.mossle.user.persistence.manager.AccountInfoManager; import com.mossle.user.persistence.manager.PersonInfoManager; import com.mossle.user.service.ChangePasswordService; import com.mossle.user.support.ChangePasswordResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.support.RedirectAttributes; /** * 管理个人信息. */ @Controller @RequestMapping("user") public class MyController { private static Logger logger = LoggerFactory.getLogger(MyController.class); private AccountInfoManager accountInfoManager; private PersonInfoManager personInfoManager; private AccountDeviceManager accountDeviceManager; private MessageHelper messageHelper; private BeanMapper beanMapper = new BeanMapper(); private CurrentUserHolder currentUserHolder; private ChangePasswordService changePasswordService; private StoreConnector storeConnector; private TenantHolder tenantHolder; private AvatarConnector avatarConnector; /** * 显示个人信息. */ @RequestMapping("my-info-input") public String infoInput(Model model) { Long accountId = Long.parseLong(currentUserHolder.getUserId()); AccountInfo accountInfo = accountInfoManager.get(accountId); PersonInfo personInfo = personInfoManager.findUniqueBy("code", accountInfo.getCode()); model.addAttribute("accountInfo", accountInfo); model.addAttribute("personInfo", personInfo); return "user/my-info-input"; } /** * 保存个人信息. */ @RequestMapping("my-info-save") public String infoSave(@ModelAttribute PersonInfo personInfo, RedirectAttributes redirectAttributes) throws Exception { Long accountId = Long.parseLong(currentUserHolder.getUserId()); AccountInfo accountInfo = accountInfoManager.get(accountId); if (accountInfo.getCode() == null) { accountInfo.setCode(Long.toString(accountInfo.getId())); accountInfoManager.save(accountInfo); } PersonInfo dest = personInfoManager.findUniqueBy("code", accountInfo.getCode()); logger.debug("code : {}", accountInfo.getCode()); if (dest != null) { beanMapper.copy(personInfo, dest); } else { dest = new PersonInfo(); dest.setCode(accountInfo.getCode()); beanMapper.copy(personInfo, dest); } personInfoManager.save(dest); messageHelper.addFlashMessage(redirectAttributes, "core.success.save", "保存成功"); return "redirect:/user/my-info-input.do"; } /** * 准备修改密码. */ @RequestMapping("my-change-password-input") public String changepasswordInput() { return "user/my-change-password-input"; } /** * 修改密码. */ @RequestMapping("my-change-password-save") public String changePasswordSave( @RequestParam("oldPassword") String oldPassword, @RequestParam("newPassword") String newPassword, @RequestParam("confirmPassword") String confirmPassword, RedirectAttributes redirectAttributes) { Long accountId = Long.parseLong(currentUserHolder.getUserId()); ChangePasswordResult changePasswordResult = changePasswordService .changePassword(accountId, oldPassword, newPassword, confirmPassword); if (changePasswordResult.isSuccess()) { messageHelper.addFlashMessage(redirectAttributes, changePasswordResult.getCode(), changePasswordResult.getMessage()); return "redirect:/user/my-change-password-input.do"; } else { messageHelper.addFlashMessage(redirectAttributes, changePasswordResult.getCode(), changePasswordResult.getMessage()); return "redirect:/user/my-change-password-input.do"; } } /** * 显示头像. */ @RequestMapping("my-avatar-input") public String avatarInput(Model model) { String userId = currentUserHolder.getUserId(); Long accountId = Long.parseLong(userId); AccountInfo accountInfo = accountInfoManager.get(accountId); AvatarDTO avatarDto = avatarConnector.findAvatar(userId); model.addAttribute("accountInfo", accountInfo); model.addAttribute("avatarDto", avatarDto); return "user/my-avatar-input"; } /** * 上传头像. */ @RequestMapping("my-avatar-upload") @ResponseBody public String avatarUpload(@RequestParam("avatar") MultipartFile avatar) throws Exception { String tenantId = tenantHolder.getTenantId(); StoreDTO storeDto = storeConnector.saveStore("avatar", new MultipartFileDataSource(avatar), tenantId); String userId = currentUserHolder.getUserId(); avatarConnector.saveAvatar(userId, storeDto.getKey()); return "{\"success\":true,\"id\":\"" + userId + "\"}"; } /** * 显示头像. */ @RequestMapping("my-avatar-view") @ResponseBody public void avatarView(OutputStream os) throws Exception { String tenantId = tenantHolder.getTenantId(); String userId = currentUserHolder.getUserId(); AvatarDTO avatarDto = avatarConnector.findAvatar(userId); if (avatarDto == null) { return; } StoreDTO storeDto = storeConnector.getStore("avatar", avatarDto.getCode(), tenantId); IoUtils.copyStream(storeDto.getDataSource().getInputStream(), os); } /** * 剪切头像. */ @RequestMapping("my-avatar-crop") public String avatarCrop(Model model) throws Exception { String tenantId = tenantHolder.getTenantId(); String userId = currentUserHolder.getUserId(); AvatarDTO avatarDto = avatarConnector.findAvatar(userId); Long accountId = Long.parseLong(userId); AccountInfo accountInfo = accountInfoManager.get(accountId); model.addAttribute("accountInfo", accountInfo); model.addAttribute("avatarDto", avatarDto); if (avatarDto == null) { return "user/my-avatar-crop"; } StoreDTO storeDto = storeConnector.getStore("avatar", avatarDto.getCode(), tenantId); BufferedImage bufferedImage = ImageIO.read(storeDto.getDataSource() .getInputStream()); int height = bufferedImage.getHeight(); int width = bufferedImage.getWidth(); int defaultSize = Math.min(512, Math.min(height, width)); if (height > width) { int h = defaultSize; int w = (defaultSize * width) / height; int min = w; model.addAttribute("h", h); model.addAttribute("w", w); model.addAttribute("min", min); } else { int w = defaultSize; int h = (defaultSize * height) / width; int min = h; model.addAttribute("h", h); model.addAttribute("w", w); model.addAttribute("min", min); } return "user/my-avatar-crop"; } /** * 保存头像. */ @RequestMapping("my-avatar-save") public String avatarSave(@RequestParam("x1") int x1, @RequestParam("x2") int x2, @RequestParam("y1") int y1, @RequestParam("y2") int y2, @RequestParam("w") int w, Model model) throws Exception { String tenantId = tenantHolder.getTenantId(); String userId = currentUserHolder.getUserId(); AvatarDTO avatarDto = avatarConnector.findAvatar(userId); Long accountId = Long.parseLong(userId); AccountInfo accountInfo = accountInfoManager.get(accountId); String hql = "from AccountAvatar where accountInfo=? and type='default'"; model.addAttribute("accountInfo", accountInfo); model.addAttribute("avatarDto", avatarDto); if (avatarDto != null) { StoreDTO storeDto = storeConnector.getStore("avatar", avatarDto.getCode(), tenantId); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageUtils.zoomImage(storeDto.getDataSource().getInputStream(), baos, x1, y1, x2, y2); storeDto = storeConnector.saveStore("avatar", new InputStreamDataSource(w + ".png", new ByteArrayInputStream(baos.toByteArray())), tenantId); avatarConnector.saveAvatar(userId, storeDto.getKey()); } return "user/my-avatar-save"; } /** * 设备列表. */ @RequestMapping("my-device-list") public String myDeviceList(@ModelAttribute Page page, Model model) { Long accountId = Long.parseLong(currentUserHolder.getUserId()); String hql = "from AccountDevice where accountInfo.id=?"; page = accountDeviceManager.pagedQuery(hql, page.getPageNo(), page.getPageSize(), accountId); model.addAttribute("page", page); return "user/my-device-list"; } @RequestMapping("my-device-active") public String active(@RequestParam("id") Long id, RedirectAttributes redirectAttributes) { AccountDevice accountDevice = accountDeviceManager.get(id); accountDevice.setStatus("active"); accountDeviceManager.save(accountDevice); messageHelper.addFlashMessage(redirectAttributes, "core.success.update", "操作成功"); return "redirect:/user/my-device-list.do"; } @RequestMapping("my-device-disable") public String disable(@RequestParam("id") Long id, RedirectAttributes redirectAttributes) { AccountDevice accountDevice = accountDeviceManager.get(id); accountDevice.setStatus("disabled"); accountDeviceManager.save(accountDevice); messageHelper.addFlashMessage(redirectAttributes, "core.success.update", "操作成功"); return "redirect:/user/my-device-list.do"; } @RequestMapping("my-device-remove") public String remove(@RequestParam("id") Long id, RedirectAttributes redirectAttributes) { accountDeviceManager.removeById(id); messageHelper.addFlashMessage(redirectAttributes, "core.success.update", "操作成功"); return "redirect:/user/my-device-list.do"; } // ~ ====================================================================== @Resource public void setAccountInfoManager(AccountInfoManager accountInfoManager) { this.accountInfoManager = accountInfoManager; } @Resource public void setPersonInfoManager(PersonInfoManager personInfoManager) { this.personInfoManager = personInfoManager; } @Resource public void setAccountDeviceManager( AccountDeviceManager accountDeviceManager) { this.accountDeviceManager = accountDeviceManager; } @Resource public void setMessageHelper(MessageHelper messageHelper) { this.messageHelper = messageHelper; } @Resource public void setCurrentUserHolder(CurrentUserHolder currentUserHolder) { this.currentUserHolder = currentUserHolder; } @Resource public void setChangePasswordService( ChangePasswordService changePasswordService) { this.changePasswordService = changePasswordService; } @Resource public void setStoreConnector(StoreConnector storeConnector) { this.storeConnector = storeConnector; } @Resource public void setTenantHolder(TenantHolder tenantHolder) { this.tenantHolder = tenantHolder; } @Resource public void setAvatarConnector(AvatarConnector avatarConnector) { this.avatarConnector = avatarConnector; } }