فهرست منبع

添加企业注册

wangmh 8 سال پیش
والد
کامیت
4691e51252

+ 113 - 0
sso-server/src/main/java/com/uas/sso/controller/BaseController.java

@@ -1,14 +1,22 @@
 package com.uas.sso.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.uas.message.sms.service.SmsService;
+import com.uas.sso.core.Const;
 import com.uas.sso.core.PasswordStrength;
+import com.uas.sso.entity.Setting;
+import com.uas.sso.entity.Token;
 import com.uas.sso.exception.VisibleError;
+import com.uas.sso.service.SettingService;
+import com.uas.sso.service.TokenService;
+import com.uas.sso.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.ui.ModelMap;
+import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -31,6 +39,15 @@ public class BaseController {
 	@Autowired
 	protected HttpServletResponse response;
 
+    @Autowired
+    protected TokenService tokenService;
+
+    @Autowired
+    protected SmsService smsService;
+
+    @Autowired
+    protected SettingService settingService;
+
 	protected static boolean isSuccess(ModelMap map) {
 		return Boolean.TRUE.equals(map.get("success"));
 	}
@@ -105,6 +122,13 @@ public class BaseController {
 		return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.CREATED);
 	}
 
+    /**
+     * 校验密码强度
+     *
+     * @param password 密码
+     * @return PasswordStrength枚举
+     * @throws VisibleError 用户可见异常
+     */
 	protected PasswordStrength checkPasswordLevel(String password) throws VisibleError {
 		String strongRegex = "^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]))|((?=.*[0-9])((?=.*[a-zA-Z]))(?=.*[^a-zA-Z0-9]))).*$";
 		String mediumRegex = "^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z]))|((?=.*[0-9])(?=.*[A-Z]))).*$";
@@ -119,4 +143,93 @@ public class BaseController {
 			return PasswordStrength.WEAK;
 		}
 	}
