Skip to content

qianqi32/emos_web

Repository files navigation

EMOS Web

EMOS 用户自助控制台 — 账号 · 服务 · 媒体 · Serverless

Next.js TypeScript Tailwind CSS pnpm Serverless


✨ 功能特性

模块 说明
网页授权登录 通过 EMOS 官方授权入口登录,回调后自动保存 Token 并进入控制台
Token 登录 支持手动输入 Bearer Token,校验成功后进入用户控制台
用户仪表盘 展示萝卜余额、上传容量、邀请额度、片单卡槽与服务状态
每日签到 在仪表盘提供高频签到入口,签到后自动刷新用户数据
账号信息 查看用户 ID、用户名、笔名、Telegram 绑定、权限与服务字段
账号操作 支持临时密码、修改笔名、重置密码、显示空媒体库、同意上传协议
账号安全 支持临时密码、永久登录密码与视频服登录设备会话管理
服务管理 展示 Video、Live、Music 等服务地址,并提供一键复制
邀请管理 支持邀请信息、邀请历史分页搜索、邀请用户与撤销邀请
媒体库 支持影视列表、直播频道、音乐服务入口、标题搜索、类型筛选、资源状态筛选与无限下拉浏览
媒体详情 支持季集结构、媒体资源、字幕列表、播放地址、移动、重命名与删除等管理操作
上传管理 支持视频与字幕上传、自动匹配、上传队列和保存结果
片单管理 支持片单列表、搜索、创建、编辑、删除、订阅、排序、显示状态与片单详情管理
反代管理 支持反代线路列表、只看自己、添加与删除
求片管理 支持求片列表、筛选、求片/取消求片、认领、催上片、详情与历史查询
商城管理 支持商品浏览、店铺详情、下单、订单查询、萝卜支付、关闭订单、催发货、申请开店、店铺信息更新、分类管理、商品管理、商户订单、发货与备注
支付管理 支持支付订单创建、支付页跳转、订单查询、关闭订单、服务商申请、服务商信息更新与服务商转账
观影历史 支持播放记录分页浏览、电影/剧集筛选、标记完成与删除记录
直播管理 独立直播管理页,支持直播库、直播频道与直播媒体源三层浏览、搜索、复制媒体地址、频道新增/编辑/删除、直播源新增/删除/批量更新与权限错误提示
Trakt 周报 支持 Trakt 设备码授权、历史同步、观影周报、追剧日历与可选 AI 辣评,第三方密钥仅在服务端使用
修仙境界 根据萝卜余额展示当前境界、进度、下一境界与完整境界体系
社区工具 萝卜榜、上传榜、正在看榜、签到榜、萝卜记录、转赠萝卜、红包、抽奖、投票与播放记录工具入口
工具独立页面 红包、抽奖、投票已提供独立路由,支持创建、查询结果/记录和危险操作确认
封禁管理 提供封禁列表与封禁状态修改页面,作为权限敏感管理能力,不进入普通用户主导航
路由化控制台 /user 下按一级功能域组织仪表盘、用户信息、媒体、上传、片单、反代、求片、商城、支付、社区等入口;直播、邀请、历史、境界、工具和管理页面作为对应功能区的二级入口
移动端适配 桌面端侧边栏,移动端使用顶部入口 + 底部抽屉导航
主题系统 支持 Light / Dark / System 明暗模式切换
Serverless Proxy 使用 Next.js Route Handler 代理 EMOS API,适配 Vercel / Cloudflare / EdgeOne Pages

🧭 当前路由

