SpringBoot项目+注册功能实现

news2024/11/18 3:35:33

注册功能实现分析

目录

 一、AppConfig.java

二、register.html

三、UserDto.java

四、UserController.java

五、UserMapper.xml

六、运行结果


 一、AppConfig.java

@Configuration
public class AppConfig implements WebMvcConfigurer {

    //统一视图跳转
    @Override
    public void addViewControllers(ViewControllerRegistry registry){
        //访问路径为http://localhost:8080/时,那么就是访问login文件夹下的login.html页面
        registry.addViewController("/").setViewName("login/login");
        registry.addViewController("/login.html").setViewName("login/login");
        registry.addViewController("/register.html").setViewName("login/register");
    }
}

二、register.html

js表单校验、ajax验证用户名是否被占用、ajax提交表单

       <form id="form100" action="login.html" method="post" class="reg-form">
            <p><label for="userName"><em>*</em>用户名:</label>
                <input name="userName" type="text" class="input-txt" id="userName" autocomplete="off" size="43"
                       onblur="checkUserName(this)"/>
                <span id="userNameError"></span>
            </p>
            <p><label for="password"><em>*</em>密码:</label>
                <input name="password" type="password" class="input-txt" id="password" autocomplete="off" size="43"
                       onblur="checkPassword(this)"/>
                <span id="passwordError"></span>
            </p>
            <p><label for="surePassword"><em>*</em>确认密码:</label>
                <input name="surePassword" type="password" class="input-txt" id="surePassword" autocomplete="off"
                       size="43"
                       onblur="checkSurePassword(this)"/>
                <span id="surePasswordError"></span>
            </p>
            <p><label for="email"><em>*</em>邮箱:</label>
                <input name="email" type="text" class="input-txt" id="email" size="43"
                       onblur="checkEmail(this)">
                <span id="emailError"></span>
            </p>
            <p class="chcek-rule"><input name="agree" type="checkbox" value="1" checked/>
                <span class="fl">我同意</span><a href="#" target="_blank">《驴友网服务公约》</a>
            </p>
            <a class="regbtn" id="submit" href="javascript:void(0);" hidefocus="true"
               onclick="register()">立即注册</a>
        </form>
        <script type="text/javascript" th:src="@{webjars/jquery/3.6.1/jquery.js}"></script>
        <script>
            function checkUserName(userNameObj) {
                let userName = $(userNameObj).val();
                if (userName.length < 3) {
                    $(userNameObj).next().text("用戶名长度不能小于3");
                    $(userNameObj).next().css("color", "red");
                    return false;
                } else {
                    $.ajax({
                        type: "post",
                        url: "/user/checkUserName",
                        data: {"username": userName},
                        async: "false",
                        dataType: "json",
                        success: function (msg) {
                            if (!msg) {
                                $(userNameObj).next().text("用户名已占用");
                                $(userNameObj).next().css("color", "red");
                                return false;
                            }
                        },
                        error: function () {
                            alert("网络不可用")
                        }
                    })
                }
                $(userNameObj).next().text("用户名校验通过")
                $(userNameObj).next().css("color", "green");
                return true;
            }

            function checkPassword(passwordObj) {
                let password = $(passwordObj).val();
                if (password.length < 6 || password.length >= 16) {
                    $(passwordObj).next().text("密码只能是6-16位之间");
                    $(passwordObj).next().css("color", "red");
                    return false;
                }
                $(passwordObj).next().text("密码校验通过")
                $(passwordObj).next().css("color", "green");
                return true;
            }

            function checkSurePassword(surePasswordObj) {
                let surePassword = $(surePasswordObj).val();
                if (surePassword.length < 6 || surePassword.length >= 16) {
                    $(surePasswordObj).next().text("重复密码只能是6-16位之间");
                    $(surePasswordObj).next().css("color", "red");
                    return false;
                }
                let password = $("#password").val();
                if (surePassword != password) {
                    $(surePasswordObj).next().text("密码和重复密码不一致");
                    $(surePasswordObj).next().css("color", "red");
                    return false;
                }
                $(surePasswordObj).next().text("重复密码校验通过")
                $(surePasswordObj).next().css("color", "green");
                return true;
            }

            function checkEmail(emailObj) {
                let reg = /^[a-zA-Z0-9]+([-_.][A-Za-zd]+)*@([a-zA-Z0-9]+[-.])+[A-Za-zd]{2,5}$/;
                let email = $(emailObj).val();
                if (!reg.test(email)) {
                    $(emailObj).next().text("邮箱格式不正确");
                    $(emailObj).next().css("color", "red");
                    return false;
                }
                $(emailObj).next().text("邮箱校验通过")
                $(emailObj).next().css("color", "green");
                return true;
            }

            function register() {
                let userNameObj = document.getElementById("userName");
                let passwordObj = document.getElementById("password");
                let surePasswordObj = document.getElementById("surePassword");
                let emailObj = document.getElementById("email");
                if (checkUserName(userNameObj)
                    && checkPassword(passwordObj) && checkSurePassword(surePasswordObj)
                    && checkEmail(emailObj)) {
                    let $data = $("#form100").serialize();
                    console.log($data);
                    $.ajax({
                        type: "post",
                        url: "/user/register",
                        data: $data,
                        dataType: "json",
                        success: function (msg) {
                            if (msg) {
                                alert("注册成功");
                                location.href = "/login.html";
                            } else {
                                alert("注册失败")
                            }
                        },
                        error: function () {
                            alert("网络不可用")
                        }
                    })
                }
            }
        </script>

