Skip to content

JohnvenTom/lost-found-system

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 

Repository files navigation

校园失物招领管理系统

Campus Lost & Found Management System
基于 Spring Boot 3 + Vue 3 的前后端分离校园失物招领平台,集成 AI 智能分类与内容安全审核

Java Spring Boot Vue3 MySQL Redis Docker 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)   │
                    └───────────────────────────────┘

请求处理流程

  1. 前端发起 Axios 请求 → Vite Proxy 代理转发至后端
  2. AuthInterceptor 拦截请求,校验 JWT Token(白名单路径除外)
  3. Controller 接收请求,@Validated 参数校验
  4. Service 执行业务逻辑,必要时调用 AI 服务
  5. DAO 通过 MyBatis 操作数据库
  6. GlobalExceptionHandler 统一异常封装为 Result<T> 格式返回

功能模块

1. 用户模块 (/user)

  • 用户注册(用户名唯一性校验)
  • 用户登录(JWT Token 签发)
  • 个人信息查看与修改
  • 角色权限:普通用户(0) / 管理员(1)

2. 失物招领模块 (/item)

  • 失物发布:捡到物品的信息登记(含图片上传、地点、时间)
  • 寻物启事:丢失物品的求助信息发布
  • 物品列表浏览:支持分类筛选、关键词搜索、分页加载
  • 物品详情查看:展示完整信息及认领入口
  • 我的物品管理:查看个人发布的所有物品

3. 分类管理模块 (/category)

  • 系统预设 8 大物品分类(证件卡类、钥匙钱包、电子产品、书籍文具、衣物配饰、水杯雨伞、玩具、其他)
  • 管理员可自定义新增/编辑/删除分类
  • 分类排序支持

4. 认领模块 (/claim)

  • 在线提交认领申请(填写认领理由/证明材料 + 联系方式)
  • 我的认领记录查询
  • 管理员审核认领请求(通过/拒绝 + 备注说明)
  • 物品状态流转:待审核 → 已通过 → 已认领

5. 留言互动模块 (/message)

  • 物品详情页留言讨论
  • 支持嵌套回复(parent_id 关联父留言)

6. 公告模块 (/announcement)

  • 管理员发布系统公告
  • 公告置顶、草稿/已发布状态管理
  • 公告列表与详情查看

7. AI 智能模块 (/ai)

  • AI 自动分类:根据物品标题和描述智能匹配系统分类
  • AI 内容安全审核:自动检测内容是否包含违禁词或敏感信息

8. 文件上传模块 (/upload)

  • 物品图片上传(支持多图,逗号分隔 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

ER 关系图

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)

表结构详情

t_user — 用户表

字段 类型 约束 说明
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 更新时间

t_category — 分类表

字段 类型 约束 说明
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 更新时间

t_item — 物品表(核心业务表)

字段 类型 约束 说明
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 更新时间

t_claim — 认领表

字段 类型 约束 说明
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 更新时间

t_message — 留言表

字段 类型 约束 说明
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 更新时间

t_announcement — 公告表

字段 类型 约束 说明
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

Docker 部署

方式一:Docker Compose(推荐)

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

方式二:手动 docker run

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

API 接口文档

基础路径:http://localhost:8088/api

统一响应格式

{
  "code": 200,
  "message": "操作成功",
  "data": { ... }
}
code 含义
200 成功
400 参数校验失败
401 未登录 / Token 过期
403 无权限
500 服务器内部错误

接口清单

用户模块 /user

方法 路径 说明 认证 请求体
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: { ... } }

物品模块 /item

方法 路径 说明 认证 请求体
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}

分类模块 /category

方法 路径 说明 认证
GET /category/list 分类列表
GET /category/detail/{id} 分类详情
POST /category/add 新增分类 ✅(管理员)
PUT /category/update 编辑分类 ✅(管理员)
DELETE /category/delete/{id} 删除分类 ✅(管理员)

认领模块 /claim

方法 路径 说明 认证 请求体
POST /claim/apply 提交认领申请 {itemId, reason, contactInfo}
GET /claim/my 我的认领记录 ?pageNum=&pageSize=
GET /claim/item/{itemId} 物品的认领列表 ✅(管理员)
PUT /claim/review/{id} 管理员审核认领 ✅(管理员) {status, reviewRemark}

留言模块 /message

方法 路径 说明 认证 请求体
POST /message/send 发送留言 {itemId, content, parentId?}
GET /message/list/{itemId} 物品留言列表
DELETE /message/delete/{id} 删除留言

公告模块 /announcement

方法 路径 说明 认证
GET /announcement/list 公告列表
GET /announcement/detail/{id} 公告详情
POST /announcement/publish 发布公告 ✅(管理员)
PUT /announcement/update 编辑公告 ✅(管理员)
DELETE /announcement/delete/{id} 删除公告 ✅(管理员)

AI 模块 /ai

方法 路径 说明 认证 参数
GET /ai/classify AI 智能分类 ?title=&description=
GET /ai/moderate AI 内容审核 ?title=&description=

上传模块 /upload

方法 路径 说明 认证 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> 进行鉴权。


AI 智能功能

系统集成 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.ymlspring.profiles.active 或通过 JVM 参数覆盖:

java -jar app.jar --spring.profiles.active=prod

核心配置项一览

服务配置 (application.yml)

配置项 默认值 说明
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: 本项目仅供学习交流使用。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors