文章目录
前言
项目实训,山大云会议。
在本篇博客中,会展示登录注册功能的部分代码。yml文件和pom文件就不展示了
一、UserController
package com.meeting.login_register_simple.controller;
import com.meeting.login_register_simple.entity.ResponseData;
import com.meeting.login_register_simple.entity.User;
import com.meeting.login_register_simple.exception.UserExistException;
import com.meeting.login_register_simple.service.UserService;
import com.meeting.login_register_simple.util.JwtTokenUtil;
import com.meeting.login_register_simple.util.Md5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@CrossOrigin(origins = {"*"})
public class UserController {
@Autowired
private UserService userService;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private Md5Util md5Util;
private final static String EMAIL_PATTERN = "@mail.sdu.edu.cn";
@ResponseBody
@PostMapping("/login")
public ResponseData login(@RequestParam("text") String text,
@RequestParam("password") String password) {
ResponseData responseData;
User user;
if (checkValidEmail(text)) {
user = userService.loadUserByEmail(text);
} else {
user = userService.loadUserByUsername(text);
}
if (user != null) {
if (md5Util.verify(password, user.getPassword())) {
responseData = new ResponseData(200, "ok");
responseData.getData().put("token", jwtTokenUtil.generateToken(user));
} else {
responseData = new ResponseData(400, "密码错误");
}
} else {
responseData = new ResponseData(400, "用户名或者邮箱不存在");
}
return responseData;
}
@ResponseBody
@PostMapping("/register")
public ResponseData register(@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("email") String email) {
ResponseData responseData;
if (isStringEmpty(username)
|| isStringEmpty(password)
|| isStringEmpty(email)) {
responseData = new ResponseData(400, "不能为空");
return responseData;
}
if (!checkValidLength(username, password, email)) {
responseData = new ResponseData(400, "长度问题");
return responseData;
}
if (!checkValidEmail(email)) {
responseData = new ResponseData(400, "不支持的邮件格式");
return responseData;
}
try {
long uid = userService.register(username, md5Util.encrypt(password), email);
responseData = new ResponseData(200, "ok");
responseData.getData().put("uid", uid);
return responseData;
} catch (UserExistException exception) {
responseData = new ResponseData(400, exception.getMsg());
return responseData;
}
}
private boolean isStringEmpty(String string) {
return string == null || "".equals(string);
}
private boolean checkValidLength(String username, String password, String email) {
return username.length() <= 32 && password.length() <= 32 && email.length() <= 64;
}
private boolean checkValidEmail(String email) {
return email.endsWith(EMAIL_PATTERN);
}
}
二、entity(实体)
1. User
package com.meeting.login_register_simple.entity;
import java.util.List;
public class User {
private Long id;
private String username;
private String email;
private String password;
private String profile;
private List<Role> authorities;
public User() {}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getProfile() {
return profile;
}
public void setProfile(String profile) {
this.profile = profile;
}
public List<Role> getAuthorities() {
return authorities;
}
public void setAuthorities(List<Role> authorities) {
this.authorities = authorities;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", email='" + email + '\'' +
", password='" + password + '\'' +
", authorities=" + authorities +
'}';
}
}
2. Role(角色)
package com.meeting.login_register_simple.entity;
public class Role {
private Long id;
private String authority;
public Role() {}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAuthority() {
return authority;
}
public void setAuthority(String authority) {
this.authority = authority;
}
@Override
public String toString() {
return "Role{" +
"id=" + id +
", authority='" + authority + '\'' +
'}';
}
}
2. UserRole
package com.meeting.login_register_simple.entity;
public class UserRole {
private Long uid;
private Long rid;
public UserRole() {}
public Long getUid() {
return uid;
}
public void setUid(Long uid) {
this.uid = uid;
}
public Long getRid() {
return rid;
}
public void setRid(Long rid) {
this.rid = rid;
}
@Override
public String toString() {
return "UserRole{" +
"uid=" + uid +
", rid=" + rid +
'}';
}
}
三、mapper层
这里只展示xxxMapper.xml文件
1. UserMapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.meeting.login_register_simple.mapper.UserMapper">
<resultMap id="user" type="com.meeting.login_register_simple.entity.User">
<id property="id" column="user_id" />
<result property="username" column="username" />
<result property="email" column="email" />
<result property="password" column="password" />
<result property="profile" column="profile" />
</resultMap>
<select id="findUserById" parameterType="Long" resultMap="user">
SELECT `user_id`, `username`, `password`, `email`, `profile`
FROM `user`
WHERE `user_id` = #{id}
</select>
<select id="findUserByUsername" parameterType="String" resultMap="user">
SELECT `user_id`, `username`, `password`, `email`, `profile`
FROM `user`
WHERE `username` = #{username}
</select>
<select id="findUserByEmail" parameterType="String" resultMap="user">
SELECT `user_id`, `username`, `password`, `email`, `profile`
FROM `user`
WHERE `email` = #{email}
</select>
<insert id="insertUser" parameterType="com.meeting.login_register_simple.entity.User"
useGeneratedKeys="true" keyProperty="id" keyColumn="user_id">
INSERT INTO `user` (`username`, `password`, `email`, `profile`)
VALUES (#{user.username}, #{user.password}, #{user.email}, #{user.profile})
</insert>
<update id="updateUser" parameterType="com.meeting.login_register_simple.entity.User">
UPDATE `user`
SET `username` = #{user.username},
`password` = #{user.password},
`email` = #{user.email},
`profile` = #{user.profile}
WHERE `user_id` = #{user.id}
</update>
</mapper>
2. RoleMapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.meeting.login_register_simple.mapper.RoleMapper">
<resultMap id="role" type="com.meeting.login_register_simple.entity.Role">
<id property="id" column="role_id" />
<result property="authority" column="authority" />
</resultMap>
<select id="findRoleById" parameterType="Long" resultMap="role">
SELECT `role_id`, `authority`
FROM `role`
WHERE `role_id` = #{id}
</select>
<select id="findRoleByAuthority" parameterType="String" resultMap="role">
SELECT `role_id`, `authority`
FROM `role`
WHERE `authority` = #{authority}
</select>
<insert id="insertRole" parameterType="com.meeting.login_register_simple.entity.Role"
useGeneratedKeys="true" keyProperty="id" keyColumn="role_id">
INSERT INTO `role` (`authority`)
VALUES (`role.authority`)
</insert>
<update id="updateRole" parameterType="com.meeting.login_register_simple.entity.Role">
UPDATE `role`
SET `authority` = #{role.authority}
WHERE `role_id` = #{role.id}
</update>
</mapper>
3. UserRoleMapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.meeting.login_register_simple.mapper.UserRoleMapper">
<resultMap id="user_role" type="com.meeting.login_register_simple.entity.UserRole">
<id property="uid" column="user_id" />
<id property="rid" column="role_id" />
</resultMap>
<select id="findUserRoleByUidAndRid" parameterType="Long" resultMap="user_role">
SELECT `user_id`, `role_id`
FROM `user_role`
WHERE `user_id` = #{uid}
AND `role_id` = #{rid}
</select>
<select id="findUserRolesByUid" parameterType="Long" resultMap="user_role">
SELECT `user_id`, `role_id`
FROM `user_role`
WHERE `user_id` = #{uid}
</select>
<insert id="insertUserRole" parameterType="Long">
INSERT INTO `user_role` (`user_id`, `role_id`)
VALUES (#{uid}, #{rid})
</insert>
<insert id="insertNormalUser" parameterType="Long">
INSERT INTO `user_role` (`user_id`, `role_id`)
VALUES (#{uid}, 1)
</insert>
</mapper>
四、mapper层
1. UserService
package com.meeting.login_register_simple.service;
import com.meeting.login_register_simple.entity.Role;
import com.meeting.login_register_simple.entity.User;
import com.meeting.login_register_simple.entity.UserRole;
import com.meeting.login_register_simple.exception.UserExistException;
import com.meeting.login_register_simple.mapper.RoleMapper;
import com.meeting.login_register_simple.mapper.UserMapper;
import com.meeting.login_register_simple.mapper.UserRoleMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleMapper roleMapper;
@Autowired
private UserRoleMapper userRoleMapper;
@Transactional(rollbackFor = RuntimeException.class)
public User loadUserByUsername(String username) {
User user = userMapper.findUserByUsername(username);
if (user == null) {
return user;
}
Long uid = user.getId();
List<Role> authorities = new ArrayList<>();
List<UserRole> userRoles = userRoleMapper.findUserRolesByUid(uid);
for (UserRole userRole : userRoles) {
authorities.add(roleMapper.findRoleById(userRole.getRid()));
}
user.setAuthorities(authorities);
return user;
}
@Transactional(rollbackFor = RuntimeException.class)
public User loadUserByEmail(String email) {
User user = userMapper.findUserByEmail(email);
if (user == null) {
return user;
}
Long uid = user.getId();
List<Role> authorities = new ArrayList<>();
List<UserRole> userRoles = userRoleMapper.findUserRolesByUid(uid);
for (UserRole userRole : userRoles) {
authorities.add(roleMapper.findRoleById(userRole.getRid()));
}
user.setAuthorities(authorities);
return user;
}
@Transactional(rollbackFor = RuntimeException.class)
public Long register(String username, String password, String email) {
if ((userMapper.findUserByUsername(username)) != null) {
throw new UserExistException("用户名已经存在");
}
if ((userMapper.findUserByEmail(email)) != null) {
throw new UserExistException("邮箱已经存在");
}
User user = new User();
user.setUsername(username);
user.setEmail(email);
user.setPassword(password);
user.setProfile("default.png");
userMapper.insertUser(user);
userRoleMapper.insertNormalUser(user.getId());
return user.getId();
}
}