3 Commits

Author SHA1 Message Date
X1627315083@163.com
ae1d7245f4 Merge remote-tracking branch 'origin/dev_vite' into research 2026-04-08 09:25:56 +08:00
X1627315083@163.com
b8f38db351 overall印花scale为字符串时候使用toFixed会报错 2026-02-24 11:27:43 +08:00
X1627315083@163.com
7fb7ffaced fix 2026-02-06 16:47:45 +08:00
37 changed files with 4872 additions and 5590 deletions

View File

@@ -9,11 +9,6 @@
"id": 2,
"title": "AiDA X SFT AI Fashion Award 2024",
"imgUrl": "/image/events/Fashion-Award-2024.png"
},
{
"id": 3,
"title": "AiDA Global Design Awards 2026",
"imgUrl": "/image/events/award-poster.gif"
}
],
"eventsItem": [
@@ -21,19 +16,18 @@
"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": "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 CodeCreate, 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."
"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 CodeCreate, 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."
}
]
},
{
"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 allowance, 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 support provided, allowing them to showcase their talent, network with professionals, and celebrate their achievements on an international stage."
}
]
}

View File

@@ -9,11 +9,6 @@
"id": 2,
"title": "AiDA X SFT AI时尚设计比赛2024",
"imgUrl": "/image/events/Fashion-Award-2024.png"
},
{
"id": 3,
"title": "AiDA全球设计奖 2026",
"imgUrl": "/image/events/award-poster-zh.gif"
}
],
"eventsItem": [
@@ -21,19 +16,18 @@
"id": 3,
"title": "AiDA全球设计奖 2026",
"imgUrl": "/image/events/award-poster-zh.gif",
"tips": "如有疑问请联系awards2026@code-create.com.hk",
"textList": [
{
"paragraph": [
{
"text": "秉承推动 AI 赋能创意设计的初衷CodeCreate 举办了「AiDA 全球设计大奖 2026」面向来全球的设计师鼓励大家探索 AI 与时尚设计的无限可能,突破传统界限,释放科技与想象力的创新潜能。点击“查看详情”按钮获取更多比赛信息,抓住成为 AI 时尚先锋的机会吧!"
"text": "秉承推动 AI 赋能创意设计的初衷CodeCreate 举办了「AiDA 全球设计大奖 2026」面向来自香港、中国、新加坡、韩国及全球的设计师,鼓励大家探索 AI 与时尚设计的无限可能,突破传统界限,释放科技与想象力的创新潜能。点击“查看详情”按钮获取更多比赛信息,抓住成为 AI 时尚先锋的机会吧!"
}
]
},
{
"paragraph": [
{
"text": "参赛者将有机会赢取总奖金 9,000 美元,作品还将获得国际媒体展示机会,并与全球设计师和行业领袖建立联系。入围决赛者将受邀参加在香港举办的 专属颁奖典礼,主办方提供差旅津贴,让设计师在国际舞台展示才华、拓展人脉,并共同庆祝创意成果。"
"text": "参赛者将有机会赢取总奖金 9,000 美元,作品还将获得国际媒体展示机会,并与全球设计师和行业领袖建立联系。入围决赛者将受邀参加在香港举办的 专属颁奖典礼,主办方提供差旅支持,让设计师在国际舞台展示才华、拓展人脉,并共同庆祝创意成果。"
}
]
}

View File

@@ -1,37 +1,22 @@
<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>
@@ -39,138 +24,120 @@
<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 { isValidUrl } from "@/tool/util"
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'
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
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
if(rv.content.length == 0) {
accountMessage.isNoData = true
})
}
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"
}else{
rv.content.forEach((item:any) => {
item.content = JSON.parse(item.content)
});
accountMessage.dataList.push(...rv.content)
}
window.open(content, "_blank")
}
prop.setReadStatus(item)
.then((rv: any) => {
}).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)=>{
item.isRead = 1
})
.catch((err: any) => {})
}
let allRead = () => {
// emit('setAllmessage')
prop.setAllmessage()
.then(() => {
accountMessage.dataList.forEach((item: any) => {
item.isRead = 1
})
})
.catch((err: any) => {})
}).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;
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;

