================================================================================ LionWebsite 项目总结 ================================================================================ 一、项目概况 ────────────────────────────────────────────────────────────────────────────── 名称: LionWebsite 技术栈: Spring Boot 3.3.2, Java 21, Maven, SQLite, MyBatis, Netty 定位: 个人/私有 Web 应用,兼具 E-Hentai 画廊下载管理、个人文件服务、 代理订阅管理等功能。 运行端口: 8888 数据库: 双 SQLite 数据库 — LionWebsite.db (主库) + cache.db (缓存库) 构建目标: 支持 GraalVM Native Image (AOT 编译) 二、项目结构 ────────────────────────────────────────────────────────────────────────────── src/main/java/com/lion/lionwebsite/ ├── LionWebsiteApplication.java 主启动类 (@EnableScheduling, 双数据源 MapperScan) │ ├── Configuration/ │ ├── SqlConfiguration.java 双数据源 (main + cache) SQLite 配置 │ ├── MyBatisNativeConfiguration.java GraalVM Native 适配 (AOT hints) │ ├── WebsocketConfiguration.java WebSocket 注册 (/ws/) │ ├── InterceptorConfiguration.java 拦截器链注册 │ ├── CorsConfig.java CORS 全开放 │ └── CustomBean.java Telegram Bot Bean + Native 反射注册 │ ├── Controller/ │ ├── GalleryManageController.java 画廊任务 CRUD、收藏、图片在线缓存 /GalleryManage │ ├── QueryController.java E-Hentai 搜索代理 /query │ ├── PublicController.java 根路由、IP、订阅、文件分享、验证 /、/ip、/sub/、/GetFile/、/validate │ ├── PersonalController.java 个人文件管理 /personal/ │ ├── SubController.java 订阅绑定管理 /personal/subBind/ │ └── UserController.java 用户管理 /personal/user │ ├── Service/ │ ├── GalleryManageService.java 核心画廊管理 (任务创建/查询/删除/图片缓存/在线图片) │ ├── RemoteService.java Netty TCP 客户端连接远程存储节点 (5.255.110.45:26321+) │ ├── WebSocketService.java WebSocket 推送下载进度给前端 │ ├── PushService.java Telegram Bot 通知 (admin 告警) │ ├── QueryService.java E-Hentai 搜索 + 缩略图代理缓存 (转 AVIF) │ ├── LocalServiceImpl.java 定时任务 (连接检测/额度重置/Cookie验证/订阅更新/缩略图清理) │ ├── PublicServiceImpl.java IP 记录、分享码文件获取、授权码修改 │ ├── PersonalServiceImpl.java 文件管理 (浏览/上传/下载/分享/压缩/删除/TAR打包) │ ├── SubService.java 代理订阅绑定/重置/查询/更新记录 │ ├── CollectService.java 画廊收藏/取消收藏 │ └── UserServiceImpl.java 用户 CRUD + 授权码管理 │ ├── Dao/ │ ├── normal/ 主库 Mapper │ │ ├── GalleryMapper.java gallery 表 CRUD │ │ ├── UserMapper.java user 表 CRUD │ │ ├── CollectMapper.java collect 表 CRUD │ │ ├── ShareFileMapper.java ShareFile 表 CRUD │ │ ├── CustomConfigurationMapper.java 配置键值对读写 │ │ └── SubMapper.java 订阅绑定 & 更新记录 │ └── cache/ 缓存库 Mapper │ └── ImageCacheMapper.java 图片 key 缓存 (gidToKey + ImageKeyCache) │ ├── Domain/ 实体类 (Lombok @Data) │ ├── Gallery.java 画廊 (gid, name, link, pages, status, resolution, ...) │ ├── GalleryForQuery.java 搜索结果的画廊精简信息 │ ├── GalleryTask.java 下载任务状态 (下载中/下载完成/压缩中/压缩完成) │ ├── User.java 用户 (id, AuthCode, username, isEnable) │ ├── GidToKey.java 画廊 GID → MPV Key 映射 │ ├── ImageKeyCache.java 图片 key 缓存 (gid, page, imgkey) │ ├── CustomConfiguration.java 配置键常量定义 │ ├── ShareFile.java 文件分享 (ShareCode, FilePath, ExpireTime) │ ├── SubBind.java 订阅绑定 (key, user) │ ├── SubUpdateRecord.java 订阅更新记录 (ip, UA, time, location) │ └── PageNameCache.java 页面名缓存 (gid, page, pageName) │ ├── Message/ 自定义 TCP 消息协议 (Netty) │ ├── AbstractMessage.java 消息基类 (定义了 7 种消息类型常量) │ ├── MessageCodec.java Netty ByteToMessageCodec 编解码器 │ ├── DownloadPostMessage.java 下发下载任务 │ ├── DownloadStatusMessage.java 下载进度状态上报 │ ├── ResponseMessage.java 通用响应 │ ├── DeleteGalleryMessage.java 删除画廊指令 │ ├── IdentityMessage.java 身份认证 │ ├── MaintainMessage.java 维护/心跳消息 │ └── AvailableCheckMessage.java 可用性检测 │ ├── Interceptor/ │ ├── TaskHandlerInterceptor.java 验证 AuthCode 是否有效 (用于 /GalleryManage, /validate) │ ├── PersonalInterceptor.java 限制 /personal/**, /remote/** 仅 AuthCode="alone" │ └── HumanInterceptor.java 拦截无 User-Agent 的请求 (机器人防护) │ ├── Filter/ │ ├── AdaptorFilter.java UA 检测: 移动端重定向到 /mobile, 桌面端放行; 日志记录 │ └── AccessFilter.java 更新用户最后访问时间 (/validate 接口) │ ├── Util/ │ ├── Response.java 通用 JSON 响应封装 ({result, data}) │ ├── CustomUtil.java 工具类 (文件大小格式化/时间/空闲端口/404) │ ├── GalleryUtil.java E-Hentai 网页解析/图片下载/MPV key 管理/图片格式转换 │ └── FileDownload.java 支持断点续传的文件下载工具 (Range) │ ├── Error/ │ └── ErrorCode.java 错误码常量 (IO_ERROR=1, FILE_NOT_FOUND=2, COMPRESS_ERROR=3) │ └── Exception/ └── ResolutionNotMatchException.java 分辨率不匹配异常 三、核心功能模块 ────────────────────────────────────────────────────────────────────────────── 1. E-Hentai 画廊下载管理 - 用户通过 AuthCode 提交 E-Hentai 画廊链接,指定目标分辨率 - GalleryUtil 解析页面 (Jsoup) 获取: 名称/语言/页数/文件大小/可选分辨率 - 通过 Netty TCP 将下载任务发往远程存储节点 (RemoteService) - RemoteService 维护与存储节点的长连接 (自动重连+端口探测) - 存储节点实时回传下载进度 (DownloadStatusMessage),通过 WebSocket 推送给前端 - 支持图片在线预览: 缓存 MPV key → 按需下载单页 → 转为 AVIF 格式 - 画廊收藏/取消收藏 2. 个人文件服务 - 文件浏览器: 按路径浏览文件/文件夹,显示大小、分享状态 - 上传: MultipartFile 上传到指定路径 - 下载: 支持 HTTP Range 断点续传 - 分享: 生成 8 位随机分享码,设置过期时间,可延长/取消 - 压缩: 异步 TAR 打包目录 - 删除文件/文件夹 3. E-Hentai 搜索代理 - 代理搜索 exhentai.org,返回格式化结果 (含缩略图 URL) - 缩略图代理: 下载 → ImageMagick 转 AVIF → 本地缓存 → 返回 4. 代理订阅管理 - 定时从外部链接拉取 V2Ray/Clash 订阅配置 - 过滤高倍率节点 (流量倍率 > 2) - 为每个用户生成唯一订阅 Key,记录更新 IP/UA/时间/位置 5. Telegram 通知 - 通过 Telegram Bot 向 admin 推送: 任务提交/完成/失败、存储节点上下线、 Cookie 过期、订阅异常等 四、定时任务 (@Scheduled) ────────────────────────────────────────────────────────────────────────────── - 每 30 分钟: 检测存储节点连接,断开则自动重连 - 每周一 4:00: 重置每周下载额度 - 每天 0:00: 验证 E-Hentai Cookie 有效性 - 每天 4:00: 清理过期分享码 - 每 24 小时: 更新代理订阅配置文件 - 每周一 4:00: 清理缩略图缓存 (保留最近 10000 个) 五、安全机制 ────────────────────────────────────────────────────────────────────────────── - 所有管理接口需 AuthCode 参数 (TaskHandlerInterceptor 校验) - /personal 和 /remote 路径限 AuthCode="alone" 用户 - HumanInterceptor 拒绝无 User-Agent 请求 - AdaptorFilter 记录所有请求日志 (IP/路径/UA/时间) - 分享码失败黑名单 (连续失败则屏蔽) 六、依赖 ────────────────────────────────────────────────────────────────────────────── spring-boot-starter-web, spring-boot-starter-websocket, mybatis-spring-boot-starter jsoup (HTML 解析), hutool-all (工具集), sqlite-jdbc (数据库) httpclient + httpmime (HTTP 请求), commons-compress (TAR 打包) commons-io, commons-lang3, netty-all (TCP 通信) java-telegram-bot-api (Telegram Bot), graalvm native-maven-plugin (AOT) ================================================================================ End of Summary ================================================================================