Browse Source

按照提的要求修改样式

master
douyage 4 weeks ago
parent
commit
9720fdf21b
24 changed files with 560 additions and 88 deletions
  1. BIN
      src/assets/images/header/xfdh-title-filled.png
  2. BIN
      src/assets/images/header/xfdh-title-navbar.png
  3. +7
    -7
      src/assets/styles/index.scss
  4. +50
    -15
      src/assets/styles/ruoyi.scss
  5. +2
    -2
      src/assets/styles/sidebar.scss
  6. +44
    -1
      src/components/Breadcrumb/index.vue
  7. +12
    -3
      src/components/TopNav/index.vue
  8. +5
    -5
      src/layout/components/AppMain.vue
  9. +42
    -30
      src/layout/components/Navbar.vue
  10. +36
    -1
      src/layout/components/Sidebar/index.vue
  11. +198
    -1
      src/layout/index.vue
  12. +1
    -1
      src/router/index.js
  13. +5
    -3
      src/views/cards/patrolReport/InspectionReporter.vue
  14. +28
    -1
      src/views/cards/patrolReport/patrolReportDetail.vue
  15. +29
    -5
      src/views/cards/site_management/site_management.vue
  16. +5
    -5
      src/views/login.vue
  17. +1
    -1
      src/views/monitor/job/index.vue
  18. +24
    -1
      src/views/point copy/components/site_VideoDialog.vue
  19. +24
    -1
      src/views/point/components/site_VideoDialog.vue
  20. +25
    -0
      src/views/point/site_management.vue
  21. +4
    -2
      src/views/register.vue
  22. +1
    -1
      src/views/tool/gen/genInfoForm.vue
  23. +1
    -1
      src/views/tool/gen/index.vue
  24. +16
    -1
      src/views/video/components/NvrDeviceTree.vue

BIN
src/assets/images/header/xfdh-title-filled.png View File

Before After
Width: 1921  |  Height: 75  |  Size: 87 KiB Width: 1895  |  Height: 74  |  Size: 92 KiB

BIN
src/assets/images/header/xfdh-title-navbar.png View File

Before After
Width: 1920  |  Height: 50  |  Size: 80 KiB

+ 7
- 7
src/assets/styles/index.scss View File

