diff --git a/src/assets/images/header/xfdh-title-filled.png b/src/assets/images/header/xfdh-title-filled.png index 15dcde3..85cf897 100644 Binary files a/src/assets/images/header/xfdh-title-filled.png and b/src/assets/images/header/xfdh-title-filled.png differ diff --git a/src/assets/images/header/xfdh-title-navbar.png b/src/assets/images/header/xfdh-title-navbar.png new file mode 100644 index 0000000..ba28615 Binary files /dev/null and b/src/assets/images/header/xfdh-title-navbar.png differ diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 88d8352..3d80848 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -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; diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss index 98ebf71..868535b 100644 --- a/src/assets/styles/ruoyi.scss +++ b/src/assets/styles/ruoyi.scss @@ -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) { diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss index 0a0e469..b746118 100644 --- a/src/assets/styles/sidebar.scss +++ b/src/assets/styles/sidebar.scss @@ -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; diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index f0ceea8..8a7807d 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -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 { diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 3eb500c..187368c 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -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; } diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index fa88373..b0eb050 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -1,5 +1,6 @@ @@ -914,6 +917,9 @@ @@ -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; diff --git a/src/views/login.vue b/src/views/login.vue index 8a93593..5ed6e2a 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -1,7 +1,7 @@ @@ -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 { diff --git a/src/views/monitor/job/index.vue b/src/views/monitor/job/index.vue index ce49e18..153cf5e 100644 --- a/src/views/monitor/job/index.vue +++ b/src/views/monitor/job/index.vue @@ -277,7 +277,7 @@ Bean {{ $t("job.CallExample") }}:ryTask.ryParams('ry')
Class{{ $t("job.CallExample") - }}:com.ruoyi.quartz.task.RyTask.ryParams('ry')
{{ + }}:com.example.quartz.task.RyTask.ryParams('ry')
{{ $t("job.ParameterDescription") }} diff --git a/src/views/point copy/components/site_VideoDialog.vue b/src/views/point copy/components/site_VideoDialog.vue index 966ef3c..fa063c6 100644 --- a/src/views/point copy/components/site_VideoDialog.vue +++ b/src/views/point copy/components/site_VideoDialog.vue @@ -153,6 +153,9 @@ @@ -165,6 +168,9 @@ @@ -178,6 +184,9 @@ @@ -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; } - \ No newline at end of file + diff --git a/src/views/point/components/site_VideoDialog.vue b/src/views/point/components/site_VideoDialog.vue index 966ef3c..fa063c6 100644 --- a/src/views/point/components/site_VideoDialog.vue +++ b/src/views/point/components/site_VideoDialog.vue @@ -153,6 +153,9 @@ @@ -165,6 +168,9 @@ @@ -178,6 +184,9 @@ @@ -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; } - \ No newline at end of file + diff --git a/src/views/point/site_management.vue b/src/views/point/site_management.vue index 4bfeddb..9b81ace 100644 --- a/src/views/point/site_management.vue +++ b/src/views/point/site_management.vue @@ -926,6 +926,9 @@ @@ -940,6 +943,9 @@ @@ -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)) diff --git a/src/views/register.vue b/src/views/register.vue index 7bf5f74..e134a77 100644 --- a/src/views/register.vue +++ b/src/views/register.vue @@ -1,7 +1,7 @@ @@ -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 { diff --git a/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue index 98daf6d..10fb038 100644 --- a/src/views/tool/gen/genInfoForm.vue +++ b/src/views/tool/gen/genInfoForm.vue @@ -24,7 +24,7 @@ 生成包路径 - + diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue index 9237c30..f762afb 100644 --- a/src/views/tool/gen/index.vue +++ b/src/views/tool/gen/index.vue @@ -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"); } }, /** 同步数据库操作 */ diff --git a/src/views/video/components/NvrDeviceTree.vue b/src/views/video/components/NvrDeviceTree.vue index 9b6f463..faf992c 100644 --- a/src/views/video/components/NvrDeviceTree.vue +++ b/src/views/video/components/NvrDeviceTree.vue @@ -33,8 +33,11 @@ @@ -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; } + +