1、使用逆向工程生成 实体;
运行命令:
E:\03:Mysql表结构设计及反向生成实体类\mybatis-generator-core-1.3.2\lib>
java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite
2,把 mapper ,xml , 以及entity 放入工程;
3、定义 user 模块的登录注册功能,在spring-mybatis.xml 中配置事务,在user 的 URD时候添加
@Transactional 注解;
整体项目结构如下:
在测试 事务的过程中 出现 UserService 空指针现象,因为 applicationContext=null
下面来解决这个:
更换 Junit 版本至4 ,会报新错误:
com/fasterxml/jackson/core/JsonProcessingException
参考下面文章:
https://blog.youkuaiyun.com/weixin_42323802/article/details/88071810
当然github 上的都是能运行没问题的;
链接如下:
https://github.com/medoo-Ai/dreamland
/**
* @auther SyntacticSugar
* @data 2019/3/1 0001下午 10:39
*/
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml","classpath:spring-mvc.xml"})
public class UserTest extends AbstractJUnit4SpringContextTests {
@Autowired
private UserService userService;
@Test
public void saveUser(){
User user = new User();
user.setNickName("小猪佩奇");
user.setEmail("kyelic@qq.com");
user.setPhone("13066668888");
userService.register(user);
}
}
数据库中数据如下:
password 使用 MD5 加密;后面 使用redis 优化,先做出功能 ,再优化,打代码是一个循序渐进的过程;
这里使用最基础的 SSM 高度耦合的web项目,前端采用JSP ;
后面第二个版本 将会采用springboot 和html 前后端分离 进行改进升级;
第三个版本将会采用springcloud 和Vue.js 前后端分离的形式进行改进升级;
第四个版本将延续第三个版本推出APP端;
先来看下注册页面:
启动tomcat 报异常如下:
Unable to open debugger port (127.0.0.1:60158): java.net.SocketException “socket closed”
修改端口即可;
https://blog.youkuaiyun.com/weixin_42323802/article/details/88072389
集成验证码:
就是点击 οnclick=“changeCode()” 事件 ,不断地调用 changeCode() 请求 验证码的servlet
对captcha 进行替换;
1、对注册进行校验:
1、校验手机号
2、校验验证码
3、用户协议的勾选校验
4、引入Redis 用来存放激活码 ,利用 redis 可以设置失效时间,设置时间为 24 小时、
集成 Email 服务 发送邮件 让用户来激活;
/**
* 邮件激活
* @param model
* @param code
* @return
*/
@RequestMapping(value = "/doRegister", method = RequestMethod.POST)
@ResponseBody
public String doRegister(Model model,
@RequestParam(value = "email", required = false) String email,
@RequestParam(value = "password", required = false) String password,
@RequestParam(value = "phone", required = false) String phone,
@RequestParam(value = "nickName", required = false) String nickname,
@RequestParam(value = "code", required = false) String code) {
//校验验证码
if (StringUtils.isBlank(code)) {
model.addAttribute("error","验证码非法,请君重新注册" );
return "../register";
}
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String vercode = (String)attrs.getRequest().getSession().getAttribute("VERCODE_KEY");
if (vercode==null) {
model.addAttribute("error","验证码超时" );
return "../register";
}
//和code 相等?
if (vercode.equalsIgnoreCase(code)) {
model.addAttribute("error","验证码不正确" );
return "../register";
}
//校验Email
User userByEmail = userService.findUserByEmail(email);
if (userByEmail!=null) {
model.addAttribute("error","该邮件已经被注册" );
return "../register";
}else {
// 封装user
User user = new User();
user.setEmail(email);
user.setImgUrl("images/45119881.jpg"); //图标
user.setNickName(nickname);
user.setPassword(MD5Util.encodeToHex(password+SALT_VALUE));
user.setPhone(phone);
user.setState("0");
user.setState("0");
//激活email
String toHex = MD5Util.encodeToHex(password + email + SALT_VALUE);
redisTemplate.opsForValue().set(email, toHex, 1, TimeUnit.DAYS);
// 注册 并发送邮件
userService.register(user);
SendEmail.sendEmailMessage(email, toHex);
String message = email + "," + toHex;
model.addAttribute("message", message);
return "/register/registerSuccess";
}
}
注册成功以后,跳转到注册成功的页面, 在该页面点击查看发送的激活邮件,
点击查看激活邮件,点击链接激活账户;
激活账户就是 ,更改账户的激活状态,就是说账户的状态值 更改为1 ;
2019.03.03 更新
2、激活邮件
2.1、点击注册,跳转到注册成功页面,并同时发送激活邮件;
2.2、数据库中,激活状态为0 ,需要点击Email 中邮件激活连接。
2.3、点击查看邮件,跳转转到 相对应的Email 激活邮件 的登录页,需要登录来激活,激活调用
后台active 的Controller ;
2.4、登陆上点击激活,瞅瞅下面链接,直接对硬后台url
像这种情况,返回字符串, 并没有映射到 对应 URL 的页面,原因如下:
是因为在 Controller 请求路径中添加了 @ResponseBody 注解
该注解把返回结果映射为 string 的 json 串 直接显示;
删除该注解即可;
2.5、激活成功但是数据库 state 并没有改变;所以这个问题需要解决、
已解决该问题,
常规套路,看看问题出在哪里了;
userByEmail 是没问题的,只有找其他原因了, userService 层跟进去 未生效,最终解决该问题;
添加策略解决;
源码分享在 GitHub :
https://github.com/medoo-Ai/dreamland