Merge remote-tracking branch 'origin/develop' into StableVersion

This commit is contained in:
X1627315083
2024-10-21 09:47:16 +08:00
119 changed files with 34227 additions and 26724 deletions

View File

@@ -4,8 +4,9 @@ NODE_ENV = 'development'
# VUE_APP_BASE_URL = 'http://18.167.251.121:10086'
VUE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
VUE_APP_BASE_URL = 'https://www.api.aida.com.hk'
# VUE_APP_BASE_URL = 'https://www.api.aida.com.hk'
# 佩佩
# VUE_APP_BASE_URL = 'http://192.168.1.4:5567'
# 海波
# VUE_APP_BASE_URL = 'http://192.168.1.9:5567'

View File

@@ -1,4 +0,0 @@
NODE_ENV = 'production'
# VUE_APP_BASE_URL = 'http://18.167.251.121:10086'
# VUE_APP_BASE_URL = 'https://polyu.api.aida.com.hk'
VUE_APP_BASE_URL = 'https://api.aida.com.hk'

View File

@@ -1,11 +0,0 @@
NODE_ENV = 'development'
# VUE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
# VUE_APP_BASE_URL = 'https://api.aida.com.hk'
# VUE_APP_BASE_URL = 'http://18.167.251.121:10086'
VUE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
# VUE_APP_BASE_URL = 'https://api.aida.com.hk'
# 佩佩
VUE_APP_BASE_URL = 'http://192.168.1.7:5567'
# 海波
# VUE_APP_BASE_URL = 'http://192.168.1.9:5567'

View File

@@ -1,4 +0,0 @@
# NODE_ENV = 'production'
NODE_ENV = 'development'
# VUE_APP_BASE_URL = 'http://18.167.251.121:10086'
VUE_APP_BASE_URL = 'https://www.api.aida.com.hk'

View File

@@ -1,4 +0,0 @@
# NODE_ENV = 'production'
NODE_ENV = 'development'
# VUE_APP_BASE_URL = 'http://18.167.251.121:10086'
VUE_APP_BASE_URL = 'https://www.api.aida.com.hk'

View File

@@ -1,4 +0,0 @@
NODE_ENV = 'production'
# VUE_APP_BASE_URL = 'http://18.167.251.121:10086'
# VUE_APP_BASE_URL = 'https://polyu.api.aida.com.hk'
VUE_APP_BASE_URL = 'https://www.api.aida.com.hk'

View File

@@ -1,11 +0,0 @@
NODE_ENV = 'development'
# VUE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
# VUE_APP_BASE_URL = 'https://api.aida.com.hk'
# VUE_APP_BASE_URL = 'http://18.167.251.121:10086'
VUE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
VUE_APP_BASE_URL = 'https://www.api.aida.com.hk'
# 佩佩
# VUE_APP_BASE_URL = 'http://192.168.1.7:5567'
# 海波
# VUE_APP_BASE_URL = 'http://192.168.1.9:5567'

View File

@@ -1,607 +0,0 @@
export default {
Header:{
hello:'你好',
HOME:'首页',
LIBRARY:'收藏',
HISTORY:'历史',
WORKS:'作品广场',
bindEmail:'绑定邮箱',
logOff:'退出登录',
Tutorial:'教程',
language:'中文',
skip:'跳过',
emailContent:'你绑定了的邮箱',
Email:'邮箱',
NextStep:'下一步',
verification:'输入验证码',
SentTo:'发送',
Resend:'重发',
Credits:'积分',
TaskList:'任务列表',
ViewOrders:'查询订单',
jsContent1:'邮箱格式不正确',
jsContent2:'绑定邮箱成功',
jsContent3:`已经长时间未操作,您必须活跃起来,否则将会在{numTime} S 后退出登录`,
},
allOrder:{
Time:'时间',
Serial:'序号',
Title:'名字',
Money:'金额',
Payment:'支付方式',
State:'状态',
Income:'支出',
Expend:'收入',
credits:'积分',
changedCredits:'积分变更',
changeEvent:'增加/减少积分',
createTime:'创建时间',
},
payOrder:{
OrderInformation:'订单详情',
CreditsInformation:'积分详情',
},
exportModel:{
EditExport:'编辑 & 导出',
CanvasSize:'画布大小',
Height:'高',
Width:'宽',
CanvasNav:'缩略图',
CanvasTool:'画布工具',
Color:'颜色',
Size:'大小',
Brushwork:'绘画',
Texture:'材质',
FillBack:'填充 & 边',
Layer:'层级',
More:'参数',
insufficient:'您的积分余额不足,如需使用此功能,请点击左上角充值',
HDExport:'转高清',
Save:'保存',
Share:'发布',
Export:'导出',
SR:'请选择需要超分的图片',
requiresCredits:'执行超分的图片需要消耗{data}积分',
Scale:'倍率',
Cancel:'取消',
jsContent1:"您是否已经保存画布内容?如果没有,请再关闭前点击'保存'。",
jsContent2:'我们只支持对印花进行超分',
jsContent3:'您的积分小于一次超分',
jsContent4:'您的积分余额不足',
jsContent5:'您选择的第{str}张图像在超分辨率增强后的分辨率超过2048。请选择较低的放大倍数。',
jsContent6:'请选择需要超分的图片',
jsContent7:'保存成功~',
},
upgradePlan:{
BuyCredlts:'购买积分',
credits:'积分',
organization:'积分再任意场景都可以使用',
CreditCard:'信用卡',
Alipay:'支付宝',
HongKong:'香港',
MainlandChina:'中国大陆',
Continue:'继续',
payment:'选择付款方式',
Cancel:'取消',
Payment:'付款',
policy1:'我承认我已阅读并同意',
policy2:'条款和条件',
policy3:'(包括服务范围)及',
policy4:'订购协议',
completed:'是否已完成支付?',
hint:'请保持窗口打开直到付款完成。如果您无法打开付款窗口请检查您的浏览器设置看看弹出窗口是否被阻止。成功付款后积分可能会延迟发放。请等待1-3分钟点击积分刷新按钮',
Back:'返回',
},
taskPage:{
TaskList:'任务列表',
download:'下载',
},
Habit:{
Workspace:'工作空间',
WorkspaceSetting:'设置工作空间',
settingWorkspace:'调整您的工作空间',
Overall:'整体',
Single:'单件',
System:'系统',
Designer:'设计师',
Mannequin:'模特',
Current:'当前',
User:'用户',
Style:'风格',
Select:'选择',
Clear:'清除',
jsContent1:'是否删除指定工作空间',
jsContent2:'请输入当前工作空间的名字',
jsContent3:'看到您换了风格。您是否愿意将目前使用的模特替换为系统推荐的模特?',
},
RobotAssist:{
inputContent1:"问我什么都行~",
jsContent1:"请输入生成内容~",
jsContent2:"欢迎来到AiDA。我是您友好的时尚设计助手。如果您有任何问题或需要帮助请随时问我。",
jsContent3:"看来您可能是新用户我很乐意为您介绍我们全新升级的AiDA系统。您现在要开始教程吗",
jsContent4:"您可以随时告诉我要开始教程。",
jsContent5:"在开始教程之前,我们需要刷新页面。您现在要开始教程吗?",
},
HomeView:{
GetStarted:'开始设计',
Start:'开始',
Edit:'编辑',
Reset:'重置',
Design:'设计',
Redesign:'重新设计',
GeneratedDesign:'生成的设计',
SelectedDesign:'喜欢的设计',
Export:'导出',
moodboard:"情绪板",
printboard:"印刷板",
colorboard:"调色板",
sketchboard:"线稿板",
mannequins:"人体模型",
masnnequinHint:"您使用的模特与当前的衣服不匹配,这将导致生成的模型不使用所选的衣服",
FinalizeCollection:"完成系列",
jsContent1:'您必须选择一种或多种颜色进行下一步。',
jsContent2:'您必须选择一种或多种颜色进行下一步。',
jsContent3:'导出文件失败。',
jsContent4: "您的订阅将在 {days} 天 {hours} 小时后到期。为确保服务不中断,请点击此处续订->",
jsContent8: "续订订阅。",
jsContent7:"友情提示",
jsContent5:"我们很高兴让您体验AiDA 3.0。请注意,部分服务在试用期间可能会受到限制。如果您已经准备好全身心投入并享受完整的体验,我们诚挚地邀请您订阅。只需访问",
jsContent6:" 就可以开始订阅。感谢您试用我们的服务!",
jsContent9:"您确定要清除当前系列并重新开始吗?",
jsContent10:"二次创作的作品不允许使用'设计',但是您可以使用'重新设计'",
},
ProductImg:{
Finalize:'完成',
SelectCollection:'选择的系列',
Upload:'上传',
MagicTools:'转换产品图工具',
Similarity:'相似度',
RelightDirection:'打光方向',
GenerateProduct:'生成的产品',
SelectedProduct:'选择的产品',
Export:'导出',
moreTitle:'更多工具',
ProductImage:'产品图',
Relight:'打光',
RightLight:'右侧光',
LeftLight:'左侧光',
TopLight:'顶部光',
BottomLight:'底部光',
Clear:'清空',
jsContent1:'如果您离开此页,您的更改将会丢失。您确定要离开这一页吗?',
jsContent2:'请至少选择一张图片',
},
LibraryPage:{
Organize:'整理',
Upload:'上传',
Generate:'生成',
Close:'取消',
Reset:'重置',
currently:'您排在队列中的第{generateLineUp}位',
Delete:'删除',
Rename:'编辑',
Point:'点',
inputContent1:'输入名字进行搜索',
intersection:'交集',
Tag:'标签:',
Select:'选择',
NoLabel:'空标签',
unionSet:'并集',
all:'全选',
generated:'所有默认材质都是AiDA自己生成',
ImageOnly:'图片',
TextOnly:'文字',
TextImage:'图片-文字',
inputContent2:'输入生成图片的标题',
maximumLength:'输入的内容超过允许输入的最大长度',
Model1:'笔墨画风',
Model2:'插画画风',
Model3:'真实画风',
Name:'名字:',
Category:'类别:',
inputContent3:'输入生成图片的标题',
Cancel:'取消',
Sure:'保存',
Moodboard:'情绪板',
Prints:'印花',
Sketches:'服装',
DesignElements:'设计元素',
Mannequins:'模特',
model:'模型',
jsContent1:'你确定要删除选中图片吗?',
jsContent2:'你确定要删除选中图片吗?',
jsContent3:'您只能上传图片文件!',
jsContent4:'图片必须小于5MB',
jsContent5:'图片已经上传是否继续上传',
jsContent6:'输入的内容超过允许输入的最大长度',
jsContent7:'请输入内容~',
jsContent8:'上传失败',
jsContent9:'选择一张图片~',
},
HistoryPage:{
History:'历史',
StartDate:'开始日期',
EndDate:'结束日期',
inputContent1:'输入名字进行搜索',
Detail:'细节',
Rename:'重命名',
Retrieve:'选择',
Delete:'删除',
inputContent2:'请输入新名称',
Submit:'保存',
CollectionsName:'名字',
source:'来源',
UptateTime:'修改时间',
SketchCounts:'草图数量',
Operations:'Operations',
jsContent1:'删除成功',
jsContent2:'您确定要删除这个收藏吗?',
jsContent3:'修改成功',
jsContent4:'图片必须小于5MB',
jsContent5:'图片已经上传是否继续上传',
jsContent6:'输入的内容超过允许输入的最大长度',
jsContent7:'请输入内容~',
},
ModelPlacement:{
Registration:'新增模特',
Submit:'保存',
Preview:'预览',
Back:'Back',
Restore:'重置',
System:'系统',
Library:'收藏',
Point:'点位',
RemovePoint:'删除点位',
mannequinHint:'模特背景图片请使用白色或者其他颜色来增强效果',
SHOULDER:'肩膀',
WAISTBAND:'腰部',
HAND:'手',
jsContent1:"您还没有保存,模特不会上传,确定要继续吗?",
jsContent2:'图片已经上传是否继续上传',
},
ModelPlacementMobile:{
Registration:'新增模特',
Submit:'保存',
Preview:'预览',
Back:'Back',
Restore:'重置',
System:'系统',
Library:'收藏',
Point:'点位',
RemovePoint:'删除点位',
mannequinHint:'模特背景图片请使用白色或者其他颜色来增强效果',
SHOULDER:'肩膀',
WAISTBAND:'腰部',
HAND:'手',
jsContent1:"您还没有保存,模特不会上传,确定要继续吗?",
jsContent2:'图片已经上传是否继续上传',
},
Upload:{
Delete:'删除',
Maximum2M:'您最多可以上传10张照片每张照片不能超过5MB',
jsContent1:'您只能上传图片文件!',
jsContent2:'图片必须小于5MB',
jsContent3:'上传失败',
},
SketchboardUpload:{
Upload:'上传',
Library:'收藏',
Generate:'生成',
Close:'取消',
currently:'您排在队列中的第{generateLineUp}位',
PIN:'PIN',
Maximum:'最多可上传{maxImg}张图片每张图片最大5MB',
Thumbnail:'选择的线稿',
inputContent1:'生成图片的标题',
maximumLength:'输入的内容超过允许输入的最大长度',
jsContent1:"上传失败",
jsContent2:"您只能上传图片文件!",
jsContent3:'图片必须小于5MB',
jsContent4:"超过允许上传的最大图片数量",
jsContent5:"请选择一张图片",
jsContent6:"输入的内容超过允许输入的最大长度",
jsContent7:"请输入内容~",
},
PrintboardUpload:{
Upload:'上传',
Library:'收藏',
Generate:'生成',
Close:'取消',
currently:'您排在队列中的第{generateLineUp}位',
PIN:'PIN',
Maximum:'最多可上传16张图片每张图片最大5MB',
Thumbnail:'选择的印花',
inputContent1:'生成图片的标题',
maximumLength:'输入的内容超过允许输入的最大长度',
PatternTitle:'生成可在服装上完全平铺的重复设计图案。',
LogoTitle:'为文字内容创建艺术字体设计,适用于各种标语或短语。',
SloganTitle:'输入的内容超过允许输入的最大长度',
jsContent1:"您只能上传图片文件!",
jsContent2:'图片必须小于5MB',
jsContent3:"超过允许上传的最大图片数量",
jsContent4:"请选择一张图片",
jsContent5:"输入的内容超过允许输入的最大长度",
jsContent6:"请输入内容~",
},
ColorboardUpload:{
Thumbnail:'选择的颜色缩略图',
Clear:'清除',
Palette:'调色板',
HEX:'HEX',
RGBA:'RGBA',
UploadImage:'上传图片',
ColorCode:'颜色代码',
SelectSuccessively:'连选',
SelectSuccessivelyOnTitle:'连续选色模式开启.',
SelectSuccessivelyOffTitle:'连续选色模式关闭.',
SelectSeparately:'单选',
ExtractColor:'提取颜色',
Single:'单色',
Gradual:'渐变',
Alignment:'线性',
uploadTitle:'从本地上传图片',
selectTitle:'从情绪版或印花版选择图片',
jsContent1:"您的浏览器不支持",
jsContent2:"找不到这个TCX的颜色",
jsContent3:"您只能上传图片文件!",
jsContent4:'图片必须小于5MB',
jsContent5:"请输入正确的TCX值",
jsContent6:"请至少选择一个情绪版或者印花",
},
selectImgList:{
SelectImg:'选择图片',
Clear:'关闭',
},
MoodboardUpload:{
Upload:'上传',
Library:'收藏',
Generate:'生成',
Delete:'删除',
Maximum:'最多可上传8张图片每张图片最大5MB',
Thumbnail:'选择的情绪板',
layout:'布局',
selected:'当前的情绪版布局',
Edit:'编辑',
jsContent1:'您最多可以选择8张图片',
jsContent2:"上传失败",
jsContent3:"您只能上传图片文件!",
jsContent4:'图片必须小于5MB',
jsContent5:'请点击布局进行随机排序',
},
Cropper:{
Cutpicture:'切图',
Finish:'完成',
Cancel:'取消',
CropPreview:'缩略图',
},
Material:{
inputContent1:'输入名字进行搜索',
PIN:'PIN',
},
MarketingSketchUpload:{
Upload:'上传',
MyLibrary:'我的收藏',
maximumLength:'最多可以上传15张照片每张照片不能超过5MB',
jsContent1:'上传失败',
jsContent2:"您只能上传图片文件!",
jsContent3:'图片必须小于5MB',
jsContent5:'超过允许上传的最大图片数量',
},
layout:{
MoodBoardDesign:'设计情绪板',
LayerOptions:'图层选项',
Submit:'保存',
},
Generate:{
ImageOnly:'图片',
TextOnly:'文字',
TextImage:'图片-文字',
Model1:'笔墨画风',
Model2:'插画画风',
Model3:'真实画风',
inputContent1:'输入生成图片的标题',
Generate:'生成',
Sequence:'队列',
Close:'取消',
currently:'您排在队列中的第{generateLineUp}位',
Merge:'合成',
maximumLength:'输入的内容超过允许输入的最大长度',
effectPoor:'当前生成的图像质量低于标准。请考虑调整您的提示词并再次尝试。',
Model:'模型',
uploadTitle:'上传参考图',
sloganTitle:'输入文字内容',
jsContent1:"您只能上传图片文件!",
jsContent2:'图片必须小于5MB',
jsContent3:"请输入内容~",
jsContent4:'输入的内容超过允许输入的最大长度',
jsContent5:"请输入内容~",
jsContent6:"您最多可以选择8张图片",
jsContent7:"上传失败",
jsContent8:"您{str}还有{num}次生成额度。",
jsContent9:"您的{str}生成额度已用完。",
jsContent10:"请完成标语图片",
jsContent11:"看到输入的内容可能存在重叠,重叠会影响最终效果哦~",
jsContent12:"最少需要创建一个文字",
},
collectionModal:{
Moodboard:'情绪板',
Printboard:'印花板',
Colorboard:'颜色板',
Sketchboard:'线稿板块',
MoodCollection:'为您的系列选择情绪版',
PrinCollection:'为您的系列选择印花版',
ColorCollection:'为您的系列选择颜色版',
SketchCollection:'为您的系列选择线稿版',
jsContent1:'因为您选择了多张图片,请点击布局后继续.',
jsContent2:'上传的文件不会保存,是否继续? ',
jsContent3:'您必须选择一种或多种颜色进行下一步。',
jsContent5:"我们检测到您的({str})上的PIN数量超过了八个这可能会导致一些已钉住的项目未被使用。您是否仍要继续",
},
DesignDetail:{
Details:'详情',
EditDetails:'编辑设计的细节',
editTitle:'修改单品',
DetailTitle:'删除单品',
compareTitle:'对比',
Submit:'保存',
CurrentApparel:'当前服装',
editSketchTitle:'修改草图',
CurrentPrint:'当前印花',
CurrentColor:'当前颜色',
},
DesignDetailAlter:{
Upload:'上传',
Library:'收藏',
inputContent1:'输入名字进行搜索',
Palette:'调色板',
HEX:'HEX',
RGBA:'RGBA',
UploadImage:'上传图片',
Delete:'删除',
ColorCode:'颜色代码',
jsContent1:"您的浏览器不支持",
jsContent2:"您最多可以选择8张图片",
jsContent3:"上传失败",
jsContent4:'您只能上传图片文件!',
jsContent5:'Image must smaller than 5MB!',
jsContent6:"找不到这个TCX的颜色",
},
addDetails:{
AddDetails:'添加细节',
submit:'保存',
jsContent1:'请至少绘制一条线段',
},
DesignDetailEnd:{
NewApparel:'选择的服装',
NewPrint:'选择的印花',
Placement:'模式',
Overall:'整体',
Single:'单个',
NewColor:'选择的颜色',
preview:'预览',
Layout:'布局',
jsContent1:'请选择印个印花',
jsContent2:'请选择颜色',
},
DesignPrintOperation:{
Placement:'调整位置',
Overall:'整体',
Single:'单件',
Scale:'Scale',
Random:'随机',
inputContent:'输入名字进行搜索',
preview:'预览',
isOverall:'图案图像不能在单件模式下使用',
jsContent1:'以上更改尚未保存,您确定要继续吗?',
},
uploadFile:{
jsContent1:'您最多可以选择{maxImg}张图片哦',
},
isTest:{
available:"此功能对试用用户不可用。",
src:"此功能对试用用户不开放,请访问进行订阅。",
userName:'试用用户',
loginIsTest:"您是试用用户,试用期到 {date}。为了用户数据的安全,我们不会保存试用用户上传的任何个人数据,并会在每次注销后擦除个人数据。如果您需要订阅,请点击 ->",
image:'由于您是试用用户您只能上传10张图片。'
},
setLabel:{
EditTag:'编辑标签',
jsContent1:'请输入标签名称',
},
works:{
all:'全部',
FavoriteWorks:'点赞的作品',
MyWorks:'我的作品',
},
Publish:{
Publish:'发布',
CoverPicture:'封面图',
CollectionTitle:'系列名字',
Description:'描述',
Permissions:'权限',
PermissionsItem1:'允许其他用户进行二次创作。',
Close:'关闭',
UpdatePublish:'更新发布',
jsContent1:'如果您离开此页,您的更改将会丢失。您确定要离开这一页吗?',
jsContent2:'请输入您的作品名称',
jsContent3:'这将把您的作品发布到广场上,供所有用户查看。请确认是否发布?',
jsContent4:'发布成功!你可以在我的作品中找到',
},
newScaleImage:{
Collection:'系列',
SecondaryCreation:'二次创作',
CreationTime:'创建时间',
UpdateTime:'更新时间',
Comment:'评论',
NoComments:'没有评论',
first:'你可以成为第一个评论',
reply:'回复',
unfold:'展开',
Collapse:'折叠',
Title:'标题',
Original:'原创',
from:'源自',
Delete:'删除',
Describe:'描述',
replyAll:'所有回复',
jsContent1:'请先登录或者升级为正式用户',
jsContent2:'作者不允许二次创作',
jsContent3:'请输入评论内容',
jsContent4:'是否删除当前评论',
jsContent5:'是否删除当前作品',
jsContent6:'作品被作者删除',
},
guide:{
guide1:"在<strong>工作空间</strong>中,您可以个性化您的设计设置,包括选择适用于男装或女装的设计,以及选择用于创作的人体模型。",
guide2:"选择您要设计的服装性别。",
guide3:'在此更改人体模型。',
guide4:'您目前可以从我们的系统库中选择人体模型。稍后,您还可以在注册自己的人体模型后从用户库中进行选择。',
guide5:'在这里开始您的创意之旅。 ',
guide6:'对于情绪板、印花或服装,我们提供三种不同的图片添加方法。第一种选择是<strong>上传</strong>,允许您直接从本地设备上传。',
guide7:"第二种方法是从您的<strong>收藏</strong>中选择。<br> 您可能会注意到您的库页面目前是空的;不必担心。您上传的所有图像都将自动添加到您的库中。将来,您无需每次上传,只需从您的库中选择即可。",
guide8:'第三种方法是使用最新的图像生成技术<strong>生成</strong>图像。',
guide9:"输入捕捉您希望表达的情绪的关键词,然后单击<strong>生成</strong>按钮。",
guide10:'为您的心情板选择两个图像。',
guide11:"点击此处布局您的情绪版。",
guide12:"点击此处生成印花图片。",
guide13:"点击此处生成印花图片。",
guide14:"我们为生成图片提供三个输入选项:仅图片、仅文本和图片文本。",
guide15:"选择此选项,我们将使用您上传的图片和输入的文本生成四张印花图片。",
guide16:"在此处选择生成模型;不同的模型将以不同的风格生成图片。",
guide17:"在此处选择生成模型;不同的模型将以不同的风格生成图片。",
guide18:"在此处上传输入图片。",
guide19:"点击此图片进行选择。",
guide20:"输入关于您希望创建的印花的关键词,然后点击<strong>生成</strong>按钮。",
guide21:"选择您最喜欢的生成印花。",
guide22:"点击此处进行下一步。",
guide23:"点击此处从图像中提取主要颜色。",
guide24:"从这些颜色块中选择您想要的第一种颜色。",
guide25:"点击此块选择第二种颜色。",
guide26:"从这些颜色块中选择您想要的颜色。",
guide27:"点击此处进行下一步。",
guide28:"点击此处生成服装草图。",
guide29:"使用仅文本选项进行生成。",
guide30:"输入关于您希望创建的草图的关键词,然后点击<strong>生成</strong>按钮。",
guide31:"点击此处为生成的草图选择一个类别。",
guide32:"为草图选择正确的类别。",
guide33:"选择您最喜欢的生成草图。",
guide34:"点击此处完成上传过程。",
guide35:"点击此处让AI生成设计插图。",
guide36:"请稍候几秒钟。",
guide37:"点击小红心保存您喜欢的设计。",
guide38:"点击“<strong>重新设计</strong>”以生成八个新的服装供您选择。",
guide39:"点击此处让AI生成设计插图。",
guide40:"点击您感兴趣的任何设计图片以修改细节。",
guide41:"点击衣服以修改其细节。",
guide42:"点击此处添加或更改印花。",
guide43:"您可以在收藏中找到您之前上传的印花。",
guide44:"为此草图选择一个印花。",
guide45:"点击此处布局所选印花。",
guide46:"在此处预览印刷设计。",
guide47:"在此处保存印刷设计。",
guide48:"点击此处完成修改。",
guide49:"点击此处导出您刚刚设计的系列。",
guide50:"您的指南已经完成,现在您可以自由创作。要了解更多见解和细节,请查看我们主页上的演示视频:<a href='https://code-create.com.hk/aida/' style='pointer-events: auto;' target='_blank'>https://code-create.com.hk/aida/</a>。您可以随时告诉机器人您想重新开始教程。",
},
}

View File

@@ -1,607 +0,0 @@
export default {
Header:{
hello:'你好',
HOME:'首页',
LIBRARY:'收藏',
HISTORY:'历史',
WORKS:'作品广场',
bindEmail:'绑定邮箱',
logOff:'退出登录',
Tutorial:'教程',
language:'中文',
skip:'跳过',
emailContent:'你绑定了的邮箱',
Email:'邮箱',
NextStep:'下一步',
verification:'输入验证码',
SentTo:'发送',
Resend:'重发',
Credits:'积分',
TaskList:'任务列表',
ViewOrders:'查询订单',
jsContent1:'邮箱格式不正确',
jsContent2:'绑定邮箱成功',
jsContent3:`已经长时间未操作,您必须活跃起来,否则将会在{numTime} S 后退出登录`,
},
allOrder:{
Time:'时间',
Serial:'序号',
Title:'名字',
Money:'金额',
Payment:'支付方式',
State:'状态',
Income:'支出',
Expend:'收入',
credits:'积分',
changedCredits:'积分变更',
changeEvent:'增加/减少积分',
createTime:'创建时间',
},
payOrder:{
OrderInformation:'订单详情',
CreditsInformation:'积分详情',
},
exportModel:{
EditExport:'编辑 & 导出',
CanvasSize:'画布大小',
Height:'高',
Width:'宽',
CanvasNav:'缩略图',
CanvasTool:'画布工具',
Color:'颜色',
Size:'大小',
Brushwork:'绘画',
Texture:'材质',
FillBack:'填充 & 边',
Layer:'层级',
More:'参数',
insufficient:'您的积分余额不足,如需使用此功能,请点击左上角充值',
HDExport:'转高清',
Save:'保存',
Share:'发布',
Export:'导出',
SR:'请选择需要超分的图片',
requiresCredits:'执行超分的图片需要消耗{data}积分',
Scale:'倍率',
Cancel:'取消',
jsContent1:"您是否已经保存画布内容?如果没有,请再关闭前点击'保存'。",
jsContent2:'我们只支持对印花进行超分',
jsContent3:'您的积分小于一次超分',
jsContent4:'您的积分余额不足',
jsContent5:'您选择的第{str}张图像在超分辨率增强后的分辨率超过2048。请选择较低的放大倍数。',
jsContent6:'请选择需要超分的图片',
jsContent7:'保存成功~',
},
upgradePlan:{
BuyCredlts:'购买积分',
credits:'积分',
organization:'积分再任意场景都可以使用',
CreditCard:'信用卡',
Alipay:'支付宝',
HongKong:'香港',
MainlandChina:'中国大陆',
Continue:'继续',
payment:'选择付款方式',
Cancel:'取消',
Payment:'付款',
policy1:'我承认我已阅读并同意',
policy2:'条款和条件',
policy3:'(包括服务范围)及',
policy4:'订购协议',
completed:'是否已完成支付?',
hint:'请保持窗口打开直到付款完成。如果您无法打开付款窗口请检查您的浏览器设置看看弹出窗口是否被阻止。成功付款后积分可能会延迟发放。请等待1-3分钟点击积分刷新按钮',
Back:'返回',
},
taskPage:{
TaskList:'任务列表',
download:'下载',
},
Habit:{
Workspace:'工作空间',
WorkspaceSetting:'设置工作空间',
settingWorkspace:'调整您的工作空间',
Overall:'整体',
Single:'单件',
System:'系统',
Designer:'设计师',
Mannequin:'模特',
Current:'当前',
User:'用户',
Style:'风格',
Select:'选择',
Clear:'清除',
jsContent1:'是否删除指定工作空间',
jsContent2:'请输入当前工作空间的名字',
jsContent3:'看到您换了风格。您是否愿意将目前使用的模特替换为系统推荐的模特?',
},
RobotAssist:{
inputContent1:"问我什么都行~",
jsContent1:"请输入生成内容~",
jsContent2:"欢迎来到AiDA。我是您友好的时尚设计助手。如果您有任何问题或需要帮助请随时问我。",
jsContent3:"看来您可能是新用户我很乐意为您介绍我们全新升级的AiDA系统。您现在要开始教程吗",
jsContent4:"您可以随时告诉我要开始教程。",
jsContent5:"在开始教程之前,我们需要刷新页面。您现在要开始教程吗?",
},
HomeView:{
GetStarted:'开始设计',
Start:'开始',
Edit:'编辑',
Reset:'重置',
Design:'设计',
Redesign:'重新设计',
GeneratedDesign:'生成的设计',
SelectedDesign:'喜欢的设计',
Export:'导出',
moodboard:"情绪板",
printboard:"印刷板",
colorboard:"调色板",
sketchboard:"线稿板",
mannequins:"人体模型",
masnnequinHint:"您使用的模特与当前的衣服不匹配,这将导致生成的模型不使用所选的衣服",
FinalizeCollection:"完成系列",
jsContent1:'您必须选择一种或多种颜色进行下一步。',
jsContent2:'您必须选择一种或多种颜色进行下一步。',
jsContent3:'导出文件失败。',
jsContent4: "您的订阅将在 {days} 天 {hours} 小时后到期。为确保服务不中断,请点击此处续订->",
jsContent8: "续订订阅。",
jsContent7:"友情提示",
jsContent5:"我们很高兴让您体验AiDA 3.0。请注意,部分服务在试用期间可能会受到限制。如果您已经准备好全身心投入并享受完整的体验,我们诚挚地邀请您订阅。只需访问",
jsContent6:" 就可以开始订阅。感谢您试用我们的服务!",
jsContent9:"您确定要清除当前系列并重新开始吗?",
jsContent10:"二次创作的作品不允许使用'设计',但是您可以使用'重新设计'",
},
ProductImg:{
Finalize:'完成',
SelectCollection:'选择的系列',
Upload:'上传',
MagicTools:'转换产品图工具',
Similarity:'相似度',
RelightDirection:'打光方向',
GenerateProduct:'生成的产品',
SelectedProduct:'选择的产品',
Export:'导出',
moreTitle:'更多工具',
ProductImage:'产品图',
Relight:'打光',
RightLight:'右侧光',
LeftLight:'左侧光',
TopLight:'顶部光',
BottomLight:'底部光',
Clear:'清空',
jsContent1:'如果您离开此页,您的更改将会丢失。您确定要离开这一页吗?',
jsContent2:'请至少选择一张图片',
},
LibraryPage:{
Organize:'整理',
Upload:'上传',
Generate:'生成',
Close:'取消',
Reset:'重置',
currently:'您排在队列中的第{generateLineUp}位',
Delete:'删除',
Rename:'编辑',
Point:'点',
inputContent1:'输入名字进行搜索',
intersection:'交集',
Tag:'标签:',
Select:'选择',
NoLabel:'空标签',
unionSet:'并集',
all:'全选',
generated:'所有默认材质都是AiDA自己生成',
ImageOnly:'图片',
TextOnly:'文字',
TextImage:'图片-文字',
inputContent2:'输入生成图片的标题',
maximumLength:'输入的内容超过允许输入的最大长度',
Model1:'笔墨画风',
Model2:'插画画风',
Model3:'真实画风',
Name:'名字:',
Category:'类别:',
inputContent3:'输入生成图片的标题',
Cancel:'取消',
Sure:'保存',
Moodboard:'情绪板',
Prints:'印花',
Sketches:'服装',
DesignElements:'设计元素',
Mannequins:'模特',
model:'模型',
jsContent1:'你确定要删除选中图片吗?',
jsContent2:'你确定要删除选中图片吗?',
jsContent3:'您只能上传图片文件!',
jsContent4:'图片必须小于5MB',
jsContent5:'图片已经上传是否继续上传',
jsContent6:'输入的内容超过允许输入的最大长度',
jsContent7:'请输入内容~',
jsContent8:'上传失败',
jsContent9:'选择一张图片~',
},
HistoryPage:{
History:'历史',
StartDate:'开始日期',
EndDate:'结束日期',
inputContent1:'输入名字进行搜索',
Detail:'细节',
Rename:'重命名',
Retrieve:'选择',
Delete:'删除',
inputContent2:'请输入新名称',
Submit:'保存',
CollectionsName:'名字',
source:'来源',
UptateTime:'修改时间',
SketchCounts:'草图数量',
Operations:'Operations',
jsContent1:'删除成功',
jsContent2:'您确定要删除这个收藏吗?',
jsContent3:'修改成功',
jsContent4:'图片必须小于5MB',
jsContent5:'图片已经上传是否继续上传',
jsContent6:'输入的内容超过允许输入的最大长度',
jsContent7:'请输入内容~',
},
ModelPlacement:{
Registration:'新增模特',
Submit:'保存',
Preview:'预览',
Back:'Back',
Restore:'重置',
System:'系统',
Library:'收藏',
Point:'点位',
RemovePoint:'删除点位',
mannequinHint:'模特背景图片请使用白色或者其他颜色来增强效果',
SHOULDER:'肩膀',
WAISTBAND:'腰部',
HAND:'手',
jsContent1:"您还没有保存,模特不会上传,确定要继续吗?",
jsContent2:'图片已经上传是否继续上传',
},
ModelPlacementMobile:{
Registration:'新增模特',
Submit:'保存',
Preview:'预览',
Back:'Back',
Restore:'重置',
System:'系统',
Library:'收藏',
Point:'点位',
RemovePoint:'删除点位',
mannequinHint:'模特背景图片请使用白色或者其他颜色来增强效果',
SHOULDER:'肩膀',
WAISTBAND:'腰部',
HAND:'手',
jsContent1:"您还没有保存,模特不会上传,确定要继续吗?",
jsContent2:'图片已经上传是否继续上传',
},
Upload:{
Delete:'删除',
Maximum2M:'您最多可以上传10张照片每张照片不能超过5MB',
jsContent1:'您只能上传图片文件!',
jsContent2:'图片必须小于5MB',
jsContent3:'上传失败',
},
SketchboardUpload:{
Upload:'上传',
Library:'收藏',
Generate:'生成',
Close:'取消',
currently:'您排在队列中的第{generateLineUp}位',
PIN:'PIN',
Maximum:'最多可上传{maxImg}张图片每张图片最大5MB',
Thumbnail:'选择的线稿',
inputContent1:'生成图片的标题',
maximumLength:'输入的内容超过允许输入的最大长度',
jsContent1:"上传失败",
jsContent2:"您只能上传图片文件!",
jsContent3:'图片必须小于5MB',
jsContent4:"超过允许上传的最大图片数量",
jsContent5:"请选择一张图片",
jsContent6:"输入的内容超过允许输入的最大长度",
jsContent7:"请输入内容~",
},
PrintboardUpload:{
Upload:'上传',
Library:'收藏',
Generate:'生成',
Close:'取消',
currently:'您排在队列中的第{generateLineUp}位',
PIN:'PIN',
Maximum:'最多可上传16张图片每张图片最大5MB',
Thumbnail:'选择的印花',
inputContent1:'生成图片的标题',
maximumLength:'输入的内容超过允许输入的最大长度',
PatternTitle:'生成可在服装上完全平铺的重复设计图案。',
LogoTitle:'为文字内容创建艺术字体设计,适用于各种标语或短语。',
SloganTitle:'输入的内容超过允许输入的最大长度',
jsContent1:"您只能上传图片文件!",
jsContent2:'图片必须小于5MB',
jsContent3:"超过允许上传的最大图片数量",
jsContent4:"请选择一张图片",
jsContent5:"输入的内容超过允许输入的最大长度",
jsContent6:"请输入内容~",
},
ColorboardUpload:{
Thumbnail:'选择的颜色缩略图',
Clear:'清除',
Palette:'调色板',
HEX:'HEX',
RGBA:'RGBA',
UploadImage:'上传图片',
ColorCode:'颜色代码',
SelectSuccessively:'连选',
SelectSuccessivelyOnTitle:'连续选色模式开启.',
SelectSuccessivelyOffTitle:'连续选色模式关闭.',
SelectSeparately:'单选',
ExtractColor:'提取颜色',
Single:'单色',
Gradual:'渐变',
Alignment:'线性',
uploadTitle:'从本地上传图片',
selectTitle:'从情绪版或印花版选择图片',
jsContent1:"您的浏览器不支持",
jsContent2:"找不到这个TCX的颜色",
jsContent3:"您只能上传图片文件!",
jsContent4:'图片必须小于5MB',
jsContent5:"请输入正确的TCX值",
jsContent6:"请至少选择一个情绪版或者印花",
},
selectImgList:{
SelectImg:'选择图片',
Clear:'关闭',
},
MoodboardUpload:{
Upload:'上传',
Library:'收藏',
Generate:'生成',
Delete:'删除',
Maximum:'最多可上传8张图片每张图片最大5MB',
Thumbnail:'选择的情绪板',
layout:'布局',
selected:'当前的情绪版布局',
Edit:'编辑',
jsContent1:'您最多可以选择8张图片',
jsContent2:"上传失败",
jsContent3:"您只能上传图片文件!",
jsContent4:'图片必须小于5MB',
jsContent5:'请点击布局进行随机排序',
},
Cropper:{
Cutpicture:'切图',
Finish:'完成',
Cancel:'取消',
CropPreview:'缩略图',
},
Material:{
inputContent1:'输入名字进行搜索',
PIN:'PIN',
},
MarketingSketchUpload:{
Upload:'上传',
MyLibrary:'我的收藏',
maximumLength:'最多可以上传15张照片每张照片不能超过5MB',
jsContent1:'上传失败',
jsContent2:"您只能上传图片文件!",
jsContent3:'图片必须小于5MB',
jsContent5:'超过允许上传的最大图片数量',
},
layout:{
MoodBoardDesign:'设计情绪板',
LayerOptions:'图层选项',
Submit:'保存',
},
Generate:{
ImageOnly:'图片',
TextOnly:'文字',
TextImage:'图片-文字',
Model1:'笔墨画风',
Model2:'插画画风',
Model3:'真实画风',
inputContent1:'输入生成图片的标题',
Generate:'生成',
Sequence:'队列',
Close:'取消',
currently:'您排在队列中的第{generateLineUp}位',
Merge:'合成',
maximumLength:'输入的内容超过允许输入的最大长度',
effectPoor:'当前生成的图像质量低于标准。请考虑调整您的提示词并再次尝试。',
Model:'模型',
uploadTitle:'上传参考图',
sloganTitle:'输入文字内容',
jsContent1:"您只能上传图片文件!",
jsContent2:'图片必须小于5MB',
jsContent3:"请输入内容~",
jsContent4:'输入的内容超过允许输入的最大长度',
jsContent5:"请输入内容~",
jsContent6:"您最多可以选择8张图片",
jsContent7:"上传失败",
jsContent8:"您{str}还有{num}次生成额度。",
jsContent9:"您的{str}生成额度已用完。",
jsContent10:"请完成标语图片",
jsContent11:"看到输入的内容可能存在重叠,重叠会影响最终效果哦~",
jsContent12:"最少需要创建一个文字",
},
collectionModal:{
Moodboard:'情绪板',
Printboard:'印花板',
Colorboard:'颜色板',
Sketchboard:'线稿板块',
MoodCollection:'为您的系列选择情绪版',
PrinCollection:'为您的系列选择印花版',
ColorCollection:'为您的系列选择颜色版',
SketchCollection:'为您的系列选择线稿版',
jsContent1:'因为您选择了多张图片,请点击布局后继续.',
jsContent2:'上传的文件不会保存,是否继续? ',
jsContent3:'您必须选择一种或多种颜色进行下一步。',
jsContent5:"我们检测到您的({str})上的PIN数量超过了八个这可能会导致一些已钉住的项目未被使用。您是否仍要继续",
},
DesignDetail:{
Details:'详情',
EditDetails:'编辑设计的细节',
editTitle:'修改单品',
DetailTitle:'删除单品',
compareTitle:'对比',
Submit:'保存',
CurrentApparel:'当前服装',
editSketchTitle:'修改草图',
CurrentPrint:'当前印花',
CurrentColor:'当前颜色',
},
DesignDetailAlter:{
Upload:'上传',
Library:'收藏',
inputContent1:'输入名字进行搜索',
Palette:'调色板',
HEX:'HEX',
RGBA:'RGBA',
UploadImage:'上传图片',
Delete:'删除',
ColorCode:'颜色代码',
jsContent1:"您的浏览器不支持",
jsContent2:"您最多可以选择8张图片",
jsContent3:"上传失败",
jsContent4:'您只能上传图片文件!',
jsContent5:'Image must smaller than 5MB!',
jsContent6:"找不到这个TCX的颜色",
},
addDetails:{
AddDetails:'添加细节',
submit:'保存',
jsContent1:'请至少绘制一条线段',
},
DesignDetailEnd:{
NewApparel:'选择的服装',
NewPrint:'选择的印花',
Placement:'模式',
Overall:'整体',
Single:'单个',
NewColor:'选择的颜色',
preview:'预览',
Layout:'布局',
jsContent1:'请选择印个印花',
jsContent2:'请选择颜色',
},
DesignPrintOperation:{
Placement:'调整位置',
Overall:'整体',
Single:'单件',
Scale:'Scale',
Random:'随机',
inputContent:'输入名字进行搜索',
preview:'预览',
isOverall:'图案图像不能在单件模式下使用',
jsContent1:'以上更改尚未保存,您确定要继续吗?',
},
uploadFile:{
jsContent1:'您最多可以选择{maxImg}张图片哦',
},
isTest:{
available:"此功能对试用用户不可用。",
src:"此功能对试用用户不开放,请访问进行订阅。",
userName:'试用用户',
loginIsTest:"您是试用用户,试用期到 {date}。为了用户数据的安全,我们不会保存试用用户上传的任何个人数据,并会在每次注销后擦除个人数据。如果您需要订阅,请点击 ->",
image:'由于您是试用用户您只能上传10张图片。'
},
setLabel:{
EditTag:'编辑标签',
jsContent1:'请输入标签名称',
},
works:{
all:'全部',
FavoriteWorks:'点赞的作品',
MyWorks:'我的作品',
},
Publish:{
Publish:'发布',
CoverPicture:'封面图',
CollectionTitle:'系列名字',
Description:'描述',
Permissions:'权限',
PermissionsItem1:'允许其他用户进行二次创作。',
Close:'关闭',
UpdatePublish:'更新发布',
jsContent1:'如果您离开此页,您的更改将会丢失。您确定要离开这一页吗?',
jsContent2:'请输入您的作品名称',
jsContent3:'这将把您的作品发布到广场上,供所有用户查看。请确认是否发布?',
jsContent4:'发布成功!你可以在我的作品中找到',
},
newScaleImage:{
Collection:'系列',
SecondaryCreation:'二次创作',
CreationTime:'创建时间',
UpdateTime:'更新时间',
Comment:'评论',
NoComments:'没有评论',
first:'你可以成为第一个评论',
reply:'回复',
unfold:'展开',
Collapse:'折叠',
Title:'标题',
Original:'原创',
from:'源自',
Delete:'删除',
Describe:'描述',
replyAll:'所有回复',
jsContent1:'请先登录或者升级为正式用户',
jsContent2:'作者不允许二次创作',
jsContent3:'请输入评论内容',
jsContent4:'是否删除当前评论',
jsContent5:'是否删除当前作品',
jsContent6:'作品被作者删除',
},
guide:{
guide1:"在<strong>工作空间</strong>中,您可以个性化您的设计设置,包括选择适用于男装或女装的设计,以及选择用于创作的人体模型。",
guide2:"选择您要设计的服装性别。",
guide3:'在此更改人体模型。',
guide4:'您目前可以从我们的系统库中选择人体模型。稍后,您还可以在注册自己的人体模型后从用户库中进行选择。',
guide5:'在这里开始您的创意之旅。 ',
guide6:'对于情绪板、印花或服装,我们提供三种不同的图片添加方法。第一种选择是<strong>上传</strong>,允许您直接从本地设备上传。',
guide7:"第二种方法是从您的<strong>收藏</strong>中选择。<br> 您可能会注意到您的库页面目前是空的;不必担心。您上传的所有图像都将自动添加到您的库中。将来,您无需每次上传,只需从您的库中选择即可。",
guide8:'第三种方法是使用最新的图像生成技术<strong>生成</strong>图像。',
guide9:"输入捕捉您希望表达的情绪的关键词,然后单击<strong>生成</strong>按钮。",
guide10:'为您的心情板选择两个图像。',
guide11:"点击此处布局您的情绪版。",
guide12:"点击此处生成印花图片。",
guide13:"点击此处生成印花图片。",
// guide14:"我们为生成图片提供三个输入选项:仅图片、仅文本和图片文本。",
// guide15:"选择此选项,我们将使用您上传的图片和输入的文本生成四张印花图片。",
// guide16:"在此处选择生成模型;不同的模型将以不同的风格生成图片。",
guide17:"在此处选择生成模型;不同的模型将以不同的风格生成图片。",
guide18:"在此处上传输入图片。",
// guide19:"点击此图片进行选择。",
guide20:"输入关于您希望创建的印花的关键词,然后点击<strong>生成</strong>按钮。",
guide21:"选择您最喜欢的生成印花。",
guide22:"点击此处进行下一步。",
guide23:"点击此处从图像中提取主要颜色。",
guide24:"从这些颜色块中选择您想要的第一种颜色。",
guide25:"点击此块选择第二种颜色。",
guide26:"从这些颜色块中选择您想要的颜色。",
guide27:"点击此处进行下一步。",
guide28:"点击此处生成服装草图。",
// guide29:"使用仅文本选项进行生成。",
guide30:"输入关于您希望创建的草图的关键词,然后点击<strong>生成</strong>按钮。",
guide31:"点击此处为生成的草图选择一个类别。",
guide32:"为草图选择正确的类别。",
guide33:"选择您最喜欢的生成草图。",
guide34:"点击此处完成上传过程。",
guide35:"点击此处让AI生成设计插图。",
guide36:"请稍候几秒钟。",
guide37:"点击小红心保存您喜欢的设计。",
guide38:"点击“<strong>重新设计</strong>”以生成八个新的服装供您选择。",
guide39:"点击此处让AI生成设计插图。",
guide40:"点击您感兴趣的任何设计图片以修改细节。",
guide41:"点击衣服以修改其细节。",
guide42:"点击此处添加或更改印花。",
guide43:"您可以在收藏中找到您之前上传的印花。",
guide44:"为此草图选择一个印花。",
guide45:"点击此处布局所选印花。",
guide46:"在此处预览印刷设计。",
guide47:"在此处保存印刷设计。",
guide48:"点击此处完成修改。",
guide49:"点击此处导出您刚刚设计的系列。",
guide50:"您的指南已经完成,现在您可以自由创作。要了解更多见解和细节,请查看我们主页上的演示视频:<a href='https://code-create.com.hk/aida/' style='pointer-events: auto;' target='_blank'>https://code-create.com.hk/aida/</a>。您可以随时告诉机器人您想重新开始教程。",
},
}

BIN
dist.7z Normal file

Binary file not shown.

44364
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,83 +1,84 @@
{
"name": "aida",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"serve:test": "vue-cli-service serve --mode test",
"build:test": "vue-cli-service build --mode test_build",
"serve:dev": "vue-cli-service serve --mode dev",
"build:dev": "vue-cli-service build --mode dev_build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"@ans1998/vue3-color": "^3.0.7",
"@flaticon/flaticon-uicons": "^2.3.0",
"@types/fingerprintjs2": "^2.0.0",
"ant-design-vue": "^3.2.12",
"axios": "^1.4.0",
"core-js": "^3.8.3",
"driver.js": "^1.3.1",
"echarts": "^5.5.1",
"element-plus": "^2.4.2",
"file-saver": "^2.0.5",
"fingerprintjs2": "^2.1.4",
"gsap": "^3.12.5",
"html2canvas": "^1.4.1",
"jszip": "^3.10.1",
"md5": "^2.3.0",
"quantize": "^1.0.2",
"sortablejs": "^1.15.0",
"swiper": "^11.1.4",
"vue": "^3.2.13",
"vue-class-component": "^8.0.0-0",
"vue-cropper": "^1.0.5",
"vue-i18n": "^9.6.1",
"vue-router": "^4.0.3",
"vuedraggable": "^4.1.0",
"vuex": "^4.0.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.4.0",
"@typescript-eslint/parser": "^5.4.0",
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-plugin-router": "~5.0.0",
"@vue/cli-plugin-typescript": "~5.0.0",
"@vue/cli-plugin-vuex": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"@vue/eslint-config-typescript": "^9.1.0",
"babel-eslint": "^10.1.0",
"eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3",
"less": "^4.1.3",
"less-loader": "^11.0.0",
"style-resources-loader": "^1.5.0",
"typescript": "~4.5.5",
"unplugin-element-plus": "^0.8.0",
"vue-cli-plugin-style-resources-loader": "^0.1.5",
"vue-lazyload": "^3.0.0-rc.2"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/vue3-essential",
"eslint:recommended",
"@vue/typescript/recommended"
],
"parserOptions": {
"ecmaVersion": 2020
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead",
"not ie 11"
]
}
"name": "aida",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"serve:test": "vue-cli-service serve --mode test",
"build:test": "vue-cli-service build --mode test_build",
"serve:dev": "vue-cli-service serve --mode dev",
"build:dev": "vue-cli-service build --mode dev_build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"@ans1998/vue3-color": "^3.0.7",
"@flaticon/flaticon-uicons": "^2.3.0",
"@types/fingerprintjs2": "^2.0.0",
"ant-design-vue": "^3.2.12",
"axios": "^1.4.0",
"core-js": "^3.8.3",
"driver.js": "^1.3.1",
"echarts": "^5.5.1",
"element-plus": "^2.4.2",
"file-saver": "^2.0.5",
"fingerprintjs2": "^2.1.4",
"gsap": "^3.12.5",
"html2canvas": "^1.4.1",
"jszip": "^3.10.1",
"md5": "^2.3.0",
"quantize": "^1.0.2",
"sortablejs": "^1.15.0",
"swiper": "^11.1.4",
"vue": "^3.2.13",
"vue-class-component": "^8.0.0-0",
"vue-cropper": "^1.0.5",
"vue-i18n": "^9.6.1",
"vue-router": "^4.0.3",
"vuedraggable": "^4.1.0",
"vuex": "^4.0.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.4.0",
"@typescript-eslint/parser": "^5.4.0",
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-plugin-router": "~5.0.0",
"@vue/cli-plugin-typescript": "~5.0.0",
"@vue/cli-plugin-vuex": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"@vue/eslint-config-typescript": "^9.1.0",
"babel-eslint": "^10.1.0",
"eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3",
"less": "^4.1.3",
"less-loader": "^11.0.0",
"style-resources-loader": "^1.5.0",
"typescript": "~4.5.5",
"unplugin-element-plus": "^0.8.0",
"vue-cli-plugin-style-resources-loader": "^0.1.5",
"vue-lazyload": "^3.0.0-rc.2"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/vue3-essential",
"eslint:recommended",
"@vue/typescript/recommended"
],
"parserOptions": {
"ecmaVersion": 2020
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead",
"not ie 11"
]
}

View File

@@ -222,3 +222,9 @@
src: url(./woff/KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'pixel';
font-style: normal;
font-weight: 500;
src: url('woff/pixel.ttf') format('truetype');
}

View File

@@ -53,4 +53,4 @@
font-family: 'CN_slogan_art4';
font-weight: normal;
src: url('slogan/CN_ZhiMangXing-Regular.ttf') format('truetype');
}
}

BIN
public/css/woff/pixel.ttf Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 794 KiB

After

Width:  |  Height:  |  Size: 797 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 798 KiB

After

Width:  |  Height:  |  Size: 783 KiB

BIN
public/image/loading.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> -->
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>AiDA</title>

View File

@@ -134,7 +134,9 @@ fabric.BaseBrush.prototype.convertToImg = function() {
if(!xy){
return
}
img.set({left:xy.x/pixelRatio,top:xy.y/pixelRatio,'scaleX':1/pixelRatio,'scaleY':1/pixelRatio}).setCoords();
let pointerX = this.canvas.viewportTransform[4];
let pointerY = this.canvas.viewportTransform[5];
img.set({left:(xy.x)/pixelRatio-pointerX,top:(xy.y)/pixelRatio-pointerY,'scaleX':1/pixelRatio,'scaleY':1/pixelRatio}).setCoords();
this.canvas.add(img).clearContext(this.canvas.contextTop);
this.canvas.clearContext(this.canvas.contextTop);
}
@@ -232,6 +234,8 @@ fabric.CrayonBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseDown: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this.canvas.contextTop.globalAlpha = this.opacity;
this._size = this.width / 2 + this._baseWidth;
this._drawn = false;
@@ -239,6 +243,8 @@ fabric.CrayonBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseMove: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this.update(pointer);
this.draw(this.canvas.contextTop);
},
@@ -403,6 +409,8 @@ fabric.InkBrush = fabric.util.createClass(fabric.BaseBrush, {
},
_render: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
var len, i, point = this.setPointer(pointer),
subtractPoint = point.subtract(this._lastPoint),
distance = point.distanceFrom(this._lastPoint),
@@ -467,6 +475,8 @@ fabric.InkBrush = fabric.util.createClass(fabric.BaseBrush, {
},
_resetTip: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
var len, i, point = this.setPointer(pointer);
this._strokes = [];
@@ -500,6 +510,8 @@ fabric.LongfurBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseDown: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._points = [pointer];
this._count = 0;
@@ -512,6 +524,8 @@ fabric.LongfurBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseMove: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._points.push(pointer);
var i, dx, dy, d, size,
@@ -595,6 +609,8 @@ fabric.WritingBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseDown: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._lastPoint = pointer;
this.canvas.contextTop.strokeStyle = this.color;
this.canvas.contextTop.lineWidth = this._lineWidth;
@@ -603,6 +619,8 @@ fabric.WritingBrush = fabric.util.createClass(fabric.BaseBrush, {
onMouseMove: function(pointer) {
if (this.canvas._isCurrentlyDrawing) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._render(pointer);
}
},
@@ -662,6 +680,8 @@ fabric.MarkerBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseDown: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._lastPoint = pointer;
this.canvas.contextTop.strokeStyle = this.color;
this.canvas.contextTop.lineWidth = this._lineWidth;
@@ -670,6 +690,8 @@ fabric.MarkerBrush = fabric.util.createClass(fabric.BaseBrush, {
onMouseMove: function(pointer) {
if (this.canvas._isCurrentlyDrawing) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._render(pointer);
}
},
@@ -734,6 +756,8 @@ fabric.MarkerBrush1 = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseDown: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._lastPoint = pointer;
this.canvas.contextTop.strokeStyle = this.color;
this.canvas.contextTop.lineWidth = this._lineWidth;
@@ -742,6 +766,8 @@ fabric.MarkerBrush1 = fabric.util.createClass(fabric.BaseBrush, {
onMouseMove: function(pointer) {
if (this.canvas._isCurrentlyDrawing) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._render(pointer);
}
},
@@ -807,6 +833,8 @@ fabric.PenBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseDown: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._lastPoint = pointer;
this.canvas.contextTop.lineWidth = this._lineWidth;
this._size = this.width + this._baseWidth;
@@ -814,6 +842,8 @@ fabric.PenBrush = fabric.util.createClass(fabric.BaseBrush, {
onMouseMove: function(pointer) {
if (this.canvas._isCurrentlyDrawing) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._render(pointer);
}
},
@@ -870,7 +900,8 @@ fabric.RibbonBrush = fabric.util.createClass(fabric.BaseBrush, {
for (var i = 0; i < this._nrPainters; i++) {
this._painters.push({ dx:this.canvas.width / 2, dy:this.canvas.height / 2, ax:0, ay:0, div:.1, ease:Math.random() * .2 + .6 });
}
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._lastPoint = pointer;
//ctx.globalCompositeOperation = 'source-over';
@@ -887,6 +918,8 @@ fabric.RibbonBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseMove: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._lastPoint = pointer;
},
@@ -921,6 +954,8 @@ fabric.ShadedBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseDown: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._points = [pointer];
var ctx = this.canvas.contextTop,
@@ -932,6 +967,8 @@ fabric.ShadedBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseMove: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._points.push(pointer);
var ctx = this.canvas.contextTop,
@@ -988,6 +1025,8 @@ fabric.SketchyBrush = fabric.util.createClass(fabric.BaseBrush, {
onMouseDown: function(pointer) {
this._count = 0;
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._points = [pointer];
var ctx = this.canvas.contextTop,
@@ -998,6 +1037,8 @@ fabric.SketchyBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseMove: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._points.push(pointer);
var i, dx, dy, d, factor = .3 * this.width,
@@ -1083,6 +1124,8 @@ fabric.SpraypaintBrush = fabric.util.createClass(fabric.BaseBrush, {
onMouseDown: function(pointer) {
this.canvas.contextTop.globalAlpha = this.opacity;
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._point = new fabric.Point(pointer.x, pointer.y);
this._lastPoint = this._point;
@@ -1095,6 +1138,8 @@ fabric.SpraypaintBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseMove: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._lastPoint = this._point;
this._point = new fabric.Point(pointer.x, pointer.y);
},
@@ -1169,7 +1214,8 @@ fabric.SquaresBrush = fabric.util.createClass(fabric.BaseBrush, {
var ctx = this.canvas.contextTop,
color = fabric.util.colorValues(this.color),
bgColor = fabric.util.colorValues(this.bgColor);
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._lastPoint = pointer;
this._drawn = false;
@@ -1181,6 +1227,8 @@ fabric.SquaresBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseMove: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
var ctx = this.canvas.contextTop,
dx = pointer.x - this._lastPoint.x,
dy = pointer.y - this._lastPoint.y,
@@ -1233,12 +1281,16 @@ fabric.WebBrush = fabric.util.createClass(fabric.BaseBrush, {
},
onMouseDown: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._points = [pointer];
this._count = 0;
this._colorValues = fabric.util.colorValues(this.color);
},
onMouseMove: function(pointer) {
pointer.x = pointer.x + this.canvas.viewportTransform[4];
pointer.y = pointer.y + this.canvas.viewportTransform[5];
this._points.push(pointer);
var ctx = this.canvas.contextTop,

View File

@@ -1,6 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id */
src: url('iconfont.ttf?t=1711431581952') format('truetype');
font-family: "iconfont"; /* Project id 4292253 */
src: url('iconfont.woff2?t=1727415711578') format('woff2'),
url('iconfont.woff?t=1727415711578') format('woff'),
url('iconfont.ttf?t=1727415711578') format('truetype');
}
.iconfont {
@@ -11,36 +13,44 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-a-waitao_changkuanwaitao11x:before {
content: "\e66c";
.icon-caizhi:before {
content: "\e647";
}
.icon-fanchehui:before {
content: "\e626";
.icon-IC-yehua:before {
content: "\e61b";
}
.icon-chehui:before {
content: "\e609";
.icon-shangyiceng:before {
content: "\e751";
}
.icon-yuyan:before {
content: "\e85f";
.icon-shangyiceng1:before {
content: "\e604";
}
.icon-biaoqian:before {
content: "\e603";
.icon-xiayiceng:before {
content: "\e68a";
}
.icon-bingji:before {
content: "\e620";
.icon-shangyiceng2:before {
content: "\e68b";
}
.icon-bingji1:before {
content: "\e668";
.icon-shenpi:before {
content: "\e6a1";
}
.icon-dianwei:before {
content: "\e685";
.icon-yonghu:before {
content: "\e617";
}
.icon-usetime:before {
content: "\e601";
}
.icon-xiala:before {
content: "\e634";
}
.icon-bianji:before {
@@ -87,47 +97,35 @@
content: "\e62d";
}
.icon-shenpi:before {
content: "\e6a1";
.icon-dianwei:before {
content: "\e685";
}
.icon-yonghu:before {
content: "\e617";
.icon-bingji:before {
content: "\e620";
}
.icon-usetime:before {
content: "\e601";
.icon-bingji1:before {
content: "\e668";
}
.icon-xiala:before {
content: "\e634";
.icon-biaoqian:before {
content: "\e603";
}
.icon-shangyiceng:before {
content: "\e751";
.icon-yuyan:before {
content: "\e85f";
}
.icon-shangyiceng1:before {
content: "\e604";
.icon-fanchehui:before {
content: "\e626";
}
.icon-xiayiceng:before {
content: "\e68a";
.icon-chehui:before {
content: "\e609";
}
.icon-shangyiceng2:before {
content: "\e68b";
}
.icon-renwu:before {
content: "\e63f";
}
.icon-caizhi:before {
content: "\e647";
}
.icon-shangchuantupian:before {
content: "\e61e";
.icon-a-waitao_changkuanwaitao11x:before {
content: "\e66c";
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -10,6 +10,10 @@ body,
--aida-fsize1-8: calc(1.8rem*1.2);
--aida-fsize1-6: calc(1.6rem*1.2);
--aida-fsize1-4: calc(1.4rem*1.2);
--antd-wave-shadow-color: #39215b;
}
::selection {
background-color: #1890ff;
}
input {
outline: none;
@@ -145,7 +149,7 @@ li {
}
}
.ant-tooltip {
z-index: 2;
z-index: 1049 !important;
}
.ant-tooltip .ant-tooltip-inner {
background: #343579;
@@ -337,6 +341,9 @@ li {
cursor: pointer;
pointer-events: auto !important;
}
.ant-popover-placement-top {
z-index: 9999;
}
.ant-drawer {
z-index: 9999;
}
@@ -488,9 +495,6 @@ li {
width: 0.8rem;
height: 0.8rem;
}
.trial_page .ant-tooltip {
z-index: 1049 !important;
}
.trial_page .habit :deep(.ant-tooltip .ant-tooltip-inner),
.trial_page :deep(.ant-tooltip-arrow-content) {
background: #000 !important;
@@ -683,7 +687,7 @@ li {
.generalModel .ant-modal-body {
padding: 0;
height: calc(65rem*1.2);
padding: calc(4rem*1.2) calc(5rem*1.2);
padding: calc(5rem*1.2) calc(6rem*1.2);
}
.generalModel .fi-rr-down-to-line,
.generalModel .fi-rr-arrow-small-right,
@@ -955,6 +959,10 @@ li {
.sketchboard_upload_modal .switch_type_list.showEvents * {
pointer-events: auto;
}
.ant-modal-wrap {
height: 100vh;
overflow: hidden;
}
.ant-btn:hover,
.ant-btn:focus,
.ant-btn:active,
@@ -1097,6 +1105,9 @@ li {
display: flex;
align-items: center;
}
.admin_page .admin_state_item > span > span {
color: red;
}
.admin_page .admin_state_item > span:nth-child(1) {
font-size: 1.6rem;
font-weight: 400;
@@ -1104,7 +1115,7 @@ li {
margin-right: 15px;
flex-shrink: 0;
display: block;
width: 10rem;
width: 10.5rem;
text-align: right;
}
.admin_page .admin_state_item > input {
@@ -1293,27 +1304,42 @@ li {
border: solid 2px rgba(0, 0, 0, 0.55);
color: #000000;
}
.homeMain_heade .ant-badge {
.homeMain_heade .ant-badge,
.account_message .ant-badge {
width: auto;
height: auto;
}
.homeMain_heade sup.ant-scroll-number {
height: 2rem;
min-height: 2rem;
width: 2rem;
min-width: 2rem;
.homeMain_heade sup.ant-scroll-number,
.account_message sup.ant-scroll-number {
height: 1.2rem;
min-height: 5px;
width: 1.2rem;
min-width: 5px;
padding: 0;
}
.homeMain_heade sup.ant-scroll-number .ant-scroll-number-only {
width: 100%;
height: 100%;
font-size: 1.2rem;
font-size: 1.1rem;
padding: 0.2rem;
box-sizing: content-box;
display: flex;
align-items: center;
justify-content: center;
}
.homeMain_heade p.ant-scroll-number-only-unit {
line-height: 2rem;
.homeMain_heade sup.ant-scroll-number.ant-badge-dot,
.account_message sup.ant-scroll-number.ant-badge-dot {
width: auto;
height: auto;
}
.homeMain_heade sup.ant-scroll-number .ant-scroll-number-only,
.account_message sup.ant-scroll-number .ant-scroll-number-only {
height: 100%;
font-size: 1.2rem;
display: flex;
transform: scale(0.7);
align-items: center;
justify-content: center;
}
.homeMain_heade p.ant-scroll-number-only-unit,
.account_message p.ant-scroll-number-only-unit {
line-height: 1.2rem;
height: 100%;
}
.modal_title_text {
@@ -1509,7 +1535,8 @@ textarea:focus {
.design_detail_modal_component .input_border,
.library_page .input_border,
.productImg_modal .input_border,
.accountEdit_page .input_border {
.accountEdit_page .input_border,
.generalMenu_printModel_upload .input_border {
z-index: 2;
display: flex;
align-items: center;
@@ -1524,7 +1551,8 @@ textarea:focus {
.design_detail_modal_component .input_border .input_box,
.library_page .input_border .input_box,
.productImg_modal .input_border .input_box,
.accountEdit_page .input_border .input_box {
.accountEdit_page .input_border .input_box,
.generalMenu_printModel_upload .input_border .input_box {
position: relative;
z-index: 2;
flex: 1;
@@ -1536,7 +1564,8 @@ textarea:focus {
.design_detail_modal_component .input_border .input_box .inputShowText,
.library_page .input_border .input_box .inputShowText,
.productImg_modal .input_border .input_box .inputShowText,
.accountEdit_page .input_border .input_box .inputShowText {
.accountEdit_page .input_border .input_box .inputShowText,
.generalMenu_printModel_upload .input_border .input_box .inputShowText {
width: 100%;
display: none;
}
@@ -1545,11 +1574,13 @@ textarea:focus {
.library_page .input_border .input_box.active .input_box_btnBox,
.productImg_modal .input_border .input_box.active .input_box_btnBox,
.accountEdit_page .input_border .input_box.active .input_box_btnBox,
.generalMenu_printModel_upload .input_border .input_box.active .input_box_btnBox,
.collection_modal_body .input_border .input_box.active textarea,
.design_detail_modal_component .input_border .input_box.active textarea,
.library_page .input_border .input_box.active textarea,
.productImg_modal .input_border .input_box.active textarea,
.accountEdit_page .input_border .input_box.active textarea {
.accountEdit_page .input_border .input_box.active textarea,
.generalMenu_printModel_upload .input_border .input_box.active textarea {
border: 1px solid #ff0001;
box-shadow: 0px 0px 3px 1px rgba(255, 0, 0, 0.2);
}
@@ -1557,7 +1588,8 @@ textarea:focus {
.design_detail_modal_component .input_border .input_box.active span,
.library_page .input_border .input_box.active span,
.productImg_modal .input_border .input_box.active span,
.accountEdit_page .input_border .input_box.active span {
.accountEdit_page .input_border .input_box.active span,
.generalMenu_printModel_upload .input_border .input_box.active span {
opacity: 1;
display: block;
color: rgba(255, 0, 0.7);
@@ -1566,7 +1598,8 @@ textarea:focus {
.design_detail_modal_component .input_border .search_keyword,
.library_page .input_border .search_keyword,
.productImg_modal .input_border .search_keyword,
.accountEdit_page .input_border .search_keyword {
.accountEdit_page .input_border .search_keyword,
.generalMenu_printModel_upload .input_border .search_keyword {
height: 0;
flex-basis: 100%;
}
@@ -1574,7 +1607,8 @@ textarea:focus {
.design_detail_modal_component .input_border .search_keyword .search_keyword_center,
.library_page .input_border .search_keyword .search_keyword_center,
.productImg_modal .input_border .search_keyword .search_keyword_center,
.accountEdit_page .input_border .search_keyword .search_keyword_center {
.accountEdit_page .input_border .search_keyword .search_keyword_center,
.generalMenu_printModel_upload .input_border .search_keyword .search_keyword_center {
justify-content: space-between;
display: flex;
width: var(--width);
@@ -1592,7 +1626,8 @@ textarea:focus {
.design_detail_modal_component .input_border .search_keyword .search_keyword_center .search_keyword_center_left,
.library_page .input_border .search_keyword .search_keyword_center .search_keyword_center_left,
.productImg_modal .input_border .search_keyword .search_keyword_center .search_keyword_center_left,
.accountEdit_page .input_border .search_keyword .search_keyword_center .search_keyword_center_left {
.accountEdit_page .input_border .search_keyword .search_keyword_center .search_keyword_center_left,
.generalMenu_printModel_upload .input_border .search_keyword .search_keyword_center .search_keyword_center_left {
display: flex;
overflow: hidden;
flex: 1;
@@ -1602,7 +1637,8 @@ textarea:focus {
.design_detail_modal_component .input_border .search_keyword .search_keyword_center .search_keyword_center_item,
.library_page .input_border .search_keyword .search_keyword_center .search_keyword_center_item,
.productImg_modal .input_border .search_keyword .search_keyword_center .search_keyword_center_item,
.accountEdit_page .input_border .search_keyword .search_keyword_center .search_keyword_center_item {
.accountEdit_page .input_border .search_keyword .search_keyword_center .search_keyword_center_item,
.generalMenu_printModel_upload .input_border .search_keyword .search_keyword_center .search_keyword_center_item {
border-radius: 0.4rem;
border: solid 1px #39215b;
background-color: #8156bd;
@@ -1618,31 +1654,36 @@ textarea:focus {
.design_detail_modal_component .input_border .search_keyword .search_keyword_center .search_keyword_center_item:last-child,
.library_page .input_border .search_keyword .search_keyword_center .search_keyword_center_item:last-child,
.productImg_modal .input_border .search_keyword .search_keyword_center .search_keyword_center_item:last-child,
.accountEdit_page .input_border .search_keyword .search_keyword_center .search_keyword_center_item:last-child {
.accountEdit_page .input_border .search_keyword .search_keyword_center .search_keyword_center_item:last-child,
.generalMenu_printModel_upload .input_border .search_keyword .search_keyword_center .search_keyword_center_item:last-child {
margin-right: 0;
}
.collection_modal_body .input_border .input_box_btnBox,
.design_detail_modal_component .input_border .input_box_btnBox,
.library_page .input_border .input_box_btnBox,
.productImg_modal .input_border .input_box_btnBox,
.accountEdit_page .input_border .input_box_btnBox {
.accountEdit_page .input_border .input_box_btnBox,
.generalMenu_printModel_upload .input_border .input_box_btnBox {
border: calc(0.1rem*1.2) solid #F1F1F1;
width: var(--width);
display: flex;
float: left;
align-items: center;
}
.collection_modal_body .input_border .input_box_btnBox .ant-spin-text,
.design_detail_modal_component .input_border .input_box_btnBox .ant-spin-text,
.library_page .input_border .input_box_btnBox .ant-spin-text,
.productImg_modal .input_border .input_box_btnBox .ant-spin-text,
.accountEdit_page .input_border .input_box_btnBox .ant-spin-text {
.accountEdit_page .input_border .input_box_btnBox .ant-spin-text,
.generalMenu_printModel_upload .input_border .input_box_btnBox .ant-spin-text {
font-size: 1.2rem;
}
.collection_modal_body .input_border .input_box_btnBox .search_seed,
.design_detail_modal_component .input_border .input_box_btnBox .search_seed,
.library_page .input_border .input_box_btnBox .search_seed,
.productImg_modal .input_border .input_box_btnBox .search_seed,
.accountEdit_page .input_border .input_box_btnBox .search_seed {
.accountEdit_page .input_border .input_box_btnBox .search_seed,
.generalMenu_printModel_upload .input_border .input_box_btnBox .search_seed {
padding: 0;
width: 4rem;
text-align: center;
@@ -1653,7 +1694,8 @@ textarea:focus {
.design_detail_modal_component .input_border .upload_item .upload_file_item,
.library_page .input_border .upload_item .upload_file_item,
.productImg_modal .input_border .upload_item .upload_file_item,
.accountEdit_page .input_border .upload_item .upload_file_item {
.accountEdit_page .input_border .upload_item .upload_file_item,
.generalMenu_printModel_upload .input_border .upload_item .upload_file_item {
width: 8rem;
height: 8rem;
}
@@ -1661,7 +1703,8 @@ textarea:focus {
.design_detail_modal_component .input_border input,
.library_page .input_border input,
.productImg_modal .input_border input,
.accountEdit_page .input_border input {
.accountEdit_page .input_border input,
.generalMenu_printModel_upload .input_border input {
width: 100%;
border-radius: calc(0.5rem*1.2);
border: 1px solid rgba(0, 0, 0, 0.15);
@@ -1674,42 +1717,48 @@ textarea:focus {
.design_detail_modal_component .input_border inputinput:-moz-placeholder,
.library_page .input_border inputinput:-moz-placeholder,
.productImg_modal .input_border inputinput:-moz-placeholder,
.accountEdit_page .input_border inputinput:-moz-placeholder {
.accountEdit_page .input_border inputinput:-moz-placeholder,
.generalMenu_printModel_upload .input_border inputinput:-moz-placeholder {
color: rgba(0, 0, 0, 0.15);
}
.collection_modal_body .input_border inputinput:-ms-input-placeholder,
.design_detail_modal_component .input_border inputinput:-ms-input-placeholder,
.library_page .input_border inputinput:-ms-input-placeholder,
.productImg_modal .input_border inputinput:-ms-input-placeholder,
.accountEdit_page .input_border inputinput:-ms-input-placeholder {
.accountEdit_page .input_border inputinput:-ms-input-placeholder,
.generalMenu_printModel_upload .input_border inputinput:-ms-input-placeholder {
color: rgba(0, 0, 0, 0.15);
}
.collection_modal_body .input_border inputinput::-webkit-input-placeholder,
.design_detail_modal_component .input_border inputinput::-webkit-input-placeholder,
.library_page .input_border inputinput::-webkit-input-placeholder,
.productImg_modal .input_border inputinput::-webkit-input-placeholder,
.accountEdit_page .input_border inputinput::-webkit-input-placeholder {
.accountEdit_page .input_border inputinput::-webkit-input-placeholder,
.generalMenu_printModel_upload .input_border inputinput::-webkit-input-placeholder {
color: rgba(0, 0, 0, 0.15);
}
.collection_modal_body .input_border input.forbidden,
.design_detail_modal_component .input_border input.forbidden,
.library_page .input_border input.forbidden,
.productImg_modal .input_border input.forbidden,
.accountEdit_page .input_border input.forbidden {
.accountEdit_page .input_border input.forbidden,
.generalMenu_printModel_upload .input_border input.forbidden {
cursor: no-drop;
}
.collection_modal_body .input_border .input_box_btnBox_upImg,
.design_detail_modal_component .input_border .input_box_btnBox_upImg,
.library_page .input_border .input_box_btnBox_upImg,
.productImg_modal .input_border .input_box_btnBox_upImg,
.accountEdit_page .input_border .input_box_btnBox_upImg {
.accountEdit_page .input_border .input_box_btnBox_upImg,
.generalMenu_printModel_upload .input_border .input_box_btnBox_upImg {
height: 100%;
}
.collection_modal_body .input_border .fi,
.design_detail_modal_component .input_border .fi,
.library_page .input_border .fi,
.productImg_modal .input_border .fi,
.accountEdit_page .input_border .fi {
.accountEdit_page .input_border .fi,
.generalMenu_printModel_upload .input_border .fi {
margin-right: 1rem;
display: flex;
cursor: pointer;
@@ -1725,7 +1774,8 @@ textarea:focus {
.design_detail_modal_component .input_border .fi.fi-br-loading,
.library_page .input_border .fi.fi-br-loading,
.productImg_modal .input_border .fi.fi-br-loading,
.accountEdit_page .input_border .fi.fi-br-loading {
.accountEdit_page .input_border .fi.fi-br-loading,
.generalMenu_printModel_upload .input_border .fi.fi-br-loading {
height: 100%;
background-color: rgba(0, 0, 0, 0);
}
@@ -1733,21 +1783,24 @@ textarea:focus {
.design_detail_modal_component .input_border .fi.active,
.library_page .input_border .fi.active,
.productImg_modal .input_border .fi.active,
.accountEdit_page .input_border .fi.active {
.accountEdit_page .input_border .fi.active,
.generalMenu_printModel_upload .input_border .fi.active {
transform: rotate(180deg);
}
.collection_modal_body .input_border .fi.forbidden,
.design_detail_modal_component .input_border .fi.forbidden,
.library_page .input_border .fi.forbidden,
.productImg_modal .input_border .fi.forbidden,
.accountEdit_page .input_border .fi.forbidden {
.accountEdit_page .input_border .fi.forbidden,
.generalMenu_printModel_upload .input_border .fi.forbidden {
cursor: no-drop;
}
.collection_modal_body .input_border .search_upImg,
.design_detail_modal_component .input_border .search_upImg,
.library_page .input_border .search_upImg,
.productImg_modal .input_border .search_upImg,
.accountEdit_page .input_border .search_upImg {
.accountEdit_page .input_border .search_upImg,
.generalMenu_printModel_upload .input_border .search_upImg {
width: 4rem;
height: 100%;
position: absolute;
@@ -1758,7 +1811,8 @@ textarea:focus {
.design_detail_modal_component .input_border .search_upImg span,
.library_page .input_border .search_upImg span,
.productImg_modal .input_border .search_upImg span,
.accountEdit_page .input_border .search_upImg span {
.accountEdit_page .input_border .search_upImg span,
.generalMenu_printModel_upload .input_border .search_upImg span {
position: absolute;
width: 100%;
}
@@ -1766,7 +1820,8 @@ textarea:focus {
.design_detail_modal_component .input_border .search_upImg .ant-upload-select-picture-card,
.library_page .input_border .search_upImg .ant-upload-select-picture-card,
.productImg_modal .input_border .search_upImg .ant-upload-select-picture-card,
.accountEdit_page .input_border .search_upImg .ant-upload-select-picture-card {
.accountEdit_page .input_border .search_upImg .ant-upload-select-picture-card,
.generalMenu_printModel_upload .input_border .search_upImg .ant-upload-select-picture-card {
width: 100%;
height: 100%;
display: block !important;
@@ -1775,7 +1830,8 @@ textarea:focus {
.design_detail_modal_component .input_border .search_textarea,
.library_page .input_border .search_textarea,
.productImg_modal .input_border .search_textarea,
.accountEdit_page .input_border .search_textarea {
.accountEdit_page .input_border .search_textarea,
.generalMenu_printModel_upload .input_border .search_textarea {
z-index: 3;
height: auto;
position: absolute;
@@ -1791,14 +1847,16 @@ textarea:focus {
.design_detail_modal_component .input_border .generage_btn,
.library_page .input_border .generage_btn,
.productImg_modal .input_border .generage_btn,
.accountEdit_page .input_border .generage_btn {
.accountEdit_page .input_border .generage_btn,
.generalMenu_printModel_upload .input_border .generage_btn {
margin-left: 2rem;
}
.collection_modal_body .upload_item,
.design_detail_modal_component .upload_item,
.library_page .upload_item,
.productImg_modal .upload_item,
.accountEdit_page .upload_item {
.accountEdit_page .upload_item,
.generalMenu_printModel_upload .upload_item {
display: flex;
flex-wrap: wrap;
}
@@ -1806,7 +1864,8 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item,
.library_page .upload_item .upload_file_item,
.productImg_modal .upload_item .upload_file_item,
.accountEdit_page .upload_item .upload_file_item {
.accountEdit_page .upload_item .upload_file_item,
.generalMenu_printModel_upload .upload_item .upload_file_item {
margin: 0 calc(2rem*1.2) calc(2rem*1.2) 0;
display: inline-block;
width: calc(10rem*1.2);
@@ -1820,7 +1879,8 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item.active,
.library_page .upload_item .upload_file_item.active,
.productImg_modal .upload_item .upload_file_item.active,
.accountEdit_page .upload_item .upload_file_item.active {
.accountEdit_page .upload_item .upload_file_item.active,
.generalMenu_printModel_upload .upload_item .upload_file_item.active {
opacity: 0.5;
border-radius: calc(1rem*1.2);
transform: scale(0.9);
@@ -1829,21 +1889,24 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item.active .delete_file_block,
.library_page .upload_item .upload_file_item.active .delete_file_block,
.productImg_modal .upload_item .upload_file_item.active .delete_file_block,
.accountEdit_page .upload_item .upload_file_item.active .delete_file_block {
.accountEdit_page .upload_item .upload_file_item.active .delete_file_block,
.generalMenu_printModel_upload .upload_item .upload_file_item.active .delete_file_block {
pointer-events: none;
}
.collection_modal_body .upload_item .upload_file_item.active .operate_file_block,
.design_detail_modal_component .upload_item .upload_file_item.active .operate_file_block,
.library_page .upload_item .upload_file_item.active .operate_file_block,
.productImg_modal .upload_item .upload_file_item.active .operate_file_block,
.accountEdit_page .upload_item .upload_file_item.active .operate_file_block {
.accountEdit_page .upload_item .upload_file_item.active .operate_file_block,
.generalMenu_printModel_upload .upload_item .upload_file_item.active .operate_file_block {
pointer-events: none;
}
.collection_modal_body .upload_item .upload_file_item.upload_component,
.design_detail_modal_component .upload_item .upload_file_item.upload_component,
.library_page .upload_item .upload_file_item.upload_component,
.productImg_modal .upload_item .upload_file_item.upload_component,
.accountEdit_page .upload_item .upload_file_item.upload_component {
.accountEdit_page .upload_item .upload_file_item.upload_component,
.generalMenu_printModel_upload .upload_item .upload_file_item.upload_component {
border: none;
display: flex;
align-items: center;
@@ -1853,7 +1916,8 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item :deep(.ant-upload-picture-card-wrapper),
.library_page .upload_item .upload_file_item :deep(.ant-upload-picture-card-wrapper),
.productImg_modal .upload_item .upload_file_item :deep(.ant-upload-picture-card-wrapper),
.accountEdit_page .upload_item .upload_file_item :deep(.ant-upload-picture-card-wrapper) {
.accountEdit_page .upload_item .upload_file_item :deep(.ant-upload-picture-card-wrapper),
.generalMenu_printModel_upload .upload_item .upload_file_item :deep(.ant-upload-picture-card-wrapper) {
position: absolute;
width: auto;
top: 50%;
@@ -1864,7 +1928,8 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item :deep(.ant-upload-select-picture-card),
.library_page .upload_item .upload_file_item :deep(.ant-upload-select-picture-card),
.productImg_modal .upload_item .upload_file_item :deep(.ant-upload-select-picture-card),
.accountEdit_page .upload_item .upload_file_item :deep(.ant-upload-select-picture-card) {
.accountEdit_page .upload_item .upload_file_item :deep(.ant-upload-select-picture-card),
.generalMenu_printModel_upload .upload_item .upload_file_item :deep(.ant-upload-select-picture-card) {
width: calc(6rem*1.2);
height: calc(6rem*1.2);
border: calc(0.3rem*1.2) solid #ededed;
@@ -1875,7 +1940,8 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item .upload_file_item_content,
.library_page .upload_item .upload_file_item .upload_file_item_content,
.productImg_modal .upload_item .upload_file_item .upload_file_item_content,
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content {
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content,
.generalMenu_printModel_upload .upload_item .upload_file_item .upload_file_item_content {
display: flex;
align-items: center;
justify-content: center;
@@ -1887,21 +1953,24 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item .upload_file_item_content:hover div,
.library_page .upload_item .upload_file_item .upload_file_item_content:hover div,
.productImg_modal .upload_item .upload_file_item .upload_file_item_content:hover div,
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content:hover div {
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content:hover div,
.generalMenu_printModel_upload .upload_item .upload_file_item .upload_file_item_content:hover div {
opacity: 1;
}
.collection_modal_body .upload_item .upload_file_item .upload_file_item_content:hover .delete_file_block,
.design_detail_modal_component .upload_item .upload_file_item .upload_file_item_content:hover .delete_file_block,
.library_page .upload_item .upload_file_item .upload_file_item_content:hover .delete_file_block,
.productImg_modal .upload_item .upload_file_item .upload_file_item_content:hover .delete_file_block,
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content:hover .delete_file_block {
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content:hover .delete_file_block,
.generalMenu_printModel_upload .upload_item .upload_file_item .upload_file_item_content:hover .delete_file_block {
display: block;
}
.collection_modal_body .upload_item .upload_file_item .upload_file_item_content .upload_img,
.design_detail_modal_component .upload_item .upload_file_item .upload_file_item_content .upload_img,
.library_page .upload_item .upload_file_item .upload_file_item_content .upload_img,
.productImg_modal .upload_item .upload_file_item .upload_file_item_content .upload_img,
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content .upload_img {
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content .upload_img,
.generalMenu_printModel_upload .upload_item .upload_file_item .upload_file_item_content .upload_img {
display: block;
height: 100%;
width: auto;
@@ -1912,7 +1981,8 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item .upload_file_item_content .delete_file_block,
.library_page .upload_item .upload_file_item .upload_file_item_content .delete_file_block,
.productImg_modal .upload_item .upload_file_item .upload_file_item_content .delete_file_block,
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content .delete_file_block {
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content .delete_file_block,
.generalMenu_printModel_upload .upload_item .upload_file_item .upload_file_item_content .delete_file_block {
display: none;
width: 100%;
cursor: pointer;
@@ -1930,7 +2000,8 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop,
.library_page .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop,
.productImg_modal .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop,
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop {
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop,
.generalMenu_printModel_upload .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop {
width: calc(3.2rem*1.2);
height: calc(3.2rem*1.2);
background: rgba(0, 0, 0, 0.6);
@@ -1946,7 +2017,8 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop .icon-shanchu,
.library_page .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop .icon-shanchu,
.productImg_modal .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop .icon-shanchu,
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop .icon-shanchu {
.accountEdit_page .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop .icon-shanchu,
.generalMenu_printModel_upload .upload_item .upload_file_item .upload_file_item_content .delete_file_block.rightTop .icon-shanchu {
font-size: calc(1.6rem*1.2);
color: #fff;
}
@@ -1954,14 +2026,16 @@ textarea:focus {
.design_detail_modal_component .upload_item .upload_file_item .upload_img_icon,
.library_page .upload_item .upload_file_item .upload_img_icon,
.productImg_modal .upload_item .upload_file_item .upload_img_icon,
.accountEdit_page .upload_item .upload_file_item .upload_img_icon {
.accountEdit_page .upload_item .upload_file_item .upload_img_icon,
.generalMenu_printModel_upload .upload_item .upload_file_item .upload_img_icon {
width: calc(4.6rem*1.2);
}
.collection_modal_body .upload_item .upload_file_item:last-child,
.design_detail_modal_component .upload_item .upload_file_item:last-child,
.library_page .upload_item .upload_file_item:last-child,
.productImg_modal .upload_item .upload_file_item:last-child,
.accountEdit_page .upload_item .upload_file_item:last-child {
.accountEdit_page .upload_item .upload_file_item:last-child,
.generalMenu_printModel_upload .upload_item .upload_file_item:last-child {
margin: 0;
}
.generalModel_modal .ant-modal-content {

View File

@@ -10,6 +10,10 @@ html,body,#app{
--aida-fsize1-8: calc(1.8rem*1.2);
--aida-fsize1-6: calc(1.6rem*1.2);
--aida-fsize1-4: calc(1.4rem*1.2);
--antd-wave-shadow-color:#39215b;
}
::selection{
background-color: #1890ff;
}
input{
outline:none;
@@ -155,8 +159,7 @@ input:focus{
}
.ant-tooltip{
// top: 74px !important;
z-index: 2;
z-index: 1049 !important;
.ant-tooltip-inner{
background: #343579;
border-radius: 5px;
@@ -360,6 +363,9 @@ input:focus{
cursor: pointer;
pointer-events: auto !important;
}
.ant-popover-placement-top{
z-index: 9999;
}
.ant-drawer{
z-index: 9999;
}
@@ -542,9 +548,6 @@ input:focus{
}
.ant-tooltip{
z-index: 1049 !important;
}
.habit :deep(.ant-tooltip .ant-tooltip-inner) ,:deep(.ant-tooltip-arrow-content){
background: #000 !important;
}
@@ -763,7 +766,7 @@ input:focus{
// height: calc(65vh - 6.4rem);
height: calc(65rem*1.2);
// background-color: #181818;
padding: calc(4rem*1.2) calc(5rem*1.2);
padding: calc(5rem*1.2) calc(6rem*1.2);
}
.ant-modal-btn{
@@ -1063,9 +1066,10 @@ input:focus{
}
}
// .ant-modal-wrap{
// z-index: 10001 ;
// }
.ant-modal-wrap{
height: 100vh;
overflow: hidden;
}
// .driver-overlay-animated{
// z-index: 10002 !important;
// }
@@ -1219,6 +1223,11 @@ input:focus{
margin-bottom: 2rem;
display: flex;
align-items: center;
>span{
>span{
color: red;
}
}
>span:nth-child(1){
font-size: 1.6rem;
font-weight: 400;
@@ -1228,7 +1237,7 @@ input:focus{
display: block;
// min-width: 20%;
// width: 100px;
width: 10rem;
width: 10.5rem;
text-align: right;
}
>input{
@@ -1431,28 +1440,39 @@ input:focus{
color: rgba(0, 0, 0, 1);
}
}
.homeMain_heade{
.homeMain_heade,.account_message{
.ant-badge{
width: auto;
height: auto;
}
sup.ant-scroll-number{
height: 2rem;
min-height: 2rem;
width: 2rem;
min-width: 2rem;
height: 1.2rem;
min-height: 5px;
width: 1.2rem;
min-width: 5px;
padding: 0;
font-size: 1.1rem;
padding: .2rem;
box-sizing: content-box;
display: flex;
align-items: center;
justify-content: center;
&.ant-badge-dot{
width: auto;
height: auto;
}
.ant-scroll-number-only{
width: 100%;
// width: 100%;
height: 100%;
font-size: 1.2rem;
display: flex;
transform: scale(.7);
align-items: center;
justify-content: center;
}
}
p.ant-scroll-number-only-unit{
line-height: 2rem;
line-height: 1.2rem;
height: 100%;
}
}
@@ -1588,7 +1608,7 @@ textarea:focus{
outline: none; /* 清除默认焦点样式 */
}
//设计input和上传按钮样式
.collection_modal_body,.design_detail_modal_component,.library_page,.productImg_modal,.accountEdit_page{
.collection_modal_body,.design_detail_modal_component,.library_page,.productImg_modal,.accountEdit_page,.generalMenu_printModel_upload{
.input_border{
z-index: 2;
display: flex;
@@ -1668,6 +1688,7 @@ textarea:focus{
width: var(--width);
display: flex;
float: left;
align-items: center;
.ant-spin-text{
font-size: 1.2rem;
}

View File

@@ -0,0 +1,247 @@
<template>
<div class="account_page">
<!-- <div class="account_page_titleImg">
<img src="https://code-create.com.hk/wp-content/uploads/2022/12/about_banner-1.jpg" alt="">
</div> -->
<div class="account_page_content_box">
<div class="account_page_content">
<div class="account_page_content_left">
<div class="content_left_item">
<!-- <div>{{$t('account.personCentered')}}</div> -->
</div>
<!-- {{ router.path }} -->
<router-link class="content_left_item" v-for="item in rootSubmenuKeys" :class="{active: $route.path == item.route}" :to="item.route">
<i class="fi" :class="item.icon"></i>
<div>
{{item.name}}
</div>
</router-link>
<!-- <div class="content_left_item" v-for="item in rootSubmenuKeys" :class="{active: $route.path == item.route}">
<i class="fi" :class="item.icon"></i>
<router-link :to="item.route">
{{item.name}}
</router-link>
</div> -->
</div>
<div class="account_page_content_right">
<router-view></router-view>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent,computed,ref,reactive,nextTick,toRefs,createVNode} from 'vue'
import { Https } from "@/tool/https";
import { Modal,message } from 'ant-design-vue';
import { useRouter,useRoute } from 'vue-router'
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
setup() {
const {t} = useI18n()
const store = useStore();
let accountHomeData = reactive({
rootSubmenuKeys:[
{
name:t('account.Home'),
route:'/home/account/accountHome',
icon:'fi-rr-house-chimney'
},{
name:t('account.myInformation'),
route:'/home/account/accountEdit',
icon:'fi-rr-user'
},{
name:t('account.Messages'),
route:'/home/account/accountMessage',
icon:'fi-rr-envelope'
},{
name:`${t('account.Follow')} ${t('account.Fans')}`,
route:'/home/account/accountFollowFans',
icon:'fi-rr-users-alt'
},
]
})
const router = useRouter()
// provide('exhibitionList',exhibitionList)
let handleClick = (event:any) => {
// state.selectedKeys = [Number(event.key)]
// state.nowPageName = event.item.name
router.push({path:event.item.route})
}
return{
...toRefs(accountHomeData),
router,
handleClick,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_page{
height: 100%;
overflow-y: auto;
padding: 0 9rem;
.account_page_titleImg{
img{
width: 100%;
height: 30rem;
object-fit: cover;
}
}
.account_page_content_box{
padding: 5rem 0;
.account_page_content{
box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
border: 1px solid #e9eaec;
border-radius: 5px;
display: flex;
.account_page_content_left{
width: 20%;
text-align: center;
background: #fafafa;
border-right: 1px solid #e9eaec;
}
.account_page_content_right{
width: 80%;
}
.content_left_item{
display: flex;
align-items: center;
justify-content: center;
height: 10rem;
color: #232323;
div{
white-space: nowrap;
width: 15rem;
color: #232323;
text-align-last: justify;
font-size: 3rem;
}
i{
color: #cfcfcf;
font-size: 2.5rem;
display: flex;
margin-right: 2rem;
}
&.active{
color: #fff;
background: #39215b;
div{
color: #fff;
font-weight: 900;
}
i{
color: #fff;
}
}
}
}
}
}
</style>
<style lang="less">
.account_generalMessage_title{
display: flex;
align-items: center;
justify-content: space-between;
padding: 2rem 5rem;
border-bottom: 1px solid #e9eaec;
box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
border: 1px solid #e9eaec;
border-radius: 5px;
position: sticky;
top: 0;
background: #fff;
margin-right: 5rem;
margin-left: 5rem;
&.modal_title_text{
z-index: 2;
}
.account_generalMessage_title_setting{
cursor: pointer;
margin-left: auto
}
.account_generalMessage_title_seach{
display: flex;
input{
padding-left: 1.5rem;
font-size: 1.4rem;
}
.search_icon_block{
background: #39215b;
color: #fff;
padding: .5rem 2rem;
font-size: 1.8rem;
cursor: pointer;
}
}
}
.account_generalMessage_center{
box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
border: 1px solid #e9eaec;
border-radius: 5px;
padding: 2rem 0;
margin-right: 5rem;
margin-left: 5rem;
.account_generalMessage_item{
margin-right: 0;
margin-left: 0;
display: flex;
border-radius: 0px;
justify-content: space-between;
align-items: center;
padding: 2rem 5rem;
border: none;
border-bottom: 1px solid #e9eaec;
box-shadow: none;
}
}
.account_generalMessage_item{
box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
border: 1px solid #e9eaec;
border-radius: 5px;
padding: 5rem 5rem;
margin-right: 5rem;
margin-left: 5rem;
position: relative;
cursor: pointer;
.ant-badge{
position: absolute;
transform: translate(-100%, 100%);
top: 0;
right: 0;
}
.account_generalMessage_item_link{
color: #39215b;
cursor: pointer;
font-weight: 600;
}
.account_generalMessage_item_link:hover{
text-decoration: underline;
}
}
.account_generalMessage_item:hover{
background: #efefef;
}
.page_loading_box{
text-align: center;
height: 50px;
.page_loading{
display: block;
width: 50px;
height: 50px;
margin: 0 auto;
}
}
</style>

View File

@@ -0,0 +1,222 @@
<template>
<div class="accountEdit_page">
<div class="accountEdit_page_head">
<div class="upload_item">
<div class="upload_file_item">
<a-upload
:capture="null"
list-type="picture-card"
:before-upload="beforeUpload"
v-model:file-list="fileList"
:customRequest="function(){}"
:maxCount="1"
accept=".jpg,.png,.jpeg,.bmp"
@change="fileUploadChange"
>
<div
class="upload_tip_block"
>
<!-- <i class="fi fi-br-upload"></i> -->
<img :src="uploadUrl" alt="">
</div>
</a-upload>
</div>
</div>
</div>
<div class="accountEdit_page_body">
<div class="accountEdit_page_body_item">
<div class="accountEdit_page_body_item_name">{{$t('account.userName')}}:</div>
<div class="accountEdit_page_body_item_inut">
<input type="text" disabled :value="cookieUserInfo.userName">
</div>
</div>
<div class="accountEdit_page_body_item">
<div class="accountEdit_page_body_item_name">{{$t('account.email')}}:</div>
<div class="accountEdit_page_body_item_inut">
<input type="text" disabled :value="cookieUserInfo.email">
</div>
</div>
<div class="accountEdit_page_body_item">
<div class="started_btn" @click="setSubmit">
{{$t('account.Submit')}}
</div>
</div>
</div>
<Cropper ref="Cropper" @handleCropperSuccess="handleCropperSuccess" @closeCropper="deletUploadFile()" :cropperFileData="cropperFileData" :isRound="true"></Cropper>
</div>
</template>
<script lang="ts">
import { defineComponent,computed,ref,reactive,nextTick,toRefs,createVNode, onMounted} from 'vue'
import { Https } from "@/tool/https";
import { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import Cropper from '@/component/HomePage/Cropper.vue'
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
Cropper,
},
setup() {
const store = useStore();
let userInfo:any= computed(()=>{
return store.state.UserHabit.userInfo
})
let cookieUserInfo = JSON.parse(getCookie('userInfo') as any)
let accountHomeData:any = reactive({
cropperFileData:{name:'',uid:''}, //裁剪的原始文件数据
uploadUrl:userInfo.value?.avatar,
uploadFile:undefined,
token:'',
fileList:[]
})
let Cropper = ref()
// provide('exhibitionList',exhibitionList)
let handleCropperSuccess = (event:any)=>{
let {file, fileData,base64} =event
accountHomeData.fileList[0].status = 'done'
accountHomeData.uploadUrl = base64
accountHomeData.uploadFile = file
Cropper.value.closeCropper()
}
let beforeUpload=(file:any,fileList:any)=>{
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg' || file.type === 'image/bmp';
if (!isJpgOrPng) {
message.info(useI18n().t('PrintboardUpload.jsContent1'));
}
const isLt2M = file.size / 1024 / 1024 < 5;
if (!isLt2M) {
message.info(useI18n().t('PrintboardUpload.jsContent2'));
}
if(isJpgOrPng && isLt2M){
// }else{
// return (isJpgOrPng && isLt2M) || Upload.LIST_IGNORE;
}
}
let fileUploadChange = (data:any)=>{
let file = data.file
// file.id = res.data.id?res.data.id:""
var reader = new FileReader();
reader.onload = (e:any) => {
let data_new;
if (typeof e.target.result === 'object') {
// 把Array Buffer转化为blob 如果是base64不需要
data_new = window.URL.createObjectURL(new Blob([e.target.result]));
} else {
data_new = e.target.result;
}
Cropper.value.getOptionImg(data_new)
};
// 转化为base64
// reader.readAsDataURL(file)
// 转化为blob
reader.readAsArrayBuffer(file.originFileObj);
Cropper.value.changeShowModal(true)
}
let deletUploadFile = () => {
accountHomeData.fileList = []
// let index = -1
// this.fileList.forEach((ele:any,index1:any) => {
// if(this.cropperFileData.uid === ele.uid){
// index = index1
// }
// });
// if(index > -1){
// this.fileList.splice(index, 1)
// }
}
let setSubmit = ()=>{
if(!accountHomeData.uploadFile)return
let param = new FormData();
param.append('file',accountHomeData.uploadFile);
let config:any = {headers:{'Content-Type':'multipart/form-data','Accept':'*/*' }}
Https.axiosPost(Https.httpUrls.uploadAvatar,param,config)
.then((rv)=>{
let data = {
avatar : rv
}
store.commit("setUserInfo", data)
message.success('提交成功')
})
}
return{
...toRefs(accountHomeData),
userInfo,
cookieUserInfo,
Cropper,
handleCropperSuccess,
beforeUpload,
fileUploadChange,
deletUploadFile,
setSubmit,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.accountEdit_page{
padding: 8rem 5rem;
.accountEdit_page_head{
display: flex;
align-items: center;
justify-content: center;
width: 20rem;
margin: 0 auto;
position: relative;
img{
width: 15rem;
object-fit: contain;
height: 15rem;
border-radius: 50%;
background: #fff;
}
.accountEdit_page_head_upload{
width: auto;
}
.upload_item{
:deep(.ant-upload-list-picture-card-container){
display: none !important;
}
}
margin-bottom: 5rem;
}
.accountEdit_page_body{
.accountEdit_page_body_item{
display: flex;
margin-bottom: 5rem;
width: 100%;
.started_btn{
text-align: center;
}
input,textarea{
padding-left: 2rem;
border-radius: 4px;
border: 1px solid #dcdfe6;
width: 100%;
}
.accountEdit_page_body_item_name{
color: #606266;
width: 14rem;
text-align: right;
}
.accountEdit_page_body_item_inut{
margin-left: 2rem;
flex: 1;
}
}
.accountEdit_page_body_item:last-child{
justify-content: center;
}
}
}
</style>

View File

@@ -0,0 +1,172 @@
<template>
<div class="account_followFans">
<div class="account_followFans_title modal_title_text">
<div class="">
{{$t('account.Interact')}}
</div>
<!-- <div class="account_followFans_title_setting">设置</div> -->
</div>
<a-tabs class="account_followFans_body" v-model:activeKey="activeKey" @change="changeTabs">
<a-tab-pane v-for="item in messageList" :key="item.key">
<follow v-if="item.key == 'follow'" :ref="item.key"></follow>
<fans v-if="item.key == 'fans'" :ref="item.key"></fans>
<template #tab>
<span>{{item.title}}</span>
<!--
<a-badge :count="messageSystem.messageType[item.key]" >
<span>{{item.title}}</span>
</a-badge> -->
</template>
</a-tab-pane>
<!--
<a-tab-pane key="1" tab="系统消息">
<system ref="system"></system>
</a-tab-pane>
<a-tab-pane key="3" tab="评论">
<comment></comment>
</a-tab-pane>
<a-tab-pane key="4" tab="点赞">
<likeMessage></likeMessage>
</a-tab-pane>
<a-tab-pane key="6" tab="新增粉丝">
<newFollow ref="newFollow"></newFollow>
</a-tab-pane>
<a-tab-pane key="5" tab="客服">Content of Tab Pane 3</a-tab-pane> -->
</a-tabs>
</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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import follow from '@/component/Account/followFans/follow.vue'
import fans from '@/component/Account/followFans/fans.vue'
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
follow,
fans,
},
setup() {
const router = useRouter()
const store = useStore();
const {t} = useI18n()
let accountMessage = reactive({
messageList:[
{
title:t('account.Follow'),
key:'follow',
},
{
title:t('account.Fans'),
key:'fans',
},
],
activeKey: '',
})
let userInfo= computed(()=>{
return store.state.UserHabit.userInfo
})
let domRefs:any = reactive({
follow:ref(null),
fans:ref(null),
})
let messageSystem = computed(()=>{
return store.state.UserHabit.messageSystem
})
let changeTabs = (key:any)=>{
}
let setReadStatus = (value:any)=>{
return new Promise((resolve,reject)=>{
if(value.isRead == 1)return reject('')
let data = {
type:accountMessage.activeKey,
notificationIdList:value.id
}
Https.axiosPost(Https.httpUrls.setReadStatus,'',{params:data}).then((rv)=>{
if(rv){
resolve(rv)
// store.commit('setMessageSystem',rv)
}
}).catch((err)=>{
reject(err)
})
})
}
onMounted(()=>{
let key = accountMessage.messageList[0].key
accountMessage.activeKey = key
})
return{
...toRefs(accountMessage),
...toRefs(domRefs),
userInfo,
messageSystem,
setReadStatus,
changeTabs,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_followFans{
width: 100%;
.account_followFans_title{
display: flex;
align-items: center;
justify-content: space-between;
padding: 2rem 5rem;
border-bottom: 1px solid #e9eaec;
.account_followFans_title_setting{
cursor: pointer;
}
}
.account_followFans_body{
padding-bottom: 3rem;
:deep(.ant-badge){
font-size: var(--aida-fsize2);
}
:deep(.ant-tabs-nav){
padding: 0rem 5rem;
.ant-tabs-nav-wrap{
.ant-tabs-tab-btn{
font-size: 2.4rem;
}
.ant-tabs-tab-btn:active{
color: #39215b;
}
.ant-tabs-tab-active{
.ant-tabs-tab-btn{
color: #39215b;
font-weight: 900;
}
}
}
.ant-tabs-tab:hover{
color: #39215b;
}
.ant-tabs-ink-bar{
background: #39215b;
}
}
:deep(.ant-tabs-content){
height: 80rem;
// min-height: 80rem;
overflow-y: auto;
}
}
}
</style>

View File

@@ -0,0 +1,222 @@
<template>
<div class="account_home">
<div class="account_home_content">
<div class="content_item content_item_user">
<div class="content_item_user_left">
<div class="content_item_user_left_detail">
<img :src="userInfo?.avatar" alt="">
</div>
<div class="content_item_user_left_detail">
<div class="modal_title_text">
<div>{{ cookieUserInfo.userName }}</div>
<div class="modal_title_text_assistant"><span>{{$t('account.email')}}: </span>{{ cookieUserInfo?.email }}</div>
</div>
<div class="content_item_user_left_detail_bottom">
<div>
<span>{{$t('account.Follow')}}</span>{{ userInfo?.followeeCount }}
</div>
<div>
<span>{{$t('account.Fans')}}</span>{{ userInfo?.followerCount }}
</div>
</div>
</div>
</div>
<div class="content_item_user_right">
<div @click="setUserData">{{$t('account.editUser')}}</div>
</div>
</div>
<div class="content_item content_item_task">
<!-- <div class="content_item_title">
<i>icon</i>
<div>每日奖励</div>
</div>
<div class="content_item_task_max">
<div class="content_item_task_item">
<div class="content_item_task_item_state">
<div class="state_credits">20 Credits</div>
<i class="fi fi-br-check"></i>
</div>
<div class="content_item_task_item_title">
每日点赞
</div>
<div class="content_item_task_item_award">
已完成 0 / 10
</div>
</div>
<div class="content_item_task_item active">
<div class="content_item_task_item_state">
<div class="state_credits">20 Credits</div>
<i class="fi fi-br-check"></i>
</div>
<div class="content_item_task_item_title">
每日发布作品
</div>
<div class="content_item_task_item_award">
20 Credits 到手
</div>
</div>
</div> -->
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent,computed,ref,reactive,nextTick,toRefs,createVNode} from 'vue'
import { Https } from "@/tool/https";
import { useRouter,useRoute } from 'vue-router'
import { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
setup() {
const router = useRouter()
const store = useStore();
let userInfo:any= computed(()=>{
return store.state.UserHabit.userInfo
})
let cookieUserInfo = ref(null)
if(getCookie('userInfo')){
let userInfo:any = getCookie('userInfo')
cookieUserInfo.value = JSON.parse(userInfo)
}
let accountHomeData = reactive({
})
// provide('exhibitionList',exhibitionList)
let setUserData = ()=>{
router.push({path:'/home/account/accountEdit'})
}
return{
userInfo,
cookieUserInfo,
...toRefs(accountHomeData),
setUserData,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_home{
width: 100%;
.account_home_content{
.content_item{
padding: 8rem 5rem;
border-bottom: 1px solid #e9eaec;
.content_item_title{
display: flex;
align-items: center;
i{
margin-right: 1rem;
}
}
}
.content_item:last-child{
border-bottom: none;
}
.content_item_user{
display: flex;
justify-content: space-between;
align-items: center;
.content_item_user_left{
display: flex;
.content_item_user_left_detail{
img{
border-radius: 50%;
width: 10rem;
height: 10rem
}
.content_item_user_left_detail_bottom{
display: flex;
font-size: 1.8rem;
>div{
font-weight: 900;
width: 10rem;
span{
font-weight: 600;
color: rgba(0,0,0,.45);
}
}
}
}
.content_item_user_left_detail:last-child{
margin-left: 4rem;
}
}
.content_item_user_right{
border: 1px solid #e9eaec;
color: #6f767f;
font-size: 1.8rem;
cursor: pointer;
display: flex;
padding: 0 1rem;
border-radius: 4px;
}
}
.content_item_task{
.content_item_task_max{
display: flex;
margin-top: 4rem;
}
.content_item_task_item{
display: flex;
flex-direction: column;
align-items: center;
width: 25%;
.content_item_task_item_state{
width: 10rem;
height: 10rem;
background: linear-gradient(135deg, #cdacfc 50%, #a46ef0 50%) 00px 0;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
.state_credits{
font-size: 1.6rem;
font-weight: 900;
color: #fff;
}
i{
font-size: 3rem;
font-weight: 900;
display: none;
color: #fff;
}
}
.content_item_task_item_title{
margin: 2rem 0 ;
}
.content_item_task_item_award{
font-size: 1.8rem;
background: #fff;
border-radius: 4px;
padding: 0 1rem;
color: #99a2aa;
}
&.active{
.content_item_task_item_state{
background: linear-gradient(135deg, #4ddda8 50%, #3bcd98 50%) 00px 0;
.state_credits{
display: none;
}
i{
display: flex;
}
}
.content_item_task_item_award{
background: #8a95a8;
color: #fff;
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,230 @@
<template>
<div class="account_message">
<div class="account_message_title modal_title_text">
<div class="">
{{$t('account.Messages')}}
</div>
<!-- <div class="account_message_title_setting">设置</div> -->
</div>
<a-tabs class="account_message_body" v-model:activeKey="activeKey" @change="changeTabs">
<a-tab-pane v-for="item in messageList" :key="item.key">
<system v-if="item.key == 'system'" :ref="item.key" :setReadStatus="setReadStatus" :setAllmessage="setAllmessage" :getHistory="getHistory"></system>
<privateChat v-if="item.key == 'privateChat'" :ref="item.key" :setReadStatus="setReadStatus" :setAllmessage="setAllmessage" :getHistory="getHistory"></privateChat>
<comment v-if="item.key == 'comment'" :ref="item.key" :setReadStatus="setReadStatus" :setAllmessage="setAllmessage" :getHistory="getHistory"></comment>
<likeMessage v-if="item.key == 'like'" :ref="item.key" :setReadStatus="setReadStatus" :setAllmessage="setAllmessage" :getHistory="getHistory"></likeMessage>
<newFollow v-if="item.key == 'follow'" :ref="item.key" :setReadStatus="setReadStatus" :setAllmessage="setAllmessage" :getHistory="getHistory"></newFollow>
<!-- <newFollow v-if="item.key == 'service'" :ref="item.key"></newFollow> -->
<template #tab>
<a-badge :count="messageSystem.messageType[item.key]" >
<span>{{item.title}}</span>
</a-badge>
</template>
</a-tab-pane>
<!--
<a-tab-pane key="1" tab="系统消息">
<system ref="system"></system>
</a-tab-pane>
<a-tab-pane key="3" tab="评论">
<comment></comment>
</a-tab-pane>
<a-tab-pane key="4" tab="点赞">
<likeMessage></likeMessage>
</a-tab-pane>
<a-tab-pane key="6" tab="新增粉丝">
<newFollow ref="newFollow"></newFollow>
</a-tab-pane>
<a-tab-pane key="5" tab="客服">Content of Tab Pane 3</a-tab-pane> -->
</a-tabs>
</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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import system from '@/component/Account/message/system.vue'
import privateChat from '@/component/Account/message/privateChat.vue'
import newFollow from '@/component/Account/message/newFollow.vue'
import likeMessage from '@/component/Account/message/likeMessage.vue'
import comment from '@/component/Account/message/comment.vue'
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
system,
privateChat,
newFollow,
likeMessage,
comment,
},
setup() {
const {t} = useI18n()
const router = useRouter()
const store = useStore();
let accountMessage = reactive({
messageList:[
{
title:t('account.systemMessages'),
key:'system',
},
// {
// title:'私信',
// key:'privateChat',
// },
{
title:t('account.comment'),
key:'comment',
},{
title:t('account.like'),
key:'like',
},{
title:t('account.NewFans'),
key:'follow',
},
// {
// title:'客服',
// key:'service',
// },
],
activeKey: '',
})
let domRefs:any = reactive({
system:ref(null),
comment:ref(null),
like:ref(null),
follow:ref(null),
service:ref(null)
})
let messageSystem = computed(()=>{
return store.state.UserHabit.messageSystem
})
// provide('exhibitionList',exhibitionList)
let setUserData = ()=>{
router.push({path:'/home/account/accountEdit'})
}
let changeTabs = (key:any)=>{
// if(accountMessage.activeKey == 'service')return
}
let setReadStatus = (value:any)=>{
return new Promise((resolve,reject)=>{
if(value.isRead == 1)return reject('')
let data = {
type:accountMessage.activeKey,
notificationIdList:value.id
}
Https.axiosPost(Https.httpUrls.setReadStatus,'',{params:data}).then((rv)=>{
if(rv){
resolve(rv)
// store.commit('setMessageSystem',rv)
}
}).catch((err)=>{
reject(err)
})
})
}
let setAllmessage = ()=>{
return new Promise((resolve,reject)=>{
let data = {
type:accountMessage.activeKey
}
Https.axiosPost(Https.httpUrls.oneClickRead,'',{params:data}).then((rv)=>{
resolve(rv)
}).catch((err)=>{
reject(err
)
})
})
}
let getHistory = (data:any)=>{
return new Promise((resolve,reject)=>{
data.type = accountMessage.activeKey
let url = Https.httpUrls.getHistoryNotification
// if(data.type == 'follow'){
// url = Https.httpUrls.porfolioGetFollowerList
// }
Https.axiosPost(url,data).then((rv)=>{
if(rv){
// domRefs[data.type][0].setmessageList(rv,data)
resolve(rv)
}
}).catch((err)=>{
reject(err)
})
})
}
onMounted(()=>{
let key = accountMessage.messageList[0].key
accountMessage.activeKey = key
})
return{
...toRefs(accountMessage),
...toRefs(domRefs),
messageSystem,
setUserData,
setReadStatus,
changeTabs,
setAllmessage,
getHistory,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_message{
width: 100%;
.account_message_title{
display: flex;
align-items: center;
justify-content: space-between;
padding: 2rem 5rem;
border-bottom: 1px solid #e9eaec;
.account_message_title_setting{
cursor: pointer;
}
}
.account_message_body{
padding-bottom: 3rem;
:deep(.ant-badge){
font-size: var(--aida-fsize2);
}
:deep(.ant-tabs-nav){
padding: 0rem 5rem;
.ant-tabs-nav-wrap{
.ant-tabs-tab-btn{
font-size: 2.4rem;
}
.ant-tabs-tab-btn:active{
color: #39215b;
}
.ant-tabs-tab-active{
.ant-tabs-tab-btn{
color: #39215b;
font-weight: 900;
}
}
}
.ant-tabs-tab:hover{
color: #39215b;
}
.ant-tabs-ink-bar{
background: #39215b;
}
}
:deep(.ant-tabs-content){
height: 80rem;
// min-height: 80rem;
overflow-y: auto;
}
}
}
</style>

View File

@@ -0,0 +1,180 @@
<template>
<div class="account_fans">
<div class="account_generalMessage_title modal_title_text">
<span class="account_generalMessage_title_seach">
<input type="text" @keydown.enter="searchFollowFansList" class="search_input" v-model="getListData.seachContent">
<div class="search_icon_block" @click="searchFollowFansList">
<i class="icon iconfont icon-sousuo"></i>
</div>
</span>
</div>
<div class="account_generalMessage_center modal_title_text">
<div class="account_generalMessage_item" v-for="item in dataList" :key="item.id">
<div class="account_generalMessage_item_right">
<div class="account_generalMessage_item_right_img" @click.stop="openOtherUsers(item)">
<img :src="item.avatar" alt="">
</div>
<div class="account_generalMessage_item_right_title">
<div class="">{{ item.userName }}</div>
<div class="modal_title_text_intro">{{ item.createTime }}</div>
</div>
</div>
<div class="account_generalMessage_item_left">
<!-- <div @click.stop="setFollow(item)" >{{$t('newScaleImage.Follow')}}</div> -->
<div v-if="item?.isFollow == 0" @click.stop="setFollow(item)" >{{$t('newScaleImage.Follow')}}</div>
<div v-else @click.stop="setFollow(item)" >{{$t('newScaleImage.Unfollow')}}</div>
</div>
</div>
<div class="account_generalMessage_item" style="justify-content: center;" v-if="dataList.length == 0 && getListData.isNoData">
{{$t('account.dataNull')}}
</div>
<div class="page_loading_box" v-show="!getListData.isNoData">
<span class="page_loading" ref="loadingDom" v-show="!getListData.isShowMark"></span>
<span v-show="getListData.isShowMark">
<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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
// emits:['setReadStatus','setAllmessage'],
props:[''],
setup(prop,{emit}) {
const router = useRouter()
const store = useStore();
let accountFollofFans:any = reactive({
getListData: {
page: 1,
size: 10,
seachContent:'',
isNoData: false,
isShowMark: false,
},
dataList:ref([
])
})
let loadingDom:any = ref(null)
let searchFollowFansList = ()=>{
accountFollofFans.getListData.page = 1
getFollowFansList()
}
let getFollowFansList = ()=>{
accountFollofFans.getListData.isShowMark = true
let data = accountFollofFans.getListData
Https.axiosPost(Https.httpUrls.porfolioGetFollowerList,data).then((rv)=>{
if(rv){
accountFollofFans.getListData.isShowMark = false
if(rv.length == 0) {
accountFollofFans.getListData.isNoData = true
return
}
accountFollofFans.dataList = rv
}
}).catch(() => {
accountFollofFans.getListData.isShowMark = false
accountFollofFans.getListData.isNoData = true
})
}
let setFollow = (item:any) =>{
let url = Https.httpUrls.porfolioFollow
if(item.isFollow == 1)url = Https.httpUrls.porfolioCancelFollow
Https.axiosGet(url, {params:{followeeId:item.senderId}})
.then((rv) => {
searchFollowFansList()
// if(item.isFollow == 1){
// item.isFollow = 0
// }else{
// item.isFollow = 1
// }
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
}
onMounted (()=>{
accountFollofFans.getListData.isNoData = false
accountFollofFans.getListData.page = 0
new IntersectionObserver(
(entries, observer) => {
// 如果不是相交,则直接返回
// console.log(entries[0]);
if (!entries[0].intersectionRatio) return;
accountFollofFans.getListData.page+=1
getFollowFansList()
},
// { root:worksPage }
).observe(loadingDom.value);
})
return{
...toRefs(accountFollofFans),
searchFollowFansList,
getFollowFansList,
loadingDom,
setFollow,
openOtherUsers,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_fans{
width: 100%;
.account_generalMessage_center{
.account_generalMessage_item{
.account_generalMessage_item_right{
display: flex;
align-items: center;
.account_generalMessage_item_right_img{
width: 8rem;
height: 8rem;
margin-right: 2rem;
cursor: pointer;
img{
width: 100%;
height: 100%;
border-radius: 50%;
}
}
}
.account_generalMessage_item_left{
div{
padding: .5rem 2rem;
border-radius: 4rem;
border: 2px solid #e9eaec;
cursor: pointer;
}
}
}
.account_generalMessage_item:hover{
background: #ffffff;
}
.account_generalMessage_item:last-child{
margin-bottom: 0;
border-bottom: none;
}
}
}
</style>

View File

@@ -0,0 +1,183 @@
<template>
<div class="account_follow">
<div class="account_generalMessage_title modal_title_text">
<span class="account_generalMessage_title_seach">
<input type="text" @keydown.enter="searchFollowFansList" class="search_input" v-model="getListData.seachContent">
<div class="search_icon_block" @click="searchFollowFansList">
<i class="icon iconfont icon-sousuo"></i>
</div>
</span>
</div>
<div class="account_generalMessage_center modal_title_text">
<div class="account_generalMessage_item" v-for="item in dataList" :key="item.id">
<a-badge :dot="item.isRead == 0"></a-badge>
<div class="account_generalMessage_item_right">
<div class="account_generalMessage_item_right_img" @click.stop="openOtherUsers(item)">
<img :src="item.avatar" alt="">
</div>
<div class="account_generalMessage_item_right_title">
<div class="">{{ item.userName }}</div>
<div class="modal_title_text_intro">{{ item.createTime }} </div>
</div>
</div>
<div class="account_generalMessage_item_left">
<!-- <div v-if="item?.isFollow == 0" @click.stop="setFollow(item)" >{{$t('newScaleImage.Follow')}}</div>
<div v-else @click.stop="setFollow(item)" >{{$t('newScaleImage.Unfollow')}}</div> -->
<div @click.stop="setFollow(item)" >{{$t('newScaleImage.Unfollow')}}</div>
</div>
</div>
<div class="account_generalMessage_item" style="justify-content: center;" v-if="dataList.length == 0 && getListData.isNoData">
{{$t('account.dataNull')}}
</div>
<div class="page_loading_box" v-show="!getListData.isNoData">
<span class="page_loading" ref="loadingDom" v-show="!getListData.isShowMark"></span>
<span v-show="getListData.isShowMark">
<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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
// emits:['setReadStatus','setAllmessage'],
props:[''],
setup(prop,{emit}) {
const router = useRouter()
const store = useStore();
let accountFollofFans = reactive({
getListData: {
page: 1,
size: 10,
seachContent:'',
isNoData: false,
isShowMark: false,
},
dataList:ref([
])
})
let loadingDom:any = ref(null)
let searchFollowFansList = ()=>{
accountFollofFans.getListData.page = 1
getFollowFansList()
}
let getFollowFansList = ()=>{
accountFollofFans.getListData.isShowMark = true
let data = accountFollofFans.getListData
Https.axiosPost(Https.httpUrls.porfolioGetFolloweeList,data).then((rv)=>{
if(rv){
accountFollofFans.getListData.isShowMark = false
if(rv.length == 0) {
accountFollofFans.getListData.isNoData = true
return
}
accountFollofFans.dataList = rv
}
}).catch(() => {
accountFollofFans.getListData.isShowMark = false
accountFollofFans.getListData.isNoData = true
})
}
let setFollow = (item:any) =>{
// let url = Https.httpUrls.porfolioFollow
// if(item.isFollow == 1)url = Https.httpUrls.porfolioCancelFollow
let url = Https.httpUrls.porfolioCancelFollow
Https.axiosGet(url, {params:{followeeId:item.senderId}})
.then((rv) => {
searchFollowFansList()
// if(item.isFollow == 1){
// item.isFollow = 0
// }else{
// item.isFollow = 1
// }
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
}
onMounted (()=>{
accountFollofFans.getListData.isNoData = false
accountFollofFans.getListData.page = 0
new IntersectionObserver(
(entries, observer) => {
// 如果不是相交,则直接返回
// console.log(entries[0]);
if (!entries[0].intersectionRatio) return;
accountFollofFans.getListData.page+=1
getFollowFansList()
},
// { root:worksPage }
).observe(loadingDom.value);
})
return{
...toRefs(accountFollofFans),
searchFollowFansList,
getFollowFansList,
loadingDom,
setFollow,
openOtherUsers,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_follow{
width: 100%;
.account_generalMessage_center{
.account_generalMessage_item{
.account_generalMessage_item_right{
display: flex;
align-items: center;
.account_generalMessage_item_right_img{
width: 8rem;
height: 8rem;
margin-right: 2rem;
cursor: pointer;
img{
width: 100%;
height: 100%;
object-fit: contain;
border-radius: 50%;
}
}
}
.account_generalMessage_item_left{
div{
padding: .5rem 2rem;
border-radius: 4rem;
border: 2px solid #e9eaec;
cursor: pointer;
}
}
}
.account_generalMessage_item:hover{
background: #ffffff;
}
.account_generalMessage_item:last-child{
margin-bottom: 0;
border-bottom: none;
}
}
}
</style>

View File

@@ -0,0 +1,216 @@
<template>
<div class="account_comment">
<div class="account_generalMessage_title modal_title_text">
<!-- <span>收到的评论</span> -->
<div class="account_generalMessage_title_setting" @click="allRead">{{$t('account.AllRead')}}</div>
</div>
<div class="account_generalMessage_center modal_title_text">
<div class="account_generalMessage_item" v-for="item in dataList" @click="setRead(item)">
<a-badge :dot="item.isRead == 0"></a-badge>
<div class="account_generalMessage_item_right">
<div class="account_generalMessage_item_right_img" @click.stop="openOtherUsers(item)">
<img :src="item.avatar" alt="">
</div>
<div class="account_generalMessage_item_right_title">
<div class="account_generalMessage_item_right_title_name">{{ item.userName }} <span>{{$t('account.reply')}}</span></div>
<div class="account_generalMessage_item_right_title_center modal_title_text_assistant">{{ item.content }}</div>
<div class="account_generalMessage_item_right_works modal_title_text_intro" @click.stop="openOtherWork(item)">{{ item.portfolioName }}</div>
</div>
</div>
<div class="account_generalMessage_item_left">
<div class="account_generalMessage_item_left_delete modal_title_text_intro">
<!-- <span class="icon iconfont icon-shanchu operate_icon"></span> -->
</div>
<div class="modal_title_text_intro">{{ item.createTime }}</div>
</div>
</div>
<div class="account_generalMessage_item" style="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>
<span v-show="isShowMark">
<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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
props:['setReadStatus','setAllmessage','getHistory'],
setup(prop,{emit}) {
const router = useRouter()
const store = useStore();
let accountMessage = reactive({
activeKey: ref('1'),
dataList:[
],
page:1,
size:10,
isNoData: false,
isShowMark: false,
})
let loadingDom:any = ref(null)
let setmessageList = ()=>{
accountMessage.isShowMark = true
let data = {
page: accountMessage.page,
size: accountMessage.size,
}
prop.getHistory(data).then((rv:any)=>{
accountMessage.isShowMark = false
if(rv.content.length == 0) {
accountMessage.isNoData = true
return
}
accountMessage.dataList = rv.content
}).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 openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
}
let openOtherWork = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/works',
query:{
workId:item.portfolioId
}
})
window.open(routeUrl.href,'_blank')
}
onMounted (()=>{
accountMessage.isNoData = false
accountMessage.page = 0
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
setmessageList()
},
// { root:worksPage }
).observe(loadingDom.value);
})
return{
...toRefs(accountMessage),
setmessageList,
setRead,
allRead,
openOtherUsers,
openOtherWork,
loadingDom,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_comment{
width: 100%;
.account_generalMessage_item{
.account_generalMessage_item_right{
display: flex;
align-items: center;
margin-right: 1rem;
.account_generalMessage_item_right_works{
cursor: pointer;
}
.account_generalMessage_item_right_works:hover{
text-decoration: underline;
}
.account_generalMessage_item_right_img{
width: 8rem;
height: 8rem;
margin-right: 2rem;
flex-shrink: 0;
cursor: pointer;
img{
width: 100%;
height: 100%;
object-fit: contain;
border-radius: 50%;
}
}
.account_generalMessage_item_right_title{
display: flex;
flex-direction: column;
align-items: flex-start;
.account_generalMessage_item_right_title_center{
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.account_generalMessage_item_right_title_name{
font-weight: 600;
font-weight: 500;
color: #000;
span{
font-weight: 500;
color: #9999aa;
}
}
}
}
.account_generalMessage_item_left{
text-align: right;
flex-shrink: 0;
.account_generalMessage_item_left_delete{
span{
cursor: pointer;
}
}
div{
padding: .5rem 2rem;
border-radius: 4rem;
}
}
}
.account_generalMessage_item:last-child{
margin-bottom: 0;
border-bottom: none;
}
}
</style>

View File

@@ -0,0 +1,194 @@
<template>
<div class="account_like">
<div class="account_generalMessage_title modal_title_text">
<!-- <span>点赞</span> -->
<div class="account_generalMessage_title_setting" @click="allRead">{{$t('account.AllRead')}}</div>
</div>
<div class="account_generalMessage_center modal_title_text">
<div class="account_generalMessage_item" v-for="item in dataList" :key="item.id" @click="setRead(item)">
<a-badge :dot="item.isRead == 0"></a-badge>
<div class="account_generalMessage_item_right">
<div class="account_generalMessage_item_right_img" @click="openOtherUsers(item)">
<img :src="item.avatar" alt="">
</div>
<div class="account_generalMessage_item_right_title">
<div class="account_generalMessage_item_right_title_name">{{ item.userName }} <span>{{$t('account.likedYourWork')}}</span></div>
<div>{{ item.portfolioName }}</div>
</div>
</div>
<div class="account_generalMessage_item_left">
<div class="account_generalMessage_item_left_delete modal_title_text_intro">
<!-- <span class="icon iconfont icon-shanchu operate_icon"></span> -->
</div>
<div class="modal_title_text_intro">{{ item.createTime }}</div>
</div>
</div>
<div class="account_generalMessage_item" style="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>
<span v-show="isShowMark">
<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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
// emits:['setReadStatus','setAllmessage'],
props:['setReadStatus','setAllmessage','getHistory'],
setup(prop,{emit}) {
const router = useRouter()
const store = useStore();
let accountMessage = reactive({
activeKey: ref('1'),
dataList:[
],
page:1,
size:10,
isNoData: false,
isShowMark: false,
})
let loadingDom:any = ref(null)
let setmessageList = ()=>{
accountMessage.isShowMark = true
let data = {
page: accountMessage.page,
size: accountMessage.size,
}
prop.getHistory(data).then((rv:any)=>{
accountMessage.isShowMark = false
if(rv.content.length == 0) {
accountMessage.isNoData = true
return
}
accountMessage.dataList = rv.content
}).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 openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
}
onMounted (()=>{
accountMessage.isNoData = false
accountMessage.page = 0
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
setmessageList()
},
// { root:worksPage }
).observe(loadingDom.value);
})
return{
...toRefs(accountMessage),
setmessageList,
setRead,
allRead,
openOtherUsers,
loadingDom,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_like{
width: 100%;
.account_generalMessage_title{
}
.account_generalMessage_center{
.account_generalMessage_item{
.account_generalMessage_item_right{
display: flex;
align-items: center;
margin-right: 1rem;
.account_generalMessage_item_right_img{
width: 8rem;
height: 8rem;
margin-right: 2rem;
flex-shrink: 0;
cursor: pointer;
img{
width: 100%;
height: 100%;
object-fit: contain;
border-radius: 50%;
}
}
.account_generalMessage_item_right_title{
.account_generalMessage_item_right_title_name{
font-weight: 600;
font-weight: 500;
color: #000;
span{
font-weight: 500;
color: #9999aa;
}
}
}
}
.account_generalMessage_item_left{
text-align: right;
flex-shrink: 0;
.account_generalMessage_item_left_delete{
span{
cursor: pointer;
}
}
div{
padding: .5rem 2rem;
border-radius: 4rem;
}
}
}
.account_generalMessage_item:last-child{
margin-bottom: 0;
border-bottom: none;
}
}
}
</style>

View File

@@ -0,0 +1,185 @@
<template>
<div class="account_newFollow">
<div class="account_generalMessage_title modal_title_text">
<!-- <span>新增粉丝</span> -->
<div class="account_generalMessage_title_setting" @click="allRead">{{$t('account.AllRead')}}</div>
</div>
<div class="account_generalMessage_center modal_title_text">
<div class="account_generalMessage_item" v-for="item in dataList" :key="item.id" @click="setRead(item)">
<a-badge :dot="item.isRead == 0"></a-badge>
<div class="account_generalMessage_item_right">
<div class="account_generalMessage_item_right_img" @click="openOtherUsers(item)">
<img :src="item.avatar" alt="">
</div>
<div class="account_generalMessage_item_right_title">
<div class="">{{ item.userName }}</div>
<div class="modal_title_text_intro">{{ item.createTime }} {{$t('account.followedYou')}}</div>
</div>
</div>
<div class="account_generalMessage_item_left">
<div v-if="item?.isFollow == 0" @click.stop="setFollow(item)" >{{$t('newScaleImage.Follow')}}</div>
<div v-else @click.stop="setFollow(item)" >{{$t('newScaleImage.Unfollow')}}</div>
</div>
</div>
<div class="account_generalMessage_item" style="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>
<span v-show="isShowMark">
<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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
// emits:['setReadStatus','setAllmessage'],
props:['setReadStatus','setAllmessage','getHistory'],
setup(prop,{emit}) {
const router = useRouter()
const store = useStore();
let accountMessage = reactive({
activeKey: ref('1'),
dataList:[
],
page:1,
size:10,
isNoData: false,
isShowMark: false,
})
let loadingDom:any = ref(null)
let setmessageList = ()=>{
accountMessage.isShowMark = true
let data = {
page: accountMessage.page,
size: accountMessage.size,
}
prop.getHistory(data).then((rv:any)=>{
accountMessage.isShowMark = false
if(rv.content.length == 0) {
accountMessage.isNoData = true
return
}
accountMessage.dataList = rv.content
}).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 setFollow = (item:any) =>{
let url = Https.httpUrls.porfolioFollow
if(item.isFollow == 1)url = Https.httpUrls.porfolioCancelFollow
Https.axiosGet(url, {params:{followeeId:item.senderId}})
.then((rv) => {
if(item.isFollow == 1){
item.isFollow = 0
}else{
item.isFollow = 1
}
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
}
onMounted (()=>{
accountMessage.isNoData = false
accountMessage.page = 0
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
setmessageList()
},
// { root:worksPage }
).observe(loadingDom.value);
})
return{
...toRefs(accountMessage),
setmessageList,
setRead,
allRead,
setFollow,
openOtherUsers,
loadingDom,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_newFollow{
width: 100%;
.account_generalMessage_center{
.account_generalMessage_item{
.account_generalMessage_item_right{
display: flex;
align-items: center;
.account_generalMessage_item_right_img{
width: 8rem;
height: 8rem;
margin-right: 2rem;
cursor: pointer;
img{
width: 100%;
height: 100%;
object-fit: contain;
border-radius: 50%;
}
}
}
.account_generalMessage_item_left{
div{
padding: .5rem 2rem;
border-radius: 4rem;
border: 2px solid #e9eaec;
cursor: pointer;
}
}
}
.account_generalMessage_item:last-child{
margin-bottom: 0;
border-bottom: none;
}
}
}
</style>

View File

@@ -0,0 +1,427 @@
<template>
<div class="account_privateChatMessage">
<div class="account_generalMessage_title modal_title_text">
<!-- <span>私信</span> -->
<div class="account_generalMessage_title_setting">全部已读</div>
</div>
<div class="account_privateChatMessage_content">
<div class="content_left">
<div class="content_left_item" v-for="item,index in privateChatList" :class="{active:item.active}" @click.stop="openPrivateChat(item,index)">
<div class="content_left_item_btn" @click.stop="deletePrivateChat(item,index)">
<i class="fi fi-rr-cross-small"></i>
</div>
<!-- <img :src="item.img" alt=""> -->
<img src="../../../assets/images/homePage/alipay.svg" alt="">
<div class="modal_title_text">
<div class="modal_title_text_assistant" :title="item.title">{{item.title}}</div>
<div class="modal_title_text_intro" :title="item.intro">{{item.intro}}</div>
</div>
</div>
</div>
<div class="content_right" v-if="currentPrivateChat >= 0">
<div class="content_right_top">
<div class="modal_title_text">
<div class="">{{ privateChat[currentPrivateChat]?.title }}</div>
</div>
</div>
<div class="content_right_record">
<div class="content_right_record_item" v-for="item in privateChat[currentPrivateChat]?.messageList">
<div v-if="item.type == 'time'" class="content_right_record_item_time">
{{ item.data }}
</div>
<div v-else class="content_right_record_item_content" :class="{active:item.type == 'user'}">
<div class="content_right_record_item_HeadImg">
<img src="../../../assets/images/homePage/alipay.svg" alt="">
</div>
<div class="content_right_record_item_text">
{{ item.data }}
</div>
</div>
</div>
</div>
<div class="content_right_send">
<div class="content_right_operation">
<div>icon</div>
<div>icon</div>
<div>icon</div>
</div>
<div class="content_right_input">
<textarea ref="textarea" v-if="privateChat[currentPrivateChat]?.title" v-model="privateChat[currentPrivateChat].temporary"></textarea>
</div>
<div class="content_right_btn modal_title_text">
<div class="content_right_btn_astrict modal_title_text_intro">
<span :style="{color:privateChat[currentPrivateChat]?.temporary.length>500?'red':''}">
{{privateChat[currentPrivateChat]?.temporary.length}}
</span>
/500</div>
<div class="content_right_btn_send started_btn" @click="sendCli">发送</div>
</div>
</div>
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
</div>
<div class="content_right content_right_null" v-else>
您还未选中或者发起聊天快去跟好友聊一聊吧
</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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
setup() {
const router = useRouter()
const store = useStore();
let accountPrivateChat:any = reactive({
activeKey: ref('1'),
privateChatList:[
{
title:'AI Fashion Designer1',
intro:'333',
img:'../../../assets/images/homePage/alipay.svg',
active:false,
id:1,
},
{
title:'AI Fashion Designer2',
intro:'222',
img:'../../../assets/images/homePage/alipay.svg',
active:false,
id:2,
},
{
title:'AI Fashion Designer3',
intro:'111',
img:'../../../assets/images/homePage/alipay.svg',
active:false,
id:3,
}
],
currentPrivateChat:-1,
privateChat:{
1:{
title:'ABC',
temporary:'',
messageList:[
{
type:'time',
data:'2022-12-12 12:12:12'
},{
type:'opposite',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'time',
data:'2022-12-22 12:12:12'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},
]
}
},
})
let loadingShow = ref(false)
let textarea = ref()
// let ws = new WebSocket('ws://127.0.0.1:3000')
// console.log(ws);
// ws.onopen = ()=>{
// console.log(222);
// let data = {
// cmd:4,
// data:{
// msg:'222'
// }
// }
// ws.send(JSON.stringify(data))
// // ws.onmessage = (data)=>{
// // console.log(data);
// // }
// }
// provide('exhibitionList',exhibitionList)
let openPrivateChat = (data:any,index:number)=>{
accountPrivateChat.privateChatList.forEach((item:any)=>{
item.active = false
})
// accountPrivateChat.privateChat
accountPrivateChat.currentPrivateChat = data.id
data.active = true
getPrivateChat(data)
}
let deletePrivateChat = (data:any,index:number)=>{
if(data.active){
accountPrivateChat.privateChatList[0].active = true
getPrivateChat(data)
accountPrivateChat.currentPrivateChat = accountPrivateChat.privateChatList[0].id
}
accountPrivateChat.privateChatList.splice(index,1)
}
let getPrivateChat = async (data:any)=>{
if(!accountPrivateChat.privateChat[data.id]){
loadingShow.value = true
await new Promise((resolve:any, reject:any) => {
setTimeout(()=>{
accountPrivateChat.privateChat[data.id] = JSON.parse(JSON.stringify(accountPrivateChat.privateChat[1]))
loadingShow.value = false
resolve('')
},1000)
})
// Https.axiosGet(Https.httpUrls.accountBindEmail,{}).then((res:any)=>{
// console.log(res);
// })
}
nextTick(()=>{
if(textarea.value){
textarea.value.focus()
}
})
}
let sendCli = ()=>{
if(accountPrivateChat.privateChat[accountPrivateChat.currentPrivateChat]?.temporary.length>500){
return message.info('输入的内容超过最大限制')
}
}
onMounted (()=>{
})
return{
...toRefs(accountPrivateChat),
loadingShow,
textarea,
openPrivateChat,
deletePrivateChat,
sendCli,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_privateChatMessage{
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.account_privateChatMessage_content{
flex: 1;
box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
border: 1px solid #e9eaec;
border-radius: 5px;
display: flex;
margin-right: 5rem;
margin-left: 5rem;
.content_left{
width: 20%;
border-right: 1px solid #e9eaec;
height: 100%;
.content_left_item {
display: flex;
align-items: center;
padding: 2rem 2rem;
padding-left: 0;
border-bottom: 1px solid #e9eaec;
cursor: pointer;
overflow: hidden;
&.active{
background: #e4e5e6;
}
img{
width: 6rem;
height: 6rem;
border-radius: 50%;
margin-right: 2rem;
}
.modal_title_text{
width: calc(100% - 6rem - 2rem - 4rem);
margin-bottom: 0;
div{
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.content_left_item_btn{
transform: translateX(-100%);
transition: all .3s;
i{
width: 4rem;
height: 4rem;
font-size: 3rem;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.content_left_item:hover{
background: #e4e5e6;
.content_left_item_btn{
transform: translateX(0%);
}
}
}
.content_right{
width: 80%;
display: flex;
flex-direction: column;
background: #f4f5f7;
position: relative;
.mark_loading{
position: absolute;
}
&.content_right_null{
display: flex;
justify-content: center;
align-items: center;
font-size: 3rem;
color: #bec9d2;
font-weight: 900;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.content_right_top{
.modal_title_text{
margin: 0;
text-align: center;
background: #fff;
padding: 1.5rem 0
}
border-bottom: 1px solid #e9eaec;
}
.content_right_record{
flex: 1;
overflow-y: auto;
max-height: 38.5rem;
&.content_right_record::-webkit-scrollbar {
display: none;
}
.content_right_record_item{
display: flex;
margin: 2rem 0;
padding: 0 2rem;
.content_right_record_item_time{
width: 100%;
text-align: center;
}
.content_right_record_item_content{
display: flex;
width: 100%;
align-items: flex-start;
.content_right_record_item_HeadImg{
img{
width: 5rem;
height: 5rem;
border-radius: 50%;
margin-right: 2rem;
}
}
.content_right_record_item_text{
background: #fff;
padding: 1rem;
transform: translateY(1rem);
border-radius: 0 2rem 2rem 2rem;
}
&.active{
flex-direction: row-reverse;
.content_right_record_item_HeadImg{
margin-left: 2rem;
margin-right: 0rem;
}
.content_right_record_item_text{
border-radius: 2rem 0rem 2rem 2rem;
background: #39215b;
color: #fff;
}
}
}
}
}
.content_right_send{
border-top: 1px solid #e9eaec;
height: 20rem;
width: 100%;
padding: 1rem 2rem;
display: flex;
flex-direction: column;
.content_right_operation{
height: 4rem;
display: flex;
div{
margin-right: 1rem;
}
div:last-child{
margin-right: 0;
}
}
.content_right_input{
flex: 1;
textarea{
width: 100%;
border: none;
max-height: 100%;
min-height: 100%;
background: rgba(0, 0, 0, 0);
}
}
.content_right_btn{
display: flex;
margin: 0;
margin-left: auto;
margin-top: 1rem;
.content_right_btn_astrict{
margin-right: 2rem;
}
.content_right_btn_send{
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,140 @@
<template>
<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>
<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="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>
</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>
<div class="page_loading_box" v-show="!isNoData">
<span class="page_loading" ref="loadingDom" v-show="!isShowMark"></span>
<span v-show="isShowMark">
<a-spin size="large" />
</span>
</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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
// emits:['putListData'],
props:['setReadStatus','setAllmessage','getHistory'],
setup(prop,{emit}) {
const router = useRouter()
const store = useStore();
let accountMessage = reactive({
dataList: [],
page:1,
size:10,
isNoData: false,
isShowMark: false,
})
let loadingDom:any = ref(null)
let setmessageList = ()=>{
accountMessage.isShowMark = true
let data = {
page: accountMessage.page,
size: accountMessage.size,
}
prop.getHistory(data).then((rv:any)=>{
accountMessage.isShowMark = false
if(rv.content.length == 0) {
accountMessage.isNoData = true
return
}
rv.content.forEach((item:any) => {
item.content = JSON.parse(item.content)
});
accountMessage.dataList = rv.content
}).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)=>{
})
}
// provide('exhibitionList',exhibitionList)
onMounted (()=>{
accountMessage.isNoData = false
accountMessage.page = 0
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
setmessageList()
},
// { root:worksPage }
).observe(loadingDom.value);
})
return{
...toRefs(accountMessage),
setmessageList,
setRead,
allRead,
loadingDom,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_systemMessage{
width: 100%;
.account_generalMessage_item{
.account_generalMessage_item_title{
display: flex;
align-items: center;
margin-bottom: 2rem;
.account_generalMessage_item_title_text{
max-width: 80%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.modal_title_text_intro{
margin-left: 4rem;
}
}
}
}
</style>

View File

@@ -0,0 +1,214 @@
<template>
<div class="otherUsers">
<div class="otherUsers_page_titleImg">
<!-- <img src="https://code-create.com.hk/wp-content/uploads/2022/12/about_banner-1.jpg" alt=""> -->
</div>
<div class="otherUsers_userDetail">
<div class="otherUsers_userDetail_img">
<img :src="userContent.avatar" alt="">
</div>
<div class="otherUsers_userDetail_center">
<div class="otherUsers_userDetail_center_name modal_title_text">
<div>{{ userContent.userName }}</div>
<div v-if="userContent?.isFollow == 0" @click.stop="setFollow(userContent)" class="userDetail_center_name_left">{{$t('newScaleImage.Follow')}}</div>
<div v-else @click.stop="setFollow(userContent)" class="userDetail_center_name_left">{{$t('newScaleImage.Unfollow')}}</div>
</div>
<div class="otherUsers_userDetail_center_data">
<!-- <div class="userDetail_center_data_item modal_title_text">
<div>{{ userContent.homepageViewCount }}</div>
<span class="modal_title_text_intro">访问量</span>
</div> -->
<div class="userDetail_center_data_item modal_title_text">
<div>{{ userContent.portfolioCount }}</div>
<span class="modal_title_text_intro">{{$t('account.works')}}</span>
</div>
<div class="userDetail_center_data_item modal_title_text">
<div>{{ userContent.followerCount }}</div>
<span class="modal_title_text_intro">{{$t('account.Fans')}}</span>
</div>
<div class="userDetail_center_data_item modal_title_text">
<div>{{ userContent.followeeCount }}</div>
<span class="modal_title_text_intro">{{$t('account.Follow')}}</span>
</div>
</div>
<div class="otherUsers_userDetail_center_signature">
<div class="modal_title_text">
<!-- <div class="modal_title_text_intro">个性签名个性签名个性签名</div> -->
</div>
</div>
</div>
</div>
<div class="otherUser_works">
<div class="otherUser_works_title modal_title_text">
<div>{{$t('account.hisWorks')}}</div>
</div>
<Works :isScroll="false" :otherUsers="true" :userId=userId></Works>
</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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
import Works from '@/views/HomeView/Works.vue';
export default defineComponent({
components:{
Works
},
setup() {
const router:any = useRouter()
const store = useStore();
let otherUsers = reactive({
userId:'0',
userContent:{}
})
let getUserDetail = (id:any)=>{
let data = {
id:id
}
Https.axiosGet(Https.httpUrls.personalHomepage,{params:data}).then((rv)=>{
if(rv){
otherUsers.userContent = rv
}
})
}
let setFollow = (item:any) =>{
let url = Https.httpUrls.porfolioFollow
if(item.isFollow == 1)url = Https.httpUrls.porfolioCancelFollow
Https.axiosGet(url, {params:{followeeId:otherUsers.userId}})
.then((rv) => {
if(item.isFollow == 1){
item.isFollow = 0
}else{
item.isFollow = 1
}
})
}
onMounted (()=>{
otherUsers.userId = router.currentRoute.value.query?.userId
// alert()
setTimeout(() => {
getUserDetail(otherUsers.userId)
}, 2000);
})
return{
...toRefs(otherUsers),
setFollow,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.otherUsers{
width: 100%;
height: 100%;
padding: 0 9rem;
display: flex;
flex-direction: column;
overflow-y: auto;
.otherUsers_page_titleImg{
flex-shrink: 0;
height: 10rem;
img{
width: 100%;
height: 30rem;
object-fit: cover;
}
}
.otherUsers_userDetail{
padding: 2rem;
display: flex;
box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
margin-bottom: 2rem;
.modal_title_text{
margin-bottom: .5rem;
}
.otherUsers_userDetail_img{
width: 10rem;
height: 10rem;
// transform: translateY(-4rem);
margin-right: 4rem;
flex-shrink: 0;
img{
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
}
.otherUsers_userDetail_center{
flex: 1;
.otherUsers_userDetail_center_name{
display: flex;
justify-content: space-between;
.userDetail_center_name_left{
padding: .5rem 2rem;
border-radius: 4rem;
border: 2px solid #e9eaec;
cursor: pointer;
}
}
.otherUsers_userDetail_center_data{
display: flex;
.userDetail_center_data_item{
display: flex;
>div{
margin-right: 1rem;
}
}
.userDetail_center_data_item::after{
content: '';
display: block;
width: 1px;
height: 2rem;
background-color: #ccc;
margin: 0 2rem;
}
.userDetail_center_data_item:last-child::after{
display: none;
}
}
.otherUsers_userDetail_center_signature{
>div{
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
}
}
}
.otherUser_works{
height: auto;
box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
position: relative;
padding: 0 2rem;
.otherUser_works_title{
padding: 2rem 0;
position: sticky;
top: 0;
background: #fff;
margin: 0;
z-index: 2;
}
.otherUser_works_content{
height: 200px;
width: 100%;
background: #ccc;
}
}
}
</style>

View File

@@ -6,7 +6,7 @@
<div class="admin_state_item">
<span>Start Date:</span>
<a-range-picker
style="width:280px"
style="width:250px"
class="range_picker"
v-model:value="rangePickerValue"
:placeholder="[
@@ -24,9 +24,31 @@
</div>
<div class="admin_state_item">
<span>Start Time:</span>
<a-time-range-picker style="width:280px" class="range_picker" valueFormat="HH:mm:ss" v-model:value="rangeTimeValue" />
<a-time-range-picker style="width:250px" class="range_picker" valueFormat="HH:mm:ss" v-model:value="rangeTimeValue" />
</div>
<div class="admin_state_item">
<span>Email:</span>
<input
v-model="email"
placeholder="Please enter email"
@keydown.enter="gettrialList"
type="text"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>User Name:</span>
<a-select
v-model:value="ids"
mode="multiple"
style="width: 250px"
:filter-option="filterOption"
placeholder="Select Item..."
max-tag-count="responsive"
:options="allUserList"
@keydown.enter="gettrialList"
></a-select>
</div>
</div>
<div class="admin_search">
<div class="admin_search_item" @click="searchHistoryList">Search</div>
@@ -178,15 +200,26 @@ export default defineComponent({
];
});
let allUserList: any = ref([]);
let ids = ref([])
let email = ref('')
let dataList: any = ref([]);
let status: any = ref(0);
let filterOption = (input: any, option: any) => {
// 使用 option.label 进行搜索
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
return {
rangePickerValue,
rangeTimeValue,
columns,
dataList,
allUserList,
ids,
email,
renameData,
status,
filterOption,
};
},
data() {
@@ -204,6 +237,10 @@ export default defineComponent({
let historyTable: any = this.$refs.historyTable;
this.historyTableHeight = historyTable.clientHeight - 200;
this.gettrialList();
let allUserList: any = sessionStorage.getItem("allUserList");
if (allUserList) {
this.allUserList = JSON.parse(allUserList);
}
},
methods: {
//改变页码
@@ -233,9 +270,12 @@ export default defineComponent({
let endDate: any = this.rangePickerValue[1]
? this.rangePickerValue[1]+' '+endTime
: "";
let ids = this.ids.join(',')
let data = {
endTime:endDate,
startTime:startDate,
ids:ids,
email:this.email,
}
Https.axiosGet(Https.httpUrls.getDesignStatistic,{params:data}).then((rv: any) => {
if (rv) {
@@ -274,3 +314,9 @@ export default defineComponent({
},
});
</script>
<style lang="less" scoped>
.admin_page .admin_table_search .admin_state {
display: flex;
flex-wrap: wrap;
}
</style>

View File

@@ -21,7 +21,7 @@
</div>
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>User Name:</span>
<span>User Name: <span>*</span></span>
<input
:readonly="title != 'Add'"
:class="{active:title != 'Add'}"
@@ -32,7 +32,7 @@
/>
</div>
<div class="admin_state_item">
<span>User Email:</span>
<span>User Email: <span>*</span></span>
<input
:readonly="title != 'Add'"
:class="{active:title != 'Add'}"
@@ -43,7 +43,7 @@
/>
</div>
<div class="admin_state_item">
<span>Create Time:</span>
<span>Create Time: <span>*</span></span>
<a-date-picker :disabled="title != 'Add'" style="width: 250px" valueFormat="YYYY-MM-DDTHH:mm:ss" class="range_picker" show-time placeholder="Create Time" v-model:value="validStartTime">
<template #suffixIcon>
<span
@@ -53,7 +53,7 @@
</a-date-picker>
</div>
<div class="admin_state_item">
<span>End Time:</span>
<span>End Time: <span>*</span></span>
<a-date-picker style="width: 250px" valueFormat="YYYY-MM-DDTHH:mm:ss" class="range_picker" show-time placeholder="End Time" v-model:value="validEndTime">
<template #suffixIcon>
<span
@@ -63,7 +63,7 @@
</a-date-picker>
</div>
<div class="admin_state_item">
<span>User Type:</span>
<span>User Type:<span>*</span></span>
<a-select
v-model:value="systemUser"
size="large"
@@ -200,7 +200,6 @@ export default defineComponent({
}
let setAddData = ()=>{
setTime(operationsData.validStartTime)
return {
"country": operationsData.country,
"credits": operationsData.credits,
@@ -217,6 +216,8 @@ export default defineComponent({
"credits": operationsData.credits,
"systemUser": operationsData.systemUser,
"validEndTime": setTime(operationsData.validEndTime),
"userName": operationsData.userName,
"userEmail": operationsData.userEmail,
}
}
let cancelDsign = ()=>{
@@ -234,6 +235,7 @@ export default defineComponent({
let data
if(operations.title == 'Add'){
data = setAddData()
if(!data.userName || !data.userEmail || !data.validStartTime || !data.validEndTime || !data.systemUser)return message.warning('Please check the input box marked with *')
Https.axiosPost(Https.httpUrls.adminAddUser, data).then(
(rv) => {
if (rv) {
@@ -244,6 +246,7 @@ export default defineComponent({
);
}else{
data = setEditData()
if(!data.userName || !data.userEmail || !data.validEndTime || !data.systemUser)return message.warning('Please check the input box marked with *')
Https.axiosPost(Https.httpUrls.modifyUser,{},{params:data}).then(
(rv) => {
if (rv) {

View File

@@ -134,7 +134,6 @@ export default defineComponent({
Https.axiosGet(Https.httpUrls.getAllQuestionnaire).then((res:any)=>{
if(res){
dataList.value = res
console.log(dataList);
// console.log(allEchartsList.value);
resolve('')

View File

@@ -273,7 +273,6 @@ export default defineComponent({
if (rv) {
// this.dataList = rv
filter.dataList = rv.records
console.log(rv);
filterData.total = rv.total
filter.tableLoading = false

View File

@@ -307,4 +307,4 @@ export default defineComponent({
display: flex;
flex-wrap: wrap;
}
</style>
</style>

View File

@@ -51,9 +51,6 @@ export default defineComponent({
let data: any = [];
for (let [key, value] of entries) {
let str
console.log(key);
if(key != 'conversionRate'){
if(key == 'trialToOfficialCount'){
str = 'Trial To Official'

View File

View File

@@ -59,7 +59,7 @@
<!-- 全屏 -->
<i class="fi fi-bs-expand-arrows-alt" @click="showDesignImgDetail(2)"></i>
<!-- 编辑 -->
<i v-show="!body" class="fi fi-rr-edit" :title="$t('DesignDetail.editTitle')" @click="showDesignImgDetail(3)"></i>
<i class="fi fi-rr-edit" :title="$t('DesignDetail.editTitle')" @click="showDesignImgDetail(3)"></i>
<i v-show="!body && !deleteShow" :title="$t('DesignDetail.DetailTitle')" class="fi fi-rr-trash" @click="deleteNav(0)"></i>
<i v-show="!body && deleteShow" class="fi fi-br-check" @click="deleteNav(1)"></i>
@@ -152,8 +152,8 @@
<div class="design_detail_perview_content" >
<!-- <div class="generate_button" v-show="designItemDetail.singleOverall == 'overall'" @click="generateHighDesign()">Generate Product lmage</div> -->
<setDesignItem v-if="!moible" ref="setDesignItem" @setParentLoadingShow=setParentLoadingShow @setDesignCoverage="setDesignCoverage" @setSubmit="setSubmit"></setDesignItem>
<setDesignItemMobile v-else ref="setDesignItemMobile" @setParentLoadingShow=setParentLoadingShow @setDesignCoverage="setDesignCoverage" @setSubmit="setSubmit"></setDesignItemMobile>
<setDesignItem ref="setDesignItem" :isBody="body" @setParentLoadingShow=setParentLoadingShow @setDesignCoverage="setDesignCoverage" @setSubmit="setSubmit"></setDesignItem>
<!-- <setDesignItemMobile v-else ref="setDesignItemMobile" @setParentLoadingShow=setParentLoadingShow @setDesignCoverage="setDesignCoverage" @setSubmit="setSubmit"></setDesignItemMobile> -->
</div>
</div>
@@ -179,7 +179,6 @@ import { Modal,message } from 'ant-design-vue';
import {getUploadUrl,isMoible,setGradual} from '@/tool/util'
import { useStore } from "vuex";
import { openGuide,driverObj__ } from "@/tool/guide";
import GO from '@/tool/GO';
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
import addDetails from '@/component/Detail/addDetails.vue'
@@ -463,11 +462,17 @@ export default defineComponent({
DesignDetailAlter.terminate()
// this.designItemDetail = {}
this.frontBack = {}
let setDesignItem:any = this.$refs.setDesignItem
// let setDesignItem:any = isMoible() ? this.$refs.setDesignItemMobile : this.$refs.setDesignItem
setDesignItem.clear()
}
}else{
this.designShowPrview = 1;
this.frontBack = {}
let setDesignItem:any = this.$refs.setDesignItem
setDesignItem.clear()
// this.designItemDetailUrl = {}
}
},
@@ -502,15 +507,12 @@ export default defineComponent({
item.layersObject[0] = item.layersObject[1]
item.layersObject[1] = a
}
if(item.printObject.prints == null){
item.printObject.prints = []
}else{
item.printObject.prints.forEach((element:any) => {
if(!element.designType){
element.designType = 'Library'
}
});
}
if(item.printObject.prints == null)item.printObject.prints = []
item.printObject.prints.forEach((element:any) => {
if(!element.designType){
element.designType = 'Library'
}
});
})
this.currentIndex = 0
this.store.commit('setDesignItemDetail',rv)
@@ -739,6 +741,8 @@ export default defineComponent({
changed:item.changed?item.changed:false,
designType:item.designType?item.designType:"Library",
offset:item.layersObject?.[1]?.offset == null?[0,0]:item.layersObject[1].offset,
maskMinioUrl:item.layersObject[1]?.maskMinioUrl?item.layersObject[1].maskMinioUrl:'',
maskUrl:item.layersObject?.[1]?.maskUrl?item.layersObject[1].maskUrl:'',
scale:item.layersObject?.[1]?.scale?item.layersObject[1].scale:[1,1],
printObject:{
// path:item.printObject.path?item.printObject.path :'',
@@ -787,7 +791,7 @@ export default defineComponent({
return data
},
async setSubmit(str:any){
let setDesignItem:any = isMoible() ? this.$refs.setDesignItemMobile : this.$refs.setDesignItem
let setDesignItem:any = this.$refs.setDesignItem
let data = this.setSubmitItem(str,true)
this.loadingShow = true
await setDesignItem.setPreview(data)
@@ -888,7 +892,7 @@ export default defineComponent({
showDesignImgDetail(num:any){
let designItemDetail = JSON.parse(JSON.stringify(this.store.state.DesignDetailModule.designItemDetail))
this.designShowPrview = num
let setDesignItem:any = isMoible() ? this.$refs.setDesignItemMobile : this.$refs.setDesignItem
let setDesignItem:any = this.$refs.setDesignItem
if(this.designShowPrview == 3){
setDesignItem.setImgSize()
}else if(this.designShowPrview == 2){
@@ -935,6 +939,7 @@ export default defineComponent({
designItemDetail.clothes[this.currentIndex].minIOPath = rv.clothes[this.currentIndex].minIOPath
this.current.path = rv.clothes[this.currentIndex].minIOPath
designItemDetail.clothes[this.currentIndex].path = rv.clothes[this.currentIndex].path
designItemDetail.clothes[this.currentIndex].layersObject = rv.clothes[this.currentIndex].layersObject
designItemDetail.clothes[this.currentIndex].sketchString = ''
data.designSingleItemDTOList[this.currentIndex].sketchString =''
data.designSingleItemDTOList[this.currentIndex].path =rv.clothes[this.currentIndex].minIOPath
@@ -1025,6 +1030,13 @@ export default defineComponent({
undividedLayer:'',
sketchString:'',
"layersObject": [
{
maskMinioUrl:'',
maskUrl:'',
},{
maskMinioUrl:'',
maskUrl:'',
},
]
}
// this.designOrder = true
@@ -1054,7 +1066,6 @@ export default defineComponent({
},
//元素替换
clothesDetail(clothes:any, index:number){
let designItemDetail = JSON.parse(JSON.stringify(this.store.state.DesignDetailModule.designItemDetail))
this.designOrder = true
@@ -1086,6 +1097,8 @@ export default defineComponent({
designType:this.current.designType?this.current.designType:'Library',
path:this.current.minIOPath?this.current.minIOPath:'',
offset:this.current.layersObject?.[1]?.offset?this.current.layersObject[1].offset:[0,0],
maskMinioUrl:this.current.layersObject[1].maskMinioUrl,
maskUrl:this.current.layersObject[1].maskUrl,
priority:this.current.priority,
trims:this.current.trims,
scale:this.current.layersObject?.[1]?.scale?this.current.layersObject[1].scale:[1,1],
@@ -1156,7 +1169,9 @@ export default defineComponent({
.design_detail_modal_component{
color: #000;
// max-width: 1440px ;
.mark_loading{
position: absolute;
}
.ant-modal-content{
border-radius: calc(1rem*1.2);
// overflow: hidden;
@@ -1165,7 +1180,7 @@ export default defineComponent({
border-bottom: none;
}
.ant-modal-body{
padding: calc(4rem*1.2) calc(5rem*1.2) calc(0rem*1.2)!important;
padding: calc(5rem*1.2) calc(6rem*1.2) calc(0rem*1.2)!important;
// height: calc(65vh - 6.4rem*1.2));
height: calc(65rem*1.2);
display: flex;
@@ -1714,9 +1729,6 @@ export default defineComponent({
</style>
<style lang="less">
.design_detail_modal_component{
.mark_loading{
position: absolute;
}
}
</style>

View File

@@ -430,8 +430,9 @@ export default defineComponent({
threshold:[.5]
})
ob.observe(el)
// this.currentPage = 1
// this.currentPage = +=1
// this.pageSize = 12
// currentPage
let this_ = binding.instance
function callback(entries, observer) {
entries.forEach((entry) => {
@@ -608,21 +609,33 @@ export default defineComponent({
this.clothesList = []
this.getLibraryList()
}else{
let rgba = {
r:this.current.color.r+"",
g:this.current.color.g+"",
b:this.current.color.b+"",
a:1
}
let ind = 0
this.store.state.UploadFilesModule.allBoardData?.colorBoards?.forEach((item,index) => {
this.colorList[index+1] = {
gradient:item.gradient,
rgba:item.rgbValue,
tcx:item.tcx,
name:item.name,
}
if(item.gradient){
this.colorList[index+1].gradient = item.gradient
console.log(JSON.stringify(rgba) , JSON.stringify(item.rgbValue));
if(JSON.stringify(rgba) == JSON.stringify(item.rgbValue)){
ind+=1
}else{
delete this.colorList[index+1].gradient
this.colorList[index+1 - ind] = {
gradient:item.gradient,
rgba:item.rgbValue,
tcx:item.tcx,
name:item.name,
}
if(item.gradient){
this.colorList[index+1 - ind].gradient = item.gradient
}else{
delete this.colorList[index+1 - ind].gradient
}
}
})
}
let DesignDetailEnd = this.$refs.DesignDetailEnd
DesignDetailEnd.init(num)
this.workspaceCom = computed(()=>{
@@ -776,6 +789,7 @@ export default defineComponent({
},
//请求我的印花&&模型
getLibraryList(){
this.isShowLoading = true
let level2Type = ''
if(this.selectCode == 'Printboard' || this.selectCode == 'DesignElements' || this.selectCode == 'Sketchboard'){
level2Type = this.designType
@@ -791,7 +805,6 @@ export default defineComponent({
pictureName:this.searchPictureName,
size:this.pageSize+this.clothesList.length,
}
this.isShowLoading = true
Https.axiosPost(Https.httpUrls.queryLibraryPage,data).then(
(rv) => {
if(this.selectCode == 'Sketchboard'){

View File

@@ -91,13 +91,13 @@
</div>
</div>
<div v-show="type_ == 1 || type_ == 3" @click.stop="setPreview" class="subitOkPreviewBtn" :class="[ !sketchImg?.id?!current?.id?'active':'':'' ]">{{ $t('DesignDetailEnd.preview') }}</div>
<div v-if="type_ == 2 && (current?.printObject?.prints?.length != 0 || exhibitionList.print.length != 0)" @click.stop="setPreview('clearPrint')" class="subitOkPreviewBtn clear">{{ $t('Habit.Clear') }}</div>
<div v-if="type_ == 2 && (current?.printObject?.prints?.length != 0 || printsList.length != 0 || exhibitionList.print.length != 0)" @click.stop="setPrint" class="subitOkPreviewBtn Guide_1_23">{{ $t('DesignDetailEnd.Layout') }}</div>
<!-- <div v-else-if="type_ == 2 && designItemDetail?.clothes?.[currentIndex]?.printObject?.prints?.[0]?.path != null && current?.printObject?.prints?.[0]?.path == null" @click.stop="setPreview" class="subitOkPreviewBtn">{{ $t('DesignDetailEnd.preview') }}</div> -->
<div v-if="type_ == 4 && (elementsList.length != 0 || exhibitionList.elements.length != 0)" @click.stop="setElemets" class="subitOkPreviewBtn">{{ $t('DesignDetailEnd.Layout') }}</div>
<DesignPrintOperation v-if="!moible" ref="DesignPrintOperation"></DesignPrintOperation>
<DesignPrintOperationMobile v-else ref="DesignPrintOperationMobile"></DesignPrintOperationMobile>
<DesignElementsOperation v-if="!moible" ref="DesignElementsOperation"></DesignElementsOperation>
<DesignPrintMobile v-else ref="DesignPrintMobile"></DesignPrintMobile>
<DesignPrintOperation ref="DesignPrintOperation"></DesignPrintOperation>
<DesignElementsOperation ref="DesignElementsOperation"></DesignElementsOperation>
</div>
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
@@ -112,7 +112,6 @@ import { Sketch} from '@ans1998/vue3-color'
import DesignPrintOperation from './DesignPrintOperation.vue';
import DesignPrintOperationMobile from './DesignPrintOperationMobile.vue';
import DesignElementsOperation from './DesignElements.vue';
import DesignPrintMobile from './DesignElementsMobile.vue';
import { message,Upload} from 'ant-design-vue';
import { openGuide,driverObj__ } from "@/tool/guide";
import {isMoible,setGradual} from '@/tool/util'
@@ -123,7 +122,7 @@ export default defineComponent({
props: ["msg"],
components:{
Draggable,Sketch,DesignPrintOperation,DesignPrintOperationMobile,
DesignElementsOperation,DesignPrintMobile,sketchCategory
DesignElementsOperation,sketchCategory
},
setup(prop) {
const store = useStore();
@@ -262,7 +261,8 @@ export default defineComponent({
setPrint(){
// if(this.current?.printObject?.prints?.[0]?.path){
let DesignPrintOperation = isMoible() ? this.$refs.DesignPrintOperationMobile : this.$refs.DesignPrintOperation
let DesignPrintOperation = this.$refs.DesignPrintOperation
// let DesignPrintOperation = isMoible() ? this.$refs.DesignPrintOperationMobile : this.$refs.DesignPrintOperation
DesignPrintOperation.init()
if(this.driver__.driver){
nextTick().then(()=>{
@@ -350,11 +350,11 @@ export default defineComponent({
},
setElemets(){
if(this.current.trims.prints && this.current.trims.prints.length == 0 && this.elementsList.length == 0)return message.info('请选择至少一张element')
let DesignElementsOperation = isMoible() ? this.$refs.DesignPrintMobile : this.$refs.DesignElementsOperation
let DesignElementsOperation = this.$refs.DesignElementsOperation
DesignElementsOperation.init()
},
//提交
setPreview(){
setPreview(str){
let designItemDetail = JSON.parse(JSON.stringify(this.store.state.DesignDetailModule.designItemDetail))
let index
let data = JSON.parse(JSON.stringify(this.store.state.DesignDetailModule.designPreviewData))
@@ -373,7 +373,7 @@ export default defineComponent({
})
index = index? index:0
if(!this.current.id){
if(index){
if(index && data?.designSingleItemDTOList){
data.designSingleItemDTOList[index].priority = zIndex+=1
}
}
@@ -387,7 +387,9 @@ export default defineComponent({
data.designSingleItemDTOList[index].path =this.sketchImg.minIOPath? this.sketchImg.minIOPath: this.current.minIOPath
data.designSingleItemDTOList[index].type =this.sketchImg.type? this.sketchImg.type: this.current.type
}else if(this.type_ == 2){
data.designSingleItemDTOList[index].printObject.prints = []
if(str == 'clearPrint'){
data.designSingleItemDTOList[index].printObject.prints = []
}
}else if(this.type_ == 3){
if(this.colorList[this.selectIndex]?.rgba?.r == undefined){
message.info(this.t('DesignDetailEnd.jsContent2'))
@@ -704,8 +706,11 @@ export default defineComponent({
}
}
.subitOkPreviewBtn{
bottom: calc(4rem*1.2);
bottom: calc(3rem*1.2);
position: absolute;
&.clear{
bottom: calc(7rem);
}
&.active{
opacity: .5;
pointer-events:none;

View File

@@ -43,7 +43,7 @@
v-for="item,index in exhibitionElementsList"
:key="item"
:style="[printStyleList?.[index]?.style]"
@mousedown.stop="itemMoveMousedown(index,$event)"
@mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))"
class="modal_imgItem"
ref="content" >
<img crossOrigin="anonymous" :src="item?.path" :style="{transform:`rotateZ(${printStyleList[index]?.transform?.rotateZ}deg)`}" class="designElements_imgItme" draggable="false">
@@ -52,11 +52,11 @@
<img :src="current?.undividedLayer?current.undividedLayer:current.path" alt="" class="designElements_sketch">
<!-- <img :src="current?.path" alt="" class="designElements_sketch"> -->
<div class="designElements_btn">
<ul v-for="item,index in printStyleList" :key="item" :class="{active:item?.designElementsBtn?item?.designElementsBtn:false}" class="designElements_Mousingle" :style="item.style" @mousedown.stop="itemMoveMousedown(index,$event)">
<li class="designElements_btn_top" @mousedown.stop="itemSizeMousedown('top',$event)"></li>
<li class="designElements_btn_bottom" @mousedown.stop="itemSizeMousedown('bottom',$event)"></li>
<li class="designElements_btn_left" @mousedown.stop="itemSizeMousedown('left',$event)"></li>
<li class="designElements_btn_right" @mousedown.stop="itemSizeMousedown('right',$event)"></li>
<ul v-for="item,index in printStyleList" :key="item" :class="{active:item?.designElementsBtn?item?.designElementsBtn:false}" class="designElements_Mousingle" :style="item.style" @mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))">
<li class="designElements_btn_top" @mousedown.stop="itemSizeMousedown('top',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('top',getMousePosition($event,true))"></li>
<li class="designElements_btn_bottom" @mousedown.stop="itemSizeMousedown('bottom',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('bottom',getMousePosition($event,true))"></li>
<li class="designElements_btn_left" @mousedown.stop="itemSizeMousedown('left',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('left',getMousePosition($event,true))"></li>
<li class="designElements_btn_right" @mousedown.stop="itemSizeMousedown('right',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('right',getMousePosition($event,true))"></li>
<li class="designElements_rotote" v-rotote.stop="[index,item.transform]"></li>
<li class="designElements_delete" @click="deletePrint">
<img src="../../assets/images/homePage/cuowu.svg" alt="">
@@ -88,6 +88,7 @@ import { Https } from "@/tool/https";
import { Modal,message } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { useI18n } from "vue-i18n";
import { getMousePosition } from "@/tool/mdEvent";
export default defineComponent({
setup(prop) {
@@ -159,6 +160,7 @@ export default defineComponent({
currentFullBodyView,
designItemDetailTS,
body,
getMousePosition,
};
},
data() {
@@ -171,8 +173,16 @@ export default defineComponent({
//操作旋转
rotote:{
mounted(el,value){
el.addEventListener('mousedown', (e) => {
let mousedown = function(event){
let e = getMousePosition(event,false)
mouseDownOperation(e)
}
let touchstart = function(event){
let e = getMousePosition(event,true)
mouseDownOperation(e)
}
let mouseDownOperation = (e) => {
let elParent = document.getElementsByClassName('designElements_modal')[0].getElementsByClassName('modal_imgItem')[value.instance.imgDomIndex]
let mouse = true;
let angle = 0
@@ -185,12 +195,19 @@ export default defineComponent({
el.style.transform = "translate(-50%, -50%)rotateZ("+ angle + "deg)"
// let scale = Number(elParent.firstElementChild.style.transform?.split('scale(')[1]?.split(')')[0])
// let rotateZ = Number(elParent.firstElementChild.style.transform?.split('rotateZ(')[1]?.split('deg')[0])
e.stopPropagation()
mouse = true;
var info = el.getBoundingClientRect();
let eX = info.x + info.width / 2;
let eY = info.y + info.height / 2;
let mousemove = (e) => {
let mouseMove = function(event){
let e = getMousePosition(event,false)
mouseMoveOperation(e)
}
let touchmove = function(event){
let e = getMousePosition(event,true)
mouseMoveOperation(e)
}
let mouseMoveOperation = (e) => {
if (mouse) {
let X = eX
let Y = eY
@@ -201,16 +218,24 @@ export default defineComponent({
el.style.transform = "translate(-50%, -50%)rotateZ("+ angle + "deg)"
}
}
document.addEventListener('mousemove', mousemove);
// document.addEventListener('mousemove', mousemove);
// 添加鼠标松开事件监听器
let mouseup = () => {
value.instance.printStyleList[value.instance.imgDomIndex].transform.rotateZ = angle
mouse = false;
document.removeEventListener('mouseup',mouseup)
document.removeEventListener('mousemove',mousemove)
document.removeEventListener('mousemove',mouseMove)
document.removeEventListener('touchmove',touchmove)
document.removeEventListener('mouseup',mouseup)
document.removeEventListener('touchend',mouseup)
}
// document.addEventListener('mouseup', mouseup);
document.addEventListener('mousemove', mouseMove);
document.addEventListener('touchmove', touchmove);
document.addEventListener('mouseup', mouseup);
});
document.addEventListener('touchend', mouseup);
};
el.addEventListener('mousedown',mousedown)
el.addEventListener('touchstart',touchstart)
}
},
@@ -299,8 +324,12 @@ export default defineComponent({
let top = Number(this.printStyleList[index].style.top.replace(/px/g,''))
this.printStyleList[index].centers.left = imgDomWH.x+event.offsetX-left
this.printStyleList[index].centers.top = imgDomWH.y+event.offsetY-top
document.addEventListener("mouseup", this.mouseup);
document.addEventListener("mousemove", this.moveMousemove);
// document.addEventListener("mouseup", this.mouseup);
// document.addEventListener("mousemove", this.moveMousemove);
document.addEventListener('mousemove', this.mouseMove);
document.addEventListener('touchmove', this.touchmove);
document.addEventListener('mouseup', this.mouseup);
document.addEventListener('touchend', this.mouseup);
},
//设置尺寸
itemSizeMousedown(direction,event){
@@ -323,23 +352,42 @@ export default defineComponent({
this.printStyleList[this.imgDomIndex].centers.top = imgDomWH.y+event.offsetY+imgDomWH.height-li
}
document.addEventListener("mouseup", this.sizeMouseup);
document.addEventListener("mousemove", this.sizeMousemove);
// document.addEventListener("mouseup", this.sizeMouseup);
// document.addEventListener("mousemove", this.sizeMousemove);
document.addEventListener('mousemove', this.sizeMouseMove);
document.addEventListener('touchmove', this.sizeTouchmove);
document.addEventListener('mouseup', this.sizeMouseup);
document.addEventListener('touchend', this.sizeMouseup);
},
mouseMove(event){
let e = getMousePosition(event,false)
this.mouseMoveOperation(e)
},
touchmove(event){
let e = getMousePosition(event,true)
this.mouseMoveOperation(e)
},
//鼠标移动
moveMousemove(e) {
mouseMoveOperation(e) {
let imgDomWH = this.imgDom.getBoundingClientRect()
let parentNode = document.getElementsByClassName('designElements_modal')[0].getElementsByClassName("designElements_imgMask")[0]
parentNode = parentNode.getBoundingClientRect()
let x = (e.x - this.printStyleList[this.imgDomIndex].centers.left)+'px'
let y = ( e.y - this.printStyleList[this.imgDomIndex].centers.top)+'px'
let x = (e.clientX - this.printStyleList[this.imgDomIndex].centers.left)+'px'
let y = ( e.clientY - this.printStyleList[this.imgDomIndex].centers.top)+'px'
this.printStyleList[this.imgDomIndex].style.left = x
this.printStyleList[this.imgDomIndex].style.top = y
},
sizeMousemove(e) {
sizeMouseMove(event){
let e = getMousePosition(event,false)
this.sizeMouseMoveOperation(e)
},
sizeTouchmove(event){
let e = getMousePosition(event,true)
this.sizeMouseMoveOperation(e)
},
sizeMouseMoveOperation(e) {
let imgDomWH = this.imgDom.getBoundingClientRect()
let parentNode =this.imgDom.parentNode
let width = imgDomWH.width
@@ -349,27 +397,27 @@ export default defineComponent({
let w,h
//判断移动四个边
if(this.direction == 'right'){
w = (e.x - this.printStyleList[this.imgDomIndex].centers.left)
h = (e.x - this.printStyleList[this.imgDomIndex].centers.left)*num
w = (e.clientX - this.printStyleList[this.imgDomIndex].centers.left)
h = (e.clientX - this.printStyleList[this.imgDomIndex].centers.left)*num
width = w+'px'
height = w*num1+'px'
}else if(this.direction == 'top'){
this.printStyleList[this.imgDomIndex].style.top = 'auto'
// this.printStyleList[this.imgDomIndex].style.left = 'auto'
this.printStyleList[this.imgDomIndex].style.bottom = parentNode.offsetHeight -imgDomWH.height - this.imgDom.offsetTop+'px'
w = (e.x - this.printStyleList[this.imgDomIndex].centers.left)*num
h = (this.printStyleList[this.imgDomIndex].centers.top - e.y)
w = (e.clientX - this.printStyleList[this.imgDomIndex].centers.left)*num
h = (this.printStyleList[this.imgDomIndex].centers.top - e.clientY)
height = h+'px'
width = h*num+'px'
}else if(this.direction == 'bottom'){
h = (e.y - this.printStyleList[this.imgDomIndex].centers.top)
h = (e.clientY - this.printStyleList[this.imgDomIndex].centers.top)
height = h+'px'
width = h*num+'px'
}else if(this.direction == 'left'){
this.printStyleList[this.imgDomIndex].style.left = 'auto'
this.printStyleList[this.imgDomIndex].style.right = parentNode.offsetWidth -imgDomWH.width - this.imgDom.offsetLeft+'px'
w = (this.printStyleList[this.imgDomIndex].centers.left - e.x)
w = (this.printStyleList[this.imgDomIndex].centers.left - e.clientX)
width = w+'px'
height = w*num1+'px'
}
@@ -388,13 +436,21 @@ export default defineComponent({
width:this.imgDom.offsetWidth+'px',
zIndex:this.printZIndex
}
document.removeEventListener("mouseup", this.sizeMouseup);
document.removeEventListener("mousemove", this.sizeMousemove);
// document.removeEventListener("mouseup", this.sizeMouseup);
// document.removeEventListener("mousemove", this.sizeMousemove);
document.removeEventListener('mousemove',this.sizeMouseMove)
document.removeEventListener('touchmove',this.sizeTouchmove)
document.removeEventListener('mouseup',this.sizeMouseup)
document.removeEventListener('touchend',this.sizeMouseup)
},
mouseup(e) {
document.removeEventListener("mouseup", this.mouseup);
document.removeEventListener("mousemove", this.moveMousemove);
// document.removeEventListener("mouseup", this.mouseup);
// document.removeEventListener("mousemove", this.moveMousemove);
document.removeEventListener('mousemove',this.mouseMove)
document.removeEventListener('touchmove',this.touchmove)
document.removeEventListener('mouseup',this.mouseup)
document.removeEventListener('touchend',this.mouseup)
},
deletePrint(){
this.exhibitionElementsList.splice(this.imgDomIndex,1)
@@ -601,19 +657,22 @@ export default defineComponent({
this.exhibitionElementsList = []
},
closeModal(){
let designItemDetail = JSON.parse(JSON.stringify(this.store.state.DesignDetailModule.designItemDetail))
let _this = this
Modal.confirm({
title: this.t('DesignPrintOperation.jsContent1'),
icon: createVNode(ExclamationCircleOutlined),
okText: 'Yes',
cancelText: 'No',
mask:false,
centered:true,
onOk() {
_this.designElements=false
}
});
if(this.designItemDetailTS.rv){
let _this = this
Modal.confirm({
title: this.t('DesignPrintOperation.jsContent1'),
icon: createVNode(ExclamationCircleOutlined),
okText: 'Yes',
cancelText: 'No',
mask:false,
centered:true,
onOk() {
_this.designElements=false
}
});
}else{
this.designElements=false
}
},
},
});
@@ -622,11 +681,15 @@ export default defineComponent({
<style lang="less">
.designElements_modal {
// max-width: 1440px;
user-select: none; /* 对现代浏览器有效 */
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
.mark_loading{
position: absolute;
}
.ant-modal-body{
padding: calc(4rem*1.2) calc(5rem*1.2) calc(0rem*1.2)!important;
padding: calc(5rem*1.2) calc(6rem*1.2) calc(0rem*1.2)!important;
// height: calc(65vh - 6.4rem*1.2));
height: calc(65rem*1.2);
display: flex;
@@ -835,8 +898,8 @@ export default defineComponent({
li{
cursor: pointer;
// border-radius: 50%;
width: calc(1rem*1.2);
height: calc(1rem*1.2);
width: calc(2rem*1.2);
height: calc(2rem*1.2);
background-color: rgb(20, 188, 255);
position: absolute;
pointer-events: none;

View File

@@ -52,11 +52,11 @@
<!-- <img :src="current?.path" alt="" class="designElementsMobile_sketch"> -->
<img :src="current?.undividedLayer?current.undividedLayer:current.path" alt="" class="designElementsMobile_sketch">
<div class="designElementsMobile_btn">
<ul v-for="item,index in printStyleList" :key="item" :class="{active:item?.designElementsBtn?item?.designElementsBtn:false}" class="designElementsMobile_Mousingle" :style="item?.style" @touchstart.stop="itemMoveMousedown(index,$event)">
<li class="designElementsMobile_btn_top" @touchstart.stop="itemSizeMousedown('top',$event)"></li>
<li class="designElementsMobile_btn_bottom" @touchstart.stop="itemSizeMousedown('bottom',$event)"></li>
<li class="designElementsMobile_btn_left" @touchstart.stop="itemSizeMousedown('left',$event)"></li>
<li class="designElementsMobile_btn_right" @touchstart.stop="itemSizeMousedown('right',$event)"></li>
<ul v-for="item,index in printStyleList" :key="item" :class="{active:item?.designElementsBtn?item?.designElementsBtn:false}" class="designElementsMobile_Mousingle" :style="item.style" @touchstart.passive="itemMoveMousedown(index,$event)">
<li class="designElementsMobile_btn_top" @touchstart.passive="itemSizeMousedown('top',$event)"></li>
<li class="designElementsMobile_btn_bottom" @touchstart.passive="itemSizeMousedown('bottom',$event)"></li>
<li class="designElementsMobile_btn_left" @touchstart.passive="itemSizeMousedown('left',$event)"></li>
<li class="designElementsMobile_btn_right" @touchstart.passive="itemSizeMousedown('right',$event)"></li>
<li class="designElementsMobile_rotote" v-rotote.stop="[index,item.transform]"></li>
<li class="designElementsMobile_delete" @click="deletePrint">
<img src="../../assets/images/homePage/cuowu.svg" alt="">
@@ -452,8 +452,6 @@ export default defineComponent({
if(sketch.offsetHeight < item.location[1]/sketchNum){
top = sketch.offsetHeight +'px'
}
console.log(sketch.offsetWidth,this.sketch.width.replace(/rem/g,''));
this.printStyleList[index]={
centers:{
left:0,
@@ -626,7 +624,7 @@ export default defineComponent({
position: absolute;
}
.ant-modal-body{
padding: calc(4rem*1.2) calc(5rem*1.2) calc(0rem*1.2)!important;
padding: calc(5rem*1.2) calc(6rem*1.2) calc(0rem*1.2)!important;
// height: calc(65vh - 6.4rem*1.2));
height: calc(65rem*1.2);
display: flex;

View File

@@ -11,6 +11,7 @@
:closable="false"
:keyboard="false"
:mask="true"
:destroyOnClose="true"
>
<div class="designOpenrtion_content">
<div class="design_title_text">
@@ -39,9 +40,9 @@
</div>
<div class="print_right show_print_right Guide_1_25" :class="[driver__.driver?'showEvents':'']">
<div class="designOpenrtion_nav">
<!-- :class="(stateOverallSingle == 'single' && item.level2Type == 'Pattern')?'isOverall':''" -->
<div
class="designOpenrtion_single"
:class="(stateOverallSingle == 'single' && item.level2Type == 'Pattern')?'isOverall':''"
v-for="item,index in designOpenrtionList" :key="item"
:title="(stateOverallSingle == 'single' && item.level2Type == 'Pattern')? $t('DesignPrintOperation.isOverall'):''"
>
@@ -49,7 +50,6 @@
</div>
<div
class="designOpenrtion_single"
:class="(stateOverallSingle == 'single' && item.level2Type == 'Pattern')?'isOverall':''"
v-for="item,index in designList" :key="item"
:title="(stateOverallSingle == 'single' && item.level2Type == 'Pattern')? $t('DesignPrintOperation.isOverall'):''"
>
@@ -63,6 +63,7 @@
<div class="habit_System_Designer_text">{{ $t('DesignPrintOperation.Scale') }}</div>
<a-slider id="system_silder"
:min="20"
:max="1000"
v-model:value="systemDesignerPercentage"
@afterChange="systemDesigner"
:tip-formatter="formatter"
@@ -89,7 +90,7 @@
:key="item"
v-if="overallSingle"
:style="[printStyleList[stateOverallSingle]?.[index]?.style]"
@mousedown.stop="itemMoveMousedown(index,$event)"
@mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))"
class="modal_imgItem"
ref="content"
>
@@ -98,18 +99,18 @@
</div>
<img :src="operationCurrent?.undividedLayer?operationCurrent.undividedLayer:operationCurrent.path" alt="" class="designOpenrtion_sketch">
<div class="designOpenrtion_btn">
<ul v-if="overallSingle" v-for="item,index in printStyleList[stateOverallSingle]" :key="item" :class="{active:item?.designOpenrtionBtn?item?.designOpenrtionBtn:false}" class="designOpenrtion_Mousingle" :style="item.style" @mousedown.stop="itemMoveMousedown(index,$event)">
<li class="designOpenrtion_btn_top" @mousedown.stop="itemSizeMousedown('top',$event)"></li>
<li class="designOpenrtion_btn_bottom" @mousedown.stop="itemSizeMousedown('bottom',$event)"></li>
<li class="designOpenrtion_btn_left" @mousedown.stop="itemSizeMousedown('left',$event)"></li>
<li class="designOpenrtion_btn_right" @mousedown.stop="itemSizeMousedown('right',$event)"></li>
<ul v-if="overallSingle" v-for="item,index in printStyleList[stateOverallSingle]" :key="item" :class="{active:item?.designOpenrtionBtn?item?.designOpenrtionBtn:false}" class="designOpenrtion_Mousingle" :style="item.style" @mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))">
<li class="designOpenrtion_btn_top" @mousedown.stop="itemSizeMousedown('top',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('top',getMousePosition($event,true))"></li>
<li class="designOpenrtion_btn_bottom" @mousedown.stop="itemSizeMousedown('bottom',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('bottom',getMousePosition($event,true))"></li>
<li class="designOpenrtion_btn_left" @mousedown.stop="itemSizeMousedown('left',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('left',getMousePosition($event,true))"></li>
<li class="designOpenrtion_btn_right" @mousedown.stop="itemSizeMousedown('right',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('right',getMousePosition($event,true))"></li>
<li class="designOpenrtion_rotote" v-rotote.stop="[index,item.transform]"></li>
<li class="designOpenrtion_delete" @click.stop="deletePrint">
<img src="../../assets/images/homePage/cuowu.svg" alt="">
</li>
</ul>
<div v-show="!overallSingle"></div>
<ul v-if="!overallSingle && printStyleList[stateOverallSingle][0]" class="designOpenrtion_Mouoverall active" :style="'left:'+printStyleList[stateOverallSingle][0]?.style?.left+';top:'+printStyleList[stateOverallSingle][0]?.style?.top+';'" @mousedown.stop="itemMoveMousedown(0,$event)">
<ul v-if="!overallSingle && printStyleList[stateOverallSingle][0]" class="designOpenrtion_Mouoverall active" :style="'left:'+printStyleList[stateOverallSingle][0]?.style?.left+';top:'+printStyleList[stateOverallSingle][0]?.style?.top+';'" @mousedown.stop="itemMoveMousedown(0,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(0,getMousePosition($event,true))">
<i class="fi fi-rr-arrows animtion1"></i>
<i class="fi fi-rr-arrows animtion2"></i>
<li class="designOpenrtion_rotote" v-rotote.stop="[0,printStyleList[stateOverallSingle][0].transform]"></li>
@@ -143,6 +144,8 @@ import { Modal,message } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { useI18n } from "vue-i18n";
import { remove } from "jszip";
import { getMousePosition } from "@/tool/mdEvent";
export default defineComponent({
setup(prop) {
@@ -231,6 +234,7 @@ export default defineComponent({
currentFullBodyView,
designItemDetailTS,
body,
getMousePosition,
};
},
data() {
@@ -243,8 +247,16 @@ export default defineComponent({
//操作旋转
rotote:{
mounted(el,value){
el.addEventListener('mousedown', (e) => {
let mousedown = function(event){
let e = getMousePosition(event,false)
mouseDownOperation(e)
}
let touchstart = function(event){
let e = getMousePosition(event,true)
mouseDownOperation(e)
}
let mouseDownOperation = (e) => {
let elParent = document.getElementsByClassName('designOpenrtion_modal')[0].getElementsByClassName('modal_imgItem')[value.instance.imgDomIndex]
let mouse = true;
let angle = 0
@@ -257,12 +269,19 @@ export default defineComponent({
el.style.transform = "translate(-50%, -50%)rotateZ("+ angle + "deg)"
// let scale = Number(elParent.firstElementChild.style.transform?.split('scale(')[1]?.split(')')[0])
// let rotateZ = Number(elParent.firstElementChild.style.transform?.split('rotateZ(')[1]?.split('deg')[0])
e.stopPropagation()
mouse = true;
var info = el.getBoundingClientRect();
let eX = info.x + info.width / 2;
let eY = info.y + info.height / 2;
let mousemove = (e) => {
let mouseMove = function(event){
let e = getMousePosition(event,false)
mouseMoveOperation(e)
}
let touchmove = function(event){
let e = getMousePosition(event,true)
mouseMoveOperation(e)
}
let mouseMoveOperation = (e) => {
if (mouse) {
let X = eX
let Y = eY
@@ -275,16 +294,25 @@ export default defineComponent({
el.style.transform = "translate(-50%, -50%)rotateZ("+ angle + "deg)"
}
}
document.addEventListener('mousemove', mousemove);
// 添加鼠标松开事件监听器
let mouseup = () => {
value.instance.printStyleList[value.instance.stateOverallSingle][value.instance.imgDomIndex].transform.rotateZ = angle
mouse = false;
document.removeEventListener('mouseup',mouseup)
document.removeEventListener('mousemove',mousemove)
// document.removeEventListener('mouseup',mouseup)
// document.removeEventListener('mousemove',mousemove)
document.removeEventListener('mousemove',mouseMove)
document.removeEventListener('touchmove',touchmove)
document.removeEventListener('mouseup',mouseup)
document.removeEventListener('touchend',mouseup)
}
// document.addEventListener('mouseup', mouseup);
document.addEventListener('mousemove', mouseMove);
document.addEventListener('touchmove', touchmove);
document.addEventListener('mouseup', mouseup);
});
document.addEventListener('touchend', mouseup);
}
el.addEventListener('mousedown',mousedown)
el.addEventListener('touchstart',touchstart)
}
},
@@ -307,11 +335,6 @@ export default defineComponent({
this.ifListOver()
if(this.$parent.exhibitionList.print)this.designOpenrtionList = JSON.parse(JSON.stringify(this.$parent.exhibitionList.print))
if(this.$parent.elementsList)this.designList = JSON.parse(JSON.stringify(this.$parent.printsList))
// if(this.overallSingle == false && this.designOpenrtionList.length > 0){
// this.designOpenrtionList[0].checked = true
// }else if(this.overallSingle == false && this.designOpenrtionList.length == 0){
// this.setpitch(this.designList[0],0)
// }
let skecth = new Image
skecth.onload=()=>{
this.sketch.width = skecth.width/10+'rem'
@@ -328,17 +351,13 @@ export default defineComponent({
})
})
}
// else if(!this.overallSingle){
// let str = 'overall'
// this.setOverallPosition(0,str)
// }
if(this.exhibitionOpenrtionList.single.length > 0){
let str = 'single'
this.exhibitionOpenrtionList[str].forEach((item,index)=>{
this.setTemplate(item,index,str)
})
}
if(this.exhibitionOpenrtionList.overall.length == 0 && this.exhibitionOpenrtionList.single.length == 0)this.setpitch(this.designList[0],0)
},
setprintList(arr){
arr.forEach(item=>{
@@ -371,10 +390,9 @@ export default defineComponent({
})
},
systemDesigner(num) {
},
formatter(value) {
return `${value*3}%`;
return `${value}%`;
},
setOveralSingle(){
@@ -462,8 +480,12 @@ export default defineComponent({
let top = Number(this.printStyleList[this.stateOverallSingle][index].style.top.replace(/px/g,''))
this.printStyleList[this.stateOverallSingle][index].centers.left = imgDomWH.x+event.offsetX-left
this.printStyleList[this.stateOverallSingle][index].centers.top = imgDomWH.y+event.offsetY-top
document.addEventListener("mouseup", this.mouseup);
document.addEventListener("mousemove", this.moveMousemove);
// document.addEventListener("mouseup", this.mouseup);
// document.addEventListener("mousemove", this.moveMousemove);
document.addEventListener('mousemove', this.mouseMove);
document.addEventListener('touchmove', this.touchmove);
document.addEventListener('mouseup', this.mouseup);
document.addEventListener('touchend', this.mouseup);
},
//设置尺寸
itemSizeMousedown(direction,event){
@@ -486,16 +508,28 @@ export default defineComponent({
this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.top = imgDomWH.y+event.offsetY+imgDomWH.height-li
}
document.addEventListener("mouseup", this.sizeMouseup);
document.addEventListener("mousemove", this.sizeMousemove);
// document.addEventListener("mouseup", this.sizeMouseup);
// document.addEventListener("mousemove", this.sizeMousemove);
document.addEventListener('mousemove', this.sizeMouseMove);
document.addEventListener('touchmove', this.sizeTouchmove);
document.addEventListener('mouseup', this.sizeMouseup);
document.addEventListener('touchend', this.sizeMouseup);
},
mouseMove(event){
let e = getMousePosition(event,false)
this.mouseMoveOperation(e)
},
touchmove(event){
let e = getMousePosition(event,true)
this.mouseMoveOperation(e)
},
//鼠标移动
moveMousemove(e) {
mouseMoveOperation(e) {
let imgDomWH = this.imgDom.getBoundingClientRect()
let parentNode = document.getElementsByClassName('designOpenrtion_modal')[0].getElementsByClassName("designOpenrtion_imgMask")[0]
parentNode = parentNode.getBoundingClientRect()
let x = (e.x - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left)+'px'
let y = ( e.y - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.top)+'px'
let x = (e.clientX - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left)+'px'
let y = ( e.clientY - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.top)+'px'
this.printStyleList[this.stateOverallSingle][this.imgDomIndex].style.left = x
this.printStyleList[this.stateOverallSingle][this.imgDomIndex].style.top = y
if(!this.overallSingle){
@@ -514,8 +548,15 @@ export default defineComponent({
}
},
sizeMousemove(e) {
sizeMouseMove(event){
let e = getMousePosition(event,false)
this.sizeMouseMoveOperation(e)
},
sizeTouchmove(event){
let e = getMousePosition(event,true)
this.sizeMouseMoveOperation(e)
},
sizeMouseMoveOperation(e) {
let imgDomWH = this.imgDom.getBoundingClientRect()
let parentNode =this.imgDom.parentNode
let width = imgDomWH.width
@@ -525,27 +566,27 @@ export default defineComponent({
let w,h
//判断移动四个边
if(this.direction == 'right'){
w = (e.x - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left)
h = (e.x - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left)*num
w = (e.clientX - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left)
h = (e.clientX - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left)*num
width = w+'px'
height = w*num1+'px'
}else if(this.direction == 'top'){
this.printStyleList[this.stateOverallSingle][this.imgDomIndex].style.top = 'auto'
// this.printStyleList[this.stateOverallSingle][this.imgDomIndex].style.left = 'auto'
this.printStyleList[this.stateOverallSingle][this.imgDomIndex].style.bottom = parentNode.offsetHeight -imgDomWH.height - this.imgDom.offsetTop+'px'
w = (e.x - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left)*num
h = (this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.top - e.y)
w = (e.clientX - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left)*num
h = (this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.top - e.clientY)
height = h+'px'
width = h*num+'px'
}else if(this.direction == 'bottom'){
h = (e.y - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.top)
h = (e.clientY - this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.top)
height = h+'px'
width = h*num+'px'
}else if(this.direction == 'left'){
this.printStyleList[this.stateOverallSingle][this.imgDomIndex].style.left = 'auto'
this.printStyleList[this.stateOverallSingle][this.imgDomIndex].style.right = parentNode.offsetWidth -imgDomWH.width - this.imgDom.offsetLeft+'px'
w = (this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left - e.x)
w = (this.printStyleList[this.stateOverallSingle][this.imgDomIndex].centers.left - e.clientX)
width = w+'px'
height = w*num1+'px'
}
@@ -565,13 +606,21 @@ export default defineComponent({
width:this.imgDom.offsetWidth+'px',
zIndex:this.printZIndex
}
document.removeEventListener("mouseup", this.sizeMouseup);
document.removeEventListener("mousemove", this.sizeMousemove);
// document.removeEventListener("mouseup", this.sizeMouseup);
// document.removeEventListener("mousemove", this.sizeMousemove);
document.removeEventListener('mousemove',this.sizeMouseMove)
document.removeEventListener('touchmove',this.sizeTouchmove)
document.removeEventListener('mouseup',this.sizeMouseup)
document.removeEventListener('touchend',this.sizeMouseup)
},
mouseup(e) {
document.removeEventListener("mouseup", this.mouseup);
document.removeEventListener("mousemove", this.moveMousemove);
// document.removeEventListener("mouseup", this.mouseup);
// document.removeEventListener("mousemove", this.moveMousemove);
document.removeEventListener('mousemove',this.mouseMove)
document.removeEventListener('touchmove',this.touchmove)
document.removeEventListener('mouseup',this.mouseup)
document.removeEventListener('touchend',this.mouseup)
},
deletePrint(){
this.exhibitionOpenrtionList[this.stateOverallSingle].splice(this.imgDomIndex,1)
@@ -587,51 +636,55 @@ export default defineComponent({
let sketch = document.getElementsByClassName("designOpenrtion_modal")[0]?.getElementsByClassName('designOpenrtion_sketch')[0]
let width
let scale
if(sketch.width<sketch.height){
width = Math.trunc(Math.random()*(sketch?.width-sketch?.width/2))+sketch?.width/4
if(boor){
width = Math.trunc((sketch?.width-sketch?.width/2))+sketch?.width/4
let img = new Image()
img.onload = ()=>{
if(sketch.width<sketch.height){
width = Math.trunc(Math.random()*(sketch?.width-sketch?.width/2))+sketch?.width/4
if(boor){
width = Math.trunc((sketch?.width-sketch?.width/2))+sketch?.width/4
}
scale = width / this.print.width.replace(/px/g,'')
}else{
width = Math.trunc(Math.random()*(sketch?.height-sketch?.height/2))+sketch?.height/4
if(boor){
width = Math.trunc((sketch?.height-sketch?.height/2))+sketch?.height/4
}
scale = width / this.print.height.replace(/px/g,'')
}
scale = width / this.print.width.replace(/px/g,'')
}else{
width = Math.trunc(Math.random()*(sketch?.height-sketch?.height/2))+sketch?.height/4
if(boor){
width = Math.trunc((sketch?.height-sketch?.height/2))+sketch?.height/4
let x = sketch?.width - this.print.width.replace(/px/g,'')*scale
if(!this.overallSingle){
x = sketch?.width - this.print.width.replace(/px/g,'')*scale/2
}
let y = sketch?.height-this.print.height.replace(/px/g,'')*scale
let left = sketch.offsetWidth/2-this.print.width.replace(/px/g,'')*scale/2
let top = sketch.offsetHeight/2-this.print.height.replace(/px/g,'')*scale/2
if(this.stateOverallSingle == 'overall'){
left = sketch.offsetWidth/2-5
top = sketch.offsetHeight/2-5
}
this.printStyleList[this.stateOverallSingle][index]={
centers:{
left:0,
top:0,
},
style:{
left:(boor?left:Math.trunc(Math.random()*x)+1)+"px",
top:(boor?top:Math.trunc(Math.random()*y)+1)+"px",
right:"auto",
bottom:"auto",
width:this.print.width.replace(/px/g,'')*scale+'px',
height:this.print.height.replace(/px/g,'')*scale+'px',
zIndex:this.printZIndex++
},
transform:{
// scale:scale<.2?.2:scale,//0.2-3
// rotateZ:rotateZ1-rotateZ2,
rotateZ:this.printStyleList[this.stateOverallSingle][index].transform.rotateZ?this.printStyleList[this.stateOverallSingle][index].transform.rotateZ:0
},
designOpenrtionBtn:false
}
scale = width / this.print.height.replace(/px/g,'')
}
let x = sketch?.width - this.print.width.replace(/px/g,'')*scale
if(!this.overallSingle){
x = sketch?.width - this.print.width.replace(/px/g,'')*scale/2
}
let y = sketch?.height-this.print.height.replace(/px/g,'')*scale
let left = sketch.offsetWidth/2-this.print.width.replace(/px/g,'')*scale/2
let top = sketch.offsetHeight/2-this.print.height.replace(/px/g,'')*scale/2
if(this.stateOverallSingle == 'overall'){
left = sketch.offsetWidth/2-5
top = sketch.offsetHeight/2-5
}
this.printStyleList[this.stateOverallSingle][index]={
centers:{
left:0,
top:0,
},
style:{
left:(boor?left:Math.trunc(Math.random()*x)+1)+"px",
top:(boor?top:Math.trunc(Math.random()*y)+1)+"px",
right:"auto",
bottom:"auto",
width:this.print.width.replace(/px/g,'')*scale+'px',
height:this.print.height.replace(/px/g,'')*scale+'px',
zIndex:this.printZIndex++
},
transform:{
// scale:scale<.2?.2:scale,//0.2-3
// rotateZ:rotateZ1-rotateZ2,
rotateZ:this.printStyleList[this.stateOverallSingle][index].transform.rotateZ?this.printStyleList[this.stateOverallSingle][index].transform.rotateZ:0
},
designOpenrtionBtn:false
}
img.src = sketch.src
},
//设置图片
async setTemplate(item,index,str) {
@@ -736,8 +789,15 @@ export default defineComponent({
for (let index = 0; index < arr.length; index++) {
if(!this.overallSingle){
scale = this.systemDesignerPercentage/100
console.log(this.print);
let overallScale = (arr[index].style.width.replace(/px/g,'')*sketchNum/this.print.width.replace(/px/g,''))
let x = Number(arr[index].style.left.replace(/px/g,''))
let y = Number(arr[index].style.top.replace(/px/g,''))
let width = Number(this.print.width.replace(/px/g,''))
let height = Number(this.print.height.replace(/px/g,''))
// location = [arr[index].style.left.replace(/px/g,'')*sketchNum+this.print.width.replace(/px/g,'')/2-7,arr[index].style.top.replace(/px/g,'')*sketchNum+this.print.height.replace(/px/g,'')/2-7]
location = [arr[index].style.left.replace(/px/g,'')*sketchNum,arr[index].style.top.replace(/px/g,'')*sketchNum]
location = [(x)*sketchNum ,(y )*sketchNum]
}else{
await this.setPrintWH(this.exhibitionOpenrtionList[this.stateOverallSingle][index].path)
scale = (arr[index].style.width.replace(/px/g,'')*sketchNum/this.print.width.replace(/px/g,''))
@@ -860,19 +920,22 @@ export default defineComponent({
}
},
closeModal(){
let designItemDetail = JSON.parse(JSON.stringify(this.store.state.DesignDetailModule.designItemDetail))
let _this = this
Modal.confirm({
title: this.t('DesignPrintOperation.jsContent1'),
icon: createVNode(ExclamationCircleOutlined),
okText: 'Yes',
cancelText: 'No',
mask:false,
centered:true,
onOk() {
_this.designOpenrtion=false
}
});
if(this.designItemDetailTS.rv){
let _this = this
Modal.confirm({
title: this.t('DesignPrintOperation.jsContent1'),
icon: createVNode(ExclamationCircleOutlined),
okText: 'Yes',
cancelText: 'No',
mask:false,
centered:true,
onOk() {
_this.designOpenrtion=false
}
});
}else{
this.designOpenrtion=false
}
},
},
});
@@ -881,11 +944,15 @@ export default defineComponent({
<style lang="less">
.designOpenrtion_modal {
// max-width: 1440px;
user-select: none; /* 对现代浏览器有效 */
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
.mark_loading{
position: absolute;
}
.ant-modal-body{
padding: calc(4rem*1.2) calc(5rem*1.2) calc(0rem*1.2)!important;
padding: calc(5rem*1.2) calc(6rem*1.2) calc(0rem*1.2)!important;
// height: calc(65vh - 6.4rem*1.2));
height: calc(65rem*1.2);
display: flex;
@@ -1174,8 +1241,8 @@ export default defineComponent({
li{
cursor: pointer;
// border-radius: 50%;
width: calc(1rem*1.2);
height: calc(1rem*1.2);
width: calc(2rem*1.2);
height: calc(2rem*1.2);
background-color: rgb(20, 188, 255);
position: absolute;
pointer-events: none;

View File

@@ -65,7 +65,8 @@
<div v-show="!overallSingle" class="habit_System_Designer">
<div class="habit_System_Designer_text">Scale</div>
<a-slider id="system_silder"
:min="1"
:min="20"
:max="1000"
v-model:value="systemDesignerPercentage"
@afterChange="systemDesigner"
:tip-formatter="formatter"
@@ -92,7 +93,7 @@
:key="item"
v-if="overallSingle"
:style="[printStyleList[stateOverallSingle]?.[index]?.style]"
@touchstart.stop="itemMoveMousedown(index,$event)"
@touchstart.passive="itemMoveMousedown(index,$event)"
class="modal_imgItem"
ref="content" >
<img crossOrigin="anonymous" :src="item?.path" :style="{transform:`rotateZ(${printStyleList[index]?.transform?.rotateZ}deg)`}" class="designOpenrtionMobile_imgItme" draggable="false">
@@ -100,18 +101,18 @@
</div>
<img :src="operationCurrent?.undividedLayer?operationCurrent.undividedLayer:operationCurrent.path" alt="" class="designOpenrtionMobile_sketch">
<div class="designOpenrtionMobile_btn">
<ul v-if="overallSingle" v-for="item,index in printStyleList[stateOverallSingle]" :key="item" :class="{active:item?.designOpenrtionBtn?item?.designOpenrtionBtn:false}" class="designOpenrtionMobile_Mousingle" :style="item.style" @touchstart.stop="itemMoveMousedown(index,$event)">
<li class="designOpenrtionMobile_btn_top" @touchstart.stop="itemSizeMousedown('top',$event)"></li>
<li class="designOpenrtionMobile_btn_bottom" @touchstart.stop="itemSizeMousedown('bottom',$event)"></li>
<li class="designOpenrtionMobile_btn_left" @touchstart.stop="itemSizeMousedown('left',$event)"></li>
<li class="designOpenrtionMobile_btn_right" @touchstart.stop="itemSizeMousedown('right',$event)"></li>
<ul v-if="overallSingle" v-for="item,index in printStyleList[stateOverallSingle]" :key="item" :class="{active:item?.designOpenrtionBtn?item?.designOpenrtionBtn:false}" class="designOpenrtionMobile_Mousingle" :style="item.style" @touchstart.passive="itemMoveMousedown(index,$event)">
<li class="designOpenrtionMobile_btn_top" @touchstart.passive="itemSizeMousedown('top',$event)"></li>
<li class="designOpenrtionMobile_btn_bottom" @touchstart.passive="itemSizeMousedown('bottom',$event)"></li>
<li class="designOpenrtionMobile_btn_left" @touchstart.passive="itemSizeMousedown('left',$event)"></li>
<li class="designOpenrtionMobile_btn_right" @touchstart.passive="itemSizeMousedown('right',$event)"></li>
<li class="designOpenrtionMobile_rotote" v-rotote.stop="[index,item.transform]"></li>
<li class="designOpenrtionMobile__delete" @click="deletePrint">
<img src="../../assets/images/homePage/cuowu.svg" alt="">
</li>
</ul>
<div v-show="!overallSingle"></div>
<ul v-if="!overallSingle && printStyleList[stateOverallSingle][0]" class="designOpenrtionMobile_Mouoverall active" :style="'left:'+printStyleList[stateOverallSingle][0]?.style?.left+';top:'+printStyleList[stateOverallSingle][0]?.style?.top+';'" @touchstart.stop="itemMoveMousedown(0,$event)">
<ul v-if="!overallSingle && printStyleList[stateOverallSingle][0]" class="designOpenrtionMobile_Mouoverall active" :style="'left:'+printStyleList[stateOverallSingle][0]?.style?.left+';top:'+printStyleList[stateOverallSingle][0]?.style?.top+';'" @touchstart.passive="itemMoveMousedown(0,$event)">
<i class="fi fi-rr-arrows animtion1"></i>
<i class="fi fi-rr-arrows animtion2"></i>
<li class="designOpenrtionMobile_rotote" v-rotote.stop="[0,printStyleList[stateOverallSingle][0].transform]"></li>
@@ -373,7 +374,7 @@ export default defineComponent({
systemDesigner(num) {
},
formatter(value) {
return `${value*3}%`;
return `${value}%`;
},
setOveralSingle(){
@@ -813,7 +814,6 @@ export default defineComponent({
index = ind
}
})
this.designOpenrtion = false
if(this.designItemDetailTS.rv){
designItemDetail.currentFullBodyView = this.designItemDetailTS.rv.currentFullBodyView
designItemDetail.clothes[index].printObject.ifSingle = this.overallSingle
@@ -821,7 +821,6 @@ export default defineComponent({
designItemDetail.clothes[index].undividedLayer = this.designItemDetailTS.rv.clothes[index].undividedLayer
designItemDetail.clothes[index].trims = this.designItemDetailTS.rv.clothes[index].trims
designItemDetail.clothes[index].printObject.prints = this.setOkData
// designItemDetail.clothes[index].printObject.prints = this.computeZindex()
designItemDetail.ifSubmit = true
designItemDetail.clothes.forEach((item,i)=>{
let a
@@ -838,6 +837,7 @@ export default defineComponent({
this.setRevocation(designItemDetail,this.designItemDetailTS.data)
this.designItemDetailTS = {}
}
this.designOpenrtion = false
if(this.driver__.driver){
nextTick(()=>{
driverObj__.moveNext();
@@ -890,7 +890,7 @@ export default defineComponent({
position: absolute;
}
.ant-modal-body{
padding: calc(4rem*1.2) calc(5rem*1.2) calc(0rem*1.2)!important;
padding: calc(5rem*1.2) calc(6rem*1.2) calc(0rem*1.2)!important;
// height: calc(65vh - 6.4rem*1.2));
height: calc(65rem*1.2);
display: flex;

View File

@@ -1,12 +1,13 @@
<template>
<a-modal
class="addDetails_modal generalModel"
v-model:visible="showPayOrder"
v-model:visible="addDetails"
:footer="null"
width="50%"
width="78%"
:maskClosable="false"
:centered="true"
:closable="false"
:destroyOnClose="true"
wrapClassName="#app"
:keyboard="false"
>
@@ -21,357 +22,40 @@
<div>{{ $t('addDetails.AddDetails') }}</div>
<div class="modal_title_text_intro"></div>
</div>
<div class="exportCanvasBox_center">
<div class="addDetails_center_btn addDetails_center_item" :class="{spread:spreadState}">
<!-- <div @click="setOperation('')" class="addDetails_center_btn_item">
<div>新增</div>
</div> -->
<i class="icon iconfont icon-chehui" @click="historyState('')"></i>
<i class="icon iconfont icon-fanchehui" @click="historyState('reverse')"></i>
<i class="icon iconfont icon-move" @click="setOperation('move')" :class="{active:canvasState == 'move'}"></i>
<i class="icon iconfont icon-bianji" @click="setOperation('pencil')" :class="{active:canvasState == 'pencil'}"></i>
<i class="icon iconfont icon-xiangpi_huaban1" @click="setOperation('eraser')" :class="{active:canvasState == 'eraser'}"></i>
<input type="range" v-show="canvasState != 'move'" @input="setPencilWidth" min="1" max="50" v-model="canvasPencilWidth[canvasState]">
<div class="icon iconfont icon-xiala" :class="{btnRotate:spreadState}" @click="()=>spreadState = !spreadState"></div>
</div>
</div>
<div class="exportCanvasBox_submit" @click="setSubmit">
<div class="started_btn">
{{ $t('addDetails.submit') }}
</div>
</div>
<generalMiniCanvas :imgUrl="imgUrl" @submitBase64Data="submitBase64Data"></generalMiniCanvas>
</div>
<div></div>
</a-modal>
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
</template>
<script>
import { defineComponent, ref, reactive, watch, onMounted, nextTick, toRefs } from "vue";
import { Https } from "@/tool/https";
import { formatTime } from "@/tool/util";
import { setCookie, getCookie } from "@/tool/cookie";
import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import allOrder from "@/component/Pay/allOrder.vue";
import creditsDetail from "@/component/Pay/creditsDetail.vue";
import { exportSele,JSRectUpdata,JSchangeType,JScanvasMouseDown,JSSetRemoveImage,JScreateCheck,JSSetTexture } from "@/tool/canvasDrawing";
import { useI18n } from "vue-i18n";
import generalMiniCanvas from "../modules/generalMiniCanvas.vue";
export default defineComponent({
components: {
creditsDetail,
allOrder,
generalMiniCanvas,
},
emits: ['setSloganData'],
setup(props,{emit}) {
let presentState = ref('paypal');
let showPayOrder = ref(false);
let loadingShow = ref(false);
let { t } = useI18n();
let canvas = reactive({});
let scale = 2;
let ratio = [1,1]
let exportWH = 512
let canvasBtn = reactive({
canvasState:'move',
canvasPencilWidth:{
pencil:4,
eraser:4,
},
spreadState:false,
})
let canvasWH = ref(0);
onMounted(()=>{
})
let exportUrl = ''
let reverseCanvasState = ref([])//存放canvas操作
let normalCanvasState = ref([])//存放canvas操作
let canvasState = ref()//存放canvas操作
let keyDown = []//监听键盘的 keydown 和 keyup 事件
let init = (data,index)=>{
loadingShow.value = true
normalCanvasState.value = []
reverseCanvasState.value = []
showPayOrder.value = true;
scale = 2;
ratio = [1,1]
exportWH = 512
nextTick(()=>{
let canvasBox = document.querySelector(".addDetails_modal .exportCanvasBox_center");
let height = canvasBox.offsetHeight;
canvasBox.style.width = height+'px'
canvasWH.value = height
var canvasDom = document.createElement("canvas");
document.addEventListener("keydown", canvasKeyDown);
document.addEventListener("keyup", canvasKeyUp);
let oldCanvasDom = canvasBox.querySelector('.canvas-container')
let oldCanvasDom1 = canvasBox.querySelector('canvas')
if(oldCanvasDom){
oldCanvasDom.remove()
}
if(oldCanvasDom1){
oldCanvasDom1.remove()
}
canvasBox.appendChild(canvasDom);
let img = new Image();
img.onload = function(){
let wScale = 1
let hScale = 1
if(img.width>img.height){
hScale = img.height/img.width
exportWH = img.width
}else{
wScale = img.width/img.height
exportWH = img.height
}
ratio = [wScale,hScale]
canvas = new fabric.Canvas(canvasDom, {
backgroundColor: "#FFF",
width: canvasWH.value * wScale,
height: canvasWH.value * hScale,
isDrawingMode: false, // 开启绘图模式
});
scale = img.height/canvas.height
JSchangeType(canvas,'init')
fabric.Object.prototype.cornerSize = 10
fabric.Object.prototype.transparentCorners = false
exportUrl = data.path
fabric.Image.fromURL(data.path, function(img) {
// 设置背景图对象的宽度和高度与 canvas 相同
img.scaleToWidth(canvas.width);
img.scaleToHeight(canvas.height);
// 将背景图添加到 canvas 的底层
canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));
if(!fabric.Object.prototype.controls.deleteControl){
JSSetRemoveImage(deleteObj)
}else{
fabric.Object.prototype.controls.deleteControl.mouseUpHandler = deleteObj
}
updateCanvasState()
loadingShow.value = false
},{ crossOrigin: "Anonymous" });
// 鼠标抬起事件
canvas.on('mouse:up', function(event) {
if(canvasBtn.canvasState != 'move'){
updateCanvasState('mouseUp')
}
});
//画布上移动
canvas.on("mouse:move", event =>setCanvasMove(event));
canvas.add(brushIndicator)
setOperation('pencil')
img.remove()
}
img.src = data.path
})
}
let canvasKeyDown = (event) => {
if(keyDown.indexOf(event.key)>-1){
}else{
keyDown.push(event.code)
if(keyDown.indexOf('ControlLeft') > -1 && keyDown.indexOf('KeyZ') > -1 && keyDown.indexOf('ShiftLeft') > -1){
historyState('reverse')
}else if(keyDown.indexOf('ControlLeft') > -1 && keyDown.indexOf('KeyZ') > -1){
historyState('')
}
}
}
let canvasKeyUp = (event) =>{
keyDown = keyDown.filter(function(item) {
return event.code !== item;
})
}
let clearCanvas = ()=>{
canvasBtn.canvasState = 'move'
canvasBtn.spreadState = false
document.removeEventListener("keydown", canvasKeyDown);
document.removeEventListener("keyup", canvasKeyUp);
}
let rgba = 'rgba(0, 0, 0, 1)'
let brushIndicator = new fabric.Circle({
radius:2,
fill: 'rgba(0, 0, 0, 0)',
stroke: '#000',
strokeWidth: 1,
originX: 'center',
originY: 'center',
visible :true,
// left: -100,
// top: -100,
erasable: false,
let addDetail = reactive({
imgUrl:''
});
let setCanvasMove = (event)=>{
var pointer = canvas.getPointer(event.e);
if(canvas.isDrawingMode){
canvas.setCursor('none');
if(!canvas.contains(brushIndicator)){
canvas.add(brushIndicator)
brushIndicator.set({// left:0,
// top:0,
radius:(canvasBtn.canvasPencilWidth[canvasBtn.canvasState])/2
})
canvas.bringToFront(brushIndicator);//设置优先级最高
}
// brushIndicator.fill = canvasPencilColor.value
brushIndicator.set({ left: pointer.x, top: pointer.y, visible: true,radius:(canvasBtn.canvasPencilWidth[canvasBtn.canvasState])/2 });
}
canvas.requestRenderAll()
}
let setOperation = (str)=>{
canvasBtn.canvasState = str
if(str == 'move'){
setMove()
if(canvas.contains(brushIndicator))canvas.remove(brushIndicator)
}else if(str == 'pencil'){
setPencil()
if(!canvas.contains(brushIndicator))canvas.add(brushIndicator)
}else if(str == 'eraser'){
setEraser()
if(!canvas.contains(brushIndicator))canvas.add(brushIndicator)
}
}
let setMove = ()=>{
canvas.isDrawingMode = false
canvas.forEachObject((obj) =>obj.selectable = true);
}
let setPencil = ()=>{
canvas.isDrawingMode = true//开启绘画模式
canvas.freeDrawingBrush = new fabric.PencilBrush(canvas,{});
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState]);
canvas.freeDrawingBrush.color = rgba
brushIndicator.set('fill',rgba)
canvas.freeDrawingBrush.isEraser = false
}
let setEraser = ()=>{
canvas.isDrawingMode = true
let eraser = new fabric.EraserBrush(canvas)
canvas.freeDrawingBrush = eraser
brushIndicator.set({fill: '#fff'});
canvas.requestRenderAll();
canvas.freeDrawingBrush.isEraser = true
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState]);
}
let deleteObj = ()=> {
// if(!canvas.getActiveObjects()){
// return
// }
let target = canvas.getActiveObjects()
target.forEach((item)=>{
canvas.fxRemove(item, {
onComplete(){
canvas.discardActiveObject(); // 丢弃当前选中的对象
canvas.renderAll(); // 重新渲染 Canvas
}
})
canvas.FX_DURATION = 300
})
}
let setTimeOutWidth
let setPencilWidth = ()=>{//切换颜色给铅笔设置颜色
clearTimeout(setTimeOutWidth)
setTimeOutWidth = setTimeout(()=>{
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState])
},300)
}
let updateCanvasState = (str) =>{
if(str != 'mouseUp'){
canvas.remove(brushIndicator)
}
const canvasAsJson = JSON.stringify(canvas.toJSON());
normalCanvasState.value.push(canvasAsJson);
}
//撤回
let historyState = (str)=> {
if(str == 'reverse' && reverseCanvasState.value.length > 0){//反撤回
let obj = reverseCanvasState.value.pop()
// canvasState.value = reverseCanvasState.value[reverseCanvasState.value.length-1]
canvasState.value = obj
normalCanvasState.value.push(obj);
}else if(str == '' && normalCanvasState.value.length > 1){
let obj = normalCanvasState.value.pop()
canvasState.value = normalCanvasState.value[normalCanvasState.value.length-1]
reverseCanvasState.value.push(obj);
}else{
return
}
canvas.loadFromJSON(canvasState.value, () => {});
}
let setSubmit = ()=>{
var allObjects = canvas.getObjects('path');
if(allObjects.length == 0){
return message.info(t('addDetails.jsContent1'))
}
var canvasDom = document.createElement("canvas");
let exportCanvas = new fabric.Canvas(canvasDom, {
backgroundColor: "rgba(255, 255, 255,1)",
width: exportWH * ratio[0],
height: exportWH * ratio[1],
isDrawingMode: false, // 开启绘图模式
});
canvas.backgroundImage.clone((back)=>{
back.set({
scaleX:1,
scaleY:1,
left:back.left*scale,
top:back.top*scale ,
})
exportCanvas.backgroundImage = back
allObjects.forEach((item,index)=>{
// let obj = fabric.util.object.clone(item);
if(item.type == 'circle')return
let obj
item.clone((cloned)=>{
obj = cloned
})
obj.set(
{
scaleX:(item.scaleX?item.scaleX:1)*scale,
scaleY:(item.scaleY?item.scaleY:1)*scale,
left:item.left*scale,
top:item.top*scale,
}
)
exportCanvas.add(obj)
if(allObjects.length-1 == index){
let data = exportCanvas.toDataURL('jpg')
cancelDsign()
clearCanvas()
emit('setSloganData',data)
}
})
})
let addDetails = ref(false);
let init = (data,index)=>{
addDetails.value = true
addDetail.imgUrl = data.path
}
let submitBase64Data = (data)=>{
emit('setSloganData',data)
cancelDsign()
}
let cancelDsign = ()=>{
canvas.dispose();
showPayOrder.value = false
document.removeEventListener('keydown',canvasKeyDown);
document.removeEventListener('keyup', canvasKeyUp);
addDetails.value = false
}
return {
presentState,
showPayOrder,
loadingShow,
t,
...toRefs(canvasBtn),
...toRefs(addDetail),
addDetails,
init,
setOperation,
setPencilWidth,
historyState,
setSubmit,
submitBase64Data,
cancelDsign,
};
},
@@ -392,101 +76,14 @@ export default defineComponent({
}
.addDetails_center{
position: relative;
// width: calc(512px / 2);
// width: 256px;
height: 100%;
display: flex;
flex-direction: column;
// height: calc(512px / 2);
margin: 0 auto;
.addDetails_center_item{
// position: relative;
background: #fff;
position: absolute;
display: flex;
border: 0.2rem solid #c4c4c4;
width: 25rem;
border-radius: 4px; /* 设置圆角半径 */
flex-wrap: wrap;
.addDetails_center_btn_item{
display: flex;
align-items: center;
padding: 1rem 0;
}
}
.exportCanvasBox_center{
height: 100%;
flex: 1;
position: relative;
margin: 0 auto;
overflow: hidden;
background: #e6e6e6;
// overflow: scroll;
.addDetails_center_btn{
z-index: 2;
left: 50%;
transform: translate(-50%,-135%);
transition: all .3s;
padding: 1rem 1.5rem;
// position: relative;
input{
width: 100%;
margin-top: 1rem;
}
.icon-xiala{
position: absolute;
width: 2rem;
bottom: 0;
transform: translate(-50%, 90%);
left: 50%;
width: 6rem;
background: #fff;
text-align: center;
cursor: pointer;
&.icon-xiala::before{
transition: all .3s;
}
&.btnRotate::before{
transform: rotate(180deg);
display: block;
}
}
i{
font-size: 2.5rem;
cursor: pointer;
width: 4rem;
height: 4rem;
display: flex;
align-items: center;
justify-content: center;
&.active{
border: 1px solid;
border-radius: .4rem;
}
}
&.spread{
transform: translate(-50%,0);
}
}
.canvas-container{
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
}
.exportCanvasBox_center:hover{
.addDetails_center_btn{
transform: translate(-50%,-101%);
&.spread{
transform: translate(-50%,0);
}
}
}
}
.exportCanvasBox_submit{
margin-top: 2.4rem;
text-align: center;
// margin-top: 2.4rem;
// text-align: center;
}
}
</style>

View File

@@ -0,0 +1,600 @@
<template>
<div class="editFrontBack_center">
<div class="editFrontBack_center_btn editFrontBack_center_item" :class="{spread:spreadState}">
<!-- <div @click="setOperation('')" class="editFrontBack_center_btn_item">
<div>新增</div>
</div> -->
<i class="icon iconfont icon-chehui" @click="historyState('')"></i>
<i class="icon iconfont icon-fanchehui" @click="historyState('reverse')"></i>
<!-- <i class="icon iconfont icon-move" @click="setOperation('move')" :class="{active:canvasState == 'move'}"></i> -->
<i class="icon iconfont icon-bianji" @click="setOperation('pencil')" :class="{active:canvasState == 'pencil'}"></i>
<!-- <i class="icon iconfont icon-xiangpi_huaban1" @click="setOperation('eraser')" :class="{active:canvasState == 'eraser'}"></i> -->
<div class="editFrontBack_center_btn_colorRed" @click="setOperationColor('rgb(255,0,0)')" :class="{active:(canvasState != 'eraser' && rgba == 'rgb(255,0,0)')}" title="front">front</div>
<div class="editFrontBack_center_btn_colorGreen" @click="setOperationColor('rgb(0,255,0)')" :class="{active:(canvasState != 'eraser' && rgba == 'rgb(0,255,0)')}" title="back">back</div>
<div class="editFrontBack_center_btn_colorWhite" @click="setOperation('eraser')" :class="{active:canvasState == 'eraser'}" title="background">background</div>
<input type="range" v-show="canvasState != 'move'" @input="setPencilWidth" min="1" max="50" v-model="canvasPencilWidth[canvasState]">
<!-- <div class="icon iconfont icon-xiala" :class="{btnRotate:spreadState}" @click="()=>spreadState = !spreadState"></div> -->
</div>
<div class="exportCanvasBox_center_box">
<div class="exportCanvasBox_center">
<div class="editFrontBack_bgImg" v-show="loadingShow">
<img :src="imgData?.undividedLayer" alt="">
</div>
</div>
<div class="editFrontBack_pencilbtn" v-show="loadingShow" :style="pencilbtnStyle"></div>
</div>
</div>
</template>
<script>
import { defineComponent, ref, reactive, watch, onMounted, nextTick, toRefs } from "vue";
import { Https } from "@/tool/https";
import { formatTime,segmentImage } from "@/tool/util";
import { setCookie, getCookie } from "@/tool/cookie";
import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import allOrder from "@/component/Pay/allOrder.vue";
import creditsDetail from "@/component/Pay/creditsDetail.vue";
import { exportSele,JSRectUpdata,JSchangeType,JScanvasMouseDown,JSSetRemoveImage,JScreateCheck,JSSetTexture } from "@/tool/canvasDrawing";
import { getMousePosition } from "@/tool/mdEvent";
import { useI18n } from "vue-i18n";
import canvasGeneral from "@/tool/canvasGeneral";
export default defineComponent({
components: {
creditsDetail,
allOrder,
},
// emits: ['setSloganData'],
props:['patchData','imgDomIndex'],
setup(props,{emit}) {
let presentState = ref('paypal');
let loadingShow = ref(false);
let { t } = useI18n();
let canvas = reactive({});
let ratio = [1,1]
let exportWH = 0
let imgDomIndex = 0
let imgData = ref()
let pencilbtnStyle = ref({
background:'',
width:0+'px',
height:0+'px',
display:'none',
left:0+'px',
top:0+'px',
})
// let a = computed(()=>{
// console.log(123);
// return props.patchData
// })
watch(()=>props.imgDomIndex,(newVal,oldVal)=>{
if(newVal == -1) return
imgDomIndex = newVal
props.patchData.front.imageUrl= ''
clearTimeout(setTimeSubmit)
init(props.patchData.front[newVal],'')
})
let canvasBtn = reactive({
canvasState:'move',
canvasPencilWidth:{
pencil:20,
eraser:20,
},
spreadState:false,
})
let canvasWH = ref(0);
let exportUrl = ''
let reverseCanvasState = ref([])//存放canvas操作
let normalCanvasState = ref([])//存放canvas操作
let canvasState = ref()//存放canvas操作
let keyDown = []//监听键盘的 keydown 和 keyup 事件
let init = (data,index)=>{
normalCanvasState.value = []
reverseCanvasState.value = []
ratio = [1,1]
imgData.value = data
nextTick(()=>{
let canvasBox = document.querySelector(".editFrontBack_center .exportCanvasBox_center");
let editFrontBack_bgImg = document.querySelector(".editFrontBack_center .editFrontBack_bgImg");
document.addEventListener("keydown", canvasKeyDown);
document.addEventListener("keyup", canvasKeyUp);
document.removeEventListener('mousemove', mouseMove);
document.removeEventListener('touchmove', touchmove);
let img = new Image();
img.onload = async function(){
loadingShow.value = true
let height = canvasBox.offsetHeight;
canvasWH.value = height
canvasBox.style.width = height+'px'
let wScale = 1
let hScale = 1
let styleWidth = Number(data.style.width.split('px')[0])
let styleHeight = Number(data.style.height.split('px')[0])
if(styleWidth>styleHeight){
hScale = styleHeight/styleWidth
exportWH = img.width
}else{
wScale = styleWidth/styleHeight
exportWH = img.height
}
editFrontBack_bgImg.style.width = canvasWH.value * wScale+'px'
editFrontBack_bgImg.style.height = canvasWH.value * hScale+'px'
ratio = [wScale,hScale]
canvas = canvasGeneral.canvasInit(canvasBox,{
width:canvasWH.value * wScale,
height:canvasWH.value * hScale,
})
pencilbtnStyle.value.background = rgba.value
fabric.Object.prototype.cornerSize = 10
fabric.Object.prototype.transparentCorners = false
exportUrl = data.maskUrl
// canvas.on('mouse:wheel', opt => {
// const delta = opt.e.deltaY // 滚轮,向上滚一下是 -100向下滚一下是 100
// let zoom = canvas.getZoom() // 获取画布当前缩放值
// zoom *= 0.999 ** delta
// if (zoom > 20) zoom = 20
// if (zoom < 0.01) zoom = 0.01
// // console.log(zoom);
// canvas.zoomToPoint(
// { // 关键点
// x: opt.e.offsetX,
// y: opt.e.offsetY
// },
// zoom
// )
// opt.e.preventDefault()
// opt.e.stopPropagation()
// })
await new Promise((resolve, reject) => {
fabric.Image.fromURL(data.maskUrl, function(img) {
// 设置背景图对象的宽度和高度与 canvas 相同
img.scaleToWidth(canvas.width);
img.scaleToHeight(canvas.height);;
img.set({
// width: canvas.width,
// height: canvas.height,
// scaleX:2,
// scaleY:1,
scaleX: canvas.width / img.width,
scaleY: canvas.height / img.height
});
// 将背景图添加到 canvas 的底层
// canvas.add(img);
canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));
if(!fabric.Object.prototype.controls.deleteControl){
JSSetRemoveImage(deleteObj)
}else{
fabric.Object.prototype.controls.deleteControl.mouseUpHandler = deleteObj
}
setPencilWidth()
updateCanvasState()
resolve('')
},{ crossOrigin: "Anonymous" });
})
// 鼠标抬起事件
canvas.on('mouse:up', function(event) {
if(canvasBtn.canvasState != 'move'){
updateCanvasState('mouseUp')
}
});
//画布上移动
// canvas.on("mouse:move", event =>setCanvasMove(event));
document.addEventListener('mousemove', mouseMove);
document.addEventListener('touchmove', touchmove);
setOperation('pencil')
createSetTimeSubmit()
img.remove()
}
img.src = data.maskUrl
})
}
let canvasKeyDown = (event) => {
if(keyDown.indexOf(event.key)>-1){
}else{
keyDown.push(event.code)
if(keyDown.indexOf('ControlLeft') > -1 && keyDown.indexOf('KeyZ') > -1 && keyDown.indexOf('ShiftLeft') > -1){
historyState('reverse')
}else if(keyDown.indexOf('ControlLeft') > -1 && keyDown.indexOf('KeyZ') > -1){
historyState('')
}
}
}
let canvasKeyUp = (event) =>{
keyDown = keyDown.filter(function(item) {
return event.code !== item;
})
}
let setClone = ()=>{
let canvasBox = document.querySelector(".editFrontBack_center .exportCanvasBox_center");
let oldCanvasDom = canvasBox.querySelector('.canvas-container')
let oldCanvasDom1 = canvasBox.querySelector('canvas')
if(oldCanvasDom)oldCanvasDom.remove()
if(oldCanvasDom1)oldCanvasDom1.remove()
loadingShow.value = false
}
let clearCanvas = ()=>{
document.removeEventListener("keydown", canvasKeyDown);
document.removeEventListener("keyup", canvasKeyUp);
}
let rgba = ref('rgb(255,0,0)')
let mouseMove = (event)=>{
let e = getMousePosition(event,false)
setCanvasMove(e)
}
let touchmove = (event)=>{
let e = getMousePosition(event,true)
setCanvasMove(e)
}
let setCanvasMove = (event)=>{
if(canvas.isDrawingMode){
canvas.setCursor('none');
}
let canvasCenterBox = document.querySelector(".editFrontBack_center .exportCanvasBox_center_box");
if(!canvasCenterBox)return
let parentX = event.clientX - canvasCenterBox.getBoundingClientRect().left
let parentY = event.clientY - canvasCenterBox.getBoundingClientRect().top
pencilbtnStyle.value.left = parentX + "px"
pencilbtnStyle.value.top = parentY+'px'
}
let setOperation = (str)=>{
if(!canvas)return
canvasBtn.canvasState = str
if(str == 'move'){
setMove()
pencilbtnStyle.value.display = `none`
}else if(str == 'pencil'){
setPencil()
pencilbtnStyle.value.display = `block`
}else if(str == 'eraser'){
setEraser()
// rgba.value = 'rgb(255,255,255)'
pencilbtnStyle.value.display = `block`
}
}
let setOperationColor = (color)=>{
pencilbtnStyle.value.background = color
rgba.value = color
canvas.freeDrawingBrush.color = color
setOperation('pencil')
}
let setMove = ()=>{
canvas.isDrawingMode = false
canvas.forEachObject((obj) =>obj.selectable = true);
}
let setPencil = ()=>{
canvas.isDrawingMode = true//开启绘画模式
canvas.freeDrawingBrush = new fabric.PencilBrush(canvas,{});
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState]);
setPencilWidth()
canvas.freeDrawingBrush.color = rgba.value
pencilbtnStyle.value.background = rgba.value
canvas.freeDrawingBrush.isEraser = false
}
let setEraser = ()=>{
canvas.isDrawingMode = true
let eraser = new fabric.EraserBrush(canvas)
canvas.freeDrawingBrush = eraser
pencilbtnStyle.value.background = `rgb(255,255,255)`
canvas.requestRenderAll();
canvas.freeDrawingBrush.isEraser = true
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState]);
setPencilWidth()
}
let deleteObj = ()=> {
// if(!canvas.getActiveObjects()){
// return
// }
let target = canvas.getActiveObjects()
target.forEach((item)=>{
canvas.fxRemove(item, {
onComplete(){
canvas.discardActiveObject(); // 丢弃当前选中的对象
canvas.renderAll(); // 重新渲染 Canvas
}
})
canvas.FX_DURATION = 300
})
}
let setTimeOutWidth
let setPencilWidth = ()=>{//切换颜色给铅笔设置颜色
clearTimeout(setTimeOutWidth)
setTimeOutWidth = setTimeout(()=>{
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState])
pencilbtnStyle.value.height = canvasBtn.canvasPencilWidth[canvasBtn.canvasState]+'px'
pencilbtnStyle.value.width = canvasBtn.canvasPencilWidth[canvasBtn.canvasState]+'px'
},300)
}
let setTimeSubmit = null
let createSetTimeSubmit = ()=>{
setSubmit()
}
let updateCanvasState = (str) =>{
if(str != 'mouseUp'){
// editFrontBackPencilbtn.value.style.display = 'none'
}else{
clearTimeout(setTimeSubmit)
setTimeSubmit = setTimeout(()=>{
createSetTimeSubmit()
},1000)
}
const canvasAsJson = JSON.stringify(canvas.toJSON());
normalCanvasState.value.push(canvasAsJson);
}
//撤回
let historyState = (str)=> {
if(str == 'reverse' && reverseCanvasState.value.length > 0){//反撤回
let obj = reverseCanvasState.value.pop()
// canvasState.value = reverseCanvasState.value[reverseCanvasState.value.length-1]
canvasState.value = obj
normalCanvasState.value.push(obj);
}else if(str == '' && normalCanvasState.value.length > 1){
let obj = normalCanvasState.value.pop()
canvasState.value = normalCanvasState.value[normalCanvasState.value.length-1]
reverseCanvasState.value.push(obj);
}else{
return
}
canvas.loadFromJSON(canvasState.value, () => {
createSetTimeSubmit()
});
}
let setSubmit = ()=>{
var allObjects = canvas.getObjects('path');
var canvasDom = document.createElement("canvas");
let exportCanvas = new fabric.Canvas(canvasDom, {
width: exportWH * ratio[0],
height: exportWH * ratio[1],
isDrawingMode: false, // 开启绘图模式
});
canvas.backgroundImage.clone((back)=>{
back.scaleToWidth(exportCanvas.width);
back.scaleToHeight(exportCanvas.height);
back.set({
scaleX: exportCanvas.width / back.width,
scaleY: exportCanvas.height / back.height
})
let scale = exportCanvas.height/canvas.height
exportCanvas.backgroundImage = back
allObjects.forEach((item,index)=>{
// let obj = fabric.util.object.clone(item);
if(item.type == 'circle')return
let obj
item.clone((cloned)=>{
obj = cloned
})
obj.set(
{
scaleX:(item.scaleX?item.scaleX:1)*scale,
scaleY:(item.scaleY?item.scaleY:1)*scale,
left:item.left*scale,
top:item.top*scale,
}
)
exportCanvas.add(obj)
})
let data = exportCanvas.toDataURL('png')
cancelDsign()
clearCanvas()
// props.props.patchData.front[imgDomIndex].imageUrl = data
let mark = data
let full = props.patchData.front[imgDomIndex].undividedLayer
let size = {
width: Math.round(exportWH * ratio[0]),
height: Math.round(exportWH * ratio[1]),
}
segmentImage(mark,full,size).then((rv)=>{
// console.log(rv.targetFrontUrl,rv.targetBackUrl)
props.patchData.front[imgDomIndex].imageUrl = rv.targetFrontUrl
props.patchData.back[imgDomIndex].imageUrl = rv.targetBackUrl
props.patchData.front[imgDomIndex].maskUrl = data
})
return
})
}
let cancelDsign = ()=>{
document.removeEventListener('keydown',canvasKeyDown);
document.removeEventListener('keyup', canvasKeyUp);
}
return {
presentState,
loadingShow,
imgData,
pencilbtnStyle,
t,
...toRefs(canvasBtn),
rgba,
init,
setOperation,
setOperationColor,
setPencilWidth,
historyState,
setSubmit,
setClone,
cancelDsign,
};
},
data() {
return {
};
},
mounted() {},
methods: {
},
});
</script>
<style lang="less" scoped>
.editFrontBack_center{
position: relative;
// width: calc(512px / 2);
// width: 256px;
height: 100%;
width: 100%;
display: flex;
flex-direction: column;
// height: calc(512px / 2);
margin: 0 auto;
.editFrontBack_center_item{
// position: relative;
background: #fff;
position: absolute;
display: flex;
border: 0.2rem solid #c4c4c4;
width: 35rem;
border-radius: 4px; /* 设置圆角半径 */
flex-wrap: wrap;
align-items: center;
.editFrontBack_center_btn_item{
display: flex;
align-items: center;
padding: 1rem 0;
}
}
.editFrontBack_center_btn{
z-index: 2;
left: 50%;
// transform: translate(-50%,-135%);
// transition: all .3s;
padding: 1rem 1.5rem;
transform: translate(-50%,0);
position: relative;
width: 100%;
flex-direction: row;
input{
// width: 100%;
flex: 1;
max-width: 30%;
}
.icon-xiala{
position: absolute;
width: 2rem;
bottom: 0;
transform: translate(-50%, 90%);
left: 50%;
width: 6rem;
background: #fff;
text-align: center;
cursor: pointer;
&.icon-xiala::before{
transition: all .3s;
}
&.btnRotate::before{
transform: rotate(180deg);
display: block;
}
}
.editFrontBack_center_btn_colorRed,.editFrontBack_center_btn_colorGreen,.editFrontBack_center_btn_colorWhite{
width: 9rem;
line-height: 3rem;
text-align: center;
height: 3rem;
border-radius: 4px;
margin: 0 .5rem;
cursor: pointer;
padding: .5rem 1;
border: 1px solid rgba(0,0,0,.5);
&.active{
border: 2px solid;
border-radius: .4rem;
}
}
.editFrontBack_center_btn_colorRed{
background: rgba(255,0,0);
}
.editFrontBack_center_btn_colorGreen{
background: rgba(0,255,0);
}
.editFrontBack_center_btn_colorWhite{
background: rgba(255,255,255);
}
i{
font-size: 2.5rem;
cursor: pointer;
width: 4rem;
height: 4rem;
display: flex;
align-items: center;
justify-content: center;
&.active{
border: 1px solid;
border-radius: .4rem;
}
}
&.spread{
transform: translate(-50%,0);
}
}
.exportCanvasBox_center_box{
padding: 3rem;
height: 100%;
flex: 1;
position: relative;
overflow: hidden;
width: 100%;
background: #e6e6e6;
&:hover{
cursor: none;
}
.editFrontBack_pencilbtn{
position: absolute;
z-index: 1;
border-radius: 50%;
border: 1px solid #000;
pointer-events: none;
transform: translate(-50%,-50%);
}
}
.exportCanvasBox_center{
margin: 0 auto;
overflow: hidden;
height: 100%;
position: relative;
// overflow: scroll;
:deep(.canvas-container){
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
opacity: .5;
// background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC);
}
.editFrontBack_bgImg{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
img{
height: 100%;
width: 100%;
}
}
}
.exportCanvasBox_center:hover{
.editFrontBack_center_btn{
transform: translate(-50%,-101%);
&.spread{
transform: translate(-50%,0);
}
}
}
}
</style>

View File

@@ -913,6 +913,7 @@ export default defineComponent({
margin-top: calc(1.5rem*1.2);
cursor: pointer;
position: relative;
.habit_workspace_show{
width: 100%;
z-index: 1;
@@ -1165,25 +1166,9 @@ export default defineComponent({
align-items: center;
justify-content: space-between;
font-size: calc(1.4rem*1.2);
> .anticon + span{
> .anticon + span{
max-width: 80%;
overflow: hidden;
}
}
</style>
<style>
.ant-tooltip{
z-index: 1049 !important;
}
.habit :deep(.ant-tooltip .ant-tooltip-inner) ,:deep(.ant-tooltip-arrow-content){
background: #000 !important;
}
.habit_mod{
background-color: #000 !important;
/* top: 0 !important; */
/* left: 0 !important; */
}
.ant-tooltip .ant-tooltip-inner ,.ant-tooltip-arrow-content{
background: #000 !important;
}
</style>

View File

@@ -1,141 +0,0 @@
<template>
<a-modal class="oldHsitory_detail_modal_component"
v-model:visible="hsitoryDetailShow"
:footer="null"
:title="collectionName"
width="80%"
:maskClosable="false"
:keyboard="false"
:centered="true"
>
<template #closeIcon>
<div class="close_icon" @click.stop="changeDetailShow()"><span class="icon iconfont icon-guanbi"></span></div>
</template>
<!-- <div class="history_detail_content scroll_style">
<div class="history_img_block" v-for="img in groupDetails" :key="img">
<div class="history_img_item" >
<img class="element_img" :src="img.url">
</div>
</div>
</div> -->
<OldExportNewCoolection ref="OldExportNewCoolection"></OldExportNewCoolection>
</a-modal>
</template>
<script lang="ts">
import OldExportNewCoolection from "@/component/HomePage/OldExportNewCoolection.vue";
import { defineComponent, ref, nextTick } from 'vue'
export default defineComponent({
components: {
OldExportNewCoolection
},
props:{
groupDetails:{
default:{},
},
collectionName:{
default:''
}
},
setup() {
let hsitoryDetailShow = ref(false)
return{
hsitoryDetailShow
}
},
data(){
return{
}
},
methods:{
init(data:any){
this.hsitoryDetailShow = true
nextTick().then(()=>{
let OldExportNewCoolection:any = this.$refs.OldExportNewCoolection
OldExportNewCoolection.init(data)
})
},
changeDetailShow(){
this.hsitoryDetailShow = !this.hsitoryDetailShow
}
}
})
</script>
<style lang="less">
.oldHsitory_detail_modal_component{
.ant-modal-body{
overflow-y: initial !important;
overflow-x: auto;
}
.export_new_collection_review{
position: relative;
left: 50%;
transform: translateX(-50%) scale(2);
transform-origin: top center;
top: 0;
}
.ant-modal-close{
width: 3.6rem;
height: 3.6rem;
position: absolute;
top: -1.8rem;
right: -1.8rem;
}
.ant-modal-header{
background: #F7F7F7;
}
.ant-modal-body{
background: #F2F3FB;
height: 80vh;
min-height: 72rem;
overflow-y: hidden;
padding: 0;
}
.close_icon{
width: 3.6rem;
height: 3.6rem;
background: #000000;
border-radius: 50%;
line-height: 3.6rem;
text-align: center;
.icon-guanbi{
font-size: 2rem;
color: #ffffff;
}
}
.history_detail_content{
padding: 2.6rem 2.0rem 2.6rem 3.7rem;
height: 100%;
width: 100%;
overflow-y:auto;
background: #FFFFFF;
.history_img_block{
width: 16.5rem;
height: 16.5rem;
border: 0.1rem solid #343579;
margin: 0 1.7rem 1.7rem 0;
display: inline-block;
.history_img_item{
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
}
.element_img{
max-width: 100%;
max-height: 100%;
}
}
}
}
</style>

View File

@@ -3,12 +3,11 @@
<div class="designOpenrtion_centent" id="designOpenrtionCentent">
<div class="detail_modal_body_title">
<div class="detail_modal_body_nav">
<div v-for="item,index in designItemDetail?.clothes" v-show="item.id" :class="{active:item.clothesOpen}" @click="clothesOpen(index)">
<div v-for="item,index in designItemDetail?.clothes" v-show="item.id" :class="{active:item.clothesOpenItem}" @click="clothesOpen(index)">
<img :src="item?.path" alt="">
</div>
</div>
</div>
<div class="designOpenrtion_imgMask" :style="frontBack?.body?.style">
<!-- <div
v-for="item,index in frontBack.back"
@@ -19,19 +18,19 @@
@click="setpitch(item,index)" ref="content" >
<img crossOrigin="anonymous" :src="item.path" class="designOpenrtion_imgItme" draggable="false">
</div> -->
<div class="designOpenrtion_print" v-for="item,index in frontBack.back" @mousedown.stop="itemMoveMousedown(index,$event)" @click="setpitch(item,index)" :style="frontBack.front[index].style">
<div class="designOpenrtion_print" v-for="item,index in frontBack.back" @mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))" @click="setpitch(item,index)" :style="frontBack.front[index].style">
<img :style="item.imageUrl?'':'display:none;'" :src="item.imageUrl" alt="">
</div>
<img class="perview_img" :style="'width:'+ frontBack?.body?.layersObject?.[0].imageSize?.[0] +';height:' + frontBack?.body?.layersObject?.[0].imageSize?.[0] +';'" v-lazy="frontBack?.body?.layersObject?.[0].imageUrl || ''" :key="designItemDetail.designItemUrl">
<div class="detail_modal_item_front" v-for="item,index in frontBack.front" @mousedown.stop="itemMoveMousedown(index,$event)" @click="setpitch(item,index)" :style="item.style">
<div class="detail_modal_item_front" v-for="item,index in frontBack.front" @mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))" @click="setpitch(item,index)" :style="item.style">
<img :src="item.imageUrl" alt="">
</div>
<div class="designOpenrtion_btn">
<ul v-for="item,index in frontBack.front" :key="item" :class="{active:item.designOpenrtionBtn}" class="designOpenrtion_btn" :style="item.style" @mousedown.stop="itemMoveMousedown(index,$event)">
<li class="designOpenrtion_btn_top" @mousedown.stop="itemSizeMousedown('top',$event)"></li>
<li class="designOpenrtion_btn_bottom" @mousedown.stop="itemSizeMousedown('bottom',$event)"></li>
<li class="designOpenrtion_btn_left" @mousedown.stop="itemSizeMousedown('left',$event)"></li>
<li class="designOpenrtion_btn_right" @mousedown.stop="itemSizeMousedown('right',$event)"></li>
<div class="designOpenrtion_btn" v-if="!isBody">
<ul v-for="item,index in frontBack.front" :key="item" :class="{active:item.designOpenrtionBtn}" class="designOpenrtion_btn" :style="item.style" @mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))">
<li class="designOpenrtion_btn_top" @mousedown.stop="itemSizeMousedown('top',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('top',getMousePosition($event,true))"></li>
<li class="designOpenrtion_btn_bottom" @mousedown.stop="itemSizeMousedown('bottom',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('bottom',getMousePosition($event,true))"></li>
<li class="designOpenrtion_btn_left" @mousedown.stop="itemSizeMousedown('left',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('left',getMousePosition($event,true))"></li>
<li class="designOpenrtion_btn_right" @mousedown.stop="itemSizeMousedown('right',getMousePosition($event,false))" @touchstart.passive="itemSizeMousedown('right',getMousePosition($event,true))"></li>
<!-- <li class="designOpenrtion_rotote" v-rotote.stop="[index,item.transform]"></li> -->
</ul>
</div>
@@ -41,6 +40,9 @@
</div>
<div class="designOpenrtion_imgMask_open" @click.stop="deleteBorder"></div>
</div>
<!-- <div class="design_compile_content">
<editFrontBack :patchData="frontBack" :imgDomIndex="imgDomIndex" ref="editFrontBack"></editFrontBack>
</div> -->
</template>
@@ -50,8 +52,12 @@ import { defineComponent, h,createVNode, ref ,computed, inject,nextTick} from "v
import { useStore } from "vuex";
// import { Modal,message } from 'ant-design-vue';
import { Https } from "@/tool/https";
import editFrontBack from '@/component/Detail/editFrontBack.vue'
import { getMousePosition } from "@/tool/mdEvent";
export default defineComponent({
// props: ["frontBack"],
props: ["isBody"],
emits:['setParentLoadingShow','setDesignCoverage','setSubmit'],
components:{editFrontBack},
setup(prop) {
const store = useStore();
@@ -85,9 +91,10 @@ export default defineComponent({
]);
let direction = ref('')
let imgDom = ref()
let imgDomIndex = ref(2)
let imgDomIndex = ref(-1)
let frontBack = ref({})
let frontBackOld = ref({})
let editFrontBack = ref(null)
return {
designItemDetail,
current,
@@ -99,14 +106,20 @@ export default defineComponent({
frontBack,
setRevocation,
frontBackOld,
editFrontBack,
getMousePosition,
};
},
data() {
return {
loadingShow:false,//加载中
store: useStore(),
setImgSizeTimeout:null
};
},
mounted () {
window.addEventListener('resize', this.setImgSizeTime);
},
methods: {
init(){
let DesignParent = this.$parent
@@ -134,16 +147,30 @@ export default defineComponent({
})
this.setImgSize()
},
setImgSizeTime(){
clearTimeout(this.setImgSizeTimeout)
this.setImgSizeTimeout = setTimeout(()=>{
this.setImgSize()
},300)
},
async setImgSize(){
this.frontBack.body = null
let designItemDetail = JSON.parse(JSON.stringify(this.store.state.DesignDetailModule.designItemDetail))
let front = []
let back = []
let body
designItemDetail.others.forEach((item) => {
if(item.type == 'Body'){
let body = {}
if(designItemDetail.others.length > 0){
designItemDetail.others.forEach((item) => {
if(item.type == 'Body'){
body = item
}
});
}else{
designItemDetail.clothes.forEach((item) => {
body = item
}
});
});
}
let ratio = await this.setPostition(body.layersObject[0]?.imageUrl)
let frontIndex = 6
let backIndex = 3
@@ -167,11 +194,12 @@ export default defineComponent({
front[index] = v.layersObject[i]
front[index].style.zIndex = v.priority
front[index].id = v.id
front[index].undividedLayer = v.undividedLayer
}else{
back[index] = v.layersObject[i]
back[index].style.zIndex = v.priority
back[index].id = v.id
back[index].undividedLayer = v.undividedLayer
// back[index].style.zIndex = backIndex==0?v.layersObject[i]:backIndex++
}
if(this.printZIndex < v.priority){
@@ -180,12 +208,13 @@ export default defineComponent({
}
this.printZIndex++
})
let bodyImgWH = document.getElementsByClassName("design_compile_content")[0].getElementsByClassName("perview_img")[0]
body.style = {
width:body.layersObject[0].imageSize?.[0]*ratio+'px',
height:body.layersObject[0].imageSize?.[1]*ratio+'px',
if(body){
body.style = {
width:body.layersObject[0].imageSize?.[0]*ratio+'px',
height:body.layersObject[0].imageSize?.[1]*ratio+'px',
}
}
this.frontBack = {
front:front,
back:back,
@@ -218,6 +247,12 @@ export default defineComponent({
}
return num
},
clear(){
this.imgDomIndex = -1
this.clothesOpenActive(-1)
if(this.editFrontBack)this.editFrontBack.setClone()
window.removeEventListener('resize', this.setImgSizeTime);
},
setpitch(item,index){
this.frontBack.front.forEach((v)=>{
v.designOpenrtionBtn = false
@@ -244,8 +279,12 @@ export default defineComponent({
let top = Number(this.frontBack.front[index].style.top.replace(/px/g,''))
this.frontBack.front[index].centers.left = imgDomWH.x+event.offsetX-left
this.frontBack.front[index].centers.top = imgDomWH.y+event.offsetY-top
document.addEventListener("mouseup", this.mouseup);
document.addEventListener("mousemove", this.moveMousemove);
// document.addEventListener("mouseup", this.mouseup);
// document.addEventListener("mousemove", this.moveMousemove);
document.addEventListener('mousemove', this.mouseMove);
document.addEventListener('touchmove', this.touchmove);
document.addEventListener('mouseup', this.mouseup);
document.addEventListener('touchend', this.mouseup);
},
//设置尺寸
itemSizeMousedown(direction,event){
@@ -262,15 +301,25 @@ export default defineComponent({
this.frontBack.front[this.imgDomIndex].centers.top = imgDomWH.y+event.offsetY+imgDomWH.height-li
}
document.addEventListener("mouseup", this.sizeMouseup);
document.addEventListener("mousemove", this.sizeMousemove);
document.addEventListener('mousemove', this.sizeMouseMove);
document.addEventListener('touchmove', this.sizeTouchmove);
document.addEventListener('mouseup', this.sizeMouseup);
document.addEventListener('touchend', this.sizeMouseup);
},
mouseMove(event){
let e = getMousePosition(event,false)
this.mouseMoveOperation(e)
},
touchmove(event){
let e = getMousePosition(event,true)
this.mouseMoveOperation(e)
},
//鼠标移动
moveMousemove(e) {
mouseMoveOperation(e) {
let imgDomWH = this.imgDom.getBoundingClientRect()
let parentNode = document.getElementsByClassName('design_compile_content')[0].getElementsByClassName("designOpenrtion_imgMask")[0].getBoundingClientRect()
let x = (e.x - this.frontBack.front[this.imgDomIndex].centers.left)+'px'
let y = ( e.y - this.frontBack.front[this.imgDomIndex].centers.top)+'px'
let x = (e.clientX - this.frontBack.front[this.imgDomIndex].centers.left)+'px'
let y = ( e.clientY - this.frontBack.front[this.imgDomIndex].centers.top)+'px'
this.frontBack.front[this.imgDomIndex].style.left = x
this.frontBack.front[this.imgDomIndex].style.top = y
// if(x.replace(/px/g,'') >= parentNode.width - imgDomWH.width){
@@ -286,8 +335,15 @@ export default defineComponent({
// this.frontBack.front[this.imgDomIndex].style.top = 0+'px'
// }
},
sizeMousemove(e) {
sizeMouseMove(event){
let e = getMousePosition(event,false)
this.sizeMouseMoveOperation(e)
},
sizeTouchmove(event){
let e = getMousePosition(event,true)
this.sizeMouseMoveOperation(e)
},
sizeMouseMoveOperation(e) {
let imgDomWH = this.imgDom.getBoundingClientRect()
let parentNode =this.imgDom.parentNode
let width = imgDomWH.width
@@ -296,8 +352,8 @@ export default defineComponent({
let num = height/width
//判断移动四个边
if(this.direction == 'right'){
w = (e.x - this.frontBack.front[this.imgDomIndex].centers.left)
h = (e.x - this.frontBack.front[this.imgDomIndex].centers.left)*num
w = (e.clientX - this.frontBack.front[this.imgDomIndex].centers.left)
h = (e.clientX - this.frontBack.front[this.imgDomIndex].centers.left)*num
width = w+'px'
// height = w*num+'px'
}else if(this.direction == 'top'){
@@ -305,20 +361,20 @@ export default defineComponent({
this.frontBack.front[this.imgDomIndex].style.top = 'auto'
// this.printStyleList[this.imgDomIndex].style.left = 'auto'
this.frontBack.front[this.imgDomIndex].style.bottom = parentNode.offsetHeight -imgDomWH.height - this.imgDom.offsetTop+'px'
w = (e.x - this.frontBack.front[this.imgDomIndex].centers.left)*num
h = (this.frontBack.front[this.imgDomIndex].centers.top - e.y)
w = (e.clientX - this.frontBack.front[this.imgDomIndex].centers.left)*num
h = (this.frontBack.front[this.imgDomIndex].centers.top - e.clientY)
height = h+'px'
// width = h*num+'px'
}else if(this.direction == 'bottom'){
num = width/height
h = (e.y - this.frontBack.front[this.imgDomIndex].centers.top)
h = (e.clientY - this.frontBack.front[this.imgDomIndex].centers.top)
height = h+'px'
// width = h*num+'px'
}else if(this.direction == 'left'){
this.frontBack.front[this.imgDomIndex].style.left = 'auto'
this.frontBack.front[this.imgDomIndex].style.right = parentNode.offsetWidth -imgDomWH.width - this.imgDom.offsetLeft+'px'
w = (this.frontBack.front[this.imgDomIndex].centers.left - e.x)
w = (this.frontBack.front[this.imgDomIndex].centers.left - e.clientX)
width = w+'px'
// height = w*num+'px'
@@ -340,13 +396,19 @@ export default defineComponent({
zIndex:this.printZIndex
}
this.frontBack.back[this.imgDomIndex].style.zIndex = this.printZIndex
document.removeEventListener("mouseup", this.sizeMouseup);
document.removeEventListener("mousemove", this.sizeMousemove);
document.removeEventListener('mousemove',this.sizeMouseMove)
document.removeEventListener('touchmove',this.sizeTouchmove)
document.removeEventListener('mouseup',this.sizeMouseup)
document.removeEventListener('touchend',this.sizeMouseup)
},
mouseup(e) {
document.removeEventListener("mouseup", this.mouseup);
document.removeEventListener("mousemove", this.moveMousemove);
// document.removeEventListener("mouseup", this.mouseup);
// document.removeEventListener("mousemove", this.moveMousemove);
document.removeEventListener('mousemove',this.mouseMove)
document.removeEventListener('touchmove',this.touchmove)
document.removeEventListener('mouseup',this.mouseup)
document.removeEventListener('touchend',this.mouseup)
},
clearModal(){
this.printZIndex = 2//点击图片z-index
@@ -372,9 +434,11 @@ export default defineComponent({
},
clothesOpenActive(index){
this.designItemDetail.clothes.forEach((item)=>{
item.clothesOpen = false
item.clothesOpenItem = false
})
this.designItemDetail.clothes[index].clothesOpen = true
if(index != -1){
this.designItemDetail.clothes[index].clothesOpenItem = true
}
},
sort(arr){
arr.sort((a, b) => {
@@ -393,15 +457,14 @@ export default defineComponent({
// return a_num - b_num;
// });
let arr = this.sort(JSON.parse(JSON.stringify(this.frontBack.front)))
let num = 10
arr.forEach((item)=>{
item.priority = num++
item.similarity = false//新增衣服传的是衣服id会存在两件衣服id相同所以设置为false让每次赋值都是不一样的
})
let front = arr
let imageCategory1
data.designSingleItemDTOList.forEach((item)=>{
let front = arr
let imageCategory1
if(arr.length > 1){
imageCategory1 = arr[1].imageCategory
}
@@ -416,6 +479,7 @@ export default defineComponent({
let top = y == 0 ? item.offset[1]:y+item.offset[1]
let left = x == 0 ? item.offset[0]:x+item.offset[0]
item.offset = [left,top]
item.maskUrl = arr[index].maskUrl
item.priority = arr[index].priority
arr[index].similarity = true
// item.offset = [(arr[index]?.style?.left.replace(/px/g,'')*ratio).toFixed(0),(i?.style?.top.replace(/px/g,'')*ratio).toFixed(0)]
@@ -426,7 +490,6 @@ export default defineComponent({
item.scale = front?.imageSize?Number(((front?.style?.width.replace(/px/g,'')*ratio)/front?.imageSize[0]).toFixed(2)):1
}
})
// return
Https.axiosPost(Https.httpUrls.designSingle, data).then(
(rv) => {
// this.$parent.loadingShow = false
@@ -472,6 +535,7 @@ export default defineComponent({
this.$emit('setDesignCoverage');
this.store.commit("setDesignItemDetail", designItemDetail);
this.setRevocation(designItemDetail,data)
this.clear()
}
).catch(res=>{
// this.$parent.loadingShow = false
@@ -485,8 +549,12 @@ export default defineComponent({
<style lang="less" scoped>
.designOpenrtion_modal {
// max-width: 1440px;
user-select: none; /* 对现代浏览器有效 */
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
.ant-modal-body{
padding: calc(4rem*1.2) calc(5rem*1.2) calc(0rem*1.2)!important;
padding: calc(5rem*1.2) calc(6rem*1.2) calc(0rem*1.2)!important;
// height: calc(65vh - 6.4rem*1.2));
height: calc(65rem*1.2);
display: flex;
@@ -505,19 +573,21 @@ export default defineComponent({
flex-direction: column;
height: 100%;
width: 100%;
width: 50%;
position: relative;
overflow: hidden;
.designOpenrtion_centent{
flex: 1;
// flex: 1;
height: 100%;
display: flex;
flex-direction: column;
align-content: space-around;
flex-wrap: nowrap;
margin: 0 auto;
overflow: hidden;
// overflow: hidden;
justify-content: space-between;
position: relative;
user-select:none;
z-index: 2;
position: relative;
&.active{
flex-direction: row;
}
@@ -525,8 +595,8 @@ export default defineComponent({
width: auto;
height: auto;
position: relative;
height: 100%;
overflow: hidden;
height: calc(100% - 1.2rem - 4.8rem - 20%);
// overflow: hidden;
>img{
z-index: 2;
position: relative;
@@ -611,8 +681,8 @@ export default defineComponent({
li{
cursor: pointer;
// border-radius: 50%;
width: calc(1rem*1.2);
height: calc(1rem*1.2);
width: calc(2rem*1.2);
height: calc(2rem*1.2);
background-color: rgb(20, 188, 255);
position: absolute;
pointer-events: none;

View File

@@ -296,73 +296,6 @@ export default defineComponent({
init(){
this.setImgSize()
},
// async setImgSize(){
// let designItemDetail = JSON.parse(JSON.stringify(this.store.state.DesignDetailModule.designItemDetail))
// let front = []
// let back = []
// let body
// designItemDetail.others.forEach((item) => {
// if(item.type == 'Body'){
// body = item
// }
// });
// let ratio = await this.setPostition(body.layersObject[0]?.imageUrl)
// let frontIndex = 6
// let backIndex = 3
// // let front = 3
// // let back = 3
// designItemDetail.clothes.forEach((v,index)=>{
// for (let i = v.layersObject.length-1; i >= 0; i--) {
// v.layersObject[i].style = {
// top:v.layersObject[i].position?.[0]*ratio+'px',
// left:v.layersObject[i].position?.[1]*ratio+'px',
// width:v.layersObject[i].imageSize?.[0]*ratio+'px',
// height:v.layersObject[i].imageSize?.[1]*ratio+'px',
// // zIndex:zIndex-=1
// }
// v.layersObject[i].centers={
// left:0,
// top:0,
// }
// v.scale = ratio
// v.layersObject[i].designOpenrtionBtn = false
// if(v.layersObject[i].imageCategory.indexOf("back") == -1){
// front[index] = v.layersObject[i]
// front[index].style.zIndex = v.priority
// front[index].id = v.id
// }else{
// back[index] = v.layersObject[i]
// back[index].style.zIndex = v.priority
// back[index].id = v.id
// // back[index].style.zIndex = backIndex==0?v.layersObject[i]:backIndex++
// }
// if(this.printZIndex < v.priority){
// this.printZIndex = v.priority
// }
// }
// this.printZIndex++
// })
// let bodyImgWH = document.getElementsByClassName("design_compile_content")[0].getElementsByClassName("perview_img")[0]
// body.style = {
// width:body.layersObject[0].imageSize?.[0]*ratio+'px',
// height:body.layersObject[0].imageSize?.[1]*ratio+'px',
// }
// this.frontBack = {
// front:front,
// back:back,
// body:body,
// }
// this.frontBackOld = JSON.parse(JSON.stringify({
// front:front,
// back:back,
// body:body,
// }))
// this.setCanvas(this.frontBack)
// },
//按比设置单件衣服宽高位置
async setPostition(url){
@@ -485,7 +418,7 @@ export default defineComponent({
.designOpenrtion_modal {
// max-width: 1440px;
.ant-modal-body{
padding: calc(4rem*1.2) calc(5rem*1.2) calc(0rem*1.2)!important;
padding: calc(5rem*1.2) calc(6rem*1.2) calc(0rem*1.2)!important;
// height: calc(65vh - 6.4rem*1.2));
height: calc(65rem*1.2);
display: flex;

View File

@@ -25,10 +25,10 @@
</div>
<div class="designOpenrtion_btn">
<ul v-for="item,index in frontBack.front" :key="item" :class="{active:item.designOpenrtionBtn}" class="designOpenrtion_btn" :style="item.style" @touchstart.passive="itemMoveMousedown(index,$event)">
<li class="designOpenrtion_btn_top" @touchstart.stop="itemSizeMousedown('top',$event)"></li>
<li class="designOpenrtion_btn_bottom" @touchstart.stop="itemSizeMousedown('bottom',$event)"></li>
<li class="designOpenrtion_btn_left" @touchstart.stop="itemSizeMousedown('left',$event)"></li>
<li class="designOpenrtion_btn_right" @touchstart.stop="itemSizeMousedown('right',$event)"></li>
<li class="designOpenrtion_btn_top" @touchstart.passive="itemSizeMousedown('top',$event)"></li>
<li class="designOpenrtion_btn_bottom" @touchstart.passive="itemSizeMousedown('bottom',$event)"></li>
<li class="designOpenrtion_btn_left" @touchstart.passive="itemSizeMousedown('left',$event)"></li>
<li class="designOpenrtion_btn_right" @touchstart.passive="itemSizeMousedown('right',$event)"></li>
<!-- <li class="designOpenrtion_rotote" v-rotote.stop="[index,item.transform]"></li> -->
</ul>
</div>
@@ -47,6 +47,7 @@ import { useStore } from "vuex";
import { Https } from "@/tool/https";
export default defineComponent({
// props: ["frontBack"],
emits:['setParentLoadingShow','setDesignCoverage','setSubmit'],
setup(prop) {
const store = useStore();
@@ -100,8 +101,12 @@ export default defineComponent({
return {
loadingShow:false,//加载中
store: useStore(),
setImgSizeTimeout:null
};
},
mounted () {
window.addEventListener('resize', this.setImgSizeTime);
},
methods: {
init(){
let DesignParent = this.$parent
@@ -129,7 +134,14 @@ export default defineComponent({
})
this.setImgSize()
},
setImgSizeTime(){
clearTimeout(this.setImgSizeTimeout)
this.setImgSizeTimeout = setTimeout(()=>{
this.setImgSize()
},300)
},
async setImgSize(){
this.frontBack.body = null
let designItemDetail = JSON.parse(JSON.stringify(this.store.state.DesignDetailModule.designItemDetail))
let front = []
let back = []
@@ -214,6 +226,9 @@ export default defineComponent({
}
return num
},
clear(){
window.removeEventListener('resize', this.setImgSizeTime);
},
setpitch(item,index){
this.frontBack.front.forEach((v)=>{
v.designOpenrtionBtn = false
@@ -439,6 +454,7 @@ export default defineComponent({
this.$emit('setDesignCoverage');
this.store.commit("setDesignItemDetail", designItemDetail);
this.setRevocation(designItemDetail,data)
this.clear()
}
).catch(res=>{
this.$emit('setParentLoadingShow');
@@ -457,7 +473,7 @@ export default defineComponent({
-khtml-user-select: none;
user-select: none;
.ant-modal-body{
padding: calc(4rem*1.2) calc(5rem*1.2) calc(0rem*1.2)!important;
padding: calc(5rem*1.2) calc(6rem*1.2) calc(0rem*1.2)!important;
// height: calc(65vh - 6.calc(4rem*1.2));
height: calc(65rem*1.2);
display: flex;
@@ -477,13 +493,14 @@ export default defineComponent({
height: 100%;
width: 100%;
.designOpenrtion_centent{
flex: 1;
// flex: 1;
height: 100%;
display: flex;
flex-direction: column;
align-content: space-around;
flex-wrap: nowrap;
margin: 0 auto;
overflow: hidden;
// overflow: hidden;
justify-content: space-between;
position: relative;
user-select:none;
@@ -496,8 +513,9 @@ export default defineComponent({
width: auto;
height: auto;
position: relative;
height: 100%;
overflow: hidden;
// height: 100%;
// overflow: hidden;
height: calc(100% - 1.2rem - 4.8rem - 20%);
margin: 0 auto;
>img{
z-index: 2;

View File

@@ -29,8 +29,10 @@
:outputSize="option.size"
:outputType="option.outputType"
:auto-crop="option.autoCrop"
:fixedBox="!isRound"
:fixed="isRound"
:auto-crop-width="option.autoCropWidth"
:auto-crop-height="option.autoCropHeight"
:auto-crop-height="option.autoCropWidth"
:center-box="option.centerBox"
:can-move="option.canMove" :can-move-box="option.canMoveBox"
@real-time="realTime"
@@ -39,8 +41,8 @@
<div class="cur_picture_opterate">
<div class="cur_picture_opterate_item" @click="rotateLeft()"><span class="icon iconfont icon-chexiao operate_icon"></span></div>
<div class="cur_picture_opterate_item" @click="rotateRight()"><span class="icon iconfont icon-chexiao operate_icon icon_chexiao_sec"></span></div>
<div class="cur_picture_opterate_item" @click="changeScale(-1)"><span class="operate_icon icon_font">-</span></div>
<div class="cur_picture_opterate_item" @click="changeScale(1)"><span class="operate_icon icon_font">+</span></div>
<div class="cur_picture_opterate_item" @click="changeScale(-.1)"><span class="operate_icon icon_font">-</span></div>
<div class="cur_picture_opterate_item" @click="changeScale(.1)"><span class="operate_icon icon_font">+</span></div>
<div class="cur_picture_opterate_item" @click="refreshCrop()"><span class="icon iconfont icon-shuaxin operate_icon"></span></div>
</div>
</div>
@@ -51,8 +53,8 @@
</div>
<div class="cut_picture_review_block">
<div class="cut_picture_review_item">
<div class="cut_picture_review_content" :style="{'width': previews.w + 'px', 'height': previews.h + 'px', 'overflow': 'hidden'}">
<div :style="previews.div" >
<div class="cut_picture_review_content" :class="{active:isRound}" :style="{'width': previews.w + 'px', 'height': previews.h + 'px', 'overflow': 'hidden'}">
<div :style="previews.div">
<img class="previews_image" :style="previews.img" :src="previews.url">
</div>
</div>
@@ -76,17 +78,14 @@ import { VueCropper } from "vue-cropper";
// import { openGuide,driverObj__ } from "@/tool/guide";
import {base64toFile} from '@/tool/util'
export default defineComponent({
props:['cropperFileData','isUpload'],
props:['cropperFileData','isUpload','isRound'],
components:{
VueCropper,
},
setup(){
let driver__:any = inject('driver__')
return {
driver__
}
},
data(){
data(prop){
return {
cutPicuterModal:false,
option: {
@@ -97,16 +96,19 @@ export default defineComponent({
outputType: 'png',
autoCrop: true,
// 只有自动截图开启 宽度高度才生效
autoCropWidth: 360,
autoCropHeight: 360,
autoCropWidth: prop.isRound?100:360,
autoCropHeight: prop.isRound?100:360,
max: 99999,
centerBox:true,
canMove:true,
canMoveBox:true,
fixedBox:false,
},
previews:{},
}
},
mounted(){
},
methods:{
rotateLeft() {
@@ -147,7 +149,7 @@ export default defineComponent({
cropper.getCropData((data:any) => {
// 转换为File对象
let file = base64toFile(data,this.cropperFileData.name);
this.$emit('handleCropperSuccess',{file:file, fileData:this.cropperFileData})
this.$emit('handleCropperSuccess',{file:file, fileData:this.cropperFileData,base64:data})
})
},
@@ -350,6 +352,10 @@ export default defineComponent({
background: rgba(91,94,105,0.8);
box-shadow: 0 calc(0.2rem*1.2) calc(0.5rem*1.2) 0 rgba(216,213,239,0.3);
border-radius: calc(1rem*1.2);
&.active{
border-radius: 50%;
overflow: hidden
}
}
.cut_picture_review_block_sec{

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
<template>
<div class="generate">
<div v-if="type_.type2 == 'Printboard' && scene.value == 'Pattern'" class="generate_checkbox" >
<div v-if="(type_.type2 == 'Printboard' && scene.value == 'Pattern')" class="generate_checkbox" >
<generalMenu :dataList="printModelList" @setprintModel="setprintModel" :item="printModel" :driver__="driver__.driver" :driverClass="{class1: 'Guide_1_2_4'}"></generalMenu>
<!-- <generalMenu :dataList="sceneList" @setprintModel="setSceneList" :item="scene"></generalMenu> -->
<!-- <div v-if="type_.type2 == 'Printboard'" class="printModel">
@@ -13,8 +13,8 @@
</div> -->
</div>
<div class="input_border" >
<div class="input_box Guide_1_5" :class="[inputShow?'active':'',type_.type2 =='Sketchboard'?'Guide_1_9_2':'']">
<div class="input_box_btnBox">
<div class="input_box Guide_1_5" :class="[inputShow?'active':'',type_.type2 =='Sketchboard'?'Guide_1_9_2':'',driver__.driver?'showEvents':'']">
<div class="input_box_btnBox" v-if="scene?.value != 'extract'">
<div class="upload_item">
<div
class="upload_file_item Guide_1_2_7"
@@ -39,13 +39,6 @@
</div>
</div>
</div>
<!-- <a-popover>
<template #content>
<p>Seed</p>
</template>
<input class="search_seed" max="9999" v-show="scene?.value == 'Logo'" @input="ifSeedValue" v-model="searchPictureSeed" type="Number" placeholder='Seed' min="0">
</a-popover> -->
<input
class="search_input"
@input="ifMaximumLength"
@@ -77,6 +70,53 @@
<i v-show="!isTextarea" class="fi fi-br-expand" @click.stop="setTextareaShow"></i>
<i v-show="isTextarea" class="fi fi-bs-compress" @click.stop="setTextareaShow"></i>
</div>
<div class="input_box_btnBox" v-else>
<div class="upload_item">
<div
class="upload_file_item"
v-for="(file, index) in sketchboardList"
:key="file"
:class="[driver__.driver?'showEvents':'']"
>
<div
class="upload_file_item_content"
v-show="file?.status === 'uploading'"
>
<a-spin size="small" :indicator="indicator" tip="Uploading..." />
</div>
<div
class="upload_file_item_content"
v-show="file?.status === 'done' || file?.base64"
>
<img :src="file?.imgUrl" class="upload_img" />
<div class="delete_like_file_block" :class="[driver__.driver?'hideEvents':'']">
<span class="icon iconfont icon-shanchu operate_icon" @click.stop="deleteFile(index)"></span>
</div>
</div>
</div>
</div>
<i class="fi fi-br-upload" style="margin-left: 2rem;" v-show="sketchboardList.length == 0" :title="$t('Generate.uploadproduct')">
<a-upload
class="search_upImg"
:capture="null"
:action="uploadUrl + '/api/element/upload'"
list-type="picture-card"
:data="{
...upload,
}"
:maxCount='1'
:headers="{ Authorization: token }"
v-model:file-list="sketchboardList"
:before-upload="beforeUpload"
accept=".jpg,.png,.jpeg,.bmp"
@change="(file) => fileUploadChange(file)"
>
</a-upload>
</i>
<div :title="$t('Generate.style')">
<generalMenu :dataList="printModelList" :isCanvas="type_.type2 == 'Sketchboard'" @setprintModel="setprintModel" :item="printModel"></generalMenu>
</div>
</div>
<textarea
v-show="isTextarea"
class="search_textarea "
@@ -86,10 +126,8 @@
@click.stop=""
v-model="searchPictureName"
></textarea>
<!-- <div class="generage_btn started_btn" @click.stop="getgenerate">{{ $t('Generate.Generate') }}</div> -->
<div v-show="!isGenerate" class="generage_btn started_btn" :class="{Guide_1_2_8:type_.type2 == 'Printboard'}" @click.stop="getgenerate">
{{ $t('Generate.Generate') }}
<!-- <div v-show="isGenerate"><a-spin size="large" /></div> -->
</div>
<div v-show="isGenerate && !remGenerate" class="generage_btn started_btn" :class="{Guide_1_2_8:type_.type2 == 'Printboard'}" @click="getgenerate">
<i class="fi fi-br-loading"></i>
@@ -108,38 +146,7 @@
</div>
</div>
</div>
<!-- <div v-if="type_.type2 == 'Sketchboard' || type_.type2 == 'Printboard'" class="generage_img Guide_1_6">
<div class="upload_item">
<div
class="upload_file_item Guide_1_2_7"
v-for="(file, index) in sketchboardList"
:key="file"
@click.stop="setSketchboardItem(file)"
:class="[file?.checked?'active':'',checkboxImage? 'forbidden':'',driver__.driver?'showEvents':'']"
>
<div
class="upload_file_item_content"
v-show="file?.status === 'uploading'"
>
<a-spin :indicator="indicator" tip="Uploading..." />
</div>
<div
class="upload_file_item_content"
v-show="file?.status === 'done'"
>
<img :src="file?.imgUrl" class="upload_img" />
<div
class="delete_file_block"
:class="[driver__.driver?'hideEvents':'']"
@click.stop="deleteFile(index)"
>
<span class="icon iconfont icon-shanchu"></span>
</div>
</div>
</div>
</div>
</div> -->
<div class="generage_img Guide_1_6" :class="{Guide_1_13_2:type_.type2 == 'Sketchboard',Guide_1_2_9:type_.type2 == 'Printboard'}" :style="[isGenerate?'overflow:hidden':'']">
<div class="generage_img Guide_1_6" :class="{Guide_1_13_2:type_.type2 == 'Sketchboard',Guide_1_2_9:type_.type2 == 'Printboard',showEvents : driver__.driver}" :style="[isGenerate?'overflow:hidden':'']">
<div
class="generage_img_item"
v-for="(item, index) in fileList"
@@ -163,8 +170,11 @@
<span class="icon iconfont icon-shanchu operate_icon"></span>
</div>
</div>
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
</div>
<scaleImage ref="scaleImage"></scaleImage>
<scaleImage ref="scaleImage" :isCanvas="type_.type2 == 'Sketchboard'" :workspace="workspace"></scaleImage>
<createSlogan ref="createSlogan" @setSloganData="setSloganData"></createSlogan>
</div>
</template>
@@ -196,26 +206,11 @@ export default defineComponent({
setup(props) {
// console.log(prop.msg);
let printModelList = ref([
{
num:'',
optype:false,
value:'Painting Style',
label:useI18n().t('Generate.Model1')
},{
num:'',
optype:false,
value:'Illustration Style',
label:useI18n().t('Generate.Model2')
},{
num:'',
optype:false,
value:'Real Style',
label:useI18n().t('Generate.Model3')
},
])
let printModel = ref({
let printModelList:any = ref([])
let sketchStyleList:any = ref([])
let printModel:any = ref({
num:'',
id:'',
optype:false,
value:'Painting Style',
label:useI18n().t('Generate.Model1')
@@ -240,12 +235,13 @@ export default defineComponent({
let isTest = ref()
let userInfo:any = {}
let generateTime:any = ref()
let generateProceedList = ref([])
let generateProceedList:any = ref([])
let remGenerate:any = ref(false)
let remGenerateTime:any = ref()
let styleRecommend:any = inject('styleRecommend')
let generateLevel2Type = ''
let isSloganHint:any = ref(' ')
let loadingShow =ref(false)
return {
searchPictureName,
searchPictureSeed,
@@ -255,6 +251,7 @@ export default defineComponent({
level2Type,
printModel,
printModelList,
sketchStyleList,
isGenerate,
// printBoards,
@@ -274,6 +271,7 @@ export default defineComponent({
styleRecommend,
generateLevel2Type,
isSloganHint,
loadingShow,
};
},
data(prop) {
@@ -319,6 +317,38 @@ export default defineComponent({
this.workspaceCom = computed(()=>{
return this.store?.state?.Workspace?.workspace
})
// if()
if(this.type_.type2 == 'Printboard'){
this.printModelList = [
{
num:'',
optype:false,
value:'Painting Style',
label:useI18n().t('Generate.Model1')
},{
num:'',
optype:false,
value:'Illustration Style',
label:useI18n().t('Generate.Model2')
},{
num:'',
optype:false,
value:'Real Style',
label:useI18n().t('Generate.Model3')
},
]
}else if(this.type_.type2 == 'Sketchboard'){
this.printModelList = JSON.parse(JSON.stringify(this.store.state.UserHabit.SketchStyle))
let imgList = ['/image/sketch/sketch-fine.jpg','/image/sketch/sketch-medium.jpg','/image/sketch/sketch-thick.jpg']
this.printModelList.forEach((item:any,index:number)=>{
item.img = imgList[index]
})
if(this.printModelList[3])this.printModelList[3].img = -1
}
this.printModel = this.printModelList[0]
},
watch:{
driver__:{
@@ -377,6 +407,7 @@ export default defineComponent({
methods: {
generageAdd(data: any) {
data.type_ = this.type_;
data.type_.type1 = data.designType?data.designType:this.type_.type1
data.resData = JSON.parse(JSON.stringify(data))
let maxImg = 8
if(this.type_.type2 == 'Sketchboard'){
@@ -410,7 +441,41 @@ export default defineComponent({
setprintModel(value:any){
this.printModel = value
},
imageToSketch(){
if((!this.printModel?.id && !this.printModel?.value) || !this.sketchboardList?.[0]?.id)return message.info(this.t('Generate.jsContent4'));
this.loadingShow = true
let data = {
"elementId": this.sketchboardList[0].id,
gender:this.workspace.sexEnum.value,
"style": this.printModel.value,
"styleImageId": this.printModel?.id?this.printModel?.id:''
}
Https.axiosPost(Https.httpUrls.imageToSketch, data).then((rv)=>{
if(rv){
this.sketchCatecoryList.forEach((itemCategory:any) => {
if(itemCategory.value == rv.category){
rv.categoryValue = itemCategory?.value
rv.category = itemCategory?.name
}
});
this.fileList.push({
imgUrl:rv.url,
categoryValue:rv.categoryValue,
category:rv.category,
id:rv.id,
status:'Success',
})
this.loadingShow = false
}
}).catch(()=>{
this.loadingShow = false
})
},
getgenerate(){
if(this.scene?.value == 'extract'){
this.imageToSketch()
return
}
this.isTextarea = false
this.isInputFocus = false
if(this.isGenerate)return
@@ -789,7 +854,7 @@ export default defineComponent({
},
});
</script>
<style lang="less">
<style lang="less" scoped>
.generate {
flex: 1;
// height: 30rem;
@@ -844,7 +909,6 @@ export default defineComponent({
border-radius: calc(1rem*1.2);
img {
transform: scale(0.9);
object-fit: contain;
}
.delete_like_file_block{
pointer-events:none;
@@ -856,6 +920,7 @@ export default defineComponent({
img {
width: calc(10rem*1.2);
height: calc(10rem*1.2);
object-fit: contain;
}
&:hover .delete_like_file_block{
// display: block;

View File

@@ -263,7 +263,7 @@ export default defineComponent({
this.accountIsLogin(this.userInfo);
}
this.isHaveBindEmail = this.userInfo?.email ? true : false;
if(!isMurmur){
if(!this.isMurmur){
this.operateClick();
document.addEventListener("click", this.operateClick);
}

View File

@@ -266,7 +266,7 @@ export default defineComponent({
modelImg:{
mounted(el) {
let parentNode = el.parentNode
if(parentNode.offsetHeight > parentNode.offsetWidth){
if(parentNode.offsetHeight >= parentNode.offsetWidth){
el.style.height = 100+'%'
el.style.width = 'auto'
}else{
@@ -276,7 +276,7 @@ export default defineComponent({
},
updated (el) {
let parentNode = el.parentNode
if(parentNode.offsetHeight > parentNode.offsetWidth){
if(parentNode.offsetHeight >= parentNode.offsetWidth){
el.style.height = 100+'%'
el.style.width = 'auto'
}else{
@@ -406,6 +406,12 @@ export default defineComponent({
this.store.state.UploadFilesModule.allBoardData
.disposeMoodboard
)
);
let moodboardPosition = JSON.parse(
JSON.stringify(
this.store.state.UploadFilesModule.allBoardData
.moodboardPosition
)
);
let setboard = {
generate:[] as any,
@@ -425,18 +431,27 @@ export default defineComponent({
this.store.commit("setMoodboardMaterialFiles", setboard.material);
this.store.commit("setMoodboardFile", setboard.moodboard);
this.store.commit("setDisposeMoodboard", disposeMoodboard[0]);
this.store.commit("setDisposeMoodboardPosition",moodboardPosition);
this.fileList = setboard.moodboard
},
async changeTemplateModal() {
if(this.modalImg[0]?.id){
let layout:any = isMoible() ? this.$refs.layoutMobile : this.$refs.layout
// layout.init('moodboard')
// let layout:any = isMoible() ? this.$refs.layoutMobile : this.$refs.layout
let layout:any = this.$refs.layout
if(this.layoutList.length <= 0){
await this.layout()
let styleObj = this.store.state.UploadFilesModule.moodboardPosition
if(!styleObj.domStyle)await this.layout()
//
let arr = JSON.parse(JSON.stringify(this.store.state.UploadFilesModule.moodboard))
this.layoutList = arr
}
// let arr = JSON.parse(JSON.stringify(this.store.state.UploadFilesModule.moodboard))
// this.layoutList = arr
if(window.screen.width<1300){
layout.isMobile = true
}else{
layout.isMobile = false
}
layout.init()
}else{
message.info(this.t('MoodboardUpload.jsContent5'))
@@ -445,65 +460,81 @@ export default defineComponent({
},
async layout(){
if(this.loadingShow)return
this.loadingShow = true
this.store.commit("setDisposeMoodboard", []);
let arr = JSON.parse(JSON.stringify(this.store.state.UploadFilesModule.moodboard))
this.layoutList = arr
var random = Math.round(Math.random()*(this.moodb_[arr.length-1].length-1))
let moodb = this.moodb_[arr.length-1][random]
if( moodb.filter((item,index)=> item == 'w2h1').length != 0 && arr.length > 4){
this.flex_direction = true
}else{
this.flex_direction = false
}
if(this.moodb_[arr.length-1].length != 1){
if(JSON.stringify(this.moodb_className) == JSON.stringify(this.moodb_[arr.length-1][random])){
this.loadingShow = false
this.layout()
return
await new Promise((resolve, reject) => {
this.loadingShow = true
this.store.commit("setDisposeMoodboard", []);
let arr = JSON.parse(JSON.stringify(this.store.state.UploadFilesModule.moodboard))
this.layoutList = arr
var random = Math.round(Math.random()*(this.moodb_[arr.length-1].length-1))
let moodb = this.moodb_[arr.length-1][random]
if( moodb.filter((item,index)=> item == 'w2h1').length != 0 && arr.length > 4){
this.flex_direction = true
}else{
this.flex_direction = false
}
}
this.edieShow = true
if(this.moodb_[arr.length-1].length == 2){
this.moodb_className = this.moodb_[arr.length-1][0]
}else{
this.moodb_className = this.moodb_[arr.length-1][random]
}
this.layoutOpen = true
//提交模板
// this.loadingShow = true
this.layoutList.forEach((v:any)=>{
v.setPitch = false
})
nextTick().then(()=>{
let layoutCentent = document.getElementById('modal_img')
domTurnImg(layoutCentent).then((rv)=>{
let file = rv
let param = new FormData();
param.append('inPin','0')
param.append('level1Type','Moodboard')
param.append('gender','')
param.append('timeZone',Intl.DateTimeFormat().resolvedOptions().timeZone)
param.append('file',file);
let config:any = {headers:{'Content-Type':'multipart/form-data','Accept':'*/*' }}
Https.axiosPost(Https.httpUrls.elementUpload,param,config)
.then((rv: any) => {
let img:any = rv
img.imgUrl = rv.url
img.resData = JSON.parse(JSON.stringify(img))
this.store.commit("setDisposeMoodboard", img);
this.loadingShow = false
}
).catch(rv=>{
if(this.moodb_[arr.length-1].length != 1){
if(JSON.stringify(this.moodb_className) == JSON.stringify(this.moodb_[arr.length-1][random])){
this.loadingShow = false
})
if(this.driver__.driver){
driverObj__.moveNext()
this.layout()
return resolve('')
}
}
this.edieShow = true
if(this.moodb_[arr.length-1].length == 2){
this.moodb_className = this.moodb_[arr.length-1][0]
}else{
this.moodb_className = this.moodb_[arr.length-1][random]
}
this.layoutOpen = true
//提交模板
// this.loadingShow = true
this.layoutList.forEach((v:any)=>{
v.setPitch = false
})
})
nextTick().then(()=>{
let layoutCentent = document.getElementById('modal_img')
let obj = {
imgStyle:[],
domStyle:[],
borStyle:[],
rototeStyle:[],
translateStyle:[],
angleTRStyle:[],
angleTLStyle:[],
angleBRStyle:[],
angleBLStyle:[],
class:this.moodb_className,
}
this.store.commit("setDisposeMoodboardPosition", obj);
domTurnImg(layoutCentent).then((rv)=>{
let file = rv
let param = new FormData();
param.append('inPin','0')
param.append('level1Type','Moodboard')
param.append('gender','')
param.append('timeZone',Intl.DateTimeFormat().resolvedOptions().timeZone)
param.append('file',file);
let config:any = {headers:{'Content-Type':'multipart/form-data','Accept':'*/*' }}
Https.axiosPost(Https.httpUrls.elementUpload,param,config)
.then((rv: any) => {
let img:any = rv
img.imgUrl = rv.url
img.resData = JSON.parse(JSON.stringify(img))
this.store.commit("setDisposeMoodboard", img);
this.loadingShow = false
resolve('')
}
).catch(rv=>{
this.loadingShow = false
})
if(this.driver__.driver){
driverObj__.moveNext()
}
})
})
})
},
setmoodbClass(val:any){
this.moodb_className = val
@@ -521,6 +552,8 @@ export default defineComponent({
width: 47%;
display: flex;
flex-direction: column;
flex-shrink: 0;
width: 50%;
// width: 50rem*1.2);
.switch_type_list {
display: flex;
@@ -611,6 +644,7 @@ export default defineComponent({
margin-left: calc(3rem*1.2);
display: flex;
flex-direction: column;
overflow: hidden;
.modal_layout,.modal_accomplish{
.modal_text{
font-size:var(--aida-fsize1-4);

View File

@@ -1,190 +0,0 @@
<template>
<!-- 生成collention缩略图用的 -->
<div class="export_new_collection_review">
<div class="img_block_item" v-if="allBoardData?.moodTemplateId">
<MoodTemplate :fileList="allBoardData?.moodboardFiles" :moodTemplateId="allBoardData?.moodTemplateId"></MoodTemplate>
</div>
<div class="img_block_item" v-else>
<div class="lager_img_item" v-for="(mood) in allBoardData.moodboardFiles" :key="mood">
<div class="all_img_item_block">
<img class="all_img_content cover_img" :src="mood.imgUrl" >
</div>
</div>
</div>
<div class="img_block_item">
<div class="small_img_item" v-for="(print) in allBoardData.printboardFiles" :key="print">
<div class="all_img_item_block">
<img class="all_img_content cover_img" :src="print.imgUrl">
</div>
</div>
<div class="small_img_item" v-for="(generate) in allBoardData.generatePrintFiles" :key="generate">
<div class="all_img_item_block">
<img class="all_img_content cover_img" :src="generate.imgUrl">
</div>
</div>
</div>
<div class="img_block_item">
<div class="color_item" v-for="(color) in allBoardData.colorBoards" :key="color">
<div class="color_content" :style="{background:`rgb(${color?.rgbValue?.r},${color?.rgbValue?.g},${color?.rgbValue?.b})`}"></div>
<div class="color_content_body">
<div class="color_des">{{color.tcx}}</div>
<div class="color_des">{{color.name}}</div>
</div>
</div>
</div>
<div class="img_block_item">
<div class="lager_img_item" v-for="(skecth) in allBoardData.skecthboardFiles" :key="skecth">
<div class="all_img_item_block">
<img class="all_img_content" :src="skecth.imgUrl">
</div>
</div>
</div>
<div class="img_block_item">
<div class="lager_img_item" v-for="(marketing) in allBoardData.marketingSketchFiles" :key="marketing">
<div class="all_img_item_block">
<img class="all_img_content" :src="marketing.imgUrl">
</div>
</div>
</div>
<div class="img_block_item">
<div class="lager_img_item" v-for="(design) in allBoardData.likeDesignCollectionList" :key="design.designItemUrl">
<div class="all_img_item_block">
<img class="all_img_content" :src="design.designItemUrl">
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { computed, defineComponent, ref } from 'vue'
import MoodTemplate from '@/component/HomePage/MoodTemplate.vue'
import { useStore } from "vuex";
export default defineComponent({
// props: {
// allBoardData: {
// // default: false,
// },
// },
components:{MoodTemplate},
setup() {
const allBoardData = ref({});
// let allBoardData:any = computed(()=>{return store.state.UploadFilesModule.allBoardData})
// let likeDesignCollectionList : any = computed(()=>{return store.state.HomeStoreModule.likeDesignCollectionList})
return {
allBoardData,
// likeDesignCollectionList,
}
},
mounted () {
},
methods:{
init(data:any){
this.allBoardData = data
}
}
})
</script>
<style lang="less" scoped>
.export_new_collection_review{
width: 40.8rem;
background: #fff;
position: fixed;
left: -100rem;
top: 0;
.img_block_item{
margin-bottom: 2rem;
// &.color_block_item{
// padding: 0 0.5rem 0 0.3rem;
// }
.lager_img_item{
display: inline-block;
width: 20.4rem;
height: 20.4rem;
vertical-align: top;
}
.sketch_img_item{
display: inline-block;
width: 20.4rem;
height: 42.2rem;
vertical-align: top;
}
.small_img_item{
width: 6.8rem;
height: 6.8rem;
display: inline-block;
vertical-align: top;
}
.color_item{
display: inline-block;
vertical-align: top;
// padding: 0 0.5rem;
margin-right: 1.6rem;
margin-bottom: 0.5rem;
&:nth-child(4n){
margin-right: 0;
}
}
.color_content{
width: 9rem;
height:6.2rem
}
.color_content_body{
width: 9rem;
padding: 0.7rem 0.2rem;
background: #FEFEFE;
border: 1px solid #E6E6E6;
.color_des{
font-size: 1rem;
font-family: Roboto;
font-weight: 500;
color: #000000;
margin-bottom: 0.5rem;
line-height: 1.3rem;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
&:last-child{
margin-bottom: 0;
}
}
}
.all_img_item_block{
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
.all_img_content{
max-height: 100%;
max-width: 100%;
&.cover_img{
width: 100%;
height: 100%;
}
}
}
}
}
</style>

View File

@@ -28,7 +28,7 @@
</div>
<div v-show="openClick == 3" class="generalMenu_printModel printMenu">
<div @click.stop="openPrintModel">{{ scene.name }} <i class="icon iconfont icon-xiala" :class="{forbidden:openMenu}"></i></div>
<div @click.stop="openPrintModel"><span>{{ scene.name }}</span> <i class="icon iconfont icon-xiala" :class="{forbidden:openMenu}"></i></div>
<ul v-show="openMenu">
<li
v-for="item,index in printCatecoryList"
@@ -203,18 +203,6 @@ export default defineComponent({
designType:''
})
let workspace:any = ref({})
let sceneList = ref([
{
name:'Pattern',
value:'Pattern'
},{
name:'Slogan',
value:'Slogan'
},{
name:'Logo',
value:'Logo'
},
])
let scene = ref({
name:'Pattern',
value:'Pattern'
@@ -234,7 +222,6 @@ export default defineComponent({
userInfo,
useGenerate,
workspace,
sceneList,
scene,
openMenu,
printCatecoryList,
@@ -700,6 +687,8 @@ export default defineComponent({
.printMenu{
margin-right: 0;
margin-top: auto;
position: relative;
margin-left: 2rem;
>div{
width: 14rem;
font-size: var(--aida-fsize1-6);
@@ -707,6 +696,8 @@ export default defineComponent({
i{
transition: all .3s;
display: inline-block;
position: absolute;
right: 0;
}
.forbidden{
transform: rotate(180deg);
@@ -929,6 +920,9 @@ export default defineComponent({
position: relative;
cursor: pointer;
text-align: center;
&.modal_imgItem:nth-child(even) {
margin-right: 0;
}
img{
object-fit: cover;
height: 100%;

View File

@@ -23,6 +23,20 @@
>
<span>{{ $t('SketchboardUpload.Generate') }}</span>
</div>
<div v-show="openClick == 3" class="generalMenu_printModel printMenu">
<div @click.stop="openPrintModel"> <span>{{ scene.name }}</span>
<i class="icon iconfont icon-xiala" :class="{forbidden:openMenu}"></i></div>
<ul v-show="openMenu">
<li
v-for="item,index in sketchStyleList"
class="printModel_item"
@click.stop="setSceneList(item)"
:title="item.value == 'Pattern'?$t('PrintboardUpload.PatternTitle'):
item.value == 'Logo'?$t('PrintboardUpload.LogoTitle'):
item.value == 'Slogan'?$t('PrintboardUpload.SloganTitle'):''"
>{{ item.name }}</li>
</ul>
</div>
</div>
<div v-show="openClick == 1" class="sketchboard_body">
<div class="upload_img_body scroll_style">
@@ -113,6 +127,7 @@
v-show="openClick == 3"
ref="Generate"
msg="Sketchboard"
:scene="scene"
:sketchCatecoryList="sketchCatecoryList"
></Generate>
</div>
@@ -214,6 +229,15 @@ export default defineComponent({
level2Type:'',
designType:'',
})
let openMenu = ref(false)
let sketchStyleList:any = computed(()=>{
return store.state.UserHabit.SketchGenerateType
})
let scene = ref({
name: t('SketchboardUpload.GenerateSketch'),
value:'generate'
})
return {
fileList,
openClick,
@@ -227,6 +251,9 @@ export default defineComponent({
isTest,
userInfo,
useGenerate,
scene,
openMenu,
sketchStyleList,
};
},
data() {
@@ -549,6 +576,23 @@ export default defineComponent({
}
this.store.commit("setSketchboardFile", this.fileList);
},
setSceneList(data:any){
if(this.scene.value === data.value) return
this.scene = data
let generate:any = this.$refs.Generate
generate.sketchboardList = []
generate.searchPictureName = ''
this.openMenu = false
},
openPrintModel(){
if(this.openMenu)return
document.addEventListener('click',this.removePrintModel)
this.openMenu = true
},
removePrintModel(){
this.openMenu = false
document.removeEventListener('click',this.removePrintModel)
}
},
});
</script>
@@ -610,6 +654,30 @@ export default defineComponent({
margin-right: calc(0.8rem*1.2);
}
}
.printMenu{
margin-right: 0;
margin-left: 2rem;
margin-top: auto;
position: relative;
>div{
width: 14rem;
font-size: var(--aida-fsize1-6);
border: 0;
i{
transition: all .3s;
display: inline-block;
}
.forbidden{
transform: rotate(180deg);
}
}
ul{
width: 14rem;
}
}
.switch_type_item:nth-child(3){
margin: 0;
}
}
.sketchboard_body {
// height: calc(100% - 5rem*1.2));
@@ -822,6 +890,9 @@ export default defineComponent({
position: relative;
cursor: pointer;
text-align: center;
&.modal_imgItem:nth-child(even) {
margin-right: 0;
}
&:hover .delete_like_file_block{
display: block;
opacity: 1;

View File

@@ -66,6 +66,7 @@ import ColorboardUpload from '@/component/HomePage/ColorboardUpload.vue'
import SketchboardUpload from '@/component/HomePage/SketchboardUpload.vue'
import MarketingSketchUpload from '@/component/HomePage/MarketingSketchUpload.vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { rgbToHsv, dataURLtoBlob } from "@/tool/util";
import { Modal,message } from 'ant-design-vue';
import { Https } from "@/tool/https";
import {useStore} from 'vuex'
@@ -83,7 +84,13 @@ export default defineComponent({
SketchboardUpload,
MarketingSketchUpload
},
setup(){
props:{
getDesignData: {
type: Function,
required: true
}
},
setup(props){
const store = useStore()
let {t} = useI18n()
let driver__:any = computed(()=>{
@@ -285,9 +292,46 @@ export default defineComponent({
})
return bor
},
getPantongName() {
let colorBoards = this.store.state.UploadFilesModule.colorBoards;
let data: any = [];
for (let v of colorBoards) {
let color: any = [v.rgbValue.r, v.rgbValue.g, v.rgbValue.b];
let hsv = rgbToHsv(color);
v.hsv = hsv[0] + hsv[1] + hsv[2];
data.push({
h: hsv[0],
s: hsv[1],
v: hsv[2],
});
}
return new Promise((resolve: any, reject: any) => {
Https.axiosPost(Https.httpUrls.getRgbByHsvBatch, data)
.then((rv: any) => {
if (rv) {
rv.forEach((ele: any, index: number) => {
colorBoards[index].id = ele.id;
colorBoards[index].tcx = ele.tcx;
colorBoards[index].name = ele.name;
});
this.store.commit("setColorboardList", colorBoards);
resolve();
}
})
.catch((res) => {
reject();
});
});
},
//完成
async finishCollection(){
this.isShowMark = true
this.store.commit('clearAllId')
this.$emit('finishCollection')
await this.getPantongName()
this.store.commit("setAllBoardData");
let sketchList = this.store.state.UploadFilesModule.sketchboard
let arr:any = []
sketchList.forEach((item:any) => {
@@ -299,12 +343,14 @@ export default defineComponent({
}
arr.push(obj)
});
let data = {sketchBoards:arr}
// let data = {sketchBoards:arr}
let data = this.getDesignData(-1)
data.moodboardPosition = JSON.stringify(this.store.state.UploadFilesModule.moodboardPosition)
data.collectionId = this.store.state.HomeStoreModule.designCollectionId?this.store.state.HomeStoreModule.designCollectionId:null
if(!await this.isPinOpen(sketchList)){
this.isShowMark = false
return
}
let elList = document.querySelectorAll('.img_block_item_sketch img')
Https.axiosPost(Https.httpUrls.sketchBoardsBoundingBox, data)
.then((rv: any) => {
@@ -314,7 +360,6 @@ export default defineComponent({
GO.id = 0
this.showCollectionModal =false
this.collectionStep = 1
this.$emit('finishCollection')
if(this.driver__.driver){
driverObj__.moveNext()
}

View File

@@ -9,6 +9,7 @@
:closable="false"
wrapClassName="#app"
:keyboard="false"
:destroyOnClose="true"
>
<div class="generalModel_btn">
<div class="generalModel_closeIcon" @click.stop="cancelDsign()">
@@ -18,13 +19,13 @@
<div class="clearSlogan_center">
<div class="modal_title_text">
<div>Create Slogan</div>
<div>{{ $t('createSlogan.title') }}</div>
<div class="modal_title_text_intro"></div>
</div>
<div class="exportCanvasBox_center">
<div v-show="textBtnShow" class="clearSlogan_center_item clearSlogan_center_btn_move">
<div class="clearSlogan_center_btn_item">
<div>Color</div>
<div>{{ $t('createSlogan.Color') }}</div>
<input type="color" v-model="fill">
</div>
<!-- <div class="clearSlogan_center_btn_item">
@@ -32,7 +33,7 @@
<input type="Number" v-model="fontSize">
</div> -->
<div class="clearSlogan_center_btn_item">
<div>Font Align</div>
<div>{{ $t('createSlogan.FontAlign') }}</div>
<ul>
<i class="fi fi-br-align-left" @click="setTextData('textAlign','left')" :class="{active:textAlign === 'left'}"></i>
<i class="fi fi-br-align-center" @click="setTextData('textAlign','center')" :class="{active:textAlign === 'center'}"></i>
@@ -40,7 +41,7 @@
</ul>
</div>
<div class="clearSlogan_center_btn_item">
<div>Font Style</div>
<div>{{ $t('createSlogan.FontStyle') }}</div>
<ul>
<i class="fi fi-br-border-top" @click="setTextData('overline','')" :class="{active:overline}"></i>
<i class="fi fi-br-border-center-h" @click="setTextData('linethrough','')" :class="{active:linethrough}"></i>
@@ -49,7 +50,7 @@
</div>
<div class="clearSlogan_center_btn_item">
<div>Font Family</div>
<div>{{ $t('createSlogan.FontFamily') }}</div>
<select v-model="fontFamily" :style="{'font-family':fontFamily}">
<option v-for="item in textFontFamilyList" :style="{'font-family':item.value}" :value="item.value">{{item.name}}</option>
</select>
@@ -57,16 +58,16 @@
</div>
<div class="clearSlogan_center_btn clearSlogan_center_item">
<div @click="setTextFun('')" class="clearSlogan_center_btn_item">
<div>新增</div>
<div>{{ $t('createSlogan.add') }}</div>
</div>
<div @click="removeTextFun()" class="clearSlogan_center_btn_item">
<div>删除</div>
<div>{{ $t('createSlogan.delete') }}</div>
</div>
</div>
</div>
<div class="exportCanvasBox_submit" @click="setSubmit">
<div class="started_btn">
submit
{{ $t('createSlogan.submit') }}
</div>
</div>

View File

@@ -1,16 +1,67 @@
<template>
<div class="generalMenu_printModel">
<div @click.stop="openPrintModel" :class="driverClass.class1">{{ item.label }}</div>
<div @click.stop="openPrintModel" :class="driverClass.class1">
<a-popover v-if="isCanvas">
<template #content>
<img style="width: 10rem;height: 10rem;object-fit: contain;" :src="item.img" alt="">
<span style="text-align: center;">{{ $t('Generate.referenceImage') }}</span>
</template>
<span v-if="item?.label">{{ item?.label }}</span>
<span v-else>{{ item.name }}</span>
</a-popover>
<div v-else>
<span v-if="item?.label">{{ item?.label }}</span>
<span v-else>{{ item.name }}</span>
</div>
</div>
<ul :class="driverClass.class2" v-show="openClick">
<li v-for="item,index in dataList" :class="{active:deleteItem == index}" class="printModel_item" @click="setprintModel(item,index)">{{ item.label }}</li>
<li v-for="item,index in dataList" :class="{active:deleteItem == index}" class="printModel_item" @click="setprintModel(item,index)">
<a-popover placement="right" v-if="isCanvas">
<template #content>
<!-- <span v-if="item.img != -1 && index == dataList?.length -1 " class="icon iconfont icon-shanchu" style="cursor: pointer; position: absolute; right: 10px; top: 10px;" @click.stop="deleteFile(item)"></span> -->
<img v-if="item.img != -1" style="width: 10rem;height: 10rem;object-fit: contain;" :src="item.img" alt="">
<!-- <div v-else-if="item.img == -1" class="generalMenu_printModel_upload ">
<i class="fi fi-br-upload input_border" style="width: 8rem; height: 8rem;padding: 0;" :title="$t('Generate.uploadTitle')">
<a-upload
style="height: 100%;"
class="search_upImg"
:capture="null"
:action="uploadUrl + '/api/element/upload'"
list-type="picture-card"
:data="{
...upload,
}"
:maxCount='1'
:headers="{ Authorization: token }"
accept=".jpg,.png,.jpeg,.bmp"
@change="(file) => fileUploadChange(file)"
>
</a-upload>
</i>
</div> -->
<span style="text-align: center;">{{ $t('Generate.referenceImage') }}</span>
</template>
<span v-if="item?.label">{{ item?.label }}</span>
<span v-else>{{ item.name }}</span>
</a-popover>
<div v-else>
<span v-if="item?.label">{{ item?.label }}</span>
<span v-else>{{ item.name }}</span>
</div>
</li>
</ul>
</div>
</template>
<script lang="ts">
import { defineComponent,ref ,nextTick} from "vue";
import { Https } from "@/tool/https";
import { useStore } from "vuex";
import { Https } from "@/tool/https";
import { openGuide,driverObj__ } from "@/tool/guide";
import { getUploadUrl } from "@/tool/util";
import { getCookie } from "@/tool/cookie";
import { message, Upload, Modal } from "ant-design-vue";
export default defineComponent({
name:'filterComponent',
props:{
@@ -24,6 +75,10 @@
type:Boolean,
default:false,
},
isCanvas:{
type:Boolean,
default:false,
},
deleteItem:{
type:Number,
default:-1
@@ -37,7 +92,7 @@
setup(props:any,{emit}){
let selectIndex = ref(0)
let openClick = ref(false)
let store = useStore();
let openPrintModel = ()=>{
document.addEventListener('click',removePrintModel)
openClick.value = true
@@ -49,6 +104,7 @@
}
let setprintModel = (item:any,index:any)=>{
if(props.deleteItem == index) return
if(item.img == -1) return
openClick.value = false
selectIndex = index
nextTick().then(()=>{
@@ -61,35 +117,110 @@
let removePrintModel = ()=>{
openClick.value = false
document.removeEventListener('click',removePrintModel)
}
let fileUploadChange = (data: any)=>{
let file = data.file;
let bor = true
if (file.status === "done") {
let res = JSON.parse(file.xhr.response);
if(res.errCode == 0){
file.type_ = "upload";
props.dataList.forEach((item:any)=>{
if(item.img == -1){
item.img = res.data.url
item.id = res.data.id
}
})
}else{
bor = false
}
} else if (file.status === "error") {
bor = false
}
if(!bor){
// let res:any = JSON.parse(file.xhr.response);
// props.dataList.forEach((item:any)=>{
// if(item.img == -1){
// }
// })
// message.warning(res.errMsg);
}
}
let deleteFile = (item:any)=>{
item.img = -1
emit('setprintModel',props.dataList[0])
}
return {
selectIndex,
openClick,
store,
setprintModel,
openPrintModel,
fileUploadChange,
deleteFile,
}
},
data(prop) {
return {
upload: {
isPin: 0,
gender:'',
level1Type: 'Sketchboard',
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
},
token: "",
uploadUrl: "",
type_: {
type1: "generate",
type2: 'Sketchboard',
},
workspaceCom:{},
isTextarea:false,
isInputFocus:false,
};
},
mounted() {
this.uploadUrl = getUploadUrl();
this.token = getCookie("token") || "";
this.upload.gender = this.store?.state?.Workspace?.workspace?.sexEnum?.value
}
});
</script>
<style lang="less">
.ant-popover-inner-content{
display: flex;
flex-direction: column;
align-items: center;
}
</style>
<style lang="less">
//衣服类型下拉菜单
.generalMenu_printModel{
margin-right: 2rem;
>div{
width: calc(13rem*1.2);
// display: flex;
display: block;
width: calc(13rem*1.2);
border-radius: calc(1rem*1.2);
margin: 0;
border: 2px solid;
cursor: pointer;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding: 0 calc(1rem*1.2);
text-align: center;
display: flex;
justify-content: space-around;
> span{
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
>i{
justify-content: center;
position: relative;
}
}
ul{
position: absolute;
@@ -108,6 +239,10 @@
overflow: hidden;
text-overflow: ellipsis;
padding: 0 calc(1rem*1.2);
span{
display: block;
width: 100%;
}
&.active{
// opacity: .4;
pointer-events: none;
@@ -116,6 +251,12 @@
cursor: not-allowed;
}
:deep(.icon-shanchu){
cursor: pointer;
position: absolute;
right: 10px;
top: 10px;
}
}
.printModel_item:hover{
// background: rgba(0,0,0,.4);
@@ -124,4 +265,5 @@
}
}
}
</style>

View File

@@ -24,22 +24,19 @@
</div>
</div>
<div class="layout_nav">
<div v-for="item,index in layoutList" :key="item" :class="{active:item.setPitch}" @mousedown="setpitch(item,index)">
<div v-for="item,index in layoutList" :key="item" :class="{active:item.setPitch}" @mousedown="setpitch(item,index)" @touchstart.passive="setpitch(item,index)">
<img :src="item.imgUrl">
</div>
</div>
<div class="layout_centent" :class="{active:flex_direction}" id="layoutCentent">
<div v-for="item,index in layoutList" :key="item" :class="moodbClassName[index]" class="modal_imgItem" v-layout="index" @mousedown="setpitch(item,index)" ref="content" >
<img crossOrigin="anonymous" :src="item.imgUrl" draggable="false" :class="moodbClassName[index]" v-modelImg>
<div>
</div>
<div v-for="item,index in layoutList" :key="item" :class="moodbClassName[index]" class="modal_imgItem" v-layout="item" @mousedown="setpitch(item,index)" @touchstart="setpitch(item,index)" ref="content" >
<img crossOrigin="anonymous" :src="item.imgUrl" :style="{'transform':`translate(-50%, -50%) scale(${item.zoom?item.zoom:1}) rotateZ(${item.angle?item.angle:0}deg)`}" draggable="false" :class="moodbClassName[index]" v-modelImg>
<ul v-show="item.setPitch" class="layout_btn" >
<li class="layout_btn_top" v-compile.stop="'top'"></li>
<li class="layout_btn_bottom" v-compile.stop="'bottom'"></li>
<li class="layout_btn_left" v-compile.stop="'left'"></li>
<li class="layout_btn_right" v-compile.stop="'right'"></li>
<li class="layout_rotote" v-rotote.stop></li>
<li class="layout_rotote" v-rotote.stop='item' :style="{'transform':`translate(-50%, -50%) rotateZ(${item.angle}deg)`}"></li>
<li class="layout_translate" v-translate.stop></li>
<!-- <li class="layout_translate" v-translate.stop></li> -->
<li class="layout_angle_tr" v-angle.stop = "'top'"></li>
@@ -73,6 +70,16 @@
</div>
</div>
</div>
<div class="layout_right" v-show="isMobile">
<div class="layout_right_text">
{{ $t('DesignPrintOperation.Scale') }}
</div>
<a-slider
v-model:value="moodItemScale"
@change="setMoodItemScale"
>
</a-slider>
</div>
<!-- <div class="layout_right">
<div v-for="item,index in moodbList" class="layout_left_items" @click="setmoodb(item)">
<div v-for="clasitem,clasindex in item" :class="clasitem" class="layout_left_item">
@@ -118,20 +125,28 @@ import { Https } from "@/tool/https";
import { getCookie } from "@/tool/cookie";
import domTurnImg from '@/tool/domTurnImg'
import { getUploadUrl } from "@/tool/util";
import { getMousePosition } from "@/tool/mdEvent";
export default defineComponent({
props:["moodb_className",'flex_direction'],
components: {
draggable
},
setup(prop) {
let store = useStore()
let layout: any = ref(false);
let templateFileList: any = ref([]);
let openClick: any = ref(1);
let drag = false;
let layoutList:any = ref([])
const content = ref<HTMLElement | null>(null);
const content:any = ref<HTMLElement | null>(null);
let loadingShow = ref(false)
let styleObj:any = {}
let moodItemScale = ref(0)
let domObj = {
dom:['img','ul','.layout_rotote','.layout_translate','.layout_angle_tr','.layout_angle_tl','.layout_angle_br','.layout_angle_bl'],
domStyle:['imgStyle','borStyle','rototeStyle','translateStyle','angleTRStyle','angleTLStyle','angleBRStyle','angleBLStyle'],
}
let isMobile = ref(false)
return {
layout,
templateFileList,
@@ -139,7 +154,11 @@ export default defineComponent({
drag,
layoutList,
content,
loadingShow
loadingShow,
moodItemScale,
styleObj,
domObj,
isMobile,
};
},
data() {
@@ -147,17 +166,13 @@ export default defineComponent({
// moodTemplateId: "", //模板id
store: useStore(),
// layoutList:computed(()=>{
// return [...(useStore().state.UploadFilesModule.moodboardFiles),
// ...(useStore().state.UploadFilesModule.generateFiles),
// ...(useStore().state.UploadFilesModule.MaterialFiles)]
// }),
moodb : moodb.moodb_,
moodbList:{},
moodbClassName:[],
setabsolute:false,
token: "",
uploadUrl: "",
moodIndex:0,
upload: {
isPin: 0,
gender:'',
@@ -175,8 +190,18 @@ export default defineComponent({
//操作移动
layout:{
mounted (el,layout:any,binding) {
let mousedown = function(e: MouseEvent){
e.stopPropagation()
let mousedown = function(event: MouseEvent){
let e:any = getMousePosition(event,false)
mouseDownOperation(e)
}
let touchstart = function(event: any){
let e:any = getMousePosition(event,true)
mouseDownOperation(e)
}
let mouseDownOperation = function(e: MouseEvent){
el.parentElement.children.forEach((v:any) => {
v.style.left = v.offsetLeft+'px'
v.style.top = v.offsetTop+'px'
@@ -193,10 +218,18 @@ export default defineComponent({
let domX = e.clientX - e.offsetX - Number(left)//鼠标到最左侧距离减去鼠标到dom距离再减去已经有的left值
let domY = e.clientY - e.offsetY - Number(top)
let mouse = true
document.onmousemove = function(e:MouseEvent){
let mouseMove = function(event:MouseEvent){
let e:any = getMousePosition(event,false)
mouseMoveOperation(e)
}
let touchmove = function(event:any){
let e:any = getMousePosition(event,true)
mouseMoveOperation(e)
}
let mouseMoveOperation = (e:any)=>{
if(mouse){
el.style.left = e.x-mouseX - domX+'px'
el.style.top = e.y-mouseY - domY+'px'
el.style.left = e.clientX-mouseX - domX+'px'
el.style.top = e.clientY-mouseY - domY+'px'
if(el.offsetLeft <=0){
el.style.left = 0+'px'
}
@@ -211,18 +244,23 @@ export default defineComponent({
}
}
}
document.onmouseup = function(){
let mouseup = function(){
mouse = false
document.onmousemove = ()=>{
}
// el.removeEventListener('mousedown',mousedown)
// el.removeEventListener('mousedown',mousedown)
// document.onmousemove = false;
document.removeEventListener('mousemove',mouseMove)
document.removeEventListener('touchmove',touchmove)
document.removeEventListener('mouseup',mouseup)
document.removeEventListener('touchend',mouseup)
//移动端
}
document.addEventListener('mousemove', mouseMove);
document.addEventListener('touchmove', touchmove);
document.addEventListener('mouseup', mouseup);
document.addEventListener('touchend', mouseup);
//移动端
}
el.addEventListener('mousedown',mousedown)
el.addEventListener('touchstart',touchstart)
},
updated (el,layout) {
@@ -231,8 +269,15 @@ export default defineComponent({
//操作大小
compile:{
mounted (el,compile) {
el.addEventListener('mousedown',(e: MouseEvent)=>{
e.stopPropagation()
let mousedown = (event:any)=>{
let e:any = getMousePosition(event,false)
mouseDownOperation(e)
}
let touchstart = (event:any)=>{
let e:any = getMousePosition(event,true)
mouseDownOperation(e)
}
let mouseDownOperation = (e: MouseEvent)=>{
let elParent = el.parentNode.parentNode
el.parentElement.parentNode.parentNode.children.forEach((v:any) => {
v.style.left = v.offsetLeft+'px'
@@ -256,27 +301,34 @@ export default defineComponent({
let gpsXY:any
let parent:any
if(compile.value == 'left' || compile.value == 'right'){
gpsXY = e.x
gpsXY = e.clientX
parent = elParent.offsetWidth
}else{
parent = elParent.offsetHeight
gpsXY = e.y
gpsXY = e.clientY
}
let mouse = true
document.onmousemove = function(e:MouseEvent){
let mouseMove = function(event:MouseEvent){
let e:any = getMousePosition(event,false)
mouseMoveOperation(e)
}
let touchmove = function(event:any){
let e:any = getMousePosition(event,true)
mouseMoveOperation(e)
}
let mouseMoveOperation = function(e:MouseEvent){
if(mouse){
if(compile.value == 'left'){
elParent.style.width = parent + gpsXY - e.x + 'px'
elParent.style.width = parent + gpsXY - e.clientX + 'px'
}else if(compile.value == 'right'){
elParent.style.width = parent + e.x - gpsXY + 'px'
elParent.style.width = parent + e.clientX - gpsXY + 'px'
}else if(compile.value == 'top'){
elParent.style.height = parent + gpsXY - e.y + 'px'
elParent.style.height = parent + gpsXY - e.clientY + 'px'
}else if(compile.value == 'bottom'){
elParent.style.height = parent + e.y - gpsXY + 'px'
elParent.style.height = parent + e.clientY - gpsXY + 'px'
}
if(elParent.parentNode.offsetWidth <= elParent.offsetWidth+Number(elParent.style.right.replace(/px/g,''))){
elParent.style.width = elParent.parentNode.offsetWidth - Number(elParent.style.right.replace(/px/g,''))+'px'
}
@@ -292,61 +344,92 @@ export default defineComponent({
}
}
}
document.onmouseup = function(){
let mouseup = function(){
mouse = false
document.onmousemove = ()=>{}
document.removeEventListener('mousemove',mouseMove)
document.removeEventListener('touchmove',touchmove)
document.removeEventListener('mouseup',mouseup)
document.removeEventListener('touchend',mouseup)
//移动端
}
})
document.addEventListener('mousemove', mouseMove);
document.addEventListener('touchmove', touchmove);
document.addEventListener('mouseup', mouseup);
document.addEventListener('touchend', mouseup);
}
el.addEventListener('mousedown',mousedown)
el.addEventListener('touchstart',touchstart)
}
},
//操作旋转
rotote:{
mounted(el){
mounted(el,item){
let mouse = true;
let angle :any = 0
let num:any
let num:any = 1
let x = 0
let y = 0
let elParent = el.parentNode.parentNode
if(document.defaultView){
let transform = document.defaultView.getComputedStyle(elParent.firstElementChild, null).transform.split('(')[1].split(',')
num = Number(transform[3])
let mousedown = function(event: MouseEvent){
let e:any = getMousePosition(event,false)
mouseDownOperation(e)
}
// 添加鼠标按下事件监听器
let mousedown = (e:MouseEvent) => {
e.stopPropagation()
let touchstart = function(event: any){
let e:any = getMousePosition(event,true)
mouseDownOperation(e)
}
let mouseDownOperation = (e:any) => {
mouse = true;
// let eX = (e.pageX - el.offsetLeft) + el.offsetLeft
// let eY = elParent.offsetTop + el.offsetTop
var info = el.getBoundingClientRect();
let eX = info.x + info.width / 2;
let eY = info.y + info.height / 2;
document.addEventListener('mousemove', (e:MouseEvent) => {
if (mouse) {
let X = eX
let Y = eY
let x:any = e.clientX - X
let y:any = Y - e.clientY
angle = Math.atan2(x,y)*(180 / Math.PI)
elParent.firstElementChild.style.transform = "translate(-50%,-50%) scale("+ num + ") rotateZ("+ angle + "deg)"
el.style.transform = "translate(-50%,-50%) rotateZ("+ angle + "deg)"
num = item.value.zoom?item.value.zoom :1
angle = item.value.angle?item.value.angle:0
let mouseMove = function(event:MouseEvent){
let e:any = getMousePosition(event,false)
mouseMoveOperation(e)
}
});
let touchmove = function(event:any){
let e:any = getMousePosition(event,true)
mouseMoveOperation(e)
}
let mouseMoveOperation = (e:MouseEvent) => {
if (mouse) {
let X = eX
let Y = eY
let x:any = e.clientX - X
let y:any = Y - e.clientY
angle = Math.atan2(x,y)*(180 / Math.PI)
item.value.angle = angle
}
};
// 添加鼠标松开事件监听器
document.addEventListener('mouseup',mouseup );
let mouseup = function(){
mouse = false
document.removeEventListener('mousemove',mouseMove)
document.removeEventListener('touchmove',touchmove)
document.removeEventListener('mouseup',mouseup)
document.removeEventListener('touchend',mouseup)
//移动端
}
document.addEventListener('mousemove', mouseMove);
document.addEventListener('touchmove', touchmove);
document.addEventListener('mouseup', mouseup);
document.addEventListener('touchend', mouseup);
}
let mouseup = () => {
mouse = false;
// el.removeEventListener('mousedown',mousedown)
document.removeEventListener('mouseup',mouseup)
}
el.addEventListener('mousedown',mousedown);
el.addEventListener('mousedown',mousedown)
el.addEventListener('touchstart',touchstart)
//缩放
let timeSwitch = true
el.parentNode.addEventListener('mousemove', (e:MouseEvent) => {
el.parentNode.addEventListener('mousewheel',(e:MouseEvent) => {
num = item.value.zoom?item.value.zoom :1
angle = item.value.angle?item.value.angle:0
if(timeSwitch){
timeSwitch = false
if((e as WheelEvent).deltaY > 0){
@@ -371,10 +454,10 @@ export default defineComponent({
setTimeout(() => {
timeSwitch = true
}, 100);
elParent.firstElementChild.style.transform = "translate(-50%,-50%) scale("+ num + ") rotateZ("+ angle + "deg)"
let instance:any = item.instance
instance.moodItemScale = num * 100
item.value.zoom = num
}
});
});
}
@@ -383,9 +466,16 @@ export default defineComponent({
angle:{
mounted(el,angle){
let mouse = false;
el.addEventListener('mousedown', (e:MouseEvent) => {
e.stopPropagation()
let mousedown = function(event: MouseEvent){
let e:any = getMousePosition(event,false)
mouseDownOperation(e)
}
let touchstart = function(event: any){
let e:any = getMousePosition(event,true)
mouseDownOperation(e)
}
let mouseDownOperation = (e:MouseEvent) => {
el.parentNode.children.forEach((v:any) =>{
v.classList.add('eventNode')
})
@@ -394,7 +484,15 @@ export default defineComponent({
let eX:any
let eY:any
let elParentSide = Math.sqrt(elParent.offsetWidth/2*elParent.offsetWidth/2+elParent.offsetHeight/2*elParent.offsetHeight/2)
let mouseMove = (e:MouseEvent)=>{
let mouseMove = function(event:MouseEvent){
let e:any = getMousePosition(event,false)
mouseMoveOperation(e)
}
let touchmove = function(event:any){
let e:any = getMousePosition(event,true,el.parentNode)
mouseMoveOperation(e)
}
let mouseMoveOperation = (e:MouseEvent)=>{
if (mouse) {
if(angle.value == 'right'){
eX = elParent.offsetWidth - e.offsetX
@@ -409,7 +507,7 @@ export default defineComponent({
eX = elParent.offsetWidth - e.offsetX - elParent.offsetWidth
eY = elParent.offsetHeight - e.offsetY - elParent.offsetHeight
}
let mouseSide = Math.sqrt(eX*eX + eY *+eY)/2
let mouseSide = Math.sqrt(eX*eX + eY *eY)/2
// el.style.left = e.offsetX /2 +'px'
// el.style.top = e.offsetY /2+'px'
if(100 - 100 * mouseSide/elParentSide <= 50){
@@ -458,28 +556,40 @@ export default defineComponent({
}
}
}
// 添加鼠标松开事件监听器
document.addEventListener('mouseup', mouseup);
}
let mouseup = () => {
mouse = false;
el.parentNode.removeEventListener('mousemove',mouseMove)
let mouseup = function(){
mouse = false
el.parentNode.children.forEach((v:any) =>{
v.classList.remove('eventNode')
})
document.removeEventListener('mouseup', mouseup);
el.parentNode.removeEventListener('mousemove',mouseMove)
el.parentNode.removeEventListener('touchmove',touchmove)
document.removeEventListener('mouseup',mouseup)
document.removeEventListener('touchend',mouseup)
//移动端
}
el.parentNode.addEventListener('mousemove', mouseMove);
})
el.parentNode.addEventListener('touchmove', touchmove);
document.addEventListener('mouseup', mouseup);
document.addEventListener('touchend', mouseup);
}
el.addEventListener('mousedown',mousedown)
el.addEventListener('touchstart',touchstart)
}
},
//移动图片
translate:{
mounted (el,layout:any,binding) {
el.addEventListener('mousedown',(e: MouseEvent)=>{
e.stopPropagation()
let mousedown = function(event: MouseEvent){
let e:any = getMousePosition(event,false)
mouseDownOperation(e)
}
let touchstart = function(event: any){
let e:any = getMousePosition(event,true)
mouseDownOperation(e)
}
let mouseDownOperation = (e: MouseEvent)=>{
let elParent = el.parentNode.parentNode
el.style.left = (el.offsetLeft+2)/(elParent.offsetWidth)*100+'%'
el.style.top = (el.offsetTop+2)/(elParent.offsetHeight)*100+'%'
@@ -490,10 +600,18 @@ export default defineComponent({
let domX = e.clientX - e.offsetX - el.offsetLeft//鼠标到最左侧距离减去鼠标到dom距离再减去已经有的left值
let domY = e.clientY - e.offsetY - el.offsetTop
let mouse = true
document.onmousemove = function(e:MouseEvent){
let mouseMove = function(event:MouseEvent){
let e:any = getMousePosition(event,false)
mouseMoveOperation(e)
}
let touchmove = function(event:any){
let e:any = getMousePosition(event,true)
mouseMoveOperation(e)
}
let mouseMoveOperation = function(e:MouseEvent){
if(mouse){
let left = ( e.x-mouseX + 2 - domX )/(elParent.offsetWidth)*100+'%'
let top = (e.y-mouseY + 2 - domY)/(elParent.offsetHeight)*100+'%'
let left = ( e.clientX-mouseX + 2 - domX )/(elParent.offsetWidth)*100+'%'
let top = (e.clientY-mouseY + 2 - domY)/(elParent.offsetHeight)*100+'%'
el.style.left = left
el.style.top = top;
el.previousSibling.style.top = top
@@ -529,17 +647,27 @@ export default defineComponent({
}
}
}
document.onmouseup = function(){
let mouseup = function(){
mouse = false
document.onmousemove = ()=>{}
document.removeEventListener('mousemove',mouseMove)
document.removeEventListener('touchmove',touchmove)
document.removeEventListener('mouseup',mouseup)
document.removeEventListener('touchend',mouseup)
//移动端
}
})
document.addEventListener('mousemove', mouseMove);
document.addEventListener('touchmove', touchmove);
document.addEventListener('mouseup', mouseup);
document.addEventListener('touchend', mouseup);
}
el.addEventListener('mousedown',mousedown)
el.addEventListener('touchstart',touchstart)
},
},
modelImg:{
mounted(el) {
let parentNode = el.parentNode
if(parentNode.offsetHeight > parentNode.offsetWidth){
if(parentNode.offsetHeight >= parentNode.offsetWidth){
el.style.height = 100+'%'
el.style.width = 'auto'
}else{
@@ -549,7 +677,7 @@ export default defineComponent({
},
updated (el) {
let parentNode = el.parentNode
if(parentNode.offsetHeight > parentNode.offsetWidth){
if(parentNode.offsetHeight >= parentNode.offsetWidth){
el.style.height = 100+'%'
el.style.width = 'auto'
}else{
@@ -562,6 +690,7 @@ export default defineComponent({
methods: {
init(){
let parentList:any = this.$parent
this.styleObj = this.store.state.UploadFilesModule.moodboardPosition
parentList = parentList.layoutList
this.layout = true
// let layoutList = this.store.state.UploadFilesModule.moodboard
@@ -569,14 +698,22 @@ export default defineComponent({
v.setPitch = false
})
this.layoutList = parentList
this.moodbList = this.moodb[parentList.length-1]
this.moodbClassName = this.moodb_className
this.moodbClassName = this.styleObj?.class?this.styleObj?.class:[]
this.moodItemScale = (this.layoutList?.[0]?this.layoutList[0].zoom:1)*100
this.initDomStyle()
},
cancelDsign(){
this.layout = false
},
setpitch(item:any,index:any){
if(!item.zoom){
item.zoom = 1
}
this.moodIndex = index
this.moodItemScale = (item.zoom?item.zoom:1)*100
this.layoutList.forEach((v:any)=>{
v.setPitch = false
})
@@ -586,6 +723,11 @@ export default defineComponent({
}
},
setMoodItemScale(value:any){
if(value > 2){
this.layoutList[this.moodIndex].zoom = value/100
}
},
setmoodb(item:any){
this.moodbClassName = item
this.$emit('setmoodbClass',this.moodbClassName)
@@ -604,9 +746,79 @@ export default defineComponent({
changeTemplateModal(){
this.layout = !this.layout
},
setIndex(styleArr:any){
let arr = JSON.parse(JSON.stringify(styleArr))
const nums = arr.map((obj:any,index:any) => {
obj.num = index
return {
num: obj.num,
zIndex: obj['z-index']?obj['z-index']:1
}
});
const sortedNums = nums.sort((a:any, b:any) => a.zIndex - b.zIndex);
GO.zIndex = sortedNums.length + 1
// GO.zIndex = sortedNums[sortedNums.length - 1].zIndex + 1
sortedNums.forEach((item:any,index:any) => {
arr[item.num]['z-index'] = index + 1
});
return arr
},
initDomStyle(){
nextTick(()=>{
this.content.forEach((item:any,index:any) => {
if(this.styleObj.domStyle[index]){
item.classList.add('active')
this.initStyle(item,this.styleObj.domStyle[index])
}
this.domObj.dom.forEach((domName:any,domStyle:any) => {
let dom,style
if(this.styleObj[this.domObj.domStyle[index]]){
style = this.styleObj[this.domObj.domStyle[domStyle]][index]
dom = item.querySelector(domName)
this.initStyle(dom,style)
}
})
});
})
},
clearStyleObj(){
this.styleObj.domStyle = []
this.domObj.domStyle.forEach((item:any)=>{
if(this.styleObj[item])this.styleObj[item] = []
})
},
initStyle(dom:any,style:any){
if(!style)return
for (const [property, value] of Object.entries(style)) {
dom.style.setProperty(property, value);
}
},
setDomStyle(){
this.clearStyleObj()
this.content.forEach((item:any) => {
this.styleObj.domStyle.push(this.setStyle(item.style))
this.domObj.dom.forEach((domName:any,index:any) => {
let style = this.domObj.domStyle[index]
let dom = item.querySelector(domName)
this.styleObj[style].push(this.setStyle(dom.style))
})
});
},
setStyle(domStyle:any){
let style:any = {}
for (let property of domStyle) {
style[property] = domStyle.getPropertyValue(property);
}
return style
},
//提交模板
submitTemplate() {
this.loadingShow = true
this.setDomStyle()
this.styleObj.domStyle = this.setIndex(this.styleObj.domStyle)//index统一排序设置值
this.store.commit("setDisposeMoodboardPosition", JSON.parse(JSON.stringify(this.styleObj)));
this.layoutList.forEach((v:any)=>{
v.setPitch = false
})
@@ -628,6 +840,8 @@ export default defineComponent({
this.layout = false
this.loadingShow = false
this.store.commit("setDisposeMoodboard", rv);
}
).catch(rv=>{
this.loadingShow = false
@@ -646,6 +860,10 @@ export default defineComponent({
<style lang="less">
.layout_modal {
user-select: none; /* 对现代浏览器有效 */
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
.ant-modal-body {
padding: 0;
// height: calc(65vh - 6.4rem);
@@ -736,8 +954,8 @@ export default defineComponent({
li{
cursor: pointer;
// border-radius: 50%;
width: calc(1.5rem*1.2);
height: calc(1.5rem*1.2);
width: calc(2rem*1.2);
height: calc(2rem*1.2);
background-color: rgb(20, 188, 255);
position: absolute;
z-index: 1049;
@@ -801,24 +1019,28 @@ export default defineComponent({
}
.layout_angle_tr,.layout_angle_tl,.layout_angle_br,.layout_angle_bl{
// opacity: 0;
width: calc(.8rem*1.2);
height: calc(.8rem*1.2);
width: calc(2rem*1.2);
height: calc(2rem*1.2);
}
.layout_angle_tr{
right: 0%;
top: 0;
transform: translate(50%,-50%);
}
.layout_angle_tl{
left: 0%;
top: 0;
transform: translate(-50%,-50%);
}
.layout_angle_br{
right: 0%;
bottom: 0%;
transform: translate(50%,50%);
}
.layout_angle_bl{
left: 0%;
bottom: 0%;
transform: translate(-50%,50%);
}
.eventNode{
pointer-events: none;
@@ -914,6 +1136,65 @@ export default defineComponent({
}
}
}
.layout_right{
position: absolute;
top: 50%;
transform: translateY(-50%);
right: calc(5rem*1.2);
// background-color: #000;
width: 8%;
height: 50%;
&.layout_left::-webkit-scrollbar {
display: none;
}
.layout_left_text{
font-size: var(--aida-fsize1-6);
margin-bottom: calc(1rem*1.2);
color: #000;
}
.layout_left_items{
width: 100%;
height: calc(6rem*1.2);
display: flex;
align-content: space-between;
justify-content: space-between;
flex-wrap: wrap;
flex-direction: column;
margin-bottom: calc(2rem*1.2);
cursor: pointer;
.layout_left_item{
box-sizing: border-box;
border: 1px solid #000;
}
}
.ant-slider{
margin: 0;
margin-top: calc(2rem*1.2);
padding: 0 calc(1rem*1.2);
.ant-slider-track,
.ant-slider-rail {
height: calc(.6rem*1.2);
background-color: #e1e1e1;
border-radius: calc(0.5rem*1.2);
}
.ant-slider .ant-slider-handle:not(.ant-tooltip-open),
.ant-slider-handle {
background-color: #2d2e76 !important;
border: none !important;
}
.ant-slider-handle:hover {
box-shadow: 0 0 0 5px rgba(45, 46, 118, 0.2);
}
.habit_System_Designer_text_max {
display: flex;
justify-content: space-between;
.habit_System_Designer_text {
}
}
}
}
.submit_button {
margin: calc(2rem*1.2) auto 0;
position: relative;

View File

@@ -24,7 +24,7 @@
</div>
</div>
<div class="layoutMobile_nav">
<div v-for="item,index in layoutList" :key="item" :class="{active:item.setPitch}" @touchstart.stop="setpitch(item,index)">
<div v-for="item,index in layoutList" :key="item" :class="{active:item.setPitch}" @touchstart.passive="setpitch(item,index)">
<img :src="item.imgUrl">
</div>
</div>
@@ -132,14 +132,22 @@ export default defineComponent({
draggable
},
setup(prop) {
let store = useStore()
let layout: any = ref(false);
let templateFileList: any = ref([]);
let openClick: any = ref(1);
let drag = false;
let layoutList:any = ref([])
const content = ref<HTMLElement | null>(null);
const content:any = ref<HTMLElement | null>(null);
let loadingShow = ref(false)
let styleObj = computed(()=>{
return store.state.UploadFilesModule.moodboardPosition
})
let moodItemScale = ref(0)
let domObj = {
dom:['img','ul','.layoutMobile_rotote','.layoutMobile_translate','.layoutMobile_angle_tr','.layoutMobile_angle_tl','.layoutMobile_angle_br','.layoutMobile_angle_bl'],
domStyle:['imgStyle','borStyle','rototeStyle','translateStyle','angleTRStyle','angleTLStyle','angleBRStyle','angleBLStyle'],
}
return {
layout,
templateFileList,
@@ -148,7 +156,9 @@ export default defineComponent({
layoutList,
content,
loadingShow,
moodItemScale
moodItemScale,
styleObj,
domObj,
};
},
data() {
@@ -582,7 +592,9 @@ export default defineComponent({
this.moodIndex = 0
this.moodbList = this.moodb[parentList.length-1]
this.moodbClassName = this.moodb_className
this.moodbClassName = this.styleObj.class
this.initDomStyle()
},
cancelDsign(){
this.layout = false
@@ -635,6 +647,65 @@ export default defineComponent({
changeTemplateModal(){
this.layout = !this.layout
},
setIndex(arr:any){
const nums = arr.map((obj:any) => obj.num);
const sortedNums = [...nums].sort((a, b) => a - b);
GO.zIndex = sortedNums[sortedNums.length - 1] + 1
const numToNewValue = new Map();
sortedNums.forEach((num, index) => numToNewValue.set(num, index + 1));
arr.forEach((obj:any) => {
obj.num = numToNewValue.get(obj.num);
});
return arr
},
initDomStyle(){
nextTick(()=>{
this.content.forEach((item:any,index:any) => {
if(this.styleObj.domStyle[index]){
item.classList.add('active')
this.initStyle(item,this.styleObj.domStyle[index])
}
this.domObj.dom.forEach((domName:any,domStyle:any) => {
let dom,style
if(this.styleObj[this.domObj.domStyle[index]]){
style = this.styleObj[this.domObj.domStyle[domStyle]][index]
dom = item.querySelector(domName)
this.initStyle(dom,style)
}
})
});
})
},
clearStyleObj(){
this.styleObj.domStyle = []
this.domObj.domStyle.forEach((item:any)=>{
if(this.styleObj[item])this.styleObj[item] = []
})
},
initStyle(dom:any,style:any){
if(!style)return
for (const [property, value] of Object.entries(style)) {
dom.style.setProperty(property, value);
}
},
setDomStyle(){
this.clearStyleObj()
this.content.forEach((item:any) => {
this.styleObj.domStyle.push(this.setStyle(item.style))
this.domObj.dom.forEach((domName:any,index:any) => {
let style = this.domObj.domStyle[index]
let dom = item.querySelector(domName)
this.styleObj[style].push(this.setStyle(dom.style))
})
});
},
setStyle(domStyle:any){
let style:any = {}
for (let property of domStyle) {
style[property] = domStyle.getPropertyValue(property);
}
return style
},
//提交模板
submitTemplate() {
this.loadingShow = true
@@ -659,6 +730,10 @@ export default defineComponent({
this.layout = false
this.loadingShow = false
this.store.commit("setDisposeMoodboard", rv);
this.setDomStyle()
this.setIndex(this.styleObj.domStyle)//index统一排序设置值
this.store.commit("setDisposeMoodboardPosition", this.styleObj);
}
).catch(rv=>{
this.loadingShow = false

View File

@@ -0,0 +1,204 @@
<template>
<div class="newPosted_generalMessage_title modal_title_text">
<span>动态</span>
<!-- <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)">
<!-- <a-badge :dot="item.isRead == 0"></a-badge> -->
<div class="newPosted_generalMessage_item_right">
<div class="newPosted_generalMessage_item_img pointer" @click="openOtherUsers(item)">
<img :src="item.avatar" alt="">
</div>
</div>
<div class="newPosted_generalMessage_item_content">
<div class="modal_title_text_intro">{{ item.userName }} </div>
<div class="newPosted_generalMessage_item_content_title pointer" @click="openOtherWork(item)">{{ item.portfolioName }}</div>
<div class="modal_title_text_intro">{{ item.createTime }}</div>
</div>
<div class="newPosted_generalMessage_item_left">
<div class="newPosted_generalMessage_item_img">
<img :src="item.canvas" alt="">
</div>
</div>
</div>
<div class="newPosted_generalMessage_item" style="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>
<span v-show="isShowMark">
<a-spin size="large" />
</span>
</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 { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
setup() {
const router = useRouter()
const store = useStore();
let newPostedMessage = reactive({
activeKey: ref('1'),
dataList:[
],
page:1,
size:10,
isNoData: false,
isShowMark: false,
})
let loadingDom:any = ref(null)
let init = ()=>{
newPostedMessage.isNoData = false
newPostedMessage.page = 0
new IntersectionObserver(
(entries, observer) => {
// 如果不是相交,则直接返回
// console.log(entries[0]);
if (!entries[0].intersectionRatio) return;
newPostedMessage.page+=1
getPostedHistory()
},
// { root:worksPage }
).observe(loadingDom.value);
let data = {
type:'newPosted'
}
Https.axiosPost(Https.httpUrls.oneClickRead,'',{params:data}).then((rv)=>{
store.commit('setMessageSystem',{newPosted:0})
}).catch((err)=>{
})
}
let getPostedHistory = ()=>{
newPostedMessage.isShowMark = true
let data = {
page: newPostedMessage.page,
size: newPostedMessage.size,
type:'newPosted'
}
Https.axiosPost(Https.httpUrls.getHistoryNotification,data).then((rv)=>{
newPostedMessage.isShowMark = false
if(rv.content.length == 0) {
newPostedMessage.isNoData = true
return
}
newPostedMessage.dataList = rv.content
}).catch(() => {
newPostedMessage.isShowMark = false
newPostedMessage.isNoData = true
})
}
let openOtherUsers = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:item.senderId
}
})
window.open(routeUrl.href,'_blank')
}
let openOtherWork = (item:any)=>{
const routeUrl = router.resolve({
path:'/home/works',
query:{
workId:item.portfolioId
}
})
window.open(routeUrl.href,'_blank')
}
onMounted(()=>{
})
return{
...toRefs(newPostedMessage),
loadingDom,
init,
getPostedHistory,
openOtherUsers,
openOtherWork,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.modal_title_text{
font-size: 2rem;
line-height: 1.2;
justify-content: space-between;
}
.pointer{
cursor: pointer;
}
.newPosted_generalMessage_title{
display: flex;
}
.newPosted_generalMessage_center{
width: 100%;
max-height: 40rem;
overflow-y: auto;
.newPosted_generalMessage_item{
display: flex;
padding: 1rem 0;
align-items: center;
}
.newPosted_generalMessage_item_right{
margin-right: 1rem;
.newPosted_generalMessage_item_img{
img{
width: 5rem;
border-radius: 50%;
}
}
}
.newPosted_generalMessage_item_left{
height: 10rem;
margin-left: auto;
.newPosted_generalMessage_item_img{
height: 100%;
img{
width: 5rem;
max-height: 100%;
object-fit: cover;
}
}
}
.newPosted_generalMessage_item_content{
display: flex;
flex-direction: column;
align-items: flex-start;
margin-right: 1rem;
.newPosted_generalMessage_item_content_title:hover{
text-decoration: underline;
}
div{
text-align: left
}
}
}
.page_loading_box{
text-align: center;
height: 50px;
.page_loading{
display: block;
width: 50px;
height: 50px;
margin: 0 auto;
}
}
</style>

View File

@@ -25,7 +25,7 @@
<div class="productImg_left">
<div class="Guide_1_32">
<div class="productImg_content_item_title productImg_content_item_title_menu">
<span>{{$t('ProductImg.MagicTools')}}</span>
<!-- <span>{{$t('ProductImg.MagicTools')}}</span> -->
<generalMenu class="productImg_content_item_title_menubtn" :class="{hideEvents:driver__.driver}" :dataList="productimgMenuList" @setprintModel="setproduct" :item="productimgMenu"></generalMenu>
</div>
<div class="input_border productImg_content_item_generate">
@@ -75,11 +75,25 @@
</a-slider> -->
<a-select style="width: 100%;" v-model:value="RelightDirection" :options="RelightDirectionList"></a-select>
</div>
<div v-show="productimgMenu.value == 'Relight'" class="productImg_content_item_title productImg_content_item_title_similarity">
<span>{{$t('ProductImg.Highlight')}}</span>
</div>
<div v-show="productimgMenu.value == 'Relight'" class="productImg_content_item_similarity">
<a-slider class="system_silder"
v-model:value="brightenValue"
:tooltipVisible="false"
:max="3"
:min="1"
:step="0.1"
>
</a-slider>
<input type="number" readonly v-model="brightenValue">
</div>
<div class="productImg_content_item_title">{{$t('ProductImg.SelectCollection')}}</div>
<div class="productImg_content_item_imgBox generalScroll" v-mousewheel>
<div class="content_item_imgBox_itemImg" v-for="item,index in selectList[productimgMenu.value]" :key="item.id" >
<img @click="setGenerate(item)" v-lazy="item.designOutfitUrl?item.designOutfitUrl:item.url" alt="" :class="[driver__.driver?index == 0?driver__.index == 45?'Guide_img showEvents':'hideEvents':'hideEvents':'',item?.isChecked?'active':'']">
<a-checkbox v-model:checked="item.isChecked"></a-checkbox>
</div>
</div>
<div class="productImg_content_item_title">{{$t('ProductImg.Upload')}}</div>
@@ -97,6 +111,8 @@
>
<img @click="setGenerate(file)" :class="[file?.isChecked?'active':'']" :src="file?.imgUrl" class="upload_img"/>
<a-checkbox v-model:checked="file.isChecked"></a-checkbox>
<!-- <div class="content_item_imgBox_itemImg_delete" @click="deleteFile(index)">
<i class="fi fi-rr-trash"></i>
</div> -->
@@ -210,6 +226,7 @@
:productData="{
upload:upload,
similarity:similarity,
brightenValue:brightenValue,
RelightDirection:RelightDirection,
RelightDirectionList:RelightDirectionList,
}"
@@ -264,6 +281,7 @@ export default defineComponent({
generateList:[],
likeList:[],
similarity:30,
brightenValue:1,
})
let productimgMenuList = ref([
{
@@ -491,6 +509,7 @@ export default defineComponent({
toProductImageVOList:selectArr,
userLikeGroupId:upload.value.userlikeGroupId,
direction:RelightDirection.value,
brightenValue:productImgData.brightenValue,
imageStrength:(100 - imageStrength)/100,
}
productImgData.isProductimg = true
@@ -587,7 +606,11 @@ export default defineComponent({
if(generateProceedList){
// let str = generateProceedList.map((obj:any) => obj.taskId).join(',');
let str = generateProceedList.join(',')
let data = {uniqueId:str,userId:JSON.parse(userInfo).userId,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone}
let data = {
uniqueId:str,userId:JSON.parse(userInfo).userId,
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
type:productimgMenu.value.value,
}
Https.axiosGet(Https.httpUrls.generateStopWaiting, {params:data}).then(
(rv) => {
generateProceedList = []
@@ -609,6 +632,7 @@ export default defineComponent({
scaleImage.value.isLike = false
scaleImage.value.productimgSearchName = productImgData.searchName[productimgMenu.value.value]
scaleImage.value.productimgSimilarity = productImgData.similarity
scaleImage.value.productimgBrightenValue = productImgData.brightenValue
scaleImage.value.productimgRelightDirection = RelightDirection.value
scaleImage.value.isComparison = true
}
@@ -665,370 +689,384 @@ export default defineComponent({
productimgMenuList,
productimgMenu,
RelightDirectionList,
RelightDirection,
RelightDirectionList,
RelightDirection,
selectList,
likeDesignCollectionList,
ExportModel,
init,
setproduct,
cancelDsign,
fileUploadChange,
beforeUpload,
deleteFile,
setGenerate,
likeFile,
setExport,
getPrductimg,
removeProductimg,
scaleImage,
setScaleImage,
setMenu,
setMenuShow,
setSimilarity,
setTask,
};
},
directives:{
mousewheel:{
mounted (el) {
el.addEventListener('wheel',(e:WheelEvent)=>{
let num = 0
if(e.deltaY > 0){
num = 25
}else{
num = -25
}
el.scrollBy(num, 0);
},{ passive: true })
}
},
selectList,
likeDesignCollectionList,
ExportModel,
init,
setproduct,
cancelDsign,
fileUploadChange,
beforeUpload,
deleteFile,
setGenerate,
likeFile,
setExport,
getPrductimg,
removeProductimg,
scaleImage,
setScaleImage,
setMenu,
setMenuShow,
setSimilarity,
setTask,
};
},
directives:{
mousewheel:{
mounted (el) {
el.addEventListener('wheel',(e:WheelEvent)=>{
let num = 0
if(e.deltaY > 0){
num = 25
}else{
num = -25
}
el.scrollBy(num, 0);
},{ passive: true })
}
},
data() {
return {
indicator: h(LoadingOutlined, {
style: {
fontSize: "2.4rem",
},
spin: true,
}),
// moodTemplateId: "", //模板id
token: "",
uploadUrl: "",
};
},
mounted() {
this.token = getCookie("token") || "";
this.uploadUrl = getUploadUrl();
},
methods: {
// init(list:any,index:any,dialogueIndex:any){
// },
// cancelDsign(){
// this.productImg = false
// // this.productImgList = []
// // this.productImgIndex = 0
// },
// download(){
// // downloadIamge(this.productImgList[this.productImgIndex].imgUrl)
// },
// setScaleImageIndex(index:any){
// // this.productImgIndex = index
// // console.log(this.productImgIndex);
// },
// LikeFile(item:any,str:string){
// let parent:any = this.$parent
// parent.likeFile(item,str)
// },
},
},
data() {
return {
indicator: h(LoadingOutlined, {
style: {
fontSize: "2.4rem",
},
spin: true,
}),
// moodTemplateId: "", //模板id
token: "",
uploadUrl: "",
};
},
mounted() {
this.token = getCookie("token") || "";
this.uploadUrl = getUploadUrl();
},
methods: {
// init(list:any,index:any,dialogueIndex:any){
// },
// cancelDsign(){
// this.productImg = false
// // this.productImgList = []
// // this.productImgIndex = 0
// },
// download(){
// // downloadIamge(this.productImgList[this.productImgIndex].imgUrl)
// },
// setScaleImageIndex(index:any){
// // this.productImgIndex = index
// // console.log(this.productImgIndex);
// },
// LikeFile(item:any,str:string){
// let parent:any = this.$parent
// parent.likeFile(item,str)
// },
},
});
</script>
<style lang="less">
.productImg_modal {
.productImg_page{
overflow-y: auto;
height: 100%;
&.productImg_page::-webkit-scrollbar{display: none;}
.productImg_page{
overflow-y: auto;
height: 100%;
&.productImg_page::-webkit-scrollbar{display: none;}
}
.productImg_content{
display: flex;
flex-direction: column;
height: 100%;
.modal_title_text{
height: 4rem;
}
.productImg_content{
display: flex;
flex-direction: column;
height: 100%;
.modal_title_text{
height: 4rem;
}
}
.productImg_content_bottom{
height: calc(100% - 4rem - 2.4rem);
--border-color: #c4c4c4;
display: flex;
justify-content: space-between;
flex: 1;
.upload_item{
}
.productImg_content_bottom{
height: calc(100% - 4rem - 2.4rem);
--border-color: #c4c4c4;
}
.productImg_content_item_title{
font-weight: 600;
font-size: 1.6rem;
margin-bottom: 1rem;
&.productImg_content_item_title_menu{
display: flex;
align-items: center;
justify-content: space-between;
flex: 1;
.upload_item{
.productImg_content_item_title_menubtn{
font-size: 1.6rem;
font-weight: 500;
}
}
.productImg_content_item_title{
font-weight: 600;
font-size: 1.6rem;
margin-bottom: 1rem;
&.productImg_content_item_title_menu{
display: flex;
align-items: center;
justify-content: space-between;
.productImg_content_item_title_menubtn{
font-size: 1.6rem;
font-weight: 500;
&.productImg_content_item_title_similarity{
// margin-bottom: 8rem;
}
}
.productImg_content_item_intro{
font-size: 1.4rem;
}
.productImg_content_item_imgBox{
display: flex;
overflow-x: auto;
width: auto;
margin-bottom: 2rem;
align-items: center;
.content_item_imgBox_itemImg{
display: flex;
margin-right: 1rem;
position: relative;
height: 14rem;
position: relative;
img{
height: 100%;
cursor: pointer;
object-fit: contain;
opacity: .5;
transform: scale(.9);
&.active{
opacity: 1;
transform: scale(1);
}
}
&.productImg_content_item_title_similarity{
// margin-bottom: 8rem;
.ant-checkbox-wrapper{
position: absolute;
right: 0;
top: 0;
}
&.content_item_imgBox_itemImg:hover{
.content_item_imgBox_itemImg_delete{
display: block;
cursor: pointer;
}
}
.content_item_imgBox_itemImg_delete{
display: none;
width: 100%;
height: 100%;
background: rgba(0,0,0,.2);
position: absolute;
i{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
color: #fff;
}
}
}
.content_item_imgBox_itemImg:last-child{
margin-right: 0;
}
}
.productImg_left,.productImg_right{
display: flex;
flex-direction: column;
}
.productImg_content_item:last-child{
margin-bottom: 0;
}
.productImg_left{
width: 25%;
position: relative;
.Guide_1_32{
height: 100%;
overflow-y: auto;
&.Guide_1_32::-webkit-scrollbar{display: none;}
}
.upload_file_item{
display: flex;
margin-right: 1rem;
width: auto !important;
height: 14rem !important;
border: none !important;
&.upload_file_item:last-child{
margin-right: 0rem;
}
}
.productImg_content_item_intro{
font-size: 1.4rem;
}
// width: 45%;
.productImg_content_item_imgBox{
.content_item_imgBox_itemImg{
width: auto;
max-width: 9rem;
flex-shrink: 0;
img{
object-fit: contain;
}
}
}
.productImg_content_item_generate{
--width:100%;
}
.productImg_content_item_similarity{
display: flex;
align-items: center;
.system_silder{
flex: 1;
}
input{
width: 30%;
width: 5rem;
height: 5rem;
text-align: center;
font-size: 1.8rem;
}
}
.productImg_content_item_Direction{
padding-bottom: calc(2rem* 1.2);
.ant-select{
font-size: 1.6rem;
.ant-select-selector::after{
line-height: 1;
}
.ant-select-selector .ant-select-selection-item{
line-height: 1;
}
.ant-select-selector{
height: auto;
padding: 1rem 1rem;
box-shadow: none !important;
border: calc(0.1rem* 1.2) solid #F1F1F1;
}
}
}
.productImg_content_item_generate_btn{
position: absolute;
bottom: 0;
top: auto;
width: 100%;
justify-content: space-around;
.input_box{
flex: 0;
margin-left: auto;
}
.started_btn{
// width: 13rem;
// text-align: center;
margin: 0;
}
}
}
.productImg_right{
width: 75%;
padding-left: 2rem;
height: 100%;
justify-content: space-between;
.productImg_right_item_box{
height: 40%;
width: 100%;
display: flex;
overflow-x: auto;
width: auto;
margin-bottom: 2rem;
align-items: center;
.content_item_imgBox_itemImg{
display: flex;
background: #f6f6fa;
border-radius: 2rem;
margin-bottom: 2%;
padding: 1rem 1.5rem;
position: relative;
.mark_loading{
position: absolute
}
.productImg_right_item{
height: 100%;
padding: 1rem 0;
margin-right: 1rem;
position: relative;
height: 14rem;
img{
width: 100%;
cursor: pointer;
object-fit: contain;
&.active{
opacity: .5;
transform: scale(.9);
}
}
&.content_item_imgBox_itemImg:hover{
.content_item_imgBox_itemImg_delete{
display: block;
cursor: pointer;
}
}
.content_item_imgBox_itemImg_delete{
display: none;
width: 100%;
background: #fff;
overflow: hidden;
flex-shrink: 0;
.productImg_right_item_imgBox{
height: 100%;
background: rgba(0,0,0,.2);
position: absolute;
i{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
color: #fff;
overflow: hidden;
.loadingImg{
width: 14rem;
object-fit: contain;
}
}
img{
height: 100%;
}
.productImg_right_item_iconRight,.productImg_right_item_iconLeft{
position: absolute;
top: 2rem;
display: flex;
flex-direction: column;
>div{
margin-bottom: 1rem;
}
>div:last-child{
margin-bottom: 0;
}
}
.productImg_right_item_iconRight{
right: 2rem;
}
.productImg_right_item_iconLeft{
left: 2rem;
}
.productImg_right_item_like,.productImg_right_item_scale,.productImg_right_item_menu{
display: none;
cursor: pointer;
width: 3rem;
height: 3rem;
background: #fff;
align-items: center;
justify-content: center;
border-radius: .5rem;
position: relative;
border: .1rem solid #ccc;
.fi-sr-heart{
color: red;
}
}
.productImg_right_item_menu{
ul{
top: 100%;
position: absolute;
width: 10rem;
left: 0;
text-align: center;
border-radius: calc(1rem*1.2);
overflow: hidden;
z-index: 3;
li{
background: #cccccc;
padding: .5rem 1rem;
}
li:hover{
// background: rgba(0,0,0,.4);
background: #999999;
color: #000;
}
}
}
}
.content_item_imgBox_itemImg:last-child{
.productImg_right_item:hover{
.productImg_right_item_like,.productImg_right_item_scale,.productImg_right_item_menu{
display: flex;
}
}
.productImg_right_item:last-child{
margin-right: 0;
}
}
.productImg_left,.productImg_right{
display: flex;
flex-direction: column;
}
.productImg_content_item:last-child{
.productImg_right_item_box:last-child{
margin-bottom: 0;
}
.productImg_left{
width: 25%;
position: relative;
height: 100%;
.Guide_1_32{
height: 100%;
overflow-y: auto;
&.Guide_1_32::-webkit-scrollbar{display: none;}
}
.upload_file_item{
display: flex;
margin-right: 1rem;
width: auto !important;
height: 14rem !important;
border: none !important;
margin-bottom: 0 !important;
&.upload_file_item:last-child{
margin-right: 0rem;
}
}
// width: 45%;
.productImg_content_item_imgBox{
.content_item_imgBox_itemImg{
width: 7rem;
flex-shrink: 0;
}
}
.productImg_content_item_generate{
--width:100%;
}
.productImg_content_item_similarity{
display: flex;
align-items: center;
.system_silder{
flex: 1;
}
input{
width: 30%;
width: 5rem;
height: 5rem;
text-align: center;
font-size: 1.8rem;
}
}
.productImg_content_item_Direction{
padding-bottom: calc(2rem* 1.2);
.ant-select{
font-size: 1.6rem;
.ant-select-selector::after{
line-height: 1;
}
.ant-select-selector .ant-select-selection-item{
line-height: 1;
}
.ant-select-selector{
height: auto;
padding: 1rem 1rem;
box-shadow: none !important;
border: calc(0.1rem* 1.2) solid #F1F1F1;
}
}
}
.productImg_content_item_generate_btn{
position: absolute;
bottom: 0;
top: auto;
width: 100%;
justify-content: space-around;
.input_box{
flex: 0;
margin-left: auto;
}
.started_btn{
// width: 13rem;
// text-align: center;
margin: 0;
}
}
}
.productImg_right{
width: 75%;
padding-left: 2rem;
height: 100%;
.productImg_right_titleBtn{
display: flex;
justify-content: space-between;
.productImg_right_item_box{
height: 40%;
display: flex;
overflow-x: auto;
background: #f6f6fa;
border-radius: 2rem;
margin-bottom: 2%;
padding: 1rem 1.5rem;
position: relative;
.mark_loading{
position: absolute
}
.productImg_right_item{
height: 100%;
padding: 1rem 0;
margin-right: 1rem;
position: relative;
background: #fff;
.productImg_right_item_imgBox{
height: 100%;
.loadingImg{
width: 14rem;
object-fit: contain;
}
}
img{
height: 100%;
}
.productImg_right_item_iconRight,.productImg_right_item_iconLeft{
position: absolute;
top: 2rem;
display: flex;
flex-direction: column;
>div{
margin-bottom: 1rem;
}
>div:last-child{
margin-bottom: 0;
}
}
.productImg_right_item_iconRight{
right: 2rem;
}
.productImg_right_item_iconLeft{
left: 2rem;
}
.productImg_right_item_like,.productImg_right_item_scale,.productImg_right_item_menu{
display: none;
cursor: pointer;
width: 3rem;
height: 3rem;
background: #fff;
align-items: center;
justify-content: center;
border-radius: .5rem;
border: .1rem solid #ccc;
.fi-sr-heart{
color: red;
}
}
.productImg_right_item_menu{
ul{
top: 100%;
position: absolute;
width: 13rem;
left: 0;
text-align: center;
border-radius: calc(1rem*1.2);
overflow: hidden;
z-index: 3;
li{
background: #cccccc;
padding: .5rem 1rem;
}
li:hover{
// background: rgba(0,0,0,.4);
background: #999999;
color: #000;
}
}
}
}
.productImg_right_item:hover{
.productImg_right_item_like,.productImg_right_item_scale,.productImg_right_item_menu{
display: flex;
}
}
.productImg_right_item:last-child{
margin-right: 0;
}
}
.productImg_right_item_box:last-child{
margin-bottom: 0;
}
.productImg_right_titleBtn{
display: flex;
justify-content: space-between;
}
}
}
}
</style>

View File

@@ -71,7 +71,20 @@
</a-slider> -->
<a-select style="width: 100%;" v-model:value="productimgRelightDirection" :options="productimgRelightDirectionList"></a-select>
</div>
<div v-show="scaleImageList[scaleImageIndex]?.resultType == 'Relight'" class="productImg_content_item_title productImg_content_item_title_similarity">
<span>{{$t('ProductImg.Highlight')}}</span>
</div>
<div v-show="scaleImageList[scaleImageIndex]?.resultType == 'Relight'" class="productImg_content_item_similarity">
<a-slider class="system_silder"
v-model:value="productimgBrightenValue"
:tooltipVisible="false"
:max="3"
:min="1"
:step="0.1"
>
</a-slider>
<input type="number" readonly v-model="productimgBrightenValue">
</div>
<div class="productImg_content_item_generate_btn input_border">
<div class="input_box">
<div v-show="!productimgIsProductimg" class="generage_btn started_btn" @click.stop="getPrductimg">
@@ -89,16 +102,16 @@
</div>
<div class="scaleImage_content_imgBox" :class="{active:isComparison}">
<img v-if="isComparison" :src="scaleImageList[scaleImageIndex]?.sourceUrl">
<img :src="scaleImageList[scaleImageIndex]?.imgUrl">
<generalMiniCanvas v-if="isCanvas" :imgUrl="scaleImageList[scaleImageIndex]?.imgUrl" @submitBase64Data="submitBase64Data"></generalMiniCanvas>
<img v-else :src="scaleImageList[scaleImageIndex]?.imgUrl">
<div class="img_operate_block" v-if="isLike">
<i v-if="!scaleImageList[scaleImageIndex]?.like" class="fi fi-rr-heart operate_icon" @click.stop="LikeFile(scaleImageList[scaleImageIndex],'like')"></i>
<i v-else class="fi fi-sr-heart operate_icon" :adminLike="!!scaleImageList[scaleImageIndex]?.like" @click.stop="LikeFile(scaleImageList[scaleImageIndex],'noLike')"></i>
</div>
</div>
</div>
<div class="scaleImage_nav" @keydown="handleKeyDown">
<div class="scaleImage_nav">
<div class="nav_left">
<i class="fi fi-rr-arrow-small-left" @click="lastStep()"></i>
</div>
@@ -111,42 +124,46 @@
<i class="fi fi-rr-arrow-small-right" @click.stop="nextStep()"></i>
</div>
</div>
<!-- <div>
<a-button type="primary" @click="() => setVisible(true)">show image preview</a-button>
<a-image
:width="200"
:style="{ display: 'none' }"
:preview="{
visible,
onVisibleChange: setVisible,
}"
src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
/>
</div> -->
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
</a-modal>
</template>
<script lang="ts">
import { defineComponent, h, ref ,toRefs,computed,reactive, nextTick} from "vue";
import { defineComponent, h, ref ,toRefs,createVNode,reactive, nextTick} from "vue";
import { Https } from "@/tool/https";
// import domTurnImg from '@/tool/domTurnImg'
import { useStore } from "vuex";
import { Modal } from "ant-design-vue";
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { downloadIamge } from "@/tool/util";
import { getCookie,setCookie } from "@/tool/cookie";
import { useI18n } from "vue-i18n";
import { useStore } from "vuex";
import generalMiniCanvas from "@/component/modules/generalMiniCanvas.vue";
export default defineComponent({
components:{generalMiniCanvas},
props:{
productData:{
type:Object,
default:{
similarity:30,
brightenValue:1,
upload:'',
},
}
},
isCanvas:{
type:Boolean,
default:false,
},
workspace:{
type:Object,
default:{
}
},
},
setup(props:any,{emit}) {
const store = useStore();
let {t} = useI18n()
let productimg = reactive({
isProductimg:false,
productimgSearchName:'',
@@ -154,6 +171,7 @@ export default defineComponent({
productimgRemProductimg:false,
productimgIsProductimg:false,
productimgSimilarity:props.productData.similarity,
productimgBrightenValue:props.productData.brightenValue,
productimgUpload:props.productData.upload,
productimgRelightDirection:props.productData.RelightDirection,
productimgRelightDirectionList:props.productData.RelightDirectionList,
@@ -187,6 +205,7 @@ export default defineComponent({
direction:productimg.productimgRelightDirection,
prompt:productimg.productimgSearchName,
toProductImageVOList:[obj],
brightenValue:productimg.productimgBrightenValue,
userLikeGroupId:productimg.productimgUpload.userlikeGroupId,
imageStrength:(100 - imageStrength)/100,
}
@@ -203,6 +222,7 @@ export default defineComponent({
Https.axiosPost(url, data).then(
(rv) => {
isShowMark.value = false
scaleImageList.value[scaleImageIndex.value].imgUrl = '/image/loading.gif'
let arr:any = []
rv.forEach((item:any)=>{
arr.push(item.taskId)
@@ -269,7 +289,11 @@ export default defineComponent({
if(generateProceedList){
// let str = generateProceedList.map((obj:any) => obj.taskId).join(',');
let str = generateProceedList.join(',')
let data = {uniqueId:str,userId:JSON.parse(userInfo).userId,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone}
let data = {
uniqueId:str,
userId:JSON.parse(userInfo).userId,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
type:scaleImageList.value[scaleImageIndex.value]?.resultType
}
Https.axiosGet(Https.httpUrls.generateStopWaiting, {params:data}).then(
(rv) => {
generateProceedList = []
@@ -278,7 +302,51 @@ export default defineComponent({
});
}
}
let submitBase64Data = async (rv:any)=>{
loadingShow.value = true
let isOverlay = false
await new Promise<void>((resolve, reject) => {
Modal.confirm({
title: t('scaleImage.overlayOrNot'),
icon: createVNode(ExclamationCircleOutlined),
okText: 'Yes',
cancelText: 'No',
mask:false,
centered:true,
onOk() {
resolve()
isOverlay = true
},
onCancel(){
isOverlay = false
resolve()
}
});
})
let data = {
"base64": rv,
"category": scaleImageList.value[scaleImageIndex.value]?.categoryValue,
"gender": props.workspace.sexEnum.value,
"originalId":scaleImageList.value[scaleImageIndex.value]?.id,
"isOverride":isOverlay,
}
Https.axiosPost(Https.httpUrls.modifySketch, data).then(
(rv) => {
rv.imgUrl = rv.url
rv.status = 'Success'
rv.category = scaleImageList.value[scaleImageIndex.value]?.category
rv.categoryValue = scaleImageList.value[scaleImageIndex.value]?.categoryValue
isOverlay?(scaleImageList.value[scaleImageIndex.value] = rv):(scaleImageList.value.unshift(rv))
loadingShow.value = false
scaleImage.value = false
}
).catch(res=>{
loadingShow.value = false
});
}
return {
t,
...toRefs(productimg),
scaleImage,
isShowMark,
@@ -293,12 +361,13 @@ export default defineComponent({
robotAssits,
getPrductimg,
removeProductimg,
submitBase64Data,
};
},
data() {
return {
// moodTemplateId: "", //模板id
isNext:false
};
},
directives:{
@@ -331,26 +400,63 @@ export default defineComponent({
this.scaleImage = false
this.scaleImageList = []
this.scaleImageIndex = 0
this.isNext = false
document.removeEventListener('keydown',this.setKeydown)
},
lastStep(){
if(this.productimgIsProductimg) return
if(this.isNext)return
let num = this.scaleImageIndex
if(this.scaleImageIndex <= 0){
}else{
this.scaleImageIndex -= 1
num -=1
this.setImageIndex(num)
}
},
nextStep(){
if(this.productimgIsProductimg) return
if(this.isNext)return
let num = this.scaleImageIndex
if(this.scaleImageIndex >= this.scaleImageList.length-1){
}else{
this.scaleImageIndex += 1
num += 1
this.setImageIndex(num)
}
},
download(){
downloadIamge(this.scaleImageList[this.scaleImageIndex].imgUrl)
},
setScaleImageIndex(index:any){
this.scaleImageIndex = index
// this.scaleImageIndex = index
this.setImageIndex(index)
},
setImageIndex(index:any){
if(this.isNext)return
let this_ = this
if(this.isCanvas){
this.isNext = true
new Promise((resolve,reject)=>{
Modal.confirm({
title: this.t('scaleImage.submitCanvas'),
icon: createVNode(ExclamationCircleOutlined),
okText: 'Yes',
cancelText: 'No',
mask:false,
centered:true,
onOk() {
this_.scaleImageIndex = index
this_.isNext = false
resolve('')
},
onCancel(){
this_.isNext = false
resolve('')
}
});
})
}else{
this.scaleImageIndex = index
}
},
LikeFile(item:any,str:string){
let parent:any = this.$parent
@@ -370,8 +476,12 @@ export default defineComponent({
},
});
</script>
<style lang="less">
<style>
.scaleImage_modal{
overflow: visible !important;
}
</style>
<style lang="less" scoped>
.scaleImage_modal {
.ant-modal-body {
display: flex;
@@ -380,12 +490,14 @@ export default defineComponent({
.scaleImage_content{
display: flex;
justify-content: center;
margin-top: calc(5rem*1.2);
height: 75%;
// margin-top: calc(5rem*1.2);
// height: 75%;
height: 100%;
position: relative;
.productImg_modal{
position: absolute;
left: 0;
z-index: 9;
.productImg_left{
width: 100%;
.productImg_content_item_generate_btn{
@@ -398,10 +510,15 @@ export default defineComponent({
}
.scaleImage_content_imgBox{
position: relative;
max-width: 70rem;
// max-width: 70rem;
width: 100%;
text-align: center;
justify-content: center;
img{
width: auto;
height: 100%;
max-width: 40rem;
object-fit: contain;
}
&.active{
display: flex;
@@ -427,6 +544,7 @@ export default defineComponent({
display: flex;
align-items: center;
justify-content: center;
z-index: 2;
.operate_icon{
font-size: 1.8rem;
color: #fff;
@@ -444,7 +562,7 @@ export default defineComponent({
}
.scaleImage_content:hover{
.scaleImage_content_imgBox:hover{
.img_operate_block{
opacity: 1;
}
@@ -456,6 +574,9 @@ export default defineComponent({
justify-content: center;
align-items: center;
width: 100%;
top: 100%;
left: 0;
position: absolute;
.nav_left,.nav_right{
cursor: pointer;
top: 50%;

View File

@@ -79,9 +79,11 @@ export default defineComponent({
transform: translate(-50%,-50%);
width: 80%;
height: auto;
max-height: 80vh;
position: absolute;
video{
width: 100%;
max-height: 80vh;
height: 100%;
object-fit: contain;
}

View File

@@ -62,12 +62,16 @@
</a-select> -->
<div>{{ sex.label }}</div>
</div>
<div class="placement_point_item" v-for="(point,index) in pointList" :key="index" >
<div class="placement_point_item" v-for="(point,index) in pointList" :key="index" @touchmove="touchmove($event)">
<div class="ponit_title">{{point.title}}</div>
<div class="point_list">
<div class="point_item" v-for="item in point.pointList" :key="item.color" :style="{borderColor:item.color,visibility:item.show?'inherit':'hidden'}" @mousedown="AddDian(item)"><div class="point_block" :style="{background:item.color}"></div></div>
<div class="point_item" v-for="item in point.pointList" :key="item.color" :style="{borderColor:item.color,visibility:item.show?'inherit':'hidden'}" @mousedown="AddDian(item)" @touchstart="AddDian(item)"><div class="point_block" :style="{background:item.color}"></div></div>
</div>
</div>
<div class="placement_point_item placement_point_scale">
<div class="cur_picture_opterate_item" @click="changeScale(-1)"><span class="operate_icon icon_font">-</span></div>
<div class="cur_picture_opterate_item" @click="changeScale(1)"><span class="operate_icon icon_font">+</span></div>
</div>
<div class="placement_point_item placement_point_item_btn">
<span class="started_btn" @click="setPoint">{{ $t('ModelPlacement.Point') }}</span>
</div>
@@ -89,7 +93,7 @@
<div class="img_content_block" ref="imgbox">
<div :style="{width: imgBox.width+'px', height:imgBox.height +'px',top:imgBox.y+'px',left:imgBox.x+'px',position:'absolute'}">
<div :class="['ponit_click',isRemoveStatus?'remove_point_click':'']" v-show="!perviewUrl" v-for="(item,index) in locationList" :key="item" :style="{left:item.left+'px', top:item.top+'px',borderColor:item.color}" @mousedown="getMouseDown($event,item,index)" @mousemove="startMove($event)">
<div :class="['ponit_click',isRemoveStatus?'remove_point_click':'']" v-show="!perviewUrl" v-for="(item,index) in locationList" :key="item" :style="{left:item.left+'px', top:item.top+'px',borderColor:item.color}" @mousedown="getMouseDown($event,item,index)" @touchstart="getMouseDown(getMousePosition($event),item,index)" @mousemove="mouseMove($event)" @touchmove="touchmove($event)">
<div class="placement_add_point_content" :style="{background:item.color}" v-show="!isRemoveStatus"></div>
<div class="icon iconfont icon-guanbi" v-show="isRemoveStatus"></div>
</div>
@@ -142,6 +146,7 @@ import { VueCropper } from "vue-cropper";
import { useStore } from "vuex";
import { Modal,message } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { getMousePosition } from "@/tool/mdEvent";
import { useI18n } from 'vue-i18n';
export default defineComponent({
components:{
@@ -184,7 +189,8 @@ export default defineComponent({
sexList,
cropperTime,
t
t,
getMousePosition
}
},
data(){
@@ -209,17 +215,22 @@ export default defineComponent({
autoCropWidth: '0', //默认生成截图框宽度
autoCropHeight: '0', //默认生成截图框高度
fixed: true, //是否开启截图框宽高固定比例
// fixedBox: false, //固定截图框大小,不允许改变//上传系统模特使用
fixedBox: true, //固定截图框大小,不允许改变
fixedNumber: [1, 2.125], //截图框的宽高比例
full: false, //false按原比例裁切图片不失真
// full: true, //false按原比例裁切图片不失真
full: false, //false按原比例裁切图片不失真//上传模特使用
// canMove: false, //上传图片是否可以移动//上传系统模特使用
canMove: true, //上传图片是否可以移动
canMoveBox: false, //截图框能否拖动
original: false, //上传图片按照原始比例渲染
centerBox: false, //截图框是否被限制在图片里面
height: true, //是否按照设备的dpr 输出等比例图片
// infoTrue: false, //true为展示真实输出图片宽高false展示看到的截图框宽高
infoTrue: true, //true为展示真实输出图片宽高false展示看到的截图框宽高
maxImgSize:'2000', //限制图片最大宽度和高度
enlarge: 7, //图片根据截图框输出比例倍数
enlarge: 1, //图片根据截图框输出比例倍数
// enlarge: 7, //图片根据截图框输出比例倍数
mode: 'auto 90%', //图片默认渲染方式
limitMinSize:'100%',
imgLoad:()=>{
@@ -271,7 +282,8 @@ export default defineComponent({
}
// imgBoxSize.style.backgroundImage = 'url('+require('@assets/images/library/lemaleBG.png')')'
imgBoxSize.addEventListener('mousemove',this.startMove)
imgBoxSize.addEventListener('mousemove',this.mouseMove)
imgBoxSize.addEventListener('touchmove',this.touchmove)
this.setImageSize()
})
},800)
@@ -429,7 +441,14 @@ export default defineComponent({
changeRemoveStatus(){
this.isRemoveStatus = true
},
mouseMove(event:any){
let e = getMousePosition(event,false)
this.startMove(e)
},
touchmove(event:any){
let e = getMousePosition(event,true)
this.startMove(e)
},
startMove(event:any){
if(this.isRemoveStatus){
return
@@ -452,6 +471,7 @@ export default defineComponent({
this.currentSign.left = event.clientX - this.imgBox.left - this.imgBox.x - this.moveOriginal.posX -12
this.currentSign.top = event.clientY + scrollTop - this.imgBox.top - this.imgBox.y -this.moveOriginal.posY -12
document.addEventListener('mouseup', this.getMouseOver);
document.addEventListener('touchend', this.getMouseOver);
this.$forceUpdate()
this.setBoundarySign()
@@ -513,6 +533,9 @@ export default defineComponent({
this.startDian = false
this.currentSign = {}
document.removeEventListener('mouseup', this.getMouseOver);
document.removeEventListener('touchend', this.getMouseOver);
document.removeEventListener('mousemove',this.mouseMove)
document.removeEventListener('touchmove',this.touchmove)
},
closeModal(){
@@ -601,20 +624,25 @@ export default defineComponent({
}
},
changeScale(num:any) {
num = num || 1;
let cropper:any = this.$refs.cropper
cropper.changeScale(num);
},
async confrimSubmit(){
let modelType = 'Library'
if(this.userInfo.userId == 88 || this.userInfo.userId == 83){
modelType = this.modelType
}
let param = {
libraryId:this.printObject.id,
templateId:this.printObject.templateId || null,
modelType:'Library',
modelType:modelType,
modelSex:this.sex,
checkMd5:1,
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
...await this.getPrintLocation()
}
if(this.userInfo.userId == 88 || this.userInfo.userId == 83){
param.modelType = this.modelType
}
this.isShowMark = true
Https.axiosPost(Https.httpUrls.saveOrEditTemplatePoint, param).then(
@@ -630,19 +658,19 @@ export default defineComponent({
},
customRequest(){
let modelType = 'Library'
if(this.userInfo.userId == 88 || this.userInfo.userId == 83){
modelType = this.modelType
}
let new_data = {
file:this.printObject.file,
level1Type:'Models',
level2Type:'',
checkMd5:1,
sex:this.sex,
modelType:'Library',
modelType:modelType,
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
}
if(this.userInfo.userId == 88 || this.userInfo.userId == 83){
new_data.modelType = this.modelType
// new_data.sex = this.sex
}
this.isShowMark = true
return new Promise((resolve,reject)=>{
Https.axiosPost(Https.httpUrls.libraryUpload, new_data,{headers:{'Content-Type': 'multipart/form-data'}}).then(
@@ -688,20 +716,22 @@ export default defineComponent({
},
async getPrintLocation(){
let {width , height} = this.imgBox
if(this.modelType == 'System'){
await new Promise((resolve, reject) => {
let img = new Image()
img.src = this.option.img
img.onload = () => {
width = img.width
height = img.height
resolve(true)
}
})
}
// if(this.modelType == 'System'){
// await new Promise((resolve, reject) => {
// let img = new Image()
// img.src = this.option.img
// img.onload = () => {
// width = img.width
// height = img.height
// resolve(true)
// }
// })
// }
let locationData:any = {}
let returnData:any = {}
let newLocationList = JSON.parse(JSON.stringify(this.locationList))
//进行字段归类
for(let item of newLocationList){
locationData[item.field] = locationData[item.field] || []
@@ -945,6 +975,25 @@ export default defineComponent({
}
}
.placement_point_scale{
justify-content: center;
border: 1px solid #9a9a9a;
border-radius: 1rem;
width: 40%;
margin: 0 auto;
margin-bottom: 3rem;
div:nth-child(1){
border-right: 1px solid #9a9a9a;
}
div{
font-size: 2rem;
cursor: pointer;
width: 3rem;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.placement_content_operate_list{
@@ -1069,7 +1118,7 @@ export default defineComponent({
.vue-cropper{
.cropper-crop-box{
background: #fff;
pointer-events: none;
}
}
}

View File

@@ -48,7 +48,7 @@
<div class="models_placement_content">
<div class="plcaement_point_content">
<div class="select_block">
<a-select
<!-- <a-select
ref="select"
v-model:value="sex.value"
:options="sexList"
@@ -59,12 +59,13 @@
style="color: #343579"
></span
></template>
</a-select>
</a-select> -->
<div>{{ sex.label }}</div>
</div>
<div class="placement_point_item" v-for="(point,index) in pointList" :key="index" @touchmove="startMove($event)">
<div class="placement_point_item" v-for="(point,index) in pointList" :key="index" @touchmove="touchmove($event)">
<div class="ponit_title">{{point.title}}</div>
<div class="point_list">
<div class="point_item" v-for="item in point.pointList" :key="item.color" :style="{borderColor:item.color,visibility:item.show?'inherit':'hidden'}" @touchstart="AddDian(item)"><div class="point_block" :style="{background:item.color}"></div></div>
<div class="point_item" v-for="item in point.pointList" :key="item.color" :style="{borderColor:item.color,visibility:item.show?'inherit':'hidden'}" @mousedown="AddDian(item)" @touchstart="AddDian(item)"><div class="point_block" :style="{background:item.color}"></div></div>
</div>
</div>
<div class="placement_point_item placement_point_scale">
@@ -92,7 +93,7 @@
<div class="img_content_block" ref="imgbox">
<div :style="{width: imgBox.width+'px', height:imgBox.height +'px',top:imgBox.y+'px',left:imgBox.x+'px',position:'absolute'}">
<div :class="['ponit_click',isRemoveStatus?'remove_point_click':'']" v-show="!perviewUrl" v-for="(item,index) in locationList" :key="item" :style="{left:item.left+'px', top:item.top+'px',borderColor:item.color}" @touchstart="getMouseDown($event,item,index)" @touchmove="startMove($event)">
<div :class="['ponit_click',isRemoveStatus?'remove_point_click':'']" v-show="!perviewUrl" v-for="(item,index) in locationList" :key="item" :style="{left:item.left+'px', top:item.top+'px',borderColor:item.color}" @mousedown="getMouseDown($event,item,index)" @touchstart="getMouseDown(getMousePosition($event),item,index)" @mousemove="mouseMove($event)" @touchmove="touchmove($event)">
<div class="placement_add_point_content" :style="{background:item.color}" v-show="!isRemoveStatus"></div>
<div class="icon iconfont icon-guanbi" v-show="isRemoveStatus"></div>
</div>
@@ -145,6 +146,7 @@ import { VueCropper } from "vue-cropper";
import { useStore } from "vuex";
import { Modal,message } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { getMousePosition } from "@/tool/mdEvent";
import { useI18n } from 'vue-i18n';
export default defineComponent({
components:{
@@ -168,32 +170,7 @@ export default defineComponent({
])
let cropperTime:any = ref()
let option:any = ref({
img: '', //裁剪图片的地址
outputSize: 1, //裁剪生成图片的质量(可选0.1 - 1)
outputType: 'png', //裁剪生成图片的格式jpeg || png || webp
info: false, //图片大小信息
canScale: true, //图片是否允许滚轮缩放
autoCrop: true, //是否默认生成截图框
autoCropWidth: '0', //默认生成截图框宽度
autoCropHeight: '0', //默认生成截图框高度
fixed: true, //是否开启截图框宽高固定比例
fixedBox: true, //固定截图框大小,不允许改变
fixedNumber: [1, 2.125], //截图框的宽高比例
full: false, //false按原比例裁切图片不失真
canMove: true, //上传图片是否可以移动
canMoveBox: false, //截图框能否拖动
original: false, //上传图片按照原始比例渲染
centerBox: false, //截图框是否被限制在图片里面
height: true, //是否按照设备的dpr 输出等比例图片
infoTrue: true, //true为展示真实输出图片宽高false展示看到的截图框宽高
maxImgSize:'2000', //限制图片最大宽度和高度
enlarge: 7, //图片根据截图框输出比例倍数
mode: 'auto 90%', //图片默认渲染方式
limitMinSize:'100%',
imgLoad:()=>{
}
})
let {t} = useI18n()
return {
store,
@@ -211,8 +188,9 @@ export default defineComponent({
sex,
sexList,
cropperTime,
option,
t
t,
getMousePosition
}
},
data(){
@@ -226,21 +204,48 @@ export default defineComponent({
perviewUrl:'',//预览的图片地址
isShowMark:false,
modelType:'Library',
option:{
img: '', //裁剪图片的地址
outputSize: 1, //裁剪生成图片的质量(可选0.1 - 1)
outputType: 'png', //裁剪生成图片的格式jpeg || png || webp
info: false, //图片大小信息
canScale: true, //图片是否允许滚轮缩放
autoCrop: true, //是否默认生成截图框
autoCropWidth: '0', //默认生成截图框宽度
autoCropHeight: '0', //默认生成截图框高度
fixed: true, //是否开启截图框宽高固定比例
// fixedBox: false, //固定截图框大小,不允许改变//上传系统模特使用
fixedBox: true, //固定截图框大小,不允许改变
fixedNumber: [1, 2.125], //截图框的宽高比例
full: false, //false按原比例裁切图片不失真
// canMove: false, //上传图片是否可以移动//上传系统模特使用
canMove: true, //上传图片是否可以移动
canMoveBox: false, //截图框能否拖动
original: false, //上传图片按照原始比例渲染
centerBox: false, //截图框是否被限制在图片里面
height: true, //是否按照设备的dpr 输出等比例图片
infoTrue: true, //true为展示真实输出图片宽高false展示看到的截图框宽高
maxImgSize:'2000', //限制图片最大宽度和高度
enlarge: 7, //图片根据截图框输出比例倍数
mode: 'auto 90%', //图片默认渲染方式
limitMinSize:'100%',
imgLoad:()=>{
}
},
}
},
mounted(){
let userInfo:any = getCookie("userInfo")
this.userInfo = JSON.parse(userInfo);
// this.getSex()
this.option.imgLoad = ()=>{
this.setImageSize()
}
},
methods:{
formatter(value:number){
return `${value}%`;
},
showPlacementModal(data:any,sex:any){
// this.sex = arr[0].value
this.sex = sex
this.placementShow = true
this.printObject = {
@@ -250,6 +255,8 @@ export default defineComponent({
setTimeout(()=>{
nextTick().then(()=>{
let image:any = new Image()
image.src = this.option.img
let imgbox:any = this.$refs.imgbox
let imgBoxSize = imgbox.getElementsByClassName('cropper-crop-box')[0]
let imgBoxSizeBG = imgbox.getElementsByClassName('cropper-view-box')[0]
@@ -272,7 +279,8 @@ export default defineComponent({
}
// imgBoxSize.style.backgroundImage = 'url('+require('@assets/images/library/lemaleBG.png')')'
imgBoxSize.addEventListener('touchmove',this.startMove)
imgBoxSize.addEventListener('mousemove',this.mouseMove)
imgBoxSize.addEventListener('touchmove',this.touchmove)
this.setImageSize()
})
},800)
@@ -288,26 +296,32 @@ export default defineComponent({
cropper.cropOffsertX = cropper.getImgAxis().x1+(cropper.scale*cropper.trueWidth/2-cropper.cropW/2)
cropper.cropOffsertY = cropper.getImgAxis().y1
}
},
realTime(data:any) {
this.cropperTime = setTimeout(()=>{
this.setImageSize()
clearTimeout(this.cropperTime)
},100)
let cropper:any = this.$refs.cropper
// if(cropper.h == cropper.cropH){
this.cropperTime = setTimeout(()=>{
this.setImageSize()
clearTimeout(this.cropperTime)
},100)
// }
},
setImageSize(){
this.setCropperWH()
let imgbox:any = this.$refs.imgbox
let imgBoxSize = imgbox.getElementsByClassName('cropper-crop-box')?.[0]
let imgBoxSize = imgbox.getElementsByClassName('cropper-crop-box')[0]
let position = imgBoxSize.getBoundingClientRect()
let position1 = imgbox.getBoundingClientRect()
let cropper:any = this.$refs.cropper
this.imgBox = {
width:cropper.cropW,
height:cropper.cropH,
left : position.left,
top:position.top,
left : position1.left,
top:position1.top,
scrollTop:imgBoxSize.scrollTop || 0,
x:cropper.getCropAxis().x1,
y:cropper.getCropAxis().y1,
@@ -323,7 +337,6 @@ export default defineComponent({
label:item.value,
})
});
// this.sex = arr[0].value
this.sexList = arr
}
})
@@ -425,31 +438,40 @@ export default defineComponent({
changeRemoveStatus(){
this.isRemoveStatus = true
},
mouseMove(event:any){
let e = getMousePosition(event,false)
this.startMove(e)
},
touchmove(event:any){
let e = getMousePosition(event,true)
this.startMove(e)
},
startMove(event:any){
if(this.isRemoveStatus){
if(this.isRemoveStatus){
return
}
let imgbox:any = this.$refs.imgbox
let scrollTop = imgbox.scrollTop;
if(event.targetTouches[0].pageX > this.imgBox.left){
if(this.intObj){
this.currentSign.left = event.targetTouches[0].pageX - this.imgBox.left
this.currentSign.top = event.targetTouches[0].pageY + scrollTop - this.imgBox.top
this.currentSign.color = this.intObj.color
this.currentSign.type= this.intObj.type
this.currentSign.field = this.intObj.field
this.locationList.push(this.currentSign)
this.intObj.show = false
this.intObj = null
}else{
if(this.startDian){
this.currentSign.left = event.targetTouches[0].pageX - this.imgBox.left -12
this.currentSign.top = event.targetTouches[0].pageY + scrollTop - this.imgBox.top -12
document.addEventListener('touchend', this.getMouseOver);
this.$forceUpdate()
this.setBoundarySign()
}
let imgBoxSize = imgbox.getElementsByClassName('cropper-crop-box')[0]
let scrollTop = imgBoxSize.scrollTop;
if(this.intObj){
this.currentSign.left = event.clientX - this.imgBox.left
this.currentSign.top = event.clientY + scrollTop - this.imgBox.top
this.currentSign.color = this.intObj.color
this.currentSign.type= this.intObj.type
this.currentSign.field = this.intObj.field
this.locationList.push(this.currentSign)
this.intObj.show = false
this.intObj = null
}else{
//鼠标移动
if(this.startDian){
this.currentSign.left = event.clientX - this.imgBox.left - this.imgBox.x - this.moveOriginal.posX -12
this.currentSign.top = event.clientY + scrollTop - this.imgBox.top - this.imgBox.y -this.moveOriginal.posY -12
document.addEventListener('mouseup', this.getMouseOver);
document.addEventListener('touchend', this.getMouseOver);
this.$forceUpdate()
this.setBoundarySign()
}
}
},
@@ -496,8 +518,9 @@ export default defineComponent({
// 计算出鼠标在签名域上的偏移
// this.moveOriginal.posX = event.offsetX
// this.moveOriginal.posY = event.offsetY // 1为边框
this.moveOriginal.posX = event.targetTouches[0].pageX - this.imgBox.left - this.currentSign.left
this.moveOriginal.posY = event.targetTouches[0].pageY - this.imgBox.top- this.currentSign.top // 1为边框
this.moveOriginal.posX = 0
this.moveOriginal.posY = 0 // 1为边框
this.startDian = true
}
@@ -506,7 +529,10 @@ export default defineComponent({
getMouseOver(){//鼠标抬起
this.startDian = false
this.currentSign = {}
document.removeEventListener('touchend', this.getMouseOver);
document.removeEventListener('mouseup', this.getMouseOver);
document.removeEventListener('touchend', this.getMouseOver);
document.removeEventListener('mousemove',this.mouseMove)
document.removeEventListener('touchmove',this.touchmove)
},
closeModal(){
@@ -546,6 +572,7 @@ export default defineComponent({
this.locationList = []
this.pointList = JSON.parse(JSON.stringify(this.oldPointList))
this.locationList = JSON.parse(JSON.stringify(this.oldLocationList))
// this.locationList = JSON.parse(JSON.stringify(this.locationList))
},
submitPlacement(){
@@ -558,7 +585,7 @@ export default defineComponent({
// this.$emit('handleCropperSuccess',{file:file, fileData:this.cropperFileData})
// })
let cropper:any = this.$refs.cropper,
that = this
that = this
if((this.modelType == 'System' && this.userInfo.userId == 88) || (this.modelType == 'System' &&this.userInfo.userId == 83)){
if(this.printObject.templateId){
this.printObject.id = this.printObject.relationId
@@ -599,20 +626,20 @@ export default defineComponent({
let cropper:any = this.$refs.cropper
cropper.changeScale(num);
},
confrimSubmit(){
async confrimSubmit(){
let modelType = 'Library'
if(this.userInfo.userId == 88 || this.userInfo.userId == 83){
modelType = this.modelType
}
let param = {
libraryId:this.printObject.id,
templateId:this.printObject.templateId || null,
modelType:'Library',
modelType:modelType,
modelSex:this.sex,
checkMd5:1,
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
...this.getPrintLocation()
...await this.getPrintLocation()
}
if(this.userInfo.userId == 88 || this.userInfo.userId == 83){
param.modelType = this.modelType
}
this.isShowMark = true
Https.axiosPost(Https.httpUrls.saveOrEditTemplatePoint, param).then(
@@ -628,19 +655,19 @@ export default defineComponent({
},
customRequest(){
let modelType = 'Library'
if(this.userInfo.userId == 88 || this.userInfo.userId == 83){
modelType = this.modelType
}
let new_data = {
file:this.printObject.file,
level1Type:'Models',
level2Type:'',
checkMd5:1,
sex:this.sex,
modelType:'Library',
modelType:modelType,
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
}
if(this.userInfo.userId == 88 || this.userInfo.userId == 83){
new_data.modelType = this.modelType
new_data.sex = this.sex
}
this.isShowMark = true
return new Promise((resolve,reject)=>{
Https.axiosPost(Https.httpUrls.libraryUpload, new_data,{headers:{'Content-Type': 'multipart/form-data'}}).then(
@@ -684,11 +711,26 @@ export default defineComponent({
});
})
},
getPrintLocation(){
async getPrintLocation(){
let {width , height} = this.imgBox
console.log(width,height);
// if(this.modelType == 'System'){
// await new Promise((resolve, reject) => {
// let img = new Image()
// img.src = this.option.img
// img.onload = () => {
// width = img.width
// height = img.height
// resolve(true)
// }
// })
// }
let locationData:any = {}
let returnData:any = {}
let newLocationList = JSON.parse(JSON.stringify(this.locationList))
//进行字段归类
for(let item of newLocationList){
locationData[item.field] = locationData[item.field] || []
@@ -703,6 +745,8 @@ export default defineComponent({
returnData[v.type] = [v.left, v.top]
});
}
console.log(returnData);
return returnData
},
@@ -712,17 +756,17 @@ export default defineComponent({
}
},
printPreview(){
async printPreview(){
let file = this.printObject.templateId ? null :this.printObject.file,
models = {
libraryId:this.printObject.relationId || null,
templateId:this.printObject.templateId || null,
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
sex:this.sex,
...this.getPrintLocation()
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
...await this.getPrintLocation()
}
let cropper:any = this.$refs.cropper
cropper.getCropData((value:any)=>{
let cropper:any = this.$refs.cropper
await cropper.getCropData((value:any)=>{
file = base64toFile(value,this.printObject.name);
file.uid = this.printObject.file?.uid?this.printObject.file.uid:''
let formData = new FormData();
@@ -731,7 +775,7 @@ export default defineComponent({
if(this.isShowMark){
return
}
// this.isShowMark = true
this.isShowMark = true
Https.axiosPost(Https.httpUrls.libraryModelsDot, formData,{headers:{'Content-Type': 'multipart/form-data'}}).then(
(rv: any) => {
this.perviewUrl = rv
@@ -741,6 +785,8 @@ export default defineComponent({
this.isShowMark = false
});
})
},
backPreview(){
@@ -788,7 +834,7 @@ export default defineComponent({
.models_placement_body{
width: 100%;
height: 100%;
overflow: hidden;
.palcement_modal_header{
position: relative;
height: 6.6rem;
@@ -850,7 +896,6 @@ export default defineComponent({
padding: 3rem 2.7rem 0 1.4rem;
.select_block{
// background: #FFFFFF;
overflow: hidden;
margin-bottom: 3rem;
color: #1A1A1A !important;
.ant-select{
@@ -881,7 +926,6 @@ export default defineComponent({
color: #1A1A1A !important;
}
}
.placement_point_item{
display: flex;
justify-content: space-between;
@@ -959,7 +1003,7 @@ export default defineComponent({
position: absolute;
right: 0;
top:18.4rem;
.placement_content_operate_item{
padding: 1.5rem 0;
text-align: center;
@@ -1021,7 +1065,7 @@ export default defineComponent({
-moz-user-select:none;
position: relative;
height: 57.6rem;
.img_content_block{
.img_content_block{
width: 40.8rem;
height: 100%;
max-height: 63.2rem;
@@ -1075,7 +1119,7 @@ export default defineComponent({
.vue-cropper{
.cropper-crop-box{
background: #fff;
pointer-events: none;
}
}
}
@@ -1095,7 +1139,7 @@ export default defineComponent({
}
.placement_img{
height: 100%;
height: 100%;
width: auto;
position: relative;
left: 50%;

View File

@@ -466,6 +466,9 @@ export default defineComponent({
Https.axiosPost(Https.httpUrls.designWorksRegisterCode, data).then(
(rv: any) => {
if (rv) {
if(rv.systemUser == 4){
rv.systemUser = 1
}
this.createTimer();
let isTest = rv.systemUser == 3?true:false
let isBeginner = rv.isBeginner == 1?true:false

View File

@@ -2,6 +2,7 @@
<div id="app">
<div class="captcha">
<input v-for="(c, index) in getCtData" :key="index"
type="number"
v-model="getCtData[index]" ref="input"
@input="e => {onInput(e.target.value, index)}"
@keydown.delete="e=>{onKeydown(e.target.value, index)}"

View File

@@ -237,7 +237,7 @@ export default defineComponent({
var remain = t_width - width * num_x;
var gap_x = remain / (num_x + 1);
this.gap_x = gap_x;
this.gap_y = gap_x > 30 ? 30 : gap_x;
this.gap_y = gap_x > 30 ? 30 : gap_x < 30 ? 20 : gap_x;
this.num_x = num_x;
var poss = [];
for (var i = 0; i < num_x; i++) poss.push(0);
@@ -343,6 +343,8 @@ export default defineComponent({
width: 50%;
display: flex;
align-items: center;
flex: 1;
overflow: hidden;
img{
width: 25px;
height: 25px;
@@ -373,11 +375,15 @@ export default defineComponent({
}
.falls_item_detail{
display: flex;
width: 40%;
width: 20%;
// width: 40%;
// width: 20%;
// width: 7rem;
width: 70px;
// width: 70px;
width: auto;
justify-content: space-between;
>label:nth-child(1){
margin-right: 2rem;
}
>label{
// cursor: pointer;
}

View File

@@ -49,11 +49,16 @@
</div> -->
<!-- <div class="scaleImage_chunk_title_intro">zhh</div> -->
<div class="detail_right_user detail_left_right_item">
<!-- <div class="detail_right_user_head">
<img v-lazy="scaleImageData?.imgUrl">
</div> -->
<div class="detail_right_user_head" @click="openOtherUsers">
<img v-lazy="scaleImageData?.avatar">
</div>
<div class="detail_right_user_content">
<div class="scaleImage_chunk_title_intro">@{{scaleImageData.userName}}</div>
<div>
<div class="scaleImage_chunk_title_intro">@{{scaleImageData.userName}}</div>
<div v-if="scaleImageData.isFollow == 0 && userInfo?.userId != scaleImageData?.accountId" style="margin-bottom: 0;" class="started_btn" @click="setFollow()" >{{$t('newScaleImage.Follow')}}</div>
<div v-else-if="userInfo?.userId != scaleImageData?.accountId" class="started_btn" style="margin-bottom: 0;" @click="setFollow()" >{{$t('newScaleImage.Unfollow')}}</div>
</div>
<div v-if="scaleImageData.original == 1" class="scaleImage_chunk_title_intro scaleImage_chunk_title_Original">{{$t('newScaleImage.Original')}}</div>
<div v-else @click="originalGetDetail()" class="scaleImage_chunk_title_intro">{{$t('newScaleImage.from')}}<span :class="{active:scaleImageData.jumpable == 1}"> @{{ scaleImageData.originalUserName }}/{{ scaleImageData.portfolioName }}</span></div>
<!-- <div class="scaleImage_chunk_title_intro">个性签名</div>
@@ -267,7 +272,7 @@ import fullScreenImg from '@/component/HomePage/fullScreenImg.vue'
export default defineComponent({
components:{fullScreenImg},
emits:['deletePorfolio','bbb'],
emits:['deletePorfolio'],
setup(props:any,{emit}) {
let {t} = useI18n()
//首先在setup中定义
@@ -344,7 +349,6 @@ export default defineComponent({
// let parent:any = this.$parent
// parent.likeFile(item,str)
// },
let getDeatilData = {}
let originalGetDetail = ()=>{
if(imgData.scaleImageData.jumpable != 1){
return message.info(t('newScaleImage.jsContent6'))
@@ -353,8 +357,10 @@ export default defineComponent({
}
let getDetail = (value:any,str:string)=>{
imgData.loadingShow = true
let data = value
getDeatilData = value
// let data = value
let data = {
id:value.id
}
Https.axiosPost(Https.httpUrls.getPorfolioDetail,data).then(
(rv: any) => {
imgData.loadingShow = false
@@ -489,7 +495,6 @@ export default defineComponent({
imgData.scaleImageData.likeNum += 1
imgData.scaleImageData.isLike = 1
}
// getDetail(getDeatilData,'zan')
})
.catch((rv) => {
});
@@ -552,6 +557,27 @@ export default defineComponent({
}
});
}
let setFollow = () =>{
let url = Https.httpUrls.porfolioFollow
if(imgData.scaleImageData.isFollow == 1)url = Https.httpUrls.porfolioCancelFollow
Https.axiosGet(url, {params:{followeeId:imgData.scaleImageData.accountId}})
.then((rv) => {
if(imgData.scaleImageData.isFollow == 1){
imgData.scaleImageData.isFollow = 0
}else{
imgData.scaleImageData.isFollow = 1
}
})
}
let openOtherUsers = ()=>{
const routeUrl = router.resolve({
path:'/home/otherUsers',
query:{
userId:imgData.scaleImageData.accountId
}
})
window.open(routeUrl.href,'_blank')
}
watch(()=>imgData.scaleImageIndex,
(newVal,oldVal)=>{
let dom:any = document.querySelector('.newScaleImage_left .nav_centent')
@@ -585,6 +611,8 @@ export default defineComponent({
setComment,
setPortfolioLike,
setDeleteComment,
setFollow,
openOtherUsers,
};
},
directives:{
@@ -725,6 +753,7 @@ export default defineComponent({
font-size: 1.6rem;
font-weight: 300;
color: #535353;
text-align: left;
// overflow: hidden;
// text-overflow: ellipsis;
// white-space: nowrap;
@@ -758,6 +787,7 @@ export default defineComponent({
flex-direction: row;
justify-content: space-between;
width: 100%;
align-items: flex-start;
.scaleImage_chunk_title_Original{
color: #39215b;
background: #c9a2ff;
@@ -774,14 +804,21 @@ export default defineComponent({
}
}
}
.started_btn{
margin-top: 1rem;
border-radius: 6px;
padding: 0 1rem;
}
}
.detail_right_user_head{
border-radius: 50%;
overflow: hidden;
margin-right: var(--margin);
flex-shrink: 0;
cursor: pointer;
img{
width: 10rem;
height: 10rem;
width: 8rem;
height: 8rem;
object-fit: cover;
}
}
@@ -1187,7 +1224,7 @@ export default defineComponent({
.detail_right_work_detail{
.scaleImage_chunk_title_intro{
margin-top: calc(var(--padding) / 2);
height: auto
height: auto;
}
}

View File

@@ -31,11 +31,16 @@
</div> -->
<!-- <div class="scaleImage_chunk_title_intro">zhh</div> -->
<div class="detail_right_user detail_left_right_item">
<!-- <div class="detail_right_user_head">
<img v-lazy="scaleImageData?.imgUrl">
</div> -->
<div class="detail_right_user_head">
<img v-lazy="scaleImageData?.avatar">
</div>
<div class="detail_right_user_content">
<div class="scaleImage_chunk_title_intro">@{{scaleImageData.userName}}</div>
<!-- <div class="scaleImage_chunk_title_intro">@{{scaleImageData.userName}}</div> -->
<div>
<div class="scaleImage_chunk_title_intro">@{{scaleImageData.userName}}</div>
<div v-if="scaleImageData.isFollow == 0" class="started_btn" @click="setFollow()" >{{$t('newScaleImage.Follow')}}</div>
<div v-else class="started_btn" @click="setFollow()" >{{$t('newScaleImage.Unfollow')}}</div>
</div>
<div v-if="scaleImageData.original == 1" class="scaleImage_chunk_title_intro scaleImage_chunk_title_Original">{{$t('newScaleImage.Original')}}</div>
<div v-else @click="originalGetDetail()" class="scaleImage_chunk_title_intro">{{$t('newScaleImage.from')}}<span :class="{active:scaleImageData.jumpable == 1}"> @{{ scaleImageData.originalUserName }}/{{ scaleImageData.portfolioName }}</span></div>
<!-- <div class="scaleImage_chunk_title_intro">个性签名</div>
@@ -716,6 +721,7 @@ export default defineComponent({
flex-direction: row;
justify-content: space-between;
width: 100%;
align-items: flex-start;
.scaleImage_chunk_title_Original{
color: #39215b;
background: #c9a2ff;
@@ -732,16 +738,18 @@ export default defineComponent({
}
}
}
}
}
.detail_right_user_head{
border-radius: 50%;
overflow: hidden;
margin-right: var(--margin);
flex-shrink: 0;
img{
width: 10rem;
height: 10rem;
width: 7rem;
height: 7rem;
object-fit: cover;
}
}
.detail_right_user_head:hover{

View File

@@ -33,6 +33,9 @@
<div class="publidh_right_name publidh_content_item">
<div class="publidh_content_item_title">{{$t('Publish.CollectionTitle')}}</div>
<input type="text" v-model="subPublishDate.portfolioName">
<!-- <div class="publidh_content_item_tag">
<a-tag closable color="purple">#RCAworkshop_2024</a-tag>
</div> -->
</div>
<div class="publidh_right_name publidh_content_item">
<div class="publidh_content_item_title">{{$t('Publish.Description')}}</div>
@@ -260,7 +263,6 @@ export default defineComponent({
}
let pushTag = (tag:any,index:number)=>{
// let selectTag = tagList.value.splice(index,1)[0]
// selectTagList.value.push(selectTag)
// if(tag.tag == 'RCAworkshop_2024'){
// publishData.subPublishDate.portfolioDes = '#AiDA x RCA workshop '
// }
@@ -311,7 +313,23 @@ export default defineComponent({
display: flex;
flex-direction: column;
height: 100%;
}
:deep(.ant-tag){
// position: absolute;
// left: 10px;
// top: 50%;
// transform: translateY(-50%);
}
// .publidh_content_item_tag{
// position: relative;
// .ant-tag{
// position: absolute;
// left: 10px;
// top: 50%;
// transform: translateY(-50%);
// }
// }
.publish_content_bottom{
--border-color: #c4c4c4;
display: flex;
@@ -342,6 +360,32 @@ export default defineComponent({
font-weight: 600;
font-size: 1.8rem;
margin-bottom: 1rem;
}
.publidh_content_item_tagList,.publidh_content_item_tag{
// height: 4rem;
border-radius: 1rem;
display: flex;
align-items: center;
flex-wrap: wrap;
}
.publidh_content_item_tagList{
margin-top: 1rem;
.ant-tag{
cursor: pointer;
margin-bottom: 8px;
}
}
.publidh_content_item_tag{
border: .2rem solid var(--border-color);
// height: 4rem;
padding: 2rem;
padding-right: 0rem;
.ant-tag{
cursor: pointer;
margin-bottom: 8px;
}
}
.publidh_content_item_intro{

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,891 @@
<template>
<div class="generalMiniCanvas">
<div class="addDetails_canvasCenter">
<div class="generalMiniCanvas_input generalMiniCanvas_item" :class="{spread:spreadState}">
<div class="generalMiniCanvas_input_item brushwork" v-show="canvasState == 'pencil'">
<span >{{ $t('exportModel.Brushwork') }}:</span>
<a-select ref="select" class="label_select" size="small" v-model:value="brushworkValue"
style="width: 20rem"
@change="brushworkChange"
>
<a-select-option class="label_select_item" v-for="item in brushList" :value="item.value">
<img :src="item.url" alt="">
</a-select-option>
</a-select>
</div>
<div class="generalMiniCanvas_input_item" v-show="(canvasState != 'move' && canvasState != 'liquidation' && canvasState != 'movePosition' && canvasState != 'zoomIn' && canvasState != 'zoomOut' && brushworkValue != 'RibbonBrush' && brushworkValue != 'LongfurBrush')">
<span>{{ $t('exportModel.Size') }}</span>
<input type="range" @input="setPencilWidth" min="1" max="50" v-model="canvasPencilWidth[canvasState]">
</div>
<div class="generalMiniCanvas_input_item" v-show="canvasState == 'liquidation'">
<span>{{ $t('exportModel.Size') }}</span>{{ canvasPencilWidth.routes }}
<input type="range" @change="routesChange('routes')" min="1" max="100" v-model="canvasPencilWidth.routes">
</div>
<div class="generalMiniCanvas_input_item" v-show="canvasState == 'liquidation'">
<span>{{ $t('exportModel.density') }}</span>
<input type="range" @change="routesChange('density')" min="1" max="100" v-model="canvasPencilWidth.density">
</div>
<div class="generalMiniCanvas_input_item" v-show=" canvasState == 'pencil'">
<span>{{ $t('exportModel.Color') }}</span>
<input type="color" @input="setPencilColor" v-model="canvasPencilColor">
</div>
</div>
<div class="exportCanvasBox_center_data">
<div class="generalMiniCanvas_btn generalMiniCanvas_item" :class="{spread:spreadState}">
<!-- <div @click="setOperation('')" class="generalMiniCanvas_btn_item">
<div>新增</div>
</div> -->
<i class="icon iconfont icon-chehui" @click="historyState('')"></i>
<i class="icon iconfont icon-fanchehui" @click="historyState('reverse')"></i>
<i class="icon iconfont icon-move" @click="setOperation('movePosition')" :class="{active:canvasState == 'movePosition'}"></i>
<!-- <i class="icon iconfont icon-move" @click="setOperation('move')" :class="{active:canvasState == 'move'}"></i> -->
<i class="icon iconfont icon-bianji" @click="setOperation('pencil')" :class="{active:canvasState == 'pencil'}"></i>
<i class="icon iconfont icon-xiangpi_huaban1" @click="setOperation('eraser')" :class="{active:canvasState == 'eraser'}"></i>
<!-- <i class="icon iconfont icon-IC-yehua" @click="setOperation('liquidation')"></i> -->
<i class="icon iconfont icon-IC-yehua" @click="setLiquefaction()"></i>
<!-- <div class="icon iconfont icon-xiala" :class="{btnRotate:spreadState}" @click="()=>spreadState = !spreadState"></div> -->
<i class="fi fi-rr-zoom-in" @click="setOperation('zoomIn')" :class="{active:canvasState == 'zoomIn'}"></i>
<i class="fi fi-rr-zoom-out" @click="setOperation('zoomOut')" :class="{active:canvasState == 'zoomOut'}"></i>
</div>
<div class="exportCanvasBox_center_box">
<div class="exportCanvasBox_center">
</div>
<!-- <div v-show="arrows.show" class="moveDom" :style="arrows.domStyle"></div>
<div v-show="arrows.show" class="jiantouDom" :style="arrows.jiantouStyle"> </div> -->
<div class="editFrontBack_pencilbtn" v-show="loadingShow" :style="pencilbtnStyle"></div>
</div>
</div>
</div>
<div class="exportCanvasBox_submit" @click="setSubmit(false)">
<div class="started_btn">
{{ $t('addDetails.submit') }}
</div>
</div>
<liquefaction ref="liquefaction" @submitLiquefaction="submitLiquefaction"></liquefaction>
</div>
</template>
<script>
import { defineComponent, ref, reactive, watch, onMounted, onBeforeUnmount, nextTick, toRefs } from "vue";
import { Https } from "@/tool/https";
import { formatTime } from "@/tool/util";
import { setCookie, getCookie } from "@/tool/cookie";
import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import allOrder from "@/component/Pay/allOrder.vue";
import creditsDetail from "@/component/Pay/creditsDetail.vue";
import { exportSele,JSRectUpdata,JSchangeType,JScanvasMouseDown,JSSetRemoveImage,JScreateCheck,JSSetTexture } from "@/tool/canvasDrawing";
import { useI18n } from "vue-i18n";
import canvasGeneral from "@/tool/canvasGeneral";
import { getMousePosition } from "@/tool/mdEvent";
import liquefaction from "@/component/modules/liquefaction.vue";
export default defineComponent({
components: {
creditsDetail,
allOrder,liquefaction
},
emits: ['submitBase64Data'],
props: {
imgUrl: {
type: String,
default: ''
},
},
// watch: {
// // imgUrl: function(newVal, oldVal) {
// // console.log(newVal);
// // // 当propertyName数据发生变化时执行相应的操作
// // }
// imgUrl(newVal, oldVal) {
// console.log(`imgUrl changed from ${oldVal} to ${newVal}`);
// },
// },
setup(props,{emit}) {
let presentState = ref('paypal');
let showPayOrder = ref(false);
let loadingShow = ref(false);
let { t } = useI18n();
let canvas = reactive({});
let scale = 2;
let ratio = [1,1]
let exportWH = 512
let pencilbtnStyle = ref({
background:'',
width:0+'px',
height:0+'px',
display:'none',
left:0+'px',
top:0+'px',
})
let canvasBtn = reactive({
canvasState:'move',
canvasPencilWidth:{
pencil:20,
eraser:20,
routes:30,
density:30,
},
canvasPencilColor:'#000000',
spreadState:false,
})
let canvasWH = ref(0);
let arrows = ref({
show:false,
domStyle:{
left:0,
top:0,
width:0,
height:0,
},
jiantouStyle:{
height:'1px',
transform:`translateY(-100%) rotate(${90}deg)`,
}
})
watch(
() => props.imgUrl,
(newValue, oldValue) => {
init()
})
onMounted(()=>{
init()
})
onBeforeUnmount(()=>{
canvasGeneral.canvasClear()
})
let reverseCanvasState = ref([])//存放canvas操作
let normalCanvasState = ref([])//存放canvas操作
let canvasState = ref()//存放canvas操作
let keyDown = []//监听键盘的 keydown 和 keyup 事件
let isMovePostion = false
let init = ()=>{
normalCanvasState.value = []
reverseCanvasState.value = []
showPayOrder.value = true;
ratio = [1,1]
nextTick(()=>{
let canvasBox = document.querySelector(".generalMiniCanvas .exportCanvasBox_center");
document.removeEventListener('mousemove', mouseMove);
document.removeEventListener('touchmove', touchmove);
let img = new Image();
img.onload = function(){
loadingShow.value = true
let height = canvasBox.offsetHeight;
canvasWH.value = height
// canvasBox.style.width = height+'px'
let wScale = 1
let hScale = 1
if(img.width>img.height){
hScale = img.height/img.width
exportWH = img.width
}else{
wScale = img.width/img.height
exportWH = img.height
}
ratio = [wScale,hScale]
canvas = canvasGeneral.canvasInit(canvasBox,{
width:canvasWH.value * wScale,
height:canvasWH.value * hScale,
})
canvas.selection = false;
// canvas.set({
// backgroundColor: 'lightblue'
// });
scale = img.height/canvas.height
pencilbtnStyle.value.background = canvasBtn.canvasPencilColor
fabric.Object.prototype.cornerSize = 10
fabric.Object.prototype.transparentCorners = false
fabric.Image.fromURL(props.imgUrl, function(img) {
// 设置背景图对象的宽度和高度与 canvas 相同
img.scaleToWidth(canvas.width);
img.scaleToHeight(canvas.height);
img.set({
scaleX: canvas.width / img.width,
scaleY: canvas.height / img.height
});
// 将背景图添加到 canvas 的底层
canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));
if(!fabric.Object.prototype.controls.deleteControl){
JSSetRemoveImage(deleteObj)
}else{
fabric.Object.prototype.controls.deleteControl.mouseUpHandler = deleteObj
}
setPencilWidth()
updateCanvasState()
},{ crossOrigin: "Anonymous" });
// 鼠标抬起事件
canvas.on('mouse:up', function(event) {
if(isMovePostion)isMovePostion = false
if(canvasBtn.canvasState != 'move')updateCanvasState('mouseUp')
});
canvas.on("mouse:down", event=>setCanvasDown(event));
canvas.on('mouse:wheel', opt => {
const delta = opt.e.deltaY // 滚轮,向上滚一下是 -100向下滚一下是 100
let zoom = canvas.getZoom() // 获取画布当前缩放值
zoom *= 0.999 ** delta
if (zoom > 20) zoom = 20
if (zoom < 0.01) zoom = 0.01
canvas.zoomToPoint(
{ // 关键点
x: opt.e.offsetX,
y: opt.e.offsetY
},
zoom
)
opt.e.preventDefault()
opt.e.stopPropagation()
upDataPencilWidth(zoom)
})
canvas.on("mouse:move", event=>setCanvasMove(event));
//画布上移动
document.addEventListener('mousemove', mouseMove);
document.addEventListener('touchmove', touchmove);
setOperation('pencil')
img.remove()
}
img.src = props.imgUrl
})
}
let canvasKeyDown = (event) => {
if(keyDown.indexOf(event.key)>-1){
}else{
keyDown.push(event.code)
if(keyDown.indexOf('ControlLeft') > -1 && keyDown.indexOf('KeyZ') > -1 && keyDown.indexOf('ShiftLeft') > -1){
historyState('reverse')
}else if(keyDown.indexOf('ControlLeft') > -1 && keyDown.indexOf('KeyZ') > -1){
historyState('')
}
}
}
let canvasKeyUp = (event) =>{
keyDown = keyDown.filter(function(item) {
return event.code !== item;
})
}
let clearCanvas = ()=>{
canvasBtn.canvasState = 'move'
canvasBtn.spreadState = false
document.removeEventListener("keydown", canvasKeyDown);
document.removeEventListener("keyup", canvasKeyUp);
}
let mouseMove = (event)=>{
let e = getMousePosition(event,false)
setDomMove(e)
}
let touchmove = (event)=>{
let e = getMousePosition(event,true)
setDomMove(e)
}
let setDomMove = (event)=>{
if(canvas.isDrawingMode){
canvas.setCursor('none');
}
let canvasCenterBox = document.querySelector(".generalMiniCanvas .exportCanvasBox_center_box");
if(!canvasCenterBox)return
let parentX = event.clientX - canvasCenterBox.getBoundingClientRect().left
let parentY = event.clientY - canvasCenterBox.getBoundingClientRect().top
pencilbtnStyle.value.left = parentX + "px"
pencilbtnStyle.value.top = parentY+'px'
}
let setCanvasMove = (event) =>{
if(canvasBtn.canvasState == 'movePosition' && isMovePostion)setCanvasPosition(event)
}
let lastPosX = 0
let lastPosY = 0
let setCanvasDown = (event)=>{
if(canvasBtn.canvasState == 'movePosition'){
isMovePostion = true;
lastPosX = event.pointer.x;
lastPosY = event.pointer.y;
return
}
if(canvasBtn.canvasState == 'zoomIn' || canvasBtn.canvasState == 'zoomOut'){
setCanvasZoom(event)
return
}
}
let setCanvasPosition = (event)=>{
const e = event;
const vpt = canvas.viewportTransform;
vpt[4] += e.pointer.x - lastPosX; // 更新水平偏移
vpt[5] += e.pointer.y - lastPosY; // 更新垂直偏移
canvas.requestRenderAll(); // 请求重绘画布
lastPosX = e.pointer.x;
lastPosY = e.pointer.y;
}
let setCanvasZoom = (opt)=>{
let zoom = canvas.getZoom() // 获取画布当前缩放值
let num = -100
if(canvasBtn.canvasState == 'zoomOut') num = 100
zoom *= 0.999 ** num
if (zoom > 20) zoom = 20
if (zoom < 0.01) zoom = 0.01
// console.log(zoom);
canvas.zoomToPoint(
{ // 关键点
x: opt.pointer.x,
y: opt.pointer.y
},
zoom
)
opt.e.preventDefault()
opt.e.stopPropagation()
upDataPencilWidth(zoom)
}
let setOperation = (str)=>{
canvasBtn.canvasState = str
let canvasCenterBox = document.querySelector(".generalMiniCanvas .exportCanvasBox_center_box");
let classList = canvasCenterBox.className.split(' ');
canvasCenterBox.className = 'exportCanvasBox_center_box'
if(str == 'move'){
setMove()
pencilbtnStyle.value.display = `none`
canvasCenterBox.className = 'exportCanvasBox_center_box'
}else if(str == 'pencil'){
setPencil()
pencilbtnStyle.value.display = `block`
canvasCenterBox.className = 'exportCanvasBox_center_box cursorNone'
}else if(str == 'eraser'){
setEraser()
pencilbtnStyle.value.display = `block`
canvasCenterBox.className = 'exportCanvasBox_center_box cursorNone'
}else if(str == 'liquidation'){
canvas.isDrawingMode = false
canvasCenterBox.className = 'exportCanvasBox_center_box cursorNone'
}else if(str == 'zoomIn' || str == 'zoomOut'){
pencilbtnStyle.value.display = `none`
canvas.isDrawingMode = false
canvas.forEachObject((obj) =>obj.selectable = false);
canvasCenterBox.className = 'exportCanvasBox_center_box'
}else if(str == 'movePosition'){
canvas.isDrawingMode = false
pencilbtnStyle.value.display = `none`
canvas.forEachObject((obj) =>obj.selectable = false);
canvasCenterBox.className = 'exportCanvasBox_center_box cursorMove'
}
}
let brushworkValue = ref('PencilBrush')
let brushworkChange = (value)=>{
brushworkValue.value = value
setPencil()
}
let setMove = ()=>{
canvas.isDrawingMode = false
canvas.forEachObject((obj) =>obj.selectable = true);
}
let brushList = ref([
{
value:'PencilBrush',
url:'/image/brush/PencilBrush.jpg'
},{
value:'Marking',
url:'/image/brush/PencilBrush-2.jpg'
},{
value:'InkBrush',
url:'/image/brush/InkBrush.jpg'
},{
value:'CrayonBrush',
url:'/image/brush/CrayonBrush.jpg'
},{
value:'RibbonBrush',
url:'/image/brush/RibbonBrush.jpg'
},{
value:'MarkerBrush',
url:'/image/brush/MarkerBrush.jpg'
},{
value:'WritingBrush',
url:'/image/brush/WritingBrush.jpg'
},{
value:'LongfurBrush',
url:'/image/brush/LongfurBrush.jpg'
},{
value:'SpraypaintBrush',
url:'/image/brush/SpraypaintBrush.jpg'
},
])
let setPencil = ()=>{
let pencil
canvas.isDrawingMode = true//开启绘画模式
if(brushworkValue.value == 'PencilBrush'){
pencil = new fabric.PencilBrush(canvas,{}); //普通笔
}else if(brushworkValue.value == 'Marking'){
pencil = new fabric.PencilBrush(canvas,); //记号笔
}else if(brushworkValue.value == 'InkBrush'){
pencil = new fabric.InkBrush(canvas,{}); //油画笔
}else if(brushworkValue.value=='CrayonBrush'){
pencil = new fabric.CrayonBrush(canvas,{}); //蜡笔
}else if(brushworkValue.value == 'RibbonBrush'){
pencil = new fabric.RibbonBrush(canvas,{width: 1,}); //色带
}else if(brushworkValue.value == 'MarkerBrush'){
pencil = new fabric.MarkerBrush(canvas,{}); //书写笔
// pencil = new fabric.PenBrush(canvas,{}); //书写笔
}else if(brushworkValue.value == 'WritingBrush'){
pencil = new fabric.WritingBrush(canvas,{}); //毛笔
}else if(brushworkValue.value == 'LongfurBrush'){
pencil = new fabric.LongfurBrush(canvas,{width: 1,}); //色带
}else if(brushworkValue.value == 'SpraypaintBrush'){
pencil = new fabric.SpraypaintBrush(canvas,{}); //长毛刷
}
canvas.freeDrawingBrush = pencil
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState]);
pencilbtnStyle.value.background = canvasBtn.canvasPencilColor
canvas.freeDrawingBrush.isEraser = false
setPencilWidth()
pencilColor()
}
let setEraser = ()=>{
canvas.isDrawingMode = true
let eraser = new fabric.EraserBrush(canvas)
canvas.freeDrawingBrush = eraser
canvas.requestRenderAll();
canvas.freeDrawingBrush.isEraser = true
pencilbtnStyle.value.background = `rgb(255,255,255)`
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState]);
setPencilWidth()
}
let upDataPencilWidth = (zoom)=>{
if(canvasBtn.canvasPencilWidth[canvasBtn?.canvasState]){
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState]) / zoom;
}
}
let deleteObj = ()=> {
// if(!canvas.getActiveObjects()){
// return
// }
let target = canvas.getActiveObjects()
target.forEach((item)=>{
canvas.fxRemove(item, {
onComplete(){
canvas.discardActiveObject(); // 丢弃当前选中的对象
canvas.renderAll(); // 重新渲染 Canvas
}
})
canvas.FX_DURATION = 300
})
}
let setTimeOut = {
pencilWidth:null,
color:null,
}
let setPencilWidth = ()=>{//切换颜色给铅笔设置颜色
clearTimeout(setTimeOut.pencilWidth)
setTimeOut.pencilWidth = setTimeout(()=>{
let zoom = canvas.getZoom() // 获取画布当前缩放值
canvas.freeDrawingBrush.width = Number(canvasBtn.canvasPencilWidth[canvasBtn.canvasState]) / zoom
pencilbtnStyle.value.height = canvasBtn.canvasPencilWidth[canvasBtn.canvasState]+'px'
pencilbtnStyle.value.width = canvasBtn.canvasPencilWidth[canvasBtn.canvasState]+'px'
if(brushworkValue.value == 'RibbonBrush' || brushworkValue.value == 'LongfurBrush'){
canvas.freeDrawingBrush.width = 1;
pencilbtnStyle.value.height = 1+'px'
pencilbtnStyle.value.width = 1+'px'
}
},300)
}
let setPencilColor = ()=>{//切换颜色给铅笔设置颜色
clearTimeout(setTimeOut.color)
// clearTimeout(setTimeOut.colorHistory)
setTimeOut.color = setTimeout(()=>{
pencilColor()
},200)
// setTimeOut.colorHistory = setTimeout(()=>{
// colorHistoryList.value.push(canvasPencilColor.value)
// },1000)
}
let hexToRgba=(hex, alpha)=> {
const r = parseInt(hex.slice(1, 3), 16);
const g = parseInt(hex.slice(3, 5), 16);
const b = parseInt(hex.slice(5, 7), 16);
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
}
let pencilColor = ()=>{
if(canvas.freeDrawingBrush.isEraser){
canvas.freeDrawingBrush.color = '#FFFFFF';
}else{
pencilbtnStyle.value.background = canvasBtn.canvasPencilColor
if(brushworkValue.value == 'Marking'){
console.log(canvasBtn.canvasPencilColor);
console.log(hexToRgba(canvasBtn.canvasPencilColor,.5));
canvas.freeDrawingBrush.color = hexToRgba(canvasBtn.canvasPencilColor,.5)
}else{
canvas.freeDrawingBrush.color = canvasBtn.canvasPencilColor
}
}
}
let routesChange = (str)=>{
canvasBtn.canvasPencilWidth[str] = Math.round(canvasBtn.canvasPencilWidth[str]/10)*10;
if (canvasBtn.canvasPencilWidth[str] < 10) {
canvasBtn.canvasPencilWidth[str] = 10; // 设置为最小值
} else if (canvasBtn.canvasPencilWidth[str] > 100) {
canvasBtn.canvasPencilWidth[str] = 100; // 设置为最大值
}
}
let updateCanvasState = (str) =>{
if(str != 'mouseUp'){
}
const canvasAsJson = JSON.stringify(canvas.toJSON());
normalCanvasState.value.push(canvasAsJson);
}
//撤回
let historyState = (str)=> {
if(str == 'reverse' && reverseCanvasState.value.length > 0){//反撤回
let obj = reverseCanvasState.value.pop()
// canvasState.value = reverseCanvasState.value[reverseCanvasState.value.length-1]
canvasState.value = obj
normalCanvasState.value.push(obj);
}else if(str == '' && normalCanvasState.value.length > 1){
let obj = normalCanvasState.value.pop()
canvasState.value = normalCanvasState.value[normalCanvasState.value.length-1]
reverseCanvasState.value.push(obj);
}else{
return
}
canvas.loadFromJSON(canvasState.value, () => {});
}
let setSubmit = (liquefation)=>{
return new Promise((resolve,reject)=>{
var allObjects = canvas.getObjects();
// return
// if(allObjects.length == 0){
// return message.info(t('addDetails.jsContent1'))
// }
var canvasDom = document.createElement("canvas");
let exportCanvas = new fabric.Canvas(canvasDom, {
backgroundColor: "#FFFFFF",
width: exportWH * ratio[0],
height: exportWH * ratio[1],
isDrawingMode: false, // 开启绘图模式
});
canvas.backgroundImage.clone(async (back)=>{
back.set({
scaleX:1,
scaleY:1,
left:back.left*scale,
top:back.top*scale ,
})
exportCanvas.backgroundImage = back
await new Promise((resolve, reject) => {
if(allObjects.length == 0)resolve('')
allObjects.forEach((item,index)=>{
// let obj = fabric.util.object.clone(item);
if(item.type == 'circle')return
let obj
item.clone((cloned)=>{
console.log(cloned);
obj = cloned
console.log(obj.set);
if(obj.set){
obj.set(
{
scaleX:(item.scaleX?item.scaleX:1)*scale,
scaleY:(item.scaleY?item.scaleY:1)*scale,
left:item.left*scale,
top:item.top*scale,
}
)
}
// else{
// console.log(item.width,scale);
// obj.width = (item.width?item.width:1)*scale
// obj.height = (item.height?item.height:1)*scale
// obj.left = item.left*scale
// obj.top = item.top*scale
// }
exportCanvas.add(obj)
if(index == allObjects.length - 1){
resolve('')
}
})
})
})
let position = JSON.parse(JSON.stringify(canvas.viewportTransform))
position[4] *= scale
position[5] *= scale
//设置画布当前那位置和缩放
// exportCanvas.viewportTransform = position
let data = exportCanvas.toDataURL("image/png");
if(liquefation){
return resolve(data)
}
cancelDsign()
clearCanvas()
emit('submitBase64Data',data)
resolve('')
})
})
}
let cancelDsign = ()=>{
document.removeEventListener('keydown',canvasKeyDown);
document.removeEventListener('keyup', canvasKeyUp);
showPayOrder.value = false
}
let liquefactionData = ref(null)
let liquefaction = ref(null)
let submitLiquefaction = (rv)=>{
// const originalWidth = liquefactionData.value.width // 保存原始宽度
// const originalHeight = liquefactionData.value.height; // 保存原始高度
canvas.viewportTransform = [1,0,0,1,0,0]
fabric.Image.fromURL(rv, function(img) {
// 设置背景图对象的宽度和高度与 canvas 相同
img.scaleToWidth(canvas.width);
img.scaleToHeight(canvas.height);
img.set({
scaleX: canvas.width / img.width,
scaleY: canvas.height / img.height
});
// 将背景图添加到 canvas 的底层
canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));
if(!fabric.Object.prototype.controls.deleteControl){
JSSetRemoveImage(deleteObj)
}else{
fabric.Object.prototype.controls.deleteControl.mouseUpHandler = deleteObj
}
setPencilWidth()
updateCanvasState()
},{ crossOrigin: "Anonymous" });
}
let setLiquefaction =async ()=>{
// const activeObjects = canvas.backgroundImage // 获取选中的对象
// console.log(setSubmit(true));
let activeObjects = await setSubmit(true)
if (activeObjects) {
liquefactionData.value = activeObjects
liquefaction.value.init(activeObjects)
} else {
// message.info(useI18.t('exportModel.jsContent6'))
return null;
}
}
return {
presentState,
showPayOrder,
loadingShow,
t,
pencilbtnStyle,
...toRefs(canvasBtn),
arrows,
liquefactionData,
liquefaction,
init,
setOperation,
setPencilWidth,
setPencilColor,
historyState,
setSubmit,
cancelDsign,
submitLiquefaction,
setLiquefaction,
routesChange,
brushList,
brushworkValue,
brushworkChange,
};
},
data() {
return {
};
},
mounted() {},
methods: {
},
});
</script>
<style lang="less">
.generalMiniCanvas{
position: relative;
height: 100%;
display: flex;
width: 100%;
// flex-direction: column;
margin: 0 auto;
flex-direction: row;
flex: 1;
overflow: hidden;
.generalMiniCanvas_item{
// position: relative;
background: #fff;
position: absolute;
display: flex;
// border: 0.2rem solid #c4c4c4;
width: 25rem;
border-radius: 4px; /* 设置圆角半径 */
flex-wrap: wrap;
.generalMiniCanvas_btn_item{
display: flex;
align-items: center;
padding: 1rem 0;
}
}
.generalMiniCanvas_input,.generalMiniCanvas_btn{
z-index: 2;
padding: 1rem 1.5rem;
position: relative;
width: auto;
flex-wrap: nowrap;
flex-direction: column;
}
.generalMiniCanvas_input{
flex-direction: row;
align-items: center;
margin-left: 7rem;
height: 6rem;
.generalMiniCanvas_input_item{
display: flex;
margin-right: 3rem;
align-items: center;
&.brushwork{
img{
width: 100%;
max-height: 100%;
object-fit: contain;
}
}
span{
margin-right: 1rem;
}
}
.generalMiniCanvas_input_item:last-child{
margin-right: 0;
}
}
.generalMiniCanvas_btn{
input{
// width: 100%;
width: 30rem;
// margin-top: 1rem;
flex: 1;
}
.icon-xiala{
position: absolute;
width: 2rem;
bottom: 0;
transform: translate(-50%, 90%);
left: 50%;
width: 6rem;
background: #fff;
text-align: center;
cursor: pointer;
&.icon-xiala::before{
transition: all .3s;
}
&.btnRotate::before{
transform: rotate(180deg);
display: block;
}
}
i{
font-size: 2.5rem;
cursor: pointer;
width: 4rem;
height: 4rem;
display: flex;
align-items: center;
justify-content: center;
&.active{
border: 1px solid;
border-radius: .4rem;
}
}
&.spread{
transform: translate(-50%,0);
}
}
.addDetails_canvasCenter{
flex: 1;
overflow: hidden;
display: flex;
// flex-direction: column;
// flex-direction: row;
position: relative;
margin: 0 auto;
flex-direction: column;
}
.exportCanvasBox_center_data{
flex: 1;
display: flex;
overflow: hidden;
}
.exportCanvasBox_center_box{
padding: 3rem;
height: 100%;
flex: 1;
position: relative;
overflow: hidden;
width: 100%;
background: #e6e6e6;
cursor: inherit;
&.cursorNone:hover{
cursor: none;
}
&.cursorMove:hover{
cursor: move;
canvas{
cursor: move !important;
}
}
.editFrontBack_pencilbtn{
position: absolute;
z-index: 1;
border-radius: 50%;
border: 1px solid #000;
pointer-events: none;
transform: translate(-50%,-50%);
}
}
.exportCanvasBox_center{
height: 100%;
flex: 1;
position: relative;
overflow: hidden;
background: #e6e6e6;
// overflow: scroll;
.canvas-container{
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
.editFrontBack_pencilbtn{
position: absolute;
z-index: 1;
border-radius: 50%;
border: 1px solid #000;
pointer-events: none;
transform: translate(-50%,-50%);
}
}
.exportCanvasBox_center:hover{
.generalMiniCanvas_btn{
// transform: translate(-50%,-101%);
// &.spread{
// transform: translate(-50%,0);
// }
}
}
}
.exportCanvasBox_submit{
margin-top: auto;
margin-left: 1rem;
text-align: center;
}
</style>

View File

@@ -0,0 +1,421 @@
<template>
<a-modal
class="liquefaction generalModel"
v-model:visible="liqufeaction"
:footer="null"
width="78%"
:maskClosable="false"
:centered="true"
:closable="false"
wrapClassName="#app"
:keyboard="false"
>
<div class="generalModel_btn">
<div class="generalModel_closeIcon" @click.stop="cancelDsign()">
<i class="fi fi-rr-cross-small"></i>
</div>
</div>
<div class="liquefaction_center">
<div class="liquefaction_canvas_box">
<canvas id="c"></canvas>
<div v-show="arrows.show" class="moveDom" :style="arrows.domStyle"></div>
<div v-show="arrows.show" class="jiantouDom" :style="arrows.jiantouStyle"> </div>
</div>
<div class="liquefaction_parameter">
<div class="liquefaction_parameter_item">
<div class="liquefaction_parameter_item_title">
<span>{{ $t('exportModel.Size') }}</span>
<input type="number" v-model="routes" @change="routesChange('routes')">
</div>
<div class="liquefaction_parameter_item_input">
<input type="range" v-model="routes" @change="routesChange('routes')">
</div>
</div>
<div class="liquefaction_parameter_item">
<div class="liquefaction_parameter_item_title">
<span>{{ $t('exportModel.density') }}</span>
<input type="number" v-model="density" @change="routesChange('density')">
</div>
<div class="liquefaction_parameter_item_input">
<input type="range" v-model="density" @change="routesChange('density')">
</div>
</div>
<div class="liquefaction_parameter_item">
<div class="generage_btn started_btn" @click="cancelDsign">{{ $t('Cropper.Cancel')}}</div>
<div class="generage_btn started_btn" @click="submit">{{ $t('Cropper.Finish')}}</div>
</div>
</div>
</div>
</a-modal>
</template>
<script>
import { defineComponent, ref, reactive, watch, onMounted, nextTick, toRefs } from "vue";
import { useI18n } from "vue-i18n";
import { getMousePosition } from "@/tool/mdEvent";
export default defineComponent({
components: {
},
emits: ['submitLiquefaction'],
setup(props,{emit}) {
// let presentState = ref('paypal');
let liqufeaction = ref(false);
let liqufeactionData = reactive({
routes: 30,//移动框大小
density: 30,//移动大小
})
let arrows = ref({
show:false,
domStyle:{
left:0,
top:0,
width:0,
height:0,
},
jiantouStyle:{
height:'1px',
transform:`translateY(-100%) rotate(${90}deg)`,
}
})
let canvas
let canvasImgData = {
width:0,
height:0,
}
let downX
let downY
let init = async (data)=>{
liqufeaction.value = true
await new Promise((resolve, reject) => {
nextTick(()=>{
resolve()
})
})
let img = new Image()
img.setAttribute('crossOrigin', 'Anonymous')
img.onload = () => {
canvasImgData.width = img.width
canvasImgData.height = img.height
let canvasBox = document.querySelector('.liquefaction .liquefaction_canvas_box')
let width = canvasBox.offsetHeight / img.height * img.width
canvas = document.getElementById('c')
canvas.width = width
canvas.height = canvasBox.offsetHeight
let optfor = false
const context = canvas.getContext('2d');
context.drawImage(img, 1, 1, canvas.width, canvas.height);
let imgData = context.getImageData(0, 0, canvas.width, canvas.height)
let canvasDownX
let canvasDownY
let distance = 0
let angle
let mousedown = (event)=>{
let e = getMousePosition(event,false)
down(e)
}
let touchdown = (event)=>{
let e = getMousePosition(event,true)
down(e)
}
let down = (event)=> {
let canvasPosition = canvas.getBoundingClientRect()
let maxX = canvasPosition.width + canvasPosition.x
let minX = canvasPosition.x
let maxY = canvasPosition.height + canvasPosition.y
let minY = canvasPosition.y
if (event.clientX > minX && event.clientX < maxX && event.clientY > minY && event.clientY < maxY) {
downX = event.clientX
downY = event.clientY
canvasDownX = downX - minX
canvasDownY = downY - minY
}
optfor = true
arrows.value.jiantouStyle.height = distance + 'px'
arrows.value.jiantouStyle.left = event.clientX - canvasBox.getBoundingClientRect().left + 'px'
arrows.value.jiantouStyle.top = event.clientY - canvasBox.getBoundingClientRect().top + 'px'
arrows.value.domStyle.width = liqufeactionData.routes * 2 + 'px'
arrows.value.domStyle.height = liqufeactionData.routes * 2 + 'px'
arrows.value.domStyle.left = event.clientX - canvasBox.getBoundingClientRect().left - liqufeactionData.routes + 'px'
arrows.value.domStyle.top = event.clientY - canvasBox.getBoundingClientRect().top - liqufeactionData.routes + 'px'
arrows.value.show = true
let mouseup = ()=>{
if(!optfor)return
if(distance != 0){
let {upDownX, upDownY} = calculateTargetCoordinates(canvasDownX, canvasDownY,distance,angle)
liquify(imgData, canvasDownX, canvasDownY, upDownX, upDownY, liqufeactionData.routes, liqufeactionData.density)
}
distance = 0
arrows.value.show = false
context.putImageData(imgData, 0, 0);
optfor = false
canvasBox.removeEventListener('mousemove', mouseMove);
canvasBox.removeEventListener('touchmove', touchmove);
document.removeEventListener('mouseup', mouseup);
document.removeEventListener('touchend', mouseup);
}
canvasBox.addEventListener('mousemove', mouseMove);
canvasBox.addEventListener('touchmove', touchmove);
document.addEventListener('mouseup', mouseup);
document.addEventListener('touchend', mouseup);
}
let mouseMove = (event)=>{
let e = getMousePosition(event,false)
move(e)
}
let touchmove = (event)=>{
let e = getMousePosition(event,true)
move(e)
}
let move = function (moveEvent) {
let height = distanceFun(downX , downY , moveEvent.clientX , moveEvent.clientY)
if(optfor){
let height = distanceFun(downX , downY , moveEvent.clientX , moveEvent.clientY)
angle = angleFun(downX , downY , moveEvent.clientX , moveEvent.clientY)
if(height < liqufeactionData.routes){
distance = height
arrows.value.jiantouStyle.height = height + 'px'
}
arrows.value.jiantouStyle.transform = `translateY(-100%) rotate(${angle+90}deg)`
}
}
// canvas.addEventListener('mousedown', down);
canvasBox.addEventListener('mousedown', mousedown);
canvasBox.addEventListener('touchstart', touchdown);
}
if(data._element){
img.src = data._element.src
}else{
img.src = data
}
}
let distanceSqr = (x1, y1, x2, y2) => sqr(x1 - x2) + sqr(y1 - y2);
let sqr = (x) => x * x;;
let eachCircleDot = (imageData, ox, oy, r, callback)=>{
var imgWidth = imageData.width,
imgHeight = imageData.height,
data = imageData.data,
left = ox - r,
right = ox + r,
top = oy - r,
bottom = oy + r,
dotRedOffset, dotGreenOffset, dotBlueOffset, alphaOffset;
for (var x = left; x < right; x++){
for (var y = top; y < bottom; y++){
if (distanceSqr(x, y, ox, oy) <= sqr(r)) {
dotRedOffset = y * imgWidth * 4 + x * 4;
dotGreenOffset = dotRedOffset + 1;
dotBlueOffset = dotGreenOffset + 1;
alphaOffset = dotBlueOffset + 1;
callback(
// 当前点的坐标
{ x: x, y: y },
// 点的RGBA四个分量对应字节的下标
{
r: dotRedOffset,
g: dotGreenOffset,
b: dotBlueOffset,
a: alphaOffset,
},
// 传进来的ImageData的data部分
data
);
}
}
}
}
let copyImageDataBuff = (imgData)=>{
var data = imgData.data,
imgDataBuff = [];
for (var i in data){
imgDataBuff[i] = data[i];
}
return imgDataBuff;
}
let moveDot = (imgData, dataBuff, x, y, srcX, srcY)=> {
var imgWidth = imgData.width,
imgHeight = imgData.height,
data = imgData.data;
// // 进行边界检查,确保不超出图像范围
x = Math.max(0, Math.min(Math.round(x), imgWidth - 1));
y = Math.max(0, Math.min(Math.round(y), imgHeight - 1));
srcX = Math.max(0, Math.min(Math.round(srcX), imgWidth - 1));
srcY = Math.max(0, Math.min(Math.round(srcY), imgHeight - 1));
srcX = Math.round(srcX);
srcY = Math.round(srcY);
var targetStartOffset = y * imgWidth * 4 + x * 4,
srcStartOffset = srcY * imgWidth * 4 + srcX * 4;
for (var i = 0; i < 4; i++)
data[targetStartOffset + i] = dataBuff[srcStartOffset + i];
}
let liquify = (imgData, cx, cy, mx, my, r, strenth) => {
var imgDataBuff = copyImageDataBuff(imgData);
eachCircleDot(imgData, cx, cy, r, function (posi) {
var tx = posi.x,
ty = posi.y;
var u = transFormula(cx, cy, mx, my, tx, ty, r, strenth);
moveDot(imgData, imgDataBuff, tx, ty, u.x, u.y);
function transFormula(cx, cy, mx, my, tx, ty, r, strenth) {
strenth = strenth || 100;
var relativity = sqr(r) - distanceSqr(tx, ty, cx, cy);
var distanceMovedSqr = distanceSqr(mx, my, cx, cy);
var rate = sqr(relativity / (relativity + distanceMovedSqr * (100 / strenth)));
var ux = tx - rate * (mx - cx),
uy = ty - rate * (my - cy);
return { x: ux, y: uy };
}
});
}
let distanceFun = (x1, y1, x2, y2) => {
return Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2));
}
let angleFun = (x1, y1, x2, y2) => {
return Math.atan2(y2 - y1, x2 - x1) * (180 / Math.PI);
}
let calculateTargetCoordinates = (x1, y1, distance, angleDegrees) => {
let angleRad = angleDegrees * (Math.PI / 180);
let x2 = x1 + distance * Math.cos(angleRad);
let y2 = y1 + distance * Math.sin(angleRad);
return { upDownX: x2, upDownY: y2 };
}
let cancelDsign = ()=>{
liqufeaction.value = false
}
let routesChange = (str)=>{
liqufeactionData[str] = Math.round(liqufeactionData[str]/10)*10;
if (liqufeactionData[str] < 10) {
liqufeactionData[str] = 10; // 设置为最小值
} else if (liqufeactionData[str] > 100) {
liqufeactionData[str] = 100; // 设置为最大值
}
}
let submit = ()=>{
const newCanvas = document.createElement('canvas');
newCanvas.width = canvasImgData.width;
newCanvas.height = canvasImgData.height;
const newCtx = newCanvas.getContext('2d');
newCtx.drawImage(
canvas,
0, 0,
canvas.width,
canvas.height,
0, 0,
newCanvas.width,
newCanvas.height
);
emit('submitLiquefaction',newCanvas.toDataURL('image/png'))
cancelDsign()
}
return {
liqufeaction,
...toRefs(liqufeactionData),
arrows,
init,
cancelDsign,
routesChange,
submit,
};
},
data() {
return {
};
},
mounted() {},
methods: {
},
});
</script>
<style lang="less" scoped>
.liquefaction {
background: #f9fafb;
.liquefaction_center{
height: 100%;
display: flex;
align-items: center;
.liquefaction_canvas_box{
background: #fff;
height: 90%;
width: 80%;
text-align: center;
// overflow-x: auto;
position: relative;
overflow-y: hidden;
}
.liquefaction_parameter{
padding-top: 5rem;
height: 100%;
flex: 1;
.liquefaction_parameter_item{
display: flex;
flex-direction: column;
.liquefaction_parameter_item_title{
display: flex;
justify-content: space-between;
input{
width: 30%;
text-align: right;
}
}
.liquefaction_parameter_item_input{
width: 100%;
input{
width: 100%;
}
}
}
.liquefaction_parameter_item:last-child{
margin-top: 20px;
text-align: center;
div{
margin-bottom: 1rem;
}
}
}
.moveDom {
width: 20px;
height: 20px;
border-radius: 50%;
box-sizing: border-box;
border: 1px solid;
position: absolute;
pointer-events: none;
}
.jiantouDom {
position: absolute;
width: 2px;
height: 1px;
background-color: #000;
transform-origin: center bottom;
transform: translateY(-100%);
pointer-events: none;
}
.jiantouDom::before {
content: "";
display: block;
position: absolute;
width: 10px;
height: 10px;
left: 50%;
transform: translateX(-50%) rotate(45deg);
border-top: 2px solid #000;
border-left: 2px solid #000;
pointer-events: none;
}
}
}
</style>

View File

@@ -6,6 +6,7 @@ export default {
HISTORY:'历史',
WORKS:'作品广场',
EVENTS:'活动',
personal:'个人中心',
bindEmail:'绑定邮箱',
logOff:'退出登录',
Tutorial:'教程',
@@ -47,7 +48,7 @@ export default {
CanvasSize:'画布大小',
Height:'高',
Width:'宽',
CanvasNav:'缩略图',
CanvasNav:'系列',
CanvasTool:'画布工具',
Color:'颜色',
Size:'大小',
@@ -65,6 +66,8 @@ export default {
requiresCredits:'执行超分的图片需要消耗{data}积分',
Scale:'倍率',
Cancel:'取消',
size:'区域',
density:'强度',
jsContent1:"您是否已经保存画布内容?如果没有,请再关闭前点击'保存'。",
jsContent2:'我们只支持对印花进行超分',
jsContent3:'您的积分小于一次超分',
@@ -72,7 +75,9 @@ export default {
jsContent5:'您选择的第{str}张图像在超分辨率增强后的分辨率超过2048。请选择较低的放大倍数。',
jsContent6:'请选择需要超分的图片',
jsContent7:'保存成功~',
jsContent8:'是否需要自动裁剪画布多余空间',
jsContent8:'是否继续编辑',
jsContent9:'是否需要自动裁剪画布多余空间',
jsContent10:'请选择一张图片后再次尝试',
},
upgradePlan:{
BuyCredlts:'购买积分',
@@ -159,6 +164,7 @@ export default {
Upload:'上传',
MagicTools:'转换产品图工具',
Similarity:'相似度',
Highlight:'高亮',
RelightDirection:'打光方向',
GenerateProduct:'生成的产品',
SelectedProduct:'选择的产品',
@@ -297,6 +303,7 @@ export default {
Thumbnail:'选择的线稿',
inputContent1:'生成图片的标题',
maximumLength:'输入的内容超过允许输入的最大长度',
GenerateSketch:'生成线稿',
jsContent1:"上传失败",
jsContent2:"您只能上传图片文件!",
jsContent3:'图片必须小于5MB',
@@ -338,7 +345,7 @@ export default {
SelectSuccessivelyOnTitle:'连续选色模式开启.',
SelectSuccessivelyOffTitle:'连续选色模式关闭.',
SelectSeparately:'单选',
ExtractColor:'提取颜色',
ExtractColor:'提取',
Single:'单色',
Gradual:'渐变',
Alignment:'线性',
@@ -412,6 +419,9 @@ export default {
effectPoor:'当前生成的图像质量低于标准。请考虑调整您的提示词并再次尝试。',
Model:'模型',
uploadTitle:'上传参考图',
uploadproduct:'上传产品图',
style:'风格',
referenceImage:'参考图',
sloganTitle:'输入文字内容',
jsContent1:"您只能上传图片文件!",
jsContent2:'图片必须小于5MB',
@@ -522,6 +532,7 @@ export default {
Publish:'发布',
CoverPicture:'封面图',
CollectionTitle:'系列名字',
topic:'话题',
Description:'描述',
Permissions:'权限',
PermissionsItem1:'允许其他用户进行二次创作。',
@@ -535,6 +546,8 @@ export default {
newScaleImage:{
Collection:'系列',
SecondaryCreation:'二次创作',
Follow:'关注',
Unfollow:'取关',
CreationTime:'创建时间',
UpdateTime:'更新时间',
Comment:'评论',
@@ -556,6 +569,37 @@ export default {
jsContent5:'是否删除当前作品',
jsContent6:'作品被作者删除',
},
scaleImage:{
overlayOrNot:'是否覆盖当前图片',
submitCanvas:'画布内容没有储存,是否继续',
},
account:{
personCentered:'个人中心',
myInformation:'我的信息',
Home:'首页',
Messages:'消息中心',
Follow:'关注',
Fans:'粉丝',
editUser:'修改个人信息',
//编辑个人信息页
userName:'用户名',
email:'邮箱',
Submit:'提交',
//消息
systemMessages:'系统消息',
comment:'评论',
like:'点赞',
NewFans:'新增粉丝',
AllRead:'全部已读',
dataNull:'没有任何信息~',
reply:'评论你的作品',
followedYou:'关注了你',
likedYourWork:'赞了你的作品',
//互动
Interact:'互动',
hisWorks:'他的作品',
works:'作品',
},
guide:{
guide1:"在<strong>工作空间</strong>中,您可以个性化您的设计设置,包括选择适用于男装或女装的设计,以及选择用于创作的人体模型。",
guide2:"选择您要设计的服装性别。",

View File

@@ -6,6 +6,7 @@ export default {
HISTORY:'HISTORY',
WORKS:'GALLERY',
EVENTS:'EVENTS',
personal:'Personal Center',
bindEmail:'bind email',
logOff:'log off',
Tutorial:'Tutorial',
@@ -39,7 +40,6 @@ export default {
createTime:'Create Time',
},
payOrder:{
OrderInformation:'Order Information',
CreditsInformation:'Credits Information',
},
@@ -48,7 +48,7 @@ export default {
CanvasSize:'Canvas Size',
Height:'Height',
Width:'Width',
CanvasNav:'Canvas Nav',
CanvasNav:'Collection',
CanvasTool:'Canvas Tool',
Color:'Color',
Size:'Size',
@@ -66,6 +66,8 @@ export default {
requiresCredits:'Performing upscale image requires a {data} credits',
Scale:'Scale',
Cancel:'Cancel',
size:'Size',
density:'Density',
jsContent1:"Have you saved your canvas content? If not, please click 'Save' before closing.",
jsContent2:'We only provide super-resolution capabilities for printboard images.',
jsContent3:'Your points are less than one SR',
@@ -73,7 +75,9 @@ export default {
jsContent5:'After super-resolution enhancement, the {str} th image you selected has a resolution exceeding 2048, Please choose a lower magnification level.',
jsContent6:'Please select the picture that requires upscale',
jsContent7:'save successfully',
jsContent8:'Whether you need to automatically crop your canvas excess space',
jsContent8:'Whether to continue editing',
jsContent9:'Whether you need to automatically crop your canvas excess space',
jsContent10:'Please select a picture and try again',
},
upgradePlan:{
BuyCredlts:'Buy credits',
@@ -159,6 +163,7 @@ export default {
SelectCollection:'Select Collection',
Upload:'Upload',
Similarity:'Similarity',
Highlight:'Highlight',
RelightDirection:'Relight Direction',
MagicTools:'To Product lmage Tool',
GenerateProduct:'Generate Product',
@@ -298,6 +303,7 @@ export default {
Thumbnail:'Selected sketchboard',
inputContent1:'Input prompt',
maximumLength:'The entered content exceeds the maximum length.',
GenerateSketch:'Generate Sketch',
jsContent1:"upload failed",
jsContent2:"You can only upload Image file!",
jsContent3:'Image must smaller than 5MB!',
@@ -413,6 +419,9 @@ export default {
effectPoor:'The quality of the generated images currently falls below standard. Please consider adjusting your prompt and trying again.',
Model:'Model',
uploadTitle:'Upload reference image',
uploadproduct:'Upload product picture',
style:'Style',
referenceImage:'Reference Image',
sloganTitle:'Input text content',
jsContent1:"You can only upload Image file!",
jsContent2:'Image must smaller than 5MB!',
@@ -497,7 +506,7 @@ export default {
inputContent:'Please input',
preview:'Preview',
isOverall:'Pattern images cannot be used in Single mode',
jsContent1:'The above changes are not saved.Are you sure you want to continue? ',
jsContent1:'The above changes are not saved. Are you sure you want to continue? ',
},
uploadFile:{
jsContent1:'You can select up to {maxImg} images',
@@ -515,7 +524,7 @@ export default {
},
works:{
all:'All',
FavoriteWorks:'Favorite Works',
FavoriteWorks:'Like Works',
MyWorks:'My Works',
RCAworkshop_2024:'AiDA Workshop 2024',
},
@@ -523,6 +532,7 @@ export default {
Publish:'Publish',
CoverPicture:'Cover Picture',
CollectionTitle:'Collection Title',
topic:'Topic',
Description:'Description',
Permissions:'Permissions',
PermissionsItem1:'Allow other users to perform secondary creation.',
@@ -536,6 +546,8 @@ export default {
newScaleImage:{
Collection:'Collection',
SecondaryCreation:'Secondary Creation',
Follow:'Follow',
Unfollow:'Unfollow',
CreationTime:'CreationTime',
UpdateTime:'UpdateTime',
Comment:'Comment',
@@ -557,6 +569,47 @@ export default {
jsContent5:'Whether to delete the current gallery',
jsContent6:'The author deleted the work',
},
scaleImage:{
overlayOrNot:'Whether to overwrite the current picture',
submitCanvas:'Canvas content is not saved, whether to continue',
},
account:{
personCentered:'Account',
myInformation:'My Details',
Home:'Home',
Messages:'Messages',
Follow:'Follow',
Fans:'Fans',
editUser:'Change Information',
//编辑个人信息页
userName:'User Name',
email:'Email',
Submit:'Submit',
//消息
systemMessages:'System Messages',
comment:'Comment',
like:'Like',
NewFans:'New fans',
AllRead:'All read',
dataNull:'no message~',
reply:'commented on your work',
followedYou:'followed you',
likedYourWork:'liked your work',
//互动
Interact:'interact',
hisWorks:'His works',
works:'Works',
},
createSlogan:{
title:'Create Slogan',
Color:'Color',
FontAlign:'Font Align',
FontStyle:'Font Style',
FontFamily:'Font Family',
add:'Add',
delete:'Delete',
submit:'Submit',
},
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.",
guide2:"Select the apparel type you'd like to work on.",

View File

@@ -24,6 +24,9 @@ const app = createApp(App);
flexible()
import { getCookie, setCookie } from "@/tool/cookie";
document.addEventListener('touchstart', function(event) {
event.preventDefault(); // 阻止长按选中
});
let loadingParam = {
loading: require('./assets/images/homePage/loading.gif'),
attempt: 1

View File

@@ -69,6 +69,41 @@ const routes: Array<RouteRecordRaw> = [
path:'eventsDetail',
name:'eventsDetail',
component: _import_component('Events/eventsDetail.vue'),
},{
path:'account',
name:'account',
component: _import_component('Account/account.vue'),
children:[
{
path: "",
name:'accountChil',
redirect: "/home/account/accountHome"
},
{
path:'accountHome',
name:'accountHome',
component: _import_component('Account/accountHome.vue'),
},
{
path:'accountEdit',
name:'accountEdit',
component: _import_component('Account/accountEdit.vue'),
},
{
path:'accountMessage',
name:'accountMessage',
component: _import_component('Account/accountMessage.vue'),
},
{
path:'accountFollowFans',
name:'accountFollowFans',
component: _import_component('Account/accountFollowFans.vue'),
}
]
},{
path:'otherUsers',
name:'otherUsers',
component: _import_component('Account/otherUsers.vue'),
}
]
},
@@ -206,11 +241,21 @@ const routes: Array<RouteRecordRaw> = [
name: 'feedbackSurveyCN',
component: _import('feedbackSurveyCN'),
},
{
path: '/emailVerify',
name: 'emailVerify',
component: _import('emailVerify'),
},
{
path: '/404',
name: '404',
component: _import('404')
},
{
path: "/:catchAll(.*)",
redirect: "/404",
},
]
const router = createRouter({
@@ -221,15 +266,24 @@ const router = createRouter({
// 刷新保存数据-
let state:any = store.state
window.addEventListener("beforeunload", (e) => {
sessionStorage.setItem(
localStorage.setItem(
"vuex_setSystemUser",
JSON.stringify(state.UserHabit.systemUser.value)
);
localStorage.setItem(
"vuex_setUserInfo",
JSON.stringify(state.UserHabit.userInfo)
);
});
var vuex_setSystemUser:any = sessionStorage.getItem("vuex_setSystemUser");
var vuex_setSystemUser:any = localStorage.getItem("vuex_setSystemUser");
var vuex_setUserInfo:any = localStorage.getItem("vuex_setUserInfo");
if (vuex_setSystemUser == 0 || vuex_setSystemUser == 1) {
store.commit("setSystemUser", JSON.parse(vuex_setSystemUser));
sessionStorage.removeItem("vuex_setSystemUser");
localStorage.removeItem("vuex_setSystemUser");
}
if (vuex_setUserInfo) {
store.commit("setUserInfo", JSON.parse(vuex_setUserInfo));
localStorage.removeItem("vuex_setSystemUser");
}
let setMurmur = (id:any)=> {
@@ -264,7 +318,7 @@ let setMurmur = (id:any)=> {
}
router.beforeEach((to:any, from, next) => {
let upgradeList = ['/feedbackSurvey','/feedbackSurveyCN']//指定页面系统维护也可以访问
let upgradeList = ['/feedbackSurvey','/feedbackSurveyCN','emailVerify']//指定页面系统维护也可以访问
// 系统维护
const toName = to.name === 'upgrade';
@@ -323,30 +377,27 @@ router.beforeEach((to:any, from, next) => {
}
return
}
if (routeExists) {//检测档期那页面是否存在
if (isMurmur && murmurStr && token) {
const toName = to.name === 'login';
if (toName) {
next({ name: '/home' });//机房用户
} else {
next();
}
} else {
if (routeList.indexOf(to.path) > -1 ) {//指定也买你必须指定用户可以进入
if(userIdList.indexOf(userInfo.userId) > -1){
next();
}else{
next({ name: '/404' });
}
}else{
next();
}
// 如果页面存在,正常跳转
}
if (isMurmur && murmurStr && token) {
const toName = to.name === 'login';
if (toName) {
return next({ name: '/home' });//机房用户
}
} else {
// 如果页面不存在可以跳转到404页面或者其他页面
next('/404');
if (routeList.indexOf(to.path) > -1 ) {//指定也买你必须指定用户可以进入
if(userIdList.indexOf(userInfo.userId) > -1){
}else{
return next({ name: '/404' });
}
}
// 如果页面存在,正常跳转
}
next();
// if (routeExists) {//检测档期那页面是否存在
// } else {
// // 如果页面不存在可以跳转到404页面或者其他页面
// next('/404');
// }
});

View File

@@ -10,7 +10,6 @@ interface DesignDetail{
templateImgUrl:any,
designId:any,
showSketchList:any,
}
const HomeStoreModule : Module<DesignDetail,RootState> = {
@@ -83,8 +82,7 @@ const HomeStoreModule : Module<DesignDetail,RootState> = {
state.templateId= ''
state.templateImgUrl = ''
},
},

View File

@@ -6,6 +6,7 @@ import GO from '@/tool/GO';
interface UploadFiles{
moodboard:any,
disposeMoodboard:any,
moodboardPosition:any,
moodboardFiles:any,
moodboardGenerateFiles:any,
moodboardMaterialFiles:any,
@@ -29,6 +30,7 @@ const UploadFilesModule : Module<UploadFiles,RootState> = {
state:{
moodboard:[],
disposeMoodboard:[],
moodboardPosition:{},
moodboardFiles:[],
moodboardGenerateFiles:[],
moodboardMaterialFiles:[],
@@ -56,6 +58,11 @@ const UploadFilesModule : Module<UploadFiles,RootState> = {
},
setDisposeMoodboard(state,files){
state.disposeMoodboard = [files]
},
setDisposeMoodboardPosition(state,files){
state.moodboardPosition = files
console.log(state.moodboardPosition);
},
setMoodboardGenerateFiles(state,files){
state.moodboardGenerateFiles = files
@@ -198,6 +205,7 @@ const UploadFilesModule : Module<UploadFiles,RootState> = {
setAllBoardData(state){
state.allBoardData = {
disposeMoodboard:state.disposeMoodboard,
moodboardPosition:state.moodboardPosition,
moodboardFiles:state.moodboard,
printboardFiles:state.printboard,
colorBoards:state.colorBoards,
@@ -233,6 +241,7 @@ const UploadFilesModule : Module<UploadFiles,RootState> = {
state.moodTemplateId = ''
state.disposeMoodboard = []
// state.showSketchboard = []
state.chooseIsDesign.value = true
},
clearAllId(state){
state.moodboard.forEach((v:any) => {
@@ -250,6 +259,7 @@ const UploadFilesModule : Module<UploadFiles,RootState> = {
},
clearMoodTemplateId(state){
state.disposeMoodboard = []
state.moodboardPosition = {}
},
},
actions:{

View File

@@ -1,6 +1,7 @@
import {Module} from 'vuex'
import {RootState} from '../index'
import { Https } from "@/tool/https";
import store from '../index'
interface UserHabit{
clothingType:any,
credits:any,
@@ -13,7 +14,12 @@ interface UserHabit{
FemalePosition:any,
MalePosition:any,
Position:any,
SketchGenerateType:any,
SketchStyle:any,
systemUser:any,
userInfo:any,
messageSystem:any,
sex:any,
}
const userHabit : Module<UserHabit,RootState> = {
@@ -35,11 +41,21 @@ const userHabit : Module<UserHabit,RootState> = {
designElementsType:[],
FemalePosition:[],
MalePosition:[],
SketchGenerateType:[],
Position:[],
SketchStyle:[],
systemUser:{
value : -1
},
userInfo:{
},
messageSystem:{
messageNum:0,
messageType:{},
},
sex:{
},
},
mutations:{
res_clothingType(state,data){
@@ -57,6 +73,12 @@ const userHabit : Module<UserHabit,RootState> = {
setFemalePosition(state,data){
state.FemalePosition = data
},
setSketchGenerateType(state,data){
state.SketchGenerateType = data
},
setSketchStyle(state,data){
state.SketchStyle = data
},
setMalePosition(state,data){
state.MalePosition = data
},
@@ -70,9 +92,54 @@ const userHabit : Module<UserHabit,RootState> = {
setSystemUser(state,data){
state.systemUser.value = data
},
setUserInfo(state,data){
if(!data)return
for (const key in data) {
state.userInfo[key] = data[key]
}
},
clearSystemUser(state){
state.systemUser.value = -1
state.userInfo = {}
},
setMessageSystem(state,data){
let num = 0
// let userInfo = ['-1']
let userInfo = ['followeeCount','followerCount']
let obj:any = {}
console.log(data);
data.forEach((item:any) => {
for (const iterator in item) {
if(userInfo.indexOf(iterator) > -1){
obj[iterator] = item[iterator]
store.commit('setUserInfo', obj)
}else{
// if(iterator != 'newPosted')num+=item[iterator]
state.messageSystem.messageType[iterator] = item[iterator]
}
}
});
let allObj = state.messageSystem.messageType
for (const iterator in allObj) {
if(userInfo.indexOf(iterator) > -1){
}else{
if(iterator != 'newPosted')num+=allObj[iterator]
}
}
state.messageSystem.messageNum = num
},
closeMessageSystem(state,data){
if(!data){
state.messageSystem.messageNum = 0
state.messageSystem.messageType = null
}else{
}
},
setSex(state,data){
state.sex.value = data
},
},
actions:{
@@ -105,7 +172,7 @@ const userHabit : Module<UserHabit,RootState> = {
},
async getLangType(context){
let allPromise = [];
let getList = ['DesignElementsEnum','PrintboardLevel2TypeEnum','FemalePosition','MalePosition']
let getList = ['DesignElementsEnum','PrintboardLevel2TypeEnum','FemalePosition','MalePosition','SketchStyle','SketchGenerateType','Sex']
let axiosGet = (item:any)=>{
return new Promise((resolve) => {
Https.axiosGet(Https.httpUrls.workspaceenumValues,{params:{enumName:item}}).then((rv: any) => {
@@ -114,6 +181,7 @@ const userHabit : Module<UserHabit,RootState> = {
let name = item.name
item.name = item.value
item.value = name
item.optype = false
});
if(item == 'DesignElementsEnum'){
context.commit('setDesignElementsType',rv)
@@ -124,6 +192,12 @@ const userHabit : Module<UserHabit,RootState> = {
}else if(item == 'MalePosition'){
context.commit('setMalePosition',rv)
context.commit('setPosition','MalePosition')
}else if(item == 'SketchStyle'){
context.commit('setSketchStyle',rv)
}else if(item == 'SketchGenerateType'){
context.commit('setSketchGenerateType',rv)
}else if(item == 'Sex'){
context.commit('setSex',rv)
}
resolve('')
}

View File

@@ -295,6 +295,102 @@ function JSSetRemoveImage(fun){
cornerSize: 24
})
}
function JSSetGroup(data){
let rect
if(data.gradient){
let colorStops = []
data.gradient.gradientList.forEach(item=>{
let obj = {
offset:item.left.split('%')[0]/100,
color:`rgba(${item.rgba.r},${item.rgba.g},${item.rgba.b},${item.rgba.a})`
}
colorStops.push(obj)
})
let { x0, y0, x1, y1 } = calculateGradientCoordinate(100,120,data.gradient.angle)
let linear = new fabric.Gradient({
type: 'linear', // 线性渐变
// coords: { x1: 0, y1: 0, x2: 200, y2: 0 }, // 渐变方向
coords: { x1:x0, y1:y0, x2:x1, y2:y1 }, // 渐变方向
colorStops: colorStops,
})
var color = new fabric.Rect({
top:0,
left:0,
width: 110,
height: 130,
textAlign: "left",
fill: linear // 设置渐变填充
// fill: `rgb(${data.rgbValue.r},${data.rgbValue.g},${data.rgbValue.b})`,
});
var text = new fabric.Text('',{
left: 0,
top: 0,
fontSize: 0,
fontFamily: "Arial",
textAlign: "left",
fill: "black",
});
let text1 = new fabric.Text('',{
left: 0,
top: 0,
width: 20,
fontSize: 0,
fontFamily: "Arial",
textAlign: "left",
});
rect = {text,text1,color,width:110}
}else{
var text = new fabric.Text(data.tcx,{
left: 0,
top: 60,
fontSize: 14,
fontFamily: "Arial",
textAlign: "left",
fill: "black",
});
let text1 = new fabric.Text(data.name,{
left: 0,
top: 80,
width: 20,
fontSize: 14,
fontFamily: "Arial",
textAlign: "left",
});
let width = 110 > text1.width ? 110 : text1.width;
var color = new fabric.Rect({
width: width,
height: 60,
textAlign: "left",
fill: `rgb(${data.rgbValue.r},${data.rgbValue.g},${data.rgbValue.b})`,
});
rect = {text,text1,color,width}
}
return rect
}
function JSSetPencil(str,canvas){
let pencil
if(str == 'PencilBrush'){
pencil = new fabric.PencilBrush(canvas,{}); //普通笔
}else if(str == 'Marking'){
pencil = new fabric.PencilBrush(canvas,); //记号笔
}else if(str == 'InkBrush'){
pencil = new fabric.InkBrush(canvas,{}); //油画笔
}else if(str=='CrayonBrush'){
pencil = new fabric.CrayonBrush(canvas,{}); //蜡笔
}else if(str == 'RibbonBrush'){
pencil = new fabric.RibbonBrush(canvas,{width: 1,}); //色带
}else if(str == 'MarkerBrush'){
pencil = new fabric.MarkerBrush(canvas,{}); //书写笔
// pencil = new fabric.PenBrush(canvas,{}); //书写笔
}else if(str == 'WritingBrush'){
pencil = new fabric.WritingBrush(canvas,{}); //毛笔
}else if(str == 'LongfurBrush'){
pencil = new fabric.LongfurBrush(canvas,{width: 1,}); //色带
}else if(str == 'SpraypaintBrush'){
pencil = new fabric.SpraypaintBrush(canvas,{}); //长毛刷
}
return pencil
}
export {
multiselectJS,
JSRectUpdata,
@@ -304,5 +400,7 @@ export {
JScreateCheck,
exportSele,
JSSetTexture,
JSSetRemoveImage
JSSetRemoveImage,
JSSetGroup,
JSSetPencil,
}

241
src/tool/canvasGeneral.js Normal file
View File

@@ -0,0 +1,241 @@
import {
exportSele,
JSRectUpdata,
JSchangeType,
JScanvasMouseDown,
JScanvasMouseMove,
JScreateCheck,
JSSetTexture,
JSSetRemoveImage,
} from "@/tool/canvasDrawing";
class myCanvas {
constructor() {
this.canvasDomParent = null;
this.canvas = null;
this.canvasDom = null;
this.pencilBtn = null;
this.pencilType = null;
this.keyDown = [];//键盘按下
this._clipboard = null; //剪切板
this.isLoadCanvas = false//撤回或者反撤回false为撤回
this.reverseCanvasState=[];//撤回
this.normalCanvasState=[];//反撤回
this.canvasState = {}//当前内容
this.pencilList = {
textFontFamilyList:[
{ value: 'Arial', name: 'select font' },
{ value: 'EN_slogan_art1', name: 'select font' },
{ value: 'EN_slogan_art2', name: 'select font' },
{ value: 'EN_slogan_art3', name: 'select font' },
{ value: 'EN_slogan_art4', name: 'select font' },
{ value: 'EN_slogan_art5', name: 'select font' },
{ value: 'EN_slogan_art6', name: 'select font' },
{ value: 'EN_slogan_art7', name: 'select font' },
{ value: '微软雅黑', name: '请选择字体' },
{ value: 'CN_slogan_art1', name: '请选择字体' },
{ value: 'CN_slogan_art2', name: '请选择字体' },
{ value: 'CN_slogan_art3', name: '请选择字体' },
{ value: 'CN_slogan_art4', name: '请选择字体' },
{ value: '华文行楷', name: '请选择字体' },
{ value: '隶书', name: '请选择字体' },
],
brushList:[
{
value:'PencilBrush',
url:'/image/brush/PencilBrush.jpg'
},{
value:'Marking',
url:'/image/brush/PencilBrush-2.jpg'
},{
value:'InkBrush',
url:'/image/brush/InkBrush.jpg'
},{
value:'CrayonBrush',
url:'/image/brush/CrayonBrush.jpg'
},{
value:'RibbonBrush',
url:'/image/brush/RibbonBrush.jpg'
},{
value:'MarkerBrush',
url:'/image/brush/MarkerBrush.jpg'
},{
value:'WritingBrush',
url:'/image/brush/WritingBrush.jpg'
},{
value:'LongfurBrush',
url:'/image/brush/LongfurBrush.jpg'
},{
value:'SpraypaintBrush',
url:'/image/brush/SpraypaintBrush.jpg'
},
]
}
}
canvasInit(dom, val) {
this.canvasDomParent = dom;
this.canvasClear()
var canvasDom = document.createElement("canvas");
this.canvasDomParent.appendChild(canvasDom);
this.canvas = new fabric.Canvas(canvasDom, {
backgroundColor: "rgba(255, 255, 255)",
width: val.width?val.width:this.canvasDomParent.getBoundingClientRect().width,
height: val.height?val.height:this.canvasDomParent.getBoundingClientRect().height,
isDrawingMode: val.isDrawingMode, // 开启绘图模式
selectionFullyContained: true,
selectionKey:'ctrlKey',
includeDefaultValues: false,//尚未测试 精简导出JSON
});
if(!fabric.Object.prototype.controls.deleteControl){//设置元素删除
JSSetRemoveImage(this.deleteObject)
}else{
fabric.Object.prototype.controls.deleteControl.mouseUpHandler = this.deleteObject
}
this.canvas.on("object:modified", ()=>{
this.updateCanvasState('')
});
this.canvasKeyDown = this.canvasKeyDown.bind(this);
this.canvasKeyUp = this.canvasKeyUp.bind(this);
document.addEventListener("keydown", this.canvasKeyDown);
document.addEventListener("keyup", this.canvasKeyUp);
initAligningGuidelines(this.canvas,true)
JSchangeType(this.canvas,'init')
this.updateCanvasState('')
this.canvas.on("object:added", (event)=>{
if(!this.isLoadCanvas)this.updateCanvasState('')
});
return this.canvas
}
canvasKeyUp(event){
this.keyDown = this.keyDown.filter(function(item) {
return event.code !== item;
})
}
canvasKeyDown(event){
if(this.keyDown.indexOf(event.key)>-1){
}else{
this.keyDown.push(event.code)
if(event.key === 'Enter' && operation.value == 'fold'){
foldEnd('Enter')
}else if(event.key === 'Delete'){
deleteObject()
}else if(this.keyDown.indexOf('ControlLeft') > -1 && this.keyDown.indexOf('KeyZ') > -1 && this.keyDown.indexOf('ShiftLeft') > -1){
this.historyState('reverse')
}else if(this.keyDown.indexOf('ControlLeft') > -1 && this.keyDown.indexOf('KeyZ') > -1){
this.historyState('')
}else if(this.keyDown.indexOf('ControlLeft') > -1 && this.keyDown.indexOf('KeyC') > -1){
this.copy()
}else if(this.keyDown.indexOf('ControlLeft') > -1 && this.keyDown.indexOf('KeyV') > -1){
this.paste()
}
}
}
canvasClear(){
let oldCanvasDom = this.canvasDomParent.querySelector('.canvas-container')
let oldCanvasDom1 = this.canvasDomParent.querySelector('canvas')
if(oldCanvasDom)oldCanvasDom.remove()
if(oldCanvasDom1)oldCanvasDom1.remove()
this.reverseCanvasState=[];//撤回
this.normalCanvasState=[];//反撤回
document.removeEventListener("keydown", this.canvasKeyDown);
document.removeEventListener("keyup", this.canvasKeyUp);
}
//删除选中元素
deleteObject = ()=> {
if(!this.canvas.getActiveObjects()){
return
}
let target = this.canvas.getActiveObjects()
target.forEach((item)=>{
this.canvas.fxRemove(item, {
onComplete:()=>{
this.canvas.discardActiveObject(); // 丢弃当前选中的对象
this.canvas.renderAll(); // 重新渲染 Canvas
}
})
this.canvas.FX_DURATION = 300
})
this.updateCanvasState('remove')
}
//复制粘贴
copy(canvas){
var activeObject = this.canvas.getActiveObject();
if(!activeObject){
return
}
activeObject.clone((cloned)=>{
this._clipboard = cloned;
})
}
paste = () => {//粘贴
if(!this._clipboard){
return
}
this._clipboard.clone(clonedObj => {
this.canvas.discardActiveObject() // 取消选择
// 设置新内容的坐标位置
clonedObj.set({
left: clonedObj.left + 10,
top: clonedObj.top + 10,
evented: true
})
if (clonedObj.type === 'activeSelection') {
// 活动选择需要一个对画布的引用
clonedObj.canvas = canvas;
clonedObj.forEachObject((obj)=>{
this.canvas.add(obj)
})
clonedObj.setCoords()
} else {
this.canvas.add(clonedObj)
}
this._clipboard.top += 10
this._clipboard.left += 10
this.canvas.setActiveObject(clonedObj)
this.canvas.requestRenderAll()
})
this.updateCanvasState()
}
//撤回反撤回
//设置画布监听修改添加事件,用来做撤回功能
updateCanvasState(str){
const canvasAsJson = JSON.stringify(this.canvas.toJSON());
if(str == 'loadingCompleted'){
// this.reverseCanvasState.push(canvasAsJson);
}
this.normalCanvasState.push(canvasAsJson);
if (this.isLoadCanvas) {
this.reverseCanvasState = []
this.isLoadCanvas = false;
this.canvasState = canvasAsJson
}
}
//撤回
historyState(str){
if(str == 'reverse' && this.reverseCanvasState.length > 0){//反撤回
let obj = this.reverseCanvasState.pop()
// this.canvasState = this.reverseCanvasState[this.reverseCanvasState.length-1]
this.canvasState = obj
this.normalCanvasState.push(obj);
}else if(str == '' && this.normalCanvasState.length > 1){
let obj = this.normalCanvasState.pop()
this.canvasState = this.normalCanvasState[this.normalCanvasState.length-1]
this.reverseCanvasState.push(obj);
this.isLoadCanvas = true;
}else{
return
}
this.canvas.loadFromJSON(this.canvasState, () => {});
}
}
export default new myCanvas()

Some files were not shown because too many files have changed in this diff Show More