某预约系统分析 > 某区公共自行车租车卡在线预约,关于如何提高成功概率
概诉
网上提交预约申请单,线下面交完成实体卡的交付和办理。
本文主要从技术角度分析预约页面,仅供初学者技术交流使用。
表单输入和校验
系统通过2步的确认点击到达信息输入页面。
地址:/bjggzxc/TzYybk_third_1.html
验证规则:
字段名 | 字段ID | 校验规则1 | 验证规则2 | 验证规则3 | 验证规则4 |
姓名 | U_NAME | 非空验证 | 只能输入中英文字符以及逗号、点、减号、下划线,且至少两个字符 | ||
性别 | U_SEX | 非空验证 | 性别与身份证不匹配 | ||
出生日期 | U_BIRTHDAY | 非空验证 | 日期格式不正确,输入类似2011-01-01的日期! | 出生日期与身份证不匹配 | 18-60岁之间才能预约! |
户口所在地 | U_BIRTHPLACE | 非空验证 | 户口所在地只能输入中文,填写省市区(县)即可,最少两个汉字! | ||
证件类型 | U_ZJTYPE | 非空验证 | |||
证件号 | U_ZJNUM | 非空验证 | 身份证号码校验失败,IdentityCodeValid | 此证件号码已经预约过,请不要重复预约! | 校验出生日期 和 性别 |
居住地址 |
U_TXPLACE | 非空验证 | 居住地址只能输入中英文字符、数字以及逗号、点、减号、下划线,且至少五个字符 | ||
工作居住证号 |
U_ZZZNUM | 非北京户口用户必须输入工作居住证号码,且只能输入12位数字,北京户口请在户口所在地中包含“北京”两个字。 | |||
手机号 | U_PHONE | 非空验证 | 手机号只能是11位数字! | ||
电子邮箱 |
U_EMAIL | 非空验证 | 电子邮箱格式不正确! | ||
联系人姓名 |
U_U_NAME | 非空验证 | 只能输入中英文字符以及逗号、点、减号、下划线,且至少两个字符 | ||
性别 |
U_U_SEX | 非空验证 | |||
与联系人的关系 |
U_U_RELATION | 非空验证 | 与联系人的关系只能输入汉字,最少两个字符! | ||
联系电话 | U_U_TELEPHONE | 非空验证 | 联系电话只能是数字或横杠,最少8位! | ||
通讯地址 |
U_U_TXPLACE | 非空验证 | 联系人通讯地址只能输入中英文字符、数字以及逗号、点、减号、下划线,且至少五个字符 | ||
选择办卡地点 | U_CARD_ADDRESS | 非空验证 | |||
Y_PC | |||||
PC_ID |
验证代码:
1 $(function() { 2 $('#U_BIRTHDAY').datetimepicker({ 3 language: 'zh-CN', 4 minView: '2', //只选择日期,不选择时间 5 format: 'yyyy-mm-dd', 6 startDate: '${yypc.ksrq}', 7 endDate: new Date(), 8 autoclose: true , 9 todayBtn: true 10 }).on("changeDate", function(e){ 11 // console.log($("#applyForm").data('formValidation')); 12 $("#applyForm").bootstrapValidator('revalidateField', 'U_BIRTHDAY'); 13 }); 14 15 var validForm = $('#applyForm').bootstrapValidator({ 16 fields: { 17 "U_NAME": { 18 validators: { 19 notEmpty: { //非空验证 20 message: '姓名不能为空!' 21 }, 22 regexp: { 23 regexp: /^[a-zA-z\u4e00-\u9fa5,\.\-_]{2,}$/, 24 message: '只能输入中英文字符以及逗号、点、减号、下划线,且至少两个字符' 25 } 26 } 27 }, 28 "U_SEX": { 29 validators: { 30 notEmpty: { //非空验证 31 message: '性别不能为空,请选择!' 32 }, 33 callback: { 34 message: '性别与身份证不匹配!', 35 callback: function(value, validator, $field) { 36 var zjlx = $('select[name=U_ZJTYPE]').val(); 37 var sfzh = $('input[name=U_ZJNUM]').val(); 38 var sex=$("input[name='U_SEX']:checked").val(); 39 40 if (sex != "" && zjlx == "身份证" && (sfzh.length == 18 || sfzh.length == 15)) { 41 var sexFromSfzh = ""; 42 if(sfzh.length == 18) { 43 sexFromSfzh = sfzh.substring(16, 17); 44 } else if(sfzh.length == 15) { 45 sexFromSfzh = sfzh.substring(14); 46 } 47 console.log(sexFromSfzh); 48 var sexCode = parseInt(sexFromSfzh); 49 50 if(sexCode % 2 == 0) 51 sexFromSfzh = "女"; 52 else 53 sexFromSfzh = "男"; 54 55 if(sex != sexFromSfzh) 56 return false; // or false 57 } 58 return true; 59 } 60 } 61 } 62 }, 63 "U_BIRTHDAY": { 64 validators: { 65 notEmpty: { //非空验证 66 message: '出生日期不能为空!' 67 }, 68 date: { 69 message: '日期格式不正确,输入类似2011-01-01的日期!', 70 format: 'YYYY-MM-DD' 71 }, 72 callback: { 73 message: '出生日期与身份证不匹配!', 74 callback: function(value, validator, $field) { 75 var zjlx = $('select[name=U_ZJTYPE]').val(); 76 var sfzh = $('input[name=U_ZJNUM]').val(); 77 if (zjlx == "身份证" && (sfzh.length == 18 || sfzh.length == 15)) { 78 var birthdayFromSfzh = ""; 79 if(sfzh.length == 18) { 80 birthdayFromSfzh = sfzh.substring(6, 14); 81 } else if(sfzh.length == 15) { 82 birthdayFromSfzh = "19" + sfzh.substring(6, 12); 83 } 84 if(value.replace(/-/g,'') != birthdayFromSfzh) 85 return false; // or false 86 } 87 return true; 88 } 89 }, 90 callback: { 91 message: '18-60岁之间才能预约!', 92 callback: function(value, validator, $field) { 93 var d = Date.parse(value.replace(/-/g,'/')); 94 var date = new Date(); 95 var now = date.format("yyyyMMdd"); 96 date.setTime(d); 97 date.addYears(18); 98 var date1 = date.format("yyyyMMdd"); //18岁是哪天 99 date.addYears(42); 100 var date2 = date.format("yyyyMMdd"); //60岁是哪天 101 console.log(date1); 102 console.log(date2); 103 console.log(now); 104 return (now >= date1 && now <= date2); 105 } 106 } 107 } 108 }, 109 "U_BIRTHPLACE": { 110 validators: { 111 notEmpty: { //非空验证 112 message: '户口所在地不能为空!' 113 }, 114 regexp: { 115 regexp: /^[\u4e00-\u9fa5]{2,}$/, 116 message: '户口所在地只能输入中文,填写省市区(县)即可,最少两个汉字!' 117 } 118 }, 119 onSuccess: function(e, data) { 120 data.bv.revalidateField('U_ZZZNUM'); 121 } 122 }, 123 "U_ZJTYPE": { 124 validators: { 125 notEmpty: { //非空验证 126 message: '证件类型不能为空,请选择!' 127 } 128 } 129 }, 130 "U_ZJNUM": { 131 validators: { 132 notEmpty: { //非空验证 133 message: '证件号码不能为空!' 134 }, 135 callback: { 136 message: '身份证号码校验失败!', 137 callback: function(value, validator, $field) { 138 var zjlx = $('select[name=U_ZJTYPE]').val(); 139 if (zjlx == "身份证") 140 return IdentityCodeValid(value); 141 else 142 return true; 143 } 144 }, 145 remote: { 146 message: '此证件号码已经预约过,请不要重复预约!', 147 url: 'TzYybk_checkZjhm_1.html', 148 type: 'POST', 149 // delay: 1000, 150 data: { 151 Y_PC: $('input[name=Y_PC]').val(), 152 PC_ID: $('input[name=PC_ID]').val() 153 } 154 } 155 }, 156 onSuccess: function(e, data) { 157 data.bv.revalidateField('U_BIRTHDAY'); 158 data.bv.revalidateField('U_SEX'); 159 } 160 }, 161 "U_TXPLACE": { 162 validators: { 163 notEmpty: { //非空验证 164 message: '居住地址不能为空!' 165 }, 166 regexp: { 167 regexp: /^[a-zA-z0-9\u4e00-\u9fa5,, \.\-_]{5,}$/, 168 message: '居住地址只能输入中英文字符、数字以及逗号、点、减号、下划线,且至少五个字符' 169 } 170 171 } 172 }, 173 "U_ZZZNUM": { 174 validators: { 175 callback: { 176 message: '非北京户口用户必须输入工作居住证号码,且只能输入12位数字,北京户口请在户口所在地中包含“北京”两个字。', 177 callback: function(value, validator, $field) { 178 var hk = $('input[name=U_BIRTHPLACE]').val(); 179 if (hk != "" && hk.indexOf("北京") < 0 && value == "") { 180 return false; // or false 181 } else { 182 if(value != "") { 183 if(/^[0-9]{12}$/m.test(value)) 184 return true; 185 else 186 return false; 187 } else 188 return true; 189 } 190 } 191 } 192 } 193 }, 194 "U_PHONE": { 195 validators: { 196 notEmpty: { //非空验证 197 message: '手机号不能为空!' 198 }, 199 regexp: { 200 regexp: /^[0-9]{11}$/, 201 message: '手机号只能是11位数字!' 202 } 203 } 204 }, 205 "U_EMAIL": { 206 validators: { 207 notEmpty: { //非空验证 208 message: '电子邮箱不能为空!' 209 }, 210 regexp: { 211 regexp: /^[a-zA-Z0-9_\-.]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/, 212 message: '电子邮箱格式不正确!' 213 } 214 } 215 }, 216 "U_ZJTYPE": { 217 validators: { 218 notEmpty: { //非空验证 219 message: '证件类型不能为空!' 220 } 221 } 222 }, 223 "U_U_NAME": { 224 validators: { 225 notEmpty: { //非空验证 226 message: '联系人姓名不能为空!' 227 }, 228 regexp: { 229 regexp: /^[a-zA-z\u4e00-\u9fa5,\.\-_]{2,}$/, 230 message: '只能输入中英文字符以及逗号、点、减号、下划线,且至少两个字符' 231 } 232 } 233 }, 234 "U_U_SEX": { 235 validators: { 236 notEmpty: { //非空验证 237 message: '性别不能为空!' 238 } 239 } 240 }, 241 "U_U_RELATION": { 242 validators: { 243 notEmpty: { //非空验证 244 message: '与联系人的关系不能为空!' 245 }, 246 regexp: { 247 regexp: /^[\u4e00-\u9fa5]{2,}$/, 248 message: '与联系人的关系只能输入汉字,最少两个字符!' 249 } 250 } 251 }, 252 "U_U_TELEPHONE": { 253 validators: { 254 notEmpty: { //非空验证 255 message: '联系电话为空!' 256 }, 257 regexp: { 258 regexp: /^[0-9()-]{8,}$/, 259 message: '联系电话只能是数字或横杠,最少8位!' 260 } 261 } 262 }, 263 "U_U_TXPLACE": { 264 validators: { 265 notEmpty: { //非空验证 266 message: '联系人通讯地址不能为空!' 267 }, 268 regexp: { 269 regexp: /^[a-zA-z0-9\u4e00-\u9fa5,, \.\-_]{5,}$/, 270 message: '联系人通讯地址只能输入中英文字符、数字以及逗号、点、减号、下划线,且至少五个字符' 271 } 272 } 273 } 274 } 275 }) 276 .on('success.form.bv', function(e) { 277 e.preventDefault(); 278 editPcSave(); 279 }); 280 })
提前准备好合格的注册/预约信息是件很重要的事情,通过代码提取然后进行自动的填写。
用一个本地库去保存合格的注册信息。
循环:提取信息,然后提交服务器。
确认提交优化
提前判断信息都通过验证以后(合格),除了用editPcSave中的ajaxSubmit来提交信息以外,如下:
function submitToSrv(){ $('#applyForm').ajaxSubmit({ type : "post", url : "TzYybk_save_1.html", beforeSubmit : function() { $("button").attr("disabled", true); }, success : function(responseText, statusText, xhr, $form) { var response = $.parseJSON(responseText); if(response.status=="ok") { console.log(response.uid); document.location="TzYybk_success_1.html?uid=" + response.uid; } else { alert(response.message); } }, error : function(request, textStatus, e) { $("button").attr("disabled", false); } }); }; setInterval("submitToSrv()", 5000);
另外:提高成功概率的主要影响因素
- 对网页资源的本地化,优化;给服务器减轻压力
- 对资源进行缓存jquery-1.11.2.min.js
- 对资源进行映射。
- 服务器测速(多服务器情况下) 定义测速机制,根据数据包路由信息确定最优服务器IP地址,直接缓存到本地hosts文件中
- 智能DNS切换 多服务器情况下,切换选择基于本机的最优服务器
- CDN返回缓存 CDN判断
结语
这个1.0版本的分析还有些技术细节有待优化.