This commit is contained in:
X1627315083
2025-09-01 14:03:30 +08:00
parent c387a71ba8
commit 89639aaec9
49 changed files with 819 additions and 232 deletions

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 KiB

View File

@@ -829,11 +829,9 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
width: 100%;
}
.generalModel_state .generalModel_state_item .el-cascader .el-input .el-input__wrapper .el-input__inner {
padding: 0;
font-size: 1.8rem;
}
.generalModel_state .generalModel_state_item .el-cascader__tags {
padding-left: 1rem;
}
.generalModel_state .generalModel_state_item .el-cascader__tags,
.generalModel_state .generalModel_state_item .el-cascader__collapse-tag {
--el-color-primary: #d9d9d9;
@@ -867,7 +865,7 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
margin: 0;
width: 100%;
height: 4.6rem;
padding-left: 2.1rem;
padding-left: 1.1rem;
line-height: 4.6rem;
font-size: 1.8rem;
box-sizing: border-box;
@@ -1370,12 +1368,12 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
border-radius: 3rem;
color: #fff;
cursor: pointer;
margin: 0 2rem 2rem 0;
margin: 0 1.5rem 1.5rem 0;
border: 1.8px solid #000;
background-color: #000;
}
.admin_page .admin_search_item:hover {
color: #000;
border: 2px solid #000;
background-color: #fff;
}
.admin_page .admin_search_item:last-child {

View File

@@ -905,6 +905,7 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
padding: 0;
width: 100%;
.el-input__inner{
padding: 0;
font-size: 1.8rem;
}
}
@@ -913,7 +914,7 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
.el-cascader:hover{
}
.el-cascader__tags{
padding-left: 1rem;
// padding-left: 1rem;
}
.el-cascader__tags,.el-cascader__collapse-tag{
--el-color-primary: #d9d9d9;
@@ -943,7 +944,7 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
margin: 0;
width: 100%;
height: 4.6rem;
padding-left: 2.1rem;
padding-left: 1.1rem;
line-height: 4.6rem;
font-size: 1.8rem;
box-sizing: border-box;
@@ -1498,11 +1499,11 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
border-radius: 3rem;
color: #fff;
cursor: pointer;
margin: 0 2rem 2rem 0;
margin: 0 1.5rem 1.5rem 0;
border: 1.8px solid #000;
background-color: #000;
&:hover{
color: #000;
border: 2px solid #000;
background-color: #fff;
}
}

View File

