detail preview可以设置空颜色

This commit is contained in:
X1627315083
2025-05-08 14:09:12 +08:00
parent a4e040d0ff
commit 610e715ca7
30 changed files with 1323 additions and 6496 deletions

View File

@@ -1,102 +1,158 @@
<template>
<div class="homeMain_max Guide_1_16_1">
<header class="homeMain_heade">
<div class="homeMain_right_content">
<div class="homeMain_user">
<div class="homeMain_user_icon" @click="openAccount">
<img :src="userDetail.avatar" alt="">
<div class="homeMain_max">
<div class="leftBox">
<div class="left">
<div class="title">
<span>AiDA</span>
<svg xmlns="http://www.w3.org/2000/svg" width="2rem" height="2rem" fill="currentColor" viewBox="0 0 24 24" data-v-1c7326d6=""><path fill-rule="evenodd" d="M6 5a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h2V5H6Zm4 0v14h8a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-8ZM3 6a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v12a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V6Z" clip-rule="evenodd" data-v-1c7326d6=""></path></svg>
</div>
<div class="newObj marginT2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 25 24"><path stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12.5 5v14m-7-7h14"></path></svg>
<p>New Chat</p>
</div>
<div class="navList marginT2">
<div class="tools list" v-for="item in openTypeList" :class="{active:openType == item.value}">
<div class="titleBox" @click="setOpenType(item.value)">
<div class="left">
<i :class="['fi',item.icon]"></i>
<span>{{item.label}}</span>
</div>
<div class="right">
<i class="fi fi-br-angle-small-down"></i>
</div>
</div>
<div class="detailBox">
<div class="detail" v-show="openType == item.value">
<div class="detailItem" v-for="childItem in item.list" @click="setRouter(item,childItem)" :class="{active:openTypeChild == childItem.value}">
<i v-show="childItem.icon" :class="['fi',childItem.icon]"></i>
<span>{{ childItem.label }}</span>
</div>
</div>
</div>
</div>
<div class="homeMain_user_detail">
</div>
<div class="navListBottom">
<div class="tools marginT2 list language" :class="{active:isLanguage}">
<div class="titleBox" @click="()=>isLanguage = !isLanguage">
<div class="left">
<i class="fi fi-br-angle-small-down"></i>
<span>Advanced Tools</span>
</div>
<div class="right">
<i class="fi fi-br-angle-small-down"></i>
</div>
</div>
<div class="detailBox">
<div class="detail" v-show="isLanguage">
<div class="detailItem">
<!-- <i class="fi fi-br-angle-small-down"></i> -->
<span>AI Image Generator</span>
</div>
<div class="detailItem active">
<svg data-v-2396c87a="" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14" class="dark-icon sidebar-lang-icon" width="20" height="20"><path stroke="#52525b" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.167" d="M11.667 3.5 5.25 9.917 2.334 7"></path></svg>
<span>AI Image Generator</span>
</div>
</div>
</div>
</div>
</div>
<div v-if="userDetail.systemUser == 0 || userDetail.systemUser == 3" @click="openUpgradeToPro" class="gallery_btn gallery_btn_radius" style="width: 100%;">Upgrade to Pro</div>
</div>
</div>
<div class="rightBox">
<div class="right">
<div class="user">
<div class="homeMain_user">
<div class="homeMain_user_icon" @click="openAccount">
<img :src="userDetail.avatar" alt="">
</div>
<div v-if="userDetail.systemUser == 3" class="username">{{$t('Header.hello')}}@{{ $t('isTest.userName') }}</div>
<div v-else class="username">{{$t('Header.hello')}}@{{ userDetail.userName }}</div>
<div class="homeMain_user_detail_attention">
<div class="attention_item">
<!-- 点击事件就用下面的div -->
<!-- <div class="attention_item attention_item_active"> -->
<div>{{ userDetail?.followeeCount }}</div>
<span>{{$t('account.Follow')}}</span>
<div class="homeMain_user_detail">
<div class="homeMain_user_icon" @click="openAccount">
<img :src="userDetail.avatar" alt="">
</div>
<div class="attention_item">
<div>{{ userDetail?.followerCount }}</div>
<span>{{$t('account.Fans')}}</span>
</div>
<!-- <div class="attention_item">
<div>22</div>
<span>作品数</span>
</div> -->
</div>
<div class="homeMain_subscribe">
<div>
<span class="font">Status</span>
<span v-if="userDetail.timeData.isExpiration" class="stateSucsess font">Valid <i class="fi fi-ss-check-circle"></i></span>
<span v-else class="stateError font">Expire <i class="fi fi-ss-check-circle"></i></span>
<span class="time">{{ userDetail.timeData.text }}</span>
</div>
<!-- <div>
<span class="font">Cancel Renewal <i class="fi fi-rr-arrow-small-right"></i></span>
</div> -->
</div>
<div class="homeMain_select">
<div class="select_item_box" @click.stop="isLanguage = !isLanguage">
<div class="select_item">
<span class="icon iconfont icon-yuyan"></span>
<span class="select_item_des">{{$t('Header.language')}}</span>
<span class="icon iconfont icon-xiala" :class="{'active': isLanguage}"></span>
<div v-if="userDetail.systemUser == 3" class="username">{{$t('Header.hello')}}@{{ $t('isTest.userName') }}</div>
<div v-else class="username">{{$t('Header.hello')}}@{{ userDetail.userName }}</div>
<div class="homeMain_user_detail_attention">
<div class="attention_item">
<!-- 点击事件就用下面的div -->
<div>{{ userDetail?.followeeCount }}</div>
<span>{{$t('account.Follow')}}</span>
</div>
<div class="attention_item">
<div>{{ userDetail?.followerCount }}</div>
<span>{{$t('account.Fans')}}</span>
</div>
<ul class="select_list" :class="{'active': isLanguage}" @click.stop="">
<li class="select_item" v-for="item in language" @click="setLocale(item.value)">
<span class="select_item_des">{{ item.name }}</span>
</li>
</ul>
</div>
<div class="select_item" @click="orderForm()">
<i class="fi fi-rs-notebook"></i>
<span class="select_item_des">{{$t('Header.ViewOrders')}}</span>
<div class="homeMain_subscribe">
<div>
<span class="font">Status</span>
<span v-if="userDetail.timeData.isExpiration" class="stateSucsess font">Valid <i class="fi fi-ss-check-circle"></i></span>
<span v-else class="stateError font">Expire <i class="fi fi-ss-check-circle"></i></span>
<span class="time">{{ userDetail.timeData.text }}</span>
</div>
</div>
<router-link class="select_item" v-if="userDetail.systemList.indexOf(3) >= 0" :to="`/administrator`">
<span class="icon iconfont icon-yonghu"></span>
<span class="select_item_des">Administrator</span>
</router-link>
<router-link class="select_item" :to="`/Affiliate`" v-if="userDetail.systemList.indexOf(2) >= 0">
<span class="icon iconfont icon-yonghu"></span>
<span class="select_item_des">Affiliate</span>
</router-link>
<div class="select_item" @click="getTutorial()">
<span class="fi fi-rr-book-user"></span>
<span class="select_item_des">{{$t('Header.Tutorial')}}</span>
</div>
<div class="select_item_long"></div>
<div class="select_item" @click="logout()">
<span class="icon iconfont icon-tuichu"></span>
<span class="select_item_des">{{$t('Header.logOff')}}</span>
<div class="homeMain_select">
<div class="select_item_box" @click.stop="isLanguage = !isLanguage">
<div class="select_item">
<span class="icon iconfont icon-yuyan"></span>
<span class="select_item_des">{{$t('Header.language')}}</span>
<span class="icon iconfont icon-xiala" :class="{'active': isLanguage}"></span>
</div>
<ul class="select_list" :class="{'active': isLanguage}" @click.stop="">
<li class="select_item" v-for="item in language" @click="setLocale(item.value)">
<span class="select_item_des">{{ item.name }}</span>
</li>
</ul>
</div>
<div class="select_item" @click="orderForm()">
<i class="fi fi-rs-notebook"></i>
<span class="select_item_des">{{$t('Header.ViewOrders')}}</span>
</div>
<router-link class="select_item" v-if="userDetail.systemList.indexOf(3) >= 0" :to="`/administrator`">
<span class="icon iconfont icon-yonghu"></span>
<span class="select_item_des">Administrator</span>
</router-link>
<router-link class="select_item" :to="`/Affiliate`" v-if="userDetail.systemList.indexOf(2) >= 0">
<span class="icon iconfont icon-yonghu"></span>
<span class="select_item_des">Affiliate</span>
</router-link>
<div class="select_item" @click="getTutorial()">
<span class="fi fi-rr-book-user"></span>
<span class="select_item_des">{{$t('Header.Tutorial')}}</span>
</div>
<div class="select_item_long"></div>
<div class="select_item" @click="logout()">
<span class="icon iconfont icon-tuichu"></span>
<span class="select_item_des">{{$t('Header.logOff')}}</span>
</div>
</div>
</div>
</div>
</div>
<div class="router">
<router-view v-if="!getLangIsShowMark" @setTask="setTask" :getLangIsShowMark="getLangIsShowMark">
</router-view>
</div>
</div>
</div>
<header class="homeMain_heade" v-show="false">
<div class="homeMain_right_content">
<div
class="trialApproval button_second credits hideChecked"
>
{{$t('Header.Credits')}}:&nbsp;
<span :title="credits">
<!-- <div>{{ String(credits.value[credits.value.legnth-1]) }}</div> -->
<div class="credits_item" v-for="item in String(credits)" :style="{'transform': 'translateY('+item*-100+'%)'}">
<div v-for="numItem in 10">{{ numItem-1 }}</div>
</div>
</span>
<i @click="getCredits" class="fi fi-br-refresh" :class="[activeCredits?'active':'']"></i>
<!-- <i @click="Assignment" class="fi fi-rr-gift" title="Assignment"></i> -->
<i @click="UpgradePlan" title="Purchase" class="fi fi-rr-shop"></i>
</div>
<!-- <div class="gallery_btn" style="margin-left: 3rem;" @click="subscribe">{{$t('Header.SubscribeNow')}}</div> -->
<div v-if="userDetail.systemUser == 0 || userDetail.systemUser == 3" class="gallery_btn" style="margin-left: 3rem;" @click="subscribe">{{$t('Header.SubscribeNow')}}</div>
<div v-else style="width: 30rem;"></div>
</div>
<navRouter :routerList="navRouterList"></navRouter>
<!-- <navRouter :routerList="navRouterList"></navRouter> -->
<div class="homeMain_right">
<div class="trialApproval credits message">
<div class="message_iconItem">
@@ -114,7 +170,6 @@
</div>
</div>
</div>
<!-- <Habit></Habit> -->
</div>
@@ -122,16 +177,8 @@
<UpgradePlan ref="UpgradePlan"></UpgradePlan>
<TaskPage ref="TaskPage"></TaskPage>
</header>
<div class="homeMain_content_body">
<!-- <router-view v-slot="{ Component }" @setTask = "setTask">
<keep-alive>
<component :key="$route.name" :is="Component" v-if="$route.meta.keepAlive"/>
</keep-alive>
<component :key="$route.name" :is="Component" v-if="!$route.meta.keepAlive"/>
</router-view> -->
<router-view v-if="!getLangIsShowMark" @setTask="setTask" :getLangIsShowMark="getLangIsShowMark">
</router-view>
</div>
<div class="mark_loading" v-show="getLangIsShowMark">
<a-spin size="large" />
</div>
@@ -144,7 +191,7 @@
</div>
</template>
<script >
import { defineComponent, createVNode, ref,toRefs, reactive, computed, onMounted, nextTick } from "vue";
import { defineComponent, createVNode, ref,toRefs, reactive, computed, onMounted, nextTick, watch } from "vue";
import { isEmail } from "@/tool/util";
import { setCookie, getCookie, WriteCookie,clonAllCookie } from "@/tool/cookie";
import payOrder from "@/component/Pay/payOrder.vue";
@@ -169,6 +216,8 @@ import { gsap, TweenMax,TweenLite } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
import MyWs from "@/tool/webSocket";
import MyEvent from "@/tool/myEvents";
import { useRouter,useRoute } from 'vue-router'
import {openTypeList} from "@/tool/listData.js";
export default defineComponent({
components: {
VerificationCodeInput,
@@ -187,6 +236,32 @@ export default defineComponent({
const store = useStore();
const {t} = useI18n()
const {locale} = useI18n()
const route = useRoute()
const router = useRouter()
const homeMainData = reactive({
openType:'',
openTypeChild:'',
isLanguage:false,
openTypeList:openTypeList(t),
})
watch(() => route.query,
(query, oldQuery) => {
// if(oldQuery && query?.works == oldQuery?.works)return
console.log(query,oldQuery,Object.keys(query)[0]);
// homeMainData.openTypeList[Object.keys(query)[0]]
nextTick(()=>{
const key = Object.keys(query)?.[0]
if(key){
homeMainData.openType = Object.keys(query)[0]
homeMainData.openTypeChild = query[Object.keys(query)[0]]
}else{
homeMainData.openType = ''
homeMainData.openTypeChild = ''
}
})
},
{ immediate: true } // 立即触发一次以处理初始参数
);
let userDetail= computed(()=>{
return store.state.UserHabit.userDetail
})
@@ -272,7 +347,7 @@ export default defineComponent({
document.removeEventListener("click", closeShowOperateContent);
}
let renew = ref(null)
const subscribe = ()=>{
const openUpgradeToPro = ()=>{
renew.value.init()
}
onMounted(()=>{
@@ -301,10 +376,26 @@ export default defineComponent({
},
]
})
const setOpenType = (type)=>{
if(homeMainData.openType == type){
homeMainData.openType = ''
}else {
homeMainData.openType = type
if(type == 'history'){
}
}
}
const setRouter = (item,childItem)=>{
let itemRouter = item.router
if(childItem.router)itemRouter = itemRouter + '?' + childItem.router
router.push(itemRouter)
}
return {
store,
userDetail,
t,
...toRefs(homeMainData),
locale,
isMurmur,
credits,
@@ -319,7 +410,9 @@ export default defineComponent({
changeLanguage,
closeShowOperateContent,
renew,
subscribe,
openUpgradeToPro,
setOpenType,
setRouter,
}
},
data() {
@@ -612,12 +705,367 @@ export default defineComponent({
display: flex;
height: 100%;
box-sizing: border-box;
flex-direction: column;
.homeMain_content_body{
> .leftBox{
height: 100%;
background: #f5f5f5;
> .left{
width: 26rem;
height: 100%;
padding: 2rem;
display: flex;
flex-direction: column;
.marginT2{
margin-top: 2rem;
}
.list{
display: flex;
flex-direction: column;
// padding: 1.2rem;
max-height: 5rem;
border-radius: 2rem;
> .titleBox{
padding: 1.2rem;
display: flex;
font-size: 1.4rem;
cursor: pointer;
justify-content: space-between;
align-items: center;
font-weight: 600;
i{
display: flex;
}
> .left{
display: flex;
align-items: center;
> i{
margin-right: .8rem;
}
> span{
line-height: 2.4rem;
color: #52525b;
transition: all .3s;
}
}
> .right{
> i{
transition: all .3s;
}
}
&:hover{
> .left{
> span{
color: #000;
}
}
}
}
> .detailBox{
overflow: auto;
scrollbar-width: none;
flex: 1;
> .detail{
height: 100%;
> .detailItem{
cursor: pointer;
padding: 1.2rem 1.1rem 1.2rem 2.2rem;
font-size: 1.4rem;
font-weight: 400;
margin-bottom: .4rem;
border-radius: .8rem;
display: flex;
align-items: center;
> i{
margin-right: .8rem;
display: flex;
}
&.active{
background: #f5f5f5;
}
&:hover{
background: #f5f5f5;
}
}
> .detailItem:last-child{
margin-bottom: 0;
}
}
}
&.active{
padding: 1.2rem;
overflow: hidden;
max-height: 100%;
background: #00000008;
> .titleBox{
padding: 0;
margin-bottom: 1.6rem;
> .right{
> i{
transform: rotate(180deg);
}
}
}
}
&.language{
> .titleBox{
padding: .8rem;
background: #00000000;
> .left{
> i{
margin-right: 2rem;
}
}
}
> .detailBox{
> .detail{
> .detailItem{
padding: .8rem;
> svg{
margin-right: 2.5rem;
width: 2rem;
height: 2rem;
}
> span{
color: #111a18;
opacity: .5;
margin-left: 4.5rem;
font-weight: 600;
}
&.active{
> span{
color: #52525b;
opacity: 1;
margin-left: 0px;
}
}
}
}
}
}
}
> .title{
display: flex;
padding: .4rem;
align-items: center;
justify-content: space-between;
> span{
font-size: 2rem;
font-weight: 600;
}
> svg{
cursor: pointer;
}
}
> .newObj{
border-radius: 1.2rem;
padding: 1.6rem 1.2rem;
border: 1px solid #0003;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
> svg{
margin-right: .4rem;
width: 2.4rem;
height: 2.4rem;
}
> p{
font-size: 1.6rem;
font-weight: 600;
margin: 0;
}
}
> .navList{
height: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
}
> .navListBottom{
display: flex;
flex-direction: column;
}
> .gallery_btn{
margin-top: 1.2rem;
}
}
}
> .rightBox{
flex: 1;
height: calc(100% - 20rem);
// height: calc(100vh - 7rem);
overflow: hidden;
> .right{
display: flex;
width: 100%;
height: 100%;
flex-direction: column;
> .user{
margin-bottom: 1rem;
.homeMain_user{
height: 6rem;
width: 6rem;
margin-left: auto;
position: relative;
.homeMain_user_icon{
height: 6rem;
width: 6rem;
position: relative;
transform-origin: top;
overflow: hidden;
z-index: 2;
left: 0;
border-radius: 50%;
cursor: pointer;
background: #fff;
img{
width: 100%;
height: 100%;
object-fit: contain;
}
// transition: all .3s;
}
.homeMain_user_detail{
z-index: 999;
position: absolute;
top: calc(100% + .5rem);
background: #fff;
width: 32rem;
height: auto;
opacity: 0;
right: 0px;
display: none;
// box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
text-align: center;
flex-direction: column;
align-items: center;
padding: 1.2rem 2rem;
border: 2px solid #000;
border-radius: 2rem;
.username,.homeMain_user_detail_attention,.homeMain_subscribe{
margin-bottom: 2rem;
}
.homeMain_user_icon{
position: relative;
}
.homeMain_subscribe{
padding: 2rem;
background: #f3f3f6;
border-radius: 1.4rem;
cursor: pointer;
width: 100%;
> div{
display: flex;
margin-bottom: 2rem;
}
> div:last-child{
margin-bottom: 0;
}
.font{
font-size: 1.6rem;
font-weight: 600;
margin-right: 1rem;
}
.stateSucsess{
color: #3ab45c;
}
.stateError{
color: #b43a3a;
}
.time{
font-size: 1.4rem;
font-weight: 400;
margin-left: auto;
}
}
.homeMain_select{
width: 100%;
.select_item {
padding: 0 1rem;
border-radius: .8rem;
line-height: 4rem;
color: #4d4d4d;
display: flex;
align-items: center;
cursor: pointer;
user-select: none;
width: 100%;
flex-wrap: wrap;
&:hover {
background: #f3f3f6;
}
.iconfont ,.fi-rr-book-user {
// font-size: 1.4rem;
}
.select_item_des {
font-size: 1.6rem;
margin-left: 1rem;
font-weight: 500;
}
}
.select_item_long{
border-bottom: 1px solid #eceaea;
margin: 2rem 0;
}
.icon-xiala{
margin-left: auto;
&.active{
transform: rotate(180deg);
}
}
.select_list{
height: 0;
overflow: hidden;
transition: all .3s;
width: 100%;
margin: 0;
> li{
padding-left: 2.5rem;
}
&.active{
height: auto;
}
}
}
.homeMain_user_detail_attention{
width: 100%;
display: flex;
justify-content: space-between;
padding-left: 3.5rem;
padding-right: 3.5rem;
.attention_item{
display: flex;
flex-direction: column;
align-items: center;
}
.attention_item_active{
cursor: pointer;
}
.attention_item_active:hover{
color: #39215b;
span{
color: #39215b;
}
}
div{
font-size: 1.6rem;
font-weight: 600;
}
span{
font-size: 1.4rem;
color: #949eae;
}
}
}
}
}
> .router{
flex: 1;
overflow: hidden;
padding: 0 6rem;
}
}
}
}
.homeMain_heade {
@@ -702,159 +1150,7 @@ export default defineComponent({
position: relative;
top: 0.3rem;
}
.homeMain_user{
.homeMain_user_icon{
height: 6rem;
width: 6rem;
position: relative;
transform-origin: top;
overflow: hidden;
z-index: 2;
left: 0;
border-radius: 50%;
cursor: pointer;
background: #fff;
img{
width: 100%;
height: 100%;
object-fit: contain;
}
// transition: all .3s;
}
.homeMain_user_detail{
position: absolute;
top: calc(100% + .5rem);
background: #fff;
width: 32rem;
height: auto;
opacity: 0;
display: none;
// box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
text-align: center;
flex-direction: column;
align-items: center;
padding: 1.2rem 2rem;
border: 2px solid #000;
border-radius: 2rem;
.username,.homeMain_user_detail_attention,.homeMain_subscribe{
margin-bottom: 2rem;
}
.homeMain_user_icon{
position: relative;
}
.homeMain_subscribe{
padding: 2rem;
background: #f3f3f6;
border-radius: 1.4rem;
cursor: pointer;
width: 100%;
> div{
display: flex;
margin-bottom: 2rem;
}
> div:last-child{
margin-bottom: 0;
}
.font{
font-size: 1.6rem;
font-weight: 600;
margin-right: 1rem;
}
.stateSucsess{
color: #3ab45c;
}
.stateError{
color: #b43a3a;
}
.time{
font-size: 1.4rem;
font-weight: 400;
margin-left: auto;
}
}
.homeMain_select{
width: 100%;
.select_item {
padding: 0 1rem;
border-radius: .8rem;
line-height: 4rem;
color: #4d4d4d;
display: flex;
align-items: center;
cursor: pointer;
user-select: none;
width: 100%;
flex-wrap: wrap;
&:hover {
background: #f3f3f6;
}
.iconfont ,.fi-rr-book-user {
// font-size: 1.4rem;
}
.select_item_des {
font-size: 1.6rem;
margin-left: 1rem;
font-weight: 500;
}
}
.select_item_long{
border-bottom: 1px solid #eceaea;
margin: 2rem 0;
}
.icon-xiala{
margin-left: auto;
&.active{
transform: rotate(180deg);
}
}
.select_list{
height: 0;
overflow: hidden;
transition: all .3s;
width: 100%;
margin: 0;
> li{
padding-left: 2.5rem;
}
&.active{
height: auto;
}
}
}
.homeMain_user_detail_attention{
width: 100%;
display: flex;
justify-content: space-between;
padding-left: 3.5rem;
padding-right: 3.5rem;
.attention_item{
display: flex;
flex-direction: column;
align-items: center;
}
.attention_item_active{
cursor: pointer;
}
.attention_item_active:hover{
color: #39215b;
span{
color: #39215b;
}
}
div{
font-size: 1.6rem;
font-weight: 600;
}
span{
font-size: 1.4rem;
color: #949eae;
}
}
}
}
.username {
font-size: 1.8rem;
color: #1a1a1a;