Campus Lost & Found Management System
基于 Spring Boot 3 + Vue 3 的前后端分离校园失物招领平台,集成 AI 智能分类与内容安全审核
校园失物招领管理系统是一个面向高校师生的公益服务平台,旨在帮助师生快速发布和查找失物信息 ,提高失物归还效率。系统核心特性:
特性
说明
前后端分离架构
Spring Boot 3 后端 + Vue 3 前端,RESTful API 交互
JWT 无状态认证
基于 JWT 令牌的统一身份认证,支持角色权限隔离
AI 智能分类
发布物品时自动识别所属分类,减少人工操作
AI 内容审核
自动检测发布内容合规性,拦截违规信息
多环境配置管理
dev / prod 环境分离,敏感配置通过 .env 文件注入
容器化部署
Docker 多阶段构建 + Docker Compose 一键编排
统一异常处理
全局异常捕获,标准错误码响应
层级
技术
版本
用途
核心框架
Spring Boot
3.2.5
应用基础框架
运行环境
JDK
17
Java 运行时
ORM 框架
MyBatis + PageHelper
3.0.3 / 2.1.0
数据持久化、分页查询
关系数据库
MySQL
8.0+
主数据存储
缓存中间件
Redis
6.0+
会话缓存、分布式锁等
认证授权
JJWT
0.12.5
JWT 令牌生成与校验
AI 引擎
Spring AI + OpenAI
1.0.0-M4
智能分类与内容审核
JSON 处理
FastJSON2
2.0.43
高性能 JSON 序列化
AOP 切面
Spring AOP
内置
日志记录、权限控制
参数校验
Jakarta Validation
内置
接口入参校验
代码简化
Lombok
latest
注解驱动代码生成
层级
技术
版本
用途
框架
Vue 3
3.4.21
响应式 UI 框架
构建工具
Vite
5.2.8
开发服务器与打包
路由
Vue Router
4.3.0
SPA 路由管理
HTTP 客户端
Axios
1.6.8
API 请求封装
UI 组件库
Element Plus
2.6.3
企业级组件库
图标库
@element-plus/icons-vue
2.3.1
图标资源
自动导入
unplugin-auto-import / vue-components
latest
API 与组件按需导入
工具
版本
说明
Docker
20.0+
容器化部署
Maven
3.6+
Java 项目构建
Node.js
18+
前端运行环境
┌─────────────────────────────────────────────────────────┐
│ 客户端浏览器 │
└──────────────────────┬──────────────────────────────────┘
│ HTTP (Vue 3 SPA)
▼
┌─────────────────────────────────────────────────────────┐
│ Nginx (反向代理) │
└──────────────────────┬──────────────────────────────────┘
│
┌────────────┴────────────┐
▼ ▼
┌──────────────────┐ ┌──────────────────────┐
│ lost-found- │ │ lost-found-backend │
│ frontend │ │ (Spring Boot 8088) │
│ (Vite Dev/ │ │ │
│ Build Static) │ │ ┌─────────────────┐ │
│ │ │ │ AuthInterceptor │ │
│ ┌────────────┐ │ │ │ (JWT 认证鉴权) │ │
│ │ Vue Router │ │ │ └────────┬────────┘ │
│ │ Element+ │ │ │ ▼ │
│ │ Axios API │──┼───▶ ┌─────────────────┐ │
│ └────────────┘ │ │ │ Controller 层 │ │
└──────────────────┘ │ │ (RESTful API) │ │
│ └────────┬────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Service 层 │ │
│ │ (业务逻辑/AI服务) │ │
│ └────────┬────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ DAO 层 (MyBatis) │ │
│ └────────┬────────┘ │
└───────────┼────────────┘
▼
┌───────────────────────────────┐
│ 数据层 │
│ ┌───────┐ ┌────────┐ │
│ │ MySQL │ │ Redis │ │
│ │ 8.0+ │ │ 6.0+ │ │
│ └───────┘ └────────┘ │
└───────────────────────────────┘
│
▼
┌───────────────────────────────┐
│ 外部 AI 服务 │
│ OpenAI 兼容接口 (Spring AI) │
└───────────────────────────────┘
前端发起 Axios 请求 → Vite Proxy 代理转发至后端
AuthInterceptor 拦截请求,校验 JWT Token(白名单路径除外)
Controller 接收请求,@Validated 参数校验
Service 执行业务逻辑,必要时调用 AI 服务
DAO 通过 MyBatis 操作数据库
GlobalExceptionHandler 统一异常封装为 Result<T> 格式返回
用户注册(用户名唯一性校验)
用户登录(JWT Token 签发)
个人信息查看与修改
角色权限:普通用户(0) / 管理员(1)
失物发布 :捡到物品的信息登记(含图片上传、地点、时间)
寻物启事 :丢失物品的求助信息发布
物品列表浏览:支持分类筛选、关键词搜索、分页加载
物品详情查看:展示完整信息及认领入口
我的物品管理:查看个人发布的所有物品
系统预设 8 大物品分类(证件卡类、钥匙钱包、电子产品、书籍文具、衣物配饰、水杯雨伞、玩具、其他)
管理员可自定义新增/编辑/删除分类
分类排序支持
在线提交认领申请(填写认领理由/证明材料 + 联系方式)
我的认领记录查询
管理员审核认领请求(通过/拒绝 + 备注说明)
物品状态流转:待审核 → 已通过 → 已认领
物品详情页留言讨论
支持嵌套回复(parent_id 关联父留言)
管理员发布系统公告
公告置顶、草稿/已发布状态管理
公告列表与详情查看
AI 自动分类 :根据物品标题和描述智能匹配系统分类
AI 内容安全审核 :自动检测内容是否包含违禁词或敏感信息
物品图片上传(支持多图,逗号分隔 URL 存储)
单文件限制 10MB,单次请求限制 20MB
静态资源映射访问
lost-found-backend/ # 后端项目 (Spring Boot)
├── .env # 🔒 敏感配置文件(禁止提交 Git)
├── .env.example # 📋 环境变量模板(提交到仓库)
├── docker-compose.yml # 🐳 Docker Compose 编排
├── Dockerfile # 🐳 多阶段构建定义
├── pom.xml # Maven 依赖管理
├── sql/
│ └── init.sql # 🗄️ 数据库初始化脚本(表结构 + 种子数据)
├── src/main/java/com/campus/lostfound/
│ ├── LostFoundApplication.java # 🚀 启动类 (@MapperScan)
│ ├── common/ # 📦 公共类
│ │ ├── Constants.java # 全局常量定义
│ │ ├── PageResult.java # 分页结果封装
│ │ └── Result.java # 统一响应体 {code, message, data}
│ ├── config/
│ │ └── WebMvcConfig.java # ⚙️ CORS / 拦截器注册 / 静态资源映射
│ ├── controller/ # 🎮 RESTful 控制器层
│ │ ├── AiController.java # AI 分类 + 内容审核接口
│ │ ├── AnnouncementController.java # 公告 CRUD 接口
│ │ ├── CategoryController.java # 分类 CRUD 接口
│ │ ├── ClaimController.java # 认领申请 + 审核接口
│ │ ├── ItemController.java # 物品发布/列表/详情/审核接口
│ │ ├── MessageController.java # 留言发送/删除接口
│ │ ├── UploadController.java # 图片上传接口
│ │ └── UserController.java # 用户注册/登录/信息接口
│ ├── dao/ # 💾 MyBatis Mapper 接口
│ │ ├── AnnouncementMapper.java
│ │ ├── CategoryMapper.java
│ │ ├── ClaimMapper.java
│ │ ├── ItemMapper.java
│ │ ├── MessageMapper.java
│ │ └── UserMapper.java
│ ├── entity/ # 📋 实体类
│ │ ├── dto/ # 数据传输对象 (DTO)
│ │ │ ├── AnnouncementDTO.java
│ │ │ ├── ClaimDTO.java
│ │ │ ├── ItemDTO.java
│ │ │ ├── LoginDTO.java
│ │ │ ├── MessageDTO.java
│ │ │ └── RegisterDTO.java
│ │ ├── Announcement.java
│ │ ├── Category.java
│ │ ├── Claim.java
│ │ ├── Item.java
│ │ ├── Message.java
│ │ └── User.java
│ ├── exception/ # ⚠️ 异常处理体系
│ │ ├── BusinessException.java # 自定义业务异常
│ │ ├── GlobalExceptionHandler.java # 全局异常处理器 (@RestControllerAdvice)
│ │ └── UnauthorizedException.java # 未授权异常 (401)
│ ├── interceptor/
│ │ └── AuthInterceptor.java # 🔐 JWT 认证拦截器
│ ├── service/ # ⚙️ 业务逻辑层
│ │ ├── ai/ # AI 智能服务
│ │ │ ├── AiClassificationService.java # AI 自动分类 (Spring AI)
│ │ │ └── AiContentModerationService.java # AI 内容安全审核 (Spring AI)
│ │ ├── AnnouncementService.java
│ │ ├── CategoryService.java
│ │ ├── ClaimService.java
│ │ ├── ItemService.java
│ │ ├── MessageService.java
│ │ └── UserService.java
│ └── util/
│ └── JwtUtil.java # 🔑 JWT 工具类 (生成/解析/校验)
├── src/main/resources/
│ ├── application.yml # ⚙️ 主配置 (端口/JWT/MyBatis/日志)
│ ├── application-dev.yml # 🔧 开发环境 (从 ${} 变量读取)
│ ├── application-prod.yml # 🏭 生产环境 (强制环境变量注入)
│ └── mapper/ # MyBatis XML 映射文件
│ ├── AnnouncementMapper.xml
│ ├── CategoryMapper.xml
│ ├── ClaimMapper.xml
│ ├── ItemMapper.xml
│ ├── MessageMapper.xml
│ └── UserMapper.xml
lost-found-frontend/ # 前端项目 (Vue 3 + Vite)
├── index.html # HTML 入口模板
├── package.json # npm 依赖管理
├── vite.config.js # Vite 配置 (代理/插件)
├── src/
│ ├── main.js # 应用入口
│ ├── App.vue # 根组件
│ ├── api/index.js # API 接口统一封装
│ ├── utils/request.js # Axios 请求实例 (拦截器/错误处理)
│ ├── router/index.js # 路由配置表
│ ├── layout/MainLayout.vue # 主布局 (导航栏 + 内容区)
│ ├── styles/variables.css # CSS 全局变量
│ └── views/ # 页面视图
│ ├── Home.vue # 首页 (物品轮播/推荐)
│ ├── Login.vue # 登录页
│ ├── Register.vue # 注册页
│ ├── ItemList.vue # 物品列表 (搜索/筛选/分页)
│ ├── ItemDetail.vue # 物品详情 (留言/认领入口)
│ ├── ItemPublish.vue # 物品发布 (表单/图片上传)
│ ├── MyItems.vue # 我的物品管理
│ ├── MyClaims.vue # 我的认领记录
│ ├── Announcement.vue # 公告列表
│ ├── Admin.vue # 管理后台 (审核/用户/分类)
│ ├── DebugPage.vue # 调试页面
│ └── TestPage.vue # 测试页面
系统使用 MySQL 8.0+ ,数据库名称 campus_lost_found,字符集 utf8mb4。
t_user (用户表)
│ 1:N ───────────────────────────── t_item (物品表)
│ 1:N ───────────────────────────── t_claim (认领表)
│ 1:N ───────────────────────────── t_message (留言表)
│ 1:N ───────────────────────────── t_announcement (公告表)
t_category (分类表)
│ 1:N ───────────────────────────── t_item (物品表, 外键 category_id)
t_item (物品表)
│ 1:N ───────────────────────────── t_claim (认领表, 外键 item_id)
│ 1:N ───────────────────────────── t_message (留言表, 外键 item_id)
字段
类型
约束
说明
id
BIGINT
PK, AUTO_INCREMENT
用户 ID
username
VARCHAR(50)
NOT NULL, UNIQUE
登录用户名
password
VARCHAR(100)
NOT NULL
密码 (BCrypt 加密)
nickname
VARCHAR(50)
NULLABLE
昵称
avatar
VARCHAR(255)
NULLABLE
头像 URL
phone
VARCHAR(20)
NULLABLE, INDEX
手机号
email
VARCHAR(100)
NULLABLE
邮箱
role
TINYINT
NOT NULL, DEFAULT 0
角色: 0=普通用户, 1=管理员
status
TINYINT
NOT NULL, DEFAULT 1
状态: 0=禁用, 1=正常
create_time
DATETIME
NOT NULL, DEFAULT NOW
创建时间
update_time
DATETIME
NOT NULL, ON UPDATE NOW
更新时间
字段
类型
约束
说明
id
BIGINT
PK, AUTO_INCREMENT
分类 ID
name
VARCHAR(50)
NOT NULL, UNIQUE
分类名称
icon
VARCHAR(255)
NULLABLE
分类图标标识
sort_order
INT
NOT NULL, DEFAULT 0
排序序号
status
TINYINT
NOT NULL, DEFAULT 1
状态: 0=禁用, 1=正常
create_time
DATETIME
DEFAULT NOW
创建时间
update_time
DATETIME
ON UPDATE NOW
更新时间
字段
类型
约束
说明
id
BIGINT
PK, AUTO_INCREMENT
物品 ID
user_id
BIGINT
FK → t_user, CASCADE
发布者 ID
category_id
BIGINT
FK → t_category, SET NULL
分类 ID (AI 自动分配)
title
VARCHAR(100)
NOT NULL
物品名称
description
TEXT
NOT NULL
物品描述
images
VARCHAR(1000)
NULLABLE
图片 URL 列表 (逗号分隔)
location
VARCHAR(200)
NOT NULL
拾获/丢失地点
contact_info
VARCHAR(200)
NULLABLE
联系方式
item_type
TINYINT
NOT NULL, DEFAULT 0, INDEX
类型: 0=失物(捡到), 1=寻物(丢失)
status
TINYINT
NOT NULL, DEFAULT 0, INDEX
状态: 0=待审核, 1=已通过, 2=已拒绝, 3=已认领
ai_category
VARCHAR(100)
NULLABLE
AI 分类结果
ai_review_result
VARCHAR(500)
NULLABLE
AI 审核结果描述
ai_review_pass
TINYINT
NULLABLE
AI 审核: 0=不通过, 1=通过
found_time
DATETIME
NULLABLE
拾获/丢失时间
create_time
DATETIME
DEFAULT NOW
创建时间
update_time
DATETIME
ON UPDATE NOW
更新时间
字段
类型
约束
说明
id
BIGINT
PK, AUTO_INCREMENT
认领 ID
item_id
BIGINT
FK → t_item, CASCADE
物品 ID
user_id
BIGINT
FK → t_user, CASCADE
认领人 ID
reason
VARCHAR(500)
NOT NULL
认领理由/证明
contact_info
VARCHAR(200)
NOT NULL
联系方式
status
TINYINT
NOT NULL, DEFAULT 0, INDEX
状态: 0=待审核, 1=已通过, 2=已拒绝
review_remark
VARCHAR(500)
NULLABLE
审核备注
create_time
DATETIME
DEFAULT NOW
创建时间
update_time
DATETIME
ON UPDATE NOW
更新时间
字段
类型
约束
说明
id
BIGINT
PK, AUTO_INCREMENT
留言 ID
item_id
BIGINT
FK → t_item, CASCADE
所属物品 ID
user_id
BIGINT
FK → t_user, CASCADE
留言人 ID
content
VARCHAR(500)
NOT NULL
留言内容
parent_id
BIGINT
NULLABLE, INDEX
父留言 ID (回复功能)
create_time
DATETIME
DEFAULT NOW
创建时间
update_time
DATETIME
ON UPDATE NOW
更新时间
字段
类型
约束
说明
id
BIGINT
PK, AUTO_INCREMENT
公告 ID
title
VARCHAR(200)
NOT NULL
公告标题
content
TEXT
NOT NULL
公告内容
user_id
BIGINT
FK → t_user, CASCADE
发布管理员 ID
is_top
TINYINT
NOT NULL, DEFAULT 0
是否置顶: 0=否, 1=是
status
TINYINT
NOT NULL, DEFAULT 1
状态: 0=草稿, 1=已发布
create_time
DATETIME
DEFAULT NOW
创建时间
update_time
DATETIME
ON UPDATE NOW
更新时间
执行 sql/init.sql 后将自动创建以下初始数据:
类型
账号
密码
角色
说明
管理员
admin
admin123
管理员
系统管理员账户
测试用户
zhangsan
123456
普通用户
示例用户 1
测试用户
lisi
123456
普通用户
示例用户 2
同时初始化 8 个预置分类 和 3 条示例物品 + 2 条公告 。
环境
最低版本
推荐版本
JDK
17
17 LTS (Eclipse Temurin)
Maven
3.6+
3.9+
MySQL
8.0
8.0+
Redis
6.0
7.0+
Node.js
18
20 LTS
npm
9+
10+
Docker (可选)
20.0+
24.0+
本项目采用 .env 文件集中管理敏感配置,所有密码、密钥、API Key 禁止硬编码到 YAML 中。
cd lost-found-backend
# 第一步:复制模板并填入实际值
cp .env.example .env
# 第二步:编辑 .env 文件,填入真实配置
# 必填项:
# DB_HOST / DB_USERNAME / DB_PASSWORD — 数据库连接
# REDIS_HOST / REDIS_PASSWORD — Redis 连接
# JWT_SECRET — JWT 签名密钥(至少 256 位)
# OPENAI_API_KEY / OPENAI_BASE_URL — AI 服务凭证
.env.example 模板中所有 <xxx> 占位符均需替换为实际值:
DB_HOST =localhost
DB_PORT =3306
DB_NAME =campus_lost_found
DB_USERNAME =root
DB_PASSWORD =<your-db-password>
REDIS_HOST =localhost
REDIS_PORT =6379
REDIS_DATABASE =0
REDIS_PASSWORD =
JWT_SECRET =<your-256bit-secret-key>
JWT_EXPIRATION =86400000
OPENAI_API_KEY =<your-openai-api-key>
OPENAI_BASE_URL =https://api.openai.com
OPENAI_MODEL =gpt-4
cd lost-found-backend
# 1. 初始化数据库(在 MySQL 客户端中执行)
mysql -u root -p < sql/init.sql
# 2. 确保 .env 文件已正确配置(见上方说明)
# 3. IDEA 启动:
# 安装 EnvFile 插件后直接运行 LostFoundApplication.main()
# 或手动设置环境变量:Run Configuration → Environment variables → 选择 .env 文件
# 4. 命令行启动(需先 export 环境变量):
export $( cat .env | xargs)
mvn clean package -DskipTests && mvn spring-boot:run
# 启动成功后访问: http://localhost:8088/api/item/list
cd lost-found-frontend
# 1. 安装依赖
npm install
# 2. 启动开发服务器(默认代理后端 API 至 localhost:8088)
npm run dev
# 打开浏览器访问: http://localhost:5173
cd lost-found-backend
# 1. 准备 .env 文件(同上)
cp .env.example .env
# 编辑填入生产环境配置
# 2. 一键构建并启动
docker compose up -d --build
# 3. 查看运行状态
docker compose ps
docker compose logs -f
# 4. 停止服务
docker compose down
Docker Compose 自动完成以下工作:
从 Dockerfile 构建镜像(Maven 编译 → JRE 运行时)
从 .env 文件加载所有环境变量注入容器
映射端口 8088:8088
挂载 ./uploads 目录持久化上传文件
配置健康检查(每 30s 探测 /api/item/list)
设置容器重启策略 unless-stopped
cd lost-found-backend
# 构建
docker build -t campus-lost-found:1.0.0 .
# 运行(通过 --env-file 加载 .env)
docker run -d \
--name campus-lost-found \
--env-file .env \
-p 8088:8088 \
-v ./uploads:/app/uploads \
--restart unless-stopped \
campus-lost-found:1.0.0
基础路径:http://localhost:8088/api
{
"code" : 200 ,
"message" : " 操作成功" ,
"data" : { ... }
}
code
含义
200
成功
400
参数校验失败
401
未登录 / Token 过期
403
无权限
500
服务器内部错误
方法
路径
说明
认证
请求体
POST
/user/register
用户注册
❌
{username, password, nickname}
POST
/user/login
用户登录
❌
{username, password}
GET
/user/info
获取当前用户信息
✅
—
PUT
/user/update
更新个人信息
✅
{nickname, phone, email, avatar}
GET
/user/detail/{id}
管理员获取用户详情
✅
—
DELETE
/user/delete/{id}
管理员删除用户
✅
—
登录成功返回 :{ token: "jwt-token", user: { ... } }
方法
路径
说明
认证
请求体
POST
/item/publish
发布物品
✅
{title, description, location, contactInfo, itemType, foundTime}
GET
/item/list
物品列表(分页+筛选)
❌
?pageNum=1&pageSize=10&keyword=&categoryId=&itemType=
GET
/item/detail/{id}
物品详情
❌
—
GET
/item/my
我的物品列表
✅
?pageNum=&pageSize=
PUT
/item/update
编辑物品
✅
{id, title, ...}
DELETE
/item/delete/{id}
删除物品
✅
—
PUT
/item/review/{id}
管理员审核物品
✅
{status, reviewRemark}
方法
路径
说明
认证
GET
/category/list
分类列表
❌
GET
/category/detail/{id}
分类详情
❌
POST
/category/add
新增分类
✅(管理员)
PUT
/category/update
编辑分类
✅(管理员)
DELETE
/category/delete/{id}
删除分类
✅(管理员)
方法
路径
说明
认证
请求体
POST
/claim/apply
提交认领申请
✅
{itemId, reason, contactInfo}
GET
/claim/my
我的认领记录
✅
?pageNum=&pageSize=
GET
/claim/item/{itemId}
物品的认领列表
✅(管理员)
—
PUT
/claim/review/{id}
管理员审核认领
✅(管理员)
{status, reviewRemark}
方法
路径
说明
认证
请求体
POST
/message/send
发送留言
✅
{itemId, content, parentId?}
GET
/message/list/{itemId}
物品留言列表
❌
—
DELETE
/message/delete/{id}
删除留言
✅
—
方法
路径
说明
认证
GET
/announcement/list
公告列表
❌
GET
/announcement/detail/{id}
公告详情
❌
POST
/announcement/publish
发布公告
✅(管理员)
PUT
/announcement/update
编辑公告
✅(管理员)
DELETE
/announcement/delete/{id}
删除公告
✅(管理员)
方法
路径
说明
认证
参数
GET
/ai/classify
AI 智能分类
❌
?title=&description=
GET
/ai/moderate
AI 内容审核
❌
?title=&description=
方法
路径
说明
认证
Content-Type
POST
/upload/image
图片上传
✅
multipart/form-data
以下路径无需 JWT Token 即可访问:
POST /user/register
POST /user/login
GET /item/list
GET /item/detail/*
GET /category/list
GET /announcement/list
GET /announcement/detail/*
GET /uploads/** (静态资源)
GET /ai/* (AI 接口)
其余所有接口均在请求头中携带 Authorization: Bearer <token> 进行鉴权。
系统集成 Spring AI 框架,通过 OpenAI 协议兼容的大语言模型实现两项核心智能能力:
1. AI 自动分类 (AiClassificationService)
输入: title="校园卡", description="在教学楼3栋201教室捡到一张校园卡"
输出: "证件卡类"
触发时机 :用户发布物品时自动调用
实现原理 :将标题和描述作为 Prompt 发送给 LLM,要求从预定义的分类列表中选择最匹配的一项
容错策略 :若 AI 调用失败,不影响发布流程,分类字段留空由人工补充
2. AI 内容安全审核 (AiContentModerationService)
输入: title="xxx", description="xxx"
输出: { pass: true/false, reason: "内容安全,通过审核" }
触发时机 :用户发布物品时自动调用(先分类后审核)
实现原理 :LLM 对内容进行安全评估,判断是否包含违规信息
审核不通过处理 :物品状态标记为「AI 审核不通过」,管理员可在后台复审
模型配置 :可通过 OPENAI_MODEL 环境变量切换不同模型
AI 相关配置全部在 .env 文件中管理:
OPENAI_API_KEY =your-api-key # API 密钥
OPENAI_BASE_URL =https://api.xxx.com # 接口地址(支持 OpenAI 兼容服务)
OPENAI_MODEL =gpt-4 # 模型名称
开发环境默认使用 LongCat-Flash-Chat 模型(轻量快速),生产环境建议切换为 GPT-4 或同等能力模型。
application.yml ← 公共配置(端口、context-path、文件上传、MyBatis、日志格式)
├── application-dev.yml ← 开发环境(从 ${} 环境变量读取,带本地默认值回退)
└── application-prod.yml← 生产环境(强制环境变量注入,无硬编码默认值)
切换环境:修改 application.yml 中 spring.profiles.active 或通过 JVM 参数覆盖:
java -jar app.jar --spring.profiles.active=prod
配置项
默认值
说明
server.port
8088
服务监听端口
server.servlet.context-path
/api
API 前缀路径
spring.servlet.multipart.max-file-size
10MB
单文件上传上限
spring.servlet.multipart.max-request-size
20MB
单次请求总大小上限
upload.path
./uploads/
文件存储目录
jwt.secret
${JWT_SECRET}
JWT 签名密钥(必填)
jwt.expiration
86400000
Token 有效期(毫秒,默认 24h)
pagehelper :
helper-dialect : mysql
reasonable : true # 页码越界时自动修正
support-methods-arguments : true
.env 文件 (.gitignore 排除) → Spring ${} 占位符读取 → 运行时注入应用
所有密码、密钥、API Key 存储于 .env 文件
.gitignore 已配置排除规则:.env、*.env(保留 !.env.example)
生产环境无任何硬编码默认值,缺失必要变量则启动报错
客户端 → POST /user/login → 服务端验证凭据 → 签发 JWT Token
↓
后续请求 → Header: Authorization: Bearer <token>
→ AuthInterceptor 校验 Token
→ 解析 userId 注入 request.setAttribute("currentUserId")
→ Controller 获取当前用户身份
使用 BCrypt 算法加密存储,不可逆
数据库中绝不存储明文密码
注册/登录传输使用 HTTPS(生产环境)
GlobalExceptionHandler 统一捕获所有异常
对外仅返回 {code, message},不暴露堆栈信息
敏感字段(如密码)在序列化前自动置空
本项目严格遵循以下开发规范:
维度
规范
Java
《阿里巴巴 Java 开发手册》
前端
TypeScript 强类型,禁止 any;ESLint 代码检查
命名
英文驼峰命名,禁止拼音 / 中文 / 无意义缩写
注释
关键业务逻辑必须注释,函数级注释含功能/参数/返回值/异常
禁止 SQL 注入 :MyBatis 参数化查询 #{param}
禁止 XSS :前端输入转义 + 后端内容过滤
禁止硬编码密钥 :所有敏感信息走 .env + 环境变量
禁止吞异常 :全局异常处理器兜底,必须记录日志含 traceId
核心业务必须编写单元测试,覆盖率 ≥ 80%
禁止未测试代码合并主分支
线上问题 24h 内响应、48h 内修复
开发 / 测试 / 生产环境严格隔离
禁止测试数据进入生产数据库
禁止线上环境开启 DEBUG 日志级别
License: 本项目仅供学习交流使用。