Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[项目总结] 为某银行开发一个开业线上活动的H5网站

[项目总结] 为某银行开发一个开业线上活动的H5网站

作者头像
LCyee
发布于 2020-08-06 04:18:38
发布于 2020-08-06 04:18:38
1.7K0
举报

0x00:写在前面

甲方给出的大致需求是做一个移动端 H5 的活动网站,需要实现微信登录、在线点播视频,抽奖、奖品发放等功能,但距离甲方的活动上线的时间只有7天左右,所以还需要考虑是否能在这个时间区间内实现所有的需求。

经过需求的梳理以及参考类似的产品过后,得出可能会遇到一些难点(没有动手实现过的需求)例如对接一些微信的API、视频在线点播、微信红包自动发放等。但这些都是在可以接收的范围内的,查文档查案例,边学边做,顺便也可以将近期所学得的知识点用在该项目当中来。0x02:需求分析

甲方给出的活动流程如下:

  1. 前三天进行推文和长图传播,最终弄实现形式是H5(包括微电影+抽奖)
  2. 三天三部微电影,观看完整视频后可获得一次(仅有一次)抽奖机会,奖品大多数是红包
  3. 并生成二维码进行分享传播,别人扫你的二维码可增加人气值和最多一次的抽奖机会
  4. 人气值在最后一天体现,每天的H5要有人气值的排行榜。
  5. 第四天做答案揭晓,并在朋友圈做广告推广(推广这块由另一位老板负责)根据排行榜抽取最终的大奖

开发周期:7 天时间实现所有需求,第 8 天早上上线,活动持续 4 天时间,第 11 天下午活动结束。

0x03:需求整理

  1. 用户点击【开启新起点】按钮,浏览企业信息
  2. 观看一部微电影视频,观看结束后提示用户获得一次抽奖机会
  3. 抽奖成功,显示当前的抽奖结果,在【我的奖品】内可以查看抽奖记录
  4. 引导用户点击【生成邀请海报】点击保存海报图片,引导用户分享到朋友圈或者微信好友
  5. 成功邀请好友进入到页面,用户额外获得一次抽奖机会,邀请者人气值增加,用户每邀请成功一个用户,都会获取一定的人气值,但抽奖机会只能额外增加一次。
  6. 点击【活动锦囊】查看当前人气排行榜,以及自己的积分数量和排名

0x04:业务流程总结

微信登录授权流程

  1. 用户进入活动页面,为用户重定向至微信授权页面,等待用户选择 “同意” 或 "拒绝" 授权。
  2. 用户同意授权,微信授权服务会自动重定向到 redirect_uri 中的 URL,也就是我们的后端的用户登录接口,并且会携带用户的 tempcode
  3. 后端的用户登录接口接收到 tempcode 并使用 tempcode 去获取用户的 access_token 等信息,获取成功后微信会返回 access_token 以及用户的 openidunionid 等信息(公众号需要绑定微信开发平台才能获取到unionidunionid 可以作为该微信号的唯一标识)
  4. 携带 access_token 获取该用户的微信信息,并添加或者更新到数据库内。
  5. 生成JWT令牌,为用户重定向至活动主页,并在重定向时携带生成的 JWT 令牌信息。

用户在线点播视频流程

  1. 由于在线点播视频使需要携带 playauth 才能进行播放,后端使用 spring task 开启定时任务,每隔一段时间向阿里云 vod 服务获取新的 playauth(playauth 默认的过期时间为7200秒,所以我们需要提前一些时间去更新)
  2. 用户点击播放视频,向后端接口请求该视频的播放信息,例如视频ID、视频标题、描述信息、playauth等
  3. 后端接收到请求后,首先校验用户携带的JWT令牌是否合法。
  4. 令牌校验失败,则会响应的效应的信息到前端,前端再要求用户重新信息授权登录。
  5. 令牌校验通过,返回指定视频的播放信息到前端。
  6. 前端播放器携带获取到的视频 id 以及 playauth 访问阿里云VOD服务,获取该视频的播放流。
  7. 接收视频的流数据,播放视频。
  8. 每个一段时间向后端发送当前视频的播放进度,后端接收到请求后做相应的记录,并且响应当前的记录状态到前端
  9. 后端以用户首次提交进度作为播初始提交时间,当检测到用户当前提交的播放进度符合要求时,对比用户第一次与最后一次提交的时间的差来判断用户是否存在作弊行为。
  10. 用户完成当天的视频观看任务,增加一次抽奖机会。

