From 9f16b5c553b479ea12fe368a7ecc748872ea8b98 Mon Sep 17 00:00:00 2001 From: zxl <763096477@qq.com> Date: 星期四, 12 六月 2025 11:11:27 +0800 Subject: [PATCH] 修改配置文件 --- web_src/src/components/CloudRecord.vue | 453 ++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 273 insertions(+), 180 deletions(-) diff --git a/web_src/src/components/CloudRecord.vue b/web_src/src/components/CloudRecord.vue index c13cdc4..b6f0286 100755 --- a/web_src/src/components/CloudRecord.vue +++ b/web_src/src/components/CloudRecord.vue @@ -1,207 +1,300 @@ <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> - <div v-if="!recordDetail">浜戠褰曞儚</div> + <div >浜戠褰曞儚</div> </div> <div class="page-header-btn"> + 鎼滅储: + <el-input @input="getMediaServerList" 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" + value-format="yyyy-MM-dd HH:mm:ss" + @change="getMediaServerList" + placeholder="閫夋嫨鏃ユ湡鏃堕棿"> + </el-date-picker> + 缁撴潫鏃堕棿: + <el-date-picker + v-model="endTime" + type="datetime" + value-format="yyyy-MM-dd HH:mm:ss" + @change="getMediaServerList" + 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="getMediaServerList" style="width: 16rem; margin-right: 1rem;" + v-model="mediaServerId" placeholder="璇烽�夋嫨" > + <el-option label="鍏ㄩ儴" value=""></el-option> <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 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> - <el-table-column prop="stream" label="娴両D" > - </el-table-column> - <el-table-column prop="time" label="鏃堕棿" > - </el-table-column> - <el-table-column label="鎿嶄綔" width="360" fixed="right"> - <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>--> - </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"> - </el-pagination> - </div> - + <!--璁惧鍒楄〃--> + <el-table :data="recordList" style="width: 100%" :height="winHeight"> + <el-table-column + type="selection" + width="55"> + </el-table-column> + <el-table-column prop="app" label="搴旂敤鍚�"> + </el-table-column> + <el-table-column prop="stream" label="娴両D" width="380"> + </el-table-column> + <el-table-column label="寮�濮嬫椂闂�"> + <template slot-scope="scope"> + {{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="play(scope.row)">鎾斁 + </el-button> + <el-button size="medium" icon="el-icon-download" type="text" @click="downloadFile(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"> + </el-pagination> + <el-dialog + :title="playerTitle" + :visible.sync="showPlayer" + width="50%"> + <easyPlayer ref="recordVideoPlayer" :videoUrl="videoUrl" :height="false" ></easyPlayer> + </el-dialog> </div> </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 easyPlayer from './common/easyPlayer.vue' +import moment from 'moment' +import axios from "axios"; - 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,easyPlayer + }, + data() { + return { + search: '', + startTime: '', + endTime: '', + showPlayer: false, + playerTitle: '', + videoUrl: '', + playerStyle: { + "margin": "auto", + "margin-bottom": "20px", + "width": window.innerWidth/2 + "px", + "height": this.winHeight/2 + "px", + }, + mediaServerList: [], // 婊呬綋鑺傜偣鍒楄〃 + mediaServerId: "", // 濯掍綋鏈嶅姟 + mediaServerPath: null, // 濯掍綋鏈嶅姟鍦板潃 + recordList: [], // 璁惧鍒楄〃 + chooseRecord: null, // 濯掍綋鏈嶅姟 - }; - }, - computed: { + updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 + winHeight: window.innerHeight - 250, + currentPage: 1, + count: 15, + total: 0, + loading: false, + mediaServerObj: new MediaServer(), - }, - 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('recordVideoPlayer'); + }, + 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; + }) + }, + setMediaServerPath: function (serverId) { + let that = this; + let i; + for (i = 0; i < that.mediaServerList.length; i++) { + if (serverId === that.mediaServerList[i].id) { + break; } - let port = that.mediaServerList[i].httpPort; - if (location.protocol === "https:" && that.mediaServerList[i].httpSSlPort) { - port = that.mediaServerList[i].httpSSlPort + } + 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 } - 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((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; + }); + }, + play(row) { + console.log(row) + this.chooseRecord = row; + this.showPlayer = true; + this.$axios({ + method: 'get', + url: `/api/cloud/record/play/path`, + params: { + recordId: row.id, + } + }).then((res) => { + console.log(res) + if (res.data.code === 0) { + if (location.protocol === "https:") { + this.videoUrl = res.data.data.httpsPath; + }else { + this.videoUrl = res.data.data.httpPath; } - }).then(function (res) { - console.log(res) - if (res.data.code === 0) { - that.total = res.data.data.total; - that.recordList = res.data.data.list; + console.log(222 ) + console.log(this.videoUrl ) + } + }).catch((error) => { + console.log(error); + }); + }, + downloadFile(file){ + console.log(file) + this.$axios({ + method: 'get', + url: `/api/cloud/record/play/path`, + params: { + recordId: file.id, + } + }).then((res) => { + console.log(res) + const link = document.createElement('a'); + link.target = "_blank"; + if (res.data.code === 0) { + if (location.protocol === "https:") { + link.href = res.data.data.httpsPath + "&save_name=" + file.fileName; + }else { + link.href = res.data.data.httpPath + "&save_name=" + file.fileName; } - 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); - }); - }, + link.click(); + } + }).catch((error) => { + console.log(error); + }); + }, + 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 / 1000) + const minute = parseInt((time - h * 3600 * 1000) / 60 / 1000) + let second = Math.ceil((time - h * 3600 * 1000 - minute * 60 * 1000) / 1000) + if (second < 0) { + second = 0; + } + return (h > 0 ? h + `灏忔椂` : '') + (minute > 0 ? minute + '鍒�' : '') + (second > 0 ? second + '绉�' : '') + }, + formatTimeStamp(time) { + return moment.unix(time/1000).format('yyyy-MM-DD HH:mm:ss') + } - - } - }; + } +}; </script> <style> -- Gitblit v1.8.0