三、UserDto.java


/**
 * @description: 注册参数实体
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
    private String userName; //注册的用户名
    private String password;  //注册的密码
    private String email; //注册的邮箱
}

四、UserController.java


/**
 * @description: 用户相关的控制层
 **/
@Controller//标记控制层,把当前类的对象交给容器管理
//映射路径(访问路径,可以声明在类和方法上),只要访问此类中的资源,一级路径必须是user
@RequestMapping("/user")
@Slf4j //日志框架
public class UserController {
    @Autowired//根据类型自动注入对象
    @Qualifier("userService")//如果指定注入的对象,使用Qualifier注解
    private IUserService userService;

    //登录
    @RequestMapping("login")
    public String login(String username, String password, Model model, HttpSession session) {
        log.info("login方法入参:username={},password={}", username, password);  //日志信息打印
        //1.接收请求中的参数(view-controller):方法的入参直接获取(页面输入的username和password)
        //2.处理数据
        //(1)创建UserServiceImpl的对象 --- 成员变量自动注入
        //(2)调用service中的方法  参数:username password  返回值:UserEntity
        UserEntity user = userService.login(username, password);
        //3.保存数据(controller-view)并跳转页面
        String url;
        //(1)判断登录是否成功
        if (user != null) {
            //(2)成功 1.把数据保存到session中  2.跳转页面到index.html
            session.setAttribute("USER", user);
            if (user.getRole() == 1) {
                url = "index";
            } else {
                url = "/admin/index";
            }
        } else {
            //(3)失败 1.把异常信息保存到model中  2.跳转到login.html
            model.addAttribute("msg", "登录名或者密码错误");
            url = "/login/login";
        }
        //经过视图解析器,最终路径解析为 前缀(/templates/)+url+后缀(.html)
        return url;
    }

    //验证用户名是否存在
    @RequestMapping("/checkUserName")
    public @ResponseBody
    boolean checkUserName(String username) {
        System.out.println("==============" + username);
        //1.接收页面参数---方法入参  username
        //2.处理数据,调用service中验证用户名是否注册过的方法  参数:userName  返回值:boolean
        return userService.checkUserName(username);
    }

    //注册
    @RequestMapping("/register")
    public @ResponseBody
    boolean register(UserDto userDto) {
        System.out.println("===============" + userDto);
        //1.接收页面参数--方法入参 UserDto
        //2.调用service中注册的方法   参数:UserDto 返回值:boolean
        return userService.register(userDto);
    }

}

五、UserMapper.xml

