Browse Source

修改样式

master
douyage 1 month ago
parent
commit
a662f3de77
26 changed files with 408 additions and 147 deletions
  1. +0
    -1
      .env.development
  2. +2
    -3
      .env.htjc6
  3. +1
    -2
      .env.production
  4. +0
    -1
      src/api/videosMonitor/index.js
  5. +138
    -0
      src/assets/styles/ruoyi.scss
  6. +5
    -15
      src/components/Breadcrumb/index.vue
  7. +1
    -47
      src/layout/components/Navbar.vue
  8. +11
    -3
      src/layout/components/Sidebar/index.vue
  9. +2
    -1
      src/router/index.js
  10. +1
    -5
      src/views/administration/administration copy.vue
  11. +1
    -5
      src/views/administration/administration.vue
  12. +0
    -4
      src/views/area/area.vue
  13. +0
    -4
      src/views/area/area_management.vue
  14. +0
    -4
      src/views/basedata/alg/index.vue
  15. +0
    -4
      src/views/basedata/alg/subtype/index.vue
  16. +0
    -4
      src/views/basedata/station/index.vue
  17. +63
    -8
      src/views/cards/patrolPlan/notstart.vue
  18. +1
    -1
      src/views/cards/site_management/algorithm.vue
  19. +38
    -0
      src/views/cards/site_management/components/chooseAlg.vue
  20. +8
    -0
      src/views/cards/site_management/site_management.vue
  21. +13
    -3
      src/views/cards/tasksShow/yearDisplay.vue
  22. +64
    -16
      src/views/equipment/equipment.vue
  23. +0
    -4
      src/views/equipment/equipment_type.vue
  24. +55
    -9
      src/views/video/HistoryPlayback.vue
  25. +2
    -2
      src/views/video/LivePreview.vue
  26. +2
    -1
      src/views/video/components/NvrDeviceTree.vue

+ 0
- 1
.env.development View File

@ -8,7 +8,6 @@ ENV = 'development'
VUE_APP_BASE_API = '/dev-api'
VUE_APP_NVR_API = '/nvr-api'
VUE_APP_DEVICE_TREE_API = 'http://192.168.1.116:18891/app/htjc6/api'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 2
- 3
.env.htjc6 View File

@ -2,9 +2,8 @@ NODE_ENV = 'production'
ENV = 'production'
VUE_APP_TITLE = 智能巡视
VUE_APP_BASE_API = '/prod-api'
VUE_APP_NVR_API = 'http://192.168.1.86:28081'
VUE_APP_DEVICE_TREE_API = 'http://192.168.1.116:18891/app/htjc6/api'
VUE_APP_BASE_API = '/app/htjc6/api'
VUE_APP_NVR_API = '/nvr-api'
VUE_APP_PUBLIC_PATH = '/app/htjc6/'
VUE_APP_OUTPUT_DIR = 'dist/app/htjc6'


+ 1
- 2
.env.production View File

@ -7,5 +7,4 @@ ENV = 'production'
# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
VUE_APP_NVR_API = 'http://192.168.1.86:28081'
VUE_APP_DEVICE_TREE_API = 'http://192.168.1.116:18891/app/htjc6/api'
VUE_APP_NVR_API = '/nvr-api'

+ 0
- 1
src/api/videosMonitor/index.js View File

