From 97b4b215fb08822db70481debc7ac2d6545bf4ad Mon Sep 17 00:00:00 2001 From: hrx <18603305412@163.com> Date: Sun, 20 Sep 2026 13:49:49 +0800 Subject: [PATCH] daima --- .env.development | 2 +- .env.production | 2 +- .env.test | 1 + package-lock.json | 20 +- package.json | 4 +- src/apis/Model.ts | 188 +++- src/assets/css/iconfont/demo_index.html | 190 +++- src/assets/css/iconfont/iconfont.css | 38 +- src/assets/css/iconfont/iconfont.js | 2 +- src/assets/css/iconfont/iconfont.json | 56 ++ src/assets/css/iconfont/iconfont.ttf | Bin 10544 -> 12196 bytes src/assets/css/iconfont/iconfont.woff | Bin 7188 -> 8344 bytes src/assets/css/iconfont/iconfont.woff2 | Bin 6296 -> 7260 bytes src/assets/less/Header/header.less | 8 + src/assets/less/RightResult/RightResult.css | 20 - src/assets/less/RightResult/RightResult.less | 23 - src/assets/less/Video/refernce/refernce.less | 5 +- src/assets/less/Video/text/text.less | 3 + src/assets/less/apiKey/apikey.css | 8 - src/assets/less/apiKey/apikey.less | 8 - src/components/Header/Header.vue | 5 +- src/components/LoginPrompt/LoginPrompt.vue | 46 +- src/components/RightResult/RightResult.vue | 236 ++++- src/components/img/ImgImg.vue | 665 ++++++++++++++ src/components/img/ImgLeft.vue | 167 +++- src/components/img/ImgTap.vue | 8 +- src/components/img/ReferenceImg.vue | 918 ++++++++++++++++--- src/components/img/TextImg.vue | 707 +++++++++++--- src/components/left/Menu.vue | 18 +- src/components/video/ImgVideo.vue | 428 ++++++++- src/components/video/ReferenceVideo.vue | 730 ++++++++++++--- src/components/video/TextVideo.vue | 655 ++++++++++--- src/router/index.ts | 21 + src/types/model.ts | 78 +- src/utlis/request.ts | 61 +- src/views/APiKey/apikey.vue | 2 +- src/views/Bill/Bill.vue | 182 ++-- src/views/Cookie/getCookie.vue | 2 +- src/views/HistoryCreation.vue | 784 ++++++++++++++++ src/views/HistoryCreationDetail.vue | 491 ++++++++++ src/views/ImgGenerate/ImgGenerate.vue | 433 ++++++++- src/views/TextGenerate/TextGenerate.vue | 774 +++++++++++----- src/views/videoGenerate/videoGenerate.vue | 12 +- vite.config.ts | 56 +- yuanjing | 1 + 45 files changed, 6939 insertions(+), 1119 deletions(-) create mode 100644 .env.test create mode 100644 src/components/img/ImgImg.vue create mode 100644 src/views/HistoryCreation.vue create mode 100644 src/views/HistoryCreationDetail.vue create mode 160000 yuanjing diff --git a/.env.development b/.env.development index 7aba812..4a49885 100644 --- a/.env.development +++ b/.env.development @@ -1 +1 @@ -VITE_API_BASE_URL = 'https://opencomputing.ai' +VITE_API_BASE_URL=https://token.opencomputing.cn diff --git a/.env.production b/.env.production index 7aba812..4a49885 100644 --- a/.env.production +++ b/.env.production @@ -1 +1 @@ -VITE_API_BASE_URL = 'https://opencomputing.ai' +VITE_API_BASE_URL=https://token.opencomputing.cn diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..e616685 --- /dev/null +++ b/.env.test @@ -0,0 +1 @@ +VITE_API_BASE_URL=https://tokentest.opencomputing.cn diff --git a/package-lock.json b/package-lock.json index 9799d16..c752507 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "vue-waterfall-plugin-next": "^3.0.1" }, "devDependencies": { - "@types/node": "^25.4.0", + "@types/node": "^25.9.2", "@types/swiper": "^6.0.0", "@vitejs/plugin-vue": "^5.2.3", "@vue/tsconfig": "^0.7.0", @@ -1712,12 +1712,13 @@ } }, "node_modules/@types/node": { - "version": "25.4.0", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.4.0.tgz", - "integrity": "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==", + "version": "25.9.2", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.9.2.tgz", + "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/@types/swiper": { @@ -3432,10 +3433,11 @@ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==" }, "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "dev": true + "version": "7.24.6", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" }, "node_modules/unplugin": { "version": "3.0.0", diff --git a/package.json b/package.json index 6b28298..1a5630b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "type": "module", "scripts": { "dev": "vite", - "build": "vue-tsc -b && vite build", + "build": "vite build", + "build:test": "vite build --mode test", + "build:prod": "vite build --mode production", "preview": "vite preview" }, "dependencies": { diff --git a/src/apis/Model.ts b/src/apis/Model.ts index 91b3cb1..b51a589 100644 --- a/src/apis/Model.ts +++ b/src/apis/Model.ts @@ -1,4 +1,5 @@ -import {get, post} from '../utlis/request' +import { get, getApiBaseURL, post } from '../utlis/request' +import type { TextToTextParams } from '@/types/model' // 文生视频 export const textvideo = (data:D):Promise =>post('/llmage/vidu_inference.dspy',data) @@ -9,6 +10,184 @@ export const imagetovideo = (data:D):Promise =>post('/llmage/vidu_infere // 参考生视频 export const referencevideo = (data:D):Promise =>post('/llmage/video',data) +// 文生图 +export const texttoimage = (data:D):Promise =>post('/llmage/v1/image/generations',data) + +// 文生文 +export const texttoText = (data:D):Promise =>post('/llmage/v1/chat/completions',data) + +const isDonePayload = (payload: string): boolean => /^\[\s*DONE\s*\]$/i.test(payload.trim()) + +const isStructuredPayload = (payload: string): boolean => { + const firstChar = payload.trim().charAt(0) + return firstChar === '{' || firstChar === '[' +} + +const trimEventPayload = (payload: string): string => payload + .replace(/(?:\\r\\n|\\n|\r?\n)+$/g, '') + .trim() + +const isCompletePayload = (payload: string): boolean => { + const text = payload.trim() + if (!text) return false + if (isDonePayload(text) || !isStructuredPayload(text)) return true + + let depth = 0 + let inString = false + let escaped = false + + for (const char of text) { + if (escaped) { + escaped = false + continue + } + + if (char === '\\') { + escaped = inString + continue + } + + if (char === '"') { + inString = !inString + continue + } + + if (inString) continue + + if (char === '{' || char === '[') { + depth += 1 + } else if (char === '}' || char === ']') { + depth -= 1 + } + } + + return depth === 0 && !inString +} + +const extractTextFromPayload = (payload: string): string => { + const normalizedPayload = trimEventPayload(payload) + if (!normalizedPayload || isDonePayload(normalizedPayload)) { + return '' + } + + try { + const parsed = JSON.parse(normalizedPayload) + const contentCandidates = [ + parsed?.choices?.[0]?.delta?.content, + parsed?.choices?.[0]?.message?.content, + parsed?.data?.content, + parsed?.data?.answer, + parsed?.content, + parsed?.answer, + parsed?.text, + ] + const content = contentCandidates.find((item): item is string => typeof item === 'string' && item.length > 0) + + return content || '' + } catch { + return isStructuredPayload(normalizedPayload) ? '' : normalizedPayload + } +} + +const readPayloadsFromBuffer = (buffer: string, flush = false): { payloads: string[]; rest: string } => { + const payloads: string[] = [] + let rest = buffer + const dataMarkerPattern = /(?:^|\r?\n|\\n)data:\s*/ + const nextDataMarkerPattern = /(?:\r?\n|\\n)data:\s*/ + + while (rest) { + const startMatch = dataMarkerPattern.exec(rest) + if (!startMatch) { + return { + payloads: flush && rest.trim() ? [...payloads, rest] : payloads, + rest: flush ? '' : rest, + } + } + + const payloadStart = startMatch.index + startMatch[0].length + const candidateText = rest.slice(payloadStart) + const nextMatch = nextDataMarkerPattern.exec(candidateText) + + if (nextMatch) { + payloads.push(trimEventPayload(candidateText.slice(0, nextMatch.index))) + rest = candidateText.slice(nextMatch.index) + continue + } + + const candidatePayload = trimEventPayload(candidateText) + if (flush || isCompletePayload(candidatePayload)) { + payloads.push(candidatePayload) + rest = '' + } else { + rest = rest.slice(startMatch.index) + } + break + } + + return { payloads, rest } +} + +const extractTextFromChunk = (chunk: string): string => { + const { payloads } = readPayloadsFromBuffer(chunk, true) + return payloads.reduce((result, payload) => result + extractTextFromPayload(payload), '') +} + +// 文生文流式输出 +export const textToTextStream = async ( + data: TextToTextParams, + onMessage: (content: string) => void, + signal?: AbortSignal +) => { + const response = await fetch(`${getApiBaseURL()}/llmage/v1/chat/completions`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + body: JSON.stringify(data), + signal, + }) + + if (!response.ok) { + throw new Error(`文生文请求失败:${response.status}`) + } + + if (!response.body) { + const text = await response.text() + onMessage(extractTextFromChunk(text)) + return + } + + const reader = response.body.getReader() + const decoder = new TextDecoder('utf-8') + let pendingText = '' + + while (true) { + const { done, value } = await reader.read() + if (done) break + + pendingText += decoder.decode(value, { stream: true }) + const { payloads, rest } = readPayloadsFromBuffer(pendingText) + pendingText = rest + + payloads.forEach((payload) => { + const content = extractTextFromPayload(payload) + if (content) { + onMessage(content) + } + }) + } + + pendingText += decoder.decode() + const { payloads } = readPayloadsFromBuffer(pendingText, true) + payloads.forEach((payload) => { + const content = extractTextFromPayload(payload) + if (content) { + onMessage(content) + } + }) +} + // 获取所有模型 export const AllModel = (data:D):Promise =>get('/llmage/get_type_llms.dspy',data) @@ -16,7 +195,10 @@ export const AllModel = (data:D):Promise =>get('/llmage/get_type_llms.ds export const queryModelPrice = (data:D):Promise =>post('/platformbiz/product_query_price.dspy',data) // 获取当天任务列表 -export const getTodayTask = ():Promise =>get('/llmage/get_my_asynctasks.dspy') +export const getTodayTask = (data?:D):Promise =>get('/llmage/get_my_asynctasks.dspy',data) // 获取任务状态 -export const getAsyncTaskStatus = (data:D):Promise =>get('/llmage/get_asynctask_status.dspy',data) \ No newline at end of file +export const getAsyncTaskStatus = (data:D):Promise =>get('/llmage/get_asynctask_status.dspy',data) + +// 历史记录 +export const getHistoryRecord = (data:D):Promise =>get('/llmage/api/get_inference_history.dspy',data) \ No newline at end of file diff --git a/src/assets/css/iconfont/demo_index.html b/src/assets/css/iconfont/demo_index.html index d31edd7..07407ca 100644 --- a/src/assets/css/iconfont/demo_index.html +++ b/src/assets/css/iconfont/demo_index.html @@ -54,6 +54,54 @@
    +
  • + +
    下载
    +
    &#xe621;
    +
  • + +
  • + +
    箭头_上下切换_o
    +
    &#xeb90;
    +
  • + +
  • + +
    搜索
    +
    &#xe619;
    +
  • + +
  • + +
    我的创作
    +
    &#xe61e;
    +
  • + +
  • + +
    +
    &#xe62f;
    +
  • + +
  • + +
    +
    &#xe611;
    +
  • + +
  • + +
    消息
    +
    &#xe8bd;
    +
  • + +
  • + +
    17A发送
    +
    &#xe67d;
    +
  • +
  • 414126695
    @@ -192,9 +240,9 @@
    @font-face {
       font-family: 'iconfont';
    -  src: url('iconfont.woff2?t=1776413178216') format('woff2'),
    -       url('iconfont.woff?t=1776413178216') format('woff'),
    -       url('iconfont.ttf?t=1776413178216') format('truetype');
    +  src: url('iconfont.woff2?t=1780995416168') format('woff2'),
    +       url('iconfont.woff?t=1780995416168') format('woff'),
    +       url('iconfont.ttf?t=1780995416168') format('truetype');
     }
     

    第二步:定义使用 iconfont 的样式

    @@ -220,6 +268,78 @@
      +
    • + +
      + 下载 +
      +
      .icon-xiazai +
      +
    • + +
    • + +
      + 箭头_上下切换_o +
      +
      .icon-jiantou_shangxiaqiehuan_o +
      +
    • + +
    • + +
      + 搜索 +
      +
      .icon-sousuo +
      +
    • + +
    • + +
      + 我的创作 +
      +
      .icon-wodechuangzuo +
      +
    • + +
    • + +
      + 上 +
      +
      .icon-shang +
      +
    • + +
    • + +
      + 下 +
      +
      .icon-xia +
      +
    • + +
    • + +
      + 消息 +
      +
      .icon-xiaoxi +
      +
    • + +
    • + +
      + 17A发送 +
      +
      .icon-a-17Afasong +
      +
    • +
    • @@ -427,6 +547,70 @@
        +
      • + +
        下载
        +
        #icon-xiazai
        +
      • + +
      • + +
        箭头_上下切换_o
        +
        #icon-jiantou_shangxiaqiehuan_o
        +
      • + +
      • + +
        搜索
        +
        #icon-sousuo
        +
      • + +
      • + +
        我的创作
        +
        #icon-wodechuangzuo
        +
      • + +
      • + +
        +
        #icon-shang
        +
      • + +
      • + +
        +
        #icon-xia
        +
      • + +
      • + +
        消息
        +
        #icon-xiaoxi
        +
      • + +
      • + +
        17A发送
        +
        #icon-a-17Afasong
        +
      • +
      • |K=pFhI^JbaW z6N9{Pc>n(Ap74Jh^T4uS~q0fHFt1=C=|;gq=a^b|N_$Ag5^MHd_ccsKYb zmyvgx3LKoh2po5?KM~-1m&zG}EhO%Z+VeVodCm8u(yI`;TAyaV`~*nj`JpdxkuHA| zSn5q!nd8%$S*rnrW-48MotS;WOo8Xk|KRB_4xjo`_C=fl$V~G=rd~|X8Zmj)$d~@{ zj=f>>i1EXFtr6*T_Qe;$#?)_7w9b!8=ayZXR^4Y1Ue`VRcz)w{zJIm6SsY9rF1>hl z>d}+q`b?@&dC!S>LAza0g&^?DyRlgkAT~wQ1UQu0HM(jcRhSc?V4$Gxs5-__!n~9m zYlQ-szn*X8WvI2nn$1JA7!U$VfYgA+5W*CB3sj&eu3yBRq!`|uJ9yKT5ORMBL))6o z(j-wGUd;$&zn|P)n|ye@Y&FO!|C;KZ;KjY(SdaD{9JhCB-^r^BC+f3aq1=|PwAeWy zq|_a)DL*fo&3W}bENSz*XEBB?VzGNAAtaOw!w%M_siCYvSZX$b@L5-@lxQH3y9$fR zD2;`Yb`~2N%K7C2Kg$QOggPl|E%%9ALw-&$q`F1Q-Pp}ym|$&?UceMP1^ik5soX6< zn1{Sx&&Hm;eLB&2YQ0IGPV8tdKbIUfpp*gy1+_)#BCJ)Y9NC4^JD1Xpel7(d5~_5l z(n=B`Bm(#lrKQYdgoP9UT0pK0PzN$$ZFXaILw3?_Xw4v2N=PKvrfD0y-TU3zzJCT` zNv$Q!N--ynmt2@~Ld)y;IL+4-spj+*1wb&b_rNGjzYvGSInXQtq%L^ND^y}Vh{I3~ zP4ZKbJEgRom11a8=aj`x%@Qp%WKtXqwQ{~-@y@yC24XmnIZdK*$Y~WE437qN*W{>M)d` zEdIp4i}9e*AGZ34-Md6C-{%jn(kl-fnk2m2B~irU_#+)cSIVmJ15{RCMb^Okj<38r zPG`<`aP2k!Rw*z2@O#(TZ9VOFc_mqRca&+aA-SPd5i8$V5YXb;wF!5x&u>&5g(@F@ z;0(kTbE0{-45R!(evN68F@xlY<&>NJsiHm0Dk~p27OO%xa_%{iVG#Faw`T%cX5Q%5pyFjIgW_XZw|_l>{r^?Jn;cWv;2Rtcq4jFoW_-7tpnsAVdp| zsKUNecsFnU)kNDZQDp2DZ`Fjx8M1kEjTmM>#O&5ieWoKZnPlRa}_dvV>DSR}ECtO%F5KR(?GS%JLS`9*QD;f<} znQ?$=4SV4qDYtQXe@Qg`Qz*D_pig)3*;o4SPnL%bLK4-sN6e&kteyShTCMHIZ(YeK{GK4q+-JN2 zWj`)|D+kTjXpFo8R|o(c0&A^7jC+s@*xNB0jbo=2)S0FakQsd8XM|yl`pQN)XQ&G8 z^;B8-oVZdD&_Z3O9!h%RqmNV^|NaM(G#UC(AwrO%_&fDs1gqVEAISGP{z%IckIOos!xHotq4p18wq9dk+5XMty$Uwl)bI?)-|l1Tvhw!6g$&f(OBDj{Nc&4){ix!yVarJ z`0dMmPF%V*O4OYzW{<8v1dWi)yNeSUHlN);zlWY-No-Yrg+nx)=RJ(BJT@GO_zkKHaeg+7JkXMjF6b}2a*01Ui!sa&_WSwPMXCCajwpsp72r$}V zV&*d%whiUWFVE5=2yL%Fn@gFg)+YMR>n7FuZ<`xxXFTSPn#-3d9nA@p`Idbonh05Q zOzK%o$Ty5|3p^TymwrnJovmu$b ztE%sq!NFo!_Y}+dLuyn~@2_lIY-rIvH8C;0Hd4OIoUywffu9ZHzvU8UcR!w;my!sO z^B=9|R1B-ayeEY@N>PoA;nPulTEBwpMcmcOp!erS9#G8zK_F~oq2%dNYujR&ZBvHX z^I@Bn-XCURX~2GS0E{2W zvv?QC9})HdHS*+govPJ7R8xC!Bp=)~TwBC@(A|)p+6=d5i}WR{m$x~{C`|fxuL3%L z_1CHIdW*z7-3$WGi6$JWiPq5o>D(FuG<^n<#4OR&{W}6J=*~P{Xb#?eCq{v$jpsO4 zwQ*4Zcpk_iv@hL%#~B|kA&m*UbAP`fV%%;D`2Y2C!R4^0qO=LFF0Mvcv|tSW46#&3xo>M~0 zyfzVT(s|VCCvhrQ!aXoIE6F8aF`|isLB~eT>+N^zdFa`e9*aNv%imee7rIXWd{`_$ zsa=w81m|vV%iAKw4_JrNyv#T$#ISJp%sadu6J$7}4RU*PR;d_}WyI*Pna*}`-FB6y zMz_iWNt?0psv|2?qa`M7u?;tEo)>09@uAuZqJuv+DrrHtfI@+*8B83t!}UG|9mw+7 zvCwT}5EvG$HDMJ)`hN}U_HI5F!;I`tfOs)h2<_(Lc_IykUc&=x%B1O-^nwQ(5JU-& z#!s7HG`0Vm)2uwAr4DZe6eh*40L{?taWI-#^SHd0ZYcLMF-R3h`;g=M(s}qX$%QsW z`8%A5xPYNb;HG0X_+8vAhm=pu}T!9^cVImqDy2FB*=AfQ}?R8rE=xOJ!6 z5C>05hn+YST6Ph6qUI9~bAfoX=t`n3@rvykdf%W?=jEw~8cn-l>fBuQa1bBd-CbP= zJDaDJ=EMJT^kbT*bW-}ytn=-xY%gOoUTNi}RqaiOQVKc`E^2Rfr^?PT8KrH_on$}- z`RUXS3^^74PvQc7omFHnL{nkfcKSE5umf+_c5 zHr2@!vTbM}WI+R<2MQFM-J>d2kO#|WFMd=8}>6kK4k(SIYU6!W}^x>!bzr(L+_{G;?4|SgElxQk7w_>Hbx{ zEFd7*T)d9;f{(Clvn9vO??T>{VHov}T=Mj@Mss$TEM0!q z=~HQN00eu(5OLBo+OtXig~UBX>|yk07C<9&K4x@^x)>4e5_Q(q(AP7bAVi($htdiB zolX9MyAhyx7v&>pNc)dcwfVd6hkN zIWcq9vuAL0PN;$g7qfx_4ZuY6e(^0?F*{JC1<;?(sqC3K{~lh@V95e*-42rW;g?k% zuFA?Hj~g{(+&EyBv2twZzW29*QidpuKX?RIUGoZNaZ-W`^ejKs&|9}Ai~LxCL4(4@ zZ?usgRc&wfC!6S^i7z(pi;ZE3BX_Ik0+fy=i@O300qg7Q$B%E))0H(gmU&}9V8h4_ zz=c8x@M>JXywU5m?Skc$hUMK2UZ|880Ni>MFpwXgJP<#S6rVS+E`a)UlJBJJRQA2l zH`?vF1*rps02zo!!652=K{U|)1L8r%8UNQk^qqNX>8K?c z@+T2}y$kPjCk=ZRSQaRSU>_Kgay#~n<9-hbvRHycegro%`W`*RYhLriv-nU&yLt3( zA{^E@PBUG2VCj?%rcpad%pohT9a{$|9Zz_3@Z2CSeh#nM{cyb?o(~Ti?C?|-@rQdG z$}5_p66HV7C;(3nPa&1>!>6vBg^ZB8(k)N(1J8tqKec-WdOEAv9-htcraUY8s;LIw zaPYxW77+|H=%(n`&fe*=UpM-r11D_U|dm)kB_j(HfD@; z<^do)2naz^1`Xm%!?}}J&m0ki)cRX|Ij@-OV^e=|R%f{yzR#sALhVUa$G_p9#U}Xc zkpB(M3E}dOvXN%0r-==3zX-xPS!2Uci64*DsJ1**g|C2G zK8Wr^hdfUYc5s_jpKxnM>krbYcO6wwmE-px_dCREpf&8Z_klN1vY^+0=zZ&1Yd3wj z?Yr|>2kEZ9-fuI&*zJ_3gt2+2is**&XlI=;KY@d?s$)D=$8M&LN$fU#WDEHw>RAf`Gw+F$^9KmoC zsf_{>EXdyQ@5TS4qoNL6{C7ik95C#9>K2hTGAg>d0E?@`jIm;De?6)tr;goB8Ao1( zGvV_}HZ~ccj-v<5m?xfW?P#dl9Kzdm4u=HCjL*->D;yiugW$TbNE8YMqW~I+@b9CKNMf=wMF>up7Pw-Da`MRB*_3n-kj{R*0&S( zu<}tO7_9hw&8bv_@In)H^c$t^K&P$!hk7Db^T74vt*ys6M5=aeo zc4uwzY*Ul4b5PN&2MrBUg4(%RI9|iBsd11!T!Z8L(f_GdwxJr7lSFK{kMb;!lPoMg zZ$AySef~3e_?7Ako2!OsRZno+nWfTpBwP3=?-+KIr~QU*nlXjg?wT OThXvDpt0`27ytlpSvI2p diff --git a/src/assets/less/Header/header.less b/src/assets/less/Header/header.less index 5999876..0f20176 100644 --- a/src/assets/less/Header/header.less +++ b/src/assets/less/Header/header.less @@ -118,6 +118,14 @@ line-height: 1.1; } + .balance-unit { + margin-left: 3px; + font-size: 12px; + font-weight: 500; + // color: rgba(255, 255, 255, 0.72); + color: #fff; + } + .combo-divider { width: 1px; height: 24px; diff --git a/src/assets/less/RightResult/RightResult.css b/src/assets/less/RightResult/RightResult.css index 628f225..e048d3e 100644 --- a/src/assets/less/RightResult/RightResult.css +++ b/src/assets/less/RightResult/RightResult.css @@ -256,23 +256,3 @@ justify-content: center; align-items: center; } -.login-require-content { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - gap: 24px; -} -.login-require-content .message { - font-size: 16px; - color: rgba(255, 255, 255, 0.7); -} -.login-require-content .login-btn { - width: 140px; - height: 44px; - border-radius: 12px; - font-size: 16px; - background: linear-gradient(270deg, #94d8ff 11.11%, #e0ddff); - border: none; - color: #000; -} diff --git a/src/assets/less/RightResult/RightResult.less b/src/assets/less/RightResult/RightResult.less index fb8a5e1..64b46ef 100644 --- a/src/assets/less/RightResult/RightResult.less +++ b/src/assets/less/RightResult/RightResult.less @@ -310,29 +310,6 @@ align-items: center; } -.login-require-content { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - gap: 24px; - - .message { - font-size: 16px; - color: rgba(255, 255, 255, 0.7); - } - - .login-btn { - width: 140px; - height: 44px; - border-radius: 12px; - font-size: 16px; - background: linear-gradient(270deg, #94d8ff 11.11%, #e0ddff); - border: none; - color: #000; - } -} - /* 状态徽章样式 */ .status-badge { padding: 4px 12px; diff --git a/src/assets/less/Video/refernce/refernce.less b/src/assets/less/Video/refernce/refernce.less index b08db28..1ef65fe 100644 --- a/src/assets/less/Video/refernce/refernce.less +++ b/src/assets/less/Video/refernce/refernce.less @@ -83,6 +83,7 @@ } .reference-container { + padding: 12px; flex: none; gap: 20px; color: #fff; @@ -261,9 +262,10 @@ .input { flex: 1; width: 100%; + height: 100%; display: flex; flex-direction: column; - + margin-top: 10px; :deep(.el-textarea) { flex: 1; display: flex; @@ -314,6 +316,7 @@ display: flex; flex-direction: column; gap: 16px; + padding: 12px; } .select-item { diff --git a/src/assets/less/Video/text/text.less b/src/assets/less/Video/text/text.less index b35b232..b7860f6 100644 --- a/src/assets/less/Video/text/text.less +++ b/src/assets/less/Video/text/text.less @@ -35,6 +35,8 @@ gap: 20px; color: #fff; overflow: hidden; + padding: 12px; + } .input { @@ -75,6 +77,7 @@ display: flex; flex-direction: column; gap: 16px; + padding: 12px; } .select-item { diff --git a/src/assets/less/apiKey/apikey.css b/src/assets/less/apiKey/apikey.css index e4908e9..8f612c5 100644 --- a/src/assets/less/apiKey/apikey.css +++ b/src/assets/less/apiKey/apikey.css @@ -78,30 +78,22 @@ .guide-list li + li { margin-top: 4px; } -.login-require, .empty-state { flex: 1; display: flex; align-items: center; justify-content: center; } -.login-require-content, .empty-state { flex-direction: column; text-align: center; } -.login-require-content img, .empty-state img { width: 220px; height: 220px; object-fit: contain; opacity: 0.55; } -.login-require-content { - display: flex; - gap: 12px; -} -.login-title, .empty-title { font-size: 20px; color: #fff; diff --git a/src/assets/less/apiKey/apikey.less b/src/assets/less/apiKey/apikey.less index 73d3fbe..b4ed810 100644 --- a/src/assets/less/apiKey/apikey.less +++ b/src/assets/less/apiKey/apikey.less @@ -94,7 +94,6 @@ } } -.login-require, .empty-state { flex: 1; display: flex; @@ -102,7 +101,6 @@ justify-content: center; } -.login-require-content, .empty-state { flex-direction: column; text-align: center; @@ -115,12 +113,6 @@ } } -.login-require-content { - display: flex; - gap: 12px; -} - -.login-title, .empty-title { font-size: 20px; color: #fff; diff --git a/src/components/Header/Header.vue b/src/components/Header/Header.vue index 4010b9c..93719ad 100644 --- a/src/components/Header/Header.vue +++ b/src/components/Header/Header.vue @@ -19,7 +19,10 @@

        账户余额 - {{ formattedBalance }} + + {{ formattedBalance }} + +
      diff --git a/src/components/LoginPrompt/LoginPrompt.vue b/src/components/LoginPrompt/LoginPrompt.vue index aafd1b8..751f074 100644 --- a/src/components/LoginPrompt/LoginPrompt.vue +++ b/src/components/LoginPrompt/LoginPrompt.vue @@ -3,7 +3,7 @@ @@ -22,8 +22,8 @@ interface Props { withDefaults(defineProps(), { title: '请先登录', - description: '', - buttonText: '去登录', + description: '登录后即可继续使用当前功能。', + buttonText: '立即登录', fullHeight: false, }); @@ -40,7 +40,7 @@ const handleLogin = () => { display: flex; align-items: center; justify-content: center; - padding: 32px 16px; + padding: 40px 24px; box-sizing: border-box; &.is-full-height { @@ -49,26 +49,48 @@ const handleLogin = () => { } .login-prompt__content { + width: min(460px, 100%); display: flex; flex-direction: column; align-items: center; - gap: 16px; + gap: 18px; + padding: 34px 36px; + // border: 1px solid rgba(148, 216, 255, 0.08); + border-radius: 18px; + // background: + // linear-gradient(180deg, rgba(18, 28, 42, 0.42), rgba(12, 18, 28, 0.18)); text-align: center; } .login-prompt__title { - font-size: 18px; - font-weight: 600; - color: rgba(255, 255, 255, 0.9); + font-size: 24px; + font-weight: 700; + color: rgba(255, 255, 255, 0.92); } .login-prompt__description { - max-width: 520px; - line-height: 1.7; - color: rgba(255, 255, 255, 0.65); + max-width: 390px; + line-height: 1.75; + color: rgba(235, 244, 255, 0.58); + font-size: 16px; } .login-prompt__button { - min-width: 120px; + min-width: 148px; + height: 44px; + margin-top: 8px; + border: none; + border-radius: 12px; + color: #07101a; + background: linear-gradient(270deg, #94d8ff 11.11%, #e0ddff); + font-size: 15px; + font-weight: 700; + box-shadow: 0 12px 28px rgba(148, 216, 255, 0.18); + + &:hover, + &:focus { + color: #07101a; + background: linear-gradient(270deg, #a8e0ff 11.11%, #efedff); + } } diff --git a/src/components/RightResult/RightResult.vue b/src/components/RightResult/RightResult.vue index a5c11ae..688f2bf 100644 --- a/src/components/RightResult/RightResult.vue +++ b/src/components/RightResult/RightResult.vue @@ -5,8 +5,8 @@
      -
      - - {{ getStatusText(task.status) }} - + {{ getTaskTypeText(task) }}
    @@ -62,8 +57,15 @@
    -
    +
    + 图片预览
    +
    @@ -48,7 +49,7 @@ @@ -65,13 +66,19 @@ active-text-color="#00FFCC" @select="handleSelect" > - + + + - +