牛客网项目
文章平均质量分 54
是
Mr_Zhang_Zhen
重庆大学硕士,从事机器学习、深度学习方面的研究
展开
-
8.5常见面试题
mysql默认的引擎是 InnoDB,因其支持 transaction隔离级别经常问:事务1加了意向共享锁,则事务2不能加 意向排他锁间隙锁是当使用范围查询的时候,比如id大于多少、小于多少,一查 查到多条 数据比如 id为101 102 103时,其给不存在 的记录id=104、105…等等加锁...原创 2021-07-31 18:47:59 · 189 阅读 · 0 评论 -
1.23 mybatis入门
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。装服务端:装客户端:12:59右击此处,编辑属性第一次打开是这样一个结构:左侧是管理数据库的,而我们使用的话用这个:右键,select可原创 2021-07-13 11:20:33 · 154 阅读 · 0 评论 -
7.23将文件上传至云服务器
客户端上传例子:用户上传头像;服务器直传在上节课中也讲到过,服务器将自动生成的图片,直接交给云服务器。我们选择 qiniu云服务器,因为免费。官网:注册会比较麻烦,因此我们直接截图吧创建云服务器 08:23新建存储空间,利用域名来访问:现在什么都没有又新建一个存储空间,域名为:在porm中导入qiniu所需的包接下来在 application Properties中做一些配置AK用来标识用户身份,不是谁都可以往空间中传东西;SK用来上传具体内容时为内容加密需要将这两.原创 2021-06-18 16:38:36 · 335 阅读 · 0 评论 -
7.19 生成长图
生成长图 通常在app分享的时候才有,生成长图 手段通常有两种,客户端实现,app当前界面截图,服务端实现, 服务端用html做和app界面一模一样的模板,然后读取模板内容生成长图。因为web项目没有app,本节只探讨在服务端怎么利用html模板生成长图。把模板转换为图片,需要用到wk html topdf工具语法:wkhtmltopdf 模板访问路径 file(pdf存放位置)下载安装后,将此路径 添加到环境变量新建几个目录:导出命令:导出后:接下来导出图片:C:\U原创 2021-06-17 11:01:58 · 4688 阅读 · 1 评论 -
7.27优化网站的性能
优化网站的性能 有一个行之有效的手段,加缓存。加缓存有一定策略、原则;本节将对如何加缓存 有一个系统的了解最后测试一下,优化后性能有无提升。缓存有三种:redis缓存过 user,tocken先查询一级缓存,后查询二级缓存,然后查询数据库,这种方式 避免直接访问数据库诸如登录凭证这些 和用户强关联的信息,若是缓存到 本地缓存,则会出错因为当请求2访问 服务器2时,若是 服务器2 本地缓存中没有登录凭证,则无法访问DB但是诸如热门帖子这些,不是和用户强关联的,可以采用这种方式当访问red原创 2021-06-20 10:51:09 · 243 阅读 · 0 评论 -
8.1单元测试
前面课程 将web开发的相关技术全部讲解完毕,项目功能全部完善本章将对项目进行收尾,收尾体现在两个方面:1.项目上线前后要做什么事情:上线之前如何做单元测试;上线时候如何部署;上线以后如何对项目进行有效监控2.对整个课程进行总结、概况,3.讲解面试题和技巧不仅要在 上线之前做单元测试,在开发过程中,每个功能开发完都要做,单元测试贯穿于整个开发过程中在SpringBootTests类中:@RunWith(SpringRunner.class)@SpringBootTest@ContextC原创 2021-06-21 17:41:03 · 145 阅读 · 0 评论 -
8.2项目监控
项目上线以后,如何对项目进行监控监控的目的是,程序执行时,底层做了很多的事;程序中有多少个bean,bean之间有什么关系,有多少日志,有多少catch,请求路径和bean之间的关系等等因此通过spring boot actuator这个工具来实现这些功能,监控spring 项目spring actuator里面内置了 20多个类型的断点,可以通过手册来查询如果端点从来不用,就不暴露;暴露会影响性能,且容易被别人窃取,所以要按需暴露。搜spring …返回当前服务健康程度:返回一个js原创 2021-06-22 09:27:47 · 223 阅读 · 0 评论 -
8.3项目部署【一般】
本节代码看不清,所以没有细写每段代码,了解大概,今后有需要再回看。项目部署要在云服务器上装哪些东西内存不下于4g,系统不一定是cent OS先安装putty8:43连上服务器接下来开始安装用yum将本地文件传到服务器传入成功33:07 装好mysql37.34装redis装好后启动:访问redis客户端38.52装卡夫卡46.26 配elastic search51.44 配wkhhtmltopdf因为linux是没有GUI界面的,而wkhhtmltopd要生原创 2021-06-22 21:11:48 · 233 阅读 · 1 评论 -
7.16热帖排行
帖子的热度就是分数,不同网站分数记录公式:P是关注数,T是帖子发布到现在的时间间隔,按小时计。G是系数,1.5,1.8…-1,+2这些都是经验值。log的作用是使得前期的评论、赞、收藏 占比更高,而不是后期。分数是和发布时间成反比的。通常启动一个定时任务来算分数(半个小时、一个小时),算完一回,热门的帖子会保持这段时间内的稳定,过段时间会在刷新一遍。先把评论、赞、收藏 产生变化 的帖子丢进缓存redis中,当时间到了,只计算产生变化的帖子的分数。RedisKeyUtilprivate原创 2021-06-16 15:06:50 · 218 阅读 · 0 评论 -
8.4项目总结
该图显示了:项目中绝大多数功能项目中用到的绝大多数技术并对这两个进行了匹配,以方便显示我们用哪些技术解决了哪些问题。我们所有的技术是构建在 spring boot的基础上,因此将其置于最底下。spring boot不是整个技术核心的东西,只是起到辅助的作用,降低其它技术使用的难度。技术核心是 spring,所有技术围绕spring展开重点技术用下划线进行了标记。在 spring 之上,我们用到了其很多模块,比如 spring MVC,解决了前后端交互问题;spring Mybatis.原创 2021-06-23 14:41:29 · 210 阅读 · 0 评论 -
7.13任何执行和调度
每隔一个小时算帖子的分数,每隔半小时清理服务器的临时文件,这些需求都需要用到任务调度组件来解决。任务调度组件是基于多线程的,但凡用多线程,一定会用到线程池,因为创建线程是有开销的,且开销较大。使用线程池来管理线程,能够让线程复用...原创 2021-06-15 10:19:22 · 184 阅读 · 0 评论 -
7.10网站数据统计
需要统计的事项:UV每次访问都要把用户的ip(不管该用户有无登录)存到某个数据结构里,方便进行统计DAU只统计登录的用户(根据用户id),对于那些没有登录的游客不进行统计。1表示访问过,为活跃用户;0表示没有访问过,为不活跃用户;DAU更关注用户用户有效性1.在RedisKeyUtil中private static final String PREFIX_UV = "uv";//统计uv相关数据的前缀private static final String PREFIX_DAU = "dau";原创 2021-06-10 21:57:14 · 289 阅读 · 0 评论 -
7.8 redis高级数据类型
redis高级数据类型有两个独立总数:一个人一天访问一个网站多次,算一个访客(UA),即统计的时候需要去重。占据空间虽小,但是不精确适合统计用户签到,0-1问题比如第一位的01 表示今年第一天到没到。第二位的 01 表示今年第二天到没到。第365位表示第365天到没到。这样是连续的。这两种都适合用于对网站的运营数据进行统计。且统计的时候非常节约内存,效率高。这两种机制 以及适用场景都不一样,本节先处理其语法问题。在RedisTests中演示hyperLogLog // 统计20万个重原创 2021-06-09 23:14:02 · 260 阅读 · 0 评论 -
7.5 置顶、加精、删除
三个功能实现非常相似,可以一并开发完按钮显示中 thymeleaf可以支持security的一些标签一、功能实现:1.数据访问层无论是置顶、删除、加精都要对帖子进行处理,因此先打开DiscussPostMapper接口,增加几个方法。int updateType(int id, int type);int updateStatus(int id, int status);int updateScore(int id, double score);然后打开对应配置文件,增加:<原创 2021-06-09 17:10:29 · 407 阅读 · 0 评论 -
7.3权限控制
将上节课的security技术应用到牛客社区,管理项目中现有权限开发的时候,从以下四个方向入手:CSRF是一种常用的攻击手段。1.要废弃掉拦截器,则在WebMvcConfig中,注释掉:2.授权配置在CommunityConstant常量接口中,新加 /** * 权限: 普通用户 */ String AUTHORITY_USER = "user"; /** * 权限: 管理员 */ String AUTHORITY_ADM原创 2021-06-08 20:14:22 · 267 阅读 · 1 评论 -
7.1 spring security【很多知识点】
我们已经把牛客社区功能全部实现,这一章将对项目进行一些补充完善。完善的内容包括两方面:1.系统的安全性2.进一步提高系统的性能功能强大、方便扩展认证:判断用户有无登录如果没有登录,不可能实现 发布帖子,评论的功能。授权: 认证之后,要判断 该用户有无访问权限,比如给帖子置顶、加精、删除,不是每个用户都能做这些事。只有管理员、博主来可以。servlet就是java EE。要大致了解。spring security 底层的原理,方便之后展开学习spring MVC的核心组件是 disp原创 2021-06-08 09:41:29 · 356 阅读 · 2 评论 -
6.6开发社区搜索功能
业务层:新建ElasticsearchService类package com.nowcoder.community.service;import com.nowcoder.community.dao.elasticsearch.DiscussPostRepository;import com.nowcoder.community.entity.DiscussPost;import org.elasticsearch.action.search.SearchResponse;import org.原创 2021-06-07 14:36:42 · 481 阅读 · 1 评论 -
6.4spring整合elastic search
接下来要修改底层,NettyRuntime类 这个部分(即 设置可用处理器) "availableProcessors is already set to [%d], rejecting [%d]",翻译:availableProcessors 已经被设置好了。会报这个错,因为 redis和elastic search都基于Netty,所以会导致底层有冲突,所以报错。冲突主要体现在es代码上,这个setAvailableProcessors方法是由es调用的,在Netty4Utils类中(..原创 2021-06-04 19:30:23 · 498 阅读 · 1 评论 -
6.1elastic search入门
下载6.4.3配置:表示数据存到哪里:装好es以后,还要装中文的分词插件因为es默认支持英文分词,但不支持中文分词比如 互联网校招 会变成:互联网;校招两个词都是一个个字典打开以后可以看到:那如何更新新词呢?停止词:https://www.getpostman.com能够模拟外部客户端,网页以发送http请求,提交给es服务器,实现往es中存数据。总结,安装了以下1.elasticsearch服务器2.分词插件3.模拟web开发的工具(不是必须)演示:.原创 2021-06-03 18:51:51 · 256 阅读 · 0 评论 -
5.13显示系统通知
先编辑数据访问层dao在messagemapper中添加:// 查询某个主题下最新的通知Message selectLatestNotice(int userId, String topic);// 查询某个主题所包含的通知数量int selectNoticeCount(int userId, String topic);// 查询未读的通知的数量int selectNoticeUnreadCount(int userId, String topic);打开MessageMap.原创 2021-06-01 17:11:07 · 211 阅读 · 0 评论 -
5.11发送系统通知
定义对象,封装事件发生时候的一切信息。1.在entity下新建 event事件,以封装事件对象package com.nowcoder.community.entity;import java.util.HashMap;import java.util.Map;public class Event { private String topic;//事件类型 private int userId;//事件触发的人 private int entityType;//记录实原创 2021-05-31 22:25:07 · 184 阅读 · 0 评论 -
5.9spring整合卡夫卡
配置卡夫卡,在 application.Properties中# KafkaPropertiesspring.kafka.bootstrap-servers=localhost:9092spring.kafka.consumer.group-id=community-consumer-group#是否自动提交消费者的偏移量spring.kafka.consumer.enable-auto-commit=true#自动提交的频率spring.kafka.consumer.auto-commit.原创 2021-05-30 18:08:38 · 239 阅读 · 0 评论 -
5.5卡夫卡入门
进入官网后,进行配置server表示 卡夫卡临时产生的数据存放路径表示日志存放位置配置好以后,在\bin\windows目录下原创 2021-05-30 17:31:01 · 252 阅读 · 0 评论 -
5.1阻塞队列
消息量很大,所以要TB数量级接下来通过一个实例进一步说明:在test包下新建BlockingQueueTestspackage com.nowcoder.community;import java.util.Random;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;public class BlockingQueueTests { public.原创 2021-05-26 21:51:46 · 90 阅读 · 0 评论 -
4.23使用redis来优化登录模块
主要优化以下三个方面:一、redis存储验证码1.打开RedisKeyUtilprivate static final String PREFIX_KAPTCHA = "kaptcha";//定义前缀,验证码叫 kaptcha // 获取登录验证码 public static String getKaptchaKey(String owner) {//以字符串临时标识用户,很快会过期 return PREFIX_KAPTCHA + SPLIT + owner;//要识别原创 2021-05-26 21:15:02 · 274 阅读 · 0 评论 -
4.19关注列表、粉丝列表
关注的数字可以点进去,上节课把关注的数据都做了一个保存,所以这节不需要开发dao数据访问层1.在follow-service中添加findFollowees、findFollowers方法// 查询某用户关注的人public List<Map<String, Object>> findFollowees(int userId, int offset, int limit) {//返回的应该是user和时间整合一起的东西。userId即为某用户 String fo原创 2021-05-23 22:50:10 · 362 阅读 · 0 评论 -
4.16关注、取消关注
1.还是开发RedisKeyUtil private static final String PREFIX_FOLLOWEE = "followee";//关注的目标 private static final String PREFIX_FOLLOWER = "follower";//// 某个用户关注的实体// followee:userId:entityType -> zset(entityId,now) zset根据时间排序public static String getFo.原创 2021-05-20 09:16:55 · 381 阅读 · 0 评论 -
4.13我收到的赞
1.在RedisKeyUtil中增加一个keyprivate static final String PREFIX_USER_LIKE = "like:user";增加一个方法:// 某个用户的赞// like:user:userId -> intpublic static String getUserLikeKey(int userId) {return PREFIX_USER_LIKE + SPLIT + userId;}2.在LikeService中// 点赞public.原创 2021-05-19 21:04:15 · 212 阅读 · 0 评论 -
4.10点赞
同时很多人对一条帖子点赞,所以需要考虑性能,因此要将数据存到redis可以对帖子 还有帖子的评论进行点赞本来写数据访问层,但因为数据要存到redis中,所以直接处理 业务层1.先写redis生成key的工具在util下新建RedisKeyUtil类public class RedisKeyUtil { //用来写key的一部分常量 private static final String SPLIT = ":"; //以该常量分割各个单词 private static f原创 2021-05-19 20:00:06 · 158 阅读 · 0 评论 -
html文件标签对应js文件
b标签是赞的状态。i标签是赞的个数对应js文件function like(btn, entityType, entityId, entityUserId) {//btn表示按钮 $.post(//向服务器发送异步请求以处理 CONTEXT_PATH + "/like", {"entityType":entityType,"entityId":entityId,"entityUserId":entityUserId},//写明路径 function.原创 2021-05-18 22:47:49 · 255 阅读 · 0 评论 -
4.7spring整合redis(最后事务不熟)
在porn中配置好 以后,打开application.properties,进行配置配置RedisConfig类package com.nowcoder.community.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.conne..原创 2021-05-18 21:13:16 · 199 阅读 · 1 评论 -
4.1Redis入门
看一下相关命令下载,安装配置 环境变量redis-cliselect 1 切换到第一个库flushdb 刷新库,里面什么都没有了set表示存,带方括号的提示,表明其可以被省略test:count 两个单词用: 连接取 用 getincr 表示加1decr减1存哈希类型的 hset(有三个参数,key,field,value)接下来演示 list存入3个数据查询列表中key 的长度查索引批量查索引从右侧 出一个值rpop集合..原创 2021-05-17 16:54:01 · 126 阅读 · 0 评论 -
3.33统一记录日志
统一记录日志 并不仅仅记录异常能不能利用 控制器通知 来统一处理呢?控制器通知 只能在控制器 发生异常的时候 统一处理。而统一记录日志 不发生异常,也需要记录能否利用拦截器呢?拦截器是针对控制器的处理。而记日志未必是针对控制器 来的可否利用 上节课所讲 控制器通知处理,控制器通知仅仅是在控制器发生异常时可以统一处理可否利用 拦截器 拦截所有请求,但是 拦截器仅仅是针对控制器处理的,我们记录日志未必是对 控制器的也可能是针对业务组件。也可能是数据访问层。统一记录日志 可以对所有模块的原创 2021-05-17 09:57:52 · 198 阅读 · 0 评论 -
3.27发送私信以及设置已读功能
发送私信 是在 消息 页面然后用 异步请求 发给服务器,服务器根据给 发送 成功or失败的提示。当然也可以 给某人私信:要自动带上 当前目标的名字1.发送私信功能1.1在数据访问层dao中MessageMapper接口补充方法// 新增消息int insertMessage(Message message);// 修改消息的状态(设置已读功能 需要用到)int updateStatus(List<Integer> ids, int status);然后在M.原创 2021-05-16 21:26:47 · 799 阅读 · 0 评论 -
3.31统一处理异常
之前讲过,服务端分为 表现层、业务层、数据层浏览器发送的请求 一律发给 表现层,表现层调用业务层,业务层调用数据层。数据层出问题,会抛出到上一层 业务层,业务层在往上抛给表现层。所以三个层的异常最终都会 汇集到表现层。因此,只要我们对 表现层 统一捕获异常,就能实现统一处理异常。sping和spring boot都提供了 现成的方案来 对 表现层 统一捕获异常将两个错误页面404和500 都放在error文件夹下,均置于templates下没有 该路径因为没有对404.html进行配置原创 2021-05-16 19:57:19 · 167 阅读 · 0 评论 -
面向切面编程
在面向切面编程的思想里面,把功能分为核心业务功能,周边功能所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务所谓的周边功能,比如性能统计,日志,事务管理等等周边功能在Spring的面向切面编程AOP思想里,即被定义为切面在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP...原创 2021-05-16 17:07:45 · 176 阅读 · 0 评论 -
3.24私信列表
会话:和某一朋友的通信状态:已读、未读、删除设置会话id:就是from id和to id按照大小合起来的1.私信列表,如下:先给表写实体类Message(entity目录下):package com.nowcoder.community.entity;import java.util.Date;public class Message { private int id; private int fromId; private int toId; pr原创 2021-05-11 10:38:02 · 568 阅读 · 0 评论 -
【精】3.22添加评论
1.1对于数据层 增加评论数量在CommentMapper下,新增 int insertComment(Comment comment);//返回行数然后在CommentMapper中,补充<sql id="insertFields"> user_id, entity_type, entity_id, target_id, content, status, create_time</sql><insert id="insertComment" par.原创 2021-05-09 22:34:38 · 314 阅读 · 0 评论 -
3.20显示评论
上节课讲了事务管理,本节对其进行应用。首先对数据库内的属性进行介绍我们发布评论,可以对帖子(entity_type为1),也可以针对帖子内部的评论(entity_type为2),所以评论的目标是有变化的。entity_id是指这个类型,是哪个具体的目标要用一套业务解决所有评论的问题。评论是有指向性的,用target_id记录回复指向的人。在entity下新建实体类 Commentpackage com.nowcoder.community.entity;import java.uti原创 2021-05-09 20:18:43 · 215 阅读 · 0 评论 -
3.13 事务管理
添加评论 要用到事务管理方面内容接下来详解 第一类丢失更新面试的时候,这几种异常都要讲清楚。在AlphaService实现:@Autowiredprivate UserMapper userMapper;//注入用户@Autowiredprivate DiscussPostMapper discussPostMapper;//注入帖子可以看到 Propagation 一共有七个值// REQUIRED: 支持当前事务(外部事务),如果不存在则创建新事务.//原创 2021-05-09 10:20:22 · 109 阅读 · 0 评论