@ -14,7 +14,6 @@ export function getAreaEqubookTreeSelect(params) {
query.patroldeviceTypeFlag || "ipc"
);
return request({
baseURL: process.env.VUE_APP_DEVICE_TREE_API,
url:
"/basedata/eqpbook/getAreaEqubookTreeSelectForFilter" +
`?patroldeviceName=${patroldeviceName}` +


+ 138
- 0
src/assets/styles/ruoyi.scss View File

@ -698,6 +698,68 @@
background-color: rgba(8, 25, 69, 0.82) !important;
}
/* Consistent single- and multi-select appearance across the application. */
.el-select .el-input__inner {
color: #dcecff !important;
background-color: rgba(27, 42, 94, 0.94) !important;
border-color: #6f95de !important;
}
.el-select .el-input__inner:hover,
.el-select .el-input.is-focus .el-input__inner,
.el-select .el-input__inner:focus {
border-color: #43cfff !important;
}
.el-select-dropdown {
background-color: #0b2351 !important;
border-color: #173f89 !important;
}
.el-select-dropdown .el-scrollbar,
.el-select-dropdown .el-scrollbar__wrap,
.el-select-dropdown .el-scrollbar__view,
.el-select-dropdown .el-select-dropdown__list {
background-color: #0b2351 !important;
}
.el-select-dropdown .el-select-dropdown__item {
color: #dcecff !important;
background-color: transparent !important;
}
.el-select-dropdown .el-select-dropdown__item.hover,
.el-select-dropdown .el-select-dropdown__item:hover {
color: #00ffff !important;
background-color: #002a7f !important;
}
.el-select-dropdown .el-select-dropdown__item.selected {
color: #00ffff !important;
background-color: #002a7f !important;
font-weight: 600;
}
.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {
color: #00ffff !important;
}
.el-select .el-tag {
color: #00ffff !important;
background-color: #002a7f !important;
border-color: #3988ff !important;
}
.el-select .el-tag .el-tag__close {
color: #00ffff !important;
background-color: transparent !important;
}
.el-select .el-tag .el-tag__close:hover {
color: #ffffff !important;
background-color: #002a7f !important;
}
.el-select-dropdown .el-scrollbar,
.el-select-dropdown__wrap,
.el-select-dropdown__list,
@ -730,6 +792,82 @@
border-top-color: #0f124a !important;
}
/* Keep select option containers on the same blue surface as the menu. */
.el-select-dropdown .el-scrollbar,
.el-select-dropdown .el-scrollbar__wrap,
.el-select-dropdown .el-scrollbar__view,
.el-select-dropdown .el-select-dropdown__list {
background-color: #0b2351 !important;
}
.el-select-dropdown[x-placement^="bottom"] .popper__arrow::after {
border-bottom-color: #0b2351 !important;
}
.el-select-dropdown[x-placement^="top"] .popper__arrow::after {
border-top-color: #0b2351 !important;
}
/* Match vue-treeselect controls (including append-to-body menus) to el-select. */
.vue-treeselect__control {
color: #dcecff !important;
background-color: rgba(27, 42, 94, 0.94) !important;
border-color: #6f95de !important;
}
.vue-treeselect--open .vue-treeselect__control {
border-color: #43cfff !important;
}
.vue-treeselect__menu {
color: #dcecff !important;
background: #0b2351 !important;
border-color: #173f89 !important;
}
.vue-treeselect__option,
.vue-treeselect__label,
.vue-treeselect__tip-text {
color: #dcecff !important;
}
.vue-treeselect__option--highlight,
.vue-treeselect--single .vue-treeselect__option--selected,
.vue-treeselect__option:has(.vue-treeselect__checkbox--checked) {
color: #00ffff !important;
background: #002a7f !important;
}
.vue-treeselect__option--highlight .vue-treeselect__label,
.vue-treeselect--single .vue-treeselect__option--selected .vue-treeselect__label,
.vue-treeselect__option:has(.vue-treeselect__checkbox--checked) .vue-treeselect__label {
color: #00ffff !important;
}
.vue-treeselect__checkbox--checked,
.vue-treeselect__checkbox--indeterminate {
background: #002a7f !important;
border-color: #00ffff !important;
}
.vue-treeselect__multi-value-item {
color: #00ffff !important;
background: #002a7f !important;
border-color: #3988ff !important;
}
.vue-treeselect__value-remove {
color: #00ffff !important;
}
.vue-treeselect__placeholder {
color: rgba(220, 236, 255, 0.5) !important;
}
.vue-treeselect__input {
color: #dcecff !important;
}
.splitpanes.default-theme .splitpanes__splitter {
background-color: #0B2567 !important;
border-color: #0B2567 !important;


+ 5
- 15
src/components/Breadcrumb/index.vue View File

@ -45,11 +45,11 @@ export default {
} else {
matched = router.matched.filter(item => item.meta && item.meta.title)
}
//
if (!this.isPatrolWorkspace() && !this.isDashboard(matched[0])) {
matched = [{ path: "/index", meta: { title: "首页" } }].concat(matched)
}
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
const breadcrumb = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
//
this.levelList = breadcrumb.filter((item, index) => {
return index === 0 || item.meta.title !== breadcrumb[index - 1].meta.title
})
},
findPathNum(str, char = "/") {
let index = str.indexOf(char)
@ -70,13 +70,6 @@ export default {
}
}
},
isDashboard(route) {
const name = route && route.name
if (!name) {
return false
}
return name.trim() === 'Index'
},
handleLink(item) {
const { redirect, path } = item
if (redirect) {
@ -85,9 +78,6 @@ export default {
}
this.$router.push(path)
},
isPatrolWorkspace() {
return this.$route.matched.some(route => route.meta && route.meta.patrolWorkspace)
},
titleFn(item, children) {
let str = "";
let lang = localStorage.getItem("language");


+ 1
- 47
src/layout/components/Navbar.vue View File

@ -18,23 +18,6 @@
<!-- <el-tooltip content="文档地址" effect="dark" placement="bottom">
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
</el-tooltip> -->
<el-dropdown
trigger="click"
class="international right-menu-item hover-effect"
@command="handleSetLanguage"
>
<span>
<svg-icon class-name="international-icon" icon-class="language" style="font-size: 22px;"/>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :disabled="language === 'zh_CN'" command="zh_CN">
中文
</el-dropdown-item>
<el-dropdown-item :disabled="language === 'en_US'" command="en_US">
English
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<screenfull id="screenfull" class="right-menu-item hover-effect" />
<!-- <el-tooltip content="布局大小" effect="dark" placement="bottom">
@ -54,10 +37,7 @@
<!-- <router-link to="/user/profile">
<el-dropdown-item>{{ $t('navBar.IndividualCenter') }}</el-dropdown-item>
</router-link> -->
<el-dropdown-item @click.native="setting = true">
<span>{{ $t('navBar.LayoutSetting') }}</span>
</el-dropdown-item>
<el-dropdown-item divided @click.native="logout">
<el-dropdown-item @click.native="logout">
<span>{{ $t('navBar.LogOut') }}</span>
</el-dropdown-item>
</el-dropdown-menu>
@ -72,7 +52,6 @@ import TopNav from "@/components/TopNav";
import Screenfull from "@/components/Screenfull";
import headerLogo from "@/assets/images/header/logo.png";
import loginAvatar from "@/assets/images/aa-logo.png";
// import { changeLanguage } from "@/api/login";
export default {
components: {
TopNav,
@ -86,25 +65,10 @@ export default {
},
computed: {
...mapGetters(["avatar", "device"]),
setting: {
get() {
return this.$store.state.settings.showSettings;
},
set(val) {
this.$store.dispatch("settings/changeSetting", {
key: "showSettings",
value: val,
});
},
},
topNav: {
get() {
return this.$store.state.settings.topNav;
},
},
language() {
localStorage.setItem("language", this.$store.getters.language)
return this.$store.getters.language
}
},
methods: {
@ -120,16 +84,6 @@ export default {
});
})
.catch(() => {});
},
handleSetLanguage(value) {
this.$i18n.locale = value
this.$store.dispatch('app/setLanguage', value)
this.$message({ message: '设置语言成功', type: 'success' })
window.location.reload();
return
changeLanguage(value).then(response => {
window.location.reload();
});
}
},
};


+ 11
- 3
src/layout/components/Sidebar/index.vue View File

