Compare commits

7 Commits

Author SHA1 Message Date
X1627315083@163.com
4d6a1f512e Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-04-14 16:20:35 +08:00
X1627315083@163.com
d7d66b8da4 Merge remote-tracking branch 'origin/StableVersion' into dev_vite 2026-04-14 16:20:06 +08:00
X1627315083@163.com
5fa049f73d 隐藏brandDNA功能 2026-04-14 15:30:19 +08:00
X1627315083@163.com
575445f767 fix 2026-04-14 15:27:57 +08:00
李志鹏
f43c56236b 液化苹果浏览器闪屏问题 2026-04-14 10:02:06 +08:00
李志鹏
4352f7c2f4 111 2026-04-13 11:52:24 +08:00
李志鹏
c6b1bdbdf1 红绿图导出问题 2026-04-13 11:20:26 +08:00
12 changed files with 3217 additions and 3168 deletions

View File

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

View File

@@ -907,7 +907,8 @@
}
emit("changeCanvas", commandData)
canvasManager.changeCanvas()
if ((command.canUndo || command.canRedo) && props.enabledRedGreenMode) {
const type = command.type
if (props.enabledRedGreenMode && (type === "undo" || type === "redo")) {
setTimeout(async () => {
try {
const imageData = await canvasManager.exportImage({
@@ -1057,7 +1058,10 @@
} = {}) => {
loading.value = true
canvasManager?.canvas?.discardActiveObject()
if(isFrontBackUpdata)await canvasManager?.changeCanvas()
if (isFrontBackUpdata) {
await canvasManager?.setSpecialCliptInfo(true, true)
canvasManager.canvas.renderAll()
}
var base64 = await canvasManager.exportImage({
isContainBg,
isContainFixed,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -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; // 标记为不需要立即渲染

View File

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

View File

@@ -247,6 +247,7 @@ export default defineComponent({
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{

View File

@@ -4,7 +4,7 @@
<!-- <div class="newPosted_generalMessage_title_setting pointer" @click="allRead">全部已读</div> -->
</div>
<div class="newPosted_generalMessage_center modal_title_text">
<div class="newPosted_generalMessage_item" v-for="item in dataList" :key="item.id" @click="setRead(item)">
<div class="newPosted_generalMessage_item" v-for="item in dataList" :key="item.id">
<!-- <a-badge :dot="item.isRead == 0"></a-badge> -->
<div class="newPosted_generalMessage_item_right">
<div class="newPosted_generalMessage_item_img pointer" @click="openOtherUsers(item)">

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

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

@@ -304,6 +304,23 @@ const {} = toRefs(data);
&.Small{
--itemWidth: 17rem;
--itemHeight: 26.1rem;
--iconFS: 1.4rem;
--iconWH: 2.4rem;
--iconTR: 1.2rem;
}
&.Medium{
--itemWidth: 22.6rem;
--itemHeight: 34.6rem;
--iconFS: 1.6rem;
--iconWH: 3rem;
--iconTR: 1.4rem;
}
&.Large{
--itemWidth: 29.2rem;
--itemHeight: 44.8rem;
--iconFS: 2.2rem;
--iconWH: 4rem;
--iconTR: 1.62rem;
}
> .item{
width: var(--itemWidth);
@@ -314,18 +331,19 @@ const {} = toRefs(data);
position: relative;
> .choose{
display: flex;
width: 2.4rem;
height: 2.4rem;
width: var(--iconWH);
height: var(--iconWH);
position: absolute;
background-color: #000;
border-radius: 50%;
display: none;
justify-content: center;
align-items: center;
top: 1.2rem;
right: .9rem;
top: var(--iconTR);
right: var(--iconTR);
> i{
color: #fff;
font-size: var(--iconFS);
display: flex;
}
}