健康项目之移动端开发-体检预约

举报
tea_year 发表于 2025/10/28 10:35:13 2025/10/28
【摘要】 移动端开发-体检预约1. 体检预约流程用户可以通过如下操作流程进行体检预约:1、在移动端首页点击体检预约,页面跳转到套餐列表页面2、在套餐列表页面点击要预约的套餐,页面跳转到套餐详情页面3、在套餐详情页面点击立即预约,页面跳转到预约页面4、在预约页面录入体检人信息,包括手机号,点击发送验证码5、在预约页面录入收到的手机短信验证码,点击提交预约,完成体检预约2. 体检预约2.1 页面调整在预约...

移动端开发-体检预约

1. 体检预约流程

用户可以通过如下操作流程进行体检预约:

1、在移动端首页点击体检预约,页面跳转到套餐列表页面

2、在套餐列表页面点击要预约的套餐,页面跳转到套餐详情页面

3、在套餐详情页面点击立即预约,页面跳转到预约页面

4、在预约页面录入体检人信息,包括手机号,点击发送验证码

5、在预约页面录入收到的手机短信验证码,点击提交预约,完成体检预约

2. 体检预约

2.1 页面调整

在预约页面(/pages/orderInfo.html)进行调整

2.1.1 展示预约的套餐信息

第一步:从请求路径中获取当前套餐的id

<script>
 var id = getUrlParam("id");//套餐id
</script>

第二步:定义模型数据setmeal,用于套餐数据展示

var vue = new Vue({
 el:'#app',
 data:{
   setmeal:{},//套餐信息
   orderInfo:{
     setmealId:id,
     sex:'1'
  }//预约信息
}
});
<div class="card">
 <div class="">
   <img :src="'http://pqjroc654.bkt.clouddn.com/'+setmeal.img" width="100%" height="100%" />
 </div>
 <div class="project-text">
   <h4 class="tit">{{setmeal.name}}</h4>
   <p class="subtit">{{setmeal.remark}}</p>
   <p class="keywords">
       <span>{{setmeal.sex == '0' ? '性别不限' : setmeal.sex == '1' ? '男':'女'}}</span>
       <span>{{setmeal.age}}</span>
   </p>
 </div>
 <div class="project-know">
   <a href="orderNotice.html" class="link-page">
     <i class="icon-ask-circle"><span class="path1"></span><span class="path2"></span></i>
     <span class="word">预约须知</span>
     <span class="arrow"><i class="icon-rit-arrow"></i></span>
   </a>
 </div>
</div>

第三步:在VUE的钩子函数中发送ajax请求,根据id查询套餐信息

mounted(){
 axios.post("/setmeal/findById.do?id=" + id).then((response) => {
   this.setmeal = response.data.data;
});
}

2.1.2 手机号校验

第一步:在页面导入的healthmobile.js文件中已经定义了校验手机号的方法

/**
* 手机号校验
1--以1为开头;
2--第二位可为3,4,5,7,8,中的任意一位;
3--最后以0-9的9个整数结尾。
*/
function checkTelephone(telephone) {
   var reg=/^[1][3,4,5,7,8][0-9]{9}$/;
   if (!reg.test(telephone)) {
       return false;
  } else {
       return true;
  }
}

第二步:为发送验证码按钮绑定事件sendValidateCode

<div class="input-row">
 <label>手机号</label>
 <input v-model="orderInfo.telephone"
        type="text" class="input-clear" placeholder="请输入手机号">
 <input style="font-size: x-small;"
        id="validateCodeButton" @click="sendValidateCode()" type="button" value="发送验证码">
</div>
//发送验证码
sendValidateCode(){
 //获取用户输入的手机号
 var telephone = this.orderInfo.telephone;
 //校验手机号输入是否正确
 if (!checkTelephone(telephone)) {
   this.$message.error('请输入正确的手机号');
   return false;
}
}

2.1.3 30秒倒计时效果

前面在sendValidateCode方法中进行了手机号校验,如果校验通过,需要显示30秒倒计时效果

//发送验证码
sendValidateCode(){
 //获取用户输入的手机号
 var telephone = this.orderInfo.telephone;
 //校验手机号输入是否正确
 if (!checkTelephone(telephone)) {
   this.$message.error('请输入正确的手机号');
   return false;
}
 validateCodeButton = $("#validateCodeButton")[0];
 clock = window.setInterval(doLoop, 1000); //一秒执行一次
}

其中,validateCodeButton和clock是在healthmobile.js文件中定义的变量,doLoop是在healthmobile.js文件中定义的方法

var clock = '';//定时器对象,用于页面30秒倒计时效果
var nums = 30;
var validateCodeButton;
//基于定时器实现30秒倒计时效果
function doLoop() {
   validateCodeButton.disabled = true;//将按钮置为不可点击
   nums--;
   if (nums > 0) {
       validateCodeButton.value = nums + '秒后重新获取';
  } else {
       clearInterval(clock); //清除js定时器
       validateCodeButton.disabled = false;
       validateCodeButton.value = '重新获取验证码';
       nums = 30; //重置时间
  }
}

2.1.4 发送ajax请求

在按钮上显示30秒倒计时效果的同时,需要发送ajax请求,在后台给用户发送手机验证码

//发送验证码
sendValidateCode(){
 //获取用户输入的手机号
 var telephone = this.orderInfo.telephone;
 //校验手机号输入是否正确
 if (!checkTelephone(telephone)) {
   this.$message.error('请输入正确的手机号');
   return false;
}
 validateCodeButton = $("#validateCodeButton")[0];
 clock = window.setInterval(doLoop, 1000); //一秒执行一次
 axios.post("/validateCode/send4Order.do?telephone=" + telephone).then((response) => {
   if(!response.data.flag){
     //验证码发送失败
     this.$message.error('验证码发送失败,请检查手机号输入是否正确');
  }
});
}

创建ValidateCodeController,提供方法发送短信验证码,并将验证码保存到redis

/**
* 短信验证码
*/
@RestController
@RequestMapping("/validateCode")
public class ValidateCodeController {
   @Autowired
   private JedisPool jedisPool;
 
   //体检预约时发送手机验证码
   @RequestMapping("/send4Order")
   public Result send4Order(String telephone){
       Integer code = ValidateCodeUtils.generateValidateCode(4);//生成4位数字验证码
       try {
           //发送短信
           SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,code.toString());
      } catch (ClientException e) {
           e.printStackTrace();
           //验证码发送失败
           return new Result(false, MessageConstant.SEND_VALIDATECODE_FAIL);
      }
       System.out.println("发送的手机验证码为:" + code);
       //将生成的验证码缓存到redis
       jedisPool.getResource().setex(
         telephone + RedisMessageConstant.SENDTYPE_ORDER,5 * 60,code.toString());
       //验证码发送成功
       return new Result(true,MessageConstant.SEND_VALIDATECODE_SUCCESS);
  }
}

2.1.5 日历展示

页面中使用DatePicker控件来展示日历。根据需求,最多可以提前一个月进行体检预约,所以日历控件只展示未来一个月的日期

<div class="date">
 <label>体检日期</label>
 <i class="icon-date" class="picktime"></i>
 <input v-model="orderInfo.orderDate" type="text" class="picktime" readonly>
</div>
<script>
 //日期控件
 var calendar = new datePicker();
 calendar.init({
   'trigger': '.picktime',/*按钮选择器,用于触发弹出插件*/
   'type': 'date',/*模式:date日期;datetime日期时间;time时间;ym年月;*/
   'minDate': getSpecifiedDate(new Date(),1),/*最小日期*/
   'maxDate': getSpecifiedDate(new Date(),30),/*最大日期*/
   'onSubmit': function() { /*确认时触发事件*/},
   'onClose': function() { /*取消时触发事件*/ }
});
</script>

其中getSpecifiedDate方法定义在healthmobile.js文件中

//获得指定日期后指定天数的日期
function getSpecifiedDate(date,days) {
   date.setDate(date.getDate() + days);//获取指定天之后的日期
   var year = date.getFullYear();
   var month = date.getMonth() + 1;
   var day = date.getDate();
   return (year + "-" + month + "-" + day);
}

2.1.6 提交预约请求

为提交预约按钮绑定事件

<div class="box-button">
 <button @click="submitOrder()" type="button" class="btn order-btn">提交预约</button>
</div>
//提交预约
submitOrder(){
 //校验身份证号格式
 if(!checkIdCard(this.orderInfo.idCard)){
   this.$message.error('身份证号码输入错误,请重新输入');
   return ;
}
 axios.post("/order/submit.do",this.orderInfo).then((response) => {
   if(response.data.flag){
     //预约成功,跳转到预约成功页面
     window.location.href="orderSuccess.html?orderId=" + response.data.data;
  }else{
     //预约失败,提示预约失败信息
     this.$message.error(response.data.message);
  }
});
}

其中checkIdCard方法是在healthmobile.js文件中定义的

/**
* 身份证号码校验
* 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
*/
function checkIdCard(idCard){
   var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
   if(reg.test(idCard)){
       return true;
  }else{
       return false;
  }
}

小结

移动端体检预约功能以清晰的五步流程为核心,从首页入口跳转至套餐选择、详情查看,再到预约页面信息录入与提交,实现完整预约闭环。
关键技术集中在预约页面(/pages/orderInfo.html):借助 Vue 框架,通过 URL 提取套餐 ID,发起 Ajax 请求渲染套餐信息;复checkTelephone方法校验手机号,结合 30 秒倒计时防止验证码频繁发送;前端发请求、后ValidateCodeController生成并缓存验证码至 Redis;集DatePicker控件限制预约日期为未来 1-30 天;提交前checkIdCard校验身份证,再发请求完成预约,全程融合 Vue、Axios、Redis 等技术,保障功能稳定与用户体验。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。