第1关:检验用户名是否注册
任务描述
本关任务:实现判断用户名是否被注册功能。
相关知识
为了完成本关任务,你需要掌握:
- 为什么要判断用户名是否被注册?
- 实现判断用户名是否被注册功能。
为什么要判断用户名是否被注册
一个系统一般在注册是都会保证用户名的唯一:
例如 qq 号必须唯一,这样就方便搜索用户了。
实现判断用户名是否被注册功能
以下通过 Mybatis 的注解式 sql 实现。
- 我们可以直接在 dao 层根据用户名作为条件查询数据库:
@Select("select count(1) from users where userName=#{username}")
int findUserByName(String userName);
- service 层调用:
public interface UserService {
int findUserByName(String userName);
}
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public int findUserByName(String userName) {
return userDao.findUserByName(userName);
}
}
- Controller 层调用:
@RequestMapping(value = "/findUserName")
public Map findByName(@RequestBody Map<String,String> userMap){
String userName = userMap.get("userName");
HashMap map = new HashMap<String,String>();
//判断是否注册返回结果不同
if(userService.findUserByName(userName)>0){
map.put("code","004");
map.put("msg","用户名已存在,不能注册");
}else{
map.put("code","001");
map.put("msg","可以注册");
}
return map;
}
- 数据库如下:
字段名称 类型 备注 约束 user_id int(11) 权限id 主键,自增 userName varchar(20) 用户名 无 password varchar(40) 密码 无 userPhoneNumber bigint(11) 电话号码 无 email varchar(20) 邮箱 无 gender char(2) 性别 无 salt varchar(20) 加密盐值 无 login_count int(11) 登录次数 无 register_time datetime 注册时间 无
编程要求
在 UserDao.java、UserService.java、UserServiceImpl.java、UserController.java 中 Begin-End 处根据提示补充代码。实现检验用户名是否被注册功能。
测试说明
平台会对你编写的代码进行测试:发送请求访问接口,判断代码是否可以正常运行。
预期输入:
{
"userName":"admin"
}
预期输出: {"msg":"用户名已存在,不能注册","code":"004"}
开始你的任务吧,祝你成功!
UserDao.java
package com.www.dao;
import com.www.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDao {
//此处查询数据库,根据用户名查询用户是否注册
/****************************Begin****************************/
@Select("select count(1) from users where userName=#{username}")
int findUserByName(String userName);
/****************************Begin****************************/
}
UserService.java
package com.www.service;
import com.www.entity.User;
import org.springframework.stereotype.Component;
@Component
public interface UserService {
//service 层接口
/****************************Begin****************************/
int findUserByName(String userName);
/****************************End****************************/
}
UserServiceImpl.java
package com.www.service.impl;
import com.www.dao.UserDao;
import com.www.entity.User;
import com.www.service.UserService;
import com.www.utils.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;
import java.util.Map;
import java.util.UUID;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
//service 实现类调用 dao 层接口的查询方法
/****************************Begin****************************/
@Override
public int findUserByName(String userName) {
return userDao.findUserByName(userName);
}
/****************************End****************************/
}
UserController.java
package com.www.controller;
import com.www.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
UserService userService;
/**
* 调用 service 接口查询方法
* 根据用户名查找用户,判断该用户名是否可以注册
* @param userMap
* @return
*/
/****************************Begin****************************/
@RequestMapping(value = "/findUserName")
public Map findByName(@RequestBody Map<String,String> userMap){
//这是接收的用户名
String userName = userMap.get("userName");
HashMap map = new HashMap<String,String>();
//判断是否注册返回结果不同
if(userService.findUserByName(userName)>0){
//这里是用户名已经被注册的情况
map.put("code","004");
map.put("msg","用户名已存在,不能注册");
}else{
//这里是用户名可以使用的情况
map.put("code","001");
map.put("msg","可以注册");
}
return map;
}
/****************************End****************************/
}
第2关:根据用户名查询用户信息
任务描述
本关任务:实现根据用户名查询用户信息功能。
相关知识
为了完成本关任务,你需要掌握:
- 根据用户名查询用户信息功能介绍。
- 功能实现。
根据用户名查询用户信息功能介绍
一般一个系统中都有查询当前登录的用户信息的功能,如下:
即前端发送一个每个用户都带有的唯一属性,从数据库中查询出该用户的所有的具体的信息。
功能实现
以下通过 Mybatis 的注解式 sql 实现。
- dao 层查询数据库:
@Repository
public interface UserDao {
/*
根据用户名查询用户信息
*/
@Select("select * from users where username=#{userName}")
User findByUserName(String userName);
}
- service 层调用:
public interface UserService {
User findByUserName(String userName);
}
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
/**
* 根据用户名查询用户信息
* @param userName
* @return
*/
@Override
public User findByUserName(String userName) {
return userDao.findByUserName(userName);
}
}
- controller 层调用:
@RequestMapping(value = "/findByUserName")
public User findByUserName(@RequestBody Map<String,String> userMap){
//调用 service 接口方法,实现根据用户名查询用户信息
//接收用户名
String userName=userMap.get("userName");
return userService.findByUserName(userName);
}
- 数据库字段如下:
字段名称 类型 备注 约束 user_id int(11) 权限id 主键,自增 userName varchar(20) 用户名 无 password varchar(40) 密码 无 userPhoneNumber bigint(11) 电话号码 无 email varchar(20) 邮箱 无 gender char(2) 性别 无 salt varchar(20) 加密盐值 无 login_count int(11) 登录次数 无 register_time datetime 注册时间 无
编程要求
在 UserDao.java、UserService.java、UserServiceImpl.java、UserController.java 中 Begin-End 处补充代码,实现根据用户名查询用户信息功能。
测试说明
平台会对你编写的代码进行测试:发送请求访问接口,判断代码是否可以正常运行。 预期输入:
{
"userName":"admin"
}
预期输出: {"user_id":1017,"userName":"admin","password":"86d5dfb54984d5a867237b8440dbd779","userPhoneNumber":null,"email":null,"gender":null}
开始你的任务吧,祝你成功!
UserDao.java
package com.www.dao;
import com.www.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDao {
/*
根据用户查询用户信息
*/
//连接数据库,实现根据用户名查询用户信息
/****************************Begin****************************/
@Select("select * from users where username=#{userName}")
User findByUserName(String userName);
/****************************End****************************/
}
UserService.java
package com.www.service;
import com.www.entity.User;
import org.springframework.stereotype.Component;
@Component
public interface UserService {
//定义 service 接口
/****************************Begin****************************/
User findByUserName(String userName);
/****************************End****************************/
}
UserServiceImpl.java
package com.www.service.impl;
import com.www.dao.UserDao;
import com.www.entity.User;
import com.www.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
/**
* 根据用户名查询用户信息
* @param userName
* @return
*/
//调用 dao 层方法,返回用户信息
/****************************Begin****************************/
@Override
public User findByUserName(String userName) {
return userDao.findByUserName(userName);
}
/****************************End****************************/
}
UserController.java
package com.www.controller;
import com.www.entity.User;
import com.www.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Slf4j
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
UserService userService;
/**
* 根据用户名查询用户信息
* @param userMap
* @return
*/
@RequestMapping(value = "/findByUserName")
public User findByUserName(@RequestBody Map<String,String> userMap){
//调用 service 接口方法,实现根据用户名查询用户信息
/****************************Begin****************************/
//接收用户名
String userName=userMap.get("userName");
return userService.findByUserName(userName);
/****************************End****************************/
}
}
第3关:用户注册
任务描述
本关任务:实现一个用户注册功能。
相关知识
为了完成本关任务,你需要掌握:
- 什么是用户注册 ?
- 用户注册的意义。
- 用户注册的实现。
什么是用户注册
就是进入注册界面后、设置自己的账号密码等进行注册,注册时前端验证信息无误后会把用户注册的信息发送至后台,后台将用户信息注册进入数据库中的用户表里。如下图:
用户注册的意义
-
记录用户的行为内容:个人身份的识别,用户注册后信息就已经录入用户系统中,做出的操作将会被记录下来,比如在 UGC 的内容产品中,用户产出的内容,或是电商平台里基于用户的操作,作为其行为的凭据。
-
获取用户信息:用户授权登陆注册后,平台获取用户信息,对未来挖掘用户需求和功能迭代有很大的帮助。
-
千人千面:根据用户提供的信息,对用户进行标签化,针对用户喜好身份进行个性化推荐。
用户注册的实现
- dao 层代码:
/*
注册用户
*/
//连接数据库,实现将用户信息注册进入数据库
@Insert("insert into user(userName,password,salt,register_time,login_count) values(#{userName},#{password},#{salt},now(),1)")
void registerUser(String userName,String password,String salt);
- service 层代码:
/**
* 注册用户
* @param userName
* @param formPass
* @return
*/
@Override
public User registerUser(String userName, String formPass) {
//加盐获取盐值
String salt = "hjgoasjgajg165416565";
//机密加盐后得到的密码
String DBPass = MD5Util.formPassToDBPass(formPass, salt);
userDao.registerUser(userName,DBPass,salt);
return userDao.findByUserName(userName);
}
- controller 层:
/**
* 用户注册
* @param userMap
* @return
*/
@ResponseBody
@RequestMapping(value = "/register")
public String userRegister(@RequestBody Map<String,String> userMap){
String userName = userMap.get("userName");
String password = userMap.get("password");
String res="";
HashMap map = new HashMap<String,String>();
if(userService.findUserByName(userName)>0){
res="用户名已存在,不能注册";
}else{
User user=userService.registerUser(userName, password);
res="注册成功,"+"用户信息为:"+user;
}
return res;
}
- 数据库如下:
字段名称 类型 备注 约束 user_id int(11) 权限id 主键,自增 userName varchar(20) 用户名 无 password varchar(40) 密码 无 userPhoneNumber bigint(11) 电话号码 无 email varchar(20) 邮箱 无 gender char(2) 性别 无 salt varchar(20) 加密盐值 无 login_count int(11) 登录次数 无 register_time datetime 注册时间 无
编程要求
在 UserDao.java、UserServiceImpl.java、UserController.java 中 Begin-End 处补充代码,实现用户注册功能。
测试说明
平台会对你编写的代码进行测试:发送请求访问接口,判断代码是否可以正常运行。 预期输入:
{
"userName":"张三",
"password":"123456"
}
预期输出: 注册成功,用户信息为:User(user_id=1019, userName=张三, password=9e36a7e31f0975bb52b939ddca2051bd, userPhoneNumber=null, email=null, gender=null)
开始你的任务吧,祝你成功!
UserDao.java
package com.www.dao;
import com.www.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDao {
/*
注册用户
*/
//连接数据库,实现将用户信息注册进入数据库
/****************************Begin****************************/
@Insert("insert into users(userName,password,salt,register_time,login_count) values(#{userName},#{password},#{salt},now(),1)")
void registerUser(String userName,String password,String salt);
/****************************End****************************/
/*
根据用户民查询用户是否存在
*/
@Select("select count(1) from users where userName=#{username}")
int findUserByName(String userName);
/*
根据用户名查询用户信息
*/
@Select("select * from users where username=#{userName}")
User findByUserName(String userName);
}
User.java
package com.www.entity;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.io.Serializable;
/**
* @author liuxianchun
* @date 2021/1/17
* 鐢ㄦ埛
*/
@Data
@Component
public class User implements Serializable {
private int user_id;
private String userName;
private String password;
private String userPhoneNumber;
private String email;
private String gender;
}
UserServiceImpl.java
package com.www.service.impl;
import com.www.dao.UserDao;
import com.www.entity.User;
import com.www.service.UserService;
import com.www.utils.MD5Util;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.UUID;
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
@Override
public int findUserByName(String userName) {
return userDao.findUserByName(userName);
}
/**
* 注册用户
* @param userName
* @param formPass
* @return
*/
//进行密码的加密加盐,调用 dao 层注册用户、查询注册的用户信息并返回
/****************************Begin****************************/
@Override
public User registerUser(String userName, String formPass) {
//加盐获取盐值
String salt = "hjgoasjgajg165416565";
//机密加盐后得到的密码
String DBPass = MD5Util.formPassToDBPass(formPass, salt);
userDao.registerUser(userName,DBPass,salt);
return userDao.findByUserName(userName);
}
/****************************End****************************/
}
UserService.java
package com.www.service;
import com.www.entity.User;
import org.springframework.stereotype.Component;
@Component
public interface UserService {
int findUserByName(String userName);
//注册 service 接口
User registerUser(String userName,String formPass);
}
UserController.java
package com.www.controller;
import com.www.entity.User;
import com.www.service.UserService;
import lombok.extern.slf4j.Slf4j;
;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Controller
@RequestMapping(value = "/user")
public class UserController {
@Autowired
UserService userService;
@Autowired
User user;
/**
* 用户注册
* @param userMap
* @return
*/
@ResponseBody
@RequestMapping(value = "/register")
public String userRegister(@RequestBody Map<String,String> userMap){
//先查询用户名是否存在,如果存在则返回 "用户名已存在,不能注册"
//否则注册用户,且返回 "注册成功,"+"用户信息为:"+查询的注册用户信息
/****************************Begin****************************/
String userName = userMap.get("userName");
String password = userMap.get("password");
String res="";
HashMap map = new HashMap<String,String>();
if(userService.findUserByName(userName)>0){
res="用户名已存在,不能注册";
}else{
User user=userService.registerUser(userName, password);
res="注册成功,"+"用户信息为:"+user;
}
return res;
/****************************End****************************/
}
}