src/components/Editor/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/system/equipment/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/system/point/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/system/report/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/system/threshold/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/system/work-order/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/components/Editor/index.vue
@@ -1,19 +1,10 @@ <template> <div> <el-upload :action="uploadUrl" :before-upload="handleBeforeUpload" :on-success="handleUploadSuccess" :on-error="handleUploadError" name="file" :show-file-list="false" :headers="headers" style="display: none" ref="upload" v-if="this.type == 'url'" > <el-upload :action="uploadUrl" :before-upload="handleBeforeUpload" :on-success="handleUploadSuccess" :on-error="handleUploadError" name="file" :show-file-list="false" :headers="headers" style="display: none" ref="upload" v-if="this.type == 'url'"> </el-upload> <div class="editor" ref="editor" :style="styles"></div> <div class="editor" ref="editor" :style="styles" @paste="onPaste($event)"></div> </div> </template> @@ -23,6 +14,8 @@ import "quill/dist/quill.snow.css"; import "quill/dist/quill.bubble.css"; import { getToken } from "@/utils/auth"; import request from '@/utils/request'; export default { name: "Editor", @@ -47,7 +40,7 @@ type: Boolean, default: false, }, /* 上传文件大小限制(MB) */ // 上传文件大小限制(MB) fileSize: { type: Number, default: 5, @@ -122,6 +115,45 @@ this.Quill = null; }, methods: { /**监听富文本编辑器的粘贴事件 针对图片进行操作 */ onPaste(evt) { // 获取解析 粘贴的内容 //先判断粘贴的内容是否是图片 if ( evt.clipboardData && evt.clipboardData.files && evt.clipboardData.files.length ) { evt.preventDefault(); [].forEach.call(evt.clipboardData.files, (file) => { if (!file.type.match(/^image\/(gif|jpe?g|a?png|bmp)/i)) { return; } const formData = new FormData(); formData.append("file", file); //带请求头过验证 const config = { headers: { "Authorization": "Bearer " + getToken() } }; request.post("/common/upload", formData, config).then( res => { if (res.code == 200) { let length = this.Quill.getSelection().index; //光标位置 // 插入图片地址 this.Quill.insertEmbed(length, "image", 'https://s.rongeying.cn/' + res.fileName); // 光标后移一位 this.Quill.setSelection(length + 1); } else { this.$message.error("图片插入失败"); } }) }); } }, init() { const editor = this.$refs.editor; this.Quill = new Quill(editor, this.options); @@ -129,6 +161,7 @@ if (this.type == 'url') { let toolbar = this.Quill.getModule("toolbar"); toolbar.addHandler("image", (value) => { this.uploadType = "image"; if (value) { this.$refs.upload.$children[0].$refs.input.click(); } else { @@ -157,13 +190,6 @@ }, // 上传前校检格式和大小 handleBeforeUpload(file) { const type = ["image/jpeg", "image/jpg", "image/png", "image/svg"]; const isJPG = type.includes(file.type); // 检验文件格式 if (!isJPG) { this.$message.error(`图片格式错误!`); return false; } // 校检文件大小 if (this.fileSize) { const isLt = file.size / 1024 / 1024 < this.fileSize; @@ -175,14 +201,15 @@ return true; }, handleUploadSuccess(res, file) { // 获取富文本组件实例 let quill = this.Quill; // 如果上传成功 if (res.code == 200) { // 获取富文本组件实例 let quill = this.Quill; // 获取光标所在位置 let length = quill.getSelection().index; // 插入图片 res.url为服务器返回的图片地址 quill.insertEmbed(length, "image", process.env.VUE_APP_BASE_API + res.fileName); // quill.insertEmbed(length, "image", 'https://rongeying.cn/ronge/' + res.fileName); quill.insertEmbed(length, "image", 'https://s.rongeying.cn/' + res.fileName); // 调整光标到最后 quill.setSelection(length + 1); } else { @@ -197,76 +224,95 @@ </script> <style> .editor, .ql-toolbar { .editor, .ql-toolbar { white-space: pre-wrap !important; line-height: normal !important; } .quill-img { display: none; } .ql-snow .ql-tooltip[data-mode="link"]::before { content: "请输入链接地址:"; } .ql-snow .ql-tooltip.ql-editing a.ql-action::after { border-right: 0px; content: "保存"; padding-right: 0px; } .ql-snow .ql-tooltip[data-mode="video"]::before { content: "请输入视频地址:"; } .ql-snow .ql-picker.ql-size .ql-picker-label::before, .ql-snow .ql-picker.ql-size .ql-picker-item::before { content: "14px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before { content: "10px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before { content: "18px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before { content: "32px"; } .ql-snow .ql-picker.ql-header .ql-picker-label::before, .ql-snow .ql-picker.ql-header .ql-picker-item::before { content: "文本"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { content: "标题1"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { content: "标题2"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { content: "标题3"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { content: "标题4"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { content: "标题5"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { content: "标题6"; } .ql-snow .ql-picker.ql-font .ql-picker-label::before, .ql-snow .ql-picker.ql-font .ql-picker-item::before { content: "标准字体"; } .ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before { content: "衬线字体"; } .ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before { content: "等宽字体"; src/main.js
@@ -58,6 +58,7 @@ Vue.prototype.download = download Vue.prototype.handleTree = handleTree Vue.prototype.getToken = getToken Vue.prototype.$uploadUrl = process.env.VUE_APP_BASE_API + "/common/upload" // 全局组件挂载 Vue.component('DictTag', DictTag) src/views/system/equipment/index.vue
@@ -16,28 +16,24 @@ <p>设备总数</p > </div> <div class="dashboard-item"> <h3 style="color: #5C9BF8">{{ count.totalPosts }}</h3> <p>人脸设备数</p > </div> <div class="dashboard-item"> <h3 style="color: #5C9BF8">{{ count.totalPosts }}</h3> <p>车辆设备数</p > </div> <div class="dashboard-item"> <h3 style="color: #5C9BF8">{{ count.totalPosts }}</h3> <p>视频设备数</p > </div> <div class="dashboard-item"> <h3 style="color: #3eba45">{{ count.totalMembers }}</h3> <p>正常数</p > </div> <div class="dashboard-item"> <h3 style="color: #fe640d">{{ count.postsPercentage }}</h3> <p>异常数</p > </div> <div class="dashboard-item"> <h3>{{ count.totalViews }}</h3> <p>生成异常工单数</p > </div> <div class="dashboard-item"> <h3>{{ count.noStore }}</h3> <p>无存储</p > </div> <div class="dashboard-item"> <h3>{{ count.partStore }}</h3> <p>部分存储</p > </div> <div class="dashboard-item"> <h3>{{ count.viewsPercentage }}%</h3> <p>设备运行率</p > </div> </div> </el-col> @@ -84,21 +80,6 @@ /> </el-select> </el-form-item> <el-form-item label="是否生成异常工单" prop="defaultOrder" label-width="130px"> <el-select v-model="queryParams.defaultOrder" placeholder="是否生成异常工单" clearable style="width: 170px" > <el-option v-for="dict in dict.type.platform_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> @@ -130,16 +111,8 @@ <dict-tag :options="dict.type.camera_state" :value="scope.row.onState"/> </template> </el-table-column> <el-table-column label="是否生成异常工单" align="center" prop="defaultOrder" width="180" v-if="columns[3].visible"> <template slot-scope="scope"> <dict-tag :options="dict.type.platform_yes_no" :value="scope.row.defaultOrder"/> </template> </el-table-column> <el-table-column label="数据时间" align="center" prop="installedTime" width="180" v-if="columns[4].visible"/> <el-table-column label="管理单位" align="center" prop="managementUnit" width="180" v-if="columns[5].visible"/> <el-table-column label="信令时延(ms)" align="center" prop="sipDelay" width="180" v-if="columns[6].visible"/> <el-table-column label="视频时延(ms)" align="center" prop="videoDelay" width="180" v-if="columns[7].visible"/> <el-table-column label="关键帧时延(ms)" align="center" prop="iframeDelay" width="180" v-if="columns[8].visible"/> <el-table-column label="数据时间" align="center" prop="installedTime" width="180" v-if="columns[3].visible"/> <el-table-column label="管理单位" align="center" prop="managementUnit" width="180" v-if="columns[4].visible"/> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right"> <template slot-scope="scope"> <el-button @@ -176,25 +149,12 @@ </el-col> <el-col :span="24"> <el-form-item label="地址:">{{ form.address }}</el-form-item> <el-form-item label="是否生成异常工单:"> <div v-if="form.defaultOrder === 1">是</div> <div v-else-if="form.defaultOrder === 2">否</div> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label="安装时间:">{{ form.installedTime }}</el-form-item> </el-col> <el-col :span="24"> <el-form-item label="管理单位:">{{ form.managementUnit }}</el-form-item> </el-col> <el-col :span="24"> <el-form-item label="信令时延(ms):"></el-form-item> </el-col> <el-col :span="24"> <el-form-item label="视频时延(ms):"></el-form-item> </el-col> <el-col :span="24"> <el-form-item label="关键帧时延(ms):"></el-form-item> </el-col> </el-row> </el-form> @@ -217,12 +177,8 @@ { key: 0, label: `标签`, visible: true }, { key: 1, label: `区域`, visible: true }, { key: 2, label: `设备状态`, visible: true }, { key: 3, label: `是否生成异常工单`, visible: true }, { key: 4, label: `数据时间`, visible: true }, { key: 5, label: `管理单位`, visible: true }, { key: 6, label: `信令时延`, visible: true }, { key: 7, label: `视频时延`, visible: true }, { key: 8, label: `关键帧时延`, visible: true } { key: 3, label: `数据时间`, visible: true }, { key: 4, label: `管理单位`, visible: true }, ], count: { totalPosts: 0, src/views/system/point/index.vue
@@ -84,7 +84,7 @@ <el-table v-loading="loading" :data="pointList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="点位名称" align="center" prop="pointName" /> <el-table-column label="点位类型" align="center" prop="pointType" /> <el-table-column label="标签" align="center" prop="tag" > <span>{{important}}</span> </el-table-column> src/views/system/report/index.vue
@@ -173,15 +173,15 @@ <el-option label="设备遗失" value="设备遗失"/> </el-select> </el-form-item> <el-form-item label="有效时间"> <el-form-item label="报备时间" prop="expirTime"> <el-date-picker v-model="expirTime" style="width: 240px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="生效日期" end-placeholder="失效日期" start-placeholder="开始日期" end-placeholder="结束日期" ></el-date-picker> </el-form-item> <el-form-item label="报备内容" prop="reportContent"> @@ -332,7 +332,7 @@ { required: true, message: "请选择故障类型", trigger: "blur" } ], expirTime: [ { required: true, message: "请选择有效时间", trigger: "blur" } { required: true, message: "请选择报备时间", trigger: "blur" } ], } }; src/views/system/threshold/index.vue
@@ -26,15 +26,17 @@ <el-table-column label="超时天数" align="center" prop="timeout"/> <el-table-column label="工单阈值" align="center" prop="indicator"> <template slot-scope="scope"> <div v-for="item in JSON.parse(scope.row.indicator)" :key="item"> {{ item.label }}:{{ item.value }} <div v-for="item in JSON.parse(scope.row.indicator)" :key="item" style="display: flex;flex-direction: row"> <div style="width: 120px;text-align: right">{{ item.label }}</div> <div style="width: 60px;text-align: right">{{ item.value}}</div> </div> </template> </el-table-column> <el-table-column label="下发阈值" align="center" prop="indicator"> <template slot-scope="scope"> <div v-for="item in JSON.parse(scope.row.indicator)" :key="item"> {{ item.label }}:{{ item.value2 }} <div v-for="item in JSON.parse(scope.row.indicator)" :key="item" style="display: flex;flex-direction: row"> <div style="width: 120px;text-align: right">{{ item.label }}</div> <div style="width: 60px;text-align: right">{{ item.value2}}</div> </div> </template> </el-table-column> @@ -334,7 +336,7 @@ } </script> <style> .el-input-half-width { width: calc(50% - 6px); /* 减去一些间隔 */ .el-input-half-width { width: calc(50% - 6px); /* 减去一些间隔 */ } </style> </style> src/views/system/work-order/index.vue
@@ -170,7 +170,7 @@ <el-form-item label="现场图片" prop="picture"> <el-upload class="avatar-uploader" action="/dev-api/common/upload" :action="this.$uploadUrl" name="file" :headers="{'Authorization': 'Bearer ' + getToken()}" :on-success="pictureUploadSuccess" @@ -184,7 +184,7 @@ <el-form-item label="佐证材料" prop="certificates"> <el-upload class="avatar-uploader" action="/dev-api/common/upload" :action="this.$uploadUrl" name="file" :headers="{'Authorization': 'Bearer ' + getToken()}" :on-success="certificateUploadSuccess"