package com.mossle.user.web; import java.util.Date; import java.util.List; import java.util.Map; import javax.annotation.Resource; import com.mossle.api.store.StoreConnector; import com.mossle.api.tenant.TenantHolder; import com.mossle.api.user.UserCache; import com.mossle.api.user.UserDTO; import com.mossle.core.auth.CustomPasswordEncoder; import com.mossle.core.export.Exportor; import com.mossle.core.mapper.BeanMapper; import com.mossle.core.page.Page; import com.mossle.core.query.PropertyFilter; import com.mossle.core.spring.MessageHelper; import com.mossle.user.persistence.domain.AccountAvatar; import com.mossle.user.persistence.domain.AccountCredential; import com.mossle.user.persistence.domain.AccountInfo; import com.mossle.user.persistence.domain.PersonInfo; import com.mossle.user.persistence.manager.AccountAvatarManager; import com.mossle.user.persistence.manager.AccountCredentialManager; import com.mossle.user.persistence.manager.AccountInfoManager; import com.mossle.user.persistence.manager.PersonInfoManager; import com.mossle.user.publish.UserPublisher; 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.servlet.mvc.support.RedirectAttributes; @Controller @RequestMapping("user") public class AccountInfoController { private AccountInfoManager accountInfoManager; private AccountCredentialManager accountCredentialManager; private AccountAvatarManager accountAvatarManager; private PersonInfoManager personInfoManager; private UserCache userCache; private MessageHelper messageHelper; private Exportor exportor; private BeanMapper beanMapper = new BeanMapper(); private CustomPasswordEncoder customPasswordEncoder; private StoreConnector storeConnector; private UserPublisher userPublisher; private TenantHolder tenantHolder; @RequestMapping("account-info-list") public String list(@ModelAttribute Page page, @RequestParam Map<String, Object> parameterMap, Model model) { String tenantId = tenantHolder.getTenantId(); List<PropertyFilter> propertyFilters = PropertyFilter .buildFromMap(parameterMap); propertyFilters.add(new PropertyFilter("EQS_tenantId", tenantId)); page = accountInfoManager.pagedQuery(page, propertyFilters); model.addAttribute("page", page); return "user/account-info-list"; } @RequestMapping("account-info-input") public String input(@RequestParam(value = "id", required = false) Long id, Model model) { AccountInfo accountInfo = null; if (id != null) { accountInfo = accountInfoManager.get(id); } else { accountInfo = new AccountInfo(); } model.addAttribute("model", accountInfo); return "user/account-info-input"; } @RequestMapping("account-info-save") public String save( @ModelAttribute AccountInfo accountInfo, @RequestParam(value = "password", required = false) String password, @RequestParam(value = "confirmPassword", required = false) String confirmPassword, RedirectAttributes redirectAttributes) throws Exception { String tenantId = tenantHolder.getTenantId(); // 先进行校验 if (password != null) { if (!password.equals(confirmPassword)) { messageHelper.addFlashMessage(redirectAttributes, "user.user.input.passwordnotequals", "两次输入密码不符"); // TODO: 还要填充schema return "user/account-info-input"; } } // 再进行数据复制 AccountInfo dest = null; Long id = accountInfo.getId(); if (id != null) { dest = accountInfoManager.get(id); if (accountInfo.getStatus() == null) { accountInfo.setStatus("disabled"); } beanMapper.copy(accountInfo, dest); } else { dest = accountInfo; if (accountInfo.getStatus() == null) { accountInfo.setStatus("disabled"); } dest.setCreateTime(new Date()); dest.setTenantId(tenantId); } accountInfoManager.save(dest); if (dest.getCode() == null) { dest.setCode(Long.toString(dest.getId())); accountInfoManager.save(dest); } if (password != null) { String hql = "from AccountCredential where accountInfo=? and catalog='default'"; AccountCredential accountCredential = accountCredentialManager .findUnique(hql, accountInfo); if (accountCredential == null) { accountCredential = new AccountCredential(); accountCredential.setAccountInfo(accountInfo); accountCredential.setType("normal"); accountCredential.setCatalog("default"); } if (customPasswordEncoder != null) { accountCredential.setPassword(customPasswordEncoder .encode(password)); } else { accountCredential.setPassword(password); } accountCredentialManager.save(accountCredential); } messageHelper.addFlashMessage(redirectAttributes, "core.success.save", "保存成功"); UserDTO userDto = new UserDTO(); userDto.setId(Long.toString(dest.getId())); userDto.setUsername(dest.getUsername()); userDto.setRef(dest.getCode()); userDto.setUserRepoRef(tenantId); userCache.removeUser(userDto); if (id != null) { userPublisher.notifyUserUpdated(this.convertUserDto(dest)); } else { userPublisher.notifyUserCreated(this.convertUserDto(dest)); } return "redirect:/user/account-info-list.do"; } @RequestMapping("account-info-remove") public String remove(@RequestParam("selectedItem") List<Long> selectedItem, RedirectAttributes redirectAttributes) { String tenantId = tenantHolder.getTenantId(); List<AccountInfo> accountInfos = accountInfoManager .findByIds(selectedItem); for (AccountInfo accountInfo : accountInfos) { for (AccountCredential accountCredential : accountInfo .getAccountCredentials()) { accountCredentialManager.remove(accountCredential); } for (AccountAvatar accountAvatar : accountInfo.getAccountAvatars()) { accountAvatarManager.remove(accountAvatar); } accountInfoManager.remove(accountInfo); UserDTO userDto = new UserDTO(); userDto.setId(Long.toString(accountInfo.getId())); userDto.setUsername(accountInfo.getUsername()); userDto.setRef(accountInfo.getCode()); userDto.setUserRepoRef(tenantId); userCache.removeUser(userDto); userPublisher.notifyUserRemoved(this.convertUserDto(accountInfo)); } messageHelper.addFlashMessage(redirectAttributes, "core.success.delete", "删除成功"); return "redirect:/user/account-info-list.do"; } @RequestMapping("account-info-active") public String active(@RequestParam("id") Long id, RedirectAttributes redirectAttributes) { AccountInfo accountInfo = accountInfoManager.get(id); accountInfo.setStatus("active"); accountInfoManager.save(accountInfo); messageHelper.addFlashMessage(redirectAttributes, "core.success.update", "操作成功"); userPublisher.notifyUserUpdated(this.convertUserDto(accountInfo)); return "redirect:/user/account-info-list.do"; } @RequestMapping("account-info-disable") public String disable(@RequestParam("id") Long id, RedirectAttributes redirectAttributes) { AccountInfo accountInfo = accountInfoManager.get(id); accountInfo.setStatus("disabled"); accountInfoManager.save(accountInfo); messageHelper.addFlashMessage(redirectAttributes, "core.success.update", "操作成功"); userPublisher.notifyUserUpdated(this.convertUserDto(accountInfo)); return "redirect:/user/account-info-list.do"; } @RequestMapping("account-info-checkUsername") @ResponseBody public boolean checkUsername(@RequestParam("username") String username, @RequestParam(value = "id", required = false) Long id) throws Exception { String tenantId = tenantHolder.getTenantId(); String hql = "from AccountInfo where username=? and tenantId=?"; Object[] params = { username, tenantId }; if (id != null) { hql = "from AccountInfo where username=? and tenantId=? and id<>?"; params = new Object[] { username, tenantId, id }; } boolean result = accountInfoManager.findUnique(hql, params) == null; return result; } public UserDTO convertUserDto(AccountInfo accountInfo) { String hql = "from PersonInfo where code=? and tenantId=?"; PersonInfo personInfo = personInfoManager.findUnique(hql, accountInfo.getCode(), accountInfo.getTenantId()); UserDTO userDto = new UserDTO(); userDto.setId(Long.toString(accountInfo.getId())); userDto.setUsername(accountInfo.getUsername()); userDto.setDisplayName(accountInfo.getDisplayName()); userDto.setNickName(accountInfo.getNickName()); userDto.setUserRepoRef(accountInfo.getTenantId()); if (personInfo != null) { userDto.setEmail(personInfo.getEmail()); userDto.setMobile(personInfo.getCellphone()); } return userDto; } // ~ ====================================================================== @Resource public void setAccountInfoManager(AccountInfoManager accountInfoManager) { this.accountInfoManager = accountInfoManager; } @Resource public void setAccountCredentialManager( AccountCredentialManager accountCredentialManager) { this.accountCredentialManager = accountCredentialManager; } @Resource public void setAccountAvatarManager( AccountAvatarManager accountAvatarManager) { this.accountAvatarManager = accountAvatarManager; } @Resource public void setPersonInfoManager(PersonInfoManager personInfoManager) { this.personInfoManager = personInfoManager; } @Resource public void setUserCache(UserCache userCache) { this.userCache = userCache; } @Resource public void setMessageHelper(MessageHelper messageHelper) { this.messageHelper = messageHelper; } @Resource public void setCustomPasswordEncoder( CustomPasswordEncoder customPasswordEncoder) { this.customPasswordEncoder = customPasswordEncoder; } @Resource public void setExportor(Exportor exportor) { this.exportor = exportor; } @Resource public void setStoreConnector(StoreConnector storeConnector) { this.storeConnector = storeConnector; } @Resource public void setUserPublisher(UserPublisher userPublisher) { this.userPublisher = userPublisher; } @Resource public void setTenantHolder(TenantHolder tenantHolder) { this.tenantHolder = tenantHolder; } }