抽奖流程

  1. 用户点击抽奖,显示腾讯滑块验证码,要求用户通过该验证码后才能进行下一步操作。
  2. 滑块通过,将滑块验证码的行为数据加密后发送到腾验证码服务进行校验
  3. 腾讯验证码服务返回校验后的信息到前端,但此时前端还无法判断用户是否通过了校验
  4. 前端将收到的验证信息发送到后端服务,后端首先会校验用户的 jwt 令牌是否合法(防止接口薅羊毛的人恶意调用)令牌校验通过后将接收到验证信息后再次向验证码服务请求校验。
  5. 验证码服务返回校验结果,校验失败则返回响应的结果到前端,前端收到后要求用户重新通过验证码后才能进行后续的操作。
  6. 验证码校验成功,根据预设的概率来计算抽奖等级,如果抽到的是现金红包,则为用户重定向至红包的领取页面。

用户分享海报增加积分流程

  1. 用户 A 进入海报分享页面,前端以携带用户 ID 的链接作为参数生成一个二维码,点击生成海报,生成图片。
  2. 用户 B 扫描用户 A 分享海报中的二维码,访问用户 A 的分享链接并且要求用户B进行微信授权。
  3. 用户 B 同意授权,在微信授权接口的 state 参数中携带用户A的 userid 作为 friendid,并重定向至后端登录接口
  4. 后端接口获取用户 B 的微信信息,根据用户的 openid 判断该用户是否为新注册的用户,如果是则根据携带的friendid 为用户 A 增加一次邀请积分。
  5. 生成 JWT 令牌信息,为用户B重定向至活动主页。

0x05:实现过程总结

具体的实现思路以及伪代码的过程都写在了思维导图中。

https://www.processon.com/view/link/5ee39247f346fb1ae55ef6d3

0x06:项目中用到的技术栈

前端

技术、框架

说明

Vue

前端框架,MVVM 模式的实现者

Vue CLI

Vue 脚手架,基于 NodeJS

Vue Router

Vue 路由框架

Vuex

Vue 全局状态管理框架

Webpack

用于将Vue工程打包为单页应用进行部署

Axios

前端 HTTP 框架

Vant UI

VantUI 是有赞开源的一套基于 Vue 2.0 的 Mobile 组件库。通过 VantUI 组件库,可以快速搭建出风格统一的页面,提升开发效率。

SCSS

Sass 是成熟、稳定、强大的CSS预处理器,而SCSS是Sass3版本当中引入的新语法特性,完全兼容 CSS3 的同时继承了Sass强大的动态功能。

TCaptcha.js

用于Web 端快速接入腾讯验证码,适用于每次都需要进行人机验证的场景(登录、注册、下发短信、活动等)接入文档

Aliplayer.js

阿里云播放器SDK

Shake.js

实现微信摇一摇功能,IOS端需要提供运动权限

Vueqr.js

用于前端生成二维码

html2canvas

指定dom生成图片流,用于生成图片分享。

后端

技术、框架

说明

Spring Boot

Spring Boot 是新一代 JavaEE 开发标准,本项目中使用 Spring boot 2.2.X 作为后端开发框架

Spring Task

使用 Spring Task 对阿里云 vod 视频播放的认证信息进行定时更新,保证用户能够正常获取视频信息。

Mybatis Plus

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,用于简化 MyBatis 操作,一些常用的单表操作我们则直接使用Mp提供的API来进行,而复杂的多表操作我们任然是编写sql语句使用原生 Mybatis 来执行,们用到的版本是 3.3.2 , 依赖包内集成了 Mybatis 3.5.4

MyBatisGenerator

Maven 插件,用于 MyBatis 相关代码生成

MybatisCodeHelper

Intellij IDEA 插件,用于 MyBatis 相关代码生成

jjwt

用于快速生成、校验JWT令牌。

Swagger2

自动生成接口文档,用于后端接口调试以及提供给负责前端的老板调试页面。

Maven

项目依赖、版本管理

Docker

容器化引擎。用于快速部署应用程序

Docker-maven-plugin

maven打包插件,自动将maven项目打包为 docker 镜像

aliyun-java-sdk-vod

提供阿里云视频点播服务的API的相关操作规范

tencentcloud-sdk-java

