diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/PublicStateEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/PublicStateEnum.java index 7efde897..3be1c65d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/PublicStateEnum.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/PublicStateEnum.java @@ -15,6 +15,12 @@ public enum PublicStateEnum { PROJECT_CHECK_TYPE_JPYS("1", "举牌验收"), PROJECT_CHECK_POSITION_TYPE("1", "默认工序部位类型"), /**********************************项目验收***************************************/ + + /**********************************视频设备***************************************/ + VIDEO_ONLINE("1", "在线"), + VIDEO_OFFLINE("2", "离线"), + VIDEO_UNKNOWN("3", "未知"), + /**********************************视频设备***************************************/ COMZGS("1","子公司状态标识"); private final String code; diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index 68781ec2..96efed5a 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -62,6 +62,7 @@ "vue": "2.6.12", "vue-count-to": "1.0.13", "vue-cropper": "0.5.5", + "vue-h265-player": "^0.0.24", "vue-meta": "2.4.0", "vue-router": "3.4.9", "vuedraggable": "2.24.3", diff --git a/ruoyi-ui/public/libDecoder.wasm b/ruoyi-ui/public/libDecoder.wasm new file mode 100644 index 00000000..a45028da Binary files /dev/null and b/ruoyi-ui/public/libDecoder.wasm differ diff --git a/ruoyi-ui/src/api/project/videoConfig.js b/ruoyi-ui/src/api/project/videoConfig.js deleted file mode 100644 index b31085a7..00000000 --- a/ruoyi-ui/src/api/project/videoConfig.js +++ /dev/null @@ -1,44 +0,0 @@ -import request from '@/utils/request' - -// 查询视频配置列表 -export function listVideoConfig(query) { - return request({ - url: '/project/videoConfig/list', - method: 'get', - params: query - }) -} - -// 查询视频配置详细 -export function getVideoConfig(id) { - return request({ - url: '/project/videoConfig/' + id, - method: 'get' - }) -} - -// 新增视频配置 -export function addVideoConfig(data) { - return request({ - url: '/project/videoConfig', - method: 'post', - data: data - }) -} - -// 修改视频配置 -export function updateVideoConfig(data) { - return request({ - url: '/project/videoConfig', - method: 'put', - data: data - }) -} - -// 删除视频配置 -export function delVideoConfig(id) { - return request({ - url: '/project/videoConfig/' + id, - method: 'delete' - }) -} diff --git a/ruoyi-ui/src/api/video/videoConfig.js b/ruoyi-ui/src/api/video/videoConfig.js new file mode 100644 index 00000000..8f534844 --- /dev/null +++ b/ruoyi-ui/src/api/video/videoConfig.js @@ -0,0 +1,69 @@ +import request from '@/utils/request' + +// 查询视频配置列表 +export function listVideoConfig(query) { + return request({ + url: '/video/videoConfig/list', + method: 'get', + params: query + }) +} +// 查询视频配置列表 +export function listVideoView(query) { + return request({ + url: '/video/videoConfig/listView', + method: 'get', + params: query + }) +} + +// 查询视频配置详细 +export function getVideoConfig(id) { + return request({ + url: '/video/videoConfig/' + id, + method: 'get' + }) +} + +// 新增视频配置 +export function addVideoConfig(data) { + return request({ + url: '/video/videoConfig', + method: 'post', + data: data + }) +} + +// 修改视频配置 +export function updateVideoConfig(data) { + return request({ + url: '/video/videoConfig', + method: 'put', + data: data + }) +} + +// 修改视频配置 +export function updateVideoConfigSort(data) { + return request({ + url: '/video/videoConfig/updateVideoConfigSort', + method: 'post', + data: data + }) +} + +// 删除视频配置 +export function delVideoConfig(id) { + return request({ + url: '/video/videoConfig/' + id, + method: 'delete' + }) +} + +// 根据设备编号查询设备通道信息 +export function getVideoPassage(videoDvrNumberd) { + return request({ + url: '/video/videoConfig/getVideoPassage/' + videoDvrNumberd, + method: 'get' + }) +} diff --git a/ruoyi-ui/src/styles/menu.scss b/ruoyi-ui/src/styles/menu.scss new file mode 100644 index 00000000..e5938c97 --- /dev/null +++ b/ruoyi-ui/src/styles/menu.scss @@ -0,0 +1 @@ +.demo-block{border:1px solid #ebebeb;border-radius:3px;transition:.2s}.demo-block.hover{box-shadow:0 0 8px 0 rgba(232,237,250,.6),0 2px 4px 0 rgba(232,237,250,.5)}.demo-block code{font-family:Menlo,Monaco,Consolas,Courier,monospace}.demo-block .demo-button{float:right}.demo-block .source{padding:24px}.demo-block .meta{background-color:#fafafa;border-top:1px solid #eaeefb;overflow:hidden;height:0;transition:height .2s}.demo-block .description{padding:20px;box-sizing:border-box;border:1px solid #ebebeb;border-radius:3px;font-size:14px;line-height:22px;color:#666;word-break:break-word;margin:10px;background-color:#fff}.demo-block .description p{margin:0;line-height:26px}.demo-block .description code{color:#5e6d82;background-color:#e6effb;margin:0 4px;display:inline-block;padding:1px 5px;font-size:12px;border-radius:3px;height:18px;line-height:18px}.demo-block .highlight pre{margin:0}.demo-block .highlight code.hljs{margin:0;border:none;max-height:none;border-radius:0}.demo-block .highlight code.hljs:before{content:none}.demo-block .demo-block-control{border-top:1px solid #eaeefb;height:44px;box-sizing:border-box;background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px;text-align:center;margin-top:-1px;color:#d3dce6;cursor:pointer;position:relative}.demo-block .demo-block-control.is-fixed{position:fixed;bottom:0;width:868px}.demo-block .demo-block-control i{font-size:16px;line-height:44px;transition:.3s}.demo-block .demo-block-control i.hovering{transform:translateX(-40px)}.demo-block .demo-block-control>span{position:absolute;transform:translateX(-30px);font-size:14px;line-height:44px;transition:.3s;display:inline-block}.demo-block .demo-block-control:hover{color:#409eff;background-color:#f9fafc}.demo-block .demo-block-control .text-slide-enter,.demo-block .demo-block-control .text-slide-leave-active{opacity:0;transform:translateX(10px)}.demo-block .demo-block-control .control-button{line-height:26px;position:absolute;top:0;right:0;font-size:14px;padding-left:5px;padding-right:25px}.footer{background-color:#f7fbfd;width:100%;padding:40px 150px;margin-top:-340px;box-sizing:border-box;height:340px}.footer .container{box-sizing:border-box;width:auto}.footer .footer-main{font-size:0;display:inline-block;vertical-align:top;margin-right:110px}.footer .footer-main h4{font-size:18px;color:#333;line-height:1;margin:0 0 15px}.footer .footer-main .footer-main-link{display:block;margin:0;line-height:2;font-size:14px;color:#666}.footer .footer-main .footer-main-link:hover{color:#333}.footer .footer-social{float:right;text-align:right}.footer .footer-social .footer-social-title{color:#666;font-size:18px;line-height:1;margin:0 0 20px;padding:0;font-weight:700}.footer .footer-social .elementdoc{transition:.3s;display:inline-block;line-height:32px;text-align:center;color:#c8d6e8;background-color:transparent;size:32px;font-size:32px;vertical-align:middle;margin-right:20px}.footer .footer-social .elementdoc:hover{transform:scale(1.2);color:#8d99ab}.footer .footer-social .doc-icon-gitter{margin-right:0}.el-popover.footer-popover{padding:0;min-width:120px;line-height:normal;box-shadow:0 0 11px 0 rgba(174,187,211,.24)}.el-popover.footer-popover .footer-popover-title{border-bottom:1px solid #eaeefb;height:30px;line-height:30px;text-align:center;color:#99a9bf;background-color:#f8f9fe}.el-popover.footer-popover img{size:100px;margin:10px}@media (max-width:1140px){.footer{height:auto}}@media (max-width:1000px){.footer-social{display:none}}@media (max-width:768px){.footer .footer-main{margin-bottom:30px}}.theme-picker{height:80px;display:inline-block}.theme-picker .el-color-picker__trigger{vertical-align:middle}.theme-picker-dropdown .el-color-dropdown__link-btn{display:none}.algolia-search{width:450px!important}.algolia-search.is-empty .el-autocomplete-suggestion__list{padding-bottom:0}.algolia-search .el-autocomplete-suggestion__list{position:static!important;padding-bottom:28px}.algolia-search li{border-bottom:1px solid #ebebeb}.algolia-search li:last-child{border-bottom:none}.algolia-search .algolia-highlight{color:#409eff;font-weight:700}.algolia-search .algolia-search-title{font-size:14px;margin:6px 0;line-height:1.8}.algolia-search .algolia-search-separator{padding:0 6px}.algolia-search .algolia-search-content{font-size:12px;margin:6px 0;line-height:2.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.algolia-search .algolia-search-link{position:absolute;bottom:0;left:0;width:100%;padding-right:20px;background-color:#e4e7ed;border-bottom-left-radius:4px;border-bottom-right-radius:4px;box-sizing:border-box;text-align:right}.algolia-search .algolia-search-link:hover{background-color:#e4e7ed}.algolia-search .algolia-search-link img{display:inline-block;height:17px;margin-top:10px}.algolia-search .algolia-search-empty{margin:5px 0;text-align:center;color:#999}.progress[data-v-3285c94c]{position:fixed;top:0;left:0;right:0;height:2px;width:0;transition:width .2s,opacity .4s;opacity:1;z-index:999999}.loadingClass{z-index:0!important}.loadingClass .el-loading-spinner{top:0;margin-top:30%}.headerWrapper[data-v-7d3f822e]{height:80px}#v3-banner[data-v-7d3f822e]{background-color:#409eff;min-height:30px;padding:5px 60px;z-index:19;box-sizing:border-box;text-align:center;color:#eee}#v3-banner a[data-v-7d3f822e]{color:#fff;font-weight:700}.header[data-v-7d3f822e]{height:80px;background-color:#fff;color:#fff;top:0;left:0;width:100%;line-height:80px;z-index:100;position:relative}.header .container[data-v-7d3f822e]{height:100%;box-sizing:border-box;border-bottom:1px solid #dcdfe6}.header .nav-lang-spe[data-v-7d3f822e]{color:#888}.header h1[data-v-7d3f822e]{margin:0;float:left;font-size:32px;font-weight:400}.header h1 a[data-v-7d3f822e]{color:#333;text-decoration:none;display:block}.header h1 span[data-v-7d3f822e]{font-size:12px;display:inline-block;width:34px;height:18px;border:1px solid hsla(0,0%,100%,.5);text-align:center;line-height:18px;vertical-align:middle;margin-left:10px;border-radius:3px}.header .nav[data-v-7d3f822e]{float:right;height:100%;line-height:80px;background:transparent;padding:0;margin:0}.header .nav[data-v-7d3f822e]:after,.header .nav[data-v-7d3f822e]:before{display:table;content:""}.header .nav[data-v-7d3f822e]:after{clear:both}.header .nav-gap[data-v-7d3f822e]{position:relative;width:1px;height:80px;padding:0 20px}.header .nav-gap[data-v-7d3f822e]:before{content:"";position:absolute;top:calc(50% - 8px);width:1px;height:16px;background:#ebebeb}.header .nav-logo-small[data-v-7d3f822e],.header .nav-logo[data-v-7d3f822e]{vertical-align:sub}.header .nav-logo-small[data-v-7d3f822e]{display:none}.header .nav-item[data-v-7d3f822e]{margin:0;float:left;list-style:none;position:relative;cursor:pointer}.header .nav-item.nav-algolia-search[data-v-7d3f822e]{cursor:default}.header .nav-item.lang-item[data-v-7d3f822e],.header .nav-item[data-v-7d3f822e]:last-child{cursor:default;margin-left:34px}.header .nav-item.lang-item span[data-v-7d3f822e],.header .nav-item:last-child span[data-v-7d3f822e]{opacity:.8}.header .nav-item.lang-item .nav-lang[data-v-7d3f822e],.header .nav-item:last-child .nav-lang[data-v-7d3f822e]{cursor:pointer;display:inline-block;height:100%;color:#888}.header .nav-item.lang-item .nav-lang[data-v-7d3f822e]:hover,.header .nav-item:last-child .nav-lang[data-v-7d3f822e]:hover{color:#409eff}.header .nav-item.lang-item .nav-lang.active[data-v-7d3f822e],.header .nav-item:last-child .nav-lang.active[data-v-7d3f822e]{font-weight:700;color:#409eff}.header .nav-item a[data-v-7d3f822e]{text-decoration:none;color:#1989fa;opacity:.5;display:block;padding:0 22px}.header .nav-item a.active[data-v-7d3f822e],.header .nav-item a[data-v-7d3f822e]:hover{opacity:1}.header .nav-item a.active[data-v-7d3f822e]:after{content:"";display:inline-block;position:absolute;bottom:0;left:calc(50% - 15px);width:30px;height:2px;background:#409eff}.nav-dropdown[data-v-7d3f822e]{margin-bottom:6px;padding-left:18px;width:100%}.nav-dropdown span[data-v-7d3f822e]{display:block;width:100%;font-size:16px;color:#888;line-height:40px;transition:.2s;padding-bottom:6px;user-select:none}.nav-dropdown span[data-v-7d3f822e]:hover{cursor:pointer}.nav-dropdown i[data-v-7d3f822e]{transition:.2s;font-size:12px;color:#979797;transform:translateY(-2px)}.nav-dropdown .is-active i[data-v-7d3f822e],.nav-dropdown .is-active span[data-v-7d3f822e]{color:#409eff}.nav-dropdown .is-active i[data-v-7d3f822e]{transform:rotate(180deg) translateY(3px)}.nav-dropdown:hover i[data-v-7d3f822e],.nav-dropdown:hover span[data-v-7d3f822e]{color:#409eff}.nav-dropdown-list[data-v-7d3f822e]{width:auto}@media (max-width:850px){.header .nav-logo[data-v-7d3f822e]{display:none}.header .nav-logo-small[data-v-7d3f822e]{display:inline-block}.header .nav-item[data-v-7d3f822e]{margin-left:6px}.header .nav-item.lang-item[data-v-7d3f822e],.header .nav-item[data-v-7d3f822e]:last-child{margin-left:10px}.header .nav-item a[data-v-7d3f822e]{padding:0 5px}.header .nav-algolia-search[data-v-7d3f822e],.header .nav-theme-switch[data-v-7d3f822e]{display:none}}@media (max-width:700px){.header .container[data-v-7d3f822e]{padding:0 12px}.header .nav-item a[data-v-7d3f822e]{font-size:12px;vertical-align:top}.header .nav-item.lang-item[data-v-7d3f822e]{height:100%}.header .nav-item.lang-item .nav-lang[data-v-7d3f822e]{display:flex;align-items:center}.header .nav-item.lang-item .nav-lang span[data-v-7d3f822e]{padding-bottom:0}.header .nav-dropdown[data-v-7d3f822e]{padding:0}.header .nav-dropdown span[data-v-7d3f822e]{font-size:12px}.header .nav-gap[data-v-7d3f822e]{padding:0 8px}.header .nav-versions[data-v-7d3f822e]{display:none}}.side-nav{width:100%;box-sizing:border-box;padding-right:30px;transition:opacity .3s}.side-nav.is-fade{transition:opacity 3s}.side-nav li{list-style:none}.side-nav ul{padding:0;margin:0;overflow:hidden}.side-nav>ul>.nav-item>a{margin-top:15px}.side-nav>ul>.nav-item:nth-child(-n+4)>a{margin-top:0}.side-nav .nav-item a{font-size:16px;color:#333;line-height:40px;height:40px;margin:0;padding:0;text-decoration:none;display:block;position:relative;transition:.15s ease-out;font-weight:700}.side-nav .nav-item a.active{color:#409eff}.side-nav .nav-item .nav-item a{display:block;height:40px;color:#444;line-height:40px;font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400}.side-nav .nav-item .nav-item a.active,.side-nav .nav-item .nav-item a:hover{color:#409eff}.side-nav .nav-item.sponsors>.sub-nav{margin-top:-10px}.side-nav .nav-item.sponsors>a{color:#777;font-weight:300;font-size:14px}.side-nav .nav-item.sponsors .nav-item{display:inline-block}.side-nav .nav-item.sponsors .nav-item a{height:auto;display:inline-block;vertical-align:middle;margin:8px 12px 12px 0}.side-nav .nav-item.sponsors .nav-item a img{width:42px}.side-nav .nav-item.sponsors .nav-item:first-child a img{width:36px}.side-nav .nav-group__title{font-size:12px;color:#999;line-height:26px;margin-top:15px}.side-nav #code-sponsor-widget{margin:0 0 0 -20px}.nav-dropdown-list{width:120px;margin-top:-8px}.footer-nav,.nav-dropdown-list li{font-size:14px}.footer-nav{padding:40px 0;color:#333}.footer-nav:after{content:"";display:block;clear:both}.footer-nav i{transition:.3s;color:#999;vertical-align:baseline}.footer-nav-link{cursor:pointer;transition:.3s}.footer-nav-link:hover,.footer-nav-link:hover i{color:#409eff}.footer-nav-left{float:left;margin-left:-4px}.footer-nav-right{float:right;margin-right:-4px}.demo-block.demo-alert .el-alert{margin:20px 0 0}.demo-block.demo-alert .el-alert:first-child{margin:0}.demo-badge.demo-block .el-dropdown{vertical-align:middle}.demo-badge.demo-block .share-button{width:36px;padding:10px}.demo-badge.demo-block .mark{margin-top:8px;line-height:1;float:right}.demo-badge.demo-block .item{margin-right:40px}.demo-border .text{width:15%}.demo-border .line{width:70%}.demo-border .line div{width:100%;height:0;border-top:1px solid #eee}.demo-border .line .dashed{border-top:2px dashed #eee}.demo-shadow{height:100px;width:50%;border:1px solid #eee}.demo-shadow-text{line-height:50px;color:#666;font-size:14px}.demo-radius .title{color:#666;font-size:18px;margin:10px 0}.demo-radius .value{color:#333;font-size:16px;margin:10px 0}.demo-radius .radius{height:60px;width:70%;border:1px solid #d7dae2;border-radius:0;margin-top:20px}.demo-radius .radius-30{border-radius:30px}.demo-block.demo-button .el-row{margin-bottom:20px}.demo-block.demo-button .el-row:last-child{margin-bottom:0}.demo-block.demo-button .el-button+.el-button{margin-left:10px}.demo-block.demo-button .el-button-group .el-button+.el-button{margin-left:0}.demo-block.demo-button .el-button-group+.el-button-group{margin-left:10px}.demo-calendar.demo-block .is-selected{color:#1989fa}.demo-block.demo-card .text{font-size:14px}.demo-block.demo-card .time{font-size:13px;color:#999}.demo-block.demo-card .bottom{margin-top:13px;line-height:12px}.demo-block.demo-card .item{margin-bottom:18px}.demo-block.demo-card .button{padding:0;float:right}.demo-block.demo-card .image{width:100%;display:block}.demo-block.demo-card .box-card{width:480px}.demo-carousel .block{padding:30px;text-align:center;border-right:1px solid #eff2f6;display:inline-block;width:49%;box-sizing:border-box}.demo-carousel .block:last-child{border-right:none}.demo-carousel .demonstration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px}.demo-carousel .el-carousel__container{text-align:center}.demo-carousel .el-carousel__item h3{color:#fff;font-size:18px;line-height:300px;margin:0}.demo-carousel .el-carousel__item h3.small{font-size:14px;line-height:150px}.demo-carousel .el-carousel__item h3.medium{font-size:14px;line-height:200px}.demo-carousel .el-carousel__item:nth-child(2n){background-color:#99a9bf}.demo-carousel .el-carousel__item:nth-child(odd){background-color:#d3dce6}.demo-cascader .el-cascader{width:222px}.demo-cascader-size .el-cascader{vertical-align:top;margin-right:15px}.demo-cascader .source>div{display:flex}.demo-cascader .block{padding:30px 0;text-align:center;border-right:1px solid #eff2f6;width:50%;box-sizing:border-box}.demo-cascader .block:last-child{border-right:none}.demo-cascader .demonstration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px}.demo-collapse .el-collapse-item__header .header-icon{margin-left:5px}.demo-color-picker .block{padding:30px 0;text-align:center;border-right:1px solid #eff2f6;display:inline-block;width:50%;box-sizing:border-box}.demo-color-picker .block:last-child{border-right:none}.demo-color-picker .demonstration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px}.demo-color-picker .el-color-picker+.el-color-picker{margin-left:20px}.demo-color-box{position:relative;border-radius:4px;padding:20px;margin:5px 0;height:114px;box-sizing:border-box;color:#fff;font-size:14px}.demo-color-box .value{font-size:12px;opacity:.69;line-height:24px}.demo-color-box-other{height:74px;margin:10px 0!important;border-radius:4px 4px 4px 4px!important;padding:15px 20px}.demo-color-box-group .demo-color-box{border-radius:0;margin:0}.demo-color-box-group .demo-color-box:first-child{border-radius:4px 4px 0 0}.bg-color-sub,.demo-color-box-group .demo-color-box:last-child{border-radius:0 0 4px 4px}.bg-color-sub{width:100%;height:40px;left:0;bottom:0;position:absolute}.bg-blue-sub-item{width:11.1111111%;height:100%;display:inline-block}.bg-blue-sub-item:first-child{border-radius:0 0 0 4px}.bg-success-sub-item{width:50%;height:100%;display:inline-block}.bg-success-sub-item:first-child{border-radius:0 0 0 4px}.bg-success-sub-item:last-child{border-radius:0 0 4px 0}.bg-transparent{border:1px solid #fcc3c3;color:#303133;background:url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position:50%;background-size:100% 100%,auto}.demo-color-box-lite{color:#303133}.el-footer,.el-header{background-color:#b3c0d1;color:#333;line-height:60px}.el-aside{color:#333}#chang-jian-ye-mian-bu-ju+.demo-container .el-footer,#chang-jian-ye-mian-bu-ju+.demo-container .el-header{text-align:center}#chang-jian-ye-mian-bu-ju+.demo-container .el-aside{background-color:#d3dce6;text-align:center;line-height:200px}#chang-jian-ye-mian-bu-ju+.demo-container .el-main{background-color:#e9eef3;color:#333;text-align:center;line-height:160px}#chang-jian-ye-mian-bu-ju+.demo-container>.source>.el-container{margin-bottom:40px}#chang-jian-ye-mian-bu-ju+.demo-container>.source>.el-container:nth-child(5) .el-aside,#chang-jian-ye-mian-bu-ju+.demo-container>.source>.el-container:nth-child(6) .el-aside{line-height:260px}#chang-jian-ye-mian-bu-ju+.demo-container>.source>.el-container:nth-child(7) .el-aside{line-height:320px}.demo-block.demo-date-picker .source>div{padding:0;display:flex;flex-wrap:wrap}.demo-date-picker .block{padding:30px 0;text-align:center;border-right:1px solid #eff2f6;flex:1}.demo-date-picker .block:last-child{border-right:none}.demo-date-picker .container{flex:1;border-right:1px solid #eff2f6}.demo-date-picker .container .block{border-right:none}.demo-date-picker .container .block:last-child{border-top:1px solid #eff2f6}.demo-date-picker .container:last-child{border-right:none}.demo-date-picker .demonstration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px}.demo-block.demo-datetime-picker .source>div{padding:0;display:flex}.demo-datetime-picker .block{padding:30px 0;text-align:center;border-right:1px solid #eff2f6;flex:1}.demo-datetime-picker .block:last-child{border-right:none}.demo-datetime-picker .demonstration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px}.demo-block.demo-dialog .dialog-footer button:first-child{margin-right:10px}.demo-block.demo-dialog .full-image{width:100%}.demo-block.demo-dialog .el-dialog__wrapper{margin:0}.demo-block.demo-dialog .el-input,.demo-block.demo-dialog .el-select{width:300px}.demo-block.demo-dialog .el-button--text{margin-right:15px}.demo-block .el-dropdown{vertical-align:top}.demo-block .el-dropdown+.el-dropdown{margin-left:15px}.demo-block .el-dropdown-link{cursor:pointer;color:#409eff}.demo-block .el-icon-arrow-down{font-size:12px}.block-col-2{margin:-24px}.block-col-2 .el-col{padding:30px 0;text-align:center;border-right:1px solid #eff2f6}.block-col-2 .el-col:last-child{border-right:0}.demo-dropdown .demonstration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px}.demo-form .el-select .el-input{width:380px}.demo-form .el-form{width:460px}.demo-form .line{text-align:center}.demo-form .el-checkbox-group{width:320px;margin:0;padding:0;list-style:none}.demo-form .el-checkbox-group:after,.demo-form .el-checkbox-group:before{content:" ";display:table}.demo-form .el-checkbox-group:after{clear:both;visibility:hidden;font-size:0;height:0}.demo-form .el-checkbox-group .el-checkbox{float:left;width:160px;margin:0;padding:0}.demo-form .el-checkbox-group .el-checkbox+.el-checkbox{margin-left:0}.demo-form .demo-form-normal{width:460px}.demo-form .demo-form-inline{width:auto}.demo-form .demo-form-inline .el-input{width:150px}.demo-form .demo-form-inline>*{margin-right:10px}.demo-form .demo-ruleForm{width:460px}.demo-form .demo-ruleForm .el-select .el-input{width:360px}.demo-form .demo-dynamic .el-input{margin-right:10px;width:270px;vertical-align:top}.demo-form .fr{float:right}ul.language-list{color:#5e6d82;font-size:14px;padding-left:20px}ul.language-list li{line-height:1.8}.demo-icon .source>div>i{color:#606266;margin:0 20px;font-size:1.5em;vertical-align:middle}.demo-icon .source button{margin:0 20px}.page-component .content>ul.icon-list{overflow:hidden;list-style:none;padding:0!important;border:1px solid #eaeefb;border-radius:4px}.icon-list li{float:left;width:16.66%;text-align:center;height:120px;line-height:120px;color:#666;font-size:13px;border-right:1px solid #eee;border-bottom:1px solid #eee;margin-right:-1px;margin-bottom:-1px}.icon-list li:after{content:"";height:100%}.icon-list li:after,.icon-list li span{display:inline-block;vertical-align:middle}.icon-list li span{line-height:normal;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,SimSun,sans-serif;color:#99a9bf;transition:color .15s linear}.icon-list li i{display:block;font-size:32px;margin-bottom:15px;color:#606266;transition:color .15s linear}.icon-list li .icon-name{display:inline-block;padding:0 3px;height:1em}.icon-list li:hover i,.icon-list li:hover span{color:#5cb6ff}.demo-block.demo-input-number .el-input-number+.el-input-number{margin-left:10px}.demo-input .el-select .el-input{width:130px}.demo-input .el-input{width:180px}.demo-input .el-textarea{width:414px}.demo-input .el-input-group{width:100%}.demo-input .demo-input-size .el-input{vertical-align:top;margin:0 10px 10px 0}.demo-input .input-with-select .el-input-group__prepend{background-color:#fff}.demo-input .demo-autocomplete{text-align:center}.demo-input .demo-autocomplete .sub-title{margin-bottom:10px;font-size:14px;color:#8492a6}.demo-input .demo-autocomplete .el-col:not(:last-child){border-right:1px solid rgba(224,230,237,.5)}.demo-input .demo-autocomplete .el-autocomplete{text-align:left}.el-autocomplete-suggestion.my-autocomplete li{line-height:normal;padding-top:7px;padding-bottom:7px}.el-autocomplete-suggestion.my-autocomplete li .name{text-overflow:ellipsis;overflow:hidden}.el-autocomplete-suggestion.my-autocomplete li .addr{font-size:12px;color:#b4b4b4}.el-autocomplete-suggestion.my-autocomplete li .highlighted .addr{color:#ddd}.demo-input-suffix{margin-bottom:15px}.demo-input-suffix .el-input{margin-right:15px}.demo-layout .el-row{margin-bottom:20px}.demo-layout .el-row:last-child{margin-bottom:0}.demo-layout .el-col{border-radius:4px}.demo-layout .bg-purple-dark{background:#99a9bf}.demo-layout .bg-purple{background:#d3dce6}.demo-layout .bg-purple-light{background:#e5e9f2}.demo-layout .grid-content{border-radius:4px;min-height:36px}.demo-layout .row-bg{padding:10px 0;background-color:#f9fafc}.demo-loading .el-table{border:none}.demo-block.demo-menu .el-menu-demo{padding-left:55px}.demo-block.demo-menu .el-menu-vertical-demo:not(.el-menu--collapse){width:240px;min-height:400px}.demo-block.demo-menu .line{height:1px;background-color:#e0e6ed;margin:35px -24px}.demo-block.demo-menu h5{font-size:14px;color:#8492a6;margin-top:10px}.demo-block.demo-menu .tac{text-align:center}.demo-block.demo-menu .tac .el-menu-vertical-demo{display:inline-block;text-align:left}.demo-pagination .source.first{padding:0}.demo-pagination .first .block{padding:30px 0;text-align:center;border-right:1px solid #eff2f6;display:inline-block;width:50%;box-sizing:border-box}.demo-pagination .first .block:last-child{border-right:none}.demo-pagination .first .demonstration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px}.demo-pagination .source.last{padding:0}.demo-pagination .last .block{padding:30px 24px;border-bottom:1px solid #eff2f6}.demo-pagination .last .block:last-child{border-bottom:none}.demo-pagination .last .demonstration{font-size:14px;color:#8492a6;line-height:44px}.demo-pagination .last .demonstration+.el-pagination{width:70%;margin:5px 20px 0 0}.demo-block.demo-popover .el-popover+.el-popover{margin-left:10px}.demo-block.demo-popover .el-input{width:360px}.demo-block.demo-popover .el-button{margin-left:10px}.demo-block.demo-progress .el-progress--line{margin-bottom:15px;width:350px}.demo-block.demo-progress .el-progress--circle{margin-right:15px}.demo-rate .block{padding:30px 0;text-align:center;border-right:1px solid #eff2f6;display:inline-block;width:49%;box-sizing:border-box}.demo-rate .block:last-child{border-right:none}.demo-rate .demonstration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px}.demo-select .el-select{width:240px}.demo-block.demo-slider .source{padding:0}.demo-block.demo-slider .block{padding:30px 24px;overflow:hidden;border-bottom:1px solid #eff2f6}.demo-block.demo-slider .block:last-child{border-bottom:none}.demo-block.demo-slider .demonstration{font-size:14px;color:#8492a6;line-height:44px}.demo-block.demo-slider .demonstration+.el-slider{float:right;width:70%;margin-right:20px}.demo-block.demo-switch .el-switch{margin:20px 20px 20px 0}.el-table .warning-row{background:#fdf5e6}.el-table .success-row{background:#f0f9eb}.demo-table .name-wrapper{display:inline-block}.demo-table .demo-table-expand label{width:90px;color:#99a9bf}.demo-table .demo-table-expand .el-form-item{margin-right:0;margin-bottom:0;width:50%}.demo-block.demo-tag .el-tag+.el-tag{margin-left:10px}.demo-block.demo-tag .button-new-tag{margin-left:10px;height:32px;line-height:30px;padding-top:0;padding-bottom:0}.demo-block.demo-tag .input-new-tag{width:90px;margin-left:10px;vertical-align:bottom}.demo-block.demo-tag .tag-group{display:flex;align-items:center}.demo-block.demo-tag .tag-group__title{width:45px;font-size:14px;color:#606266}.demo-block.demo-tag .tag-group+.tag-group{margin-top:10px}.demo-block .el-date-editor+.el-date-editor{margin-left:10px}.demo-timeline .source .radio{margin-bottom:20px}.demo-timeline .source .radio .el-radio-group{margin-left:20px}.demo-tooltip .el-tooltip+.el-tooltip{margin-left:15px}.demo-tooltip .box{width:400px}.demo-tooltip .box .top{text-align:center}.demo-tooltip .box .left{float:left;width:60px}.demo-tooltip .box .right{float:right;width:60px}.demo-tooltip .box .bottom{clear:both;text-align:center}.demo-tooltip .box .item{margin:4px}.demo-tooltip .box .left .el-tooltip__popper,.demo-tooltip .box .right .el-tooltip__popper{padding:8px 10px}.demo-tooltip .box .el-tooltip{margin-left:0}.demo-transition .transition-box{margin-bottom:10px;width:200px;height:100px;border-radius:4px;background-color:#409eff;text-align:center;color:#fff;padding:40px 20px;margin-right:20px;box-sizing:border-box}.demo-transfer .transfer-footer{margin-left:15px;padding:6px 5px}.demo-tree .leaf{width:20px;background:#ddd}.demo-tree .folder{width:20px;background:#888}.demo-tree .buttons,.demo-tree .filter-tree{margin-top:20px}.demo-tree .custom-tree-container{display:flex;margin:-24px}.demo-tree .block{flex:1;padding:8px 24px 24px}.demo-tree .block:first-child{border-right:1px solid #eff2f6}.demo-tree .block>p{text-align:center;margin:0;line-height:4}.demo-tree .custom-tree-node{flex:1;display:flex;align-items:center;justify-content:space-between;font-size:14px;padding-right:8px}.demo-typo-size .color-dark-light{color:#99a9bf}.demo-term-box img{width:24%;margin:0 4% 20px 0}.lineH-left{display:inline-block;height:80px}.lineH-right{display:inline-block;list-style:none;padding:0 0 0 90px;margin:0;vertical-align:top}.lineH-right li{font-size:13px;color:#666;height:20px;line-height:20px}.lineH-right li span{padding-left:40px}.upload-tip{color:#8492a6;font-size:12px;margin-top:7px}.demo-block{margin-bottom:24px}.demo-block .upload-demo{width:360px}.demo-block .avatar-uploader .el-upload{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.demo-block .avatar-uploader .el-upload:focus,.demo-block .avatar-uploader .el-upload:hover{border-color:#409eff}.demo-block .avatar-uploader .avatar-uploader-icon{font-size:28px;color:#8c939d;width:178px;height:178px;line-height:178px;text-align:center}.demo-block .avatar-uploader .avatar{width:178px;height:178px;display:block}.demo-divider-container-1{display:inline-block;width:33%}.demo-divider-container-2{display:inline-block;width:50%}@keyframes dot{0%{width:0;margin-right:1em}to{width:1em;margin-right:0}}.demo-image .block,.demo-image__error .block,.demo-image__placeholder .block{padding:30px 0;text-align:center;border-right:1px solid #eff2f6;display:inline-block;width:20%;box-sizing:border-box;vertical-align:top}.demo-image .block:last-child,.demo-image__error .block:last-child,.demo-image__placeholder .block:last-child{border-right:none}.demo-image .demonstration,.demo-image__error .demonstration,.demo-image__placeholder .demonstration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px}.demo-image__error .block,.demo-image__placeholder .block{width:49%}.demo-image__error .el-image,.demo-image__placeholder .el-image{width:300px;height:200px}.demo-image__error .image-slot,.demo-image__placeholder .image-slot{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:#f5f7fa;color:#909399;font-size:14px}.demo-image__placeholder .dot{animation:dot 2s steps(3,start) infinite;overflow:hidden}.demo-image__error .image-slot{font-size:30px}.demo-image__lazy{height:400px;overflow-y:auto}.demo-image__lazy .el-image{display:block;min-height:200px;margin-bottom:10px}.demo-image__lazy .el-image:last-child{margin-bottom:0}.infinite-list{height:300px;padding:0;margin:0;list-style:none}.infinite-list .infinite-list-item{display:flex;align-items:center;justify-content:center;height:50px;background:#e8f3fe;margin:10px;color:#7dbcfc}.infinite-list .infinite-list-item+.list-item{margin-top:10px}.infinite-list-wrapper{height:300px;text-align:center}.infinite-list-wrapper .list{padding:0;margin:0;list-style:none}.infinite-list-wrapper .list-item{display:flex;align-items:center;justify-content:center;height:50px;background:#fff6f6;color:#ff8484}.infinite-list-wrapper .list-item+.list-item{margin-top:10px}.demo-avatar.demo-basic{text-align:center}.demo-avatar.demo-basic .demo-basic--circle,.demo-avatar.demo-basic .demo-basic--square{display:flex;justify-content:space-between;align-items:center}.demo-avatar.demo-basic .demo-basic--circle .block,.demo-avatar.demo-basic .demo-basic--square .block{flex:1}.demo-avatar.demo-basic .demo-basic--circle .block:not(:last-child),.demo-avatar.demo-basic .demo-basic--square .block:not(:last-child){border-right:1px solid rgba(224,230,237,.5)}.demo-avatar .sub-title{margin-bottom:10px;font-size:14px;color:#8492a6}.demo-avatar .el-col:not(:last-child){border-right:1px solid rgba(224,230,237,.5)}.demo-avatar .demo-type{display:flex}.demo-avatar .demo-type>div{flex:1;text-align:center}.demo-avatar .demo-type>div:not(:last-child){border-right:1px solid rgba(224,230,237,.5)}.demo-avatar .demo-fit{display:flex;text-align:center;justify-content:space-between}.demo-avatar .demo-fit .block{flex:1;display:flex;flex-direction:column;flex-grow:0}.demo-avatar .demo-fit .title{margin-bottom:10px;font-size:14px;color:#8492a6}.demo-drawer__content{display:flex;flex-direction:column;height:100%}.demo-drawer__content form{flex:1}.demo-drawer__footer{display:flex}.demo-drawer__footer button{flex:1}.el-drawer__body{padding:20px}.demo-block.demo-skeleton .el-card{margin-bottom:16px}.demo-block.demo-skeleton .card-header{display:flex;justify-content:space-between;align-items:center}.demo-block.demo-skeleton .time{font-size:13px;color:#999}.demo-block.demo-skeleton .bottom{margin-top:13px;line-height:12px}.demo-block.demo-skeleton .button{padding:0;min-height:auto}.demo-block.demo-skeleton .image{width:100%;display:block}.demo-block.demo-skeleton .image.multi-content{width:400px;height:267px}.demo-block.demo-skeleton .clearfix:after,.demo-block.demo-skeleton .clearfix:before{display:table;content:""}.demo-block.demo-skeleton .clearfix:after{clear:both}.demo-block.demo-descriptions .margin-top{margin-top:20px}.demo-block.demo-descriptions .my-label{background:#e1f3d8}.demo-block.demo-descriptions .my-content{background:#fde2e2}body,html{margin:0;padding:0;height:100%;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,SimSun,sans-serif;font-weight:400;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent}body.is-component,html.is-component{overflow:hidden}#app{height:100%}#app.is-component{overflow-y:hidden}#app.is-component .main-cnt{padding:0;margin-top:0;height:100%;min-height:auto}#app.is-component .headerWrapper{position:fixed;width:100%;left:0;top:0;z-index:1500}#app.is-component .headerWrapper .container{padding:0}a{color:#409eff;text-decoration:none}code{background-color:#f9fafc;padding:0 4px;border:1px solid #eaeefb;border-radius:4px}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;color:inherit}.hljs{line-height:1.8;font-family:Menlo,Monaco,Consolas,Courier,monospace;font-size:12px;padding:18px 24px;background-color:#fafafa;border:1px solid #eaeefb;margin-bottom:25px;border-radius:4px;-webkit-font-smoothing:auto}.main-cnt{margin-top:-80px;padding:80px 0 340px;box-sizing:border-box;min-height:100%}.container,.page-container{width:1140px;padding:0;margin:0 auto}.page-container{padding-top:55px}.page-container h2{font-size:28px;color:#1f2d3d;margin:0}.page-container h3{font-size:22px}.page-container h2,.page-container h3,.page-container h4,.page-container h5{font-weight:400;color:#1f2f3d}.page-container h2:hover a,.page-container h3:hover a,.page-container h4:hover a,.page-container h5:hover a{opacity:.4}.page-container h2 a,.page-container h3 a,.page-container h4 a,.page-container h5 a{float:left;margin-left:-20px;opacity:0;cursor:pointer}.page-container h2 a:hover,.page-container h3 a:hover,.page-container h4 a:hover,.page-container h5 a:hover{opacity:.4}.page-container p{font-size:14px;color:#5e6d82;line-height:1.5em}.page-container .tip{padding:8px 16px;background-color:#ecf8ff;border-radius:4px;border-left:5px solid #50bfff;margin:20px 0}.page-container .tip code{background-color:hsla(0,0%,100%,.7);color:#445368}.page-container .warning{padding:8px 16px;background-color:#fff6f7;border-radius:4px;border-left:5px solid #fe6c6f;margin:20px 0}.page-container .warning code{background-color:hsla(0,0%,100%,.7);color:#445368}.demo{margin:20px 0}@media (max-width:1140px){.container,.page-container{width:100%}}@media (max-width:768px){.container,.page-container{padding:0 20px}#app.is-component .headerWrapper .container{padding:0 12px}}@font-face{font-family:icomoon;src:url(data:application/vnd.ms-fontobject;base64,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);src:url(data:application/vnd.ms-fontobject;base64,SAgAAKQHAAABAAIAAAAAAAAAAAAAAAAAAAABAJABAAAAAExQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAa7522AAAAAAAAAAAAAAAAAAAAAAAAA4AaQBjAG8AbQBvAG8AbgAAAA4AUgBlAGcAdQBsAGEAcgAAABYAVgBlAHIAcwBpAG8AbgAgADEALgAwAAAADgBpAGMAbwBtAG8AbwBuAAAAAAAAAQAAAAsAgAADADBPUy8yDxIFxwAAALwAAABgY21hcBdW0ooAAAEcAAAAVGdhc3AAAAAQAAABcAAAAAhnbHlmx3GYOgAAAXgAAAPUaGVhZArUIjUAAAVMAAAANmhoZWEHwgPJAAAFhAAAACRobXR4FgAAAAAABagAAAAgbG9jYQMUAf4AAAXIAAAAEm1heHAADgBvAAAF3AAAACBuYW1lmUoJ+wAABfwAAAGGcG9zdAADAAAAAAeEAAAAIAADA5oBkAAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAEAAAOkDA8D/wABAA8AAQAAAAAEAAAAAAAAAAAAAACAAAAAAAAMAAAADAAAAHAABAAMAAAAcAAMAAQAAABwABAA4AAAACgAIAAIAAgABACDpA//9//8AAAAAACDpAP/9//8AAf/jFwQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAUAAP/ABAADwAATACcANQBDAFEAABM0PgIzMh4CFRQOAiMiLgIlNC4CIyIOAhUUHgIzMj4CJTQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNQEiBhUUFjMhMjY1NCYjAFCLu2pqu4tQUIu7amq7i1ADs0R2n1pan3ZERHafWlqfdkT9cx4WFR4eFRYeAU0eFRYeHhYVHv72ERgYEQEuERgYEQHAaruLUFCLu2pqu4tQUIu7alqfdkREdp9aWp92RER2n+cVHh4VMxYeHhYzFR4eFTMWHh4W/wAZEREZGRERGQAAAAQAAP/ABAADwAATACEALwBPAAABIg4CFRQeAjMyPgI1NC4CATQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNRMnLgEjIgYPAQ4BIyImNTQ2Nyc3PgEzMhYXHgEVFAYnAgBqu4tQUIu7amq7i1BQi7v+vB4WFR4eFRYeAU0eFRYeHhYVHkQEKlovMFsqBAEFAhAVBgYBCjJrNTZpMwkKHBMDwFCLu2pqu4tQUIu7amq7i1D+jRUeHhUzFh4eFjMVHh4VMxYeHhb+mwEVFRUVAQEBGBEIDwYDBRgaGRoFEwwTGgYAAAQAAP/ABAADwAATACEALwA9AAAFIi4CNTQ+AjMyHgIVFA4CARUUFjMyNj0BNCYjIgYFFRQWMzI2PQE0JiMiBgEiBhUUFjMhMjY1NCYjAgBqu4tQUIu7amq7i1BQi7v+vB4WFR4eFRYeAU0eFRYeHhYVHv72ERgYEQEuERgYEUBQi7tqaruLUFCLu2pqu4tQAo0zFh4eFjMVHh4VMxYeHhYzFR4e/rgZEREZGRERGQAABAAA/8AEAAPAABMAUABeAGwAAAEiDgIVFB4CMzI+AjU0LgITFAYVDgEVDgMjOAExOAExIi4CJzQmJzQmNS4BNTQ2Nz4BMzIWFzEeATMyNjcxPgEzMhYXHgEVFAYHAzQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNQIAaruLUFCLu2pqu4tQUIu7xwEBARU/TVsyMltNPxUBAQEBAQICBRUMDBUFIHhLS3ggBRUMDBUFAgIBAb4eFRYeHhYVHv6zHhYVHh4VFh4DwFCLu2pqu4tQUIu7amq7i1D9cgICAQECASlCMBsbMEIpAQIBAQICAgYDBQkECwwMCz1MTD0LDAwLBAkFAwYCARsVHh4VMxYeHhYzFR4eFTMWHh4WAAAAAQAAAAAAANh2vmtfDzz1AAsEAAAAAADT2u7cAAAAANPa7twAAP/ABAADwAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAAEAAABAAAAAAAAAAAAAAAAAAAACAQAAAAAAAAAAAAAAAIAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAKABQAHgCQAQIBWgHqAAAAAQAAAAgAbQAFAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=#iefix) format("embedded-opentype"),url(data:font/ttf;base64,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) format("truetype"),url(data:font/woff;base64,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) format("woff"),url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxmb250IGlkPSJpY29tb29uIiBob3Jpei1hZHYteD0iMTAyNCI+PGZvbnQtZmFjZSB1bml0cy1wZXItZW09IjEwMjQiIGFzY2VudD0iOTYwIiBkZXNjZW50PSItNjQiLz48Z2x5cGggaG9yaXotYWR2LXg9IjUxMiIvPjxnbHlwaCB1bmljb2RlPSLupIAiIGdseXBoLW5hbWU9InJhdGUtZmFjZS1vZmYiIGQ9Ik0wIDQ0OGMwIDI4Mi43NjYgMjI5LjIzNCA1MTIgNTEyIDUxMnM1MTItMjI5LjIzNCA1MTItNTEyYzAtMjgyLjc2Ni0yMjkuMjM0LTUxMi01MTItNTEyUzAgMTY1LjIzNCAwIDQ0OHptOTQ3LjIgMGMwIDI0MC4zNTEtMTk0Ljg0OSA0MzUuMi00MzUuMiA0MzUuMlM3Ni44IDY4OC4zNTEgNzYuOCA0NDggMjcxLjY0OSAxMi44IDUxMiAxMi44IDk0Ny4yIDIwNy42NDkgOTQ3LjIgNDQ4ek0yOTQuNCA1ODguODUzQzI5NC40IDYxNy4xIDMxNy4xMjYgNjQwIDM0NS42IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3em0zMzIuOCAwQzYyNy4yIDYxNy4xIDY0OS45MjYgNjQwIDY3OC40IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3ek0zNjEuMTQzIDI4MS42QzMzOC40MzIgMjgxLjYgMzIwIDI2Mi45NjMgMzIwIDI0MHMxOC40MzItNDEuNiA0MS4xNDMtNDEuNmgzMDEuNzE0QzY4NS41NjggMTk4LjQgNzA0IDIxNy4wMzcgNzA0IDI0MHMtMTguNDMyIDQxLjYtNDEuMTQzIDQxLjZIMzYxLjE0M3oiLz48Z2x5cGggdW5pY29kZT0i7qSBIiBnbHlwaC1uYW1lPSJyYXRlLWZhY2UtMSIgZD0iTTUxMi4wMDEgOTYwQzIyOS4yMyA5NjAgMCA3MzAuNzcgMCA0NDcuOTk4IDAgMTY1LjIyOCAyMjkuMjMtNjQgNTEyLjAwMS02NCA3OTQuNzctNjQgMTAyNCAxNjUuMjI3IDEwMjQgNDQ3Ljk5OFM3OTQuNzcgOTYwIDUxMi4wMDEgOTYwek0yOTQuNCA1ODguODUzQzI5NC40IDYxNy4xIDMxNy4xMjYgNjQwIDM0NS42IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3em0zMzIuOCAwQzYyNy4yIDYxNy4xIDY0OS45MjYgNjQwIDY3OC40IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3em02Ny4zMjktNDA3LjY1NmwtMy40MjIgMS4yMTZjLTU2LjE1IDI3Ljg3Mi0xMTYuMzg4IDQyLjA0Ny0xNzguODgyIDQyLjA0Ny02NC41NTYgMC0xMjUuNjExLTE0LjMxNi0xODEuNTE1LTQyLjQ1bC0zLjM4Mi0xLjEzMmMtMi4xMDItLjYyOC00Ljk0NS0xLjUyOS04LjQ4OS0xLjUyOS0yMC41NTQgMC0zNy4yMzkgMTguMjktMzcuMjM5IDQwLjczNCAwIDEwLjY1NSA0LjU3MSAyMS4zNjEgMTIuMTE0IDI5LjM5OWwtLjQ1NiAyLjQ4MyA5LjUxNiA0LjY5OGM2Ni43NCAzMy4xMDQgMTM5LjMzNiA1MC41MzcgMjA5LjkwNyA1MC41MzcgNzEuODg5IDAgMTQyLjMzNi0xNi45ODQgMjEwLjMxNC01MC45NDggMTEuOTQzLTcuMTgxIDE5LjQwNS0yMC45NTMgMTkuNDA1LTM1LjkwMyAwLTI2LjMyOC0yMS43MS00Ny45NTgtNDcuODcxLTM5LjE1M3oiLz48Z2x5cGggdW5pY29kZT0i7qSCIiBnbHlwaC1uYW1lPSJyYXRlLWZhY2UtMiIgZD0iTTUxMi02NEMyMjkuMjM0LTY0IDAgMTY1LjIzNCAwIDQ0OHMyMjkuMjM0IDUxMiA1MTIgNTEyYzI4Mi43NjYgMCA1MTItMjI5LjIzNCA1MTItNTEyUzc5NC43NjYtNjQgNTEyLTY0ek0yOTQuNCA1ODguODUzdi01MS4zMDdjMC0yOC40ODIgMjIuOTIzLTUxLjE0NyA1MS4yLTUxLjE0NyAyOC40NzQgMCA1MS4yIDIyLjg5OSA1MS4yIDUxLjE0N3Y1MS4zMDdjMCAyOC40ODItMjIuOTIzIDUxLjE0Ny01MS4yIDUxLjE0Ny0yOC40NzQgMC01MS4yLTIyLjg5OS01MS4yLTUxLjE0N3ptMzMyLjggMHYtNTEuMzA3YzAtMjguNDgyIDIyLjkyMy01MS4xNDcgNTEuMi01MS4xNDcgMjguNDc0IDAgNTEuMiAyMi44OTkgNTEuMiA1MS4xNDd2NTEuMzA3YzAgMjguNDgyLTIyLjkyMyA1MS4xNDctNTEuMiA1MS4xNDctMjguNDc0IDAtNTEuMi0yMi44OTktNTEuMi01MS4xNDd6TTM2MS4xNDMgMjgxLjZDMzM4LjQzMiAyODEuNiAzMjAgMjYyLjk2MyAzMjAgMjQwczE4LjQzMi00MS42IDQxLjE0My00MS42aDMwMS43MTRDNjg1LjU2OCAxOTguNCA3MDQgMjE3LjAzNyA3MDQgMjQwcy0xOC40MzIgNDEuNi00MS4xNDMgNDEuNkgzNjEuMTQzeiIvPjxnbHlwaCB1bmljb2RlPSLupIMiIGdseXBoLW5hbWU9InJhdGUtZmFjZS0zIiBkPSJNNTEyLjAwMSA5NjBDMjI5LjIzMSA5NjAgMCA3MzAuNzcgMCA0NDguMDAxUzIyOS4yMy02NCA1MTIuMDAxLTY0Qzc5NC43NzEtNjQgMTAyNCAxNjUuMjMgMTAyNCA0NDcuOTk5Uzc5NC43NzEgOTYwIDUxMi4wMDEgOTYwem0zMDUuNDk0LTY1NC40MzVhNDAuNDA2IDQwLjQwNiAwIDAgMC0xLjU2OS00LjM1IDQwLjg1IDQwLjg1IDAgMCAwLTIuMzE3LTQuNTU2Qzc1Ny45NzggMTg5LjA0NiA2NDQuMDkxIDExNS4yIDUxMi4yODYgMTE1LjJsLS4yODYuMDAyLS4yODYtLjAwMmMtMTMxLjgwNCAwLTI0NS42OTMgNzMuODQ1LTMwMS4zMjMgMTgxLjQ1OWE0MC44NSA0MC44NSAwIDAgMC0yLjMxNyA0LjU1NiA0MC4zMjggNDAuMzI4IDAgMCAwLTEuNTY5IDQuMzUgNDAuMzE3IDQwLjMxNyAwIDAgMC0xLjcwNSAxMS41OTcgNDAuMzE0IDQwLjMxNCAwIDAgMCA0LjM3MiAxOC4yODJjNi44OTcgMTMuNjAxIDIxLjIzOSAyMi45NTUgMzcuODIyIDIyLjk1NXMzMC45MjctOS4zNTUgMzcuODIzLTIyLjk1NWguNjc2QzMyNi45MDQgMjUzLjk5MSA0MTIuNjI0IDE5Ny45IDUxMiAxOTcuNzkyYzk5LjM3NS4xMDggMTg1LjA5NSA1Ni4yIDIyNi41MDcgMTM3LjY1MmguNjc2YzYuODk3IDEzLjYwMSAyMS4yMzkgMjIuOTU1IDM3LjgyMyAyMi45NTVzMzAuOTI3LTkuMzU1IDM3LjgyMi0yMi45NTVhNDAuMjk4IDQwLjI5OCAwIDAgMCA0LjM3Mi0xOC4yODJjMC00LjAyOS0uNjAyLTcuOTE4LTEuNzA1LTExLjU5N3pNNjI3LjIgNTg4Ljg1M0M2MjcuMiA2MTcuMSA2NDkuOTI2IDY0MCA2NzguNCA2NDBjMjguMjc3IDAgNTEuMi0yMi42NjQgNTEuMi01MS4xNDd2LTUxLjMwN2MwLTI4LjI0Ny0yMi43MjYtNTEuMTQ3LTUxLjItNTEuMTQ3LTI4LjI3NyAwLTUxLjIgMjIuNjY0LTUxLjIgNTEuMTQ3djUxLjMwN3ptLTMzMi44IDBDMjk0LjQgNjE3LjEgMzE3LjEyNiA2NDAgMzQ1LjYgNjQwYzI4LjI3NyAwIDUxLjItMjIuNjY0IDUxLjItNTEuMTQ3di01MS4zMDdjMC0yOC4yNDctMjIuNzI2LTUxLjE0Ny01MS4yLTUxLjE0Ny0yOC4yNzcgMC01MS4yIDIyLjY2NC01MS4yIDUxLjE0N3Y1MS4zMDd6Ii8+PC9mb250PjwvZGVmcz48L3N2Zz4=) format("svg");font-weight:400;font-style:normal}[class*=" icon-"],[class^=icon-]{font-family:icomoon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-rate-face-off:before{content:"\e900"}.icon-rate-face-1:before{content:"\e901"}.icon-rate-face-2:before{content:"\e902"}.icon-rate-face-3:before{content:"\e903"} \ No newline at end of file diff --git a/ruoyi-ui/src/views/project/surProject/index.vue b/ruoyi-ui/src/views/project/surProject/index.vue index 580b3f57..65362f45 100644 --- a/ruoyi-ui/src/views/project/surProject/index.vue +++ b/ruoyi-ui/src/views/project/surProject/index.vue @@ -373,7 +373,7 @@ 'project:materialSeal:list', 'project:projectDeptWroks:list', 'project:surProjectAttendance:add', - 'project:videoConfig:list', + 'video:videoConfig:list', 'project:surProject:remove', ]" > @@ -450,7 +450,7 @@ 视频配置 新增 @@ -74,7 +74,7 @@ size="mini" :disabled="single" @click="handleUpdate" - v-hasPermi="['project:videoConfig:edit']" + v-hasPermi="['video:videoConfig:edit']" >修改 @@ -86,7 +86,7 @@ size="mini" :disabled="multiple" @click="handleDelete" - v-hasPermi="['project:videoConfig:remove']" + v-hasPermi="['video:videoConfig:remove']" >删除 @@ -97,7 +97,7 @@ icon="el-icon-download" size="mini" @click="handleExport" - v-hasPermi="['project:videoConfig:export']" + v-hasPermi="['video:videoConfig:export']" >导出 @@ -140,7 +140,19 @@ show-overflow-tooltip /> - + + + + @@ -285,6 +297,13 @@ 取 消 + + @@ -295,10 +314,15 @@ import { delVideoConfig, addVideoConfig, updateVideoConfig, -} from "@/api/project/videoConfig"; + updateVideoConfigSort, +} from "@/api/video/videoConfig"; +import videoPlayDrawer from "@/views/video/videoConfig/videoPlayDrawer"; export default { name: "VideoConfig", + components: { + videoPlayDrawer, + }, dicts: ["project_video_type", "project_video_signal_state", "sys_common_isdel"], data() { return { @@ -366,6 +390,10 @@ export default { { maxlength: 200, message: "备注最多200字符", trigger: "blur" }, ], }, + formData: { + videoDvrNumber: null, + }, + videoPlayDrawerVisible: false, }; }, created() { @@ -520,13 +548,28 @@ export default { /** 导出按钮操作 */ handleExport() { this.download( - "project/videoConfig/export", + "video/videoConfig/export", { ...this.queryParams, }, `videoConfig_${new Date().getTime()}.xlsx` ); }, + //项目排序控制 + setVideoSort(row, val) { + let param = { + id: row.id, + videoSort: val, + }; + updateVideoConfigSort(param).then((response) => { + this.$modal.msgSuccess("修改成功"); + this.getList(); + }); + }, + handlePlay(row) { + this.formData.videoDvrNumber = row.videoDvrNumber; + this.videoPlayDrawerVisible = true; + }, }, }; diff --git a/ruoyi-ui/src/views/project/videoConfig/videoConfigDrawer.vue b/ruoyi-ui/src/views/video/videoConfig/videoConfigDrawer.vue similarity index 97% rename from ruoyi-ui/src/views/project/videoConfig/videoConfigDrawer.vue rename to ruoyi-ui/src/views/video/videoConfig/videoConfigDrawer.vue index 53c1dd27..6aebcdf3 100644 --- a/ruoyi-ui/src/views/project/videoConfig/videoConfigDrawer.vue +++ b/ruoyi-ui/src/views/video/videoConfig/videoConfigDrawer.vue @@ -22,7 +22,7 @@ icon="el-icon-plus" size="mini" @click="handleAdd" - v-hasPermi="['project:videoConfig:add']" + v-hasPermi="['video:videoConfig:add']" >新增 @@ -34,7 +34,7 @@ size="mini" :disabled="single" @click="handleUpdate" - v-hasPermi="['project:videoConfig:edit']" + v-hasPermi="['video:videoConfig:edit']" >修改 @@ -46,7 +46,7 @@ size="mini" :disabled="multiple" @click="handleDelete" - v-hasPermi="['project:videoConfig:remove']" + v-hasPermi="['video:videoConfig:remove']" >删除 @@ -57,7 +57,7 @@ icon="el-icon-download" size="mini" @click="handleExport" - v-hasPermi="['project:videoConfig:export']" + v-hasPermi="['video:videoConfig:export']" >导出 --> @@ -96,7 +96,7 @@ show-overflow-tooltip /> - + @@ -228,7 +228,7 @@ import { delVideoConfig, addVideoConfig, updateVideoConfig, -} from "@/api/project/videoConfig"; +} from "@/api/video/videoConfig"; export default { name: "VideoConfig", @@ -454,7 +454,7 @@ export default { /** 导出按钮操作 */ handleExport() { this.download( - "project/videoConfig/export", + "video/videoConfig/export", { ...this.queryParams, }, diff --git a/ruoyi-ui/src/views/video/videoConfig/videoPlayDrawer.vue b/ruoyi-ui/src/views/video/videoConfig/videoPlayDrawer.vue new file mode 100644 index 00000000..ba5a7805 --- /dev/null +++ b/ruoyi-ui/src/views/video/videoConfig/videoPlayDrawer.vue @@ -0,0 +1,108 @@ + + + + diff --git a/ruoyi-ui/src/views/video/videoList/index.vue b/ruoyi-ui/src/views/video/videoList/index.vue new file mode 100644 index 00000000..567404a8 --- /dev/null +++ b/ruoyi-ui/src/views/video/videoList/index.vue @@ -0,0 +1,156 @@ + + + + diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/controller/SurProjectVideoConfigController.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/controller/SurProjectVideoConfigController.java similarity index 59% rename from yanzhu-jh/src/main/java/com/yanzhu/jh/project/controller/SurProjectVideoConfigController.java rename to yanzhu-jh/src/main/java/com/yanzhu/jh/video/controller/SurProjectVideoConfigController.java index 843e0675..50e61396 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/controller/SurProjectVideoConfigController.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/controller/SurProjectVideoConfigController.java @@ -1,29 +1,23 @@ -package com.yanzhu.jh.project.controller; +package com.yanzhu.jh.video.controller; -import java.util.List; -import javax.servlet.http.HttpServletResponse; - -import com.ruoyi.common.core.text.Convert; -import com.ruoyi.common.enums.SysRoleEnum; -import com.ruoyi.system.service.ISysDeptService; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.enums.BusinessType; -import com.yanzhu.jh.project.domain.SurProjectVideoConfig; -import com.yanzhu.jh.project.service.ISurProjectVideoConfigService; -import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.enums.SysRoleEnum; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.service.ISysDeptService; +import com.yanzhu.jh.video.domain.SurProjectVideoConfig; +import com.yanzhu.jh.video.domain.SurProjectVideoPassage; +import com.yanzhu.jh.video.service.ISurProjectVideoConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * 视频配置Controller @@ -32,7 +26,7 @@ import com.ruoyi.common.core.page.TableDataInfo; * @date 2023-08-25 */ @RestController -@RequestMapping("/project/videoConfig") +@RequestMapping("/video/videoConfig") public class SurProjectVideoConfigController extends BaseController { @Autowired @@ -44,7 +38,7 @@ public class SurProjectVideoConfigController extends BaseController /** * 查询视频配置列表 */ - @PreAuthorize("@ss.hasPermi('project:videoConfig:list')") + @PreAuthorize("@ss.hasPermi('video:videoConfig:list')") @GetMapping("/list") public TableDataInfo list(SurProjectVideoConfig surProjectVideoConfig) { @@ -60,10 +54,28 @@ public class SurProjectVideoConfigController extends BaseController return getDataTable(list); } + /** + * 查询视频配置列表 + */ + @PreAuthorize("@ss.hasPermi('video:videoConfig:list')") + @GetMapping("/listView") + public AjaxResult listView(SurProjectVideoConfig surProjectVideoConfig) + { + surProjectVideoConfig.setNowRole(Convert.toStr(getUserFirstRole())); + if(SysRoleEnum.ZGS.getCode().equals(surProjectVideoConfig.getNowRole())){ + surProjectVideoConfig.setNowDept(Convert.toStr(sysDeptService.getZGSDeptId(getDeptId()))); + }else{ + surProjectVideoConfig.setNowDept(Convert.toStr(getDeptId())); + } + surProjectVideoConfig.setNowUser(Convert.toStr(getUserId())); + List list = surProjectVideoConfigService.selectSurProjectVideoConfigList(surProjectVideoConfig); + return success(list); + } + /** * 导出视频配置列表 */ - @PreAuthorize("@ss.hasPermi('project:videoConfig:export')") + @PreAuthorize("@ss.hasPermi('video:videoConfig:export')") @Log(title = "视频配置", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, SurProjectVideoConfig surProjectVideoConfig) @@ -83,7 +95,7 @@ public class SurProjectVideoConfigController extends BaseController /** * 获取视频配置详细信息 */ - @PreAuthorize("@ss.hasPermi('project:videoConfig:query')") + @PreAuthorize("@ss.hasPermi('video:videoConfig:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { @@ -93,7 +105,7 @@ public class SurProjectVideoConfigController extends BaseController /** * 新增视频配置 */ - @PreAuthorize("@ss.hasPermi('project:videoConfig:add')") + @PreAuthorize("@ss.hasPermi('video:videoConfig:add')") @Log(title = "视频配置", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody SurProjectVideoConfig surProjectVideoConfig) @@ -104,7 +116,7 @@ public class SurProjectVideoConfigController extends BaseController /** * 修改视频配置 */ - @PreAuthorize("@ss.hasPermi('project:videoConfig:edit')") + @PreAuthorize("@ss.hasPermi('video:videoConfig:edit')") @Log(title = "视频配置", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody SurProjectVideoConfig surProjectVideoConfig) @@ -112,14 +124,45 @@ public class SurProjectVideoConfigController extends BaseController return toAjax(surProjectVideoConfigService.updateSurProjectVideoConfig(surProjectVideoConfig)); } + /** + * 修改视频配置 + */ + @PreAuthorize("@ss.hasPermi('video:videoConfig:edit')") + @Log(title = "视频配置排序", businessType = BusinessType.UPDATE) + @PostMapping("/updateVideoConfigSort") + public AjaxResult updateVideoConfigSort(@RequestBody SurProjectVideoConfig surProjectVideoConfig) + { + return toAjax(surProjectVideoConfigService.updateVideoConfig(surProjectVideoConfig)); + } + /** * 删除视频配置 */ - @PreAuthorize("@ss.hasPermi('project:videoConfig:remove')") + @PreAuthorize("@ss.hasPermi('video:videoConfig:remove')") @Log(title = "视频配置", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(surProjectVideoConfigService.deleteSurProjectVideoConfigByIds(ids)); } + + /** + * 修改视频通道状态 + */ + @PreAuthorize("@ss.hasPermi('video:videoConfig:query')") + @PostMapping("/editPassageState") + public AjaxResult editPassageState(SurProjectVideoPassage SurProjectVideoPassage) + { + return success(surProjectVideoConfigService.editPassageState(SurProjectVideoPassage)); + } + + /** + * 获取视频配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('video:videoConfig:query')") + @GetMapping(value = "/getVideoPassage/{videoDvrNumberd}") + public AjaxResult getVideoPassage(@PathVariable("videoDvrNumberd") String videoDvrNumberd) + { + return success(surProjectVideoConfigService.getVideoPassage(videoDvrNumberd)); + } } diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/domain/SurProjectVideoConfig.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/domain/SurProjectVideoConfig.java similarity index 89% rename from yanzhu-jh/src/main/java/com/yanzhu/jh/project/domain/SurProjectVideoConfig.java rename to yanzhu-jh/src/main/java/com/yanzhu/jh/video/domain/SurProjectVideoConfig.java index 72136b3a..ccf48c30 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/domain/SurProjectVideoConfig.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/domain/SurProjectVideoConfig.java @@ -1,10 +1,11 @@ -package com.yanzhu.jh.project.domain; +package com.yanzhu.jh.video.domain; -import java.util.List; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.List; /** * 视频配置对象 sur_project_video_config @@ -43,6 +44,14 @@ public class SurProjectVideoConfig extends BaseEntity @Excel(name = "通道数量") private int videoPassageCount; + /** 通道连通数量 */ + @Excel(name = "通道连通数量") + private int passagePassCount; + + /** 设备排序 */ + @Excel(name = "设备排序") + private int videoSort; + /** 通信类型 */ @Excel(name = "通信类型") private String signalType; @@ -182,6 +191,22 @@ public class SurProjectVideoConfig extends BaseEntity this.videoName = videoName; } + public int getPassagePassCount() { + return passagePassCount; + } + + public void setPassagePassCount(int passagePassCount) { + this.passagePassCount = passagePassCount; + } + + public int getVideoSort() { + return videoSort; + } + + public void setVideoSort(int videoSort) { + this.videoSort = videoSort; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/domain/SurProjectVideoPassage.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/domain/SurProjectVideoPassage.java similarity index 86% rename from yanzhu-jh/src/main/java/com/yanzhu/jh/project/domain/SurProjectVideoPassage.java rename to yanzhu-jh/src/main/java/com/yanzhu/jh/video/domain/SurProjectVideoPassage.java index ca1f79c3..11c7c8a0 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/domain/SurProjectVideoPassage.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/domain/SurProjectVideoPassage.java @@ -1,9 +1,9 @@ -package com.yanzhu.jh.project.domain; +package com.yanzhu.jh.video.domain; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; /** * 视频通道对象 sur_project_video_passage @@ -34,6 +34,10 @@ public class SurProjectVideoPassage extends BaseEntity @Excel(name = "视频通道") private Long passageValue; + /** 视频通道状态 */ + @Excel(name = "视频通道状态") + private String passageState; + public void setId(Long id) { this.id = id; @@ -80,6 +84,14 @@ public class SurProjectVideoPassage extends BaseEntity return passageValue; } + public String getPassageState() { + return passageState; + } + + public void setPassageState(String passageState) { + this.passageState = passageState; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/mapper/SurProjectVideoConfigMapper.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/mapper/SurProjectVideoConfigMapper.java similarity index 77% rename from yanzhu-jh/src/main/java/com/yanzhu/jh/project/mapper/SurProjectVideoConfigMapper.java rename to yanzhu-jh/src/main/java/com/yanzhu/jh/video/mapper/SurProjectVideoConfigMapper.java index f458ef7a..7608eb8d 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/mapper/SurProjectVideoConfigMapper.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/mapper/SurProjectVideoConfigMapper.java @@ -1,8 +1,9 @@ -package com.yanzhu.jh.project.mapper; +package com.yanzhu.jh.video.mapper; + +import com.yanzhu.jh.video.domain.SurProjectVideoConfig; +import com.yanzhu.jh.video.domain.SurProjectVideoPassage; import java.util.List; -import com.yanzhu.jh.project.domain.SurProjectVideoConfig; -import com.yanzhu.jh.project.domain.SurProjectVideoPassage; /** * 视频配置Mapper接口 @@ -20,6 +21,14 @@ public interface SurProjectVideoConfigMapper */ public SurProjectVideoConfig selectSurProjectVideoConfigById(Long id); + /** + * 查询视频配置 + * + * @param videoDvrNumber 设备编号 + * @return 视频配置 + */ + public SurProjectVideoConfig selectSurProjectVideoConfigByDvrNumber(String videoDvrNumber); + /** * 查询视频配置列表 * @@ -84,4 +93,12 @@ public interface SurProjectVideoConfigMapper * @return 结果 */ public int deleteSurProjectVideoPassageByVideoId(Long id); + + /** + * 修改视频通道状态 + * + * @param surProjectVideoPassage 视频通道 + * @return 结果 + */ + public int updateProjectVideoPassageState(SurProjectVideoPassage surProjectVideoPassage); } diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/service/ISurProjectVideoConfigService.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/ISurProjectVideoConfigService.java similarity index 64% rename from yanzhu-jh/src/main/java/com/yanzhu/jh/project/service/ISurProjectVideoConfigService.java rename to yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/ISurProjectVideoConfigService.java index c4d1c51b..bb580f32 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/service/ISurProjectVideoConfigService.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/ISurProjectVideoConfigService.java @@ -1,7 +1,9 @@ -package com.yanzhu.jh.project.service; +package com.yanzhu.jh.video.service; + +import com.yanzhu.jh.video.domain.SurProjectVideoConfig; +import com.yanzhu.jh.video.domain.SurProjectVideoPassage; import java.util.List; -import com.yanzhu.jh.project.domain.SurProjectVideoConfig; /** * 视频配置Service接口 @@ -43,6 +45,15 @@ public interface ISurProjectVideoConfigService */ public int updateSurProjectVideoConfig(SurProjectVideoConfig surProjectVideoConfig); + + /** + * 修改视频配置 + * + * @param surProjectVideoConfig 视频配置 + * @return 结果 + */ + public int updateVideoConfig(SurProjectVideoConfig surProjectVideoConfig); + /** * 批量删除视频配置 * @@ -58,4 +69,20 @@ public interface ISurProjectVideoConfigService * @return 结果 */ public int deleteSurProjectVideoConfigById(Long id); + + /** + * 修改视频通道状态 + * + * @param SurProjectVideoPassage 视频通道 + * @return 结果 + */ + public int editPassageState(SurProjectVideoPassage SurProjectVideoPassage); + + /** + * 获取设备通道 + * + * @param videoDvrNumberd 设备编号 + * @return 结果 + */ + public List getVideoPassage(String videoDvrNumberd); } diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/service/impl/SurProjectVideoConfigServiceImpl.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/SurProjectVideoConfigServiceImpl.java similarity index 64% rename from yanzhu-jh/src/main/java/com/yanzhu/jh/project/service/impl/SurProjectVideoConfigServiceImpl.java rename to yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/SurProjectVideoConfigServiceImpl.java index 883207c5..e4b0e446 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/project/service/impl/SurProjectVideoConfigServiceImpl.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/SurProjectVideoConfigServiceImpl.java @@ -1,19 +1,20 @@ -package com.yanzhu.jh.project.service.impl; - -import java.util.List; +package com.yanzhu.jh.video.service.impl; import com.ruoyi.common.enums.PublicStateEnum; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.yanzhu.jh.video.domain.SurProjectVideoConfig; +import com.yanzhu.jh.video.domain.SurProjectVideoPassage; +import com.yanzhu.jh.video.mapper.SurProjectVideoConfigMapper; +import com.yanzhu.jh.video.service.ISurProjectVideoConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import com.ruoyi.common.utils.StringUtils; import org.springframework.transaction.annotation.Transactional; -import com.yanzhu.jh.project.domain.SurProjectVideoPassage; -import com.yanzhu.jh.project.mapper.SurProjectVideoConfigMapper; -import com.yanzhu.jh.project.domain.SurProjectVideoConfig; -import com.yanzhu.jh.project.service.ISurProjectVideoConfigService; -import com.ruoyi.common.utils.SecurityUtils; + +import java.util.ArrayList; +import java.util.List; + /** * 视频配置Service业务层处理 * @@ -21,7 +22,7 @@ import com.ruoyi.common.utils.SecurityUtils; * @date 2023-08-25 */ @Service -public class SurProjectVideoConfigServiceImpl implements ISurProjectVideoConfigService +public class SurProjectVideoConfigServiceImpl implements ISurProjectVideoConfigService { @Autowired private SurProjectVideoConfigMapper surProjectVideoConfigMapper; @@ -60,8 +61,11 @@ public class SurProjectVideoConfigServiceImpl implements ISurProjectVideoConfigS @Override public int insertSurProjectVideoConfig(SurProjectVideoConfig surProjectVideoConfig) { + surProjectVideoConfig.setVideoPassageCount(surProjectVideoConfig.getSurProjectVideoPassageList().size()); surProjectVideoConfig.setIsDel(PublicStateEnum.OK.getCode()); + //新增的视频为离线 + surProjectVideoConfig.setSignalState(PublicStateEnum.VIDEO_UNKNOWN.getCode()); surProjectVideoConfig.setCreateBy(SecurityUtils.getUsername()); surProjectVideoConfig.setCreateTime(DateUtils.getNowDate()); int rows = surProjectVideoConfigMapper.insertSurProjectVideoConfig(surProjectVideoConfig); @@ -79,7 +83,9 @@ public class SurProjectVideoConfigServiceImpl implements ISurProjectVideoConfigS @Override public int updateSurProjectVideoConfig(SurProjectVideoConfig surProjectVideoConfig) { - + if(surProjectVideoConfig.getProjectId()==null){ + surProjectVideoConfig.setProjectId(0L); + } surProjectVideoConfig.setVideoPassageCount(surProjectVideoConfig.getSurProjectVideoPassageList().size()); surProjectVideoConfig.setUpdateBy(SecurityUtils.getUsername()); surProjectVideoConfig.setUpdateTime(DateUtils.getNowDate()); @@ -88,6 +94,18 @@ public class SurProjectVideoConfigServiceImpl implements ISurProjectVideoConfigS return surProjectVideoConfigMapper.updateSurProjectVideoConfig(surProjectVideoConfig); } + /** + * 修改视频配置 + * + * @param surProjectVideoConfig 视频配置 + * @return 结果 + */ + @Transactional + @Override + public int updateVideoConfig(SurProjectVideoConfig surProjectVideoConfig){ + return surProjectVideoConfigMapper.updateSurProjectVideoConfig(surProjectVideoConfig); + } + /** * 批量删除视频配置 * @@ -116,6 +134,44 @@ public class SurProjectVideoConfigServiceImpl implements ISurProjectVideoConfigS return surProjectVideoConfigMapper.deleteSurProjectVideoConfigById(id); } + /** + * 修改视频通道状态 + * + * @param SurProjectVideoPassage 视频通道 + * @return 结果 + */ + @Override + @Transactional + public int editPassageState(SurProjectVideoPassage SurProjectVideoPassage) { + surProjectVideoConfigMapper.updateProjectVideoPassageState(SurProjectVideoPassage); + SurProjectVideoConfig surProjectVideoConfig = surProjectVideoConfigMapper.selectSurProjectVideoConfigByDvrNumber(SurProjectVideoPassage.getVideoDvrNumber()); + int res = 0; + for(SurProjectVideoPassage passage:surProjectVideoConfig.getSurProjectVideoPassageList()){ + if(passage.getPassageState().equals(PublicStateEnum.VIDEO_ONLINE.getCode())){ + res++; + } + } + surProjectVideoConfig.setPassagePassCount(res); + //判断设备是否在线,一个通道在线则显示设备在线 + if(res>0){ + surProjectVideoConfig.setSignalState(PublicStateEnum.VIDEO_ONLINE.getCode()); + }else{ + surProjectVideoConfig.setSignalState(PublicStateEnum.VIDEO_OFFLINE.getCode()); + } + surProjectVideoConfigMapper.updateSurProjectVideoConfig(surProjectVideoConfig); + return 1; + } + + /** + * 获取设备通道 + * + * @param videoDvrNumberd 设备编号 + * @return 结果 + */ + public List getVideoPassage(String videoDvrNumberd) { + return surProjectVideoConfigMapper.selectSurProjectVideoConfigByDvrNumber(videoDvrNumberd).getSurProjectVideoPassageList(); + } + /** * 新增视频通道信息 * @@ -132,6 +188,7 @@ public class SurProjectVideoConfigServiceImpl implements ISurProjectVideoConfigS { surProjectVideoPassage.setVideoId(id); surProjectVideoPassage.setVideoDvrNumber(surProjectVideoConfig.getVideoDvrNumber()); + surProjectVideoPassage.setPassageState(PublicStateEnum.VIDEO_UNKNOWN.getCode()); list.add(surProjectVideoPassage); } if (list.size() > 0) diff --git a/yanzhu-jh/src/main/resources/mapper/project/SurProjectVideoConfigMapper.xml b/yanzhu-jh/src/main/resources/mapper/video/SurProjectVideoConfigMapper.xml similarity index 78% rename from yanzhu-jh/src/main/resources/mapper/project/SurProjectVideoConfigMapper.xml rename to yanzhu-jh/src/main/resources/mapper/video/SurProjectVideoConfigMapper.xml index d36c35c2..4568542c 100644 --- a/yanzhu-jh/src/main/resources/mapper/project/SurProjectVideoConfigMapper.xml +++ b/yanzhu-jh/src/main/resources/mapper/video/SurProjectVideoConfigMapper.xml @@ -2,7 +2,7 @@ - + @@ -13,6 +13,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -37,7 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select spvc.id, spvc.project_id, spvc.video_name, spvc.video_only_type, spvc.video_dvr_number, spvc.video_dvr_security, spvc.video_passage_count, spvc.signal_type, spvc.signal_state, spvc.signal_code, spvc.is_del, spvc.create_by, spvc.create_time, spvc.update_by, spvc.update_time, spvc.remark, sp.projectName from sur_project_video_config spvc + select spvc.id, spvc.project_id, spvc.video_name, spvc.video_only_type, spvc.video_dvr_number, spvc.video_dvr_security, spvc.video_passage_count, spvc.passage_pass_count, spvc.video_sort, spvc.signal_type, spvc.signal_state, spvc.signal_code, spvc.is_del, spvc.create_by, spvc.create_time, spvc.update_by, spvc.update_time, spvc.remark, sp.projectName from sur_project_video_config spvc left join sur_project sp on sp.id=spvc.project_id @@ -63,16 +65,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sp.id in (select DISTINCT spui.projectId from sur_project_unit_info spui where spui.unitId = #{nowDept}) and sp.id in (select DISTINCT spu.project_id from sur_project_userinfo spu where spu.user_id = #{nowUser} and spu.is_del=0) + order by spvc.video_sort asc, spvc.video_name + + insert into sur_project_video_config @@ -83,6 +95,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" video_dvr_number, video_dvr_security, video_passage_count, + passage_pass_count, + video_sort, signal_type, signal_state, signal_code, @@ -100,6 +114,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{videoDvrNumber}, #{videoDvrSecurity}, #{videoPassageCount}, + #{passagePassCount}, + #{videoSort}, #{signalType}, #{signalState}, #{signalCode}, @@ -115,12 +131,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update sur_project_video_config - project_id = #{projectId}, + project_id = #{projectId}, + project_id = NULL, video_name = #{videoName}, video_only_type = #{videoOnlyType}, video_dvr_number = #{videoDvrNumber}, video_dvr_security = #{videoDvrSecurity}, video_passage_count = #{videoPassageCount}, + passage_pass_count = #{passagePassCount}, + video_sort = #{videoSort}, signal_type = #{signalType}, signal_state = #{signalState}, signal_code = #{signalCode}, @@ -134,16 +153,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - - delete from sur_project_video_config where id = #{id} - + + update sur_project_video_config set is_del=1 where id = #{id} + - - delete from sur_project_video_config where id in + + update sur_project_video_config set is_del=1 where id in #{id} - + delete from sur_project_video_passage where video_id in @@ -162,4 +181,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ( #{item.id}, #{item.videoId}, #{item.videoDvrNumber}, #{item.passageName}, #{item.passageValue}) + + + update sur_project_video_passage set passage_state=#{passageState} where id = #{id} + + \ No newline at end of file