PixelAI-mobile/pages/mobile_web/home/home.vue

610 lines
16 KiB
Vue
Raw Normal View History

2024-12-03 09:34:24 +08:00
<template>
<view class="mobile-home">
<!-- #ifdef APP -->
<view class="app-top" :style="{ height: CustomBar+2+'rpx',
background: topLevel===0? 'linear-gradient(180deg, #d8fa35 0%, #f0fdbf 100%)' : `rgba(255, 255, 255,${topLevel})` }"></view>
<view :style="{ height: CustomBar+'rpx',background: 'linear-gradient(180deg, #d8fa35 0%, #f0fdbf 100%)'}"></view>
<view class="mobile-logo" :style="{backgroundColor: `rgba(255, 255, 255,${topLevel})`,marginTop: CustomBar+2+'rpx'}">
<!-- #endif -->
<!-- #ifndef APP -->
<view class="mobile-logo" :style="{backgroundColor: `rgba(255, 255, 255,${topLevel})`}">
<!-- #endif -->
<image :src="fileUrl+logo"></image>
</view>
2024-12-29 16:09:08 +08:00
<u-swiper @click="linkTo" height="420" :list="swiperList" name="path" circular
bgColor="#e2fd7d"></u-swiper>
2024-12-03 09:34:24 +08:00
<view class="mobile-content">
<view class="content-inner">
<!-- 功能栏 -->
<view class="first-functions">
2024-12-18 14:45:53 +08:00
<!-- ai换衣 -->
2024-12-03 09:34:24 +08:00
<view class="ff-left">
2024-12-18 14:45:53 +08:00
<image :src="fileUrl+functionImg[0].picture" @click="toDeal(5)"></image>
<image :src="fileUrl+functionImg[1].picture" class="go" @click="toDeal(5)"></image>
2024-12-03 09:34:24 +08:00
</view>
2024-12-18 14:45:53 +08:00
<!-- 风格重绘 -->
2024-12-03 09:34:24 +08:00
<view class="ff-right">
2024-12-18 14:45:53 +08:00
<image @click="toDeal(6)" class="redraw" :src="fileUrl+functionImg[2].picture"></image>
2024-12-03 09:34:24 +08:00
<image class="tip" :src="fileUrl+functionImg[3].picture"></image>
</view>
</view>
<!-- 轮播功能栏 -->
<view class="second-functions">
2024-12-11 19:36:51 +08:00
<swiper class="swiper" :style="swiperFunctionList[currentPageindex-1]&&swiperFunctionList[currentPageindex-1].length>5?
{height:'270rpx'}:{height:'125rpx'}" duration="300" @change="categoryChange">
2024-12-06 23:58:58 +08:00
<swiper-item v-for="(item, index) in swiperFunctionList" :key="index">
2024-12-11 19:36:51 +08:00
<view class="category">
2024-12-03 09:34:24 +08:00
<template v-for="(category, itemIndex) in item">
2024-12-06 23:58:58 +08:00
<view class="category-item" @click="toDeal(category.id)">
2024-12-18 14:45:53 +08:00
<image :style="category.icon?{}:{width:'80rpx',height:'70rpx'}"
:src="encodeURI(staticIp+(category.icon||'static/pixel/home/default-work.png'))"></image>
2024-12-10 10:25:46 +08:00
<view>{{ category.name }}</view>
2024-12-03 09:34:24 +08:00
</view>
</template>
</view>
</swiper-item>
</swiper>
<view class="dots">
<view v-for="item in swiperFunctionList.length" :key="item"
:class="{ active: item === currentPageindex }"></view>
</view>
</view>
<!-- 推荐作品 -->
<view class="third-functions">
<view class="tf-control">
<image :src="fileUrl+recommendImg"></image>
<view class="tfc-right">
筛选
<view class="tfcr-btn" @click="showSift = true">
2024-12-18 14:45:53 +08:00
<u-icon :label="siftLabel||'暂无'" :name="fileUrl+select" color="#d4ff00"
2024-12-03 09:34:24 +08:00
size="17" label-pos="left" label-color="#d4ff00"></u-icon>
</view>
</view>
</view>
<view class="show-work">
<view @click="maskTouchend(item,index)" class="work-item" v-for="(item,index) in workList" :key="item.id">
<view :class="item.display?'ribbon-fadeOutUp':''" class="collect-ribbon" v-show="item.collect">收藏</view>
2024-12-29 16:09:08 +08:00
<u-lazy-load border-radius="30" class="work-picture"
:image="getWorkPath(item.path)"></u-lazy-load>
<!-- <image class="work-picture" :src="item.picture" mode="widthFix"></image> -->
<view class="sign-text">{{ siftList[item.serviceId] ? siftList[item.serviceId].name : '暂无' }}</view>
<image :lazy-load="true" class="sign" :src="fileUrl+sign"></image>
2024-12-30 19:01:03 +08:00
<view class="work-todo" @click.native.stop="toDeal(item.serviceId)">
<image :src="fileUrl+magicWand"></image>
<text>做同款</text>
</view>
2024-12-11 19:36:51 +08:00
<!-- <image class="compare-sign" mode="widthFix" :src="item.compare"></image> -->
2024-12-03 09:34:24 +08:00
</view>
</view>
<!-- 下面这里等后端有了之后用isFinish判断 -->
<view class="last-tip">
~~ 已加载全部 ~~
</view>
</view>
</view>
</view>
2024-12-06 23:58:58 +08:00
<u-toast ref="uToast"></u-toast>
2024-12-03 09:34:24 +08:00
<!-- 筛选项下拉栏 -->
2024-12-29 16:09:08 +08:00
<u-select v-model="showSift" :list="siftList" @confirm="selectSift" :defaultValue="[siftIndex]"
confirm-color="#94d500" labelName="name" valueName="id"></u-select>
2024-12-03 09:34:24 +08:00
</view>
</template>
<script>
import configService from '@/common/config.service.js';
import { tools } from '@/utils/utils.js';
export default {
props: {
topLevel:{
type: Number,
default: 0
},
},
data(){
return{
2024-12-18 14:45:53 +08:00
staticIp: configService.ip,
2024-12-03 09:34:24 +08:00
fileUrl: configService.fileUrl + 'pixel/home/',
2024-12-29 16:09:08 +08:00
aliUrl: configService.aliUrl.split("://")[1],
2024-12-03 09:34:24 +08:00
// logo图标
logo: 'logo.png',
// 第一层功能图片
functionImg:[
{
// ai换装
picture: 'dressup.png'
},
{
// ai换装-go
picture: 'dressupgo.png'
},
{
// 涂抹重绘
picture: 'redraw.png'
},
{
// 涂抹重绘提示词
picture: 'redrawtip.png'
}
],
// 横向工具栏
2024-12-11 19:36:51 +08:00
swiperFunctionList:[],
2024-12-03 09:34:24 +08:00
// 当前横向工具栏页码
currentPageindex: 1,
// 轮播图
2024-12-29 16:09:08 +08:00
swiperList:[],
2024-12-03 09:34:24 +08:00
// 推荐作品图标
recommendImg: 'recommend.png',
// 筛选下拉栏三角形
select: 'select.png',
// 展示筛选项
showSift: false,
2024-12-18 14:45:53 +08:00
// 筛选项
siftList: [],
// 筛选项label
siftLabel: '全部',
2024-12-29 16:09:08 +08:00
// 筛选项下标
siftIndex: 0,
2024-12-03 09:34:24 +08:00
// 推荐作品列表
2024-12-29 16:09:08 +08:00
workList:[],
2024-12-03 09:34:24 +08:00
// 标签图标
sign: 'typelam.png',
// 点击次数
touchNum : 0,
2024-12-11 19:36:51 +08:00
// 轮播功能列表单组功能数
group: 10,
2024-12-30 19:01:03 +08:00
// 魔术棒
magicWand: 'magic-wand.png'
2024-12-03 09:34:24 +08:00
}
},
methods:{
2024-12-06 23:58:58 +08:00
// 初始化
async init(){
2024-12-29 16:09:08 +08:00
this.getBanner();
this.getServices();
this.getWorkList();
},
// 获取轮播图
async getBanner(){
let res = await this.$api.allBanners();
if(res?.success){
this.swiperList = res.data.map(item=>{
return {...item,path: encodeURI(this.staticIp+item.path)}
});
}else{
this.$refs.uToast.show({type:'error',title: "轮播图获取失败!"});
}
},
getWorkPath(path){
return path.includes(this.aliUrl) ? path : encodeURI(this.staticIp+path);
},
// 获取应用服务列表
async getServices(){
2024-12-06 23:58:58 +08:00
let res = await this.$api.allServices();
if(res.success){
2024-12-11 19:36:51 +08:00
// 这里按一页10个分组
2024-12-06 23:58:58 +08:00
this.swiperFunctionList = [];
const arr = res.data;
2024-12-29 16:09:08 +08:00
this.siftList = [{id: -1,name:"全部"},...arr];
2024-12-11 19:36:51 +08:00
for (let i = 0; i < arr.length; i += this.group) {
this.swiperFunctionList.push(arr.slice(i, i + this.group));
2024-12-06 23:58:58 +08:00
}
}else{
this.$refs.uToast.show({type:'error',title: "应用列表获取失败!"});
}
},
2024-12-29 16:09:08 +08:00
// 获取推荐作品列表
async getWorkList(){
let res = await this.$api.getCpPhotoById({labelId: 4});
if(res?.success){
this.workList = res.data;
}else{
this.$refs.uToast.show({type:'error',title: "推荐作品获取失败!"});
}
},
2024-12-03 09:34:24 +08:00
// 横向功能列表切换页
categoryChange(event){
this.currentPageindex = event.detail.current+1;
},
// 推荐作品筛选
selectSift(e){
2024-12-29 16:09:08 +08:00
this.siftLabel = e[0].label;
this.siftIndex = this.siftList.findIndex(item=>item.id === e[0].value) || 0;
2024-12-03 09:34:24 +08:00
},
// 监听单双击,单击-预览图片、双击-收藏
maskTouchend(item,index){
this.touchNum ++;
setTimeout(()=>{
if(this.touchNum == 1){
2024-12-29 16:09:08 +08:00
const array = [item.path.includes(this.aliUrl) ? item.path : encodeURI(this.staticIp+item.path)];
2024-12-11 19:36:51 +08:00
if(item.compare) array.push(item.compare);
tools.methods.lookImage(0,array);
2024-12-03 09:34:24 +08:00
}
if(this.touchNum >= 2){
2024-12-29 16:09:08 +08:00
// 若collect为null默认没收藏那接下来就是收藏操作
const result = item.collect ? (item.collect+1)%2 : 1;
2024-12-03 09:34:24 +08:00
if(result === 0){
// 添加淡出的class样式
item.display = 1;
this.$forceUpdate();
// 下面的操作应该替换为请求后端数据后,再停止动画
// 模拟操作这里用setTimeout模拟
setTimeout(() => {
// 移除淡出类
item.display = 0;
item.collect = result;
}, 1000); // 假设操作需要1秒
}else{
2024-12-29 16:09:08 +08:00
item.collect = result;
this.$forceUpdate();
2024-12-03 09:34:24 +08:00
}
}
this.touchNum = 0;
},250)
},
// 前往工作室
2024-12-06 23:58:58 +08:00
toDeal(id = null){
2024-12-30 19:01:03 +08:00
if(id!==null&&id!=='')
2024-12-06 23:58:58 +08:00
uni.navigateTo({url: `/pages/mobile_web/workshops/index?id=${id}`});
else this.$refs.uToast.show({type:'error',title: "暂未开放对应功能!"});
2024-12-05 11:46:54 +08:00
},
// 轮播图跳转
linkTo(e){
2024-12-29 16:09:08 +08:00
if(this.swiperList[e].url){
2024-12-05 11:46:54 +08:00
uni.navigateTo({
2024-12-29 16:09:08 +08:00
url: `/pages/index/webview?src=${encodeURI(this.swiperList[e].url)}`
2024-12-05 11:46:54 +08:00
})
}
2024-12-03 09:34:24 +08:00
}
}
}
</script>
<style scoped lang="scss">
.mobile-home{
display: flex;
flex-direction: column;
min-height: 100vh;
// #ifdef APP
.app-top{
width: 100%;
position: fixed;
z-index: 81;
}
// #endif
.mobile-logo{
width: 100%;
display: flex;
justify-content: center;
position: fixed;
z-index: 81;
padding: 15rpx 0;
image{
width: 200rpx;
height: 45rpx;
}
}
.mobile-content{
box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;
z-index: 80;
width: 100%;
flex: 1;
margin-top: -50rpx;
border-top-right-radius: 36rpx;
border-top-left-radius: 36rpx;
background-color: #1a1929;
.content-inner{
margin: 60rpx 45rpx 150rpx;
.first-functions{
display: flex;
height: 270rpx;
.ff-left{
width: 250rpx;
height: 100%;
margin-right: 20rpx;
position: relative;
image{
width: 100%;
height: 105%;
&:active{
filter: opacity(0.8);
}
}
.go{
width: 90rpx;
height: 80rpx;
position: absolute;
bottom: 24rpx;
right: 0;
}
}
.ff-right{
flex: 1;
height: 100%;
width: 250rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
image{
width: 100%;
height: 70%;
}
.redraw{
margin-top: -1%;
&:active{
filter: opacity(0.8);
}
}
.tip{
height: 24%;
margin-bottom: 1%;
}
}
}
.second-functions{
position: relative;
2024-12-11 19:36:51 +08:00
// height: 125rpx;
2024-12-03 09:34:24 +08:00
width: 100%;
margin-top: 50rpx;
.swiper{
width: 100%;
2024-12-11 19:36:51 +08:00
height: 125rpx;
2024-12-03 09:34:24 +08:00
.category{
width: 100%;
height: auto;
2024-12-11 19:36:51 +08:00
display: grid;
row-gap: 20rpx;
grid-template-columns: repeat(5,20%);
2024-12-03 09:34:24 +08:00
.category-item{
display: flex;
flex-direction: column;
align-items: center;
2024-12-18 14:45:53 +08:00
justify-content: flex-end;
2024-12-03 09:34:24 +08:00
padding: 0 12rpx;
&:active{
filter: opacity(0.8);
}
2024-12-10 10:25:46 +08:00
view{
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
color: #fff;
2024-12-18 14:45:53 +08:00
text-align: center;
2024-12-10 10:25:46 +08:00
font-size: 25rpx;
}
2024-12-03 09:34:24 +08:00
image{
2024-12-18 14:45:53 +08:00
// width: 110rpx;
// height: 60rpx;
width: 60rpx;
height:60rpx;
2024-12-03 09:34:24 +08:00
margin-bottom: 14rpx;
}
}
}
}
.dots{
display: flex;
justify-content: center;
height: 14rpx;
width: 100%;
view{
background-color: #818e4f;
width: 20rpx;
height: 10rpx;
margin: 0 6rpx;
border-radius: 20rpx;
transition: all 0.5s;
}
.active{
background-color: #d5ff00 !important;
width: 45rpx !important;
height: 10rpx;
}
}
}
.third-functions{
width: 100%;
margin-top: 35rpx;
.tf-control{
display: flex;
justify-content: space-between;
height: 80rpx;
width: 100%;
image{
margin-left: 15rpx;
width: 160rpx;
height: 52rpx;
}
.tfc-right{
height: 70rpx;
display: flex;
align-items: center;
margin-right: 5rpx;
color: #ffffff;
font-size: 30rpx;
.tfcr-btn{
margin-left: 25rpx;
border: 2rpx solid #d5ff00;
border-radius: 25rpx;
background-color: #1a1929;
.u-icon{
margin: 16rpx 15rpx;
}
}
}
}
.show-work{
margin-top: 13rpx;
width: 100%;
column-count:2;
-moz-column-count:2; /* Firefox */
-webkit-column-count:2; /* Safari 和 Chrome */
column-gap: 1em;
-moz-column-gap: 1em;
-webkit-column-gap: 1em;
.work-item{
-webkit-column-break-inside: avoid;
break-inside: avoid; /*防止断点*/
margin-bottom: 1em;
position: relative;
padding-top: 13rpx;
.work-picture{
border: 0.1em solid #d5ff00;
border-radius: 30rpx;
2024-12-29 16:09:08 +08:00
// 骗系统开启硬件加速
transform: transition3d(0, 0, 0);
// 防止图片加载“闪一下”
will-change: transform;
2024-12-03 09:34:24 +08:00
}
.sign{
border: none;
border-radius: 0;
position: absolute;
top: 0.8em;
left: 0.6em;
2024-12-18 14:45:53 +08:00
width: 152rpx;
2024-12-03 09:34:24 +08:00
height: 47rpx;
}
.sign-text{
2024-12-18 14:45:53 +08:00
width: 132rpx;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
2024-12-03 09:34:24 +08:00
color: #ffffff;
font-size: 28rpx;
position: absolute;
top: 0.85em;
left: 0.9em;
z-index: 1;
}
2024-12-30 19:01:03 +08:00
.work-todo{
position: absolute;
bottom: 0.85em;
right: 0.7em;
z-index: 1;
border-radius: 12rpx;
padding: 14rpx 30rpx;
background-color: rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
text{
font-weight: bold;
background-image: linear-gradient(to right, #cdfbf2 0%, #a3d4ff 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
image{
margin-right: 10rpx;
width: 34rpx;
height: 34rpx;
}
&:active{
opacity: 0.8;
}
}
2024-12-03 09:34:24 +08:00
.compare-sign{
position: absolute;
left: 0;
bottom: 0.2em;
width: 120rpx;
border: 0.1em solid #d5ff00;
border-radius: 20rpx;
box-shadow: rgba(213, 255, 0, 0.3) 0px 4px 12px;
}
.ribbon-fadeOutUp{
animation-name: fadeOutUp !important;
}
.collect-ribbon {
position: absolute;
z-index: 2;
margin-top: -13rpx;
right: 30rpx;
width: 62rpx;
padding: 20rpx 14rpx 0;
box-sizing: border-box;
text-align: center;
background: #ff9900;
font-size: 25rpx;
color: #fff;
animation-name: bounceInDown;
animation-duration: 0.5s;
animation-fill-mode: both;
&::before,
&::after {
content: '';
position: absolute;
}
&::before {
top: 0;
left: -10rpx;
height: 0;
width: 0;
border-bottom: 14rpx solid #ff9900;
border-left: 12rpx solid transparent;
opacity: .8;
}
&::after {
height: 0;
width: 0;
left: 0;
bottom: -39rpx;
border-left: 31rpx solid #ff9900;
border-right: 32rpx solid #ff9900;
border-bottom: 43rpx solid transparent;
}
}
}
}
.last-tip{
color: #d5ff00;
font-size: 28rpx;
text-align: center;
margin-top: 20rpx;
margin-bottom: 160rpx;
}
}
}
}
}
::v-deep .u-swiper-indicator {
margin-bottom: 50rpx;
.u-indicator-item-round-active{
background-color: #1d1d1d !important;
width: 45rpx !important;
height: 10rpx;
}
.u-indicator-item-round{
background-color: #818e4f;
width: 20rpx;
height: 10rpx;
}
}
// 淡入
@keyframes bounceInDown {
from {
opacity: 0;
transform: translate3d(0, -5%, 0);
}
to {
opacity: 1;
transform: translate3d(0, 0, 0);
}
}
// 淡出
@keyframes fadeOutUp {
from {
opacity: 1;
}
to {
opacity: 0;
transform: translate3d(0, -5%, 0);
}
}
</style>