@ -36,18 +36,26 @@ export default {
...mapState(["settings"]),
...mapGetters(["sidebarRouters", "sidebar"]),
displayedRoutes() {
const filterHiddenNavigation = (routes = []) => routes.reduce((result, route) => {
const temporarilyHiddenRootMenus = new Set([
"设备管理",
"系统管理",
"区域管理",
"系统监控",
"基础数据",
]);
const filterHiddenNavigation = (routes = [], depth = 0) => routes.reduce((result, route) => {
const title = String(route.meta && route.meta.title || "").split("|")[0];
const isTaskManagement = title === "巡视任务管理";
const isImplementationPoints = title === "点位管理" &&
route.path !== "/site-management" &&
route.path !== "/inspection-workspace/points";
if (isTaskManagement || isImplementationPoints) return result;
const isTemporarilyHiddenRootMenu = depth === 0 && temporarilyHiddenRootMenus.has(title);
if (isTaskManagement || isImplementationPoints || isTemporarilyHiddenRootMenu) return result;
result.push({
...route,
children: route.children
? filterHiddenNavigation(route.children)
? filterHiddenNavigation(route.children, depth + 1)
: route.children,
});
return result;


+ 2
- 1
src/router/index.js View File

@ -128,12 +128,13 @@ export const constantRoutes = [
path: '',
component: Layout,
redirect: 'index',
hidden: true,
children: [
{
path: 'index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'dashboard', affix: true }
meta: { title: '首页', icon: 'dashboard', affix: true, breadcrumb: false }
}
]
},


+ 1
- 5
src/views/administration/administration copy.vue View File

@ -862,10 +862,6 @@ export default {
this.loading = false;
this.dataList = res.rows;
this.total = res.total;
this.$message({
message: this.$t("prompt.success.queryWasSuccessful"),
type: "success",
});
}
});
},
@ -964,7 +960,7 @@ export default {
postRemove(this.ids.toString()).then((res) => {
if (res.code == 200) {
this.$message({
message: this.$t("prompt.success.queryWasSuccessful"),
message: "删除成功",
type: "success",
});
this.init();


+ 1
- 5
src/views/administration/administration.vue View File

@ -517,10 +517,6 @@ export default {
this.loading = false;
this.dataList = res.rows;
this.total = res.total;
this.$message({
message: this.$t("prompt.success.queryWasSuccessful"),
type: "success",
});
}
});
},
@ -631,7 +627,7 @@ export default {
postRemove(this.ids.toString()).then((res) => {
if (res.code == 200) {
this.$message({
message: this.$t("prompt.success.queryWasSuccessful"),
message: "删除成功",
type: "success",
});
this.init();


+ 0
- 4
src/views/area/area.vue View File

@ -274,10 +274,6 @@ export default {
this.tableData = res.data;
}
this.$message({
type: "success",
message: "查询成功",
});
}
});
},


+ 0
- 4
src/views/area/area_management.vue View File

@ -289,10 +289,6 @@ export default {
if (res.code == 200) {
this.tableData = res.rows;
this.total = res.total;
this.$message({
message: `查询成功`,
type: "success",
});
}
});
},


+ 0
- 4
src/views/basedata/alg/index.vue View File

@ -157,10 +157,6 @@ export default {
if (res.code == 200) {
this.tableData = res.rows;
this.total = res.total;
this.$message({
message: `查询成功`,
type: "success",
});
}
});
},


+ 0
- 4
src/views/basedata/alg/subtype/index.vue View File

@ -266,10 +266,6 @@ export default {
if (res.code == 200) {
this.tableData = res.rows;
this.total = res.total;
this.$message({
message: `查询成功`,
type: "success",
});
}
});
},


+ 0
- 4
src/views/basedata/station/index.vue View File

@ -258,10 +258,6 @@ export default {
if (res.code == 200) {
this.tableData = res.rows;
this.total = res.total;
this.$message({
message: `查询成功`,
type: "success",
});
}
});
},


+ 63
- 8
src/views/cards/patrolPlan/notstart.vue View File

