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 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
... ... @@ -78,7 +78,8 @@ export default {
78 78 importPSD: 'Import PSD',
79 79 zoomIn: 'Zoom In{hotkey}',
80 80 zoomOut: 'Zoom Out{hotkey}',
81   - issues: 'Issues'
  81 + issues: 'Issues',
  82 + poster: 'Screenshot'
82 83 },
83 84 editPanel: {
84 85 tab: {
... ...
front-end/h5/src/locales/lang/zh-CN.js
... ... @@ -87,7 +87,8 @@ export default {
87 87 importPSD: '导入PSD',
88 88 zoomIn: '缩小{hotkey}',
89 89 zoomOut: '放大{hotkey}',
90   - issues: '常见问题'
  90 + issues: '常见问题',
  91 + poster: '下载海报'
91 92 },
92 93 editPanel: {
93 94 tab: {
... ...
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 +}
... ...