Day1 项目启动记录(KnowledgeDock)
目标:完成"登录 -> 拿 token -> 管理端接口鉴权放行",并提供一个可用的前端管理端雏形。
1. 使用的技术栈
后端
- Java 11
- Spring Boot 2.7.3
- Spring MVC(Rest API)
- MyBatis(XML Mapper)
- MySQL + Druid
- PageHelper(分页插件,Day1 仅完成可启动的依赖版本)
- Redis/Cache/WebSocket/POI/OSS(已引入依赖,Day1 未展开)
- JWT(jjwt 0.9.1):登录签发 token、拦截器验签
- Knife4j(Springfox 3.0.0 体系):接口文档
doc.html
前端
- Vue 3 + Vite
- vue-router 4
- 纯 CSS(不依赖 UI 框架)
2. 已完成的功能(Day1 验收点)
2.1 健康检查
- 接口:
GET /api/health - 作用:验证服务可启动与基础路由可用
2.2 统一返回与统一异常
- 统一返回:
Result<T>:{ code, message, data } - 统一异常:
BizException+GlobalExceptionHandler- 业务异常抛出后统一转成
Result.fail(...)
- 业务异常抛出后统一转成
2.3 MyBatis 跑通(按 username 查用户)
- 表:
sys_user - Mapper:
SysUserMapper.selectByUsername(username) - XML:
resources/mapper/SysUserMapper.xml - 实体:
SysUser
2.4 登录(JWT)
- 接口:
POST /api/admin/auth/login - 入参:
{ username, password } - 校验:数据库查用户 +
MD5(password)与password_hash比对 - 返回:
{ token }
2.5 JWT 鉴权拦截
- 拦截:
/api/admin/** - 放行:
/api/admin/auth/login、/api/health、Swagger/Knife4j 相关路径 - 从请求头读取:
token: <jwt> - 验签失败:抛
BizException(ErrorCode.UNAUTHORIZED),最终返回40100
2.6 受保护示例接口
- 接口:
GET /api/admin/menus - 作用:验证鉴权是否生效
- 不带 token:失败(40100)
- 带 token:成功(code=0,data=[])
2.7 Swagger/Knife4j 注解
- 在 Controller 上增加
@Api/@ApiOperation,便于接口展示
2.8 前端管理端雏形(Vue3)
- 位置:
E:\Java\Knowledge\Knowledge_front - 页面:登录页 / 健康检查页 / 菜单页(示例)
- 通过 Vite proxy 代理
/api到http://localhost:8080,避免 CORS
3. 关键实现说明(简述)
3.1 JWT 配置与工具封装
- 配置项:
application.yml:jwt.ttl-msapplication-dev.yml:jwt.secret
- 读取方式:
JwtProperties(@ConfigurationProperties(prefix = "jwt")) - 工具类:
JwtUtil(生成/解析 claims)
3.2 登录流程
- Controller 接收
LoginRequest - Service 调
SysUserMapper.selectByUsername MD5(password)对比password_hash- 生成 token 返回
3.3 鉴权流程
WebMvcConfig注册JwtInterceptor- 请求进入
/api/admin/**时先执行preHandle - 解析请求头
token - 解析失败抛
UNAUTHORIZED
4. 遇到的问题与解决方式
4.1 DataSource 启动失败:缺少 url/driver
- 现象:
Failed to configure a DataSource: 'url' attribute is not specified - 解决:补齐
application-dev.yml的 MySQL 数据源配置
4.2 PageHelper 循环依赖导致启动失败
- 现象:
PageHelperAutoConfiguration ... circular reference - 解决:升级
pagehelper-spring-boot-starter到1.4.7(与 Boot 2.7 更兼容)
4.3 Springfox/Knife4j NPE(documentationPluginsBootstrapper)
- 现象:
Failed to start bean 'documentationPluginsBootstrapper'+ NPE - 解决:
application.yml增加:spring.mvc.pathmatch.matching-strategy: ant_path_matcher
4.4 Jackson 版本冲突风险
- 现象:POJO 模块显式引入过老的
jackson-databind:2.9.2 - 解决:移除显式版本,使用 Spring Boot BOM 管理的 2.13.x
4.5 MyBatis 实体没有 setter 导致映射失败
- 现象:查询时可能报
no setter for property - 解决:给
SysUser增加 Lombok@Data
4.6 YAML 缩进/乱码导致配置读取异常
- 现象:配置无法加载/字段读取不到
- 解决:重写
application.yml为规范缩进、可解析的格式
5. 如何启动与验证
5.1 初始化数据库
- 创建库:
knowledge_dock - 执行:
day1/sql/001_sys_user.sql(建表 + 插入 admin 用户)
5.2 启动后端
- 启动类:
KnowledgeDockApplication - 检查:
GET http://localhost:8080/api/health->ok
5.3 验证登录与鉴权
- 登录
POST http://localhost:8080/api/admin/auth/login- Body:
{ "username": "admin", "password": "admin123" }
- 访问受保护接口
GET http://localhost:8080/api/admin/menus- 不带请求头
token:返回40100 - 带请求头
token: <jwt>:返回code=0 data=[]
- 不带请求头
5.4 启动前端
- 目录:
E:\Java\Knowledge\Knowledge_front - 命令:
npm inpm run dev
- 地址:
http://localhost:5173