+
+    /**
+     * 获取手机号验证码
+     *
+     * @return tokenId
+     */
+	protected String getMobileCode(String mobile) {
+        // 随机获得验证码
+        String code = StringUtil.getRandomNumber(6);
+        Token token = new Token(code, 10*60);
+
+        // 设置绑定手机,防止获取验证码之后修改手机号
+        token.setMobile(mobile);
+
+        // 将token存到Redis服务器上
+        tokenService.save(token);
+
+        // 将验证码发送到手机上
+        ModelMap data = new ModelMap();
+        data.put("checkcode", code);
+        // 手机短信
+        try {
+            if (!StringUtils.isEmpty(mobile)) {
+                Setting smsTplId = settingService.findOne("templateForSendSmsWhenRegister");
+                if (!StringUtils.isEmpty(smsTplId)) {
+                    smsService.send(smsTplId.getValue(), mobile, new Object[]{code});
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        // 返回tokenId
+        return token.getId();
+    }
+
+    /**
+     * 校验手机号
+     *
+     * @param token 验证码tokenID
+     * @param mobile 手机号
+     * @param code 验证码
+     * @return
+     * @throws VisibleError 校验失败则抛异常
+     *          当参数异常,token过期或者token绑定的手机号不对时抛出此异常
+     */
+    protected void checkMobileCode(String token, String mobile, String code) {
+        // 校验参数
+        if (StringUtils.isEmpty(token) || StringUtils.isEmpty(code)) {
+            throw new VisibleError("参数错误");
+        }
+        Token existToken = tokenService.findOne(token);
+        if (existToken == null || existToken.isExpired()) {
+            throw new VisibleError("验证码已经失效,请重新获取");
+        }
+        if (StringUtils.isEmpty(mobile) || !mobile.equals(existToken.getMobile())) {
+            throw new VisibleError("手机号被修改,请重新获取验证码");
+        }
+
+        // 校验验证码
+        String existCode = existToken.getBind().toString();
+        if (!code.equals(existCode)) {
+            throw new VisibleError("验证码错误");
+        }
+    }
+
+	/**
+	 * 校验手机号格式
+	 *
+	 * @param mobile 手机号
+	 * @param mobileArea 手机号所属区域
+	 */
+	protected void checkMobile(String mobile, String mobileArea) {
+		// 由于现在不考虑手机号所属区域,默认为中国大陆
+		mobileArea = mobileArea == null ? Const.CONTINENT : mobileArea;
+
+		// 校验手机号
+		if (Const.CONTINENT.equals(mobileArea)) {
+			if (!mobile.matches(Const.REGEXP_MOBILE_CONTINENT)) {
+				throw new VisibleError("请输入正确的手机号格式");
+			}
+		} else if (Const.HONGKONG.equals(mobileArea)) {
+			if (!mobile.matches(Const.REGEXP_MOBILE_HONGKONG)) {
+				throw new VisibleError("请输入正确的手机号格式");
+			}
+		} else {
+			throw new VisibleError("未找到所选地区");
+		}
+	}
 }

+ 27 - 57
sso-server/src/main/java/com/uas/sso/controller/PersonalRegisterController.java

@@ -64,46 +64,35 @@ public class PersonalRegisterController extends BaseController {
 
         // 参数空校验
         if (StringUtils.isEmpty(vipName)) {
-            return error("400", "会员名不能为空");
+            return error("会员名不能为空");
         }
         if (StringUtils.isEmpty(password)) {
-            return error("400", "密码不能为空");
+            return error("密码不能为空");
         }
         if (StringUtils.isEmpty(mobile)) {
-            return error("400", "手机号不能为空");
-        }
-
-        // 校验验证码
-        ModelMap checkResult = checkCode(mobile, code, token);
-        if (checkResult.get(Const.SUCCESS) == null) {
-            // 校验不成功,返回校验的错误信息
-            return checkResult;
+            return error("手机号不能为空");
         }
 
         // 校验手机号
-        if (Const.CONTINENT.equals(mobileArea)) {
-            if (!mobile.matches(Const.REGEXP_MOBILE_CONTINENT)) {
-                return error("400", "请输入正确的手机号格式");
-            }
-        } else if (Const.HONGKONG.equals(mobileArea)) {
-            if (!mobile.matches(Const.REGEXP_MOBILE_HONGKONG)) {
-                return error("400", "请输入正确的手机号格式");
-            }
-        } else {
-            return error("400", "未找到所选地区");
-        }
+        checkMobile(mobile, mobileArea);
+
+        // 校验验证码
+        checkMobileCode(mobile, code, token);
 
         // 校验密码
         if (PasswordStrength.WEAK.equals(checkPasswordLevel(password))) {
-            return error("400", "密码强度过低,请重新输入密码");
+            return error("密码须为8-20字符的英文、数字混合");
         }
 
-        // 注册
+        // 注册并添加注册日志
         user.setFromApp(StringUtils.isEmpty(appId) ? "sso" : appId);
         userService.register(user);
-        tokenService.delete(token);
         registerLogger.info(Type.REGISTER_PERSONAL.getValue(), 1, "个人注册成功", user, user.getFromApp());
 
+        // 注册成功后删除验证码token
+        tokenService.delete(token);
+
+        // 设置返回数据
         return success();
     }
 
@@ -116,25 +105,14 @@ public class PersonalRegisterController extends BaseController {
     @RequestMapping(value = "/checkCode", method = RequestMethod.GET)
     @ResponseBody
     public ModelMap getCode(String mobile) {
-        String code = StringUtil.getRandomNumber(6);
-        Token token = new Token(code, 10*60);
-        token.setMobile(mobile);
-        tokenService.save(token);
+        // 获取验证码
+        String token = getMobileCode(mobile);
+
+        // 设置返回数据
         ModelMap data = new ModelMap();
-        data.put("checkcode", code);
-        request.getSession().setAttribute("token", token.getId());
-        // 手机短信
-        try {
-            if (!StringUtils.isEmpty(mobile)) {
-                Setting smsTplId = settingService.findOne("templateForSendSmsWhenRegister");
-                if (!StringUtils.isEmpty(smsTplId)) {
-                    smsService.send(smsTplId.getValue(), mobile, new Object[]{code});
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return new ModelMap("token", token.getId());
+        data.put("token", token);
+        request.getSession().setAttribute("token", token);
+        return data;
     }
 
     /**
@@ -146,25 +124,17 @@ public class PersonalRegisterController extends BaseController {
      */
     @RequestMapping(value = "/checkCode", method = RequestMethod.POST)
     @ResponseBody
-    public ModelMap checkCode(String mobile, String code, String token) {
-        // 校验参数
-        if (StringUtils.isEmpty(token) || StringUtils.isEmpty(token)) {
-            return error("参数错误");
-        }
-        Token existToken = tokenService.findOne(token);
-        if (existToken == null || existToken.isExpired()) {
-            return error("验证码已经失效,请重新获取");
-        }
-        if (StringUtils.isEmpty(mobile) || !mobile.equals(existToken.getMobile())) {
-            return error("手机号被修改,请重新获取验证码");
+    public ModelMap checkCode(String token, String mobile, String code) {
+        // 校验token是否正确
+        String sessionToken = (String) request.getSession().getAttribute("token");
+        if (StringUtils.isEmpty(sessionToken) || sessionToken.equals(token)) {
+            return error("请重新获取验证码");
         }
 
         // 校验验证码
-        String existCode = existToken.getBind().toString();
-        if (!code.equals(existCode)) {
-            return error("验证码错误");
-        }
+        checkMobileCode(token, mobile, code);
 
+        // 设置返回值
         return success();
     }
 }

+ 6 - 0
sso-server/src/main/java/com/uas/sso/controller/UserManagerController.java

@@ -22,6 +22,12 @@ public class UserManagerController extends BaseController {
     @Autowired
     private UserService userService;
 
+    /**
+     * 校验手机号是否被注册
+     *
+     * @param mobile 手机号
+     * @return
+     */
     @RequestMapping(value = "/checkMobile", method = RequestMethod.GET)
     @ResponseBody
     public ModelMap checkMobile(String mobile) {

+ 155 - 1
sso-server/src/main/java/com/uas/sso/controller/UserspaceRegisterController.java

@@ -1,12 +1,166 @@
 package com.uas.sso.controller;
 
+import com.uas.sso.core.PasswordStrength;
+import com.uas.sso.entity.User;
+import com.uas.sso.entity.Userspace;
+import com.uas.sso.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
 /**
  * 企业注册controller
  *
  * @author wangmh
  * @date 2018/1/4
  */
-public class UserspaceRegisterController {
+@RequestMapping("/sso/register")
+@Controller
+public class UserspaceRegisterController extends BaseController {
+
+    @Autowired
+    private UserService userService;
+
+    /**
+     * 企业注册第一步,验证手机号
+     *
+     * @param mobile 手机号
+     * @param code 验证码
+     * @param token 验证码tokenId
+     * @return
+     */
+    @RequestMapping(value = "/checkAdminTel", method = RequestMethod.POST)
+    @ResponseBody
+    public ModelMap checkAdminTel(String mobile, String code, String token) {
+        // 校验验证码
+        checkMobileCode(token, mobile, code);
+
+        // 设置返回数据
+        ModelMap data = new ModelMap();
+        User user = userService.findByMobile(mobile);
+        if (user == null) {
+            data.put("hasRegister", false);
+        } else {
+            data.put("hasRegister", true);
+            data.put("hasEmail", StringUtils.isEmpty(user.getEmail()));
+        }
+        request.getSession().setAttribute("mobile", user.getMobile());
+
+        return success(data);
+    }
+
+    /**
+     * 企业注册第二步,填写企业信息
+     *
+     * @param userspace 企业信息
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.POST)
+    @ResponseBody
+    public ModelMap register(Userspace userspace, User user) {
+        // 获取企业信息
+        String spaceName = userspace.getSpaceName();
+        String businessCode = userspace.getBusinessCode();
+        String adminName = user.getVipName();
+        String password = user.getPassword();
+        String adminEmail = user.getEmail();
+
+        // 校验参数
+        String mobile = (String) request.getSession().getAttribute("mobile");
+        if (StringUtils.isEmpty(mobile)) {
+            return error("请刷新后重试");
+        }
+        if (StringUtils.isEmpty(spaceName)) {
+            return error("请填写正确的企业名称");
+        }
+        if (StringUtils.isEmpty(businessCode)) {
+            return error("请填写正确的企业营业执照号");
+        }
+        User admin = userService.findByMobile(mobile);
+        if (admin == null) {
+            // 新用户: 管理员名称,密码不能为空
+            if (StringUtils.isEmpty(businessCode)) {
+                return error("请填写正确的管理员名称");
+            }
+            if (StringUtils.isEmpty(password)) {
+                return error("请填写正确的密码");
+            }
+        }
+
+        // 校验密码强度
+        PasswordStrength strength = checkPasswordLevel(password);
+        if (PasswordStrength.WEAK.getValue() == strength.getValue()) {
+            return error("密码须为8-20字符的英文、数字混合");
+        }
+
+        // 设置企业管理员信息
+        if (admin == null) {
+            // 新用户直接注册
+            admin = new User();
+            admin.setVipName(adminName);
+            admin.setPassword(password);
+            admin.setEmail(adminEmail);
+            userService.register(admin);
+        } else if (StringUtils.isEmpty(admin.getEmail())) {
+            // 老用户邮箱为空的话设置邮箱
+            admin.setEmail(adminEmail);
+            userService.save(admin);
+        }
+
+        // 给企业设置企业管理员
+        userspace.setAdmin(admin);
+
+        // 企业注册
+        return success();
+    }
+
+    /**
+     * 获取验证码
+     *
+     * @param mobile 手机号
+     * @param mobileArea
+     * @return success(tokenId)
+     */
+    @RequestMapping(value = "/checkCode", method = RequestMethod.GET)
+    @ResponseBody
+    public ModelMap getCode(String mobile, String mobileArea) {
+        // 校验手机号
+        checkMobile(mobile, mobileArea);
+
+        // 获取验证码
+        String token = getMobileCode(mobile);
+
+        // 设置返回数据
+        ModelMap data = new ModelMap();
+        data.put("token", token);
+        request.getSession().setAttribute("token", token);
+        return data;
+    }
+
+    /**
+     * 校验验证码
+     *
+     * @param code 验证码
+     * @param token 验证码tokenId
+     * @return 验证成功:success()
+     */
+    @RequestMapping(value = "/checkCode", method = RequestMethod.POST)
+    @ResponseBody
+    public ModelMap checkCode(String token, String mobile, String code) {
+        // 校验token是否正确
+        String sessionToken = (String) request.getSession().getAttribute("token");
+        if (StringUtils.isEmpty(sessionToken) || sessionToken.equals(token)) {
+            return error("请重新获取验证码");
+        }
 
+        // 校验验证码
+        checkMobileCode(token, mobile, code);
 
+        // 设置返回值
+        return success();
+    }
 }

+ 3 - 3
sso-server/src/main/java/com/uas/sso/entity/User.java

@@ -29,13 +29,13 @@ public class User implements Serializable {
     /**
      * 会员名
      */
-    @Column(name = "vipName")
+    @Column(name = "vipName", nullable = false)
     private String vipName;
 
     /**
      * 手机号
      */
-    @Column(name = "mobile")
+    @Column(name = "mobile", unique = true, nullable = false)
     private String mobile;
 
     /**
@@ -53,7 +53,7 @@ public class User implements Serializable {
     /**
      * 用户密码
      */
-    @Column(name = "_password")
+    @Column(name = "_password", nullable = false)
     private String password;
 
     /**

+ 320 - 0
sso-server/src/main/java/com/uas/sso/entity/Userspace.java

@@ -0,0 +1,320 @@
+package com.uas.sso.entity;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+/**
+ * 企业实体
+ *
+ * @author wangmh
+ * @date 2018/1/4
+ */
+@Entity
+@Table(name = "sso$userspace")
+public class Userspace implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 企业uu号
+     */
+    @Id
+    @Column(name = "spaceUU")
+    private Long spaceUU;
+
+    /**
+     * 企业名称
+     */
+    @Column(name = "spaceName")
+    private String spaceName;
+
+    /**
+     * 法定代表人
+     */
+    @Column(name = "corporation")
+    private String corporation;
+
+    /**
+     * 注册日期
+     */
+    @Column(name = "registerDate")
+    private Timestamp registerDate;
+
+    /**
+     * 管理员uu号
+     */
+    @Column(name = "adminUU")
+    private Long adminUU;
+
+    /**
+     * 管理员
+     */
+    @ManyToOne
+    @JoinColumn(name = "adminUU", insertable=false, updatable=false)
+    private User admin;
+
+    /**
+     * 营业执照号
+     */
+    @Column(name = "businessCode")
+    private String businessCode;
+
+    /**
+     * 营业执照
+     */
+    @Column(name = "businessCodeImage")
+    private String businessCodeImage;
+
+    /**
+     * 注册地址
+     */
+    @Column(name = "regAddress")
+    private String regAddress;
+
+    /**
+     * 公司地址
+     */
+    @Column(name = "companyAddress")
+    private String companyAddress;
+
+    /**
+     * 企业信息认证状态
+     */
+    @Column(name = "isValid")
+    private Short isValid;
+
+    /**
+     * logo图片
+     */
+    @Column(name = "logoImage")
+    private String logoImage;
+
+    /**
+     * 公司地址经度
+     */
+    @Column(name = "longitude")
+    private String longitude;
+
+    /**
+     * 公司地址纬度
+     */
+    @Column(name = "latitude")
+    private String latitude;
+
+    /**
+     * 公司所在国家
+     */
+    @Column(name = "country")
+    private String country;
+
+    /**
+     * 公司所在省份、州、直辖市、行政区
+     */
+    @Column(name = "province")
+    private String province;
+
+    /**
+     * 公司所在城市
+     */
+    @Column(name = "city")
+    private String city;
+
+    /**
+     * 企业联系电话
+     */
+    @Column(name = "telephone")
+    private String telephone;
+
+    /**
+     * 主营业务范围
+     */
+    @Column(name = "mainBusiness")
+    private String mainBusiness;
+
+    /**
+     * 对公银行账户
+     */
+    @Column(name = "bankAccount")
+    private String bankAccount;
+
+    /**
+     * 对公银行账户开户行
+     */
+    @Column(name = "bank")
+    private String bank;
+
+    public Userspace() {
+    }
+
+    public Long getSpaceUU() {
+        return spaceUU;
+    }
+
+    public void setSpaceUU(Long spaceUU) {
+        this.spaceUU = spaceUU;
+    }
+
+    public String getSpaceName() {
+        return spaceName;
+    }
+
+    public void setSpaceName(String spaceName) {
+        this.spaceName = spaceName;
+    }
+
+    public String getCorporation() {
+        return corporation;
+    }
+
+    public void setCorporation(String corporation) {
+        this.corporation = corporation;
+    }
+
+    public Timestamp getRegisterDate() {
+        return registerDate;
+    }
+
+    public void setRegisterDate(Timestamp registerDate) {
+        this.registerDate = registerDate;
+    }
+
+    public Long getAdminUU() {
+        return adminUU;
+    }
+
+    public void setAdminUU(Long adminUU) {
+        this.adminUU = adminUU;
+    }
+
+    public User getAdmin() {
+        return admin;
+    }
+
+    public void setAdmin(User admin) {
+        this.admin = admin;
+    }
+
+    public String getBusinessCode() {
+        return businessCode;
+    }
+
+    public void setBusinessCode(String businessCode) {
+        this.businessCode = businessCode;
+    }
+
+    public String getBusinessCodeImage() {
+        return businessCodeImage;
+    }
+
+    public void setBusinessCodeImage(String businessCodeImage) {
+        this.businessCodeImage = businessCodeImage;
+    }
+
+    public String getRegAddress() {
+        return regAddress;
+    }
+
+    public void setRegAddress(String regAddress) {
+        this.regAddress = regAddress;
+    }
+
+    public String getCompanyAddress() {
+        return companyAddress;
+    }
+
+    public void setCompanyAddress(String companyAddress) {
+        this.companyAddress = companyAddress;
+    }
+
+    public Short getIsValid() {
+        return isValid;
+    }
+
+    public void setIsValid(Short isValid) {
+        this.isValid = isValid;
+    }
+
+    public String getLogoImage() {
+        return logoImage;
+    }
+
+    public void setLogoImage(String logoImage) {
+        this.logoImage = logoImage;
+    }
+
+    public String getLongitude() {
+        return longitude;
+    }
+
+    public void setLongitude(String longitude) {
+        this.longitude = longitude;
+    }
+
+    public String getLatitude() {
+        return latitude;
+    }
+
+    public void setLatitude(String latitude) {
+        this.latitude = latitude;
+    }
+
+    public String getCountry() {
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getTelephone() {
+        return telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        this.telephone = telephone;
+    }
+
+    public String getMainBusiness() {
+        return mainBusiness;
+    }
+
+    public void setMainBusiness(String mainBusiness) {
+        this.mainBusiness = mainBusiness;
+    }
+
+    public String getBankAccount() {
+        return bankAccount;
+    }
+
+    public void setBankAccount(String bankAccount) {
+        this.bankAccount = bankAccount;
+    }
+
+    public String getBank() {
+        return bank;
+    }
+
+    public void setBank(String bank) {
+        this.bank = bank;
+    }
+}

+ 17 - 0
sso-server/src/main/java/com/uas/sso/service/UserService.java

@@ -19,6 +19,14 @@ public interface UserService {
      */
     User findByMobile(String mobile, String mobileArea);
 
+    /**
+     * 根据手机号查找用户基本信息
+     *
+     * @param mobile 手机号
+     * @return 查找到用户,未找到为null
+     */
+    User findByMobile(String mobile);
+
     /**
      * 判断手机号是否已经注册
      *
@@ -33,6 +41,7 @@ public interface UserService {
      * 注册新用户
      *
      * @param user 用户信息
+     * @return 保存后用户信息
      */
     User register(User user);
 
@@ -45,4 +54,12 @@ public interface UserService {
      * @return 加密后的密码
      */
     String getEncryPassword(String format, String noEncryPwd, String salt);
+
+    /**
+     * 保存用户信息
+     *
+     * @param user 用户信息
+     * @return 保存后用户信息
+     */
+    User save(User user);
 }

+ 15 - 0
sso-server/src/main/java/com/uas/sso/service/impl/UserServiceImpl.java

@@ -36,6 +36,11 @@ public class UserServiceImpl implements UserService {
         return userDao.findByMobileAndMobileArea(mobile, mobileArea);
     }
 
+    @Override
+    public User findByMobile(String mobile) {
+        return userDao.findByMobile(mobile);
+    }
+
     @Override
     public boolean mobileHasRegistered(String mobile) {
         User user = userDao.findByMobile(mobile);
@@ -52,6 +57,11 @@ public class UserServiceImpl implements UserService {
             throw new VisibleError("该手机号已被注册");
         }
 
+        // 由于现在不考虑手机号所属区域,默认为中国大陆
+        if (StringUtils.isEmpty(user.getMobileArea())) {
+            user.setMobileArea(Const.CONTINENT);
+        }
+
         // 设置基本属性,手机号默认已认证
         user.setRegisterDate(new Timestamp(System.currentTimeMillis()));
         Long uu = userDao.findMaxUU();
@@ -83,4 +93,9 @@ public class UserServiceImpl implements UserService {
         password = password.replace(Const.ENCRY_PARAM_SALT, salt == null ? "" : salt);
         return MD5.toMD5(password);
     }
+
+    @Override
+    public User save(User user) {
+        return userDao.save(user);
+    }
 }