1
1
<script setup lang="ts">
2
2
import { ref ,computed ,watch } from ' vue' ;
3
- import {useMessage , NButton ,NSelect ,NInput } from ' naive-ui' ;
3
+ import {useMessage , NButton ,NSelect ,NInput , NImage } from ' naive-ui' ;
4
4
import {gptFetch , mlog , upImg } from ' @/api'
5
5
import { homeStore } from ' @/store' ;
6
6
import { SvgIcon } from ' @/components/common' ;
7
+ import { t } from ' @/locales' ;
7
8
8
9
const ms = useMessage ();
9
10
const config = ref ( {
@@ -17,7 +18,13 @@ model:[
17
18
,{ " label" : " Flux.1.1-Pro" , " value" : " flux.1.1-pro" }
18
19
]
19
20
});
20
- const st = ref ({isGo:false });
21
+ interface myFile {
22
+ file: any
23
+ base64: string
24
+ }
25
+ const st = ref ({isGo:false ,quality:' medium' });
26
+ const fsRef= ref () ;
27
+ const base64Array= ref <myFile []>([]);
21
28
const f = ref ({size:' 1024x1024' , prompt:' ' ," model" : " dall-e-3" ," n" : 1 });
22
29
const isDisabled= computed (()=> {
23
30
if (st .value .isGo ) return true ;
@@ -33,7 +40,16 @@ const create= async ()=>{
33
40
// return ;
34
41
let obj= {
35
42
action:' gpt.dall-e-3' ,
36
- data:f .value
43
+ data:{} // f.value
44
+ }
45
+ obj .data = { ... f .value }
46
+ if (isCanImageEdit .value ){
47
+ obj .data = {... obj .data ,quality:st .value .quality };
48
+ }
49
+ if (isCanImageEdit .value && base64Array .value .length > 0 ){
50
+
51
+ obj .data = {... obj .data , ' base64Array' :base64Array .value ,quality:st .value .quality };
52
+ mlog (" data" , ' 我加东西了:' , base64Array .value )
37
53
}
38
54
homeStore .setMyData ({act:' draw' , actData:obj });
39
55
st .value .isGo = true ;
@@ -46,6 +62,15 @@ watch(()=>homeStore.myData.act,(n)=>{
46
62
if (n == ' updateChat' ) st .value .isGo = false ;
47
63
})
48
64
65
+
66
+ const qualityOption= computed (()=> {
67
+ return [
68
+ {label:' High' ,value: ' high' }
69
+ ,{label:' Medium' ,value: ' medium' }
70
+ ,{label:' Low' ,value: ' low' }
71
+
72
+ ]
73
+ });
49
74
const dimensionsList= computed (()=> {
50
75
if (f .value .model == ' dall-e-2' ){
51
76
return [{
@@ -60,6 +85,19 @@ const dimensionsList= computed(()=>{
60
85
}
61
86
];
62
87
}
88
+ if (f .value .model == ' gpt-image-1' ){
89
+ return [{
90
+ " label" : " 1024px*1024px" ,
91
+ " value" : " 1024x1024"
92
+ }, {
93
+ " label" : " 1536px*1024px" ,
94
+ " value" : " 1536x1024"
95
+ }, {
96
+ " label" : " 1024px*1536px" ,
97
+ " value" : " 1024x1536"
98
+ }
99
+ ];
100
+ }
63
101
return [{
64
102
" label" : " 1024px*1024px" ,
65
103
" value" : " 1024x1024"
@@ -76,6 +114,27 @@ const dimensionsList= computed(()=>{
76
114
watch (()=> f .value .model ,(n )=> {
77
115
f .value .size = ' 1024x1024' ;
78
116
})
117
+ const isCanImageEdit= computed (()=> {
118
+ if (f .value .model == ' dall-e-2' ) return true ;
119
+ if (f .value .model == ' gpt-image-1' ) return true ;
120
+ return false ;
121
+ })
122
+
123
+ const selectFile= (input : any )=> {
124
+ const ff= input .target .files [0 ];
125
+ upImg (input .target .files [0 ]).then (d => {
126
+ fsRef .value .value = ' ' ;
127
+ const index = base64Array .value .findIndex (item => item .base64 == d );
128
+ if (index > - 1 ){
129
+ ms .error (t (' mjchat.no2add' ) )
130
+ return ;
131
+ }
132
+ base64Array .value .push ({file: ff ,base64:d });
133
+ if (base64Array .value .length > 1 ) st .value .isGo = true ;
134
+ // if(st)
135
+ }).catch (e => ms .error (e ));
136
+ }
137
+
79
138
</script >
80
139
<template >
81
140
<section class =" mb-4 flex justify-between items-center" >
@@ -86,10 +145,32 @@ watch(()=>f.value.model,(n)=>{
86
145
<div >{{ $t('mjchat.size') }}</div >
87
146
<n-select v-model:value =" f.size" :options =" dimensionsList" filterable tag size =" small" class =" !w-[70%]" :clearable =" false" />
88
147
</section >
148
+ <section class =" mb-4 flex justify-between items-center" v-if =" isCanImageEdit" >
149
+ <div >Quality</div >
150
+ <n-select v-model:value =" st.quality" :options =" qualityOption" filterable tag size =" small" class =" !w-[70%]" :clearable =" false" />
151
+ </section >
152
+
89
153
<div class =" mb-1" >
90
154
<n-input type =" textarea" v-model:value =" f.prompt" :placeholder =" $t('mjchat.prompt')" round clearable maxlength =" 500" show-count
91
155
:autosize =" { minRows:3, maxRows:10 }" />
92
156
</div >
157
+ <div class =" mb-1" v-if =" isCanImageEdit" >
158
+ <div class =" flex justify-start items-center flex-wrap myblend" >
159
+
160
+ <div class =" w-[var(--my-blend-img-size)] h-[var(--my-blend-img-size)] mr-2 mt-2 bg-[#ddd] overflow-hidden rounded-sm relative group " v-for =" item in base64Array" >
161
+ <NImage :src =" item.base64" object-fit =" cover" ></NImage >
162
+ <SvgIcon icon =" fluent:delete-12-filled"
163
+ class =" absolute top-0 right-0 text-red-600 text-[20px] cursor-pointer hidden group-hover:block "
164
+ @click =" base64Array.splice(base64Array.indexOf(item),1)" ></SvgIcon >
165
+ </div >
166
+
167
+ <div @click =" fsRef.click()" v-if =" base64Array.length<3"
168
+ class =" w-[var(--my-blend-img-size)] h-[var(--my-blend-img-size)] mt-2 bg-[#999] overflow-hidden rounded-sm flex justify-center items-center cursor-pointer" >
169
+ <SvgIcon icon =" mdi:add-bold" class =" text-[40px] text-[#fff]" ></SvgIcon >
170
+ </div >
171
+
172
+ </div >
173
+ </div >
93
174
94
175
<div class =" mb-4 flex justify-end items-center" >
95
176
<div class =" flex " >
@@ -103,4 +184,13 @@ watch(()=>f.value.model,(n)=>{
103
184
<ul class =" pt-4" v-html =" $t('mjchat.dalleInfo')" >
104
185
105
186
</ul >
106
- </template >
187
+
188
+ <input type =" file" @change =" selectFile" ref =" fsRef" style =" display : none " accept =" image/jpeg, image/jpg, image/png, image/gif" />
189
+
190
+ </template >
191
+
192
+ <style scoped>
193
+ .myblend {
194
+ --my-blend-img-size :75px
195
+ }
196
+ </style >
0 commit comments