diff --git a/src/api/biz/apiTest/index.ts b/src/api/biz/apiTest/index.ts new file mode 100644 index 00000000..c0429de8 --- /dev/null +++ b/src/api/biz/apiTest/index.ts @@ -0,0 +1,23 @@ +import request from '@/utils/request'; + +/** + * 测试 fetchVideoSearchV2 + */ +export const fetchVideoSearchV2 = (data: Record) => { + return request({ + url: '/biz/apiTest/fetchVideoSearchV2', + method: 'post', + data + }); +}; + +/** + * 测试 fetchVideoComments + */ +export const fetchVideoComments = (data: Record) => { + return request({ + url: '/biz/apiTest/fetchVideoComments', + method: 'post', + data + }); +}; diff --git a/src/api/biz/definition/index.ts b/src/api/biz/definition/index.ts new file mode 100644 index 00000000..7e06be18 --- /dev/null +++ b/src/api/biz/definition/index.ts @@ -0,0 +1,41 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { DefinitionForm, DefinitionQuery, DefinitionVO } from '@/api/biz/definition/types'; + +export function listDefinition(query?: DefinitionQuery): AxiosPromise { + return request({ + url: '/biz/definition/list', + method: 'get', + params: query + }); +} + +export function getDefinition(apiId: string | number): AxiosPromise { + return request({ + url: '/biz/definition/' + apiId, + method: 'get' + }); +} + +export function addDefinition(data: DefinitionForm) { + return request({ + url: '/biz/definition', + method: 'post', + data: data + }); +} + +export function updateDefinition(data: DefinitionForm) { + return request({ + url: '/biz/definition', + method: 'put', + data: data + }); +} + +export function delDefinition(apiId: string | number | Array) { + return request({ + url: '/biz/definition/' + apiId, + method: 'delete' + }); +} diff --git a/src/api/biz/definition/types.ts b/src/api/biz/definition/types.ts new file mode 100644 index 00000000..ac3b36ca --- /dev/null +++ b/src/api/biz/definition/types.ts @@ -0,0 +1,39 @@ +export interface DefinitionVO { + apiId: string | number; + platformId: string | number; + platformName: string; + baseUrl: string; + apiCode: string; + apiName: string; + apiUri: string; + fullUrl: string; + requestMethod: string; + pointsCost: number; + timeout: number; + contentType: string; + status: string; + remark: string; + createTime: string; +} + +export interface DefinitionForm extends BaseEntity { + apiId?: string | number; + platformId?: string | number; + apiCode?: string; + apiName?: string; + apiUri?: string; + requestMethod?: string; + pointsCost?: number; + timeout?: number; + contentType?: string; + status?: string; + remark?: string; +} + +export interface DefinitionQuery extends PageQuery { + platformId?: string | number; + apiCode?: string; + apiName?: string; + requestMethod?: string; + status?: string; +} diff --git a/src/api/biz/invokeRecord/index.ts b/src/api/biz/invokeRecord/index.ts new file mode 100644 index 00000000..4fec624f --- /dev/null +++ b/src/api/biz/invokeRecord/index.ts @@ -0,0 +1,18 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { InvokeRecordQuery, InvokeRecordVO } from '@/api/biz/invokeRecord/types'; + +export function listInvokeRecord(query?: InvokeRecordQuery): AxiosPromise { + return request({ + url: '/biz/invokeRecord/list', + method: 'get', + params: query + }); +} + +export function getInvokeRecord(recordId: string | number): AxiosPromise { + return request({ + url: '/biz/invokeRecord/' + recordId, + method: 'get' + }); +} diff --git a/src/api/biz/invokeRecord/types.ts b/src/api/biz/invokeRecord/types.ts new file mode 100644 index 00000000..ab128cbd --- /dev/null +++ b/src/api/biz/invokeRecord/types.ts @@ -0,0 +1,25 @@ +export interface InvokeRecordVO { + recordId: string | number; + tenantId?: string; + platformCode: string; + platformName: string; + apiCode: string; + apiName: string; + userName: string; + requestTime: string; + requestMethod: string; + pointsCost: number; + bizCode: number; + httpStatus: number; + elapsedMs: number; + requestParams?: string; + requestUrl?: string; +} + +export interface InvokeRecordQuery extends PageQuery { + platformCode?: string; + apiCode?: string; + userName?: string; + beginRequestTime?: string; + endRequestTime?: string; +} diff --git a/src/api/biz/platform/index.ts b/src/api/biz/platform/index.ts new file mode 100644 index 00000000..75d85392 --- /dev/null +++ b/src/api/biz/platform/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { PlatformForm, PlatformOptionVO, PlatformQuery, PlatformVO } from '@/api/biz/platform/types'; + +export function listPlatform(query?: PlatformQuery): AxiosPromise { + return request({ + url: '/biz/platform/list', + method: 'get', + params: query + }); +} + +export function getPlatform(platformId: string | number): AxiosPromise { + return request({ + url: '/biz/platform/' + platformId, + method: 'get' + }); +} + +export function optionselectPlatform(): AxiosPromise { + return request({ + url: '/biz/platform/optionselect', + method: 'get' + }); +} + +export function addPlatform(data: PlatformForm) { + return request({ + url: '/biz/platform', + method: 'post', + data: data + }); +} + +export function updatePlatform(data: PlatformForm) { + return request({ + url: '/biz/platform', + method: 'put', + data: data + }); +} + +export function delPlatform(platformId: string | number | Array) { + return request({ + url: '/biz/platform/' + platformId, + method: 'delete' + }); +} + +export function changePlatformStatus(platformId: string | number, status: string) { + return request({ + url: '/biz/platform/changeStatus', + method: 'put', + data: { platformId, status } + }); +} + +export function resetPlatformSecret(platformId: string | number) { + return request({ + url: '/biz/platform/resetSecret/' + platformId, + method: 'put' + }); +} diff --git a/src/api/biz/platform/types.ts b/src/api/biz/platform/types.ts new file mode 100644 index 00000000..89234ec0 --- /dev/null +++ b/src/api/biz/platform/types.ts @@ -0,0 +1,42 @@ +export interface PlatformVO { + platformId: string | number; + platformCode: string; + platformName: string; + baseUrl: string; + appKey: string; + appSecret: string; + token: string; + tokenExpireTime: string; + authType: string; + status: string; + remark: string; + createTime: string; +} + +export interface PlatformOptionVO { + platformId: string | number; + platformCode: string; + platformName: string; + baseUrl: string; +} + +export interface PlatformForm extends BaseEntity { + platformId?: string | number; + platformCode?: string; + platformName?: string; + baseUrl?: string; + appKey?: string; + appSecret?: string; + token?: string; + tokenExpireTime?: string; + authType?: string; + status?: string; + remark?: string; +} + +export interface PlatformQuery extends PageQuery { + platformCode?: string; + platformName?: string; + authType?: string; + status?: string; +} diff --git a/src/api/linkflow/org/index.ts b/src/api/linkflow/org/index.ts new file mode 100644 index 00000000..d2d5a5c9 --- /dev/null +++ b/src/api/linkflow/org/index.ts @@ -0,0 +1,102 @@ +import request from '@/utils/request'; +import { TenantDetailVO, TenantDetailQuery, TenantDetailForm } from './types'; +import { AxiosPromise } from 'axios'; + +// 查询LinkFlow租户列表 +export function listLinkflowTenant(query: TenantDetailQuery): AxiosPromise { + return request({ + url: '/linkflow/tenant/list', + method: 'get', + params: query + }); +} + +// 查询租户详情 +export function getLinkflowTenant(tenantId: string | number): AxiosPromise { + return request({ + url: '/linkflow/tenant/' + tenantId, + method: 'get' + }); +} + +// 新增租户 +export function addLinkflowTenant(data: TenantDetailForm) { + return request({ + url: '/linkflow/tenant', + method: 'post', + data: data + }); +} + +// 修改租户 +export function updateLinkflowTenant(data: TenantDetailForm) { + return request({ + url: '/linkflow/tenant', + method: 'put', + data: data + }); +} + +// 切换业务状态 +export function changeOrgStatus(tenantId: string, orgStatus: string) { + return request({ + url: '/linkflow/tenant/changeOrgStatus', + method: 'put', + data: { tenantId, orgStatus } + }); +} + +// 删除租户 +export function delLinkflowTenant(ids: string | number | Array) { + return request({ + url: '/linkflow/tenant/' + ids, + method: 'delete' + }); +} + +// 导出租户 +export function exportLinkflowTenant(data: any) { + return request({ + url: '/linkflow/tenant/export', + method: 'post', + data: data, + responseType: 'blob' + }); +} + +// ========== 通知相关 ========== + +// 查询通知列表(tenantId 可选,后端自动兜底) +export function listNotifications(tenantId?: string) { + return request({ + url: '/linkflow/tenant/notifications', + method: 'get', + params: tenantId ? { tenantId } : {} + }); +} + +// 标记已读 +export function markNotificationRead(id: number | string) { + return request({ + url: '/linkflow/tenant/notifications/' + id + '/read', + method: 'put' + }); +} + +// 全部已读 +export function markAllNotificationsRead(tenantId?: string) { + return request({ + url: '/linkflow/tenant/notifications/readAll', + method: 'put', + params: tenantId ? { tenantId } : {} + }); +} + +// 未读数量 +export function getUnreadCount(tenantId?: string) { + return request({ + url: '/linkflow/tenant/notifications/unreadCount', + method: 'get', + params: tenantId ? { tenantId } : {} + }); +} diff --git a/src/api/linkflow/org/types.ts b/src/api/linkflow/org/types.ts new file mode 100644 index 00000000..eb864dc3 --- /dev/null +++ b/src/api/linkflow/org/types.ts @@ -0,0 +1,64 @@ +export interface TenantDetailVO extends BaseEntity { + id: number | string; + tenantId: string; + companyName: string; + contactUserName: string; + contactPhone: string; + domain: string; + packageId: number | string; + packageName: string; + expireTime: string; + accountCount: number; + status: string; + // lf_tenant_ext 字段 + extId: number | string; + monthlyQuota: number; + usedQuota: number; + platformCount: number; + orgStatus: string; + remark: string; + // 管理员信息 + phonenumber: string; + // 计算字段 + quotaUsageRate: number; + daysToExpire: number; +} + +export interface TenantDetailQuery extends PageQuery { + companyName?: string; + contactUserName?: string; + orgStatus?: string; + packageId?: number | string; +} + +export interface TenantDetailForm { + id?: number | string | undefined; + tenantId?: string | undefined; + companyName: string; + contactUserName: string; + contactPhone: string; + domain?: string; + packageId: number | string; + expireTime: string; + accountCount: number; + // 新增租户时需要(RuoYi 创建租户同时创建管理员用户) + username?: string; + password?: string; + phonenumber?: string; + // lf_tenant_ext + extId?: number | string | undefined; + monthlyQuota: number; + platformCount: number; + remark?: string; + orgStatus?: string; +} + +export interface NotificationVO { + id: number | string; + tenantId: string; + type: string; + title: string; + content: string; + isRead: string; + createTime: string; +} diff --git a/src/api/linkflow/quota/index.ts b/src/api/linkflow/quota/index.ts new file mode 100644 index 00000000..571b1f08 --- /dev/null +++ b/src/api/linkflow/quota/index.ts @@ -0,0 +1,39 @@ +import request from '@/utils/request'; +import { QuotaVO, QuotaQuery } from './types'; +import { AxiosPromise } from 'axios'; + +// 查询配额列表 +export function listQuota(query: QuotaQuery): AxiosPromise { + return request({ + url: '/linkflow/quota/list', + method: 'get', + params: query + }); +} + +// 查询单个租户配额 +export function getQuota(tenantId: string | number): AxiosPromise { + return request({ + url: '/linkflow/quota/' + tenantId, + method: 'get' + }); +} + +// 调整配额 +export function adjustQuota(tenantId: string, newMonthlyQuota: number) { + return request({ + url: '/linkflow/quota/adjust', + method: 'put', + params: { tenantId, newMonthlyQuota } + }); +} + +// 导出配额 +export function exportQuota(data: any) { + return request({ + url: '/linkflow/quota/export', + method: 'post', + data: data, + responseType: 'blob' + }); +} diff --git a/src/api/linkflow/quota/types.ts b/src/api/linkflow/quota/types.ts new file mode 100644 index 00000000..4956505a --- /dev/null +++ b/src/api/linkflow/quota/types.ts @@ -0,0 +1,2 @@ +// 配额 VO 复用 TenantDetailVO(包含配额使用率等计算字段) +export type { TenantDetailVO as QuotaVO, TenantDetailQuery as QuotaQuery } from '../org/types'; diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 906ed6f3..b4374cd1 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -47,6 +47,8 @@ + + @@ -102,6 +104,7 @@ import { getTenantList } from '@/api/login'; import { dynamicClear, dynamicTenant } from '@/api/system/tenant'; import { TenantVO } from '@/api/types'; import notice from './notice/index.vue'; +import LfNotification from '@/components/LfNotification/index.vue'; import router from '@/router'; import { ElMessageBoxOptions } from 'element-plus/es/components/message-box/src/message-box.type'; import { NavTypeEnum } from '@/enums/NavTypeEnum'; diff --git a/src/views/biz/apiDefinition/index.vue b/src/views/biz/apiDefinition/index.vue new file mode 100644 index 00000000..1365aa4e --- /dev/null +++ b/src/views/biz/apiDefinition/index.vue @@ -0,0 +1,332 @@ + + + diff --git a/src/views/biz/apiTest/index.vue b/src/views/biz/apiTest/index.vue new file mode 100644 index 00000000..3fc04110 --- /dev/null +++ b/src/views/biz/apiTest/index.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/src/views/biz/invokeRecord/index.vue b/src/views/biz/invokeRecord/index.vue new file mode 100644 index 00000000..475d5ad7 --- /dev/null +++ b/src/views/biz/invokeRecord/index.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/views/biz/platform/index.vue b/src/views/biz/platform/index.vue new file mode 100644 index 00000000..8ba55dd4 --- /dev/null +++ b/src/views/biz/platform/index.vue @@ -0,0 +1,291 @@ + + +