diff --git a/11.txt b/11.txt new file mode 100644 index 00000000..b09e489f --- /dev/null +++ b/11.txt @@ -0,0 +1,16 @@ + +这条“半自动+人工”链路已经落下第一版了。 + +后端现在新增了 support 角色,并把半自动档案 tencent_claim_assisted 接进了履约目录。用户侧领取页现在只允许“创建登录会话 + 扫码登录”,如果任务是半自动客服模式,用户自己再点“确认角色/开始兑换”会被后端直接拦住;客服则可以在任务详情里拿领取链接、看登录后的复核截图、确认角色、再触发后端自动兑换。关键入口在 admin-service.js、claim-session-service.js、session.js、fulfillment-bootstrap-service.js。 + +权限也一起收紧了。support 看不到库存凭据、原始 claim token、库存管理、Webhook、配置、审计、用户管理;任务详情接口本身已经做了脱敏,不只是前端隐藏。前端这边补了客服角色导航、路由限制和任务操作按钮,配置页也新增了“腾讯领取兑换(半自动+人工)”选项,相关界面在 AdminTaskDetailView.vue、AdminLayout.vue、AdminFulfillmentBindingsView.vue、AdminUsersView.vue。 + +我做了后端文件的语法检查,node --check 通过;前端没法做完整 typecheck,因为当前环境里 vue-tsc 没装,npm run typecheck 会直接报 vue-tsc: command not found。 +你现在可以直接这样试: + +后台用户里新增一个 support 账号。 +在履约配置里把目标商品改成 tencent_claim_assisted。 +下一个测试单后,让用户打开领取链接并扫码登录。 +客服进入任务详情,确认能看到领取链接和复核截图,但看不到兑换码。 +客服点“客服确认角色”再点“客服开始兑换”。 +如果你愿意,我下一步可以继续把“任务列表页也做客服专用态优化”以及“客服复核截图/角色状态做成更明显的状态块”。 \ No newline at end of file diff --git a/apps/backend/data/order-fulfillment-bindings.json b/apps/backend/data/order-fulfillment-bindings.json index 2c821051..23572206 100644 --- a/apps/backend/data/order-fulfillment-bindings.json +++ b/apps/backend/data/order-fulfillment-bindings.json @@ -5,12 +5,10 @@ "shopId": "693760716", "skuCode": "sjz_hdl_test01", "skuName": "三角洲行动-自动领取", - "profileKey": "tencent_claim_redeem", + "profileKey": "tencent_claim_assisted", "enabled": true, "priority": 100, - "config": { - "note": "三角洲行动腾讯兑换码自动领取" - }, + "config": {}, "match": { "externalSkuCode": "6228372634012", "externalItemId": "1040695550204", diff --git a/apps/backend/src/routes/admin/audit-logs.js b/apps/backend/src/routes/admin/audit-logs.js index 0928b28d..6719a487 100644 --- a/apps/backend/src/routes/admin/audit-logs.js +++ b/apps/backend/src/routes/admin/audit-logs.js @@ -5,7 +5,7 @@ import { createJsonHandler, requireAdminRoles } from './shared.js' const router = Router() -router.use(requireAdminRoles(['admin'])) +router.use('/audit-logs', requireAdminRoles(['admin'])) router.get('/audit-logs', createJsonHandler( (req) => getAdminAuditLogs(req.query), diff --git a/apps/backend/src/routes/admin/inventory.js b/apps/backend/src/routes/admin/inventory.js index 03574513..86369e83 100644 --- a/apps/backend/src/routes/admin/inventory.js +++ b/apps/backend/src/routes/admin/inventory.js @@ -11,7 +11,7 @@ import { createJsonHandler, requireAdminRoles } from './shared.js' const router = Router() -router.use(requireAdminRoles(['admin', 'operator'])) +router.use('/inventory', requireAdminRoles(['admin', 'operator'])) router.get('/inventory', createJsonHandler( (req) => getAdminInventoryItems(req.query), diff --git a/apps/backend/src/routes/admin/platform-config.js b/apps/backend/src/routes/admin/platform-config.js index 6b499fe8..ab30fa2d 100644 --- a/apps/backend/src/routes/admin/platform-config.js +++ b/apps/backend/src/routes/admin/platform-config.js @@ -10,7 +10,7 @@ import { createJsonHandler, requireAdminRoles } from './shared.js' const router = Router() -router.use(requireAdminRoles(['admin'])) +router.use('/platform-config', requireAdminRoles(['admin'])) router.get('/platform-config/agiso-shops', createJsonHandler( () => getAdminAgisoShopConfigs(), diff --git a/apps/backend/src/routes/admin/users.js b/apps/backend/src/routes/admin/users.js index 5e5c265c..eddcc023 100644 --- a/apps/backend/src/routes/admin/users.js +++ b/apps/backend/src/routes/admin/users.js @@ -11,7 +11,7 @@ import { createJsonHandler, requireAdminRoles } from './shared.js' const router = Router() -router.use(requireAdminRoles(['admin'])) +router.use('/users', requireAdminRoles(['admin'])) router.get('/users', createJsonHandler( (req) => getAdminUserList(req.query), diff --git a/apps/backend/src/routes/admin/webhook-events.js b/apps/backend/src/routes/admin/webhook-events.js index 831fc9cd..155a2e5d 100644 --- a/apps/backend/src/routes/admin/webhook-events.js +++ b/apps/backend/src/routes/admin/webhook-events.js @@ -9,7 +9,7 @@ import { createJsonHandler, requireAdminRoles } from './shared.js' const router = Router() -router.use(requireAdminRoles(['admin', 'operator'])) +router.use('/webhook-events', requireAdminRoles(['admin', 'operator'])) router.get('/webhook-events', createJsonHandler( (req) => getAdminWebhookEvents(req.query), diff --git a/apps/frontend/src/views/admin/AdminLayout.vue b/apps/frontend/src/views/admin/AdminLayout.vue index a416cbc2..e56ccc3f 100644 --- a/apps/frontend/src/views/admin/AdminLayout.vue +++ b/apps/frontend/src/views/admin/AdminLayout.vue @@ -97,16 +97,21 @@ async function submitLogout() {