- 博客(72)
- 问答 (1)
- 收藏
- 关注
原创 牛客网后端项目实战(四十五):项目监控
Spring Boot ActuatorEndpoints:监控应用的入口,Spring Boot内置了很多端点,也支持自定义端点。监控方式:HTTP 或 JMX。访问路径:例如“/actuator/health”(是使用http访问 端点,所用的路径,health是访问端点的id)注意事项:按需配置暴露的端点,并对所有的端点进行权限控制。(暴露端点会影响性能,而且会有被别人窃取的风险。所以按需配置就行。不进行权限控制的话,别人通过访问端点就可以直接访问底层信息,很危险)为什么要对项目进行监.
2021-06-10 20:06:43
555
原创 牛客网后端项目实战(四十四):优化网站性能
优化网站性能本地缓存将数据缓存在应用服务器上,性能最好要考虑缓存大小,缓存过期时间常用缓存工具:Ehcache、Guava、Caffeine等分布式缓存将数据缓存在NoSQL数据库上,跨服务器。常用缓存工具:MemCache、Redis等。多级缓存> 一级缓存(本地缓存)> 二级缓存(分布式缓存)> DB避免缓存雪崩(缓存失效,大量请求直达DB),提高系统的可用性本地缓存适合与用户无强关联的信息,Redis可以缓存与用户强关联的信息(如 登
2021-06-09 16:29:54
814
原创 牛客网后端项目实战(四十三):将文件上传至云服务器
将文件上传至云服务器使用七牛云,对象存储服务。用户上传头像1、导包2、自定义配置配置七牛云的两个密钥,以及七牛云存储空间的名字和域名# qiniuqiniu.key.access=6RA-Uus95ZT_1znMrCMD8BpqfjT-K7OKmQTfKB48qiniu.key.secret=kPNnLFz2_tzztKUVpSLm0lYngtuHWyIq5LzTmLILqiniu.bucket.header.name=community_headerquniu.bucket.head
2021-06-08 23:14:56
693
原创 牛客网后端项目实战(四十三):生成长图
生成长图wkhtmltopdf(命令访问)wkhtmltopdf url filewkhtmltoimage url filejava(java语言访问)Runtime.getRuntime().exec()1、安装wkhtmltopdf,添加环境变量2、html转pdf文件命令:wkhtmltopdf url filehtml转图片:wkhtmltoimage url filehtml转图片并压缩:wkhtmltoimage --quality 75 url file
2021-06-08 16:37:00
757
1
原创 牛客网后端项目实战(四十三):热帖排行
文章目录热帖排行将需要计算分数的帖子放入Redis使用Quartz实现定时任务首页界面处理1、帖子分数与时间有关,而且点赞,收藏等操作是非常高频的,一般是通过定时任务计算帖子分数(分布式定时任务 Spring Quartz)2、把分数变化的帖子放进缓存里,定时时间到对缓存里的帖子进行计算即可(Redis)热帖排行将需要计算分数的帖子放入Redis1、生成RedisKey2、影响帖子分数操作发生时,将帖子放入RedisRedisKeyUtil.java // 帖子分数 publ
2021-06-07 11:09:35
1189
2
原创 牛客网后端项目实战(二十四):统一记录日志
https://blog.csdn.net/weixin_42700635/article/details/106629583统一记录日志,可能会想到封装一个记日志的组件,在每个业务中调用,但是这样实现不利于维护,这里就需要AOP技术。Spring AOP语法package com.nowcoder.community.aspect;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;
2021-06-02 17:05:58
223
原创 牛客网后端项目实战(四十一):网站统计数据
文章目录RediskeyServiceUV(Unique Visitor)DAU(Dail Active User)Controller拦截器模板UV(Unique Visitor)独立访客,需通过用户IP排重统计数据每次访问都要进行统计HyperLogLog,性能好,且存储空间小DAU(Dail Active User)日活跃用户,需通过用户ID排重统计数据访问过一次,则认为其为活跃(定义可以不同)Bitmap,性能好、且可以统计精确的结果RediskeyRedisKe
2021-06-02 15:17:36
693
1
原创 牛客网后端项目实战(四十):Redis高级数据类型介绍
HyperLogLog采用一种基数算法,用于完成独立总数的统计占据空间小,无论统计多少个数据,只占12k的内存空间使用不精确的统计算法,标准误差为0.81%。Bitmap不是一种独立的数据结构,实际上就是字符串。支持按位存取数据,可以将其看成是byte数组。适合存储大量的连续的数据的布尔值简单语法介绍HyperLogLog1、统计20万个重复数据的独立总数. // 统计20万个重复数据的独立总数. @Test public void testHyp.
2021-06-01 17:14:11
490
原创 牛客网后端项目实战(三十九):置顶、加精、删除
https://github.com/thymeleaf/thymeleaf-extras-springsecurity功能实现点击 置顶,修改帖子的类型。点击 “加精”、“删除”,修改帖子的状态。权限管理版主可以执行“置顶”、“加精” 操作。管理员可以执行“删除”操作。按钮显示版主可以看到“置顶”、“加精” 按钮。管理员可以看到“删除” 按钮。一、功能实现DAO层DiscussPostMapper接口中添加以下两个方法:置顶操作:即把帖子的 type 字段改
2021-05-31 21:43:11
963
原创 牛客网后端项目实战(三十七):权限控制
登录检查之前采用拦截器实现了登录检查,这是简单的权限管理方案,现在将其废弃授权配置对当前系统内包含的所有的请求,分配访问权限(普通用户、版主、管理员)认证方式绕过Security认证流程,采用原来的认证方案CSRF配置防止CSRF攻击的基本原理,以及表单、AJAX相关的配置1.导包 <dependency> <groupId>org.springframework.boot</groupId> <artif.
2021-05-30 20:32:50
619
原创 牛客网后端项目实战(三十八):Spring Security介绍
Spring Security简单使用实体类public class User implements UserDetails { private int id; private String username; private String password; private String salt; private String email; private int type; private int status; private .
2021-05-30 16:10:37
394
原创 牛客网后端项目实战(十一):开发登录、退出功能
文章目录实体DAOSeviceController前端参考:https://blog.csdn.net/weixin_42700635/article/details/105157089实体public class LoginTicket { private int id; private int userId; private String ticket; private int status; private Date expired; ...
2021-05-28 22:58:05
387
原创 牛客网后端项目实战(三十六):开发社区搜索功能
搜索服务将帖子保存至Elasticsearch服务器。从Elasticsearch服务器删除帖子。从Elasticsearch服务器搜索帖子。发布事件发布帖子时,将帖子异步的提交到Elasticsearch服务器。增加评论时,将帖子异步的提交到Elasticsearch服务器。在消费组件中增加一个方法,消费帖子发布事件。显示结果在控制器中处理搜索请求,在HTML上显示搜索结果。业务层@Servicepublic class ElasticsearchServic.
2021-05-12 14:37:56
711
1
原创 牛客网后端项目实战(三十五):Spring整合Elasticsearch
Spring整合Elasticsearch引入依赖spring-boot-starter-data-elasticsearch配置Elasticsearchcluster-name、cluster-nodesSpring Data ElasticsearchElasticsearchTemplateElasticsearchRepository引入依赖1、pom.xml <dependency> <groupId>org.spring
2021-05-10 20:05:00
1013
3
原创 牛客网后端项目实战(三十四):显示系统通知
文章目录通知列表DAO层业务层视图层前端通知详情DAO层业务层视图层前端拦截器通知列表显示评论、点赞、关注三种类型的通知通知详情分页显示某一类主题所包含的通知未读消息在页面头部显示所有的未读消息数量通知列表显示评论、点赞、关注三种类型的通知。只显示最新的一条消息,还要显示未读数量,点击通知后可以跳转到详情页DAO层MessageMapper // 查询某个主题下最新的通知 Message selectLatestNotice(int userId,
2021-05-07 15:30:20
610
原创 牛客网后端项目实战(三十三):发送系统通知
• 触发事件评论后,发布通知点赞后,发布通知关注后,发布通知• 处理事件封装事件对象开发事件的生产者开发事件的消费者发送系统通知评论,点赞、关注等系统通知是 并发、异步的。可以将其抽象为event时间(Entity类转化为event类,然后让Kafka处理)定义Event实体package com.nowcoder.community.entity;import java.util.HashMap;import java.util.Map;public class
2021-05-02 17:19:31
579
2
原创 牛客网后端项目实战(三十二):Kafka入门+Spring整合
Kafka简介Kafka是一个分布式的流媒体平台。应用:消息系统、日志收集、用户行为追踪、流式处理。Kafka特点 - 高吞吐量、消息持久化、高可靠性、高扩展性。Kafka术语Broker、ZookeeperTopic、Partition、OffsetLeader Replica 、Follower ReplicaKafka入门资料1: https://github.com/frank-lam/fullstack-tutorial/blob/master/notes/Mic.
2021-05-02 17:19:24
471
原创 牛客网后端项目实战(三十一):消息队列
BlockingQueue解决线程通信的问题。阻塞方法:put、take。生产者消费者模式生产者:产生数据的线程。消费者:使用数据的线程。实现类ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue、SynchronousQueue、DelayQueue等。文章目录消息队列简述(待补充)示例消息队列简述(待补充)消息队列是线程间通信的方式之一。主要由生产者线程和消费者线程构成。BlockingQu.
2021-05-02 17:19:13
366
原创 牛客网后端项目实战(三十): 优化登录模块
1、使用Redis存储验证码验证码需要频繁的访问与刷新,对性能要求较高。验证码不需永久保存,通常在很短的时间后就会失效。分布式部署时,存在Session共享的问题。2、使用Redis存储登录凭证处理每次请求时,都要查询用户的登录凭证,访问的频率非常高。3、使用Redis缓存用户信息处理每次请求时,都要根据凭证查询用户信息,访问的频率非常高。缓存使用Redis存储验证码LoginController写生成验证码并将验证码存入session里,但是会存在性能问题:验证码需要频
2021-04-30 14:47:08
424
原创 牛客网后端项目实战(二十九):关注列表、粉丝列表
业务层查询某个用户关注的人,支持分页。查询某个用户的粉丝,支持分页。表现层处理“查询关注的人”、“查询粉丝”请求。编写“查询关注的人”、“查询粉丝”模板。查询某个用户关注的人,支持分页业务层 // 查询某用户关注的人 public List<Map<String, Object>> findFollowees(int userId, int offset, int limit) { String followeeKey =.
2021-04-29 15:52:30
596
原创 牛客网后端项目实战(二十九):关注、取消关注
• 需求开发关注、取消关注功能。统计用户的关注数、粉丝数。• 关键若A关注了B,则A是B的Follower(粉丝),B是A的Followee(目标)。关注的目标可以是用户、帖子、题目等,在实现时将这些目标抽象为实体。关注、取消关注功能Redis键需求有两个,一个是功能开发,一个是要记录某用户的关注数/粉丝数。因此使用两个Key,followee表示“我”关注的实体, follower 表示某实体的粉丝// Redis Key 工具不用交给容器管理public class Redi
2021-04-28 22:09:42
936
原创 牛客网后端项目实战(二十八):收到的赞
文章目录收到的赞(重构点赞功能)Servece层Controller层前端• 重构点赞功能以用户为key,记录点赞数量increment(key),decrement(key)• 开发个人主页以用户为key,查询点赞数量收到的赞(重构点赞功能)Servece层1、增加一个Key,根据用户 userId 记录点赞数量。为了避免去数据库查用户收到的赞// Redis Key 工具不用交给容器管理public class RedisKeyUtil { private sta
2021-04-27 17:07:47
473
原创 牛客网后端项目实战(二十七):点赞
点赞要考虑性能由于数据存放在Redis里,DAO层比较简单package com.nowcoder.community.util;// Redis Key 工具不用交给容器管理public class RedisKeyUtil { private static final String SPLIT = ":"; private static final String PREFIX_ENTITY_LIKE = "like:entity"; // 帖子和评论统称为实体 //
2021-04-20 13:33:54
874
原创 牛客网后端项目实战(二十六):Redis入门+Spring整合Redis
Redis资料Redis入门Spring整合Redishttps://github.com/frank-lam/fullstack-tutorial/blob/master/notes/Redis.mdSpring使用Redis引入依赖spring-boot-starter-data-redis配置Redis配置数据库参数编写配置类,构造RedisTemplate访问RedisredisTemplate.opsForValue()redisTemplate.opsFo
2021-04-19 13:41:10
362
原创 牛客网后端项目实战(二十三):统一处理异常
文章目录一、自定义错误页面注解处理异常SpringBoot处理异常的5种方式@ControllerAdvice用于修饰类,表示该类是Controller的全局配置类。在此类中,可以对Controller进行如下三种全局配置: 异常处理方案、绑定数据方案、绑定参数方案。@ExceptionHandler用于修饰方法,该方法会在Controller出现异常后被调用,用于处理捕获到的异常。@ModelAttribute用于修饰方法,该方法会在Controller方法执行前被调用,用
2021-04-18 16:16:33
232
原创 牛客网后端项目实战(二十二):发送私信
发送私信采用异步的方式发送私信。发送成功后刷新私信列表。设置已读访问私信详情时, 将显示的私信设置为已读状态。
2021-04-17 16:25:45
613
转载 牛客网后端项目实战(二十一):私信列表
私信列表查询当前用户的会话列表, 每个会话只显示一条最新的私信。支持分页显示。私信详情查询某个会话所包含的私信。支持分页显示。效果图数据库首先看一下数据库的设计,私信相当于一个对话功能,那么两个人就组成一个对话,这段对话里有A发给B的消息,有B发给A的消息,那么我们把发送者和接收者的id拼接到一起形成一个会话id,把id小的拼接在前面。还有一种私信是系统通知,那么只需要把from_id指定一个固定的值,这里指定为1。实体类新建Message实体类,对应数据库字段。p.
2021-04-16 17:12:08
438
转载 牛客网后端项目实战(二十):添加评论
数据层增加评论数据。修改帖子的评论数量。业务层处理添加评论的业务: 先增加评论、再更新帖子的评论数量。表现层处理添加评论数据的请求。设置添加评论的表单。添加评论添加评论的功能也是比较基础的,按照数据层业务层和表现层进行开发,比较特别的就是会用到前面提到的事务管理。为了效率,在帖子的字段里设计了一个评论数量,那么我们添加评论的时候就要同时更新评论数量。数据层在CommentMapper里添加插入评论的方法;在DiscussPostMapper里添加更新帖子评论数量.
2021-04-14 12:57:41
298
转载 牛客网后端项目实战(十九):显示评论
数据层根据实体查询一页评论数据。根据实体查询评论的数量。业务层处理查询评论的业务。 处理查询评论数量的业务。表现层显示帖子详情数据时, 同时显示该帖子所有的评论数据。显示评论这个功能是一个比较常规的功能,按照常规流程,数据层,业务层和表现层进行开发。效果图(待更改)数据库数据库的解释:user_id对应的是发评论的用户,entity_type是指评论的类型,目前我们打算开发论坛部分,那么就有两种类型,对帖子的评论和对评论的评论,为了方便区分,对评论的评论我们成.
2021-04-13 20:24:37
338
原创 牛客网后端项目实战(十七):显示帖子
文章目录显示帖子详情mapperServiceController前端index.htmldiscuss-detail.htmlDAO层,业务层,视图层DiscussPostMapperDiscussPostServiceDiscussPostController前端index.html在帖子标题上增加访问详情页面的链接discuss-detail.html处理静态资源的访问路径复用index.html的header区域显示标题、作者、发布时间、帖子正文等内容显示帖子
2021-04-12 14:18:26
443
转载 牛客网后端项目实战(十六):发布帖子(使用jQuery发送AJAX请求)
AJAXAsynchronous JavaScript and XML异步的JavaScript与XML,不是一门新技术,只是一个新的术语。使用AJAX,网页能够将增量更新呈现在页面上,而不需要刷新整个页面。虽然X代表XML,但目前JSON的使用比XML更加普遍。https://developer.mozilla.org/zh-CN/docs/Web/Guide/AJAX示例使用jQuery发送AJAX请求。本文采用AJAX请求,实现发布帖子的功能。Ajax示例封装Jso.
2021-04-12 09:55:30
406
转载 牛客网后端项目实战(十四):检查登录状态
使用拦截器在方法前标注自定义注解拦截所有请求,只处理带有该注解的方法自定义注解常用的元注解:@Target、@Retention、@Document、@Inherited如何读取注解:Method.getDeclaredAnnotations ()Method.getAnnotation (Class annotationClass)检查登录状态登录和未登录的权限显然是不一致的,例如登录后可以进行账号的设置,而目前即便没有登录依旧可以通过直接输入网址的方式进入设置页面..
2021-04-09 16:24:18
198
转载 牛客网后端项目实战(十三):账号设置之上传文件
上传文件请求:必须是POST请求表单:enctype=“multipart/form-data”Spring MVC:通过 MultipartFile 处理上传文件开发步骤上传头像获取头像上传文件/头像配置文件存储路径首先上传头像得有一个存储头像的路径,这个路径不能是固定的,因为在本地开发和部署到服务器肯定不一样,目前存到本地,后期也会存到云服务器上。在application.properties里配上头像上传路径。community.path.domain=http://loc
2021-04-08 16:46:56
326
转载 牛客网后端项目实战(十二):显示登录信息
拦截器示例当用户登录过后,之后的请求都应该以登录态去访问,也就是每次带上ticket,例如网站首页,登录和未登录的显示应该不同,如果我们按照正常逻辑,每个请求都得判断登录态,处理相关逻辑。而使用拦截器,则可以拦截浏览器的请求,再对齐进行统一的处理。定义拦截器首先再controller包下新建一个Interceptor包,在包下新建一个AlphaInterceptor做演示。首先实现HandlerInterceptor接口,我们可以ctrl加鼠标左键查看HandlerInterceptor类。可以看到
2021-04-08 16:21:55
239
转载 牛客网社区项目——2.6开发登录退出功能
文章目录登录entityDAO层Service(业务层)controller(视图层)退出登录entity首先我们看一看数据库login_ticket表,id主键,user_id,ticket也就是登录口令,还有status状态,0有效1无效,expired失效日期。根据数据库写实体类,并生成get/set方法。 private int id; private int userId; private String ticket; private int status;
2021-04-07 15:51:32
304
转载 牛客网开发项目——2.5如何生成验证码
牛客网后端项目实战(十):生成验证码 导入jar包编写kaptcha配置类生成随机字符,图片 https://code.google.com/archive/p/kaptcha 导入jar包 首先,还是老方法,在mvnrepository网站搜索kaptcha,添加到pom等待idea自动下载。 <dependency> <groupId>com.github.penggle</groupId> <artifactId>.
2021-04-07 11:02:51
379
原创 【MySQL核心】(二)MySQL的安装与使用
DBMS分为两类:基于共享文件系统的DBMS (Access )基于客户机——服务器的DBMS(MySQL、Oracle、SqlServer)1. 启动和停止MySQL服务命令行要使用管理员权限打开2. 连接和退出MySQL服务打开命令行输入:MySQL语法规范不区分大小写(一般建议 表、关键字大写,其余小写)每句话用;或\g结尾各子句一般分行写关键字不能缩写也不能分行用缩进提高语句的可读性单行注释:# --(加空格) 多行注释 \* * \...
2020-11-09 20:06:41
54
原创 【MySQL核心】(一)数据库概述
数据库概述1. 数据库的概念DB 数据库(database):存储数据的“仓库”。它保存了一系列有组织的数据。DBMS 数据库管理系统(Database Management System)。数据库是通过DBMS创建和操作的容器SQL 结构化查询语言(Structure Query Language):专门用来与数据库通信的语言。2. 数据库特点1、将数据放到表中,表再放到库中2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。3、表具有一些特性,这些特性定义
2020-11-07 17:07:04
377
原创 【计算机网络】(三) 传输层
文章目录传输层概述多路复用和多路分用UDP传输层概述多路复用和多路分用什么是多路复用/分用?为什么进行多路复用/分用?How?UDP什么是UDP?UDP段格式UDP校验和
2020-10-27 16:12:24
111
空空如也
在canaconda 里安装onpencv库 出现问题?
2018-12-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人