1.注册功能实现
- 当我们在页面上点击注册按钮后,就会跳转到注册页面,用户需要输入用户名、密码、邮箱、手机号等信息,用户点击提交之后,会提交表单。
- 在service层对提交后的数据的处理逻辑,我们需要验证表单里面的选项,用户名,密码,邮箱等等是否为空,首先我们定义一个空的map,如果密码为空的话,就像map中加入kv键值对,v写“密码不能为空”,其他为空操作一样。
- 然后根据传进来的用户对象的用户名称判断数据库里面是否有同名的。如果同名,则在map的v设为“该用户已存在”。
- 如果都没问题,就会将数据添加到数据库用户表中
- 在Controller层,会调出函数来获取map,如果为空,则返回“注册成功”,如果不为空,则将错误信息(value)返回给页面。
注册代码
2.登陆功能怎么实现的
- 点击登录按钮后会进入登录页面,用户需要填写用户名,密码以及验证码去进行提交。
- 在service层对提交的表单数据进行验证,判断用户,密码,验证码是否正确,首先我们定义一个空的map,如果用户名不存在,则返回map中的v为“该用户不存在”。
- 如果都正确,会生成一个token,将token返回给浏览器cookie保存,并将token(key)和user的用户信息(value)保存在redis(hash)中。
3.用户在登陆后跳转其他页面是如何判断当前登录状态有效的?
使用拦截器进行登录状态检查,用户登录以后,每次发送请求时都会携带含有登录凭证 ticket 的 cookie,我们需要根据这个请求凭证 ticket 去 redis中查询出对应的请求凭证对象,里面包含userid,进而查询到用户user。将user里面的信息通过模板引擎展现到页面上。
4.提到的拦截器的实现
必须实现HandlerInterceptor 接口
里面有三个方法:
preHandle(目标方法执行之前)
postHandle(目标方法执行完成以后)
afterCompletion(页面渲染以后)
每次请求前在preHandle都会检查cookie中的ticket,把找到的user信息存放在ThreadLocal中,并在完成处理后(afterCompletion),自动释放。
ThreadLocal是起到什么作用?
ThreadLocal主要功能就是给每个线程创建变量副本,这样就可以保证一个线程对某个变量的修改不会影响到其他线程对该变量的使用。
每刷新一次页面都是用的同一个 ThreadLocal来进行用户信息的写入吗?
MD5加密是对称加密还是非对称加密?
两者都不是,md5是一种不可逆的加密方式,: 数据一旦加密,没有与之对应的秘钥进行解密
对称加密:加密与解密用的是同样的密钥
非对称加密:密钥是成对出现的,加密解密使用不同的密钥(公钥无法推出私钥,私钥无法推出公钥)。
整个登录加密解密的具体判断过程是什么样的?
加密的话,就是注册输入密码,通过MD5加密会生成16字节的字符串,然后后保存在数据库中。因为MD5是不可逆的,在登录时,,用户输入密码,然后通过MD5加密与数据库中保存的密码进行对比,如果一样,则登陆成功。
怎样实现统一记录日志的?
使用了AOP技术(面向切面编程),这里使用到的是SpringAOP。 AOP技术能够将哪些与业务,但是为业务模块共同调用的逻辑或责任(比如事务处理,日志记录,权限控制等),封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的扩展性和维护性。 SpringAOP本质上基于动态代理,当要代理的对象实现了某接口,会使用JDK动态代理,在运行时通过创建接口的代理实例,织入代码。当要代理的对象没有实现接口,则使用Cglib技术(编译时增强),通过子类代理织入代码。
表设计
用户表
登录凭证表、
帖子信息表
评论表
私信表
redis中Key的设计
验证码: kaptcha:owner(owner为UUID)
登录凭证: ticket:Loginticket (Loginticket为登录凭证信息)
用户: user:userId (hash)
某个实体的赞: like:entity:entitytype:entityId(set类型)
某个用户关注的实体:followee:userId:entityType (zset 使用当前时间作为分数排序)
某个实体粉丝:follower:ntityType:entityId(zset 使用当前时间作为分数排序)
RabbitMQ用在哪里
当有点赞,评论,关注请求时,会发送系统通知点赞,评论,关注的对象。在处理系统信息时,使用到了RabbitMQ,具体来说,先定义了生产者类和消费者类,其中生产者被点赞/评论/关注功能对应的Controller使用,产生消息。而消费者负责消息(message)到来时,把消息存到数据库内。
敏感词过滤
前缀树根节点为空,其他节点只包含一个字符。
从根节点到某节点,连起来的每个路径,就是当前节点的字符串。
resource下面生成一个txt文件,用来存放敏感词数据,当项目运行,加载txt文件,生成前缀树,发布帖子时,会检测帖子内容是否包含某个敏感词,如果有,则转化为***
ES使用
因为在我们商城中的数据,将来会非常多,所以采用以往的模糊查询,模糊查询前置配置,会放弃索引,导致商品查询是全表扫面,在百万级别的数据库中,效率非常低下,而我们使用ES做一个全文索引,我们将经常查询的商品的某些字段,比如说商品名,描述、价格还有id这些字段我们放入我们索引库里,可以提高查询速度
- 高亮原理:就是在每一个关键字前后增加CSS样式(对标题和内容进行匹配)
增加,修改帖子时,通过rabbitmq异步交给es服务器。
redis高级数据结构计算DAU和UV
UV: (Unique Visitor)独立访客,统计1天内访问某站点的用户数。可以理解成访问某网站的电脑的数量。页面访问人数,同一个账号访问同一个页面两次,UV算1次(HyperLogLog)
DAU: (Daily Active User)日活跃用户数量。常用于反映网站、互联网应用或网络游戏的运营情况。DAU通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户),这与流量统计工具里的访客(UV)概念相似。(Bitmap)