
阈界事务所 · Backend
一个用于记录、归档和探索异常事件的微服务平台
项目简介
阈界事务所(YJSWS)是一个社区驱动的平台,用于收集、整理和探索各类异常与未解事件的记录。本仓库为项目后端,基于 Spring Boot 3 / Spring Cloud 微服务架构,提供用户认证、档案管理、评论互动、图片上传等核心能力。
核心功能
- 用户体系 — 手机号 + 密码注册、微信小程序登录、个人资料管理、收藏与浏览历史追踪
- 档案管理 — 丰富的档案 CRUD,支持结构化元数据(时间线、人物关系图、证据链、参考链接、标签)
- 评论系统 — 档案评论,通过服务间调用丰富用户信息
- 图片上传 — 基于 Cloudflare R2 对象存储,通过 AWS S3 SDK 访问
- 新闻模块 — 异常事件新闻,支持草稿/发布/下线生命周期(基础设施已就绪,服务开发中)
- API 网关 — 统一 JWT 鉴权、路由级访问控制、CORS 处理
- 服务发现与配置 — 基于 Nacos 的服务注册发现和集中配置管理
系统架构
┌─────────────┐
│ 客户端 │
└──────┬──────┘
│
┌──────▼──────┐
│ 网关 │ :10891
│ JWT 鉴权 │
└──────┬──────┘
│
┌────────────────┼────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌───────▼─────┐
│ 认证服务 │ │ 用户服务 │ │ 档案服务 │
│ Auth │ │User Service │ │ Archive │
│ :10890 │ │ :10889 │ │ :10888 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└────────────────┼────────────────┘
│
┌──────────▼──────────┐
│ Nacos │
│ 服务发现 + 配置中心 │
│ :8848 │
└─────────────────────┘
请求认证流程
- 所有请求经由 Gateway 网关,
AuthGlobalFilter校验 JWTAuthorization请求头 - 白名单路径(登录、注册、公开读取)免认证放行
- JWT 校验通过后,网关提取
userId并注入X-User-Id请求头 - 下游服务通过
UserInterceptor→UserContext(ThreadLocal<Long>)获取当前用户
服务间通信
服务间通过 OpenFeign 进行 RPC 调用,客户端接口定义在 api 模块中:
| Feign 客户端 | 目标服务 | 主要操作 |
|---|---|---|
UserClient |
user-service | 用户查询、保存、资料、计数更新 |
ArchiveClient |
archive-service | 档案列表、批量查询、计数更新 |
NewsClient |
news-service | 新闻列表、批量查询 |
模块说明
| 模块 | 类型 | 端口 | 说明 |
|---|---|---|---|
gateway |
服务 | 10891 | Spring Cloud Gateway(响应式),JWT 鉴权过滤器,路由管理 |
auth |
服务 | 10890 | 手机号 + 密码登录、微信小程序登录、JWT 签发 |
user-service |
服务 | 10889 | 用户 CRUD、个人资料、收藏、浏览历史、意见反馈 |
archive-service |
服务 | 10888 | 档案 CRUD、评论、图片上传至 Cloudflare R2 |
news-service |
服务 | 10887 | 异常事件新闻(规划中,基础设施已就绪) |
common |
公共库 | — | 共享领域对象、枚举、拦截器、全局异常处理、工具类 |
api |
公共库 | — | OpenFeign 客户端接口,用于服务间通信 |
技术栈
| 层级 | 技术 | 版本 |
|---|---|---|
| 编程语言 | Java | 17 |
| 基础框架 | Spring Boot | 3.2.4 |
| 微服务 | Spring Cloud / Spring Cloud Alibaba | 2023.0.1 |
| 网关 | Spring Cloud Gateway(WebFlux) | — |
| 注册中心 & 配置中心 | Nacos | 2.3.0 |
| 服务调用 | OpenFeign | — |
| ORM | MyBatis-Plus | 3.5.9 |
| 数据库 | PostgreSQL(PostGIS) | 13-3.5 |
| 缓存 | Redis | — |
| 认证 | JWT(jjwt)+ BCrypt | 0.12.6 |
| 对象存储 | Cloudflare R2(AWS S3 SDK) | 2.25.60 |
| 接口文档 | SpringDoc OpenAPI | 2.5.0 |
| 工具库 | Hutool、Lombok | 5.8.32 |
| 微信 | 小程序(jscode2session) | — |
| 构建工具 | Maven(wrapper) | 3.9.16 |
| 容器化 | Docker + Docker Compose | — |
快速开始
环境要求
- Java 17+(推荐 Eclipse Temurin)
- Maven 3.9+(或使用项目内置的 Maven Wrapper
./mvnw) - PostgreSQL 13+(需启用 PostGIS 扩展)
- Redis
- Nacos 2.3.0(单机模式)
构建
# 构建所有模块
./mvnw package -DskipTests
# 构建单个模块
./mvnw package -DskipTests -pl archive-service
运行测试
# 运行全部测试
./mvnw test
# 运行单个模块测试
./mvnw test -pl archive-service -Dtest=StorageServiceImplTest
启动服务
构建完成后可逐个启动:
java -jar gateway/target/gateway-0.0.1-SNAPSHOT.jar
java -jar auth/target/auth-0.0.1-SNAPSHOT.jar
java -jar user-service/target/user-service-0.0.1-SNAPSHOT.jar
java -jar archive-service/target/archive-service-0.0.1-SNAPSHOT.jar
环境配置
| Profile | 说明 |
|---|---|
prod |
默认生产环境 |
dev |
开发环境(Nacos 地址 192.168.2.115:8848) |
local |
本地开发环境 |
通过 -Dspring.profiles.active=dev 切换,或直接编辑各服务的 bootstrap.yml。
Docker 部署
Docker Compose 一键启动
项目内置 dockercompose.yml,可一键拉起完整基础设施:
# 先构建所有模块
./mvnw package -DskipTests
# 启动所有服务
docker compose -f dockercompose.yml up -d
启动的容器:
| 容器名 | 镜像 | 端口映射 |
|---|---|---|
lia-gateway |
自定义(eclipse-temurin:17-jre) | 8080 → 10891 |
lia-auth |
自定义 | 内部访问 |
lia-user |
自定义 | 内部访问 |
lia-archive |
自定义 | 内部访问 |
| PostgreSQL | postgis/postgis:13-3.5 |
5432 |
| Nacos | nacos/nacos-server:v2.3.0 |
8848、9848 |
所有服务运行在 lia-net 桥接网络中,JVM 参数为 -Xms256m -Xmx512m。
构建单个服务的 Docker 镜像
docker build --build-arg MODULE=archive-service -t yjsws-archive .
配置管理
配置集中托管在 Nacos 中,各服务的 bootstrap.yml 声明需要拉取的共享配置:
| Nacos 配置文件 | 用途 | 使用方 |
|---|---|---|
shared-spring.yaml |
数据源 URL 模板(${lia.jdbc.database}) |
所有服务 |
shared-mybatis.yaml |
MyBatis-Plus 配置 | auth、user-service、archive-service |
shared-redis.yaml |
Redis 连接配置 | user-service、archive-service |
shared-logs.yaml |
日志配置 | auth、user-service、archive-service |
shared-feign.yaml |
Feign 超时 / 重试配置 | archive-service |
shared-jwt.yaml |
JWT 密钥与过期时间 | gateway、auth、archive-service |
spec-cloudflare-r2.yaml |
R2 存储凭证 | archive-service |
spec-wechat-auth.yaml |
微信小程序凭证 | auth |
各服务通过 lia.jdbc.database 设置自己的数据库名(如 lia_archive、lia_user、lia_auth)。
API 概览
所有接口统一返回 Result<T> 格式:
{
"code": 200,
"message": "success",
"data": { ... }
}
分页接口返回 PageResult<T>:
{
"code": 200,
"message": "success",
"data": {
"list": [ ... ],
"total": 42
}
}
网关路由
| 路径模式 | 目标服务 |
|---|---|
/auth/** |
auth(认证服务) |
/user/** |
user-service(用户服务) |
/archives/** |
archive-service(档案服务) |
/upload/** |
archive-service(档案服务) |
/news/** |
news-service(新闻服务) |
主要接口
认证(/auth)
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /auth/user/register |
手机号 + 密码 + 昵称注册 |
| POST | /auth/user/login |
手机号 + 密码登录,返回 JWT |
| POST | /auth/user/wechat-login |
微信小程序登录 |
档案(/archives)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /archives |
分页获取档案列表 |
| GET | /archives/search |
搜索档案 |
| GET | /archives/{id} |
档案详情 |
| GET | /archives/stats |
平台统计数据 |
| POST | /archives |
创建档案(需登录) |
| PATCH | /archives/{id} |
编辑档案(需登录) |
| DELETE | /archives/{id} |
删除档案(需登录) |
| GET | /archives/{id}/comments |
获取评论列表 |
| POST | /archives/{id}/comments |
发表评论(需登录) |
用户(/user)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /user/profile |
获取当前用户资料 |
| PATCH | /user/profile |
更新个人资料 |
| POST | /user/collects |
收藏 / 取消收藏 |
| GET | /user/collects |
我的收藏列表 |
| POST | /user/advice |
提交意见反馈 |
| GET | /user/advice |
反馈列表 |
上传(/upload)
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /upload/image |
上传图片至 Cloudflare R2(最大 1MB) |
完整 API 文档请参阅
doc/API.md。各服务同时提供 SpringDoc OpenAPI 在线文档,访问/swagger-ui.html。
项目结构
yjsws_backend/
├── api/ # OpenFeign 客户端接口
│ └── src/main/java/
│ └── asia.liminality.api.client/
│ ├── ArchiveClient.java
│ ├── UserClient.java
│ └── NewsClient.java
├── archive-service/ # 档案服务:CRUD、评论、R2 上传
│ └── src/main/java/
│ └── asia.liminality.archive/
│ ├── config/ # R2Config、OpenApiConfig、MybatisPlusConfig
│ ├── controller/ # ArchiveController、CommentController、UploadController
│ ├── domain/ # DTO、VO、PO
│ ├── mapper/ # ArchiveMapper、CommentMapper
│ └── service/ # IArchiveService、ICommentService、StorageService
├── auth/ # 认证服务:登录与 JWT 签发
│ └── src/main/java/
│ └── asia.liminality.auth/
│ ├── config/ # SecurityConfig、WechatMiniappProperties
│ ├── controller/ # AuthController
│ ├── entity/ # DTO、VO
│ ├── service/ # AuthService
│ └── util/ # JwtUtil
├── common/ # 公共库
│ └── src/main/java/
│ └── asia.liminality.common/
│ ├── config/ # WebConfig、MybatisPlusConfig
│ ├── constant/ # InterceptorsConstants、ArchiveConstants
│ ├── context/ # UserContext(ThreadLocal)
│ ├── domain/ # 共享 PO、DTO、VO、枚举
│ ├── exceptionHandler/ # GlobalExceptionHandler
│ ├── interceptor/ # UserInterceptor
│ └── utils/ # AuthUtils
├── gateway/ # API 网关
│ └── src/main/java/
│ └── asia.liminality.gateway/
│ ├── filter/ # AuthGlobalFilter
│ └── util/ # JwtUtil
├── user-service/ # 用户服务
│ └── src/main/java/
│ └── asia.liminality.user/
│ ├── config/ # OpenApiConfig
│ ├── controller/ # UserController、UserCollectController 等
│ ├── domain/ # DTO、VO、PO
│ ├── mapper/ # UserMapper、UserCollectMapper 等
│ └── service/ # IUserService、IAdviceService 等
├── doc/ # 文档
│ ├── API.md # 完整 API 参考
│ └── ROADMAP.md # 功能路线图
├── dockercompose.yml # Docker Compose 编排
├── Dockerfile # 多服务 Docker 镜像
└── pom.xml # 父 POM(聚合器)
数据库表结构
| 表名 | 所属服务 | 说明 |
|---|---|---|
tb_user |
user-service | 用户表(手机号、密码、openid、昵称、头像、性别、等级) |
tb_archive |
archive-service | 档案表,含丰富的 JSONB 字段(时间线、人物关系、证据链、标签、参考链接) |
tb_comment |
archive-service | 档案评论表 |
tb_user_collect |
user-service | 用户收藏关联表 |
tb_user_archive_view |
user-service | 用户浏览历史表 |
tb_advice |
user-service | 用户意见反馈表(软删除) |
tb_news |
news-service | 新闻表(已准备,尚未部署) |
认证与授权
- JWT 认证:由
auth服务签发 Token,gateway网关统一校验 - 密码加密:使用
BCryptPasswordEncoder进行哈希存储 - 微信登录:小程序
jscode2session流程,支持自动注册 - 访问控制:
AuthGlobalFilter中配置路由级白名单- 免认证(公开):登录、注册、微信登录、档案统计、搜索、公开读取(GET)
- 需认证:所有写操作、个人资料访问
路线图
进行中
- 更精细的档案筛选过滤
- 后端缓存优化
- 游标分页(修复无限滚动重复问题)
- 举报功能
- 等级 / 经验系统
- 分享功能
- 外部来源链接展示 & Bilibili 视频嵌入
规划中
- 有声书支持(档案超过 1000 字自动生成)
- 地图页面(在地图上查看历史异常事件)
- 社交动态 / 时间线
- 多级嵌套评论与回复通知
- 关注用户间私信
- 专题案件页面(一个案件关联多份档案)
- 用户投稿异常视频专区
- 侦探专区(协作破解悬案)
- AI 驱动的全球案件趋势分析
完整路线图请参阅
doc/ROADMAP.md。
待办事项
- 统一
auth与gateway的 JWT 密钥至 Nacos(shared-jwt.yaml) - 集成 Sentinel 实现限流 / 熔断
- 将 OpenFeign 迁移至 Dubbo
- 修复批量查询性能问题
- 解耦
Controller/Service返回值与Result的耦合 - 优化 CORS 配置
- 解耦
auth对user-service的直接 Maven 依赖 - 实现
news-service模块
许可证
本项目为私有项目,保留所有权利。
评论
正在加载评论…