File diff suppressed because it is too large Load Diff

View File

@@ -321,7 +321,6 @@ 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()

View File

@@ -1,99 +0,0 @@
<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

View File

@@ -55,7 +55,6 @@ commandManager.setChangeCallback((info) => {
emit("undo-redo-status-changed", {
canUndo: canUndo.value,
canRedo: canRedo.value,
type: info.type,
commandManager,
});
});

View File

@@ -907,8 +907,7 @@
}
emit("changeCanvas", commandData)
canvasManager.changeCanvas()
const type = command.type
if (props.enabledRedGreenMode && (type === "undo" || type === "redo")) {
if ((command.canUndo || command.canRedo) && props.enabledRedGreenMode) {
setTimeout(async () => {
try {
const imageData = await canvasManager.exportImage({
@@ -1041,7 +1040,6 @@
},
// 导出图片
exportImage: async ({
isFrontBackUpdata = false, // 更新红绿图时候需要用,直接更新红绿图
isContainBg = false, // 是否包含背景图层
isContainFixed = false, // 是否包含固定图层
isContainFixedOther = true, // 是否包含其他固定图层--颜色图层
@@ -1058,10 +1056,6 @@
} = {}) => {
loading.value = true
canvasManager?.canvas?.discardActiveObject()
if (isFrontBackUpdata) {
await canvasManager?.setSpecialCliptInfo(true, true)
canvasManager.canvas.renderAll()
}
var base64 = await canvasManager.exportImage({
isContainBg,
isContainFixed,

View File

@@ -409,7 +409,7 @@ export class BrushIndicator {
// this.show(e.e);
this._mouseEnterHandler && this._mouseEnterHandler(e)
} else {
// setTimeout(() => {
// requestIdleCallback(() => {
// this.updatePosition(e.e);
// });

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -133,12 +133,11 @@ export class RedGreenModeManager {
this.canvas.on("mouse:up", (event) => {
// 可以在这里添加更多逻辑,比如生成图片或更新状态
nextTick(() => {
setTimeout(async () => {
requestIdleCallback(async () => {
if (!this.isInitialized) {
console.warn("红绿图模式未初始化,无法处理鼠标事件");
return;
}
console.log("鼠标抬起事件触发", this.onImageGenerated);
if (this.onImageGenerated) {
const imageData = await this.canvasManager.exportImage({
restoreOpacityInRedGreen: true, // 恢复红绿图模式下的透明度

View File

@@ -37,6 +37,7 @@ export class ThumbnailManager {
// 延迟执行避免阻塞UI
fabricObjects.length > 0 &&
requestIdleCallback(() => {
setTimeout(async () => {
const base64 = await this._generateLayerThumbnailNow(fabricObjects, layer);
// this.layerThumbnails.set(layerId, base64);
@@ -54,6 +55,7 @@ export class ThumbnailManager {
console.error("生成图层缩略图时出错:", error);
}
});
});
}
/**
@@ -63,7 +65,7 @@ export class ThumbnailManager {
generateAllLayerThumbnails(layers) {
if (!layers || !Array.isArray(layers)) return;
setTimeout(() => {
requestIdleCallback(() => {
setTimeout(() => {
layers.forEach((layer) => {
if (layer && layer.id) {

View File

@@ -180,7 +180,7 @@ export class CommandManager {
this._recordPerformance("execute", command.constructor.name, duration);
// 通知状态变化
this._notifyStateChange("execute");
this._notifyStateChange();
console.log(`✅ 命令执行成功: ${command.constructor.name}`);
return result;
@@ -219,7 +219,7 @@ export class CommandManager {
this._recordPerformance("undo", command.constructor.name, duration);
// 通知状态变化
this._notifyStateChange("undo");
this._notifyStateChange();
console.log(`✅ 命令撤销成功: ${command.constructor.name}`);
return result;
@@ -258,7 +258,7 @@ export class CommandManager {
this._recordPerformance("redo", command.constructor.name, duration);
// 通知状态变化
this._notifyStateChange("redo");
this._notifyStateChange();
console.log(`✅ 命令重做成功: ${command.constructor.name}`);
return result;
@@ -298,7 +298,7 @@ export class CommandManager {
this.undoStack = [];
this.redoStack = [];
this._notifyStateChange("clear");
this._notifyStateChange();
// console.log("📝 命令历史已清空");
}
@@ -417,12 +417,10 @@ export class CommandManager {
* 通知状态变化
* @private
*/
_notifyStateChange(type) {
_notifyStateChange() {
if (this.onStateChange) {
try {
const obj = this.getState();
obj.type = type;
this.onStateChange(obj);
this.onStateChange(this.getState());
} catch (error) {
console.error("状态变化回调执行失败:", error);
}

View File

@@ -85,7 +85,7 @@ export class LiquifyRealTimeUpdater {
if (isDrawing && this.config.useDirectUpdate) {
// 拖拽过程中使用快速更新(降低质量以提高性能)
await this._fastUpdate(imageData);
this._fastUpdate(imageData);
} else {
// 拖拽结束后使用完整更新(最高质量)
await this._fullUpdate(imageData);
@@ -124,7 +124,7 @@ export class LiquifyRealTimeUpdater {
* @param {ImageData} imageData 图像数据
* @private
*/
async _fastUpdate(imageData) {
_fastUpdate(imageData) {
if (!this.targetObject || !this.targetObject._element) {
return;
}
@@ -138,14 +138,12 @@ 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;
const image = new Image();
image.src = dataURL;
await image.decode();
this.targetObject.setElement(image);
targetElement.src = dataURL;
// 关键优化直接设置fabric对象为脏状态但不立即渲染
// this.targetObject.dirty = false; // 标记为不需要立即渲染
@@ -155,7 +153,7 @@ export class LiquifyRealTimeUpdater {
// 使用requestAnimationFrame进行批量渲染优化
// if (!this.renderingScheduled && !this.config.skipRenderDuringDrag) {
// this.renderingScheduled = true;
// setTimeout(() => {
// requestIdleCallback(() => {
// this.canvas.renderAll();
// this.renderingScheduled = false;
// });

View File

@@ -447,7 +447,6 @@
</template>
</CanvasEditor>
</div>
<img src="" alt="" id="canvas-test-dom">
</div>
</template>
<style>
@@ -459,13 +458,6 @@
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">
* {

View File

@@ -331,6 +331,7 @@ 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
@@ -368,6 +369,7 @@ 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'){
@@ -563,14 +565,11 @@ export default defineComponent({
}
}else{
//走画布合成图片并且直接分割
if(detailData.isEditPattern.value !== 'canvasEditor' && detailData.isEditPattern.value !== 'redGreenExample'){
if(detailData.isEditPattern.value !== 'canvasEditor'){
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
}
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()
@@ -626,7 +625,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' || detailData.isEditPattern.value == 'redGreenExample')await uploadSelectDetail()
if(detailData.isEditPattern.value == 'canvasEditor')await uploadSelectDetail()
detailData.isEditPattern.value = ''
}else{
// if(detailData.isEditPattern.value && (str == 'canvasEditor' || str == 'redGreenExample')){
@@ -781,7 +780,8 @@ export default defineComponent({
color.gradient = canvasColor.gradient
}
}
if(detailData.isEditPattern.value == 'canvasEditor' || detailData.isEditPattern.value == 'redGreenExample'){
if(detailData.isEditPattern.value == 'canvasEditor'){
delete detailData.selectDetail.newDetail
detailData.selectDetail.trims.prints = allInfo.trims || []
detailData.selectDetail.printObject.prints = allInfo.prints || []
@@ -804,6 +804,7 @@ export default defineComponent({
if(detailData.currentDetailType == 'color'){
detailData.detailLeftColorKey++
}
}
const canvasReload = async ()=>{
if(detailData.isEditPattern.value){

View File

@@ -163,6 +163,7 @@ 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,
@@ -244,27 +245,17 @@ 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
@@ -276,6 +267,7 @@ export default defineComponent({
back.imageUrl = rv.targetBackUrl
// store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
})
}
const editSketchCanvasInit = async (value:any)=>{
detailData.canvasInstance = value

View File

@@ -393,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,
}

View File

@@ -124,11 +124,7 @@ export default defineComponent({
const handleResize = ()=>{
clearTimeout(time)
time = setTimeout(()=>{
let data = {
...getDetailListData.designDetail,
fromType:'resize',
}
store.commit('DesignDetail/setDesignDetail',data)
store.commit('DesignDetail/setDesignDetail',getDetailListData.designDetail)
getDetailListDom.position?.updataPosition?.()
getDetailListDom.modelNav?.setItemPosition?.()
getDetailListDom.position?.updateRect?.()

View File

@@ -189,11 +189,11 @@ export default defineComponent({
}
return { scaleX, scaleY, rotate };
}
const initMoveableForSelected = async (isDestroy:boolean = false) => {
const initMoveableForSelected = () => {
// 销毁旧的实例
if(selectItem.imgDomIndex == -1)return
if (moveableInstance?.value?.destroy && !isDestroy) {
moveableInstance?.value?.destroy();
if (moveableInstance.value) {
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(oldValue == 0)
initMoveableForSelected()
},100)
})
const setRevocation = async ()=>{

View File

@@ -21,11 +21,7 @@
{{ $t("event.detail") }}
</div>
</div>
<div
class="modal_title_text content"
v-for="item in eventsDetail.textList"
:class="{ award: eventsDetail.id === 3 }"
>
<div class="modal_title_text content" v-for="item in eventsDetail.textList">
<div class="eventsDetail_content_right_btn_box">
<div
class="eventsDetail_content_right_btn"
@@ -47,7 +43,6 @@
v-detailText="introItem.text"
></div>
</div>
<div class="tips" v-if="eventsDetail.tips">{{ eventsDetail.tips }}</div>
</div>
</div>
</div>
@@ -125,16 +120,11 @@ export default defineComponent({
})
}
const openDetail = () => {
let language = locale.value === "ENGLISH" ? "en" : "cn"
let language = locale.value === "ENGLISH" ? "en" : "zh"
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")
// router.push("/award/index")
}
onMounted(() => {
const currentLocale = locale.value
@@ -243,7 +233,7 @@ export default defineComponent({
}
.eventsDetail_content_right {
.modal_title_text {
letter-spacing: 0.3rem;
letter-spacing: 0.4rem;
font-weight: 600;
&-header {
display: flex;
@@ -275,21 +265,18 @@ export default defineComponent({
.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 {
}
.modal_title_text:last-child::after {
content: "";
display: block;
border-top: 3px solid;
height: 6rem;
}
.modal_title_text.award:last-child:after {
display: none;
}
}
}
}
@@ -306,13 +293,4 @@ export default defineComponent({
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>

View File

@@ -531,7 +531,7 @@ export default defineComponent({
}
)
const setSpeed = (item: any) => {
speed.speedData = {...item}
speed.speedData = item
}
onMounted(() => {
if (props.msg == 'Sketchboard') {
@@ -734,9 +734,7 @@ 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'

View File

@@ -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') }}

View File

@@ -77,10 +77,17 @@ export default defineComponent({
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
width: 80%;
height: auto;
max-height: 80vh;
position: absolute;
width: max-content;
video{
max-height:80vh;
max-width:80vw;
width: 100%;
max-height: 80vh;
height: 100%;
object-fit: contain;
width: max-content;
}
.general_video_btn{
color: #fff;

View File

@@ -745,12 +745,6 @@ 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,
@@ -1310,9 +1304,9 @@ export default defineComponent({
})
return
}
const parents = designData.selectLikeDesign.filter((item:any) => item.resultType === 'Design').filter((item:any) => likeDesignCollectionList.value.some((v:any) => (v.id === item.id)));
const parents = designData.selectLikeDesign.filter((item:any) => item.resultType === 'Design');
parents.map((parent:any) => {
parent.sort = likeDesignCollectionList.value.find((v:any) => v.id === parent.id)?.sort || parent.oldSort||parent.sort
parent.sort = parent.oldSort||parent.sort
delete parent.oldSort
return {
...parent,
@@ -1539,7 +1533,7 @@ export default defineComponent({
this.observerData.time = setTimeout(()=>{
this.setSystemDesigner(0)
// this.setDesignItemStyle()
this.setDesignItemStyle()
},100)
// const { width } = entry.contentRect;
}
@@ -1937,7 +1931,6 @@ 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]);

View File

@@ -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;">

View File

@@ -258,7 +258,6 @@ methods: {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
}
}
.content_bottom_item:nth-child(4n){

View File

@@ -178,12 +178,6 @@ 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",
@@ -337,13 +331,6 @@ 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"),
},
],
},

View File

@@ -87,10 +87,8 @@ const DesignDetail : Module<DesignDetail,RootState> = {
left:0,
top:0,
}
if(data?.fromType !== 'resize'){
v.maskMinioUrl = v.layersObject?.[0]?.maskMinioUrl
v.maskUrl = v.layersObject?.[0]?.maskUrl
}
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]

View File

@@ -198,13 +198,6 @@ const all = (t)=>{
route: '/administrator/subscriptionPlan',
key: 'sub14',
isShow: true
},
{
name: 'Global Award Popularity',
icon: 'usetime',
route: '/administrator/globalAwardPopularity',
key: 'sub15',
isShow: true
}
]
}

View File

@@ -346,7 +346,6 @@ 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`, //创建云生成

View File

@@ -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:{

View File

@@ -672,40 +672,28 @@ 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,
isValidUrl
isEmail,
getUploadUrl,
getUniversalZoomLevel,
rgbaToHex,
getMinioUrl,
base64ToFile,
dataURLtoFile,
blobToFile,
base64toFile,
rgbToHsv,
formatTime,
dataURLtoBlob,
isMoible,
downloadIamge,
downloadVideoWithFetch,
getBrowserInfo,
setPubDate,
murmur,
setGradual,
calculateGradientCoordinate,
segmentImage,
UrlToFile,
sketchToMask
}

View File

@@ -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/@Code-Create_AiDA" target="_blank" >
<a href="https://www.youtube.com/@AiDA-3.1" target="_blank" >
<img src="@/assets/images/socialMediaLogo/socialIcons.svg" alt="">
</a>
<a href="https://www.linkedin.com/company/code-create-limited" target="_blank" >

View File

@@ -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, useRoute } from 'vue-router'
import { useRouter } from 'vue-router'
import { gsap, TweenMax } from 'gsap'
import { ScrollTrigger } from 'gsap/ScrollTrigger'
export default defineComponent({
@@ -71,7 +71,6 @@ export default defineComponent({
const {t, locale} = useI18n()
const store = useStore()
const router = useRouter()
const route = useRoute()
let registerModel = ref()
let data = reactive({})
@@ -118,14 +117,7 @@ export default defineComponent({
onMounted(() => {
window.addEventListener('resize', updataIsMoblie)
// 初始化语言设置
let savedLang = localStorage.getItem('loginLanguage')
if(route?.params?.lang == 'cn'){
savedLang = 'CHINESE_SIMPLIFIED'
localStorage.setItem('loginLanguage', savedLang)
}{
savedLang = 'ENGLISH'
localStorage.setItem('loginLanguage', savedLang)
}
const savedLang = localStorage.getItem('loginLanguage')
if (savedLang) {
isChinese.value = savedLang === 'CHINESE_SIMPLIFIED'
locale.value = savedLang