chat聊天功能

This commit is contained in:
X1627315083
2025-05-20 16:47:27 +08:00
parent 8bc0a52ab8
commit c235d0de4a
50 changed files with 4902 additions and 2861 deletions

View File

@@ -6,13 +6,13 @@
<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">
<div class="newObj marginT2" @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>
<p>New Chat</p>
<p>New Project</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="titleBox" @click="setOpenType(item.value,item.list)">
<div class="left">
<i :class="['fi',item.icon]"></i>
<span>{{item.label}}</span>
@@ -22,21 +22,54 @@
</div>
</div>
<div class="detailBox">
<div class="detail" v-show="openType == item.value">
<div class="detail" v-if="item.value != 'history'" 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 class="text">
<span>{{ childItem.label }}</span>
</div>
</div>
</div>
<div class="detail" v-else>
<div class="detailItem history" v-for="childItem,index in item.list" @click="setHistory(item,childItem)" :class="{active:openTypeChild == childItem.id}">
<div class="text" style="width: 100%;">
<span :title="childItem.name" v-show="!childItem.editName">{{ childItem.name }}</span>
<textarea v-model="historyTextarea" v-show="childItem.editName"></textarea>
</div>
<div class="type">{{ childItem.process }}</div>
<div class="btn">
<i class="fi fi-br-menu-dots-vertical" v-show="!childItem.editName" @click.stop="editHistory(childItem,index,$event)"></i>
<i class="fi fi-br-check" v-show="childItem.editName" @click.stop="accomplishHistory(childItem,index,$event)"></i>
<div class="operation" v-show="selectHistoryIndex == index">
<div class="item" @click.stop="editName(childItem)">
<i class="fi fi-rr-edit"></i>
<span>Rename</span>
</div>
<div class="item" @click.stop="deleteItem(childItem)">
<i class="icon iconfont icon-shanchu operate_icon"></i>
<span>Delete</span>
</div>
</div>
</div>
</div>
<div v-show="!isNoData" class="material_content_list_loding">
<span class="page_loading" v-show="!isShowLoading"></span>
<span v-show="isShowLoading">
<a-spin size="large" />
</span>
</div>
<img v-show="isNoData && isNull" src="@/assets/images/homePage/null_img.png">
</div>
</div>
</div>
</div>
<div class="navListBottom">
<!-- <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>
<i class="fi fi-br-globe"></i>
<span>Language</span>
</div>
<div class="right">
<i class="fi fi-br-angle-small-down"></i>
@@ -45,7 +78,6 @@
<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">
@@ -55,6 +87,20 @@
</div>
</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-for="numItem in 10">{{ numItem-1 }}</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 v-if="userDetail.systemUser == 0 || userDetail.systemUser == 3" @click="openUpgradeToPro" class="gallery_btn gallery_btn_radius" style="width: 100%;">Upgrade to Pro</div>
</div>
@@ -62,6 +108,22 @@
<div class="rightBox">
<div class="right">
<div class="user">
<div class="trialApproval">
<div class="message_iconItem">
<a-badge :count="messageNum">
<i class="fi fi-rr-envelope" @click="openMessage"></i>
</a-badge>
</div>
<div class="message_iconItem">
<a-badge :count="messageType?.newPosted">
<!-- <i class="fi fi-rr-envelope" @click="openMessage"></i> -->
<i class="fi fi-rr-bell" @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_user">
<div class="homeMain_user_icon" @click="openAccount">
<img :src="userDetail.avatar" alt="">
@@ -130,55 +192,19 @@
</div>
</div>
</div>
<div class="router">
<router-view v-if="!getLangIsShowMark" @setTask="setTask" :getLangIsShowMark="getLangIsShowMark">
</router-view>
<div class="userSystem" v-if="userDetail.systemList.indexOf(1) == -1">
You can use these features only after becoming a regular user~
</div>
<div class="router" v-else-if="!getLangIsShowMark">
<home ref="home" @setTask="setTask" ></home>
</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 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="UpgradePlan" title="Purchase" class="fi fi-rr-shop"></i>
</div>
</div>
<!-- <navRouter :routerList="navRouterList"></navRouter> -->
<div class="homeMain_right">
<div class="trialApproval credits message">
<div class="message_iconItem">
<a-badge :count="messageNum">
<i class="fi fi-rr-envelope" @click="openMessage"></i>
</a-badge>
</div>
<div class="message_iconItem">
<a-badge :count="messageType?.newPosted">
<!-- <i class="fi fi-rr-envelope" @click="openMessage"></i> -->
<i class="fi fi-rr-bell" @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>
<!-- <Habit></Habit> -->
</div>
<payOrder ref="payOrder"></payOrder>
<UpgradePlan ref="UpgradePlan"></UpgradePlan>
<TaskPage ref="TaskPage"></TaskPage>
</header>
<payOrder ref="payOrder"></payOrder>
<UpgradePlan ref="UpgradePlan"></UpgradePlan>
<TaskPage ref="TaskPage"></TaskPage>
<div class="mark_loading" v-show="getLangIsShowMark">
<a-spin size="large" />
</div>
@@ -186,8 +212,6 @@
<scaleVideo ref="scaleVideo"></scaleVideo>
<!-- 进行续订 -->
<renew ref="renew"></renew>
<!-- 绑定邮箱 -->
<bindEmail ref="bindEmail"></bindEmail>
</div>
</template>
<script >
@@ -206,8 +230,6 @@ import { ExclamationCircleOutlined } 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 navRouter from "@/component/modules/navRouter.vue";
import bindEmail from "@/component/HomePage/bindEmail.vue";
import { useStore } from "vuex";
import { setLang } from "@/tool/guide";
import showViewVideo from "@/tool/mount";
@@ -218,6 +240,7 @@ import MyWs from "@/tool/webSocket";
import MyEvent from "@/tool/myEvents";
import { useRouter,useRoute } from 'vue-router'
import {openTypeList} from "@/tool/listData.js";
import home from "@/component/home/index.vue";
export default defineComponent({
components: {
VerificationCodeInput,
@@ -229,8 +252,7 @@ export default defineComponent({
UpgradePlan,
payOrder,
TaskPage,
navRouter,
bindEmail,
home,
},
setup(){
const store = useStore();
@@ -243,17 +265,31 @@ export default defineComponent({
openTypeChild:'',
isLanguage:false,
openTypeList:openTypeList(t),
})
const historyData = reactive({
isNoData:false,
isShowLoading:false,
isNull:false,
searchCollectionName:'',
historyTextarea:'',
historyList:[],
selectHistoryIndex:-1,
page:1,
size:10,
})
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]]
if(query.id){
homeMainData.openType = 'history'
homeMainData.openTypeChild = query.id
}else{
homeMainData.openType = Object.keys(query)[0]
homeMainData.openTypeChild = query[Object.keys(query)[0]]
}
}else{
homeMainData.openType = ''
homeMainData.openTypeChild = ''
@@ -272,7 +308,6 @@ export default defineComponent({
let activeCredits = ref(false)
let getLangIsShowMark = ref(true)
let navRouterList = ref([])
let messageNum = computed(()=>{
return store.state.UserHabit.messageSystem.messageNum
})
@@ -314,13 +349,6 @@ export default defineComponent({
store.commit('setMessageSystem',data)
}
MyEvent.add('getMessage',getWsMessage)
// setTimeout(() => {
// MyWs.sendMessage('aaaa')
// }, 3000);
// MyWs.ws.onmessage = (data)=>{
// console.log(JSON.parse(data.data),232);
// }
let openNewPosted = ()=>{
stateList.isNewPosted = !stateList.isNewPosted
newPosted.value.init()
@@ -350,58 +378,182 @@ export default defineComponent({
const openUpgradeToPro = ()=>{
renew.value.init()
}
onMounted(()=>{
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()
navRouterList.value = [
{
routerName:['homePage'],
router:'/home/homePage',
name:t('Header.HOME')
},{
routerName:['library'],
router:'/home/library',
name:t('Header.LIBRARY')
},{
routerName:['history'],
router:'/home/history',
name:t('Header.HISTORY')
},{
routerName:['works'],
router:'/home/works',
name:t('Header.WORKS')
},{
routerName:['events','eventsDetail'],
router:'/home/events',
name:t('Header.EVENTS')
},
]
nextTick(()=>{
setPorfolioDom()
})
})
const setOpenType = (type)=>{
const setOpenType = (type,list)=>{
if(homeMainData.openType == type){
homeMainData.openType = ''
}else {
homeMainData.openType = type
if(type == 'history'){
if(list.length == 0){
}
}
}
}
let setPorfolioDom = ()=>{
historyData.isShowLoading = false
historyData.isNoData = false
let imgParent = document.querySelector('.homeMain_max .detailBox .material_content_list_loding .page_loading')
new IntersectionObserver(
(entries, observer) => {
// 如果不是相交,则直接返回
if (!entries[0].intersectionRatio) return;
getHistory()
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?history=${childItem.id}`)
// router.push(`/home?history=${childItem.id}`)
}
const getHistory = ()=>{
if(historyData.isShowLoading && !historyData.isNoData)return
historyData.isShowLoading = true
let data = {
classificationIdList:[],
page:historyData.page,
size:historyData.size,
collectionName:historyData.searchCollectionName,
// 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){
historyData.isNull = true
}else{
historyData.isNull = false
}
if (rv.content.length > 0) {
historyData.isNull = false
homeMainData.openTypeList.history.list.push(...rv.content)
} else {
historyData.isNoData = true
}
historyData.isShowLoading = false
}
).catch(res=>{
historyData.isShowMark = false
if(data.page == 1){
historyData.isNull = true
}
historyData.isNoData = true
});
}
const editHistory = (item,index,el)=>{
if(historyData.selectHistoryIndex == -1){
let top = el.target.parentNode.parentNode.getBoundingClientRect().top
let parentTop = el.target.parentNode.parentNode.parentNode.offsetTop
let parentHeight = el.target.parentNode.parentNode.parentNode.offsetHeight
let operation = el.target.parentNode.querySelector('.operation')
historyData.selectHistoryIndex = index
//判断弹窗是加载按钮上面还是下面
if((parentTop+parentHeight)/2 < top){//加在按钮上面
operation.classList.add('active')
}else{
operation.classList.remove('active')
}
}else{
historyData.selectHistoryIndex = -1
}
let operationCli = ()=>{
historyData.selectHistoryIndex = -1
document.removeEventListener("click", operationCli);
}
document.addEventListener("click",operationCli,);
}
const editName = (item)=>{
historyData.selectHistoryIndex = -1
homeMainData.openTypeList.history.list.forEach((item)=>{
item.editName = false
})
item.editName = true
historyData.historyTextarea = item.name
}
const deleteItem = ()=>{
}
const accomplishHistory = (item)=>{
let data = {
libraryIds:[],
libraryName:historyData.historyTextarea,//library名字
userGroupName:historyData.historyTextarea,//history名字
userGroupId :item.id,//history id
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
}
Https.axiosPost(Https.httpUrls.saveOrUpdate, data).then(
(rv) => {
item.name = historyData.historyTextarea
item.editName = false
historyData.historyTextarea = ''
}
).catch((res)=>{
});
}
const newProject = ()=>{
router.push('/home')
}
return {
store,
userDetail,
t,
...toRefs(homeMainData),
...toRefs(historyData),
locale,
isMurmur,
credits,
activeCredits,
getLangIsShowMark,
navRouterList,
messageNum,
messageType,
...toRefs(stateList),
@@ -413,6 +565,12 @@ export default defineComponent({
openUpgradeToPro,
setOpenType,
setRouter,
setHistory,
editHistory,
editName,
deleteItem,
accomplishHistory,
newProject,
}
},
data() {
@@ -440,10 +598,6 @@ export default defineComponent({
};
},
directives:{
moveOpenDetal:{
mounted (el,binding) {
},
}
},
async mounted() {
await new Promise((resolve, reject) => {
@@ -473,9 +627,7 @@ export default defineComponent({
let tl1 = gsap.timeline({ paused: true });
let heradeRight = document.querySelector('.homeMain_max .homeMain_right_content')
let userDetailMax = document.querySelector('.homeMain_max .homeMain_user')
let userDetailIcon = document.querySelector('.homeMain_max .homeMain_user_icon')
let userDetail = document.querySelector('.homeMain_max .homeMain_user_detail')
// let anmiation = TweenMax.to(userDetailMax,1, {'margin-top':'30px',opacity:1})
// anmiation.stop()
@@ -495,7 +647,7 @@ export default defineComponent({
tl1.play()
}, 500);
})
heradeRight.addEventListener('mouseleave',(event)=>{
userDetailMax.addEventListener('mouseleave',(event)=>{
if(overTime){
clearTimeout(overTime)
}
@@ -574,7 +726,6 @@ export default defineComponent({
let data = {
userId: this.userDetail.userId,
};
// console.log(getCookie("token"));
if(this.userDetail.systemUser == 3){
await Https.axiosGet(Https.httpUrls.trialUserLogout,).then((rv) => {
Https.axiosPost(Https.httpUrls.accountLogout, data).then((rv) => {
@@ -764,7 +915,11 @@ export default defineComponent({
scrollbar-width: none;
flex: 1;
> .detail{
position: relative;
height: 100%;
> img{
width: 100%;
}
> .detailItem{
cursor: pointer;
padding: 1.2rem 1.1rem 1.2rem 2.2rem;
@@ -774,20 +929,139 @@ export default defineComponent({
border-radius: .8rem;
display: flex;
align-items: center;
flex-wrap: wrap;
> i{
margin-right: .8rem;
display: flex;
}
> .text{
> span{
//只在一行显示
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
&.active{
background: #f5f5f5;
}
&:hover{
background: #f5f5f5;
}
&.history{
background: #f5f5f5;
&:hover{
background: #fdfdfd;
}
&.active{
background: #fdfdfd;
}
> .text{
> span{
width: 100%;
font-weight: 600;
line-height: 2rem;
margin-bottom: .8rem;
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;
}
}
> .type{
border: 1px solid #0000000d;
padding: .4rem .8rem;
border-radius: .8rem;
color: #71717a;
font-size: 1.4rem;
max-width: 70%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
> .btn{
border: 1px solid #0000000d;
border-radius: .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: .8rem;
box-shadow: 0 0 3.2rem -.8rem #1a1b1e33;
position: absolute;
&.active{
top: auto;
bottom: 3rem;
}
> .item{
padding: .8rem;
color: #52525b;
display: flex;
border-radius: .8rem;
cursor: pointer;
align-items: center;
> i{
font-size: 1.6rem;
display: flex;
}
> span{
margin-left: .5rem;
}
&:hover{
background: #efeff1;
}
}
}
}
}
}
> .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);
}
}
}
}
&.active{
@@ -884,6 +1158,81 @@ export default defineComponent({
display: flex;
flex-direction: column;
}
> .homeMain_right_content {
top: 0;
left: 0;
display: flex;
align-items: center;
width: 100%;
.homeMain_icon {
font-size: 3.6rem;
position: relative;
top: 0.3rem;
}
.username {
font-size: 1.6rem;
color: #1a1a1a;
margin: 0 0.8rem;
font-weight: 900;
span{
margin: .7rem;
}
}
.credits{
font-size: 1.6rem;
color: #1a1a1a;
font-weight: 900;
width: auto;
padding: 0 1.6rem;
cursor: auto;
display: flex;
line-height: 6rem;
height: 6rem;
box-sizing: content-box;
border-radius: 4rem;
span{
width: 5rem;
display: inline-block;
overflow: hidden;
display: flex;
margin-right: .9rem;
.credits_item{
transition: .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: .1rem solid ;
padding-left: 1.3rem;
margin-left: 1.5rem;
font-size: 1.6rem;
cursor: pointer;
display: flex;
align-items: center;
}
.fi-br-refresh{
margin-left: 0;
border-left: none;
padding-left: 0;
&.active{
transition: all .3s;
transform: rotate(360deg);
}
}
}
}
> .gallery_btn{
margin-top: 1.2rem;
}
@@ -898,12 +1247,33 @@ export default defineComponent({
width: 100%;
height: 100%;
flex-direction: column;
position: relative;
> .user{
margin-bottom: 1rem;
display: flex;
justify-content: flex-end;
padding: 2rem 2rem 0 0;
> .trialApproval{
display: flex;
margin-right: 1rem;
align-items: center;
> .message_iconItem{
position: relative;
cursor: pointer;
i{
width: 3rem;
height: 3rem;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.homeMain_user{
height: 6rem;
width: 6rem;
margin-left: auto;
// margin-left: auto;
position: relative;
.homeMain_user_icon{
height: 6rem;
@@ -1064,170 +1434,39 @@ export default defineComponent({
flex: 1;
overflow: hidden;
padding: 0 6rem;
padding-bottom: 2rem;
}
}
}
}
.homeMain_heade {
flex-shrink: 0;
display: flex;
// padding: 0 30px;
padding: 2rem 6rem;
width: 100%;
height: auto;
background: rgba(255, 255, 255, 0.2);
border-bottom: 1px solid #e1e1e1;
position: relative;
align-items: center;
z-index: 9;
background-color: #fff;
padding-right: 1rem;
.homeMain_right{
// width: 33%;
width: auto;
display: flex;
justify-content: flex-end;
align-items: center;
margin-left: auto;
.message{
display: flex;
width: 6rem;
justify-content: space-between;
margin: 0 2rem;
// padding: 1rem;
i{
margin-left: 0rem;
border-left: none;
padding-left: 0rem;
height: auto;
font-size: 2rem;
width: 3rem;
cursor: pointer;
}
span{
overflow: initial;
align-items: center;
width: auto;
margin: auto;
height: auto;
}
.message_iconItem{
position: relative;
display: flex;
.message_iconItem_value{
padding: 1rem;
left: 50%;
transform: translateX(-96%);
top: 4rem;
}
}
}
}
.homeMain_logo {
width: 14.4rem;
height: 3.2rem;
margin: 2.1rem 2.8rem 0 ;
// position: absolute;
line-height: 2rem;
margin-top: 0;
}
.homeMain_right_content {
// position: absolute;
top: 0;
// right: 3.2rem;
left: 0;
display: flex;
// width: 36%;
margin-right: 7rem;
width: auto;
height: 100%;
align-items: center;
.homeMain_icon {
font-size: 3.6rem;
position: relative;
top: 0.3rem;
}
.username {
font-size: 1.8rem;
color: #1a1a1a;
margin: 0 0.8rem;
font-weight: 900;
span{
margin: .7rem;
}
}
.credits{
font-size: 1.8rem;
color: #1a1a1a;
font-weight: 900;
width: auto;
padding: 0 1.6rem;
cursor: auto;
display: flex;
line-height: 6rem;
height: 6rem;
box-sizing: content-box;
border-radius: 4rem;
span{
width: 5rem;
display: inline-block;
overflow: hidden;
display: flex;
margin-right: .9rem;
.credits_item{
transition: .3s all;
// height: 4rem;
height: 100%;
// height: 3.2rem;
div{
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
}
}
i{
> .userSystem{
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 100%;
display: inline-block;
border-left: .1rem solid ;
padding-left: 1.3rem;
margin-left: 1.5rem;
font-size: 1.8rem;
cursor: pointer;
}
.fi-br-refresh{
margin-left: 0;
border-left: none;
padding-left: 0;
&.active{
transition: all .3s;
transform: rotate(360deg);
}
background: rgba(0, 0, 0, 0.4);
z-index:2;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-weight: 600;
font-size: 4rem;
}
}
.trialApproval{
margin-left: 2rem;
}
}
}
}
.select_block {
z-index: 1050;
position: absolute;
left: 15.5rem;
top: 6rem;
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;
// &.select_list{
// top: 56%;
// left: 100%;

View File

@@ -0,0 +1,43 @@
<template>
<div class="toolsPage">
<tools></tools>
</div>
</template>
<script lang="ts">
import { defineComponent,computed,ref,provide,nextTick,createVNode,toRefs, reactive} from 'vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { Https } from "@/tool/https";
import { useStore } from "vuex";
import { useI18n } from 'vue-i18n'
import tools from '@/component/toolsPage/index.vue'
export default defineComponent({
components:{
tools,
},
props:{
},
emits:[],
setup(props,{emit}) {
const store = useStore();
const data = reactive({
})
const dataDom = reactive({
})
return{
...toRefs(dataDom),
...toRefs(data),
}
},
provide() {
return {
}
},
})
</script>
<style lang="less" scoped>
.toolsPage{
width: 100%;
height: 100%;
position: relative;
}
</style>

View File

@@ -9,7 +9,7 @@
<div v-show="!isScroll" class="modal_title_text_assistant gallery_btn white" :class="{active:'all' == worksSelect}" @click="setWorksSelect({value:'all'})">All</div>
<div v-show="!isScroll" class="modal_title_text_assistant gallery_btn white" :class="{active:'NewYear_2025' == worksSelect}" @click="setWorksSelect({value:'NewYear_2025'})">NewYear_2025</div>
</div> -->
<div class="page_content" >
<div class="page_content" ref="autoscrollDom">
<Falls ref="fall" @loadend="isShowMark = false" @setPortfolioLike="setPortfolioLike" :isScroll="isScroll" @getImgScale="getImgScale"></Falls>
<div class="page_loading_box" v-show="!isNoData">
<span class="page_loading" v-show="!isShowMark"></span>
@@ -28,7 +28,7 @@
</template>
<script lang="ts">
import { LoadingOutlined } from "@ant-design/icons-vue";
import { defineComponent,h ,toRefs,ref,reactive,onMounted,nextTick,watch,computed} from 'vue'
import { defineComponent,h ,toRefs,ref,reactive,onMounted,nextTick,watch,onBeforeUnmount} from 'vue'
// import RobotAssist from "@/component/HomePage/RobotAssist.vue";
import { Https } from "@/tool/https";
import newScaleImage from "@/component/WorksPage/newScaleImage.vue";
@@ -45,6 +45,10 @@ export default defineComponent({
generalMenu,
},
props:{
autoscroll:{
type:Boolean,
default:false,
},
isScroll:{
type:Boolean,
default:true,
@@ -101,6 +105,8 @@ export default defineComponent({
},
isShowMark:false,
isNoData:false,//如果数据为空就不加载
autoscrollDom:null as any,
autoscrollTime:null as any,
})
let menuList:any = ref([
{
@@ -228,7 +234,6 @@ export default defineComponent({
new IntersectionObserver(
(entries, observer) => {
// 如果不是相交,则直接返回
// console.log(entries[0]);
if (!entries[0].intersectionRatio) return;
filter.getListDate.page += 1
getPorfolio()
@@ -251,6 +256,50 @@ export default defineComponent({
nextTick(()=>{
setPorfolioDom()
})
//对元素设置自动滚动每次滚动10px
if (prop.autoscroll) {
let isAdd = true
filter.autoscrollTime = setInterval(() => {
// console.log(filter.autoscrollDom.scrollHeight,filter.autoscrollDom.scrollTop+ filter.autoscrollDom.clientHeight)
if(filter.autoscrollDom.scrollHeight > filter.autoscrollDom.scrollTop+ filter.autoscrollDom.clientHeight-3 && filter.autoscrollDom.scrollHeight < filter.autoscrollDom.scrollTop+ filter.autoscrollDom.clientHeight+3){
isAdd = false
}
if(filter.autoscrollDom.scrollTop < 3){
isAdd = true
}
if(isAdd){
filter.autoscrollDom.scrollTop += 2;
}else{
filter.autoscrollDom.scrollTop -= 2;
}
}, 10);
}
// const start = filter.autoscrollDom.scrollTop;
// const maxScroll = filter.autoscrollDom.scrollHeight - filter.autoscrollDom.clientHeight;
// const duration = 3000; // 完整滚动时长ms
// let startTime:any = null;
// function animate(currentTime:any) {
// if (!startTime) startTime = currentTime;
// const elapsed = currentTime - startTime;
// const progress = Math.min(elapsed / duration, 1); // 0~1
// // 缓动函数easeInOutQuad
// const easeProgress = progress < 0.5
// ? 2 * progress * progress
// : 1 - Math.pow(-2 * progress + 2, 2) / 2;
// filter.autoscrollDom.scrollTop = start + (maxScroll - start) * easeProgress;
// if (progress < 1) {
// filter.autoscrollTime = requestAnimationFrame(animate);
// }
// }
// filter.autoscrollTime = requestAnimationFrame(animate);
let data = {
id:router.currentRoute.value.query?.workId
}
@@ -258,6 +307,9 @@ export default defineComponent({
getImgScale(data)
}
})
onBeforeUnmount(() => {
clearInterval(filter.autoscrollTime); // 清除定时器
})
return {
...toRefs(filter),
menuList,
@@ -298,6 +350,7 @@ export default defineComponent({
padding: 0;
border-radius: 0;
.page_content{
scrollbar-width: none;
border-radius: 0;
}
}

View File

@@ -110,6 +110,24 @@
></template>
</a-select>
</div>
<div class="generalModel_state_item smail" v-if="selectCode == 'Models'">
<a-select
ref="select"
v-model:value="ageGroup"
:options="ageGroupList"
@change="getLibraryList"
style="width:20rem"
size="large"
:fieldNames="{ label: 'name', value: 'value' }"
>
<template #suffixIcon
><span
class="icon iconfont icon-xiala"
style="color: #343579"
></span
></template>
</a-select>
</div>
</div>
</div>
</div>
@@ -231,7 +249,7 @@
</div>
</div>
<!-- 蒙层 start-->
<div class="mark_loading" v-show="isShowMark || getLangIsShowMark">
<div class="mark_loading" v-show="isShowMark">
<a-spin size="large" />
</div>
<!-- 蒙层 end-->
@@ -463,7 +481,8 @@
</div>
</div>
</div>
</div>
</div>{{ ageGroup }}
<mannequinEdit ref="ModelPlacement" :ageGroup="ageGroup" :isPop="true" @submit="getLibraryList"></mannequinEdit>
</div>
</div>
@@ -471,8 +490,7 @@
</div>
<searchLabel ref="searchLabel"></searchLabel>
<scaleImage ref="scaleImage" :isCanvas="selectCode == 'Sketchboard'" :sex="workspace.sex"></scaleImage>
<ModelPlacement ref="ModelPlacement" @submitModelPlacement="getLibraryList"></ModelPlacement>
<ModelPlacementMobile ref="ModelPlacementMobile" @submitModelPlacement="getLibraryList"></ModelPlacementMobile>
<!-- <ModelPlacement ref="ModelPlacement" @submitModelPlacement="getLibraryList"></ModelPlacement> -->
<setLabel ref="setLabel"></setLabel>
<createSlogan ref="createSlogan" @setSloganData="setSloganData"></createSlogan>
<UpgradePlan ref="UpgradePlan"></UpgradePlan>
@@ -485,10 +503,8 @@
<script lang="ts">
import { LoadingOutlined } from "@ant-design/icons-vue";
import { defineComponent,h ,ref,createVNode,nextTick,watch,provide,computed,reactive,toRefs} from 'vue'
import ModelPlacement from '@/component/LibraryPage/ModelPlacement.vue';
// import ModelPlacement from '@/component/LibraryPage/ModelPlacementUpdata.vue';
import setLabel from '@/component/LibraryPage/setLabel.vue';
import ModelPlacementMobile from '@/component/LibraryPage/ModelPlacementMobile.vue';
import brandDetail from '@/component/LibraryPage/brandDetail.vue';
import createBrand from '@/component/LibraryPage/createBrand.vue';
import searchLabel from '@/component/LibraryPage/searchLabel.vue';
@@ -508,11 +524,10 @@ import { remove } from "jszip";
import createSlogan from "@/component/HomePage/createSlogan.vue";
import generalMenu from "@/component/HomePage/generalMenu.vue";
import UpgradePlan from "@/component/HomePage/UpgradePlan.vue";
import mannequinEdit from "@/component/HomePage/index/model/mannequin/edit.vue";
export default defineComponent({
components: {
ModelPlacement,
setLabel,
ModelPlacementMobile,
brandDetail,
createBrand,
searchLabel,
@@ -523,12 +538,9 @@ export default defineComponent({
createSlogan,
generalMenu,
UpgradePlan,
mannequinEdit,
},
props:{
getLangIsShowMark:{
type:Boolean,
default:true,
}
},
setup(props) {
@@ -548,7 +560,7 @@ export default defineComponent({
]
})
let selectImgList:any = ref([])
let selectCode:any = ref('Moodboard')
let selectCode:any = ref('')
let searchPictureName = ref('')
let searchPictureSeed:any = ref(0);
let designType:any = ref({
@@ -574,6 +586,8 @@ export default defineComponent({
const pageData = reactive({
isBrandDetail:false,
brandDNAList:[] as any,
ageGroup:'',
ageGroupList:computed(()=>store.state.UserHabit.ageGroup),
})
let designTypeList:any = ref({
Sketchboard:positionType,
@@ -733,6 +747,7 @@ export default defineComponent({
level1Type:selectCode.value,
level2Type:design,
page:1,
ageGroup:pageData.ageGroup,
modelSex:sex.value?sex.value:'',
pictureName:searchPictureName.value,
size:pageSize.value,
@@ -797,17 +812,6 @@ export default defineComponent({
dataDom.createBrand.openAddBrand()
}
watch(
() => props.getLangIsShowMark, // 这里使用了一个 getter 函数
(newValue, oldValue) => {
if(!newValue){
getLibraryList('')
getClass()
getSex()
}
},
{immediate: true,}
)
return {
...toRefs(dataDom),
...toRefs(pageData),
@@ -906,9 +910,9 @@ export default defineComponent({
handler(query, oldQuery) {
if(oldQuery && query?.library == oldQuery?.library)return
let str = query.library
if(!this.ageGroup)this.ageGroup = this.ageGroupList[0].value
if(!str)str = 'Moodboard'
nextTick(()=>{
console.log()
this.selectMenuItem({code:str})
// setWorksSelect(str)
})
@@ -922,6 +926,8 @@ export default defineComponent({
this.isTest =JSON.parse(isTest)
this.uploadUrl = getUploadUrl()
this.token = getCookie("token") || "";
this.getClass()
this.getSex()
},
methods:{
@@ -963,13 +969,13 @@ export default defineComponent({
}
},
selectMenuItem(menu:any){
if(menu.code != this.upload.level1Type){
this.selectCode = menu.code
this.currentPage = 1
this.total = 0
if(menu.code == 'MyBrand'){
this.getBrandDNAList()
this.upload.level1Type = menu.code
return
}
this.searchPictureName = ''
@@ -1390,14 +1396,15 @@ export default defineComponent({
url:data.url,
name:name,
}
this.placementClick(newData)
this.placementClick(data)
},
//给模特打点编辑
placementClick(data:any){
// let placementModal:any = isMoible() ? this.$refs.ModelPlacementMobile : this.$refs.ModelPlacement
let placementModal:any = this.$refs.ModelPlacement
placementModal.showPlacementModal(data,this.sex)
placementModal.mannEditMask = false
placementModal.showPlacementModal(data,this.sex,'Library')
},
setTextareaShow(){
this.isTextarea = !this.isTextarea
@@ -1958,6 +1965,7 @@ export default defineComponent({
width: 100%;
// width: calc(100% - 23.5rem);
height: 100%;
position: relative;
.header_operate_item{
margin-right: 5rem;
color: #C2C2C2;

View File

@@ -1,7 +1,8 @@
<template>
<div class="loginPage">
<div class="left">
<Works :isScroll="!isMask" :position="'login'"></Works>
<!-- :isScroll="!isMask" -->
<Works :autoscroll="true" :position="'login'"></Works>
<div class="mask" v-show="isMask" @click="()=>isMask = !isMask">
<div class="content">
<div class="userNum">