element-ui 上传图片后标注坐标点

有个组件库的名称叫做element-ui,基于Vue2.0开发,提供了丰富的PC端组件,本文通过实例代码给大家介绍element-ui 上传图片后标注坐标点

什么是element-ui

    element-ui是由饿了么前端团队推出www.qmia.cn的一套为开发者、设计师和产品经理准备的基于Vue.js 2.0的桌面组件库,而手机端有对应框架是 Mint UI 。整个ui风格简约,很实用,同时也极大的提高了开发者的效率,是一个非常受欢迎的组件库。

页面大概如下:

组件使用的是layui的layer.open弹框。

左边是表单信息,右边是绘图区域。

原文件mapForm.vue

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

<template>

    <div class="mapForm">

        <div class="left">

            <el-form ref="form" :model="form" :rules="rules" label-width="160px">

                <el-form-item label="地图名称" prop="mapName">

                    <el-input v-model="form.mapName" size="mini" clearable class="formInputClass"></el-input>

                </el-form-item>

                <el-form-item label="地图描述" prop="remarks">

                    <el-input type="textarea" v-model="form.remarks" size="mini" clearable class="formInputClass"></el-input>

                </el-form-item>

                <el-form-item label="点位信息" prop="" v-if="mapList.length > 0">

                    <div class="mapContent">

                        <div v-for="(map,key) in mapList" :key="key">

                            <div class="pointAbscissaOrdinate"><span>点位坐标{{key+1}}:{{map.abscissa}}-{{map.ordinate}}</span></div>

                            <el-select v-model="mapList[key]['point']" placeholder="请选择" class="selectClass" @change="changePoint">

                                <el-option v-for="(item, key) in pointList" :key="key" :label="item.name" :value="item.point">

                                </el-option>

                            </el-select>

                        </div>

                    </div>

                </el-form-item>

                <div class="btn">

                    <el-button @click="checkParams" type="primary">提交</el-button>

                </div>

            </el-form>

        </div>

        <div class="right" id="">

            <div class="imgDiv" id="imgDiv" v-loading="loadStage">

                <img :src="fileSrc" width="1100" height="720" id="imgPainter" />

                <div class="marker" v-for="(item, key) in mapList" :key="key" :style="{top: item.ordinate+'px', 'left': item.abscissa+'px'}" @contextmenu.prevent="clearMarker(key)">

                    {{key+1}}

                    <div class="ponint">{{item.point}}</div>

                </div>

            </div>

            <div class="uploadBtn">

                <el-upload class="upload-demo" ref="upload" action="" :on-change="handleChange" :show-file-list="false" :on-remove="handleRemove" :auto-upload="false" style="display:inline-block;">

                    <el-button slot="trigger" size="mini" type="primary">选取文件</el-button>

                </el-upload>

                <el-button @click="clearPic" type="danger">清除所有点位</el-button>

            </div>

            <div class="info"><i class="el-icon-info"></i>显示大小为1100px*720px</div>

            <div class="info"><i class="el-icon-info"></i>图片框内鼠标左键标点</div>

            <div class="info"><i class="el-icon-info"></i>图片框内鼠标右键已经标注的点删除该点</div>

        </div>

    </div>

</template>

<script>

