002 画个饼图

画个饼

要求:新增一个增删改查页面,每一条记录的数据,可以导出,也可以统计为饼图。

因为不熟悉前端,同时时间挺紧,这里采用的做法既见效也见笑。。。

维护菜单

我们不建表了,直接使用menu数据。进入系统,维护一个菜单。

新增页面

menu页面复制过来,改为views/report/list/index.vue

将按钮改为导出word以及展示饼图,其中饼图借用了crud.toEdit方法:

      <el-table-column v-if="checkPer(['admin','menu:edit','menu:del'])" label="操作" width="260px" align="center" fixed="right">
        <template slot-scope="scope">
          <el-button size="small" type="primary" @click="exportWord(scope.row)">导出word</el-button>
          <el-button size="mini" type="success" @click="crud.toEdit(scope.row)">查看饼图</el-button>
        </template>
      </el-table-column>

定义饼图

修改components/Echarts/PieChart.vue自己做一个MyPieChart.vue

//props中增加:
    chartData: {
      type: Object,
      required: true
    }
//methods.initchart改为:
    initChart() {
      this.chart = echarts.init(this.$el, 'macarons')
      this.setOptions(this.chartData)
    },
// methods新增setOptions方法,将menu的几个数字特性,作为饼图百分比
    setOptions(form) {
      console.log(form)
      this.chart.setOption({
        tooltip: {
          trigger: 'item',
          formatter: '{a} <br/>{b} : {c} ({d}%)'
        },
        legend: {
          left: 'center',
          bottom: '10',
          data: ['subCount', 'type', 'menuSort', 'cache', 'hidden']
        },
        calculable: true,
        series: [
          {
            name: 'Menu Pie',
            type: 'pie',
            roseType: 'radius',
            radius: [15, 95],
            center: ['50%', '40%'],
            data: [
              { value: form.subCount, name: 'subCount' },
              { value: form.type, name: 'type' },
              { value: form.menuSort, name: 'menuSort' },
              { value: form.cache, name: 'cache' },
              { value: form.hidden, name: 'hidden' }
            ],
            animationEasing: 'cubicInOut',
            animationDuration: 2600
          }
        ]
      })

引入饼图

index.vue中:

//引用饼图
import PieChart from '@/components/Echarts/MyPieChart'

//修改dialog页面,展示饼图,数据源为form
    <el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="580px">
      <el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
        <div class="dashboard-container">
          <div class="dashboard-editor-container">
            <el-row :gutter="32">
              <!-- <el-col :xs="24" :sm="24" :lg="8"> -->
              <el-col :xs="24" :sm="24" :lg="24">
                <div class="chart-wrapper">
                  <pie-chart :chart-data="form" />
                </div>
              </el-col>
            </el-row>
          </div></div>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="text" @click="crud.cancelCU">取消</el-button>
      </div>
    </el-dialog>

如无意外,饼图展示已完成。

导出word

index.vue中新增methods.exportWord,如下:

//引入方法
import JSZipUtils from 'jszip-utils'
import Docxtemplater from 'docxtemplater'
import Pizzip from 'pizzip'
import { saveAs } from 'file-saver'

// 导出word
    exportWord(row) {
      const _this = this
      const tableData = _this.$data.crud.data
      const bodyData = { name: row.id, tel: '13309388888', need: '物美价廉', remark: '已通过质检', total: '9999', checkNote: '批准' }
      // ['name', 'tel', 'need', 'remark', 'total', 'checkNote']
      console.log(_this.$data.crud.data)
      // 读取并获得模板文件的二进制内容
      JSZipUtils.getBinaryContent('/input.docx', function(error, content) {
        // input.docx是模板。我们在导出的时候,会根据此模板来导出对应的数据
        // 抛出异常
        if (error) {
          throw error
        }

        // 创建一个JSZip实例,内容为模板的内容
        const zip = new Pizzip(content)
        // 创建并加载docxtemplater实例对象
        const doc = new Docxtemplater().loadZip(zip)
        // 设置模板变量的值
        doc.setData({
          ...bodyData,
          table: tableData
        })
        try {
          // 用模板变量的值替换所有模板变量
          doc.render()
        } catch (error) {
          // 抛出异常
          const e = {
            message: error.message,
            name: error.name,
            stack: error.stack,
            properties: error.properties
          }
          console.log(JSON.stringify({ error: e }))
          throw error
        }

        // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
        const out = doc.getZip().generate({
          type: 'blob',
          mimeType:
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
        })
        // 将目标文件对象保存为目标类型的文件,并命名
        const outName = '报表明细' + bodyData.name + '.docx'
        saveAs(out, outName)
      })
    }

由于使用了一些插件,记得

npm install docxtemplater pizzip
npm install jszip --save
npm install jszip-utils --save
npm install file-saver --save

记得在/public目录下放个input.docx作为模板,内容如下:

header:
xxxx{name}              xxxx{tel}   
xxxx{need}      
xxxx{remark}    

明细内容
{#table}
{id}
{label}
{menuSort}
{subCount}
{subCount}
{createTime}
{/table}


footer:{checkNote}

完毕。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容