射击项目的架构设计与实现
用户模块的详细设计与实现
登录与注册的详细设计与实现
本系统为了方便用户的使用,采用登录注册一键化的方案,当用户输入手机号在系统总不存在时即为注册,如果手机号存在则为登录。
本系统使用手机号发送验证码进行登录注册。
具体实现:在用户填写填写好手机号后,前端向后端发送请求获取手机验证码,后端调用阿里云SMS服务,向用户发送验证码,并将验证码存入redis,并设置过期时间为一分钟。 设置过期时间的目的是防止用户短时间内多次发送验证码,导致资源浪费,过期时间未到则不会发送新的验证码,当用户输入验证码后,前端将用户输入的验证码发送到后端验证,验证成功后判断手机号是否存在,如果存在则生成token与登录信息存入redis中,完成登录,如果不存在则为注册,自动生成用户默认信息,存入数据库中。
注销的详细设计与实现
用户如果需要退出当前账号可在设置页面中,点击注退出登录,完成注销。点击时会有消息提示框,提醒用户是否退出当前账号。确认后,前端向服务器发送请求,服务器将用户的登录信息从redis中删除,前端退出到登录注册页面。
修改个人信息的详细设计与实现
用户修改个人信息功能包括修改个人信息,修改头像等。用户可在我的页面内点击编辑资料修改个人信息和头像。
修改头像:在编辑资料页面内,点击头像进行修改,从相册中选择图片,如果选择新的图片,提交后,服务器收到客户端传来的图片后,上传到oss (阿里云对象储存服务)中,储存到相应的资源路径。oss Api返回图像的储存路径,服务端获取到后储存到数据库图片表中。
修改其他信息:只需在输入框输入对应信息即可,前端页面对信息进行验证后,通过验证后提供给服务器,服务器收到信息后将信息更新到数据库。
站内信模块的详细设计与实现
站内私信功能主要使用netty+websocket+rabbitmq 实现。可通过与服务端建立长连接 ,用户发送消息后通过服务端上传到消息队列rabbitmq中,再由rabbitmq发送给服务端进行消费。消费者向每条消息所对应用户的客户端推送该消息。通过客户端与服务端的长连接,服务端主动向客户端推送消息。
消息分为用户私信消息、通知消息两大种,私信消息如上述逻辑所示,通知消息有关注通知、回复通知、评论通知等类型。具体实现如当有用户评论你的动态时,服务端除了记录评论的内容外,还需调用站内信模块的通知消息服务,将消息主动推送给所评论动态的用户。
具体架构设计图如下图所示:
当消息未被查看时,消息默认状态为未查看,消息列表上会显示红点表示未读,当点击查看后则消息标记为已读,红点消失。
用户可选择消息进行删除,客户端将需要删除的消息id传入服务端,服务端在数据库中进行软删除。
当用户进入消息模块时,系统会默认查询改用户所有未删除的消息,客户端可收到消息内容、消息类型、消息状态、发送时间等数据,通过这些属性对消息进行分类展示和排版。
朋友圈模块的详细设计与实现
发送动态、文章的详细设计与实现
动态与文章储存在一张表中,使用一个类型字段来表示两者区别。但两者更主要的区别是,动态参考的是qq空间动态的发布,可编写动态内容和添加图片,而发布文章则使用富文本进行编辑,最终储存在数据库中的是html文本。
用户可在朋友圈模块找到点击发布动态和编写文章的入口,发布动态时,可输入动态内容,上传图片(最多可上传9张)。发布文章可键入文章标题和文章内容。编写完成后通过客户端验证后发送到服务端,服务端将内容保存的文章表中。
删除动态、文章的详细设计与实现
用户发布的动态与文章皆可由自己删除,但不可删除其他用户的文章与动态,当客户端发送删除动态或文章的请求时,会传递给服务端该动态的id,服务端将会判断是否是该用户的动态或文章,如果是则成功删除。
转发动态、文章的设计与实现
用户可对其他用户发送的动态进行转发,转发时可输入想说的话,转发的文章也将被记录到用户的文章、动态表,只不过类型标记为转发,当用户点击转发时,将保存文章或者动态的摘要(即前50个字)、
原文章的id (Pid),转发用户id等信息。转发的动态也将在用户主页的动态类表中展示出来。
评论的设计与实现
用户可对其他用户的动态或者文章进行评论,评论与动态绑定在一起。用户发送评论后,客户端将评论内容传到服务端,服务端将评论内容、动态id、评论用户id,评论时间等存入数据库中。评论支持二级评论,二级评论使用pid来绑定上一级评论的id。
删除评论:用户可以删除自己发送的评论,文章或动态作者也可以删除动态或者文章下的评论。具体实现:前端携带参数评论id向后端发送请求删除评论,删除前判断是否是自己发送的评论或者是否是属于自己动态或文章的评论。
点赞的设计与实现
用户可对文章和动态进行点赞,因为点赞操作是一个较为频繁的操作,所以使用redis进行缓存点赞操作以及缓存点赞数量,redis使用字符串key-value结构储存动态是否被点赞过,key为 动态\文章id ,value为是否已经点赞,发起点赞请求后,客户端传给服务端动态\文章id,服务端先去redis中获取点赞状态,如果redis中没有缓存,则从数据库中查询,将状态反置,并将状态缓存到redis中。如果redis中有缓存,则改变redis状态,如果状态从未点赞转换为已点赞则将redis中点赞数量加一,如果状态从已点赞转换为未点赞则将reids中点赞数量减一。每过一段时间使用定时任务将redis中点赞数量存到数据库中,并更新数据库动态的点赞状态。
查询动态、文章详情的设计与实现
点击动态、文章可查看动态、文章详情,详情页包括动态、文章的内容、作者头像、作者名、发布时间、评论列表、点赞列表和转发列表。
查询评论列表:根据动态、文章id查询该动态所属的评论,并递归查询第二层评论,使用分页查询,每次查询10条评论,当往下滑动时查询第二页,根据点赞时间排序。
查询点赞列表:根据动态、文章id从点赞表中查询点赞的用户,为缓解数据库压力,每次查询10个点赞用户,根据点赞时间排序。
转发列表:根据动态id在动态表中查询pid = 该动态id的数据,即转发该动态的列表,并根据转发时间排序。
关注的详细设计与实现
用户与用户之间的联系储存在系统用户关系表。表中储存用户id 与被关注者id。关注操作的具体流程为:首先判断需要关注的用户是否已将关注过,如果关注过,就提示用户是否取消关注,用户确认取消关注则取消用户之间的联系,即软删除用户之间的联系。
用户关系列表的查看,用户关系列表包括:互关列表、粉丝列表、关注列表。互关列表查询即在用户关系表中查询自己关注的用户又同时关注自己的用户。粉丝列表查询即在用户关系表中查询关注自己的列表。关注列表即查询自己关注的用户列表。
文章打赏的设计与实现
用户可对喜欢的文章使用积分进行打赏,用户可在其他用户文章详情页面,点击打赏,可选择打赏积分或自己输入积分进行打赏。服务端收到请求后操作大致分为两步,首先扣减打赏用户的积分,然后增加被打赏文章作者的积分。这个步骤必须满足原子性,需要使用redis分布式锁来保证。
Redis分布式锁的具体实现:首先,在打赏操作开始前进行获取锁,使用redis 的Lua 脚本使用setnx命令进行加锁。setnx命令的作用是:指定的 key 不存在时,为 key 设置指定的值。如果成功存入了key,说明加锁成功,则代码继续往下执行。如果未能成功设置key,说明获取锁失败,循环继续获取锁,如果一段时间内未能获得锁,则加锁失败,不再获取锁。打赏逻辑执行完成之后,需要释放锁,释放锁也必须使用Lua脚本来保证原子性。
商城模块的详细设计与实现
商品服务的详细设计与实现
商品前台服务实现:用户可在系统前台查看商品详情。点击进入商品详情页面后,可点击立即购买,选择购买数量和规格,点击确认进行购买。
商品后台服务实现:当管理员成功登录商城系统后,可以选择对商品、类别、商品规格进行修改。管理员对商品可以进行新增商品、删除商品、查询商品、修改商品,对类别是可以新增分类、删除分类、修改类别,对商品规格是添加规格参数,删除规格参数、修改规格参数,商品系列修改是添加新的系列、修改系列、删除系列。修改成功后返回结果。下面是商品服务的一个流程图。
订单服务的详细设计与实现
订单的具体流程是在用户选购完商品规格和数量点击提交订单后开始进行,当订单提交后,系统就会创建一个订单储存购买商品的数量、价格、规格等信息。点击确认付款进行相应的积分扣减,完成此次订单,订单状态会由未付款转为已付款。若商品发货,则订单状态则会转变为已发货,用户签收后,订单状态转为已签收。用户可以在订单页面查看各种状态的订单,并可以选择删除已完成的订单。订单服务流程图如图。