注:IUservice接口、UserServerImpl类、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,namespace的值设置成DAO接口名,这样就能够保证能够匹配DAO接口-->
<mapper namespace="com.shenu.travelsys.mapper.UserMapper">

    <!--登录
    select:标识查询
    id:和接口中抽象方法名必须一致,调用方法实际执行当前标签的sql语句
    #{username}:#占位符,把抽象方法中的参数赋值到sql语句的条件中
    resultType: 查询结果自动映射到指定的类型中
    -->
    <select id="login" resultType="UserEntity">
        select *
        from t_user
        where username = #{username}
          and `password` = #{password}
    </select>
    
    <!--验证用户名是否存在-->
    <select id="checkUserName" resultType="UserEntity">
        select userid
        from t_user
        where username = #{username}
    </select>

    <!--注册-->
    <insert id="register">
        insert into t_user(username, password, email, status, role)
        values (#{userName}, #{password}, #{email}, 1, 1)
    </insert>
</mapper>

六、运行结果

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

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

相关文章

(1)Qt的基本数据类型以及基本输出

基础类型 因为Qt是一个C框架, 因此C中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数据类型。 类型名称注释备注qint8signed char有符号8位数据qint16signed short16位数据类型qint32signed short32位有符号…

数据结构与算法java篇--二叉树

内容有点多&#xff0c;建议先收藏 目录 一.树的介绍 二.java代码实现树 1.Node类 2.Tree类 3.查找节点 4.插入节点 5.遍历树 5.1 中序遍历 5.2 前序遍历和后序遍历 6.查找最大值和最小值 7.删除节点 7.1 删除没有子节点的节点 7.2 删除有一个子节点的结点 7.3 删除…

java美食论坛系统发帖子系统美食论坛网站美食分享论坛源码

ssm开发的美食论坛系统&#xff0c;用户注册之后可以发布关于美食的帖子&#xff0c;其他人可以回帖&#xff0c;评论&#xff0c;点赞回复和评论&#xff0c;分为楼主&#xff0c;第一楼&#xff0c;第二楼等。可以再个人中心查看我对别人的回复&#xff0c;以及别人对我的回复…

学习黑客十余年,如何成为一名安全工程师?

1. 前言 说实话&#xff0c;一直到现在&#xff0c;我都认为绝大多数看我这篇文章的读者最后终究会放弃&#xff0c;原因很简单&#xff0c;自学终究是一种适合于极少数人的学习方法&#xff0c;而且非常非常慢&#xff0c;在这个过程中的变数过大&#xff0c;稍有不慎&#x…

主成分分析(PCA)

主成分分析是一种降维&#xff08;去除噪声和不重要信息&#xff09;方法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关。 适用性&#xff1a;当研究的问题涉及到多变量且变量之间存在很强的相关…

【LeetCode】2099. 找到和最大的长度为 K 的子序列

【LeetCode】2099. 找到和最大的长度为 K 的子序列 给你一个整数数组 nums 和一个整数 k 。你需要找到 nums 中长度为 k 的 子序列 &#xff0c;且这个子序列的 和最大 。 请你返回 任意 一个长度为 k 的整数子序列。 子序列 定义为从一个数组里删除一些元素后&#xff0c;不…

BIT.1_常见指令以及权限理解

目录使用 XShell 远程登录 Linux下载安装 XShell查看 Linux 主机 ip使用 XShell 登陆主机XShell 下的复制粘贴文件 内容数据 属性数据Linux目录结构相对/绝对路径Linux下基本指令01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令&#xff08;重要&#xff09;&am…

基于Xlinx的时序分析与约束(4)----主时钟约束

主时钟约束语法 主时钟约束&#xff0c;就是我们对主时钟&#xff08;Primary Clock&#xff09;的时钟周期进行约束&#xff08;告诉综合工具布局布线的标准&#xff09;&#xff0c;这个约束是我们用的最多的约束了&#xff0c;也是最重要的约束。 主时钟必须与一个网表对象相…

seo综合查询,怎么看网站在移动端权重高低

移动权重就是指在手机、IPAD等的流量&#xff0c;数值越大流量越多。 未来百度流量一定会更倾向于移动端&#xff0c;移动端搜索将是百度搜索引擎的主要阵地。这一点和用户上网习惯有关系&#xff0c;因为移动网络无处不在。 那么怎么看网站在移动端权重高低&#xff1f;最…

Office选装 + Visio安装

一.Office选装 这里我以装Word、Excel和Powerpoint为例 第一步&#xff1a;下载office tool plus 下载地址&#xff1a;https://otp.landian.vip/zh-cn/ 打开网址后&#xff0c;点击红色的立即下载&#xff0c;进入文件存放页面&#xff1b; 第二步&#xff1a;选择其中一个下…

STM32F103C8T6平衡车

链接&#xff1a;https://pan.baidu.com/s/1WJ9otyE9LuO6Kh5gyQ0Tug?pwd8888 提取码&#xff1a;8888 #define BIN2_Pin GPIO_PIN_12 #define BIN2_GPIO_Port GPIOB #define BIN1_Pin GPIO_PIN_13 #define BIN1_GPIO_Port GPIOB #define AIN1_Pin GPIO_PIN_14 #define AIN1_…

CSS知识点1

CSS:层叠样式表 1.行内样式&#xff1a;<h1 style"background-color: aqua;">Hellocss</h1> 仅对当前标签有效 2.内部样式&#xff1a;写在title处 对当前页面有效 3.外部标签&#xff1a;<link rel"stylesheet" href"./js/main…

干货分享丨超详细的200G QSFP56光模块知识

随着数据中心的快速发展&#xff0c;在100G光模块不足以满足日益增长的网络升级要求而400G还未普及的情况下&#xff0c;200G QSFP56光模块成为了200G以太网部署的主流解决方案。接下来&#xff0c;就由易天光通信为你详细介绍一下200G QSFP56光模块。 200G QSFP56光模块是40G…

供应Biotin-PEG-acid,Biotin-PEG-COOH,生物素-聚乙二醇-羧基

含有生物素和羧酸的线性杂双功能PEG试剂化学试剂Biotin-PEG-acid /Biotin-PEG-COOH其英文名为&#xff0c;它所属分类为Biotin PEG Carboxylic acid PEG。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;生物素-PEG1-羧基、Biotin-PEG2-COOH、生物素-peg3.4-羧基、Biotin…

python代码~创意圣诞树

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 圣诞节(Christmas)本身是一个宗教节&#xff0c;用来庆祝耶稣的诞辰&#xff0c;因而又名耶诞节 Hope all your Christmas dreams come true!    愿你所有的圣诞梦想都成真!    Hope you enjoy the happiness o…

Express 基本使用(简)

前一篇内容讲到Express框架的安装以及对Express项目的目录文件有一定的认识了解之后&#xff0c;使用Express创建了最基本的一个Web服务器&#xff0c;接下来进行对Express框架的一些内容来做一个基本的使用&#xff1b; 创建 Web 服务器 node 或 nodemon 执行app.js文件&#…

贪心法算法

目录 一 算法简介 1&#xff09;算法案例引入 2&#xff09;算法思想 3&#xff09;算法概念 4&#xff09; 算法求解的问题的特征 5&#xff09;算法应用 二 算法常见问题 1&#xff09;活动安排问题&#xff08;区间调度问题&#xff09; 今年暑假不AC 2&#xff…

【QT】信号与槽

信号与槽 信号(Signal) 与 槽(Slot) 是Qt中对象之间的通信方式&#xff0c;可以用一个简单的栗子说明&#xff1a;当我们想要开灯时&#xff0c;按下开关发出指令&#xff0c;这就是信号&#xff1b;而灯泡接收到电流变化&#xff0c;发出光亮&#xff0c;这就是响应(槽)。 我…

通过cmd指令创建vue项目

通过cmd指令创建vue项目 基础材料&#xff1a; 已安装node.js 已安装 npm&#xff08;安装node.js后会自带安装npm&#xff09; 首先通过node –v和npm –v确保他们都安装了&#xff0c;能够看见版本号就表示ok 然后通过指令安装vue脚手架 npm install -g vue/cli5.0.8 安…

QTableView表格控件区域选择-自绘选择区域

一、概述 最近优化了一个小功能&#xff0c;主要是模仿excel相关的操作&#xff0c;觉得还挺不错的&#xff0c;因此在这里进行了整理&#xff0c;分享给有需要的朋友。今天主要是说一下区域选择这项功能&#xff0c;Qt自带的表格控件是具有区域选择功能的&#xff0c;但是他并…