展开查看当前路由
路由 说明 状态
/ 登录页,包含网页授权登录与 Token 登录
/user 用户仪表盘首页
/user/profile 用户信息、账号操作与视频服登录设备管理
/user/media 媒体库列表、影视搜索筛选、直播频道入口、音乐服务入口
/user/media/[id] 媒体详情、季集结构、资源与字幕管理
/user/live 独立直播管理页,支持直播库、频道、媒体源浏览与管理
/user/upload 视频与字幕上传、自动匹配、上传队列和保存结果
/user/watchlist 片单列表、搜索、创建、编辑、删除、订阅、排序与显示状态切换
/user/watchlist/[id] 片单详情、视频列表、添加视频、动态 URL 与批量更新
/user/proxy 反代线路列表、只看自己、添加与删除
/user/seek 求片列表、筛选、求片、认领、催上片、详情与历史
/user/shop 商城中心,支持商品浏览、我的订单、我的店铺、分类管理、商品管理与商户订单
/user/shop/[sellerId] 店铺详情页,支持指定商户商品浏览、商品详情与下单
/user/wallet 支付中心,支持订单创建、支付页跳转、查询、关闭、服务商申请、信息更新与转账
/user/invite 邀请信息、邀请历史搜索、邀请用户与撤销邀请
/user/community 排行榜、萝卜记录与社区工具入口
/user/redpacket 红包工具,支持创建红包与查询领取记录
/user/lottery 抽奖工具,支持创建抽奖、查看中奖列表、取消与停止
/user/vote 投票工具,支持创建投票与查看已结束投票结果
/user/ban 封禁管理,支持封禁列表与状态修改,需管理权限
/user/history 观影历史、电影/剧集筛选、标记完成与删除记录
/user/realm 修仙境界、萝卜进度与境界体系展示
/user/trakt Trakt 设备码授权、历史同步、观影周报、追剧日历与可选 AI 辣评

控制台路由目前采用客户端 Token 恢复与保护。未登录访问 /user 会返回登录页。


🚀 快速开始

环境要求

项目 版本
Node.js 22.x
pnpm 建议 ≥ 10

环境变量

在项目根目录创建 .env

EMOS_API_BASE_URL=https://api.emos.best

本地开发

# 安装依赖
pnpm install

# 启动开发服务器
pnpm dev

# 打开浏览器访问
http://localhost:3000

可用脚本

命令 说明
pnpm dev 启动 Next.js 开发服务器
pnpm build 生产构建
pnpm start 启动生产服务器
pnpm lint ESLint 代码检查,要求 0 warning
pnpm typecheck TypeScript 类型检查

🛠 技术栈

类别 技术
框架 Next.js 16 App Router
语言 TypeScript
样式 Tailwind CSS 3
图标 Lucide React
包管理 pnpm
API 代理 Next.js Route Handlers + 标准 fetch
部署目标 Vercel / Cloudflare Pages / EdgeOne Pages 等 Serverless 平台

📂 项目结构

