Commit 929ba0fd1e84f18b38dd0eb36cfbb00a641b2283

Authored by ly525
1 parent c2233d22

feat: 支持制作海报(导出静态图、封面图) !#en: support download poster; #135

front-end/h5/src/components/core/editor/fixed-tools/index.js
@@ -9,7 +9,12 @@ export default { @@ -9,7 +9,12 @@ export default {
9 }) 9 })
10 }, 10 },
11 methods: { 11 methods: {
12 - ...mapActions('editor', ['pageManager', 'elementManager', 'updateScaleRate']) 12 + ...mapActions('editor', [
  13 + 'pageManager',
  14 + 'elementManager',
  15 + 'updateScaleRate',
  16 + 'downloadPoster'
  17 + ])
13 }, 18 },
14 render () { 19 render () {
15 return ( 20 return (
front-end/h5/src/components/core/editor/fixed-tools/options.js
@@ -56,6 +56,11 @@ const fixedTools = [ @@ -56,6 +56,11 @@ const fixedTools = [
56 i18nTooltip: 'editor.fixedTool.issues', 56 i18nTooltip: 'editor.fixedTool.issues',
57 icon: 'question', 57 icon: 'question',
58 action: function () { window.open('https://github.com/ly525/luban-h5/issues/110') } 58 action: function () { window.open('https://github.com/ly525/luban-h5/issues/110') }
  59 + },
  60 + {
  61 + i18nTooltip: 'editor.fixedTool.poster',
  62 + icon: 'camera',
  63 + action: function () { this.downloadPoster() }
59 } 64 }
60 ] 65 ]
61 66
front-end/h5/src/components/core/store/modules/work.js
@@ -4,7 +4,7 @@ import Page from 'core/models/page' @@ -4,7 +4,7 @@ import Page from 'core/models/page'
4 import Work from 'core/models/work' 4 import Work from 'core/models/work'
5 import { AxiosWrapper } from '@/utils/http.js' 5 import { AxiosWrapper } from '@/utils/http.js'
6 // import router from '@/router.js' 6 // import router from '@/router.js'
7 -import { takeScreenshot } from '@/utils/canvas-helper.js' 7 +import { takeScreenshot, downloadPoster } from '@/utils/canvas-helper.js'
8 8
9 function setLoading (commit, loadingName, isLoading) { 9 function setLoading (commit, loadingName, isLoading) {
10 commit('loading/update', { type: loadingName, payload: isLoading }, { root: true }) 10 commit('loading/update', { type: loadingName, payload: isLoading }, { root: true })
@@ -199,6 +199,9 @@ export const actions = { @@ -199,6 +199,9 @@ export const actions = {
199 successMsg: '上传封面图成功!' 199 successMsg: '上传封面图成功!'
200 // }).post(`/works/uploadCover/${state.work.id}`, formData) 200 // }).post(`/works/uploadCover/${state.work.id}`, formData)
201 }).post(`/upload/`, formData) 201 }).post(`/upload/`, formData)
  202 + },
  203 + downloadPoster ({ commit, state, dispatch }) {
  204 + downloadPoster()
202 } 205 }
203 } 206 }
204 207
front-end/h5/src/locales/lang/en-US.js
@@ -78,7 +78,8 @@ export default { @@ -78,7 +78,8 @@ export default {
78 importPSD: 'Import PSD', 78 importPSD: 'Import PSD',
79 zoomIn: 'Zoom In{hotkey}', 79 zoomIn: 'Zoom In{hotkey}',
80 zoomOut: 'Zoom Out{hotkey}', 80 zoomOut: 'Zoom Out{hotkey}',
81 - issues: 'Issues' 81 + issues: 'Issues',
  82 + poster: 'Screenshot'
82 }, 83 },
83 editPanel: { 84 editPanel: {
84 tab: { 85 tab: {
front-end/h5/src/locales/lang/zh-CN.js
@@ -87,7 +87,8 @@ export default { @@ -87,7 +87,8 @@ export default {
87 importPSD: '导入PSD', 87 importPSD: '导入PSD',
88 zoomIn: '缩小{hotkey}', 88 zoomIn: '缩小{hotkey}',
89 zoomOut: '放大{hotkey}', 89 zoomOut: '放大{hotkey}',
90 - issues: '常见问题' 90 + issues: '常见问题',
  91 + poster: '下载海报'
91 }, 92 },
92 editPanel: { 93 editPanel: {
93 tab: { 94 tab: {
front-end/h5/src/utils/canvas-helper.js
@@ -30,7 +30,11 @@ function dataURItoBlob (dataURI) { @@ -30,7 +30,11 @@ function dataURItoBlob (dataURI) {
30 * @param {String} selector 30 * @param {String} selector
31 * @param {文件名} fileName 31 * @param {文件名} fileName
32 */ 32 */
33 -export function takeScreenshot (selector = '.canvas-wrapper', fileName = `${+new Date()}`) { 33 +export function takeScreenshot ({
  34 + selector = '.canvas-wrapper',
  35 + fileName = `${+new Date()}`,
  36 + type = 'file'
  37 +} = {}) {
34 const el = document.querySelector(selector) 38 const el = document.querySelector(selector)
35 return new Promise((resolve, reject) => { 39 return new Promise((resolve, reject) => {
36 // html2canvas document: https://html2canvas.hertzen.com/configuration 40 // html2canvas document: https://html2canvas.hertzen.com/configuration
@@ -42,7 +46,20 @@ export function takeScreenshot (selector = '.canvas-wrapper', fileName = `${+new @@ -42,7 +46,20 @@ export function takeScreenshot (selector = '.canvas-wrapper', fileName = `${+new
42 const dataUrl = canvas.toDataURL('image/jpeg', 0.6) 46 const dataUrl = canvas.toDataURL('image/jpeg', 0.6)
43 const blob = dataURItoBlob(dataUrl) 47 const blob = dataURItoBlob(dataUrl)
44 const file = new window.File([blob], fileName, { type: 'image/png' }) 48 const file = new window.File([blob], fileName, { type: 'image/png' })
45 - resolve(file) 49 + switch (type) {
  50 + case 'canvas':
  51 + resolve(canvas)
  52 + break
  53 + case 'blob':
  54 + resolve(blob)
  55 + break
  56 + case 'dataUrl':
  57 + resolve(dataUrl)
  58 + break
  59 + default:
  60 + resolve(file)
  61 + break
  62 + }
46 // canvas.toBlob(blob => { 63 // canvas.toBlob(blob => {
47 // const file = new window.File([blob], fileName, { type: 'image/png' }) 64 // const file = new window.File([blob], fileName, { type: 'image/png' })
48 // resolve(file) 65 // resolve(file)
@@ -50,3 +67,24 @@ export function takeScreenshot (selector = '.canvas-wrapper', fileName = `${+new @@ -50,3 +67,24 @@ export function takeScreenshot (selector = '.canvas-wrapper', fileName = `${+new
50 }) 67 })
51 }) 68 })
52 } 69 }
  70 +
  71 +/**
  72 + *
  73 + * @param {*} canvas
  74 + * @param {*} name
  75 + */
  76 +export function downLoadCanvas (canvas, name) {
  77 + var a = document.createElement('a')
  78 + a.href = canvas.toDataURL()
  79 + a.download = name
  80 + a.click()
  81 +}
  82 +
  83 +/**
  84 + * 下载海报
  85 + */
  86 +export function downloadPoster () {
  87 + takeScreenshot({ type: 'canvas' }).then(canvas => {
  88 + downLoadCanvas(canvas, new Date())
  89 + })
  90 +}