博客系统(升级(Spring))(三)登录功能,注册功能,注销功能

news2025/1/24 22:44:13

博客系统 (三)

  • 博客系统
  • 登录用户
    • 前端
    • 后端
      • 数据查询(在mapper上添加mapper接口)
  • 注册用户
    • 前端
    • 后端
      • 插入数据
  • 注销

博客系统

博客系统是干什么的?
CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博客系统,这是一个较为简单的博客系统,但是主要功能一个不缺,不过就是 UI 有些 low,我学习前端是为了写后端更加顺手。不至于前后端完全分离,但是有个问题设计的 web 页面不是很好看。

首先我将整体的业务流程展现
在这里插入图片描述
我们继博客系统(二)继续,编写,到了主页的业务逻辑了

接下来的流程是通过,网页端,后端统一数据结构交互的数据结构。

登录用户

前端

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录页面</title>
    <link rel="stylesheet" href="css/conmmon.css">
    <link rel="stylesheet" href="css/login.css">
    <script src="js/jquery.min.js"></script>
</head>

<body>
    <!-- 导航栏 -->
    <div class="nav">
        <img src="img/sleep.jpg" alt="">
        <span class="title">博客系统</span>
        <!-- 用来占据中间位置 -->
        <span class="spacer"></span>
        <a href="blog_list.html">主页</a>
        <a href="reg.html">注册</a>
    </div>
    <!-- 版心 -->
    <div class="login-container">
        <!-- 中间的登路框 -->
        <div class="login-dialog">
            <h3>登陆</h3>
            <div class="row">
                <span>用户名</span>
                <input type="text" id="username">
            </div>
            <div class="row">
                <span>密码</span>
                <input type="password" id="password">
            </div>
            <div class="row">
                <button id="submit" onclick="mylogin()">提交</button>
            </div>
        </div>
    </div>
    <script>
        function mylogin(){
            var username =jQuery("#username");
            var password =jQuery("#password");
            if(username.val().trim()==""){
                alert("请先输入用户名!");
                username.focus();
                return false;
            }
            if(password.val().trim()==""){
                alert("请先输入密码!");
                password.focus();
                return false;
            }
            jQuery.ajax({
                url:"/user/login",
                type:"get",
                data:{
                    "username":username.val().trim(),
                    "password":password.val().trim()
                },
                success:function(res){
                    if(res.code==200&&res.data==1){
                        alert("登陆成功");
                        location.href="blog_list.html";
                    }else{
                        alert(res.msg);
                        //跳转信息
                        location.href="login.html";
                    }
                }
            });
        }
        mylogin();
    </script>
</body>

</html>

jQuery.ajax({
url:“/user/login”,
type:“get”,
data:{
“username”:username.val().trim(),
“password”:password.val().trim()
},

通过这个就能保证数据上传给服务器是一个json格式的数据

后端

数据查询(在mapper上添加mapper接口)

在这里插入图片描述
根据用户名查用户密码

@Mapper
public interface UserMapper {
    
    @Select("select * from userinfo where username=#{username}")
    Userinfo getUserName(@Param("username") String username);

}

通过service层调用接口

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public Userinfo getUserName(String username){
        return userMapper.getUserName(username);
    }
}

通过Controller层调用service层服务

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public ResultAjax login(UserinfoVO userinfoVO, HttpServletRequest request){
        if (userinfoVO==null||!StringUtils.hasLength(userinfoVO.getUsername())||
            !StringUtils.hasLength(userinfoVO.getPassword())) {
            return ResultAjax.fail(-1,"非法参数");
        }
        Userinfo result=userService.getUserName(userinfoVO.getUsername());
        if (result==null||result.getUid()==0){
            return ResultAjax.fail(-2,"用户名密码错误");
        }
        //对密码进行解密
        if (!PasswordUtils.decrypt(userinfoVO.getPassword(),result.getPassword())){
            return ResultAjax.fail(-2,"用户名密码错误");
        }
        HttpSession session=request.getSession();
        session.setAttribute(Variable.SESSION_USERINFO_KEY,result);
        return ResultAjax.success(1);
    }

}

在这里插入图片描述

注册用户

前端

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <script src="js/jquery.min.js"></script>
    <title>注册页面</title>
    <link rel="stylesheet" href="css/conmmon.css">
    <link rel="stylesheet" href="css/login.css">
</head>

<body>
    
    
    <!-- 导航栏 -->
    <div class="nav">
        
        <img src="img/sleep.jpg" alt="">
        <span class="title">我的博客系统</span>
        <!-- 用来占据中间位置 -->
        <span class="spacer"></span>
        <a href="blog_list.html">主页</a>
        <a href="login.html">登录</a>
    </div>
    <!-- 版心 -->
    <div class="login-container">
        <!-- 中间的注册框 -->
        <div class="login-dialog">
            <h3>注册</h3>
            <div class="row">
                <span>用户名</span>
                <input type="text" id="username">
            </div>
            <div class="row">
                <span>密码</span>
                <input type="password" id="password">
            </div>
            <div class="row">
                <span>确认密码</span>
                <input type="password" id="password2">
            </div>
            <div class="row">
                <button id="submit" onclick="mysub()">提交</button>
            </div>
        </div>
    </div>
    <script>
        //提交用户注册信息
        function mysub(){
            //非空校验
            var username =jQuery("#username");
            var password=jQuery("#password");
            var password2=jQuery("#password2");
            if(username.val().trim()==""){
                alert("请先输入用户名!");
                username.focus();
                return false;
            }
            if(password.val().trim()==""){
                alert("请先输入密码!");
                password.focus();
                return false;
            }
            if(password2.val().trim()==""){
                alert("请先输入确认密码");
                password2.focus();
                return false;
            }
            //密码是否一致
            if(password.val()!=password2.val()){
                alert("两次密码不一致,请先检查!");
                return false;
            }
            
            //将数据给客户端
            jQuery.ajax({
                url:"/user/reg",
                type:"post",
                data:{
                    "username":username.val().trim(),
                    "password":password.val().trim()
                },
                //将后端返回的结果展示给用户
                success:function(res){
                    if(res.code==200&& res.data==1){
                        //注册成功
                        alert("恭喜,注册成功!");
                        location.href="login.html";
                    }else{
                        //失败
                        alert("抱歉:操作失败"+res.msg)
                    }
                }
            });
        }
        mysub();
    </script>
</body>

</html>

后端

插入数据

将前端数据插入数据库,通过数据库验证密码的准确性

同样的编写mapper接口,调用数据库

@Mapper
public interface UserMapper {

    @Select("select * from userinfo where username=#{username}")
    Userinfo getUserName(@Param("username") String username);

    @Insert("insert into userinfo(username,password) values(#{username},#{password})")
    int  enrollUser (Userinfo userinfo);
}

通过service层调用接口

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public Userinfo getUserName(String username){
        return userMapper.getUserName(username);
    }
    
    public int enrollUser(Userinfo userinfo){
        return userMapper.enrollUser(userinfo);
    }
}

通过Controller层调用service层服务

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public ResultAjax login(UserinfoVO userinfoVO, HttpServletRequest request){
        if (userinfoVO==null||!StringUtils.hasLength(userinfoVO.getUsername())||
            !StringUtils.hasLength(userinfoVO.getPassword())) {
            return ResultAjax.fail(-1,"非法参数");
        }
        Userinfo result=userService.getUserName(userinfoVO.getUsername());
        if (result==null||result.getUid()==0){
            return ResultAjax.fail(-2,"用户名密码错误");
        }
        if (!PasswordUtils.decrypt(userinfoVO.getPassword(),result.getPassword())){
            return ResultAjax.fail(-2,"用户名密码错误");
        }
        HttpSession session=request.getSession();
        session.setAttribute(Variable.SESSION_USERINFO_KEY,result);
        return ResultAjax.success(1);
    }

    @RequestMapping("/reg")
    public ResultAjax enrollUser(Userinfo userinfo){
        if (userinfo==null||StringUtils.hasLength(userinfo.getUsername())||
        !StringUtils.hasLength(userinfo.getPassword())){
            return ResultAjax.fail(-1,"非法参数");
        }
        userinfo.setPassword(PasswordUtils.encryption(userinfo.getPassword()));
        int result= userService.enrollUser(userinfo);
        return ResultAjax.success(result);
    }
}

注销

