Java学习Day52:金酬外护遭魔毒,圣显幽魂救本原(验证码补全,新增预约逻辑)

news2024/11/26 11:11:59

1.验证码补全

                    //发送验证码
                    sendValidateCode() {
                        /**
                         * 1.手机号不能为空
                         * 2.手机号符合规范
                         * 3.发送一分钟后才可再次发送
                         */
                        //获取手机号
                        let telephone = this.orderInfo.telephone;
                        //验证手机号不能空
                        if (telephone == undefined){
                            this.$message.error("请输入手机号");
                            return null;
                        }
                        //验证手机号格式正确
                        //第一位为1,第二位为3-9,第三位往后九位都为0-9
                        let ref=/^1[3-9][0-9]{9}$/
                        if(!ref.test(telephone)){
                            this.$message.error("手机号格式错误!")
                            return null;
                        }
                        let number = 10;//倒计时的变量
                        let  btn = $("#validateCodeButton");
                        let id = setInterval(function (){
                            //屏蔽按钮,在按钮显示时间的倒计时
                            number --;
                            //jQuery设置标签的属性
                            btn.attr("disabled",true);
                            //修改按钮上的文字
                            btn.val(number+"秒后重新发送");
                            if (number == 0){
                                //终止定时器,按钮还原
                                btn.val("发送验证码");
                                btn.attr("disabled",false);
                                //清空定时器的执行 传递参数id值
                                clearInterval(id)
                            }
                        },1000);
                        axios.get("/SetMealController/sendCode.do?telephone="+telephone).then(response=>{
                            if (response.data.flag){
                                this.code=response.data.data
                                console.log(response.data.data)
                            }
                        })
                },

发送验证码需要验证手机号格式是否正确,使用正则表达式

let ref=/^1[3-9][0-9]{9}$/

实现手机号规则判断

并实现了验证码隔时发送,使用JS的

setInterval

计时器,循环减少设置的倒计时,并在期间屏蔽发送按钮

btn.attr("disabled",true);

通过更改其"disabled"属性的值实现;

使用JQuery的ID选择器

let  btn = $("#validateCodeButton");

实现对按钮的选择

后端如下:

   /**
     * 接收手机号,发送验证码
     * @param telephone
     * @return
     * 调用工具类发送验证码
     * 产生4位随机数
     * 发送成功,在Redis中存储一份验证码,设置5分钟过期(校验验证是否正确)
     */
    @GetMapping("/sendCode")
    public Result sendCode(String telephone){
        Integer capstr= ValidateCodeUtils.generateValidateCode(4);
        try {
            SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone, String.valueOf(capstr));
            Jedis jedis=jedisPool.getResource();
            jedis.setex(telephone+ RedisConstant.SENDTYPE_ORDER,60*5,capstr+"");
            jedis.close();
            return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS);
        } catch (ClientException e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.SEND_VALIDATECODE_FAIL);
        }
    }
}

通过telephone拼接键,作为Key,将Redis中的键值对做对比,返回正确的信息;

2.预约套餐逻辑实现

1.前端验证表单数据的完整和正确性

                    //提交预约
                    submitOrder(){
                        /**
                         * 校验表单数据
                         * 1.姓名不能为空且大于一个字符
                         * 2.手机号不能为空且符合规范
                         * 3.身份证位数合适且符合规范
                         * 4.验证码不能为空
                         */
                     if (this.orderInfo.name===undefined){
                         this.$message.error("请填写姓名");
                         return ;
                     }
                     if (this.orderInfo.name.length<2){
                         this.$message.error("姓名不能少于2个字");
                         return ;
                     }
                        // let reg = /^[\u4E00-\u9FA5]+$/;
                        // if (!reg.test(name)){
                        //     this.$message.error("姓名必须是汉字");
                        //     return ;
                        // }
                        //手机号和验证码,写了就行
                        let telephone = this.orderInfo.telephone;
                        if (telephone == undefined){
                            this.$message.error("请输入手机号");
                            return ;
                        }
                        reg = /^1[3-9][0-9]{9}$/;
                        //正则表达式方法,test(被检测字符串),正则匹配成功返回true
                        if( ! reg.test(telephone)){
                            this.$message.error("手机号格式错误");
                            return ;
                        }
                        if (this.orderInfo.validateCode == undefined){
                            this.$message.error("请填写验证码");
                            return ;
                        }
                        let idCard = this.orderInfo.idCard;
                        if (idCard == undefined){
                            this.$message.error("请填写身份证号");
                            return ;
                        }
                        //验证身份证号
                        reg=/^[1-6][0-9]{16}[0-9X]$/
                        if (!reg.test(idCard)){
                            this.$message.error("身份证号格式错误");
                            return ;
                        }
                        //验证预约日期,JS的日历,用户只能选择,不能修改
                        if (this.orderInfo.orderDate == undefined){
                            this.$message.error("请选择预约日期");
                            return ;
                        }
                        axios.post("/OrderController/submitOrder.do",this.orderInfo).then(res=>{
                            if (res.data.flag){
                                this.$message.success(res.data.message);
                                location.href="orderSuccess.html"
                            }else {
                                this.$message.error(res.data.message);
                            }}
                        )
                    },

