部分优化

This commit is contained in:
X1627315083
2025-09-08 14:50:59 +08:00
parent 4dc5e26d92
commit 360bfd01ac
51 changed files with 854 additions and 354 deletions

4
.env
View File

@@ -1,4 +1,4 @@
# VITE_USER_NODE_ENV = 'production'
VITE_USER_NODE_ENV = 'development'
VITE_USER_NODE_ENV = 'production'
# VITE_USER_NODE_ENV = 'development'
VITE_APP_BASE_URL = 'http://18.167.251.121:10086'
VITE_APP_BASE_URL = 'https://www.api.aida.com.hk'

View File

@@ -4,4 +4,5 @@ VITE_USER_NODE_ENV = 'production'
# VITE_APP_BASE_URL = 'https://api.aida.com.hk'
VITE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
VITE_APP_BASE_URL = 'http://localhost:22170'

BIN
dist.7z

Binary file not shown.

View File

@@ -44,6 +44,11 @@ select {
border-radius: 4px;
/* 设置圆角半径 */
}
select > option {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
select:focus-visible {
border: 0.2rem solid #c4c4c4 !important;
}
@@ -270,6 +275,20 @@ li {
color: #fff;
background-color: #000;
}
.gallery_btn.forbidden {
opacity: 0.7;
}
.gallery_btn.forbidden:hover {
background-color: #000;
color: #fff;
}
.gallery_btn.forbiddenWhite {
opacity: 0.7;
}
.gallery_btn.forbiddenWhite:hover {
background-color: #fff;
color: #000;
}
.gallery_btn.active {
background-color: #fff;
color: #000;
@@ -2297,6 +2316,7 @@ textarea:focus {
border-radius: 4px;
height: 20rem;
top: 0rem;
flex: 1;
border: 1px solid #dcdfe6;
}
.generage_btn_box {

View File

@@ -42,6 +42,11 @@ select{
height: 2.5rem;
border: 0.2rem solid #c4c4c4 !important;
border-radius: 4px; /* 设置圆角半径 */
> option {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
}
select:focus-visible{
border: 0.2rem solid #c4c4c4 !important;
@@ -247,6 +252,7 @@ input:focus{
border-radius: 1.6rem;
padding: 0 1.7rem;
}
&.btnSamil{
padding: 0rem 2rem;
line-height: 4rem;
@@ -271,6 +277,20 @@ input:focus{
background-color: #000;
}
}
&.forbidden{
opacity: .7;
}
&.forbidden:hover{
background-color: #000;
color: #fff;
}
&.forbiddenWhite{
opacity: .7;
}
&.forbiddenWhite:hover{
background-color: #fff;
color: #000;
}
&.active{
background-color: #fff;
color: #000;
@@ -2179,6 +2199,7 @@ textarea:focus{
border-radius: 4px;
height: 20rem;
top: 0rem;
flex: 1;
border: 1px solid #dcdfe6;
}

View File

@@ -73,9 +73,9 @@ export default defineComponent({
accountFollofFans.getListData.isShowMark = false
if(rv.length == 0) {
accountFollofFans.getListData.isNoData = true
return
}else{
accountFollofFans.dataList.push(...rv)
}
accountFollofFans.dataList = rv
}
}).catch(() => {
accountFollofFans.getListData.isShowMark = false
@@ -96,13 +96,13 @@ export default defineComponent({
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
// const routeUrl = router.resolve({
// path:'/home/otherUsers',
// query:{
// userId:item.senderId
// }
// })
// window.open(routeUrl.href,'_blank')
}
onMounted (()=>{
accountFollofFans.getListData.isNoData = false

View File

@@ -69,6 +69,7 @@ export default defineComponent({
})
let loadingDom:any = ref(null)
let searchFollowFansList = ()=>{
accountFollofFans.dataList = []
accountFollofFans.getListData.page = 1
getFollowFansList()
}
@@ -80,9 +81,9 @@ export default defineComponent({
accountFollofFans.getListData.isShowMark = false
if(rv.length == 0) {
accountFollofFans.getListData.isNoData = true
return
}else{
accountFollofFans.dataList.push(...rv)
}
accountFollofFans.dataList = rv
}
}).catch(() => {
accountFollofFans.getListData.isShowMark = false
@@ -104,13 +105,13 @@ export default defineComponent({
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
// const routeUrl = router.resolve({
// path:'/home/otherUsers',
// query:{
// userId:item.senderId
// }
// })
// window.open(routeUrl.href,'_blank')
}
onMounted (()=>{
accountFollofFans.getListData.isNoData = false

View File

@@ -27,10 +27,10 @@
<div v-show="!userDetail.accountExtendList?.Google" id="g_id_bind"></div>
<div v-if="userDetail.accountExtendList?.Google" class="gallery_btn" @click="ungroupGoogleModel">{{ $t('frontPage.Unbind') }}</div>
</div> -->
<div class="gmail_btn">
<div v-if="!userDetail.accountExtendList?.Google" class="gallery_btn">{{ $t('frontPage.BindNow') }}</div>
<div v-show="!userDetail.accountExtendList?.Google" id="g_id_bind"></div>
<div v-if="userDetail.accountExtendList?.Google" class="gallery_btn" @click="ungroupGoogleModel">{{ $t('frontPage.Unbind') }}</div>
<div class="gmail_btn" @click="toGmailLogin">
<div v-if="!userDetail.accountExtendList?.Google" class="gallery_btn forbidden">{{ $t('frontPage.BindNow') }}</div>
<!-- <div v-show="!userDetail.accountExtendList?.Google" id="g_id_bind"></div> -->
<div v-if="userDetail.accountExtendList?.Google" class="gallery_btn forbidden" @click="ungroupGoogleModel">{{ $t('frontPage.Unbind') }}</div>
<!-- <div v-if="userDetail.accountExtendList?.Google" class="gallery_btn" @click="ungroupGoogleModel">{{ $t('frontPage.Unbind') }}</div> -->
</div>
</div>
@@ -138,7 +138,11 @@ export default defineComponent({
bindPageDom.bindEmail.init('Modify')
}
const toGmailLogin = ()=>{
message.info(t('account.canNotUtilize'))
}
onMounted(async ()=>{
return
let GOOGLE_CLIENT_ID = '29310152396-nnsd3h533fld665oguu8ovrt1nukmt46.apps.googleusercontent.com'
var existingScript = document.querySelector(`script[src="${data.scriptSrc}"]`);
if(!window.isAddGmail){
@@ -202,6 +206,7 @@ export default defineComponent({
ungroupGoogleModel,
ungroupWeiXinModel,
modifyEmail,
toGmailLogin,
}
},
data(){

View File

@@ -71,9 +71,9 @@ export default defineComponent({
accountMessage.isShowMark = false
if(rv.content.length == 0) {
accountMessage.isNoData = true
return
}else{
accountMessage.dataList.push(...rv.content)
}
accountMessage.dataList = rv.content
}).catch(() => {
accountMessage.isShowMark = false
accountMessage.isNoData = true
@@ -95,13 +95,13 @@ export default defineComponent({
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
// const routeUrl = router.resolve({
// path:'/home/otherUsers',
// query:{
// userId:item.senderId
// }
// })
// window.open(routeUrl.href,'_blank')
}
let openOtherWork = (item:any)=>{
const routeUrl = router.resolve({

View File

@@ -69,9 +69,9 @@ export default defineComponent({
accountMessage.isShowMark = false
if(rv.content.length == 0) {
accountMessage.isNoData = true
return
}else{
accountMessage.dataList.push(...rv.content)
}
accountMessage.dataList = rv.content
}).catch(() => {
accountMessage.isShowMark = false
accountMessage.isNoData = true
@@ -93,13 +93,13 @@ export default defineComponent({
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
// const routeUrl = router.resolve({
// path:'/home/otherUsers',
// query:{
// userId:item.senderId
// }
// })
// window.open(routeUrl.href,'_blank')
}
onMounted (()=>{

View File

@@ -68,9 +68,9 @@ export default defineComponent({
accountMessage.isShowMark = false
if(rv.content.length == 0) {
accountMessage.isNoData = true
return
}else{
accountMessage.dataList.push(...rv.content)
}
accountMessage.dataList = rv.content
}).catch(() => {
accountMessage.isShowMark = false
accountMessage.isNoData = true
@@ -104,13 +104,13 @@ export default defineComponent({
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
// const routeUrl = router.resolve({
// path:'/home/otherUsers',
// query:{
// userId:item.senderId
// }
// })
// window.open(routeUrl.href,'_blank')
}
onMounted (()=>{
accountMessage.isNoData = false

View File

@@ -56,14 +56,15 @@ export default defineComponent({
}
prop.getHistory(data).then((rv:any)=>{
accountMessage.isShowMark = false
if(rv.content.length == 0) {
accountMessage.isNoData = true
return
}else{
rv.content.forEach((item:any) => {
item.content = JSON.parse(item.content)
});
accountMessage.dataList.push(...rv.content)
}
rv.content.forEach((item:any) => {
item.content = JSON.parse(item.content)
});
accountMessage.dataList = rv.content
}).catch(() => {
accountMessage.isShowMark = false
accountMessage.isNoData = true

View File

@@ -45,51 +45,51 @@
</div>
</div>
<div class="modal_title_text">
<div>{{ title.label }} User</div>
<div>{{ title.label }} {{ $t('admin.User') }}</div>
</div>
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>{{ $t('adminSeAllUser.UserName') }}: <span>*</span></span>
<span>{{ $t('admin.UserName') }}: <span>*</span></span>
<input
v-model="userName"
placeholder="Please enter user name"
:placeholder="$t('admin.enterUserName')"
type="text"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>{{ $t('adminSeAllUser.UserEmail') }}: <span>*</span></span>
<span>{{ $t('admin.UserEmail') }}: <span>*</span></span>
<input
v-model="userEmail"
placeholder="Please enter email"
:placeholder="$t('admin.enterEmail')"
type="text"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>{{ $t('adminSeAllUser.Password') }}: <span>*</span></span>
<span>{{ $t('admin.Password') }}: <span>*</span></span>
<input
@focus="focus"
@blur="blur"
v-model="password"
placeholder="Please enter password"
:placeholder="$t('admin.enterPassword')"
type="password"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>{{ $t('adminSeAllUser.MaximumCredits') }}:</span>
<span>{{ $t('admin.MaximumCredits') }}:</span>
<input
v-model="credits"
placeholder="Please enter credits"
:placeholder="$t('admin.enterCredits')"
type="text"
style="width: 250px"
/>
</div>
</div>
<div class="allUserPoeration_btn admin_page">
<div class="admin_search_item" @click="cancelDsign">{{ $t('adminSeAllUser.Close') }}</div>
<div class="admin_search_item" @click="setOk">{{ $t('adminSeAllUser.OK') }}</div>
<div class="admin_search_item" @click="cancelDsign">{{ $t('admin.Close') }}</div>
<div class="admin_search_item" @click="setOk">{{ $t('admin.OK') }}</div>
</div>
</a-modal>
<div class="mark_loading" v-show="loadingShow">
@@ -212,7 +212,7 @@ export default defineComponent({
if (operations.title?.value == "Add") {
data = setAddData();
if (!isEmail(data.userEmail)) {
message.info(t('adminSeAllUser.jsContent1'));
message.info(t('admin.jsContent1'));
return;
}
if (
@@ -220,7 +220,7 @@ export default defineComponent({
!data.userEmail ||
!data.userPassword
)
return message.warning(t('adminSeAllUser.jsContent2'));
return message.warning(t('admin.jsContent2'));
Https.axiosPost(Https.httpUrls.addOrUpdateSubAccount, data).then(
(rv) => {
if (rv) {

View File

@@ -3,7 +3,7 @@
<div class="admin_table_search">
<div class="admin_state">
<div class="admin_state_item">
<span>{{ $t('adminSeAllUser.CreateTime') }}:</span>
<span>{{ $t('admin.CreateTime') }}:</span>
<a-range-picker
style="width: 230px"
class="range_picker"
@@ -45,14 +45,14 @@
/>
</div> -->
<div class="admin_state_item">
<span>{{ $t('adminSeAllUser.UserName') }}:</span>
<span>{{ $t('admin.UserName') }}:</span>
<a-select
v-model:value="ids"
mode="multiple"
style="width: 230px"
:field-names="{ label: 'label', value: 'label' }"
:filter-option="filterOption"
placeholder="Select Item..."
:placeholder="$t('admin.selectUserName')"
max-tag-count="responsive"
:options="allUserList"
@keydown.enter="gettrialList"
@@ -74,22 +74,22 @@
</div>
<div class="admin_search">
<div class="admin_search_item" @click="searchHistoryList">
{{ $t('adminSeAllUser.search') }}
{{ $t('admin.search') }}
</div>
<div class="admin_search_item" @click="addhHistoryList">
{{ $t('adminSeAllUser.add') }}
{{ $t('admin.add') }}
</div>
<div class="admin_search_item" style="width: auto;padding: 0 2rem;" @click="downloadTemplate">
{{ $t('adminSeAllUser.DownloadTemplate') }}
{{ $t('admin.DownloadTemplate') }}
</div>
<div class="admin_search_item" style="width: auto;padding: 0 2rem;" @click="uploadTemplate">
{{ $t('adminSeAllUser.UploadTemplate') }}
{{ $t('admin.UploadTemplate') }}
</div>
<div class="admin_search_item" style="width: auto;padding: 0 2rem;" @click="ExportAccountData">
{{ $t('adminSeAllUser.ExportAccountData') }}
{{ $t('admin.ExportAccountData') }}
</div>
<div class="admin_search_item" style="width: auto;padding: 0 2rem;" @click="deleteList">
{{ $t('adminSeAllUser.Delete') }}
{{ $t('admin.Delete') }}
</div>
</div>
<div class="admin_state_list">
@@ -97,19 +97,19 @@
class="admin_state_list_item"
@click="lastGeTrialList('year')"
>
{{ $t('adminSeAllUser.NearlyAYear') }}
{{ $t('admin.NearlyAYear') }}
</div>
<div
class="admin_state_list_item"
@click="lastGeTrialList('month')"
>
{{ $t('adminSeAllUser.LastMonth') }}
{{ $t('admin.LastMonth') }}
</div>
<div
class="admin_state_list_item"
@click="lastGeTrialList('week')"
>
{{ $t('adminSeAllUser.LastWeek') }}
{{ $t('admin.LastWeek') }}
</div>
</div>
</div>
@@ -140,13 +140,13 @@
@click="setAagree(record)"
style="margin-right: 2rem;"
>
{{ $t('adminSeAllUser.Edit') }}
{{ $t('admin.Edit') }}
</div>
<div
class="operate_item"
@click="deleteAagree(record)"
>
{{ $t('adminSeAllUser.Delete') }}
{{ $t('admin.Delete') }}
</div>
<!-- <div
class="operate_item"
@@ -222,7 +222,7 @@ export default defineComponent({
const columns: any = computed(() => {
return [
{
title: t("adminSeAllUser.UserId"),
title: t("admin.UserId"),
align: "center",
dataIndex: "id",
key: "id",
@@ -231,7 +231,7 @@ export default defineComponent({
sorter: true,
},
{
title: t("adminSeAllUser.Email"),
title: t("admin.Email"),
align: "center",
dataIndex: "userEmail",
key: "userEmail",
@@ -239,7 +239,7 @@ export default defineComponent({
ellipsis:true
},
{
title: t("adminSeAllUser.UserName"),
title: t("admin.UserName"),
align: "center",
dataIndex: "userName",
key: "userName",
@@ -254,15 +254,18 @@ export default defineComponent({
// },
},
{
title: t("adminSeAllUser.language"),
title: t("admin.language"),
align: "center",
dataIndex: "language",
key: "language",
width:100,
ellipsis:true,
customRender: (record: any) => {
return t(`admin.${record.text}`);
},
},
{
title: t("adminSeAllUser.CreateDate"),
title: t("admin.CreateDate"),
align: "center",
dataIndex: "createDate",
key: "createDate",
@@ -270,7 +273,7 @@ export default defineComponent({
sorter: true,
},
{
title: t("adminSeAllUser.Credits"),
title: t("admin.Credits"),
align: "center",
// width: 150,
// minWidth: 100,
@@ -282,7 +285,7 @@ export default defineComponent({
sorter: true,
},
{
title: t("adminSeAllUser.CreditsUsage"),
title: t("admin.CreditsUsage"),
align: "center",
dataIndex: "creditsUsage",
key: "creditsUsage",
@@ -290,7 +293,7 @@ export default defineComponent({
sorter: true,
},
{
title: t("adminSeAllUser.CreditsUsageLimit"),
title: t("admin.CreditsUsageLimit"),
align: "center",
dataIndex: "creditsUsageLimit",
key: "creditsUsageLimit",
@@ -298,7 +301,7 @@ export default defineComponent({
sorter: true,
},
{
title: t("adminSeAllUser.Operations"),
title: t("admin.Operations"),
key: "operation",
width:120,
align: "center",
@@ -414,11 +417,11 @@ export default defineComponent({
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
let addhHistoryList = () => {
allUserPoerationsVue.value.init({value:'Add',label:t('adminSeAllUser.add')},'')
allUserPoerationsVue.value.init({value:'Add',label:t('admin.add')},'')
};
let allUserPoerationsVue = ref()
let setAagree = (data:any) =>{
allUserPoerationsVue.value.init({value:'Edit',label:t('adminSeAllUser.Edit')},data)
allUserPoerationsVue.value.init({value:'Edit',label:t('admin.Edit')},data)
}
const downloadTemplate = ()=>{
Https.axiosGet(Https.httpUrls.subAccountImportExcelDownload,{responseType: 'blob',env:{binary:true}}).then((rv:any)=>{
@@ -451,7 +454,6 @@ export default defineComponent({
fileInput.onchange = (event:any) => {
const file = event.target.files[0]; // 获取选择的文件
if (file) {
console.log('Selected file:', file);
let param = new FormData();
param.append('file',file);
let config:any = {headers:{'Content-Type':'multipart/form-data','Accept':'*/*' }}
@@ -467,7 +469,7 @@ export default defineComponent({
const confirmDelete = ()=>{
return new Promise<void>((resolve, reject) => {
Modal.confirm({
title: 'Are you sure you want to delete this item?',
title: t('admin.jsDelete'),
icon: createVNode(ExclamationCircleOutlined),
okText: 'Yes',
cancelText: 'No',

View File

@@ -4,7 +4,7 @@
<div class="admin_state">
<div class="admin_state_item">
<span>{{ $t('adminSeDesignDetail.StartDate') }}:</span>
<span>{{ $t('admin.StartDate') }}:</span>
<a-range-picker
style="width:250px"
class="range_picker"
@@ -23,27 +23,27 @@
</a-range-picker>
</div>
<div class="admin_state_item">
<span>{{ $t('adminSeDesignDetail.StartTime') }}:</span>
<a-time-range-picker style="width:250px" class="range_picker" valueFormat="HH:mm:ss" v-model:value="rangeTimeValue" />
<span>{{ $t('admin.StartTime') }}:</span>
<a-time-range-picker style="width:250px" :placeholder="[$t('admin.startTime'), $t('admin.endTime'),]" class="range_picker" valueFormat="HH:mm:ss" v-model:value="rangeTimeValue" />
</div>
<div class="admin_state_item">
<span>{{ $t('adminSeDesignDetail.Email') }}:</span>
<span>{{ $t('admin.Email') }}:</span>
<input
v-model="email"
placeholder="Please enter email"
:placeholder="$t('admin.enterEmail')"
@keydown.enter="gettrialList"
type="text"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>{{ $t('adminSeDesignDetail.UserName') }}:</span>
<span>{{ $t('admin.UserName') }}:</span>
<a-select
v-model:value="ids"
mode="multiple"
style="width: 250px"
:filter-option="filterOption"
placeholder="Select Item..."
:placeholder="$t('admin.selectUserName')"
max-tag-count="responsive"
:options="allUserList"
@keydown.enter="gettrialList"
@@ -51,7 +51,7 @@
</div>
</div>
<div class="admin_search">
<div class="admin_search_item" @click="searchHistoryList">Search</div>
<div class="admin_search_item" @click="searchHistoryList">{{ $t('adminSeAllUser.search') }}</div>
</div>
</div>
@@ -92,7 +92,7 @@ export default defineComponent({
const columns: any = computed(() => {
return [
{
title: t('adminSeDesignDetail.Email'),
title: t('admin.Email'),
align: "center",
dataIndex: "userEmail",
key: "userEmail",
@@ -100,7 +100,7 @@ export default defineComponent({
fixed: "left",
},
{
title: t('adminSeDesignDetail.UserId'),
title: t('admin.UserId'),
align: "center",
ellipsis: true,
dataIndex: "accountId",
@@ -108,7 +108,7 @@ export default defineComponent({
width:100,
},
{
title: t('adminSeDesignDetail.UserName'),
title: t('admin.UserName'),
align: "center",
ellipsis: 200,
dataIndex: "userName",
@@ -123,7 +123,7 @@ export default defineComponent({
// },
},
{
title: t('adminSeDesignDetail.Frequency'),
title: t('admin.Frequency'),
align: "center",
ellipsis: true,
dataIndex: "designTimes",
@@ -131,7 +131,7 @@ export default defineComponent({
width:100,
},
{
title: t('adminSeDesignDetail.CreateTime'),
title: t('admin.CreateTime'),
align: "center",
ellipsis: true,
// width: 150,
@@ -143,7 +143,7 @@ export default defineComponent({
width:200,
},
{
title: t('adminSeDesignDetail.Credits'),
title: t('admin.Credits'),
align: "center",
ellipsis: true,
// width: 150,

View File

@@ -0,0 +1,232 @@
<template>
<div class="recentActiveChart admin_page">
<div class="admin_table_search">
<div class="admin_state">
<div class="admin_state_item">
<span>{{ $t('admin.StartTime') }}:</span>
<a-range-picker
style="width:280px"
class="range_picker"
v-model:value="rangePickerValue"
:allowClear="false"
:placeholder="[
$t('HistoryPage.StartDate'),
$t('HistoryPage.EndDate'),
]"
valueFormat="YYYY-MM-DD"
>
<template #suffixIcon>
<span
class="icon iconfont range_picker_icon icon-rili"
></span>
</template>
</a-range-picker>
</div>
<div class="admin_state_item">
<span>{{ $t('admin.UserName') }}:</span>
<a-select
v-model:value="userIdList"
mode="multiple"
style="width: 280px"
:filter-option="filterOption"
:placeholder="$t('admin.selectUserName')"
max-tag-count="responsive"
:options="dataList"
></a-select>
</div>
</div>
<div class="admin_search">
<div class="admin_search_item" @click="searchHistoryList">Search</div>
</div>
<div class="admin_state_list">
<div
class="admin_state_list_item"
@click="lastGeTrialList('year')"
>
{{ $t('admin.NearlyAYear') }}
</div>
<div
class="admin_state_list_item"
@click="lastGeTrialList('month')"
>
{{ $t('admin.LastMonth') }}
</div>
<div
class="admin_state_list_item"
@click="lastGeTrialList('week')"
>
{{ $t('admin.LastWeek') }}
</div>
</div>
</div>
<div class="admin_table_content" ref="pageChartDom">
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounted } from "vue";
import { Https } from "@/tool/https";
import { formatTime } from "@/tool/util";
import * as echarts from 'echarts/core';
import { TooltipComponent, LegendComponent } from 'echarts/components';
import { PieChart } from 'echarts/charts';
import { LabelLayout } from 'echarts/features';
import { useStore } from "vuex";
import { CanvasRenderer } from 'echarts/renderers';
export default defineComponent({
components: {
},
setup() {
const store:any = useStore()
let filter:any = reactive({
dataList:computed(()=>{
return store.state.adminPage.allUserList
}),
})
let filterData:any = reactive({
rangePickerValue:[],
userIdList:[]
})
//查询列表
let searchHistoryList = ()=> {
gettrialList();
}
//获取列表
let gettrialList = async () =>{
filter.tableLoading = true
let startDate: any = filterData.rangePickerValue?.[0]
? filterData.rangePickerValue[0]+' '+'00:00:00'
: "";
let endDate: any = filterData.rangePickerValue?.[1]
? filterData.rangePickerValue[1]+' '+'23:59:59'
: "";
let data = {
endTime:endDate,
startTime:startDate,
userIdList:filterData.userIdList.join(','),
}
Https.axiosGet(Https.httpUrls.getActiveUserFunc,{params:data}).then((rv: any) => {
if (rv) {
let data:any = []
rv.names.forEach((item:any,index:number) => {
let obj = {
name : item,
value:rv.values[index],
}
data.push(obj)
});
setEcharts(data)
// this.workspaceItem.position = this.singleTypeList[0].label
}
})
}
let myChart:any
let setEcharts = (data:any) =>{
if (myChart) {
myChart.setOption({
series: [{
data: data
}]
});
}else{
echarts.use([
TooltipComponent,
LegendComponent,
PieChart,
CanvasRenderer,
LabelLayout
]);
var chartDom = pageChartDom.value;
myChart = echarts.init(chartDom);
var option;
option = {
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center'
},
series: [
{
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 10
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: 30,
fontWeight: 'bold'
},
},
labelLine: {
show: false
},
stillShowZeroSum:true,
data: data
}
]
};
option && myChart.setOption(option);
}
}
let lastGeTrialList = (str:string)=>{
let currentDate = new Date();
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
// 计算30天前的时间戳
let thirtyDaysAgoTimestamp
if(str == 'year'){
thirtyDaysAgoTimestamp = currentTimestamp - (360 * 24 * 60 * 60);
}else if(str == 'month'){
thirtyDaysAgoTimestamp = currentTimestamp - (30 * 24 * 60 * 60);
}else if(str == 'week'){
thirtyDaysAgoTimestamp = currentTimestamp - (7 * 24 * 60 * 60);
}
filterData.rangePickerValue = [formatTime(thirtyDaysAgoTimestamp,'YYYY-MM-DD'),formatTime(currentTimestamp,'YYYY-MM-DD')]
gettrialList();
}
let pageChartDom:any = ref()
let filterOption = (input:any, option:any)=>{
// 使用 option.label 进行搜索
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
}
onMounted(()=>{
lastGeTrialList('month')
})
return {
...toRefs(filter),
...toRefs(filterData),
searchHistoryList,
gettrialList,
pageChartDom,
lastGeTrialList,
filterOption,
};
},
data() {
return {
};
},
methods: {
},
});
</script>

View File

@@ -137,14 +137,14 @@ export default defineComponent({
return str;
},
},
// {
// title: 'Frequency',
// align: "center",
// ellipsis: true,
// dataIndex: "designTimes",
// key: "designTimes",
// width:100,
// },
{
title: 'Frequency',
align: "center",
ellipsis: true,
dataIndex: "designTimes",
key: "designTimes",
width:100,
},
{
title: 'Country',
align: "center",
@@ -177,14 +177,14 @@ export default defineComponent({
key: "givenName",
width:100,
},
// {
// title: 'Create Time',
// align: "center",
// ellipsis: true,
// dataIndex: "createTime",
// key: "createTime",
// width:200,
// },
{
title: 'Create Time',
align: "center",
ellipsis: true,
dataIndex: "createTime",
key: "createTime",
width:200,
},
{
title: 'Credits',
align: "center",

View File

@@ -48,7 +48,6 @@ const fillColorRef = ref(null);
commandManager.setChangeCallback((info) => {
canUndo.value = info.canUndo;
canRedo.value = info.canRedo;
emit("undo-redo-status-changed", {
canUndo: canUndo.value,
canRedo: canRedo.value,

View File

@@ -796,12 +796,20 @@ function handleChildLayersReorder(reorderData) {
}
// 处理画布变更事件
const changeCanvas = (command) => {
const changeCanvas = async (command) => {
const commandData = {
isChange: command.canUndo || command.canRedo, // 是否有可撤销或可重做的操作
...command, // 传递完整的命令数据
};
emit("changeCanvas", commandData);
if(command.canUndo || command.canRedo){
setTimeout(async ()=>{
const imageData = await canvasManager.exportImage({
restoreOpacityInRedGreen: true, // 恢复红绿图模式下的透明度
});
emit("trigger-red-green-mouseup", imageData);
},100)
}
};
// 提供外部ref实例方法

View File

@@ -210,8 +210,10 @@ export default defineComponent({
setRevocation()
detailData.loadingShow = false
if(rv.singleOverall == "single"){
store.commit('DesignDetail/setDesignColthes',rv.clothes[0].id)
}
store.commit('DesignDetail/setDesignColthes',rv.clothes[0].id)
}
).catch(rv=>{
@@ -455,6 +457,7 @@ export default defineComponent({
canvasReload,
}
},
provide() {
return {
}

View File

@@ -165,8 +165,12 @@ export default defineComponent({
item.gradient = colorData.selectDetail.color.gradient
}
colorData.selectColor = item
colorData.colorList.index = pushIndex + 1
colorData.colorList.list[newVal][pushIndex + 1] = item
let num = pushIndex
if(colorData.allBoardData.colorBoards.length > 0){
num += 1
}
colorData.colorList.index = num
colorData.colorList.list[newVal][num] = item
}
// for (let index = 0; index < 9; index++) {

View File

@@ -4,7 +4,7 @@
<div class="back" v-show="isEditPattern.value">
<i class="fi fi-br-angle-left" @click="setBack"></i>
</div>
<modelNav @canvasReload="()=>$emit('canvasReload')" @addSketch="()=>$emit('addSketch')" @deleteItem="deleteItem"></modelNav>
<modelNav @canvasReload="()=>$emit('canvasReload')" @addSketch="()=>$emit('addSketch')" @deleteItem="deleteItem" :isEditPattern="isEditPattern.value"></modelNav>
</div>
<div class="modelindex_right">
<div class="detail_btn">

View File

@@ -11,7 +11,7 @@
<img :src="item.path" alt="">
</div>
</div>
<div v-show="singleOveral.value == 'overall'" v-if="(currentDetailType == 'sketch' || currentDetailType == '') && designDetail.clothes.length < 5 " :class="{active:!selectDetail?.id && currentDetailType == 'sketch'}" class="modelNav_item add" @click="addSketch">
<div v-show="singleOveral.value == 'overall'" v-if="(currentDetailType == 'sketch' || currentDetailType == '') && designDetail.clothes.length < 5 && !isEditPattern.value" :class="{active:!selectDetail?.id && currentDetailType == 'sketch'}" class="modelNav_item add" @click="addSketch">
+
</div>
</div>
@@ -31,6 +31,12 @@ export default defineComponent({
position,
},
emits:['canvasReload','addSketch','deleteItem'],
props:{
isEditPattern:{
type:Boolean,
default:false,
},
},
setup(props,{emit}) {
const store = useStore();
const {t} = useI18n()

View File

@@ -18,11 +18,12 @@
</div>
</div>
<div class="designOpenrtion_imgMask" v-if="!frontBack?.body?.path">
<img :src="designDetail.currentFullBodyView || selectDetail.undividedLayer" style="object-fit: cover;" alt="">
<img :src="designDetail?.undividedLayer || selectDetail?.path" style="object-fit: cover;" alt="">
<!-- <img @load="setSelectSketch()" :src="designDetail?.currentFullBodyView || selectDetail?.undividedLayer" style="object-fit: cover;" alt=""> -->
</div>
</div>
<div class="molepositon" :class="{active:imgDesignImg}">
<div class="designOpenrtion_imgMask">
<div class="molepositon imgDesignImg" :class="{active:imgDesignImg}">
<div class="designOpenrtion_imgMask" style="width: 100%;height: 100%;">
<div class="detail_modal_item_front">
<img :src="designDetail.designItemUrl" alt="" style="object-fit: cover;">
</div>
@@ -55,6 +56,7 @@ export default defineComponent({
const detailData = reactive({
frontBack:computed(()=>store.state.DesignDetail.frontBack),
designDetail:computed(()=>store.state.DesignDetail.designDetail),
selectDetail:computed(()=>store.state.DesignDetail.selectDetail),
isEditPattern:inject('isEditPattern') as any,
singleOveral:inject('singleOveral') as any,
detailBody:null as any,
@@ -67,7 +69,7 @@ export default defineComponent({
direction:'',
})
watch(()=>selectItem.selectDetail,(newValue,oldValue)=>{
if(newValue.id == oldValue?.id)return
if(!newValue && newValue?.id == oldValue?.id)return
selectItem.imgDomIndex = detailData.frontBack.front.findIndex((item:any)=>item.id == newValue.id)
},{immediate: true,})
watch(()=>detailData.frontBack?.body?.path,(newVal)=>{
@@ -80,6 +82,9 @@ export default defineComponent({
let dom = document.querySelector('.molepositon .perview_img') as any
if(!detailData.frontBack?.body?.path || !dom)return
img.onload = () => {
if(!detailData.selectDetail?.id){
store.commit('DesignDetail/setDesignColthes',detailData.designDetail.clothes[0].id)
}
// resolve(img)
sacle = dom.parentNode.offsetWidth / img.width
detailData.frontBack.front.forEach((item:any,index:number) => {
@@ -462,14 +467,28 @@ export default defineComponent({
position: relative;
display: none;
&.active{
display: block;
display: flex;
z-index: 2;
align-items: center;
justify-content: center;
}
&.imgDesignImg{
> .designOpenrtion_imgMask{
.detail_modal_item_front{
display: flex;
align-items: center;
justify-content: center;
img{
height: auto;
}
}
}
}
> .designOpenrtion_imgMask{
width: auto;
height: auto;
position: relative;
height: 100%;
// height: 100%;
display: flex;
align-items: center;
justify-content: center;
@@ -491,9 +510,8 @@ export default defineComponent({
width: 100%;
img{
width: 100%;
// height: ;
height: 100%;
// width: 100%;
// height: auto;
float: left;
user-select:none;
-webkit-user-drag: none;

View File

@@ -59,12 +59,12 @@
</div>
</div>
</div>
<div class="img_block_item mannquin" v-show="probjects.type != 'singleProductDesign'">
<div class="img_block_item mannquin" v-show="selectProbject.type != 'singleProductDesign'">
<div class="title">
<div>{{$t('collectionModal.Mannequin')}}</div>
<i class="fi fi-rr-edit" @click="openCollection('mannequin')"></i>
</div>
<div class="mannquin_img_item" v-for="(model) in probjects?.model" :key="model">
<div class="mannquin_img_item" v-for="(model) in selectProbject?.model" :key="model">
<div class="all_img_item_block">
<img class="all_img_content cover_img" :src="model?.url">
</div>
@@ -89,7 +89,6 @@
</div>
</div>
</div>
<div class="img_block_item">
<div class="lager_img_item" v-for="(marketing) in allBoardData.marketingSketchFiles" :key="marketing">
<div class="all_img_item_block">
@@ -107,6 +106,9 @@ import { useStore } from "vuex";
export default defineComponent({
components:{MoodTemplate},
emits:['openCollection'],
props:{
},
setup(props, { emit }) {
const store:any = useStore();
let sketch:any = ref([[],[],[]])
@@ -114,15 +116,18 @@ export default defineComponent({
return store.state.UploadFilesModule.showSketchboard})
let allBoardData:any = computed(()=>{
return store.state.UploadFilesModule.allBoardData})
let probjects:any = computed(()=>{
return store.state.Workspace.probjects})
// let probjects:any = computed(()=>{
// return store.state.Workspace.probjects})
const selectProbject = computed(()=>{
return store.state.Workspace.probjects
})
const openCollection = (str:any)=>{
emit('openCollection',str)
}
return {
store,
allBoardData,
probjects,
selectProbject,
sketch,
sketchList,
openCollection,

View File

@@ -203,7 +203,7 @@ export default defineComponent({
registerModel:computed(()=>{
return store.state.UserHabit.bindEmail.isBindEmail
}),
// registerModel:false,
// registerModel:true,
bindType:computed(()=>{
return store.state.UserHabit.bindEmail.type
}),

View File

@@ -57,9 +57,23 @@
</div>
<div class="clearSlogan_center_btn_item">
<div>{{ $t('createSlogan.FontFamily') }}</div>
<select v-model="fontFamily" :style="{'font-family':fontFamily}">
<option v-for="item in textFontFamilyList" :style="{'font-family':item.value}" :value="item.value">{{item.name}}</option>
</select>
<generalMenu :dataList="textFontFamilyList"
:style="{
'font-weight': '600',
'padding': '0 1rem',
'height': '4rem',
}"
selectWidth="12rem"
selectSize="1.2rem"
:isFontType="true"
@setprintModel="(item)=>{fontFamily = item.value;}" :item="textFontFamilyList.filter((item)=>item.value === fontFamily)[0]"></generalMenu>
<!-- <select v-model="fontFamily" :style="{'font-family':fontFamily}">
<option v-for="item in textFontFamilyList" :value="item.value">
<div :style="{'font-family':item.value}">{{item.name}}</div>
{{item.name}}
</option>
</select> -->
</div>
</div>
<div class="clearSlogan_center_btn clearSlogan_center_item">
@@ -93,11 +107,13 @@ import allOrder from "@/component/Pay/allOrder.vue";
import creditsDetail from "@/component/Pay/creditsDetail.vue";
import { JSSetRemoveImage } from "@/tool/canvasDrawing";
import { useI18n } from "vue-i18n";
import generalMenu from "@/component/HomePage/generalMenu.vue";
export default defineComponent({
components: {
creditsDetail,
allOrder,
generalMenu,
},
emits: ['setSloganData'],
setup(props,{emit}) {

View File

@@ -1,5 +1,5 @@
<template>
<div class="generalMenu_printModel">
<div class="generalMenu_printModel" ref="containerRef">
<div @click.stop="openPrintModel" :class="driverClass.class1" :style="{...$props.style_,'width':selectWidth}">
<a-popover v-if="isCanvas">
<template #content>
@@ -10,46 +10,34 @@
<span v-else>{{ item?.name }}</span>
</a-popover>
<div v-else>
<span v-if="item?.label">{{ item?.label }}</span>
<span v-else>{{ item?.name }}</span>
<span v-if="item?.label" :style="{'font-family': isFontType?item?.value:'',fontSize:selectSize}">{{ item?.label }}</span>
<span v-else :style="{'font-family': isFontType?item?.value:'',fontSize:selectSize}">{{ item?.name }}</span>
</div>
<div class="icon iconfont icon-xiala" :class="{active:openClick}"></div>
</div>
<ul :class="driverClass.class2" v-show="openClick" :style="{'width':selectWidth,...ulStyle}">
<ul
:class="driverClass.class2"
v-show="openClick"
:style="{
'width': selectWidth,
...ulStyle,
...dropdownPositionStyle
}"
ref="dropdownRef"
>
<div>
<li v-for="listItem,index in dataList" :class="{active:deleteItem == index,hover:((item?.label && item?.label == listItem?.label) || (item?.name && item?.name == listItem?.name))}" class="printModel_item" @click="setprintModel(listItem,index)">
<a-popover placement="right" v-if="isCanvas">
<template #content>
<!-- <span v-if="item.img != -1 && index == dataList?.length -1 " class="icon iconfont icon-shanchu" style="cursor: pointer; position: absolute; right: 10px; top: 10px;" @click.stop="deleteFile(item)"></span> -->
<img v-if="listItem.img != -1" style="width: 10rem;height: 10rem;object-fit: contain;" :src="item.img" alt="">
<!-- <div v-else-if="item.img == -1" class="generalMenu_printModel_upload ">
<i class="fi fi-br-upload input_border" style="width: 8rem; height: 8rem;padding: 0;" :title="$t('Generate.uploadTitle')">
<a-upload
style="height: 100%;"
class="search_upImg"
:capture="null"
:action="uploadUrl + '/api/element/upload'"
list-type="picture-card"
:data="{
...upload,
}"
:maxCount='1'
:headers="{ Authorization: token }"
accept=".jpg,.png,.jpeg,.bmp"
@change="(file) => fileUploadChange(file)"
>
</a-upload>
</i>
</div> -->
<span style="text-align: center;">{{ $t('Generate.referenceImage') }}</span>
</template>
<span v-if="listItem?.label">{{ listItem?.label }}</span>
<span v-else>{{ listItem?.name }}</span>
</a-popover>
<div v-else>
<span v-if="listItem?.label">{{ listItem?.label }}</span>
<span v-else>{{ listItem?.name }}</span>
<span v-if="listItem?.label" :style="{'font-family': isFontType?listItem?.value:''}">{{ listItem?.label }}</span>
<span v-else :style="{'font-family': isFontType?listItem?.value:''}">{{ listItem?.name }}</span>
</div>
</li>
</div>
@@ -58,7 +46,7 @@
</template>
<script lang="ts">
import { defineComponent,ref ,nextTick} from "vue";
import { defineComponent, ref, nextTick, onMounted, onUnmounted, computed } from "vue";
import { useStore } from "vuex";
import { Https } from "@/tool/https";
import { openGuide,driverObj__ } from "@/tool/guide";
@@ -81,6 +69,14 @@ import { message, Upload, Modal } from "ant-design-vue";
type:Boolean,
default:false,
},
isFontType:{
type:Boolean,
default:true,
},
selectSize:{
type:String,
default:'1.8rem'
},
deleteItem:{
type:Number,
default:-1
@@ -106,16 +102,81 @@ import { message, Upload, Modal } from "ant-design-vue";
setup(props:any,{emit}){
let selectIndex = ref(0)
let openClick = ref(false)
let containerRef = ref<HTMLElement | null>(null)
let dropdownRef = ref<HTMLElement | null>(null)
let dropdownPositionStyle = ref({})
let store = useStore();
// 计算元素到屏幕底部的距离
const getDistanceToBottom = (element: HTMLElement) => {
const rect = element.getBoundingClientRect()
return window.innerHeight - rect.bottom
}
// 计算元素到屏幕顶部的距离
const getDistanceToTop = (element: HTMLElement) => {
const rect = element.getBoundingClientRect()
return rect.top
}
// 智能计算下拉菜单位置
const calculateDropdownPosition = () => {
if (!containerRef.value || !dropdownRef.value) return {}
const trigger = containerRef.value
const dropdown = dropdownRef.value
const distanceToBottom = getDistanceToBottom(trigger)
const distanceToTop = getDistanceToTop(trigger)
const dropdownHeight = dropdown.offsetHeight || 200 // 默认高度
// 如果下方空间足够,正常向下展开
if (distanceToBottom >= dropdownHeight) {
return {
top: '100%',
bottom: 'auto',
maxHeight: 'none',
transformOrigin: 'top center'
}
}
// 如果下方空间不足但上方空间足够,向上展开
else if (distanceToTop >= dropdownHeight) {
return {
top: 'auto',
bottom: '100%',
maxHeight: 'none',
transformOrigin: 'bottom center'
}
}
// 如果上下空间都不足,向上展开并限制高度
else {
return {
top: 'auto',
bottom: '100%',
maxHeight: `${distanceToTop - 20}px`, // 留出一些边距
overflowY: 'auto',
transformOrigin: 'bottom center'
}
}
}
// 调整下拉菜单位置
const adjustDropdownPosition = () => {
dropdownPositionStyle.value = calculateDropdownPosition()
}
let openPrintModel = ()=>{
document.addEventListener('click',removePrintModel)
document.addEventListener('click', removePrintModel)
window.addEventListener('resize', handleResize)
openClick.value = true
nextTick().then(()=>{
adjustDropdownPosition() // 打开时计算位置
if(props.driver__.driver){
driverObj__.moveNext()
}
})
}
let setprintModel = (item:any,index:any)=>{
if(props.deleteItem == index) return
if(item.img == -1) return
@@ -128,10 +189,37 @@ import { message, Upload, Modal } from "ant-design-vue";
})
emit('setprintModel',item)
}
let removePrintModel = ()=>{
openClick.value = false
document.removeEventListener('click',removePrintModel)
document.removeEventListener('click', removePrintModel)
window.removeEventListener('resize', handleResize)
}
// 窗口 resize 处理
const handleResize = () => {
if (openClick.value) {
adjustDropdownPosition()
}
}
// 滚动处理
const handleScroll = () => {
if (openClick.value) {
adjustDropdownPosition()
}
}
onMounted(() => {
window.addEventListener('scroll', handleScroll, true)
})
onUnmounted(() => {
window.removeEventListener('scroll', handleScroll, true)
document.removeEventListener('click', removePrintModel)
window.removeEventListener('resize', handleResize)
})
let fileUploadChange = (data: any)=>{
let file = data.file;
let bor = true
@@ -148,23 +236,19 @@ import { message, Upload, Modal } from "ant-design-vue";
}else{
bor = false
}
} else if (file.status === "error") {
bor = false
}
if(!bor){
// let res:any = JSON.parse(file.xhr.response);
// props.dataList.forEach((item:any)=>{
// if(item.img == -1){
// }
// })
// message.warning(res.errMsg);
// 错误处理
}
}
let deleteFile = (item:any)=>{
item.img = -1
emit('setprintModel',props.dataList[0])
}
return {
selectIndex,
openClick,
@@ -173,8 +257,10 @@ import { message, Upload, Modal } from "ant-design-vue";
openPrintModel,
fileUploadChange,
deleteFile,
containerRef,
dropdownRef,
dropdownPositionStyle
}
},
data(prop) {
return {
@@ -199,6 +285,7 @@ import { message, Upload, Modal } from "ant-design-vue";
}
});
</script>
<style lang="less">
.ant-popover-inner-content{
display: flex;
@@ -206,11 +293,14 @@ import { message, Upload, Modal } from "ant-design-vue";
align-items: center;
}
</style>
<style lang="less">
//衣服类型下拉菜单
.generalMenu_printModel{
position: relative;
margin-right: 2rem;
height: 5rem;
.icon-xiala{
margin-left: auto;
transition: all .3s;
@@ -218,8 +308,8 @@ import { message, Upload, Modal } from "ant-design-vue";
transform: rotate(180deg);
}
}
>div{
// display: flex;
display: block;
width: 20rem;
border-radius: 1rem;
@@ -235,49 +325,62 @@ import { message, Upload, Modal } from "ant-design-vue";
box-sizing: border-box;
align-items: center;
background: #fff;
> div{
display: flex;
align-items: center;
}
> span{
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
>i{
justify-content: center;
position: relative;
}
}
ul{
position: absolute;
left: 0;
width: 20rem;
margin-top: calc(.3rem*1.2);
z-index: 10;
margin-top: 0.36rem;
z-index: 1000;
overflow: hidden;
border-radius: calc(1rem*1.2);
border-radius: 1.2rem;
background: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
transition: all 0.3s ease;
> div{
overflow-y: auto;
height: 100%;
max-height: 300px;
}
li{
// background: rgba(0,0,0,.2);
background: #fff;
line-height: 2;
cursor: pointer;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding: 0 calc(1rem*1.2);
padding: 0 1.2rem;
transition: all 0.2s ease;
position: relative;
span{
display: block;
width: 100%;
}
&.active{
// opacity: .4;
pointer-events: none;
color: #a4a4a4 !important;
background: #ebebeb !important;
cursor: not-allowed;
}
&.hover{
background: #f3f3f6;
color: #000;
@@ -287,14 +390,13 @@ import { message, Upload, Modal } from "ant-design-vue";
position: absolute;
right: 10px;
top: 10px;
z-index: 2;
}
}
.printModel_item:hover{
// background: rgba(0,0,0,.4);
background: #f3f3f6;
color: #000;
}
}
}
</style>

View File

@@ -89,22 +89,25 @@ export default defineComponent({
newPostedMessage.isShowMark = false
if(rv.content.length == 0) {
newPostedMessage.isNoData = true
return
}else{
rv.content.forEach((item:any) => {
item.content = JSON.parse(item.content)
});
newPostedMessage.dataList.push(...rv.content)
}
newPostedMessage.dataList = rv.content
}).catch(() => {
newPostedMessage.isShowMark = false
newPostedMessage.isNoData = true
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
// const routeUrl = router.resolve({
// path:'/home/otherUsers',
// query:{
// userId:item.senderId
// }
// })
// window.open(routeUrl.href,'_blank')
}
let openOtherWork = (item:any)=>{
const routeUrl = router.resolve({

View File

@@ -1,9 +1,9 @@
<template>
<div class="Container">
<!-- 谷歌登录 -->
<div class="g_id_signin" id="g_id_signin">
</div>
<div class="icon">
<!-- <div class="g_id_signin" id="g_id_signin">
</div> -->
<div class="icon" @click="toGmailLogin" style="opacity: .7;">
<img src="@/assets/images/loginPage/gmailIcon.svg" alt="">
<span>{{ $props.text }}</span>
</div>
@@ -70,6 +70,9 @@
});
}
}
const toGmailLogin = ()=>{
message.info(t('account.canNotUtilize'))
}
onBeforeUnmount(()=>{
var existingScript = document.querySelector(`script[src="${data.scriptSrc}"]`);
if(existingScript){
@@ -78,9 +81,10 @@
}
})
onMounted(()=>{
createGmailLogin()
// createGmailLogin()
})
return {
toGmailLogin,
}
},
})

View File

@@ -102,7 +102,12 @@
<div class="login_form_title marign_top30">
<label :class="{ active: emailStap == 2 }">
<input :state="emailStap" type="checkbox" v-model="checked" />
<span>I agree to the Terms, Privacy Policy, and Fees.</span>
<span>
I agree to the
<a href="https://code-create.com.hk/aida-terms-and-conditions/" style="text-decoration: underline;color: #000;">Terms</a>,
<a href="https://code-create.com.hk/privacy-policy/" style="text-decoration: underline;color: #000;">Privacy Policy</a>,
and Fees.
</span>
</label>
</div>
<!-- <div class="thirdPartyLogin marign_top30">
@@ -489,22 +494,7 @@ export default defineComponent({
isCheckAgreement() {
message.info("Agree to all terms, privacy fees and policies");
},
//微信登录
wechatLogin(value: any) {
let data = {
code: value.code,
type: 2,
};
this.loadingShow = true;
Https.axiosGet(Https.httpUrls.parseWeChatCode, { params: data })
.then((rv: any) => {
this.loadingShow = false;
this.setSuccessLogin(rv);
})
.catch((res) => {
this.loadingShow = false;
});
},
//谷歌登录
googelLogin(value: any) {
let data = { credential: value, type: 2 };
@@ -611,10 +601,6 @@ export default defineComponent({
// },
},
mounted() {
const data = this.$route.query;
if (data?.state == "weiXin") {
this.wechatLogin(data);
}
},
});
</script>

View File

@@ -85,7 +85,12 @@
<div class="login_form_title marign_top40">
<label :class="{ active: emailStap == 2 }">
<input :state="emailStap" type="checkbox" v-model="checked" />
<span>I agree to the Terms, Privacy Policy, and Fees.</span>
<span>
I agree to the
<a href="https://code-create.com.hk/aida-terms-and-conditions/" style="text-decoration: underline;color: #000;">Terms</a>,
<a href="https://code-create.com.hk/privacy-policy/" style="text-decoration: underline;color: #000;">Privacy Policy</a>,
and Fees.
</span>
</label>
</div>
@@ -490,22 +495,6 @@ export default defineComponent({
isCheckAgreement() {
message.info("Agree to all terms, privacy fees and policies");
},
//微信登录
wechatLogin(value: any) {
let data = {
code: value.code,
type: 2,
};
this.loadingShow = true;
Https.axiosGet(Https.httpUrls.parseWeChatCode, { params: data })
.then((rv: any) => {
this.loadingShow = false;
this.setSuccessLogin(rv);
})
.catch((res) => {
this.loadingShow = false;
});
},
//谷歌登录
googelLogin(value: any) {
let data = { credential: value, type: 2 };
@@ -612,10 +601,6 @@ export default defineComponent({
// },
},
mounted() {
const data = this.$route.query;
if (data?.state == "weiXin") {
this.wechatLogin(data);
}
},
});
</script>

View File

@@ -102,7 +102,12 @@
<div class="login_form_title marign_top30">
<label :class="{ active: emailStap == 2 }">
<input :state="emailStap" type="checkbox" v-model="checked" />
<span>I agree to the Terms, Privacy Policy, and Fees.</span>
<span>
I agree to the
<a href="https://code-create.com.hk/aida-terms-and-conditions/" style="text-decoration: underline;color: #000;">Terms</a>,
<a href="https://code-create.com.hk/privacy-policy/" style="text-decoration: underline;color: #000;">Privacy Policy</a>,
and Fees.
</span>
</label>
</div>
<!-- <div class="thirdPartyLogin marign_top30">
@@ -492,22 +497,6 @@ export default defineComponent({
isCheckAgreement() {
message.info("Agree to all terms, privacy fees and policies");
},
//微信登录
wechatLogin(value: any) {
let data = {
code: value.code,
type: 2,
};
this.loadingShow = true;
Https.axiosGet(Https.httpUrls.parseWeChatCode, { params: data })
.then((rv: any) => {
this.loadingShow = false;
this.setSuccessLogin(rv);
})
.catch((res) => {
this.loadingShow = false;
});
},
//谷歌登录
googelLogin(value: any) {
let data = { credential: value, type: 2 };
@@ -614,10 +603,6 @@ export default defineComponent({
// },
},
mounted() {
const data = this.$route.query;
if (data?.state == "weiXin") {
this.wechatLogin(data);
}
},
});
</script>

View File

@@ -68,7 +68,7 @@ export default defineComponent({
}
const setWeiXin = ()=>{
let http = window.location.href.replace(/^https?:\/\//, '')
http = 'https://www.aida.com.hk'
http = import.meta.env.VITE_USER_NODE_ENV == 'development'?'https://develop.aida.com.hk':'https://www.aida.com.hk'
new WxLogin({
self_redirect: false, //默认为false(保留当前二维码) true(当前二维码所在的地方通过iframe 内跳转到 redirect_uri)
id: "wx_id_signin", //容器的id

View File

@@ -608,13 +608,13 @@ export default defineComponent({
})
}
let openOtherUsers = ()=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:imgData.scaleImageData.accountId
}
})
window.open(routeUrl.href,'_blank')
// const routeUrl = router.resolve({
// path:'/home/otherUsers',
// query:{
// userId:imgData.scaleImageData.accountId
// }
// })
// window.open(routeUrl.href,'_blank')
}
watch(()=>imgData.scaleImageIndex,
(newVal,oldVal)=>{

View File

@@ -18,7 +18,7 @@
</span>
</div>
</div>
<NewCollectionReview id="collectionReview" @openCollection="openCollection"></NewCollectionReview>
<NewCollectionReview id="collectionReview" :probjects="selectProbject" @openCollection="openCollection"></NewCollectionReview>
</div>
</div>
<div v-show="isMannequinShow" class="left_info_hint">

View File

@@ -135,7 +135,6 @@
:centerBox="option.centerBox"
:height="option.height"
:infoTrue="option.infoTrue"
:limitMinSize="option.limitMinSize"
:enlarge="option.enlarge"
@real-time="realTime"
:autoCropArea="1"
@@ -831,7 +830,6 @@ export default defineComponent({
this.locationList = JSON.parse(JSON.stringify(this.oldLocationList))
// this.locationList = JSON.parse(JSON.stringify(this.locationList))
},
submitPlacement(){
// let cropper:any = this.$refs.cropper,
// that = this
@@ -937,7 +935,6 @@ export default defineComponent({
cropper.changeScale(num);
},
async confrimSubmit(){
console.log(this.printObject)
let isCovered = true
if(this.editOrUpload == 'edit'){
await new Promise((resolve, reject) => {
@@ -1125,12 +1122,15 @@ export default defineComponent({
if(boolean){
this.slider = 50
let url
if(this.printObject.url){
if(this.printObject.url && !this.printObject.url.startsWith('blob:')){
url = this.printObject.url
}else{
let cropper:any = this.$refs.cropper
await cropper.getCropData(async (value:any) => {
url = value
url = await new Promise<void>((resolve, reject) => {
cropper.getCropData((value:any) => {
this.option.img = value
resolve(value)
})
})
}
this.getImgDetail(url)

View File

@@ -118,6 +118,7 @@ export default defineComponent({
createProbject:inject('createProbject',()=>{}) as any,
likeDesignList:[],
canvasSelectList:[] as any,
videoList:[] as any,
canvasDetailData:null as any,
unLikeList:[],
locale:null as any,
@@ -159,20 +160,17 @@ export default defineComponent({
});
});
}else if(value == 'relight' || value == 'poseTransfer'){
console.log(list)
list.forEach((item:any) => {
if(item.childList){
item.childList.forEach((child:any) => {
if(child.resultType == 'ToProductImage' || child.resultType == 'Relight'){
fileList.push(child)
}
console.log(fileList)
if(child.resultType == 'Relight' && value == 'relight'){
likeList.push(child)
}else if(child.resultType == 'PoseTransfer' && value == 'poseTransfer'){
likeList.push(child)
}
console.log(likeList)
});
}
});
@@ -187,7 +185,6 @@ export default defineComponent({
}else if(data.openType == 'relight'){
store.commit("setRelightList", likeData);
}else if(data.openType == 'poseTransfer'){
console.log(likeData)
store.commit("setPoseTransfer", likeData);
}
if(dataDom[value]?.openSetData)dataDom[value]?.openSetData(fileList)
@@ -261,7 +258,7 @@ export default defineComponent({
let obj = {
value:itemStr.value,
type:data.locale == "ENGLISH"?itemStr.name:itemStr.nameCn,
imgList:list,
imgList:list,
}
if(list.length > 0){
data.canvasSelectList.push(obj)
@@ -274,7 +271,11 @@ export default defineComponent({
list.push({url:item.designOutfitUrl || item.url})
if(item.childList.length > 0){
item.childList.forEach((childItem)=>{
list.push({url:childItem.designOutfitUrl || childItem.url})
if(childItem.relationType == "PoseTransfer"){
data.videoList.push({url:childItem.videoUrl})
}else{
list.push({url:(childItem?.designOutfitUrl || childItem?.url)})
}
})
}
})
@@ -348,7 +349,14 @@ export default defineComponent({
})
})
}
console.log(img)
data.videoList.forEach((imgItem:any,index:any)=>{
let nameTail = imgItem.url?.split(".").pop().split("?").shift();
img.push({
imgUrl:imgItem.url,
name:`video${index}.${nameTail?nameTail:'mp4'}`
})
})
if(img.length>0)downImg(img);
}
let getImgArrayBuffer = (url) => {
@@ -412,7 +420,6 @@ export default defineComponent({
const share = async ()=>{
var imageDataURL = '';
imageDataURL = await dataDom.editCanvas.exportImage({isContainBg:true,isContainFixed:false})
console.log(imageDataURL)
let value = {
imgUrl:imageDataURL,
userlikeGroupId:'',

View File

@@ -166,7 +166,7 @@ export default defineComponent({
portfolioName:rv.portfolioDTO?.portfolioName?rv.portfolioDTO?.portfolioName:'',
tagsDTO:rv.portfolioDTO?.tagsDTO?rv.portfolioDTO?.tagsDTO:[],
},
model:[]
// model:[]
}
let position = []
if(storeData.sex == "Female"){
@@ -516,7 +516,6 @@ export default defineComponent({
}
}
const newProject = (value:any)=>{
settingGetHistory()
emit('setNewProject')
let chatModel = false
if(value.newMode == 'chat'){
@@ -524,7 +523,8 @@ export default defineComponent({
}else{
chatModel = false
}
router.push(`home?history=${value.id}&create=true&chatMode=${chatModel}`)
router.push(`home?history=${value.id}&chatMode=${chatModel}`)
settingGetHistory()
data.chatData = value
}

View File

@@ -113,7 +113,7 @@ export default defineComponent({
portfolioName:rv.portfolioDTO.portfolioName?rv.portfolioDTO.portfolioName:'',
tagsDTO:rv.portfolioDTO.tagsDTO?rv.portfolioDTO.tagsDTO:[],
},
model:[]
// model:[]
}
let position = []
if(storeData.sex == "Female"){

View File

@@ -227,8 +227,8 @@ export default defineComponent({
let storeData = {
name:rv.name,
id:rv.id,
type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
httpType:rv.process,//项目类型
// type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
// httpType:rv.process,//项目类型
ageGroup:rv.workspaceVO?.ageGroup,
style:rv.workspaceVO?.style,
styleId:rv.workspaceVO?.styleId,
@@ -251,7 +251,11 @@ export default defineComponent({
portfolioName:rv.portfolioDTO?.portfolioName?rv.portfolioDTO?.portfolioName:'',
tagsDTO:rv.portfolioDTO?.tagsDTO?rv.portfolioDTO?.tagsDTO:[],
},
model:[]
// model:[]
}
if(rv.process){
storeData.type = rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign'
storeData.httpType = rv.process
}
let position = []
if(storeData.sex == "Female"){

View File

@@ -793,6 +793,7 @@ export default {
Interact: "互动",
hisWorks: "他的作品",
works: "作品",
canNotUtilize: "此登录功能暂时不可用",
//取消
jsContent1: "太贵了",
jsContent2: "系统不友好",
@@ -1304,8 +1305,8 @@ export default {
allUser:'所有用户',
UserData:'用户数据',
FunctionUseCHART:'功能使用图表',
},
adminSeAllUser:{
ENGLISH:'英文',
CHINESE_SIMPLIFIED:'简体中文',
CreateTime:'创建时间',
UserName:'用户名',
search:'搜索',
@@ -1331,17 +1332,19 @@ export default {
MaximumCredits:'最大积分',
Close:'关闭',
OK:'确定',
jsContent1:'邮箱格式有误',
jsContent2:'请检查所有带 * 号的内容',
},
adminSeDesignDetail:{
User:'用户',
startTime:'开始时间',
endTime:'结束时间',
enterEmail:'请输入邮箱',
selectUserName:'请选择用户',
StartDate:'开始日期',
StartTime:'开始时间',
Email:'邮箱',
UserName:'用户名',
UserId:'用户ID',
Frequency:'设计频率',
CreateTime:'创建时间',
Credits:'积分',
enterUserName:'请输入用户名',
enterPassword:'请输入密码',
enterCredits:'请输入积分',
jsContent1:'邮箱格式有误',
jsContent2:'请检查所有带 * 号的内容',
jsDelete:'确定删除这一项吗',
},
};

View File

@@ -1,3 +1,5 @@
import { en } from "element-plus/es/locales.mjs";
export default {
Header: {
hello: "hello",
@@ -793,6 +795,7 @@ export default {
Interact: "interact",
hisWorks: "His works",
works: "Works",
canNotUtilize: "This login function is temporarily out of service.",
//取消
jsContent1: "Too expensive",
jsContent2: "Sytem not user friendly",
@@ -1302,10 +1305,10 @@ export default {
},
admin:{
allUser:'All User',
UserData:'User Data',
UserData:'Design Frequency',
FunctionUseCHART:'Function Use CHART',
},
adminSeAllUser:{
ENGLISH:'English',
CHINESE_SIMPLIFIED:'Chinese Simplified',
CreateTime:'Create Time',
UserName:'User Name',
search:'Search',
@@ -1320,7 +1323,7 @@ export default {
Delete:'Delete',
UserId:'User ID',
Email:'Email',
UserEmail:'Ucser Email',
UserEmail:'User Email',
language:'Language',
CreateDate:'Create Date',
Credits:'Credits',
@@ -1331,17 +1334,19 @@ export default {
MaximumCredits:'Maximum Credits',
Close:'Close',
OK:'OK',
jsContent1:'The email format is incorrect',
jsContent2:'Please check the input box marked with *',
},
adminSeDesignDetail:{
User:'User',
startTime:'Start Time',
endTime:'End Time',
enterEmail:'Please enter email',
selectUserName:'Please select the user.',
StartDate:'Start Date',
StartTime:'Start Time',
Email:'Email',
UserName:'User Name',
UserId:'User ID',
Frequency:'Frequency',
CreateTime:'Create Time',
Credits:'Credits',
enterUserName:'Please enter user name',
enterPassword:'Please enter password',
enterCredits:'Please enter credits',
jsContent1:'The email format is incorrect',
jsContent2:'Please check the input box marked with *',
jsDelete:'Are you sure you want to delete this item?',
},
};

View File

@@ -292,6 +292,13 @@ const routes: Array<RouteRecordRaw> = [
meta: { enter: 3 },
component: () =>
import("@/component/Administrator/SE/designDetailList/index.vue"),
},
{
path: "recentActiveChartSE",
name: "recentActiveChartSE",
meta: { enter: 3 },
component: () =>
import("@/component/Administrator/SE/recentActiveChart.vue"),
},
{
path: "generateFrequencySE",

View File

@@ -70,10 +70,12 @@ const Workspace : Module<DesignDetail,RootState> = {
state.projectList = list
},
setProbject(state,data){
console.log(123123,data)
for (const key in data) {
if(data[key] == undefined)continue
state.probjects[key] = data[key]
}
console.log(state.probjects)
},
createProbject(state){
state.probjects = {

View File

@@ -24,7 +24,7 @@ const all = (t)=>{
// },
// ],
},{
name:'User data',
name:'Design Frequency',
route:'/administrator/testClickData',
icon:'shenpi',
expandIcon:'icon-xiala',
@@ -177,13 +177,7 @@ const all = (t)=>{
route:'/administrator/organization',
key:'sub13',
isShow:true,
},{
name:'Design Frequency',
icon:'usetime',
route:'/administrator/testClickDataSE',
key:'sub14',
isShow:true,
},]
}]
}
const schoolOrEnterprise = (t) =>{
return[
@@ -202,7 +196,7 @@ const schoolOrEnterprise = (t) =>{
isShow:true,
},{
name:t('admin.FunctionUseCHART'),
route:'/administrator/recentActiveChart',
route:'/administrator/recentActiveChartSE',
icon:'usetime',
key:'sub3',
isShow:true,

View File

@@ -49,6 +49,7 @@ const filterHttpsUrl = [
'/api/account/login',
'/api/account/organizationNameSearch',
'/api/account/designWorksRegisterCode',
'/api/third/party/parseWeChatCode',
'/api/account/sendEmail']
//POST传参序列化(添加请求拦截器)
axios.interceptors.request.use((config) => {

View File

@@ -118,6 +118,7 @@ export default defineComponent({
};
let handleClick = (event:any) => {
// state.selectedKeys = [Number(event.key)]
console.log(event.item)
state.nowPageName = event.item.name
router.push({path:event.item.route})
}

View File

@@ -346,9 +346,9 @@ export default defineComponent({
for (const key in opTypeList) {
const element = opTypeList[key];
homeMainData.openTypeList[key].label = element.label
if(element?.length > 0){
element.forEach((item,index)=>{
homeMainData.openTypeList[key][index].label = item.label
if(element.list?.length > 0){
element.list.forEach((item,index)=>{
homeMainData.openTypeList[key].list[index].label = item.label
})
}
}
@@ -534,7 +534,8 @@ export default defineComponent({
})
})
onBeforeUnmount(()=>{
MyWs.close()
let imgParent = document.querySelector('.homeMain_max .detail .material_content_list_loding .historyPage_loading')
if(Observer?.unobserve)Observer.unobserve(imgParent);
})
const setOpenType = (type,list)=>{
if(homeMainData.openType == type){
@@ -594,6 +595,9 @@ export default defineComponent({
// router.push(`/home?history=${childItem.id}`)
}
const settingGetHistory = ()=>{
if(homeMainData.historyData.page == 1){
return
}
homeMainData.historyData.page = 1
// homeMainData.openTypeList.history = {
// icon:"fi-br-time-past",
@@ -947,17 +951,18 @@ export default defineComponent({
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://code-create.com.hk/wp-content/uploads/2025/02/AiDA-demo-video_2_5_EN.mp4'})
showViewVideo({url:'https://aida.com.hk/video/user_manual_3_1_0.mp4'})
}else{
showViewVideo({url:'https://code-create.com.hk/wp-content/uploads/2025/02/AiDA-demo-video_2_5_CN.mp4'})
showViewVideo({url:'https://aida.com.hk/video/user_manual_3_1_0.mp4'})
}
//打开视频
const a = document.createElement('a');
a.href = url;
a.target = '_blank';
// a.download = 'aida_3.0-Manual.pptx'; // 下载的文件名
document.body.appendChild(a);
a.click();
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() {

View File

@@ -62,6 +62,7 @@ import {
createVNode,
toRefs,
reactive,
onMounted
} from "vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import { Https } from "@/tool/https";
@@ -75,6 +76,7 @@ import personal from "@/component/LoginPage/login/personal.vue";
import { useRoute,useRouter } from 'vue-router';
import school from "@/component/LoginPage/login/school.vue";
import enterprise from "@/component/LoginPage/login/enterprise.vue";
import { setCookie, WriteCookie } from "@/tool/cookie";
export default defineComponent({
components: {
Works,
@@ -87,6 +89,7 @@ export default defineComponent({
setup(props, { emit }) {
const store = useStore();
const router = useRouter()
const route = useRoute()
const loginData = reactive({
loginType: "",
isMask: true,
@@ -109,6 +112,67 @@ export default defineComponent({
const toBack = ()=>{
router.push('/Square')
}
const setSuccessLogin = (rv: any)=>{
if (rv) {
if (rv.systemUser == 4) {
rv.systemUser = 1;
}
let isTest = rv.systemUser == 3 ? true : false;
let isBeginner = rv?.isBeginner == 1 ? true : false;
let token = rv.token;
setCookie("isMurmur", false);
setCookie("token", token);
setCookie("isTest", isTest);
setCookie("isBeginner", isBeginner);
setCookie("isBeginnerNum", 0); //从第一步开始,机器人开始的话就是从第二部开始
setCookie("userInfo", JSON.stringify(rv));
let userid: any = {
ueserId: rv.userId,
systemUser: rv.systemUser,
};
if (rv.email) userid.email = rv.email;
store.commit("upUserDetail", userid);
if (window.innerWidth < 768) {
message.info(
"If you need to design, please log in using an iPad or computer."
);
turnToHomePage("/Square");
} else {
turnToHomePage("/home");
}
sessionStorage.setItem("isTimeOne", JSON.stringify(false)); //是否需要公告 提示 弹窗
let randomNum: any =
Math.floor(Math.random() * 9000000000000000) + 1000000000000000;
sessionStorage.setItem("sessionId", randomNum);
sessionStorage.setItem("record", JSON.stringify([]));
}
}
const turnToHomePage = (str: any)=>{
store.commit("clearAllData");
store.commit("clearAllCollection");
store.commit("setAllBoardDataChoose", {});
store.commit("clearShowSketchboard", {});
router.push(str);
}
const wechatLogin =(value: any)=>{
let data = {
code: value.code,
type: 2,
};
Https.axiosGet(Https.httpUrls.parseWeChatCode, { params: data })
.then((rv: any) => {
setSuccessLogin(rv);
})
.catch((res) => {
});
}
onMounted(()=>{
const data = route.query;
console.log(data)
if (data?.state == "weiXin") {
wechatLogin(data);
}
})
return {
...toRefs(dataDom),
...toRefs(loginData),

View File

@@ -11,7 +11,7 @@ import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
export default defineConfig(({ mode }) => {
// 加载环境变量
const env = loadEnv(mode, process.cwd(), "");
console.log(mode)
return {
resolve: {
alias: {