注销功能比较简单,只要将回话信息中对应的session给删了就行了。

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public ResultAjax login(UserinfoVO userinfoVO, HttpServletRequest request){
        if (userinfoVO==null||!StringUtils.hasLength(userinfoVO.getUsername())||
            !StringUtils.hasLength(userinfoVO.getPassword())) {
            return ResultAjax.fail(-1,"非法参数");
        }
        Userinfo result=userService.getUserName(userinfoVO.getUsername());
        if (result==null||result.getUid()==0){
            return ResultAjax.fail(-2,"用户名密码错误");
        }
        if (!PasswordUtils.decrypt(userinfoVO.getPassword(),result.getPassword())){
            return ResultAjax.fail(-2,"用户名密码错误");
        }
        HttpSession session=request.getSession();
        session.setAttribute(Variable.SESSION_USERINFO_KEY,result);
        return ResultAjax.success(1);
    }

    @RequestMapping("/reg")
    public ResultAjax enrollUser(Userinfo userinfo){
        if (userinfo==null||StringUtils.hasLength(userinfo.getUsername())||
        !StringUtils.hasLength(userinfo.getPassword())){
            return ResultAjax.fail(-1,"非法参数");
        }
        userinfo.setPassword(PasswordUtils.encryption(userinfo.getPassword()));
        int result= userService.enrollUser(userinfo);
        return ResultAjax.success(result);
    }

    @RequestMapping("/logout")
    public ResultAjax logout(HttpServletRequest request){
        HttpSession session=request.getSession();
        if (session!=null||session.getAttribute(Variable.SESSION_USERINFO_KEY)!=null){
            session.removeAttribute(Variable.SESSION_USERINFO_KEY);
        }
        return ResultAjax.success(1);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/995997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 中使用 Poi-tl 渲染数据并生成 Word 文档

本文 Demo 已收录到 demo-for-all-in-java 项目中&#xff0c;欢迎大家 star 支持&#xff01;后续将持续更新&#xff01; 前言 产品经理急冲冲地走了过来。「现在需要将按这些数据生成一个 Word 报告文档&#xff0c;你来安排下」 项目中有这么一个需求&#xff0c;需要将用户…

Linux平台如何实现采集音视频数据并注入轻量级RTSP服务?

技术背景 好多开发者&#xff0c;问我们最多的问题是&#xff0c;为什么要设计轻量级RTSP服务&#xff1f;轻量级RTSP服务&#xff0c;和RTSP服务有什么区别&#xff1f; 针对这个问题&#xff0c;我们的回答是&#xff1a;轻量级RTSP服务解决的核心痛点是避免用户或者开发者…

59、SpringBoot 自定义JSON的序列化器和反序列化器

Serialization(序列化)&#xff1a; 将java对象以一连串的字节码保存在磁盘文件中的过程&#xff0c;也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。 deserialization(反序列化)&#xff1a; 将保存在磁盘文件中的java字节码重新转…

关于µC/OS-III 多任务的基本理解

关于C/OS-III 多任务的基本理解 任务和任务管理是 RTOS 的核心&#xff0c;且大多数项目使用 RTOS 的目的就是为了使用 RTOS 的多任务管理能力。 C/OS-III作为经典的RTOS&#xff0c;了解并学习其任务管理机制&#xff0c;是非常有必要的。 文章目录 关于C/OS-III 多任务的基本…

进阶C语言-指针的进阶(中)

指针的进阶 &#x1f4d6;5.函数指针&#x1f4d6;6.函数指针数组&#x1f4d6;7.指向函数指针数组的指针&#x1f4d6;8.回调函数 &#x1f4d6;5.函数指针 数组指针 - 指向数组的指针 - 存放的是数组的地址 - &数组名就是数组的地址。 函数指针 - 指向函数的指针 - 存放的…

【Java】session的工作原理

文章目录 一、session的概念及特点session概念session主要有以下的这些特点 二、为什么要使用session三、session的工作原理四、session的生命周期Session何时生效Session何时失效 五、session的性能瓶颈六、session实现登录状态的控制 一、session的概念及特点 session概念 …

无涯教程-JavaScript - COUPDAYSNC函数

描述 COUPDAYSNC函数返回从结算日期到下一个息票日期的天数。 语法 COUPDAYSNC (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 RequiredMaturity 证…

基于第二代 ChatGLM2-6B P-Tuning v2 微调训练医疗问答任务

今天是教师节&#xff0c;恭祝全体老师们节日快乐&#xff01;&#x1f60a; 一、ChatGLM2-6B 在本专栏前面文章中实验了使用 ChatYuan-large-v2 Freeze 微调训练医疗问答任务&#xff0c;训练后效果整体还可以&#xff0c;这篇文章继续探索使用最近比较火的 ChatGLM 官方推出…

docker镜像详解

目录 什么是docker镜像镜像相关命令docker pulldocker imagesdocker searchdocker rmi导出 / 导入镜像 镜像分层镜像摘要镜像摘要的作用分发散列值 什么是docker镜像 Docker镜像是Docker容器的基础组件&#xff0c;它包含了运行一个应用程序所需的一切&#xff0c;包括代码、运…

Sharding-Jdbc(2):Sharding-Jdbc入门案例

1 前置条件 搭建读写分离的数据库环境,搭建方法如下文,目标数据库test Mysql性能优化(5):主从同步原理与实现_mysql主从配置优化_不死鸟.亚历山大.狼崽子的博客-CSDN博客 2 新建maven项目 3 pom引入依赖 <?xml version="1.0" encoding="UTF-8"…

《protobuf》基础语法2

文章目录 枚举类型ANY 类型oneof 类型map 类型改进通讯录实例 枚举类型 protobuf里有枚举类型&#xff0c;定义如下 enum PhoneType {string home_addr 0;string work_addr 1; }同message一样&#xff0c;可分为 嵌套定义&#xff0c;文件内定义&#xff0c;文件外定义。不…

二维码智慧门牌管理系统:智能化地址管理,提升社会治理效率

文章目录 前言一、地址管理挑战二、二维码智慧门牌管理系统解决方案 前言 随着科技的飞速发展&#xff0c;我们的生活正经历前所未有的变革。尤其是智能化技术&#xff0c;已经深刻影响了我们的日常生活和工作环境。然而&#xff0c;在某些领域&#xff0c;如地址管理和社会治…

十大免费好用的视频软件推荐,新手小白必备

很多人都在使用视频软件进行编辑&#xff0c;那么你们知道哪些视频软件是免费的而且还好用&#xff1f; 现在很多小伙伴比较喜欢用手机编辑视频&#xff0c;而这些剪辑软件具有领先的智能化AI技术&#xff0c;让你不用绿幕就能一键挖出图像&#xff0c;不仅可以一键挖出三维人…

获取板块分类并展示

板块分类也会变动&#xff0c;偶尔看下&#xff0c;利于总体分析大盘 https:dapanyuntu.com/ 该网站含有板块信息 分析接口 搜素关键字 拷贝curl到curl解析工具&#xff0c;去掉无用的参数&#xff0c;生成requests代码 尝试nginx反代接口 server {listen 443;loca…

汇率失守7.3关口

号外&#xff1a;9.8教链内参《被判入狱1万年》。 拉锯多时的离岸人民币汇率USDCNH失守7.3关口&#xff0c;隔夜冲破7.36的高位。 为什么7.3是一个关键关口&#xff1f;因为这里是2022年10月底、11月初时曾经测试过的支撑位&#xff08;从CNH的角度说&#xff09;。 如果支撑位…

微信视频号挂公众号文章链接新方法:不限次数,不限号

当看到自己身边的人&#xff0c;通过我分享的方法绑定成功&#xff0c;那是开心到起飞了。 因为我知道&#xff1a;外面不靠谱的人很多&#xff01;分享不靠谱方法的人&#xff0c;可谓是更多。 为什么我要主动分享视频号评论区挂公众号文章链接&#xff1f;总有人伸张正义&a…

java中log使用总结

目录 一、概述1.1. 核心日志框架1.2 门面日志框架 二、最佳实践2.1 核心日志框架API包2.2 门面日志框架依赖2.3 集成使用2.3.1 集成jcl2.3.2 集成slf4j2.3.2.1 slf4j集成单一框架2.3.2.2 slf4j整合混合框架 三、总结3.1 所有相关包3.1.1 核心日志框架包3.1.2 门面日志框架3.1.3…

Python元类(metaclass)

Python 是一种强大的编程语言&#xff0c;一部分得益于其语言设计中独特的元类&#xff08;Metaclass&#xff09;机制。尽管元类的概念在刚开始接触时可能会让人感到困惑&#xff0c;但一旦理解了它们的工作原理和应用方式&#xff0c;我们就可以用它们做出强大且灵活的抽象。…

无涯教程-JavaScript - COUPDAYS函数

描述 COUPDAYS函数返回包含结算日期的息票期限内的天数。 语法 COUPDAYS (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 RequiredMaturity 证券的到…

Nginx重写功能

Nginx重写功能 一、Nginx常见模块二、访问路由location2.1location常用正则表达式2.2、location的分类2.3、location常用的匹配规则2.4、location优先级排列说明2.5、location示例2.6、location优先级总结2.7、实例2.7.1、location/{}与location/{}2.7.2、location/index.html{…