2、ssm搭建blog 项目

本文详细介绍了如何在SSM框架下进行实体类的逆向生成,配置事务管理,以及实现用户注册与邮箱激活功能。通过整合MyBatis、Spring和MVC,实现了用户模块的登录注册功能,并使用Email服务进行用户激活,确保了账号的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、使用逆向工程生成 实体;

运行命令:
E:\03:Mysql表结构设计及反向生成实体类\mybatis-generator-core-1.3.2\lib>
java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite
1

2,把 mapper ,xml , 以及entity 放入工程;
3、定义 user 模块的登录注册功能,在spring-mybatis.xml 中配置事务,在user 的 URD时候添加
@Transactional 注解;

整体项目结构如下:
1
在测试 事务的过程中 出现 UserService 空指针现象,因为 applicationContext=null
下面来解决这个:
2

更换 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);
    }
}

数据库中数据如下:
1

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

1

集成验证码:

就是点击 ο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、点击注册,跳转到注册成功页面,并同时发送激活邮件;
3
2.2、数据库中,激活状态为0 ,需要点击Email 中邮件激活连接。

1
2.3、点击查看邮件,跳转转到 相对应的Email 激活邮件 的登录页,需要登录来激活,激活调用
后台active 的Controller ;

3
2.4、登陆上点击激活,瞅瞅下面链接,直接对硬后台url
1
像这种情况,返回字符串, 并没有映射到 对应 URL 的页面,原因如下:
是因为在 Controller 请求路径中添加了 @ResponseBody 注解
该注解把返回结果映射为 string 的 json 串 直接显示;
3
删除该注解即可;
5
2.5、激活成功但是数据库 state 并没有改变;所以这个问题需要解决、
3
3

已解决该问题,
常规套路,看看问题出在哪里了;

5

userByEmail 是没问题的,只有找其他原因了, userService 层跟进去 未生效,最终解决该问题;
添加策略解决;
4

源码分享在 GitHub :
https://github.com/medoo-Ai/dreamland

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值