emos_web/
├── app/
│   ├── page.tsx                    # 登录页
│   ├── layout.tsx                  # 全局布局与主题启动脚本
│   ├── globals.css                 # 全局样式、主题变量、网格背景
│   ├── api/
│   │   ├── emos/[...path]/route.ts # EMOS API Serverless Proxy
│   │   └── trakt/route.ts          # Trakt / AI 周报服务端代理
│   └── user/
│       ├── layout.tsx              # 用户控制台布局
│       ├── page.tsx                # 仪表盘首页
│       ├── profile/page.tsx        # 用户信息、账号操作与视频服登录设备管理
│       ├── media/page.tsx          # 媒体库列表、直播频道、搜索、筛选与无限下拉
│       ├── media/[id]/page.tsx     # 媒体详情、季集结构、资源与字幕管理
│       ├── live/page.tsx           # 独立直播管理页,直播库、频道与媒体源浏览
│       ├── upload/page.tsx         # 视频与字幕上传、自动匹配、上传队列和保存结果
│       ├── watchlist/page.tsx      # 片单列表、创建、编辑、订阅与排序
│       ├── watchlist/[id]/page.tsx # 片单详情、视频管理、动态 URL 与批量更新
│       ├── proxy/page.tsx          # 反代线路列表、只看自己、添加与删除
│       ├── seek/page.tsx           # 求片列表、筛选、认领、催上片与历史
│       ├── shop/page.tsx           # 商城中心,买家与商户管理闭环
│       ├── shop/[sellerId]/page.tsx # 店铺详情、指定商户商品浏览与下单
│       ├── wallet/page.tsx         # 支付中心、订单管理、服务商申请与转账
│       ├── invite/page.tsx         # 邀请管理页
│       ├── community/page.tsx      # 排行榜、萝卜记录与社区工具入口
│       ├── redpacket/page.tsx      # 红包工具独立页
│       ├── lottery/page.tsx        # 抽奖工具独立页
│       ├── vote/page.tsx           # 投票工具独立页
│       ├── ban/page.tsx            # 封禁管理页,需管理权限
│       ├── history/page.tsx        # 观影历史、筛选、标记完成与删除记录
│       ├── realm/page.tsx          # 修仙境界与境界体系展示
│       └── trakt/page.tsx          # Trakt 同步、周报、追剧日历与 AI 辣评
├── components/
│   ├── dashboard/                  # 控制台 Shell、导航、用户中心与仪表盘卡片
│   ├── ui/                         # 玻璃面板、状态徽章、指标卡片等基础组件
│   ├── app-top-bar.tsx             # 顶部品牌区与主题入口
│   ├── landing-view.tsx            # 登录页视图
│   └── theme-toggle.tsx            # 明暗模式切换
├── lib/
│   ├── api/                        # EMOS API 客户端、类型与请求封装
│   ├── auth/session.ts             # Token 本地存储与授权回调解析
│   └── utils.ts                    # 通用工具函数
├── docs/
│   ├── emos_api_6.4.md              # 最新 EMOS API 文档
│   ├── check-cx ui.md               # 当前 UI/UX 设计规范
│   ├── 项目梳理草图.md              # 三项目梳理与开发方向草图
│   └── EMOS Web 功能补齐与治理计划.md # 功能补齐、信息架构与治理计划
├── next.config.ts                  # Next.js 配置
└── package.json

🌐 部署

Docker 部署

项目支持标准 Next.js standalone Docker 镜像,适合部署到自有服务器,避免 Serverless 平台出口 IP 被 EMOS Cloudflare/WAF 拦截。

使用 Docker Hub 镜像(推荐)

docker pull kiyukie/emos-web:latest
docker run -d \
  --name emos-web \
  --restart unless-stopped \
  -p 5791:5791 \
  -e EMOS_API_BASE_URL=https://api.emos.best \
  kiyukie/emos-web:latest

使用 docker-compose

创建 docker-compose.yml

services:
  emos-web:
    image: kiyukie/emos-web:latest
    container_name: emos-web
    restart: unless-stopped
    ports:
      - "5791:5791"
    environment:
      EMOS_API_BASE_URL: https://api.emos.best

启动服务:

docker compose up -d

# 查看日志
docker compose logs -f

# 停止服务
docker compose down

默认监听:

http://服务器 IP:5791

如需反向代理,推荐在 Nginx / Caddy 中将域名转发到本机 127.0.0.1:5791

Vercel

  1. 将仓库推送到 GitHub
  2. Vercel 导入项目
  3. 配置环境变量:EMOS_API_BASE_URL=https://api.emos.best
  4. 部署

Cloudflare Pages / EdgeOne Pages

  1. 将仓库连接到 Pages 平台
  2. 构建命令设置为:
pnpm build
  1. 环境变量配置:
EMOS_API_BASE_URL=https://api.emos.best
  1. 根据目标平台的 Next.js 适配要求配置输出方式

🔌 已接入 API

