From 8ea225d819bdcd9b3d0cf2ae856404364dbfa816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=AB=E5=9C=B0=E5=83=A7?= <357099073@qq.com> Date: Mon, 15 Jun 2026 23:43:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BB=AD=E6=9D=AF=E6=BF=80?= =?UTF-8?q?=E6=B4=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platform-vue | 1 - src/api/cursorActivationCode.ts | 106 +++ src/api/cursorEquipment.ts | 90 ++ src/views/accountpool/cursor/index.vue | 9 + src/views/cursor/activationcode/index.vue | 959 ++++++++++++++++++++++ vite.config.js | 1 + 6 files changed, 1165 insertions(+), 1 deletion(-) delete mode 160000 platform-vue create mode 100644 src/api/cursorActivationCode.ts create mode 100644 src/api/cursorEquipment.ts create mode 100644 src/views/cursor/activationcode/index.vue diff --git a/platform-vue b/platform-vue deleted file mode 160000 index e776179..0000000 --- a/platform-vue +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e776179c72c44ecd4e6e197f0c88253e8ab71bae diff --git a/src/api/cursorActivationCode.ts b/src/api/cursorActivationCode.ts new file mode 100644 index 0000000..83deb7e --- /dev/null +++ b/src/api/cursorActivationCode.ts @@ -0,0 +1,106 @@ +// @ts-ignore request 封装是 JS 文件,项目未提供 TS 声明 +import request from '@/utils/request'; + +const baseUrl = '/platform/cursor/activationcode'; + +export interface CursorActivationCodeQuery { + page?: number; + pageSize?: number; + keyword?: string; + status?: number | string; + type?: number | string; + bindStatus?: number | string; +} + +export interface CursorActivationCodePayload { + id?: number | string; + code?: string; + type?: number; + status?: number; + durationDays?: number; + bindAccount?: string; + bindDeviceId?: number | string; + ownerUserId?: number | string; + ownerUserName?: string; + activatedAt?: string; + expiredAt?: string; + remark?: string; +} + +export interface GenerateActivationCodePayload { + count: number; + type?: number; + durationDays?: number; + ownerUserId?: number | string; + ownerUserName?: string; + remark?: string; +} + +export function getCursorActivationCodeList(params: CursorActivationCodeQuery) { + return request({ + url: `${baseUrl}/list`, + method: 'get', + params, + }); +} + +export function getCursorActivationCodeDetail(id: number | string) { + return request({ + url: `${baseUrl}/detail/${id}`, + method: 'get', + }); +} + +export function addCursorActivationCode(data: CursorActivationCodePayload) { + return request({ + url: `${baseUrl}/add`, + method: 'post', + data, + }); +} + +export function updateCursorActivationCode(data: CursorActivationCodePayload) { + return request({ + url: `${baseUrl}/update`, + method: 'post', + data, + }); +} + +export function deleteCursorActivationCode(id: number | string) { + return request({ + url: `${baseUrl}/delete/${id}`, + method: 'post', + }); +} + +export function generateCursorActivationCode(data: GenerateActivationCodePayload) { + return request({ + url: `${baseUrl}/generate`, + method: 'post', + data, + }); +} + +export function enableCursorActivationCode(id: number | string) { + return request({ + url: `${baseUrl}/enable/${id}`, + method: 'post', + }); +} + +export function disableCursorActivationCode(id: number | string) { + return request({ + url: `${baseUrl}/disable/${id}`, + method: 'post', + }); +} + +export function exportCursorActivationCode(params: CursorActivationCodeQuery) { + return request({ + url: `${baseUrl}/export`, + method: 'get', + params, + responseType: 'blob', + }); +} diff --git a/src/api/cursorEquipment.ts b/src/api/cursorEquipment.ts new file mode 100644 index 0000000..ce45f74 --- /dev/null +++ b/src/api/cursorEquipment.ts @@ -0,0 +1,90 @@ +// @ts-ignore request 封装是 JS 文件,项目未提供 TS 声明 +import request from '@/utils/request'; + +const baseUrl = '/platform/cursor/equipment'; + +export interface CursorEquipmentQuery { + page?: number; + pageSize?: number; + keyword?: string; + status?: number | string; + system?: string; + os?: string; +} + +export interface CursorEquipmentPayload { + id?: number; + deviceInfo?: string; + machineCode?: string; + status?: number; + system?: string; + version?: string; + bindAccount?: string; + ownerUserId?: number; + ownerUserName?: string; + activationTime?: string; + expireTime?: string; + remark?: string; +} + +export function getCursorEquipmentList(params: CursorEquipmentQuery) { + return request({ + url: `${baseUrl}/list`, + method: 'get', + params, + }); +} + +export function getCursorEquipmentDetail(id: number | string) { + return request({ + url: `${baseUrl}/detail/${id}`, + method: 'get', + }); +} + +export function addCursorEquipment(data: CursorEquipmentPayload) { + return request({ + url: `${baseUrl}/add`, + method: 'post', + data, + }); +} + +export function updateCursorEquipment(data: CursorEquipmentPayload) { + return request({ + url: `${baseUrl}/update`, + method: 'post', + data, + }); +} + +export function deleteCursorEquipment(id: number | string) { + return request({ + url: `${baseUrl}/delete/${id}`, + method: 'post', + }); +} + +export function activateCursorEquipment(data: { id: number | string }) { + return request({ + url: `${baseUrl}/activate`, + method: 'post', + data, + }); +} + +export function getCursorEquipmentActivationRecords(params: Record) { + return request({ + url: `${baseUrl}/activationRecords`, + method: 'get', + params, + }); +} + +export function getCursorEquipmentExtractRecords(params: Record) { + return request({ + url: `${baseUrl}/extractRecords`, + method: 'get', + params, + }); +} diff --git a/src/views/accountpool/cursor/index.vue b/src/views/accountpool/cursor/index.vue index b8bfc34..16fd7b2 100644 --- a/src/views/accountpool/cursor/index.vue +++ b/src/views/accountpool/cursor/index.vue @@ -615,11 +615,20 @@ function copyCardInfo(row) { const CURSOR_PRO_LIMIT_TEXT = 'Get Cursor Pro for more Agent usage, unlimited Tab, and more.'; function formatCursorProbeDialogText(d) { + // 1. 优先以新版后端的 ok 字段(也就是底层探针的交叉判定结论)为核心准则 + if (d && typeof d.ok === 'boolean') { + return d.ok ? '该TOKEN可用' : `该TOKEN已用完 (${d.detail || '额度枯竭'})`; + } + + // 2. 兼容旧数据的兜底检测 + const CURSOR_PRO_LIMIT_TEXT = 'Get Cursor Pro for more Agent usage, unlimited Tab, and more.'; const detail = String(d?.detail || ''); const rawPreview = String(d?.rawPreview || ''); + if (detail.includes(CURSOR_PRO_LIMIT_TEXT) || rawPreview.includes(CURSOR_PRO_LIMIT_TEXT)) { return '该TOKEN已用完'; } + return '该TOKEN可用'; } diff --git a/src/views/cursor/activationcode/index.vue b/src/views/cursor/activationcode/index.vue new file mode 100644 index 0000000..d0ee8b0 --- /dev/null +++ b/src/views/cursor/activationcode/index.vue @@ -0,0 +1,959 @@ + + + + + diff --git a/vite.config.js b/vite.config.js index 1da0bff..d4d939f 100644 --- a/vite.config.js +++ b/vite.config.js @@ -27,6 +27,7 @@ export default defineConfig({ }, }, server: { + host: "127.0.0.1", port: 5000, // 开发时前端在 5000,接口走相对路径 /platform/*、/backend/*,转发到本地 Go(当前 httpport=8081) proxy: {