================================================================================
                        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
================================================================================
