| | |
| | | <div> |
| | | <!-- <input type="color" ref="colorPicker" v-model="color"> --> |
| | | <label for>拾色器:</label> |
| | | <el-color-picker v-model="color" show-alpha size="mini"></el-color-picker> |
| | | <el-color-picker v-model="colorPick" show-alpha size="mini"></el-color-picker> |
| | | </div> |
| | | <div style="width:250px;"> |
| | | <label for>笔触:</label> |
| | |
| | | </div> |
| | | </div> |
| | | <div class="action-bar"> |
| | | <el-button type size="mini" @click="newLabel">标注</el-button> |
| | | <el-button type size="mini" @click="isEdit=!isEdit">{{isEdit?'锁定':'编辑'}}</el-button> |
| | | <el-button class="drawboard-trigger" size="small" @click="isEdit=!isEdit" :icon="isEdit?'el-icon-lock':'el-icon-edit'">{{isEdit?'锁定':'编辑'}}</el-button> |
| | | </div> |
| | | <div class="drawboard"> |
| | | <div class="mask" v-show="isEdit" ref="editBoard"> |
| | | <div class="label" v-for="(item,index) in labels" :key="index" :style="{left:`${item.x}px`, top:`${item.y}px`}"></div> |
| | | <div class="mask" :class="{'edit-status-mask':isEdit}" ref="editBoard" > |
| | | <div class="label" @click="editLabel(item)" v-for="(item,index) in labels" :key="index" :style="{left:`${item.x}px`, top:`${item.y}px`, backgroundColor: colorPick, width: `${dotSize}px`, height: `${dotSize}px` }"></div> |
| | | </div> |
| | | <img :src="baseUrl" alt /> |
| | | <div class="popBox" v-show="isShowPop" :style="`top:${curLabel.y + 22}px;left:${curLabel.x}px`"> |
| | | <div class="title">标注信息</div> |
| | | <div class="details"> |
| | | <div class="detail-item"> |
| | | <div class="left"> |
| | | <label for="">平面坐标X:</label> |
| | | <span class="fix-width">{{curLabel.x}}</span> |
| | | <i>px</i> |
| | | </div> |
| | | <el-dialog> |
| | | <span class="devide"></span> |
| | | <div class="right"> |
| | | <label for="">实际坐标X:</label> |
| | | <el-input type="text" size="mini" style="width:90px" v-model="curLabel.posX"></el-input> |
| | | </div> |
| | | </div> |
| | | <div class="detail-item"> |
| | | <div class="left"> |
| | | <label for="">平面坐标Y:</label> |
| | | <span class="fix-width">{{curLabel.y}}</span> |
| | | <i>px</i> |
| | | </div> |
| | | <span class="devide"></span> |
| | | <div class="right"> |
| | | <label for="">实际坐标Y:</label> |
| | | <el-input type="text" size="mini" style="width:90px" v-model="curLabel.posY"></el-input> |
| | | </div> |
| | | </div> |
| | | <div class="btns"> |
| | | <el-button size="mini" type="danger" @click="deleteLabel">删除</el-button> |
| | | <el-button size="mini" type="primary" @click="cancle">取消</el-button> |
| | | <el-button size="mini" type="success" @click="submitInfo">确定</el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | data () { |
| | | return { |
| | | labels: [], |
| | | color: '#79f2fb', |
| | | colorPick: '#79f2fb', |
| | | dotSize: 3, |
| | | isEdit: false, |
| | | isShowPop: false, |
| | | isNewLabel: false, |
| | | curLabel: { |
| | | id:'', |
| | | posX:'', |
| | | posY:'', |
| | | x:'', |
| | | y:'' |
| | | }, |
| | | baseUrl: '' |
| | | } |
| | | }, |
| | | computed: { |
| | | |
| | | }, |
| | | mounted(){ |
| | | setTimeout(()=>{ |
| | | let mockData = [{id:'a1',x:15, y:33, posX:150, posY:330},{id:'b2',x:56, y:87, posX:560, posY:870}]; |
| | | this.labels = mockData; |
| | | },1000); |
| | | }, |
| | | watch:{ |
| | | isEdit(n,o){ |
| | | if(n){ |
| | | this.$refs['editBoard'].addEventListener('click',(e)=>{ |
| | | this.newLabel(e); |
| | | }) |
| | | this.$refs['editBoard'].addEventListener('click',this.bindListen); |
| | | }else{ |
| | | this.$refs['editBoard'].removeEventListener('click',this.bindListen); |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | bindListen(e){ |
| | | this.newLabel(e); |
| | | }, |
| | | newLabel(e){ |
| | | this.labels.push({x,y}); |
| | | console.log('点击了画板') |
| | | if(this.isShowPop) return; |
| | | //获取鼠标相对于画板的定位 |
| | | console.log('获取当前定位信息'); |
| | | let target = { |
| | | id:'', |
| | | x:e.offsetX, |
| | | y:e.offsetY, |
| | | posX:'', |
| | | posY:'' |
| | | }; |
| | | this.labels.push(target); |
| | | this.curLabel = target; |
| | | this.isShowPop = true; |
| | | this.isNewLabel = true; |
| | | }, |
| | | editLabel(label){ |
| | | debugger |
| | | if(!this.isEdit) return; |
| | | this.isShowPop = true; |
| | | this.curLabel = JSON.parse(JSON.stringify(label)); |
| | | }, |
| | | cancle(){ |
| | | this.isShowPop = false; |
| | | //如果是未保存过的label直接删除(未保存的就是labels数组中最后一个) |
| | | if(!this.curLabel.id){ |
| | | this.labels.pop(); |
| | | } |
| | | }, |
| | | deleteLabel(){ |
| | | if(this.curLabel.id){ |
| | | //请求后台删除 |
| | | }else{ |
| | | this.labels.pop(); |
| | | this.isShowPop = false; |
| | | } |
| | | }, |
| | | submitInfo(){ |
| | | |
| | | } |
| | | } |
| | | } |
| | |
| | | margin: auto; |
| | | margin-bottom: 20px; |
| | | text-align: right; |
| | | .drawboard-trigger{ |
| | | background: transparent; |
| | | color: #fff; |
| | | border-color: rgba(255,255,255,.3); |
| | | } |
| | | } |
| | | .drawboard { |
| | | margin: auto; |
| | |
| | | box-shadow: 3px 3px 3px 1px rgba(0, 0, 0, 0.1); |
| | | .mask{ |
| | | position: absolute; |
| | | background: rgba(20, 181, 255, 0.1); |
| | | background: transparent; |
| | | width: 100%; |
| | | height: 100%; |
| | | overflow: hidden; |
| | | &.edit-status-mask{ |
| | | background: rgba(20, 181, 255, 0.1); |
| | | } |
| | | .label{ |
| | | position: absolute; |
| | | z-index: 2; |
| | | border-radius: 50%; |
| | | } |
| | | } |
| | | img{ |
| | | width: 960px; |
| | | height: 540px; |
| | | background:#f0ffca; |
| | | } |
| | | .popBox{ |
| | | position: absolute; |
| | | padding: 14px; |
| | | border-radius: 3px; |
| | | color: #fff; |
| | | background: rgba(0,0,0,.7); |
| | | .title{ |
| | | font-weight: bold; |
| | | text-align: left; |
| | | font-size: 15px; |
| | | } |
| | | .details{ |
| | | .detail-item{ |
| | | display: flex; |
| | | align-items: center; |
| | | margin: 5px 0; |
| | | label{ |
| | | color: #ccc; |
| | | width:65px; |
| | | display: inline-block; |
| | | } |
| | | .left{ |
| | | width: 110px; |
| | | text-align: left; |
| | | line-height: 28px; |
| | | .fix-width{ |
| | | display: inline-block; |
| | | width: 23px; |
| | | } |
| | | } |
| | | .right{ |
| | | width: 160px; |
| | | } |
| | | .devide{ |
| | | width: 10px; |
| | | height: 1px; |
| | | background: #ccc; |
| | | margin: 0 3px; |
| | | } |
| | | } |
| | | .btns{ |
| | | margin-top: 10px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |