牛客网项目总结
对于牛客网的项目进行总结和反思
XiaoShanCoder
这个作者很懒,什么都没留下…
展开
-
总结-19 项目部署和总结
部署之前我们都是在本机上跑整个项目,接下来我们要将这个项目部署到服务器上然后再通过路径来访问,当然这里我们使用虚拟机CentOS进行代替。下图是我们项目的结构,可以看到我们是使用nginx服务器来分发请求到Tomcat的,这就是所谓的反向代理,通常情况下我们会有多个Tomcat服务器,但是我们虚拟机分配的资源很少所以只有一个Tomcat服务器,Tomcat服务器就是我们项目部署的位置,我们只要...原创 2020-01-17 23:18:38 · 544 阅读 · 1 评论 -
总结-18 单元测试和项目监控
单元测试开发过程中测试是十分重要的,在我们的开发过程中,测试是贯穿整个项目的,但是实际上我们有些测试之间是存在相互依赖关系的,这样或许会在之后的测试中产生麻烦,最好的方法就是每个测试类都是项目依赖的,我们在每个类中初始化测试数据,然后再进行测试,对比结果,测试完成之后再将数据删去。Spring Boot Test中集成了很多测试工具,常用的注解有@BeforeClass,@AfterClass...原创 2020-01-11 14:52:47 · 311 阅读 · 0 评论 -
总结-17 优化服务器性能
一般来说我们优化服务器的性能会考虑从缓存入手,对于分布式服务器我们采用redis这样的分布式缓存,但是有些数据不用考虑分布式,此时我们可以引入本地缓存,这里我们用性能更好的Caffeine。如图是缓存的一个基本结构,app得到一个请求时,会从本地缓存中查看,如果没有命中,就去DB获得数据同时同步本地缓存。但是对于类似用户Token这样的不区分服务器的数据时,我们就需要使用分布式缓存。总的来说,分...原创 2020-01-09 17:23:21 · 363 阅读 · 0 评论 -
总结-16 将文件上传至云服务器
我们常常有将文件上传云服务器的需求,尤其是对于图片这样的静态资源,这次我们需要实现的就是将用户头像上传至云服务器和将生成的长图也上传至云服务器。对于上传有两种方式,一种是客户端上传,一种是服务器直传。客户端上传对于头像这样的初始文件在用户本地的资源,我们采用的是客户端上传。这里我们使用的是七牛云,这是它对象存储的开发者中心文档。我们首先来实现用户头像上传的功能,可以参考七牛云直传文件的文档...原创 2020-01-07 16:39:51 · 385 阅读 · 0 评论 -
总结-15 生成长图
在我们使用app的时候有很多情况需要分享,比如背单词每日打卡,而分享实际上就是将当前页面截图然后保存下来,这里我们就需要模拟APP来实现Web的生成长图并查看。在这里我们需要用到wkhtmltopdf,这是一个将html页面转换成image或者pdf的工具,具体命令是类似wkhtmltoimage --quality 75 https://www.baidu.com d:/work/data,其...原创 2020-01-04 19:12:03 · 795 阅读 · 0 评论 -
总结-14 热帖排行
我们需要实现首页对帖子进行排序的功能,具体就是计算每个帖子的分数,然后按分数降序排列。因此,我们需要解决的是两个问题,第一个是如何计算帖子分数,第二个是在何时对帖子分数进行计算。首先,计算帖子分数,我们希望发布越新的帖子的分数要更高一点,然后其变化能够平缓一点,不要出现分数骤降的情况。参考了牛客本身的公式,我们采用这样的公式socre=log(精华分数+评论数*10+点赞数*2)+(发布时间...原创 2020-01-03 13:04:31 · 774 阅读 · 1 评论 -
总结-13 Spring线程池和Quartz
对于线程池的相关内容可以查看线程管理和Java异步编程这里主要是对SpringBoot的线程池使用和Quartz使用进行简单的介绍SpringBoot线程池配置我们主要对线程池的核心线程数、最大线程数和工作队列大小进行配置# TaskExecutionProperties# 随着客户端不断提交任务,当前线程池大小也相应增加。在当前线程池大小达到核心线程池大小的时候,# 新来的任务...原创 2019-12-31 21:27:12 · 1883 阅读 · 1 评论 -
总结-12 统计数据,redis高级数据结构
我们网站需要统计UV(独立访客)和DAU(每日活跃用户)。对于UV我们以每个ip的访问作为一次有效访问,同一个ip的多次访问算做一次,而DAU我们以每个用户id为一次有效访问。对于统计,我们使用redis作为我们的数据库,对于UV我们采用HyperLoglog作为数据类型,Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非...原创 2019-12-30 16:35:45 · 452 阅读 · 0 评论 -
总结-11 置顶、加精、删除
对于帖子进行置顶、加精和删除,其实就是对帖子的type和status进行修改,本质上来说就是对帖子数据的修改,但是这里涉及到权限问题,只有版主能对帖子进行置顶和加精,只有管理员能对帖子进行删除。dao在dao层我们只需增加两个两个更新方法,根据id进行修改即可int updateType(int id, int type);int updateStatus(int id,int stat...原创 2019-12-29 17:19:43 · 569 阅读 · 0 评论 -
总结-10 Spring Security
当引入spring security的依赖之后,spring security就会对我们项目的登录和权限进行接管,因此在接入我们系统之前,我们先使用一个demo进行实验。实体很显然,spring security的实体类应该是User类,相较于之前的User类,引入Spring Security之后,我们要让User类实现UserDetails接口,要实现五个方法,分别是账号是否过期,账号是否...原创 2019-12-26 17:17:33 · 339 阅读 · 0 评论 -
总结-9 Elasticsearch之帖子搜索
elasticsearch安装好elasticsearch之后,我们可以通过postman访问9200端口查看一些信息,下面给出一些基本的命令// 查看节点状态localhost:9200/_cat/indices?v// 向test索引中加入id为3的数据,在body中设置json格式数据localhost:9200/test/_doc/3// 删除test索引中id为1的数据lo...原创 2019-12-25 19:42:43 · 861 阅读 · 0 评论 -
总结-8 kafka之系统通知
在这个部分我们要将kafka分布式流媒体平台接入我们的系统,用作系统通知。配置我们在pom中加入相关配置之后只需要在application.properties中配置kafka服务的端口号、group-id和自动提交的配置。# KafkaPropertoesspring.kafka.bootstrap-servers=localhost:9092spring.kafka.consumer...原创 2019-12-15 20:59:50 · 982 阅读 · 0 评论 -
总结-7 优化登录模块
使用Redis存储验证码验证码需要频繁的访问与刷新,对性能要求较高。验证码不需要永久保存,通常在很短时间后就会失效,同时在分布式部署时,存在Session共享的问题。因此原先我们将验证码存在session中的方法需要进行重构。我们可以将验证码存入到redis中,但是这里有一个问题,就是要将验证码和用户对应起来,但是此时用户没有登录,没有id,因此我们可以用一个随机码临时地标记一下这个用户。因此...原创 2019-12-09 22:57:31 · 443 阅读 · 0 评论 -
总结-6 点赞和关注
配置Spring整合Redis我们只需要引入依赖之后配置Redis即可- spring-boot-starter-data-redis而配置Redis我们主要是配置数据库参数和编写配置类,构造RedisTemplate在application.properties中我们只要设置必须的redis库,主机和端口号# RedisProperties# 选择0-15的哪一个库spring....原创 2019-12-09 22:12:31 · 747 阅读 · 0 评论 -
总结-5 私信
私信我们定义的私信字段为id,from_id,to_id,conversation_id(为from_id和to_id的拼接,小的在前面),content为内容,status为状态,以及create_time。在dao层我们主要定义了查询当前用户的会话列表、会话数量、某个会话详情、某个会话消息数量以及新增数量、修改消息状态@Mapperpublic interface MessageMa...原创 2019-12-01 20:36:29 · 713 阅读 · 0 评论 -
总结-4 帖子
过滤敏感词过滤敏感词我们主要通过前缀树进行过滤,首先我们需要将所有敏感词全部加入到前缀树中,每一个结点我们需要定义是否是结束的标志和它之下的子节点private class TrieNode{ // 是否是敏感词结束的标识 private boolean isKeywordEnd = false; // 子节点(key是下级字符,value是下级节点) priv...原创 2019-12-01 19:29:08 · 441 阅读 · 0 评论 -
总结-3 登录
验证码我们使用kaptcha来生成验证码配置首先我们需要配置验证码,使用@Configuration表示这是一个配置Bean,@Bean表示获取其他的bean,装配到容器中,bean的名字就是方法名,这样在Controller中就可以注入kaptchaProducer来使用。Properties主要配置了验证码图片宽度、高度、字体大小、字体颜色和输出范围、输出长度以及实现,然后生成默认的k...原创 2019-11-30 21:19:15 · 540 阅读 · 1 评论 -
总结-2 注册功能
发送邮件配置首先需要在邮箱开启POP3/SMTP服务然后在application.properites中进行相关配置,host和端口号一般固定,QQ邮箱用户名一般为邮箱账号,但是密码不是账号密码,需要在QQ邮箱生成授权码,并把auth设置为true,后两个表示安全的smtp协议和ssl安全连接# MailPropertiesspring.mail.host=smtp.qq.comspr...原创 2019-11-30 16:53:42 · 844 阅读 · 0 评论 -
总结-1 首页内容
功能首页的功能主要是展现帖子,需要做到能分页展示和导航栏根据用户是否登录给出不同的显示Thymeleaf配置spring.thymeleaf.cache=false表示关闭thymeleaf的缓存,开发过程中要关闭,上线之后可以开启头部在标签中使用xmlns申明启用thymeleaf模板引擎<html lang="en" xmlns:th="http://www.thyme...原创 2019-11-30 15:48:27 · 587 阅读 · 0 评论