# 牛客社区学习项目 **Repository Path**: Trace001/nowcoder-community-study ## Basic Information - **Project Name**: 牛客社区学习项目 - **Description**: 在校期间, 在牛客网找到的项目, 跟着制作学习, 用自己的理解改进了本项目的一些设计. - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2023-08-19 - **Last Updated**: 2023-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 使用的框架 - springboot - mybatis-plus - thymeleaf - kaptcha ## 学习到的新知识 - 通过kaptcha去生成验证码图片并返回到浏览器 - 封装并使用JavaMailSender发送邮件 - 自定义注解的编写与读取 - 通过自定义注解标记Controller方法+拦截器来实现对不同状态的访问限制 - 使用ticket来保存用户的登录状态而不是session - 封装ThreadLocal来保存用户登录信息(User对象) - 使用前缀树过滤敏感词 - 声明式事务并不都优于编程式事务(例如当某函数流程仅有某部分需要事务管理, 就不能使用声明式事务直接声明该函数) - 通过实现Constants接口避免以导包的形式引用常量 ### redis - 键值的设计规范 - redis事务由命令队列实现, 不具有完全的acid ### kafka - 一个分布式流媒体平台(不只是消息队列) - 应用于消息系统,日志收集,用户行为追踪,流式处理 ### thymeleaf - thymeleaf模板渲染时可以使用`${param.argName}`来访问request的参数 - thymeleaf模板渲染时可以使用`${#dates.format(Date, ‘yyyy-MM-dd HH:mm:ss’)}` 来格式化时间对象 - thymeleaf模板渲染时使用双竖杠进行字符串拼接`|我是字符串我的名字叫${user.name}|` 来格式化时间对象 - thymeleaf获取`th:each=“user:${users}”`当前循环计数通过`userStat.count`来获取.(xxxStat为thymeleaf的隐含对象, 由引擎自动赋值) - thymeleaf会自动返回/template/error下的500, 404错误页面. ### Elasticsearch - 6.0版本,ES对象理解(索引 -> database, 类型 -> table, 文档(通常json) -> 行记录, 字段 -> 同数据库), 7.0之后(索引 -> table, 废弃类型) - 将索引分片提高并发能力 - 需要中文分词器来支持中文搜索, 分词器依赖字典进行分词. - ES开放了两个端口9200(http), 9300(tcp) - springboot-elasticsearch中通过注解标记实体类从而简化将实体手动存储到es. - ik_max_word分词器会将文本做最细粒度的拆分通常(用在被搜索内容), ik_smart会做最粗粒度的拆分通常(用在搜索内容). - spring-data-elasticsearch的版本要与使用的elasticsearch对应, 否则无法使用. - 展示搜索结果时通过HighlightBuilder高亮关键词 ### Mysql - InnoDB默认存储引擎, 相比MyISAM, 它支持事务,和外键. - 事务ACID特性. - 事务并发异常: 第一类更新丢失, 第二类更新丢失, 脏读, 不可重复读,幻读. - 事务隔离级别: 读未提交, 读已提交, 可重复读, 串行化. - 事务管理: 声明式事务(注解), 编程式事务(try-catch). - 锁范围: 表级锁(MyISAM), 行级锁(InnoDB). - 锁类型: 共享锁S, 排他锁X, 意向共享锁IS, 意向排他锁IX, 间隙锁NK.