Commit 929ba0fd1e84f18b38dd0eb36cfbb00a641b2283
1 parent
c2233d22
feat: 支持制作海报(导出静态图、封面图) !#en: support download poster; #135
Showing
6 changed files
with
59 additions
and
6 deletions
front-end/h5/src/components/core/editor/fixed-tools/index.js
| ... | ... | @@ -9,7 +9,12 @@ export default { |
| 9 | 9 | }) |
| 10 | 10 | }, |
| 11 | 11 | methods: { |
| 12 | - ...mapActions('editor', ['pageManager', 'elementManager', 'updateScaleRate']) | |
| 12 | + ...mapActions('editor', [ | |
| 13 | + 'pageManager', | |
| 14 | + 'elementManager', | |
| 15 | + 'updateScaleRate', | |
| 16 | + 'downloadPoster' | |
| 17 | + ]) | |
| 13 | 18 | }, |
| 14 | 19 | render () { |
| 15 | 20 | return ( | ... | ... |
front-end/h5/src/components/core/editor/fixed-tools/options.js
| ... | ... | @@ -56,6 +56,11 @@ const fixedTools = [ |
| 56 | 56 | i18nTooltip: 'editor.fixedTool.issues', |
| 57 | 57 | icon: 'question', |
| 58 | 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 | 4 | import Work from 'core/models/work' |
| 5 | 5 | import { AxiosWrapper } from '@/utils/http.js' |
| 6 | 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 | 9 | function setLoading (commit, loadingName, isLoading) { |
| 10 | 10 | commit('loading/update', { type: loadingName, payload: isLoading }, { root: true }) |
| ... | ... | @@ -199,6 +199,9 @@ export const actions = { |
| 199 | 199 | successMsg: '上传封面图成功!' |
| 200 | 200 | // }).post(`/works/uploadCover/${state.work.id}`, formData) |
| 201 | 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
front-end/h5/src/locales/lang/zh-CN.js
front-end/h5/src/utils/canvas-helper.js
| ... | ... | @@ -30,7 +30,11 @@ function dataURItoBlob (dataURI) { |
| 30 | 30 | * @param {String} selector |
| 31 | 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 | 38 | const el = document.querySelector(selector) |
| 35 | 39 | return new Promise((resolve, reject) => { |
| 36 | 40 | // html2canvas document: https://html2canvas.hertzen.com/configuration |
| ... | ... | @@ -42,7 +46,20 @@ export function takeScreenshot (selector = '.canvas-wrapper', fileName = `${+new |
| 42 | 46 | const dataUrl = canvas.toDataURL('image/jpeg', 0.6) |
| 43 | 47 | const blob = dataURItoBlob(dataUrl) |
| 44 | 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 | 63 | // canvas.toBlob(blob => { |
| 47 | 64 | // const file = new window.File([blob], fileName, { type: 'image/png' }) |
| 48 | 65 | // resolve(file) |
| ... | ... | @@ -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 | +} | ... | ... |