@@ -148,6 +148,7 @@ export default defineComponent({
.account_comment{
width: 100%;
.account_generalMessage_item{
font-size: var(--aida-fsize1-6);
.account_generalMessage_item_right{
display: flex;
align-items: center;

View File

@@ -140,6 +140,7 @@ export default defineComponent({
}
.account_generalMessage_center{
.account_generalMessage_item{
font-size: var(--aida-fsize1-6);
.account_generalMessage_item_right{
display: flex;
align-items: center;

View File

@@ -149,6 +149,7 @@ export default defineComponent({
width: 100%;
.account_generalMessage_center{
.account_generalMessage_item{
font-size: var(--aida-fsize1-6);
.account_generalMessage_item_right{
display: flex;
align-items: center;

View File

@@ -45,11 +45,11 @@
</div>
</div>
<div class="modal_title_text">
<div>{{ title }} User</div>
<div>{{ title.label }} User</div>
</div>
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>User Name: <span>*</span></span>
<span>{{ $t('adminSeAllUser.UserName') }}: <span>*</span></span>
<input
v-model="userName"
placeholder="Please enter user name"
@@ -58,7 +58,7 @@
/>
</div>
<div class="admin_state_item">
<span>User Email: <span>*</span></span>
<span>{{ $t('adminSeAllUser.UserEmail') }}: <span>*</span></span>
<input
v-model="userEmail"
placeholder="Please enter email"
@@ -67,7 +67,7 @@
/>
</div>
<div class="admin_state_item">
<span>Password: <span>*</span></span>
<span>{{ $t('adminSeAllUser.Password') }}: <span>*</span></span>
<input
@focus="focus"
@blur="blur"
@@ -78,7 +78,7 @@
/>
</div>
<div class="admin_state_item">
<span>Maximum Credits:</span>
<span>{{ $t('adminSeAllUser.MaximumCredits') }}:</span>
<input
v-model="credits"
placeholder="Please enter credits"
@@ -88,8 +88,8 @@
</div>
</div>
<div class="allUserPoeration_btn admin_page">
<div class="admin_search_item" @click="cancelDsign">Close</div>
<div class="admin_search_item" @click="setOk">OK</div>
<div class="admin_search_item" @click="cancelDsign">{{ $t('adminSeAllUser.Close') }}</div>
<div class="admin_search_item" @click="setOk">{{ $t('adminSeAllUser.OK') }}</div>
</div>
</a-modal>
<div class="mark_loading" v-show="loadingShow">
@@ -119,7 +119,7 @@ export default defineComponent({
operationsModal: false,
operationsEdit: false,
loadingShow: false,
title: "",
title: null,
});
let operationsData = reactive({
accountId: -1,
@@ -151,8 +151,8 @@ export default defineComponent({
operations.operationsModal = true;
operations.operationsEdit = true;
operations.title = funStr;
if (funStr == "Add") operations.operationsEdit = false;
if (funStr == "Edit") {
if (funStr.value == "Add") operations.operationsEdit = false;
if (funStr.value == "Edit") {
operationsData.accountId = data.id;
operationsData.userName = data.userName;
operationsData.userEmail = data.userEmail;
@@ -195,7 +195,7 @@ export default defineComponent({
userEmail: operationsData.userEmail,
userPassword:
operationsData.password == operationsData.oldPassword
? ""
? null
: md5(operationsData.password + "abc"),
};
};
@@ -209,19 +209,18 @@ export default defineComponent({
};
let setOk = () => {
let data;
if (operations.title == "Add") {
if (operations.title?.value == "Add") {
data = setAddData();
if (!isEmail(data.userEmail)) {
message.info("The email format is incorrect");
message.info(t('adminSeAllUser.jsContent1'));
return;
}
if (
!data.userName ||
!data.userEmail ||
!data.userPassword ||
!data.creditsUsageLimit
!data.userPassword
)
return message.warning("Please check the input box marked with *");
return message.warning(t('adminSeAllUser.jsContent2'));
Https.axiosPost(Https.httpUrls.addOrUpdateSubAccount, data).then(
(rv) => {
if (rv) {
@@ -236,7 +235,7 @@ export default defineComponent({
message.info("The email format is incorrect");
return;
}
if (!data.userName || !data.userEmail || !data.creditsUsageLimit)
if (!data.userName || !data.userEmail)
return message.warning("Please check the input box marked with *");
Https.axiosPost(Https.httpUrls.addOrUpdateSubAccount, data).then(
(rv) => {

View File

@@ -3,7 +3,7 @@
<div class="admin_table_search">
<div class="admin_state">
<div class="admin_state_item">
<span>Create Time:</span>
<span>{{ $t('adminSeAllUser.CreateTime') }}:</span>
<a-range-picker
style="width: 230px"
class="range_picker"
@@ -45,7 +45,7 @@
/>
</div> -->
<div class="admin_state_item">
<span>User Name:</span>
<span>{{ $t('adminSeAllUser.UserName') }}:</span>
<a-select
v-model:value="ids"
mode="multiple"
@@ -74,16 +74,22 @@
</div>
<div class="admin_search">
<div class="admin_search_item" @click="searchHistoryList">
Search
{{ $t('adminSeAllUser.search') }}
</div>
<div class="admin_search_item" @click="addhHistoryList">
Add
{{ $t('adminSeAllUser.add') }}
</div>
<div class="admin_search_item" style="width: auto;padding: 0 2rem;" @click="downloadTemplate">
Download template
{{ $t('adminSeAllUser.DownloadTemplate') }}
</div>
<div class="admin_search_item" style="width: auto;padding: 0 2rem;" @click="uploadTemplate">
Upload template
{{ $t('adminSeAllUser.UploadTemplate') }}
</div>
<div class="admin_search_item" style="width: auto;padding: 0 2rem;" @click="ExportAccountData">
{{ $t('adminSeAllUser.ExportAccountData') }}
</div>
<div class="admin_search_item" style="width: auto;padding: 0 2rem;" @click="deleteList">
{{ $t('adminSeAllUser.Delete') }}
</div>
</div>
<div class="admin_state_list">
@@ -91,19 +97,19 @@
class="admin_state_list_item"
@click="lastGeTrialList('year')"
>
Nearly a year
{{ $t('adminSeAllUser.NearlyAYear') }}
</div>
<div
class="admin_state_list_item"
@click="lastGeTrialList('month')"
>
Last month
{{ $t('adminSeAllUser.LastMonth') }}
</div>
<div
class="admin_state_list_item"
@click="lastGeTrialList('week')"
>
Last week
{{ $t('adminSeAllUser.LastWeek') }}
</div>
</div>
</div>
@@ -113,6 +119,8 @@
:loading="tableLoading"
:columns="columns"
:data-source="dataList"
:row-selection="rowSelection"
rowKey="id"
:scroll="{ y: historyTableHeight }"
@change="changePage"
:showSorterTooltip='false'
@@ -132,13 +140,13 @@
@click="setAagree(record)"
style="margin-right: 2rem;"
>
Edit
{{ $t('adminSeAllUser.Edit') }}
</div>
<div
class="operate_item"
@click="deleteAagree(record)"
>
Delete
{{ $t('adminSeAllUser.Delete') }}
</div>
<!-- <div
class="operate_item"
@@ -169,18 +177,31 @@ import { Https } from "@/tool/https";
import { Modal,message } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import allUserPoerationsVue from "./addAllUser.vue";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components: {allUserPoerationsVue,},
setup() {
const store:any = useStore()
const selectedRowKeys = ref([]) as any;
const onSelectChange = (changableRowKeys: string[]) => {
selectedRowKeys.value = changableRowKeys;
};
let filter: any = reactive({
dataList: [],
tableLoading: false,
allUserList: computed(()=>{
return store.state.adminPage.allUserList
}),
allCountry:[]
allCountry:[],
rowSelection:computed(() => {
return {
selectedRowKeys: unref(selectedRowKeys),
onChange: onSelectChange,
}
})
});
const {t} = useI18n()
let filterData: any = reactive({
rangePickerValue: [],
currentPage: 1,
@@ -196,37 +217,12 @@ export default defineComponent({
orderBy:'',
userName: "",
});
let state: any = ref([
{
label: "all",
value: "",
},
{
label:'visitor',
value:'0',
},
{
label:'yearly',
value:'1',
},
{
label:'monthly',
value:'2',
},
{
label:'trial',
value:'3',
},
{
label: "userInEvent",
value: "4",
},
]);
let renameData: any = ref({}); //修改名字选中的数据
const columns: any = computed(() => {
return [
{
title: "User Id",
title: t("adminSeAllUser.UserId"),
align: "center",
dataIndex: "id",
key: "id",
@@ -235,7 +231,7 @@ export default defineComponent({
sorter: true,
},
{
title: "Email",
title: t("adminSeAllUser.Email"),
align: "center",
dataIndex: "userEmail",
key: "userEmail",
@@ -243,7 +239,7 @@ export default defineComponent({
ellipsis:true
},
{
title: "User Name",
title: t("adminSeAllUser.UserName"),
align: "center",
dataIndex: "userName",
key: "userName",
@@ -258,7 +254,7 @@ export default defineComponent({
// },
},
{
title: "language",
title: t("adminSeAllUser.language"),
align: "center",
dataIndex: "language",
key: "language",
@@ -266,7 +262,7 @@ export default defineComponent({
ellipsis:true,
},
{
title: "Create Date",
title: t("adminSeAllUser.CreateDate"),
align: "center",
dataIndex: "createDate",
key: "createDate",
@@ -274,19 +270,19 @@ export default defineComponent({
sorter: true,
},
{
title: "Credits",
title: t("adminSeAllUser.Credits"),
align: "center",
// width: 150,
// minWidth: 100,
// maxWidth: 200,
// resizable: true,
dataIndex: "creditsUsageLimit",
dataIndex: "credits",
key: "credits",
width:100,
sorter: true,
},
{
title: "Credits Usage",
title: t("adminSeAllUser.CreditsUsage"),
align: "center",
dataIndex: "creditsUsage",
key: "creditsUsage",
@@ -294,7 +290,7 @@ export default defineComponent({
sorter: true,
},
{
title: "Credits Usage Limit",
title: t("adminSeAllUser.CreditsUsageLimit"),
align: "center",
dataIndex: "creditsUsageLimit",
key: "creditsUsageLimit",
@@ -302,7 +298,7 @@ export default defineComponent({
sorter: true,
},
{
title: "Operations",
title: t("adminSeAllUser.Operations"),
key: "operation",
width:120,
align: "center",
@@ -418,11 +414,11 @@ export default defineComponent({
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
let addhHistoryList = () => {
allUserPoerationsVue.value.init('Add','')
allUserPoerationsVue.value.init({value:'Add',label:t('adminSeAllUser.add')},'')
};
let allUserPoerationsVue = ref()
let setAagree = (data:any) =>{
allUserPoerationsVue.value.init('Edit',data)
allUserPoerationsVue.value.init({value:'Edit',label:t('adminSeAllUser.Edit')},data)
}
const downloadTemplate = ()=>{
Https.axiosGet(Https.httpUrls.subAccountImportExcelDownload,{responseType: 'blob',env:{binary:true}}).then((rv:any)=>{
@@ -436,6 +432,18 @@ export default defineComponent({
URL.revokeObjectURL(link.href);
})
}
const ExportAccountData = ()=>{
Https.axiosGet(Https.httpUrls.exportAccountsToExcel,{headers:{responseType: 'blob',},env:{binary:true,binaryType:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'}}).then((rv:any)=>{
const link = document.createElement('a');
link.href = rv.url;
link.download = 'file.xlsx'; // 设置正确的文件扩展名
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// 释放 URL 对象
URL.revokeObjectURL(link.href);
})
}
const uploadTemplate = ()=>{
const fileInput = document.createElement('input');
fileInput.type = 'file';
@@ -473,6 +481,18 @@ export default defineComponent({
});
})
}
const deleteList = async ()=>{
console.log(selectedRowKeys.value)
if(selectedRowKeys.value.length == 0)return
let boolean:any = await confirmDelete()
if(!boolean){
return
}
Https.axiosPost(Https.httpUrls.deleteSubAccount,{deleteIdList:selectedRowKeys.value})
.then((rv:any)=>{
gettrialList();
})
}
const deleteAagree = async (event:any)=>{
let boolean:any = await confirmDelete()
if(!boolean){
@@ -496,7 +516,6 @@ export default defineComponent({
return {
...toRefs(filter),
...toRefs(filterData),
state,
columns,
renameData,
changePage,
@@ -508,7 +527,9 @@ export default defineComponent({
allUserPoerationsVue,
setAagree,
downloadTemplate,
ExportAccountData,
uploadTemplate,
deleteList,
deleteAagree,
};
},
@@ -530,13 +551,17 @@ export default defineComponent({
<style lang="less" scoped>
.admin_page .admin_table_search .admin_state {
display: flex;
width: 75%;
width: 70%;
flex-wrap: wrap;
align-content: flex-start;
}
.admin_page .admin_table_search .admin_search {
display: flex;
flex-wrap: wrap;
width: 25%;
width: 30%;
> .admin_search_item{
height: 4rem;
font-size: 1.6rem;
}
}
</style>

View File

@@ -4,7 +4,7 @@
<div class="admin_state">
<div class="admin_state_item">
<span>Start Date:</span>
<span>{{ $t('adminSeDesignDetail.StartDate') }}:</span>
<a-range-picker
style="width:250px"
class="range_picker"
@@ -23,11 +23,11 @@
</a-range-picker>
</div>
<div class="admin_state_item">
<span>Start Time:</span>
<span>{{ $t('adminSeDesignDetail.StartTime') }}:</span>
<a-time-range-picker style="width:250px" class="range_picker" valueFormat="HH:mm:ss" v-model:value="rangeTimeValue" />
</div>
<div class="admin_state_item">
<span>Email:</span>
<span>{{ $t('adminSeDesignDetail.Email') }}:</span>
<input
v-model="email"
placeholder="Please enter email"
@@ -37,7 +37,7 @@
/>
</div>
<div class="admin_state_item">
<span>User Name:</span>
<span>{{ $t('adminSeDesignDetail.UserName') }}:</span>
<a-select
v-model:value="ids"
mode="multiple"
@@ -79,6 +79,7 @@
import { defineComponent, ref, createVNode, computed } from "vue";
import { useStore } from "vuex";
import { Https } from "@/tool/https";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components: {
},
@@ -87,10 +88,11 @@ export default defineComponent({
let rangePickerValue: any = ref([]);
let rangeTimeValue: any = ref([]);
let renameData: any = ref({}); //修改名字选中的数据
const {t} = useI18n()
const columns: any = computed(() => {
return [
{
title: 'Email',
title: t('adminSeDesignDetail.Email'),
align: "center",
dataIndex: "userEmail",
key: "userEmail",
@@ -98,7 +100,7 @@ export default defineComponent({
fixed: "left",
},
{
title: 'User Id',
title: t('adminSeDesignDetail.UserId'),
align: "center",
ellipsis: true,
dataIndex: "accountId",
@@ -106,7 +108,7 @@ export default defineComponent({
width:100,
},
{
title: 'User Name',
title: t('adminSeDesignDetail.UserName'),
align: "center",
ellipsis: 200,
dataIndex: "userName",
@@ -121,7 +123,7 @@ export default defineComponent({
// },
},
{
title: 'Frequency',
title: t('adminSeDesignDetail.Frequency'),
align: "center",
ellipsis: true,
dataIndex: "designTimes",
@@ -129,7 +131,7 @@ export default defineComponent({
width:100,
},
{
title: 'Create Time',
title: t('adminSeDesignDetail.CreateTime'),
align: "center",
ellipsis: true,
// width: 150,
@@ -141,7 +143,7 @@ export default defineComponent({
width:200,
},
{
title: 'Credits',
title: t('adminSeDesignDetail.Credits'),
align: "center",
ellipsis: true,
// width: 150,

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,18 +177,14 @@ export default defineComponent({
key: "givenName",
width:100,
},
{
title: 'Create Time',
align: "center",
ellipsis: true,
// width: 150,
// minWidth: 100,
// maxWidth: 200,
// resizable: 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

@@ -64,8 +64,9 @@
refuse
</div>
</div>
<div v-else-if="column?.Operations">
{{ record.status }}
<div v-else-if="column?.Operations" class="operate_list">
<div class="operate_item">{{ record.status }}</div>
<div class="operate_item" @click="editAffiliate(record)">Edit</div>
</div>
<div v-else-if="column?.openType" @click="openDetail(record,column?.openType)">
{{ text }} HDK
@@ -74,6 +75,7 @@
</a-table>
</div>
<itemAffiliateDetail ref="itemAffiliateDetail"></itemAffiliateDetail>
<editAudit ref="editAudit"></editAudit>
</div>
</template>
<script lang="ts">
@@ -81,9 +83,10 @@ import { defineComponent, ref, createVNode, computed } from "vue";
import { Https } from "@/tool/https";
import { Modal, message } from "ant-design-vue";
import itemAffiliateDetail from "./itemAffiliateDetail.vue";
import editAudit from "./editAudit.vue";
export default defineComponent({
components: {
itemAffiliateDetail,
itemAffiliateDetail,editAudit
},
setup() {
let renameData: any = ref({}); //修改名字选中的数据
@@ -199,6 +202,7 @@ export default defineComponent({
},
])
const itemAffiliateDetail = ref()
const editAudit = ref()
let collectionList: any = ref([]);
let status: any = ref(0);
const openDetail = (value:any,openType:string)=>{
@@ -208,6 +212,9 @@ export default defineComponent({
}
itemAffiliateDetail.value.init(data)
}
const editAffiliate = (item:any)=>[
editAudit.value.init(item)
]
return {
columns,
collectionList,
@@ -217,6 +224,8 @@ export default defineComponent({
itemAffiliateDetail,
state,
openDetail,
editAudit,
editAffiliate,
};
},
data() {

View File

@@ -0,0 +1,182 @@
<template>
<div class="editAudit" ref="editAudit"></div>
<a-modal
class="editAudit_modal generalModel"
v-model:visible="operationsModal"
:footer="null"
:get-container="() => $refs.editAudit"
width="50%"
height="55rem"
:maskClosable="false"
:centered="true"
:closable="false"
:mask="true"
wrapClassName="#app"
:keyboard="false"
>
<div class="generalModel_btn">
<div class="generalModel_closeIcon" @click.stop="cancelDsign">
<svg
width="100%" height="100%"
viewBox="0 0 46 46"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle cx="23" cy="23" r="23" fill="black" fill-opacity="0.3" />
<rect
x="32.5063"
y="12"
width="3"
height="29"
rx="1.5"
transform="rotate(45 32.5063 12)"
fill="white"
/>
<rect
x="34.6274"
y="32.5059"
width="3"
height="29"
rx="1.5"
transform="rotate(135 34.6274 32.5059)"
fill="white"
/>
</svg>
</div>
</div>
<div class="modal_title_text">
<div>{{ title }} </div>
</div>
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>Commission: <span>*</span></span>
<input
v-model="commission"
placeholder="Please enter Commission"
type="text"
style="width: 250px"
/>
</div>
</div>
<div class="allUserPoeration_btn admin_page">
<div class="admin_search_item" @click="cancelDsign">Close</div>
<div class="admin_search_item" @click="setOk">OK</div>
</div>
</a-modal>
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
</template>
<script>
import {
defineComponent,
ref,
reactive,
watch,
onMounted,
nextTick,
toRefs,
} from "vue";
import { Https } from "@/tool/https";
import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import md5 from "md5";
export default defineComponent({
components: {},
emits: ["searchHistoryList"],
props:{
},
setup(props, { emit }) {
let operations = reactive({
operationsModal: false,
loadingShow: false,
title: "",
});
let operationsData = reactive({
id: "",
commission: "",
});
let init = (data) => {
let funStr = 'Edit'
console.log(data)
operations.operationsModal = true;
operations.title = funStr;
if (funStr == "Edit") {
operationsData.id = data.id;
operationsData.commission = data.commissionPercent;
}
};
let setEditData = () => {
return {
id: operationsData.id,
commission: operationsData.commission,
};
};
let cancelDsign = () => {
operationsData.id = "";
operationsData.commission = "";
operations.operationsModal = false;
};
let setOk = () => {
let data;
data = setEditData();
if (
!data.commission
)
return message.warning("Please check the input box marked with *");
Https.axiosGet(Https.httpUrls.updateCommission, {params:data}).then(
(rv) => {
if (rv) {
cancelDsign();
emit("searchHistoryList");
}
}
);
};
return {
...toRefs(operations),
...toRefs(operationsData),
cancelDsign,
init,
setOk,
};
},
data() {
return {};
},
mounted() {},
methods: {},
});
</script>
<style lang="less" scoped>
:deep(.editAudit_modal) {
.ant-modal-body {
display: flex;
flex-direction: column;
}
}
</style>
<style lang="less" scoped>
.editAudit_modal {
.closeIcon {
z-index: 2;
}
.allUserPoeration_btn {
display: flex;
flex-direction: row;
height: auto;
justify-content: flex-end;
padding: 1rem 0;
.admin_search_item {
margin-bottom: 0;
}
}
.allUserPoeration_center {
flex: 1;
overflow-y: auto;
flex-direction: row;
flex-wrap: wrap;
}
}
</style>

View File

@@ -50,15 +50,18 @@
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>Id: <span>*</span></span>
<!-- input不可编辑 -->
<input
v-model="id"
placeholder="Please enter user name"
placeholder="Please enter user Id"
disabled
type="text"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>Amount: <span>*</span></span>
<span>Amount: </span>
<input
v-model="amount"
placeholder="Please enter email"
@@ -67,7 +70,7 @@
/>
</div>
<div class="admin_state_item">
<span>Status: <span>*</span></span>
<span>Status: </span>
<a-select
v-model:value="selectStatus"
size="large"
@@ -159,11 +162,9 @@ export default defineComponent({
let data;
data = setEditData();
if (
!data.id ||
!data.amount
!data.id
)
return message.warning("Please check the input box marked with *");
console.log(123)
Https.axiosPost(Https.httpUrls.editReferral, data).then(
(rv) => {
if (rv) {

View File

@@ -109,7 +109,7 @@
</template>
</a-table>
</div>
<editReferral ref="editReferral" :stateList="[...state].splice(1,state.length-1)" @searchHistoryList="searchHistoryList"></editReferral>
<editReferral ref="editReferral" :stateList="[...state].filter((_, index) => ![0,3].includes(index))" @searchHistoryList="searchHistoryList"></editReferral>
</div>
</template>
<script lang="ts">
@@ -175,8 +175,8 @@ export default defineComponent({
value:'Pending',
},
{
label:'Access',
value:'Access',
label:'Accept',
value:'Accept',
},
{
label: "Rejected",
@@ -200,7 +200,12 @@ export default defineComponent({
dataIndex: "commission",
key: "commission",
width:200,
ellipsis:true
ellipsis:true,
customRender: (record: any) => {
return `${record.text}%`
},
},
{
title: "User Name",

View File

@@ -212,6 +212,10 @@ export default defineComponent({
{
label: "userInEvent",
value: "4",
},
{
label: "Edu Admin",
value: "7",
},
]);
let renameData: any = ref({}); //修改名字选中的数据

View File

@@ -91,7 +91,6 @@
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>Country:</span>
<input
@@ -103,7 +102,28 @@
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>Organization Name:</span>
<input
:readonly="title != 'Add'"
:class="{active:title != 'Add'}"
v-model="organizationName"
placeholder="Please enter Organization Name"
type="text"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>Sub Account Num:</span>
<input
:readonly="title != 'Add'"
:class="{active:title != 'Add'}"
v-model="subAccountNum"
placeholder="Please enter Sub Account Num"
type="number"
style="width: 250px"
/>
</div>
</div>
<div class="allUserPoeration_btn admin_page">
<div class="admin_search_item" @click="cancelDsign">
@@ -144,6 +164,8 @@ export default defineComponent({
systemUser:'',
credits:'',
country:'',
organizationName:'',
subAccountNum:0,
})
let state = ref([
{
@@ -169,6 +191,8 @@ export default defineComponent({
operations.title = funStr
if(funStr == 'Add') operations.operationsEdit = false
if(funStr == 'Edit'){
operationsData.organizationName = data.organizationName
operationsData.subAccountNum = data.subAccountNum?data.subAccountNum:0
let startTime = data.validStartTime?formatTime(data.validStartTime / 1000,"YYYY-MM-DDThh:mm:ss"):''
let endTime = data.validEndTime?formatTime(data.validEndTime / 1000,"YYYY-MM-DDThh:mm:ss"):''
operationsData.accountId=data.id
@@ -207,7 +231,9 @@ export default defineComponent({
"userEmail": operationsData.userEmail,
"userName": operationsData.userName,
"validEndTime": setTime(operationsData.validEndTime),
"validStartTime": setTime(operationsData.validStartTime)
"validStartTime": setTime(operationsData.validStartTime),
"organizationName": operationsData.organizationName?operationsData.organizationName:null,
"subAccountNum": operationsData.subAccountNum,
}
}
let setEditData = ()=>{
@@ -293,6 +319,11 @@ export default defineComponent({
.closeIcon {
z-index: 2;
}
> .admin_state_item{
> span{
width: 15rem;
}
}
.allUserPoeration_btn{
display: flex;
flex-direction: row;

View File

@@ -20,6 +20,8 @@ import { SelectionManager } from "./managers/selection/SelectionManager";
import { RedGreenModeManager } from "./managers/RedGreenModeManager";
import texturePresetManager from "./managers/brushes/TexturePresetManager";
import { BrushStore } from "./store/BrushStore";
import cuowuImg from '@/assets/images/homePage/cuowu.svg'
// import { MinimapManager } from "./managers/minimap/MinimapManager";
@@ -33,7 +35,7 @@ import LiquifyPanel from "./components/LiquifyPanel.vue"; // 引入液化编辑
import SelectionPanel from "./components/SelectionPanel.vue"; // 引入选区面板
import { LayerType, OperationType } from "./utils/layerHelper.js";
import { ToolManager } from "./managers/toolManager.js";
// import { fabric } from "fabric-with-all";
import { fabric } from "fabric-with-all";
import {
uploadImageAndCreateLayer,
loadImageUrlToLayer,
@@ -402,6 +404,11 @@ onMounted(async () => {
canvasManagerLoaded.value = true;
// 添加删除按钮
// if(!fabric.Object.prototype.controls.deleteControl)addRemoveBtn(removeLayer)
addRemoveBtn(removeLayer)
// 触发组件初始化事件
nextTick(() => {
// 确保所有依赖都已加载完成
@@ -490,6 +497,7 @@ onBeforeUnmount(() => {
liquifyManager = null;
selectionManager = null;
redGreenModeManager = null;
// fabric.Object.prototype.controls.deleteControl = undefined;
// 移除window resize事件监听
// window.removeEventListener("resize", handleWindowResize);
@@ -604,6 +612,37 @@ function moveLayerDown(layerId) {
layerManager.moveLayer(layerId, "down");
}
function addRemoveBtn(fun){//添加删除按钮
const deleteIcon = cuowuImg
// 创建删除图片元素
let deleteImg = document.createElement('img')
deleteImg.src = deleteIcon
function renderIcon(icon) {
return function (ctx, left, top, styleOverride, fabricObject) {
var size = this.cornerSize;
ctx.save();
ctx.translate(left, top);
ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle));
ctx.drawImage(icon, -size/3, -size/3, size/1.5, size/1.5);
ctx.restore();
}
}
fabric.Object.prototype.controls.deleteControl = new fabric.Control({
x: 0.5,
y: -0.5,
offsetY: -16,
offsetX: 16,
cursorStyle: 'pointer',
mouseUpHandler:deleteFun,
render: renderIcon(deleteImg),
cornerSize: 24
})
}
function deleteFun(){
removeLayer(layerManager.activeLayerId.value)
}
function removeLayer(layerId) {
// Check if this is the last layer - prevent deletion
if (layers.value.length <= 2) {

View File

@@ -141,7 +141,7 @@ const allImages = computed(() => {
// 计算属性:根据选择的分类过滤图片
const filteredImages = computed(() => {
if (selectedCategory.value === "全部") {
if (selectedCategory.value === "All" || selectedCategory.value === "全部") {
return allImages.value;
}

View File

@@ -280,6 +280,14 @@ export default defineComponent({
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
let gradient = null
let newData = list[i]?.newDetail?.[detailData.currentDetailType]
// newData[0].location=[
// -233.13985,
// 406.90964
// ]
// newData[0].scale=[
// 0.5,
// 0.35822305
// ]
let isCurrent = list[i].id == detailData?.selectDetail?.id
let color = (detailData.currentDetailType == 'color' && isCurrent && newData?.rgba?.r)?(newData?.rgba?.r?`${newData.rgba.r} ${newData.rgba.g} ${newData.rgba.b}`:''):(list[i].color?.rgba?.r?`${list[i].color.rgba.r} ${list[i].color.rgba.g} ${list[i].color.rgba.b}`:'')
if(detailData.currentDetailType == 'sketch' && newData){
@@ -293,12 +301,20 @@ export default defineComponent({
maskMinioUrl:list[i]?.maskMinioUrl,
// maskUrl:'',
maskUrl:list[i].maskUrl,
// offset:[
// -233.13985,
// 406.90964
// ],
offset,
partialDesign:detailData.isEditPattern.value?list[i].partialDesign:{},
path:(newData && detailData.currentDetailType == 'sketch' && isCurrent)?newData.minIOPath:list[i].minIOPath,
printObject:(newData && detailData.currentDetailType == 'print' && isCurrent)?{prints:newData}:list[i].printObject?list[i].printObject:{prints:[]},
priority,
scale,
// scale:[
// 0.5,
// 0.35822305
// ],
scale:[scale[0]?scale[0]:1,scale[1]?scale[1]:1],
type:(newData && detailData.currentDetailType == 'sketch' && isCurrent)?newData.level2Type || newData.categoryValue:list[i].type,
sketchString:list[i].sketchString?list[i].sketchString:'',
trims:(newData && detailData.currentDetailType == 'element' && isCurrent)?{prints:newData}:list[i].trims?list[i].trims:{prints:[]},

View File

@@ -10,7 +10,7 @@
<editCanvas v-if="canvasLoad" :config="canvasConfig"
@canvasInit="canvasInit"
@changeCanvas="changeCanvas"
:clothingImageUrl="selectDetail.undividedLayer"
:clothingImageUrl="selectDetail.undividedLayer || selectDetail.path"
showFixedLayer
:canvasJSON="canvasJSON"
:clothing-image-opts="{
@@ -142,7 +142,7 @@ export default defineComponent({
}else{
if(detailData.currentView === 'redGreenExample'){
nextTick(()=>{
setCanvas(detailData.selectDetail.undividedLayer).then(()=>{
setCanvas(detailData.selectDetail.undividedLayer || detailData.selectDetail.path).then(()=>{
detailData.canvasLoad = true
})
})
@@ -158,7 +158,7 @@ export default defineComponent({
const privewDetail = async (oldSelectDetail = detailData.selectDetail)=>{
if(!detailDom.editCanvas)return
return new Promise((res,reject)=>{
detailDom.editCanvas.exportImage({isContainBg:false,isContainFixed:true}).then((rv)=>{
detailDom.editCanvas.exportImage({isContainBg:false,isContainFixed:false}).then((rv)=>{
if(oldSelectDetail?.partialDesign)oldSelectDetail.partialDesign.partialDesignBase64 = rv
res('')
})
@@ -271,9 +271,8 @@ export default defineComponent({
})
onMounted(()=>{
nextTick(async ()=>{
console.log(JSON.parse(JSON.stringify(detailData.selectDetail)))
detailData.isShowMark = true
if(detailData.selectDetail.canvasId){
detailData.isShowMark = true
await new Promise((resolve, reject) => {
let value = {
module:'designItemDetail',
@@ -289,8 +288,7 @@ export default defineComponent({
});
})
}
setCanvas(detailData.selectDetail.undividedLayer).then(()=>{
setCanvas(detailData.selectDetail.undividedLayer || detailData.selectDetail.path).then(()=>{
detailData.canvasLoad = true
})
})

View File

@@ -69,6 +69,7 @@
<img crossOrigin="anonymous" :src="item?.path" :style="{transform:`rotateZ(${item.pattern?.transform?.rotateZ}deg)`}" class="designOpenrtion_imgItme" draggable="false">
</div>
</div>
<!-- <img :src="selectDetail.path" alt="" class="designOpenrtion_sketch" ref="sketchImg"> -->
<img :src="selectDetail?.undividedLayer?selectDetail.undividedLayer:selectDetail.path" alt="" class="designOpenrtion_sketch" ref="sketchImg">
<div class="designOpenrtion_btn">
<ul v-if="overallSingle" v-for="item,index in printStyleList[type][stateOverallSingle]" :key="item" :class="{active:item?.pattern.designOpenrtionBtn?item?.pattern.designOpenrtionBtn:false}" class="designOpenrtion_Mousingle" :style="item?.pattern.style" @mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))">
@@ -357,10 +358,26 @@ export default defineComponent({
editPrintElementData.overallSingle = state
}
}
img.src = editPrintElementData.selectDetail.undividedLayer
// undividedLayer
//计算宽高使用editPrintElementData.selectDetail.path
// img.src = editPrintElementData.selectDetail.path
img.src = editPrintElementData.selectDetail.undividedLayer?editPrintElementData.selectDetail.undividedLayer:editPrintElementData.selectDetail.path
})
}
watch(()=>editPrintElementData.selectDetail?.id,(newVal)=>{
// watch(()=>editPrintElementData.selectDetail?.id,(newVal)=>{
// if(!newVal)return
// editPrintElementData.printStyleList[props.type] = {
// single:[],
// overall:[],
// }
// setPosition()
// },{immediate: true,})
watch(()=>editPrintElementData.currentPrintElement,(newVal)=>{
if(newVal){
addPrintELement(newVal)
}
})
watch(()=>((editPrintElementData.selectDetail?.undividedLayer || editPrintElementData.selectDetail?.id)),(newVal)=>{
if(!newVal)return
editPrintElementData.printStyleList[props.type] = {
single:[],
@@ -368,11 +385,6 @@ export default defineComponent({
}
setPosition()
},{immediate: true,})
watch(()=>editPrintElementData.currentPrintElement,(newVal)=>{
if(newVal){
addPrintELement(newVal)
}
})
//设置移动
const itemMoveMousedown = (index:number,event:any)=>{
if (event.target.tagName === 'IMG' || event.target.nodeName === 'IMG')return

View File

@@ -375,6 +375,9 @@ export default defineComponent({
canvas.dispose();
showPayOrder.value = false
}
onBeforeUnmount(()=>{
fabric.Object.prototype.controls.deleteControl = null
})
return {
presentState,
showPayOrder,

View File

@@ -156,7 +156,7 @@
:placeholder="$t('Renew.promotionCode')"
v-model="item.promotionData.code"
/>
<div style="cursor: pointer" @click="examine(item)">
<div style="cursor: pointer; background-color: #000; font-size: 1.2rem; color: #fff; padding: 0 .5rem;" @click="examine(item)">
{{ $t("Renew.use") }}
</div>
</div>
@@ -268,7 +268,7 @@
</template>
<script lang="ts">
import { defineComponent, computed, reactive, toRefs, onMounted } from "vue";
import { defineComponent, computed, reactive, toRefs, onMounted, onBeforeUnmount } from "vue";
import { message } from "ant-design-vue";
import payMethod from "@/component/Pay/payMethod.vue";
import { useStore } from "vuex";
@@ -297,6 +297,22 @@ export default defineComponent({
let renewData = reactive({
personage: [
{
price: "100",
sellWell: true,
activity: false, //活动打折
type: {
value: "EcoMonth",
label: computed(()=>t("Renew.Monthly")),
},
PaymentType: "CreditCard",
promotionData: {
code: "",
error: "",
str: "",
price: "",
},
},
{
price: "500",
sellWell: true,
activity: false, //活动打折
@@ -388,10 +404,11 @@ export default defineComponent({
});
const init = () => {
renew.renewModel = true;
renewData.current = renewData.personage[0];
renewData.current = renewData.personage[1];
};
const cancelDsign = () => {
renew.renewModel = false;
store.dispatch('getLangType')
};
const setPaymentType = (str: any) => {
renewData.current.PaymentType = str;
@@ -570,6 +587,8 @@ export default defineComponent({
color: #fff;
padding: 4rem 3.2rem;
position: relative;
display: flex;
flex-direction: column;
> .video{
position: absolute;
width: 100%;
@@ -598,6 +617,10 @@ export default defineComponent({
> .content {
flex-wrap: wrap;
flex-direction: row;
flex: 1;
align-content: center;
align-items: center;
justify-content: center;
> .benefitsItem {
display: flex;
width: 50%;
@@ -655,7 +678,7 @@ export default defineComponent({
margin-bottom: 1rem;
border-radius: 1rem;
overflow: hidden;
border: 2px solid #eaecf0;
border: 1.5px solid #eaecf0;
> .popular {
background: #2d9f75;

View File

@@ -31,9 +31,9 @@
<span v-if="scaleImageList[scaleImageIndex]?.resultType == 'ToProductImage'">{{$t('ProductImg.MagicTools')}}</span>
<span v-if="scaleImageList[scaleImageIndex]?.resultType == 'Relight'">{{$t('ProductImg.relightingTool')}}</span>
</div>
<div v-show="scaleImageList[scaleImageIndex]?.resultType == 'Relight'" class="productImg_content_item_title productImg_content_item_title_similarity">
<!-- <div v-show="scaleImageList[scaleImageIndex]?.resultType == 'Relight'" class="productImg_content_item_title productImg_content_item_title_similarity">
<span>{{$t('ProductImg.SelectionFunction')}}</span>
</div>
</div> -->
<!-- 暂时去掉 -->
<!-- <div v-show="scaleImageList[scaleImageIndex]?.resultType == 'Relight'" class="productImg_content_item_Direction generalModel_state_item" style="margin-bottom: 1rem;">
<a-select size="large" style="width: 100%;" v-model:value="speedData.value" :options="speedList" :field-names="{ label: 'relightLabel', value: 'value' }"></a-select>

View File

@@ -69,6 +69,7 @@
/>
</svg>
</div>
<div class="info">{{ $t('brandDNA.LastCompletionTime') }}: {{finishTime}}</div>
</div>
</div>
<div class="content">
@@ -173,6 +174,7 @@ export default defineComponent({
},
isNoData:false,//如果数据为空就不加载
isNull:true,
finishTime:'',
})
const dataDom = reactive({
Cropper:null as any,
@@ -308,7 +310,7 @@ export default defineComponent({
data.logoUrl = value.minioUrl
data.minioUrl = value.brandLogo
clearInterval(data.getProgressTime)
getProgress()
getProgress(true)
// getLibraryList()
data.isNoData = false
data.currentPage = 0
@@ -344,25 +346,30 @@ export default defineComponent({
}
const compute = ()=>{
Https.axiosPost(Https.httpUrls.productImageInitialize,{brandId:data.detail.id}).then((res:any)=>{
getProgress()
getProgress(false)
}).catch((err:any)=>{
// console.log(err)
})
}
const getProgress = ()=>{
const getProgress = (boolean:boolean)=>{
console.log(boolean)
setTimeout
if(props.selectCode != 'MyBrand'){
clearTimeout(data.getProgressTime)
return
}
Https.axiosPost(Https.httpUrls.getInitializeProgress,{brandId:data.detail.id}).then((res:any)=>{
data.finishTime = res.computeTime
data.schedule.num = res.percent
data.schedule.state = res.analyzed
if(res.percent == 1 && !boolean){
message.success(t('brandDNA.Finish'))
}
if(res.percent == 1 || !res.analyzed){
return clearTimeout(data.getProgressTime)
}
data.getProgressTime = setTimeout(()=>{
getProgress()
getProgress(boolean)
},5000)
// analyzed
@@ -515,6 +522,11 @@ export default defineComponent({
position: relative;
padding-right: 2rem;
}
> .info{
color: #5f5f5f;
font-size: 1.2rem;
margin-top: .8rem;
}
.gallery_btn{
&.loading{
pointer-events: none;

View File

@@ -144,7 +144,8 @@
class="forget_password_content_block"
@click="forgetPasswordLastStepFun()"
>
<i class="fi fi-br-arrow-left"></i>
<!-- <i class="fi fi-br-arrow-left"></i> -->
<i class="fi fi-br-angle-left"></i>
<span class="forget_password_content_title">Retrieve password</span>
</div>
<div v-show="frogetPasswordStep === 1">
@@ -849,6 +850,24 @@ export default defineComponent({
.forget_password_content_block {
cursor: pointer;
font-size: 3.6rem;
font-weight: 500;
display: flex;
align-items: center;
margin-bottom: 1.2rem;
> i {
margin-right: 2.8rem;
font-size: 2rem;
display: flex;
cursor: pointer;
align-items: center;
width: 4.6rem;
height: 4.6rem;
border-radius: 1.2rem;
display: flex;
justify-content: center;
border: 1px solid #D8DADC;
}
}
.fi-br-arrow-left {

View File

@@ -137,7 +137,8 @@
>
<!-- <span class="icon iconfont fi-br-arrow-left"></span
> -->
<i class="fi fi-br-arrow-left"></i>
<!-- <i class="fi fi-br-arrow-left"></i> -->
<i class="fi fi-br-angle-left"></i>
<span class="forget_password_content_title">Retrieve password</span>
</div>
<div v-show="frogetPasswordStep === 1">
@@ -835,6 +836,24 @@ export default defineComponent({
.forget_password_content_block {
cursor: pointer;
text-align: left;
font-size: 3.6rem;
font-weight: 500;
display: flex;
align-items: center;
margin-bottom: 1.2rem;
> i {
margin-right: 2.8rem;
font-size: 2rem;
display: flex;
cursor: pointer;
align-items: center;
width: 4.6rem;
height: 4.6rem;
border-radius: 1.2rem;
display: flex;
justify-content: center;
border: 1px solid #D8DADC;
}
}
.fi-br-arrow-left {

View File

@@ -144,7 +144,8 @@
class="forget_password_content_block"
@click="forgetPasswordLastStepFun()"
>
<i class="fi fi-br-arrow-left"></i>
<!-- <i class="fi fi-br-arrow-left"></i> -->
<i class="fi fi-br-angle-left"></i>
<span class="forget_password_content_title">Retrieve password</span>
</div>
<div v-show="frogetPasswordStep === 1">
@@ -852,6 +853,24 @@ export default defineComponent({
.forget_password_content_block {
cursor: pointer;
font-size: 3.6rem;
font-weight: 500;
display: flex;
align-items: center;
margin-bottom: 1.2rem;
> i {
margin-right: 2.8rem;
font-size: 2rem;
display: flex;
cursor: pointer;
align-items: center;
width: 4.6rem;
height: 4.6rem;
border-radius: 1.2rem;
display: flex;
justify-content: center;
border: 1px solid #D8DADC;
}
}
.fi-br-arrow-left {

View File

@@ -154,7 +154,7 @@
</template>
<script lang="ts">
import { defineComponent, ref, reactive, toRefs, onMounted } from "vue";
import { defineComponent, ref, reactive, toRefs, onMounted, onBeforeUnmount } from "vue";
import { Https } from "@/tool/https";
import { isEmail } from "@/tool/util";
import { message } from "ant-design-vue";
@@ -195,6 +195,7 @@ export default defineComponent({
};
const cancelDsign = () => {
payMethod.payMethodModel = false;
store.dispatch('getLangType')
};
const payAffirm = () => {
if (!payMethodData.clause) {
@@ -286,6 +287,7 @@ export default defineComponent({
setPaidBack();
emit("completePayment");
};
return {
store,
...toRefs(payMethod),

View File

@@ -31,12 +31,12 @@
<span v-if="scaleImageList[scaleImageIndex]?.resultType == 'ToProductImage'">{{$t('ProductImg.MagicTools')}}</span>
<span v-if="scaleImageList[scaleImageIndex]?.resultType == 'Relight'">{{$t('ProductImg.relightingTool')}}</span>
</div>
<div v-show="scaleImageList[scaleImageIndex]?.resultType == 'Relight'" class="productImg_content_item_title productImg_content_item_title_similarity">
<!-- <div v-show="scaleImageList[scaleImageIndex]?.resultType == 'Relight'" class="productImg_content_item_title productImg_content_item_title_similarity">
<span>{{$t('ProductImg.SelectionFunction')}}</span>
</div>
<div v-show="scaleImageList[scaleImageIndex]?.resultType == 'Relight'" class="productImg_content_item_Direction generalModel_state_item" style="margin-bottom: 1rem;">
<a-select size="large" style="width: 100%;" v-model:value="speedData.value" :options="speedList" :field-names="{ label: 'relightLabel', value: 'value' }"></a-select>
</div>
</div> -->
<div v-show="scaleImageList[scaleImageIndex]?.resultType == 'ToProductImage' && speedData.value != 'flux'" class="productImg_content_item_title productImg_content_item_title_similarity">
<span>{{$t('ProductImg.Similarity')}}</span>
</div>

View File

@@ -650,6 +650,7 @@ export default defineComponent({
}
const setDesignItemStyle = ()=>{
posiitonData.value.generateElList = []
if(!collItemDom.value)return
let elArr = collItemDom.value.querySelectorAll('.content_img_GetWidth')
designCollectionList.value.forEach((item:any,index:any)=>{
posiitonData.value.generateElList.unshift({

View File

@@ -329,9 +329,23 @@ export default defineComponent({
});
})
}
const historyChooseData = (dataValue:any)=>{
const historyChooseData = async (dataValue:any)=>{
let ifMoodTemplateUrl = true
if(dataValue?.moodBoard?.moodTemplateUrl){
await new Promise<void>((resolve, reject) => {
let img = new Image()
img.src = dataValue.moodBoard?.moodTemplateUrl
img.onload = ()=>{
resolve()
}
img.onerror = ()=>{
ifMoodTemplateUrl = false
resolve()
}
})
}
let collectionData = {
disposeMoodboard: dataValue.moodBoard?.moodTemplateId?[{
disposeMoodboard: (dataValue.moodBoard?.moodTemplateId && ifMoodTemplateUrl)?[{
id:dataValue.moodBoard?.moodTemplateId,
imgUrl:dataValue.moodBoard?.moodTemplateUrl,
resData:{

View File

@@ -29,7 +29,6 @@ import {message} from 'ant-design-vue'
import { Https } from "@/tool/https";
import { useStore } from "vuex";
import { useI18n } from "vue-i18n";
import canvasGeneral from "@/tool/canvasGeneralCopy";
import editCanvas from "@/component/Canvas/CanvasEditor/index.vue";
import FemaleAdultModel from "@/assets/images/homePage/FemaleAdultModel.png"
import FemaleChildModel from "@/assets/images/homePage/FemaleChildModel.png"
@@ -156,7 +155,6 @@ export default defineComponent({
onBeforeUnmount(()=>{
data.canvasLoad = false
data.isHiddenModel = true
// canvasGeneral.canvasClear()
})
return {
...toRefs(data),

View File

@@ -75,9 +75,9 @@
</a-slider>
<input style="margin-left: 2rem;" type="number" readonly v-model="similarity">
</div>
<div v-show="productimgMenu.value == 'Relight'" class="productImg_content_item_title productImg_content_item_title_similarity">
<!-- <div v-show="productimgMenu.value == 'Relight'" class="productImg_content_item_title productImg_content_item_title_similarity">
<span>{{$t('ProductImg.SelectionFunction')}}</span>
</div>
</div> -->
<!-- 暂时去掉 -->
<!-- <div v-show="productimgMenu.value == 'Relight'" class="productImg_content_item_Direction generalModel_state_item">
<a-select size="large" style="width: 100%;" v-model:value="speedData.value" :options="speedList" :field-names="{ label: 'relightLabel', value: 'value' }"></a-select>
@@ -157,11 +157,11 @@
<img
class="guide"
v-if="locale == 'ENGLISH' && likeList[productimgMenu.value] == 0 && generateList[productimgMenu.value] == 0"
:src="'/src/assets/images/homePage/toolsGuide/' + (productimgMenu.value == 'ToProductImage'?'productEN':'relightEN') + '.png'" alt="">
:src="'/image/toolsGuide/' + (productimgMenu.value == 'ToProductImage'?'productEN':'relightEN') + '.png'" alt="">
<img
class="guide"
v-else-if="likeList[productimgMenu.value] == 0 && generateList[productimgMenu.value] == 0"
:src="'/src/assets/images/homePage/toolsGuide/' + (productimgMenu.value == 'ToProductImage'?'productCN':'relightCN') + '.png'" alt="">
:src="'/image/toolsGuide/' + (productimgMenu.value == 'ToProductImage'?'productCN':'relightCN') + '.png'" alt="">
<generalDrag ref="generalDragLeft" :type="productimgMenu.value" :isCopy="!isDesignPage" @setBtn="selectSetBtn" :isDelete="false" :isLike="true" :list="likeList[productimgMenu.value]"></generalDrag>
</div>
<!-- </div> -->

View File

@@ -21,7 +21,7 @@
<div>{{ item?.custom }}</div>
<span style="font-size: 1.4rem;">{{ item?.customInfo }}</span>
</div>
<ul class="product_detail" :class="{'academic':item.type == 'academic'}">
<ul class="product_detail" :class="{'academic':(item.type == 'academic' && !isSelectSuccessively)}">
<li v-for="detailItem in item?.detailList">{{ detailItem }}</li>
</ul>
<div class="gallery_btn gallery_btn_radius" v-if="item?.btn != 'Contact us'" @click="createAccount">{{ item?.btn }}</div>
@@ -64,8 +64,8 @@
img: '/image/homeIntroduct/personal.png',
type:'personal',
info: "您的AI时尚设计助手",
price: '¥100',
detail: "每月·50积分",
price: 'HK$100',
detail: "每月·500积分",
highlight: "免费试用5天",
discounts: '9折优惠',
detailList: [
@@ -82,7 +82,7 @@
img: '/image/homeIntroduct/personal.png',
type:'personal',
info: "您的AI时尚设计助手",
price: '¥500',
price: 'HK$500',
detail: "每月·3500积分",
highlight: "免费试用5天",
discounts: '9折优惠',
@@ -107,10 +107,12 @@
discounts: '',
detailList: [
'灵活的自定义程序以满足学校需求',
"项目期间每月信用额度自动续期",
'可在用户之间灵活共享和分配账户信用额度',
'AI辅助设计教学功能',
'支持草图创意和设计灵感教学',
'基础3D设计功能',
"从设计灵感、草图创作到完整时装系列的尖端教学工具",
"基本3D设计功能",
"客户与技术支援",
],
btn: '联系我们',
},
@@ -121,7 +123,7 @@
img: '/image/homeIntroduct/personal.png',
type:'personal',
info: "您的AI时尚设计助手",
price: '¥5,000',
price: 'HK$5,000',
detail: "每年·50000积分",
highlight: "免费试用5天",
discounts: '9折优惠',
@@ -145,10 +147,13 @@
highlight: "",
discounts: '',
detailList: [
'全校共享积分额度',
'灵活的自定义程序以满足学校需求',
"项目期间每月信用额度自动续期",
'可在用户之间灵活共享和分配账户信用额度',
'AI辅助设计教学功能',
'支持草图创意和设计灵感教学',
'基础3D设计功能',
"从设计灵感、草图创作到完整时装系列的尖端教学工具",
"基本3D设计功能",
"客户与技术支援",
],
btn: '联系我们',
},

View File

@@ -277,7 +277,8 @@
>
<!-- <span class="icon iconfont fi-br-arrow-left"></span
> -->
<i class="fi fi-br-arrow-left"></i>
<!-- <i class="fi fi-br-arrow-left"></i> -->
<i class="fi fi-br-angle-left"></i>
<span class="forget_password_content_title">Retrieve password</span>
</div>
<div v-show="frogetPasswordStep === 1">
@@ -1092,6 +1093,24 @@ export default defineComponent({
.forget_password_content_block {
cursor: pointer;
font-size: 3.6rem;
font-weight: 500;
display: flex;
align-items: center;
margin-bottom: 1.2rem;
> i {
margin-right: 2.8rem;
font-size: 2rem;
display: flex;
cursor: pointer;
align-items: center;
width: 4.6rem;
height: 4.6rem;
border-radius: 1.2rem;
display: flex;
justify-content: center;
border: 1px solid #D8DADC;
}
}
.fi-br-arrow-left {

View File

@@ -23,7 +23,6 @@ import {message} from 'ant-design-vue'
import { Https } from "@/tool/https";
import { useStore } from "vuex";
import { useI18n } from "vue-i18n";
import canvasGeneral from "@/tool/canvasGeneralCopy";
import editCanvas from "@/component/Canvas/CanvasEditor/index.vue";
@@ -154,7 +153,6 @@ export default defineComponent({
});
onBeforeUnmount(()=>{
data.canvasLoad = false
// canvasGeneral.canvasClear()
})
return {
...toRefs(data),

View File

@@ -1,6 +1,3 @@
import { fontFamily } from "html2canvas/dist/types/css/property-descriptors/font-family";
import { opacity } from "html2canvas/dist/types/css/property-descriptors/opacity";
export default {
Header: {
hello: "你好",
@@ -282,7 +279,7 @@ export default {
LikeVideo: "已选择的",
InputVideo: "生成结果",
GeneratedVideo: "生成的视频",
hint: "将草图改为逼真的照片,这条裙子的材质是牛仔布。",
hint: "完整长度肖像,匹配参考图像中的服装风格、图案和面料纹理,精确复制服装设计细节,保持原始配色方案,高度忠实于参考服装,真实的光照效果,细致的面料渲染。",
jsContent1: "生成视频预计需要三分钟,请问是否继续",
},
LibraryPage: {
@@ -753,6 +750,7 @@ export default {
remainingModifications: "本月剩余次数:",
Country: "国家",
CompanyName: "职业",
Status: "状态",
Valid: "有效",
Expire: "过期",
//account首页
@@ -1012,6 +1010,8 @@ export default {
Slogan: "标语",
Upload: "上传",
Delete: "删除",
Finish:'我们已经根据您的喜好确定了您的风格。',
LastCompletionTime:'上次完成时间',
textarea: "请阐述您对这个品牌的看法,我们将帮助您设计出名称、标志以及宣传语。",
},
chat: {
@@ -1280,7 +1280,7 @@ export default {
wx:'基础',
relightEdit:'编辑细节',
changeBackground:'修改背景',
toproductFlus:'高',
toproductFlus:'高质量',
toproductBasic:'基础',
generateWx:'高级',
generateFlux:'进阶',
@@ -1298,5 +1298,48 @@ export default {
},
event:{
back:'返回'
}
},
admin:{
allUser:'所有用户',
UserData:'用户数据',
},
adminSeAllUser:{
CreateTime:'创建时间',
UserName:'用户名',
search:'搜索',
add:'添加',
DownloadTemplate:'下载模板',
UploadTemplate:'上传模板',
ExportAccountData:'导出账号数据',
NearlyAYear:'近一年',
LastMonth:'上一个月',
LastWeek:'上一周',
Edit:'编辑',
Delete:'删除',
UserId:'用户ID',
Email:'邮箱',
UserEmail:'用户邮箱',
language:'语言',
CreateDate:'创建时间',
Credits:'积分',
CreditsUsage:'已被使用',
CreditsUsageLimit:'积分使用上限',
Operations:'操作',
Password:'密码',
MaximumCredits:'最大积分',
Close:'关闭',
OK:'确定',
jsContent1:'邮箱格式有误',
jsContent2:'请检查所有带 * 号的内容',
},
adminSeDesignDetail:{
StartDate:'开始日期',
StartTime:'开始时间',
Email:'邮箱',
UserName:'用户名',
UserId:'用户ID',
Frequency:'设计频率',
CreateTime:'创建时间',
Credits:'积分',
},
};

View File

@@ -279,7 +279,7 @@ export default {
LikeVideo: "Selected",
InputVideo: "Generated",
GeneratedVideo: "Generated Video",
hint: "change the sketch to realistic photo, the material of the skirt is denim",
hint: "Full length portrait, match the clothing style, patterns, and fabric texture from the reference image, replicate garment design details precisely, maintain original color scheme, high fidelity to reference attire, realistic lighting, detailed fabric rendering",
jsContent1: "Video generation will take approximately 3 minutes. Continue?",
},
LibraryPage: {
@@ -750,6 +750,7 @@ export default {
remainingModifications: "Remaining this month:",
Country: "Country",
CompanyName: "Occupation",
Status: "Status",
Valid: "Valid",
Expire: "Expire",
//account首页
@@ -1009,6 +1010,8 @@ export default {
Slogan: "Slogan",
Upload: "Upload",
Delete: "Delete",
Finish:'We have calculated your preferred style.',
LastCompletionTime:'Last completion time',
textarea: "Please enter your thoughts about this brand, and we will help you generate the name, logo, and slogan.",
},
chat: {
@@ -1295,5 +1298,48 @@ export default {
},
event:{
back:'Back'
}
},
admin:{
allUser:'All User',
UserData:'User Data',
},
adminSeAllUser:{
CreateTime:'Create Time',
UserName:'User Name',
search:'Search',
add:'Add',
DownloadTemplate:'Download Template',
UploadTemplate:'Upload Template',
ExportAccountData:'Export account data',
NearlyAYear:'Nearly a year',
LastMonth:'Last month',
LastWeek:'Last week',
Edit:'Edit',
Delete:'Delete',
UserId:'User ID',
Email:'Email',
UserEmail:'Ucser Email',
language:'Language',
CreateDate:'Create Date',
Credits:'Credits',
CreditsUsage:'Credits Usage',
CreditsUsageLimit:'Credits Usage Limit',
Operations:'Operations',
Password:'Password',
MaximumCredits:'Maximum Credits',
Close:'Close',
OK:'OK',
jsContent1:'The email format is incorrect',
jsContent2:'Please check the input box marked with *',
},
adminSeDesignDetail:{
StartDate:'Start Date',
StartTime:'Start Time',
Email:'Email',
UserName:'User Name',
UserId:'User ID',
Frequency:'Frequency',
CreateTime:'Create Time',
Credits:'Credits',
},
};

View File

@@ -360,6 +360,22 @@ const routes: Array<RouteRecordRaw> = [
},
component: () => import("@/views/feedbackSurveyCN.vue"),
},
{
path: "/email3-1EN",
name: "email3-1EN",
meta: {
enter: "all",
},
component: () => import("@/views/emailPage/email3-1EN.vue"),
},
{
path: "/email3-1CN",
name: "email3-1CN",
meta: {
enter: "all",
},
component: () => import("@/views/emailPage/email3-1CN.vue"),
},
{
path: "/404",
name: "404",

View File

@@ -261,7 +261,7 @@ const userHabit : Module<UserHabit,RootState> = {
*/
state.userDetail.affiliate = data.affiliate
state.userDetail.systemUser = data.systemUser
state.userDetail.systemUser = 3
// state.userDetail.systemUser = 3
// 身份列表1可以使用aida系统2:可以使用affiliate页面3系统管理员用户
state.userDetail.systemList = []
if(data.systemUser != 0)state.userDetail.systemList.push(1)
@@ -273,6 +273,7 @@ const userHabit : Module<UserHabit,RootState> = {
state.userDetail.systemList.push(3)
}
sessionStorage.setItem('vuex_systemList', JSON.stringify(state.userDetail.systemList));
sessionStorage.setItem('vuex_systemUser', JSON.stringify(state.userDetail.systemUser));
state.userDetail.followeeCount = data.followeeCount//粉丝数量
state.userDetail.followerCount = data.followerCount//关注数量

View File

@@ -1,5 +1,5 @@
const adminRouter = {
all:[{
const all = (t)=>{
return[{
name:'All User',
route:'/administrator/allUser',
icon:'yonghu',
@@ -24,7 +24,7 @@ const adminRouter = {
// },
// ],
},{
name:'Design Frequency',
name:'User data',
route:'/administrator/testClickData',
icon:'shenpi',
expandIcon:'icon-xiala',
@@ -177,17 +177,19 @@ const adminRouter = {
route:'/administrator/organization',
key:'sub13',
isShow:true,
}],
schoolOrEnterprise:[
}]
}
const schoolOrEnterprise = (t) =>{
return[
{
name:'All User',
name:t('admin.allUser'),
route:'/administrator/allUserSE',
icon:'usetime',
key:'sub1',
isShow:true,
},
{
name:'Design Frequency',
name:t('admin.UserData'),
route:'/administrator/testClickDataSE',
icon:'usetime',
key:'sub2',
@@ -222,4 +224,4 @@ const adminRouter = {
// }
]
}
export {adminRouter}
export default {all , schoolOrEnterprise}

View File

@@ -2,13 +2,14 @@ import html2canvas from "html2canvas";
const getJpeg = dom =>{
return new Promise(resolve =>{
setTimeout(() => {
html2canvas(dom,{useCORS: true,}).then(canvas =>{
let base64 = canvas.toDataURL('image/jpeg',.9);
html2canvas(dom,{useCORS: true,backgroundColor: null}).then(canvas =>{
let base64 = canvas.toDataURL('image/png',.9);
console.log(base64)
// let quality = 0.9 // 压缩系数0-1之间
let newImage = new Image()
newImage.src = base64
newImage.setAttribute('crossOrigin', 'Anonymous') // url为外域时需要
const filename = new Date().toISOString() + '.jpg';
const filename = new Date().toISOString() + '.png';
resolve(base64ToFile(base64,filename))
newImage.remove()
// }
@@ -29,7 +30,7 @@ function base64ToFile(base64,filename) {
const byteArray = new Uint8Array(byteNumbers);
// 创建 File 对象
const file = new File([byteArray], filename, { type: 'image/jpeg' }); // 根据需要的类型进行修改
const file = new File([byteArray], filename, { type: 'image/png' }); // 根据需要的类型进行修改
return file;
}
//base64转成blob
@@ -39,7 +40,7 @@ function dataURLtoFile(dataURI, type) {
for (let i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
return new Blob([new Uint8Array(array)], { type: "image/jpeg" });
return new Blob([new Uint8Array(array)], { type: "image/png" });
}
//转换

View File

@@ -82,8 +82,8 @@ axios.interceptors.request.use((config) => {
},(error) =>{
return Promise.reject(error);
});
const binaryToUrl = (binary,type = 'application/octet-stream',res)=>{
let blob = new Blob([binary], {'content-type':res.headers['content-type']});
const binaryToUrl = (binary,type = 'application/json',res)=>{
let blob = new Blob([binary], {'content-type':type});
let url = URL.createObjectURL(blob);
return url
}
@@ -364,6 +364,7 @@ export const Https = {
addOrUpdateSubAccount:`/api/account/addOrUpdateSubAccount`,//添加子账号
deleteSubAccount:`/api/account/deleteSubAccount`,//删除子账号
subAccountImportExcelDownload:`/api/account/subAccountImportExcelDownload`,//批量添加模板下载模板
exportAccountsToExcel:`/api/account/exportAccountsToExcel`,//教育版导出用户数据
getNextSequence:`/api/project/getNextSequence`,//批量添加模板下载模板
subAccountImport:`/api/account/subAccountImport`,//模板导入
getGenerateFrequency:`/api/inquiry/getGenerateFrequency`,//积分使用详情
@@ -389,6 +390,7 @@ export const Https = {
affiliateRegistration:`/api/affiliate/registration`,//affiliate注册
personalCenter:`/api/affiliate/personalCenter`,//affiliate个人中心
affiliateList:`/api/affiliate/list`,//affiliate审批列表
updateCommission:`/api/affiliate/updateCommission`,//编辑佣金比例
getEachAffiliateGeneratedRevenue:`/api/affiliate/getEachAffiliateGeneratedRevenue`,//affiliate每个用户根据日期查询收益
affiliateApproval:`/api/affiliate/approval`,//affiliate同意 审批
getPersonalMonthlyIncome:`/api/affiliate/getPersonalMonthlyIncome`,//affiliate图表接口

View File

@@ -72,7 +72,7 @@ import { MailOutlined, AppstoreOutlined, SettingOutlined } from '@ant-design/ico
import { Https } from "@/tool/https";
import { useStore } from "vuex";
import { useRouter,useRoute } from 'vue-router'
import { adminRouter } from "@/tool/adminRouter";
import adminRouter from "@/tool/adminRouter";
import GO from "@/tool/GO";
import { country } from "@/tool/country";
import { getUploadUrl } from "@/tool/util";
@@ -91,6 +91,8 @@ export default defineComponent({
setup() {
const router = useRouter()
// const route:any = useRoute()
const {t} = useI18n()
const store:any = useStore()
let userDetail:any= computed(()=>{
return store.state.UserHabit.userDetail
@@ -107,12 +109,12 @@ export default defineComponent({
const onOpenChange = (openKeys: string[]) => {
const latestOpenKey:any = openKeys.find(key => state.openKeys.indexOf(key) === -1);
if (state.rootSubmenuKeys.indexOf(latestOpenKey!) === -1) {
state.openKeys = openKeys;
} else {
state.openKeys = latestOpenKey ? [latestOpenKey] : [];
}
const latestOpenKey:any = openKeys.find(key => state.openKeys.indexOf(key) === -1);
if (state.rootSubmenuKeys.indexOf(latestOpenKey!) === -1) {
state.openKeys = openKeys;
} else {
state.openKeys = latestOpenKey ? [latestOpenKey] : [];
}
};
let handleClick = (event:any) => {
// state.selectedKeys = [Number(event.key)]
@@ -123,10 +125,11 @@ export default defineComponent({
router.push('/home');
}
onMounted(() => {
if(userDetail.value.systemUser == 5 || userDetail.value.systemUser == 7){
state.rootSubmenuKeys = adminRouter.schoolOrEnterprise;
var vuex_systemUser: any = sessionStorage.getItem("vuex_systemUser");
if(vuex_systemUser == 5 || vuex_systemUser == 7){
state.rootSubmenuKeys = adminRouter.schoolOrEnterprise(t);
}else{
state.rootSubmenuKeys = adminRouter.all;
state.rootSubmenuKeys = adminRouter.all(t);
}
const route = router.currentRoute.value
if(state.rootSubmenuKeys.some((item:any) => item.route === route.path) || route.path == "/administrator"){

View File

@@ -132,7 +132,10 @@
<div class="left" v-show="leftShow">
<svg @click="()=>leftShow=!leftShow" class="leftShowOrHide" xmlns="http://www.w3.org/2000/svg" width="3rem" height="3rem" fill="currentColor" viewBox="0 0 24 24" data-v-1c7326d6=""><path fill-rule="evenodd" d="M6 5a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h2V5H6Zm4 0v14h8a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-8ZM3 6a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v12a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V6Z" clip-rule="evenodd" data-v-1c7326d6=""></path></svg>
<div class="newObj marginT2" @click="newProject" >
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 25 24"><path stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12.5 5v14m-7-7h14"></path></svg>
<svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<line x1="9.83398" y1="1" x2="9.83398" y2="15" stroke="black" stroke-width="4" stroke-linecap="round"/>
<path d="M1.5 8H17.5" stroke="black" stroke-width="4" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap;">{{$t('Header.NewProject')}}</p>
</div>
</div>
@@ -193,7 +196,7 @@
</div>
<div class="homeMain_subscribe">
<div>
<span class="font">Status</span>
<span class="font">{{$t('account.Status')}}</span>
<span v-if="userDetail.timeData.isExpiration" class="stateSucsess font">{{$t('account.Valid')}} <i class="fi fi-ss-check-circle"></i></span>
<span v-else class="stateError font">{{$t('account.Expire')}} <i class="fi fi-ss-check-circle"></i></span>
<span class="time">{{ userDetail.timeData.text }}</span>
@@ -358,7 +361,7 @@ export default defineComponent({
}
watch(() => route.query,
(query, oldQuery) => {
nextTick(()=>{
nextTick(async ()=>{
const key = Object.keys(query)?.[0]
if(key){
if(query.id){
@@ -367,20 +370,30 @@ export default defineComponent({
}else{
homeMainData.openType = Object.keys(query)[0]
homeMainData.openTypeChild = query[Object.keys(query)[0]]
}
if((query?.id || query?.history) && !await getIdExistToHistory()){
router.push('/home')
return
}
}else{
homeMainData.openType = ''
homeMainData.openTypeChild = ''
}
if(query.create == 'true' || query?.source == 'batch')settingGetHistory()
if(
query.create == 'true' ||
query?.source == 'batch' ||
(query.history && query.type == 'Works')
){
settingGetHistory()
}
})
},
{ immediate: true } // 立即触发一次以处理初始参数
);
watch(()=>homeMainData.openTypeList,()=>{
homeMainData.historyData.page = 1
})
// watch(()=>homeMainData.openTypeList,()=>{
// homeMainData.historyData.page = 1
// })
watch(()=>homeMainData.userDetailLanguage,(newVal)=>{
locale.value = newVal
})
@@ -463,12 +476,9 @@ export default defineComponent({
}
const toUserManual = ()=>{
const route = router.resolve({ name: 'userManual' });
window.open(route.href, '_blank');
window.open(route.href + '?lang=' + locale.value, '_blank');
}
onMounted(async ()=>{
if((route.query?.id || route.query?.history) && !await getIdExistToHistory()){
router.push('/home')
}
let test = getCookie('isTest')
let isTest =JSON.parse(test)
//判断账号剩余时间是否太短
@@ -911,7 +921,7 @@ export default defineComponent({
},
//教程
getTutorial(){
let url = 'https://code-create.com.hk/wp-content/uploads/2025/02/aida_3.0-Manual-2_5-CN.pdf'
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'})
@@ -922,7 +932,7 @@ export default defineComponent({
const a = document.createElement('a');
a.href = url;
a.target = '_blank';
a.download = 'aida_3.0-Manual.pptx'; // 下载的文件名
// a.download = 'aida_3.0-Manual.pptx'; // 下载的文件名
document.body.appendChild(a);
a.click();
},
@@ -1512,7 +1522,8 @@ export default defineComponent({
padding: 0 1.2rem;
border: 1.72px solid #000;
span{
width: 5rem;
// width: 5rem;
max-width: 10rem;
display: inline-block;
overflow: hidden;
display: flex;

View File

@@ -1,20 +1,28 @@
<script setup lang="ts">
import { ref, onMounted, onUnmounted, reactive, toRefs } from "vue";
import { useRouter,useRoute } from 'vue-router'
const route = useRoute()
//const props = defineProps({
//})
//const emit = defineEmits([
//])
let data = reactive({
lang: ''
})
onMounted(()=>{
data.lang = route?.query?.lang
console.log(lang)
})
onUnmounted(()=>{
})
defineExpose({})
const {} = toRefs(data);
const {lang} = toRefs(data);
</script>
<template>
<div class="userManual">
<div class="userManual" v-if="lang == 'CHINESE_SIMPLIFIED'">
<iframe src="https://aida-user-manual-chinese.super.site/" width="100%" height="100%" frameborder="0" allowfullscreen />
</div>
<div class="userManual" v-else-if="lang">
<iframe src="https://aida-user-manual.super.site/" width="100%" height="100%" frameborder="0" allowfullscreen />
</div>
</template>