Files
aida_front/src/views/HomeMain.vue

2259 lines
68 KiB
Vue
Raw Normal View History

2024-03-21 10:49:21 +08:00
<template>
<div class="homeMain_max">
<div class="leftBox" :class="{ leftHide: leftShow }">
<div class="left">
<div class="title">
<!-- <span>AiDA</span> -->
<img
src="@/assets/images/homePage/aidaIcon.png"
alt=""
@click="() => $router.push('/home')"
/>
<svg
@click="() => (leftShow = !leftShow)"
class="leftShowOrHide"
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>
2025-11-03 10:04:49 +08:00
<div class="newObj" :class="{ active: isNewProject }" @click="newProject">
<!-- <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> -->
<svg
width="19"
height="16"
viewBox="0 0 19 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<line
x1="9.83398"
y1="1"
x2="9.83398"
y2="15"
stroke="black"
stroke-width="4"
stroke-linecap="round"
/>
<path
d="M1.5 8H17.5"
stroke="black"
stroke-width="4"
stroke-linecap="round"
/>
</svg>
<p>{{ $t('Header.NewProject') }}</p>
</div>
2025-10-30 11:49:29 +08:00
<div
class="current-projct"
@click="handleNavigateToCurrentProject"
:class="{
disabled: disabledCurrentProject,
filled: !disabledCurrentProject,
active: currentProjectActive
}"
>
<FolderOpenOutlined class="current-project-icon" />
<span>{{ $t('Habit.currentProject') }}</span>
</div>
<div class="divider" />
<div class="navList">
<div
class="tools list"
v-for="item in navTypeList"
:class="{
'active': openType == item.value,
'history': item.value == 'history',
'show-history': showHistory && item.value === 'history',
'isHistory': item.value === 'history'
}"
>
<div class="titleBox" @click="setOpenType(item)">
<div class="left">
<i :class="['fi', item.icon]"></i>
<span>{{ item.label }}</span>
</div>
<div class="right" v-if="item.value !== 'history'">
<i class="fi fi-br-angle-small-down"></i>
</div>
</div>
<div class="detailBox" v-if="item.value != 'history'" v-show="openType">
<div
class="detail"
v-if="item.value != 'history' && item.value != 'cloud'"
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>
<div class="text">
<span>{{ childItem.label }}</span>
</div>
</div>
</div>
<!-- <div class="detail" v-else-if="item.value == 'history'" style="height: auto;">
2025-06-18 11:05:23 +08:00
<div v-for="historyTypeItem in historyData.updateTimeType" :key="historyTypeItem">
2025-06-26 15:41:08 +08:00
<div class="timeType" v-if="historyTypeItem == 'Todaylist' && item.Todaylist.length>0">{{$t('Header.Today')}}</div>
<div class="timeType" v-if="historyTypeItem == 'Yesterdaylist' && item.Yesterdaylist.length>0">{{$t('Header.Yesterday')}}</div>
<div class="timeType" v-if="historyTypeItem == 'WithinAWeeklist' && item.WithinAWeeklist.length>0">{{$t('Header.WithinAWeek')}}</div>
2025-07-19 14:04:48 +08:00
<div class="timeType" v-if="historyTypeItem == 'Earlierlist' && item.Earlierlist.length>0">{{$t('Header.Earlier')}}</div>
2025-08-26 10:14:34 +08:00
<div v-for="childItem,index in item[historyTypeItem]" :key="childItem.name" class="detailItem history" @click="setHistory(item,childItem)" :class="{active:openTypeChild == childItem.id}">
2025-06-18 11:05:23 +08:00
<div class="text" style="width: 100%;">
<span :title="childItem.name" v-show="!childItem.editName">{{ childItem.name }}</span>
<textarea v-model="historyData.historyTextarea" v-show="childItem.editName" @click.stop></textarea>
</div>
2025-08-22 10:27:48 +08:00
<div class="type">{{ $t(`Header.${childItem.process}`) }}</div>
<div class="time">{{ childItem?.updateTime?.replace('T', ' ') }}</div>
2025-06-18 11:05:23 +08:00
<div class="btn">
<i class="fi fi-br-menu-dots-vertical" v-show="!childItem.editName" @click.stop="editHistory(childItem,index,$event,item[historyTypeItem])"></i>
<i class="fi fi-br-check" v-show="childItem.editName" @click.stop="accomplishHistory(childItem,index,$event)"></i>
<div class="operation" v-show="historyData.selectHistoryId == childItem.id">
2025-06-18 11:05:23 +08:00
<div class="item" @click.stop="editName(childItem)">
<i class="fi fi-rr-edit"></i>
2025-06-26 15:41:08 +08:00
<span>{{$t('Header.Rename')}}</span>
2025-06-18 11:05:23 +08:00
</div>
<div class="item" v-if="childItem.process == 'SINGLE_DESIGN' || childItem.process == 'SERIES_DESIGN'" @click.stop="setting(childItem)">
<i class="fi fi-rr-settings-sliders"></i>
2025-06-26 15:41:08 +08:00
<span>{{$t('Header.Setting')}}</span>
2025-06-18 11:05:23 +08:00
</div>
<div class="item" @click.stop="deleteItem(childItem)">
<i class="icon iconfont icon-shanchu operate_icon"></i>
2025-06-26 15:41:08 +08:00
<span>{{$t('Header.Delete')}}</span>
2025-06-18 11:05:23 +08:00
</div>
2025-05-20 16:47:27 +08:00
</div>
</div>
</div>
</div>
2025-06-18 11:05:23 +08:00
2025-05-28 10:28:07 +08:00
<div v-show="!historyData.isNoData" class="material_content_list_loding">
<span class="historyPage_loading" v-show="!historyData.isShowLoading"></span>
<span v-show="historyData.isShowLoading">
2025-05-20 16:47:27 +08:00
<a-spin size="large" />
</span>
2025-05-08 14:09:12 +08:00
</div>
2025-05-28 10:28:07 +08:00
<img v-show="historyData.isNoData && historyData.isNull" src="@/assets/images/homePage/null_img.png">
</div> -->
</div>
</div>
</div>
<div class="navListBottom">
<!-- <div class="tools marginT2 marginB2 list" :class="{active:$route.name == 'cloud'}" @click="()=>$router.push('/home/cloud')">
2025-05-28 10:28:07 +08:00
<div class="titleBox" style="margin-bottom: 0;">
<div class="left">
<i class="fi fi-rr-cloud-upload-alt"></i>
2025-06-26 15:41:08 +08:00
<span>{{$t('Header.BatchGeneration')}}</span>
2025-05-28 10:28:07 +08:00
</div>
</div>
2025-08-22 10:27:48 +08:00
</div> -->
<div class="tools list" :class="{ active: isLanguage }">
<div class="titleBox" @click="() => (isLanguage = !isLanguage)">
<div class="left">
<i class="fi fi-br-globe"></i>
<span>{{ $t('Header.Language') }}</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"
v-for="item in language"
:class="{ active: locale == item.value }"
@click="setLocale(item.value)"
>
<svg
v-show="locale == item.value"
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>{{ item.name }}</span>
</div>
</div>
</div>
</div>
</div>
<div class="segmentation"></div>
<div
v-if="userDetail.systemUser == 0 || userDetail.systemUser == 3"
@click="openUpgradeToPro"
class="gallery_btn gallery_btn_radius"
style="width: 100%; display: flex; justify-content: center; align-items: center"
>
<i class="fi fi-br-dollar" style="margin-right: 0.6rem; display: flex"></i>
{{ $t('Header.openUpgrade') }}
</div>
</div>
</div>
<div class="rightBox">
<div class="right">
<div class="user">
<div class="left" v-show="leftShow">
<svg
@click="() => (leftShow = !leftShow)"
class="leftShowOrHide"
xmlns="http://www.w3.org/2000/svg"
width="3rem"
height="3rem"
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 class="newObj marginT2" @click="newProject">
<svg
width="19"
height="16"
viewBox="0 0 19 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<line
x1="9.83398"
y1="1"
x2="9.83398"
y2="15"
stroke="black"
stroke-width="4"
stroke-linecap="round"
/>
<path
d="M1.5 8H17.5"
stroke="black"
stroke-width="4"
stroke-linecap="round"
/>
</svg>
<p style="white-space: nowrap">{{ $t('Header.NewProject') }}</p>
</div>
</div>
<div class="trialApproval">
<div class="message_iconItem" style="display: flex">
<i
class="fi fi-rs-interrogation"
style="font-size: 2.4rem"
@click="toUserManual"
></i>
</div>
<div class="message_iconItem" style="display: flex">
<a-badge :count="messageNum">
<i
class="fi fi-rr-envelope"
style="font-size: 2.4rem"
@click="openMessage"
></i>
</a-badge>
</div>
<div class="message_iconItem" style="display: flex">
<a-badge :count="messageType?.newPosted">
<!-- <i class="fi fi-rr-envelope" @click="openMessage"></i> -->
<i
class="fi fi-rr-bell"
style="font-size: 2.4rem"
@click.stop="openNewPosted"
></i>
</a-badge>
<div
class="message_iconItem_value select_block"
v-show="isNewPosted"
style="width: 40rem"
>
<newPosted ref="newPosted"></newPosted>
</div>
</div>
</div>
<div class="homeMain_right_content">
<div class="button_second credits hideChecked">
{{ $t('Header.Credits') }}:&nbsp;
<span :title="credits">
<div
class="credits_item"
v-for="item in String(credits)"
:style="{ transform: 'translateY(' + item * -100 + '%)' }"
>
<div v-if="item != '.'" v-for="numItem in 10">{{ numItem - 1 }}</div>
<div v-else>{{ item }}</div>
</div>
</span>
<i
@click="getCredits"
class="fi fi-br-refresh"
:class="[activeCredits ? 'active' : '']"
></i>
<i @click="UpgradePlan" title="Purchase" class="fi fi-rr-shop"></i>
</div>
</div>
<div class="homeMain_user">
<div class="homeMain_user_icon" @click="openAccount">
<img :src="userDetail.avatar" alt="" />
</div>
<div class="homeMain_user_detail">
<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>{{ userDetail?.followeeCount }}</div>
<span>{{ $t('account.Follow') }}</span>
</div>
<div class="attention_item">
<div>{{ userDetail?.followerCount }}</div>
<span>{{ $t('account.Fans') }}</span>
</div>
</div>
<div class="homeMain_subscribe">
<div>
<span class="font">{{ $t('account.Status') }}</span>
<span v-if="userDetail.timeData.isExpiration" class="stateSucsess font">
{{ $t('account.Valid') }}
<i class="fi fi-ss-check-circle"></i>
</span>
<span v-else class="stateError font">
{{ $t('account.Expire') }}
<i class="fi fi-ss-check-circle"></i>
</span>
<span class="time">{{ userDetail.timeData.text }}</span>
</div>
</div>
<div class="homeMain_select">
<!-- <div class="select_item_box" @click.stop="isLanguage = !isLanguage">
2025-05-08 14:09:12 +08:00
<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>
2025-05-28 10:28:07 +08:00
</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">{{ $t('Header.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">{{ $t('Header.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="routerView">
<div class="userSystem" v-show="pastDuePage">
{{ $t('Header.pastDue') }}
</div>
<div class="router" v-if="!getLangIsShowMark">
<home
ref="home"
@setNewProject="() => (leftShow = true)"
@setTask="setTask"
></home>
</div>
</div>
</div>
</div>
<payOrder ref="payOrder"></payOrder>
<UpgradePlan ref="UpgradePlan"></UpgradePlan>
<TaskPage ref="TaskPage"></TaskPage>
2025-05-08 14:09:12 +08:00
<div class="mark_loading" v-show="getLangIsShowMark">
<a-spin size="large" />
2024-03-21 10:49:21 +08:00
</div>
<!-- <RobotAssist v-if="!getLangIsShowMark"></RobotAssist> -->
<scaleVideo ref="scaleVideo"></scaleVideo>
<!-- 进行续订 -->
<renew ref="renew"></renew>
<projectSetting ref="projectSetting" @getHistory="settingGetHistory"></projectSetting>
<!-- 未绑定邮箱弹窗 -->
<bindEmail ref="bindEmail"></bindEmail>
</div>
2024-03-21 10:49:21 +08:00
</template>
<script>
import {
defineComponent,
createVNode,
ref,
toRefs,
reactive,
computed,
onMounted,
nextTick,
watch,
provide,
defineAsyncComponent
} from 'vue'
import { isEmail } from '@/tool/util'
import { setCookie, getCookie, WriteCookie, clonAllCookie } from '@/tool/cookie'
import payOrder from '@/component/Pay/payOrder.vue'
import renew from '@/component/HomePage/renew.vue'
2025-04-01 15:25:15 +08:00
// import Habit from "@/component/Detail/habit.vue";
import TaskPage from '@/component/HomePage/TaskPage.vue'
import UpgradePlan from '@/component/HomePage/UpgradePlan.vue'
import { Https } from '@/tool/https'
import { Modal, message } from 'ant-design-vue'
2025-10-30 11:49:29 +08:00
import { ExclamationCircleOutlined, FolderOpenOutlined } from '@ant-design/icons-vue'
import RobotAssist from '@/component/HomePage/RobotAssist.vue'
import scaleVideo from '@/component/HomePage/scaleVideo.vue'
import newPosted from '@/component/HomePage/newPosted.vue'
import { useStore } from 'vuex'
import { setLang } from '@/tool/guide'
import showViewVideo from '@/tool/mount'
import { useI18n } from 'vue-i18n'
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 { navTypeList } from '@/tool/listData.js'
import home from '@/component/home/index.vue'
2025-05-21 20:05:08 +08:00
import projectSetting from '@/component/home/newProject/setting.vue'
import bindEmail from '@/component/HomePage/bindEmail.vue'
2025-09-11 14:56:08 +08:00
// const home = defineAsyncComponent(() =>
// import('@/component/home/index.vue')
// )
2024-03-21 10:49:21 +08:00
export default defineComponent({
components: {
renew,
// Habit,
RobotAssist,
scaleVideo,
newPosted,
UpgradePlan,
payOrder,
TaskPage,
home,
projectSetting,
2025-10-30 11:49:29 +08:00
bindEmail,
FolderOpenOutlined
},
setup() {
const store = useStore()
const { t } = useI18n()
const { locale } = useI18n()
const route = useRoute()
const router = useRouter()
const homeMainData = reactive({
leftShow: false,
openType: '',
openTypeChild: '',
isLanguage: false,
userDetailLanguage: computed(() => store.state.UserHabit.userDetail.language),
navTypeList: navTypeList(t),
projectSetting: null,
historyData: {
isNoData: false,
isShowLoading: false,
isNull: false,
searchCollectionName: '',
historyTextarea: '',
updateTimeType: ['Todaylist', 'Yesterdaylist', 'WithinAWeeklist', 'Earlierlist'],
selectHistoryId: -1,
page: 1,
size: 10,
isToday: false,
isYesterday: false,
isWithinAWeek: false,
isEarlier: false
},
bathGenerationList: ['poseTransfer', 'SERIES_DESIGN', 'toProduct', 'relight'],
2025-11-03 10:04:49 +08:00
showHistory: false,
isNewProject: false
})
let userDetail = computed(() => {
return store.state.UserHabit.userDetail
})
const pastDuePage = computed(() => {
const isAllowedRoute = route.path === '/home/events' || route.path === '/home/works'
const hasNoSystemAccess = userDetail.value.systemList.indexOf(1) === -1
return hasNoSystemAccess && !isAllowedRoute
})
watch(
() => homeMainData.userDetailLanguage,
newVal => {
if (locale.value == newVal || !newVal) return
locale.value = newVal
let navList = navTypeList(t)
for (const key in navList) {
const element = navList[key]
homeMainData.navTypeList[key].label = element.label
if (element.list?.length > 0) {
element.list.forEach((item, index) => {
homeMainData.navTypeList[key].list[index].label = item.label
})
}
}
}
)
2025-09-16 13:50:34 +08:00
// watch(()=>locale.value,(newVal,oldVal)=>{
// if(newVal == oldVal)return
// console.log(newVal , oldVal)
// // homeMainData.navTypeList =
// })
2025-08-26 10:14:34 +08:00
const historyData = reactive({})
const getIdExistToHistory = async () => {
return await new Promise((resolve, reject) => {
let value = {
id: Number(route.query?.id || route.query?.history)
}
Https.axiosPost(Https.httpUrls.historyProject, value)
.then(rv => {
resolve(rv.content.length > 0)
})
.catch(() => {
resolve(false)
})
})
}
watch(
() => route.query,
(query, oldQuery) => {
nextTick(async () => {
const key = Object.keys(query)?.[0]
if (key) {
if (query.id) {
homeMainData.openType = 'history'
homeMainData.openTypeChild = query.id
} else {
homeMainData.openType = Object.keys(query)[0]
homeMainData.openTypeChild = query[Object.keys(query)[0]]
}
if (homeMainData.openType === 'history' && route.path !== '/home/history') {
homeMainData.openTypeChild = ''
homeMainData.openType = ''
}
if ((query?.id || query?.history) && !(await getIdExistToHistory())) {
router.push('/home')
return
}
} else {
homeMainData.openType = ''
homeMainData.openTypeChild = ''
}
2025-09-16 13:50:34 +08:00
if (
query.create == 'true' ||
query?.source == 'batch' ||
(query.history && query.type == 'Works')
) {
settingGetHistory()
}
})
},
{ immediate: true } // 立即触发一次以处理初始参数
)
2024-12-19 13:47:55 +08:00
// 监听路由,当路由地址为/home/history时homeMainData.showHistory为true,改变左侧菜单颜色
watch(
2025-11-03 10:04:49 +08:00
[() => route.path, () => route.fullPath],
([path, fullPath]) => {
if (route.path == '/home/history') {
homeMainData.showHistory = true
} else {
homeMainData.showHistory = false
}
2025-11-03 10:04:49 +08:00
// 当fullPath为/home时表示在新建项目
if (route.fullPath === '/home') {
homeMainData.isNewProject = true
} else {
homeMainData.isNewProject = false
}
},
{ immediate: true }
)
let isMurmur = ref()
let credits = computed(() => {
return store.state.UserHabit.credits.value
})
let activeCredits = ref(false)
let getLangIsShowMark = ref(true)
let messageNum = computed(() => {
return store.state.UserHabit.messageSystem.messageNum
})
let messageType = computed(() => {
return store.state.UserHabit.messageSystem.messageType
})
let stateList = reactive({
isNewPosted: false,
isLanguage: false
})
let newPosted = ref(null)
2024-09-03 16:39:06 +08:00
let getUnreadCount = () => {
Https.axiosGet(Https.httpUrls.getUnreadCount).then(rv => {
if (rv) {
store.commit('setMessageSystem', [rv])
}
})
}
MyWs.close()
// MyWs.linkWs("wss://"+MyWs.messageUrl,'message')
MyWs.linkWs('wss://' + MyWs.messageUrl, 'message')
let getWsMessage = data => {
let userInfo = ['followeeCount', 'followerCount']
let obj = {}
let isObj = false
data.forEach(element => {
const keys = Object.keys(element)[0]
if (userInfo.indexOf(keys) > 0) {
obj[keys] = element[keys]
isObj = true
2024-09-03 16:39:06 +08:00
}
})
if (isObj) store.commit('upUserDetail', obj)
store.commit('setMessageSystem', data)
}
MyEvent.add('getMessage', getWsMessage)
let openNewPosted = () => {
stateList.isNewPosted = !stateList.isNewPosted
newPosted.value.init()
document.addEventListener('click', closeShowOperateContent, false)
}
//点击下拉图标出现操作
let changeLanguage = () => {
stateList.isLanguage = !stateList.isLanguage
document.addEventListener('click', closeShowOperateContent, false)
}
2025-07-19 14:04:48 +08:00
//关闭下拉图标
let closeShowOperateContent = () => {
stateList.isLanguage = false
stateList.isNewPosted = false
document.removeEventListener('click', closeShowOperateContent)
}
let renew = ref(null)
const openUpgradeToPro = () => {
renew.value.init()
}
const toUserManual = () => {
const route = router.resolve({ name: 'userManual' })
window.open(route.href + '?lang=' + locale.value, '_blank')
}
onMounted(async () => {
let test = getCookie('isTest')
let isTest = JSON.parse(test)
//判断账号剩余时间是否太短
let isModalOne = JSON.parse(sessionStorage.getItem('isTimeOne'))
if (!isModalOne) {
//判断是否是试用用户
await new Promise(async resolve => {
if (isTest) {
resolve('')
} else {
await Https.axiosPost(Https.httpUrls.getExpiredTime, {}).then(rv => {
if (rv) {
let dateNow = Date.now()
let date = new Date(dateNow)
let rvDate = new Date(rv)
let diffInMilliseconds = Math.abs(date - rvDate) // 获取时间差的毫秒数
let days = Math.floor(diffInMilliseconds / (24 * 60 * 60 * 1000)) // 计算天数
let hours = Math.floor(
(diffInMilliseconds % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000)
) // 计算小时数
let minutes = Math.floor(
(diffInMilliseconds % (60 * 60 * 1000)) / (60 * 1000)
) // 计算分钟数
if (days < 5) {
setTimeout(() => {
let text = {
str: `${t('HomeView.jsContent4', {
days: days,
hours: hours
})}<a href="https://code-create.com.hk/aida" target="_blank">${t(
'HomeView.jsContent8'
)}</a>`,
title: `${t('HomeView.jsContent7')}`
}
dataDom.affiche.init(text)
}, 500)
}
resolve('')
} else {
resolve('')
}
})
}
})
}
getUnreadCount()
// nextTick(()=>{
// setPorfolioDom()
// })
})
// onBeforeUnmount(()=>{
// let imgParent = document.querySelector('.homeMain_max .detail .material_content_list_loding .historyPage_loading')
// if(Observer?.unobserve)Observer.unobserve(imgParent);
// })
const setOpenType = item => {
const { value, list } = item
if (!list?.length) {
router.push(item.router)
return
}
homeMainData.openType = homeMainData.openType === value ? '' : value
}
let Observer = null
let setPorfolioDom = () => {
if (Observer) return
homeMainData.historyData.isShowLoading = false
homeMainData.historyData.isNoData = false
homeMainData.historyData.page = 1
let imgParent = document.querySelector(
'.homeMain_max .detail .material_content_list_loding .historyPage_loading'
)
Observer = new IntersectionObserver((entries, observer) => {
// 如果不是相交,则直接返回
if (!entries[0].intersectionRatio) return
getHistory()
homeMainData.historyData.page += 1
}).observe(imgParent)
}
const setRouter = (item, childItem) => {
let itemRouter = item.router
if (childItem.router) itemRouter = itemRouter + '?' + childItem.router
router.push(itemRouter)
}
const setHistory = (item, childItem) => {
// router.push(`/home/tools?tools=toProduct&id=${childItem.id}`)
if (childItem.process == 'SERIES_DESIGN' || childItem.process == 'SINGLE_DESIGN') {
router.push(`/home?history=${childItem?.id}`)
} else {
let processList = {
toProduct: 'TO_PRODUCT_IMAGE',
relight: 'RELIGHT',
poseTransfer: 'POSE_TRANSFER',
deReconstruction: 'DE_RECONSTRUCTION',
patternMaking3D: 'THREE_D_PLATE_MAKING',
canvasUpload: 'CANVAS'
}
let process = ''
for (const key in processList) {
if (processList[key] == childItem.process) {
process = key
break
}
}
router.push(`/home/tools?tools=${process}&id=${childItem.id}`)
}
// router.push(`/home?history=${childItem.id}`)
}
const settingGetHistory = () => {
if (homeMainData.historyData.page == 1) {
return
}
homeMainData.historyData.page = 1
// homeMainData.navTypeList.history = {
// icon:"fi-br-time-past",
// label:"History",
// value:"history",
// Todaylist:[],
// Yesterdaylist:[],
// WithinAWeeklist:[],
// Earlierlist:[],
// }
homeMainData.navTypeList.history.Todaylist = []
homeMainData.navTypeList.history.Yesterdaylist = []
homeMainData.navTypeList.history.WithinAWeeklist = []
homeMainData.navTypeList.history.Earlierlist = []
homeMainData.historyData.isShowLoading = false
homeMainData.historyData.isNoData = false
isFound = 0 //表示是否找到当前id的记录
existToHistoryIndex = -1
}
provide('settingGetHistory', settingGetHistory)
const categorizeDate = inputDate => {
const now = new Date()
const date = new Date(inputDate)
// 计算时间差(毫秒)
const diffTime = now - date
const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24))
// 判断逻辑
if ((diffDays === -1 || diffDays === 0) && date.getDate() === now.getDate()) {
return 'Today'
} else if (diffDays === 1 || (diffDays === 0 && date.getDate() !== now.getDate())) {
return 'Yesterday'
} else if (diffDays <= 7) {
return 'WithinAWeek'
} else {
return 'Earlier'
}
}
let isFound = 0
let existToHistoryIndex = -1
const setScrollTop = () => {
setTimeout(() => {
let historyDateList = [
'Todaylist',
'Yesterdaylist',
'WithinAWeeklist',
'Earlierlist'
]
let num = 0
let dateIndex = -1 //表示某个时间段
let parent = document.querySelectorAll('.homeMain_max .navList .history .detail')
let imgParent = document.querySelectorAll(
'.homeMain_max .navList .history .detail>div'
)
if (existToHistoryIndex == -1) {
parent[0].parentNode.scrollTop = parent[0].offsetHeight
} else {
isFound++
historyDateList.forEach((item, dateItemIndex) => {
let length = homeMainData.navTypeList.history[item].length
if (existToHistoryIndex > length + num) {
num += length
} else {
if (dateIndex == -1) dateIndex = dateItemIndex
}
})
let dateEl = imgParent[dateIndex].querySelectorAll('.history')
parent[0].parentNode.scrollTop = dateEl[existToHistoryIndex - num - 1].offsetTop
}
}, 0)
}
const getHistory = () => {
if (homeMainData.historyData.isShowLoading && !homeMainData.historyData.isNoData)
return
homeMainData.historyData.isShowLoading = true
let data = {
page: homeMainData.historyData.page,
size: homeMainData.historyData.size,
projectName: homeMainData.historyData.searchCollectionName,
asc: 0,
process: ''
// startDate:startDate,
// endDate:endDate,
// intersection:1,
}
Https.axiosPost(Https.httpUrls.historyProject, data)
.then(
// Https.axiosPost( Https.httpUrls.queryUserGroup, data).then(
rv => {
if (data.page == 1 && rv.content.length == 0) {
homeMainData.historyData.isNull = true
} else {
homeMainData.historyData.isNull = false
2025-05-20 16:47:27 +08:00
}
if (rv.content.length > 0) {
rv.content.forEach((item, index) => {
let str = categorizeDate(item.updateTime) + 'list'
homeMainData.navTypeList.history[str].push(item)
if (item.id == (route.query?.id || route.query?.history)) {
existToHistoryIndex = rv.page * rv.size + index + 1 - rv.size
2025-05-20 16:47:27 +08:00
}
})
homeMainData.historyData.isNull = false
if ((route.query?.id || route.query?.history) && isFound < 1) setScrollTop()
} else {
homeMainData.historyData.isNoData = true
}
homeMainData.historyData.isShowLoading = false
}
)
.catch(res => {
homeMainData.historyData.isShowMark = false
if (data.page == 1) {
homeMainData.historyData.isNull = true
}
homeMainData.historyData.isNoData = true
})
}
const editHistory = (item, index, el, list) => {
if (homeMainData.historyData.selectHistoryId == -1) {
let top = el.target.parentNode.parentNode.getBoundingClientRect().y
let parentTop =
el.target.parentNode.parentNode.parentNode.parentNode.parentNode.getBoundingClientRect()
.y
let parentHeight =
el.target.parentNode.parentNode.parentNode.parentNode.parentNode.offsetHeight
let operation = el.target.parentNode.querySelector('.operation')
homeMainData.historyData.selectHistoryId = item.id
//判断弹窗是加载按钮上面还是下面
if (list.length == 1) {
operation.classList.add('activeLeft')
return
}
if (top > parentHeight / 2 + parentTop) {
//加在按钮上面
operation.classList.add('active')
2024-03-21 10:49:21 +08:00
} else {
operation.classList.remove('active')
2024-03-21 10:49:21 +08:00
}
} else {
homeMainData.historyData.selectHistoryId = -1
}
let operationCli = () => {
homeMainData.historyData.selectHistoryId = -1
document.removeEventListener('click', operationCli)
}
document.addEventListener('click', operationCli)
}
const editName = item => {
homeMainData.historyData.selectHistoryId = -1
for (const key in homeMainData.navTypeList.history) {
let list = ['Earlierlist', 'Todaylist', 'WithinAWeeklist', 'Yesterdaylist']
if (list.indexOf(key) == -1) continue
homeMainData.navTypeList.history[key].forEach(item => {
item.editName = false
})
}
2024-07-29 17:30:39 +08:00
item.editName = true
homeMainData.historyData.historyTextarea = item.name
}
const deleteItem = item => {
Https.axiosPost(
Https.httpUrls.projectDetail,
{},
{ params: { projectId: item.id } }
).then(rv => {
homeMainData.historyData.selectHistoryId = -1
settingGetHistory()
if (homeMainData.openTypeChild == item.id) {
router.push('/home')
}
})
}
const setting = item => {
homeMainData.projectSetting.init(item)
homeMainData.historyData.selectHistoryId = -1
}
const accomplishHistory = item => {
let data = {
name: homeMainData.historyData.historyTextarea, //library名字
id: item.id //history id
}
Https.axiosPost(Https.httpUrls.projectSaveOrUpdate, data)
.then(rv => {
item.name = homeMainData.historyData.historyTextarea
item.editName = false
homeMainData.historyData.historyTextarea = ''
})
.catch(res => {})
}
const newProject = () => {
router.push('/home')
}
const bathGeneration = item => {
homeMainData.openType = ''
homeMainData.historyData.selectHistoryId = -1
router.push(
`/home/cloud?type=creation&id=${item.id}&name=${item.name}&process=${item.process}`
)
}
2024-03-21 10:49:21 +08:00
const currentProjectPath = computed(() => {
return store.state.Workspace.projectPath
})
2024-03-21 10:49:21 +08:00
2025-10-30 11:49:29 +08:00
const disabledCurrentProject = computed(() => {
if (!currentProjectPath.value) return true
return false
})
const currentProjectActive = computed(() => {
return currentProjectPath.value === route.fullPath
})
2024-06-17 11:32:31 +08:00
2025-10-30 11:49:29 +08:00
const handleNavigateToCurrentProject = () => {
if (currentProjectActive.value) return
if (currentProjectPath.value) {
router.push(currentProjectPath.value)
}
}
2024-03-21 10:49:21 +08:00
return {
store,
userDetail,
t,
...toRefs(homeMainData),
...toRefs(historyData),
pastDuePage,
locale,
isMurmur,
credits,
activeCredits,
getLangIsShowMark,
messageNum,
messageType,
...toRefs(stateList),
newPosted,
openNewPosted,
changeLanguage,
closeShowOperateContent,
renew,
openUpgradeToPro,
setOpenType,
setRouter,
setHistory,
editHistory,
settingGetHistory,
editName,
deleteItem,
setting,
accomplishHistory,
newProject,
bathGeneration,
toUserManual,
2025-10-30 11:49:29 +08:00
currentProjectPath,
disabledCurrentProject,
currentProjectActive,
handleNavigateToCurrentProject
}
},
data() {
return {
email: '',
emailCode: ['', '', '', '', '', ''], //邮箱验证码
time: 60, //60秒倒计时
timer: 0,
timerOperate: null,
numTime: 30,
timerSec: null,
modalWarning: null,
2024-03-21 10:49:21 +08:00
language: [
{ name: 'English', value: 'ENGLISH' },
{ name: '中文', value: 'CHINESE_SIMPLIFIED' }
// {name:'한국인',value:'KOREAN'},
// {name:'にほんご',value:'JAPANESE'},
// {name:'Русский',value:'RUSSIAN'},
// {name:'Français',value:'FRENCH'},
// {name:'แบบไทย',value:'THAI'},
// {name:'Tiếng Việt',value:'VIETNAMESE'},
// {name:'Italiano',value:'ITALIAN'},
]
}
},
directives: {},
async mounted() {
await new Promise((resolve, reject) => {
this.store
.dispatch('getLangType')
.then(() => {
this.getLangIsShowMark = false
resolve()
})
.catch(() => {
this.getLangIsShowMark = false
reject()
})
})
let isMurmur = getCookie('isMurmur') //获取是否是试用用户
this.isMurmur = JSON.parse(isMurmur)
if (this.userDetail.userId && this.userDetail.userId > -1) {
this.accountIsLogin()
} else {
this.$router.replace('/')
}
if (!this.isMurmur) {
this.operateClick()
document.addEventListener('click', this.operateClick)
}
this.getCredits()
this.getLang('')
//语言适配
let tl1 = gsap.timeline({ paused: true })
let userDetailMax = document.querySelector('.homeMain_max .homeMain_user')
let userDetail = document.querySelector('.homeMain_max .homeMain_user_detail')
// let anmiation = TweenMax.to(userDetailMax,1, {'margin-top':'30px',opacity:1})
// anmiation.stop()
let state
tl1.to(userDetail, 0.3, { opacity: 1, display: 'flex' })
// .to(userDetailIcon,.3, {'left':'16rem',y:'25%',x:'-50%',scale:1.5,opacity:1},'-=.3')
let overTime
let outTime
userDetailMax.addEventListener('mouseenter', event => {
if (state && !outTime) return
clearTimeout(overTime)
clearTimeout(outTime)
overTime = setTimeout(() => {
state = true
this.isLanguage = false
tl1.play()
}, 500)
})
userDetailMax.addEventListener('mouseleave', event => {
if (overTime) {
clearTimeout(overTime)
}
if (!state) return
clearTimeout(outTime)
outTime = setTimeout(() => {
state = false
tl1.reverse()
}, 500)
})
let orderId = sessionStorage.getItem('orderId') //进入首页后是否打开订单列表查询到订单
if (orderId) {
let payOrder = this.$refs.payOrder
payOrder.init(orderId)
}
},
methods: {
setTask(data) {
this.openTask(data)
2024-03-21 10:49:21 +08:00
},
turnToPage(name) {
let noRefresh = name === 'home' ? true : false
this.$router.push({ name: name, params: { noRefresh: noRefresh } })
},
UpgradePlan() {
//购买积分
let UpgradePlan = this.$refs.UpgradePlan
UpgradePlan.init()
},
Assignment() {
//任务
// let num = 123+this.credits
// this.store.commit('setCredits',num)
},
getCredits() {
//刷新当前积分
if (!this.activeCredits) {
this.activeCredits = true
this.store.dispatch('getCredits').then(rv => {
setTimeout(() => {
this.activeCredits = false
}, 300)
})
} else {
this.activeCredits = false
}
},
2025-08-22 10:27:48 +08:00
//查看订单
orderForm() {
let payOrder = this.$refs.payOrder
payOrder.init()
},
//教程
getTutorial() {
let url = 'https://aida-user-manual-chinese.super.site/'
if (this.locale == 'ENGLISH') {
url =
'https://code-create.com.hk/wp-content/uploads/2025/02/aida_3.0-Manual-2_5-EN.pdf'
showViewVideo({ url: 'https://aida.com.hk/video/AiDA_3_1_Demo_V2_EN.mp4' })
} else {
showViewVideo({ url: 'https://aida.com.hk/video/AiDA_3_1_Demo_V2_CN.mp4' })
}
this.toUserManual()
// //打开视频
// const a = document.createElement('a');
// a.href = url;
// a.target = '_blank';
// // a.download = 'aida_3.0-Manual.pptx'; // 下载的文件名
// document.body.appendChild(a);
// a.click();
},
//登出
async logout() {
let data = {
userId: this.userDetail.userId
}
await Https.axiosPost(Https.httpUrls.accountLogout, data).then(rv => {
// WriteCookie("token");
clonAllCookie()
})
this.$router.replace('/')
this.store.commit('createDetail')
this.store.commit('createProbject')
2025-05-08 14:09:12 +08:00
// WriteCookie("token");
// window.location.reload()
},
//判断是否登录
accountIsLogin() {
let data = {
userId: this.userDetail.userId
}
Https.axiosPost(Https.httpUrls.accountIsLogin, data).then(rv => {
if (!rv) {
this.$router.replace('/')
}
})
},
2024-03-21 10:49:21 +08:00
//点击重置判断是否长时间五操作
operateClick() {
if (this.timer) {
clearTimeout(this.timer)
}
let _this = this
let timeNum = 1000 * 60 * 120
this.timer = setTimeout(() => {
this.modalWarning = Modal.warning({
title: () => this.t('Header.jsContent3', { numTime: _this.numTime }),
icon: createVNode(ExclamationCircleOutlined),
okText: 'Ok',
centered: true,
onOk() {
_this.numTime = 30
clearInterval(_this.timerSec)
}
})
_this.numCounter()
}, timeNum)
},
2024-03-21 10:49:21 +08:00
numCounter() {
this.timerSec = setInterval(() => {
if (this.numTime > 0) {
this.numTime = this.numTime - 1
} else {
clearTimeout(this.timer)
clearInterval(this.timerSec)
this.logout()
this.modalWarning.destroy()
}
}, 1000)
},
//获取当前语言
getLang(v) {
let data
Https.axiosPost(Https.httpUrls.getUserLanguage, data).then(rv => {
if (rv) {
this.locale = rv
setLang(rv)
}
})
},
setLang(v) {
this.getLangIsShowMark = true
Https.axiosGet(Https.httpUrls.changeUserLanguage, { params: { language: v } })
.then(rv => {
if (rv) {
if (rv) {
let token = rv
setCookie('token', token)
this.getLang('')
// if(this.$router.currentRoute._value.path == '/home'){
// this.$router.push("/home")
// }else{
// this.$router.push("/home")
// }
this.store.commit('clearAllData')
window.location.reload()
// window.location.href = '/home';
}
this.getLangIsShowMark = false
}
})
.catch(() => {
this.getLangIsShowMark = false
})
},
2024-03-21 10:49:21 +08:00
setLocale(v) {
this.setLang(v)
},
openTask(data) {
let taskPage = this.$refs.TaskPage
taskPage.init(data)
},
openAccount() {
this.$router.push('/home/account')
},
openMessage() {
this.$router.push('/home/account/accountMessage')
}
}
})
</script>
2024-03-21 10:49:21 +08:00
<style lang="less" scoped>
.homeMain_max {
position: relative;
display: flex;
height: 100%;
box-sizing: border-box;
> .leftBox {
height: 100%;
2025-11-03 16:52:43 +08:00
background: #f9fafa;
overflow: hidden;
width: 29.5rem;
transition: width 0.3s;
&.leftHide {
width: 0;
}
> .left {
// width: 26rem;
width: 29.5rem;
height: 100%;
padding: 2.4rem 2.2rem;
display: flex;
flex-direction: column;
.marginT2 {
margin-top: 2rem;
}
.marginB2 {
// margin-bottom: 1rem;
&.active {
margin-bottom: 1rem;
2024-03-21 10:49:21 +08:00
}
}
.list {
display: flex;
flex-direction: column;
// padding: 1.2rem;
max-height: 5rem;
border-radius: 2rem;
&.show-history {
2025-11-03 16:52:43 +08:00
background: rgba(0, 0, 0, 0.04);
border-radius: 0.8rem;
2024-03-21 10:49:21 +08:00
}
&.active {
> .detailBox {
flex: 1;
}
}
&.history {
flex: 1;
&:hover {
2025-11-03 16:52:43 +08:00
background: rgba(0, 0, 0, 0.04);
border-radius: 0.8rem;
}
> .detailBox {
> .detail {
min-height: 10rem;
2024-03-21 10:49:21 +08:00
}
}
}
> .titleBox {
padding: 1.2rem;
display: flex;
font-size: 1.8rem;
cursor: pointer;
justify-content: space-between;
align-items: center;
font-weight: 500;
i {
display: flex;
font-size: 1.8rem;
}
> .left {
display: flex;
align-items: center;
> i {
margin-right: 1rem;
}
> span {
line-height: 2.4rem;
// color: #52525b;
transition: all 0.3s;
color: #000000bf;
}
}
> .right {
> i {
transition: all 0.3s;
}
}
&:hover {
> .left {
> span {
color: #000;
}
}
}
}
> .detailBox {
overflow: auto;
scrollbar-width: none;
flex: 0;
> .detail {
position: relative;
height: 100%;
padding: 0 0.5rem;
> img {
width: 100%;
}
.timeType {
font-size: 1.6rem;
color: #52525b;
font-weight: 400;
margin-top: 1.2rem;
margin-bottom: 0.8rem;
}
.detailItem {
cursor: pointer;
padding: 0.8rem;
// padding: 1.2rem 1.1rem 1.2rem 2.2rem;
font-size: 1.8rem;
// font-size: 1.4rem;
font-weight: 400;
margin-bottom: 0.4rem;
border-radius: 0.8rem;
display: flex;
align-items: center;
flex-wrap: wrap;
// flex-wrap: nowrap;
2024-03-21 10:49:21 +08:00
&.history {
padding: 1.2rem 1.1rem 1.2rem 2.2rem;
margin-bottom: 1rem;
> .text {
flex-basis: 100%;
}
}
> .time {
font-size: 1.2rem;
opacity: 0.5;
}
> i {
2024-03-21 10:49:21 +08:00
font-size: 1.8rem;
margin-right: 1rem;
display: flex;
}
> .text {
flex: 1;
overflow: hidden;
> span {
//只在一行显示
width: 100%;
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
&.active {
2025-11-03 16:52:43 +08:00
// background: #F9FAFA;
background-color: #ffffff;
}
&:hover {
2025-11-03 16:52:43 +08:00
// background: #F9FAFA;
background-color: #ffffff;
}
&.history {
2025-11-03 16:52:43 +08:00
background: #f9fafa;
// background-color: #ffffff;
&:hover {
background: #fdfdfd;
// background-color: #ffffff;
}
&.active {
background: #fdfdfd;
// background-color: #ffffff;
}
> .text {
> span {
width: 100%;
font-weight: 600;
line-height: 2rem;
font-size: 1.8rem;
display: inline-block;
}
> textarea {
resize: none;
border: none;
background: rgba(0, 0, 0, 0);
font-weight: 600;
line-height: 2rem;
height: 4rem;
width: 100%;
font-size: 1.8rem;
}
}
2024-03-21 10:49:21 +08:00
> .type {
border: 1px solid #0000000d;
padding: 0.4rem 0.8rem;
border-radius: 0.8rem;
color: #71717a;
font-size: 1.4rem;
max-width: 70%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
min-width: 40%;
text-align: center;
}
> .btn {
border: 1px solid #0000000d;
border-radius: 0.8rem;
margin-left: auto;
position: relative;
> i {
width: 3rem;
height: 3rem;
display: flex;
align-items: center;
justify-content: center;
}
> .fi-br-check {
border-radius: 50%;
background: #38c793;
color: #fff;
width: 2rem;
height: 2rem;
}
> .operation {
position: absolute;
right: 0;
top: 3rem;
background: #e4e4e7;
border: 1px solid #d4d4d8;
border-radius: 1rem;
z-index: 7;
padding: 0.8rem;
box-shadow: 0 0 3.2rem -0.8rem #1a1b1e33;
position: absolute;
height: min-content;
&.active {
top: auto;
bottom: 3rem;
}
&.activeLeft {
bottom: 0;
}
> .item {
padding: 0.8rem;
color: #52525b;
display: flex;
border-radius: 0.8rem;
cursor: pointer;
align-items: center;
> i {
font-size: 1.6rem;
display: flex;
}
> span {
margin-left: 0.5rem;
white-space: nowrap;
}
&:hover {
background: #efeff1;
}
}
}
2024-03-21 10:49:21 +08:00
}
}
}
.detailItem:last-child {
margin-bottom: 0;
}
> .material_content_list_loding {
text-align: center;
height: 50px;
.page_loading {
display: block;
width: 50px;
height: 50px;
margin: 0 auto;
}
img {
height: calc(10rem * 1.2);
}
2024-03-21 10:49:21 +08:00
}
}
2024-03-21 10:49:21 +08:00
}
&.active {
padding: 1.2rem 0;
overflow: hidden;
max-height: 100%;
background: #00000008;
&.isHistory {
background: #fff;
border-radius: 0.8rem;
max-height: 5rem;
}
> .titleBox {
padding: 0;
margin-bottom: 1.6rem;
padding: 0 1.2rem;
> .right {
> i {
transform: rotate(180deg);
}
}
}
2024-03-21 10:49:21 +08:00
}
&.language {
> .titleBox {
padding: 0.8rem;
background: #00000000;
height: 5rem;
> .left {
> i {
margin-right: 2rem;
}
}
}
> .detailBox {
> .detail {
.detailItem {
padding: 0.8rem;
> svg {
margin-right: 2.5rem;
width: 2rem;
height: 2rem;
}
> span {
color: #111a18;
opacity: 0.5;
margin-left: 4.5rem;
font-weight: 600;
}
&.active {
> span {
color: #52525b;
opacity: 1;
margin-left: 0px;
}
}
}
}
}
2024-03-21 10:49:21 +08:00
}
}
> .title {
display: flex;
padding: 0.4rem;
align-items: center;
justify-content: space-between;
> span {
font-size: 2rem;
font-weight: 600;
2024-03-21 10:49:21 +08:00
}
> img {
width: 2.7rem;
cursor: pointer;
}
> svg {
cursor: pointer;
}
}
> .navList {
height: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
margin-top: 2.8rem;
}
> .segmentation {
height: 2px;
background: #0000000d;
margin-top: 2rem;
width: 100%;
}
> .navListBottom {
display: flex;
flex-direction: column;
}
2024-03-21 10:49:21 +08:00
> .gallery_btn {
margin-top: 2rem;
}
}
}
.newObj {
border-radius: 2rem;
2025-11-03 10:04:49 +08:00
border: 2px solid rgba(0, 0, 0, 0.1);
background: #fff;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
margin-top: 4.2rem;
width: 25.1rem;
// height: 6.8rem;
padding: calc(2rem - 2px) 0;
2025-11-03 10:04:49 +08:00
&.active {
border-color: rgba(0, 0, 0, 0.5);
}
&:hover {
border-color: rgba(0, 0, 0, 0.5);
}
> svg {
margin-right: 1.3rem;
width: 1.6rem;
height: 1.6rem;
}
> p {
font-size: 2rem;
font-weight: 500;
margin: 0;
}
}
> .rightBox {
flex: 1;
overflow: hidden;
> .right {
display: flex;
width: 100%;
height: 100%;
flex-direction: column;
position: relative;
> .user {
margin-bottom: 1rem;
display: flex;
justify-content: flex-end;
padding: 3.2rem 2.1rem 1.2rem;
align-items: center;
> .left {
display: flex;
align-items: center;
margin-right: auto;
> .newObj {
background: #fff;
padding: 1.2rem 2.5rem;
margin: 0;
width: 17.7rem;
border-radius: 3rem;
p {
font-size: 1.6rem;
font-weight: 600;
}
}
> svg {
margin-right: 2rem;
2024-03-21 10:49:21 +08:00
cursor: pointer;
}
2024-03-21 10:49:21 +08:00
}
> .homeMain_right_content {
top: 0;
left: 0;
display: flex;
align-items: center;
margin-right: 1.2rem;
.homeMain_icon {
font-size: 3.6rem;
position: relative;
top: 0.3rem;
}
2024-03-21 10:49:21 +08:00
.username {
font-size: 1.6rem;
color: #1a1a1a;
margin: 0 0.8rem;
font-weight: 900;
span {
margin: 0.7rem;
}
}
.credits {
font-size: 1.6rem;
color: #1a1a1a;
font-weight: 500;
cursor: auto;
2024-03-21 10:49:21 +08:00
display: flex;
line-height: calc(5rem - 4px);
height: 5rem;
border-radius: 3.4rem;
justify-content: center;
width: auto;
// width: calc(25.3rem - 4px);
padding: 0 1.2rem;
border: 1.72px solid #000;
span {
// width: 5rem;
max-width: 10rem;
display: inline-block;
overflow: hidden;
display: flex;
margin-right: 1.2rem;
.credits_item {
transition: 0.3s all;
// height: 4rem;
height: 100%;
// height: 3.2rem;
div {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
}
}
i {
height: 100%;
border-left: 1.72px solid;
padding-left: 1.3rem;
margin-left: 1.5rem;
font-size: 2.2rem;
cursor: pointer;
display: flex;
align-items: center;
}
.fi-rr-shop {
font-size: 2.4rem;
}
.fi-br-refresh {
margin-left: 0;
border-left: none;
padding-left: 0;
&.active {
transition: all 0.3s;
transform: rotate(360deg);
}
}
}
}
> .trialApproval {
display: flex;
align-items: center;
> .message_iconItem {
position: relative;
cursor: pointer;
margin: 0;
margin-right: 1.4rem;
i {
width: 2.4rem;
height: 2.4rem;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.homeMain_user {
height: 5.6rem;
width: 5.6rem;
// margin-left: auto;
display: flex;
position: relative;
align-items: center;
position: relative;
.homeMain_user_icon {
height: 5.6rem;
width: 5.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: cover;
}
// transition: all .3s;
}
.homeMain_user_detail {
z-index: 1050;
position: absolute;
top: calc(100% + 0.5rem);
background: #fff;
width: 34rem;
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;
2024-03-21 10:49:21 +08:00
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: 0.8rem;
line-height: 4rem;
color: #4d4d4d;
display: flex;
align-items: center;
cursor: pointer;
user-select: none;
width: 100%;
flex-wrap: wrap;
&:hover {
background: #f3f3f6;
}
.fi {
font-size: 1.8rem;
}
2024-03-21 10:49:21 +08:00
.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 0.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: #000;
span {
color: #000;
}
}
div {
font-size: 1.6rem;
font-weight: 600;
}
span {
font-size: 1.4rem;
color: #949eae;
}
2024-03-21 10:49:21 +08:00
}
}
2024-03-21 10:49:21 +08:00
}
}
> .routerView {
position: relative;
overflow: hidden;
flex: 1;
display: flex;
> .router {
flex: 1;
overflow: hidden;
padding: 0 6rem;
padding-bottom: 2rem;
}
> .userSystem {
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.4);
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-weight: 600;
font-size: 4rem;
z-index: 100;
}
}
2024-03-21 10:49:21 +08:00
}
}
}
.select_block {
z-index: 1050;
position: absolute;
right: 0rem;
top: 4rem;
width: 13.5rem;
background: #ffffff;
box-shadow: 0px 0.4rem 0.4rem 0px rgba(0, 0, 0, 0.1);
overflow: hidden;
border: 1px solid #000000;
height: auto;
padding: 2rem;
border-radius: 2rem;
.homeMain_select {
width: 100%;
.select_item {
height: 4.1rem;
color: #4d4d4d;
display: flex;
align-items: center;
cursor: pointer;
user-select: none;
width: 100%;
&:hover {
background: #f7f7f7;
}
.select_item_des {
font-size: 1.6rem;
margin-left: 1rem;
font-weight: 500;
}
}
}
}
.modal_component {
.skip_content {
width: 6rem;
height: 3rem;
line-height: 2.8rem;
border: 0.1rem solid #000;
font-size: 1.4rem;
color: #000;
position: absolute;
top: 1.8rem;
right: 1.8rem;
cursor: pointer;
}
.bind_email_content {
padding: 4.8rem 9.2rem 6rem;
.bind_email_tip {
font-size: 1.8rem;
color: #a5b0c2;
line-height: 1.9rem;
text-align: center;
}
.bind_email {
margin-top: 2rem;
font-size: 2.2rem;
font-weight: 400;
color: #030303;
text-align: center;
}
.bind_email_form_content {
.bind_email_form_title {
font-size: 2.2rem;
font-weight: bold;
color: #030303;
line-height: 2.4rem;
}
.bind_email_form_input {
width: 100%;
height: 4.6rem;
margin-top: 1rem;
border: 0.1rem solid #b4bed7;
padding-left: 2.1rem;
line-height: 4.6rem;
font-size: 1.8rem;
box-sizing: border-box;
&::placeholder {
color: #a5b0c2;
}
}
}
.bind_email_submit_button {
height: 4.6rem;
line-height: 4.6rem;
background: #000;
font-size: 1.6rem;
font-weight: 500;
color: #ffffff;
width: 12.8rem;
text-align: center;
cursor: pointer;
margin: 3rem auto 0;
}
.icon--shangyibu {
font-size: 2.5rem;
font-weight: bold;
color: #030303;
}
.email_last_step_content {
margin-left: 1rem;
font-size: 2.2rem;
font-weight: bold;
color: #030303;
}
.tip_content {
font-size: 1.3rem;
font-weight: bold;
color: #000;
cursor: pointer;
}
.email_last_step_des {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 2.5rem;
margin-bottom: 1.5rem;
.sent_email_content {
font-size: 1.8rem;
font-weight: bold;
color: #a5b0c2;
}
}
}
}
.current-projct {
2025-10-30 11:49:29 +08:00
font-size: 2rem;
cursor: pointer;
2025-10-30 11:49:29 +08:00
border: 2px solid rgba(0, 0, 0, 0.1);
border-radius: 2rem;
2025-10-30 11:49:29 +08:00
display: flex;
align-items: center;
justify-content: center;
width: 25.1rem;
padding: calc(2rem - 2px) 0;
margin-top: 2rem;
&.filled {
background-color: #fff;
}
.current-project-icon {
margin-right: 1.3rem;
}
&.disabled {
2025-10-30 11:49:29 +08:00
color: #9a9a9a;
2025-11-03 16:52:43 +08:00
border: none;
2025-10-30 11:49:29 +08:00
background: #f5f5f5;
cursor: not-allowed;
}
&.active {
cursor: not-allowed;
2025-11-03 10:04:49 +08:00
border-color: rgba(0, 0, 0, 0.5);
}
2025-10-30 11:49:29 +08:00
&.filled:hover {
border-color: rgba(0, 0, 0, 0.5);
}
2024-03-21 10:49:21 +08:00
}
2025-10-30 11:49:29 +08:00
.divider {
width: 100%;
height: 1px;
margin-top: 3rem;
background-color: rgba(0, 0, 0, 0.1);
}
2024-03-21 10:49:21 +08:00
</style>