展开查看已接入接口清单
模块 接口
登录校验 GET /api/sign/check
用户基础 GET /api/userPUT /api/user/signGET /api/user/passwordTemporaryPUT /api/user/pseudonymPUT /api/user/showEmptyPUT /api/user/passwordResetPUT /api/user/agreeUploadAgreement
视频服设备 GET /api/user/server/videoHistoryPOST /api/user/server/videoLogout
邀请 POST /api/invitePOST /api/invite/empsGET /api/invite/infoGET /api/invite/historyPOST /api/invite/revoke
视频 PATCH /api/video/syncGET /api/video/treeGET /api/video/getVideoIdGET /api/video/listGET /api/video/searchPUT /api/video/{video_id}/deleteGET /api/video/{video_id}/seasonGET /api/video/{video_id}/episodeGET /api/video/persons
媒体资源 GET /api/video/media/listDELETE /api/video/media/deletePUT /api/video/media/movePUT /api/video/media/renameGET /api/video/media/playUrl
字幕 GET /api/video/subtitle/listDELETE /api/video/subtitle/deletePUT /api/video/subtitle/rename
上传 POST /api/upload/getUploadTokenGET /api/upload/video/basePOST /api/upload/video/savePOST /api/upload/subtitle/save
片单 POST /api/watch/slotGET /api/watchPOST /api/watchPUT /api/watch/{watch_id}/maintainerDELETE /api/watch/{watch_id}PUT /api/watch/{watch_id}/sortPUT /api/watch/{watch_id}/showGET /api/watch/{watch_id}/userPUT /api/watch/{watch_id}/subscribeGET /api/watch/{watch_id}/videoGET /api/watch/{watch_id}/video/searchPOST /api/watch/{watch_id}/video/{video_id}DELETE /api/watch/{watch_id}/video/{video_id}DELETE /api/watch/{watch_id}/video/emptyPUT /api/watch/{watch_id}/dynamicPOST /api/watch/{watch_id}/video/update
反代线路 GET /api/proxy/linePOST /api/proxy/lineDELETE /api/proxy/line
求片 POST /api/seekGET /api/seek/pollPUT /api/seek/applyGET /api/seek/queryGET /api/seek/historyPUT /api/seek/claimPUT /api/seek/urge
排行榜 GET /api/rank/carrotGET /api/rank/uploadGET /api/rank/userVideoRecordPlayingGET /api/rank/sign
萝卜 GET /api/carrot/historyPUT /api/carrot/transfer
红包 POST /api/redPacket/createGET /api/redPacket/receive
抽奖 POST /api/lottery/createGET /api/lottery/winPUT /api/lottery/cancelPUT /api/lottery/stop
投票 POST /api/telegram/vote/createGET /api/telegram/vote/result
直播 GET /api/live/libraryGET /api/live/listPOST /api/live/listDELETE /api/live/list/{live_list_id}GET /api/live/mediaPOST /api/live/mediaDELETE /api/live/media/{live_media_id}POST /api/live/media/update
商城 GET /api/shop/seller/basePOST /api/shop/seller/applyPOST /api/shop/seller/updateGET /api/shop/category/listPOST /api/shop/category/createDELETE /api/shop/category/deletePUT /api/shop/category/sortGET /api/shop/product/listGET /api/shop/product/infoPOST /api/shop/product/createOrUpdateDELETE /api/shop/product/deletePUT /api/shop/product/sortPUT /api/shop/product/categoryPUT /api/shop/product/upPOST /api/shop/order/user/createPOST /api/shop/order/user/payGET /api/shop/order/user/listPUT /api/shop/order/user/urgePOST /api/shop/order/user/closeDELETE /api/shop/order/user/orderGET /api/shop/order/shop/orderDELETE /api/shop/order/shop/orderPUT /api/shop/order/shop/deliveryPOST /api/shop/order/shop/remark
支付 POST /api/pay/applyGET /api/pay/basePOST /api/pay/updatePOST /api/pay/transferPOST /api/pay/createGET /api/pay/queryPUT /api/pay/close
封禁 GET /api/ban/listPUT /api/ban/change
观影记录 GET /api/video/record/listPUT /api/video/record/change

所有 EMOS 请求通过本项目的 /api/emos/[...path] 代理到 EMOS_API_BASE_URL。分页响应统一读取文档约定的 items / total / page / page_size

第三方能力通过独立服务端代理处理:/api/trakt 负责 Trakt 设备码授权、token refresh、历史同步、周报、追剧日历和可选 AI 辣评,Trakt Client Secret 与 AI API Key 不暴露给客户端。


📜 许可证

MIT License

About

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages