Skip to content

Commit 7706e46

Browse files
committed
【代码优化】AI:绘图 index.vue 代码梳理 65%(Dall3.vue)
1 parent 75af4f0 commit 7706e46

File tree

3 files changed

+75
-80
lines changed

3 files changed

+75
-80
lines changed

src/views/ai/image/index/dall3/index.vue renamed to src/views/ai/image/index/components/dall3/index.vue

Lines changed: 58 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
<div class="prompt">
44
<el-text tag="b">画面描述</el-text>
55
<el-text tag="p">建议使用“形容词+动词+风格”的格式,使用“,”隔开</el-text>
6-
<!-- TODO @fan:style 看看能不能哟 unocss 替代 @芋艿 尝试了下没效果,哪个地方有使用么,我看看 -->
76
<el-input
87
v-model="prompt"
98
maxlength="1024"
109
rows="5"
11-
style="width: 100%; margin-top: 15px;"
10+
class="w-100% mt-15px"
1211
input-style="border-radius: 7px;"
1312
placeholder="例如:童话里的小屋应该是什么样子?"
1413
show-word-limit
@@ -20,12 +19,13 @@
2019
<el-text tag="b">随机热词</el-text>
2120
</div>
2221
<el-space wrap class="word-list">
23-
<el-button round
24-
class="btn"
25-
:type="(selectHotWord === hotWord ? 'primary' : 'default')"
26-
v-for="hotWord in hotWords"
27-
:key="hotWord"
28-
@click="handleHotWordClick(hotWord)"
22+
<el-button
23+
round
24+
class="btn"
25+
:type="selectHotWord === hotWord ? 'primary' : 'default'"
26+
v-for="hotWord in ImageHotWords"
27+
:key="hotWord"
28+
@click="handleHotWordClick(hotWord)"
2929
>
3030
{{ hotWord }}
3131
</el-button>
@@ -37,17 +37,12 @@
3737
</div>
3838
<el-space wrap class="model-list">
3939
<div
40-
:class="selectModel === model.key ? 'modal-item selectModel' : 'modal-item'"
41-
v-for="model in models"
40+
:class="model === model.key ? 'modal-item selectModel' : 'modal-item'"
41+
v-for="model in Dall3Models"
4242
:key="model.key"
43-
4443
>
45-
<el-image
46-
:src="model.image"
47-
fit="contain"
48-
@click="handleModelClick(model)"
49-
/>
50-
<div class="model-font">{{model.name}}</div>
44+
<el-image :src="model.image" fit="contain" @click="handleModelClick(model)" />
45+
<div class="model-font">{{ model.name }}</div>
5146
</div>
5247
</el-space>
5348
</div>
@@ -57,16 +52,16 @@
5752
</div>
5853
<el-space wrap class="image-style-list">
5954
<div
60-
:class="selectImageStyle === imageStyle.key ? 'image-style-item selectImageStyle' : 'image-style-item'"
55+
:class="
56+
selectImageStyle === imageStyle.key
57+
? 'image-style-item selectImageStyle'
58+
: 'image-style-item'
59+
"
6160
v-for="imageStyle in imageStyleList"
6261
:key="imageStyle.key"
6362
>
64-
<el-image
65-
:src="imageStyle.image"
66-
fit="contain"
67-
@click="handleStyleClick(imageStyle)"
68-
/>
69-
<div class="style-font">{{imageStyle.name}}</div>
63+
<el-image :src="imageStyle.image" fit="contain" @click="handleStyleClick(imageStyle)" />
64+
<div class="style-font">{{ imageStyle.name }}</div>
7065
</div>
7166
</el-space>
7267
</div>
@@ -75,29 +70,30 @@
7570
<el-text tag="b">画面比例</el-text>
7671
</div>
7772
<el-space wrap class="size-list">
78-
<div class="size-item"
79-
v-for="imageSize in imageSizeList"
80-
:key="imageSize.key"
81-
@click="handleSizeClick(imageSize)">
82-
<div :class="selectImageSize === imageSize.key ? 'size-wrapper selectImageSize' : 'size-wrapper'">
73+
<div
74+
class="size-item"
75+
v-for="imageSize in imageSizeList"
76+
:key="imageSize.key"
77+
@click="handleSizeClick(imageSize)"
78+
>
79+
<div :class="size === imageSize.key ? 'size-wrapper selectImageSize' : 'size-wrapper'">
8380
<div :style="imageSize.style"></div>
8481
</div>
8582
<div class="size-font">{{ imageSize.name }}</div>
8683
</div>
8784
</el-space>
8885
</div>
8986
<div class="btns">
90-
<el-button type="primary"
91-
size="large"
92-
round
93-
:loading="drawIn"
94-
@click="handleGenerateImage">
95-
{{drawIn ? '生成中' : '生成内容'}}
87+
<el-button type="primary" size="large" round :loading="drawIn" @click="handleGenerateImage">
88+
{{ drawIn ? '生成中' : '生成内容' }}
9689
</el-button>
9790
</div>
9891
</template>
9992
<script setup lang="ts">
100-
import {ImageApi, ImageDrawReqVO, ImageVO} from '@/api/ai/image';
93+
import { ImageApi, ImageDrawReqVO, ImageVO } from '@/api/ai/image'
94+
import { Dall3Models, ImageHotWords } from '@/views/ai/utils/constants'
95+
96+
const message = useMessage() // 消息弹窗
10197
10298
// image 模型
10399
interface ImageModelVO {
@@ -109,70 +105,55 @@ interface ImageModelVO {
109105
// image 大小
110106
interface ImageSizeVO {
111107
key: string
112-
name: string,
113-
style: string,
114-
width: string,
115-
height: string,
108+
name: string
109+
style: string
110+
width: string
111+
height: string
116112
}
117113
118114
// 定义属性
119-
const prompt = ref<string>('') // 提示词
120-
const drawIn = ref<boolean>(false) // 生成中
115+
const prompt = ref<string>('') // 提示词
116+
const drawIn = ref<boolean>(false) // 生成中
121117
const selectHotWord = ref<string>('') // 选中的热词
122-
const hotWords = ref<string[]>(['中国旗袍', '古装美女', '卡通头像', '机甲战士', '童话小屋', '中国长城']) // 热词
123-
const selectModel = ref<string>('dall-e-3') // 模型
124-
// message
125-
const message = useMessage()
126-
const models = ref<ImageModelVO[]>([
127-
{
128-
key: 'dall-e-3',
129-
name: 'DALL·E 3',
130-
image: `/src/assets/ai/dall2.jpg`,
131-
},
132-
{
133-
key: 'dall-e-2',
134-
name: 'DALL·E 2',
135-
image: `/src/assets/ai/dall3.jpg`,
136-
},
137-
]) // 模型
118+
const model = ref<string>('dall-e-3') // 模型
119+
const size = ref<string>('1024x1024') // 选中 size
138120
139121
const selectImageStyle = ref<string>('vivid') // style 样式
140122
141123
const imageStyleList = ref<ImageModelVO[]>([
142124
{
143125
key: 'vivid',
144126
name: '清晰',
145-
image: `/src/assets/ai/qingxi.jpg`,
127+
image: `/src/assets/ai/qingxi.jpg`
146128
},
147129
{
148130
key: 'natural',
149131
name: '自然',
150-
image: `/src/assets/ai/ziran.jpg`,
151-
},
152-
]) // style
132+
image: `/src/assets/ai/ziran.jpg`
133+
}
134+
]) // style
153135
154-
const selectImageSize = ref<string>('1024x1024') // 选中 size
155136
const imageSizeList = ref<ImageSizeVO[]>([
156137
{
157138
key: '1024x1024',
158139
name: '1:1',
159140
width: '1024',
160141
height: '1024',
161-
style: 'width: 30px; height: 30px;background-color: #dcdcdc;',
142+
style: 'width: 30px; height: 30px;background-color: #dcdcdc;'
162143
},
163144
{
164145
key: '1024x1792',
165146
name: '3:5',
166147
width: '1024',
167148
height: '1792',
168-
style: 'width: 30px; height: 50px;background-color: #dcdcdc;',
149+
style: 'width: 30px; height: 50px;background-color: #dcdcdc;'
169150
},
170151
{
171152
key: '1792x1024',
172153
name: '5:3',
173154
width: '1792',
174155
height: '1024',
175-
style: 'width: 50px; height: 30px;background-color: #dcdcdc;',
156+
style: 'width: 50px; height: 30px;background-color: #dcdcdc;'
176157
}
177158
]) // size
178159
@@ -196,7 +177,7 @@ const handleHotWordClick = async (hotWord: string) => {
196177
197178
/** 模型 - click */
198179
const handleModelClick = async (model: ImageModelVO) => {
199-
selectModel.value = model.key
180+
model.value = model.key
200181
}
201182
202183
/** 样式 - click */
@@ -206,7 +187,7 @@ const handleStyleClick = async (imageStyle: ImageModelVO) => {
206187
207188
/** size - click */
208189
const handleSizeClick = async (imageSize: ImageSizeVO) => {
209-
selectImageSize.value = imageSize.key
190+
size.value = imageSize.key
210191
}
211192
212193
/** 图片生产 */
@@ -217,23 +198,23 @@ const handleGenerateImage = async () => {
217198
// 加载中
218199
drawIn.value = true
219200
// 回调
220-
emits('onDrawStart', selectModel.value)
221-
const imageSize = imageSizeList.value.find(item => item.key === selectImageSize.value) as ImageSizeVO
201+
emits('onDrawStart', model.value)
202+
const imageSize = imageSizeList.value.find((item) => item.key === size.value) as ImageSizeVO
222203
const form = {
223204
platform: 'OpenAI',
224205
prompt: prompt.value, // 提示词
225-
model: selectModel.value, // 模型
206+
model: model.value, // 模型
226207
width: imageSize.width, // size 不能为空
227208
height: imageSize.height, // size 不能为空
228209
options: {
229-
style: selectImageStyle.value, // 图像生成的风格
210+
style: selectImageStyle.value // 图像生成的风格
230211
}
231212
} as ImageDrawReqVO
232213
// 发送请求
233214
await ImageApi.drawImage(form)
234215
} finally {
235216
// 回调
236-
emits('onDrawComplete', selectModel.value)
217+
emits('onDrawComplete', model.value)
237218
// 加载结束
238219
drawIn.value = false
239220
}
@@ -242,17 +223,18 @@ const handleGenerateImage = async () => {
242223
/** 填充值 */
243224
const settingValues = async (imageDetail: ImageVO) => {
244225
prompt.value = imageDetail.prompt
245-
selectModel.value = imageDetail.model
226+
model.value = imageDetail.model
246227
//
247228
selectImageStyle.value = imageDetail.options?.style
248229
//
249-
const imageSize = imageSizeList.value.find(item => item.key === `${imageDetail.width}x${imageDetail.height}`) as ImageSizeVO
230+
const imageSize = imageSizeList.value.find(
231+
(item) => item.key === `${imageDetail.width}x${imageDetail.height}`
232+
) as ImageSizeVO
250233
await handleSizeClick(imageSize)
251234
}
252235
253236
/** 暴露组件方法 */
254237
defineExpose({ settingValues })
255-
256238
</script>
257239
<style scoped lang="scss">
258240
// 提示词
@@ -309,7 +291,6 @@ defineExpose({ settingValues })
309291
}
310292
}
311293
312-
313294
// 样式 style
314295
.image-style {
315296
margin-top: 30px;

src/views/ai/image/index/index.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,17 @@
3030
import ImageList from './components/ImageList.vue'
3131
import { AiPlatformEnum } from '@/views/ai/utils/constants'
3232
import { ImageVO } from '@/api/ai/image'
33-
import Dall3 from './dall3/index.vue'
33+
import Dall3 from './components/dall3/index.vue'
3434
import Midjourney from './midjourney/index.vue'
3535
import StableDiffusion from './components/stableDiffusion/index.vue'
3636
3737
const imageListRef = ref<any>() // image 列表 ref
38-
const dall3Ref = ref<any>() // openai ref
38+
const dall3Ref = ref<any>() // dall3(openai) ref
3939
const midjourneyRef = ref<any>() // midjourney ref
4040
const stableDiffusionRef = ref<any>() // stable diffusion ref
4141
4242
// 定义属性
43-
const selectPlatform = ref('StableDiffusion')
43+
const selectPlatform = ref(AiPlatformEnum.OPENAI)
4444
const platformOptions = [
4545
{
4646
label: 'DALL3 绘画',

src/views/ai/utils/constants.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ export const ImageHotEnglishWords = [
6363
export interface ImageModelVO {
6464
key: string
6565
name: string
66+
image?: string
6667
}
6768

6869
export const StableDiffusionSamplers = ref<ImageModelVO[]>([
@@ -210,3 +211,16 @@ export const StableDiffusionClipGuidancePresets = ref<ImageModelVO[]>([
210211
name: 'SLOWEST'
211212
}
212213
])
214+
215+
export const Dall3Models = ref<ImageModelVO[]>([
216+
{
217+
key: 'dall-e-3',
218+
name: 'DALL·E 3',
219+
image: `/src/assets/ai/dall2.jpg`
220+
},
221+
{
222+
key: 'dall-e-2',
223+
name: 'DALL·E 2',
224+
image: `/src/assets/ai/dall3.jpg`
225+
}
226+
])

0 commit comments

Comments
 (0)