# 傻瓜比价 · 运营后台(前端) Next.js 15 + Ant Design 5,对接 `shaguabijia-app-server` 的 admin API(`app/admin/`)。 后端是独立 FastAPI app(端口 8771,复用 app-server 的 models/repositories + 同一 PostgreSQL, 鉴权用独立 JWT)。本仓只是前端。 ## 功能模块 侧边栏 `MENU`(`src/app/(main)/layout.tsx`)共 12 个模块,均已上线: - **数据大盘**(`/dashboard`)— 核心经营指标概览。 - **用户管理**(`/users`)— 列表(多条件筛选+服务端排序)+ 360 详情;封禁/解封、调金币、调现金;运营开关:开启新手引导(标记用户重看一次,看完自动恢复)、开/关调试链接(trace 排障)、以及上述操作的批量勾选执行。 - **设备管理**(`/devices`)— 按硬件 ANDROID_ID 聚合走过新手引导的设备;可单设备或全量「重设新手引导」。 - **提现管理**(`/withdraws`)— 提现单审核(通过即发起微信打款 / 拒绝退回余额)、查单刷新、批量通过/拒绝/刷新、批量对账,含微信配置健康检查 + 现金账本校验。 - **上报审核**(`/price-reports`)— 用户上报「某平台更低价」+ 截图,人工核实;通过发放 1000 金币、拒绝需填理由(用户端轮询看到结果)。 - **比价记录**(`/comparison-records`)— 比价过程明细(逐平台结局/卡在哪一步、LLM 调用明细、trace);支持按页面输入的 LLM 单价做 token / 成本估算(纯前端,见 `calcCost` / `pricePerMTok`)。 - **反馈工单**(`/feedbacks`)— 用户反馈审核闭环:采纳发金币 / 拒绝填用户可见原因(`FeedbackHandleDrawer`),并含反馈二维码配置。 - **广告管理**(`/ad-revenue`)— 穿山甲广告配置(应用ID/各场景广告位ID/验签密钥/开关)+ 收益报表(展示/预估收益 与 应发/实发金币逐组对账)。 - **CPS 分发**(`/cps`)— 优惠券分发与对账(美团/淘宝/京东);单页 Tabs:对账统计 / 群管理 / 活动管理 / 订单明细。含群对账详情子页(`/cps/groups/[id]`):点击/复制趋势折线 + 按天明细 + 群内微信用户画像。 - **系统配置**(`/config`)— 业务运行参数(金额/上限等)在线读写,改完即时生效、每次进审计。 - **管理员**(`/admins`)— 管理员账号管理(仅 `super_admin` 可见)。 - **审计日志**(`/audit-logs`)— 所有写操作的审计流水。 ### 按角色显示操作 权限以 `src/lib/auth.ts` 的 `canDo()` 为准(`super_admin` 恒可全部),各 `page.tsx` 用 `canDo([...])` 控制按钮: - **finance**(钱):提现审核、用户调金币/调现金、CPS 对账(刷新拉美团订单)。 - **operator**(用户+内容):用户封禁/调试链接/新手引导、反馈审核、上报审核、设备重设引导、CPS 群/活动管理。 - **super**(super_admin):以上全部 + 管理员账号管理。 - 数据大盘 / 比价记录 / 广告管理 / 系统配置 / 审计日志:无 `canDo` 门,登录即可查看。 ## 本地开发 ```bash # 1. 起 admin 后端(在 shaguabijia-app-server 目录) conda activate price && uvicorn app.admin.main:admin_app --port 8771 # 2. 建首个超管(打印密码) python scripts/create_admin.py --username admin --role super_admin # 3. 起前端 npm install && npm run dev # → http://localhost:3001 ``` `.env.local` 已指向 `http://localhost:8771`。 ## 生产部署(阿里云,域名 admin.shaguabijia.com) ### ① 后端 admin(在 app-server 机器,复用同一 codebase) ```bash scp deploy/shaguabijia-admin.service server:/etc/systemd/system/ # 文件在 app-server/deploy/ ssh server "systemctl daemon-reload && systemctl enable --now shaguabijia-admin" ssh server "cd /opt/shaguabijia-app-server && .venv/bin/python scripts/create_admin.py --username admin --role super_admin" ``` ### ② 前端 ```bash npm run build rsync -avz --exclude node_modules --exclude .next/cache ./ server:/opt/shaguabijia-admin-web/ ssh server "cd /opt/shaguabijia-admin-web && npm install --omit=dev && npm run build && pm2 start ecosystem.config.js" ``` ### ③ nginx ```bash scp deploy/nginx/admin.shaguabijia.com.conf server:/etc/nginx/conf.d/ ssh server "nginx -t && systemctl reload nginx" ``` ## ⚠️ 上线必查 - app-server 的 `.env` 里 `ADMIN_JWT_SECRET` 改成 ≥32 字节强随机串(默认 `change-me-admin` 可伪造 token) - nginx 打开 IP 白名单(运营出口 IP)+ HTTPS 证书就位 - `.env.production` 的 `NEXT_PUBLIC_API_BASE` 留空(同域,nginx 反代 /admin/api) - `.env.production` 的 `NEXT_PUBLIC_MEDIA_BASE` 必须指向 **App 后端** `https://app-api.shaguabijia.com`(/media 的真正的家),否则后台所有 /media 图片(上报/反馈截图、二维码、头像)被拼到 admin 域而 404。`NEXT_PUBLIC_*` 是编译期常量,改完必须重新 `npm run build` 才生效(详见 `src/lib/media.ts`) - 首个 super_admin 已建、能登录