{"id":16619555,"url":"https://github.com/java-edge/zhihu","last_synced_at":"2025-09-20T23:49:23.083Z","repository":{"id":37176525,"uuid":"99339446","full_name":"Java-Edge/Zhihu","owner":"Java-Edge","description":"基于 SSM 框架搭建仿知乎问答平台","archived":false,"fork":false,"pushed_at":"2024-03-12T13:06:01.000Z","size":34133,"stargazers_count":20,"open_issues_count":2,"forks_count":13,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-02T04:51:13.390Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"CSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Java-Edge.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-08-04T12:09:23.000Z","updated_at":"2024-12-17T06:18:30.000Z","dependencies_parsed_at":"2022-08-18T05:21:10.089Z","dependency_job_id":null,"html_url":"https://github.com/Java-Edge/Zhihu","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Java-Edge%2FZhihu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Java-Edge%2FZhihu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Java-Edge%2FZhihu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Java-Edge%2FZhihu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Java-Edge","download_url":"https://codeload.github.com/Java-Edge/Zhihu/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238892428,"owners_count":19548185,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-12T02:42:15.754Z","updated_at":"2025-09-20T23:49:18.025Z","avatar_url":"https://github.com/Java-Edge.png","language":"CSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# \"柚知\" 问答社交平台\n\n基于SpringBoot框架搭建仿知乎问答平台\n\n\n* * *\n\n# 1 环境\n*   **操作系统** : Mac OS 10.12.1\n*   **IDE** ：IntelliJ IDEA 2019.3.5\n*   **JDK Version** : JDK1.8\n*   **数据库** ：MySQL 8.0\n*   **依赖管理工具** : Maven 3.6.1\n*   **版本控制**: Git\n\n* * *\n\n# 2 运行\n导入到 IDEA，使用`IDEA`创建的项目,配置好`maven`的相关配置,以及项目`JDK`版本,直接在主界面选择`Open`,然后找到项目所在路径,点击导入即可。\n\n* * *\n\n# 项目架构\n用户：负责维护社区用户信息，注册，登录等；\n关系：用户之间关注、好友、拉黑等关系的维护；\n内容：社区发的内容，就像朋友圈或者微博的内容；\n评论、赞：用户可能会有的两种常规互动操作；\n搜索：用户的搜索，内容的搜索。\n\n# 4 重点技术梳理\n\n## 前缀树\n\n正如大多数网站发表言论都是需要经过审查的,而在我们的局域网里面,更是是要经过无数次的审查,然后方案有一下几种:\n\n*   把敏感词删除\n*   把敏感词替换为指定的字符串\n\n这里并不是使用`replace()`方法或者使用正则表达式进行逐个查找然后进行替换,而是采用更加优良的算法-**前缀树**\n\n*   根节点不包含字符,除根节点外每一个节点都只包含一个字符\n*   从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串\n*   每个节点的所有子节点包含的字符都不相同 \n* * *\n\n## 异步\n\n在当今互联网这种上网人群多,访问量大的情况下,异步编程提供了一个非堵塞的,基于事件驱动的编程模型.这种编程方式可以充分利用计算机的多核来同时执行并行任务,提高资源的利用效率.\n举个很简单的例子,我们在网站注册新的社交账号的话,严格一点的网站都是会有验证邮箱地址的邮件.这个就是一个异步的事件,你不可能说直接把邮件验证的流程嵌套在业务逻辑里面.\n应该是把这个事件发送给一个队列里面,然后队列专门处理这种事件.在一个网站中有各种各样的事情需要进行处理 \n\n简单设计流程:\n*   1.首先定义一个定义一个枚举类型的`EventType`类,这里面列举各种各样将会出现的事件\n*   2.再定义一个事件模型`EventModel`类,里面包含的是一个事件所应该具有的一些属性.例如事件类型,操作者的ID,操作的实体类型,操作的实体ID,操作的实体拥有者等等\n*   3.再定义一个接口`EventHandler`,里面写上几个抽象的方法,具体的实现由继承的类进行实现\n*   4.定义一个事件生产者`EventProducer`,这里就是用来生产各种各样的事件,如异常登录或者是注册邮件等等.本项目中这里就是把事件送到Redis中进行储存\n*   5.定义一个事件消费者`EventConsumer`,这里就是需要继承`InitializingBean`跟`ApplicationContextAware`.继承`InitializingBean`是可以定义bean的初始化方式,继承`InitializingBean`是为了可以通过这个上下文对象得到我们想获取的bean.然后在这个类里面使用多线程一直去Redis里面读取出事件,然后进行处理\n*   6.再继承`EventHandler`在方法里面写自己的实现","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjava-edge%2Fzhihu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjava-edge%2Fzhihu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjava-edge%2Fzhihu/lists"}