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 @@ + + + + +