vue+html2canvas实现对个人名片dom的转换图片并下载图片

13 篇文章 0 订阅

前言: 因公司需求。需要实现个人名片+可编辑名片信息,且可以实时下载。

 实现如下图:

笔者决定在vue中引入html2canvas实现将整块dom进行图片化并且实时下载保存(本地)。

一、引包

npm install --save html2canvas

二、导入

import html2canvas from 'html2canvas'

三、代码

其实,大家最希望,也是最重要的是贴上代码

<template>
  <div class="container">
    <div class="cardWrap">
      <img :src="dataURL " alt="" />
      <div class="card-switch">
        <span style="float: right">切换为统一二维码-名片</span>
      </div>
      <div class="card" ref="cardCanvas">
        <div class="card-info">
          <div class="card-imgwrap">
            <div v-if="0"></div>
            <!-- 你去控制显示隐藏,有图片就用上面注释的这个 -->
            <!-- <img src="img/u297.png" alt="" /> -->
            <div class="card-empty" v-else>
              <img class="card-empty-img1"  v-if="cardSaveTxtStatus === 2" src="../../../assets/images/card/u183.png" />
              <p v-if="cardSaveTxtStatus === 2">上传头像</p>
              <img class="card-empty-img2" v-if="cardSaveTxtStatus === 1" src="../../../assets/images/card/u183.png" />
            </div>
          </div>
          <div class="card-detail">
            <div class="name" v-if="cardSaveTxtStatus === 1">12312321</div>
            <div class="edit-name" v-else-if="cardSaveTxtStatus === 2">
              <input value="12312321" style="height:17px" />
            </div>
            <div>集团专属渠道</div>
            <div>中国移动通信集团附件有限公司厦门分公司</div>
            <div><img src="../../../assets/images/card/u190.png"> 厦门市莲前西路233号移动通信大楼</div>
            <div class="tel"><img src="../../../assets/images/card/u193.png">13211111111</div>
          </div>
        </div>
        <div class="card-bottom">
          <div class="txt">
            为企业提供基础通信、营销管理等<br />
            一站式解决方案
          </div>
        </div>
        <div class="card-save" ref='cardSave'>
          <div class="card-saveTxt" v-if="cardSaveTxtStatus === 1" @click="editCard">编辑</div>
          <div class="card-saveTxt" v-if="cardSaveTxtStatus === 2" @click="saveCard">保存</div>
        </div>
        <div class="card-code">
          <div class="code-img">
            <img src="../../../assets/images/card/u182.png" alt="" />
          </div>
          <div><span class="triangle-up"></span>扫码了解</div>
        </div>
      </div>

      <div class="cardWrap-txt">
            <div>修改名片</div>
            <div class="grey" @click="saveImage()">点击保存图片</div>
      </div>
    </div>
  </div>
</template>

<script>
import html2canvas from 'html2canvas'
export default {
  data: function () {
    return {
      dataURL: '',
      cardUserName: '', // 当前商户的昵称
      currentQrCode: '', // 当前名片的二维码数据
      cardSaveTxtStatus: 1 // 名片右上角编辑按钮状态 1-不可编辑 2-可编辑
    }
  },
  mounted: function () {
  },
  watch: {
    '$route' (val) {
    }
  },
  methods: {
    /* 保存图片的方法(即按钮点击触发的方法)
      第一个参数为需要保存的div的id名
      第二个参数为保存图片的名称 */
    saveImage (divText, imgText) {
      let canvasID = this.$refs.cardCanvas
      let removeDiv = this.$refs.cardSave
      canvasID.removeChild(removeDiv)
      html2canvas(canvasID, {
        backgroundColor: null     // 解决生成的图片有白边
      }).then(canvas => {
        canvasID.appendChild(removeDiv)
        let dataURL = canvas.toDataURL('image/png')
        this.dataURL = dataURL
        this.saveFile(dataURL, 'wahaha')
      })
    },
    editCard (name) { // 点击编辑按钮
      this.cardSaveTxtStatus = 2 // 可编辑状态
      this.cardUserName = name
    },
    saveCard () { // 点击保存按钮
      this.cardUserName = '1231231312'
      this.cardSaveTxtStatus = 1
    },
    saveFile (data, filename) {
      let saveLink = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
      saveLink.href = data
      saveLink.download = filename
      let event = document.createEvent('MouseEvents')
      event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
      saveLink.dispatchEvent(event)
    }
  }
}
</script>

<style lang="less" scoped>
.container {
  width: 100%;
  height: calc(~"(100vh - 40px)");
  background: #fff;

  img[lazy=loading] {
    padding: 40%;
  }
  img {
    width: 100%;
    /*border-radius: 10px;*/
  }
}

</style>