复杂判断基本使用正则表达式,大X为身份证的10,拼接到9后

2.后端逻辑实现代码:

 /**
     *    {"setmealId":"13","sex":"1","name":"石松","telephone":"13800138000",
     *  "validateCode":"1234","idCard":"123456789012345678","orderDate":"2024-10-25"}
     *  保存预约数据
     *  体检预约方法处理逻辑比较复杂,需要进行如下业务处理:
     *
     * 1、检查用户所选择的预约日期是否已经提前进行了预约设置,如果没有设置则无法进行预约  t_ordersetting
     *
     * 2、检查用户所选择的预约日期是否已经约满,如果已经约满则无法预约 t_ordersetting
     *
     * 3、检查当前用户是否为会员,如果是会员则直接完成预约,如果不是会员则自动完成注册并进行预约 t_member

     * 4、检查用户是否重复预约(同一个用户在同一天预约了同一个套餐),如果是重复预约则无法完成再次预约  t_order
     *
     * 5、预约成功,更新当日的已预约人数 t_ordersetting
     */
 1、检查用户所选择的预约日期是否已经提前进行了预约设置,如果没有设置则无法进行预约 t_ordersetting
OrderSetting orderSetting =orderSettingMapper.queryOrderSettingByOrderDate(map.get("orderDate"));
<select id="queryOrderSettingByOrderDate" parameterType="String" resultType="orderSetting">
    select id,orderDate,number,reservations from t_ordersetting
    where orderDate = #{orderDate}
</select>
  //预约日期查询结果是 null
        if(orderSetting == null){
            return new Result(false, MessageConstant.SELECTED_DATE_CANNOT_ORDER);
        }
        //2、检查用户所选择的预约日期是否已经约满,如果已经约满则无法预约 t_ordersetting
        //orderSetting对象中的 number值大于reservations值,就可以预约
        if (orderSetting.getReservations() >= orderSetting.getNumber()) {
            return new Result(false, MessageConstant.ORDER_FULL);
        }

预设为空则不能预约

预设的预约值大于等于全部值,预约已满

