vue canvas 画布编辑器

<template>
    <div class="context">

        <div style="height: 0px;">
            <span style="font-family:SourceHanSansK-Bold ;font-size: 0px;">分</span>
            <img class="drawImg" id="qrCode" />
            <img class="drawImg" id="barCode" />
            <label v-for="(v,i) in pathList" :key="i">
                <img class="drawImg" :id="gernerteId(v.id)" />
            </label>
        </div>
        <div style="height: 50px;border-bottom: 1px solid #FFFFFF;">
            <el-col :span="24" style="height: 50px;">
                <div class="grid-content bg-purple-dark" style="height: 50px;background: #d0dce6;">
                    <el-row style="text-align: right;padding-top: 10px;;">
                        <el-button size="mini" @click="folder()">取消</el-button>
                        <el-button size="mini" @click="clearCanvas()" type="danger">重置</el-button>

                        <el-button size="mini" type="primary" style="margin-right: 10px;" @click="preview()">预览
                        </el-button>
                        <div class="demo-image__preview" style="display:none">
                            <el-image ref="previewUrl" :src="url" :preview-src-list="srcList">
                            </el-image>
                        </div>
                        <el-button size="mini" @click="saveCanvas()" type="success">保存</el-button>

                    </el-row>
                </div>
            </el-col>
        </div>
        <el-row style="height:calc(100% - 50px); ; ">
            <div style="height: 100%;overflow:auto;background-color: #FFF;width: 240px;float: left;">

                <el-collapse v-model="activeNames" @change="handleChange">
                    <el-collapse-item title="基础控件" name="1">
                        <div>
                            <div class="base_contro" @click="addRect()">
                                <span class="base_contro_icon">
                                    <canvas id="iconRect" width="32" height="32"></canvas>
                                </span>
                                <span>矩形</span>
                            </div>
                            <div class="base_contro" @click="addRoundRect()">
                                <span class="base_contro_icon">
                                    <canvas id="iconRoundRect" width="32" height="32"></canvas>
                                </span>
                                <span>圆角矩形</span>
                            </div>
                            <div class="base_contro" @click="addArc()">
                                <span class="base_contro_icon">
                                    <canvas id="iconArc" width="32" height="32"></canvas>
                                </span>
                                <span>圆形</span>
                            </div>
                            <div class="base_contro" @click="addLine()">
                                <span class="base_contro_icon">
                                    <canvas id="iconLine" width="32" height="32"></canvas>
                                </span>
                                <span>直线</span>
                            </div>
                            <div class="base_contro" @click="addQrCode()">
                                <span class="base_contro_icon">
                                    <canvas id="iconQrCode" width="32" height="32"></canvas>
                                </span>
                                <span>二维码</span>
                            </div>
                            <div class="base_contro" @click="addBarCode()">
                                <span class="base_contro_icon">
                                    <canvas id="iconBarCode" width="32" height="32"></canvas>
                                </span>
                                <span>条形码</span>
                            </div>
                            <div class="base_contro">

                                <el-upload multiple action="fileUrl" :limit="limitNum" :file-list="fileList"
                                    :before-upload="beforeUpload" accept=".jpg,.png,.jpeg" :on-success="onSuccess"
                                    :show-file-list="showFileList" :http-request="uploadFile">
                                    <span class="base_contro_icon">
                                        <i style="font-size: 32px;line-height: 38px;" class="el-icon-upload"></i>
                                    </span>
                                    <span id="uploadPic">上传图片</span>
                                </el-upload>
                            </div>


                        </div>

                    </el-collapse-item>
                    <el-collapse-item title="动态数据" name="2">
                        <div class="dynamic_data" @click="addEmptyText()">
                            <el-button size="mini">空文本</el-button>
                        </div>
                        <label v-for="(v,i) in dynamicList" :key="i">
                            <div class="dynamic_data" @click="addText(v)">
                                <el-button size="mini">{ {v.name}}</el-button>
                            </div>
                        </label>
                    </el-collapse-item>
                    <el-collapse-item title="装载图片" name="3">
                        <div>简化流程:设计简洁直观的操作流程;</div>
                        <div>清晰明确:语言表达清晰且表意明确,让用户快速理解进而作出决策;</div>
                        <div>帮助用户识别:界面简单直白,让用户快速识别而非回忆,减少用户记忆负担。</div>
                    </el-collapse-item>

                </el-collapse>
                <!-- <div style="height: 100%;" class="grid-content bg-purple">
                    

                    <el-button @click="maxScale()">放大</el-button>
                    <el-button @click="minScale()">缩小</el-button>
                </div> -->
            </div>
            <div style="height: 100%;overflow:auto;width:calc(100% - 480px);float: left;">
                <div class="grid-content bg-purple-light" style="height: 100%;">
                    <div :style="{'width':canvasWidth+'px'}" style="background: #FFF;margin:auto">

                        <canvas id="canvas" :width="canvasWidth" :height="canvasHeight" @mouseout="mouseup($event)"
                            @mousewheel="mousewheel($event)" @mouseup="mouseup($event)" @mousemove="mouseMove($event)"
                            @mousedown="mousedown($event)"></canvas>
                    </div>
                </div>
            </div>
            <div style="height: 100%;overflow:auto;width: 240px;float: left;">
                <div class="grid-content bg-purple " style="height: 100%;background: #FFFFFF;">
                    <el-tabs v-model="activeName" class="my_content" style="height: 100%;overflow: hidden;">

                        <el-tab-pane :label="getProperty()" name="first" style="height: 100%;">

                            <label v-if="canvasIndex>-1" style="height: 100%;">
                                <div style="min-height: 50px;"
                                    v-if="pathList[canvasIndex].module=='A'&&pathList[canvasIndex].type==7">
                                    <div class="property">
                                        内容</div>
                                    <div class="property_div">
                                        <el-input readonly="readonly" type="textarea" autosize @input="updateCanvas()"
                                            placeholder="请输入内容" v-model="pathList[canvasIndex].content">
                                        </el-input>
                                        <el-button @click="uploadAgain()" style="float: right;margin-top: 5px;"
                                            type="primary" size="mini">重新上传</el-button>
                                    </div>

                                </div>
                                <div style="min-height: 40px;" v-if="pathList[canvasIndex].module=='B'">
                                    <div class="property">
                                        内容</div>
                                    <div class="property_div" style="margin-bottom: 10px;">
                                        <el-input type="textarea" autosize @input="updateCanvas()" placeholder="请输入内容"
                                            v-model="pathList[canvasIndex].content">
                                        </el-input>

                                    </div>

                                </div>
                                <div style="min-height: 50px;"
                                    v-if="pathList[canvasIndex].module=='A'&&(pathList[canvasIndex].type==5||pathList[canvasIndex].type==6)">
                                    <div class="property">
                                        内容</div>
                                    <div class="property_div">
                                        <el-input type="textarea" autosize @input="updateCanvas($event)"
                                            placeholder="请输入内容" v-model="pathList[canvasIndex].content">
                                        </el-input>

                                    </div>

                                </div>

                                <div v-if="pathList[canvasIndex].module=='A'&&pathList[canvasIndex].type<4"
                                    style="height:50px;">
                                    <div class="property">
                                        填充</div>
                                    <div class="property_div">

                                        <el-radio-group @change="updateCanvas()" size="mini"
                                            v-model="pathList[canvasIndex].full">
                                            <el-radio-button label="1">是</el-radio-button>
                                            <el-radio-button label="2">否</el-radio-button>

                                        </el-radio-group>

                                    </div>

                                </div>
                                <div v-if="(pathList[canvasIndex].module=='A'&&pathList[canvasIndex].type<5)||(pathList[canvasIndex].module=='B'&&pathList[canvasIndex].type<3)"
                                    style="height:50px;">
                                    <div class="property">
                                        颜色</div>
                                    <div class="property_div">
                                        <el-radio-group @change="updateCanvas()" size="mini"
                                            v-model="pathList[canvasIndex].color">
                                            <el-radio-button label="#000000">黑</el-radio-button>
                                            <el-radio-button label="#FFFFFF">白</el-radio-button>
                                            <el-radio-button label="#FF0000">红</el-radio-button>

                                        </el-radio-group>

                                    </div>

                                </div>
                                <div style="height: 50px;"
                                    v-if="pathList[canvasIndex].module=='B'&&(pathList[canvasIndex].type==1||pathList[canvasIndex].type==2)">
                                    <div class="property">
                                        字体大小</div>
                                    <div class="property_div">
                                        <el-input-number @change="updateCanvas()" size="mini" style="width: 140px;"
                                            v-model="pathList[canvasIndex].fontSize" :min="10" label="描述文字">
                                        </el-input-number>

                                    </div>

                                </div>
                                <div style="min-height: 120px;"
                                    v-if="pathList[canvasIndex].module=='B'&&(pathList[canvasIndex].type==1||pathList[canvasIndex].type==2)">
                                    <div class="property">
                                        字体样式</div>
                                    <div class="property_div">
                                        <div style="height: 40px;">
                                            <el-button type="primary" @click="editFontStyle(1)" class="font_style"
                                                v-if="pathList[canvasIndex].bold=='1'" size="mini">粗体</el-button>
                                            <el-button class="font_style" @click="editFontStyle(1)"
                                                v-if="pathList[canvasIndex].bold=='2'" size="mini">粗体</el-button>
                                            <el-button type="primary" v-if="pathList[canvasIndex].italic=='1'"
                                                @click="editFontStyle(2)" class="font_style" size="mini">斜体</el-button>
                                            <el-button v-if="pathList[canvasIndex].italic=='2'"
                                                @click="editFontStyle(2)" class="font_style" size="mini">斜体</el-button>
                                            <el-button type="primary" v-if="pathList[canvasIndex].removeLine=='1'"
                                                class="font_style" @click="editFontStyle(3)" size="mini">删除线</el-button>
                                            <el-button class="font_style" @click="editFontStyle(3)"
                                                v-if="pathList[canvasIndex].removeLine=='2'" size="mini">删除线</el-button>
                                        </div>
                                        <div style="height: 40px;">
                                            <el-button @click="editFontStyle(4,1)" class="font_style" type="success"
                                                v-if="pathList[canvasIndex].textAlign=='1'" size="mini">居左</el-button>
                                            <el-button @click="editFontStyle(4,1)" class="font_style"
                                                v-if="pathList[canvasIndex].textAlign!&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

删除偶的记忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值