最终版本了吧0403

This commit is contained in:
Rhett霍 2026-04-03 15:39:10 +08:00
parent 2d47fbc2f1
commit af0d9a5161
60 changed files with 997 additions and 344 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -1 +0,0 @@
.app-container[data-v-7c5e1a78]{padding:10px 20px}.shad[data-v-7c5e1a78]{width:100%;background:#fff;border-radius:6px;margin-top:10px;padding:15px;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog .el-dialog__body[data-v-7c5e1a78]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.video-player[data-v-7c5e1a78]{width:100%}.title[data-v-7c5e1a78]{font-weight:700;color:#409eff}[data-v-7c5e1a78] .el-form-item{margin-bottom:10px}[data-v-7c5e1a78] .el-divider--horizontal{margin:10px 0}[data-v-7c5e1a78] .el-dialog__body{padding:10px 20px;height:calc(100vh - 200px);overflow-y:auto}

View File

@ -0,0 +1 @@
.app-container[data-v-a99aff3e]{padding:10px 20px}.sahd[data-v-a99aff3e]{width:100%;background:#fff;border-radius:6px;margin-top:10px;padding:15px;box-sahdow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);-webkit-box-sizing:border-box;box-sizing:border-box}.tittle[data-v-a99aff3e]{font-weight:700;color:#409eff}.el-divider[data-v-a99aff3e]{margin:10px 0}.el-select[data-v-a99aff3e]{width:100%}.delsarbtnbox[data-v-a99aff3e]{text-align:right}.dialog-footer button[data-v-a99aff3e]{margin:0 20px}.mb8[data-v-a99aff3e]{margin:20px 0}.el-col-12[data-v-a99aff3e]{width:50%}

Binary file not shown.

View File

@ -0,0 +1 @@
.detail[data-v-78824de6]{padding:10px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;display:-webkit-flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.tablebox .shad[data-v-78824de6]{width:100%}.shad[data-v-78824de6]{width:65%}.shad2[data-v-78824de6],.shad[data-v-78824de6]{background:#fff;border-radius:6px;margin-top:10px;padding:15px;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);-webkit-box-sizing:border-box;box-sizing:border-box}.shad2[data-v-78824de6]{width:33%}.shad2[data-v-78824de6] .el-table--medium .el-table__cell,.shad2[data-v-78824de6] .el-table .el-table__cell{padding:0}.left[data-v-78824de6]{display:-webkit-box;display:-ms-flexbox;display:flex;display:-webkit-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.left button[data-v-78824de6]{margin:20px 40px}.el-divider--horizontal[data-v-78824de6]{margin:5px 0}.el-date-editor.el-input[data-v-78824de6],.el-date-editor.el-input__inner[data-v-78824de6],.el-input[data-v-78824de6],.el-select[data-v-78824de6]{width:100%}.el-form-item[data-v-78824de6]{margin-bottom:12px}[data-v-78824de6] .el-input--medium .el-input__inner{height:32px;line-height:32px}label[data-v-78824de6]{font-weight:100}.title[data-v-78824de6]{font-weight:700;color:#409eff}.banli .el-date-editor.el-input[data-v-78824de6],.banli .el-date-editor.el-input__inner[data-v-78824de6]{width:37%;margin:0 5px}.mb8[data-v-78824de6]{margin:20px 0}

Binary file not shown.

View File

@ -0,0 +1 @@
.card[data-v-9db57c10]{position:relative;border:1px solid rgba(14,253,255,.5);width:100%;height:100%;padding:10px;border-radius:15px;cursor:pointer}.title[data-v-9db57c10]{font-size:20px;font-weight:bolder;color:#fff1cc;margin-bottom:10px}.body[data-v-9db57c10]{position:relative;z-index:20}[data-v-585d29e6]:root{font-size:16px}.bg[data-v-585d29e6]{margin:0 auto;width:100%;min-height:100vh;background:url(../../static/img/bg2.e254323d.jpg) no-repeat;background-size:cover;padding:0 3rem;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.bg[data-v-585d29e6],.title[data-v-585d29e6]{display:-webkit-box;display:-ms-flexbox;display:flex}.title[data-v-585d29e6]{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:27px;font-weight:bolder;color:#0efdff;height:75px;margin-bottom:20px}.inspector-container[data-v-585d29e6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;gap:16px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-bottom:40px}.inspector-statistics[data-v-585d29e6]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px}.shu[data-v-585d29e6]{position:relative;color:#0efdff;font-size:20px;font-weight:bolder;margin-bottom:10px;font-family:dig}

Binary file not shown.

View File

@ -1 +0,0 @@
.card[data-v-2fa17ad6]{position:relative;border:1px solid rgba(14,253,255,.5);width:100%;height:100%;padding:10px;border-radius:15px}.title[data-v-2fa17ad6]{font-size:20px;font-weight:bolder;color:#fff1cc;margin-bottom:10px}.body[data-v-2fa17ad6]{position:relative;z-index:20}[data-v-3a58fa50]:root{font-size:16px}.bg[data-v-3a58fa50]{margin:0 auto;width:100%;min-height:100vh;background:url(../../static/img/bg2.e254323d.jpg) no-repeat;background-size:cover;padding:0 3rem;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.bg[data-v-3a58fa50],.title[data-v-3a58fa50]{display:-webkit-box;display:-ms-flexbox;display:flex}.title[data-v-3a58fa50]{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:27px;font-weight:bolder;color:#0efdff;height:75px;margin-bottom:20px}.inspector-container[data-v-3a58fa50]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;gap:16px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-bottom:40px}.inspector-statistics[data-v-3a58fa50]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px}.shu[data-v-3a58fa50]{position:relative;color:#0efdff;font-size:20px;font-weight:bolder;margin-bottom:10px;font-family:dig}

View File

@ -1 +0,0 @@
.detail[data-v-c4cc8580]{padding:10px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;display:-webkit-flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.tablebox .shad[data-v-c4cc8580]{width:100%}.shad[data-v-c4cc8580]{width:65%}.shad2[data-v-c4cc8580],.shad[data-v-c4cc8580]{background:#fff;border-radius:6px;margin-top:10px;padding:15px;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);-webkit-box-sizing:border-box;box-sizing:border-box}.shad2[data-v-c4cc8580]{width:33%}.shad2[data-v-c4cc8580] .el-table--medium .el-table__cell,.shad2[data-v-c4cc8580] .el-table .el-table__cell{padding:0}.left[data-v-c4cc8580]{display:-webkit-box;display:-ms-flexbox;display:flex;display:-webkit-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.left button[data-v-c4cc8580]{margin:20px 40px}.el-divider--horizontal[data-v-c4cc8580]{margin:5px 0}.el-date-editor.el-input[data-v-c4cc8580],.el-date-editor.el-input__inner[data-v-c4cc8580],.el-input[data-v-c4cc8580],.el-select[data-v-c4cc8580]{width:100%}.el-form-item[data-v-c4cc8580]{margin-bottom:12px}[data-v-c4cc8580] .el-input--medium .el-input__inner{height:32px;line-height:32px}label[data-v-c4cc8580]{font-weight:100}.title[data-v-c4cc8580]{font-weight:700;color:#409eff}.banli .el-date-editor.el-input[data-v-c4cc8580],.banli .el-date-editor.el-input__inner[data-v-c4cc8580]{width:37%;margin:0 5px}.mb8[data-v-c4cc8580]{margin:20px 0}

View File

@ -0,0 +1 @@
.card[data-v-9db57c10]{position:relative;border:1px solid rgba(14,253,255,.5);width:100%;height:100%;padding:10px;border-radius:15px;cursor:pointer}.title[data-v-9db57c10]{font-size:20px;font-weight:bolder;color:#fff1cc;margin-bottom:10px}.body[data-v-9db57c10]{position:relative;z-index:20}

Binary file not shown.

View File

@ -1 +0,0 @@
.card[data-v-2fa17ad6]{position:relative;border:1px solid rgba(14,253,255,.5);width:100%;height:100%;padding:10px;border-radius:15px}.title[data-v-2fa17ad6]{font-size:20px;font-weight:bolder;color:#fff1cc;margin-bottom:10px}.body[data-v-2fa17ad6]{position:relative;z-index:20}

View File

@ -0,0 +1 @@
.app-container[data-v-612ab43b]{padding:10px 20px}.shad[data-v-612ab43b]{width:100%;background:#fff;border-radius:6px;margin-top:10px;padding:15px;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog .el-dialog__body[data-v-612ab43b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.video-player[data-v-612ab43b]{width:100%}.title[data-v-612ab43b]{font-weight:700;color:#409eff}[data-v-612ab43b] .el-form-item{margin-bottom:10px}[data-v-612ab43b] .el-divider--horizontal{margin:10px 0}[data-v-612ab43b] .el-dialog__body{padding:10px 20px;height:calc(100vh - 200px);overflow-y:auto}

Binary file not shown.

View File

@ -0,0 +1 @@
.app-container[data-v-7fa67c6b]{padding:10px 20px}.shad[data-v-7fa67c6b]{width:100%;background:#fff;border-radius:6px;margin-top:10px;padding:15px;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog .el-dialog__body[data-v-7fa67c6b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.video-player[data-v-7fa67c6b]{width:100%}.title[data-v-7fa67c6b]{font-weight:700;color:#409eff}[data-v-7fa67c6b] .el-form-item{margin-bottom:10px}[data-v-7fa67c6b] .el-divider--horizontal{margin:10px 0}[data-v-7fa67c6b] .el-dialog__body{padding:10px 20px;height:calc(100vh - 200px);overflow-y:auto}

Binary file not shown.

View File

@ -1 +0,0 @@
.app-container[data-v-5ee19f72]{padding:10px 20px}.sahd[data-v-5ee19f72]{width:100%;background:#fff;border-radius:6px;margin-top:10px;padding:15px;box-sahdow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);-webkit-box-sizing:border-box;box-sizing:border-box}.tittle[data-v-5ee19f72]{font-weight:700;color:#409eff}.el-divider[data-v-5ee19f72]{margin:10px 0}.el-select[data-v-5ee19f72]{width:100%}.delsarbtnbox[data-v-5ee19f72]{text-align:right}.dialog-footer button[data-v-5ee19f72]{margin:0 20px}.mb8[data-v-5ee19f72]{margin:20px 0}.el-col-12[data-v-5ee19f72]{width:50%}

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-968578a0"],{"0958":function(t,i,n){"use strict";n.r(i);var s=function(){var t=this,i=t.$createElement,n=t._self._c||i;return n("div",t._b({staticClass:"card"},"div",t.$attrs,!1),[n("div",{staticClass:"title"},[t._v(" "+t._s(t.title)+" ")]),n("div",{staticClass:"body"},[t._t("default")],2)])},e=[],a={name:"Card",inheritAttrs:!1,props:{title:{type:String,default:"标题"},click:{type:Function}},methods:{handleChangeStatistics:function(){console.log(123)}}},c=a,l=(n("6221"),n("2877")),o=Object(l["a"])(c,s,e,!1,null,"9db57c10",null);i["default"]=o.exports},"377a":function(t,i,n){},6221:function(t,i,n){"use strict";n("377a")}}]);

Binary file not shown.

View File

@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-ba1ba59a"],{"0958":function(t,a,e){"use strict";e.r(a);var s=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"card"},[e("div",{staticClass:"title"},[t._v(" "+t._s(t.title)+" ")]),e("div",{staticClass:"body"},[t._t("default")],2)])},i=[],n={name:"Card",props:{title:{type:String,default:"标题"}}},c=n,l=(e("d0e5"),e("2877")),d=Object(l["a"])(c,s,i,!1,null,"2fa17ad6",null);a["default"]=d.exports},"257f":function(t,a,e){},d0e5:function(t,a,e){"use strict";e("257f")}}]);

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-c8be70c0"],{1547:function(e,a,t){},"7ca7":function(e,a,t){"use strict";t.d(a,"b",(function(){return n})),t.d(a,"c",(function(){return o})),t.d(a,"a",(function(){return s})),t.d(a,"d",(function(){return i}));var r=t("b775");function n(e){return Object(r["a"])({url:"/casedownload/list",method:"post",params:e})}function o(e){return Object(r["a"])({url:"/casedownload/detail/"+e,method:"get"})}function s(e,a){return Object(r["a"])({url:"/casedownload/download",method:"post",responseType:"blob",data:e,timeout:6e5,onDownloadProgress:a})}function i(e){return Object(r["a"])({url:"/videoApi/recordvideo",method:"get",params:e})}},"93ab":function(e,a,t){"use strict";t("1547")},fd79:function(e,a,t){"use strict";t.r(a);var r=function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",{staticClass:"app-container"},[t("div",{staticClass:"shad"},[t("el-form",{directives:[{name:"show",rawName:"v-show",value:e.showSearch,expression:"showSearch"}],ref:"queryForm",attrs:{model:e.queryParams,size:"small",inline:!0,"label-width":"100px"}},[t("el-form-item",{attrs:{label:"案件名称",prop:"caseName"}},[t("el-input",{attrs:{placeholder:"请输入案件名称",clearable:""},nativeOn:{keyup:function(a){return!a.type.indexOf("key")&&e._k(a.keyCode,"enter",13,a.key,"Enter")?null:e.handleQuery(a)}},model:{value:e.queryParams.caseName,callback:function(a){e.$set(e.queryParams,"caseName",a)},expression:"queryParams.caseName"}})],1),t("el-form-item",{attrs:{label:"部门受案号",prop:"caseCode"}},[t("el-input",{attrs:{placeholder:"请输入部门受案号",clearable:""},nativeOn:{keyup:function(a){return!a.type.indexOf("key")&&e._k(a.keyCode,"enter",13,a.key,"Enter")?null:e.handleQuery(a)}},model:{value:e.queryParams.caseCode,callback:function(a){e.$set(e.queryParams,"caseCode",a)},expression:"queryParams.caseCode"}})],1),t("el-form-item",[t("el-button",{attrs:{type:"primary",icon:"el-icon-search",size:"mini"},on:{click:e.handleQuery}},[e._v("搜索")]),t("el-button",{attrs:{icon:"el-icon-refresh",size:"mini"},on:{click:e.resetQuery}},[e._v("重置")])],1)],1)],1),t("div",{staticClass:"shad"},[[t("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],staticStyle:{width:"100%"},attrs:{data:e.tableData,border:""}},[t("el-table-column",{attrs:{type:"index",align:"center",width:"50"}}),t("el-table-column",{attrs:{prop:"caseName","show-overflow-tooltip":"",width:"200",label:"案件名称"}}),t("el-table-column",{attrs:{prop:"caseCode","show-overflow-tooltip":"",width:"200",label:"部门受案号"}}),t("el-table-column",{attrs:{prop:"errinfo",align:"center",label:"报错信息","show-overflow-tooltip":""}})],1)]],2),t("pagination",{directives:[{name:"show",rawName:"v-show",value:e.total>0,expression:"total>0"}],attrs:{total:e.total,page:e.queryParams.pageNum,limit:e.queryParams.pageSize},on:{"update:page":function(a){return e.$set(e.queryParams,"pageNum",a)},"update:limit":function(a){return e.$set(e.queryParams,"pageSize",a)},pagination:e.getList}})],1)},n=[],o=t("7ca7"),s={name:"",data:function(){return{playshow:!1,showSearch:!0,loading:!0,total:0,dateRange:null,queryParams:{pageNum:1,pageSize:10,caseName:null,caseId:null},tableData:[]}},created:function(){this.getList()},mouted:function(){},methods:{handleQuery:function(){this.queryParams.pageNum=1,this.queryParams.pageSize=10,this.getList()},resetQuery:function(){this.queryParams={},this.queryParams.pageNum=1,this.queryParams.pageSize=10,this.dateRange=null,this.getList()},getList:function(){var e=this;this.loading=!0,Object(o["b"])(this.queryParams).then((function(a){e.tableData=a.rows,e.total=a.total,e.loading=!1}))}}},i=s,l=(t("93ab"),t("2877")),u=Object(l["a"])(i,r,n,!1,null,"30b7f8e8",null);a["default"]=u.exports}}]);

Binary file not shown.

View File

@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-c8be70c0"],{1547:function(e,a,t){},"7ca7":function(e,a,t){"use strict";t.d(a,"b",(function(){return n})),t.d(a,"c",(function(){return o})),t.d(a,"a",(function(){return s})),t.d(a,"d",(function(){return i}));var r=t("b775");function n(e){return Object(r["a"])({url:"/casedownload/list",method:"post",params:e})}function o(e){return Object(r["a"])({url:"/casedownload/detail/"+e,method:"get"})}function s(e){return Object(r["a"])({url:"/casedownload/download",method:"post",responseType:"blob",data:e,timeout:6e4})}function i(e){return Object(r["a"])({url:"/videoApi/recordvideo",method:"get",params:e})}},"93ab":function(e,a,t){"use strict";t("1547")},fd79:function(e,a,t){"use strict";t.r(a);var r=function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",{staticClass:"app-container"},[t("div",{staticClass:"shad"},[t("el-form",{directives:[{name:"show",rawName:"v-show",value:e.showSearch,expression:"showSearch"}],ref:"queryForm",attrs:{model:e.queryParams,size:"small",inline:!0,"label-width":"100px"}},[t("el-form-item",{attrs:{label:"案件名称",prop:"caseName"}},[t("el-input",{attrs:{placeholder:"请输入案件名称",clearable:""},nativeOn:{keyup:function(a){return!a.type.indexOf("key")&&e._k(a.keyCode,"enter",13,a.key,"Enter")?null:e.handleQuery(a)}},model:{value:e.queryParams.caseName,callback:function(a){e.$set(e.queryParams,"caseName",a)},expression:"queryParams.caseName"}})],1),t("el-form-item",{attrs:{label:"部门受案号",prop:"caseCode"}},[t("el-input",{attrs:{placeholder:"请输入部门受案号",clearable:""},nativeOn:{keyup:function(a){return!a.type.indexOf("key")&&e._k(a.keyCode,"enter",13,a.key,"Enter")?null:e.handleQuery(a)}},model:{value:e.queryParams.caseCode,callback:function(a){e.$set(e.queryParams,"caseCode",a)},expression:"queryParams.caseCode"}})],1),t("el-form-item",[t("el-button",{attrs:{type:"primary",icon:"el-icon-search",size:"mini"},on:{click:e.handleQuery}},[e._v("搜索")]),t("el-button",{attrs:{icon:"el-icon-refresh",size:"mini"},on:{click:e.resetQuery}},[e._v("重置")])],1)],1)],1),t("div",{staticClass:"shad"},[[t("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],staticStyle:{width:"100%"},attrs:{data:e.tableData,border:""}},[t("el-table-column",{attrs:{type:"index",align:"center",width:"50"}}),t("el-table-column",{attrs:{prop:"caseName","show-overflow-tooltip":"",width:"200",label:"案件名称"}}),t("el-table-column",{attrs:{prop:"caseCode","show-overflow-tooltip":"",width:"200",label:"部门受案号"}}),t("el-table-column",{attrs:{prop:"errinfo",align:"center",label:"报错信息","show-overflow-tooltip":""}})],1)]],2),t("pagination",{directives:[{name:"show",rawName:"v-show",value:e.total>0,expression:"total>0"}],attrs:{total:e.total,page:e.queryParams.pageNum,limit:e.queryParams.pageSize},on:{"update:page":function(a){return e.$set(e.queryParams,"pageNum",a)},"update:limit":function(a){return e.$set(e.queryParams,"pageSize",a)},pagination:e.getList}})],1)},n=[],o=t("7ca7"),s={name:"",data:function(){return{playshow:!1,showSearch:!0,loading:!0,total:0,dateRange:null,queryParams:{pageNum:1,pageSize:10,caseName:null,caseId:null},tableData:[]}},created:function(){this.getList()},mouted:function(){},methods:{handleQuery:function(){this.queryParams.pageNum=1,this.queryParams.pageSize=10,this.getList()},resetQuery:function(){this.queryParams={},this.queryParams.pageNum=1,this.queryParams.pageSize=10,this.dateRange=null,this.getList()},getList:function(){var e=this;this.loading=!0,Object(o["b"])(this.queryParams).then((function(a){e.tableData=a.rows,e.total=a.total,e.loading=!1}))}}},i=s,l=(t("93ab"),t("2877")),u=Object(l["a"])(i,r,n,!1,null,"30b7f8e8",null);a["default"]=u.exports}}]);

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -26,14 +26,15 @@ export function getcaselistdetail(caseId) {
}) })
} }
// 下载视频 // 下载视频 - 支持进度监听
export function download(query) { export function downloadviedo(query, onProgress) {
return request({ return request({
url: '/casedownload/download', url: '/casedownload/download',
method: 'post', method: 'post',
responseType:'blob', responseType: 'blob',
data: query, data: query,
timeout: 60000 timeout: 600000,
onDownloadProgress: onProgress
}) })
} }
// 指定时间段云端录像播放及下载/dev-api/videoApi/recordvideo // 指定时间段云端录像播放及下载/dev-api/videoApi/recordvideo

View File

@ -1,3 +1,4 @@
// /utils/request.js
import axios from 'axios' import axios from 'axios'
import { Notification, MessageBox, Message, Loading } from 'element-ui' import { Notification, MessageBox, Message, Loading } from 'element-ui'
import store from '@/store' import store from '@/store'
@ -14,71 +15,46 @@ export let isRelogin = { show: false };
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例 // 创建axios实例
const service = axios.create({ const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API, baseURL: process.env.VUE_APP_BASE_API,
// 超时 timeout: 600000 // 增加到10分钟适应大文件
timeout: 30000
}) })
// request拦截器 // request拦截器
service.interceptors.request.use(config => { service.interceptors.request.use(config => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
if (getToken() && !isToken) { if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 config.headers['Authorization'] = 'Bearer ' + getToken()
} }
// get请求映射params参数
if (config.method === 'get' && config.params) { if (config.method === 'get' && config.params) {
let url = config.url + '?' + tansParams(config.params); let url = config.url + '?' + tansParams(config.params);
url = url.slice(0, -1); url = url.slice(0, -1);
config.params = {}; config.params = {};
config.url = url; config.url = url;
} }
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = {
url: config.url,
data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
time: new Date().getTime()
}
// const sessionObj = cache.session.getJSON('sessionObj')
// if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
// cache.session.setJSON('sessionObj', requestObj)
// } else {
// const s_url = sessionObj.url; // 请求地址
// const s_data = sessionObj.data; // 请求数据
// const s_time = sessionObj.time; // 请求时间
// const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
// if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
// const message = '数据正在处理,请勿重复提交';
// console.warn(`[${s_url}]: ` + message)
// return Promise.reject(new Error(message))
// } else {
// cache.session.setJSON('sessionObj', requestObj)
// }
// }
}
return config return config
}, error => { }, error => {
console.log(error) console.log(error)
Promise.reject(error) return Promise.reject(error)
}) })
// 响应拦截器 // 响应拦截器
service.interceptors.response.use(res => { service.interceptors.response.use(res => {
// 未设置状态码则默认成功状态 // 如果是blob类型直接返回data不进行任何处理
const code = res.data.code || 200; if (res.config.responseType === 'blob' || res.config.responseType === 'arraybuffer') {
// 获取错误信息 return res // 返回完整的response对象让调用方自己处理
const msg = errorCode[code] || res.data.msg || errorCode['default']
// 二进制数据则直接返回
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data
} }
const code = res.data.code || 200;
const msg = errorCode[code] || res.data.msg || errorCode['default']
if (code === 401) { if (code === 401) {
if (!isRelogin.show) { if (!isRelogin.show) {
isRelogin.show = true; isRelogin.show = true;
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
isRelogin.show = false; isRelogin.show = false;
store.dispatch('LogOut').then(() => { store.dispatch('LogOut').then(() => {
location.href = '/index'; location.href = '/index';
@ -124,7 +100,8 @@ export function download(url, params, filename, config) {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob', responseType: 'blob',
...config ...config
}).then(async (data) => { }).then(async (response) => {
const data = response.data
const isBlob = blobValidate(data); const isBlob = blobValidate(data);
if (isBlob) { if (isBlob) {
const blob = new Blob([data]) const blob = new Blob([data])

View File

@ -43,7 +43,6 @@
<el-upload <el-upload
class="upload-demo" class="upload-demo"
ref="upload" ref="upload"
multiple multiple
drag drag
:action="url2" :action="url2"
@ -57,7 +56,7 @@
:file-list="fileList"> :file-list="fileList">
<i class="el-icon-upload"></i> <i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div> <div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">请上传[mp4, avi, rmvb]格式</div> <div class="el-upload__tip" slot="tip">请上传[mp4, avi, rmvb]格式文件大小不超过4000MB</div>
</el-upload> </el-upload>
<!-- <span slot="footer" class="dialog-footer"> <!-- <span slot="footer" class="dialog-footer">
<el-button @click="dialogVisiblevideo = false"> </el-button> <el-button @click="dialogVisiblevideo = false"> </el-button>
@ -624,6 +623,11 @@ export default {
}, },
// //
async foreUpload(file) { async foreUpload(file) {
const maxSize = 4000 * 1024 * 1024; // 4000MB
if (file.size > maxSize) {
this.$message.error('文件大小不能超过4000MB');
return false;
}
this.md5keyV = ''; this.md5keyV = '';
this.isMd5Encrypting = true; this.isMd5Encrypting = true;
try { try {

View File

@ -0,0 +1,583 @@
<template>
<div class="app-container">
<el-dialog :title="dialogtitle"
:visible.sync="dialogTableVisible"
:close-on-click-modal="false"
width="80%"
>
<span v-if="novideo" style="display:flex;display: -webkit-flex;flex-direction: column;justify-content: center;align-items: center;">
<img src="@/assets/images/zhengli.gif" style="width:100px;" alt="">
<br>
<span>视频资料正在打包整理中...</span>
<br>
</span>
<template v-else>
<el-row :gutter="20">
<el-col :span="24">
<el-row>
<el-col :span="24">
<span class="title">案件信息</span>
<el-divider></el-divider>
<template>
<el-form :model="form" ref="form" label-width="120px" class="demo-form">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="案件名称" :show-message="false">
<el-input readonly v-model="form.caseName" ></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="统一受案号" :show-message="false">
<el-input
readonly
v-model="form.ajjbxxList[0].sah"
v-if="form.ajjbxxList && form.ajjbxxList.length > 0"
placeholder="暂无受案号"
></el-input>
<el-input
readonly
v-else
value=""
placeholder="暂无受案号"
></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="案由">
<el-input readonly v-model="form.caseReason"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="承办检察官">
<el-input readonly v-model="form.cbJCG"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="检察官助理/文员">
<el-input readonly v-model="form.cbjZL"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="使用房间">
<el-input readonly v-model="form.useRoom" ></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="办案日期">
<el-input readonly v-model="form.caseDate" ></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="同录类型">
<el-input readonly v-model="form.clerk" ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="备注">
<el-input readonly v-model="form.remark" ></el-input>
</el-form-item>
</el-col>
</el-row>
<span class="title">嫌疑人信息</span>
<el-divider></el-divider>
<template>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="姓名" prop="sar" :show-message="false">
<el-input readonly v-model="form.sar" ></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="身份证号">
<el-input readonly v-model="form.identityCard" ></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
<span class="title">办理事项</span>
<el-divider></el-divider>
<template>
<el-row :gutter="20" class="banli">
<el-col :span="6">
<el-form-item label="办理事项">
<el-input readonly v-model="form.matter" ></el-input>
</el-form-item>
</el-col>
<el-col :span="16">
<el-form-item label="录像时间" prop="starts" :show-message="false">
<el-date-picker readonly
v-model="form.starts"
prop="starts"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
placeholder="选择开始日期"
>
</el-date-picker>
<el-date-picker readonly
v-model="form.ends"
type="datetime"
prop="ends"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择结束日期"
>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="20">
<el-form-item label="协商结果">
<el-input readonly type="textarea"
rows="3"
v-model="form.negotiationResult"></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
</el-form>
</template>
</el-col>
</el-row>
</el-col>
</el-row>
<el-table :data="detailData"
height="340"
ref="multipleTable"
@selection-change="handleSelectionChange"
tooltip-effect="dark">
<el-table-column type="index" width="55" align="center"></el-table-column>
<el-table-column property="fileName" show-overflow-tooltip label="文件名"></el-table-column>
<el-table-column property="filePath" show-overflow-tooltip label="地址" width="400"></el-table-column>
<el-table-column align="center" fixed="right" label="下载" width="140">
<template slot-scope="scope">
<el-button
:icon="downloadingFiles[scope.row.fileName] ? 'el-icon-loading' : downicon"
@click="download(scope.row)"
:disabled="downloadingFiles[scope.row.fileName]"
type="text"
size="small"
>
{{ downloadingFiles[scope.row.fileName] ? '下载中...' : '下载' }}
</el-button>
<!-- <el-button :icon="downicon" v-if="isVideoFile(scope.row.fileName)" @click="backplay(scope.row)" type="text" size="small">回放</el-button> -->
</template>
</el-table-column>
</el-table>
</template>
</el-dialog>
<el-dialog :visible.sync="playshow" :before-close="handleClose">
<easy-player
:video-url='easysrc'
style="width: 100%;height: 400px;"
:showEnterprise="false"
></easy-player>
</el-dialog>
<div class="shad">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="案件名称" prop="caseName">
<el-input v-model="queryParams.caseName" placeholder="请输入案件名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="统一受案号" prop="caseCode">
<el-input v-model="queryParams.caseCode" placeholder="请输入统一受案号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="涉案人" prop="sar">
<el-input v-model="queryParams.sar"
placeholder="请输入涉案人"
clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="同录类型" prop="clerk">
<el-select v-model="queryParams.clerk" placeholder="请选择同录类型"
@change="handleQuery"
clearable
>
<el-option
v-for="dict in dict.type.tonglu_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="承办检察官" prop="cbJCG">
<el-input v-model="queryParams.cbJCG" placeholder="请输入承办检察官" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="shad">
<template>
<el-table v-loading="loading" :data="tableData"
border style="width: 100%"
:default-sort="defaultSort"
stripe
show-overflow-tooltip
>
<el-table-column type="index" align="center" width="50"></el-table-column>
<el-table-column prop="caseName" show-overflow-tooltip label="案件名称"></el-table-column>
<el-table-column prop="ajjbxxList[0].sah" show-overflow-tooltip label="统一受案号"></el-table-column>
<el-table-column prop="cbJCG" align="center" label="承办检察官" width="100"></el-table-column>
<el-table-column prop="sar" align="center" label="涉案人"></el-table-column>
<el-table-column prop="useRoom" align="center" label="使用房间" width="100"></el-table-column>
<el-table-column prop="clerk" align="center" label="同录类型" width="100"></el-table-column>
<el-table-column label="开始时间" align="center" width="140" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.starts,'{y}-{m}-{d} {h}:{i}') || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="结束时间" align="center" prop="ends" width="140">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.ends,'{y}-{m}-{d} {h}:{i}') || '-' }}</span>
</template>
</el-table-column>
<el-table-column fixed="right" align="center" label="录像下载" width="100">
<template slot-scope="scope">
<el-button
icon="el-icon-s-order"
@click="handleClick(scope.row)" type="text" size="small">
详细信息
</el-button>
</template>
</el-table-column>
</el-table>
</template>
</div>
<pagination v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList" />
</div>
</template>
<script>
import EasyPlayer from '@easydarwin/easyplayer'
import { getcaselist,getcaselistdetail,downloadviedo,recordvideo, selectCaseDownloadList} from "@/api/caselist/caselist";
export default {
name:"casevideodown",
dicts: ['tonglu_type'],
components: {
EasyPlayer
},
data() {
return {
form:{
},
iszijian:"",
easysrc: '',
novideo:false ,
downicon:'el-icon-download',
playshow:false,
dialogtitle:"案件下载详情", //
dialogtitle2:"", //
showpross:false, //
progresssyatus:"success", //
//
showSearch: true,
//
loading: false,
downloading:false,
dialogTableVisible:false,
//
defaultSort: {prop: 'starts', order: 'descending'},
total: 0,
playquery:{
caseId:"",
file:"m3u8",
operate:"play"
},
//
queryParams: {
pageNum: 1,
pageSize: 10,
caseName: null, //
caseCode: null, //
},
multipleSelection:[],
//
// tableData: [],
tableData: [{
starts:"",
ends:"",
}],
//
detailData:[],
//
downloadingFiles: {},
playerOptions: {
//
playbackRates: [0.5,1.0,2,3], //
            autoplay: true, // true,
            muted: false, //
            loop: false, //
            preload: "auto", // <video>auto,
            language: "zh-CN",
            aspectRatio: "16:9", // 使 - "16:9""4:3"
            fluid: true, // trueVideo.js player
sources: [
              {
                type: "video/mp4", //
                src: '',
// src: require('http://100.100.10.216:18000/hls/stream_9_0/stream_9_0_20231220155532_20231220155922.m3u8'),
              },
            ],
            poster: "", //
            notSupportedMessage: "此视频暂无法播放,请稍后再试", // Video.js
            controlBar: {
              timeDivider: true, //
              durationDisplay: true, //
              remainingTimeDisplay: true, //
              fullscreenToggle: true, //
}
}
}
},
created() {
this.getList();
},
mounted(){
},
methods: {
// .mp4', '.avi', '.rmvb
isVideoFile(fileName) {
const videoExtensions = ['.mp4', '.avi', '.rmvb'];
const extension = fileName.substring(fileName.lastIndexOf('.')).toLowerCase();
return !this.iszijian && videoExtensions.includes(extension);
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.queryParams.pageSize = 10;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams ={}
this.queryParams.pageNum = 1;
this.queryParams.pageSize = 10;
this.getList();
},
/** 查询案件列表 */
getList() {
const lengthToCut = 19;
this.loading = true;
getcaselist(this.queryParams).then(res => {
this.tableData = res.rows.map(item => {
return {
...item,
starts: item.starts ? item.starts.substring(0, lengthToCut) : '',
ends: item.ends ? item.ends.substring(0, lengthToCut) : ''
};
});
this.total = res.total;
this.loading = false;
}).catch((err) => {
this.loading = false;
});
},
/** 查询案件详情 */
getCaseListdetail(bmsahV) {
const data = {
bmsah: bmsahV
}
getallcasedetail(data).then(res => {
this.selfCase = res.data.selfCase
this.sarlist = res.data.sarlist
});
},
/** 查询案件列表详情 */
getListdetail(caseId) {
this.detailData = []
this.downloading = true
getcaselistdetail(caseId).then(res => {
this.detailData = res.data;
this.downloading = false
})
.catch(error => {
this.$message.error('获取失败,请检查网络');
this.downloading = false
})
},
//
backplay() {
this.playshow = true
recordvideo(this.playquery).then(res => {
// url
// const prefix = 'http://100.100.10.216:18000';
// const url1 = '\"/hls/stream_10_0/stream_10_0_20240108153937_20240108155113.m3u8\"'
// const url = url1.replace(/"/g, ""); //
// const easysrc = prefix + url;
const prefix = res.data.prefix;
const url = res.data.url.replace(/"/g, ""); //
const easysrc = prefix + url;
// http://100.100.10.216:18000/hls/stream_9_0/stream_9_0_20231220155532_20231220155922.m3u8
this.easysrc = easysrc; // this.easysrc
});
},
// -- ,
handleClick(row) {
this.playquery.caseId = row.caseId
// this.caseId = row.caseId
this.dialogtitle = row.caseName
this.dialogTableVisible = true
if(row.roomName == null || row.roomName == ''){
this.iszijian = true
this.novideo = false
this.getListdetail(row.caseId)
}else if(row.caseId == null || row.caseId == ''){
this.novideo = true
}else{
this.iszijian = false
this.novideo = false
this.getListdetail(row.caseId)
}
this.form = row
// if(row.caseId == null || row.caseId == '' ){
// this.novideo = true
// }else{
// this.novideo = false
// this.getListdetail(row.caseId)
// }
},
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
this.$refs.multipleTable.toggleRowSelection(row);
});
} else {
this.$refs.multipleTable.clearSelection();
}
},
handleSelectionChange(val) {
this.multipleSelection = val;
console.log(this.multipleSelection)
},
//
handleClose(){
this.easysrc = ''
this.playshow = false
},
//
download(value) {
// 使$set
this.$set(this.downloadingFiles, value.fileName, true);
this.$message.info('下载开始,请稍候...');
downloadviedo(value).then(res => {
if (res) {
var elink = document.createElement('a');
elink.download = value.fileName;
elink.style.display = 'none';
var blob = new Blob([res], {type: 'application/x-msdownload'});
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
document.body.removeChild(elink);
URL.revokeObjectURL(elink.href); //
this.$message.success('下载已完成,请查看浏览器下载管理器');
} else {
this.$message.error('下载失败,请联系管理员');
}
}).catch(error => {
console.error('下载失败:', error);
this.$message.error('下载超时或网络错误,请稍后重试');
}).finally(() => {
// 使$set
this.$set(this.downloadingFiles, value.fileName, false);
});
},
//
onPlayerPlay(player) {
console.log("播放了", player);
},
//
onPlayerPause(player) {
console.log("暂停了", player);
},
//
onPlayerEnded($event) {
console.log("播放完了");
},
// DOMreadyState
onPlayerWaiting(player) {
let time = localStorage.getItem("cacheTime")
if(player.cache_.currentTime - Number(time) > 0.1){
this.current = Number(time)
this.playerReadied(player)
}else{
this.current = player.cache_.currentTime
}
},
//
onPlayerPlaying($event) {
// console.log(player)
},
//
onPlayerLoadeddata($event) {
// console.log(player)
},
//readyStateHAVE_FUTURE_DATA
onPlayerCanplay(player) {
// console.log('player Canplay!', player)
},
//readyStateHAVE_ENOUGH_DATA
onPlayerCanplaythrough(player) {
// console.log('player Canplaythrough!', player)
},
//
playerStateChanged(playerCurrentState) {
// console.log('player current update state', playerCurrentState)
},
//ready
playerReadied(player) {
// console.log('example player 1 readied', player);
player.currentTime(this.current)
}
},
}
</script>
<style scoped>
.app-container{padding: 10px 20px;}
.shad{
width: 100%;
background: #fff;
border-radius: 6px;
margin-top: 10px;
padding: 15px;
box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);
box-sizing: border-box;
}
.el-dialog .el-dialog__body{display: -webkit-flex;display: flex;justify-content:center;}
.video-player{width: 100%;}
.title{font-weight: bold;color: #409eff;}
/deep/.el-form-item{
margin-bottom: 10px;
}
/deep/.el-divider--horizontal{
margin: 10px 0;
}
/deep/.el-dialog__body{
padding: 10px 20px;
height:calc(100vh - 200px);overflow-y: auto;
}
</style>

View File

@ -145,18 +145,42 @@
</el-col> </el-col>
</el-row> </el-row>
<el-table :data="detailData" <el-table :data="detailData"
v-loading="downloading"
height="340" height="340"
ref="multipleTable" ref="multipleTable"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
tooltip-effect="dark"> tooltip-effect="dark">
<el-table-column type="index" width="55" align="center"></el-table-column> <el-table-column type="index" width="55" align="center"></el-table-column>
<el-table-column property="fileName" show-overflow-tooltip label="文件名"></el-table-column> <el-table-column property="fileName" show-overflow-tooltip label="文件名" width="400"></el-table-column>
<el-table-column property="filePath" show-overflow-tooltip label="地址" width="400"></el-table-column> <el-table-column property="filePath" show-overflow-tooltip label="地址"></el-table-column>
<el-table-column align="center" fixed="right" label="下载" width="140"> <el-table-column align="center" fixed="right" label="下载" width="220">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button :icon="downicon" @click="download(scope.row)" type="text" size="small">下载</el-button> <!-- 下载中显示进度条 -->
<el-button :icon="downicon" v-if="isVideoFile(scope.row.fileName)" @click="backplay(scope.row)" type="text" size="small">回放</el-button> <div v-if="downloadingFiles[scope.row.fileName]" style="display: flex; align-items: center; gap: 8px;">
<el-progress
:percentage="downloadProgress[scope.row.fileName] || 0"
:stroke-width="6"
style="width: 100px;"
:show-text="false"
></el-progress>
<span style="font-size: 12px; color: #409eff; min-width: 45px;">
{{ downloadProgress[scope.row.fileName] || 0 }}%
</span>
<el-button
@click="cancelDownload(scope.row.fileName)"
type="text"
size="small"
icon="el-icon-close"
style="color: #f56c6c;"
>取消</el-button>
</div>
<!-- 未下载显示按钮 -->
<el-button
v-else
:icon="downicon"
@click="download(scope.row)"
type="text"
size="small"
>下载</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -231,7 +255,6 @@
<span>{{ parseTime(scope.row.ends,'{y}-{m}-{d} {h}:{i}') || '-' }}</span> <span>{{ parseTime(scope.row.ends,'{y}-{m}-{d} {h}:{i}') || '-' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column prop="roomName" align="center" label="房间名称"></el-table-column> -->
<el-table-column fixed="right" align="center" label="录像下载" width="100"> <el-table-column fixed="right" align="center" label="录像下载" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
@ -251,114 +274,128 @@
@pagination="getList" /> @pagination="getList" />
</div> </div>
</template> </template>
<script> <script>
import EasyPlayer from '@easydarwin/easyplayer' import EasyPlayer from '@easydarwin/easyplayer'
import { getcaselist,getcaselistdetail,download,recordvideo, selectCaseDownloadList} from "@/api/caselist/caselist"; import { getcaselist, getcaselistdetail, downloadviedo, recordvideo } from "@/api/caselist/caselist";
import axios from 'axios'
import { getToken } from '@/utils/auth'
export default { export default {
name:"casevideodown", name: "casevideodown",
dicts: ['tonglu_type'], dicts: ['tonglu_type'],
components: { components: {
EasyPlayer EasyPlayer
}, },
data() { data() {
return { return {
form:{ form: {},
}, iszijian: "",
iszijian:"",
easysrc: '', easysrc: '',
novideo:false , novideo: false,
downicon:'el-icon-download', downicon: 'el-icon-download',
playshow:false, playshow: false,
dialogtitle:"案件下载详情", // dialogtitle: "案件下载详情",
dialogtitle2:"", // dialogtitle2: "",
showpross:false, // showpross: false,
progresssyatus:"success", // progresssyatus: "success",
//
showSearch: true, showSearch: true,
//
loading: false, loading: false,
downloading:false, downloading: false,
dialogTableVisible:false, dialogTableVisible: false,
// defaultSort: { prop: 'starts', order: 'descending' },
defaultSort: {prop: 'starts', order: 'descending'},
total: 0, total: 0,
playquery:{ playquery: {
caseId:"", caseId: "",
file:"m3u8", file: "m3u8",
operate:"play" operate: "play"
}, },
//
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
caseName: null, // caseName: null,
caseCode: null, // caseCode: null,
sar: null,
clerk: null,
cbJCG: null
}, },
multipleSelection:[], multipleSelection: [],
// tableData: [],
// tableData: [], detailData: [],
tableData: [{ downloadingFiles: {},
starts:"", downloadProgress: {},
ends:"", abortControllers: {},
}],
//
detailData:[],
playerOptions: { playerOptions: {
// playbackRates: [0.5, 1.0, 2, 3],
playbackRates: [0.5,1.0,2,3], // autoplay: true,
            autoplay: true, // true, muted: false,
            muted: false, // loop: false,
            loop: false, // preload: "auto",
            preload: "auto", // <video>auto, language: "zh-CN",
            language: "zh-CN", aspectRatio: "16:9",
            aspectRatio: "16:9", // 使 - "16:9""4:3" fluid: true,
            fluid: true, // trueVideo.js player sources: [{
sources: [ type: "video/mp4",
              { src: '',
                type: "video/mp4", // }],
                src: '', poster: "",
// src: require('http://100.100.10.216:18000/hls/stream_9_0/stream_9_0_20231220155532_20231220155922.m3u8'), notSupportedMessage: "此视频暂无法播放,请稍后再试",
              }, controlBar: {
            ], timeDivider: true,
            poster: "", // durationDisplay: true,
            notSupportedMessage: "此视频暂无法播放,请稍后再试", // Video.js remainingTimeDisplay: true,
            controlBar: { fullscreenToggle: true,
              timeDivider: true, //
              durationDisplay: true, //
              remainingTimeDisplay: true, //
              fullscreenToggle: true, //
} }
} }
} }
}, },
created() { created() {
this.getList(); this.getList();
},
mouted(){
}, },
methods: { methods: {
// .mp4', '.avi', '.rmvb formatFileSize(bytes) {
if (bytes === 0) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
},
cancelDownload(fileName) {
if (this.abortControllers[fileName]) {
this.abortControllers[fileName].abort();
this.$message.info(`已取消下载: ${fileName}`);
this.$set(this.downloadingFiles, fileName, false);
this.$set(this.downloadProgress, fileName, null);
this.$set(this.abortControllers, fileName, null);
}
},
isVideoFile(fileName) { isVideoFile(fileName) {
const videoExtensions = ['.mp4', '.avi', '.rmvb']; const videoExtensions = ['.mp4', '.avi', '.rmvb'];
const extension = fileName.substring(fileName.lastIndexOf('.')).toLowerCase(); const extension = fileName.substring(fileName.lastIndexOf('.')).toLowerCase();
return !this.iszijian && videoExtensions.includes(extension); return !this.iszijian && videoExtensions.includes(extension);
}, },
/** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.pageNum = 1; this.queryParams.pageNum = 1;
this.queryParams.pageSize = 10; this.queryParams.pageSize = 10;
this.getList(); this.getList();
}, },
/** 重置按钮操作 */
resetQuery() { resetQuery() {
this.queryParams ={} this.queryParams = {
this.queryParams.pageNum = 1; pageNum: 1,
this.queryParams.pageSize = 10; pageSize: 10,
caseName: null,
caseCode: null,
sar: null,
clerk: null,
cbJCG: null
}
this.getList(); this.getList();
}, },
/** 查询案件列表 */
getList() { getList() {
const lengthToCut = 19; const lengthToCut = 19;
this.loading = true; this.loading = true;
@ -374,73 +411,50 @@ export default {
this.loading = false; this.loading = false;
}).catch((err) => { }).catch((err) => {
this.loading = false; this.loading = false;
this.$message.error('获取案件列表失败');
}); });
}, },
/** 查询案件详情 */
getCaseListdetail(bmsahV) {
const data = {
bmsah: bmsahV
}
getallcasedetail(data).then(res => {
this.selfCase = res.data.selfCase
this.sarlist = res.data.sarlist
});
},
/** 查询案件列表详情 */
getListdetail(caseId) { getListdetail(caseId) {
this.detailData = [] this.detailData = []
this.downloading = true this.downloading = true
getcaselistdetail(caseId).then(res => { getcaselistdetail(caseId).then(res => {
this.detailData = res.data; this.detailData = res.data;
this.downloading = false this.downloading = false
}) }).catch(error => {
.catch(error => {
this.$message.error('获取失败,请检查网络'); this.$message.error('获取失败,请检查网络');
this.downloading = false this.downloading = false
}) })
}, },
//
backplay() { backplay() {
this.playshow = true this.playshow = true
recordvideo(this.playquery).then(res => { recordvideo(this.playquery).then(res => {
// url
// const prefix = 'http://100.100.10.216:18000';
// const url1 = '\"/hls/stream_10_0/stream_10_0_20240108153937_20240108155113.m3u8\"'
// const url = url1.replace(/"/g, ""); //
// const easysrc = prefix + url;
const prefix = res.data.prefix; const prefix = res.data.prefix;
const url = res.data.url.replace(/"/g, ""); // const url = res.data.url.replace(/"/g, "");
const easysrc = prefix + url; const easysrc = prefix + url;
// http://100.100.10.216:18000/hls/stream_9_0/stream_9_0_20231220155532_20231220155922.m3u8 this.easysrc = easysrc;
this.easysrc = easysrc; // this.easysrc
}); });
}, },
// -- ,
handleClick(row) { handleClick(row) {
this.playquery.caseId = row.caseId this.playquery.caseId = row.caseId
// this.caseId = row.caseId
this.dialogtitle = row.caseName this.dialogtitle = row.caseName
this.dialogTableVisible = true this.dialogTableVisible = true
if(row.roomName == null || row.roomName == ''){ if (row.roomName == null || row.roomName == '') {
this.iszijian = true this.iszijian = true
this.novideo = false this.novideo = false
this.getListdetail(row.caseId) this.getListdetail(row.caseId)
}else if(row.caseId == null || row.caseId == ''){ } else if (row.caseId == null || row.caseId == '') {
this.novideo = true this.novideo = true
}else{ } else {
this.iszijian = false this.iszijian = false
this.novideo = false this.novideo = false
this.getListdetail(row.caseId) this.getListdetail(row.caseId)
} }
this.form = row this.form = row
// if(row.caseId == null || row.caseId == '' ){
// this.novideo = true
// }else{
// this.novideo = false
// this.getListdetail(row.caseId)
// }
}, },
toggleSelection(rows) { toggleSelection(rows) {
if (rows) { if (rows) {
rows.forEach(row => { rows.forEach(row => {
@ -450,109 +464,169 @@ export default {
this.$refs.multipleTable.clearSelection(); this.$refs.multipleTable.clearSelection();
} }
}, },
handleSelectionChange(val) { handleSelectionChange(val) {
this.multipleSelection = val; this.multipleSelection = val;
console.log(this.multipleSelection) // console.log(this.multipleSelection)
}, },
//
handleClose(){ handleClose() {
this.easysrc = '' this.easysrc = ''
this.playshow = false this.playshow = false
}, },
// //
download(value) { download(value) {
// this.$download.resource(value) //
this.downloading = true this.$set(this.downloadingFiles, value.fileName, true);
download(value).then(res => { this.$set(this.downloadProgress, value.fileName, 0);
var resdata = res;
this.downloading = false //
if (resdata) { const abortController = new AbortController();
var elink = document.createElement('a'); this.$set(this.abortControllers, value.fileName, abortController);
this.$message.info(`开始下载: ${value.fileName}`);
const baseURL = process.env.VUE_APP_BASE_API || '/dev-api';
// console.log(`===== : ${value.fileName} =====`);
// console.log('URL:', `${baseURL}/casedownload/download`);
// console.log(':', {
// fileName: value.fileName,
// filePath: value.filePath
// });
// 使 axios 便
axios({
method: 'post',
url: `${baseURL}/casedownload/download`,
data: {
fileName: value.fileName,
filePath: value.filePath
},
responseType: 'blob',
signal: abortController.signal,
timeout: 600000,
headers: {
'Authorization': 'Bearer ' + getToken()
},
//
onDownloadProgress: (progressEvent) => {
console.log('下载进度事件:', {
loaded: progressEvent.loaded,
total: progressEvent.total,
percent: progressEvent.total ? ((progressEvent.loaded / progressEvent.total) * 100).toFixed(2) + '%' : '未知'
});
if (progressEvent.total && progressEvent.total > 0) {
const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
this.$set(this.downloadProgress, value.fileName, percent);
} else if (progressEvent.loaded) {
// total90%
const dynamicPercent = Math.min(90, Math.floor(progressEvent.loaded / 1024 / 100));
if (dynamicPercent > this.downloadProgress[value.fileName]) {
this.$set(this.downloadProgress, value.fileName, dynamicPercent);
}
}
}
}).then(response => {
//
console.log('===== 响应头信息 =====');
console.log('Content-Length:', response.headers['content-length']);
console.log('Content-Type:', response.headers['content-type']);
console.log('Content-Disposition:', response.headers['content-disposition']);
console.log('所有响应头:', JSON.stringify(response.headers, null, 2));
console.log('文件大小(blob.size):', response.data.size, 'bytes');
console.log('文件大小格式化:', this.formatFileSize(response.data.size));
console.log('=====================');
// JSON
if (response.data.size < 1024) {
const reader = new FileReader();
reader.onload = (e) => {
try {
const text = e.target.result;
// console.log('():', text);
const errorData = JSON.parse(text);
if (errorData.code && errorData.code !== 200) {
this.$message.error(errorData.msg || '下载失败');
this.$set(this.downloadingFiles, value.fileName, false);
this.$set(this.downloadProgress, value.fileName, null);
return;
}
} catch (e) {
// JSON
// console.log('');
}
};
reader.readAsText(response.data);
}
//
this.$set(this.downloadProgress, value.fileName, 100);
const blob = new Blob([response.data], { type: 'application/octet-stream' });
const downloadUrl = URL.createObjectURL(blob);
const elink = document.createElement('a');
elink.download = value.fileName; elink.download = value.fileName;
elink.style.display = 'none'; elink.style.display = 'none';
var blob = new Blob([resdata], {type: 'application/x-msdownload'}); elink.href = downloadUrl;
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink); document.body.appendChild(elink);
elink.click(); elink.click();
document.body.removeChild(elink); document.body.removeChild(elink);
URL.revokeObjectURL(downloadUrl);
// console.log(`===== : ${value.fileName} =====`);
this.$message.success(`下载完成: ${value.fileName}`);
}).catch(error => {
if (error.name === 'AbortError') {
// console.log(`: ${value.fileName}`);
this.$message.info(`已取消下载: ${value.fileName}`);
} else { } else {
this.downloading = false console.error('下载失败详情:', error);
this.$message.error('下载失败,请联系管理员'); this.$message.error(`下载失败: ${value.fileName},请检查网络后重试`);
} }
}).finally(() => {
this.$set(this.downloadingFiles, value.fileName, false);
setTimeout(() => {
if (this.downloadProgress[value.fileName] === 100) {
this.$set(this.downloadProgress, value.fileName, null);
} else {
this.$set(this.downloadProgress, value.fileName, null);
}
this.$set(this.abortControllers, value.fileName, null);
}, 1000);
}); });
}, },
downloadall() {
if (!this.downloading) {
this.downloading = true; // true
// const downloadPromises = this.multipleSelection.map((item) => this.download(item));
// Promise.all(downloadPromises)
// .then(() => {
// this.downloading = false; // false
// })
// .catch((error) => {
// this.downloading = false; // false
// this.$modal.msgSuccess("" + error);
// });
}
},
//
onPlayerPlay(player) { onPlayerPlay(player) {
console.log("播放了", player); console.log("播放了", player);
}, },
//
onPlayerPause(player) { onPlayerPause(player) {
console.log("暂停了", player); console.log("暂停了", player);
}, },
//
onPlayerEnded($event) { onPlayerEnded($event) {
console.log("播放完了"); console.log("播放完了");
}, },
// DOMreadyState
onPlayerWaiting(player) { onPlayerWaiting(player) {
let time = localStorage.getItem("cacheTime") let time = localStorage.getItem("cacheTime")
if(player.cache_.currentTime - Number(time) > 0.1){ if (player.cache_.currentTime - Number(time) > 0.1) {
this.current = Number(time) this.current = Number(time)
this.playerReadied(player) this.playerReadied(player)
}else{ } else {
this.current = player.cache_.currentTime this.current = player.cache_.currentTime
} }
}, },
onPlayerPlaying($event) {},
// onPlayerLoadeddata($event) {},
onPlayerPlaying($event) { onPlayerCanplay(player) {},
// console.log(player) onPlayerCanplaythrough(player) {},
}, playerStateChanged(playerCurrentState) {},
//
onPlayerLoadeddata($event) {
// console.log(player)
},
//readyStateHAVE_FUTURE_DATA
onPlayerCanplay(player) {
// console.log('player Canplay!', player)
},
//readyStateHAVE_ENOUGH_DATA
onPlayerCanplaythrough(player) {
// console.log('player Canplaythrough!', player)
},
//
playerStateChanged(playerCurrentState) {
// console.log('player current update state', playerCurrentState)
},
//ready
playerReadied(player) { playerReadied(player) {
// console.log('example player 1 readied', player);
player.currentTime(this.current) player.currentTime(this.current)
} }
}, },
} }
</script> </script>
@ -569,7 +643,6 @@ export default {
} }
.el-dialog .el-dialog__body{display: -webkit-flex;display: flex;justify-content:center;} .el-dialog .el-dialog__body{display: -webkit-flex;display: flex;justify-content:center;}
.video-player{width: 100%;} .video-player{width: 100%;}
.title{font-weight: bold;color: #409eff;} .title{font-weight: bold;color: #409eff;}
/deep/.el-form-item{ /deep/.el-form-item{
margin-bottom: 10px; margin-bottom: 10px;
@ -579,6 +652,7 @@ export default {
} }
/deep/.el-dialog__body{ /deep/.el-dialog__body{
padding: 10px 20px; padding: 10px 20px;
height:calc(100vh - 200px);overflow-y: auto; height:calc(100vh - 200px);
overflow-y: auto;
} }
</style> </style>

View File

@ -198,7 +198,6 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="证件号" <el-form-item label="证件号"
:prop="'sarlist.' + index + '.zjhm'" :prop="'sarlist.' + index + '.zjhm'"
> >
<!-- :rules="[{ required: true, message: '请输入证件号', trigger: 'blur' }]" --> <!-- :rules="[{ required: true, message: '请输入证件号', trigger: 'blur' }]" -->
<el-input v-model="item.zjhm" placeholder="请输入证件号" /> <el-input v-model="item.zjhm" placeholder="请输入证件号" />
@ -425,6 +424,19 @@ export default {
submitForm() { submitForm() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
if (valid) { if (valid) {
//
const emptyZjhmIndices = [];
this.form.sarlist.forEach((item, index) => {
if (!item.zjhm || item.zjhm.trim() === '') {
emptyZjhmIndices.push(index);
}
});
//
emptyZjhmIndices.forEach((index, i) => {
this.form.sarlist[index].zjhm = ' '.repeat(i + 1);
});
// //
this.formdata.selfCase.ajmc = this.form.ajmc this.formdata.selfCase.ajmc = this.form.ajmc
this.formdata.selfCase.slrq = this.form.slrq this.formdata.selfCase.slrq = this.form.slrq

View File

@ -38,7 +38,7 @@ module.exports = {
proxy: { proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy // detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
target: `http://192.168.0.3:18098`, // target: `http://192.168.0.3:18098`,
// target: `http://192.168.3.12:18098/`, //服务器 // target: `http://192.168.3.12:18098/`, //服务器
// target: `http://192.168.3.10:8099`, //耗子 // target: `http://192.168.3.10:8099`, //耗子
// target: `http://106.15.139.36:18090`, // target: `http://106.15.139.36:18090`,
@ -46,7 +46,7 @@ module.exports = {
// target: `http://120.79.202.7:443`, // target: `http://120.79.202.7:443`,
// target: `http://100.100.10.216:8099`, // target: `http://100.100.10.216:8099`,
// target: 'http://106.15.139.36:18090', // target: 'http://106.15.139.36:18090',
// target: 'http://127.0.0.1:18098/', //小乌龟本地 target: 'http://172.16.1.97:18098/', //小乌龟本地
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ['^' + process.env.VUE_APP_BASE_API]: ''