+
+
+ ${targets.map(t => `
+
+ `).join('')}
+
+
`;
+ document.body.appendChild(modal);
+ modal.querySelector('#_upload-close').addEventListener('click', () => { modal.remove(); resolve(null); });
+ modal.addEventListener('click', (e) => { if (e.target === modal) { modal.remove(); resolve(null); } });
+ modal.querySelectorAll('button[data-val]').forEach(btn => {
+ btn.addEventListener('click', () => { modal.remove(); resolve(btn.dataset.val); });
+ });
+ });
+
+ if (!choice) return;
+ if (choice === 'cpa') return uploadToCpa(id);
+ if (choice === 'sub2api') return uploadToSub2Api(id);
+ if (choice === 'tm') return uploadToTm(id);
+}
+
// 上传单个账号到CPA
async function uploadToCpa(id) {
const choice = await selectCpaService();
@@ -849,8 +873,8 @@ async function handleBatchUploadCpa() {
const confirmed = await confirm(`确定要将选中的 ${count} 个账号上传到CPA吗?`);
if (!confirmed) return;
- elements.batchUploadCpaBtn.disabled = true;
- elements.batchUploadCpaBtn.textContent = '上传中...';
+ elements.batchUploadBtn.disabled = true;
+ elements.batchUploadBtn.textContent = '上传中...';
try {
const payload = buildBatchPayload();
@@ -994,8 +1018,8 @@ async function handleBatchUploadSub2Api() {
const confirmed = await confirm(`确定要将选中的 ${count} 个账号上传到 Sub2API 吗?`);
if (!confirmed) return;
- elements.batchUploadSub2ApiBtn.disabled = true;
- elements.batchUploadSub2ApiBtn.textContent = '上传中...';
+ elements.batchUploadBtn.disabled = true;
+ elements.batchUploadBtn.textContent = '上传中...';
try {
const payload = buildBatchPayload();
@@ -1017,6 +1041,26 @@ async function handleBatchUploadSub2Api() {
// ============== Team Manager 上传 ==============
+// 上传单账号到 Sub2API
+async function uploadToSub2Api(id) {
+ const choice = await selectSub2ApiService();
+ if (choice === null) return;
+ try {
+ toast.info('正在上传到 Sub2API...');
+ const payload = {};
+ if (choice.service_id != null) payload.service_id = choice.service_id;
+ const result = await api.post(`/accounts/${id}/upload-sub2api`, payload);
+ if (result.success) {
+ toast.success('上传成功');
+ loadAccounts();
+ } else {
+ toast.error('上传失败: ' + (result.error || result.message || '未知错误'));
+ }
+ } catch (e) {
+ toast.error('上传失败: ' + e.message);
+ }
+}
+
// 上传单账号到 Team Manager
async function uploadToTm(id) {
try {
@@ -1039,8 +1083,8 @@ async function handleBatchUploadTm() {
const confirmed = await confirm(`确定要将选中的 ${count} 个账号上传到 Team Manager 吗?`);
if (!confirmed) return;
- elements.batchUploadTmBtn.disabled = true;
- elements.batchUploadTmBtn.textContent = '上传中...';
+ elements.batchUploadBtn.disabled = true;
+ elements.batchUploadBtn.textContent = '上传中...';
try {
const result = await api.post('/payment/accounts/batch-upload-tm', buildBatchPayload());
diff --git a/templates/accounts.html b/templates/accounts.html
index 6b0523e..fec857d 100644
--- a/templates/accounts.html
+++ b/templates/accounts.html
@@ -125,18 +125,19 @@