仿牛客社区项目
文章平均质量分 55
Doreen_FF
这个作者很懒,什么都没留下…
展开
-
2.2仿牛客社区项目——注册(md5加盐加密密码,发送激活路径到邮箱,激活路径由UserId和激活码组成)
访问注册功能访问注册页面LoginController.javaregister.html提交注册数据原创 2021-06-08 11:19:28 · 878 阅读 · 0 评论 -
仿牛客社区项目7.1——Spring Security使用示例
Spring Security:认证+授权认证:判断是否登录,账户是否存在,密码是否正确;授权 :管理员和普通用户访问不同路径的权限不同。加以配置。Spring Security作用在SpringMVC之前,多个Filter,作用也类似于SpringMVC的拦截器。如:Filter1检查验证码,Filter2检查账户密码。实体类User:方便做授权,type = 0 普通用户,type = 1 管理员 实现UserDetails接口,需要实现几个方法。public class User im.原创 2021-07-25 23:36:02 · 867 阅读 · 0 评论 -
仿牛客社区项目5.3——显示系统通知(Kafka, 评论、点赞、关注后)
1、MessageMapper // 查询某个主题下最新的通知 Message selectLatestNotice(int userId, String topic); // 查询某个主题所包含的通知数量 int selectNoticeCount(int userId, String topic); // 查询未读的通知的数量 int selectNoticeUnreadCount(int userId, String topic); //.原创 2021-07-25 11:28:16 · 983 阅读 · 0 评论 -
仿牛客社区项目5.2——发送系统通知(Kafka, 评论、点赞、关注后)
1、entity包下,封装时间对象:Eventpublic class Event { private String topic; private int userId; private int entityType; private int entityId; private int entityUserId; private Map<String, Object> data = new HashMap<>(); pub.原创 2021-07-24 17:26:28 · 1145 阅读 · 0 评论 -
仿牛客项目启动命令
redisredis-server.exe redis.windows.confredis-cli.exeshutdown exitzookeeper、kafkabin\windows\zookeeper-server-start.bat config\zookeeper.propertiesbin\windows\kafka-server-start.bat config\server.properties原创 2021-07-24 17:25:37 · 285 阅读 · 1 评论 -
仿牛客社区项目6.1——ElasticSearch入门
启动ElasticSearch,双击elasticsearch.bat(注意把jdk安装到没有空格的路径中,否则无法启动ElasticSearch,会闪退)1、命令行:C:\WINDOWS\system32>curl -X GET "localhost:9200/_cat/health?v" 检查健康状况curl -X GET "localhost:9200/_cat/nodes?v" 查看节点curl -X GET "localhost:9200/_cat/indices?v" 查看原创 2021-07-21 16:26:31 · 678 阅读 · 0 评论 -
仿牛客社区项目5.1——阻塞队列、Kafka入门、Springboot整合Kafka
启动zookeeper、kafka服务:D:\Environment\kafka_2.12-2.2.0>bin\windows\zookeeper-server-start.bat config\zookeeper.propertiesD:\Environment\kafka_2.12-2.2.0>bin\windows\kafka-server-start.bat config\server.properties生产者:创建主题:D:\Environment\kafka_2.1..原创 2021-07-20 17:33:16 · 628 阅读 · 0 评论 -
4.7仿牛客社区项目——Redis优化登录模块(存验证码、登录凭证、缓存用户信息)
1、Redis存储验证码原来是用session存验证码,现在用Redis存。首先服务器生成验证码:给某客户端生成一个随机字符串,存在客户端的cookie里。将随机字符串当作redis的key,value存生成的字符串。且redis存储的时间仅60s下次客户端输入了验证码,传给服务端:服务端取出cookie,即可到redis的key,根据key找到验证码,然后验证客户端输入的验证码code和redis里存的验证码是否一致,若一致则登录成功。key存代表各客户端的随机字符串(在客户端coo.原创 2021-06-27 17:13:41 · 1021 阅读 · 0 评论 -
仿牛客社区项目4.6——关注列表、粉丝列表
1、FollowService // 查询某用户关注的人 public List<Map<String, Object>> findFollowees(int userId, int offset, int limit) { String followeeKey = RedisKeyUtil.getFolloweeKey(userId, ENTITY_TYPE_USER); Set<Integer> targetIds =.原创 2021-06-27 14:38:40 · 298 阅读 · 0 评论 -
仿牛客社区项目4.5——Redis实现关注、取消关注(zset)
注意key、value的含义。value的数据类型是zset,有序集合,按照关注的时间排序。followee:userId:entityType -> zset(entityId,now) 某个用户关注的实体(实体包括帖子、评论、用户),按照实体分别存follower:entityType:entityId -> zset(userId,now) 某个实体拥有的粉丝(实体包括帖子、评论、用户)这个功能是异步请求。1、RedisKeyUtil还是先拼key的string...原创 2021-06-27 11:08:37 · 962 阅读 · 2 评论 -
仿牛客社区项目4.4——Redis个人用户获得的总赞数(事务、set、string)
重点:LikeService,Redis编程式事务1、改key拼接工具类RedisKeyUtil private static final String PREFIX_USER_LIKE = "like:user"; // 某个用户的被点赞总数, value是Object->强转成Integer->intValue()转成int型 // like:user:userId -> int public static String getUserLikeKey(in.原创 2021-06-26 18:17:04 · 403 阅读 · 0 评论 -
仿牛客社区项目4.3——Redis实现点赞(set)
不用写数据访问层,直接在service层写即可。1、创建RedisKeyUtil工具类生成key:public class RedisKeyUtil { private static final String SPLIT = ":"; private static final String PREFIX_ENTITY_LIKE = "like:entity"; // 某个实体的赞 // like:entity:entityType:entityId -> set.原创 2021-06-26 16:22:08 · 894 阅读 · 0 评论 -
仿牛客社区项目4.1,4.2——Redis入门、Spring整合Redis
常用命令:登录客户端``选择库(16个 index为0-15)select 1清空当前数据库所有的key flushdbredis-cli //登录客户端select 1 //选择库(16个 index为0-15)flushdb //清空当前数据库所有的keykeys * //查看所有的keytype test:user //查看值的类型exists test:user //查看是否有keydel test:user //删keyexpire test:students 10 //1.原创 2021-06-25 12:12:39 · 510 阅读 · 0 评论 -
仿牛客社区项目3.10——统一记录日志(AOP)
1、AOP上一节中统一处理Controller的异常,是通过控制器通知,当控制器异常时,统一处理。但是想记录日志,不一定有异常。而拦截器也是针对控制器的。没有对业务组件、数据访问层统一处理。想对业务层统一记录日志,而统一记录日志是系统功能,不要和业务功能混在一起实现。否则在想对记录日志的位置进行改变时,将会非常麻烦,因为业务bean有很多个,不好一个一个改。由此引入了AOP的方式,即面向切面编程,切面是一个一个组件。业务Bean是一个一个target。我们要先声明切点的位置,再通知要做什么事。只需要对原创 2021-06-24 20:23:36 · 732 阅读 · 0 评论 -
仿牛客社区项目3.9——统一处理异常(控制器通知@ControllerAdvice全局配置类、@ExceptionHandler统一处理异常)
SpringBoot设计,如果出现错误404或500,自动调用特定路径下的html页面(路径和名字都特定)。/templates/error/404.html、/templates/error/500.html。程序中有错误自动就调用该页面。但是错误有异步请求错误,也想同时记录日志。则使用统一处理的方式,即全局配置。使用HomeController,加获取错误页面的请求,手动重定向路径。 @RequestMapping(path = "/error", method = RequestMe..原创 2021-06-23 22:09:08 · 379 阅读 · 0 评论 -
仿牛客社区项目3.8——新增消息(异步请求)、变未读状态为已读
新增消息、改变已读未读状态1、数据访问层MessageMapper // 新增一个消息 int insertMessage(Message message); // 修改消息的状态 int updateStatus(List<Integer> ids, int status);xml<!-- // 新增一个消息--><!-- int insertMessage(Message message);--> &l原创 2021-06-22 18:16:01 · 363 阅读 · 0 评论 -
仿牛客社区项目3.7——私信列表、详情、分页(普通功能)
1、创建Message实体类public class Message { private int id; private int fromId; private int toId; private String conversationId; private String content; private int status; private Date createTime; public int getId() { r.原创 2021-06-22 17:07:46 · 729 阅读 · 0 评论 -
仿牛客社区项目3.6——增加评论,同时更新评论数【事务】
1、数据访问层CommentMapperint insertComment(Comment comment); <insert id="insertComment" parameterType="Comment"> insert into comment(<include refid="insertFields"></include>) values(#{userId},#{entityType},#{entityId},#.原创 2021-06-22 00:13:24 · 478 阅读 · 0 评论 -
仿牛客社区项目3.5——显示评论(普通功能,Controller层帖子-评论-回复)
1、实体类:Commentpublic class Comment { private int id; private int userId; private int entityType; private int entityId; private int targetId; private String content; private int status; private Date createTime; public .原创 2021-06-21 22:06:11 · 579 阅读 · 0 评论 -
仿牛客社区项目3.3——帖子详情(普通功能)
根据帖子的主键id查询贴子的详情内容。DiscussPostMapper接口DiscussPost selectDiscussPostById(int id);discusspost-mapper.xml<select id="selectDiscussPostById" resultType="DiscussPost"> select <include refid="selectFields"></include> from discuss_.原创 2021-06-18 17:01:28 · 411 阅读 · 0 评论 -
仿牛客社区项目3.2——发布帖子(异步通信技术AJAX)
异步请求:增量更新在页面上,不用刷新整个页面。通过jQuery写,三个参数:访问路径,发送的JSONString字符串,回调函数(参数是服务器返回值)一、用jQuery发送AJAX请求的示例1、取业务数据的JSON字符串先引入Fastjson jar包CommunityUtils下,getJSONStringpublic class JSONObject extends JSON implements Map<String, Object>, Cloneable, Seriali.原创 2021-06-18 15:39:01 · 689 阅读 · 0 评论 -
仿牛客社区项目3.1——过滤敏感词(前缀树)
根节点空,其他节点只包含一个字符。从根节点到某节点,连起来的每个路径,就是当前节点的字符串子节点不能和该节点相同敏感词:到最末节点的是敏感词敏感词构成一个前缀树3个指针:2指针一直往前走,3指针往返StringBuilder:记录非敏感词1、定义前缀树前缀树数据结构,util包下SensitiveFilter.java@Componentpublic class SensitiveFilter { // 前缀树内部类 private class TrieNode .原创 2021-06-17 22:54:39 · 702 阅读 · 1 评论 -
2.7仿牛客社区项目——账号设置(上传图片、响应图片)
1、访问账号设置页面用户相关逻辑、UserController@Controller@RequestMapping("/user")public class UserController { @RequestMapping(path = "/setting", method = RequestMethod.GET) public String getSettingPage() { return "/site/setting"; }}setting.ht.原创 2021-06-17 18:10:34 · 519 阅读 · 0 评论 -
2.8仿牛客社区项目——检查登录状态(自定义注解、拦截器)
需要解决的问题:防止直接在浏览器输入网址进入“登录信息设置”的网页。解决方案:设置拦截器,拦截所有请求,且在指定的方法上进行拦截。那么可以自定义注解,让拦截器只拦截带有这个自定义注解的方法。自定义注解:如何自己定义:常用的元注解有:@Target、@Retention、@Document、@Inherited(前两个必须要写)如何读取注解:Method.getDeclaredAnnotations()Method.getAnnotation(Class annotationClass)原创 2021-06-17 15:52:59 · 491 阅读 · 0 评论 -
2.6仿牛客社区项目———显示登录信息(拦截器、ThreadLocal)
一、为什么要用拦截器?每次请求都要显示头部信息,不同状态头部信息不同:如果登录状态,显示首页、消息、头像如果是未登录状态,显示首页、注册、登录拦截浏览器的请求,每次有请求,在开始或结束时加代码。解决通用问题,降低耦合度(拦截器和Controller没有直接的关系,所有耦合度很低。)。二、拦截器的基本使用、示例1、定义拦截器,实现HandlerInterceptor表现层的逻辑,在controller.interceptor下写Alphainterceptor.java:Handler原创 2021-06-16 22:51:44 · 1019 阅读 · 0 评论 -
2.5仿牛客社区项目———登录退出(创建登录凭证ticket,放入cookie)
user登录的属性id是主键ticket凭证status登录状态0有效1无效expired过期时间ticket由服务器发给浏览器,作为cookie保存在浏览器,其他信息在服务端保存。下次服务端收到了cookie识别出是来自哪个浏览器,并可取出其他信息。写程序的顺序:数据访问层->业务->表现层一、登录功能1、实体类entity:LoginTicket.class5个属性id、userId、ticket、status、expired,getset方法,重写toStringp.原创 2021-06-13 15:12:40 · 2602 阅读 · 2 评论 -
2.4仿牛客社区项目——生成验证码(放入session)
private static final Logger logger = LoggerFactory.getLogger(LoginController.class); @Autowired private Producer kaptchaProducer; @RequestMapping(path = "/kaptcha", method = RequestMethod.GET) //向浏览器输出的不是字符串也不是网页,是一个图片,需要自己用Respon...原创 2021-06-10 00:02:36 · 820 阅读 · 0 评论 -
2.3仿牛客社区项目——会话管理Cookie、Session
HTTP无状态有会话、Cookie、SessionHTTP是无状态有会话的同一个连接,服务器不记得浏览器的状态,每次请求是独立的,所以“无状态”。为了业务连续性,引入Cookie状态管理,即有会话Cookie。Cookie缺点是不安全,cookie要存到浏览器中;总是把数据发给服务器,每次访问服务器会增加数据量,对流量和性能上有影响Session服务端对象,是JavaEE标准,存在服务端安全;也会增加服务端内存压力。如果隐私,用Session存比较好Cookie浏览器 <-原创 2021-06-08 17:17:30 · 629 阅读 · 0 评论