12 Commits

Author SHA1 Message Date
李志鹏
7c14b1d831 Merge branch 'StableVersion' of http://18.167.251.121:10003/aidlab/aida_front into StableVersion 2026-04-15 11:37:13 +08:00
李志鹏
8966b52430 红绿图b 2026-04-15 11:37:11 +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
X1627315083@163.com
f16aa6ea14 fix 2026-04-10 18:14:20 +08:00
X1627315083@163.com
a25abeb527 fix 2026-04-10 16:54:22 +08:00
X1627315083@163.com
d359cd7763 注释选择信用卡支付和支付宝支付的选项,改为默认信用卡自动续费支付 2026-03-30 10:43:27 +08:00
23085d9a9b Merge branch 'dev_vite' into StableVersion 2026-03-25 10:18:13 +08:00
X1627315083@163.com
35c6dfe29c 印花默认为正片叠底 2026-03-24 14:43:12 +08:00
14 changed files with 3218 additions and 3181 deletions

View File

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

View File

@@ -907,7 +907,8 @@
} }
emit("changeCanvas", commandData) emit("changeCanvas", commandData)
canvasManager.changeCanvas() canvasManager.changeCanvas()
if ((command.canUndo || command.canRedo) && props.enabledRedGreenMode) { const type = command.type
if (props.enabledRedGreenMode && (type === "undo" || type === "redo")) {
setTimeout(async () => { setTimeout(async () => {
try { try {
const imageData = await canvasManager.exportImage({ const imageData = await canvasManager.exportImage({
@@ -1040,6 +1041,7 @@
}, },
// 导出图片 // 导出图片
exportImage: async ({ exportImage: async ({
isFrontBackUpdata = false, // 更新红绿图时候需要用,直接更新红绿图
isContainBg = false, // 是否包含背景图层 isContainBg = false, // 是否包含背景图层
isContainFixed = false, // 是否包含固定图层 isContainFixed = false, // 是否包含固定图层
isContainFixedOther = true, // 是否包含其他固定图层--颜色图层 isContainFixedOther = true, // 是否包含其他固定图层--颜色图层
@@ -1056,6 +1058,10 @@
} = {}) => { } = {}) => {
loading.value = true loading.value = true
canvasManager?.canvas?.discardActiveObject() canvasManager?.canvas?.discardActiveObject()
if (isFrontBackUpdata) {
await canvasManager?.setSpecialCliptInfo(true, true)
canvasManager.canvas.renderAll()
}
var base64 = await canvasManager.exportImage({ var base64 = await canvasManager.exportImage({
isContainBg, isContainBg,
isContainFixed, 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._recordPerformance("execute", command.constructor.name, duration);
// 通知状态变化 // 通知状态变化
this._notifyStateChange(); this._notifyStateChange("execute");
console.log(`✅ 命令执行成功: ${command.constructor.name}`); console.log(`✅ 命令执行成功: ${command.constructor.name}`);
return result; return result;
@@ -219,7 +219,7 @@ export class CommandManager {
this._recordPerformance("undo", command.constructor.name, duration); this._recordPerformance("undo", command.constructor.name, duration);
// 通知状态变化 // 通知状态变化
this._notifyStateChange(); this._notifyStateChange("undo");
console.log(`✅ 命令撤销成功: ${command.constructor.name}`); console.log(`✅ 命令撤销成功: ${command.constructor.name}`);
return result; return result;
@@ -258,7 +258,7 @@ export class CommandManager {
this._recordPerformance("redo", command.constructor.name, duration); this._recordPerformance("redo", command.constructor.name, duration);
// 通知状态变化 // 通知状态变化
this._notifyStateChange(); this._notifyStateChange("redo");
console.log(`✅ 命令重做成功: ${command.constructor.name}`); console.log(`✅ 命令重做成功: ${command.constructor.name}`);
return result; return result;
@@ -298,7 +298,7 @@ export class CommandManager {
this.undoStack = []; this.undoStack = [];
this.redoStack = []; this.redoStack = [];
this._notifyStateChange(); this._notifyStateChange("clear");
// console.log("📝 命令历史已清空"); // console.log("📝 命令历史已清空");
} }
@@ -417,10 +417,12 @@ export class CommandManager {
* 通知状态变化 * 通知状态变化
* @private * @private
*/ */
_notifyStateChange() { _notifyStateChange(type) {
if (this.onStateChange) { if (this.onStateChange) {
try { try {
this.onStateChange(this.getState()); const obj = this.getState();
obj.type = type;
this.onStateChange(obj);
} catch (error) { } catch (error) {
console.error("状态变化回调执行失败:", error); console.error("状态变化回调执行失败:", error);
} }

View File

@@ -85,7 +85,7 @@ export class LiquifyRealTimeUpdater {
if (isDrawing && this.config.useDirectUpdate) { if (isDrawing && this.config.useDirectUpdate) {
// 拖拽过程中使用快速更新(降低质量以提高性能) // 拖拽过程中使用快速更新(降低质量以提高性能)
this._fastUpdate(imageData); await this._fastUpdate(imageData);
} else { } else {
// 拖拽结束后使用完整更新(最高质量) // 拖拽结束后使用完整更新(最高质量)
await this._fullUpdate(imageData); await this._fullUpdate(imageData);
@@ -124,7 +124,7 @@ export class LiquifyRealTimeUpdater {
* @param {ImageData} imageData 图像数据 * @param {ImageData} imageData 图像数据
* @private * @private
*/ */
_fastUpdate(imageData) { async _fastUpdate(imageData) {
if (!this.targetObject || !this.targetObject._element) { if (!this.targetObject || !this.targetObject._element) {
return; return;
} }
@@ -138,12 +138,14 @@ export class LiquifyRealTimeUpdater {
// 直接更新fabric对象的图像源使用PNG格式保持质量 // 直接更新fabric对象的图像源使用PNG格式保持质量
const targetElement = this.targetObject._element; const targetElement = this.targetObject._element;
// 方案1: 直接设置src属性最高性能 // 方案1: 直接设置src属性最高性能
const dataURL = this.tempCanvas.toDataURL("image/png", quality); const dataURL = this.tempCanvas.toDataURL("image/png", quality);
if (targetElement.src !== dataURL) { 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对象为脏状态但不立即渲染 // 关键优化直接设置fabric对象为脏状态但不立即渲染
// this.targetObject.dirty = false; // 标记为不需要立即渲染 // this.targetObject.dirty = false; // 标记为不需要立即渲染

View File

@@ -447,6 +447,7 @@
</template> </template>
</CanvasEditor> </CanvasEditor>
</div> </div>
<img src="" alt="" id="canvas-test-dom">
</div> </div>
</template> </template>
<style> <style>
@@ -458,6 +459,13 @@
height: 600px !important; height: 600px !important;
z-index: 99999999; z-index: 99999999;
} }
#canvas-test-dom{
position: fixed;
z-index: 9999999999;
top: 0;
left: 0;
pointer-events: none;
}
</style> </style>
<style scoped lang="less"> <style scoped lang="less">
* { * {

View File

@@ -163,7 +163,6 @@ export default defineComponent({
const privewDetail = async (oldSelectDetail = detailData.selectDetail)=>{ const privewDetail = async (oldSelectDetail = detailData.selectDetail)=>{
// if(!detailDom.editCanvas)return // if(!detailDom.editCanvas)return
return new Promise(async (res,reject)=>{ return new Promise(async (res,reject)=>{
console.log(detailDom.editCanvas)
await detailDom.editCanvas.exportImage({ await detailDom.editCanvas.exportImage({
isContainFixed:true, isContainFixed:true,
width:props.sketchSize.width, width:props.sketchSize.width,
@@ -245,17 +244,27 @@ export default defineComponent({
const frontBackChange = async (value:any)=>{ 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){ if(!detailData.selectDetail.partialDesign.partialDesignPath && !detailData.selectDetail.partialDesign.partialDesignBase64){
await privewDetail() 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 full = detailData.selectDetail.partialDesign.partialDesignBase64 || detailData.selectDetail.partialDesign.partialDesignPath || detailData.selectDetail.path
let size = { let size = {
...detailData.canvasConfig, ...detailData.canvasConfig,
} }
store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
segmentImage(value,full,size).then(async (rv)=>{ 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?.oldImageUrl)front.oldImageUrl = front.imageUrl
if(!front?.oldMaskUrl)front.oldMaskUrl = front.maskUrl if(!front?.oldMaskUrl)front.oldMaskUrl = front.maskUrl
if(!back?.oldImageUrl)back.oldImageUrl = back.imageUrl if(!back?.oldImageUrl)back.oldImageUrl = back.imageUrl
@@ -267,7 +276,6 @@ export default defineComponent({
back.imageUrl = rv.targetBackUrl back.imageUrl = rv.targetBackUrl
// store.commit('DesignDetail/updataDetailItem',{maskUrl:value}) // store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
}) })
} }
const editSketchCanvasInit = async (value:any)=>{ const editSketchCanvasInit = async (value:any)=>{
detailData.canvasInstance = value detailData.canvasInstance = value

View File

@@ -393,8 +393,8 @@ export default defineComponent({
angle: 0, angle: 0,
flipX: false, flipX: false,
flipY: false, flipY: false,
// blendMode: "multiply", blendMode: "multiply",
blendMode: "source-over", // blendMode: "source-over",
gapX: 0, gapX: 0,
gapY: 0, gapY: 0,
} }

View File

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

View File

@@ -205,7 +205,7 @@
</div> </div>
<div class="payment"> <div class="payment">
<div class="allocation"> <div class="allocation">
<div class="selectType"> <!-- <div class="selectType">
<div class="text">{{ $t('Renew.Payment') }}:</div> <div class="text">{{ $t('Renew.Payment') }}:</div>
<label> <label>
<input <input
@@ -227,7 +227,7 @@
/> />
{{ $t('Renew.Alipay') }} {{ $t('Renew.Alipay') }}
</label> </label>
</div> </div> -->
</div> </div>
<div class="gallery_btn gallery_btn_radius" @click="payment"> <div class="gallery_btn gallery_btn_radius" @click="payment">
{{ $t('upgradePlan.Continue') }} {{ $t('upgradePlan.Continue') }}

View File

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

View File

@@ -41,10 +41,10 @@
<div class="center">{{ selectObject?.styleName?selectObject?.styleName:$t('Header.All') }}</div> <div class="center">{{ selectObject?.styleName?selectObject?.styleName:$t('Header.All') }}</div>
<div class="gallery_btn" @click="setStyle">{{ $t('Habit.Select') }}</div> <div class="gallery_btn" @click="setStyle">{{ $t('Habit.Select') }}</div>
</div> </div>
<div class="style brand marginBottom"> <!-- <div class="style brand marginBottom">
<div class="text">{{$t('Habit.Brand')}}:</div> <div class="text">{{$t('Habit.Brand')}}:</div>
<div class="gallery_btn" @click="setBrandDNA">{{ $t('Habit.Select') }}</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="brandImg" v-if="selectObject.userBrandDna"><img :src="selectObject.userBrandDnaImg"></div>
<div class="brandDNAStrenght marginBottom" v-if="selectObject.userBrandDna"> <div class="brandDNAStrenght marginBottom" v-if="selectObject.userBrandDna">
<div class="text" style="font-size: 1.6rem;"> <div class="text" style="font-size: 1.6rem;">

View File

@@ -340,12 +340,12 @@ const navTypeList = (t)=>{
value:'Models', value:'Models',
router:'library=Models' router:'library=Models'
}, },
{ // {
icon:'fi-ss-gem', // icon:'fi-ss-gem',
label:t('LibraryPage.brandDNA'), // label:t('LibraryPage.brandDNA'),
value:'MyBrand', // value:'MyBrand',
router:'library=MyBrand' // router:'library=MyBrand'
}, // },
] ]
}, },
// history:{ // history:{