(139) - User Overview/ user add/archive
parent
c4e12d10b5
commit
96e5b95232
|
@ -0,0 +1,43 @@
|
||||||
|
package com.monkeyk.sos.domain.dto;
|
||||||
|
|
||||||
|
import com.monkeyk.sos.domain.user.Privilege;
|
||||||
|
import com.monkeyk.sos.domain.user.User;
|
||||||
|
import com.monkeyk.sos.infrastructure.PasswordHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 2016/3/25
|
||||||
|
*
|
||||||
|
* @author Shengzhao Li
|
||||||
|
*/
|
||||||
|
public class UserFormDto extends UserDto {
|
||||||
|
private static final long serialVersionUID = 7959857016962260738L;
|
||||||
|
|
||||||
|
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
public UserFormDto() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Privilege[] getAllPrivileges() {
|
||||||
|
return new Privilege[]{Privilege.MOBILE, Privilege.UNITY};
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User newUser() {
|
||||||
|
final User user = new User()
|
||||||
|
.username(getUsername())
|
||||||
|
.phone(getPhone())
|
||||||
|
.email(getEmail())
|
||||||
|
.password(PasswordHandler.md5(getPassword()));
|
||||||
|
user.privileges().addAll(getPrivileges());
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.monkeyk.sos.infrastructure;
|
||||||
|
|
||||||
|
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 2016/3/25
|
||||||
|
*
|
||||||
|
* @author Shengzhao Li
|
||||||
|
*/
|
||||||
|
public abstract class PasswordHandler {
|
||||||
|
|
||||||
|
|
||||||
|
private PasswordHandler() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String md5(String password) {
|
||||||
|
Md5PasswordEncoder encoder = new Md5PasswordEncoder();
|
||||||
|
return encoder.encodePassword(password, null);
|
||||||
|
}
|
||||||
|
}
|
|
@ -78,6 +78,12 @@ public class UserRepositoryJdbc implements UserRepository {
|
||||||
|
|
||||||
ps.setString(7, user.phone());
|
ps.setString(7, user.phone());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//get user id
|
||||||
|
|
||||||
|
//insert privileges
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.monkeyk.sos.service;
|
package com.monkeyk.sos.service;
|
||||||
|
|
||||||
|
import com.monkeyk.sos.domain.dto.UserFormDto;
|
||||||
import com.monkeyk.sos.domain.dto.UserJsonDto;
|
import com.monkeyk.sos.domain.dto.UserJsonDto;
|
||||||
import com.monkeyk.sos.domain.dto.UserOverviewDto;
|
import com.monkeyk.sos.domain.dto.UserOverviewDto;
|
||||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||||
|
@ -12,4 +13,8 @@ public interface UserService extends UserDetailsService {
|
||||||
UserJsonDto loadCurrentUserJsonDto();
|
UserJsonDto loadCurrentUserJsonDto();
|
||||||
|
|
||||||
UserOverviewDto loadUserOverviewDto(UserOverviewDto overviewDto);
|
UserOverviewDto loadUserOverviewDto(UserOverviewDto overviewDto);
|
||||||
|
|
||||||
|
boolean isExistedUsername(String username);
|
||||||
|
|
||||||
|
String saveUser(UserFormDto formDto);
|
||||||
}
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package com.monkeyk.sos.service.impl;
|
package com.monkeyk.sos.service.impl;
|
||||||
|
|
||||||
import com.monkeyk.sos.domain.dto.UserDto;
|
import com.monkeyk.sos.domain.dto.UserDto;
|
||||||
|
import com.monkeyk.sos.domain.dto.UserFormDto;
|
||||||
import com.monkeyk.sos.domain.dto.UserJsonDto;
|
import com.monkeyk.sos.domain.dto.UserJsonDto;
|
||||||
import com.monkeyk.sos.domain.dto.UserOverviewDto;
|
import com.monkeyk.sos.domain.dto.UserOverviewDto;
|
||||||
import com.monkeyk.sos.domain.shared.security.WdcyUserDetails;
|
import com.monkeyk.sos.domain.shared.security.WdcyUserDetails;
|
||||||
|
@ -59,6 +60,19 @@ public class UserServiceImpl implements UserService {
|
||||||
return overviewDto;
|
return overviewDto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExistedUsername(String username) {
|
||||||
|
final User user = userRepository.findByUsername(username);
|
||||||
|
return user != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String saveUser(UserFormDto formDto) {
|
||||||
|
User user = formDto.newUser();
|
||||||
|
userRepository.saveUser(user);
|
||||||
|
return user.guid();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private UserJsonDto loadOauthUserJsonDto(OAuth2Authentication oAuth2Authentication) {
|
private UserJsonDto loadOauthUserJsonDto(OAuth2Authentication oAuth2Authentication) {
|
||||||
UserJsonDto userJsonDto = new UserJsonDto();
|
UserJsonDto userJsonDto = new UserJsonDto();
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
package com.monkeyk.sos.web.controller;
|
package com.monkeyk.sos.web.controller;
|
||||||
|
|
||||||
|
import com.monkeyk.sos.domain.dto.UserFormDto;
|
||||||
import com.monkeyk.sos.domain.dto.UserOverviewDto;
|
import com.monkeyk.sos.domain.dto.UserOverviewDto;
|
||||||
import com.monkeyk.sos.service.UserService;
|
import com.monkeyk.sos.service.UserService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.validation.BindingResult;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Shengzhao Li
|
* @author Shengzhao Li
|
||||||
|
@ -18,9 +22,10 @@ public class UserController {
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserService userService;
|
private UserService userService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserFormDtoValidator validator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Just forward to page
|
|
||||||
*
|
|
||||||
* @return View page
|
* @return View page
|
||||||
*/
|
*/
|
||||||
@RequestMapping("overview")
|
@RequestMapping("overview")
|
||||||
|
@ -31,4 +36,22 @@ public class UserController {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@RequestMapping(value = "form/plus", method = RequestMethod.GET)
|
||||||
|
public String showForm(Model model) {
|
||||||
|
model.addAttribute("formDto", new UserFormDto());
|
||||||
|
return "user_form";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@RequestMapping(value = "form/plus", method = RequestMethod.POST)
|
||||||
|
public String submitRegisterClient(@ModelAttribute("formDto") UserFormDto formDto, BindingResult result) {
|
||||||
|
validator.validate(formDto, result);
|
||||||
|
if (result.hasErrors()) {
|
||||||
|
return "user_form";
|
||||||
|
}
|
||||||
|
userService.saveUser(formDto);
|
||||||
|
return "redirect:../overview";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.monkeyk.sos.web.controller;
|
||||||
|
|
||||||
|
import com.monkeyk.sos.domain.dto.UserFormDto;
|
||||||
|
import com.monkeyk.sos.domain.user.Privilege;
|
||||||
|
import com.monkeyk.sos.service.UserService;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.validation.Errors;
|
||||||
|
import org.springframework.validation.Validator;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 2016/3/25
|
||||||
|
*
|
||||||
|
* @author Shengzhao Li
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class UserFormDtoValidator implements Validator {
|
||||||
|
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supports(Class<?> clazz) {
|
||||||
|
return UserFormDto.class.equals(clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void validate(Object target, Errors errors) {
|
||||||
|
UserFormDto formDto = (UserFormDto) target;
|
||||||
|
|
||||||
|
validateUsername(errors, formDto);
|
||||||
|
validatePassword(errors, formDto);
|
||||||
|
validatePrivileges(errors, formDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validatePrivileges(Errors errors, UserFormDto formDto) {
|
||||||
|
final List<Privilege> privileges = formDto.getPrivileges();
|
||||||
|
if (privileges == null || privileges.isEmpty()) {
|
||||||
|
errors.rejectValue("privileges", null, "Privileges is required");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validatePassword(Errors errors, UserFormDto formDto) {
|
||||||
|
final String password = formDto.getPassword();
|
||||||
|
if (StringUtils.isEmpty(password)) {
|
||||||
|
errors.rejectValue("password", null, "Password is required");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateUsername(Errors errors, UserFormDto formDto) {
|
||||||
|
final String username = formDto.getUsername();
|
||||||
|
if (StringUtils.isEmpty(username)) {
|
||||||
|
errors.rejectValue("username", null, "Username is required");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean existed = userService.isExistedUsername(username);
|
||||||
|
if (existed) {
|
||||||
|
errors.rejectValue("username", null, "Username already existed");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
<%--
|
||||||
|
*
|
||||||
|
* @author Shengzhao Li
|
||||||
|
--%>
|
||||||
|
|
||||||
|
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
|
||||||
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
|
<%@ taglib prefix="fun" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||||
|
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Add User</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<a href="${contextPath}/">Home</a>
|
||||||
|
|
||||||
|
<h2>Add User</h2>
|
||||||
|
|
||||||
|
<form:form commandName="formDto" cssClass="form-horizontal">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-2 control-label">Username<em class="text-danger">*</em></label>
|
||||||
|
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<form:input path="username" cssClass="form-control" placeholder="Type username"
|
||||||
|
required="required"/>
|
||||||
|
|
||||||
|
<p class="help-block">Username, unique.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-2 control-label">Password<em class="text-danger">*</em></label>
|
||||||
|
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<form:password path="password" cssClass="form-control" placeholder="Type password"
|
||||||
|
required="required"/>
|
||||||
|
|
||||||
|
<p class="help-block">Password, unique.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-2 control-label">Privileges<em class="text-danger">*</em></label>
|
||||||
|
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<label class="checkbox-inline">
|
||||||
|
<form:checkbox path="privileges" value="MOBILE"/> MOBILE
|
||||||
|
</label>
|
||||||
|
<label class="checkbox-inline">
|
||||||
|
<form:checkbox path="privileges" value="UNITY"/> UNITY
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<p class="help-block">Select Privilege(s).</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-2 control-label">Phone</label>
|
||||||
|
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<form:input path="phone" cssClass="form-control" placeholder="Type phone"/>
|
||||||
|
|
||||||
|
<p class="help-block">User phone, optional.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-2 control-label">Email</label>
|
||||||
|
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<form:input path="email" cssClass="form-control" placeholder="Type email"/>
|
||||||
|
|
||||||
|
<p class="help-block">User email, optional.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-sm-2"></div>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<form:errors path="*" cssClass="label label-warning"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-sm-2"></div>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<button type="submit" class="btn btn-success">Save</button>
|
||||||
|
<a href="../overview">Cancel</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form:form>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -15,6 +15,9 @@
|
||||||
|
|
||||||
<h2>User Overview</h2>
|
<h2>User Overview</h2>
|
||||||
|
|
||||||
|
<div class="pull-right">
|
||||||
|
<a href="form/plus" class="btn btn-success btn-sm">Add User</a>
|
||||||
|
</div>
|
||||||
<form action="" class="form-inline">
|
<form action="" class="form-inline">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="text" class="form-control" placeholder="Type username" name="username"
|
<input type="text" class="form-control" placeholder="Type username" name="username"
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.monkeyk.sos.infrastructure;
|
||||||
|
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import static org.testng.Assert.*;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @author Shengzhao Li
|
||||||
|
*/
|
||||||
|
public class PasswordHandlerTest {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMd5() throws Exception {
|
||||||
|
|
||||||
|
final String md5 = PasswordHandler.md5("123456");
|
||||||
|
assertNotNull(md5);
|
||||||
|
System.out.println(md5);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue