抖音小程序端
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.
 
 
 
 

443 lines
10 KiB

<template>
<view class="wrap">
<view class="desc-box">
<text class="title">内容描述</text>
<textarea class="desc-input" v-model="contentDesc"
placeholder="请输入内容描述~" />
<!-- <view class="bottom-box">
<view class="keyTips" @click="clickRandomKey()"></view>
<view class="limit">{{drawDesc.length}}/50</view>
</view> -->
</view>
<view class="keywords">
<view class="head">
<view class="left">
<view class="title">内容描述示例</view>
</view>
<view class="right" @click="getRandPrompt">
<view class="title">换一批</view>
<view class="icon">
<uni-icons type="refreshempty" size="14" :color="primaryColor"></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="desc-box">
<text class="title">场景描述</text>
<textarea class="desc-input" v-model="sceneDesc"
placeholder="描述一下你们的场景吧~(例:在教堂,在海边,在美术馆,咖啡馆...)" />
<!-- <view class="bottom-box">
<view class="keyTips" @click="clickRandomKey()"></view>
<view class="limit">{{drawDesc.length}}/50</view>
</view> -->
</view>
<view class="type-box">
<text class="title">风格选择</text>
<view class="type-item-box">
<view class="type-item" v-for="(item, index) in paintStyle" @click="selectType(index)"
:style="{ backgroundImage: `url(${item.imgUrl})` }"
:class="curType == index? 'active' : ''">
<view class="title">
{{item.name}}
</view>
</view>
</view>
</view>
<view class="draw-button" @click="checkIsVip()">
开始创作<br/>消耗({{goldNum}}点画意值)
</view>
</view>
</template>
<script>
import {getPaintStyle, getPrompt, textToImg, checkUserCanAiPaint, checkVip} from '@/api/paint.js';
export default {
data() {
return {
promptList: [],
sceneDesc: '',
contentDesc: '',
paintStyle:[],
curType: 0,
goldNum: 5, //画意值
userInfo: {},
checkData:{
checkCanPaint: false, //true已达到最大绘画上限;false未达最高上限
},
prompt_active: 0,
}
},
onLoad() {
this.getPaintStyleList();
this.getPrompt();
},
onShow() {
this.checkLogin();
// this.getInitInfo();
// this.checkUserCanAiPaint();
this.sceneDesc = '',
this.contentDesc = '',
this.curType = 0
},
onShareAppMessage(res) {
if (res.from === 'button') { // 来自页面内分享按钮
// console.log(res)
}
return {
title: '来[次元意境]获取好看的图纸头像吧!',
path: `/pages/ai/paint/loverPaint`
}
},
methods: {
selectType(index) {
this.curType = index
},
//随机选取提示词
getRandPrompt() {
this.promptList = this.getRandomArrayElements(this.promptList, 5)
this.promptText = this.promptList[this.prompt_active].text
},
//获取提示词列表
async getPrompt() {
const res = await getPrompt("2");
if (res && res.data.code === 200) {
this.promptList = res.data.data
//console.log('this.promptList',this.promptList)
}else {
uni.showModal({
content: '提示词列表加载失败!',
showCancel: false
});
}
},
//提示词
onClickPrompt(index) {
this.prompt_active = index
this.contentDesc = this.promptList[index].text
// //拖底消除校验状态
// if(this.checkData.checkPrompt === false){
// this.checkData.checkPrompt = true;
// }
//console.log('this.prompt_active',this.prompt_active)
},
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);
},
async checkIsVip() {
let that = this;
const data = {
userId: that.userInfo.id,
userClientType: 10
}
const res = await checkVip(data);
console.log('res===', res);
if (res && res.data.code === 200) {
if(res.data.data.isVip == 1) {
that.getDraw()
} else {
uni.showModal({
title: '您还不是VIP会员',
content: '开通VIP解锁更多权益~',
showCancel: false,
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
uni.navigateTo({
url:'/pages/userInfo/vip/vip'
})
}
}
});
}
// this.paintStyle = res.data.data
//console.log('this.paintStyle',this.paintStyle)
}
// else {
// uni.showModal({
// content: '网络错误,请稍后再试~',
// showCancel: false
// });
// }
},
//获取绘画风格
async getPaintStyleList() {
const res = await getPaintStyle();
if (res && res.data.code === 200) {
this.paintStyle = res.data.data
//console.log('this.paintStyle',this.paintStyle)
}else {
uni.showModal({
content: '绘画风格加载失败!',
showCancel: false
});
}
},
//判断是否达到免费AI绘画次数上限
async checkUserCanAiPaint(){
let that = this;
const data = {
userId: that.userInfo.id,
platform: 1, //此处1代表抖音
appType: 0
}
const res = await checkUserCanAiPaint(data);
//console.log('res绘画',res)
if(res.data.code === 200){
if(res.data.data === true){
that.checkData.checkCanPaint = true;
}else{
that.checkData.checkCanPaint = false;
}
}else{
return uni.showModal({
content: '检查绘画上限失败!',
showCancel: false
});
}
},
//判断是否登录
checkLogin(){
let that = this;
that.userInfo = uni.getStorageSync('userInfo');
console.log('userInfo:',that.userInfo)
let token = uni.getStorageSync('token');
if((Object.keys(that.userInfo).length==0) && (Object.keys(token).length==0)){
console.error('尚未登录!');
uni.showModal({
title:'提示',
content:'您还没有登录!点击确定跳转登录界面以体验服务',
success(res) {
if (res.confirm) {
//跳转登录界面
uni.switchTab({
url: '/pages/userInfo/userInfo'
});
}else if(res.cancel){
uni.showToast({
title:'登录获取更好的服务体验哟!',
duration: 2000
});
}
}
});
}
},
getDraw() {
// if(this.userInfo.isVip != 1) {
// uni.showModal({
// title:'此功能仅限VIP使用',
// content: '开通VIP获得更多权益',
// })
// return
// }
if(!this.contentDesc || !this.sceneDesc) {
uni.showToast({
title: '请输入描述~',
duration: 2000,
icon: 'none'
});
return
}
const that = this;
//跳转详情页生成图片
uni.showModal({
title: '温馨提示',
content: '任务创建完成,点击跳转生成内容!',
success(res) {
if(res.confirm){
const data = {
prompt: that.contentDesc,
scenePrompt: that.sceneDesc,
styleName: that.paintStyle[that.curType].styleName,
painterId: that.userInfo.id,
painterName: that.userInfo.username,
appType: 0,
platform: 1,
goldNum: that.goldNum,
}
uni.navigateTo({
url: './loverPainResult?data='+JSON.stringify(data)
})
}
}
});
}
}
}
</script>
<style lang="scss" scoped>
.wrap {
padding: 20rpx;
width: 100%;
min-height: 110vh;
background-color: #faf0f3;
.draw-button {
position:fixed;
left: 50%;
bottom: 50rpx;
transform: translateX(-50%);
background: linear-gradient(#fc1f8d, #d2158a);
width: 400rpx;
height: 100rpx;
border-radius: 50rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #fff;
font-size: 16px;
}
.head {
display: flex;
flex-direction: row;
justify-content: space-between;
margin-bottom: 15rpx;
.left {
display: flex;
flex-direction: row;
align-items: center;
.title {
color: #fc1f8d;
font-size: 26rpx;
.tip-vip-icon {
margin-left: 20rpx;
}
}
}
.right {
display: flex;
flex-direction: row;
align-items: center;
.title {
margin-right: 15rpx;
font-size: 24rpx;
line-height: 48rpx;
color: #3a3a3a;
}
.icon {
line-height: 48rpx;
}
}
}
.keywords {
width: 100%;
margin: 15rpx auto;
.lists {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
.item {
background-color: $uni-white;
padding: 10rpx 15rpx;
border-radius: 10rpx;
color: $uni-base-color;
border: 1rpx solid #fc1f8d;
max-width: 128rpx;
margin-bottom: 10rpx;
font-size: 24rpx;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.active {
// color: $uni-white;
border: 1rpx solid #d2158a;
background-color: #fad5e6;
}
}
}
.desc-box {
margin-bottom: 10px;
.title {
color: #fff;
font-size: 18px;
// margin-bottom: 20px;
color: #fc1f8d;
font-weight: bold;
}
.desc-input {
border: 2px solid #fc1f8d;
margin-top: 5px;
width: 100%;
height: 200rpx;
background-color: #fff;
border-radius: 8px;
padding: 20rpx;
box-sizing: border-box;
// color: #fff;
}
}
.type-box {
.title {
color: #fff;
font-size: 18px;
// margin-bottom: 5px;
color: #fc1f8d;
font-weight: bold;
}
.type-item-box {
margin-top: 5px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
.type-item {
width: 160rpx;
height: 160rpx;
background-size: 100% 100%;
border-radius: 5px;
box-sizing: border-box;
position: relative;
.title {
position: absolute;
bottom: 0px;
width: 100%;
background-color: rgba(255, 255, 255, 0.7);
color: #fc1f8d;
text-align: center;
font-size: 14px;
}
}
.active {
border: 4px solid #fc1f8d;
}
}
}
}
</style>