用于快速接入腾讯云产品 API。本项目中用于接入腾讯滑块验证码

0x07:个人职责

  • 负责与甲方对接、讨论需求
  • 数据库设计
  • 后端业务功能实现
  • 项目部署、交付、运维

前端页面设计与实现的工作由 邓老板 负责

0x08:开发流程总结

0x09:最终实现效果

微信登录授权

视频在线点播

抽奖

自动发放红包

用户抽中现金红包后,后端返回一个重定向的请求,为用户重定向至红包代发平台的领取地址,领取成功后,代发平台又为用户重定向至我们的中奖页面,并显示用户的中奖金额,如下图

同时用户的微信消息中会收到一个服务通知,如下图所示

点击服务通知可以看到红包代发平台的领取消息,并且我们可以自定义一些活动的信息

点击领取红包,红包会自动存入我们的微信零钱当中,如下图

积分排行榜

0x0A:项目总结

  • 过度的需求分析以及伪代码设计,这样做虽然逻辑能够严谨,但并不适用这种完成周期较短的项目,最终可能会导致某个功能整体的实现时间变得更长。解决方案是:分析需求后简单的罗列步骤,尽快的开始具体的代码编写,开发过程中可以进行单元测试
  • 项目完成周期过短,甲方对页面效果要求高,且还未确定最终的页面效果、文案(开发两天后,该项目甲方所要求的页面效果的平面图在项目上线的前一天还在变动,预期的规划跟不上甲方的变化)
  • 未在活动前收集用户联系方式或要求用户先关注公众号,导致在活动结束后无法通知未关注公众号的用户填写收货信息。
  • 上线前的安全策略没有准备妥当,例如可以使用 nginx 的一些模块来限制 IP 的某个时间内的 请求频率,再配合 iptables 进行访问控制,还有 行为验证码、令牌校验等机制(使用滑块等行为验证码可以大幅度的提高羊毛党的成本,也能最大程度的减少用户体验的损耗)但由于甲方的活动在几天内就要上线,我们需要在短时间内实现所有需求,没有多余的时间去考虑这些问题,当然,这也是因为我们这方面经验,否则这些在开始的时候就应该安排人手去着手准备,导致上线后被羊毛党使用爬虫脚本配合代理池来高频的访问我们的后端接口导致我们的带宽被占用,影响正常用的访问。
  • 没有坚持每天都对当天完成的进度进行复盘总结,原因是在后续的几天时间里面,全天时间都花在了需求讨论和实现上,每天都是忙到晚上11点左右才回宿舍,已经再无精力去做总结,给出的解决方案是在往后的项目开发总,每天分段对开发的进度和情况进行复盘,例如午饭后、晚饭后、睡觉前,分段完成从而减少复盘时的焦虑。
  • 完成周期以及合同纠纷问题。如果周期较短按最低需求先实现(避免扣细节的习惯)保证截至当天能够交付或者上线,产品顺利上线后再做优化和迭代。

再次感谢 邓老板 的陪同作战 150 多个小时(上线当天两个人连续作战 40 多个小时没有休息)项目最后能够顺利交付离不开队友的积极配合与支持,虽然上线当天还是出了一些状况,但是整体来说还是很好,通过本次项目也收获到了不少实际开发中的经验。

0x0B:其他

微信网页授权的 “坑”

day4的上午,开始对微信登录的逻辑进行分析,查阅微信开放平台对于网站应用开发的文档,预期是使用之前审核通过的 “网站应用” 进行相关的开发

经过测试后发现,在开放平台提供给 “网站应用” 文档内的 "微信登录开发指南" 只能实现PC端的二维码扫码登录,而并不适用于移动端H5的需求(移动端的需求应该是打开网页后直接弹出授权请求)

PC端扫码后提示授权

移动端直接提示授权

经过资料的查阅,以及在询问经验丰富的大哥,最后在 segmentfault 提出的问题 得到了答复,最终确认了移动端 H5 网站要想实现微信登录授权,必须通过微信公众号来进行,而微信开发平台上的 “网站应用” 只适用于PC端网站进行扫码登录。微信为每个用户提供了公众平台的 测试账号 ,但API操作上有次数和频率的限制,并不适用于投入生产使用。

