From 92a25393f38d9877aeefca3bcc0f6574b7dff6d4 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期二, 17 十月 2023 17:55:40 +0800 Subject: [PATCH] 基于新的云端录像实现页面功能 --- web_src/src/components/CloudRecord.vue | 385 +++++++++++++++++++++++++++++++----------------------- 1 files changed, 220 insertions(+), 165 deletions(-) diff --git a/web_src/src/components/CloudRecord.vue b/web_src/src/components/CloudRecord.vue index c13cdc4..c47ce2f 100755 --- a/web_src/src/components/CloudRecord.vue +++ b/web_src/src/components/CloudRecord.vue @@ -1,5 +1,5 @@ <template> - <div id="app" style="width: 100%"> + <div id="app" style="width: 100%"> <div class="page-header"> <div class="page-title"> <el-page-header v-if="recordDetail" @back="backToList" content="浜戠褰曞儚"></el-page-header> @@ -7,44 +7,82 @@ </div> <div class="page-header-btn"> + 鎼滅储: + <el-input @input="search" style="margin-right: 1rem; width: auto;" size="mini" placeholder="鍏抽敭瀛�" + prefix-icon="el-icon-search" v-model="search" clearable></el-input> + 寮�濮嬫椂闂�: + <el-date-picker + v-model="startTime" + type="datetime" + placeholder="閫夋嫨鏃ユ湡鏃堕棿"> + </el-date-picker> + 缁撴潫鏃堕棿: + <el-date-picker + v-model="endTime" + type="datetime" + placeholder="閫夋嫨鏃ユ湡鏃堕棿"> + </el-date-picker> 鑺傜偣閫夋嫨: - <el-select size="mini" @change="chooseMediaChange" style="width: 16rem; margin-right: 1rem;" v-model="mediaServerId" placeholder="璇烽�夋嫨" :disabled="recordDetail"> + <el-select size="mini" @change="chooseMediaChange" style="width: 16rem; margin-right: 1rem;" + v-model="mediaServerId" placeholder="璇烽�夋嫨" :disabled="recordDetail"> <el-option - v-for="item in mediaServerList" - :key="item.id" - :label="item.id" - :value="item.id"> + v-for="item in mediaServerList" + :key="item.id" + :label="item.id" + :value="item.id"> </el-option> </el-select> - <el-button v-if="!recordDetail" icon="el-icon-refresh-right" circle size="mini" :loading="loading" @click="getRecordList()"></el-button> + <el-button size="mini" icon="el-icon-delete" type="danger" @click="deleteRecord()">鎵归噺鍒犻櫎</el-button> + <el-button v-if="!recordDetail" icon="el-icon-refresh-right" circle size="mini" :loading="loading" + @click="getRecordList()"></el-button> </div> </div> <div v-if="!recordDetail"> <!--璁惧鍒楄〃--> <el-table :data="recordList" style="width: 100%" :height="winHeight"> - <el-table-column prop="app" label="搴旂敤鍚�" > + <el-table-column prop="app" label="搴旂敤鍚�"> </el-table-column> - <el-table-column prop="stream" label="娴両D" > + <el-table-column prop="stream" label="娴両D" width="380"> </el-table-column> - <el-table-column prop="time" label="鏃堕棿" > - </el-table-column> - <el-table-column label="鎿嶄綔" width="360" fixed="right"> + <el-table-column label="寮�濮嬫椂闂�"> <template slot-scope="scope"> - <el-button size="medium" icon="el-icon-folder-opened" type="text" @click="showRecordDetail(scope.row)">鏌ョ湅</el-button> - <!-- <el-button size="mini" icon="el-icon-delete" type="danger" @click="deleteRecord(scope.row)">鍒犻櫎</el-button>--> + {{formatTimeStamp(scope.row.startTime)}} + </template> + </el-table-column> + <el-table-column label="缁撴潫鏃堕棿"> + <template slot-scope="scope"> + {{formatTimeStamp(scope.row.endTime)}} + </template> + </el-table-column> + <el-table-column label="鏃堕暱"> + <template slot-scope="scope"> + <el-tag>{{formatTime(scope.row.timeLen)}}</el-tag> + </template> + </el-table-column> + <el-table-column prop="fileName" label="鏂囦欢鍚嶇О"> + </el-table-column> + <el-table-column prop="mediaServerId" label="娴佸獟浣�"> + </el-table-column> + <el-table-column label="鎿嶄綔" width="200" fixed="right"> + <template slot-scope="scope"> + <el-button size="medium" icon="el-icon-video-play" type="text" @click="showRecordDetail(scope.row)">鎾斁 + </el-button> + <el-button size="medium" icon="el-icon-delete" type="text" style="color: #f56c6c" + @click="deleteRecord(scope.row)">鍒犻櫎 + </el-button> </template> </el-table-column> </el-table> <el-pagination - style="float: right" - @size-change="handleSizeChange" - @current-change="currentChange" - :current-page="currentPage" - :page-size="count" - :page-sizes="[15, 25, 35, 50]" - layout="total, sizes, prev, pager, next" - :total="total"> + style="float: right" + @size-change="handleSizeChange" + @current-change="currentChange" + :current-page="currentPage" + :page-size="count" + :page-sizes="[15, 25, 35, 50]" + layout="total, sizes, prev, pager, next" + :total="total"> </el-pagination> </div> @@ -52,156 +90,173 @@ </template> <script> - import uiHeader from '../layout/UiHeader.vue' - import MediaServer from './service/MediaServer' - export default { - name: 'app', - components: { - uiHeader - }, - data() { - return { - mediaServerList: [], // 婊呬綋鑺傜偣鍒楄〃 - mediaServerId: null, // 濯掍綋鏈嶅姟 - mediaServerPath: null, // 濯掍綋鏈嶅姟鍦板潃 - recordList: [], // 璁惧鍒楄〃 - chooseRecord: null, // 濯掍綋鏈嶅姟 +import uiHeader from '../layout/UiHeader.vue' +import MediaServer from './service/MediaServer' +import moment from 'moment' - updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 - winHeight: window.innerHeight - 250, - currentPage:1, - count:15, - total:0, - loading: false, - mediaServerObj : new MediaServer(), - recordDetail: false +export default { + name: 'app', + components: { + uiHeader + }, + data() { + return { + search: '', + startTime: '', + endTime: '', + mediaServerList: [], // 婊呬綋鑺傜偣鍒楄〃 + mediaServerId: null, // 濯掍綋鏈嶅姟 + mediaServerPath: null, // 濯掍綋鏈嶅姟鍦板潃 + recordList: [], // 璁惧鍒楄〃 + chooseRecord: null, // 濯掍綋鏈嶅姟 - }; - }, - computed: { + updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 + winHeight: window.innerHeight - 250, + currentPage: 1, + count: 15, + total: 0, + loading: false, + mediaServerObj: new MediaServer(), + recordDetail: false - }, - mounted() { - this.initData(); - }, - destroyed() { - // this.$destroy('videojs'); - }, - methods: { - initData: function() { - // 鑾峰彇濯掍綋鑺傜偣鍒楄〃 - this.getMediaServerList(); - // this.getRecordList(); - }, - currentChange: function(val){ - this.currentPage = val; - this.getRecordList(); - }, - handleSizeChange: function(val){ - this.count = val; - this.getRecordList(); - }, - getMediaServerList: function (){ - let that = this; - that.mediaServerObj.getOnlineMediaServerList((data)=>{ - that.mediaServerList = data.data; - if (that.mediaServerList.length > 0) { - that.mediaServerId = that.mediaServerList[0].id - that.setMediaServerPath(that.mediaServerId); - that.getRecordList(); - } - }) - }, - setMediaServerPath: function (serverId) { - let that = this; - let i; - for (i = 0; i < that.mediaServerList.length; i++) { - if (serverId === that.mediaServerList[i].id) { - break; - } + }; + }, + computed: {}, + mounted() { + this.initData(); + }, + destroyed() { + // this.$destroy('videojs'); + }, + methods: { + initData: function () { + // 鑾峰彇濯掍綋鑺傜偣鍒楄〃 + this.getMediaServerList(); + // this.getRecordList(); + }, + currentChange: function (val) { + this.currentPage = val; + this.getRecordList(); + }, + handleSizeChange: function (val) { + this.count = val; + this.getRecordList(); + }, + getMediaServerList: function () { + let that = this; + that.mediaServerObj.getOnlineMediaServerList((data) => { + that.mediaServerList = data.data; + if (that.mediaServerList.length > 0) { + that.mediaServerId = that.mediaServerList[0].id + that.setMediaServerPath(that.mediaServerId); + that.getRecordList(); } - let port = that.mediaServerList[i].httpPort; - if (location.protocol === "https:" && that.mediaServerList[i].httpSSlPort) { - port = that.mediaServerList[i].httpSSlPort + }) + }, + setMediaServerPath: function (serverId) { + let that = this; + let i; + for (i = 0; i < that.mediaServerList.length; i++) { + if (serverId === that.mediaServerList[i].id) { + break; } - that.mediaServerPath = location.protocol + "//" + that.mediaServerList[i].streamIp + ":" + port - console.log(that.mediaServerPath) - }, - getRecordList: function (){ - let that = this; - this.$axios({ - method: 'get', - url:`/record_proxy/${that.mediaServerId}/api/record/list`, - params: { - page: that.currentPage, - count: that.count - } - }).then(function (res) { - console.log(res) - if (res.data.code === 0) { - that.total = res.data.data.total; - that.recordList = res.data.data.list; - } - that.loading = false; - }).catch(function (error) { - console.log(error); - that.loading = false; - }); - }, - backToList(){ - this.recordDetail= false; - }, - chooseMediaChange(val){ - console.log(val) - this.total = 0; - this.recordList = []; - this.setMediaServerPath(val); - this.getRecordList(); - }, - showRecordDetail(row){ - this.recordDetail = true; - this.chooseRecord = row; - // 鏌ヨ鏄惁瀛樺湪褰曞儚 - // this.$axios({ - // method: 'delete', - // url:`/record_proxy/api/record/delete`, - // params: { - // page: this.currentPage, - // count: this.count - // } - // }).then((res) => { - // console.log(res) - // this.total = res.data.data.total; - // this.recordList = res.data.data.list; - // }).catch(function (error) { - // console.log(error); - // }); - this.$router.push(`/cloudRecordDetail/${row.app}/${row.stream}`) - }, - deleteRecord(){ - // TODO - let that = this; - this.$axios({ - method: 'delete', - url:`/record_proxy/api/record/delete`, - params: { - page: that.currentPage, - count: that.count - } - }).then(function (res) { - console.log(res) - if (res.data.code === 0) { - that.total = res.data.data.total; - that.recordList = res.data.data.list; - } - }).catch(function (error) { - console.log(error); - }); - }, + } + let port = that.mediaServerList[i].httpPort; + if (location.protocol === "https:" && that.mediaServerList[i].httpSSlPort) { + port = that.mediaServerList[i].httpSSlPort + } + that.mediaServerPath = location.protocol + "//" + that.mediaServerList[i].streamIp + ":" + port + console.log(that.mediaServerPath) + }, + getRecordList: function () { + this.$axios({ + method: 'get', + url: `/api/cloud/record/list`, + params: { + app: '', + stream: '', + query: this.search, + startTime: this.startTime, + endTime: this.endTime, + mediaServerId: this.mediaServerId, + page: this.currentPage, + count: this.count + } + }).then((res) => { + console.log(res) + if (res.data.code === 0) { + this.total = res.data.data.total; + this.recordList = res.data.data.list; + } + this.loading = false; + }).catch((error) => { + console.log(error); + this.loading = false; + }); + }, + backToList() { + this.recordDetail = false; + }, + chooseMediaChange(val) { + console.log(val) + this.total = 0; + this.recordList = []; + this.setMediaServerPath(val); + this.getRecordList(); + }, + showRecordDetail(row) { + this.recordDetail = true; + this.chooseRecord = row; + // 鏌ヨ鏄惁瀛樺湪褰曞儚 + // this.$axios({ + // method: 'delete', + // url:`/record_proxy/api/record/delete`, + // params: { + // page: this.currentPage, + // count: this.count + // } + // }).then((res) => { + // console.log(res) + // this.total = res.data.data.total; + // this.recordList = res.data.data.list; + // }).catch(function (error) { + // console.log(error); + // }); + this.$router.push(`/cloudRecordDetail/${row.app}/${row.stream}`) + }, + deleteRecord() { + // TODO + let that = this; + this.$axios({ + method: 'delete', + url: `/record_proxy/api/record/delete`, + params: { + page: that.currentPage, + count: that.count + } + }).then(function (res) { + console.log(res) + if (res.data.code === 0) { + that.total = res.data.data.total; + that.recordList = res.data.data.list; + } + }).catch(function (error) { + console.log(error); + }); + }, + formatTime(time) { + const h = parseInt(time / 3600) + const minute = parseInt(time / 60 % 60) + const second = Math.ceil(time % 60) + return (h > 0 ? h + `灏忔椂` : '') + (minute > 0 ? minute + '鍒�' : '') + second + '绉�' + }, + formatTimeStamp(time) { + return moment.unix(time).format('yyyy-MM-DD HH:mm:ss') + } - } - }; + } +}; </script> <style> -- Gitblit v1.8.0