@ -98,6 +98,7 @@
border
stripe
:height="tableHeight"
@header-dragend="handleHeaderDragend"
>
<el-table-column
label="序号"
@ -105,22 +106,34 @@
width="60"
align="center"
:index="table_index"
:resizable="false"
/>
<el-table-column label="方案名称" align="left" prop="taskName" min-width="360" header-align="center" show-overflow-tooltip />
<el-table-column label="点位数" align="center" prop="totalPoints" width="90" />
<el-table-column label="时间" align="center" prop="createTime" width="170" show-overflow-tooltip />
<el-table-column label="方案名称" align="left" prop="taskName" min-width="360" header-align="center" show-overflow-tooltip :resizable="true" />
<el-table-column label="点位数" align="center" prop="totalPoints" width="90" :resizable="true" />
<el-table-column label="时间" align="center" prop="createTime" width="170" show-overflow-tooltip :resizable="true" />
<el-table-column
label="区域名称"
align="center"
prop="areaName"
min-width="180"
show-overflow-tooltip
/>
:resizable="true"
>
<template slot-scope="scope">
<el-tooltip
:content="scope.row.areaName || ''"
placement="top"
popper-class="patrol-plan-area-tooltip"
>
<span class="area-name-cell">{{ scope.row.areaName || "-" }}</span>
</el-tooltip>
</template>
</el-table-column>
<el-table-column
label="策略"
align="center"
prop="executionStatus"
width="100"
:resizable="true"
:formatter="stateFormat"
>
</el-table-column>
@ -130,7 +143,7 @@
prop="taskCycle"
:formatter="stateTask"
/> -->
<el-table-column label="操作" align="center" width="150">
<el-table-column label="操作" align="center" width="150" :resizable="true">
<template slot-scope="scope">
<el-tooltip content="立即执行" placement="bottom">
<i
@ -292,6 +305,13 @@ export default {
window.removeEventListener("resize", this.setTableHeight);
},
methods: {
handleHeaderDragend() {
this.$nextTick(() => {
if (this.$refs.tableRef) {
this.$refs.tableRef.doLayout();
}
});
},
//
getAreaList() {
var data = {"dictType":"sys_area_list"}
@ -509,7 +529,12 @@ export default {
.card-page ::v-deep .el-table__header-wrapper,
.card-page ::v-deep .el-table__fixed-header-wrapper {
background: #dbe7fb !important;
background: #06347f !important;
}
.card-page ::v-deep .el-table__header,
.card-page ::v-deep .el-table__body {
min-width: 100% !important;
}
.card-page ::v-deep .el-table__body-wrapper,
@ -529,6 +554,28 @@ export default {
color: #ffffff !important;
}
.card-page ::v-deep .el-table th.el-table__cell.is-resizable:not(:last-child) .cell::after {
content: "";
position: absolute;
top: 25%;
right: 1px;
width: 2px;
height: 50%;
background: rgba(255, 255, 255, 0.45);
cursor: col-resize;
}
.card-page ::v-deep .el-table__resize-proxy {
border-left: 2px solid #43c0ff;
}
.area-name-cell {
display: block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.card-page ::v-deep .el-table td.el-table__cell {
background: transparent !important;
border-color: #c7d7f4 !important;
@ -554,7 +601,7 @@ export default {
.card-page ::v-deep .el-table__body-wrapper {
overflow-y: auto;
overflow-x: hidden;
overflow-x: auto;
scrollbar-width: none;
-ms-overflow-style: none;
}
@ -639,6 +686,14 @@ export default {
overflow-y: auto;
}
</style>
<style lang="scss">
.patrol-plan-area-tooltip {
max-width: 300px;
white-space: normal;
overflow-wrap: anywhere;
line-height: 20px;
}
</style>
<!--
<style lang="scss" scoped>
.title_img {


+ 1
- 1
src/views/cards/site_management/algorithm.vue View File

@ -583,7 +583,7 @@ export default {
}
.el-button--small {
background-color: #247382 !important;
/* background-color: #247382 !important; */
border: none !important;
}


+ 38
- 0
src/views/cards/site_management/components/chooseAlg.vue View File

@ -78,6 +78,7 @@
<el-table-column
align="center"
width="60"
class-name="algorithm-check-column"
v-if="!disableCheck"
>
<template #header>
@ -771,6 +772,17 @@ export default {
background: #222f3d !important;
}
.dark-table ::v-deep .el-table__body-wrapper {
scrollbar-width: none;
-ms-overflow-style: none;
}
.dark-table ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
.dark-table ::v-deep .el-table__body tbody tr:nth-child(odd) td.el-table__cell {
background: #e4edfc !important;
}
@ -816,6 +828,32 @@ export default {
border-color: #1890ff;
}
.dark-checkbox {
display: inline-flex;
align-items: center;
justify-content: center;
height: 16px;
line-height: 16px;
vertical-align: middle;
}
.dark-checkbox ::v-deep .el-checkbox__input,
.dark-checkbox ::v-deep .el-checkbox__inner {
display: inline-flex;
align-items: center;
justify-content: center;
vertical-align: middle;
}
.dark-table ::v-deep td.algorithm-check-column .cell {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
min-height: 32px;
line-height: 1;
}
.dark-text {
color: #000000 !important;
}


+ 8
- 0
src/views/cards/site_management/site_management.vue View File

@ -3896,6 +3896,14 @@ export default {
::v-deep .el-table__body-wrapper {
overflow-x: auto;
background: transparent !important;
scrollbar-width: none;
-ms-overflow-style: none;
}
::v-deep .el-table__body-wrapper::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
::v-deep .el-table__header-wrapper {


+ 13
- 3
src/views/cards/tasksShow/yearDisplay.vue View File

@ -216,7 +216,10 @@ export default {
.month-card {
background: linear-gradient(135deg, rgba(18, 37, 105, 0.96), rgba(15, 31, 92, 0.96));
padding: 50px 15px;
display: flex;
flex-direction: column;
min-height: 220px;
padding: 24px 15px 28px;
border-radius: 0;
border: 1px solid #2787ed;
box-shadow: inset 0 0 18px rgba(23, 91, 196, 0.12);
@ -229,17 +232,19 @@ export default {
}
.month-title {
font-size: 18px;
font-size: 20px;
font-weight: bold;
margin-bottom: 15px;
color: #35bcff;
text-align: center;
text-align: left;
}
.month-stats {
display: flex;
flex-direction: column;
gap: 8px;
align-items: flex-end;
margin-top: auto;
}
.month-stats.empty {
@ -248,8 +253,13 @@ export default {
}
.stat-item {
display: flex;
justify-content: flex-start;
gap: 8px;
min-width: 120px;
font-size: 14px;
color: #dceaff;
text-align: left;
}
.status-executing {


+ 64
- 16
src/views/equipment/equipment.vue View File

@ -38,13 +38,14 @@
</el-form-item>
<el-form-item>
<el-button
class="task-toolbar-btn"
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>{{ $t("share.search") }}</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{
<el-button class="task-toolbar-btn" type="primary" icon="el-icon-refresh" size="mini" @click="resetQuery">{{
$t("share.reset")
}}</el-button>
</el-form-item>
@ -52,8 +53,8 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
class="task-toolbar-btn"
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
@ -62,8 +63,8 @@
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
class="task-toolbar-btn"
type="primary"
icon="el-icon-edit"
size="mini"
:disabled="single"
@ -73,8 +74,8 @@
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
class="task-toolbar-btn"
type="primary"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@ -84,7 +85,8 @@
</el-col>
<el-col :span="1.5">
<el-button
plain
class="task-toolbar-btn"
type="primary"
icon="el-icon-upload2"
size="mini"
@click="handleUpload"
@ -93,8 +95,8 @@
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
class="task-toolbar-btn"
type="primary"
icon="el-icon-download"
size="mini"
@click="handleExport"
@ -103,8 +105,8 @@
</el-col>
<el-col :span="1.5">
<el-button
class="task-toolbar-btn"
type="primary"
plain
icon="el-icon-upload"
size="mini"
:disabled="uploadBtn"
@ -118,6 +120,8 @@
:data="tableData"
class="equipment-table"
height="100%"
border
stripe
@selection-change="handleSelectionChange"
>
<el-table-column
@ -847,10 +851,6 @@ export default {
if (res.code == 200) {
this.tableData = res.rows;
this.total = res.total;
this.$message({
message: "查询成功",
type: "success",
});
}
});
},
@ -904,7 +904,6 @@ export default {
postRemove(eqpbookId).then((res) => {
if (res.code == 200) {
this.$message({
// message: this.$t("prompt.success.queryWasSuccessful"),
message: "删除成功",
type: "success",
});
@ -925,7 +924,7 @@ export default {
postRemove(this.ids.toString()).then((res) => {
if (res.code == 200) {
this.$message({
message: this.$t("prompt.success.queryWasSuccessful"),
message: "删除成功",
type: "success",
});
this.init();
@ -1111,6 +1110,55 @@ export default {
height: 100%;
}
.equipment-page ::v-deep .equipment-table .el-table__body tr td.el-table__cell {
background: #e4edfc !important;
border-color: #c7d7f4 !important;
color: #000000 !important;
}
.equipment-page ::v-deep .equipment-table .el-table__body tr.el-table__row--striped td.el-table__cell {
background: #d7e4f8 !important;
}
.equipment-page ::v-deep .equipment-table .el-table__body tr:hover > td.el-table__cell {
background: #c5d9f6 !important;
}
.equipment-page ::v-deep .equipment-table .el-table__fixed,
.equipment-page ::v-deep .equipment-table .el-table__fixed-right,
.equipment-page ::v-deep .equipment-table .el-table__fixed-body-wrapper {
background: #dbe7fb !important;
}
.task-toolbar-btn {
border: 1px solid transparent !important;
background:
linear-gradient(#01016b, #01016b) padding-box,
linear-gradient(135deg, #3988ff, #0351c6) border-box !important;
color: #43c0ff !important;
}
.task-toolbar-btn:hover,
.task-toolbar-btn:focus {
border: 1px solid transparent !important;
background:
linear-gradient(#01016b, #01016b) padding-box,
linear-gradient(135deg, #3988ff, #0351c6) border-box !important;
color: #43c0ff !important;
opacity: 0.9;
}
.task-toolbar-btn.is-disabled,
.task-toolbar-btn.is-disabled:hover,
.task-toolbar-btn.is-disabled:focus {
border: 1px solid transparent !important;
background:
linear-gradient(#01016b, #01016b) padding-box,
linear-gradient(135deg, #3988ff, #0351c6) border-box !important;
color: #43c0ff !important;
opacity: 0.45;
}
.operate-left {
height: 30px;
display: flex;


+ 0
- 4
src/views/equipment/equipment_type.vue View File

@ -194,10 +194,6 @@ export default {
getProDeviceTypeTreeSelect().then((res) => {
if (res.code == 200) {
this.treeData = res.data;
this.$message({
message: "查询成功",
type: "success",
});
}
});
profession_type().then((res) => {


+ 55
- 9
src/views/video/HistoryPlayback.vue View File

@ -13,11 +13,23 @@
<main class="playback-workspace">
<div class="query-bar">
<label><span>日期</span><input v-model="queryDate" type="date"></label>
<label><span>开始时间</span><input v-model="startTime" type="time" step="1"></label>
<label>
<span>日期</span>
<el-date-picker v-model="queryDate" type="date" size="small" format="yyyy-MM-dd" value-format="yyyy-MM-dd" :clearable="false" />
</label>
<label>
<span>开始时间</span>
<el-time-picker v-model="startTime" size="small" format="HH:mm:ss" value-format="HH:mm:ss" popper-class="video-time-picker" :clearable="false" />
</label>
<em></em>
<label><span>结束时间</span><input v-model="endTime" type="time" step="1"></label>
<label><span>下载时刻</span><input v-model="clipTime" type="time" step="1" title="留空时使用当前回放时刻"></label>
<label>
<span>结束时间</span>
<el-time-picker v-model="endTime" size="small" format="HH:mm:ss" value-format="HH:mm:ss" popper-class="video-time-picker" :clearable="false" />
</label>
<label>
<span>下载时刻</span>
<el-time-picker v-model="clipTime" size="small" format="HH:mm:ss" value-format="HH:mm:ss" popper-class="video-time-picker" placeholder="留空使用当前时刻" />
</label>
<div class="query-actions">
<button type="button" class="primary" :disabled="busy" @click="queryPlayback"><i class="el-icon-search" />查询录像</button>
<button type="button" :disabled="clipDownloading" @click="downloadClip"><i class="el-icon-download" />{{ clipDownloading ? '正在生成' : '下载1分钟' }}</button>
@ -63,11 +75,15 @@
<div class="time-readout"><strong>{{ currentClock }}</strong><span>{{ timelineRangeText }}</span></div>
</div>
<div class="control-center">
<div class="volume"><i :class="volume ? 'el-icon-microphone' : 'el-icon-turn-off-microphone'" /><input v-model.number="volume" type="range" min="0" max="1" step="0.05" @input="syncVolume"></div>
<div class="volume"><i :class="volume ? 'el-icon-microphone' : 'el-icon-turn-off-microphone'" /><input v-model.number="volume" type="range" min="0" max="1" step="0.05" :style="{ background: `linear-gradient(to right, #2787ed 0%, #2787ed ${volume * 100}%, transparent ${volume * 100}%, transparent 100%)` }" @input="syncVolume"></div>
<div class="speed-group">
<button v-for="speed in speeds" :key="speed" type="button" :class="{ active: playbackSpeed === speed }" @click="setSpeed(speed)">{{ speed }}x</button>
</div>
<div class="jump-control"><span>跳转</span><input v-model="jumpTime" type="time" step="1"><button type="button" @click="jumpToTime">定位</button></div>
<div class="jump-control">
<span>跳转</span>
<el-time-picker v-model="jumpTime" class="jump-time-picker" size="small" format="HH:mm:ss" value-format="HH:mm:ss" popper-class="video-time-picker" placeholder="选择时间" />
<button type="button" @click="jumpToTime">定位</button>
</div>
</div>
<button type="button" class="fullscreen" title="全屏" @click="fullscreen"><i class="el-icon-full-screen" /></button>
</section>
@ -347,10 +363,40 @@ export default {
<style lang="scss" scoped>
.playback-console { height: 100%; min-height: 0; display: flex; flex-direction: column; color: #dcecff; background: #0b1248; }
.playback-body { flex: 1; min-height: 0; display: flex; }.playback-workspace { flex: 1; min-width: 0; min-height: 0; padding: 10px 14px; display: flex; flex-direction: column; gap: 9px; }
.query-bar { min-height: 58px; display: flex; align-items: flex-end; gap: 9px; padding: 7px 10px; border: 1px solid rgba(42,133,230,.38); background: rgba(7,30,84,.68); }.query-bar label { display: flex; flex-direction: column; gap: 5px; color: #7fa8d1; font-size: 11px; }.query-bar input { width: 126px; height: 29px; padding: 0 8px; border: 1px solid rgba(55,151,247,.48); color: #d4eaff; background: #09265e; outline: none; }.query-bar label:first-child input { width: 140px; }.query-bar em { height: 29px; line-height: 29px; color: #6c97c2; font-style: normal; }.query-actions { margin-left: auto; display: flex; gap: 6px; }.query-actions button { height: 30px; padding: 0 11px; border: 1px solid rgba(50,147,244,.52); color: #a9d3ff; background: #0a2b67; cursor: pointer; }.query-actions button.primary { color: #fff; background: #176bc2; }.query-actions button i { margin-right: 5px; }.query-actions button:disabled { opacity: .55; cursor: not-allowed; }
.query-bar { min-height: 58px; display: flex; align-items: flex-end; gap: 9px; padding: 7px 10px; border: 1px solid rgba(42,133,230,.38); background: rgba(7,30,84,.68); }.query-bar label { display: flex; flex-direction: column; gap: 5px; color: #7fa8d1; font-size: 11px; }.query-bar em { height: 29px; line-height: 29px; color: #6c97c2; font-style: normal; }.query-actions { margin-left: auto; display: flex; gap: 6px; }.query-actions button { height: 30px; padding: 0 11px; border: 1px solid rgba(50,147,244,.52); color: #a9d3ff; background: #0a2b67; cursor: pointer; }.query-actions button.primary { color: #fff; background: #176bc2; }.query-actions button i { margin-right: 5px; }.query-actions button:disabled { opacity: .55; cursor: not-allowed; }
::v-deep .query-bar .el-date-editor { width: 126px; }.query-bar label:first-child ::v-deep .el-date-editor { width: 140px; }::v-deep .query-bar .el-input__inner { height: 29px; padding: 0 28px 0 30px; line-height: 29px; }
.video-stage { position: relative; flex: 1; min-height: 260px; overflow: hidden; border: 1px solid #176bc2; background: #03081d; }.video-stage video { width: 100%; height: 100%; display: block; object-fit: contain; }.stage-head { position: absolute; z-index: 2; top: 0; left: 0; right: 0; height: 34px; padding: 0 10px; display: flex; align-items: center; gap: 12px; color: #c9e3ff; background: linear-gradient(180deg,rgba(2,9,31,.94),transparent); font-size: 11px; }.stage-head span { display: flex; align-items: center; gap: 6px; }.stage-head span i { width: 7px; height: 7px; border-radius: 50%; background: #d09231; }.stage-head span i.playing { background: #25dfa2; box-shadow: 0 0 8px #25dfa2; }.stage-head small { color: #7da8d4; }.stage-head em { margin-left: auto; color: #5e8dbb; font-style: normal; }.stage-overlay { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 9px; color: #6d9bc8; background: radial-gradient(circle at center,rgba(10,45,96,.65),rgba(3,8,29,.92)); }.stage-overlay i { font-size: 36px; }.stage-overlay strong { color: #b9d8f7; font-size: 14px; }.stage-overlay span { font-size: 11px; }.stage-clock { position: absolute; right: 10px; bottom: 8px; color: #a7caec; font-family: Consolas,monospace; font-size: 12px; }
.timeline-panel { padding: 8px 10px 4px; border: 1px solid rgba(43,133,226,.38); background: rgba(7,29,80,.72); }.timeline-head { display: flex; align-items: center; justify-content: space-between; color: #bcd9f7; font-size: 11px; }.timeline-head span { display: flex; align-items: center; gap: 6px; }.timeline-head i { width: 6px; height: 6px; border-radius: 50%; background: #1a8cff; }.timeline-head small { color: #6d98c2; }.timeline { position: relative; height: 46px; margin-top: 4px; cursor: pointer; }.timeline-track { position: absolute; left: 0; right: 0; top: 12px; height: 7px; background: #071b44; border: 1px solid #183f73; }.actual-range { position: absolute; top: -1px; height: 7px; background: #1989ee; box-shadow: 0 0 7px rgba(25,137,238,.6); }.timeline-marker { position: absolute; z-index: 2; top: -5px; width: 1px; height: 17px; background: #54ffff; }.timeline-marker span { position: absolute; left: 50%; top: -17px; transform: translateX(-50%); color: #54ffff; font-size: 9px; white-space: nowrap; }.timeline-empty { position: absolute; top: 3px; left: 50%; transform: translateX(-50%); color: #587fa8; font-size: 10px; }.timeline-labels { position: absolute; left: 0; right: 0; bottom: 0; display: flex; justify-content: space-between; color: #557da7; font-size: 9px; }
.playback-controls { height: 48px; min-height: 48px; padding: 0 9px; display: flex; align-items: center; border: 1px solid rgba(43,133,226,.38); background: #081e53; }.transport { display: flex; align-items: center; gap: 5px; }.playback-controls button { border: 1px solid rgba(53,146,238,.5); color: #a8d2fa; background: #0a2b67; cursor: pointer; }.transport>button { width: 29px; height: 29px; }.transport button.play { width: 35px; height: 35px; border-radius: 50%; color: #fff; background: #176bc2; }.time-readout { width: 170px; display: flex; flex-direction: column; margin-left: 6px; }.time-readout strong { color: #54ffff; font: 13px Consolas,monospace; }.time-readout span { color: #638fb9; font-size: 9px; }.control-center { flex: 1; display: flex; align-items: center; justify-content: center; gap: 18px; }.volume { display: flex; align-items: center; gap: 5px; color: #71a7d7; }.volume input { width: 76px; accent-color: #228ef1; }.speed-group { display: flex; }.speed-group button { width: 34px; height: 27px; border-right: 0; }.speed-group button:last-child { border-right: 1px solid rgba(53,146,238,.5); }.speed-group button.active { color: #fff; background: #176bc2; }.jump-control { display: flex; align-items: center; gap: 5px; color: #729dcc; font-size: 10px; }.jump-control input { width: 100px; height: 27px; padding: 0 5px; border: 1px solid rgba(53,146,238,.5); color: #d1e7ff; background: #081f53; }.jump-control button { height: 27px; }.fullscreen { width: 30px; height: 30px; }
.timeline-panel { padding: 8px 10px 4px; border: 1px solid rgba(43,133,226,.38); background: rgba(7,29,80,.72); }.timeline-head { display: flex; align-items: center; justify-content: space-between; color: #bcd9f7; font-size: 11px; }.timeline-head span { display: flex; align-items: center; gap: 6px; }.timeline-head i { width: 6px; height: 6px; border-radius: 50%; background: #1a8cff; }.timeline-head small { color: #6d98c2; }.timeline { position: relative; height: 46px; margin-top: 4px; cursor: pointer; }.timeline-track { position: absolute; left: 0; right: 0; top: 12px; height: 7px; background: #071b44; border: 1px solid #2787ed; }.actual-range { position: absolute; top: -1px; height: 7px; background: #1989ee; box-shadow: 0 0 7px rgba(25,137,238,.6); }.timeline-marker { position: absolute; z-index: 2; top: -5px; width: 1px; height: 17px; background: #54ffff; }.timeline-marker span { position: absolute; left: 50%; top: -17px; transform: translateX(-50%); color: #54ffff; font-size: 9px; white-space: nowrap; }.timeline-empty { position: absolute; top: 3px; left: 50%; transform: translateX(-50%); color: #587fa8; font-size: 10px; }.timeline-labels { position: absolute; left: 0; right: 0; bottom: 0; display: flex; justify-content: space-between; color: #557da7; font-size: 9px; }
.playback-controls { height: 48px; min-height: 48px; padding: 0 9px; display: flex; align-items: center; border: 1px solid rgba(43,133,226,.38); background: #081e53; }.transport { display: flex; align-items: center; gap: 5px; }.playback-controls button { border: 1px solid rgba(53,146,238,.5); color: #a8d2fa; background: #0a2b67; cursor: pointer; }.transport>button { width: 29px; height: 29px; }.transport button.play { width: 35px; height: 35px; border-radius: 50%; color: #fff; background: #176bc2; }.time-readout { width: 170px; display: flex; flex-direction: column; margin-left: 6px; }.time-readout strong { color: #54ffff; font: 13px Consolas,monospace; }.time-readout span { color: #638fb9; font-size: 9px; }.control-center { flex: 1; display: flex; align-items: center; justify-content: center; gap: 18px; }.volume { display: flex; align-items: center; gap: 5px; color: #71a7d7; }.volume input[type="range"] { width: 76px; height: 8px; box-sizing: border-box; margin: 0; appearance: none; border: 1px solid #2787ed; border-radius: 4px; outline: none; cursor: pointer; }.volume input[type="range"]::-webkit-slider-runnable-track { height: 6px; border: 0; border-radius: 3px; background: transparent; }.volume input[type="range"]::-webkit-slider-thumb { width: 14px; height: 14px; margin-top: -4px; appearance: none; border: 0; border-radius: 50%; background: #2787ed; }.volume input[type="range"]::-moz-range-track { height: 6px; border: 0; border-radius: 3px; background: transparent; }.volume input[type="range"]::-moz-range-progress { background: transparent; }.volume input[type="range"]::-moz-range-thumb { width: 14px; height: 14px; border: 0; border-radius: 50%; background: #2787ed; }.speed-group { display: flex; }.speed-group button { width: 34px; height: 27px; border-right: 0; }.speed-group button:last-child { border-right: 1px solid rgba(53,146,238,.5); }.speed-group button.active { color: #fff; background: #176bc2; }.jump-control { display: flex; align-items: center; gap: 5px; color: #729dcc; font-size: 10px; }.jump-time-picker { width: 112px; }.jump-control button { height: 27px; }.fullscreen { width: 30px; height: 30px; }
::v-deep .jump-time-picker .el-input__inner { height: 27px; padding: 0 28px 0 30px; line-height: 27px; }
.status-line { min-height: 29px; padding: 0 10px; display: flex; align-items: center; gap: 7px; color: #7fa8d0; border: 1px solid rgba(43,133,226,.25); background: rgba(6,25,70,.6); font-size: 11px; }.status-line i { width: 6px; height: 6px; border-radius: 50%; background: #428fda; }.status-line.success i { background: #2bdb9f; }.status-line.warn i { background: #e5a83d; }.status-line.error i { background: #ff5c72; }
@media (max-width: 1250px) { .query-bar { flex-wrap: wrap; }.query-actions { margin-left: 0; }.control-center { gap: 8px; }.time-readout { width: 130px; } }
</style>
<style lang="scss">
.video-time-picker {
.el-time-panel__content::before {
left: 0;
right: 0;
z-index: 0;
margin: -15px 0 0;
padding: 0;
border-color: #2787ed;
background: #176b9e;
}
.el-time-panel__content::after {
display: none;
}
.el-time-spinner__wrapper,
.el-time-spinner__list {
z-index: 1;
background: transparent !important;
}
.el-time-spinner__item.active:not(.disabled) {
background: transparent !important;
}
}
</style>

+ 2
- 2
src/views/video/LivePreview.vue View File

@ -95,7 +95,7 @@
</div>
<div class="speed-row">
<span>速度</span>
<input v-model.number="ptzSpeed" type="range" min="1" max="7">
<input v-model.number="ptzSpeed" type="range" min="1" max="7" :style="{ background: `linear-gradient(to right, #2787ed 0%, #2787ed ${((ptzSpeed - 1) / 6) * 100}%, transparent ${((ptzSpeed - 1) / 6) * 100}%, transparent 100%)` }">
<el-input-number
v-model="ptzSpeed"
class="speed-input"
@ -459,7 +459,7 @@ export default {
.control-panel { width: 242px; min-width: 242px; padding: 10px; overflow-y: auto; border-left: 1px solid rgba(41, 139, 255, .45); background: rgba(7, 24, 78, .82); }
.control-section { padding-bottom: 12px; margin-bottom: 12px; border-bottom: 1px solid rgba(39, 128, 220, .28); }.section-title { height: 30px; display: flex; align-items: center; justify-content: space-between; color: #54ffff; }.section-title small { max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #719bc8; }.section-title button { border: 0; color: #75bfff; background: transparent; cursor: pointer; }
.ptz-grid { width: 168px; margin: 6px auto 12px; display: grid; grid-template-columns: repeat(3, 50px); gap: 9px; }.ptz-grid button { width: 50px; height: 50px; border: 1px solid #b9d5fb; border-radius: 7px; color: #2874da; background: #e8f2ff; box-shadow: inset 0 0 0 1px rgba(255,255,255,.7); cursor: pointer; transition: color .15s, background .15s, transform .15s; }.ptz-grid button i { font-size: 18px; font-weight: 700; }.ptz-grid button:hover { color: #075cc6; background: #f6faff; }.ptz-grid button:active { color: #fff; background: #1670ca; transform: scale(.96); }
.speed-row { display: grid; grid-template-columns: 34px minmax(0, 1fr) 48px; align-items: center; gap: 7px; color: #8eb7df; font-size: 12px; }.speed-row > input { min-width: 0; accent-color: #2497ff; }.speed-input { width: 48px; }
.speed-row { display: grid; grid-template-columns: 34px minmax(0, 1fr) 48px; align-items: center; gap: 7px; color: #8eb7df; font-size: 12px; }.speed-row > input[type="range"] { min-width: 0; height: 8px; box-sizing: border-box; margin: 0; appearance: none; border: 1px solid #2787ed; border-radius: 4px; outline: none; cursor: pointer; }.speed-row > input[type="range"]::-webkit-slider-runnable-track { height: 6px; border: 0; border-radius: 3px; background: transparent; }.speed-row > input[type="range"]::-webkit-slider-thumb { width: 14px; height: 14px; margin-top: -4px; appearance: none; border: 0; border-radius: 50%; background: #2787ed; }.speed-row > input[type="range"]::-moz-range-track { height: 6px; border: 0; border-radius: 3px; background: transparent; }.speed-row > input[type="range"]::-moz-range-progress { background: transparent; }.speed-row > input[type="range"]::-moz-range-thumb { width: 14px; height: 14px; border: 0; border-radius: 50%; background: #2787ed; }.speed-input { width: 48px; }
.preset-quick-actions { display: flex; align-items: center; gap: 7px; margin: 9px 0 0 1px; }.preset-quick-actions button { display: grid; place-items: center; width: 24px; height: 24px; padding: 0; border: 1px solid rgba(48, 151, 248, .5); color: #58bfff; background: transparent; cursor: pointer; }.preset-quick-actions button:hover { background: rgba(31, 126, 222, .25); }.preset-quick-actions img { width: 18px; height: 18px; object-fit: contain; }
.lens-actions { display: flex; align-items: center; justify-content: center; gap: 11px; min-height: 28px; margin: 0 0 10px; }.lens-tool { position: relative; width: 48px; height: 22px; overflow: hidden; }.lens-tool img { display: block; width: 100%; height: 100%; object-fit: fill; }.lens-tool button { position: absolute; top: 0; bottom: 0; width: 50%; padding: 0; border: 0; background: transparent; cursor: pointer; }.lens-tool button:first-of-type { left: 0; }.lens-tool button:last-of-type { right: 0; }.lens-tool button:active { background: rgba(73, 184, 255, .28); }
.operation-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-top: 9px; }.operation-grid button, .section-actions button { min-height: 29px; border: 1px solid rgba(47, 145, 241, .5); color: #abd4ff; background: #0b2b67; cursor: pointer; }.operation-grid button i { margin-right: 5px; }.operation-grid button.active, .section-actions button.primary { color: #fff; background: #176bc2; }


+ 2
- 1
src/views/video/components/NvrDeviceTree.vue View File

@ -152,7 +152,8 @@ export default {
.tree-filters { display: flex; gap: 6px; padding: 10px 8px; }
.tree-filters .el-select { width: 78px; }
.tree-filters .el-input { flex: 1; min-width: 0; }
.tree-filters .el-button { flex: 0 0 32px; padding: 0; }
.tree-filters .el-button { flex: 0 0 32px; padding: 0; border-color: #2787ed; color: #54ffff; background: #0a2b67; }
.tree-filters .el-button:hover, .tree-filters .el-button:focus { border-color: #2787ed; color: #ffffff; background: #176bc2; }
.tree-content { flex: 1; min-height: 0; overflow: auto; padding: 0 8px 8px; scrollbar-width: none; -ms-overflow-style: none; }
.tree-content::-webkit-scrollbar { display: none; }
.custom-tree-node { display: flex; align-items: center; width: 100%; gap: 6px; font-size: 14px; }


Loading…
Cancel
Save