2、检查当前用户是否为会员,如果是会员则直接完成预约,如果不是会员则自动完成注册并进行预约 t_member
Member member =memberMapper.ifMember(map.get("telephone"));
        if (member!=null){//是会员,查看是否约过
            try {
                Order order = new Order();
                order.setSetmealId(Integer.parseInt(map.get("setmealId")));//存储套餐ID
                order.setOrderDate(Date2Utils.parseString2Date(map.get("orderDate")));//存储预约的日期
                order.setMemberId(member.getId());//存储用户的ID
                int count  = orderMapper.queryOrderByMember(order);
                if (count!=0){
                    return new Result(false,MessageConstant.HAS_ORDERED);
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        if (member==null){//不是会员,肯定没约过,直接帮他注册帮他约
            //mapper成注册会员
            member=new Member();
            member.setName(map.get("name"));
            member.setSex(map.get("sex"));
            member.setIdCard(map.get("idCard"));
            member.setPhoneNumber(map.get("telephone"));
            member.setRegTime(new Date());
            //mapper层,会员的数据写入到会员表
            memberMapper.addMember(member);
        }

若是会员,则查看会员当天是否约过此类型的套餐,SQL语句

 @Select("select count(0) from t_order " +
            "where member_id = #{memberId}  " +
            "and orderDate=#{orderDate}  " +
            "and setmeal_id = #{setmealId} ")
    int queryOrderByMember(Order order);

需要会员id,当天日期和套餐id

若不是会员,则直接注册会员

 if (member==null){//不是会员,肯定没约过,直接帮他注册帮他约
            //mapper成注册会员
            member=new Member();
            member.setName(map.get("name"));
            member.setSex(map.get("sex"));
            member.setIdCard(map.get("idCard"));
            member.setPhoneNumber(map.get("telephone"));
            member.setRegTime(new Date());
            //mapper层,会员的数据写入到会员表
            memberMapper.addMember(member);
        }
3、预约成功,更新当日的已预约人数 t_ordersetting
 orderSettingMapper.updatareservations(map.get("orderDate"));
        Order order = new Order();
        try {
            order.setOrderDate(Date2Utils.parseString2Date(map.get("orderDate")));//设置预约日期
            order.setSetmealId(Integer.parseInt(map.get("setmealId")));//设置套餐ID
            order.setOrderStatus(Order.ORDERSTATUS_NO);
            order.setOrderType(Order.ORDERTYPE_WEIXIN);
            //设置会员的Id
            order.setMemberId(member.getId());
            orderMapper.addOrder(order);
            return new Result(true,MessageConstant.ORDER_SUCCESS,order.getId());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

补上其他大佬发现的问题及解决办法

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

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

相关文章

CentOS 8在Linux虚拟机修改IP地址,出现:错误:“ens160“ 不是活动的连接。错误:未提供活动连接。

问题&#xff1a;错误&#xff1a;"ens160" 不是活动的连接。错误&#xff1a;未提供活动连接。 1.查看网络服务运行状态&#xff1a; 1)CentOS 7执行命令&#xff1a;systemctl status network 2)CentOS 8执行命令&#xff1a;systemctl status NetworkManager&a…

【深度学习基础】详解Pytorch搭建CNN卷积神经网络实现手写数字识别

MNIST 数据集,其包含70000 个2828 的手写数字的数据集,其中又分为60000 个训练样本与10000 个测试样本。 安装实验用到的包 anaconda promt 安装python包, 首先在开始界面打开prompt 进入到相应的虚拟环境中,下面的python38你自己创建的虚拟环境名称。 # 激活虚拟环境,v…

微信小程序中关闭默认的 `navigationBar`,并使用自定义的 `nav-bar` 组件

要在微信小程序中关闭默认的 navigationBar&#xff0c;并使用自定义的 nav-bar 组件&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 关闭默认的 navigationBar 在你的页面的配置文件 *.json 中设置 navigationBar 为 false。你需要在页面的 JSON 配置文件中添加以下代码…

如何在Debian操作系统上安装Doker

本章教程&#xff0c;主要介绍如何在Debian 11 系统上安装Docker。主要使用一键安装Docker脚本和一键卸载脚本来完成。 一、安装Docker #!/bin/bashRED\033[0;31m GREEN\033[0;32m YELLOW\033[0;33m BLUE\033[0;34m NC\033[0mCURRENT_DIR$(cd "$(dirname "$0")…

微知-Linux内核自带的模块被压缩为ko.xz后如何恢复成不压缩版本?(xz -d xxx.ko.xz)

背景 在使用crash定位问题的时候需要使用ko使用对应的符号信息。直接用ko.xz无法正确加载。需要恢复成ko文件。本文介绍如何解压缩。 恢复步骤 在Linux系统中&#xff0c;.xz文件是一种使用LZMA2算法压缩的文件格式。要解压ko.xz文件&#xff0c;你可以使用xz命令行工具。 …

UML外卖系统报告(包含具体需求分析)

1 系统背景 随着互联网技术的快速发展&#xff0c;外卖订餐服务逐渐成为人们生活中的一部分。传统的电话订餐方式面临诸多不便和限制&#xff0c;而基于互联网的外卖订餐系统则提供了更加便捷、快速和高效的订餐服务。这种系统通过将餐厅、顾客和配送人员连接起来&#xff0c;…

职业规划:程序员的成长之路

引言 在快速发展的技术行业中&#xff0c;作为一名程序员&#xff0c;职业规划是至关重要的。从初出茅庐到成为技术专家&#xff0c;每一步都需要明确的目标和不懈的努力。 成长历程 初级阶段&#xff08;0-2年&#xff09; 学习与适应&#xff1a;刚入行时&#xff0c;主要任…

Redis 安装部署与常用命令

目录 一、关系数据库与非关系型数据库 1.1 关系型数据库 1.2 非关系型数据库 1.3关系型数据库和非关系型数据库区别 &#xff08;1&#xff09;数据存储方式不同 &#xff08;2&#xff09;扩展方式不同 &#xff08;3&#xff09;对事务性的支持不同 1.4 非关系型数据…

大数据Azkaban(二):Azkaban简单介绍

文章目录 Azkaban简单介绍 一、Azkaban特点 二、Azkaban组成结构 三、Azkaban部署模式 1、solo-server ode&#xff08;独立服务器模式&#xff09; 2、two server mode&#xff08;双服务器模式&#xff09; 3、distributed multiple-executor mode&#xff08;分布式多…

54页可编辑PPT | 大型集团企业数据治理解决方案

这份PPT是关于大型集团企业数据治理的全面解决方案&#xff0c;它详细介绍了数据治理的背景、需求、管理范围、框架、解决思路&#xff0c;以及数据治理在实际操作中的关键步骤。内容涵盖了数据架构、数据质量、数据应用等方面的问题&#xff0c;并提出了数据资产透视、智能搜索…

使用 NumPy 和 Matplotlib 实现交互式数据可视化

使用 NumPy 和 Matplotlib 实现交互式数据可视化 在数据分析中&#xff0c;交互式可视化可以更好地帮助我们探索和理解数据。虽然 Matplotlib 是静态绘图库&#xff0c;但结合一些技巧和 Matplotlib 的交互功能&#xff08;widgets、event handlers&#xff09;&#xff0c;我…

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML

使用 Python 的 BeautifulSoup&#xff08;bs4&#xff09;解析复杂 HTML&#xff1a;详解与示例 在 Web 开发和数据分析中&#xff0c;解析 HTML 是一个常见的任务&#xff0c;尤其是当你需要从网页中提取数据时。Python 提供了多个库来处理 HTML&#xff0c;其中最受欢迎的就…

C++ 整型大数运算(大整数运算)项目

C 整型大数运算项目 一、项目介绍二、项目变量成员三、项目实现构造函数加法减法乘法先计算再进位边计算边进位 除法与取模判断输入输出 四、项目源代码展示在 Big_integer.h 中&#xff1a;在 Big_integer.cpp 中&#xff1a; 五、测试准确性六、优化方向 一、项目介绍 整型大…

Character AI被起诉!14岁青少年自杀,AI陪伴何去何从

终于&#xff0c;AI在青少年心理问题方面&#xff0c;被推上了风口浪尖。 最近&#xff0c;美国佛罗里达州&#xff0c;一名14岁男孩Sewell Setzer的父母控告Character AI公司&#xff0c;声称孩子沉迷该公司的AI聊天机器人&#xff0c;最后走上了自杀的道路。 跟AI聊天还能致…

基于STM32F103的按键检测仿真

基于STM32F103的按键检测 仿真软件&#xff1a; Proteus 8.17 编程软件&#xff1a; Keil 5 仿真实现&#xff1a; 按键第一次按下LED灯亮&#xff0c;第二次按下LED灯灭&#xff0c;往复 按键检测原理&#xff1a; 按键在电路中一端接单片机的IO口&#xff0c;一端接GND&a…

高效库存管理:金蝶云星空与管易云的盘亏单对接方案

高效库存管理&#xff1a;金蝶云星空与管易云的盘亏单对接方案 金蝶云星空与管易云的盘亏单对接方案 在企业日常运营中&#xff0c;库存管理是至关重要的一环。为了实现高效、准确的库存盘点和数据同步&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将金蝶云星空的数据…

JavaWeb合集20-定时任务框架SpringTask

二十、Spring Task 定时任务框架&#xff1a;Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 1、Spring Task cron 表达式 cron表达式在线生成器: https://cron.qqe2.com/ cron表达式其实就是一个字符串&#xff0c;通过cron…

极值点与拐点 专题小结

基础知识点 极值点与拐点的知识点 极值点相关概念了解 拐点相关概念了解极值点定义了解 二次函数求根公式理解 1、两个交点的解 2、单个交点的解 3、无交点的情况 含参数的函数 含参二次函数与x轴交点个数影响正负性变化&#xff0c;从而达成条件是否有极值点和拐点。 多重…

优先算法——移动零(双指针)

目录 1. 题目解析 2. 算法原理 3.代码实现 题目: 力扣题目链接&#xff1a;移动零 1. 题目解析 题目截图如下&#xff1a; 不过要注意&#xff0c;这个移动题目要求是在原数组中原地操作&#xff0c;不能新额外开辟一个数组来修改。 2. 算法原理 这个原理可以称之为数…

qt 滚动条 美化

qt QScrollBar 滚动条分为竖直与水平滚动条&#xff0c;两者设置上类似&#xff0c;但也有一些不同&#xff0c;下面主要讲述美化及注意事项。 一、竖直滚动条 竖直滚动条分为7个部分&#xff1a; sub-line、 up-arrow 、sub-page、 hanle、 add-line、 dow-arrow、 add-pag…