{{ viewTitle }}

👥
{{ stats.users }}
注册用户
🎫
{{ stats.availableCards }}
可用卡密
✅
{{ stats.usedCards }}
已用卡密
💰
¥{{ fmtMoney(stats.todayRecharge) }}
今日充值
📞
¥{{ fmtMoney(stats.todayGetPhone) }}
今日取号扣款

最近流水

查看全部 →
时间用户类型金额说明
{{ fmtTime(t.createdAt) }} {{ t.telegramId || '-' }} {{ typeLabel(t.type) }} {{ t.amount>=0?'+':'' }}{{ fmtMoney(t.amount) }} {{ t.remark || '-' }}
暂无流水

用户列表({{ userTotal }})

用户TG ID等级余额流水最近活跃操作
{{ displayName(u) }} {{ u.telegramId }} {{ u.level }} ¥{{ fmtMoney(u.balance) }} {{ u.transactionCount }} {{ fmtTime(u.updatedAt) }}
暂无用户
共 {{ userTotal }} 条 · 第 {{ userPage }} / {{ userTotalPages }} 页

账户充值(手动核销卡密)

¥{{ fmtMoney(rechargeBalance) }}

生成卡密

已生成 {{ generatedCards.length }} 张,请立即复制:

{{ c }}

卡密列表({{ cardTotal }})

卡密面额状态创建时间有效期至使用者操作
{{ c.code || '****-****-****-****' }} ¥{{ fmtMoney(c.amount) }} {{ cardStatusLabel(c.status) }} {{ fmtTime(c.createdAt) }} {{ c.expiresAt ? fmtTime(c.expiresAt) : '永久' }} {{ c.usedBy || '-' }}
暂无卡密
共 {{ cardTotal }} 条 · 第 {{ cardPage }} / {{ cardTotalPages }} 页

流水记录({{ txnTotal }})

时间用户类型金额变动前变动后说明操作人
{{ fmtTime(t.createdAt) }} {{ t.telegramId || '-' }} {{ typeLabel(t.type) }} {{ t.amount>=0?'+':'' }}{{ fmtMoney(t.amount) }} ¥{{ fmtMoney(t.beforeBalance) }} ¥{{ fmtMoney(t.afterBalance) }} {{ t.remark || '-' }} {{ t.operator || '-' }}
暂无流水
共 {{ txnTotal }} 条 · 第 {{ txnPage }} / {{ txnTotalPages }} 页

🤖 机器人运行状态

{{ botBusy ? '处理中…' : (botStatus.running ? '运行中' : '已停止') }}
⚠️ 机器人项目目录不存在:{{ botStatus.projectDir }},请在下方「机器人运行配置」里改成正确的目录。
⚠️ 目录 {{ botStatus.projectDir }} 里没有 package.json,请确认填的是机器人项目根目录。
⚠️ 没找到 .env:机器人需要它读取 MANAGEMENT_BASE_URL 与 BOT_API_KEY,否则启动后会立即退出。
⚠️ 没找到 node_modules:首次部署请在机器人项目目录执行 npm install。
⚠️ 目录里没有 src/index.js(或 index.js),请确认「启动命令」与项目结构匹配(默认 npm start 会执行 node src/index.js)。
检测到外部进程管理的机器人(PID {{ botExternalPids.join('、') }}):请到 Supervisor / systemd 里停止或重启,本页不会去杀它。
上次退出码:{{ botStatus.exitCode }}(0 表示正常退出,非 0 多为配置或网络问题,请看下方日志)。
点「启动」后后台会在服务器上运行 {{ botStatus.command }},并把它的输出写入上面的日志文件,页面下方实时显示;与机器人自身用 Supervisor 守护互不冲突,但同一份 .env/Token 不能同时跑两个实例。

机器人运行配置

保存后立即生效
当前生效:{{ botStatus.projectDir }}。该目录需包含 package.json 与 src/index.js(以及机器人自己的 .env)。
默认 npm start。宝塔的 Node 装在 /www/server/nodejs/vXX/bin 下,而后台服务的 PATH 里通常没有它, 所以启动时后台会自动把检测到的 Node 目录加进子进程 PATH,npm start 一般可以直接用。
💡 检测到 Node:{{ botStatus.nodePath }};推荐启动命令:{{ botStatus.absCommand }}
⚠️ 没有检测到 Node:请到宝塔「软件商店 → Node.js 版本管理器」安装,或给后台服务加环境变量 BOT_NODE_DIR=/www/server/nodejs/v18.19.0/bin(改成实际版本号),也可以把启动命令直接写成绝对路径。

运行日志(最近 200 行)

{{ botLog || '(暂无日志,点上方「启动机器人」试试)' }}

机器人配置

短信平台配置

只填数字(SID 即平台的项目ID)。保存后机器人取号时立即使用新 SID,无需重启。
¥{{ fmtMoney(smsBalance) }}
保存会同时提交上方“机器人配置”与“短信平台配置”。机器人侧无需重启,改完 SID 后直接取号即可。

🔐 修改登录密码

长度 {{ security.minLength || 6 }} - {{ security.maxLength || 64 }} 位,不能是纯数字,建议字母 + 数字组合。
密码已保存在 data/store.json 的 auth 段({{ security.algo }} 加盐哈希,不可逆),上次修改:{{ fmtTime(security.updatedAt) }}。启动脚本里的 ADMIN_PASSWORD 环境变量已不再生效。
当前密码仍来自启动时的环境变量 ADMIN_PASSWORD(未设置时为默认值 admin123)。保存新密码后改用 store.json 里的加盐哈希,环境变量和启动脚本都不用再改。
保存成功后,其它设备上已登录的后台会自动退出,当前页面可继续使用。
{{ toast.msg }}