做渐变色的网站,智能建站系统的建站步骤,网站数据库网络错误怎么解决方案,黄埔网站推广前言
基本上每个系统系统都包含用户注册、发送验证码等基本操作。在前些年#xff0c;我还记得我在逛 csdn、贴吧、网易新闻等网站的时候是可以不登陆也能浏览完网页内容的#xff0c;但是近几年这些网站已经改成了不登陆不让用#xff0c;浏览网页时不时提醒你要进行登录我还记得我在逛 csdn、贴吧、网易新闻等网站的时候是可以不登陆也能浏览完网页内容的但是近几年这些网站已经改成了不登陆不让用浏览网页时不时提醒你要进行登录对于一些不喜欢注册的用户造成了相当大的困扰。
但是不知道大家有没有想过这里面的深层逻辑就是为什么前些年什么 csdn、贴吧、网易新闻等明明不进行登录浏览网页体验还行现在要改成这样子
这里面涉及的因素有很多比如互联网发展到头、变现困难、存量环境加剧内卷等。
当公司盈利压力变大老板眼看收益日趋降低便开始拉领导开会领导开完会开始 PUA 员工一层一层递进辅以绩效、okr 等工具制定目标结果。于是公司底层员工的想法从努力赚钱、升职加薪变成保住饭碗、养活一家老小对于业务上的月度、季度营收要求自然是各种促进用户付费的手段应上齐上。
这里面提升付费有一个非常重要的前提就是用户只要有了用户就有付费希望。
如果用户不注册不留下手机号、邮箱等个人信息互联网运营又怎么给这些用户发送营销短信和邮件。所以说强制注册本质上是为了公司利益。
只要把用户留下来留在自己的 APP 里收集用户信息后续各种运营活动、支付弹窗、短信找回、活动抽奖一起上何愁没有用户 。 用户信息记录的意义是为了聚集 C 端用户、收集信息为后续运营活动提升付费做准备。就拿淘宝举例个性化推荐、千人千面、双 11 活动等这一系列运营活动说到底都是为了提升淘宝的付费金额提升淘宝平台的 GMV。什么个性化推荐、千人千面说白了就是收集你的个人信息你的商品点击、浏览、下单等操作都会被淘宝采集进而通过算法模型进行商品推荐选出你可能感兴趣的商品展示从而提升淘宝付费金额。 OK到这里题外话说多了虽然说用户注册是一个很基本的逻辑但是很多人一不小心就会掉坑里。这里我给大家介绍下 waynboot-mall 项目中用户注册是怎么玩的为什么说可以保你平安。 waynboot-mall 项目是由我开源的一套 H5 商城项目包含运营后台、H5 商城前台和服务端接口。实现了商城所需的首页展示、商品分类、商品详情、商品 sku、分词搜索、购物车、结算下单、支付宝/微信支付、收单评论以及完善的后台管理等一系列功能。 技术上基于最新得 Springboot3.0 框架开发而来整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中间件。商城模块划分合理、代码质量较高、易于部署非常适合大家拿来学习使用。 github 地址https://github.com/wayn111/waynboot-mall 用户注册
在 waynboot-mall 项目中商城注册页面截图如下。 /captcha 生成图形验证码接口
ResponseBody
RequestMapping(/captcha)
public R captcha() {// 1. 创建验证码对象定义验证码图形的长、宽、以及字数SpecCaptcha specCaptcha new SpecCaptcha(80, 32, 4);// 2. 生成验证码String verCode specCaptcha.text().toLowerCase();// 3. 生成验证码唯一keyString captchaKey IdUtil.getUid();// 4. 存入redis并设置过期时间为30分钟redisCache.setCacheObject(captchaKey, verCode, SysConstants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);// 5. 将key和base64返回给前端return R.success().add(captchaKey, captchaKey).add(image, specCaptcha.toBase64());
}验证码接口基本是每个系统都有的接口验证码主要是为了防止别人直接调用接口进行注册操作是一个安全措施。现在市面上流行的有图形验证码、滑块验证码、点选验证码等waynboot-mall 项目中使用的图形验证码大家有兴趣可以了解 tianai-captcha 这个项目包含滑块验证码、点选验证码等。现在我们对验证码接口进行讲解 第一步创建验证码对象定义验证码图形的长、宽、以及字数这里创建的 SpecCaptcha 对象来自 easy-captcha 项目 第二步生成验证码 verCode 第三步为验证码生成唯一 captchaKey 第四步将 captchaKey 作为 key verCode 作为 value存入 redis 并设置过期时间 第五步将 captchaKey 以及验证码图像的 base64 编码返回给前端 前端在调用完 /captcha 接口后会拿到 captchaKey 以及验证码图像的 base64 编码之后前端就可以将 base64 编码作为 img 标签 src 属性用作图形验证码展示。
用户输入邮箱和图形验证码后就可以点击发送邮箱验证码了。
调用发送邮箱验证码接口时会将 captchaKey、验证码、手机号等信息一起传给服务端。
/sendEmailCode 发送邮箱验证码接口
PostMapping(/sendEmailCode)
public R sendEmailCode(RequestBody RegistryObj registryObj) {String captchaKey registryObj.getCaptchaKey();String captchaCode registryObj.getCaptchaCode();String mobile registryObj.getMobile();if (StringUtils.isBlank(captchaKey)) {return R.error(CUSTOM_ERROR.setMsg(图形验证码错误));}if (StringUtils.isBlank(captchaCode)) {return R.error(CUSTOM_ERROR.setMsg(图形验证码为空));}if (StringUtils.isBlank(mobile)) {return R.error(CUSTOM_ERROR.setMsg(手机号为空));}String redisCode redisCache.getCacheObject(captchaKey);// 判断验证码codeif (!redisCode.equals(captchaCode.trim().toLowerCase())) {return R.error(USER_CAPTCHA_CODE_ERROR);}// 验证手机号是否唯一long count iMemberService.count(Wrappers.lambdaQuery(Member.class).eq(Member::getMobile, mobile));if (count 0) {return R.error(USER_PHONE_HAS_REGISTER_ERROR);}// 生成邮箱验证码codeString emailCode RandomUtil.randomString(6);// 生成邮箱验证码唯一keyString emailKey RedisKeyEnum.EMAIL_KEY_CACHE.getKey(IdUtil.getUid());// 存入redis并设置过期时间为20分钟redisCache.setCacheObject(emailKey, emailCode _ mobile, RedisKeyEnum.EMAIL_KEY_CACHE.getExpireSecond());commonThreadPoolTaskExecutor.execute(() - {EmailConfig emailConfig mailConfigService.getById(1L);SendMailVO sendMailVO new SendMailVO();sendMailVO.setSubject(mall商城注册通知);sendMailVO.setContent(邮箱验证码 emailCode);sendMailVO.setTos(Collections.singletonList(registryObj.getEmail()));MailUtil.sendMail(emailConfig, sendMailVO, false, false);});return R.success().add(emailKey, emailKey);
}一般商城系统中发送邮箱验证码、短信验证码时都需要进行验证码输入这一步骤这是为了防止别人直接通过接口调用的形式浪费我们系统的资源特别是发送手机验证码、邮件这种资源。发送邮箱验证码接口讲解如下 第一步校验 captchaKey、captchaCode、mobile 必传参数 第二步根据 captchaKey 读取 redis 中存放的验证码 code与用户输入 captchaCode 进行比较 第三步验证用户手机号是否唯一 第四步生成六位邮箱验证码 emailCode 第五步生成邮箱验证码唯一 emailKey 第六步将 emailKey 作为 key emailCode_mobile 作为 value存入 redis 并设置过期时间注意这一步将用户手机号也存入 Redis 是为了防止用户在获取完邮箱验证码后修改手机号这一点很重要很多开发同学都忘了这一步 第七步使用线程池异步发送验证码邮件 前端在调用完 /sendEmailCode 接口后就可以拿到 emailKey。
这样等用户输入邮箱里的验证码后点击注册按钮我们就可能正式开始注册操作了。
/registry 用户注册
PostMapping(/registry)
public R registry(RequestBody RegistryObj registryObj) {// 验证两次密码输入是否一致if (!StringUtils.equalsIgnoreCase(registryObj.getPassword(), registryObj.getConfirmPassword())) {return R.error(USER_TWO_PASSWORD_NOT_SAME_ERROR);}// 验证用户手机号是否唯一long count iMemberService.count(Wrappers.lambdaQuery(Member.class).eq(Member::getMobile, registryObj.getMobile()));if (count 0) {return R.error(USER_PHONE_HAS_REGISTER_ERROR);}// 判断图形验证码String redisCaptchaCode redisCache.getCacheObject(registryObj.getCaptchaKey());if (registryObj.getCaptchaCode() null || !redisCaptchaCode.equals(registryObj.getCaptchaCode().trim().toLowerCase())) {return R.error(USER_CAPTCHA_CODE_ERROR);}// 判断邮箱验证码String value redisCache.getCacheObject(registryObj.getEmailKey());String[] split value.split(_);if (split.length 2) {return R.error(ReturnCodeEnum.USER_EMAIL_CODE_ERROR);}String redisEmailCode split[0];String mobile split[1];// 判断发送邮箱验证码的手机号是否与用户当前传入手机号一致if (!StringUtils.equalsIgnoreCase(mobile, registryObj.getMobile())) {return R.error(ReturnCodeEnum.USER_REGISTER_MOBILE_ERROR);}// 判断用户输入邮箱验证码是否正确if (registryObj.getEmailCode() null || !redisEmailCode.equals(registryObj.getEmailCode().trim().toLowerCase())) {return R.error(ReturnCodeEnum.USER_EMAIL_CODE_ERROR);}// 删除验证码redisCache.deleteObject(registryObj.getCaptchaKey());redisCache.deleteObject(registryObj.getEmailKey());Member member new Member();long time System.currentTimeMillis();member.setNickname(昵称 time / 1000);String avatar SysConstants.DEFAULT_AVATAR;member.setAvatar(avatar);member.setMobile(registryObj.getMobile());member.setEmail(registryObj.getEmail());member.setPassword(SecurityUtils.encryptPassword(registryObj.getPassword()));member.setCreateTime(new Date());return R.result(iMemberService.save(member));
}注册接口需要逻辑完善所以这里的校验逻辑会比较多因为一个商城最重要的几个接口就是注册、登录、下单、支付等。
除了能让用户正常注册外有时候还需要确保用户一个手机号只能注册一个账号完成对用户手机号在商城的唯一性保障。除了先查询用户手机号是否已存在外还需要对用户 member 表的手机号字段设置唯一索引来完成。注册接口讲解如下 唯一索引可以防止用户重复点击注册按钮保证一个手机号只能注册一个用户。 第一步验证用户输入两次密码是否一致 第二步验证用户输入的手机号是否唯一 第三步验证用户输入的图形验证码是否于 Redis 中存储一致 第四步验证发送邮箱验证码的手机号是否于 Redis 中存储一致 第五步验证用户输入的邮箱验证码是否于 Redis 中存储一致 第六步校验通过开始删除图形验证码、邮箱验证码 第七步启动线程池异步进行用户保存操作 最后聊两句
用户注册说简单是很简单但是校验逻辑一定要做好这是我的踩坑经验现在我传授给你希望能帮你平安。 关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、国外优质文章翻译等您的关注将是我的更新动力
文章转载自: http://www.morning.mjkqj.cn.gov.cn.mjkqj.cn http://www.morning.dxzcr.cn.gov.cn.dxzcr.cn http://www.morning.pjfmq.cn.gov.cn.pjfmq.cn http://www.morning.rqhdt.cn.gov.cn.rqhdt.cn http://www.morning.qichetc.com.gov.cn.qichetc.com http://www.morning.mpszk.cn.gov.cn.mpszk.cn http://www.morning.ktmpw.cn.gov.cn.ktmpw.cn http://www.morning.lchtb.cn.gov.cn.lchtb.cn http://www.morning.rsxw.cn.gov.cn.rsxw.cn http://www.morning.cfccp.cn.gov.cn.cfccp.cn http://www.morning.swlwf.cn.gov.cn.swlwf.cn http://www.morning.cpnlq.cn.gov.cn.cpnlq.cn http://www.morning.wklmj.cn.gov.cn.wklmj.cn http://www.morning.tnyanzou.com.gov.cn.tnyanzou.com http://www.morning.xnnpy.cn.gov.cn.xnnpy.cn http://www.morning.rhph.cn.gov.cn.rhph.cn http://www.morning.qlrwf.cn.gov.cn.qlrwf.cn http://www.morning.cnqwn.cn.gov.cn.cnqwn.cn http://www.morning.rcbdn.cn.gov.cn.rcbdn.cn http://www.morning.pltbd.cn.gov.cn.pltbd.cn http://www.morning.txltb.cn.gov.cn.txltb.cn http://www.morning.pcqdf.cn.gov.cn.pcqdf.cn http://www.morning.spnky.cn.gov.cn.spnky.cn http://www.morning.pdxqk.cn.gov.cn.pdxqk.cn http://www.morning.litao7.cn.gov.cn.litao7.cn http://www.morning.wjrtg.cn.gov.cn.wjrtg.cn http://www.morning.gtbjf.cn.gov.cn.gtbjf.cn http://www.morning.qzdxy.cn.gov.cn.qzdxy.cn http://www.morning.mdplm.cn.gov.cn.mdplm.cn http://www.morning.qfgwx.cn.gov.cn.qfgwx.cn http://www.morning.ctlzf.cn.gov.cn.ctlzf.cn http://www.morning.qgbfx.cn.gov.cn.qgbfx.cn http://www.morning.yhplt.cn.gov.cn.yhplt.cn http://www.morning.xskbr.cn.gov.cn.xskbr.cn http://www.morning.gwqcr.cn.gov.cn.gwqcr.cn http://www.morning.wqpr.cn.gov.cn.wqpr.cn http://www.morning.rtkz.cn.gov.cn.rtkz.cn http://www.morning.qinhuangdjy.cn.gov.cn.qinhuangdjy.cn http://www.morning.bqmsm.cn.gov.cn.bqmsm.cn http://www.morning.wynqg.cn.gov.cn.wynqg.cn http://www.morning.hlxpz.cn.gov.cn.hlxpz.cn http://www.morning.hxrg.cn.gov.cn.hxrg.cn http://www.morning.hmxrs.cn.gov.cn.hmxrs.cn http://www.morning.khdw.cn.gov.cn.khdw.cn http://www.morning.ltzkk.cn.gov.cn.ltzkk.cn http://www.morning.trrd.cn.gov.cn.trrd.cn http://www.morning.csnch.cn.gov.cn.csnch.cn http://www.morning.xbxks.cn.gov.cn.xbxks.cn http://www.morning.phjny.cn.gov.cn.phjny.cn http://www.morning.wmcng.cn.gov.cn.wmcng.cn http://www.morning.vjdofuj.cn.gov.cn.vjdofuj.cn http://www.morning.kwxr.cn.gov.cn.kwxr.cn http://www.morning.homayy.com.gov.cn.homayy.com http://www.morning.wmfmj.cn.gov.cn.wmfmj.cn http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn http://www.morning.horihe.com.gov.cn.horihe.com http://www.morning.sskkf.cn.gov.cn.sskkf.cn http://www.morning.zfcfx.cn.gov.cn.zfcfx.cn http://www.morning.xdxpq.cn.gov.cn.xdxpq.cn http://www.morning.nyfyq.cn.gov.cn.nyfyq.cn http://www.morning.mhwtq.cn.gov.cn.mhwtq.cn http://www.morning.juju8.cn.gov.cn.juju8.cn http://www.morning.dndjx.cn.gov.cn.dndjx.cn http://www.morning.rgwz.cn.gov.cn.rgwz.cn http://www.morning.mlzyx.cn.gov.cn.mlzyx.cn http://www.morning.nmpdm.cn.gov.cn.nmpdm.cn http://www.morning.qxmys.cn.gov.cn.qxmys.cn http://www.morning.hlrtzcj.cn.gov.cn.hlrtzcj.cn http://www.morning.wfspn.cn.gov.cn.wfspn.cn http://www.morning.xjqhh.cn.gov.cn.xjqhh.cn http://www.morning.mmplj.cn.gov.cn.mmplj.cn http://www.morning.flfdm.cn.gov.cn.flfdm.cn http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn http://www.morning.zlgbx.cn.gov.cn.zlgbx.cn http://www.morning.wbfg.cn.gov.cn.wbfg.cn http://www.morning.cnbdn.cn.gov.cn.cnbdn.cn http://www.morning.xsbhg.cn.gov.cn.xsbhg.cn http://www.morning.mkhwx.cn.gov.cn.mkhwx.cn http://www.morning.jwtjf.cn.gov.cn.jwtjf.cn http://www.morning.hpprx.cn.gov.cn.hpprx.cn