用户注册时附加其他信息
提交者 @Paul-Etienne
如果我们需要存储的信息比JHipster默认提供的信息更多,则需要进行一些调整。
为了说明这一点,假设我们要存储用户的电话号码。
与JHI_User建立一对一关系的新实体
添加默认JHipster用户无法处理的信息的最佳方法是,在通过一对一关系与其链接的新实体中使用聚合。
创建此实体后,我们将其称为UserExtra,处理其ID的最佳方法是将其映射到JHI_User的ID。 这样,我们的UserExtra将具有与用户相同的ID,从而加速了不同的请求。 为此,您将需要使用@MapsId注解:
public class UserExtra implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
@Column(name = "phone")
private String phone;
@OneToOne
@MapsId
private User user;
...
}
请注意,需要删除ID上的@GeneratedValue注解。
更新注册HTML页面以考虑此更改
现在已经存在一个实体来存储电话号码,我们需要在注册表单中添加输入以询问用户的电话号码。
如此简单,只需更新webapp/app/account/register/register.html以添加一个输入字段,该输入字段绑定到已经用于存储基本信息(vm.registerAccount)的变量:
<input class="form-control" id="phone" ng-model="vm.registerAccount.phone" placeholder="global.form.phone.placeholder" />
更新 ManagedUserVM
来自java/com.mycompany.myapp/web/rest/AccountResource的registerAccount()方法接收注册页面的请求。 它的唯一参数是ManagedUserVM对象,该对象包含来自客户端的vm.registerAccount变量中最初包含的信息。
位于web/rest/vm中的ManagedUserVM类也必须进行更新,以便保存客户端发送的电话号码。 唯一要做的就是添加电话号码属性及其getter:
public class ManagedUserVM extends UserDTO {
// Default attributes omitted for brevity
private String phone;
...
public String getPhone() {
return phone;
}
}
更新AccountResource中registerAccount()方法
现在,registerAccount()方法将接收一个ManagedUserVM对象,该对象还包含用户的电话号码。 剩下要做的就是将此电话号码保存到与JHipster用户关联的新UserExtra中。
为此,我们将把phone参数从UserService添加到createUser()方法中。 但首先,在registerAccount()中调用此函数的位置添加此参数:
public ResponseEntity<?> registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM) {
HttpHeaders textPlainHeaders = new HttpHeaders();
textPlainHeaders.setContentType(MediaType.TEXT_PLAIN);
return userRepository.findOneByLogin(managedUserVM.getLogin().toLowerCase())
.map(user -> new ResponseEntity<>("login already in use", textPlainHeaders, HttpStatus.BAD_REQUEST))
.orElseGet(() -> userRepository.findOneByEmail(managedUserVM.getEmail())
.map(user -> new ResponseEntity<>("e-mail address already in use", textPlainHeaders, HttpStatus.BAD_REQUEST))
.orElseGet(() -> {
User user = userService
.createUser(managedUserVM.getLogin(), managedUserVM.getPassword(),
managedUserVM.getFirstName(), managedUserVM.getLastName(),
managedUserVM.getEmail().toLowerCase(), managedUserVM.getLangKey(),
managedUserVM.getPhone());
mailService.sendActivationEmail(user);
return new ResponseEntity<>(HttpStatus.CREATED);
})
);
}
更新UserService中的createUser()方法
最后,我们更新了保存JHI_User的服务层功能,现在也保存了UserExtra。建议您使用其他参数来创建一个新方法,而不是更新现有方法。
不要忘记注入UserExtra的Repository:
@Inject
private UserExtraRepository userExtraRepository;
@Inject
private UserExtraSearchRepository userExtraSearchRepository;
...
public User createUser(String login, String password, String firstName, String lastName, String email,
String langKey, String phone) {
User newUser = new User();
Authority authority = authorityRepository.findOne(AuthoritiesConstants.USER);
Set<Authority> authorities = new HashSet<>();
String encryptedPassword = passwordEncoder.encode(password);
newUser.setLogin(login);
// new user gets initially a generated password
newUser.setPassword(encryptedPassword);
newUser.setFirstName(firstName);
newUser.setLastName(lastName);
newUser.setEmail(email);
newUser.setLangKey(langKey);
// new user is not active
newUser.setActivated(false);
// new user gets registration key
newUser.setActivationKey(RandomUtil.generateActivationKey());
authorities.add(authority);
newUser.setAuthorities(authorities);
userRepository.save(newUser);
userSearchRepository.save(newUser);
log.debug("Created Information for User: {}", newUser);
// Create and save the UserExtra entity
UserExtra newUserExtra = new UserExtra();
newUserExtra.setUser(newUser);
newUserExtra.setPhone(phone);
userExtraRepository.save(newUserExtra);
userExtraSearchRepository.save(newUserExtra);
log.debug("Created Information for UserExtra: {}", newUserExtra);
return newUser;
}
完成了!