1 line
66 KiB
JavaScript
1 line
66 KiB
JavaScript
![]() |
(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{363:function(t,s,a){"use strict";a.r(s);var n=a(42),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"echo-开源社区系统"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#echo-开源社区系统"}},[t._v("#")]),t._v(" Echo — 开源社区系统")]),t._v(" "),a("hr"),t._v(" "),a("h2",{attrs:{id:"📚-从本项目你能学到什么"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#📚-从本项目你能学到什么"}},[t._v("#")]),t._v(" 📚 从本项目你能学到什么")]),t._v(" "),a("ul",[a("li",[t._v("学会主流的 Java Web 开发技术和框架")]),t._v(" "),a("li",[t._v("积累一个真实的 Web 项目开发经验")]),t._v(" "),a("li",[t._v("掌握本项目中涉及的常见面试题的答题策略")])]),t._v(" "),a("h2",{attrs:{id:"💻-核心技术栈"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#💻-核心技术栈"}},[t._v("#")]),t._v(" 💻 核心技术栈")]),t._v(" "),a("p",[t._v("后端:")]),t._v(" "),a("ul",[a("li",[t._v("Spring")]),t._v(" "),a("li",[t._v("Spring Boot 2.1.5 RELEASE")]),t._v(" "),a("li",[t._v("Spring MVC")]),t._v(" "),a("li",[t._v("ORM:MyBatis")]),t._v(" "),a("li",[t._v("数据库:MySQL 5.7")]),t._v(" "),a("li",[t._v("日志:SLF4J(日志接口) + Logback(日志实现)")]),t._v(" "),a("li",[t._v("分布式缓存:Redis")]),t._v(" "),a("li",[t._v("本地缓存:Caffeine")]),t._v(" "),a("li",[t._v("消息队列:Kafka 2.13-2.7.0")]),t._v(" "),a("li",[t._v("搜索引擎:Elasticsearch 6.4.3")]),t._v(" "),a("li",[t._v("安全:Spring Security")]),t._v(" "),a("li",[t._v("邮件:Spring Mail")]),t._v(" "),a("li",[t._v("分布式定时任务:Spring Quartz")])]),t._v(" "),a("p",[t._v("前端:")]),t._v(" "),a("ul",[a("li",[t._v("Thymeleaf")]),t._v(" "),a("li",[t._v("Bootstrap 4.x")]),t._v(" "),a("li",[t._v("Jquery")]),t._v(" "),a("li",[t._v("Ajax")])]),t._v(" "),a("h2",{attrs:{id:"🔨-开发环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔨-开发环境"}},[t._v("#")]),t._v(" 🔨 开发环境")]),t._v(" "),a("ul",[a("li",[t._v("操作系统:Windows 10")]),t._v(" "),a("li",[t._v("构建工具:Apache Maven")]),t._v(" "),a("li",[t._v("集成开发工具:Intellij IDEA")]),t._v(" "),a("li",[t._v("数据库:MySQL 5.7")]),t._v(" "),a("li",[t._v("应用服务器:Apache Tomcat")]),t._v(" "),a("li",[t._v("接口测试工具:Postman")]),t._v(" "),a("li",[t._v("压力测试工具:Apache JMeter")]),t._v(" "),a("li",[t._v("版本控制工具:Git")])]),t._v(" "),a("h2",{attrs:{id:"🎨-功能列表"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🎨-功能列表"}},[t._v("#")]),t._v(" 🎨 功能列表")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://gitee.com/veal98/images/raw/master/img/20210208222403.png",alt:""}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("[x] "),a("strong",[t._v("注册")])]),t._v(" "),a("ul",[a("li",[t._v("用户注册成功,将用户信息存入 MySQL,但此时该用户状态为未激活")]),t._v(" "),a("li",[t._v("向用户发送激活邮件,用户点击链接则激活账号(Spring Mail)")])])]),t._v(" "),a("li",[a("p",[t._v("[x] "),a("strong",[t._v("登录 | 登出")])]),t._v(" "),a("ul",[a("li",[a("p",[t._v("进入登录界面,动态生成验证码,并将验证码短暂存入 Redis(60 秒)")])]),t._v(" "),a("li",[a("p",[t._v("用户登录成功(验证用户名、密码、验证码),生成登录凭证且设置状态为有效,并将登录凭证存入 Redis")]),t._v(" "),a("p",[t._v("注意:登录凭证存在有效期,在所有的请求执行之前,都会检查凭证是否有效和是否过期,只要该用户的凭证有效并在有效期时间内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息)")])]),t._v(" "),a("li",[a("p",[t._v("勾选记住我,则延长登录凭证有效时间")])]),t._v(" "),a("li",[a("p",[t._v("用户登录成功,将用户信息<EFBFBD><EFBFBD>
|