@ -6,16 +6,16 @@
@import './btn.scss';
:root {
--app-font-family: 'Source Han Sans Heavy', 'Source Han Sans SC Heavy', 'Source Han Sans CN Heavy',
'Source Han Sans SC', 'Source Han Sans CN', 'HYZhongHeiTi', 'SimHei', 'Microsoft YaHei',
Arial, sans-serif;
--app-font-family: 'PingFang SC', 'PingFang TC', -apple-system, BlinkMacSystemFont,
'Microsoft YaHei', sans-serif;
--app-heading-font-family: 'Source Han Sans Heavy', 'Source Han Sans SC Heavy',
'Source Han Sans CN Heavy', '思源黑体 Heavy', 'Microsoft YaHei', sans-serif;
}
@font-face {
font-family: 'Source Han Sans Heavy';
src: local('Source Han Sans Heavy'), local('Source Han Sans SC Heavy'),
local('Source Han Sans CN Heavy'), local('Source Han Sans SC'), local('Source Han Sans CN'),
local('HYZhongHeiTi'), local('SimHei');
local('Source Han Sans CN Heavy');
font-style: normal;
font-weight: 900;
font-display: swap;
@ -28,7 +28,7 @@ body {
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: var(--app-font-family);
font-weight: 900;
font-weight: 400;
}
label {
@ -150,7 +150,7 @@ aside {
display: block;
line-height: 32px;
font-size: 16px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
font-family: var(--app-font-family);
color: #2c3e50;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;


+ 50
- 15
src/assets/styles/ruoyi.scss View File

@ -1128,34 +1128,69 @@ table tbody tr:nth-child(even) > td {
background-color: #e0eaff !important;
}
// Restore the standard grid for tables that do not use the card-table custom layout.
.el-table:not(.card-table) {
border: 1px solid #acb5e3 !important;
// Restore a consistent grid for every table, including custom card tables.
body #app .el-table {
border: 0 !important;
}
.el-table:not(.card-table) th.el-table__cell,
.el-table:not(.card-table) td.el-table__cell,
.el-table:not(.card-table) .el-table--border .el-table__cell {
body #app .el-table th.el-table__cell,
body #app .el-table td.el-table__cell,
body #app .el-table .el-table--border .el-table__cell {
border: 1px solid #acb5e3 !important;
}
.el-table:not(.card-table)::before,
.el-table:not(.card-table)::after,
.el-table:not(.card-table).el-table--border::after,
.el-table:not(.card-table).el-table--group::after {
background-color: #acb5e3 !important;
body #app .el-table::before,
body #app .el-table::after,
body #app .el-table.el-table--border::after,
body #app .el-table.el-table--group::after {
background-color: transparent !important;
}
table:not(.card-table) {
border: 1px solid #acb5e3 !important;
table {
border: 0 !important;
border-collapse: collapse;
}
table:not(.card-table) th,
table:not(.card-table) td {
table th,
table td {
border: 1px solid #acb5e3 !important;
}
// Keep header and content separators visible when page-level table styles reset them.
body #app .el-table th.el-table__cell,
body #app .el-table td.el-table__cell {
border-top: 1px solid #acb5e3 !important;
border-right: 1px solid #acb5e3 !important;
border-bottom: 1px solid #acb5e3 !important;
border-left: 1px solid #acb5e3 !important;
}
// Match the inspection-plan layout: scrolling remains available without a visible gutter.
body #app .card-page .el-table__body-wrapper,
body #app .card-page .el-table__fixed-body-wrapper {
scrollbar-width: none;
-ms-overflow-style: none;
}
body #app .card-page .el-table__body-wrapper::-webkit-scrollbar,
body #app .card-page .el-table__fixed-body-wrapper::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
body #app .card-page .el-table__header-wrapper col[name="gutter"],
body #app .card-page .el-table__header-wrapper th.gutter {
width: 0 !important;
display: none !important;
}
body #app .card-page .el-table__header,
body #app .card-page .el-table__body,
body #app .card-page .el-table__footer {
width: 100% !important;
}
/* Search buttons use the requested gradient; other buttons retain their wireframe style. */
.el-button.el-button--primary:has(.el-icon-search),
button.el-button--primary:has(.el-icon-search) {


+ 2
- 2
src/assets/styles/sidebar.scss View File

@ -20,10 +20,10 @@
background-repeat: no-repeat;
background-position: center bottom;
background-size: 100% 100%;
height: calc(100% - 50px);
height: calc(100% - 90px);
position: fixed;
font-size: 0px;
top: 50px;
top: 90px;
bottom: 0;
left: 0;
z-index: 1001;


+ 44
- 1
src/components/Breadcrumb/index.vue View File

@ -50,6 +50,38 @@ export default {
this.levelList = breadcrumb.filter((item, index) => {
return index === 0 || item.meta.title !== breadcrumb[index - 1].meta.title
})
//
//
const group = this.getMenuGroup(router.path)
if (group && (!this.levelList.length || this.levelList[0].meta.title !== group.title)) {
this.levelList.unshift({
path: group.path,
redirect: 'noRedirect',
meta: { title: group.title }
})
}
},
getMenuGroup(path) {
const inspectionPaths = [
'/xfdh',
'/task-summary',
'/patrol-plan',
'/site-management',
'/patrol-report',
'/patrol-schedule',
'/defect-record'
]
if (inspectionPaths.some(item => path === item || path.startsWith(`${item}/`))) {
return { title: '动环巡检', path: '/inspection-workspace/task' }
}
const videoPaths = ['/video-preview', '/video-playback']
if (videoPaths.some(item => path === item || path.startsWith(`${item}/`))) {
return { title: '视频监控', path: '/inspection-workspace/video-preview' }
}
return null
},
findPathNum(str, char = "/") {
let index = str.indexOf(char)
@ -120,10 +152,21 @@ export default {
<style lang="scss" scoped>
.app-breadcrumb.el-breadcrumb {
display: inline-block;
display: flex;
align-items: center;
flex: 0 0 auto;
width: max-content;
max-width: none;
font-size: 14px;
line-height: 50px;
margin-left: 8px;
white-space: nowrap;
::v-deep .el-breadcrumb__item,
::v-deep .el-breadcrumb__inner,
::v-deep .el-breadcrumb__separator {
white-space: nowrap;
}
a {
color: #54FFFF;


+ 12
- 3
src/components/TopNav/index.vue View File

@ -169,8 +169,12 @@ export default {
<style lang="scss">
.topmenu-container.el-menu--horizontal {
height: 36px !important;
border: 0 !important;
border-bottom: 0 !important;
background: transparent !important;
background: linear-gradient(180deg, #151b5b 0%, #111753 58%, #0e1244 100%) !important;
box-shadow: none !important;
position: relative;
left: -72px;
}
.topmenu-container.el-menu--horizontal > .el-menu-item {
@ -178,14 +182,17 @@ export default {
height: 36px !important;
line-height: 36px !important;
color: #54FFFF !important;
font-weight: 700 !important;
background: transparent !important;
padding: 0 12px !important;
margin: 0 2px !important;
border: 0 !important;
}
.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
border-bottom: 2px solid #{'var(--theme)'} !important;
color: #54FFFF !important;
border: 0 !important;
box-shadow: inset 0 -2px 0 #3ffffe, 0 3px 8px rgba(63, 255, 254, 0.28);
color: #3ffffe !important;
}
/* submenu item */
@ -194,8 +201,10 @@ export default {
height: 36px !important;
line-height: 36px !important;
color: #54FFFF !important;
font-weight: 700 !important;
background: transparent !important;
padding: 0 12px !important;
margin: 0 2px !important;
border: 0 !important;
}
</style>

+ 5
- 5
src/layout/components/AppMain.vue View File

@ -57,21 +57,21 @@ export default {
}
.app-main.hasTagsView {
/* 108 = navbar + module title = 68 + 40 */
height: calc(100vh - 108px);
/* 126 = navbar + subbar + module title = 50 + 36 + 40 */
height: calc(100vh - 130px);
min-height: 0;
}
.fixed-header + .app-main.hasTagsView {
padding-top: 108px;
padding-top: 130px;
}
.app-main.patrolWorkspace.hasTagsView {
height: calc(100vh - 40px);
height: calc(100vh - 130px);
}
.fixed-header + .app-main.patrolWorkspace.hasTagsView {
padding-top: 40px;
padding-top: 130px;
}
</style>


+ 42
- 30
src/layout/components/Navbar.vue View File

@ -1,5 +1,6 @@
<template>
<div class="navbar" :class="{ 'xfdh-navbar': isXfdh }" :style="isXfdh ? { backgroundImage: `url(${xfdhHeader})` } : null">
<div class="navbar" :class="{ 'xfdh-navbar': isXfdh }">
<div v-if="isXfdh" class="xfdh-title-art" :style="{ backgroundImage: `url(${xfdhTitleNavbar})` }" />
<div class="navbar-brand">
<img :src="isXfdh ? xfdhBrand : headerLogo" class="header-logo" alt="" />
<span class="platform-title">消防动环管理平台</span>
@ -51,7 +52,7 @@ import { mapGetters } from "vuex";
import TopNav from "@/components/TopNav";
import Screenfull from "@/components/Screenfull";
import headerLogo from "@/assets/images/header/logo.png";
import xfdhHeader from "@/assets/images/header/xfdh-title-filled.png";
import xfdhTitleNavbar from "@/assets/images/header/xfdh-title-navbar.png";
import xfdhBrand from "@/assets/images/header/xfdh-brand.png";
import loginAvatar from "@/assets/images/header/framework-avatar.png";
export default {
@ -62,7 +63,7 @@ export default {
data() {
return {
headerLogo,
xfdhHeader,
xfdhTitleNavbar,
xfdhBrand,
loginAvatar,
frameworkUser: null,
@ -156,39 +157,39 @@ export default {
display: flex;
align-items: center;
padding: 0 18px 0 14px;
background: $base-navbar-background url("~@/assets/images/header/dingbu2.png") center / 100% 100% no-repeat;
background: $base-navbar-background;
box-shadow: none;
box-sizing: border-box;
&.xfdh-navbar {
background-size: 100% 100%;
background-position: center center;
background-color: #11194f;
.xfdh-title-art {
position: absolute;
z-index: 0;
inset: 0;
pointer-events: none;
background-repeat: no-repeat;
background-position: center center;
background-size: 100% 100%;
background-color: #11194f;
box-sizing: border-box;
}
.navbar-brand {
width: 470px;
flex-basis: 470px;
width: 420px;
flex-basis: 420px;
z-index: 1;
}
.header-logo {
display: block;
width: 220px;
height: 40px;
}
.platform-title {
display: block;
position: absolute;
left: 50%;
// Chinese glyphs sit slightly below the line box center at this size.
top: 42%;
margin: 0;
transform: translate(-50%, -50%);
color: #fff;
font-family: 'Microsoft YaHei', 'PingFang SC', sans-serif;
font-size: 34px;
font-weight: 700 !important;
letter-spacing: 4px;
white-space: nowrap;
text-shadow: 0 0 6px rgba(84, 255, 255, 0.55), 0 2px 2px rgba(0, 17, 74, 0.65);
display: none;
}
}
@ -206,11 +207,11 @@ export default {
}
.navbar-brand {
width: 430px;
width: 380px;
height: 100%;
display: flex;
align-items: center;
flex: 0 0 430px;
flex: 0 0 380px;
min-width: 0;
}
@ -224,18 +225,19 @@ export default {
.platform-title {
margin-left: 10px;
color: #fff;
font-family: 'Microsoft YaHei', 'PingFang SC', sans-serif;
font-size: 34px;
font-weight: 700 !important;
font-family: var(--app-heading-font-family);
font-size: 40px;
font-weight: 600 !important;
line-height: 1;
white-space: nowrap;
letter-spacing: 0;
text-shadow: 0 0 6px rgba(84, 255, 255, 0.55), 0 2px 2px rgba(0, 17, 74, 0.65);
text-shadow: 0 0 5px rgba(84, 255, 255, 0.45), 0 1px 2px rgba(0, 17, 74, 0.55);
}
.navbar-spacer {
flex: 1 1 auto;
min-width: 0;
z-index: 1;
}
.topmenu-container {
@ -243,6 +245,7 @@ export default {
min-width: 0;
height: 100%;
align-self: stretch;
z-index: 1;
}
.errLog-container {
@ -257,6 +260,7 @@ export default {
justify-content: flex-end;
flex: 0 0 auto;
line-height: 1;
z-index: 1;
&:focus {
outline: none;
@ -272,6 +276,10 @@ export default {
color: #54FFFF;
vertical-align: middle;
&#screenfull {
margin-top: 10px;
}
&.hover-effect {
cursor: pointer;
transition: background 0.3s;
@ -287,6 +295,7 @@ export default {
margin-right: 18px;
.avatar-wrapper {
// The header artwork leaves the user controls visually high; align this group with it.
margin-top: 0;
position: relative;
display: flex;
@ -300,15 +309,18 @@ export default {
color: #fff;
font-size: 15px;
font-weight: 600;
line-height: 40px;
line-height: 1.2;
text-overflow: ellipsis;
white-space: nowrap;
margin-top:10px;
}
.user-avatar {
cursor: pointer;
width: 40px;
height: 40px;
display: block;
margin-top: 15px;
border-radius: 10px;
}
@ -334,7 +346,7 @@ export default {
}
.platform-title {
font-size: 18px;
font-size: 40px;
}
.right-menu {


+ 36
- 1
src/layout/components/Sidebar/index.vue View File

@ -10,6 +10,7 @@
:unique-opened="true"
:active-text-color="variables.menuColorActive"
:collapse-transition="false"
:default-openeds="defaultOpeneds"
mode="vertical"
>
<sidebar-item
@ -63,7 +64,36 @@ export default {
const visibleRoutes = filterHiddenNavigation(this.sidebarRouters);
if (!this.$route.meta.patrolWorkspace) {
return visibleRoutes;
const inspectionPaths = new Set([
"/task-summary", "/patrol-plan", "/site-management",
"/patrol-report", "/patrol-schedule", "/defect-record",
]);
const videoPaths = new Set(["/video-preview", "/video-playback"]);
const inspectionRoutes = visibleRoutes.filter(route => inspectionPaths.has(route.path));
const videoRoutes = visibleRoutes.filter(route => videoPaths.has(route.path));
const groupedPaths = new Set([...inspectionPaths, ...videoPaths]);
const otherRoutes = visibleRoutes.filter(route => !groupedPaths.has(route.path));
const groups = [];
if (inspectionRoutes.length) groups.push({
path: "/inspection-menu",
meta: { title: "动环巡检", icon: "dashboard" },
alwaysShow: true,
children: inspectionRoutes,
});
if (videoRoutes.length) groups.push({
path: "/video-menu",
meta: { title: "视频监控", icon: "monitor" },
alwaysShow: true,
children: videoRoutes,
});
const routePath = this.$route.path;
if (routePath === "/index" || routePath === "/" || routePath === "/xfdh/index" || inspectionRoutes.some(route => routePath.indexOf(route.path + "/") === 0 || routePath === route.path)) {
return groups.filter(group => group.path === "/inspection-menu");
}
if (routePath.indexOf("/video-preview") === 0 || routePath.indexOf("/video-playback") === 0) {
return groups.filter(group => group.path === "/video-menu");
}
return [...groups, ...otherRoutes];
}
const workspacePaths = {
"/task-summary": "/inspection-workspace/task",
@ -106,6 +136,11 @@ export default {
}
return path;
},
defaultOpeneds() {
if (this.isCollapse) return [];
const paths = (this.displayedRoutes || []).map(route => route.path);
return paths.filter(path => path === "/inspection-menu" || path === "/video-menu");
},
variables() {
return variables;
},


+ 198
- 1
src/layout/index.vue View File

@ -5,7 +5,34 @@
<sidebar v-if="device !== 'mobile' || sidebar.opened" class="sidebar-container"/>
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
<div class="layout-header" :class="{'fixed-header':fixedHeader}">
<navbar v-if="!isPatrolWorkspace"/>
<navbar />
<div class="module-subbar">
<div class="module-links">
<button
v-for="item in moduleLinks"
:key="item.key"
type="button"
class="module-link"
:class="{ active: activeModule === item.key }"
@click="goModule(item.path)"
>{{ item.label }}</button>
</div>
<el-select
v-model="selectedStation"
class="station-select"
size="mini"
popper-class="station-select-popper"
placeholder="请选择场站"
@change="handleStationChange"
>
<el-option
v-for="station in stationOptions"
:key="station.value"
:label="station.label"
:value="station.value"
/>
</el-select>
</div>
<tags-view v-if="needTagsView"/>
</div>
<app-main :class="{hasTagsView: needTagsView, patrolWorkspace: isPatrolWorkspace}" />
@ -22,6 +49,7 @@ import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
import ResizeMixin from './mixin/ResizeHandler'
import { mapState } from 'vuex'
import variables from '@/assets/styles/variables.scss'
import { getList as getStationList } from '@/api/basedata/station'
export default {
name: 'Layout',
@ -33,6 +61,16 @@ export default {
Sidebar,
TagsView
},
data() {
return {
stationOptions: [],
selectedStation: '',
moduleLinks: [
{ key: 'home', label: '动环巡检', path: '/index' },
{ key: 'video', label: '视频监控', path: '/video-preview/index' }
]
}
},
mixins: [ResizeMixin],
computed: {
...mapState({
@ -55,11 +93,43 @@ export default {
isPatrolWorkspace() {
return this.$route.matched.some(route => route.meta && route.meta.patrolWorkspace)
},
activeModule() {
const path = this.$route.path
const inspectionPaths = ['/task-summary', '/patrol-plan', '/site-management', '/patrol-report', '/patrol-schedule', '/defect-record', '/inspection-workspace/task', '/inspection-workspace/plan', '/inspection-workspace/points', '/inspection-workspace/report', '/inspection-workspace/schedule', '/inspection-workspace/defects']
if (path === '/' || path === '/index' || path === '/xfdh/index' || inspectionPaths.some(item => path === item || path.indexOf(item + '/') === 0)) return 'home'
if (path.indexOf('/video-preview') === 0 || path.indexOf('/video-playback') === 0 || path.indexOf('/inspection-workspace/video-preview') === 0 || path.indexOf('/inspection-workspace/video-playback') === 0) return 'video'
return ''
},
variables() {
return variables;
}
},
mounted() {
this.loadStations()
},
methods: {
async loadStations() {
try {
const result = await getStationList({ pageNum: 1, pageSize: 1000 })
const rows = Array.isArray(result && result.rows)
? result.rows
: (Array.isArray(result && result.data) ? result.data : [])
this.stationOptions = rows.map((item, index) => {
const value = item.stationCode || item.stationId || item.id || item.code
const label = index === 0 ? '白杨坪升压站' : (item.stationName || item.name || String(value || ''))
return { value: value == null ? '' : String(value), label }
}).filter(item => item.value && item.label)
} catch (error) {
this.stationOptions = []
}
this.selectedStation = this.$route.query.stationCode || (this.stationOptions[0] && this.stationOptions[0].value) || ''
},
handleStationChange(value) {
this.$router.replace({ query: { ...this.$route.query, stationCode: value } }).catch(() => undefined)
},
goModule(path) {
if (this.$route.path !== path) this.$router.push({ path }).catch(() => undefined)
},
handleClickOutside() {
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
}
@ -104,6 +174,124 @@ export default {
}
}
.module-subbar {
position: relative;
width: 100%;
height: 40px;
padding: 2px 18px;
box-sizing: border-box;
background: linear-gradient(180deg, #151b5b 0%, #111753 58%, #0e1244 100%);
// Keep the lower edge soft while replacing the former hard top line with a fade.
box-shadow: inset 0 -1px 0 rgba(0, 13, 63, .55);
display: flex;
align-items: center;
justify-content: space-between;
}
.module-subbar::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 6px;
pointer-events: none;
background: linear-gradient(180deg, rgba(1, 8, 27, .62) 0%, rgba(5, 18, 52, .28) 48%, rgba(5, 18, 52, 0) 100%);
}
.module-links {
height: 36px;
margin-left:120px;
display: flex;
align-items: stretch;
}
.module-link {
position: relative;
min-width: 90px;
height: 36px;
padding: 0 24px;
border: 0;
border-right: 0;
color: #c9dcf8;
background: transparent;
font: inherit;
font-size: 14px;
font-weight: 900;
letter-spacing: 1px;
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
line-height: 36px;
text-align: center;
cursor: pointer;
transition: color .2s, background-color .2s;
}
.module-link:not(:last-child)::before {
content: "";
position: absolute;
top: 11%;
right: 0;
width: 1px;
height: 78%;
background: linear-gradient(180deg, rgba(90, 133, 197, 0) 0%, rgba(90, 133, 197, .42) 50%, rgba(90, 133, 197, 0) 100%);
pointer-events: none;
}
.module-link:hover {
color: #54ffff;
background: transparent;
}
.module-link.active {
position: relative;
color: #3FFFFE;
font-size: 14px;
letter-spacing: 1px;
font-weight: 900;
background: transparent;
box-shadow: none;
}
.module-link.active::after {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: -2px;
height: 24px;
transform: scaleX(-1) scaleY(-1);
background-image: radial-gradient(circle at 50% 0%, #00CBDA 0%, rgba(23, 88, 93, 0) 47%, rgba(23, 47, 93, 0) 61%);
background-size: 100% 100%;
pointer-events: none;
}
.station-select {
width: 176px;
}
.station-select ::v-deep .el-input__inner {
height: 26px;
padding: 0 30px 0 12px;
color: #dcecff;
font-size: 14px;
letter-spacing: 1px;
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
line-height: 24px;
background: rgba(9, 31, 89, .82);
border: 1px solid #6b9deb;
border-radius: 2px;
}
.station-select ::v-deep .el-input__suffix {
color: #b5d9ff;
}
::v-deep .station-select-popper .el-select-dropdown__item {
font-size: 14px;
letter-spacing: 1px;
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
}
.fixed-header {
position: fixed;
top: 0;
@ -126,6 +314,10 @@ export default {
}
.hideSidebar .module-links {
margin-left: 54px;
}
.hideSidebar .fixed-header {
margin-left: 0;
width: 100%;
@ -143,6 +335,11 @@ export default {
}
.sidebarHide .module-links,
.mobile .module-links {
margin-left: 12px;
}
.app-wrapper.patrolWorkspace {
::v-deep .sidebar-container {
top: 0 !important;


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

@ -149,7 +149,7 @@ export const constantRoutes = [
path: 'index',
component: () => import('@/views/cards/taskSummary/inspectionTask'),
name: 'Index',
meta: { title: '巡视任务', icon: 'dashboard', affix: true, activeMenu: '/task-summary/inspectionTask' }
meta: { title: '动环巡检', icon: 'dashboard', affix: true, activeMenu: '/task-summary/inspectionTask' }
}
]
},


+ 5
- 3
src/views/cards/patrolReport/InspectionReporter.vue View File

@ -60,7 +60,7 @@
class="card-table"
v-loading="loading"
:data="dataList"
:height="tableHeight"
:max-height="tableHeight"
border
stripe
>
@ -75,18 +75,20 @@
label="巡视任务"
align="left"
prop="inspectionTaskName"
width="700"
width="620"
header-align="center"
/>
<el-table-column
label="巡视开始时间"
align="center"
prop="inspectionStartTime"
width="190"
/>
<el-table-column
label="巡视结束时间"
align="center"
prop="inspectionEndTime"
width="190"
/>
<el-table-column label="审核人" align="center" prop="checkPerson" />
<el-table-column label="审核时间" align="center" prop="checkTime" />
@ -102,7 +104,7 @@
<el-button
size="mini"
type="primary"
@click="ftpImageViewUrl(scope.row, 'xls')"
@click="ftpImageViewUrl(scope.row, 'docx')"
:disabled="isLock"
>导出</el-button
>


+ 28
- 1
src/views/cards/patrolReport/patrolReportDetail.vue View File

@ -191,7 +191,7 @@
:close-on-click-modal="false"
:close-on-press-escape="false"
:destroy-on-close="true"
custom-class="card-dialog card-page"
custom-class="card-dialog card-page patrol-report-image-preview-dialog"
width="70%"
append-to-body
>
@ -700,3 +700,30 @@ export default {
display: none;
}
</style>
<style lang="scss">
.patrol-report-image-preview-dialog {
height: 90vh;
margin-top: 5vh !important;
display: flex;
flex-direction: column;
overflow: hidden;
.el-dialog__header {
flex: 0 0 32px;
}
.el-dialog__body {
flex: 1 1 auto;
min-height: 0;
height: auto;
padding: 12px;
overflow: hidden;
> .card-page {
width: 100%;
height: 100%;
}
}
}
</style>

+ 29
- 5
src/views/cards/site_management/site_management.vue View File

@ -901,6 +901,9 @@
<el-input
v-model="scope.row.photoCount"
v-if="scope.row.actionType == 1"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
</template>
@ -914,6 +917,9 @@
<el-input
v-model="scope.row.photoSeper"
v-if="scope.row.actionType == 1"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
</template>
@ -3328,6 +3334,24 @@ export default {
//
saveDot1() {
const invalidPhotoCount = this.presetData.presetActionList.some(
(item) =>
item.photoCount !== null &&
item.photoCount !== undefined &&
String(item.photoCount).trim() !== "" &&
!/^\d+$/.test(String(item.photoCount).trim())
);
const invalidPhotoInterval = this.presetData.presetActionList.some(
(item) =>
item.photoSeper !== null &&
item.photoSeper !== undefined &&
String(item.photoSeper).trim() !== "" &&
!/^\d+$/.test(String(item.photoSeper).trim())
);
if (invalidPhotoCount || invalidPhotoInterval) {
this.$message.error("\u62cd\u7167\u6b21\u6570\u548c\u62cd\u7167\u95f4\u9694\u53ea\u80fd\u8f93\u5165\u975e\u8d1f\u6574\u6570");
return;
}
// presetPosName
if (!this.presetData.presetPosName) {
this.presetData.presetPosName = this.presetName || this.presetData.presetPosName || '';
@ -3780,11 +3804,11 @@ export default {
width: 8px;
bottom: 10px;
height: auto;
background-color: #102b50;
background-color: transparent;
// border-right: 1px solid #3988ff;
border-left: 1px solid rgba(57, 136, 255, 0.45);
cursor: col-resize;
display: none;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
@ -3793,7 +3817,7 @@ export default {
z-index: 10;
&:hover {
background-color: #2a3a4a;
background-color: transparent;
.handle-line {
background-color: #1890ff;
@ -3805,7 +3829,7 @@ export default {
}
&.resizing {
background-color: #2a3a4a;
background-color: transparent;
.handle-line {
background-color: #40a9ff;
@ -3916,7 +3940,7 @@ export default {
/* 添加重置按钮样式 */
.reset-width-btn {
display: none;
display: flex;
position: absolute;
bottom: 10px;
right: 10px;


+ 5
- 5
src/views/login.vue View File

@ -1,7 +1,7 @@
<template>
<div class="login">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">若依后台管理系统</h3>
<h3 class="title">消防动环管理系统</h3>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
@ -55,9 +55,6 @@
</el-form-item>
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<span>Copyright © 2018-2025 ruoyi.vip All Rights Reserved.</span>
</div>
</div>
</template>
@ -181,9 +178,12 @@ export default {
background-size: cover;
}
.title {
margin: 0px auto 30px auto;
margin: 0px auto 26px auto;
text-align: center;
color: #707070;
font-family: var(--app-heading-font-family);
font-size: 32px;
font-weight: 900;
}
.login-form {


+ 1
- 1
src/views/monitor/job/index.vue View File

@ -277,7 +277,7 @@
Bean {{ $t("job.CallExample") }}ryTask.ryParams('ry')
<br />Class{{
$t("job.CallExample")
}}com.ruoyi.quartz.task.RyTask.ryParams('ry') <br />{{
}}com.example.quartz.task.RyTask.ryParams('ry') <br />{{
$t("job.ParameterDescription")
}}
</div>


+ 24
- 1
src/views/point copy/components/site_VideoDialog.vue View File

@ -153,6 +153,9 @@
<el-input
v-model="scope.row.videoTime"
v-if="scope.row.actionType == 2"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
</template>
@ -165,6 +168,9 @@
<el-input
v-model="scope.row.photoCount"
v-if="scope.row.actionType == 1"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
<!-- <span v-if="scope.row.actionType == 1">1</span> -->
@ -178,6 +184,9 @@
<el-input
v-model="scope.row.photoSeper"
v-if="scope.row.actionType == 1"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
</template>
@ -504,6 +513,20 @@ export default {
},
//
saveDot1() {
const invalidAction = this.bindingMonitorPointTableData.find((item) => {
if (item.actionType == 1) {
return !/^\d+$/.test(String(item.photoCount || "")) ||
(item.photoSeper !== "" && !/^\d+$/.test(String(item.photoSeper)));
}
if (item.actionType == 2) {
return item.videoTime !== "" && !/^\d+$/.test(String(item.videoTime));
}
return false;
});
if (invalidAction) {
this.$message.error("\u53ea\u80fd\u8f93\u5165\u6570\u5b57");
return;
}
this.presetData.presetPosName = this.presetName;
this.presetData.presetActionList = this.bindingMonitorPointTableData;
bindingPreset(this.presetData).then((res) => {
@ -693,4 +716,4 @@ export default {
display: flex;
justify-content: flex-end;
}
</style>
</style>

+ 24
- 1
src/views/point/components/site_VideoDialog.vue View File

@ -153,6 +153,9 @@
<el-input
v-model="scope.row.videoTime"
v-if="scope.row.actionType == 2"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
</template>
@ -165,6 +168,9 @@
<el-input
v-model="scope.row.photoCount"
v-if="scope.row.actionType == 1"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
<!-- <span v-if="scope.row.actionType == 1">1</span> -->
@ -178,6 +184,9 @@
<el-input
v-model="scope.row.photoSeper"
v-if="scope.row.actionType == 1"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
</template>
@ -504,6 +513,20 @@ export default {
},
//
saveDot1() {
const invalidAction = this.bindingMonitorPointTableData.find((item) => {
if (item.actionType == 1) {
return !/^\d+$/.test(String(item.photoCount || "")) ||
(item.photoSeper !== "" && !/^\d+$/.test(String(item.photoSeper)));
}
if (item.actionType == 2) {
return item.videoTime !== "" && !/^\d+$/.test(String(item.videoTime));
}
return false;
});
if (invalidAction) {
this.$message.error("\u53ea\u80fd\u8f93\u5165\u6570\u5b57");
return;
}
this.presetData.presetPosName = this.presetName;
this.presetData.presetActionList = this.bindingMonitorPointTableData;
bindingPreset(this.presetData).then((res) => {
@ -693,4 +716,4 @@ export default {
display: flex;
justify-content: flex-end;
}
</style>
</style>

+ 25
- 0
src/views/point/site_management.vue View File

@ -926,6 +926,9 @@
<el-input
v-model="scope.row.photoCount"
v-if="scope.row.actionType == 1"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
<!-- <span v-if="scope.row.actionType == 1">1</span> -->
@ -940,6 +943,9 @@
<el-input
v-model="scope.row.photoSeper"
v-if="scope.row.actionType == 1"
type="number"
min="0"
step="1"
class="centered-input"
></el-input>
</template>
@ -2352,6 +2358,25 @@ export default {
},
//
saveDot1() {
const invalidPhotoCount = this.presetData.presetActionList.some(
(item) =>
item.photoCount !== null &&
item.photoCount !== undefined &&
String(item.photoCount).trim() !== "" &&
(!/^\d+$/.test(String(item.photoCount).trim()) ||
Number(item.photoCount) < 0)
);
const invalidPhotoInterval = this.presetData.presetActionList.some(
(item) =>
item.photoSeper !== null &&
item.photoSeper !== undefined &&
String(item.photoSeper).trim() !== "" &&
!/^\d+$/.test(String(item.photoSeper).trim())
);
if (invalidPhotoCount || invalidPhotoInterval) {
this.$message.error("\u62cd\u7167\u6b21\u6570\u548c\u62cd\u7167\u95f4\u9694\u53ea\u80fd\u8f93\u5165\u975e\u8d1f\u6574\u6570");
return;
}
this.presetData.presetPosName = this.presetName;
this.loadingBind = true;
bindingPreset(Object.assign({}, this.presetData))


+ 4
- 2
src/views/register.vue View File

@ -1,7 +1,7 @@
<template>
<div class="register">
<el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
<h3 class="title">若依后台管理系统</h3>
<h3 class="title">消防动环管理系统</h3>
<el-form-item prop="username">
<el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
@ -61,7 +61,6 @@
</el-form>
<!-- 底部 -->
<div class="el-register-footer">
<span>Copyright © 2018-2025 ruoyi.vip All Rights Reserved.</span>
</div>
</div>
</template>
@ -159,6 +158,9 @@ export default {
margin: 0px auto 30px auto;
text-align: center;
color: #707070;
font-family: var(--app-heading-font-family);
font-size: 40px;
font-weight: 900;
}
.register-form {


+ 1
- 1
src/views/tool/gen/genInfoForm.vue View File

@ -24,7 +24,7 @@
<el-form-item prop="packageName">
<span slot="label">
生成包路径
<el-tooltip content="生成在哪个java包下,例如 com.ruoyi.system" placement="top">
<el-tooltip content="生成在哪个java包下,例如 com.example.system" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
</span>


+ 1
- 1
src/views/tool/gen/index.vue View File

@ -280,7 +280,7 @@ export default {
this.$modal.msgSuccess("成功生成到自定义路径:" + row.genPath);
});
} else {
this.$download.zip("/tool/gen/batchGenCode?tables=" + tableNames, "ruoyi.zip");
this.$download.zip("/tool/gen/batchGenCode?tables=" + tableNames, "generated-code.zip");
}
},
/** 同步数据库操作 */


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

@ -33,8 +33,11 @@
<el-tooltip
slot-scope="{ data }"
:content="data.label || data.name || ''"
placement="right"
placement="top-start"
:offset="6"
:open-delay="300"
:append-to-body="true"
popper-class="nvr-tree-tooltip"
effect="dark"
>
<span class="custom-tree-node">
@ -172,3 +175,15 @@ export default {
::v-deep .el-tree-node__content:hover, ::v-deep .el-tree-node:focus > .el-tree-node__content { background: transparent; }
::v-deep .el-tree-node.is-current > .el-tree-node__content { color: #54ffff; background: transparent; }
</style>
<style lang="scss">
.nvr-tree-tooltip.el-tooltip__popper {
color: #eaf6ff;
background: #176bc2;
border: 1px solid #4ba3ff;
}
.nvr-tree-tooltip.el-tooltip__popper[x-placement^="top"] .popper__arrow {
border-top-color: #176bc2;
}
</style>

Loading…
Cancel
Save