From f318fe2791d6bbf7dad996a7e020c0af0a2c500f Mon Sep 17 00:00:00 2001 From: i548450 Date: Sun, 7 Jun 2026 21:43:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AA=92=E4=BD=93=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=EF=BC=88=E5=AA=92?= =?UTF-8?q?=E4=BD=93=E6=8E=A5=E5=85=A5=20H=20=E9=98=B6=E6=AE=B5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/api/media/{account,app,oauth}:4 个账号接口 + app 列表 + 取授权 URL - src/views/media/account/index.vue:列表 + 搜索 + 详情对话框 + 启停 + 新增绑定 - src/views/media/account/oauth-result/index.vue:OAuth 回调结果落地页, 通过 window.opener.postMessage 通知父窗口刷新列表 - 路由 constantRoutes 加 hidden 路由 /media/account/oauth-result - permission.ts whiteList 加上落地页路径,避免回调时被踢去 login 新增绑定交互:window.open 新窗口走授权,原列表保留状态;落地页发完成 事件后父窗口自动刷新;不删除账号(后端无 remove 端点) --- src/api/media/account/index.ts | 36 ++ src/api/media/account/types.ts | 27 ++ src/api/media/app/index.ts | 12 + src/api/media/app/types.ts | 7 + src/api/media/oauth/index.ts | 12 + src/api/media/oauth/types.ts | 4 + src/permission.ts | 2 +- src/router/index.ts | 5 + src/views/media/account/index.vue | 324 ++++++++++++++++++ .../media/account/oauth-result/index.vue | 139 ++++++++ 10 files changed, 567 insertions(+), 1 deletion(-) create mode 100644 src/api/media/account/index.ts create mode 100644 src/api/media/account/types.ts create mode 100644 src/api/media/app/index.ts create mode 100644 src/api/media/app/types.ts create mode 100644 src/api/media/oauth/index.ts create mode 100644 src/api/media/oauth/types.ts create mode 100644 src/views/media/account/index.vue create mode 100644 src/views/media/account/oauth-result/index.vue diff --git a/src/api/media/account/index.ts b/src/api/media/account/index.ts new file mode 100644 index 00000000..b4db549b --- /dev/null +++ b/src/api/media/account/index.ts @@ -0,0 +1,36 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { MediaAccountVO, MediaAccountQuery } from '@/api/media/account/types'; + +/** 分页查询媒体账号 */ +export const listMediaAccount = (query?: MediaAccountQuery): AxiosPromise => { + return request({ + url: '/media/account/list', + method: 'get', + params: query + }); +}; + +/** 查询媒体账号详情(token 已脱敏) */ +export const getMediaAccount = (id: string | number): AxiosPromise => { + return request({ + url: '/media/account/' + id, + method: 'get' + }); +}; + +/** 禁用媒体账号 */ +export const disableMediaAccount = (id: string | number) => { + return request({ + url: '/media/account/' + id + '/disable', + method: 'put' + }); +}; + +/** 启用媒体账号 */ +export const enableMediaAccount = (id: string | number) => { + return request({ + url: '/media/account/' + id + '/enable', + method: 'put' + }); +}; diff --git a/src/api/media/account/types.ts b/src/api/media/account/types.ts new file mode 100644 index 00000000..d575c55b --- /dev/null +++ b/src/api/media/account/types.ts @@ -0,0 +1,27 @@ +export interface MediaAccountVO { + id: string | number; + tenantId: string; + platform: string; + appId: string | number; + externalId: string; + /** ENABLED / DISABLED */ + status: string; + /** HEALTHY / REAUTH_REQUIRED */ + authStatus: string; + accessTokenMasked?: string; + accessTokenExpiresAt?: string; + refreshTokenMasked?: string; + refreshTokenExpiresAt?: string; + scope?: string; + refreshRenewRemainingCount?: number; + createTime?: string; + updateTime?: string; +} + +export interface MediaAccountQuery extends PageQuery { + platform?: string; + appId?: string | number; + status?: string; + authStatus?: string; + externalId?: string; +} diff --git a/src/api/media/app/index.ts b/src/api/media/app/index.ts new file mode 100644 index 00000000..993799a1 --- /dev/null +++ b/src/api/media/app/index.ts @@ -0,0 +1,12 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { MediaAppVO } from '@/api/media/app/types'; + +/** 列出可用媒体应用(按平台过滤) */ +export const listMediaApp = (platform?: string): AxiosPromise => { + return request({ + url: '/media/app/list', + method: 'get', + params: { platform } + }); +}; diff --git a/src/api/media/app/types.ts b/src/api/media/app/types.ts new file mode 100644 index 00000000..6395d74a --- /dev/null +++ b/src/api/media/app/types.ts @@ -0,0 +1,7 @@ +export interface MediaAppVO { + id: string | number; + platform: string; + clientKey: string; + /** 0=禁用 1=启用 */ + status: number; +} diff --git a/src/api/media/oauth/index.ts b/src/api/media/oauth/index.ts new file mode 100644 index 00000000..70d41d09 --- /dev/null +++ b/src/api/media/oauth/index.ts @@ -0,0 +1,12 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { AuthorizeUrlQuery } from '@/api/media/oauth/types'; + +/** 取媒体平台 OAuth 授权 URL */ +export const getAuthorizeUrl = (query: AuthorizeUrlQuery): AxiosPromise => { + return request({ + url: '/media/oauth/authorize-url', + method: 'get', + params: query + }); +}; diff --git a/src/api/media/oauth/types.ts b/src/api/media/oauth/types.ts new file mode 100644 index 00000000..f6b8638b --- /dev/null +++ b/src/api/media/oauth/types.ts @@ -0,0 +1,4 @@ +export interface AuthorizeUrlQuery { + platform: string; + mediaAppId: string | number; +} diff --git a/src/permission.ts b/src/permission.ts index fb60b07c..decb8d7c 100644 --- a/src/permission.ts +++ b/src/permission.ts @@ -11,7 +11,7 @@ import { usePermissionStore } from '@/store/modules/permission'; import { ElMessage } from 'element-plus/es'; NProgress.configure({ showSpinner: false }); -const whiteList = ['/login', '/register', '/social-callback', '/register*', '/register/*']; +const whiteList = ['/login', '/register', '/social-callback', '/register*', '/register/*', '/media/account/oauth-result']; const isWhiteList = (path: string) => { return whiteList.some((pattern) => isPathMatch(pattern, path)); diff --git a/src/router/index.ts b/src/router/index.ts index a6497dbe..7a301bc6 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -42,6 +42,11 @@ export const constantRoutes: RouteRecordRaw[] = [ hidden: true, component: () => import('@/layout/components/SocialCallback/index.vue') }, + { + path: '/media/account/oauth-result', + hidden: true, + component: () => import('@/views/media/account/oauth-result/index.vue') + }, { path: '/login', component: () => import('@/views/login.vue'), diff --git a/src/views/media/account/index.vue b/src/views/media/account/index.vue new file mode 100644 index 00000000..95ee2e50 --- /dev/null +++ b/src/views/media/account/index.vue @@ -0,0 +1,324 @@ + + + diff --git a/src/views/media/account/oauth-result/index.vue b/src/views/media/account/oauth-result/index.vue new file mode 100644 index 00000000..0bd73801 --- /dev/null +++ b/src/views/media/account/oauth-result/index.vue @@ -0,0 +1,139 @@ + + + + +