Day1 项目启动记录(KnowledgeDock)

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 代理 /apihttp://localhost:8080,避免 CORS

3. 关键实现说明(简述)

3.1 JWT 配置与工具封装

  • 配置项:
    • application.ymljwt.ttl-ms
    • application-dev.ymljwt.secret
  • 读取方式:JwtProperties@ConfigurationProperties(prefix = "jwt")
  • 工具类:JwtUtil(生成/解析 claims)

3.2 登录流程

  1. Controller 接收 LoginRequest
  2. Service 调 SysUserMapper.selectByUsername
  3. MD5(password) 对比 password_hash
  4. 生成 token 返回

3.3 鉴权流程

  1. WebMvcConfig 注册 JwtInterceptor
  2. 请求进入 /api/admin/** 时先执行 preHandle
  3. 解析请求头 token
  4. 解析失败抛 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-starter1.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 验证登录与鉴权

  1. 登录
  • POST http://localhost:8080/api/admin/auth/login
  • Body:{ "username": "admin", "password": "admin123" }
  1. 访问受保护接口
  • GET http://localhost:8080/api/admin/menus
    • 不带请求头 token:返回 40100
    • 带请求头 token: <jwt>:返回 code=0 data=[]

5.4 启动前端

  • 目录:E:\Java\Knowledge\Knowledge_front
  • 命令:
    • npm i
    • npm run dev
  • 地址:http://localhost:5173
相关推荐
Zzj_tju18 小时前
Java 从入门到精通(六):抽象类与接口到底怎么选?
java·开发语言
美好的事情能不能发生在我身上1 天前
Hot100中的:贪心专题
java·数据结构·算法
myloveasuka1 天前
Java与C++多态访问成员变量/方法 对比
java·开发语言·c++
Andya_net1 天前
Spring | @EventListener事件机制深度解析
java·后端·spring
lang201509281 天前
18 Byte Buddy 进阶指南:解锁 `@Pipe` 注解,实现灵活的方法转发
java·byte buddy
重庆小透明1 天前
【java基础篇】详解BigDecimal
java·开发语言
生产队队长1 天前
SpringBoot3:应用程序启动时,初始化工作[官方文档]
springboot
杰克尼1 天前
苍穹外卖--day08
java·数据库·spring boot·mybatis·notepad++
lierenvip1 天前
SQL 建表语句详解
java·数据库·sql
kuntli1 天前
Spring Bean生命周期全解析
java