Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
pptist
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
viitto
pptist
Commits
de2b94a2
Commit
de2b94a2
authored
Aug 16, 2024
by
zhengke
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
系统资料替换图
parent
9f37fb84
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
137 additions
and
27 deletions
+137
-27
clipboard.ts
src/utils/clipboard.ts
+20
-0
SourceDetail.vue
src/views/components/source/SourceDetail.vue
+100
-12
TextOpera.vue
src/views/components/source/TextOpera.vue
+12
-10
index.vue
src/views/components/source/index.vue
+5
-5
No files found.
src/utils/clipboard.ts
View file @
de2b94a2
...
...
@@ -27,6 +27,26 @@ export const copyText = (text: string) => {
})
}
/**
* 复制图到剪贴板
* @param image 图内容 png有效
*/
export
const
copyImage
=
async
(
image
:
string
)
=>
{
try
{
const
imageSrc
=
image
;
const
response
=
await
fetch
(
imageSrc
);
const
blob
=
await
response
.
blob
();
await
navigator
.
clipboard
.
write
([
new
ClipboardItem
({
[
blob
.
type
]:
blob
})
]);
return
'success'
}
catch
(
error
)
{
return
'info'
}
}
export
const
replaceText
=
(
text
:
string
,
content
:
string
,
method
:
'R'
|
'I'
)
=>
{
const
fakeElement
=
document
.
createElement
(
'div'
)
fakeElement
.
innerHTML
=
text
...
...
src/views/components/source/SourceDetail.vue
View file @
de2b94a2
...
...
@@ -13,23 +13,21 @@
<el-scrollbar
max-height=
"50vh"
>
<div
class=
"item-poi-img q-mt-md"
v-if=
"data.ImgArray && data.ImgArray.length > 0"
>
<div
class=
"container row"
>
<el-image
class=
"col full-height"
:preview-teleported=
"true"
:src=
"data.ImgArray[0]"
:initial-index=
"0"
:preview-src-list=
"data.ImgArray"
fit=
"cover"
/>
<el-image
class=
"col full-height"
:preview-teleported=
"true"
:src=
"data.ImgArray[0]"
fit=
"cover"
@
click=
"setImages(0)"
/>
<div
style=
"width: 60%;"
class=
"q-ml-sm row"
v-if=
"data.ImgArray.length > 1"
>
<div
class=
"col column"
>
<el-image
class=
"col full-width"
:preview-teleported=
"true"
:src=
"data.ImgArray[1]"
:initial-index=
"1"
:preview-src-list=
"data.ImgArray"
fit=
"cover"
/>
<el-image
class=
"col full-width"
:preview-teleported=
"true"
:src=
"data.ImgArray[1]"
fit=
"cover"
@
click=
"setImages(1)"
/>
<el-image
v-if=
"data.ImgArray.length > 2"
:preview-teleported=
"true"
class=
"col full-width q-mt-sm"
:src=
"data.ImgArray[2]"
:initial-index=
"2"
:preview-src-list=
"data.ImgArray"
fit=
"cover"
/>
class=
"col full-width q-mt-sm"
:src=
"data.ImgArray[2]"
fit=
"cover"
@
click=
"setImages(2)"
/>
</div>
<div
class=
"col column q-ml-sm"
v-if=
"data.ImgArray.length > 3"
>
<el-image
class=
"col full-width"
:preview-teleported=
"true"
:src=
"data.ImgArray[3]"
:initial-index=
"3"
:preview-src-list=
"data.ImgArray"
fit=
"cover"
/>
<el-image
class=
"col full-width"
:preview-teleported=
"true"
:src=
"data.ImgArray[3]"
fit=
"cover"
@
click=
"setImages(3)"
/>
<div
class=
"col full-width q-mt-sm last-img"
v-if=
"data.ImgArray.length > 4"
>
<el-image
class=
"col full-height"
v-if=
"data.ImgArray.length > 4"
:preview-teleported=
"true"
:src=
"data.ImgArray[4]"
:initial-index=
"4"
:preview-src-list=
"data.ImgArray"
fit=
"cover"
/>
:preview-teleported=
"true"
:src=
"data.ImgArray[4]"
fit=
"cover"
@
click=
"setImages(4)"
/>
<div
class=
"content column items-center flex-center text-white"
style=
"text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5);"
v-if=
"data.ImgArray.length > 5"
>
...
...
@@ -82,11 +80,39 @@
</el-scrollbar>
</div>
<
template
v-if=
"isViewerShow"
>
<image-opera
@
handleCopyImage=
"handleCopyImage"
@
handleInsert=
"handleInsert"
@
handleReplace=
"handleReplace"
/>
<el-image-viewer
@
close=
"() =>
{ isViewerShow = false }"
:initial-index="currentImg"
:url-list="data.ImgArray"
:onSwitch="switchImage"/>
</
template
>
</template>
<
script
lang=
"ts"
setup
>
import
{
ref
,
watch
}
from
"vue"
import
{
ref
,
watch
,
inject
}
from
"vue"
import
{
storeToRefs
}
from
'pinia'
import
{
useMainStore
,
useSlidesStore
}
from
'@/store'
import
useCreateElement
from
'@/hooks/useCreateElement'
import
useHistorySnapshot
from
'@/hooks/useHistorySnapshot'
import
{
injectKeyDataSource
}
from
'@/types/injectKey'
import
FileService
from
'@/services/FileService'
import
type
{
PPTImageElement
}
from
'@/types/slides'
import
{
copyImage
,
replaceText
}
from
"@/utils/clipboard"
;
import
TextOpera
from
'./TextOpera.vue'
import
ImageOpera
from
'./ImageOpera.vue'
const
{
createImageElement
}
=
useCreateElement
()
const
mainStore
=
useMainStore
()
const
{
handleElement
,
handleElementId
}
=
storeToRefs
(
mainStore
)
const
slidesStore
=
useSlidesStore
()
const
{
addHistorySnapshot
}
=
useHistorySnapshot
()
const
handleImageElement
=
handleElement
as
Ref
<
PPTImageElement
>
const
emit
=
defineEmits
<
{
(
event
:
'close'
):
void
...
...
@@ -100,6 +126,12 @@ const props = defineProps({
})
const
data
=
ref
<
any
>
(
props
.
itemInfo
)
const
isViewerShow
=
ref
(
false
)
const
currentImg
=
ref
(
0
)
const
queryObj
=
ref
({}
as
any
)
queryObj
.
value
=
inject
(
injectKeyDataSource
).
queryObj
const
propsDatas
=
ref
<
any
>
({})
if
(
data
.
value
.
ImgArray
){
for
(
let
i
=
0
;
i
<
data
.
value
.
ImgArray
.
length
;
i
++
)
{
const
x
=
data
.
value
.
ImgArray
[
i
];
...
...
@@ -108,7 +140,6 @@ if(data.value.ImgArray){
}
}
}
console
.
log
(
data
.
value
.
ImgArray
)
const
platforms
=
ref
<
{
id
:
number
,
name
:
string
}[]
>
([
{
id
:
2
,
name
:
"ERP"
},
{
id
:
1
,
name
:
"第三方"
}
...
...
@@ -120,6 +151,63 @@ const allTypes = ref<{ id: number, name: string }[]>([
{
id
:
3
,
name
:
"景点"
}
])
const
switchImage
=
(
index
:
number
)
=>
{
currentImg
.
value
=
index
}
const
handleCopyImage
=
async
()
=>
{
const
image
=
data
.
value
.
ImgArray
[
currentImg
.
value
];
// 替换为您要复制的图片的URL
const
response
=
await
copyImage
(
image
);
if
(
response
==
'success'
)
ElMessage
({
message
:
'操作成功'
,
type
:
'success'
})
else
ElMessage
({
message
:
'操作失败'
,
type
:
'info'
})
}
const
handleInsert
=
()
=>
{
const
url
=
data
.
value
.
ImgArray
[
currentImg
.
value
]
createImageElement
(
url
,
queryObj
.
value
.
TemplateType
)
ElMessage
({
message
:
'操作成功'
,
type
:
'success'
})
}
const
handleReplace
=
async
()
=>
{
const
url
=
data
.
value
.
ImgArray
[
currentImg
.
value
]
let
downloadInfo
:
any
=
{}
downloadInfo
=
await
FileService
.
convertNetworkToBase64Async
(
url
)
propsDatas
.
value
.
src
=
url
let
tempSize
=
downloadInfo
setPropsDatas
(
tempSize
)
}
const
setPropsDatas
=
(
image
:
any
)
=>
{
let
width
=
0
let
height
=
0
//按照宽度进行缩放
let
ratio
=
image
.
width
/
handleImageElement
.
value
.
width
width
=
handleImageElement
.
value
.
width
height
=
image
.
height
/
ratio
if
(
height
<
handleImageElement
.
value
.
height
){
ratio
=
height
/
handleImageElement
.
value
.
height
height
=
handleImageElement
.
value
.
height
width
=
width
/
ratio
propsDatas
.
value
.
left
=
handleImageElement
.
value
.
left
-
(
Math
.
ceil
((
width
-
handleImageElement
.
value
.
width
)
/
2
))
}
else
{
propsDatas
.
value
.
top
=
handleImageElement
.
value
.
top
-
(
Math
.
ceil
((
height
-
handleImageElement
.
value
.
height
)
/
2
))
}
propsDatas
.
value
.
height
=
height
propsDatas
.
value
.
width
=
width
propsDatas
.
value
.
fixedRatio
=
true
slidesStore
.
updateElement
({
id
:
handleElementId
.
value
,
props
:
propsDatas
.
value
})
addHistorySnapshot
()
currentImg
.
value
=
0
isViewerShow
.
value
=
false
ElMessage
({
message
:
'操作成功'
,
type
:
'success'
})
}
const
setImages
=
(
i
:
number
)
=>
{
currentImg
.
value
=
i
isViewerShow
.
value
=
true
}
const
getTypeName
=
(
t
:
number
,
st
:
0
|
1
)
=>
{
if
(
st
==
1
)
{
const
p
=
allTypes
.
value
.
find
(
x
=>
x
.
id
==
t
)
...
...
src/views/components/source/TextOpera.vue
View file @
de2b94a2
...
...
@@ -11,16 +11,18 @@
<IconCopy
:size=
"18"
></IconCopy>
</el-tooltip>
</div>
<div
class=
"text-opera-item"
@
click=
"handleInsert"
>
<el-tooltip
content=
"添加到文本"
placement=
"top"
>
<IconDocAdd
:size=
"18"
></IconDocAdd>
</el-tooltip>
</div>
<div
class=
"text-opera-item"
@
click=
"handleReplace"
>
<el-tooltip
content=
"替换文本"
placement=
"top"
>
<IconFileConversion
:size=
"18"
></IconFileConversion>
</el-tooltip>
</div>
<
template
v-show=
"handleElement.type=='text'"
>
<div
class=
"text-opera-item"
@
click=
"handleInsert"
>
<el-tooltip
content=
"添加到文本"
placement=
"top"
>
<IconDocAdd
:size=
"18"
></IconDocAdd>
</el-tooltip>
</div>
<div
class=
"text-opera-item"
@
click=
"handleReplace"
>
<el-tooltip
content=
"替换文本"
placement=
"top"
>
<IconFileConversion
:size=
"18"
></IconFileConversion>
</el-tooltip>
</div>
</
template
>
</div>
</el-popover>
</template>
...
...
src/views/components/source/index.vue
View file @
de2b94a2
...
...
@@ -125,11 +125,11 @@ const handleChangeSelect = () => {
recentElement
.
value
=
null
;
handleDisObserver
();
handleDisMutationObserver
();
if
(
handleElement
.
value
?.
type
==
"text"
)
{
const
targetDom
=
document
.
querySelector
(
`#editable-element-
${
handleElementId
.
value
}
.editable-element-text`
);
const
rect
=
targetDom
?.
getBoundingClientRect
()
;
if
(
handleElement
.
value
?.
type
==
"text"
||
handleElement
.
value
?.
type
==
"image"
)
{
const
targetDom
=
handleElement
.
value
?.
type
==
"text"
?
document
.
querySelector
(
`#editable-element-
${
handleElementId
.
value
}
.editable-element-text`
):
document
.
querySelector
(
`#editable-element-
${
handleElementId
.
value
}
.editable-element-image`
)
const
rect
=
targetDom
?.
getBoundingClientRect
()
if
(
rect
)
{
recentElement
.
value
=
targetDom
;
resetPosition
(
rect
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment