Sfoglia il codice sorgente

1. 优化用户注册页面
2. 完善用户注册逻辑

王育民 5 anni fa
parent
commit
9af08bdac7

+ 66 - 0
src/main/java/cn/minbb/job/controller/rest/SignController.java

@@ -0,0 +1,66 @@
+package cn.minbb.job.controller.rest;
+
+import cn.minbb.job.data.Const;
+import cn.minbb.job.data.ResponseResult;
+import cn.minbb.job.enumerate.Role;
+import cn.minbb.job.model.User;
+import cn.minbb.job.model.UserRole;
+import cn.minbb.job.model.vo.UserVo;
+import cn.minbb.job.service.UserRoleService;
+import cn.minbb.job.service.UserService;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@Log4j2
+@RequestMapping("")
+@RestController
+public class SignController {
+
+    private final UserService userService;
+    private final UserRoleService userRoleService;
+
+    public SignController(UserService userService, UserRoleService userRoleService) {
+        this.userService = userService;
+        this.userRoleService = userRoleService;
+    }
+
+    @PostMapping("/sign-up-user")
+    public ResponseResult<UserVo> signUpUser(@RequestBody Map<String, String> params) {
+        log.info("注册个人用户入参:{}", params);
+        String name = params.get("name");
+        String username = params.get("username");
+        String password = params.get("password");
+        if (userService.existsByUsername(username)) {
+            return ResponseResult.<UserVo>ok(false).code(Const.ReturnCode.FAILED).message("用户名已存在").build();
+        } else {
+            User user = new User();
+            user.setName(name);
+            user.setUsername(username);
+            user.setPassword(password);
+            user.setIsAccountNonExpired(Boolean.TRUE);
+            user.setIsAccountNonLocked(Boolean.TRUE);
+            user.setIsCredentialsNonExpired(Boolean.TRUE);
+            user.setIsEnabled(Boolean.TRUE);
+            Set<UserRole> userRoleSet = new HashSet<>(1);
+            userRoleSet.add(userRoleService.findOneByName(Role.USER.name()));
+            user.setUserRoleSet(userRoleSet);
+            user = userService.saveOne(user);
+            UserVo userVo = JSON.parseObject(JSON.toJSONString(user), UserVo.class);
+            return ResponseResult.<UserVo>ok(true).code(Const.ReturnCode.SUCCESS).message(Const.ReturnMessage.SUCCESS).data(userVo).build();
+        }
+    }
+
+    @PostMapping("/sign-up-company")
+    public ResponseResult<UserVo> signUpCompany(@RequestBody Map<String, String> params) {
+        log.info("注册企业用户入参:{}", params);
+        return null;
+    }
+}

+ 3 - 3
src/main/java/cn/minbb/job/controller/web/SignController.java

@@ -25,19 +25,19 @@ public class SignController {
 
     @GetMapping("/register/user")
     public ModelAndView registerUserPage(ModelAndView modelAndView) {
-        modelAndView.setViewName(Const.ViewName.VIEW_SIGN_UP);
+        modelAndView.setViewName(Const.ViewName.VIEW_SIGN_UP_USER);
         return modelAndView;
     }
 
     @GetMapping("/register/school")
     public ModelAndView registerSchoolPage(ModelAndView modelAndView) {
-        modelAndView.setViewName(Const.ViewName.VIEW_SIGN_UP);
+        modelAndView.setViewName(Const.ViewName.VIEW_REDIRECT);
         return modelAndView;
     }
 
     @GetMapping("/register/company")
     public ModelAndView registerCompanyPage(ModelAndView modelAndView) {
-        modelAndView.setViewName(Const.ViewName.VIEW_SIGN_UP);
+        modelAndView.setViewName(Const.ViewName.VIEW_SIGN_UP_COMPANY);
         return modelAndView;
     }
 }

+ 2 - 1
src/main/java/cn/minbb/job/data/Const.java

