You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
608 lines
12 KiB
608 lines
12 KiB
|
3 years ago
|
<template>
|
||
|
|
<view class="container">
|
||
|
|
<uni-forms :modelValue="formData">
|
||
|
|
<!-- 提示词 -->
|
||
|
|
<view class="head">
|
||
|
|
<view>
|
||
|
|
<uni-easyinput type="textarea" autoHeight v-model="formData.promptText" placeholder="请输入想生成画的提示词" class="promptInput"></uni-easyinput>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
|
||
|
|
<view class="keywords">
|
||
|
|
<view class="head">
|
||
|
|
<view class="left">
|
||
|
|
<view class="icon">
|
||
|
|
<uni-icons type="fire-filled" size="20"></uni-icons>
|
||
|
|
</view>
|
||
|
|
<view class="title">提示词示例</view>
|
||
|
|
</view>
|
||
|
|
<view class="right" @click="getRandPrompt">
|
||
|
|
<view class="title">换一批</view>
|
||
|
|
<view class="icon">
|
||
|
|
<uni-icons type="refreshempty" size="20"></uni-icons>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
<view class="lists">
|
||
|
|
<view @click="onClickPrompt(index)" :class="index == prompt_active?'item active':'item'"
|
||
|
|
v-for="(item,index) in promptList" :key="index">{{ item.text }}</view>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
|
||
|
|
<!-- 创作风格 -->
|
||
|
|
<view class="style">
|
||
|
|
<view class="head">
|
||
|
|
<view class="left">
|
||
|
|
<view class="icon">
|
||
|
|
<uni-icons type="star-filled" size="20"></uni-icons>
|
||
|
|
</view>
|
||
|
|
<view class="title">选择创作风格</view>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
|
||
|
|
<scroll-view scroll-x="true" class="styleBox">
|
||
|
|
<block v-for="(item,index) in paintStyle" :key="index">
|
||
|
|
<view class="styleItem" :class="style_active == item.id?'styleItem styleActive':'styleItem'" @click="onClickStyle(item.id,item.modelName,item.name)">
|
||
|
|
<image :src="item.imgUrl" class="styleCover" mode="aspectFill"></image>
|
||
|
|
<text class="styleName">{{item.name}}</text>
|
||
|
|
</view>
|
||
|
|
</block>
|
||
|
|
</scroll-view>
|
||
|
|
|
||
|
|
<!-- 尺寸 -->
|
||
|
|
<view class="size">
|
||
|
|
<view class="head">
|
||
|
|
<view class="left">
|
||
|
|
<view class="icon">
|
||
|
|
<uni-icons type="map-filled" size="20"></uni-icons>
|
||
|
|
</view>
|
||
|
|
<view class="title">选择画布大小</view>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
<view class="lists">
|
||
|
|
<view :class="size_active==item.id?'item active':'item'" @click="onClickSize(item.id,item.height,item.width)"
|
||
|
|
v-for="(item,index) in size" :key="index">{{ item.text }}</view>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
|
||
|
|
<view class="bottom">
|
||
|
|
<view>
|
||
|
|
<button type="default" @click="$noMultipleClicks(startPaint)" class="startPaint">开始创作</button>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
</uni-forms>
|
||
|
|
</view>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script>
|
||
|
|
import base64ToImg from '@/utils/base64Utils';
|
||
|
|
import {getPaintStyle, getPrompt, textToImg} from '@/api/paint.js';
|
||
|
|
export default {
|
||
|
|
data() {
|
||
|
|
return {
|
||
|
|
formData:{
|
||
|
|
size_height: undefined,
|
||
|
|
size_width: undefined,
|
||
|
|
modelName: undefined,
|
||
|
|
styleName: undefined,
|
||
|
|
promptText: undefined
|
||
|
|
},
|
||
|
|
noClick:true, //防止重复提交
|
||
|
|
promptList: [],
|
||
|
|
paintStyle:[],
|
||
|
|
size_active: 0,
|
||
|
|
prompt_active: 0,
|
||
|
|
style_active: 0,
|
||
|
|
size: [
|
||
|
|
{
|
||
|
|
id: 1,
|
||
|
|
text: '正方形(512x512)',
|
||
|
|
height: 512,
|
||
|
|
width: 512
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 2,
|
||
|
|
text: '宽屏(1280x720)',
|
||
|
|
height: 1280,
|
||
|
|
width: 720
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 3,
|
||
|
|
text: '竖屏(720x1280)',
|
||
|
|
height: 720,
|
||
|
|
width: 1280
|
||
|
|
}
|
||
|
|
],
|
||
|
|
rules:{
|
||
|
|
prompt:{
|
||
|
|
rules:[{
|
||
|
|
required: true,
|
||
|
|
errorMessage: '请输入关键词',
|
||
|
|
}]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
// onReady() {
|
||
|
|
// //设置校验规则
|
||
|
|
// this.$refs.form.setRules(this.rules);
|
||
|
|
// },
|
||
|
|
created() {
|
||
|
|
//this.base64ToPath();
|
||
|
|
|
||
|
|
},
|
||
|
|
onLoad() {
|
||
|
|
this.getPaintStyleList();
|
||
|
|
this.getPrompt();
|
||
|
|
},
|
||
|
|
|
||
|
|
methods: {
|
||
|
|
|
||
|
|
|
||
|
|
startPaint(){
|
||
|
|
//判断必填项是否都填了
|
||
|
|
let that = this;
|
||
|
|
// console.log('创作prompt为:',that.formData.promptText)
|
||
|
|
// console.log('创作尺寸高度为:',that.formData.size_height)
|
||
|
|
// console.log('创作尺寸宽度为:',that.formData.size_width)
|
||
|
|
// console.log('创作风格为:',that.formData.style_model_name)
|
||
|
|
|
||
|
|
//判断是否登录
|
||
|
|
const userInfo = uni.getStorageSync('userInfo');
|
||
|
|
console.log('userInfo:',userInfo)
|
||
|
|
const token = uni.getStorageSync('token');
|
||
|
|
if((Object.keys(userInfo).length!=0) && (Object.keys(token).length!=0)){
|
||
|
|
//跳转详情页生成图片
|
||
|
|
uni.showModal({
|
||
|
|
title: '温馨提示',
|
||
|
|
content: '任务创建完成,点击跳转生成内容!',
|
||
|
|
success(res) {
|
||
|
|
if(res.confirm){
|
||
|
|
const data = {
|
||
|
|
width: that.formData.size_width,
|
||
|
|
height: that.formData.size_height,
|
||
|
|
prompt: that.formData.promptText,
|
||
|
|
modelName: that.formData.modelName,
|
||
|
|
styleName: that.formData.styleName,
|
||
|
|
painterId: userInfo.id,
|
||
|
|
painterName: userInfo.username
|
||
|
|
}
|
||
|
|
uni.navigateTo({
|
||
|
|
url: './paintDetail?data='+JSON.stringify(data)
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}else{
|
||
|
|
uni.showModal({
|
||
|
|
title:'提示',
|
||
|
|
content:'您还没有登录!点击确定跳转登录界面以体验服务',
|
||
|
|
success(res) {
|
||
|
|
if (res.confirm) {
|
||
|
|
//跳转登录界面
|
||
|
|
uni.switchTab({
|
||
|
|
url: '/pages/userInfo/userInfo'
|
||
|
|
});
|
||
|
|
}else if(res.cancel){
|
||
|
|
uni.showToast({
|
||
|
|
title:'登录获取更好的服务体验哟!',
|
||
|
|
duration: 2000
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
},
|
||
|
|
//画布大小
|
||
|
|
onClickSize(id,height,width) {
|
||
|
|
this.size_active = id
|
||
|
|
//console.log('所选尺寸id为:',this.size_active)
|
||
|
|
this.formData.size_height = height
|
||
|
|
//console.log('所选尺寸高度为:',this.formData.size_height)
|
||
|
|
this.formData.size_width = width
|
||
|
|
//console.log('所选尺寸宽度为:',this.formData.size_width)
|
||
|
|
},
|
||
|
|
//提示词
|
||
|
|
onClickPrompt(index) {
|
||
|
|
this.prompt_active = index
|
||
|
|
this.formData.promptText = this.promptList[index].text
|
||
|
|
//console.log('this.prompt_active',this.prompt_active)
|
||
|
|
},
|
||
|
|
//创作风格
|
||
|
|
onClickStyle(id,modelName,styleName) {
|
||
|
|
this.style_active = id
|
||
|
|
//console.log('所选风格id为',this.style_active)
|
||
|
|
this.formData.modelName = modelName
|
||
|
|
this.formData.styleName = styleName
|
||
|
|
//console.log('所选风格为',this.formData.style_model_name)
|
||
|
|
},
|
||
|
|
//随机选取提示词
|
||
|
|
getRandPrompt() {
|
||
|
|
this.promptList = this.getRandomArrayElements(this.promptList, 10)
|
||
|
|
this.promptText = this.promptList[this.prompt_active].text
|
||
|
|
},
|
||
|
|
|
||
|
|
//获取绘画风格
|
||
|
|
async getPaintStyleList() {
|
||
|
|
const res = await getPaintStyle();
|
||
|
|
if (res.data.code === 200) {
|
||
|
|
this.paintStyle = res.data.data
|
||
|
|
//console.log('this.paintStyle',this.paintStyle)
|
||
|
|
}else {
|
||
|
|
uni.showModal({
|
||
|
|
content: '绘画风格加载失败!',
|
||
|
|
showCancel: false
|
||
|
|
});
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
//获取提示词列表
|
||
|
|
async getPrompt() {
|
||
|
|
const res = await getPrompt();
|
||
|
|
if (res.data.code === 200) {
|
||
|
|
this.promptList = res.data.data
|
||
|
|
//console.log('this.promptList',this.promptList)
|
||
|
|
}else {
|
||
|
|
uni.showModal({
|
||
|
|
content: '提示词列表加载失败!',
|
||
|
|
showCancel: false
|
||
|
|
});
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
getRandomArrayElements(arr, count) {
|
||
|
|
var shuffled = arr.slice(0),
|
||
|
|
i = arr.length,
|
||
|
|
min = i - count,
|
||
|
|
temp, index;
|
||
|
|
while (i-- > min) {
|
||
|
|
index = Math.floor((i + 1) * Math.random());
|
||
|
|
temp = shuffled[index];
|
||
|
|
shuffled[index] = shuffled[i];
|
||
|
|
shuffled[i] = temp;
|
||
|
|
}
|
||
|
|
return shuffled.slice(min);
|
||
|
|
},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<style lang="scss">
|
||
|
|
.size {
|
||
|
|
width: 100%;
|
||
|
|
margin: 15rpx auto;
|
||
|
|
|
||
|
|
.lists {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
flex-wrap: wrap;
|
||
|
|
justify-content: space-between;
|
||
|
|
|
||
|
|
.item {
|
||
|
|
background-color: #fff;
|
||
|
|
padding: 10rpx 30rpx;
|
||
|
|
border-radius: 10rpx;
|
||
|
|
color: #666;
|
||
|
|
border: 1rpx solid #666;
|
||
|
|
margin-bottom: 10rpx;
|
||
|
|
font-size: 24rpx;
|
||
|
|
}
|
||
|
|
|
||
|
|
.active {
|
||
|
|
color: #060101;
|
||
|
|
border: 1rpx solid #F22E38;
|
||
|
|
background-color: #FFDEE0; //# FFDEE0
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.head {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
justify-content: space-between;
|
||
|
|
margin-bottom: 30rpx;
|
||
|
|
|
||
|
|
.left {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
align-items: center;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
font-size: 28rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.right {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
align-items: center;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
margin-right: 15rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.play {
|
||
|
|
width: 92%;
|
||
|
|
margin: 15rpx auto;
|
||
|
|
|
||
|
|
.lists {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
|
||
|
|
.item {
|
||
|
|
background-color: #FFDEE0;
|
||
|
|
padding: 10rpx 30rpx;
|
||
|
|
border-radius: 10rpx;
|
||
|
|
height: 30rpx;
|
||
|
|
color: #F22E38;
|
||
|
|
border: 1rpx solid #F22E38;
|
||
|
|
margin-bottom: 10rpx;
|
||
|
|
font-size: 24rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.head {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
justify-content: space-between;
|
||
|
|
margin-bottom: 30rpx;
|
||
|
|
|
||
|
|
.left {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
align-items: center;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
font-size: 28rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.right {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
align-items: center;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
margin-right: 15rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.style {
|
||
|
|
width: 92%;
|
||
|
|
margin: 15rpx auto;
|
||
|
|
|
||
|
|
.lists {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
flex-wrap: wrap;
|
||
|
|
justify-content: space-between;
|
||
|
|
|
||
|
|
.item {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: column;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: center;
|
||
|
|
margin-bottom: 30rpx;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
margin-top: 15rpx;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
.active {
|
||
|
|
position: relative;
|
||
|
|
|
||
|
|
color: #F22E38;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.head {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
justify-content: space-between;
|
||
|
|
margin-bottom: 30rpx;
|
||
|
|
|
||
|
|
.left {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
align-items: center;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
font-size: 28rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.right {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
align-items: center;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
margin-right: 15rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.keywords {
|
||
|
|
width: 92%;
|
||
|
|
margin: 15rpx auto;
|
||
|
|
|
||
|
|
.lists {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
flex-wrap: wrap;
|
||
|
|
justify-content: space-between;
|
||
|
|
|
||
|
|
.item {
|
||
|
|
background-color: #fff;
|
||
|
|
padding: 10rpx 15rpx;
|
||
|
|
border-radius: 10rpx;
|
||
|
|
color: #666;
|
||
|
|
border: 1rpx solid #666;
|
||
|
|
max-width: 128rpx;
|
||
|
|
margin-bottom: 10rpx;
|
||
|
|
font-size: 24rpx;
|
||
|
|
white-space: nowrap;
|
||
|
|
text-overflow: ellipsis;
|
||
|
|
overflow: hidden;
|
||
|
|
}
|
||
|
|
|
||
|
|
.active {
|
||
|
|
color: #060101;
|
||
|
|
border: 1rpx solid #F22E38;
|
||
|
|
background-color: #FFDEE0;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
.head {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
justify-content: space-between;
|
||
|
|
margin-bottom: 15rpx;
|
||
|
|
|
||
|
|
.left {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
align-items: center;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
font-size: 28rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.right {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
align-items: center;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
margin-right: 15rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
page {
|
||
|
|
background-color: #fff;
|
||
|
|
padding-bottom: 120rpx;
|
||
|
|
}
|
||
|
|
|
||
|
|
.btn-action {
|
||
|
|
width: 90%;
|
||
|
|
position: fixed;
|
||
|
|
bottom: 0rpx;
|
||
|
|
left: 4%;
|
||
|
|
height: 120rpx;
|
||
|
|
|
||
|
|
.btn-group {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: row;
|
||
|
|
justify-content: space-between;
|
||
|
|
|
||
|
|
.rand {
|
||
|
|
width: 40%;
|
||
|
|
|
||
|
|
.u-button {
|
||
|
|
height: 100rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.start {
|
||
|
|
width: 55%;
|
||
|
|
|
||
|
|
.btn-normal {
|
||
|
|
height: 100rpx;
|
||
|
|
line-height: normal;
|
||
|
|
font-size: 28rpx;
|
||
|
|
border-radius: 50rpx;
|
||
|
|
background-color: #f22e38;
|
||
|
|
border: none;
|
||
|
|
color: #f4f4f5;
|
||
|
|
display: flex;
|
||
|
|
flex-direction: column;
|
||
|
|
justify-content: center;
|
||
|
|
box-shadow: 3rpx 3rpx 10rpx #dd6161;
|
||
|
|
|
||
|
|
.title {
|
||
|
|
font-weight: bolder;
|
||
|
|
}
|
||
|
|
|
||
|
|
.small {
|
||
|
|
font-size: 24rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.btn-normal::after {
|
||
|
|
border: initial;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.styleBox{
|
||
|
|
white-space: nowrap; // 滚动必须加的属性
|
||
|
|
width: 700rpx;
|
||
|
|
margin-left: 30rpx;
|
||
|
|
//padding-right: 20rpx;
|
||
|
|
|
||
|
|
.styleItem{
|
||
|
|
width: 166rpx;
|
||
|
|
height: 170rpx;
|
||
|
|
margin-right: 20rpx;
|
||
|
|
display: inline-flex; // item的外层定义成行内元素才可进行滚动 inline-block / inline-flex 均可
|
||
|
|
flex-direction: column;
|
||
|
|
align-items: center;
|
||
|
|
border: 5rpx solid #fff;
|
||
|
|
border-radius: 10rpx;
|
||
|
|
overflow: hidden;
|
||
|
|
position: relative;
|
||
|
|
}
|
||
|
|
|
||
|
|
.styleActive {
|
||
|
|
color: #060101;
|
||
|
|
border: 1rpx solid #F22E38;
|
||
|
|
background-color: #FFDEE0;
|
||
|
|
opacity: 0.9;
|
||
|
|
font-weight: 900;
|
||
|
|
}
|
||
|
|
|
||
|
|
.styleCover{
|
||
|
|
width: 165rpx;
|
||
|
|
height: 165rpx;
|
||
|
|
}
|
||
|
|
|
||
|
|
.styleName{
|
||
|
|
font-size: 36rpx;
|
||
|
|
color: #000000;
|
||
|
|
line-height: 42rpx;
|
||
|
|
padding: 0;
|
||
|
|
width: 100%;
|
||
|
|
text-align: center;
|
||
|
|
text-overflow: ellipsis;
|
||
|
|
white-space: nowrap;
|
||
|
|
overflow: hidden;
|
||
|
|
position: absolute;
|
||
|
|
background-color: #FFF;
|
||
|
|
opacity: 0.5;
|
||
|
|
top: 125rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.startPaint{
|
||
|
|
background-color: #1A96DB;
|
||
|
|
border: 1px solid #F22E38;
|
||
|
|
border-radius: 10rpx;
|
||
|
|
}
|
||
|
|
</style>
|