<style  scoped>
  .cardWrap {
    padding: 10px 6% 10px;
    background: #fff;
  }
  .card {
    position: relative;
  }
  .card-info {
    background: linear-gradient(#1899de, #fbfdff);
    padding: 30px 0 30px 20px;
  }
  .card-bottom {
    height: 46px;
    padding: 5px 0;
    background: #0d6391;
    color: #fff;
    text-align: center;
    font-size: 12px;
    box-sizing: border-box;
  }
  .card-bottom .txt {
    width: 200px;
    line-height: 18px;
  }
  .card-save {
    position: absolute;
    right: 0;
    top: 0px;
    width: 0;
    height: 0;
    font-size: 10px;
    color: #fff;
    border-width: 0px 45px 45px 0;
    border-style: solid;
    border-color: transparent #009900;
  }
  .card-saveTxt {
    width: 45px;
    height: 45px;
    transform-origin: bottom center;
    transform: rotate(45deg);
    position: absolute;
    display: inline-block;
    width: 45px;
    right: -37px;
    top: 3px;
  }
  .cardWrap-txt {
    margin-top: 20px;
    font-size: 14px;
    line-height: 20px;
    color: #333333;
    text-align: center;
  }
  .cardWrap-txt .grey {
    color: #cccccc;
  }
  .card-code {
    position: absolute;
    right: 6%;
    bottom: 4px;
    color: #fff;
    font-size: 12px;
    text-align: center;
  }
  .code-img {
    display: inline-block;
    height: 54px;
    width: 54px;
    line-height: 54px;
    text-align: center;
    background: #fff;
  }
  .code-img img {
    height: 48px;
    width: 48px;
    vertical-align: middle;
  }
  .triangle-up {
    display: inline-block;
    margin-right: 4px;
    width: 0;
    height: 0;
    border-left: 5px solid transparent;
    border-right: 5px solid transparent;
    border-bottom: 10px solid #fff;
  }
  .card-imgwrap{
    width: 65px;
    height: 86px;
    float: left;
    margin-right:10px;
  }
  .card-imgwrap>img{
    width: 100%;
    height: 100%;
  }
  .card-empty {
    width: 100%;
    height: 100%;
    background: #fff;
    text-align: center;
    color: #333;
    font-size: 10px;
    vertical-align: middle
  }
  .card-empty .card-empty-img1{

    width: 56px;
  }
  .card-empty .card-empty-img2{
    margin-top:10px;
    width: 65px;
  }
  .card-detail{
    color: #666;
    font-size: 10px;
    line-height: 17px;
    overflow: hidden;
  }
  .card-detail img{
    width: 12px;
    vertical-align: middle;
  }
  .card-detail .name,.card-detail .tel{
    color:#333
  }
  .card-detail .edit-name{
    z-index:999;
  }
  .card-switch{
    top: 15px;
    line-height:13px;
    font-size: 13px;
    position: relative;
  }
</style>

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简介:成都壹立科技有限公司(简称壹立科技)是一家人专注于人工智能和的互联网驱动型的技术公司,致力于帮助企业和个体品牌进行智能化升级和营销曝光。   壹立科技自主研发的FCRM-壹脉智能名片系统,即营销获客的CRM运营管理系统,将全方位提升企业销售及销售管理能力。   该系统以大数据和人工智能技术为驱动,以小程序为技术应用入口,包含六大核心产品:微官网、智能名片、分销商城、营销裂变系统、智能CRM管理系统、在线预约系统,围绕四大核心- 即:   企业如何流量。打通流量,真实流量智能分发;   数据智能预测。智能预测客户行为,优化蓄客与跟进;   营销传播裂变。分销、预约、激励客户参与卖货,人人销售;   成单达成。达成客户转化,实现客户私有化。   系统操作简单、使用方便,能快速为企业搭建起集销售、服务、品牌建设于一体的用户超级入口,帮助企业实现销售全流程与客户全生命周期的自动化、数字化管理。  壹脉智能销售系统具有人力成本低、效率高、信息全、模板丰富等特点,适用于几乎所有有销售需求的场景和企业,尤其是高客单、低频次消费群的商户,如房产、教育、金融、汽车、婚庆、医疗等。 名片小程序 · 1.【新】聊天功能开关判断,如果crm小程序没有设置开启,则不能进行聊天。 · 2.【优化】登录改版 · 2.1.用户中心添加登录操作,未登录时操作其他功能提示请登录。 · 2.2.搜索进入小程序,未登录返回默认名片,点击我的,到达个人中心进行登录; · 2.3.分享的名片进入,查看名片的信息,但是操作其他的提示到个人中心去登录; · 2.4.通过推送消息进入小程序,没有任何数据,提示需要达到个人中登录,点击我的到达个人中心进行登录。 · 2.5.聊天功能开关判断,如果crm小程序没有设置开启,则不能进行聊天。 · 3.【优化】编辑名片默认头像修改,圆形修改成方形 · 4.【优化】通过推送消息进入名片小程序消息模块,看不到数据,删除小程序,重新打开不再重现 · 5.【优化】错误文字修改: 我的卡卷 -> 我的卡券 · 6.【优化】用户端-商城页 商品描述文字用省略号表示后 文字还是溢出 之后 价格不展示了 并且代表价格的字符变小了 crm 小程序 · 1.【新】添加IM咨询开关功能 · 2.【优化】登录改版,默认进入雷达页面,获取数据时提示其登录,如果暂时不登录,则不返回数据,下次再获取时,又提示其登录 · 3.【优化】通过推送消息进入crm消息模块,看不到数据,删除小程序,重新打开不再重现 · 4.【优化】新用户创建名片后,CRM里“我的”中分享出来的名片是打开查看不了该名片信息。 · 5.【优化】修复新增客户的手机号不支持4,6,9这三种情况 · 6.【优化】修复添加商品介绍的字数不满足60个长度的问题 后端代码 · 1.【新增】不登录查看默认名片列表接口 · 2.【新增】不登录查看名片详情接口 · 3.【新增】企业模块配置功能 · 4.【优化】服务器内存占用过多 · 5.【优化】变更数据的操作,加上事务保证 · 6.【优化】修改可能存在并发的bug · 7.【优化】修改查询企业账号sql语句错误bug 适用范围: 销售行业、房产、教育、金融、汽车、婚庆、医疗等。 运行环境: JAVA+Spring Cloud +VUE+ MySql +Redis +OSS +小程序+PC

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值