下午,最后还是把甲方的公众号权限要了过来,交付相关的权限后查阅 微信开放文档 进行相关流程的测试,最终实现了微信登录授权到信息获取的全过程,满足了该项目的需求,接下来是对整个后端的登录、校验流程的设计。整个下午都在使用思维导图对流程进行设计,没有进行实际的编码操作。

晚上,继续完善了登录流程的设计,整打算进行实际的编码,然后想到跟邓老板先讨论一下这个登录设计逻辑有无问题,经过分析后发现,设计的流程当中需要频繁的访问微信的授权 API 获取用户信息,且根据我们的需求,有更高效的方案,经过2个多小时的讨论后,最终决定使用 JWT 来实现无状态的令牌校验,既能防止用户对令牌进行篡改,也能实现令牌自动失效的需求,而无需再将令牌储存到 redis 内进行过期校验。

使用goaccess实时分析、监控nginx日志

参考文档

https://blog.csdn.net/liyyzz33/article/details/89945844

配置实时刷新

https://www.jianshu.com/p/b134995ae16c

效果图

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
springboot第19集:权限
id role_name(角色名) create_time(创建时间)update_time(更新时间) delete_status(删除状态)
达达前端
2023/10/08
1620
springboot第19集:权限
趁这个项目还不卷,快试试!
现在网上有很多播放量巨高的免费编程项目教程,之前我也带大家评测了【瑞吉外卖】、【尚医通】这两个近百万播放的热门项目,很多同学表示挺有收获,但美中不足的是感觉大家都做过。
程序员鱼皮
2022/11/07
6670
趁这个项目还不卷,快试试!
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
简单的,如果业务系统都在同一主域名下,比如 wenku.baidu.com 、 tieba.baidu.com ,就可以直接把 cookie domain 设置为主域名 baidu.com ,百度也就是这么干的
一尾流莺
2022/12/10
4720
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
体育即时比分系统开发实现,微信登录、手机号码登录、个人资料管理等功能
本项目展示了体育即时比分系统如何实现,微信登录、手机号码登录、个人资料管理等功能。由东莞梦幻网络科技提供技术支持。
用户10027718
2025/03/22
820
微服务[学成在线] day20:项目总结
由于在学习该项目的过程中发现了原讲义存在的一些问题,所以该笔记基于「学成在线」微服务项目 PDF 讲义进行编写,并且投入了时间去优化了笔记的格式、代码的高亮、重点的标记等。
LCyee
2020/08/06
2.4K0
微服务[学成在线] day20:项目总结
面试指南之如何介绍做过的项目
在面试过程中,程序员都需要介绍自己做过的项目,有的是在工作中做过的,有的是业余时间完成的,有的是团队合作完成的,有的是个人独立完成的。丰富的开场是赢下面试的基础。我总结了如下几个方面的项目介绍流程,供大家参考:
甲蛙全栈
2020/11/24
1.8K0
SSO 单点登录和 OAuth2.0 的区别和理解
一、概述 SSO是Single Sign On的缩写,OAuth是Open Authority的缩写,这两者都是使用令牌的方式来代替用户密码访问应用。流程上来说他们非常相似,但概念上又十分不同。SSO大家应该比较熟悉,它将登录认证和业务系统分离,使用独立的登录中心,实现了在登录中心登录后,所有相关的业务系统都能免登录访问资源。 OAuth2.0原理可能比较陌生,但平时用的却很多,比如访问某网站想留言又不想注册时使用了微信授权。以上两者,你在业务系统中都没有账号和密码,账号密码是存放在登录中心或微信服务器中的
程序猿DD
2023/05/04
2.1K0
SSO 单点登录和 OAuth2.0 的区别和理解
巧了,我又做过这个项目!
现在网上有很多播放量巨高的免费编程项目教程,很多学编程的同学可能都看过,就导致大家可能写在简历上的内容都差不多。
程序员鱼皮
2022/11/07
7180
巧了,我又做过这个项目!
过于自信,结果被面试官吊打了。。。
鱼皮最新原创项目教程,欢迎学习 大家好,我是鱼皮。最近春招开始了,有求职意向的小伙伴都要抓紧时间开始投递简历了哦~ 最近逛掘金,看到了一篇关于“被面试官吊打”的面试经历帖子,作者的笔风非常幽默、文章也很有参考价值,分享给大家,希望对正在求职的朋友有所帮助。 原文链接:https://juejin.cn/post/7204715616283836473 注意:以下文章中的 “我” 指原文作者。 ---- 是的,诸位没有看错,这篇文章的要讲述的并不是我吊打面试官,而是一段我被面试官吊打的陈年往事,这段痛苦
程序员鱼皮
2023/03/29
6780
过于自信,结果被面试官吊打了。。。
Golang实现一个微信抽奖小程序后台
​之前在学区块链,然后看到很多区块链项目都是基于golang在开发,包括以太坊的官方go-ethereum。了解了下go是google出品,很多人说其有c/c++的性能,然后却有脚本语言的开发效率。我就被吸引到了,开始学一下。方便后面搞后台遇到性能瓶颈的场景,以及区块链的开发。
J_J
2018/10/13
8.8K1
Golang实现一个微信抽奖小程序后台
微服务架构之「 访问安全 」
应用程序的访问安全又是我们每一个研发团队都必须关注的重点问题。尤其是在我们采用了微服务架构之后,项目的复杂度提升了N个级别,相应的,微服务的安全工作也就更难更复杂了。并且我们以往擅长的单体应用的安全方案对于微服务来说已经不再适用了。我们必须有一套新的方案来保障微服务架构的安全。
奎哥
2019/06/18
1.1K0
你们leader 可能都不知道的用户鉴权机制的原理
互联网年代,一个网站的用户数,就是这个网站的命脉,那么,这些用户的账户安全问题很成问题,于是行业大佬们,开始忧国忧民,研究出很多解决当下痛点的解决方案。从最开始的前后端不分离,研究出来的session-cookie,到后来基于前端存储的Token 验证 ,后来网站越来越多多了,为了不总是注册账号推出来的OAuth权限,以及一个公司项目太多了,为了防止重复登录开启的单点登录。
用户7413032
2022/03/09
1.3K0
你们leader 可能都不知道的用户鉴权机制的原理
OAuth2.0从入门到出道
我们都知道,很多网站登录的时候,可以通过微信、QQ、微博等APP扫码扫码认证登录,其实这就是OAuth2的应用。
Bug开发工程师
2020/11/03
8320
OAuth2.0从入门到出道
解析Web开发中的几种认证方法及应用场景
在Web开发中,认证是保障系统安全性的重要一环。不同的应用场景对认证方式的要求也不同。下面我们来详细介绍几种常见的认证方式。
星哥玩云
2025/01/22
1870
解析Web开发中的几种认证方法及应用场景
前后端鉴权方式多个场景与维度对比
前后端鉴权是一个很大的话题,不同组织的鉴权方式各不相同,甚至对同一协议的业务实现也可能相去甚远。
后端码匠
2021/01/05
1.5K0
fastapi集成google auth登录 - plus studio
首先前往Google Cloud Console (并创建一个新项目(如果尚未创建),然后在“API 和服务 > 仪表板”部分中启用“Google+ API”。你会在这样一个界面。
plus sign
2024/02/29
3570
fastapi集成google auth登录 - plus studio
一口气说出前后端 10 种鉴权方案~
在介绍鉴权方法之前,我们先要了解的是:什么是认证、授权、鉴权、权限控制以及他们之间的关系,有了他们做铺垫,那么我们才能做到从始至终的了解透彻 ~
终码一生
2022/10/28
6.6K1
一口气说出前后端 10 种鉴权方案~
什么是单点登录?什么又是 OAuth2.0?
对于刚开始接触身份认证的朋友对于单点登录,OAuth2.0,JWT 等等会有诸多疑惑,甚至还会问既然有了 JWT 还拿 单点登录做什么?还拿 OAuth2.0 做什么?
阿兵云原生
2023/09/24
1.3K0
什么是单点登录?什么又是 OAuth2.0?
SpringSecurity 实现几种常见的登录方式
SpringSecurity 要求配置类继承 WebSecurityConfigurerAdapter,并重写其中的 configure 方法。我们先进行基本的配置:
1270778
2024/02/05
7770
微信Java开发工具包的使用前言:一、weixin-java-tools介绍:二、使用方法:总结:
之前我在《Java调用微信登录以及eclipse远程调试》一文中说到了Java程序怎么调用微信登录,不过那篇文章中使用的是手工方式,本文将介绍如何使用第三方SDK(binarywang)进行微信网页授权以及获取微信用户信息。
贪挽懒月
2018/11/23
5.1K0
推荐阅读
相关推荐
springboot第19集:权限
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文