export default {

    name: 'mapFormComponent',

    data() {

        return {

            form: {

                mapName: "",

            },

            rules: {

                mapName: [

                    { required: true, message: "请输入地图名称", trigger: "blur" },

                ],

            },

            fileList: [],

            fileSrc: '',

            pointList: [

                { name: "排放口1", point: "@FQ01" },

                { name: "排放口2", point: "@FQ02" },

            ],

            mapList: [],           //斑马线的数组

            canBiaoZhu: true//是否可以进行标注

            pointColor: 'red',   //点的颜色

            pointSize: 20,       //点的大小

            pointSelectList: {},

            notifyId: {},

            loadStage: false,

        };

    },

    created() { },

    mounted() {

        // 绘点区域事件绑定

        let _this = this;

        if (document.getElementById('imgPainter')) {

            document.getElementById('imgPainter').onmousedown = (e) => {

                e = e || window.event

                if (e.button !== 2) {       //判断是否右击

                    if (this.canBiaoZhu && this.fileSrc != '') {    //判断是否可以进行标注  需上传图片

                        var x = e.offsetX || e.layerX

                        var y = e.offsetY || e.layerY

                        this.mapList.push({

                            id: this.mapList.length + 1,

                            name: '',

                            abscissa: x,

                            ordinate: y,

                        })

                        // 设置变量

                        // this.pointSelectList.$set(0);

                        let key = `point`;

                        _this.$set(this.mapList[this.mapList.length - 1], key, "")

                    } else {

                        //提示上传图片

                        // 只显示一次

                        if (_this.notifyId.id)

                            _this.notifyId.close();

                        this.notifyId = _this.$notify.error({

                            title: '提示信息',

                            message: '请先上传图片后再标点',

                            showClose: true,

                        });

                    }

                } else {

                    return false

                }

            }

        }

        // 右键阻止

        var oDiv1 = document.getElementById('imgDiv');

        oDiv1.oncontextmenu = function (ev) {

            var e = e || window.event;

            //阻止冒泡

            e.cancelBubble = true;

            //阻止触发默认事件

            e.returnValue = false;

        }

    },

    methods: {

        changePoint() {

            /**point change */

            this.$forceUpdate();

        },

        clearMarker(index) {

            /**清除marker */

            this.mapList.splice(index, 1);

        },

        handleChange(file, fileList) {

            this.loadStage = true;

            let fileName = file.name;

            let regex = /(.jpg|.jpeg|.gif|.png|.bmp)$/;

            if (regex.test(fileName.toLowerCase())) {

                this.fileSrc = URL.createObjectURL(file.raw)  // 获取URL

                console.log(this.fileSrc);

            } else {

                this.$message.error('请选择图片文件');

            }

            this.loadStage = false;

        },

        clearPic() {

            /**清除图片 */

            this.mapList = [];

        },

        checkParams() {

            /***

             * 验证提交信息

             */

            this.$refs["form"].validate((valid) => {

                if (valid) {

                    let params = this.form;

                    this.submit(params);

                }

            });

        },

        async submit(params) {

            /**提交 */

            let resp = await this.$api.companyApiList

                .addEditCompany(params);

            if (resp.data.code != "error") {

                // 判断是否新增修改

                this.$notify.success({

                    title: "提示",

                    message: resp.data.msg,

                    showClose: true,

                });

                let type = params.id && params.id != '' ? 'edit' : 'add';

                this.$emit("update", type);

                // 清空表单数据

                this.$refs.form.resetFields();

            }

        },

    },

};

</script>

<style scoped lang="less">

/**

  表单样式

 */

.mapForm {

    display: flex;

    padding: 10px;

    border: 1px solid pink;

    .left {

        flex: 2;

        border-right: 1px dashed pink;

        margin-right: 4px;

        .mapContent {

            height: 700px;

            overflow-y: auto;

            .selectClass {

                margin: 0px 5px;

            }

            .pointAbscissaOrdinate {

                display: inline-block;

                width: 140px;

            }

        }

    }

    .right {

        flex: 8;

        // border: 1px solid pink;

        max-width: 1100px;

        .imgDiv {

            position: relative;

            height: 720px;

            border: 2px solid cornflowerblue;

            .marker {

                position: absolute;

                border-radius: 50%;

                z-index: 999;

                width: 20px;

                height: 20px;

                background-color: red;

                text-align: center;

                line-height: 20px;

                color: yellow;

                .ponint {

                    display: block;

                    position: absolute;

                    left: 20px;

                    top: 0px;

                    font-size: 12px;

                    color: blue;

                }

            }

            .marker:hover .ponint {

                display: block;

            }

        }

        .info {

            font-size: 12px;

        }

        .uploadBtn {

            margin: 10px 0px;

        }

    }

    .btn {

        padding-left: 160px;

    }

}

.formInputClass {

    width: 200px;

}

</style>

标点的效果如下:

到此这篇关于element-ui 上传图片后标注坐标点的文章

的示例代码,感兴趣的朋友跟随小编一起看看吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值