Compare commits
95 Commits
0c8b3ee8f1
...
StableVers
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c981a08ae | ||
|
|
3ed5a37e5b | ||
|
|
5546c71ec0 | ||
|
|
8a7776a4b6 | ||
|
|
a1281c8e3f | ||
|
|
9a40e69081 | ||
|
|
e27b43dc67 | ||
|
|
b6a55a8124 | ||
| 6cace08a51 | |||
| 6207095221 | |||
|
|
7bb38bf2e5 | ||
|
|
743fc762d6 | ||
| 7297e4e7a4 | |||
| 3bff1ebb66 | |||
| 0d1656ee0a | |||
| 7d0873d874 | |||
| 82941bca7c | |||
| 949ff9292d | |||
|
|
11c9de8ced | ||
|
|
fd518ad9b3 | ||
|
|
a2b45e2041 | ||
|
|
da64b57c1c | ||
|
|
7c14b1d831 | ||
|
|
8966b52430 | ||
|
|
5fa049f73d | ||
|
|
575445f767 | ||
|
|
f43c56236b | ||
|
|
4352f7c2f4 | ||
|
|
c6b1bdbdf1 | ||
|
|
f16aa6ea14 | ||
|
|
a25abeb527 | ||
|
|
d359cd7763 | ||
| 23085d9a9b | |||
| bb021ae9ac | |||
| bfb4e128f5 | |||
| 2f9b33e4ca | |||
|
|
35c6dfe29c | ||
|
|
48c37e0810 | ||
| b869a82fae | |||
| e61a8e372d | |||
|
|
f5a74991c9 | ||
|
|
e58e8540c9 | ||
| e75ed7684e | |||
| 918d71072b | |||
|
|
242bc7a01d | ||
|
|
02ad8a340a | ||
|
|
0c250a21b4 | ||
|
|
f781060e7b | ||
|
|
832c9101ab | ||
|
|
c48e836f8e | ||
|
|
6f0780ac2e | ||
|
|
5acb91e584 | ||
|
|
f66ba9e6fa | ||
| 7a90cb8db9 | |||
| dafe87fad8 | |||
| c44747e2c2 | |||
|
|
341c765c73 | ||
|
|
ed6cc294a5 | ||
|
|
a77dc718f9 | ||
|
|
86953a91a1 | ||
| cabbb653bd | |||
| 99533c12b6 | |||
|
|
59da67e4b4 | ||
|
|
1428f191dd | ||
|
|
13024cdd99 | ||
|
|
fd85ea02c1 | ||
|
|
c196ab6678 | ||
|
|
c005b85c06 | ||
|
|
b50dbbc246 | ||
|
|
01d09f4c34 | ||
|
|
79c9a66296 | ||
|
|
761b1b3512 | ||
|
|
b2cb7378d6 | ||
| 4d9ea75146 | |||
| f7e6926ee9 | |||
| 7aba4e30c9 | |||
| dc1ab330cf | |||
|
|
18c70fe6a3 | ||
|
|
5c746aca4d | ||
|
|
72c4898101 | ||
|
|
a905971dae | ||
| 69643dbc83 | |||
| f3a707d6d8 | |||
| 8f4a43db14 | |||
| 186a158114 | |||
| 3da4a97400 | |||
|
|
96b3636aea | ||
| 228e3d56b5 | |||
| 99ea7eedc7 | |||
| d4fb435db9 | |||
|
|
3dfb607b91 | ||
|
|
181e6a87b8 | ||
|
|
012f0ef1b5 | ||
|
|
2d5d1b7a5e | ||
|
|
f6556ec9a9 |
33
.prettierrc.js
Normal file
33
.prettierrc.js
Normal file
@@ -0,0 +1,33 @@
|
||||
/** @type {import('prettier').Config} */
|
||||
module.exports = {
|
||||
// 打印宽度
|
||||
printWidth: 100,
|
||||
// 使用 4 空格缩进
|
||||
tabWidth: 4,
|
||||
// 使用 4 空格缩进,不使用制表符
|
||||
useTabs: true,
|
||||
// 行尾使用 LF (Unix 风格)
|
||||
endOfLine: 'lf',
|
||||
// 语句末尾使用分号
|
||||
semi: false,
|
||||
// 使用单引号
|
||||
singleQuote: false,
|
||||
// 对象和数组末尾不添加尾随逗号
|
||||
trailingComma: 'none',
|
||||
// JSX 引号使用单引号
|
||||
jsxSingleQuote: false,
|
||||
// 括号内侧空格
|
||||
bracketSpacing: true,
|
||||
// JSX 标签不换行
|
||||
bracketSameLine: false,
|
||||
// 箭头函数参数始终使用括号
|
||||
arrowParens: 'always',
|
||||
// HTML、Vue、Angular 和 Markdown 使用 LF
|
||||
htmlWhitespaceSensitivity: 'css',
|
||||
// Vue 文件脚本和样式缩进
|
||||
vueIndentScriptAndStyle: false,
|
||||
// 行注释位置在注释上方,不加空格
|
||||
proseWrap: 'preserve',
|
||||
// 根据文件类型自动推断
|
||||
embeddedLanguageFormatting: 'auto',
|
||||
};
|
||||
BIN
public/image/events/award-poster-zh.gif
Normal file
BIN
public/image/events/award-poster-zh.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 252 B After Width: | Height: | Size: 327 B |
Binary file not shown.
|
Before Width: | Height: | Size: 5.0 MiB |
BIN
src/assets/images/award/banner_chinese.mp4
Normal file
BIN
src/assets/images/award/banner_chinese.mp4
Normal file
Binary file not shown.
@@ -21,18 +21,19 @@
|
||||
"id": 3,
|
||||
"title": "AiDA Global Design Awards 2026",
|
||||
"imgUrl": "/image/events/award-poster.gif",
|
||||
"tips": "For inquiries: awards2026@code-create.com.hk",
|
||||
"textList": [
|
||||
{
|
||||
"paragraph": [
|
||||
{
|
||||
"text": "Scan the QR code for more information and to join the competition! The AiDA Global Design Award 2026 is an international design competition hosted by Code‑Create, a globally leading AI fashion solutions provider, celebrating the future of creativity powered by artificial intelligence. Open to designers from Hong Kong, China, Singapore, South Korea, and beyond, the competition brings together global talent, empowering AI as a creative partner—pushing fashion beyond traditional boundaries and unlocking new possibilities where technology amplifies human imagination."
|
||||
"text": "Click the “View Details” button for more information and to join the competition! The AiDA Global Design Award 2026 is an international design competition hosted by Code‑Create, a globally leading AI fashion solutions provider, celebrating the future of creativity powered by artificial intelligence. Open to designers worldwide the competition brings together global talent, empowering AI as a creative partner—pushing fashion beyond traditional boundaries and unlocking new possibilities where technology amplifies human imagination."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"paragraph": [
|
||||
{
|
||||
"text": "Participants have the opportunity to compete for cash prizes totaling up to US$9,000, gain global media exposure showcased by top international platforms, and connect with designers and industry leaders worldwide. Finalists will also attend an exclusive award ceremony in Hong Kong, with travel support provided, allowing them to showcase their talent, network with professionals, and celebrate their achievements on an international stage."
|
||||
"text": "Participants have the opportunity to compete for cash prizes totaling up to US$9,000, gain global media exposure showcased by top international platforms, and connect with designers and industry leaders worldwide. Finalists will also attend an exclusive award ceremony in Hong Kong, with travel allowance, allowing them to showcase their talent, network with professionals, and celebrate their achievements on an international stage."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -13,26 +13,27 @@
|
||||
{
|
||||
"id": 3,
|
||||
"title": "AiDA全球设计奖 2026",
|
||||
"imgUrl": "/image/events/award-poster.gif"
|
||||
"imgUrl": "/image/events/award-poster-zh.gif"
|
||||
}
|
||||
],
|
||||
"eventsItem": [
|
||||
{
|
||||
"id": 3,
|
||||
"title": "AiDA全球设计奖 2026",
|
||||
"imgUrl": "/image/events/award-poster.gif",
|
||||
"imgUrl": "/image/events/award-poster-zh.gif",
|
||||
"tips": "如有疑问,请联系:awards2026@code-create.com.hk",
|
||||
"textList": [
|
||||
{
|
||||
"paragraph": [
|
||||
{
|
||||
"text": "秉承推动 AI 赋能创意设计的初衷,Code‑Create 举办了「AiDA 全球设计大奖 2026」,面向来自香港、中国、新加坡、韩国及全球的设计师,鼓励大家探索 AI 与时尚设计的无限可能,突破传统界限,释放科技与想象力的创新潜能。扫描二维码获取更多比赛信息,抓住成为 AI 时尚先锋的机会吧!"
|
||||
"text": "秉承推动 AI 赋能创意设计的初衷,Code‑Create 举办了「AiDA 全球设计大奖 2026」,面向来全球的设计师,鼓励大家探索 AI 与时尚设计的无限可能,突破传统界限,释放科技与想象力的创新潜能。点击“查看详情”按钮获取更多比赛信息,抓住成为 AI 时尚先锋的机会吧!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"paragraph": [
|
||||
{
|
||||
"text": "参赛者将有机会赢取总奖金 9,000 美元,作品还将获得国际媒体展示机会,并与全球设计师和行业领袖建立联系。入围决赛者将受邀参加在香港举办的 专属颁奖典礼,主办方提供差旅支持,让设计师在国际舞台展示才华、拓展人脉,并共同庆祝创意成果。"
|
||||
"text": "参赛者将有机会赢取总奖金 9,000 美元,作品还将获得国际媒体展示机会,并与全球设计师和行业领袖建立联系。入围决赛者将受邀参加在香港举办的 专属颁奖典礼,主办方提供差旅津贴,让设计师在国际舞台展示才华、拓展人脉,并共同庆祝创意成果。"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,22 +1,37 @@
|
||||
<template>
|
||||
<div class="account_systemMessage">
|
||||
<div class="account_systemMessage">
|
||||
<div class="account_generalMessage_title modal_title_text">
|
||||
<!-- <span>系统消息</span> -->
|
||||
<div class="account_generalMessage_title_setting" @click="allRead">{{$t('account.AllRead')}}</div>
|
||||
<div class="account_generalMessage_title_setting" @click="allRead">
|
||||
{{ $t("account.AllRead") }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="account_generalMessage_item modal_title_text" v-for="item in dataList" :key="item.id" @click="setRead(item)">
|
||||
<div
|
||||
class="account_generalMessage_item modal_title_text"
|
||||
v-for="item in dataList"
|
||||
:key="item.id"
|
||||
@click="setRead(item)"
|
||||
>
|
||||
<a-badge :dot="item.isRead == 0"></a-badge>
|
||||
<div class="account_generalMessage_item_title">
|
||||
<div class="account_generalMessage_item_title_text" :title="item.content">{{ item.content.title }}</div>
|
||||
<div class="account_generalMessage_item_title_text" :title="item.content">
|
||||
{{ item.content.title }}
|
||||
</div>
|
||||
<div class="modal_title_text_intro">{{ item.createTime }}</div>
|
||||
</div>
|
||||
<div class="modal_title_text_intro">
|
||||
{{ item.content.content }}
|
||||
<span v-if="item.content.link" class="account_generalMessage_item_link">{{ item.content.link }}</span>
|
||||
<span v-if="item.content.link" class="account_generalMessage_item_link">{{
|
||||
item.content.link
|
||||
}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="account_generalMessage_item modal_title_text" style="display:flex;justify-content: center;" v-if="dataList.length == 0 && isNoData">
|
||||
{{$t('account.dataNull')}}
|
||||
<div
|
||||
class="account_generalMessage_item modal_title_text"
|
||||
style="display: flex; justify-content: center"
|
||||
v-if="dataList.length == 0 && isNoData"
|
||||
>
|
||||
{{ $t("account.dataNull") }}
|
||||
</div>
|
||||
<div class="page_loading_box" v-show="!isNoData">
|
||||
<span class="page_loading" ref="loadingDom" v-show="!isShowMark"></span>
|
||||
@@ -24,120 +39,138 @@
|
||||
<a-spin size="large" />
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent,computed,ref,reactive,nextTick,toRefs,createVNode, onMounted} from 'vue'
|
||||
import { Https } from "@/tool/https";
|
||||
import { useRouter,useRoute } from 'vue-router'
|
||||
import { useStore } from "vuex";
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import {
|
||||
defineComponent,
|
||||
computed,
|
||||
ref,
|
||||
reactive,
|
||||
nextTick,
|
||||
toRefs,
|
||||
createVNode,
|
||||
onMounted
|
||||
} from "vue"
|
||||
import { Https } from "@/tool/https"
|
||||
import { useRouter, useRoute } from "vue-router"
|
||||
import { useStore } from "vuex"
|
||||
import { useI18n } from "vue-i18n"
|
||||
import { isValidUrl } from "@/tool/util"
|
||||
export default defineComponent({
|
||||
components:{
|
||||
},
|
||||
components: {},
|
||||
// emits:['putListData'],
|
||||
props:['setReadStatus','setAllmessage','getHistory'],
|
||||
setup(prop,{emit}) {
|
||||
props: ["setReadStatus", "setAllmessage", "getHistory"],
|
||||
setup(prop, { emit }) {
|
||||
const router = useRouter()
|
||||
const store = useStore();
|
||||
const store = useStore()
|
||||
let accountMessage = reactive({
|
||||
dataList: [],
|
||||
page:1,
|
||||
size:10,
|
||||
page: 1,
|
||||
size: 10,
|
||||
isNoData: false,
|
||||
isShowMark: false,
|
||||
isShowMark: false
|
||||
})
|
||||
let loadingDom:any = ref(null)
|
||||
let setmessageList = ()=>{
|
||||
let loadingDom: any = ref(null)
|
||||
let setmessageList = () => {
|
||||
accountMessage.isShowMark = true
|
||||
let data = {
|
||||
page: accountMessage.page,
|
||||
size: accountMessage.size,
|
||||
size: accountMessage.size
|
||||
}
|
||||
prop.getHistory(data).then((rv:any)=>{
|
||||
accountMessage.isShowMark = false
|
||||
|
||||
if(rv.content.length == 0) {
|
||||
prop.getHistory(data)
|
||||
.then((rv: any) => {
|
||||
accountMessage.isShowMark = false
|
||||
|
||||
if (rv.content.length == 0) {
|
||||
accountMessage.isNoData = true
|
||||
} else {
|
||||
rv.content.forEach((item: any) => {
|
||||
item.content = JSON.parse(item.content)
|
||||
})
|
||||
accountMessage.dataList.push(...rv.content)
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
accountMessage.isShowMark = false
|
||||
accountMessage.isNoData = true
|
||||
}else{
|
||||
rv.content.forEach((item:any) => {
|
||||
item.content = JSON.parse(item.content)
|
||||
});
|
||||
accountMessage.dataList.push(...rv.content)
|
||||
})
|
||||
}
|
||||
let setRead = (item: any) => {
|
||||
let content = item.content.content
|
||||
if (isValidUrl(content)) {
|
||||
if (import.meta.env.VITE_APP_BASE_URL === "https://develop.api.aida.com.hk") {
|
||||
content += "&env=dev"
|
||||
}
|
||||
}).catch(() => {
|
||||
accountMessage.isShowMark = false
|
||||
accountMessage.isNoData = true
|
||||
})
|
||||
}
|
||||
let setRead = (item:any)=>{
|
||||
prop.setReadStatus(item).then((rv:any)=>{
|
||||
item.isRead = 1
|
||||
}).catch((err:any)=>{
|
||||
})
|
||||
}
|
||||
let allRead = ()=>{
|
||||
// emit('setAllmessage')
|
||||
prop.setAllmessage().then(()=>{
|
||||
accountMessage.dataList.forEach((item:any)=>{
|
||||
window.open(content, "_blank")
|
||||
}
|
||||
|
||||
prop.setReadStatus(item)
|
||||
.then((rv: any) => {
|
||||
item.isRead = 1
|
||||
})
|
||||
}).catch((err:any)=>{
|
||||
})
|
||||
.catch((err: any) => {})
|
||||
}
|
||||
let allRead = () => {
|
||||
// emit('setAllmessage')
|
||||
prop.setAllmessage()
|
||||
.then(() => {
|
||||
accountMessage.dataList.forEach((item: any) => {
|
||||
item.isRead = 1
|
||||
})
|
||||
})
|
||||
.catch((err: any) => {})
|
||||
}
|
||||
// provide('exhibitionList',exhibitionList)
|
||||
onMounted (()=>{
|
||||
onMounted(() => {
|
||||
accountMessage.isNoData = false
|
||||
accountMessage.page = 0
|
||||
let imgParent:any = document.querySelector('.account_systemMessage .page_loading')
|
||||
let imgParent: any = document.querySelector(".account_systemMessage .page_loading")
|
||||
new IntersectionObserver(
|
||||
(entries, observer) => {
|
||||
// 如果不是相交,则直接返回
|
||||
// console.log(entries[0]);
|
||||
if (!entries[0].intersectionRatio) return;
|
||||
accountMessage.page+=1
|
||||
if (!entries[0].intersectionRatio) return
|
||||
accountMessage.page += 1
|
||||
setmessageList()
|
||||
},
|
||||
}
|
||||
// { root:worksPage }
|
||||
).observe(loadingDom.value);
|
||||
).observe(loadingDom.value)
|
||||
})
|
||||
return{
|
||||
...toRefs(accountMessage),
|
||||
setmessageList,
|
||||
setRead,
|
||||
allRead,
|
||||
loadingDom,
|
||||
}
|
||||
},
|
||||
data(){
|
||||
return{
|
||||
|
||||
}
|
||||
},
|
||||
return {
|
||||
...toRefs(accountMessage),
|
||||
setmessageList,
|
||||
setRead,
|
||||
allRead,
|
||||
loadingDom
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.account_systemMessage{
|
||||
.account_systemMessage {
|
||||
width: 100%;
|
||||
.account_generalMessage_item{
|
||||
.account_generalMessage_item {
|
||||
font-size: var(--aida-fsize1-6);
|
||||
.account_generalMessage_item_title{
|
||||
.account_generalMessage_item_title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 2rem;
|
||||
.account_generalMessage_item_title_text{
|
||||
.account_generalMessage_item_title_text {
|
||||
max-width: 80%;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.modal_title_text_intro{
|
||||
.modal_title_text_intro {
|
||||
margin-left: 4rem;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
.modal_title_text_intro{
|
||||
.modal_title_text_intro {
|
||||
word-break: break-word;
|
||||
white-space: pre-wrap;
|
||||
font-family: Arial, sans-serif;
|
||||
|
||||
@@ -148,6 +148,7 @@
|
||||
total: total,
|
||||
showQuickJumper: true,
|
||||
bordered: false,
|
||||
showTotal: (total) => `Total Transaction: ${total}`
|
||||
}"
|
||||
>
|
||||
<template #bodyCell="{ column, text, record, index }">
|
||||
@@ -465,13 +466,16 @@ export default defineComponent({
|
||||
(rv: any) => {
|
||||
if (rv) {
|
||||
// this.dataList = rv
|
||||
// console.log('rv----',rv);
|
||||
|
||||
filter.dataList = rv.content;
|
||||
filterData.total = rv.total;
|
||||
filter.tableLoading = false;
|
||||
filterData.totalPayer = rv.content.reduce((total: number, item: any) => {
|
||||
const value = item && item.status === 'Success' ? parseFloat(item.payerTotal) : 0;
|
||||
return total + (isNaN(value) ? 0 : value);
|
||||
}, 0);
|
||||
filterData.totalPayer = rv.totalAmount;
|
||||
// filterData.totalPayer = rv.content.reduce((total: number, item: any) => {
|
||||
// const value = item && item.status === 'Success' ? parseFloat(item.payerTotal) : 0;
|
||||
// return total + (isNaN(value) ? 0 : value);
|
||||
// }, 0);
|
||||
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -321,6 +321,7 @@ export default defineComponent({
|
||||
data = setEditData()
|
||||
if (!data.userName || !data.userEmail || !data.validEndTime || !data.systemUser)
|
||||
return message.warning('Please check the input box marked with *')
|
||||
delete data.userName
|
||||
Https.axiosPost(Https.httpUrls.modifyUser, {}, { params: data }).then(rv => {
|
||||
if (rv) {
|
||||
cancelDsign()
|
||||
|
||||
99
src/component/Administrator/globalAwardPopularity.vue
Normal file
99
src/component/Administrator/globalAwardPopularity.vue
Normal file
@@ -0,0 +1,99 @@
|
||||
<template>
|
||||
<div class="admin_page globalAwardPopularity" ref="adminPage">
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
<div class="admin_state_item">
|
||||
<span>Current Time:</span>
|
||||
<span>{{ currentTimeStr }}</span>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>Raw Visi Count:</span>
|
||||
<span>{{ rawVisitCount }}</span>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>Unique Visit Count:</span>
|
||||
<span>{{ uniqueVisitCount }}</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
<div class="admin_search_item" @click="getGlobalAwardPopularity">
|
||||
<i class="fi fi-br-refresh"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="admin_table_content" ref="questionnaireTable">
|
||||
|
||||
</div> -->
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, createVNode,toRefs, computed,reactive, onMounted, nextTick } from "vue";
|
||||
import { Https } from "@/tool/https";
|
||||
import type { TableColumnsType } from 'ant-design-vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {},
|
||||
setup() {
|
||||
const currentTime = ref(new Date())
|
||||
const currentTimeStr = computed(()=>{
|
||||
return currentTime.value.toLocaleString()
|
||||
})
|
||||
const rawVisitCount = ref(0)
|
||||
const uniqueVisitCount = ref(0)
|
||||
const getGlobalAwardPopularity = () => {
|
||||
Https.axiosGet(Https.httpUrls.getGlobalAwardPopularity,).then((rv)=>{
|
||||
currentTime.value = new Date()
|
||||
rawVisitCount.value = rv.rawVisitCount
|
||||
uniqueVisitCount.value = rv.uniqueVisitCount
|
||||
})
|
||||
}
|
||||
onMounted(()=>{
|
||||
getGlobalAwardPopularity()
|
||||
})
|
||||
return {
|
||||
currentTimeStr,
|
||||
getGlobalAwardPopularity,
|
||||
rawVisitCount,
|
||||
uniqueVisitCount,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
|
||||
},
|
||||
methods: {},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.admin_page.globalAwardPopularity{
|
||||
.admin_table_search{
|
||||
// flex: 1;
|
||||
width: min-content;
|
||||
justify-content: flex-start;
|
||||
border-radius: 2rem;
|
||||
box-shadow: 0 0 1rem rgba(0, 0, 0, 0.2);
|
||||
margin-left: 2rem;
|
||||
flex-wrap: nowrap;
|
||||
gap: 3rem;
|
||||
}
|
||||
.admin_state{
|
||||
flex-direction: column;
|
||||
width: auto;
|
||||
cursor: auto;
|
||||
.admin_state_item{
|
||||
> span{
|
||||
font-size: 2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
.admin_search{
|
||||
i{
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -55,6 +55,7 @@ commandManager.setChangeCallback((info) => {
|
||||
emit("undo-redo-status-changed", {
|
||||
canUndo: canUndo.value,
|
||||
canRedo: canRedo.value,
|
||||
type: info.type,
|
||||
commandManager,
|
||||
});
|
||||
});
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -409,7 +409,7 @@ export class BrushIndicator {
|
||||
// this.show(e.e);
|
||||
this._mouseEnterHandler && this._mouseEnterHandler(e)
|
||||
} else {
|
||||
// requestIdleCallback(() => {
|
||||
// setTimeout(() => {
|
||||
// this.updatePosition(e.e);
|
||||
// });
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1580,7 +1580,7 @@ export class LayerManager {
|
||||
/**
|
||||
* 排序图层,确保图层顺序: 普通图层 > 固定图层 > 背景图层
|
||||
*/
|
||||
sortLayers() {
|
||||
async sortLayers() {
|
||||
// 对图层进行排序:背景图层在最底层(数组最后),固定图层在中间
|
||||
this.layers.value.sort((a, b) => {
|
||||
// 如果a是背景图层,它应该排在后面(最底层)
|
||||
@@ -1604,17 +1604,17 @@ export class LayerManager {
|
||||
});
|
||||
|
||||
// 更新画布对象顺序
|
||||
this._rearrangeObjects();
|
||||
await this._rearrangeObjects();
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新排列画布上的对象以匹配图层顺序
|
||||
* @private
|
||||
*/
|
||||
_rearrangeObjects() {
|
||||
async _rearrangeObjects() {
|
||||
if (this.layerSort) {
|
||||
// 使用LayerSort的高级排序
|
||||
this.layerSort.rearrangeObjects();
|
||||
await this.layerSort.rearrangeObjects();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -90,16 +90,17 @@ export class PartManager {
|
||||
|
||||
if (toolId === OperationType.PART_ERASER) {
|
||||
this.setEraserTool();
|
||||
} else if (toolId === OperationType.PART || toolId === OperationType.PART_RECTANGLE) {
|
||||
this.clearPointData();
|
||||
this.resetPartObject();
|
||||
}
|
||||
if (toolId === OperationType.PART_ERASER || toolId === OperationType.PART_BRUSH) {
|
||||
if (this.pointList.length > 0) {
|
||||
this.clearPointData();
|
||||
this.resetPartObject();
|
||||
}
|
||||
}
|
||||
}
|
||||
// else if (toolId === OperationType.PART || toolId === OperationType.PART_RECTANGLE) {
|
||||
// this.clearPointData();
|
||||
// this.resetPartObject();
|
||||
// }
|
||||
// if (toolId === OperationType.PART_ERASER || toolId === OperationType.PART_BRUSH) {
|
||||
// if (this.pointList.length > 0) {
|
||||
// this.clearPointData();
|
||||
// this.resetPartObject();
|
||||
// }
|
||||
// }
|
||||
|
||||
// 如果从非选区工具切换到选区工具,初始化事件
|
||||
if (!wasActive && this.isActive) {
|
||||
@@ -380,7 +381,8 @@ export class PartManager {
|
||||
box: [...this.pointList],
|
||||
});
|
||||
const image = await this.loadImageToObject(url);
|
||||
const canvas = getObjectAlphaToCanvas(image, null, 0, this.rgba);
|
||||
const data = this.partCanvas?.getContext("2d")?.getImageData(0, 0, this.partCanvas.width, this.partCanvas.height);
|
||||
const canvas = getObjectAlphaToCanvas(image, data, 0, this.rgba, !!data);
|
||||
this.partDrawCommand(canvas);
|
||||
}
|
||||
/** 获取分隔后图片 */
|
||||
|
||||
@@ -133,11 +133,12 @@ export class RedGreenModeManager {
|
||||
this.canvas.on("mouse:up", (event) => {
|
||||
// 可以在这里添加更多逻辑,比如生成图片或更新状态
|
||||
nextTick(() => {
|
||||
requestIdleCallback(async () => {
|
||||
setTimeout(async () => {
|
||||
if (!this.isInitialized) {
|
||||
console.warn("红绿图模式未初始化,无法处理鼠标事件");
|
||||
return;
|
||||
}
|
||||
console.log("鼠标抬起事件触发", this.onImageGenerated);
|
||||
if (this.onImageGenerated) {
|
||||
const imageData = await this.canvasManager.exportImage({
|
||||
restoreOpacityInRedGreen: true, // 恢复红绿图模式下的透明度
|
||||
|
||||
@@ -37,7 +37,6 @@ export class ThumbnailManager {
|
||||
|
||||
// 延迟执行,避免阻塞UI
|
||||
fabricObjects.length > 0 &&
|
||||
requestIdleCallback(() => {
|
||||
setTimeout(async () => {
|
||||
const base64 = await this._generateLayerThumbnailNow(fabricObjects, layer);
|
||||
// this.layerThumbnails.set(layerId, base64);
|
||||
@@ -55,7 +54,6 @@ export class ThumbnailManager {
|
||||
console.error("生成图层缩略图时出错:", error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -65,7 +63,7 @@ export class ThumbnailManager {
|
||||
generateAllLayerThumbnails(layers) {
|
||||
if (!layers || !Array.isArray(layers)) return;
|
||||
|
||||
requestIdleCallback(() => {
|
||||
setTimeout(() => {
|
||||
setTimeout(() => {
|
||||
layers.forEach((layer) => {
|
||||
if (layer && layer.id) {
|
||||
|
||||
@@ -180,7 +180,7 @@ export class CommandManager {
|
||||
this._recordPerformance("execute", command.constructor.name, duration);
|
||||
|
||||
// 通知状态变化
|
||||
this._notifyStateChange();
|
||||
this._notifyStateChange("execute");
|
||||
|
||||
console.log(`✅ 命令执行成功: ${command.constructor.name}`);
|
||||
return result;
|
||||
@@ -219,7 +219,7 @@ export class CommandManager {
|
||||
this._recordPerformance("undo", command.constructor.name, duration);
|
||||
|
||||
// 通知状态变化
|
||||
this._notifyStateChange();
|
||||
this._notifyStateChange("undo");
|
||||
|
||||
console.log(`✅ 命令撤销成功: ${command.constructor.name}`);
|
||||
return result;
|
||||
@@ -258,7 +258,7 @@ export class CommandManager {
|
||||
this._recordPerformance("redo", command.constructor.name, duration);
|
||||
|
||||
// 通知状态变化
|
||||
this._notifyStateChange();
|
||||
this._notifyStateChange("redo");
|
||||
|
||||
console.log(`✅ 命令重做成功: ${command.constructor.name}`);
|
||||
return result;
|
||||
@@ -298,7 +298,7 @@ export class CommandManager {
|
||||
|
||||
this.undoStack = [];
|
||||
this.redoStack = [];
|
||||
this._notifyStateChange();
|
||||
this._notifyStateChange("clear");
|
||||
// console.log("📝 命令历史已清空");
|
||||
}
|
||||
|
||||
@@ -417,10 +417,12 @@ export class CommandManager {
|
||||
* 通知状态变化
|
||||
* @private
|
||||
*/
|
||||
_notifyStateChange() {
|
||||
_notifyStateChange(type) {
|
||||
if (this.onStateChange) {
|
||||
try {
|
||||
this.onStateChange(this.getState());
|
||||
const obj = this.getState();
|
||||
obj.type = type;
|
||||
this.onStateChange(obj);
|
||||
} catch (error) {
|
||||
console.error("状态变化回调执行失败:", error);
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ export class LiquifyRealTimeUpdater {
|
||||
|
||||
if (isDrawing && this.config.useDirectUpdate) {
|
||||
// 拖拽过程中使用快速更新(降低质量以提高性能)
|
||||
this._fastUpdate(imageData);
|
||||
await this._fastUpdate(imageData);
|
||||
} else {
|
||||
// 拖拽结束后使用完整更新(最高质量)
|
||||
await this._fullUpdate(imageData);
|
||||
@@ -124,7 +124,7 @@ export class LiquifyRealTimeUpdater {
|
||||
* @param {ImageData} imageData 图像数据
|
||||
* @private
|
||||
*/
|
||||
_fastUpdate(imageData) {
|
||||
async _fastUpdate(imageData) {
|
||||
if (!this.targetObject || !this.targetObject._element) {
|
||||
return;
|
||||
}
|
||||
@@ -138,12 +138,14 @@ export class LiquifyRealTimeUpdater {
|
||||
|
||||
// 直接更新fabric对象的图像源(使用PNG格式保持质量)
|
||||
const targetElement = this.targetObject._element;
|
||||
|
||||
// 方案1: 直接设置src属性(最高性能)
|
||||
const dataURL = this.tempCanvas.toDataURL("image/png", quality);
|
||||
|
||||
if (targetElement.src !== dataURL) {
|
||||
targetElement.src = dataURL;
|
||||
// targetElement.src = dataURL;
|
||||
const image = new Image();
|
||||
image.src = dataURL;
|
||||
await image.decode();
|
||||
this.targetObject.setElement(image);
|
||||
|
||||
// 关键优化:直接设置fabric对象为脏状态,但不立即渲染
|
||||
// this.targetObject.dirty = false; // 标记为不需要立即渲染
|
||||
@@ -153,7 +155,7 @@ export class LiquifyRealTimeUpdater {
|
||||
// 使用requestAnimationFrame进行批量渲染优化
|
||||
// if (!this.renderingScheduled && !this.config.skipRenderDuringDrag) {
|
||||
// this.renderingScheduled = true;
|
||||
// requestIdleCallback(() => {
|
||||
// setTimeout(() => {
|
||||
// this.canvas.renderAll();
|
||||
// this.renderingScheduled = false;
|
||||
// });
|
||||
|
||||
@@ -30,27 +30,30 @@ export class LayerSort {
|
||||
if (canvasObjects.length === 0) return;
|
||||
|
||||
// 使用画布渲染优化
|
||||
await optimizeCanvasRendering(this.canvas, () => {
|
||||
// 计算每个对象应该在的 z-index 位置
|
||||
const objectZIndexMap = this.calculateObjectZIndexes();
|
||||
await new Promise((resolve) => {
|
||||
optimizeCanvasRendering(this.canvas, () => {
|
||||
// 计算每个对象应该在的 z-index 位置
|
||||
const objectZIndexMap = this.calculateObjectZIndexes();
|
||||
|
||||
// 按照新的 z-index 排序对象
|
||||
const sortedObjects = canvasObjects
|
||||
.map((obj) => ({
|
||||
object: obj,
|
||||
targetZIndex: objectZIndexMap.get(obj.id) ?? -1,
|
||||
}))
|
||||
.filter((item) => item.targetZIndex >= 0) // 过滤掉无效对象
|
||||
.sort((a, b) => a.targetZIndex - b.targetZIndex);
|
||||
// 按照新的 z-index 排序对象
|
||||
const sortedObjects = canvasObjects
|
||||
.map((obj) => ({
|
||||
object: obj,
|
||||
targetZIndex: objectZIndexMap.get(obj.id) ?? -1,
|
||||
}))
|
||||
.filter((item) => item.targetZIndex >= 0) // 过滤掉无效对象
|
||||
.sort((a, b) => a.targetZIndex - b.targetZIndex);
|
||||
|
||||
// 使用 fabric.js 的 moveTo 方法重新排序
|
||||
sortedObjects.forEach((item, index) => {
|
||||
const currentIndex = this.canvas.getObjects().indexOf(item.object);
|
||||
if (currentIndex !== index && currentIndex !== -1) {
|
||||
// 将对象移动到正确的位置
|
||||
this.canvas.moveTo(item.object, index);
|
||||
}
|
||||
});
|
||||
// 使用 fabric.js 的 moveTo 方法重新排序
|
||||
sortedObjects.forEach((item, index) => {
|
||||
const currentIndex = this.canvas.getObjects().indexOf(item.object);
|
||||
if (currentIndex !== index && currentIndex !== -1) {
|
||||
// 将对象移动到正确的位置
|
||||
this.canvas.moveTo(item.object, index);
|
||||
}
|
||||
});
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -65,9 +65,10 @@ export async function restoreFabricObject(serializedObject, canvas) {
|
||||
* @param {ImageData} revData - 相反的ImageData,白通道的相同位置是否为透明,revData为白色为透明,黑色为不透明
|
||||
* @param {number} diff - 差值,默认 25
|
||||
* @param {Object} rgba - 自定义 rgba 值,默认 { r: 255, g: 255, b: 255, a: 255 }
|
||||
* @param {boolean} isMerge - 是否合并,true=合并revData,false=反转revData
|
||||
* @returns {HTMLCanvasElement|null} 包含黑白通道的画布,或 null 如果失败
|
||||
*/
|
||||
export function getObjectAlphaToCanvas(object, revData, diff = 30, rgba = { r: 255, g: 255, b: 255, a: 255 }) {
|
||||
export function getObjectAlphaToCanvas(object, revData, diff = 30, rgba = { r: 255, g: 255, b: 255, a: 255 }, isMerge = false) {
|
||||
const image = object.getElement();
|
||||
if (image.nodeName !== "IMG" && image.nodeName !== "CANVAS") {
|
||||
console.warn("对象不是图片");
|
||||
@@ -93,18 +94,20 @@ export function getObjectAlphaToCanvas(object, revData, diff = 30, rgba = { r: 2
|
||||
const revG = revData?.data[i + 1] || 0;
|
||||
const revB = revData?.data[i + 2] || 0;
|
||||
const revA = revData?.data[i + 3] || 0;
|
||||
let isHave = false;
|
||||
if (r || g || b || a) {
|
||||
if (revR > diff || revG > diff || revB > diff || revA > diff) {
|
||||
data.data[i + 0] = 0;
|
||||
data.data[i + 1] = 0;
|
||||
data.data[i + 2] = 0;
|
||||
data.data[i + 3] = 0;
|
||||
isHave = false;
|
||||
} else {
|
||||
data.data[i + 0] = rgba.r;
|
||||
data.data[i + 1] = rgba.g;
|
||||
data.data[i + 2] = rgba.b;
|
||||
data.data[i + 3] = rgba.a;
|
||||
isHave = true;
|
||||
}
|
||||
}
|
||||
if (isMerge && (revR || revG || revB || revA)) isHave = true;
|
||||
if (isHave) {
|
||||
data.data[i + 0] = rgba.r;
|
||||
data.data[i + 1] = rgba.g;
|
||||
data.data[i + 2] = rgba.b;
|
||||
data.data[i + 3] = rgba.a;
|
||||
} else {
|
||||
data.data[i + 0] = 0;
|
||||
data.data[i + 1] = 0;
|
||||
|
||||
@@ -375,6 +375,7 @@ const confirm = ()=>{
|
||||
/* 图片网格 */
|
||||
.image-grid {
|
||||
display: grid;
|
||||
align-content: start;
|
||||
grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
|
||||
gap: 16px;
|
||||
min-height: 20rem;
|
||||
|
||||
@@ -333,6 +333,7 @@
|
||||
]);
|
||||
const canvasLoadJsonSuccess = () => {
|
||||
console.log("画布加载JSON成功");
|
||||
return;
|
||||
canvasEditor.value?.updateOtherLayers({
|
||||
color: { rgba: { r: 255, g: 0, b: 0, a: 1 } },
|
||||
printObject: {
|
||||
@@ -446,6 +447,7 @@
|
||||
</template>
|
||||
</CanvasEditor>
|
||||
</div>
|
||||
<img src="" alt="" id="canvas-test-dom">
|
||||
</div>
|
||||
</template>
|
||||
<style>
|
||||
@@ -457,6 +459,13 @@
|
||||
height: 600px !important;
|
||||
z-index: 99999999;
|
||||
}
|
||||
#canvas-test-dom{
|
||||
position: fixed;
|
||||
z-index: 9999999999;
|
||||
top: 0;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
</style>
|
||||
<style scoped lang="less">
|
||||
* {
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
:enabledRedGreenMode="false"
|
||||
/>
|
||||
</div>
|
||||
<div class="btn">123
|
||||
<div class="btn">
|
||||
<div class="gallery_btn" @click="exportElement">Export</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -331,7 +331,6 @@ export default defineComponent({
|
||||
store.commit('DesignDetail/setCurrentDetailType',str)
|
||||
}
|
||||
const setClothes = async (list:any,str:string)=>{
|
||||
console.log(JSON.parse(JSON.stringify(list)))
|
||||
let clothesList:any = []
|
||||
if(detailData.isEditPattern.value == 'editSketch')await detailDom.canvasBox.submitBase64Data().then((rv)=>{
|
||||
detailData.selectDetail.sketchString = rv
|
||||
@@ -369,7 +368,6 @@ export default defineComponent({
|
||||
// }else if(isCurrent){
|
||||
|
||||
// }
|
||||
console.log(JSON.parse(JSON.stringify(detailData.selectDetail.color)),'=====')
|
||||
color = list[i].color?.rgba?.r != null?`${list[i].color.rgba.r} ${list[i].color.rgba.g} ${list[i].color.rgba.b}`:''
|
||||
gradient = list[i].gradient
|
||||
if((detailData.currentDetailType == 'sketch' && newData?.sketch) || detailData.isEditPattern.value == 'editSketch'){
|
||||
@@ -550,7 +548,7 @@ export default defineComponent({
|
||||
detailData.loadingShow = false
|
||||
});
|
||||
}
|
||||
const previwe = async ()=>{
|
||||
const previwe = async ()=>{
|
||||
detailData.loadingShow = true
|
||||
if((detailData.currentDetailType == 'models' && !detailData.isEditPattern.value) || (detailData.currentDetailType == 'sketch' && !detailData.isEditPattern.value) || detailData.isEditPattern.value == 'editSketch'){
|
||||
await getSubmitData('preview')
|
||||
@@ -565,11 +563,14 @@ export default defineComponent({
|
||||
}
|
||||
}else{
|
||||
//走画布合成图片并且直接分割
|
||||
if(detailData.isEditPattern.value !== 'canvasEditor'){
|
||||
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
|
||||
if(detailData.isEditPattern.value !== 'canvasEditor' && detailData.isEditPattern.value !== 'redGreenExample'){
|
||||
if(detailData.isEditPattern.value !== 'canvasEditor'){
|
||||
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
|
||||
}
|
||||
let otherData = await updateOtherLayers('single')
|
||||
await detailDom.canvasBox.updateOtherLayers(otherData)
|
||||
}
|
||||
|
||||
await detailDom.canvasBox.privewDetail()
|
||||
await upDateFrontBackSketch()
|
||||
await uploadSelectDetail()
|
||||
@@ -625,7 +626,7 @@ export default defineComponent({
|
||||
if(detailData.isEditPattern.value && detailData.isEditPattern.value == str){
|
||||
// await detailDom.canvasBox.saveCanvas()
|
||||
await (detailDom.canvasBox as any).privewDetail()
|
||||
if(detailData.isEditPattern.value == 'canvasEditor')await uploadSelectDetail()
|
||||
if(detailData.isEditPattern.value == 'canvasEditor' || detailData.isEditPattern.value == 'redGreenExample')await uploadSelectDetail()
|
||||
detailData.isEditPattern.value = ''
|
||||
}else{
|
||||
// if(detailData.isEditPattern.value && (str == 'canvasEditor' || str == 'redGreenExample')){
|
||||
@@ -759,7 +760,6 @@ export default defineComponent({
|
||||
const uploadSelectDetail = async ()=>{//更新选中的detail
|
||||
// await detailDom.canvasBox.saveCanvas()
|
||||
const allInfo = await (detailDom.canvasBox as any).getCanvasElement()
|
||||
console.log(allInfo)
|
||||
let color:any = {}
|
||||
if(allInfo.color?.color?.rgba || allInfo.color?.color?.gradient){
|
||||
let canvasColor = allInfo.color.color;
|
||||
@@ -781,8 +781,7 @@ export default defineComponent({
|
||||
color.gradient = canvasColor.gradient
|
||||
}
|
||||
}
|
||||
|
||||
if(detailData.isEditPattern.value == 'canvasEditor'){
|
||||
if(detailData.isEditPattern.value == 'canvasEditor' || detailData.isEditPattern.value == 'redGreenExample'){
|
||||
delete detailData.selectDetail.newDetail
|
||||
detailData.selectDetail.trims.prints = allInfo.trims || []
|
||||
detailData.selectDetail.printObject.prints = allInfo.prints || []
|
||||
@@ -805,7 +804,6 @@ export default defineComponent({
|
||||
if(detailData.currentDetailType == 'color'){
|
||||
detailData.detailLeftColorKey++
|
||||
}
|
||||
|
||||
}
|
||||
const canvasReload = async ()=>{
|
||||
if(detailData.isEditPattern.value){
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
is-edit
|
||||
:clothingImageUrl="selectDetail.path"
|
||||
:clothingImageUrl2="selectDetail.maskUrl || selectDetail.layersObject[0].maskUrl"
|
||||
:clothingMinIOPath="selectDetail.minIOPath"
|
||||
showFixedLayer
|
||||
:canvasJSON="canvasJSON"
|
||||
@canvasLoadJsonSuccess="canvasLoadJsonSuccess"
|
||||
@@ -52,9 +51,9 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mark_loading" v-show="isShowMark">
|
||||
<!-- <div class="mark_loading" v-show="isShowMark">
|
||||
<a-spin size="large" />
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
|
||||
</template>
|
||||
@@ -164,7 +163,6 @@ export default defineComponent({
|
||||
const privewDetail = async (oldSelectDetail = detailData.selectDetail)=>{
|
||||
// if(!detailDom.editCanvas)return
|
||||
return new Promise(async (res,reject)=>{
|
||||
console.log(detailDom.editCanvas)
|
||||
await detailDom.editCanvas.exportImage({
|
||||
isContainFixed:true,
|
||||
width:props.sketchSize.width,
|
||||
@@ -246,17 +244,27 @@ export default defineComponent({
|
||||
|
||||
|
||||
const frontBackChange = async (value:any)=>{
|
||||
let front = detailData.frontBack.front[detailData.imgDomIndex]
|
||||
let back = detailData.frontBack.back[detailData.imgDomIndex]
|
||||
store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
|
||||
await nextTick()
|
||||
if(!detailData.selectDetail.partialDesign.partialDesignPath && !detailData.selectDetail.partialDesign.partialDesignBase64){
|
||||
await privewDetail()
|
||||
}else{
|
||||
await detailDom.editCanvas.exportImage({
|
||||
isFrontBackUpdata: true,
|
||||
isContainFixed:true,
|
||||
width:props.sketchSize.width,
|
||||
height:props.sketchSize.height,
|
||||
}).then((rv)=>{
|
||||
if(detailData.selectDetail?.partialDesign)detailData.selectDetail.partialDesign.partialDesignBase64 = rv
|
||||
})
|
||||
}
|
||||
let full = detailData.selectDetail.partialDesign.partialDesignBase64 || detailData.selectDetail.partialDesign.partialDesignPath || detailData.selectDetail.path
|
||||
let size = {
|
||||
...detailData.canvasConfig,
|
||||
}
|
||||
store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
|
||||
segmentImage(value,full,size).then(async (rv)=>{
|
||||
let front = detailData.frontBack.front[detailData.imgDomIndex]
|
||||
let back = detailData.frontBack.back[detailData.imgDomIndex]
|
||||
if(!front?.oldImageUrl)front.oldImageUrl = front.imageUrl
|
||||
if(!front?.oldMaskUrl)front.oldMaskUrl = front.maskUrl
|
||||
if(!back?.oldImageUrl)back.oldImageUrl = back.imageUrl
|
||||
@@ -268,7 +276,6 @@ export default defineComponent({
|
||||
back.imageUrl = rv.targetBackUrl
|
||||
// store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
|
||||
})
|
||||
|
||||
}
|
||||
const editSketchCanvasInit = async (value:any)=>{
|
||||
detailData.canvasInstance = value
|
||||
|
||||
@@ -40,11 +40,29 @@ export default defineComponent({
|
||||
setup(props,{emit}) {
|
||||
const {t} = useI18n();
|
||||
const store = useStore();
|
||||
const updateCatecory = (arr)=>{
|
||||
arr.forEach((v:any) => {
|
||||
if(props.catecoryList)props.catecoryList.forEach((item:any) => {
|
||||
if(v.level2Type == item.value && !v.category){
|
||||
v.category=item.name
|
||||
v.categoryValue=item.value
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
const detailData = reactive({
|
||||
allBoardData:computed(()=>store.state.UploadFilesModule.allBoardData),
|
||||
currentList:{
|
||||
sketch:computed(()=>store.state.UploadFilesModule.allBoardData.sketchboardFiles),
|
||||
print:computed(()=>store.state.UploadFilesModule.allBoardData.printboardFiles),
|
||||
sketch:computed(()=>{
|
||||
let sketch = store.state.UploadFilesModule.allBoardData.sketchboardFiles
|
||||
updateCatecory(sketch)
|
||||
return sketch
|
||||
}),
|
||||
print:computed(()=>{
|
||||
let print = store.state.UploadFilesModule.allBoardData.printboardFiles
|
||||
updateCatecory(print)
|
||||
return print
|
||||
}),
|
||||
color:computed(()=>store.state.UploadFilesModule.allBoardData.colorBoards),
|
||||
models:computed(()=>store.state.Workspace.probjects.model),
|
||||
},
|
||||
|
||||
@@ -76,6 +76,7 @@ export default defineComponent({
|
||||
selectImgItem(data)
|
||||
return
|
||||
}
|
||||
data.id = id
|
||||
if(data?.imgUrl)data.url = data.imgUrl
|
||||
let value = {
|
||||
data,
|
||||
|
||||
@@ -273,7 +273,7 @@ export default defineComponent({
|
||||
minIOPath:data.minIOPath || data.originalUrl,
|
||||
path:data.url,
|
||||
priority:printIndex,
|
||||
scale,
|
||||
scale:editPrintElementData.stateOverallSingle == 'single'?scale:[1,1],
|
||||
globalCompositeOperation:'',
|
||||
}
|
||||
getItemPosition(item)
|
||||
@@ -300,7 +300,7 @@ export default defineComponent({
|
||||
// location = [item.pattern.style.left,item.pattern.style.top]
|
||||
}
|
||||
let value ={
|
||||
angle : item.pattern.transform.rotateZ,
|
||||
angle:0,
|
||||
// angle : !this.overallSingle ? 0:item.pattern.transform.rotateZ,
|
||||
location : location,
|
||||
priority:item.priority,
|
||||
@@ -312,7 +312,9 @@ export default defineComponent({
|
||||
ifSingle:!!item.ifSingle,
|
||||
globalCompositeOperation:'',
|
||||
}
|
||||
if(item.object)value.object = item.object
|
||||
if(item.object)value.object = item.object;
|
||||
value.angle = value.ifSingle?item.pattern.transform.rotateZ:item.angle
|
||||
|
||||
return value
|
||||
}
|
||||
if(editPrintElementData.printStyleList[props.type].single.length>0){
|
||||
@@ -359,7 +361,7 @@ export default defineComponent({
|
||||
//overall
|
||||
left = item.location[0] / editPrintElementData.sketchWH.scale[0]
|
||||
top = item.location[1] / editPrintElementData.sketchWH.scale[1]
|
||||
item.scale = [1,1]
|
||||
item.scale = item.scale || [1,1]
|
||||
}
|
||||
let pattern = {
|
||||
centers:{left:0,top:0},
|
||||
@@ -391,8 +393,8 @@ export default defineComponent({
|
||||
angle: 0,
|
||||
flipX: false,
|
||||
flipY: false,
|
||||
// blendMode: "multiply",
|
||||
blendMode: "source-over",
|
||||
blendMode: "multiply",
|
||||
// blendMode: "source-over",
|
||||
gapX: 0,
|
||||
gapY: 0,
|
||||
}
|
||||
@@ -915,6 +917,7 @@ export default defineComponent({
|
||||
}
|
||||
const inputFillAngle = (angle:any)=>{
|
||||
let arr = editPrintElementData.printStyleList[props.type].overall
|
||||
console.log(angle)
|
||||
arr[editPrintElementData.imgDomIndex].angle = angle
|
||||
editPrintElementDom.pingpuRef.updataList([
|
||||
{
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
:max="1000"
|
||||
:step="1"
|
||||
is-input
|
||||
:tipFormatter="(v) => `${scale.toFixed(0)}%`"
|
||||
:tipFormatter="(v) => `${Number(scale)?.toFixed(0)}%`"
|
||||
:value="scale"
|
||||
@input="inputFillScale"
|
||||
/>
|
||||
@@ -25,7 +25,7 @@
|
||||
<div class="repeat-setting-item">
|
||||
<span class="label">Gap X</span>
|
||||
<slider
|
||||
:min="0"
|
||||
:min="1"
|
||||
:max="1000"
|
||||
:step="1"
|
||||
is-input
|
||||
@@ -39,7 +39,7 @@
|
||||
<div class="repeat-setting-item">
|
||||
<span class="label">Gap Y</span>
|
||||
<slider
|
||||
:min="0"
|
||||
:min="1"
|
||||
:max="1000"
|
||||
:step="1"
|
||||
is-input
|
||||
@@ -84,7 +84,7 @@
|
||||
const scale = computed(() => {
|
||||
// let scaleValue = props.object?.scale/10;
|
||||
// return props.object?.scale/10;
|
||||
return props.object?.scale[0] * 100;
|
||||
return (props.object?.scale[0] * 100).toFixed(0);
|
||||
});
|
||||
const scalePrint = computed(() => {
|
||||
let index = sketchWH.value[0] > sketchWH.value[1]?0:1;
|
||||
|
||||
@@ -124,7 +124,11 @@ export default defineComponent({
|
||||
const handleResize = ()=>{
|
||||
clearTimeout(time)
|
||||
time = setTimeout(()=>{
|
||||
store.commit('DesignDetail/setDesignDetail',getDetailListData.designDetail)
|
||||
let data = {
|
||||
...getDetailListData.designDetail,
|
||||
fromType:'resize',
|
||||
}
|
||||
store.commit('DesignDetail/setDesignDetail',data)
|
||||
getDetailListDom.position?.updataPosition?.()
|
||||
getDetailListDom.modelNav?.setItemPosition?.()
|
||||
getDetailListDom.position?.updateRect?.()
|
||||
|
||||
@@ -189,11 +189,11 @@ export default defineComponent({
|
||||
}
|
||||
return { scaleX, scaleY, rotate };
|
||||
}
|
||||
const initMoveableForSelected = () => {
|
||||
const initMoveableForSelected = async (isDestroy:boolean = false) => {
|
||||
// 销毁旧的实例
|
||||
if(selectItem.imgDomIndex == -1)return
|
||||
if (moveableInstance.value) {
|
||||
moveableInstance.value.destroy();
|
||||
if (moveableInstance?.value?.destroy && !isDestroy) {
|
||||
moveableInstance?.value?.destroy();
|
||||
}
|
||||
|
||||
const selectedEl = elementRefs.value[selectItem.imgDomIndex];
|
||||
@@ -509,7 +509,7 @@ export default defineComponent({
|
||||
watch(()=>detailData.frontBack.front.length,(newValue,oldValue)=>{
|
||||
if(selectItem.selectDetail?.id)selectItem.imgDomIndex = detailData.frontBack.front.findIndex((item:any)=>item.id == selectItem.selectDetail?.id)
|
||||
setTimeout(()=>{
|
||||
initMoveableForSelected()
|
||||
initMoveableForSelected(oldValue == 0)
|
||||
},100)
|
||||
})
|
||||
const setRevocation = async ()=>{
|
||||
|
||||
@@ -1,142 +1,185 @@
|
||||
<template>
|
||||
<div class="eventsDetail_page" :class="{active:isScroll}">
|
||||
<div class="eventsDetail_title ">
|
||||
<div class="eventsDetail_page" :class="{ active: isScroll }">
|
||||
<div class="eventsDetail_title">
|
||||
<div class="modal_title_text" @click="setBack">
|
||||
<i class="fi fi-sr-left"></i>
|
||||
<div class="eventsDetail_title_text">{{ $t('event.back') }}</div>
|
||||
<div class="eventsDetail_title_text">{{ $t("event.back") }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="eventsDetail_content">
|
||||
<div class="eventsDetail_content_left">
|
||||
<fullScreenImg :src="eventsDetail.imgUrl" width="100%" :center="true"></fullScreenImg>
|
||||
<fullScreenImg
|
||||
:src="eventsDetail.imgUrl"
|
||||
width="100%"
|
||||
:center="true"
|
||||
></fullScreenImg>
|
||||
</div>
|
||||
<div class="eventsDetail_content_right">
|
||||
<div class="modal_title_text">
|
||||
<div class="modal_title_text modal_title_text-header flex space-between">
|
||||
<div>{{ eventsDetail.title }}</div>
|
||||
<div class="detail-btn" v-if="eventsDetail.id === 3" @click="openDetail">
|
||||
{{ $t("event.detail") }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal_title_text" v-for="item in eventsDetail.textList">
|
||||
<div
|
||||
class="modal_title_text content"
|
||||
v-for="item in eventsDetail.textList"
|
||||
:class="{ award: eventsDetail.id === 3 }"
|
||||
>
|
||||
<div class="eventsDetail_content_right_btn_box">
|
||||
<div class="eventsDetail_content_right_btn" v-for="buttonItem,buttonIndex in item?.button" @click="openButton(buttonItem,buttonIndex)">
|
||||
<div v-show="!loadingShow[buttonIndex]" class="started_btn">{{ buttonItem.text }}</div>
|
||||
<div v-show="loadingShow[buttonIndex]" class="started_btn"><i class="fi fi-br-loading"></i></div>
|
||||
<div
|
||||
class="eventsDetail_content_right_btn"
|
||||
v-for="(buttonItem, buttonIndex) in item?.button"
|
||||
@click="openButton(buttonItem, buttonIndex)"
|
||||
>
|
||||
<div v-show="!loadingShow[buttonIndex]" class="started_btn">
|
||||
{{ buttonItem.text }}
|
||||
</div>
|
||||
<div v-show="loadingShow[buttonIndex]" class="started_btn">
|
||||
<i class="fi fi-br-loading"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal_title_text_intro" v-for="introItem in item?.paragraph" :class="{active:introItem.display == 'flex'}" v-detailText="introItem.text">
|
||||
</div>
|
||||
<div
|
||||
class="modal_title_text_intro"
|
||||
v-for="introItem in item?.paragraph"
|
||||
:class="{ active: introItem.display == 'flex' }"
|
||||
v-detailText="introItem.text"
|
||||
></div>
|
||||
</div>
|
||||
<div class="tips" v-if="eventsDetail.tips">{{ eventsDetail.tips }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { LoadingOutlined } from "@ant-design/icons-vue";
|
||||
import { defineComponent,h ,toRefs,ref,reactive,onMounted,nextTick,provide,computed} from 'vue'
|
||||
import { LoadingOutlined } from "@ant-design/icons-vue"
|
||||
import {
|
||||
defineComponent,
|
||||
h,
|
||||
toRefs,
|
||||
ref,
|
||||
reactive,
|
||||
onMounted,
|
||||
nextTick,
|
||||
provide,
|
||||
computed
|
||||
} from "vue"
|
||||
// import RobotAssist from "@/component/HomePage/RobotAssist.vue";
|
||||
import { Https } from "@/tool/https";
|
||||
import { message, Upload, Modal } from "ant-design-vue";
|
||||
import fullScreenImg from '@/component/HomePage/fullScreenImg.vue'
|
||||
import { useRouter } from 'vue-router';
|
||||
import { useI18n } from "vue-i18n";
|
||||
import generalMenu from "@/component/HomePage/generalMenu.vue";
|
||||
import eventData from "@/assets/json/events.json";
|
||||
import eventDataCn from "@/assets/json/events_cn.json";
|
||||
import { useStore } from "vuex";
|
||||
import { Https } from "@/tool/https"
|
||||
import { message, Upload, Modal } from "ant-design-vue"
|
||||
import fullScreenImg from "@/component/HomePage/fullScreenImg.vue"
|
||||
import { useRouter } from "vue-router"
|
||||
import { useI18n } from "vue-i18n"
|
||||
import generalMenu from "@/component/HomePage/generalMenu.vue"
|
||||
import eventData from "@/assets/json/events.json"
|
||||
import eventDataCn from "@/assets/json/events_cn.json"
|
||||
import { useStore } from "vuex"
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
components: {
|
||||
generalMenu,
|
||||
fullScreenImg,
|
||||
},
|
||||
props:{
|
||||
isScroll:{
|
||||
type:Boolean,
|
||||
default:true,
|
||||
},
|
||||
fullScreenImg
|
||||
},
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const store = useStore();
|
||||
let filter:any = reactive({
|
||||
eventsDetail: {
|
||||
},
|
||||
getListDate:{
|
||||
"getLikePortfolio": 0,
|
||||
"getMyPortfolio": 0,
|
||||
page:1,
|
||||
size:10,
|
||||
},
|
||||
isShowMark:false,
|
||||
isNoData:false,//如果数据为空就不加载
|
||||
loadingShow:{},
|
||||
})
|
||||
let likeFile = (item:any,type:string) => {
|
||||
props: {
|
||||
isScroll: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
}
|
||||
let setBack = ()=>{
|
||||
router.go(-1);
|
||||
},
|
||||
setup() {
|
||||
const { t, locale } = useI18n()
|
||||
const router = useRouter()
|
||||
const store = useStore()
|
||||
let filter: any = reactive({
|
||||
eventsDetail: {},
|
||||
getListDate: {
|
||||
getLikePortfolio: 0,
|
||||
getMyPortfolio: 0,
|
||||
page: 1,
|
||||
size: 10
|
||||
},
|
||||
isShowMark: false,
|
||||
isNoData: false, //如果数据为空就不加载
|
||||
loadingShow: {}
|
||||
})
|
||||
let likeFile = (item: any, type: string) => {}
|
||||
let setBack = () => {
|
||||
router.go(-1)
|
||||
// router.push('/home/events')
|
||||
}
|
||||
let openButton = (data:any,index:number)=>{
|
||||
if(filter.loadingShow[index]){
|
||||
}
|
||||
let openButton = (data: any, index: number) => {
|
||||
if (filter.loadingShow[index]) {
|
||||
return
|
||||
}
|
||||
filter.loadingShow[index] = true
|
||||
Https.axiosGet(data.https).then(
|
||||
(rv: any) => {
|
||||
if(rv){
|
||||
Https.axiosGet(data.https)
|
||||
.then((rv: any) => {
|
||||
if (rv) {
|
||||
message.success(data.success)
|
||||
filter.loadingShow[index] = false
|
||||
}
|
||||
}
|
||||
).catch(res=>{
|
||||
filter.loadingShow[index] = false
|
||||
});
|
||||
})
|
||||
.catch((res) => {
|
||||
filter.loadingShow[index] = false
|
||||
})
|
||||
}
|
||||
onMounted (()=>{
|
||||
const { t, locale } = useI18n();
|
||||
const currentLocale = locale.value;
|
||||
let eventLangData:any
|
||||
if(currentLocale == 'ENGLISH'){
|
||||
const openDetail = () => {
|
||||
let language = locale.value === "ENGLISH" ? "en" : "cn"
|
||||
let url = `https://aida-global-design-awards.com.hk/${language}`
|
||||
// 如果是dev环境把域名换成http://192.168.31.198
|
||||
|
||||
if (import.meta.env.VITE_APP_BASE_URL === "https://develop.api.aida.com.hk") {
|
||||
url += "?env=dev"
|
||||
}
|
||||
window.open(url, "_blank")
|
||||
|
||||
// router.push("/award/index")
|
||||
}
|
||||
onMounted(() => {
|
||||
const currentLocale = locale.value
|
||||
let eventLangData: any
|
||||
if (currentLocale == "ENGLISH") {
|
||||
eventLangData = eventData
|
||||
}else{
|
||||
} else {
|
||||
eventLangData = eventDataCn
|
||||
}
|
||||
eventLangData.eventsItem.forEach((item:any)=>{
|
||||
if(item.id == router.currentRoute.value.query.eventId){
|
||||
filter.eventsDetail = item;
|
||||
eventLangData.eventsItem.forEach((item: any) => {
|
||||
if (item.id == router.currentRoute.value.query.eventId) {
|
||||
filter.eventsDetail = item
|
||||
}
|
||||
})
|
||||
})
|
||||
return {
|
||||
return {
|
||||
...toRefs(filter),
|
||||
likeFile,
|
||||
setBack,
|
||||
openButton,
|
||||
}
|
||||
},
|
||||
directives:{
|
||||
detailText:{
|
||||
mounted (el,binding) {
|
||||
openDetail
|
||||
}
|
||||
},
|
||||
directives: {
|
||||
detailText: {
|
||||
mounted(el, binding) {
|
||||
el.innerHTML = binding.value
|
||||
}
|
||||
}
|
||||
},
|
||||
async mounted(){
|
||||
|
||||
},
|
||||
async mounted() {}
|
||||
})
|
||||
</script>
|
||||
<style lang="less">
|
||||
.eventsDetail_page {
|
||||
min-height: 100%;
|
||||
width: 100%;
|
||||
width: 100%;
|
||||
padding: 0 6rem;
|
||||
padding-top: 5rem;
|
||||
|
||||
&.active{
|
||||
&.active {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
.eventsDetail_content{
|
||||
.eventsDetail_content {
|
||||
overflow-y: auto;
|
||||
width: 100%;
|
||||
}
|
||||
@@ -146,7 +189,7 @@ export default defineComponent({
|
||||
min-height: auto;
|
||||
padding-bottom: 10rem;
|
||||
}
|
||||
.eventsDetail_title{
|
||||
.eventsDetail_title {
|
||||
display: flex;
|
||||
padding: 2rem 0rem;
|
||||
align-items: center;
|
||||
@@ -154,21 +197,21 @@ export default defineComponent({
|
||||
top: 0;
|
||||
z-index: 222;
|
||||
background: #fff;
|
||||
.modal_title_text{
|
||||
.modal_title_text {
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.modal_title_text:hover .eventsDetail_title_text{
|
||||
.modal_title_text:hover .eventsDetail_title_text {
|
||||
text-decoration: underline;
|
||||
}
|
||||
i{
|
||||
i {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
}
|
||||
.eventsDetail_content{
|
||||
.eventsDetail_content {
|
||||
border-top: 1px solid #f0f0f0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
@@ -176,65 +219,100 @@ export default defineComponent({
|
||||
@media (max-width: 768px) {
|
||||
flex-direction: column;
|
||||
}
|
||||
.eventsDetail_content_left,.eventsDetail_content_right{
|
||||
.eventsDetail_content_left,
|
||||
.eventsDetail_content_right {
|
||||
width: 50%;
|
||||
@media (max-width: 768px) {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
.eventsDetail_content_left{
|
||||
.eventsDetail_content_left {
|
||||
width: 40%;
|
||||
max-height: 60rem;
|
||||
@media (max-width: 768px) {
|
||||
width: 100%;
|
||||
}
|
||||
.ant-image{
|
||||
.ant-image {
|
||||
// height: auto;
|
||||
height: 100%;
|
||||
}
|
||||
.eventsDetail_content_left_img{
|
||||
.eventsDetail_content_left_img {
|
||||
width: 100%;
|
||||
cursor: zoom-in;
|
||||
}
|
||||
}
|
||||
.eventsDetail_content_right{
|
||||
.modal_title_text{
|
||||
letter-spacing: .4rem;
|
||||
.eventsDetail_content_right {
|
||||
.modal_title_text {
|
||||
letter-spacing: 0.3rem;
|
||||
font-weight: 600;
|
||||
.modal_title_text_intro{
|
||||
&-header {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: flex-end;
|
||||
justify-content: space-between;
|
||||
gap: 1rem;
|
||||
> div:first-child {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
}
|
||||
.modal_title_text_intro {
|
||||
display: block;
|
||||
&.active{
|
||||
&.active {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
li{
|
||||
li {
|
||||
width: 48%;
|
||||
|
||||
}
|
||||
em{
|
||||
em {
|
||||
// font-family: auto;
|
||||
}
|
||||
a{
|
||||
a {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
.eventsDetail_content_right_btn_box{
|
||||
.eventsDetail_content_right_btn_box {
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
.eventsDetail_content_right_btn{
|
||||
}
|
||||
// .eventsDetail_content_right_btn {
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
.modal_title_text:last-child{
|
||||
}
|
||||
.modal_title_text:last-child::after{
|
||||
// .modal_title_text:last-child {
|
||||
// }
|
||||
.modal_title_text:last-child::after {
|
||||
content: "";
|
||||
display: block;
|
||||
border-top: 3px solid;
|
||||
height: 6rem;
|
||||
}
|
||||
.modal_title_text.award:last-child:after {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
.detail-btn {
|
||||
// width: 11rem;
|
||||
padding: 0 1.4rem;
|
||||
height: 4rem;
|
||||
line-height: 4rem;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
border-radius: 2rem;
|
||||
background-color: #000;
|
||||
font-size: 1.4rem;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
.tips{
|
||||
color: rgba(0, 0, 0, 0.45);
|
||||
font-size: var(--aida-fsize1-4);
|
||||
font-weight: 400;
|
||||
letter-spacing: 0.3rem;
|
||||
}
|
||||
.modal_title_text.content.award{
|
||||
line-height: 1.3;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -531,7 +531,7 @@ export default defineComponent({
|
||||
}
|
||||
)
|
||||
const setSpeed = (item: any) => {
|
||||
speed.speedData = item
|
||||
speed.speedData = {...item}
|
||||
}
|
||||
onMounted(() => {
|
||||
if (props.msg == 'Sketchboard') {
|
||||
@@ -734,7 +734,9 @@ export default defineComponent({
|
||||
let maxImg = 8
|
||||
if (this.type_.type2 == 'Sketchboard') {
|
||||
maxImg = 20
|
||||
}
|
||||
}else if(this.type_.type2 == 'Printboard'){
|
||||
maxImg = 16
|
||||
}
|
||||
let parent: any = this.$parent
|
||||
if (parent.isUseGenerate) {
|
||||
// parent.useGenerate.designType = 'collection'
|
||||
@@ -853,9 +855,7 @@ export default defineComponent({
|
||||
level2Type = this.sketchboardList?.[0]?.categoryValue
|
||||
? this.sketchboardList[0].categoryValue
|
||||
: ''
|
||||
if (this.workspace.styleName) {
|
||||
sloganText = `${this.workspace.styleName},${sloganText}`
|
||||
}
|
||||
sloganText = `${this.workspace.styleName || 'all'},${sloganText}`
|
||||
} else if (this.upload.level1Type == 'Printboard') {
|
||||
level2Type = this.scene?.value
|
||||
if (level2Type == 'Slogan' && this.searchPictureName == '') {
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
:get-container="() => $refs.upgradePlan"
|
||||
width="35%"
|
||||
height="auto"
|
||||
zIndex="9999999"
|
||||
:maskClosable="false"
|
||||
:centered="true"
|
||||
:closable="false"
|
||||
|
||||
@@ -940,7 +940,8 @@ export default defineComponent({
|
||||
// padding: 3rem 0;
|
||||
justify-content: space-between;
|
||||
position: relative;
|
||||
user-select:none
|
||||
user-select:none;
|
||||
flex-direction: row;
|
||||
&.active{
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
</div>
|
||||
<div class="payment">
|
||||
<div class="allocation">
|
||||
<div class="selectType">
|
||||
<!-- <div class="selectType">
|
||||
<div class="text">{{ $t('Renew.Payment') }}:</div>
|
||||
<label>
|
||||
<input
|
||||
@@ -227,7 +227,7 @@
|
||||
/>
|
||||
{{ $t('Renew.Alipay') }}
|
||||
</label>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="gallery_btn gallery_btn_radius" @click="payment">
|
||||
{{ $t('upgradePlan.Continue') }}
|
||||
|
||||
@@ -77,17 +77,10 @@ export default defineComponent({
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%,-50%);
|
||||
width: 80%;
|
||||
height: auto;
|
||||
max-height: 80vh;
|
||||
position: absolute;
|
||||
width: max-content;
|
||||
video{
|
||||
width: 100%;
|
||||
max-height: 80vh;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
width: max-content;
|
||||
max-height:80vh;
|
||||
max-width:80vw;
|
||||
}
|
||||
.general_video_btn{
|
||||
color: #fff;
|
||||
|
||||
@@ -517,6 +517,7 @@ defineExpose({
|
||||
/* 图片网格 */
|
||||
.image-grid {
|
||||
display: grid;
|
||||
align-content: start;
|
||||
overflow-y: auto;
|
||||
grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
|
||||
gap: 16px;
|
||||
|
||||
@@ -379,6 +379,7 @@ export default defineComponent({
|
||||
setup(props,{emit}) {
|
||||
const {t,locale} = useI18n()
|
||||
const store = useStore();
|
||||
const route = useRoute()
|
||||
const editDesignType = reactive({
|
||||
selectProbject:computed(()=>{
|
||||
return store.state.Workspace.probjects
|
||||
@@ -624,6 +625,7 @@ export default defineComponent({
|
||||
collItemSize.collTime = setTimeout(()=>{
|
||||
nextTick(()=>{
|
||||
let parentWidth = likeItemDom.value.parentElement.offsetWidth
|
||||
if(parentWidth == 0)return
|
||||
collItemSize.widthValue.value = collItemSize.widthValue.value == -1?100:collItemSize.widthValue.value
|
||||
collItemSize.widthValue.value = collItemSize.widthValue.value > parentWidth?parentWidth:collItemSize.widthValue.value
|
||||
collItemSize.collValue = Math.floor(parentWidth / collItemSize.widthValue.value)
|
||||
@@ -634,7 +636,6 @@ export default defineComponent({
|
||||
|
||||
collItemSize.collStyle.width = (collItemDom.value.offsetWidth - 30) / 3 * collItemSize.scale[0] + 'px'
|
||||
collItemSize.collStyle.height = (collItemDom.value.offsetWidth - 30) / 3 * collItemSize.scale[1] + 'px'
|
||||
|
||||
collItemSize.likeStyle.width = collItemSize.itemStyle.width + 'px'
|
||||
collItemSize.likeStyle.height = collItemSize.itemStyle.height + 'px'
|
||||
let elArr = likeItemDom.value.children
|
||||
@@ -744,6 +745,12 @@ export default defineComponent({
|
||||
"userLikeId": likeItem.id
|
||||
}
|
||||
arrData.push(obj)
|
||||
designData.selectLikeDesign.forEach((v:any)=>{
|
||||
if(v.id === likeItem.id){
|
||||
v.oldSort = v.sort
|
||||
v.sort = likeItem.sort
|
||||
}
|
||||
})
|
||||
})
|
||||
let data = {
|
||||
"userLikeGroupId": userGroupId.value,
|
||||
@@ -1303,9 +1310,9 @@ export default defineComponent({
|
||||
})
|
||||
return
|
||||
}
|
||||
const parents = designData.selectLikeDesign.filter((item:any) => item.resultType === 'Design');
|
||||
const parents = designData.selectLikeDesign.filter((item:any) => item.resultType === 'Design').filter((item:any) => likeDesignCollectionList.value.some((v:any) => (v.id === item.id)));
|
||||
parents.map((parent:any) => {
|
||||
parent.sort = parent.oldSort||parent.sort
|
||||
parent.sort = likeDesignCollectionList.value.find((v:any) => v.id === parent.id)?.sort || parent.oldSort||parent.sort
|
||||
delete parent.oldSort
|
||||
return {
|
||||
...parent,
|
||||
@@ -1532,7 +1539,7 @@ export default defineComponent({
|
||||
this.observerData.time = setTimeout(()=>{
|
||||
|
||||
this.setSystemDesigner(0)
|
||||
this.setDesignItemStyle()
|
||||
// this.setDesignItemStyle()
|
||||
},100)
|
||||
// const { width } = entry.contentRect;
|
||||
}
|
||||
@@ -1930,6 +1937,7 @@ export default defineComponent({
|
||||
this.disLikeLoading = true;
|
||||
Https.axiosPost(Https.httpUrls.designDislike, data)
|
||||
.then((rv: any) => {
|
||||
console.log(rv)
|
||||
if (rv) {
|
||||
this.recycleDomHidden = true
|
||||
this.store.commit("addDesignCollectionList", [design]);
|
||||
|
||||
@@ -271,7 +271,7 @@ export default defineComponent({
|
||||
allCollectionStr.forEach((itemStr:any)=>{
|
||||
let list = [] as any
|
||||
allCollection[itemStr.value].forEach((imgItem)=>{
|
||||
list.push({url:imgItem.url || imgItem.imgUrl})
|
||||
list.push({url:imgItem?.url || imgItem?.imgUrl})
|
||||
})
|
||||
let obj = {
|
||||
value:itemStr.value,
|
||||
|
||||
@@ -196,9 +196,9 @@ export default defineComponent({
|
||||
type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
|
||||
httpType:rv.process,//项目类型
|
||||
ageGroup:rv.workspaceVO?.ageGroup,
|
||||
style:rv.workspaceVO?.style,
|
||||
styleId:rv.workspaceVO?.styleId,
|
||||
styleName:rv.workspaceVO?.styleName,
|
||||
style:rv.workspaceVO?.style || '',
|
||||
styleId:rv.workspaceVO?.styleId || null,
|
||||
styleName:rv.workspaceVO?.styleName || '',
|
||||
sex:rv.workspaceVO?.sex,
|
||||
userBrandDnaImg:rv.workspaceVO?.userBrandDnaImg,
|
||||
userBrandDnaName:rv.workspaceVO?.userBrandDnaName,
|
||||
|
||||
@@ -94,9 +94,9 @@ export default defineComponent({
|
||||
type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
|
||||
httpType:rv.process,//项目类型
|
||||
ageGroup:rv.workspaceVO.ageGroup,
|
||||
style:rv.workspaceVO.style,
|
||||
styleId:rv.workspaceVO.styleId,
|
||||
styleName:rv.workspaceVO.styleName,
|
||||
style:rv.workspaceVO.style || '',
|
||||
styleId:rv.workspaceVO.styleId || null,
|
||||
styleName:rv.workspaceVO.styleName || '',
|
||||
sex:rv.workspaceVO.sex,
|
||||
userBrandDnaImg:rv.workspaceVO.userBrandDnaImg,
|
||||
userBrandDnaName:rv.workspaceVO.userBrandDnaName,
|
||||
|
||||
@@ -41,10 +41,10 @@
|
||||
<div class="center">{{ selectObject?.styleName?selectObject?.styleName:$t('Header.All') }}</div>
|
||||
<div class="gallery_btn" @click="setStyle">{{ $t('Habit.Select') }}</div>
|
||||
</div>
|
||||
<div class="style brand marginBottom">
|
||||
<!-- <div class="style brand marginBottom">
|
||||
<div class="text">{{$t('Habit.Brand')}}:</div>
|
||||
<div class="gallery_btn" @click="setBrandDNA">{{ $t('Habit.Select') }}</div>
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="brandImg" v-if="selectObject.userBrandDna"><img :src="selectObject.userBrandDnaImg"></div>
|
||||
<div class="brandDNAStrenght marginBottom" v-if="selectObject.userBrandDna">
|
||||
<div class="text" style="font-size: 1.6rem;">
|
||||
@@ -179,9 +179,9 @@ export default defineComponent({
|
||||
dataDom.brandDNA.init(data.selectObject);
|
||||
}
|
||||
const setWorkspaceStyle = (value:any)=>{
|
||||
data.selectObject.styleName = value.name
|
||||
data.selectObject.style = value.value
|
||||
data.selectObject.styleId = value.id
|
||||
data.selectObject.styleName = value.name || ''
|
||||
data.selectObject.style = value.value || ''
|
||||
data.selectObject.styleId = value.id || null
|
||||
// store.commit('setProbject',data)
|
||||
}
|
||||
const setWorkspaceBrandDNA = (value:any)=>{
|
||||
@@ -238,9 +238,9 @@ export default defineComponent({
|
||||
// type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
|
||||
// httpType:rv.process,//项目类型
|
||||
ageGroup:rv.workspaceVO?.ageGroup,
|
||||
style:rv.workspaceVO?.style,
|
||||
styleId:rv.workspaceVO?.styleId,
|
||||
styleName:rv.workspaceVO?.styleName,
|
||||
style:rv.workspaceVO?.style || '',
|
||||
styleId:rv.workspaceVO?.styleId || null,
|
||||
styleName:rv.workspaceVO?.styleName || '',
|
||||
sex:rv.workspaceVO?.sex,
|
||||
userBrandDnaImg:rv.workspaceVO?.userBrandDnaImg,
|
||||
userBrandDnaName:rv.workspaceVO?.userBrandDnaName,
|
||||
|
||||
@@ -352,7 +352,8 @@ export default defineComponent({
|
||||
props: {
|
||||
isDesignPage: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
default: false,
|
||||
required:false
|
||||
},
|
||||
source: {
|
||||
type: String,
|
||||
@@ -773,7 +774,7 @@ export default defineComponent({
|
||||
data.lastSelectImg = res.data
|
||||
}
|
||||
}
|
||||
// 同步尾帧文件列表到全局 store
|
||||
// 同步尾帧文件列表到全局 store(使用专门的 lastFrameList)
|
||||
store.commit('setPoseTransferLastFrameList', {
|
||||
str: 'set',
|
||||
list: [file]
|
||||
@@ -989,6 +990,7 @@ export default defineComponent({
|
||||
if (data.lastSelectImg?.id === item.id) {
|
||||
data.lastSelectImg = {}
|
||||
}
|
||||
// 使用专门的 lastFrameList mutation 清空列表
|
||||
store.commit('setPoseTransferLastFrameList')
|
||||
} else {
|
||||
// 如果删除的是当前选中的首帧,清空选中状态
|
||||
@@ -1176,10 +1178,10 @@ export default defineComponent({
|
||||
firstFrameList.value = store.state.HomeStoreModule.uploadElement.filter(
|
||||
item => item.frameType === 'first'
|
||||
)
|
||||
|
||||
lastFrameList.value = store.state.HomeStoreModule.uploadElement.filter(
|
||||
item => item.frameType === 'last'
|
||||
)
|
||||
// 注意:尾帧通过专门的 watch (lastFrameList) 监听,不需要从这里过滤
|
||||
// lastFrameList.value = store.state.HomeStoreModule.uploadElement.filter(
|
||||
// item => item.frameType === 'last'
|
||||
// )
|
||||
// 更新 showFirstFrameList 中项的选中状态
|
||||
showFirstFrameList.value.forEach((listItem: any) => {
|
||||
if (listItem.id == data.selectImg.id) {
|
||||
|
||||
@@ -102,9 +102,9 @@ setup(props,{emit}) {
|
||||
// if(habitSetStyleData.styleList.length == 0){
|
||||
// getStyleList()
|
||||
// }
|
||||
oldDataId = data.styleId
|
||||
habitSetStyleData.selectStyle.id = data.styleId
|
||||
habitSetStyleData.selectStyle.name = data.styleName
|
||||
oldDataId = data.styleId || null
|
||||
habitSetStyleData.selectStyle.id = data.styleId || null
|
||||
habitSetStyleData.selectStyle.name = data.styleName || ''
|
||||
// habitSetStyleData.selectStyleId = 'feng2'
|
||||
}
|
||||
let setCover = (item:any)=>{
|
||||
@@ -258,6 +258,7 @@ methods: {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
.content_bottom_item:nth-child(4n){
|
||||
|
||||
3582
src/lang/cn.ts
3582
src/lang/cn.ts
File diff suppressed because it is too large
Load Diff
213
src/lang/en.ts
213
src/lang/en.ts
@@ -133,8 +133,7 @@ export default {
|
||||
UploadOpenimage: 'Upload/Open image',
|
||||
jsContent1:
|
||||
"Have you saved your canvas content? If not, please click 'Save' before closing.",
|
||||
jsContent2:
|
||||
'We only provide super-resolution capabilities for printboard images.',
|
||||
jsContent2: 'We only provide super-resolution capabilities for printboard images.',
|
||||
jsContent3: 'Your points are less than one SR',
|
||||
jsContent4: 'Your points balance is insufficient',
|
||||
jsContent5:
|
||||
@@ -556,8 +555,7 @@ export default {
|
||||
inputContent1: 'Input prompt',
|
||||
GeneratePrint: 'Pattern',
|
||||
maximumLength: 'The entered content exceeds the maximum length.',
|
||||
PatternTitle:
|
||||
'Generates repeatable designs that can be fully tiled across garments.',
|
||||
PatternTitle: 'Generates repeatable designs that can be fully tiled across garments.',
|
||||
LogoTitle:
|
||||
'Creates standalone graphic designs that can be placed individually or tiled.',
|
||||
SloganTitle:
|
||||
@@ -1006,15 +1004,21 @@ export default {
|
||||
subscriptionRenewal: 'There are no subscription plans with automatic renewal.'
|
||||
},
|
||||
guide: {
|
||||
guide1: "You can personalize your design settings right here in the <strong>Workspace</strong>, including choosing to design for men's or women's wear, as well as selecting the mannequin to use for your creations.",
|
||||
guide1:
|
||||
"You can personalize your design settings right here in the <strong>Workspace</strong>, including choosing to design for men's or women's wear, as well as selecting the mannequin to use for your creations.",
|
||||
guide2: "Select the apparel type you'd like to work on.",
|
||||
guide3: 'Change the mannequin here.',
|
||||
guide4: 'You can currently select a mannequin from our system library. Later, you can also choose from the user library after registering your own mannequin.',
|
||||
guide4:
|
||||
'You can currently select a mannequin from our system library. Later, you can also choose from the user library after registering your own mannequin.',
|
||||
guide5: 'Begin your creative journey here. ',
|
||||
guide6: 'For the Moodboard, Printboard, or Sketchboard, we provide three different sourcing methods to add images. The first option is <strong>Upload</strong>, allowing you to <stront>upload</stront> directly from your local device.',
|
||||
guide7: "The second method is to select from your <strong>Library</strong>. <br> You might notice that your library page is currently empty; there's no need to worry. All the images you upload will be automatically added to your library. In the future, you won't have to upload each time—you can simply choose from your library instead.",
|
||||
guide8: 'The third method is to <strong>Generate</strong> images using the latest Image Generation technology.',
|
||||
guide9: 'Enter keywords that capture the mood you wish to express and then click the <strong>Low Quality</strong> button.',
|
||||
guide6:
|
||||
'For the Moodboard, Printboard, or Sketchboard, we provide three different sourcing methods to add images. The first option is <strong>Upload</strong>, allowing you to <stront>upload</stront> directly from your local device.',
|
||||
guide7:
|
||||
"The second method is to select from your <strong>Library</strong>. <br> You might notice that your library page is currently empty; there's no need to worry. All the images you upload will be automatically added to your library. In the future, you won't have to upload each time—you can simply choose from your library instead.",
|
||||
guide8:
|
||||
'The third method is to <strong>Generate</strong> images using the latest Image Generation technology.',
|
||||
guide9:
|
||||
'Enter keywords that capture the mood you wish to express and then click the <strong>Low Quality</strong> button.',
|
||||
guide10: 'Select two images for your moodboard.',
|
||||
guide11: 'Click here to layout your moodboard.',
|
||||
guide12: 'Click here for next step.',
|
||||
@@ -1064,8 +1068,7 @@ export default {
|
||||
guide52: 'Click here to generate the product image.',
|
||||
guide53: 'Click this button to apply more tools to the product image. ',
|
||||
guide54: 'We can adjust the lighting and background of this image. ',
|
||||
guide55:
|
||||
'Click here to generate a product image with lighting from the right side.',
|
||||
guide55: 'Click here to generate a product image with lighting from the right side.',
|
||||
guide56: 'If you like this result, click the little heart to save it.',
|
||||
guide57: 'Click here to go to the export page. ',
|
||||
guide58: 'You can share your work to the gallery or export to your local device.',
|
||||
@@ -1229,8 +1232,7 @@ export default {
|
||||
touchDevicePrompts_2: 'Double-click an element to quickly enter edit mode.',
|
||||
touchDevicePrompts_3: 'Two-finger drag to pan the canvas.',
|
||||
touchDevicePrompts_4: 'Pinch to zoom.',
|
||||
touchDevicePrompts_5:
|
||||
"Two-finger tap to display the element's transform handles.",
|
||||
touchDevicePrompts_5: "Two-finger tap to display the element's transform handles.",
|
||||
touchDevicePrompts_6: 'Three-finger swipe left or right to undo/redo.',
|
||||
TheDetectedPlatform: 'Guide Detected Platform',
|
||||
BasicOperations: 'Basic Operations',
|
||||
@@ -1361,8 +1363,7 @@ export default {
|
||||
furCurvature: 'Curvature',
|
||||
furCurvatureDescription: 'Control the degree of hair curvature',
|
||||
randomizeDirection: 'Random Cirection',
|
||||
randomizeDirectionDescription:
|
||||
'Whether to randomize the direction of hair growth',
|
||||
randomizeDirectionDescription: 'Whether to randomize the direction of hair growth',
|
||||
//水墨
|
||||
InkSettings: 'Ink painting settings',
|
||||
InkAmount: 'The amount of ink',
|
||||
@@ -1388,8 +1389,7 @@ export default {
|
||||
//马克笔
|
||||
MarkerSettings: 'Marker Settings',
|
||||
MarkerWidth: 'Brush stroke width',
|
||||
MarkerWidthDescription:
|
||||
'Control the width of the brush strokes with the marker pen',
|
||||
MarkerWidthDescription: 'Control the width of the brush strokes with the marker pen',
|
||||
MarkerCapStyle: 'Writing style',
|
||||
MarkerCapStyleDescription: 'Set the shape of the marker pen tip',
|
||||
MarkerCapStyleRound: 'Round',
|
||||
@@ -1520,18 +1520,15 @@ export default {
|
||||
CompositeMultiply: 'Multiply',
|
||||
CompositeMultiplyTip: 'Multiply: Darken the image',
|
||||
CompositeColorBurn: 'Color Burn',
|
||||
CompositeColorBurnTip:
|
||||
'Color Burn: Increase contrast and darken the bottom color',
|
||||
CompositeColorBurnTip: 'Color Burn: Increase contrast and darken the bottom color',
|
||||
CompositeLighten: 'Lighten',
|
||||
CompositeLightenTip: 'Lighten: Take the brightest color',
|
||||
CompositeScreen: 'Screen',
|
||||
CompositeScreenTip: 'Screen: Lighten the image',
|
||||
CompositeColorDodge: 'Color Dodge',
|
||||
CompositeColorDodgeTip:
|
||||
'Color Dodge: Reduce contrast and lighten the bottom color',
|
||||
CompositeColorDodgeTip: 'Color Dodge: Reduce contrast and lighten the bottom color',
|
||||
CompositeLighter: 'Color Dodge (Add)',
|
||||
CompositeLighterTip:
|
||||
'Color Dodge (Add): Add the brightness of the overlapping parts',
|
||||
CompositeLighterTip: 'Color Dodge (Add): Add the brightness of the overlapping parts',
|
||||
CompositeOverlay: 'Overlay',
|
||||
CompositeOverlayTip: 'Overlay: Highlight effect',
|
||||
CompositeSoftLight: 'Soft Light',
|
||||
@@ -1586,7 +1583,8 @@ export default {
|
||||
LiquefactionTool: 'Liquefaction Tool'
|
||||
},
|
||||
event: {
|
||||
back: 'Back'
|
||||
back: 'Back',
|
||||
detail: 'View Details'
|
||||
},
|
||||
admin: {
|
||||
allUser: 'All User',
|
||||
@@ -1668,7 +1666,8 @@ export default {
|
||||
ForgotPassword: '忘记密码',
|
||||
Welcome: 'Welcome to',
|
||||
AiDA: 'AiDA',
|
||||
Slogan: 'AiDA, a first-to-market technology that empowers fashion designers, based on their creative inspirations, to work with AI to create original designs.',
|
||||
Slogan:
|
||||
'AiDA, a first-to-market technology that empowers fashion designers, based on their creative inspirations, to work with AI to create original designs.',
|
||||
LoginMethod: 'Continue with one of these:',
|
||||
Individual: 'Individual',
|
||||
Academic: 'Academic',
|
||||
@@ -1709,8 +1708,7 @@ export default {
|
||||
IncorrectEmail: 'The email format is incorrect',
|
||||
IncorrectEmailFormat: 'The email format is incorrect',
|
||||
CompleteVerificationCode: 'Please enter the complete verification code.',
|
||||
PleaseEnterYourAccountNumberOrPassword:
|
||||
'Please enter your account number or password'
|
||||
PleaseEnterYourAccountNumberOrPassword: 'Please enter your account number or password'
|
||||
},
|
||||
LoginSchool: {
|
||||
School: 'School',
|
||||
@@ -1741,8 +1739,7 @@ export default {
|
||||
IncorrectEmail: 'The email format is incorrect',
|
||||
IncorrectEmailFormat: 'The email format is incorrect',
|
||||
CompleteVerificationCode: 'Please enter the complete verification code.',
|
||||
PleaseEnterYourAccountNumberOrPassword:
|
||||
'Please enter your account number or password'
|
||||
PleaseEnterYourAccountNumberOrPassword: 'Please enter your account number or password'
|
||||
},
|
||||
LoginEnterprise: {
|
||||
Enterprise: 'Enterprise',
|
||||
@@ -1772,160 +1769,6 @@ export default {
|
||||
IncorrectEmail: 'The email format is incorrect',
|
||||
IncorrectEmailFormat: 'The email format is incorrect',
|
||||
CompleteVerificationCode: 'Please enter the complete verification code.',
|
||||
PleaseEnterYourAccountNumberOrPassword:
|
||||
'Please enter your account number or password'
|
||||
},
|
||||
AwardsPage: {
|
||||
submitApplication: 'Submit your Application',
|
||||
applicationDeadline: 'Application Deadline:15th July 2026',
|
||||
howToApply: 'How to Apply',
|
||||
stepByStep: 'Step by step',
|
||||
step1Title: 'Step 1. Become an\nAiDA Subscriber',
|
||||
step1Desc:
|
||||
'All applicants must be active\nAiDA subscribers at the time of\nsubmission. You may subscribe\nunder either a monthly or yearly plan.',
|
||||
step2Title: 'Step 2. Create Your Design Using AiDA',
|
||||
step2Desc:
|
||||
'Applicants must create their\ndesigns exclusively using the\nAiDA platform. ',
|
||||
step2ListTitle: 'Your work should clearly demonstrate:',
|
||||
step2List: [
|
||||
'· How AiDA is used as a creative tool',
|
||||
'· Your design concept and creative direction',
|
||||
'· The intergration of AI and human creativity'
|
||||
],
|
||||
step3Title: 'Step 3. Prepare Your Submission',
|
||||
processVideo: 'Process Video',
|
||||
processVideoDesc:
|
||||
'Include a screen‑recorded video\nyour creative process\nusing AiDA.',
|
||||
videoRequirements: 'Video requirements:',
|
||||
videoFormat: 'Format: MP4',
|
||||
videoResolution: 'Resolution: 1080×1920 px',
|
||||
videoDuration: 'Duration: Maximum 1 minute',
|
||||
videoSize: 'File size: Maximum 20MB',
|
||||
fileName: 'File Name',
|
||||
fileNameDesc: 'AiDAGlobalDesignAward\n2026_[Your Full Name]',
|
||||
designPortfolio: 'Design Portfolio(PDF)',
|
||||
submitPdf: 'Submit one single PDF file that includes:',
|
||||
requiredStructure: 'Required structure:',
|
||||
pdfDesignTitle: 'Design title',
|
||||
pdfMoodboard: 'Moodboard',
|
||||
pdfConcept: 'Concept explanation',
|
||||
pdfConceptDesc: '(How to use AiDA to develop design)',
|
||||
pdfRequirements: 'PDF requirements:',
|
||||
pdfMaxPages: 'Maximum 15 pages',
|
||||
pdfMaxSize: 'Maximum file size: 20MB',
|
||||
pdfLanguage: 'Language: English or native language\nwith English translation',
|
||||
step4Title: 'Step 4. Finalist Requirement',
|
||||
step4Subtitle: '(for top 20 Designers)',
|
||||
step4Desc:
|
||||
'The 20 finalists will be required to\nsubmit physical garments for final\nevaluation',
|
||||
finalistPieces: 'Number of pieces: 1 full outfit',
|
||||
finalistBasedOn:
|
||||
'Garments must be produced\nbased on the submitted\nAiDA-generated designs',
|
||||
finalistShipping: 'Shipping instructions will be provided by\nCode-create',
|
||||
bloomYourCreativity: 'Bloom Your Creativity',
|
||||
themeOf2026: 'Theme of 2026',
|
||||
bloomText: {
|
||||
desc1: {
|
||||
regular1: 'The',
|
||||
bold1: 'AiDA Global Design Award 2026',
|
||||
regular2: 'is an ',
|
||||
bold2: 'international design competition ',
|
||||
regular3: 'hosted by ',
|
||||
bold3: 'Code-create ',
|
||||
regular4: ', a globally leading\n',
|
||||
bold4: 'AI fashion solutions provider,',
|
||||
regular5:
|
||||
'celebrating the future of creativity powered by artificial intelligence.\nBringing together designers from around the world, AiDA empowers AI as a creative partner—pushing fashion beyond traditional boundaries and unlocking new possibilities where technology amplifies human imagination.'
|
||||
},
|
||||
desc2: {
|
||||
regular1: 'Under the theme',
|
||||
bold1: '“Where Imagination Meets Innovation, Creativity Blooms,” ',
|
||||
regular2:
|
||||
'participants are invited to transform bold ideas into extraordinary designs, seamlessly merging human artistry with artificial intelligence to shape the next era of fashion.'
|
||||
}
|
||||
},
|
||||
bloomDesc1:
|
||||
'The AiDA Global Design Award 2026 is an\ninternational design competition hosted by\nCode‑Create, a globally leading AI fashion solutions provider,\ncelebrating the future of creativity powered by artificial intelligence.\nBringing together designers from around the world, AiDA empowers AI as a creative partner—pushing fashion beyond traditional boundaries and unlocking new possibilities where technology amplifies human imagination.',
|
||||
bloomDesc2:
|
||||
'Under the theme “Where Imagination Meets Innovation, Creativity Blooms,” participants are invited to transform bold ideas into extraordinary designs, seamlessly merging human artistry with artificial intelligence to shape the next era of fashion.',
|
||||
panelOfJudges: 'Panel of Judges',
|
||||
expertise: 'Expertise',
|
||||
judgesHat: {
|
||||
jae: 'Code-create\nKorea Branch Director\nBesfxxk creative director',
|
||||
diego: 'Co-founder & Chief Father\nOfficer of OnTheList\n(Hong Kong)',
|
||||
gregory: 'Senior Designer at\nGabriela Heasrst (Italy)',
|
||||
vincenzo: 'Cheif Editor of SCMP Style\n(Hong Kong)',
|
||||
tim: 'Group Fashion Direction of\n Modern Media Group\n(Shanghai)',
|
||||
desmond: 'Cheif Editor of Vogue\n(Singapore)'
|
||||
},
|
||||
awardPrizes: 'Award & Prizes',
|
||||
recognition: 'Recognition',
|
||||
grandMoney: 'US$5,000',
|
||||
goldMoney: 'US$3,000',
|
||||
silverMoney: 'US$1,000',
|
||||
grandAwards: 'Grand Awards',
|
||||
goldAwards: 'Gold Awards',
|
||||
silverAwards: 'Silver Awards',
|
||||
finalists: 'Finalists',
|
||||
cashAward: 'Cash Award',
|
||||
awardCertificate: 'Award Certificate',
|
||||
globalMediaExposure: 'Global Media Exposure',
|
||||
awardCertification: 'Award\nCertification',
|
||||
TravelAllowance: 'Travel Allowance',
|
||||
selectionCriteria: 'Selection Criteria',
|
||||
evaluation: 'Evaluation',
|
||||
originality: 'Originality',
|
||||
originalityDesc: 'Unique perspective and\ninnovative approach to\nfashion design',
|
||||
creativity: 'Creativity',
|
||||
creativityDesc: 'Artistic vision and exceptional\ndesign excellence',
|
||||
aidaIntegration: 'AiDA Integration',
|
||||
aidaIntegrationDesc: 'Effective application of\nAiDA functions',
|
||||
execution: 'Execution',
|
||||
executionDesc: 'Quality of presentation and\ntechnical craftsmanship',
|
||||
totalCashPrizes: 'UP TO\nUS$9000',
|
||||
totalCashPrizesLabel: 'In total cash prizes',
|
||||
globalMediaExpose: 'GLOBAL MEDIA\nEXPOSE',
|
||||
globalMediaExposeLabel: 'Showcased by top\ninternational media platforms',
|
||||
networkingOpportunities: 'NETWORKING\nOPPORTUNITIES',
|
||||
networkingOpportunitiesLabel:
|
||||
'Build connections with\ndesigners and industry leaders',
|
||||
awardCeremonyHongKong: 'AWARD CEREMONY\nIN HONG KONG',
|
||||
awardCeremonyLabel: 'Travel allowance\nprovided for finalists',
|
||||
competitionTimeline: 'Competition Timeline',
|
||||
shapingTheFuture: 'Shaping the Future',
|
||||
timelineApplicationLabel: 'Application',
|
||||
timelineDeadlineLabel: 'Deadline',
|
||||
timeJul15: 'Jul 15',
|
||||
applicationDeadlineDesc:
|
||||
'Application deadline and\nentry review process\nbegins.',
|
||||
twentyFinalistsAnnounced: '20 Finallists',
|
||||
announcedLabel: 'Announced',
|
||||
timeAug30: 'Aug 30',
|
||||
twentyFinalistsDesc:
|
||||
'Announcement of 20\nfinalists entering final\nevaluation stage.',
|
||||
finalistSubmission: 'Finallist\nSubmission',
|
||||
submissionLabel: 'Deadline',
|
||||
timeSept30: 'Sept 30',
|
||||
finalistSubmissionDesc:
|
||||
'Finalists submit\ncompleted outfits for\nfinal assessment.',
|
||||
receivingOutfits: 'Receiving Outfits',
|
||||
fromFinalistsLabel: 'from Finallists',
|
||||
timeOctober: 'October',
|
||||
receivingOutfitsDesc: 'AiDA receives physical\noutfits from all 20\nfinalists.',
|
||||
awardCeremony: 'Award',
|
||||
ceremonyLabel: 'Ceremony',
|
||||
timeNov12: 'Nov 12',
|
||||
awardCeremonyDesc: 'Award Ceremony &\nCommunity Gathering\n– Soho House.',
|
||||
submissionSuccessful: 'Submission Successful',
|
||||
submissionSuccessfulDesc:
|
||||
'Please review your submitted information in the AiDA in-platform message.\nYou may edit it if needed. Competition updates and results will be sent via email.',
|
||||
deadlinePassed: 'Application Deadline Passed',
|
||||
deadlinePassedDesc:
|
||||
'The submission deadline for AiDA Global Fashion Award 2026 has ended.\nWe are no longer accepting new applications.',
|
||||
uploadInProgress: 'Upload in progress…',
|
||||
uploadSuccess: 'Uploaded Successfully',
|
||||
uploadFailed: 'Upload failed',
|
||||
pdfFileTip: 'PDF file, max 20MB',
|
||||
videoFileTip: 'Video file (MP4, MOV), 1080p, max 100MB'
|
||||
PleaseEnterYourAccountNumberOrPassword: 'Please enter your account number or password'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,12 @@ const routes: Array<RouteRecordRaw> = [
|
||||
meta: { enter: "all" },
|
||||
component: () => import("@/views/Register.vue"),
|
||||
},
|
||||
{
|
||||
path: "/register/:lang",
|
||||
name: "registerLang",
|
||||
meta: { enter: "all" },
|
||||
component: () => import("@/views/Register.vue"),
|
||||
},
|
||||
{
|
||||
path: "/upgrade",
|
||||
name: "upgrade",
|
||||
@@ -172,6 +178,12 @@ const routes: Array<RouteRecordRaw> = [
|
||||
meta: { enter: "all" },
|
||||
component: () => import("@/views/HomeRecommend.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Square/:lang",
|
||||
name: "HomeRecommendLang",
|
||||
meta: { enter: "all" },
|
||||
component: () => import("@/views/HomeRecommend.vue"),
|
||||
},
|
||||
{
|
||||
path: "/administrator",
|
||||
name: "administrator",
|
||||
@@ -325,6 +337,13 @@ const routes: Array<RouteRecordRaw> = [
|
||||
meta: { enter: 3 },
|
||||
component: () =>
|
||||
import("@/component/Administrator/SE/getGenerateFrequency/index.vue"),
|
||||
},
|
||||
{
|
||||
path: "globalAwardPopularity",
|
||||
name: "globalAwardPopularity",
|
||||
meta: { enter: 3 },
|
||||
component: () =>
|
||||
import("@/component/Administrator/globalAwardPopularity.vue"),
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -87,8 +87,10 @@ const DesignDetail : Module<DesignDetail,RootState> = {
|
||||
left:0,
|
||||
top:0,
|
||||
}
|
||||
v.maskMinioUrl = v.layersObject?.[0]?.maskMinioUrl
|
||||
v.maskUrl = v.layersObject?.[0]?.maskUrl
|
||||
if(data?.fromType !== 'resize'){
|
||||
v.maskMinioUrl = v.layersObject?.[0]?.maskMinioUrl
|
||||
v.maskUrl = v.layersObject?.[0]?.maskUrl
|
||||
}
|
||||
v.layersObject[i].designOpenrtionBtn = false
|
||||
if(v.layersObject[i].imageCategory.indexOf("back") == -1){
|
||||
front[index] = v.layersObject[i]
|
||||
|
||||
@@ -74,7 +74,7 @@ const HomeStoreModule : Module<DesignDetail,RootState> = {
|
||||
},
|
||||
setPoseTransferLastFrameList(state,data){
|
||||
// 支持两种方式:set 替换整个列表;add/删除与 uploadElement 一致
|
||||
if(data.str === 'set'){
|
||||
if(data?.str === 'set'){
|
||||
state.lastFrameList = data.list || []
|
||||
return
|
||||
}else{
|
||||
|
||||
@@ -77,7 +77,7 @@ const userHabit : Module<UserHabit,RootState> = {
|
||||
followeeCount: '-',
|
||||
followerCount: '-',
|
||||
accountExtendList:null,
|
||||
systemList:[],
|
||||
systemList:[1],
|
||||
expireTime:null,
|
||||
language:'',
|
||||
organizationId: null,
|
||||
@@ -194,7 +194,7 @@ const userHabit : Module<UserHabit,RootState> = {
|
||||
followeeCount: '-',
|
||||
followerCount: '-',
|
||||
accountExtendList:null,
|
||||
systemList:[],
|
||||
systemList:[1],
|
||||
expireTime:null,
|
||||
language:'',
|
||||
organizationId: null,
|
||||
@@ -407,7 +407,7 @@ const userHabit : Module<UserHabit,RootState> = {
|
||||
item.name = name
|
||||
});
|
||||
// const {t} = useI18n()
|
||||
rv.unshift({name:t('Model.all'),value:'',id:''})
|
||||
rv.unshift({name:t('Model.all'),value:'',id:null})
|
||||
store.commit('setMannequinStyle',rv)
|
||||
resolve('')
|
||||
}
|
||||
|
||||
@@ -74,7 +74,8 @@ const Workspace: Module<DesignDetail, RootState> = {
|
||||
},
|
||||
setProbject(state, data) {
|
||||
for (const key in data) {
|
||||
if (data[key] == undefined) continue
|
||||
let list = ['styleName','styleId','style']
|
||||
if (data[key] == undefined && !list.includes(key)) continue
|
||||
state.probjects[key] = data[key]
|
||||
}
|
||||
},
|
||||
|
||||
@@ -198,6 +198,13 @@ const all = (t)=>{
|
||||
route: '/administrator/subscriptionPlan',
|
||||
key: 'sub14',
|
||||
isShow: true
|
||||
},
|
||||
{
|
||||
name: 'Global Award Popularity',
|
||||
icon: 'usetime',
|
||||
route: '/administrator/globalAwardPopularity',
|
||||
key: 'sub15',
|
||||
isShow: true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -346,6 +346,7 @@ export const Https = {
|
||||
switchSubscribePlan: '/api/subscription_plan/switchSubscriptionPlan', // 切换管理员订阅计划
|
||||
switchSubAccountSubscribePlan:
|
||||
'/api/subscription_plan/switchSubAccSubscriptionPlan', // 切换子账号订阅计划
|
||||
getGlobalAwardPopularity: '/api/global-award/page/visit/count', // 获取global award流量
|
||||
|
||||
//云生成
|
||||
designCloud: `/api/design/designCloud`, //创建云生成
|
||||
|
||||
@@ -272,12 +272,12 @@ const navTypeList = (t)=>{
|
||||
// },
|
||||
|
||||
|
||||
{
|
||||
icon:'fi fi-rr-puzzle-alt',
|
||||
value:'deReconstruction',
|
||||
label:t('Header.toolsDeReconstruction'),
|
||||
router:'tools=deReconstruction'
|
||||
},
|
||||
// {
|
||||
// icon:'fi fi-rr-puzzle-alt',
|
||||
// value:'deReconstruction',
|
||||
// label:t('Header.toolsDeReconstruction'),
|
||||
// router:'tools=deReconstruction'
|
||||
// },
|
||||
{
|
||||
icon:'fi fi-ss-box-open',
|
||||
value:'toProduct',
|
||||
@@ -294,18 +294,18 @@ const navTypeList = (t)=>{
|
||||
label:t('Header.toolsToTransferPose'),
|
||||
router:'tools=poseTransfer'
|
||||
},
|
||||
{
|
||||
icon:'fi fi-rr-cubes',
|
||||
value:'patternMaking3D',
|
||||
label:t('Header.toolsPatternMaking'),
|
||||
router:'tools=patternMaking3D'
|
||||
},
|
||||
{
|
||||
icon:'fi fi-rr-pen-swirl',
|
||||
value:'canvasUpload',
|
||||
label:t('Header.toolsCanvas'),
|
||||
router:'tools=canvasUpload'
|
||||
},
|
||||
// {
|
||||
// icon:'fi fi-rr-cubes',
|
||||
// value:'patternMaking3D',
|
||||
// label:t('Header.toolsPatternMaking'),
|
||||
// router:'tools=patternMaking3D'
|
||||
// },
|
||||
// {
|
||||
// icon:'fi fi-rr-pen-swirl',
|
||||
// value:'canvasUpload',
|
||||
// label:t('Header.toolsCanvas'),
|
||||
// router:'tools=canvasUpload'
|
||||
// },
|
||||
]
|
||||
},
|
||||
library:{
|
||||
@@ -340,12 +340,12 @@ const navTypeList = (t)=>{
|
||||
value:'Models',
|
||||
router:'library=Models'
|
||||
},
|
||||
{
|
||||
icon:'fi-ss-gem',
|
||||
label:t('LibraryPage.brandDNA'),
|
||||
value:'MyBrand',
|
||||
router:'library=MyBrand'
|
||||
},
|
||||
// {
|
||||
// icon:'fi-ss-gem',
|
||||
// label:t('LibraryPage.brandDNA'),
|
||||
// value:'MyBrand',
|
||||
// router:'library=MyBrand'
|
||||
// },
|
||||
]
|
||||
},
|
||||
// history:{
|
||||
|
||||
@@ -672,28 +672,40 @@ function sketchToMask(sketchImage) {
|
||||
img.src = sketchImage;
|
||||
});
|
||||
}
|
||||
|
||||
function isValidUrl(string) {
|
||||
try {
|
||||
const url = new URL(string)
|
||||
// 通常我们只需要 http 或 https 协议
|
||||
return url.protocol === "http:" || url.protocol === "https:"
|
||||
} catch (err) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
isEmail,
|
||||
getUploadUrl,
|
||||
getUniversalZoomLevel,
|
||||
rgbaToHex,
|
||||
getMinioUrl,
|
||||
base64ToFile,
|
||||
dataURLtoFile,
|
||||
blobToFile,
|
||||
base64toFile,
|
||||
rgbToHsv,
|
||||
formatTime,
|
||||
dataURLtoBlob,
|
||||
isMoible,
|
||||
downloadIamge,
|
||||
downloadVideoWithFetch,
|
||||
getBrowserInfo,
|
||||
setPubDate,
|
||||
murmur,
|
||||
setGradual,
|
||||
calculateGradientCoordinate,
|
||||
segmentImage,
|
||||
UrlToFile,
|
||||
sketchToMask
|
||||
isEmail,
|
||||
getUploadUrl,
|
||||
getUniversalZoomLevel,
|
||||
rgbaToHex,
|
||||
getMinioUrl,
|
||||
base64ToFile,
|
||||
dataURLtoFile,
|
||||
blobToFile,
|
||||
base64toFile,
|
||||
rgbToHsv,
|
||||
formatTime,
|
||||
dataURLtoBlob,
|
||||
isMoible,
|
||||
downloadIamge,
|
||||
downloadVideoWithFetch,
|
||||
getBrowserInfo,
|
||||
setPubDate,
|
||||
murmur,
|
||||
setGradual,
|
||||
calculateGradientCoordinate,
|
||||
segmentImage,
|
||||
UrlToFile,
|
||||
sketchToMask,
|
||||
isValidUrl
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -202,6 +202,9 @@ onBeforeUnmount(() => {
|
||||
column-gap: 23.22rem;
|
||||
row-gap: 8rem;
|
||||
padding: 0 25rem 0 26.6rem;
|
||||
div{
|
||||
text-align: center;
|
||||
}
|
||||
.judgement-item {
|
||||
overflow: hidden;
|
||||
.picture {
|
||||
|
||||
@@ -52,6 +52,13 @@
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const props = defineProps({
|
||||
isZh: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
})
|
||||
|
||||
const prizes = [
|
||||
{
|
||||
money: 'AwardsPage.grandMoney',
|
||||
@@ -83,11 +90,8 @@
|
||||
{
|
||||
money: 'AwardsPage.awardCertification',
|
||||
name: 'AwardsPage.finalists',
|
||||
desc: [
|
||||
'AwardsPage.TravelAllowance',
|
||||
'AwardsPage.globalMediaExposure'
|
||||
],
|
||||
smaller: true
|
||||
desc: ['AwardsPage.TravelAllowance', 'AwardsPage.globalMediaExposure'],
|
||||
smaller: !props.isZh
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
alt=""
|
||||
class="icon-img"
|
||||
/>
|
||||
<div class="title">{{ info.title }}</div>
|
||||
<div class="title">{{ $t(info.title) }}</div>
|
||||
<div class="desc">
|
||||
{{ info.desc }}
|
||||
{{ $t(info.desc) }}
|
||||
<!-- <div>
|
||||
Please review your submitted information in the AiDA in-platform message.
|
||||
</div>
|
||||
@@ -37,14 +37,14 @@
|
||||
if (props.isExpired) {
|
||||
return {
|
||||
icon: expiredIcon,
|
||||
title: t('AwardsPage.deadlinePassed'),
|
||||
desc: t('AwardsPage.deadlinePassedDesc')
|
||||
title: 'AwardsPage.deadlinePassed',
|
||||
desc: 'AwardsPage.deadlinePassedDesc'
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
icon: successIcon,
|
||||
title: t('AwardsPage.submissionSuccessful'),
|
||||
desc: t('AwardsPage.submissionSuccessfulDesc')
|
||||
title: 'AwardsPage.submissionSuccessful',
|
||||
desc: 'AwardsPage.submissionSuccessfulDesc'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
class="progress-icon successful-icon"
|
||||
/>
|
||||
</div>
|
||||
<div class="text">{{ text }}</div>
|
||||
<div class="tips">{{ tips }}</div>
|
||||
<div class="text">{{ $t(text) }}</div>
|
||||
<div class="tips">{{ $t(tips) }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -32,16 +32,16 @@
|
||||
|
||||
const textMap: Record<string, string> = {
|
||||
idle: '',
|
||||
uploading: computed(() => t('AwardsPage.uploadInProgress')).value,
|
||||
success: computed(() => t('AwardsPage.uploadSuccess')).value,
|
||||
error: computed(() => t('AwardsPage.uploadFailed')).value
|
||||
uploading: 'AwardsPage.uploadInProgress',
|
||||
success:'AwardsPage.uploadSuccess',
|
||||
error: 'AwardsPage.fileUploadFailed'
|
||||
}
|
||||
|
||||
const tips = computed(() => {
|
||||
if (props.type === 'pdf') {
|
||||
return t('AwardsPage.pdfFileTip')
|
||||
return 'AwardsPage.pdfFileTip'
|
||||
} else if (props.type === 'video') {
|
||||
return t('AwardsPage.videoFileTip')
|
||||
return 'AwardsPage.videoFileTip'
|
||||
}
|
||||
return ''
|
||||
})
|
||||
|
||||
@@ -83,12 +83,12 @@
|
||||
class="close-icon"
|
||||
@click="handleCloseQRcode"
|
||||
/>
|
||||
<div class="code-title">WeChat Official Account</div>
|
||||
<div class="code-title">{{ $t('AwardsPage.wechatTitle') }}</div>
|
||||
<img
|
||||
src="@/assets/images/award/qrcode.jpg"
|
||||
class="qrcode"
|
||||
/>
|
||||
<div class="tips">Scan the QR code in WeChat</div>
|
||||
<div class="tips">{{ $t('AwardsPage.wechatDesc') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
<template>
|
||||
<div class="award-page">
|
||||
<div
|
||||
class="award-page"
|
||||
:class="{ 'is-zh': isZh }"
|
||||
>
|
||||
<div class="banner">
|
||||
<video
|
||||
src="@/assets/images/award/banner.mp4"
|
||||
:src="bannerUrl"
|
||||
autoplay
|
||||
muted
|
||||
loop
|
||||
@@ -11,32 +14,33 @@
|
||||
webkit-playsinline
|
||||
x5-playsinline
|
||||
></video>
|
||||
<div
|
||||
class="submit-btn flex flex-center"
|
||||
@click="handleSubmitApplication"
|
||||
>
|
||||
<div>{{ $t('AwardsPage.submitApplication') }}</div>
|
||||
<img
|
||||
src="@/assets/images/award/arrow_right.png"
|
||||
alt=""
|
||||
class="arrow"
|
||||
/>
|
||||
<div class="ddl">{{ $t('AwardsPage.applicationDeadline') }}</div>
|
||||
</div>
|
||||
<div
|
||||
class="submit-btn flex flex-center"
|
||||
@click="handleSubmitApplication"
|
||||
>
|
||||
<div>{{ $t('AwardsPage.submitApplication') }}</div>
|
||||
<img
|
||||
src="@/assets/images/award/arrow_right.png"
|
||||
alt=""
|
||||
class="arrow"
|
||||
/>
|
||||
<div class="ddl">{{ $t('AwardsPage.applicationDeadline') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Slogan />
|
||||
<Bloom />
|
||||
<TimeLine />
|
||||
<JudgesSection />
|
||||
<PrizesSection />
|
||||
<PrizesSection :is-zh="isZh" />
|
||||
<ApplySection />
|
||||
<SelectionSection />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { ref, computed } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { useRouter } from 'vue-router'
|
||||
import JudgesSection from './components/JudgesSection.vue'
|
||||
import SelectionSection from './components/SelectionSection.vue'
|
||||
@@ -46,7 +50,19 @@
|
||||
import Bloom from './components/Bloom.vue'
|
||||
import Slogan from './components/Slogan.vue'
|
||||
|
||||
import banner from '@/assets/images/award/banner.mp4'
|
||||
import bannerZh from '@/assets/images/award/banner_chinese.mp4'
|
||||
|
||||
const router = useRouter()
|
||||
const { locale } = useI18n()
|
||||
|
||||
const isZh = computed(() => {
|
||||
return locale.value === 'CHINESE_SIMPLIFIED'
|
||||
})
|
||||
|
||||
const bannerUrl = computed(() => {
|
||||
return isZh.value ? bannerZh : banner
|
||||
})
|
||||
|
||||
const handleSubmitApplication = () => {
|
||||
router.push('/award/contestants')
|
||||
@@ -110,4 +126,18 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.is-zh {
|
||||
.submit-btn {
|
||||
padding: 0 7.5rem;
|
||||
height: 7.8rem;
|
||||
border-radius: 7.74rem;
|
||||
column-gap: 3.8rem;
|
||||
// justify-content: space-between;
|
||||
&,
|
||||
.ddl {
|
||||
width: 35.4rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -400,7 +400,7 @@
|
||||
<a href="https://www.facebook.com/CodeCreateAI" target="_blank" >
|
||||
<img src="@/assets/images/socialMediaLogo/faceBookIcon.svg" alt="">
|
||||
</a>
|
||||
<a href="https://www.youtube.com/@AiDA-3.1" target="_blank" >
|
||||
<a href="https://www.youtube.com/@Code-Create_AiDA" target="_blank" >
|
||||
<img src="@/assets/images/socialMediaLogo/socialIcons.svg" alt="">
|
||||
</a>
|
||||
<a href="https://www.linkedin.com/company/code-create-limited" target="_blank" >
|
||||
|
||||
@@ -62,7 +62,7 @@ import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
|
||||
import { useStore } from 'vuex'
|
||||
import { setLang } from '@/tool/guide'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import { gsap, TweenMax } from 'gsap'
|
||||
import { ScrollTrigger } from 'gsap/ScrollTrigger'
|
||||
export default defineComponent({
|
||||
@@ -71,6 +71,7 @@ export default defineComponent({
|
||||
const {t, locale} = useI18n()
|
||||
const store = useStore()
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
let registerModel = ref()
|
||||
let data = reactive({})
|
||||
|
||||
@@ -117,7 +118,14 @@ export default defineComponent({
|
||||
onMounted(() => {
|
||||
window.addEventListener('resize', updataIsMoblie)
|
||||
// 初始化语言设置
|
||||
const savedLang = localStorage.getItem('loginLanguage')
|
||||
let savedLang = localStorage.getItem('loginLanguage')
|
||||
if(route?.params?.lang == 'cn'){
|
||||
savedLang = 'CHINESE_SIMPLIFIED'
|
||||
localStorage.setItem('loginLanguage', savedLang)
|
||||
}{
|
||||
savedLang = 'ENGLISH'
|
||||
localStorage.setItem('loginLanguage', savedLang)
|
||||
}
|
||||
if (savedLang) {
|
||||
isChinese.value = savedLang === 'CHINESE_SIMPLIFIED'
|
||||
locale.value = savedLang
|
||||
|
||||
@@ -1721,9 +1721,8 @@ export default defineComponent({
|
||||
sloganText = this.captionGeneration
|
||||
if(this.selectCode == "Sketchboard"){
|
||||
level2Type = this.selectGenerateList?.[0]?.categoryValue?this.selectGenerateList[0].categoryValue:''
|
||||
if(this.workspace.styleName){
|
||||
sloganText = `${this.workspace.styleName},${sloganText}`
|
||||
}
|
||||
// sloganText = `${this.workspace.styleName || 'all'},${sloganText}`
|
||||
sloganText = `'all',${sloganText}`
|
||||
}else if(this.selectCode == "Printboard"){
|
||||
level2Type = this.scene?.value
|
||||
if(level2Type == 'Slogan' && this.captionGeneration == ''){
|
||||
|
||||
@@ -85,7 +85,7 @@ import {
|
||||
import { setCookie, getCookie, WriteCookie, clonAllCookie } from '@/tool/cookie'
|
||||
import { Https } from '@/tool/https'
|
||||
import { useStore } from 'vuex'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import signUp from '@/component/mainPage/signUp/index.vue'
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@@ -93,6 +93,7 @@ export default defineComponent({
|
||||
},
|
||||
setup() {
|
||||
const store = useStore()
|
||||
const route = useRoute();
|
||||
const router = useRouter()
|
||||
let data = reactive({
|
||||
homeRecommendMax: null,
|
||||
@@ -148,7 +149,14 @@ export default defineComponent({
|
||||
|
||||
onMounted(() => {
|
||||
updataIsMoblie()
|
||||
const savedLang = localStorage.getItem('loginLanguage')
|
||||
let savedLang = localStorage.getItem('loginLanguage') || 'ENGLISH'
|
||||
if(route?.params?.lang == 'cn'){
|
||||
savedLang = 'CHINESE_SIMPLIFIED'
|
||||
localStorage.setItem('loginLanguage', savedLang)
|
||||
}else if(route?.params?.lang == 'en'){
|
||||
savedLang = 'ENGLISH'
|
||||
localStorage.setItem('loginLanguage', savedLang)
|
||||
}
|
||||
if (savedLang) {
|
||||
data.isSelectSuccessively = savedLang === 'CHINESE_SIMPLIFIED'
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user