diff --git a/stdiet-ui/package.json b/stdiet-ui/package.json index c60d94dd3..3d9272a77 100644 --- a/stdiet-ui/package.json +++ b/stdiet-ui/package.json @@ -50,6 +50,7 @@ "element-ui": "2.13.2", "file-saver": "^2.0.5", "fuse.js": "3.4.4", + "html2canvas": "^1.0.0-rc.7", "immer": "^8.0.1", "js-beautify": "1.10.2", "js-cookie": "2.2.0", diff --git a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesHeaderCom/index.vue b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesHeaderCom/index.vue index feed15795..5f5a599cf 100644 --- a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesHeaderCom/index.vue +++ b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesHeaderCom/index.vue @@ -19,6 +19,17 @@ > 另存为模板 </el-button> + <el-button + size="mini" + type="primary" + style="margin-left: 12px" + icon="el-icon-download" + @click="handleOnExportImg" + v-loading="downloading" + :disabled="downloading" + > + 导出图片 + </el-button> </section> <section> <span class="font_size_style"> @@ -96,6 +107,7 @@ const { mapActions, mapState, mapMutations } = createNamespacedHelpers( "recipes" ); import TemplateDialog from "@/components/TemplateDialog"; +import html2canvans from "html2canvas"; export default { name: "RecipesHeaderCom", components: { @@ -104,6 +116,7 @@ export default { data() { return { loading: false, + downloading: false, nFontSize: 0, fontSizeOpts: [ { value: 8, label: "8" }, @@ -117,7 +130,14 @@ export default { }, updated() {}, computed: { - ...mapState(["recipesId", "reviewStatus", "fontSize", "leftShow"]), + ...mapState([ + "recipesId", + "reviewStatus", + "fontSize", + "leftShow", + "healthyData", + "recipesData", + ]), }, watch: {}, methods: { @@ -193,12 +213,46 @@ export default { return "info"; } }, + handleOnExportImg() { + this.downloading = true; + this.$nextTick(() => { + const centerContentDom = document.getElementById("center_content"); + if (!centerContentDom) { + this.downloading = false; + return; + } + centerContentDom.style.overflow = "visible"; + const recipesDom = document.getElementById("recipes_content"); + if (!recipesDom) { + this.downloading = false; + return; + } + recipesDom.style.overflow = "visible"; + html2canvans(recipesDom, { + scale: 1.5, + height: recipesDom.scrollHeight, + }).then((canvas) => { + const { name } = this.healthyData; + const startNum = this.recipesData[0].numDay; + const endNum = this.recipesData[this.recipesData.length - 1].numDay; + const link = document.createElement("a"); + link.download = `${name}_第${startNum}至${endNum}天.jpeg`; + link.href = canvas.toDataURL(); + link.click(); + + centerContentDom.style.overflow = "auto"; + recipesDom.style.overflow = "auto"; + + this.downloading = false; + }); + }); + }, ...mapActions(["saveRecipes", "updateReviewStatus"]), ...mapMutations(["updateStateData", "updateFontSize", "toggleLeftShow"]), }, }; </script> -<style rel="stylesheet/scss" lang="scss" scope> +<style lang="scss" scoped> .recipes_header_com_wrapper { .header_btns { display: flex; @@ -219,5 +273,14 @@ export default { font-size: 12px; margin-right: 12px; } + + /deep/ .el-loading-spinner { + margin-top: -10px; + } + + /deep/.el-loading-spinner .circular { + width: 20px; + height: 20px; + } } </style> diff --git a/stdiet-ui/src/views/custom/recipesBuild/index.vue b/stdiet-ui/src/views/custom/recipesBuild/index.vue index 81680c96e..b2e4ebeed 100644 --- a/stdiet-ui/src/views/custom/recipesBuild/index.vue +++ b/stdiet-ui/src/views/custom/recipesBuild/index.vue @@ -8,7 +8,7 @@ <VerifyView /> </div> </div> - <div class="content" v-loading="recipesDataLoading"> + <div class="content" v-loading="recipesDataLoading" id="center_content"> <RecipesView v-if="!!recipesData.length" :data="recipesData"