独立的 115 直链代理服务,与 OneFive 解耦的飞牛 OS 应用
把 OneFive 内嵌的 115 直链服务(p115nano302)独立成单独的飞牛应用,解决:
- CPU 飙升:OneFive 主进程的整理任务与直链服务共享 GIL,导致 Emby 拉直链时整机 CPU 拉满
- Cookie 风控:直链服务用独立小号,与 OneFive 整理主号隔离
- 崩溃域:直链服务挂掉不影响 OneFive,反之亦然
- 升级耦合:p115nano302 升级只重启 LinkJet
┌─────────────────────────────────────────────────┐
│ 飞牛 OS 容器 │
│ │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │ OneFive │ │ LinkJet (本项目) │ │
│ │ 整理/通知 │ │ FastAPI 管理面 │ │
│ │ │ │ + p115nano302 ASGI │ │
│ │ 独立 cookie │ │ 独立 cookie (小号) │ │
│ └──────────────┘ └──────────────────────┘ │
└─────────────────────────────────────────────────┘
↑ ↑
└────── 飞牛网关 ───────┘
↓
Emby / 播放器
- FastAPI:管理面 Web 框架
- p115nano302:直链 302 ASGI 应用核心
- p115qrcode:115 扫码登录(库函数复用)
- aiosqlite:真异步 SQLite(修 OneFive 同步阻塞事件循环的 bug)
- uvicorn:ASGI 服务器
- Vue 3 + TypeScript:Composition API
- Pinia:状态管理
- vue-router:单页路由
- Chart.js + vue-chartjs:实时请求量折线图
- lucide-vue-next:图标
- Cormorant + Montserrat + JetBrains Mono:字体
- 纯暗色模式(dev tool 推荐 Dark Mode OLED)
- Bento Box Grid 布局(避开 OneFive 侧边栏布局)
- 局部液态玻璃(避开 OneFive 玻璃全场景滥用)
- 仅交互态内凹(保留 neumorphic 偏好但不滥用)
详见 design-system/linkjet/pages/dashboard.md
LinkJet/
├── backend/
│ ├── pyproject.toml # 5 个核心依赖
│ ├── run.py # Nuitka 打包入口
│ └── src/linkjet/
│ ├── main.py # FastAPI 入口
│ ├── paths.py # 飞牛 TRIM_PKGVAR 感知
│ ├── logger.py # 日志
│ ├── db.py # aiosqlite 单例
│ ├── models.py # 统一 ApiResponse
│ ├── auth/ # 扫码登录 + Cookie 持久化
│ ├── direct_link/ # p115nano302 启停 + L2 异步缓存 + dispatcher
│ └── api/ # 管理面 HTTP 路由
├── frontend/
│ ├── package.json
│ ├── vite.config.ts
│ └── src/
│ ├── main.ts # Vue 入口
│ ├── App.vue
│ ├── router/ # 单页路由
│ ├── stores/ # Pinia (auth, service)
│ ├── api/ # HTTP 客户端
│ ├── composables/ # useToast, usePolling
│ ├── views/Dashboard.vue # Bento 单页
│ ├── components/ # TopBar + 9 张 Bento 卡片
│ └── styles/ # tokens/typography/components
├── design-system/linkjet/ # ui-ux-pro-max 生成的设计规范
└── trim-package.toml # 飞牛 OS 应用清单
cd D:\OneFive\LinkJet\backend
$env:PYTHONPATH = "src"
python -m uvicorn linkjet.main:app --host :: --port 11580 --reloadcd D:\OneFive\LinkJet\frontend
npm install
npm run dev
# 访问 http://localhost:5173/# 前端
cd D:\OneFive\LinkJet\frontend
npm run build # 产物在 frontend/dist/
# 后端(飞牛 Nuitka 打包)
cd D:\OneFive\LinkJet\backend
python -m nuitka --standalone --output-dir=build run.py| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /health | 健康检查 |
| GET | /api/status | 直链服务运行状态 |
| GET | /api/settings | 获取服务配置 |
| POST | /api/settings | 保存配置(enabled/port/allow_lan) |
| POST | /api/start | 启动直链服务 |
| POST | /api/stop | 停止直链服务 |
| GET | /api/auth/status | 115 登录状态 |
| POST | /api/auth/qr/start | 开始扫码登录 |
| GET | /api/auth/qr/status?session_id=xxx | 轮询扫码状态 |
| POST | /api/auth/logout | 退出登录 |
| GET | /api/stats/requests | 请求数统计 |
| GET | /api/stats/cache | 缓存命中率 |
| GET | /api/stats/timeseries | 实时请求量时序数据 |
| GET | /api/logs/recent?limit=20 | 最近请求日志 |
| GET | /api/stats/stream | SSE 实时推送(请求/日志/时序) |
| ANY | /d115/* | 直链 302 重定向(p115nano302) |
| 维度 | OneFive | LinkJet |
|---|---|---|
| 布局 | 260px 侧边栏 + 主内容 | Bento Box Grid 单页 |
| 默认主题 | 亮色 #f5f5f7 | 暗色 #0A0A0B |
| 主色 | 苹果蓝 #0071e3 | 金色 #D4AF37 |
| 标题字体 | SF Pro Display | Cormorant |
| 正文字体 | SF Pro Text | Montserrat |
| 玻璃范围 | 全场景 | 局部(顶栏 + 模态遮罩) |
| 内凹范围 | 全场景 | 仅交互态 |
| 顶栏 | 粘性吸顶全宽 | 浮动悬浮圆角 |
| 弹窗 | 圆形 danger + 底部双按钮 | 右上 X + 横向按钮组 |