diff --git a/Yi.Ai.Vue3/src/api/aiImage/index.ts b/Yi.Ai.Vue3/src/api/aiImage/index.ts new file mode 100644 index 00000000..e4c55e67 --- /dev/null +++ b/Yi.Ai.Vue3/src/api/aiImage/index.ts @@ -0,0 +1,33 @@ +import { get, post } from '@/utils/request'; +import type { + GenerateImageRequest, + ImageModel, + PublishImageRequest, + TaskListRequest, + TaskListResponse, + TaskStatusResponse, +} from './types'; + +export function generateImage(data: GenerateImageRequest) { + return post('/ai-image/generate', data).json(); +} + +export function getTaskStatus(taskId: string) { + return get(`/ai-image/task/${taskId}`).json(); +} + +export function getMyTasks(params: TaskListRequest) { + return get('/ai-image/my-tasks', params).json(); +} + +export function getImagePlaza(params: TaskListRequest) { + return get('/ai-image/plaza', params).json(); +} + +export function publishImage(data: PublishImageRequest) { + return post('/ai-image/publish', data).json(); +} + +export function getImageModels() { + return post('/ai-image/model').json(); +} \ No newline at end of file diff --git a/Yi.Ai.Vue3/src/api/aiImage/types.ts b/Yi.Ai.Vue3/src/api/aiImage/types.ts new file mode 100644 index 00000000..0337aff1 --- /dev/null +++ b/Yi.Ai.Vue3/src/api/aiImage/types.ts @@ -0,0 +1,53 @@ +export interface GenerateImageRequest { + tokenId: string; + prompt: string; + modelId: string; + referenceImagesPrefixBase64?: string[]; +} + +export interface TaskStatusResponse { + id: string; + prompt: string; + storePrefixBase64?: string; + storeUrl?: string; + taskStatus: 'Processing' | 'Success' | 'Fail'; + publishStatus: string; + categories: string[]; + creationTime: string; +} + +export interface TaskListRequest { + PageIndex: number; + PageSize: number; + TaskStatus?: 'Processing' | 'Success' | 'Fail'; +} + +export interface TaskItem { + id: string; + prompt: string; + storePrefixBase64?: string; + storeUrl?: string; + taskStatus: 'Processing' | 'Success' | 'Fail'; + publishStatus: string; + categories: string[]; + creationTime: string; +} + +export interface TaskListResponse { + total: number; + items: TaskItem[]; +} + +export interface PublishImageRequest { + taskId: string; + categories: string[]; +} + +export interface ImageModel { + id: string; + modelId: string; + modelName: string; + modelDescribe: string; + remark: string; + isPremiumPackage: boolean; +} diff --git a/Yi.Ai.Vue3/src/api/index.ts b/Yi.Ai.Vue3/src/api/index.ts index 4bfb8e92..b165d819 100644 --- a/Yi.Ai.Vue3/src/api/index.ts +++ b/Yi.Ai.Vue3/src/api/index.ts @@ -6,3 +6,4 @@ export * from './model'; export * from './pay'; export * from './session'; export * from './user'; +export * from './aiImage'; diff --git a/Yi.Ai.Vue3/src/api/model/index.ts b/Yi.Ai.Vue3/src/api/model/index.ts index 05ade05d..28a3a81c 100644 --- a/Yi.Ai.Vue3/src/api/model/index.ts +++ b/Yi.Ai.Vue3/src/api/model/index.ts @@ -138,7 +138,8 @@ export function disableToken(id: string) { // 新增接口2 // 获取可选择的token信息 export function getSelectableTokenInfo() { - return get('/token/select-list').json(); + // return get('/token/select-list').json(); + return get('/token/select-list?includeDefault=false').json(); } /* 返回数据 diff --git a/Yi.Ai.Vue3/src/pages/chat/image/components/ImageGenerator.vue b/Yi.Ai.Vue3/src/pages/chat/image/components/ImageGenerator.vue new file mode 100644 index 00000000..3f50855d --- /dev/null +++ b/Yi.Ai.Vue3/src/pages/chat/image/components/ImageGenerator.vue @@ -0,0 +1,566 @@ + + + + + diff --git a/Yi.Ai.Vue3/src/pages/chat/image/components/ImagePlaza.vue b/Yi.Ai.Vue3/src/pages/chat/image/components/ImagePlaza.vue new file mode 100644 index 00000000..6d632e2d --- /dev/null +++ b/Yi.Ai.Vue3/src/pages/chat/image/components/ImagePlaza.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/Yi.Ai.Vue3/src/pages/chat/image/components/MyImages.vue b/Yi.Ai.Vue3/src/pages/chat/image/components/MyImages.vue new file mode 100644 index 00000000..12b981b9 --- /dev/null +++ b/Yi.Ai.Vue3/src/pages/chat/image/components/MyImages.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/Yi.Ai.Vue3/src/pages/chat/image/components/TaskCard.vue b/Yi.Ai.Vue3/src/pages/chat/image/components/TaskCard.vue new file mode 100644 index 00000000..4eea66af --- /dev/null +++ b/Yi.Ai.Vue3/src/pages/chat/image/components/TaskCard.vue @@ -0,0 +1,112 @@ + + + + + \ No newline at end of file diff --git a/Yi.Ai.Vue3/src/pages/chat/image/index.vue b/Yi.Ai.Vue3/src/pages/chat/image/index.vue index b319c725..6d6a0d45 100644 --- a/Yi.Ai.Vue3/src/pages/chat/image/index.vue +++ b/Yi.Ai.Vue3/src/pages/chat/image/index.vue @@ -1,26 +1,85 @@ - - - diff --git a/Yi.Ai.Vue3/src/pages/console/index.vue b/Yi.Ai.Vue3/src/pages/console/index.vue index b7f7fa4d..9d480616 100644 --- a/Yi.Ai.Vue3/src/pages/console/index.vue +++ b/Yi.Ai.Vue3/src/pages/console/index.vue @@ -6,6 +6,11 @@ import { useRoute, useRouter } from 'vue-router'; const route = useRoute(); const router = useRouter(); +// 从 URL 中提取邀请码参数 +const inviteCodeFromUrl = computed(() => { + return route.query.inviteCode as string | undefined; +}); + // 控制侧边栏折叠状态 const isCollapsed = ref(false); @@ -103,7 +108,7 @@ window.addEventListener('resize', checkIsMobile); - + diff --git a/Yi.Ai.Vue3/types/components.d.ts b/Yi.Ai.Vue3/types/components.d.ts index 16d28441..9e9269b3 100644 --- a/Yi.Ai.Vue3/types/components.d.ts +++ b/Yi.Ai.Vue3/types/components.d.ts @@ -19,6 +19,7 @@ declare module 'vue' { ElBadge: typeof import('element-plus/es')['ElBadge'] ElButton: typeof import('element-plus/es')['ElButton'] ElCard: typeof import('element-plus/es')['ElCard'] + ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCheckTag: typeof import('element-plus/es')['ElCheckTag'] ElCol: typeof import('element-plus/es')['ElCol'] ElCollapse: typeof import('element-plus/es')['ElCollapse'] @@ -36,6 +37,7 @@ declare module 'vue' { ElHeader: typeof import('element-plus/es')['ElHeader'] ElIcon: typeof import('element-plus/es')['ElIcon'] ElImage: typeof import('element-plus/es')['ElImage'] + ElImageViewer: typeof import('element-plus/es')['ElImageViewer'] ElInput: typeof import('element-plus/es')['ElInput'] ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElMain: typeof import('element-plus/es')['ElMain'] @@ -59,6 +61,7 @@ declare module 'vue' { ElTimeline: typeof import('element-plus/es')['ElTimeline'] ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem'] ElTooltip: typeof import('element-plus/es')['ElTooltip'] + ElUpload: typeof import('element-plus/es')['ElUpload'] FilesSelect: typeof import('./../src/components/FilesSelect/index.vue')['default'] IconSelect: typeof import('./../src/components/IconSelect/index.vue')['default'] Indexl: typeof import('./../src/components/SupportModelProducts/indexl.vue')['default'] @@ -87,6 +90,7 @@ declare module 'vue' { WelecomeText: typeof import('./../src/components/WelecomeText/index.vue')['default'] } export interface GlobalDirectives { + vInfiniteScroll: typeof import('element-plus/es')['ElInfiniteScroll'] vLoading: typeof import('element-plus/es')['ElLoadingDirective'] } }