@@ -46,7 +46,8 @@ public class Const {
         String VIEW_INDEX = "index";
         String VIEW_REGISTER = "register";
         String VIEW_SIGN_IN = "sign-in";
-        String VIEW_SIGN_UP = "sign-up";
+        String VIEW_SIGN_UP_USER = "sign-up-user";
+        String VIEW_SIGN_UP_COMPANY = "sign-up-company";
         String VIEW_ABOUT = "about";
         String VIEW_JOB_FULL = "job-full";
         String VIEW_JOB_PRACTICE = "job-practice";

+ 11 - 16
src/main/java/cn/minbb/job/model/User.java

@@ -3,8 +3,7 @@ package cn.minbb.job.model;
 import cn.minbb.job.enumerate.Role;
 import com.alibaba.fastjson.annotation.JSONField;
 import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.EqualsAndHashCode;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
@@ -20,24 +19,26 @@ import java.util.Set;
  */
 @Data
 @Entity
+@EqualsAndHashCode(callSuper = true)
 @Table(name = "user",
         indexes = {
                 @Index(name = "index_id", columnList = "id"),
                 @Index(name = "index_username", columnList = "username"),
-                @Index(name = "index_name", columnList = "name")
+                @Index(name = "index_name", columnList = "name"),
+                @Index(name = "index_company_id", columnList = "company_id")
         }
 )
 public class User extends Auditable implements UserDetails {
 
+    @Column(name = "name", columnDefinition = "VARCHAR(32) COMMENT '姓名'")
+    private String name;
+
     @Column(name = "username", nullable = false, columnDefinition = "VARCHAR(32) COMMENT '用户名'")
     private String username;
 
     @Column(name = "password", nullable = false, columnDefinition = "VARCHAR(256) COMMENT '密码'")
     private String password;
 
-    @Column(name = "name", columnDefinition = "VARCHAR(32) COMMENT '姓名'")
-    private String name;
-
     @Column(name = "signature", columnDefinition = "VARCHAR(255) COMMENT '签名'")
     private String signature;
 
@@ -53,28 +54,18 @@ public class User extends Auditable implements UserDetails {
     @Column(name = "qq", columnDefinition = "VARCHAR(16) COMMENT 'QQ'")
     private String qq;
 
-    @Getter
-    @Setter
     @Column(name = "is_account_non_expired", nullable = false, columnDefinition = "TINYINT DEFAULT '1' COMMENT '帐户未过期'")
     private Boolean isAccountNonExpired;
 
-    @Getter
-    @Setter
     @Column(name = "is_account_non_locked", nullable = false, columnDefinition = "TINYINT DEFAULT '1' COMMENT '帐户未锁定'")
     private Boolean isAccountNonLocked;
 
-    @Getter
-    @Setter
     @Column(name = "is_credentials_non_expired", nullable = false, columnDefinition = "TINYINT DEFAULT '1' COMMENT '凭据未过期'")
     private Boolean isCredentialsNonExpired;
 
-    @Getter
-    @Setter
     @Column(name = "is_enabled", nullable = false, columnDefinition = "TINYINT DEFAULT '1' COMMENT '帐户已启用'")
     private Boolean isEnabled;
 
-    @Getter
-    @Setter
     @ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
     @JoinTable(name = "user_user_role",
             joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
@@ -82,6 +73,10 @@ public class User extends Auditable implements UserDetails {
     )
     private Set<UserRole> userRoleSet;
 
+    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = true)
+    @JoinColumn(name = "company_id", columnDefinition = "INT COMMENT '企业ID'")
+    private Company company;
+
     @JSONField(serialize = false)
     @Override
     public Collection<? extends GrantedAuthority> getAuthorities() {

+ 18 - 0
src/main/java/cn/minbb/job/model/vo/UserVo.java

@@ -0,0 +1,18 @@
+package cn.minbb.job.model.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+public class UserVo implements Serializable {
+    private String name;
+    private String username;
+    private String signature;
+    private String avatar;
+    private String phone;
+    private String mail;
+    private String qq;
+}

+ 2 - 0
src/main/java/cn/minbb/job/service/UserService.java

@@ -9,4 +9,6 @@ public interface UserService extends UserDetailsService {
     User findOneById(Integer id);
 
     User findUserByUsername(String username);
+
+    boolean existsByUsername(String username);
 }

+ 8 - 0
src/main/java/cn/minbb/job/service/impl/UserServiceImpl.java

@@ -4,6 +4,7 @@ import cn.minbb.job.model.User;
 import cn.minbb.job.model.UserRole;
 import cn.minbb.job.model.repository.UserRepository;
 import cn.minbb.job.service.UserService;
+import org.springframework.data.domain.Example;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.CredentialsExpiredException;
 import org.springframework.security.authentication.DisabledException;
@@ -42,6 +43,13 @@ public class UserServiceImpl implements UserService {
         return userRepository.findOneByUsername(username);
     }
 
+    @Override
+    public boolean existsByUsername(String username) {
+        User user = new User();
+        user.setUsername(username);
+        return userRepository.exists(Example.of(user));
+    }
+
     @Override
     public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
         User user = userRepository.findOneByUsername(s);

+ 23 - 1
src/main/resources/templates/register.html

@@ -103,7 +103,7 @@
 
         <div class="row text-center">
             <div class="col col-md-12">
-                若无法选择类型请查阅 <a href="/register">帐号类型区别</a>
+                若无法选择类型请查阅 <a href="#modal-account-type" data-toggle="modal">帐号类型区别</a>
             </div>
         </div>
     </div>
@@ -128,6 +128,28 @@
             </div>
         </div>
     </div>
+
+    <div class="modal fade" id="modal-account-type" tabindex="-1" role="dialog" aria-labelledby="" aria-hidden="true">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title">账号类型</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <h5>个人用户</h5>
+                    <p>可以查找公司,创建简历,申请职位,投递简历</p>
+                    <h5>公司企业</h5>
+                    <p>可以发布招工职位信息,查收简历</p>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-primary" data-dismiss="modal">了解</button>
+                </div>
+            </div>
+        </div>
+    </div>
 </th:block>
 </body>
 </html>

+ 5 - 5
src/main/resources/templates/sign-in.html

@@ -24,12 +24,12 @@
     </div>
 
     <div class="form-label-group">
-        <input class="form-control" id="username" name="username" type="text" placeholder="用户名" style="height: 44px;" required autofocus/>
+        <input class="form-control" id="username" name="username" type="text" placeholder="用户名" maxlength="20" style="height: 44px;" required autofocus/>
         <label for="username">用户名</label>
     </div>
 
     <div class="form-label-group">
-        <input class="form-control" id="password" name="password" type="password" placeholder="密码" style="height: 44px;" required/>
+        <input class="form-control" id="password" name="password" type="password" placeholder="密码" maxlength="32" style="height: 44px;" required/>
         <label for="password">密码</label>
     </div>
 
@@ -62,9 +62,9 @@
     </div>
 </div>
 
-<script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.js"></script>
-<script src="https://unpkg.com/popper.js@1.12.6/dist/umd/popper.js"></script>
-<script src="https://unpkg.com/bootstrap-material-design@4.1.1/dist/js/bootstrap-material-design.js"></script>
+<script src="https://files.minbb.cn/plugins/jquery/3.4.0/jquery.js"></script>
+<script src="https://files.minbb.cn/plugins/popper/1.12.6/popper.js"></script>
+<script src="https://files.minbb.cn/plugins/bootstrap-material-design/4.1.1/js/bootstrap-material-design.js"></script>
 <script>
     $(document).ready(function () {
     });

+ 99 - 0
src/main/resources/templates/sign-up-company.html

@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns="http://www.w3.org/1999/html"
+      xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
+    <title>企业用户注册</title>
+
+    <link href="https://files.minbb.cn/plugins/bootstrap-material-design/4.1.1/css/bootstrap-material-design.min.css" rel="stylesheet"/>
+    <link href="../static/css/user-sign.css" th:href="@{/css/user-sign.css}" rel="stylesheet"/>
+
+    <style>
+        .form-label-group {
+            margin-bottom: 4px;
+        }
+    </style>
+</head>
+<body>
+<div class="form-login">
+    <div class="text-center">
+        <a href="/"><img class="mb-4" src="/favicon.ico" alt="" width="72" height="72" th:src="@{/favicon.ico}"/></a>
+        <h1 class="h3 mb-3 font-weight-normal">企业用户注册</h1>
+    </div>
+
+    <div class="form-label-group">
+        <input class="form-control" id="name" type="text" placeholder="姓名" maxlength="32" style="height: 44px;" required autofocus/>
+        <label for="name">企业名称</label>
+    </div>
+
+    <div class="form-label-group">
+        <input class="form-control" id="username" type="text" placeholder="用户名" maxlength="16" style="height: 44px; margin-top: 0;" required/>
+        <label for="username">用户名</label>
+    </div>
+
+    <div class="form-label-group">
+        <input class="form-control" id="password" type="password" placeholder="密码" minlength="6" maxlength="24" style="height: 44px; margin-bottom: 0;" required/>
+        <label for="password">密码</label>
+    </div>
+
+    <div class="form-label-group">
+        <input class="form-control" id="repeat-password" type="password" placeholder="重复密码" minlength="6" maxlength="24" style="height: 44px;" required/>
+        <label for="repeat-password">重复密码</label>
+    </div>
+
+    <div class="text-center mb-3"><a href="/login">我有账号? 去登录</a></div>
+    <button class="btn btn-lg btn-success btn-block" type="button" onclick="return submit();">注册</button>
+    <p class="text-center mt-5 mb-3 text-muted">&copy; 2020 校园招聘网</p>
+</div>
+
+<script src="https://files.minbb.cn/plugins/jquery/3.4.0/jquery.js"></script>
+<script>
+    $(document).ready(function () {
+    });
+
+    function submit() {
+        let nameInput = $('#name'), usernameInput = $('#username'), passwordInput = $('#password'), passwordInput2 = $('#repeat-password');
+        let name = nameInput.val(), username = usernameInput.val(), password = passwordInput.val(), password2 = passwordInput2.val();
+        if (name === "") {
+            alert("姓名不能为空");
+            return;
+        } else if (username === "") {
+            alert("用户名不能为空");
+            return;
+        } else if (password === "") {
+            alert("密码不能为空");
+            return;
+        } else if (password.length < 6) {
+            alert("密码至少六位");
+            return;
+        } else if (password !== password2) {
+            alert("两次密码输入不一致");
+            passwordInput.val("");
+            passwordInput2.val("");
+            return;
+        }
+        $.ajax({
+            url: '/sign-up-company',
+            type: 'post',
+            contentType: "application/json; charset=utf-8",
+            data: JSON.stringify({"name": name, "username": username, "password": password}),
+            async: true,
+            dataType: 'json',
+            success: function (result) {
+                if (result && result.success) {
+                    let user = result.data;
+                    alert("恭喜你 " + user.name + " ,注册成功,登录用户名为:" + user.username);
+                    window.location.href = "/sign-in";
+                } else {
+                    alert("注册失败:" + result.message);
+                    window.location.reload();
+                }
+            }
+        });
+        return false;
+    }
+</script>
+</body>
+</html>

+ 5 - 5
src/main/resources/templates/sign-up.html → src/main/resources/templates/sign-up-user.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
-    <title>用户注册</title>
+    <title>个人用户注册</title>
 
     <link href="https://files.minbb.cn/plugins/bootstrap-material-design/4.1.1/css/bootstrap-material-design.min.css" rel="stylesheet"/>
     <link href="../static/css/user-sign.css" th:href="@{/css/user-sign.css}" rel="stylesheet"/>
@@ -20,7 +20,7 @@
 <div class="form-login">
     <div class="text-center">
         <a href="/"><img class="mb-4" src="/favicon.ico" alt="" width="72" height="72" th:src="@{/favicon.ico}"/></a>
-        <h1 class="h3 mb-3 font-weight-normal">用户注册</h1>
+        <h1 class="h3 mb-3 font-weight-normal">个人用户注册</h1>
     </div>
 
     <div class="form-label-group">
@@ -48,7 +48,7 @@
     <p class="text-center mt-5 mb-3 text-muted">&copy; 2020 校园招聘网</p>
 </div>
 
-<script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.js"></script>
+<script src="https://files.minbb.cn/plugins/jquery/3.4.0/jquery.js"></script>
 <script>
     $(document).ready(function () {
     });
@@ -75,12 +75,12 @@
             return;
         }
         $.ajax({
-            url: '/sign-up',
+            url: '/sign-up-user',
             type: 'post',
+            contentType: "application/json; charset=utf-8",
             data: JSON.stringify({"name": name, "username": username, "password": password}),
             async: true,
             dataType: 'json',
-            contentType: false,
             success: function (result) {
                 if (result && result.success) {
                     let user = result.data;