# nowercoder **Repository Path**: ddwhzh/nowercoder ## Basic Information - **Project Name**: nowercoder - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-22 - **Last Updated**: 2022-08-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: Spring-MVC, Web ## README # nowercoder 使用Spring MVC,Themeleaf模板, 实现功能包括首页,个人主页,注册验证码,发送邮件, 私信(MySQL), 登录登出(redis), 发帖回复点赞(redis), 系统通知(kafka), 权限删帖加精置顶(spring Security), 站内搜索(Elasticsearch), 热帖排行,网站数据统计等功能。 实现了帖子内容caffeine,redis的二级缓存,每次更新删除缓存再修改数据库; 并利用布隆过滤器黑名单过滤非法username; 利用spring自带线程池优化系统通知部分。 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 部署: 需要安装mysql(3308),redis,kafka,ES,有run.bat(win10)支持一键开启这些软件。也可以选择docker部署。 maven重新加载项目运行即可,报错可能需要修改头像存放位置。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// *异常处理*:采用拦截器ExceptionHandler在出现异常时候写入logger,根据ajax和http响应不同而不同。 *记录日志*:采用AOP CGLib动态代理,在所有service方法前记录日志。 *注册*:用户先填写账号名,密码,邮箱,检查是否合规,密码md5加密进入数据库。合规生成UUID激活码,发送激活邮件,修改MySQL的用户激活状态。 *登录*:生成验证码和UUID,放入(UUID)cookie和(UUID-text)redis中,通过http响应报文返回验证码图片; @CookieValue("kaptchaOwner")获得UUID,从redis获取验证码text,与输入验证码code比对,检查用户名和密码和数据库相不相同,更新cookie,以响应报文方式发送cookie。 利用拦截器从浏览器的cookie中获得ticket,检查受否有效,更新user对象,放入hostHolder(当前用户),并更改权限; *登出*:删除redis的UUID-Text项,更新权限 *写帖子*:写title和content,放入DiscussPost对象,添加到数据库,并触发评论事件,作为kafka的生产者,获得帖子的热点分数 *读帖子*:根据帖子id获得DiscussPost对象,作者,点赞数量,点赞状态,评论分页,以及评论的回复,采用map存入model中 *写评论*:从hostHolder获得当前用户,context和title要转成html符号转义并使用前缀树过滤敏感词,利用spring事务完成添加评论以及评论计数功能,如果实体类型是帖子,target是discussPost,触发发帖和评论事件;如果实体类型是评论,target是Comment,作为评论事件发送给broken。 *发私信*:采用异步Ajax响应,把content包装成Message发送给toName的数据库项 *读私信*:从数据库里搜索,返回List和Detail给model *点赞*:利用异步Ajax响应,redis(点赞对象+数量)存储(帖子/评论的id-like数量)以及当前是否点赞,如果点赞触发点赞事件给kafka,如果是帖子不是评论,获得热度得分。 *关注*:同上,redis存储关注者和被关注者id两个相反的key-value,可以方便找到关注者和被关注者,同样会触发关注事件。 *网站数据统计*:利用拦截器计算UV(访问量)和DAU(日活),UV是根据IP得到放入HyperLogLog(12K统计不重复数量),DAU统计当前访问的用户放入redis中的Bitmap(位字符串)。 *系统通知*:利用线程池优化了评论,关注,点赞事件的消费(参数5,10,9999,拒绝执行),modelandview是单例线程requestScope不安全所以要加锁,直接锁Synchronized model即可。 *搜索服务*:实例化一个SearchQuery排序方式,然后搜索相应范围。 *权限控制*:使用Spring Security控制权限,还是利用拦截器。 *两级缓存*:会在访问帖子增加缓存,第一级采用Caffeine本地缓存(每次访问后写入本地缓存-redis),第二级采用redis,将"DiscussPosts" + ":" + userId + ":" + offset + ":" + limit + ":" + orderMode作为Key,内容作为Value存储(存在大Value热点问题),2小时左右失效(防止雪崩),每次更新双删维持弱一致性。 *热帖排行*:quartz定时更新score值,计算公式f1(点赞,评论,收藏)+f2(时间),score放入redis中。