From 5382685f214e56da747421622d6166397ab5901f Mon Sep 17 00:00:00 2001 From: lvfengfree Date: Tue, 20 Jan 2026 19:52:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E6=A1=8C=E9=9D=A2=E5=88=86=E4=BA=AB=E9=93=BE=E6=8E=A5=E9=87=8D?= =?UTF-8?q?=E5=AE=9A=E5=90=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复已登录用户访问 /remote/:token 路由被重定向到首页的问题 - 路由守卫优先检查静态路由,静态路由直接放行不走权限验证 - 后端生成的 accessUrl 使用 Hash 路由格式 (/#/remote/{token}) - 前端 remote-desktop-modal 中修正链接格式为 Hash 路由 - 新增远程桌面访问页面 /views/remote/index.vue --- adminSystem/src/api/amt.ts | 279 + adminSystem/src/router/guards/beforeEach.ts | 15 +- adminSystem/src/router/routes/staticRoutes.ts | 14 +- adminSystem/src/views/amt/credentials.vue | 174 + adminSystem/src/views/amt/devices.vue | 309 + .../views/amt/modules/hardware-info-modal.vue | 204 + .../amt/modules/remote-desktop-modal.vue | 305 + adminSystem/src/views/amt/scan.vue | 267 + .../src/views/amt/windows-credentials.vue | 201 + adminSystem/src/views/remote/index.vue | 208 + .../views/system/menu/modules/menu-dialog.vue | 4 +- art-design-pro-3.0.1/.env.development | 13 + art-design-pro-3.0.1/.env.production | 10 + art-design-pro-3.0.1/.gitattributes | 2 + art-design-pro-3.0.1/.gitignore | 11 + art-design-pro-3.0.1/.husky/commit-msg | 1 + art-design-pro-3.0.1/.husky/pre-commit | 1 + art-design-pro-3.0.1/.prettierignore | 3 + art-design-pro-3.0.1/.prettierrc | 20 + art-design-pro-3.0.1/.stylelintignore | 9 + art-design-pro-3.0.1/.stylelintrc.cjs | 82 + art-design-pro-3.0.1/CHANGELOG.md | 650 + art-design-pro-3.0.1/CHANGELOG.zh-CN.md | 654 + art-design-pro-3.0.1/LICENSE | 21 + art-design-pro-3.0.1/README.md | 104 + art-design-pro-3.0.1/README.zh-CN.md | 104 + art-design-pro-3.0.1/commitlint.config.cjs | 97 + art-design-pro-3.0.1/eslint.config.mjs | 83 + art-design-pro-3.0.1/index.html | 47 + art-design-pro-3.0.1/package.json | 123 + art-design-pro-3.0.1/pnpm-lock.yaml | 10109 ++++++ art-design-pro-3.0.1/public/favicon.ico | Bin 0 -> 4286 bytes art-design-pro-3.0.1/scripts/clean-dev.ts | 838 + art-design-pro-3.0.1/src/App.vue | 34 + art-design-pro-3.0.1/src/api/auth.ts | 29 + art-design-pro-3.0.1/src/api/system-manage.ts | 25 + .../src/assets/images/3d/icon1.webp | Bin 0 -> 10076 bytes .../src/assets/images/3d/icon2.webp | Bin 0 -> 6712 bytes .../src/assets/images/3d/icon3.webp | Bin 0 -> 5872 bytes .../src/assets/images/3d/icon4.webp | Bin 0 -> 5762 bytes .../src/assets/images/3d/icon5.webp | Bin 0 -> 7932 bytes .../src/assets/images/3d/icon6.webp | Bin 0 -> 6308 bytes .../src/assets/images/3d/icon7.webp | Bin 0 -> 8180 bytes .../src/assets/images/3d/icon8.webp | Bin 0 -> 7678 bytes .../src/assets/images/avatar/avatar.webp | Bin 0 -> 954 bytes .../src/assets/images/avatar/avatar1.webp | Bin 0 -> 2296 bytes .../src/assets/images/avatar/avatar10.webp | Bin 0 -> 1410 bytes .../src/assets/images/avatar/avatar2.webp | Bin 0 -> 1214 bytes .../src/assets/images/avatar/avatar3.webp | Bin 0 -> 726 bytes .../src/assets/images/avatar/avatar4.webp | Bin 0 -> 944 bytes .../src/assets/images/avatar/avatar5.webp | Bin 0 -> 2272 bytes .../src/assets/images/avatar/avatar6.webp | Bin 0 -> 810 bytes .../src/assets/images/avatar/avatar7.webp | Bin 0 -> 2712 bytes .../src/assets/images/avatar/avatar8.webp | Bin 0 -> 3946 bytes .../src/assets/images/avatar/avatar9.webp | Bin 0 -> 1680 bytes .../src/assets/images/ceremony/hb.png | Bin 0 -> 2275 bytes .../src/assets/images/ceremony/sd.png | Bin 0 -> 4752 bytes .../src/assets/images/ceremony/xc.png | Bin 0 -> 4910 bytes .../src/assets/images/ceremony/yd.png | Bin 0 -> 4629 bytes .../src/assets/images/common/logo.webp | Bin 0 -> 2484 bytes .../src/assets/images/cover/img1.webp | Bin 0 -> 7522 bytes .../src/assets/images/cover/img10.webp | Bin 0 -> 3526 bytes .../src/assets/images/cover/img2.webp | Bin 0 -> 14024 bytes .../src/assets/images/cover/img3.webp | Bin 0 -> 12128 bytes .../src/assets/images/cover/img4.webp | Bin 0 -> 9832 bytes .../src/assets/images/cover/img5.webp | Bin 0 -> 9478 bytes .../src/assets/images/cover/img6.webp | Bin 0 -> 10898 bytes .../src/assets/images/cover/img7.webp | Bin 0 -> 8694 bytes .../src/assets/images/cover/img8.webp | Bin 0 -> 9580 bytes .../src/assets/images/cover/img9.webp | Bin 0 -> 9212 bytes .../src/assets/images/draw/draw1.png | Bin 0 -> 11315 bytes .../src/assets/images/favicon.ico | Bin 0 -> 4286 bytes .../src/assets/images/lock/bg_dark.webp | Bin 0 -> 70592 bytes .../src/assets/images/lock/bg_light.webp | Bin 0 -> 67246 bytes .../src/assets/images/login/lf_icon2.webp | Bin 0 -> 25016 bytes .../src/assets/images/safeguard/server.png | Bin 0 -> 2178 bytes .../settings/menu_layouts/dual_column.png | Bin 0 -> 514 bytes .../settings/menu_layouts/horizontal.png | Bin 0 -> 409 bytes .../images/settings/menu_layouts/mixed.png | Bin 0 -> 431 bytes .../images/settings/menu_layouts/vertical.png | Bin 0 -> 439 bytes .../images/settings/menu_styles/dark.png | Bin 0 -> 292 bytes .../images/settings/menu_styles/design.png | Bin 0 -> 286 bytes .../images/settings/menu_styles/light.png | Bin 0 -> 293 bytes .../images/settings/theme_styles/dark.png | Bin 0 -> 448 bytes .../images/settings/theme_styles/light.png | Bin 0 -> 416 bytes .../images/settings/theme_styles/system.png | Bin 0 -> 509 bytes .../src/assets/images/svg/403.svg | 1 + .../src/assets/images/svg/404.svg | 1 + .../src/assets/images/svg/500.svg | 5 + .../src/assets/images/svg/login_icon.svg | 1 + .../src/assets/images/user/avatar.webp | Bin 0 -> 2130 bytes .../src/assets/images/user/bg.webp | Bin 0 -> 12352 bytes .../src/assets/styles/core/app.scss | 292 + .../src/assets/styles/core/dark.scss | 93 + .../src/assets/styles/core/el-dark.scss | 2 + .../src/assets/styles/core/el-light.scss | 34 + .../src/assets/styles/core/el-ui.scss | 524 + .../src/assets/styles/core/md.scss | 1036 + .../src/assets/styles/core/mixin.scss | 157 + .../src/assets/styles/core/reset.scss | 41 + .../assets/styles/core/router-transition.scss | 104 + .../src/assets/styles/core/tailwind.css | 208 + .../assets/styles/core/theme-animation.scss | 63 + .../src/assets/styles/core/theme-change.scss | 11 + .../assets/styles/custom/one-dark-pro.scss | 98 + .../src/assets/styles/index.scss | 23 + .../src/assets/svg/loading.ts | 32 + .../business/comment-widget/index.vue | 111 + .../comment-widget/widget/CommentItem.vue | 121 + .../core/banners/art-basic-banner/index.vue | 343 + .../core/banners/art-card-banner/index.vue | 114 + .../core/base/art-back-to-top/index.vue | 40 + .../components/core/base/art-logo/index.vue | 21 + .../core/base/art-svg-icon/index.vue | 24 + .../core/cards/art-bar-chart-card/index.vue | 103 + .../core/cards/art-data-list-card/index.vue | 74 + .../core/cards/art-donut-chart-card/index.vue | 124 + .../core/cards/art-image-card/index.vue | 89 + .../core/cards/art-line-chart-card/index.vue | 126 + .../core/cards/art-progress-card/index.vue | 86 + .../core/cards/art-stats-card/index.vue | 67 + .../cards/art-timeline-list-card/index.vue | 69 + .../core/charts/art-bar-chart/index.vue | 203 + .../art-dual-bar-compare-chart/index.vue | 195 + .../core/charts/art-h-bar-chart/index.vue | 208 + .../core/charts/art-k-line-chart/index.vue | 152 + .../core/charts/art-line-chart/index.vue | 371 + .../core/charts/art-map-chart/index.vue | 291 + .../core/charts/art-radar-chart/index.vue | 105 + .../core/charts/art-ring-chart/index.vue | 133 + .../core/charts/art-scatter-chart/index.vue | 115 + .../core/forms/art-button-more/index.vue | 71 + .../core/forms/art-button-table/index.vue | 59 + .../core/forms/art-drag-verify/index.vue | 430 + .../core/forms/art-excel-export/index.vue | 389 + .../core/forms/art-excel-import/index.vue | 62 + .../components/core/forms/art-form/index.vue | 311 + .../core/forms/art-search-bar/index.vue | 437 + .../core/forms/art-wang-editor/index.vue | 219 + .../core/forms/art-wang-editor/style.scss | 210 + .../core/layouts/art-breadcrumb/index.vue | 142 + .../core/layouts/art-chat-window/index.vue | 262 + .../core/layouts/art-fast-enter/index.vue | 113 + .../layouts/art-fireworks-effect/index.vue | 633 + .../layouts/art-global-component/index.vue | 14 + .../core/layouts/art-global-search/index.vue | 426 + .../core/layouts/art-header-bar/index.vue | 485 + .../art-header-bar/widget/ArtUserMenu.vue | 167 + .../art-menus/art-horizontal-menu/index.vue | 110 + .../widget/HorizontalSubmenu.vue | 95 + .../art-menus/art-mixed-menu/index.vue | 279 + .../art-menus/art-sidebar-menu/index.vue | 355 + .../art-menus/art-sidebar-menu/style.scss | 253 + .../art-menus/art-sidebar-menu/theme.scss | 258 + .../widget/SidebarSubmenu.vue | 188 + .../core/layouts/art-notification/index.vue | 456 + .../core/layouts/art-page-content/index.vue | 136 + .../core/layouts/art-screen-lock/index.vue | 517 + .../composables/useSettingsConfig.ts | 248 + .../composables/useSettingsHandlers.ts | 167 + .../composables/useSettingsPanel.ts | 192 + .../composables/useSettingsState.ts | 37 + .../core/layouts/art-settings-panel/index.vue | 72 + .../layouts/art-settings-panel/style.scss | 92 + .../widget/BasicSettings.vue | 77 + .../widget/BoxStyleSettings.vue | 38 + .../widget/ColorSettings.vue | 35 + .../widget/ContainerSettings.vue | 33 + .../widget/MenuLayoutSettings.vue | 31 + .../widget/MenuStyleSettings.vue | 44 + .../widget/SectionTitle.vue | 17 + .../widget/SettingActions.vue | 235 + .../widget/SettingDrawer.vue | 51 + .../widget/SettingHeader.vue | 18 + .../art-settings-panel/widget/SettingItem.vue | 101 + .../widget/ThemeSettings.vue | 28 + .../core/layouts/art-work-tab/index.vue | 584 + .../core/media/art-cutter-img/index.vue | 350 + .../core/media/art-video-player/index.vue | 111 + .../core/others/art-menu-right/index.vue | 415 + .../core/others/art-watermark/index.vue | 64 + .../core/tables/art-table-header/index.vue | 339 + .../core/tables/art-table/index.vue | 342 + .../core/tables/art-table/style.scss | 99 + .../core/text-effect/art-count-to/index.vue | 310 + .../art-festival-text-scroll/index.vue | 32 + .../text-effect/art-text-scroll/index.vue | 285 + .../components/core/theme/theme-svg/index.vue | 100 + .../core/views/exception/ArtException.vue | 43 + .../core/views/login/AuthTopBar.vue | 149 + .../core/views/login/LoginLeftView.vue | 602 + .../core/views/result/ArtResultPage.vue | 43 + .../core/widget/art-icon-button/index.vue | 23 + .../src/config/assets/images.ts | 61 + art-design-pro-3.0.1/src/config/index.ts | 135 + .../src/config/modules/component.ts | 105 + .../src/config/modules/fastEnter.ts | 127 + .../src/config/modules/festival.ts | 51 + .../src/config/modules/headerBar.ts | 63 + art-design-pro-3.0.1/src/config/setting.ts | 109 + .../src/directives/business/highlight.ts | 248 + .../src/directives/business/ripple.ts | 114 + .../src/directives/core/auth.ts | 68 + .../src/directives/core/roles.ts | 89 + art-design-pro-3.0.1/src/directives/index.ts | 12 + art-design-pro-3.0.1/src/enums/appEnum.ts | 81 + art-design-pro-3.0.1/src/enums/formEnum.ts | 24 + art-design-pro-3.0.1/src/env.d.ts | 34 + .../src/hooks/core/useAppMode.ts | 45 + .../src/hooks/core/useAuth.ts | 74 + .../src/hooks/core/useCeremony.ts | 184 + .../src/hooks/core/useChart.ts | 745 + .../src/hooks/core/useCommon.ts | 87 + .../src/hooks/core/useFastEnter.ts | 55 + .../src/hooks/core/useHeaderBar.ts | 201 + .../src/hooks/core/useLayoutHeight.ts | 148 + .../src/hooks/core/useTable.ts | 736 + .../src/hooks/core/useTableColumns.ts | 256 + .../src/hooks/core/useTableHeight.ts | 105 + .../src/hooks/core/useTheme.ts | 174 + art-design-pro-3.0.1/src/hooks/index.ts | 32 + art-design-pro-3.0.1/src/locales/index.ts | 123 + .../src/locales/langs/en.json | 348 + .../src/locales/langs/zh.json | 348 + art-design-pro-3.0.1/src/main.ts | 25 + .../src/mock/json/chinaMap.json | 25643 ++++++++++++++++ .../src/mock/temp/articleList.ts | 193 + .../src/mock/temp/commentDetail.ts | 79 + .../src/mock/temp/commentList.ts | 242 + .../src/mock/temp/formData.ts | 273 + .../src/mock/upgrade/changeLog.ts | 431 + art-design-pro-3.0.1/src/plugins/echarts.ts | 76 + art-design-pro-3.0.1/src/plugins/index.ts | 6 + .../src/router/core/ComponentLoader.ts | 82 + .../src/router/core/IframeRouteManager.ts | 78 + .../src/router/core/MenuProcessor.ts | 241 + .../router/core/RoutePermissionValidator.ts | 119 + .../src/router/core/RouteRegistry.ts | 90 + .../src/router/core/RouteTransformer.ts | 132 + .../src/router/core/RouteValidator.ts | 187 + art-design-pro-3.0.1/src/router/core/index.ts | 14 + .../src/router/guards/afterEach.ts | 34 + .../src/router/guards/beforeEach.ts | 360 + art-design-pro-3.0.1/src/router/index.ts | 23 + .../src/router/modules/article.ts | 60 + .../src/router/modules/dashboard.ts | 45 + .../src/router/modules/examples.ts | 135 + .../src/router/modules/exception.ts | 46 + .../src/router/modules/help.ts | 52 + .../src/router/modules/index.ts | 27 + .../src/router/modules/result.ts | 33 + .../src/router/modules/safeguard.ts | 24 + .../src/router/modules/system.ts | 149 + .../src/router/modules/template.ts | 84 + .../src/router/modules/widgets.ts | 146 + .../src/router/routes/asyncRoutes.ts | 9 + .../src/router/routes/staticRoutes.ts | 72 + .../src/router/routesAlias.ts | 8 + art-design-pro-3.0.1/src/store/index.ts | 52 + .../src/store/modules/menu.ts | 109 + .../src/store/modules/setting.ts | 450 + .../src/store/modules/table.ts | 97 + .../src/store/modules/user.ts | 235 + .../src/store/modules/worktab.ts | 568 + art-design-pro-3.0.1/src/types/api/api.d.ts | 135 + .../src/types/common/index.ts | 95 + .../src/types/common/response.ts | 30 + .../src/types/component/chart.ts | 324 + .../src/types/component/index.ts | 145 + .../src/types/config/index.ts | 211 + art-design-pro-3.0.1/src/types/index.ts | 22 + .../src/types/router/index.ts | 80 + art-design-pro-3.0.1/src/types/store/index.ts | 157 + .../src/utils/constants/index.ts | 8 + .../src/utils/constants/links.ts | 35 + art-design-pro-3.0.1/src/utils/form/index.ts | 12 + .../src/utils/form/responsive.ts | 122 + .../src/utils/form/validator.ts | 316 + art-design-pro-3.0.1/src/utils/http/error.ts | 182 + art-design-pro-3.0.1/src/utils/http/index.ts | 214 + art-design-pro-3.0.1/src/utils/http/status.ts | 18 + art-design-pro-3.0.1/src/utils/index.ts | 34 + .../src/utils/navigation/index.ts | 10 + .../src/utils/navigation/jump.ts | 62 + .../src/utils/navigation/route.ts | 78 + .../src/utils/navigation/worktab.ts | 67 + art-design-pro-3.0.1/src/utils/router.ts | 61 + .../src/utils/socket/index.ts | 388 + .../src/utils/storage/index.ts | 7 + .../src/utils/storage/storage-config.ts | 122 + .../src/utils/storage/storage-key-manager.ts | 97 + .../src/utils/storage/storage.ts | 250 + art-design-pro-3.0.1/src/utils/sys/console.ts | 13 + .../src/utils/sys/error-handle.ts | 102 + art-design-pro-3.0.1/src/utils/sys/index.ts | 6 + art-design-pro-3.0.1/src/utils/sys/mittBus.ts | 63 + art-design-pro-3.0.1/src/utils/sys/upgrade.ts | 277 + .../src/utils/table/tableCache.ts | 266 + .../src/utils/table/tableConfig.ts | 55 + .../src/utils/table/tableUtils.ts | 297 + .../src/utils/ui/animation.ts | 80 + art-design-pro-3.0.1/src/utils/ui/colors.ts | 273 + art-design-pro-3.0.1/src/utils/ui/emojo.ts | 24 + .../src/utils/ui/iconify-loader.ts | 31 + art-design-pro-3.0.1/src/utils/ui/index.ts | 11 + art-design-pro-3.0.1/src/utils/ui/loading.ts | 84 + art-design-pro-3.0.1/src/utils/ui/tabs.ts | 60 + .../src/views/article/comment/index.vue | 132 + .../src/views/article/detail/index.vue | 136 + .../src/views/article/list/index.vue | 195 + .../src/views/article/publish/index.vue | 339 + .../src/views/auth/forget-password/index.vue | 62 + .../src/views/auth/login/index.vue | 285 + .../src/views/auth/login/style.css | 38 + .../src/views/auth/register/index.vue | 240 + .../src/views/change/log/index.vue | 53 + .../src/views/dashboard/analysis/index.vue | 50 + .../modules/customer-satisfaction.vue | 50 + .../modules/sales-mapping-by-country.vue | 19 + .../analysis/modules/target-vs-reality.vue | 79 + .../analysis/modules/today-sales.vue | 86 + .../analysis/modules/top-products.vue | 94 + .../analysis/modules/total-revenue.vue | 44 + .../analysis/modules/visitor-insights.vue | 43 + .../analysis/modules/volume-service-level.vue | 51 + .../src/views/dashboard/console/index.vue | 41 + .../console/modules/about-project.vue | 44 + .../dashboard/console/modules/active-user.vue | 47 + .../dashboard/console/modules/card-list.vue | 74 + .../console/modules/dynamic-stats.vue | 79 + .../dashboard/console/modules/new-user.vue | 169 + .../console/modules/sales-overview.vue | 43 + .../dashboard/console/modules/todo-list.vue | 71 + .../src/views/dashboard/ecommerce/index.vue | 77 + .../ecommerce/modules/annual-sales.vue | 39 + .../dashboard/ecommerce/modules/banner.vue | 65 + .../modules/cart-conversion-rate.vue | 11 + .../ecommerce/modules/hot-commodity.vue | 74 + .../ecommerce/modules/hot-products-list.vue | 195 + .../ecommerce/modules/product-sales.vue | 22 + .../ecommerce/modules/recent-transaction.vue | 57 + .../modules/sales-classification.vue | 44 + .../ecommerce/modules/sales-growth.vue | 23 + .../ecommerce/modules/sales-trend.vue | 17 + .../ecommerce/modules/total-order-volume.vue | 23 + .../ecommerce/modules/total-products.vue | 19 + .../ecommerce/modules/transaction-list.vue | 70 + .../src/views/examples/forms/index.vue | 740 + .../src/views/examples/forms/search-bar.vue | 695 + .../examples/permission/button-auth/index.vue | 529 + .../permission/page-visibility/index.vue | 255 + .../examples/permission/switch-role/index.vue | 209 + .../src/views/examples/socket-chat/index.vue | 499 + .../src/views/examples/tables/basic.vue | 63 + .../src/views/examples/tables/index.vue | 1288 + .../src/views/examples/tables/tree.vue | 237 + .../src/views/examples/tabs/index.vue | 121 + .../src/views/exception/403/index.vue | 16 + .../src/views/exception/404/index.vue | 16 + .../src/views/exception/500/index.vue | 16 + .../src/views/index/index.vue | 29 + .../src/views/index/style.scss | 93 + .../src/views/outside/Iframe.vue | 42 + .../src/views/result/fail/index.vue | 28 + .../src/views/result/success/index.vue | 21 + .../src/views/safeguard/server/index.vue | 168 + .../src/views/system/menu/index.vue | 479 + .../views/system/menu/modules/menu-dialog.vue | 384 + .../src/views/system/nested/menu1/index.vue | 5 + .../src/views/system/nested/menu2/index.vue | 5 + .../src/views/system/nested/menu3/index.vue | 5 + .../system/nested/menu3/menu3-2/index.vue | 5 + .../src/views/system/role/index.vue | 242 + .../system/role/modules/role-edit-dialog.vue | 162 + .../role/modules/role-permission-dialog.vue | 254 + .../views/system/role/modules/role-search.vue | 121 + .../src/views/system/user-center/index.vue | 247 + .../src/views/system/user/index.vue | 261 + .../views/system/user/modules/user-dialog.vue | 143 + .../views/system/user/modules/user-search.vue | 112 + .../src/views/template/banners/index.vue | 217 + .../src/views/template/calendar/index.vue | 288 + .../src/views/template/cards/index.vue | 450 + .../src/views/template/charts/index.vue | 355 + .../src/views/template/chat/index.vue | 452 + .../src/views/template/map/index.vue | 17 + .../src/views/template/pricing/index.vue | 134 + .../src/views/widgets/context-menu/index.vue | 136 + .../src/views/widgets/count-to/index.vue | 175 + .../src/views/widgets/drag/index.vue | 108 + .../src/views/widgets/excel/index.vue | 151 + .../src/views/widgets/fireworks/index.vue | 116 + .../src/views/widgets/icon/index.vue | 110 + .../src/views/widgets/image-crop/index.vue | 59 + .../src/views/widgets/qrcode/index.vue | 130 + .../src/views/widgets/text-scroll/index.vue | 51 + .../src/views/widgets/video/index.vue | 32 + .../src/views/widgets/wang-editor/index.vue | 537 + .../src/views/widgets/watermark/index.vue | 75 + art-design-pro-3.0.1/tsconfig.json | 28 + art-design-pro-3.0.1/vite.config.ts | 156 + .../Controllers/MenuController.cs | 69 + .../Controllers/RemoteDesktopController.cs | 120 +- .../AmtScanner.Api/Data/DbSeeder.cs | 7 + .../AmtScanner.Api/add_amt_menus.sql | 48 + .../adminSystem/src/views/testdir/mypage.vue | 21 + .../adminSystem/src/views/testdir/mypage2.vue | 21 + 407 files changed, 88985 insertions(+), 48 deletions(-) create mode 100644 adminSystem/src/api/amt.ts create mode 100644 adminSystem/src/views/amt/credentials.vue create mode 100644 adminSystem/src/views/amt/devices.vue create mode 100644 adminSystem/src/views/amt/modules/hardware-info-modal.vue create mode 100644 adminSystem/src/views/amt/modules/remote-desktop-modal.vue create mode 100644 adminSystem/src/views/amt/scan.vue create mode 100644 adminSystem/src/views/amt/windows-credentials.vue create mode 100644 adminSystem/src/views/remote/index.vue create mode 100644 art-design-pro-3.0.1/.env.development create mode 100644 art-design-pro-3.0.1/.env.production create mode 100644 art-design-pro-3.0.1/.gitattributes create mode 100644 art-design-pro-3.0.1/.gitignore create mode 100644 art-design-pro-3.0.1/.husky/commit-msg create mode 100644 art-design-pro-3.0.1/.husky/pre-commit create mode 100644 art-design-pro-3.0.1/.prettierignore create mode 100644 art-design-pro-3.0.1/.prettierrc create mode 100644 art-design-pro-3.0.1/.stylelintignore create mode 100644 art-design-pro-3.0.1/.stylelintrc.cjs create mode 100644 art-design-pro-3.0.1/CHANGELOG.md create mode 100644 art-design-pro-3.0.1/CHANGELOG.zh-CN.md create mode 100644 art-design-pro-3.0.1/LICENSE create mode 100644 art-design-pro-3.0.1/README.md create mode 100644 art-design-pro-3.0.1/README.zh-CN.md create mode 100644 art-design-pro-3.0.1/commitlint.config.cjs create mode 100644 art-design-pro-3.0.1/eslint.config.mjs create mode 100644 art-design-pro-3.0.1/index.html create mode 100644 art-design-pro-3.0.1/package.json create mode 100644 art-design-pro-3.0.1/pnpm-lock.yaml create mode 100644 art-design-pro-3.0.1/public/favicon.ico create mode 100644 art-design-pro-3.0.1/scripts/clean-dev.ts create mode 100644 art-design-pro-3.0.1/src/App.vue create mode 100644 art-design-pro-3.0.1/src/api/auth.ts create mode 100644 art-design-pro-3.0.1/src/api/system-manage.ts create mode 100644 art-design-pro-3.0.1/src/assets/images/3d/icon1.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/3d/icon2.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/3d/icon3.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/3d/icon4.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/3d/icon5.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/3d/icon6.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/3d/icon7.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/3d/icon8.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar1.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar10.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar2.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar3.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar4.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar5.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar6.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar7.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar8.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/avatar/avatar9.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/ceremony/hb.png create mode 100644 art-design-pro-3.0.1/src/assets/images/ceremony/sd.png create mode 100644 art-design-pro-3.0.1/src/assets/images/ceremony/xc.png create mode 100644 art-design-pro-3.0.1/src/assets/images/ceremony/yd.png create mode 100644 art-design-pro-3.0.1/src/assets/images/common/logo.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img1.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img10.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img2.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img3.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img4.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img5.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img6.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img7.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img8.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/cover/img9.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/draw/draw1.png create mode 100644 art-design-pro-3.0.1/src/assets/images/favicon.ico create mode 100644 art-design-pro-3.0.1/src/assets/images/lock/bg_dark.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/lock/bg_light.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/login/lf_icon2.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/safeguard/server.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/menu_layouts/dual_column.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/menu_layouts/horizontal.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/menu_layouts/mixed.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/menu_layouts/vertical.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/menu_styles/dark.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/menu_styles/design.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/menu_styles/light.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/theme_styles/dark.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/theme_styles/light.png create mode 100644 art-design-pro-3.0.1/src/assets/images/settings/theme_styles/system.png create mode 100644 art-design-pro-3.0.1/src/assets/images/svg/403.svg create mode 100644 art-design-pro-3.0.1/src/assets/images/svg/404.svg create mode 100644 art-design-pro-3.0.1/src/assets/images/svg/500.svg create mode 100644 art-design-pro-3.0.1/src/assets/images/svg/login_icon.svg create mode 100644 art-design-pro-3.0.1/src/assets/images/user/avatar.webp create mode 100644 art-design-pro-3.0.1/src/assets/images/user/bg.webp create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/app.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/dark.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/el-dark.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/el-light.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/el-ui.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/md.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/mixin.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/reset.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/router-transition.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/tailwind.css create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/theme-animation.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/core/theme-change.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/custom/one-dark-pro.scss create mode 100644 art-design-pro-3.0.1/src/assets/styles/index.scss create mode 100644 art-design-pro-3.0.1/src/assets/svg/loading.ts create mode 100644 art-design-pro-3.0.1/src/components/business/comment-widget/index.vue create mode 100644 art-design-pro-3.0.1/src/components/business/comment-widget/widget/CommentItem.vue create mode 100644 art-design-pro-3.0.1/src/components/core/banners/art-basic-banner/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/banners/art-card-banner/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/base/art-back-to-top/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/base/art-logo/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/base/art-svg-icon/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/cards/art-bar-chart-card/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/cards/art-data-list-card/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/cards/art-donut-chart-card/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/cards/art-image-card/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/cards/art-line-chart-card/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/cards/art-progress-card/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/cards/art-stats-card/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/cards/art-timeline-list-card/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/charts/art-bar-chart/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/charts/art-dual-bar-compare-chart/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/charts/art-h-bar-chart/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/charts/art-k-line-chart/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/charts/art-line-chart/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/charts/art-map-chart/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/charts/art-radar-chart/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/charts/art-ring-chart/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/charts/art-scatter-chart/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/forms/art-button-more/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/forms/art-button-table/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/forms/art-drag-verify/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/forms/art-excel-export/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/forms/art-excel-import/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/forms/art-form/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/forms/art-search-bar/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/forms/art-wang-editor/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/forms/art-wang-editor/style.scss create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-breadcrumb/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-chat-window/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-fast-enter/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-fireworks-effect/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-global-component/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-global-search/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-header-bar/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-menus/art-horizontal-menu/widget/HorizontalSubmenu.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-menus/art-mixed-menu/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-menus/art-sidebar-menu/style.scss create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-menus/art-sidebar-menu/theme.scss create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-menus/art-sidebar-menu/widget/SidebarSubmenu.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-notification/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-page-content/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-screen-lock/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/composables/useSettingsConfig.ts create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/composables/useSettingsHandlers.ts create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/composables/useSettingsPanel.ts create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/composables/useSettingsState.ts create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/style.scss create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/BasicSettings.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/BoxStyleSettings.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/ColorSettings.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/ContainerSettings.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/MenuLayoutSettings.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/MenuStyleSettings.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/SectionTitle.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/SettingActions.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/SettingDrawer.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/SettingHeader.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/SettingItem.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-settings-panel/widget/ThemeSettings.vue create mode 100644 art-design-pro-3.0.1/src/components/core/layouts/art-work-tab/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/media/art-cutter-img/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/media/art-video-player/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/others/art-menu-right/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/others/art-watermark/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/tables/art-table-header/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/tables/art-table/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/tables/art-table/style.scss create mode 100644 art-design-pro-3.0.1/src/components/core/text-effect/art-count-to/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/text-effect/art-festival-text-scroll/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/text-effect/art-text-scroll/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/theme/theme-svg/index.vue create mode 100644 art-design-pro-3.0.1/src/components/core/views/exception/ArtException.vue create mode 100644 art-design-pro-3.0.1/src/components/core/views/login/AuthTopBar.vue create mode 100644 art-design-pro-3.0.1/src/components/core/views/login/LoginLeftView.vue create mode 100644 art-design-pro-3.0.1/src/components/core/views/result/ArtResultPage.vue create mode 100644 art-design-pro-3.0.1/src/components/core/widget/art-icon-button/index.vue create mode 100644 art-design-pro-3.0.1/src/config/assets/images.ts create mode 100644 art-design-pro-3.0.1/src/config/index.ts create mode 100644 art-design-pro-3.0.1/src/config/modules/component.ts create mode 100644 art-design-pro-3.0.1/src/config/modules/fastEnter.ts create mode 100644 art-design-pro-3.0.1/src/config/modules/festival.ts create mode 100644 art-design-pro-3.0.1/src/config/modules/headerBar.ts create mode 100644 art-design-pro-3.0.1/src/config/setting.ts create mode 100644 art-design-pro-3.0.1/src/directives/business/highlight.ts create mode 100644 art-design-pro-3.0.1/src/directives/business/ripple.ts create mode 100644 art-design-pro-3.0.1/src/directives/core/auth.ts create mode 100644 art-design-pro-3.0.1/src/directives/core/roles.ts create mode 100644 art-design-pro-3.0.1/src/directives/index.ts create mode 100644 art-design-pro-3.0.1/src/enums/appEnum.ts create mode 100644 art-design-pro-3.0.1/src/enums/formEnum.ts create mode 100644 art-design-pro-3.0.1/src/env.d.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useAppMode.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useAuth.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useCeremony.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useChart.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useCommon.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useFastEnter.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useHeaderBar.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useLayoutHeight.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useTable.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useTableColumns.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useTableHeight.ts create mode 100644 art-design-pro-3.0.1/src/hooks/core/useTheme.ts create mode 100644 art-design-pro-3.0.1/src/hooks/index.ts create mode 100644 art-design-pro-3.0.1/src/locales/index.ts create mode 100644 art-design-pro-3.0.1/src/locales/langs/en.json create mode 100644 art-design-pro-3.0.1/src/locales/langs/zh.json create mode 100644 art-design-pro-3.0.1/src/main.ts create mode 100644 art-design-pro-3.0.1/src/mock/json/chinaMap.json create mode 100644 art-design-pro-3.0.1/src/mock/temp/articleList.ts create mode 100644 art-design-pro-3.0.1/src/mock/temp/commentDetail.ts create mode 100644 art-design-pro-3.0.1/src/mock/temp/commentList.ts create mode 100644 art-design-pro-3.0.1/src/mock/temp/formData.ts create mode 100644 art-design-pro-3.0.1/src/mock/upgrade/changeLog.ts create mode 100644 art-design-pro-3.0.1/src/plugins/echarts.ts create mode 100644 art-design-pro-3.0.1/src/plugins/index.ts create mode 100644 art-design-pro-3.0.1/src/router/core/ComponentLoader.ts create mode 100644 art-design-pro-3.0.1/src/router/core/IframeRouteManager.ts create mode 100644 art-design-pro-3.0.1/src/router/core/MenuProcessor.ts create mode 100644 art-design-pro-3.0.1/src/router/core/RoutePermissionValidator.ts create mode 100644 art-design-pro-3.0.1/src/router/core/RouteRegistry.ts create mode 100644 art-design-pro-3.0.1/src/router/core/RouteTransformer.ts create mode 100644 art-design-pro-3.0.1/src/router/core/RouteValidator.ts create mode 100644 art-design-pro-3.0.1/src/router/core/index.ts create mode 100644 art-design-pro-3.0.1/src/router/guards/afterEach.ts create mode 100644 art-design-pro-3.0.1/src/router/guards/beforeEach.ts create mode 100644 art-design-pro-3.0.1/src/router/index.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/article.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/dashboard.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/examples.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/exception.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/help.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/index.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/result.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/safeguard.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/system.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/template.ts create mode 100644 art-design-pro-3.0.1/src/router/modules/widgets.ts create mode 100644 art-design-pro-3.0.1/src/router/routes/asyncRoutes.ts create mode 100644 art-design-pro-3.0.1/src/router/routes/staticRoutes.ts create mode 100644 art-design-pro-3.0.1/src/router/routesAlias.ts create mode 100644 art-design-pro-3.0.1/src/store/index.ts create mode 100644 art-design-pro-3.0.1/src/store/modules/menu.ts create mode 100644 art-design-pro-3.0.1/src/store/modules/setting.ts create mode 100644 art-design-pro-3.0.1/src/store/modules/table.ts create mode 100644 art-design-pro-3.0.1/src/store/modules/user.ts create mode 100644 art-design-pro-3.0.1/src/store/modules/worktab.ts create mode 100644 art-design-pro-3.0.1/src/types/api/api.d.ts create mode 100644 art-design-pro-3.0.1/src/types/common/index.ts create mode 100644 art-design-pro-3.0.1/src/types/common/response.ts create mode 100644 art-design-pro-3.0.1/src/types/component/chart.ts create mode 100644 art-design-pro-3.0.1/src/types/component/index.ts create mode 100644 art-design-pro-3.0.1/src/types/config/index.ts create mode 100644 art-design-pro-3.0.1/src/types/index.ts create mode 100644 art-design-pro-3.0.1/src/types/router/index.ts create mode 100644 art-design-pro-3.0.1/src/types/store/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/constants/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/constants/links.ts create mode 100644 art-design-pro-3.0.1/src/utils/form/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/form/responsive.ts create mode 100644 art-design-pro-3.0.1/src/utils/form/validator.ts create mode 100644 art-design-pro-3.0.1/src/utils/http/error.ts create mode 100644 art-design-pro-3.0.1/src/utils/http/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/http/status.ts create mode 100644 art-design-pro-3.0.1/src/utils/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/navigation/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/navigation/jump.ts create mode 100644 art-design-pro-3.0.1/src/utils/navigation/route.ts create mode 100644 art-design-pro-3.0.1/src/utils/navigation/worktab.ts create mode 100644 art-design-pro-3.0.1/src/utils/router.ts create mode 100644 art-design-pro-3.0.1/src/utils/socket/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/storage/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/storage/storage-config.ts create mode 100644 art-design-pro-3.0.1/src/utils/storage/storage-key-manager.ts create mode 100644 art-design-pro-3.0.1/src/utils/storage/storage.ts create mode 100644 art-design-pro-3.0.1/src/utils/sys/console.ts create mode 100644 art-design-pro-3.0.1/src/utils/sys/error-handle.ts create mode 100644 art-design-pro-3.0.1/src/utils/sys/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/sys/mittBus.ts create mode 100644 art-design-pro-3.0.1/src/utils/sys/upgrade.ts create mode 100644 art-design-pro-3.0.1/src/utils/table/tableCache.ts create mode 100644 art-design-pro-3.0.1/src/utils/table/tableConfig.ts create mode 100644 art-design-pro-3.0.1/src/utils/table/tableUtils.ts create mode 100644 art-design-pro-3.0.1/src/utils/ui/animation.ts create mode 100644 art-design-pro-3.0.1/src/utils/ui/colors.ts create mode 100644 art-design-pro-3.0.1/src/utils/ui/emojo.ts create mode 100644 art-design-pro-3.0.1/src/utils/ui/iconify-loader.ts create mode 100644 art-design-pro-3.0.1/src/utils/ui/index.ts create mode 100644 art-design-pro-3.0.1/src/utils/ui/loading.ts create mode 100644 art-design-pro-3.0.1/src/utils/ui/tabs.ts create mode 100644 art-design-pro-3.0.1/src/views/article/comment/index.vue create mode 100644 art-design-pro-3.0.1/src/views/article/detail/index.vue create mode 100644 art-design-pro-3.0.1/src/views/article/list/index.vue create mode 100644 art-design-pro-3.0.1/src/views/article/publish/index.vue create mode 100644 art-design-pro-3.0.1/src/views/auth/forget-password/index.vue create mode 100644 art-design-pro-3.0.1/src/views/auth/login/index.vue create mode 100644 art-design-pro-3.0.1/src/views/auth/login/style.css create mode 100644 art-design-pro-3.0.1/src/views/auth/register/index.vue create mode 100644 art-design-pro-3.0.1/src/views/change/log/index.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/analysis/index.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/analysis/modules/customer-satisfaction.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/analysis/modules/sales-mapping-by-country.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/analysis/modules/target-vs-reality.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/analysis/modules/today-sales.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/analysis/modules/top-products.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/analysis/modules/total-revenue.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/analysis/modules/visitor-insights.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/analysis/modules/volume-service-level.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/console/index.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/console/modules/about-project.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/console/modules/active-user.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/console/modules/card-list.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/console/modules/dynamic-stats.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/console/modules/new-user.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/console/modules/sales-overview.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/console/modules/todo-list.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/index.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/annual-sales.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/banner.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/cart-conversion-rate.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/hot-commodity.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/hot-products-list.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/product-sales.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/recent-transaction.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/sales-classification.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/sales-growth.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/sales-trend.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/total-order-volume.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/total-products.vue create mode 100644 art-design-pro-3.0.1/src/views/dashboard/ecommerce/modules/transaction-list.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/forms/index.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/forms/search-bar.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/permission/button-auth/index.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/permission/page-visibility/index.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/permission/switch-role/index.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/socket-chat/index.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/tables/basic.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/tables/index.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/tables/tree.vue create mode 100644 art-design-pro-3.0.1/src/views/examples/tabs/index.vue create mode 100644 art-design-pro-3.0.1/src/views/exception/403/index.vue create mode 100644 art-design-pro-3.0.1/src/views/exception/404/index.vue create mode 100644 art-design-pro-3.0.1/src/views/exception/500/index.vue create mode 100644 art-design-pro-3.0.1/src/views/index/index.vue create mode 100644 art-design-pro-3.0.1/src/views/index/style.scss create mode 100644 art-design-pro-3.0.1/src/views/outside/Iframe.vue create mode 100644 art-design-pro-3.0.1/src/views/result/fail/index.vue create mode 100644 art-design-pro-3.0.1/src/views/result/success/index.vue create mode 100644 art-design-pro-3.0.1/src/views/safeguard/server/index.vue create mode 100644 art-design-pro-3.0.1/src/views/system/menu/index.vue create mode 100644 art-design-pro-3.0.1/src/views/system/menu/modules/menu-dialog.vue create mode 100644 art-design-pro-3.0.1/src/views/system/nested/menu1/index.vue create mode 100644 art-design-pro-3.0.1/src/views/system/nested/menu2/index.vue create mode 100644 art-design-pro-3.0.1/src/views/system/nested/menu3/index.vue create mode 100644 art-design-pro-3.0.1/src/views/system/nested/menu3/menu3-2/index.vue create mode 100644 art-design-pro-3.0.1/src/views/system/role/index.vue create mode 100644 art-design-pro-3.0.1/src/views/system/role/modules/role-edit-dialog.vue create mode 100644 art-design-pro-3.0.1/src/views/system/role/modules/role-permission-dialog.vue create mode 100644 art-design-pro-3.0.1/src/views/system/role/modules/role-search.vue create mode 100644 art-design-pro-3.0.1/src/views/system/user-center/index.vue create mode 100644 art-design-pro-3.0.1/src/views/system/user/index.vue create mode 100644 art-design-pro-3.0.1/src/views/system/user/modules/user-dialog.vue create mode 100644 art-design-pro-3.0.1/src/views/system/user/modules/user-search.vue create mode 100644 art-design-pro-3.0.1/src/views/template/banners/index.vue create mode 100644 art-design-pro-3.0.1/src/views/template/calendar/index.vue create mode 100644 art-design-pro-3.0.1/src/views/template/cards/index.vue create mode 100644 art-design-pro-3.0.1/src/views/template/charts/index.vue create mode 100644 art-design-pro-3.0.1/src/views/template/chat/index.vue create mode 100644 art-design-pro-3.0.1/src/views/template/map/index.vue create mode 100644 art-design-pro-3.0.1/src/views/template/pricing/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/context-menu/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/count-to/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/drag/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/excel/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/fireworks/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/icon/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/image-crop/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/qrcode/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/text-scroll/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/video/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/wang-editor/index.vue create mode 100644 art-design-pro-3.0.1/src/views/widgets/watermark/index.vue create mode 100644 art-design-pro-3.0.1/tsconfig.json create mode 100644 art-design-pro-3.0.1/vite.config.ts create mode 100644 backend-csharp/AmtScanner.Api/add_amt_menus.sql create mode 100644 backend-csharp/adminSystem/src/views/testdir/mypage.vue create mode 100644 backend-csharp/adminSystem/src/views/testdir/mypage2.vue diff --git a/adminSystem/src/api/amt.ts b/adminSystem/src/api/amt.ts new file mode 100644 index 0000000..f618627 --- /dev/null +++ b/adminSystem/src/api/amt.ts @@ -0,0 +1,279 @@ +import request from '@/utils/http' + +// 扫描 API +export const scanApi = { + // 启动扫描 + startScan(networkSegment: string, subnetMask: string) { + return request.post({ + url: '/api/scan/start', + params: { networkSegment, subnetMask } + }) + }, + + // 获取扫描状态 + getScanStatus(taskId: string) { + return request.get({ + url: `/api/scan/status/${taskId}` + }) + }, + + // 取消扫描 + cancelScan(taskId: string) { + return request.post({ + url: `/api/scan/cancel/${taskId}` + }) + } +} + +// 设备 API +export const deviceApi = { + // 获取所有设备 + getAllDevices() { + return request.get({ + url: '/api/devices' + }) + }, + + // 搜索设备 + searchDevices(keyword: string) { + return request.get({ + url: '/api/devices/search', + params: { keyword } + }) + }, + + // 删除设备 + deleteDevice(id: number) { + return request.del({ + url: `/api/devices/${id}`, + showSuccessMessage: true + }) + }, + + // 检测所有设备在线状态 + checkAllDevicesStatus() { + return request.get({ + url: '/api/devices/status' + }) + }, + + // 检测单个设备在线状态 + checkDeviceStatus(id: number) { + return request.get({ + url: `/api/devices/${id}/status` + }) + } +} + +// 硬件信息 API +export const hardwareApi = { + // 获取设备硬件信息 + getHardwareInfo(deviceId: number, refresh = false) { + return request.get({ + url: `/api/hardware-info/${deviceId}`, + params: { refresh } + }) + }, + + // 批量获取硬件信息 + getBatchHardwareInfo(deviceIds: number[], refresh = false) { + return request.post({ + url: '/api/hardware-info/batch', + params: { deviceIds, refresh } + }) + } +} + +// 电源管理 API +export const powerApi = { + // 获取电源状态 + getPowerState(deviceId: number) { + return request.get({ + url: `/api/power/${deviceId}/state` + }) + }, + + // 开机 + powerOn(deviceId: number) { + return request.post({ + url: `/api/power/${deviceId}/power-on` + }) + }, + + // 关机(优雅关机) + powerOff(deviceId: number) { + return request.post({ + url: `/api/power/${deviceId}/power-off` + }) + }, + + // 强制关机 + forceOff(deviceId: number) { + return request.post({ + url: `/api/power/${deviceId}/force-off` + }) + }, + + // 重启(优雅重启) + restart(deviceId: number) { + return request.post({ + url: `/api/power/${deviceId}/restart` + }) + }, + + // 强制重启 + forceRestart(deviceId: number) { + return request.post({ + url: `/api/power/${deviceId}/force-restart` + }) + }, + + // 电源循环 + powerCycle(deviceId: number) { + return request.post({ + url: `/api/power/${deviceId}/power-cycle` + }) + } +} + +// AMT 凭据 API +export const credentialApi = { + // 获取所有凭据 + getAllCredentials() { + return request.get({ + url: '/api/credentials' + }) + }, + + // 创建凭据 + createCredential(data: { name: string; username: string; password: string; isDefault?: boolean; description?: string }) { + return request.post({ + url: '/api/credentials', + params: data, + showSuccessMessage: true + }) + }, + + // 更新凭据 + updateCredential(id: number, data: { name?: string; username?: string; password?: string; isDefault?: boolean; description?: string }) { + return request.put({ + url: `/api/credentials/${id}`, + params: data, + showSuccessMessage: true + }) + }, + + // 删除凭据 + deleteCredential(id: number) { + return request.del({ + url: `/api/credentials/${id}`, + showSuccessMessage: true + }) + } +} + +// Windows 凭据 API +export const windowsCredentialsApi = { + // 获取所有凭据 + getAll() { + return request.get({ + url: '/api/windowscredentials' + }) + }, + + // 创建凭据 + create(data: { name: string; username: string; password: string; domain?: string; isDefault?: boolean; description?: string }) { + return request.post({ + url: '/api/windowscredentials', + params: data, + showSuccessMessage: true + }) + }, + + // 更新凭据 + update(id: number, data: { name?: string; username?: string; password?: string; domain?: string; isDefault?: boolean; description?: string }) { + return request.put({ + url: `/api/windowscredentials/${id}`, + params: data, + showSuccessMessage: true + }) + }, + + // 删除凭据 + delete(id: number) { + return request.del({ + url: `/api/windowscredentials/${id}`, + showSuccessMessage: true + }) + }, + + // 设置默认凭据 + setDefault(id: number) { + return request.post({ + url: `/api/windowscredentials/${id}/set-default`, + showSuccessMessage: true + }) + } +} + +// 远程桌面 API +export const remoteDesktopApi = { + // 直接连接(需要凭据) + connect(deviceId: number, credentials: { username: string; password: string; domain?: string }) { + return request.post({ + url: `/api/remotedesktop/connect/${deviceId}`, + params: credentials + }) + }, + + // 生成访问 Token + generateToken(deviceId: number, options: { credentialId?: number; expiresInMinutes?: number; maxUseCount?: number; note?: string } = {}) { + return request.post({ + url: `/api/remotedesktop/generate-token/${deviceId}`, + params: options + }) + }, + + // 通过 Token 连接 + connectByToken(token: string) { + return request.get({ + url: `/api/remotedesktop/connect-by-token/${token}` + }) + }, + + // 验证 Token + validateToken(token: string) { + return request.get({ + url: `/api/remotedesktop/validate-token/${token}` + }) + }, + + // 获取设备的所有 Token + getDeviceTokens(deviceId: number) { + return request.get({ + url: `/api/remotedesktop/list-tokens/${deviceId}` + }) + }, + + // 撤销 Token + revokeToken(tokenId: number) { + return request.del({ + url: `/api/remotedesktop/revoke-token/${tokenId}`, + showSuccessMessage: true + }) + }, + + // 清理过期 Token + cleanupTokens() { + return request.post({ + url: '/api/remotedesktop/cleanup-tokens' + }) + }, + + // 测试 Guacamole 连接 + test() { + return request.get({ + url: '/api/remotedesktop/test' + }) + } +} diff --git a/adminSystem/src/router/guards/beforeEach.ts b/adminSystem/src/router/guards/beforeEach.ts index 0571e4f..a035740 100644 --- a/adminSystem/src/router/guards/beforeEach.ts +++ b/adminSystem/src/router/guards/beforeEach.ts @@ -129,12 +129,23 @@ async function handleRouteGuard( NProgress.start() } - // 1. 检查登录状态 + // 1. 检查是否为静态路由(不需要权限验证) + if (isStaticRoute(to.path)) { + // 静态路由直接放行,不需要登录验证和权限验证 + if (to.matched.length > 0) { + setWorktab(to) + setPageTitle(to) + next() + return + } + } + + // 2. 检查登录状态 if (!handleLoginStatus(to, userStore, next)) { return } - // 2. 处理动态路由注册 + // 3. 处理动态路由注册 if (!routeRegistry?.isRegistered() && userStore.isLogin) { await handleDynamicRoutes(to, next, router) return diff --git a/adminSystem/src/router/routes/staticRoutes.ts b/adminSystem/src/router/routes/staticRoutes.ts index 334d0c2..629eaf3 100644 --- a/adminSystem/src/router/routes/staticRoutes.ts +++ b/adminSystem/src/router/routes/staticRoutes.ts @@ -11,13 +11,13 @@ import { AppRouteRecordRaw } from '@/utils/router' * 2、静态路由不管是否登录都可以访问 */ export const staticRoutes: AppRouteRecordRaw[] = [ - // 不需要登录就能访问的路由示例 - // { - // path: '/welcome', - // name: 'WelcomeStatic', - // component: () => import('@views/dashboard/console/index.vue'), - // meta: { title: 'menus.dashboard.title' } - // }, + // 远程桌面访问页面(不需要登录) + { + path: '/remote/:token', + name: 'RemoteAccess', + component: () => import('@views/remote/index.vue'), + meta: { title: '远程桌面', isHideTab: true } + }, { path: '/auth/login', name: 'Login', diff --git a/adminSystem/src/views/amt/credentials.vue b/adminSystem/src/views/amt/credentials.vue new file mode 100644 index 0000000..52347ce --- /dev/null +++ b/adminSystem/src/views/amt/credentials.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/adminSystem/src/views/amt/devices.vue b/adminSystem/src/views/amt/devices.vue new file mode 100644 index 0000000..dfb0126 --- /dev/null +++ b/adminSystem/src/views/amt/devices.vue @@ -0,0 +1,309 @@ + + + + + diff --git a/adminSystem/src/views/amt/modules/hardware-info-modal.vue b/adminSystem/src/views/amt/modules/hardware-info-modal.vue new file mode 100644 index 0000000..ac40ad2 --- /dev/null +++ b/adminSystem/src/views/amt/modules/hardware-info-modal.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/adminSystem/src/views/amt/modules/remote-desktop-modal.vue b/adminSystem/src/views/amt/modules/remote-desktop-modal.vue new file mode 100644 index 0000000..848b7df --- /dev/null +++ b/adminSystem/src/views/amt/modules/remote-desktop-modal.vue @@ -0,0 +1,305 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/result/fail/index.vue b/art-design-pro-3.0.1/src/views/result/fail/index.vue new file mode 100644 index 0000000..8fe2583 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/result/fail/index.vue @@ -0,0 +1,28 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/result/success/index.vue b/art-design-pro-3.0.1/src/views/result/success/index.vue new file mode 100644 index 0000000..ae57aba --- /dev/null +++ b/art-design-pro-3.0.1/src/views/result/success/index.vue @@ -0,0 +1,21 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/safeguard/server/index.vue b/art-design-pro-3.0.1/src/views/safeguard/server/index.vue new file mode 100644 index 0000000..368ac27 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/safeguard/server/index.vue @@ -0,0 +1,168 @@ + + + + diff --git a/art-design-pro-3.0.1/src/views/system/menu/index.vue b/art-design-pro-3.0.1/src/views/system/menu/index.vue new file mode 100644 index 0000000..973b1e7 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/menu/index.vue @@ -0,0 +1,479 @@ + + + + diff --git a/art-design-pro-3.0.1/src/views/system/menu/modules/menu-dialog.vue b/art-design-pro-3.0.1/src/views/system/menu/modules/menu-dialog.vue new file mode 100644 index 0000000..f512301 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/menu/modules/menu-dialog.vue @@ -0,0 +1,384 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/system/nested/menu1/index.vue b/art-design-pro-3.0.1/src/views/system/nested/menu1/index.vue new file mode 100644 index 0000000..9eb2bab --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/nested/menu1/index.vue @@ -0,0 +1,5 @@ + diff --git a/art-design-pro-3.0.1/src/views/system/nested/menu2/index.vue b/art-design-pro-3.0.1/src/views/system/nested/menu2/index.vue new file mode 100644 index 0000000..8da183f --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/nested/menu2/index.vue @@ -0,0 +1,5 @@ + diff --git a/art-design-pro-3.0.1/src/views/system/nested/menu3/index.vue b/art-design-pro-3.0.1/src/views/system/nested/menu3/index.vue new file mode 100644 index 0000000..fc7d496 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/nested/menu3/index.vue @@ -0,0 +1,5 @@ + diff --git a/art-design-pro-3.0.1/src/views/system/nested/menu3/menu3-2/index.vue b/art-design-pro-3.0.1/src/views/system/nested/menu3/menu3-2/index.vue new file mode 100644 index 0000000..7387a03 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/nested/menu3/menu3-2/index.vue @@ -0,0 +1,5 @@ + diff --git a/art-design-pro-3.0.1/src/views/system/role/index.vue b/art-design-pro-3.0.1/src/views/system/role/index.vue new file mode 100644 index 0000000..aca447e --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/role/index.vue @@ -0,0 +1,242 @@ + + + + diff --git a/art-design-pro-3.0.1/src/views/system/role/modules/role-edit-dialog.vue b/art-design-pro-3.0.1/src/views/system/role/modules/role-edit-dialog.vue new file mode 100644 index 0000000..46ff9b1 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/role/modules/role-edit-dialog.vue @@ -0,0 +1,162 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/system/role/modules/role-permission-dialog.vue b/art-design-pro-3.0.1/src/views/system/role/modules/role-permission-dialog.vue new file mode 100644 index 0000000..3691ac8 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/role/modules/role-permission-dialog.vue @@ -0,0 +1,254 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/system/role/modules/role-search.vue b/art-design-pro-3.0.1/src/views/system/role/modules/role-search.vue new file mode 100644 index 0000000..1d59cee --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/role/modules/role-search.vue @@ -0,0 +1,121 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/system/user-center/index.vue b/art-design-pro-3.0.1/src/views/system/user-center/index.vue new file mode 100644 index 0000000..ab52f00 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/user-center/index.vue @@ -0,0 +1,247 @@ + + + + diff --git a/art-design-pro-3.0.1/src/views/system/user/index.vue b/art-design-pro-3.0.1/src/views/system/user/index.vue new file mode 100644 index 0000000..fb794d7 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/user/index.vue @@ -0,0 +1,261 @@ + + + + + + + + diff --git a/art-design-pro-3.0.1/src/views/system/user/modules/user-dialog.vue b/art-design-pro-3.0.1/src/views/system/user/modules/user-dialog.vue new file mode 100644 index 0000000..03cab4f --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/user/modules/user-dialog.vue @@ -0,0 +1,143 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/system/user/modules/user-search.vue b/art-design-pro-3.0.1/src/views/system/user/modules/user-search.vue new file mode 100644 index 0000000..e097720 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/system/user/modules/user-search.vue @@ -0,0 +1,112 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/template/banners/index.vue b/art-design-pro-3.0.1/src/views/template/banners/index.vue new file mode 100644 index 0000000..2702156 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/template/banners/index.vue @@ -0,0 +1,217 @@ + + + + + diff --git a/art-design-pro-3.0.1/src/views/template/calendar/index.vue b/art-design-pro-3.0.1/src/views/template/calendar/index.vue new file mode 100644 index 0000000..5a35403 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/template/calendar/index.vue @@ -0,0 +1,288 @@ + + + + + diff --git a/art-design-pro-3.0.1/src/views/template/cards/index.vue b/art-design-pro-3.0.1/src/views/template/cards/index.vue new file mode 100644 index 0000000..4308754 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/template/cards/index.vue @@ -0,0 +1,450 @@ + + + + + diff --git a/art-design-pro-3.0.1/src/views/template/charts/index.vue b/art-design-pro-3.0.1/src/views/template/charts/index.vue new file mode 100644 index 0000000..1f5dd13 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/template/charts/index.vue @@ -0,0 +1,355 @@ + + + + + + diff --git a/art-design-pro-3.0.1/src/views/template/chat/index.vue b/art-design-pro-3.0.1/src/views/template/chat/index.vue new file mode 100644 index 0000000..d7d5c09 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/template/chat/index.vue @@ -0,0 +1,452 @@ + + + + diff --git a/art-design-pro-3.0.1/src/views/template/map/index.vue b/art-design-pro-3.0.1/src/views/template/map/index.vue new file mode 100644 index 0000000..3171d83 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/template/map/index.vue @@ -0,0 +1,17 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/template/pricing/index.vue b/art-design-pro-3.0.1/src/views/template/pricing/index.vue new file mode 100644 index 0000000..0845293 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/template/pricing/index.vue @@ -0,0 +1,134 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/context-menu/index.vue b/art-design-pro-3.0.1/src/views/widgets/context-menu/index.vue new file mode 100644 index 0000000..03a0a1a --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/context-menu/index.vue @@ -0,0 +1,136 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/count-to/index.vue b/art-design-pro-3.0.1/src/views/widgets/count-to/index.vue new file mode 100644 index 0000000..70a0620 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/count-to/index.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/drag/index.vue b/art-design-pro-3.0.1/src/views/widgets/drag/index.vue new file mode 100644 index 0000000..61379f7 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/drag/index.vue @@ -0,0 +1,108 @@ + + + + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/excel/index.vue b/art-design-pro-3.0.1/src/views/widgets/excel/index.vue new file mode 100644 index 0000000..47b15b2 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/excel/index.vue @@ -0,0 +1,151 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/fireworks/index.vue b/art-design-pro-3.0.1/src/views/widgets/fireworks/index.vue new file mode 100644 index 0000000..e2026a2 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/fireworks/index.vue @@ -0,0 +1,116 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/icon/index.vue b/art-design-pro-3.0.1/src/views/widgets/icon/index.vue new file mode 100644 index 0000000..333afd4 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/icon/index.vue @@ -0,0 +1,110 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/image-crop/index.vue b/art-design-pro-3.0.1/src/views/widgets/image-crop/index.vue new file mode 100644 index 0000000..27376bc --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/image-crop/index.vue @@ -0,0 +1,59 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/qrcode/index.vue b/art-design-pro-3.0.1/src/views/widgets/qrcode/index.vue new file mode 100644 index 0000000..1d4c8c5 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/qrcode/index.vue @@ -0,0 +1,130 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/text-scroll/index.vue b/art-design-pro-3.0.1/src/views/widgets/text-scroll/index.vue new file mode 100644 index 0000000..7cfefe5 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/text-scroll/index.vue @@ -0,0 +1,51 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/video/index.vue b/art-design-pro-3.0.1/src/views/widgets/video/index.vue new file mode 100644 index 0000000..1a83891 --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/video/index.vue @@ -0,0 +1,32 @@ + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/wang-editor/index.vue b/art-design-pro-3.0.1/src/views/widgets/wang-editor/index.vue new file mode 100644 index 0000000..25b42aa --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/wang-editor/index.vue @@ -0,0 +1,537 @@ + + + + + diff --git a/art-design-pro-3.0.1/src/views/widgets/watermark/index.vue b/art-design-pro-3.0.1/src/views/widgets/watermark/index.vue new file mode 100644 index 0000000..956d8ce --- /dev/null +++ b/art-design-pro-3.0.1/src/views/widgets/watermark/index.vue @@ -0,0 +1,75 @@ + + + diff --git a/art-design-pro-3.0.1/tsconfig.json b/art-design-pro-3.0.1/tsconfig.json new file mode 100644 index 0000000..4331962 --- /dev/null +++ b/art-design-pro-3.0.1/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "jsx": "preserve", + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["esnext", "dom"], + "types": ["vite/client", "node", "element-plus/global"], + "skipLibCheck": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"], + "@views/*": ["src/views/*"], + "@imgs/*": ["src/assets/images/*"], + "@icons/*": ["src/assets/icons/*"], + "@utils/*": ["src/utils/*"], + "@stores/*": ["src/store/*"], + "@plugins/*": ["src/plugins/*"], + "@styles/*": ["src/assets/styles/*"] + } + }, + "include": ["src/**/*", "src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "exclude": ["node_modules", "dist", "**/*.js"] +} diff --git a/art-design-pro-3.0.1/vite.config.ts b/art-design-pro-3.0.1/vite.config.ts new file mode 100644 index 0000000..c2ef072 --- /dev/null +++ b/art-design-pro-3.0.1/vite.config.ts @@ -0,0 +1,156 @@ +import { defineConfig, loadEnv } from 'vite' +import vue from '@vitejs/plugin-vue' +import path from 'path' +import { fileURLToPath } from 'url' +import vueDevTools from 'vite-plugin-vue-devtools' +import viteCompression from 'vite-plugin-compression' +import Components from 'unplugin-vue-components/vite' +import AutoImport from 'unplugin-auto-import/vite' +import ElementPlus from 'unplugin-element-plus/vite' +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' +import tailwindcss from '@tailwindcss/vite' +// import { visualizer } from 'rollup-plugin-visualizer' + +export default ({ mode }: { mode: string }) => { + const root = process.cwd() + const env = loadEnv(mode, root) + const { VITE_VERSION, VITE_PORT, VITE_BASE_URL, VITE_API_URL, VITE_API_PROXY_URL } = env + + console.log(`🚀 API_URL = ${VITE_API_URL}`) + console.log(`🚀 VERSION = ${VITE_VERSION}`) + + return defineConfig({ + define: { + __APP_VERSION__: JSON.stringify(VITE_VERSION) + }, + base: VITE_BASE_URL, + server: { + port: Number(VITE_PORT), + proxy: { + '/api': { + target: VITE_API_PROXY_URL, + changeOrigin: true + } + }, + host: true + }, + // 路径别名 + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + '@views': resolvePath('src/views'), + '@imgs': resolvePath('src/assets/images'), + '@icons': resolvePath('src/assets/icons'), + '@utils': resolvePath('src/utils'), + '@stores': resolvePath('src/store'), + '@styles': resolvePath('src/assets/styles') + } + }, + build: { + target: 'es2015', + outDir: 'dist', + chunkSizeWarningLimit: 2000, + minify: 'terser', + terserOptions: { + compress: { + // 生产环境去除 console + drop_console: true, + // 生产环境去除 debugger + drop_debugger: true + } + }, + dynamicImportVarsOptions: { + warnOnError: true, + exclude: [], + include: ['src/views/**/*.vue'] + } + }, + plugins: [ + vue(), + tailwindcss(), + // 自动按需导入 API + AutoImport({ + imports: ['vue', 'vue-router', 'pinia', '@vueuse/core'], + dts: 'src/types/import/auto-imports.d.ts', + resolvers: [ElementPlusResolver()], + eslintrc: { + enabled: true, + filepath: './.auto-import.json', + globalsPropValue: true + } + }), + // 自动按需导入组件 + Components({ + dts: 'src/types/import/components.d.ts', + resolvers: [ElementPlusResolver()] + }), + // 按需定制主题配置 + ElementPlus({ + useSource: true + }), + // 压缩 + viteCompression({ + verbose: false, // 是否在控制台输出压缩结果 + disable: false, // 是否禁用 + algorithm: 'gzip', // 压缩算法 + ext: '.gz', // 压缩后的文件名后缀 + threshold: 10240, // 只有大小大于该值的资源会被处理 10240B = 10KB + deleteOriginFile: false // 压缩后是否删除原文件 + }), + vueDevTools() + // 打包分析 + // visualizer({ + // open: true, + // gzipSize: true, + // brotliSize: true, + // filename: 'dist/stats.html' // 分析图生成的文件名及路径 + // }), + ], + // 依赖预构建:避免运行时重复请求与转换,提升首次加载速度 + optimizeDeps: { + include: [ + 'echarts/core', + 'echarts/charts', + 'echarts/components', + 'echarts/renderers', + 'xlsx', + 'xgplayer', + 'crypto-js', + 'file-saver', + 'vue-img-cutter', + 'element-plus/es', + 'element-plus/es/components/*/style/css', + 'element-plus/es/components/*/style/index' + ] + }, + css: { + preprocessorOptions: { + // sass variable and mixin + scss: { + additionalData: ` + @use "@styles/core/el-light.scss" as *; + @use "@styles/core/mixin.scss" as *; + ` + } + }, + postcss: { + plugins: [ + { + postcssPlugin: 'internal:charset-removal', + AtRule: { + charset: (atRule) => { + if (atRule.name === 'charset') { + atRule.remove() + } + } + } + } + ] + } + } + }) +} + +function resolvePath(paths: string) { + return path.resolve(__dirname, paths) +} diff --git a/backend-csharp/AmtScanner.Api/Controllers/MenuController.cs b/backend-csharp/AmtScanner.Api/Controllers/MenuController.cs index 4b9ff71..284ed13 100644 --- a/backend-csharp/AmtScanner.Api/Controllers/MenuController.cs +++ b/backend-csharp/AmtScanner.Api/Controllers/MenuController.cs @@ -282,6 +282,13 @@ defineOptions({{ name: '{componentName}' }}) new() { Id = 1, Name = "Dashboard", Path = "/dashboard", Component = "/index/index", Title = "menus.dashboard.title", Icon = "ri:pie-chart-line", Sort = 1, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true }, new() { Id = 2, ParentId = 1, Name = "Console", Path = "console", Component = "/dashboard/console", Title = "menus.dashboard.console", KeepAlive = false, Sort = 1, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true }, + // AMT 设备管理菜单(系统内置) + new() { Id = 5, Name = "AmtManage", Path = "/amt", Component = "/index/index", Title = "设备管理", Icon = "ri:computer-line", Sort = 2, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { Id = 6, ParentId = 5, Name = "AmtScan", Path = "scan", Component = "/amt/scan", Title = "网络扫描", KeepAlive = true, Sort = 1, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { Id = 7, ParentId = 5, Name = "AmtDevices", Path = "devices", Component = "/amt/devices", Title = "设备列表", KeepAlive = true, Sort = 2, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { Id = 8, ParentId = 5, Name = "AmtCredentials", Path = "credentials", Component = "/amt/credentials", Title = "AMT凭据", KeepAlive = true, Sort = 3, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { Id = 9, ParentId = 5, Name = "WindowsCredentials", Path = "windows-credentials", Component = "/amt/windows-credentials", Title = "Windows凭据", KeepAlive = true, Sort = 4, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + // 系统管理菜单(系统内置) new() { Id = 10, Name = "System", Path = "/system", Component = "/index/index", Title = "menus.system.title", Icon = "ri:user-3-line", Sort = 99, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, new() { Id = 11, ParentId = 10, Name = "User", Path = "user", Component = "/system/user", Title = "menus.system.user", KeepAlive = true, Sort = 1, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, @@ -319,6 +326,68 @@ defineOptions({{ name: '{componentName}' }}) return Ok(ApiResponse.Success(null, "菜单已重置为默认配置")); } + + /// + /// 添加 AMT 设备管理菜单(如果不存在) + /// + [Authorize] + [HttpPost("api/menu/seed-amt")] + public async Task>> SeedAmtMenus() + { + // 检查是否已存在 AMT 菜单 + if (await _context.Menus.AnyAsync(m => m.Name == "AmtManage")) + { + return Ok(ApiResponse.Success(null, "AMT菜单已存在")); + } + + // 获取当前最大 ID + var maxId = await _context.Menus.MaxAsync(m => (int?)m.Id) ?? 0; + var startId = Math.Max(maxId + 1, 5); + + var amtMenus = new List + { + new() { Name = "AmtManage", Path = "/amt", Component = "/index/index", Title = "设备管理", Icon = "ri:computer-line", Sort = 2, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + }; + + _context.Menus.AddRange(amtMenus); + await _context.SaveChangesAsync(); + + // 获取刚创建的目录菜单 ID + var amtManageId = amtMenus[0].Id; + + // 添加子菜单 + var childMenus = new List + { + new() { ParentId = amtManageId, Name = "AmtScan", Path = "scan", Component = "/amt/scan", Title = "网络扫描", KeepAlive = true, Sort = 1, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { ParentId = amtManageId, Name = "AmtDevices", Path = "devices", Component = "/amt/devices", Title = "设备列表", KeepAlive = true, Sort = 2, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { ParentId = amtManageId, Name = "AmtCredentials", Path = "credentials", Component = "/amt/credentials", Title = "AMT凭据", KeepAlive = true, Sort = 3, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { ParentId = amtManageId, Name = "WindowsCredentials", Path = "windows-credentials", Component = "/amt/windows-credentials", Title = "Windows凭据", KeepAlive = true, Sort = 4, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + }; + + _context.Menus.AddRange(childMenus); + await _context.SaveChangesAsync(); + + // 为超级管理员和管理员分配菜单权限 + var superRole = await _context.Roles.FirstOrDefaultAsync(r => r.RoleCode == "R_SUPER"); + var adminRole = await _context.Roles.FirstOrDefaultAsync(r => r.RoleCode == "R_ADMIN"); + + var allNewMenuIds = new List { amtManageId }; + allNewMenuIds.AddRange(childMenus.Select(m => m.Id)); + + var roleMenus = new List(); + foreach (var menuId in allNewMenuIds) + { + if (superRole != null) + roleMenus.Add(new RoleMenu { RoleId = superRole.Id, MenuId = menuId }); + if (adminRole != null) + roleMenus.Add(new RoleMenu { RoleId = adminRole.Id, MenuId = menuId }); + } + + _context.RoleMenus.AddRange(roleMenus); + await _context.SaveChangesAsync(); + + return Ok(ApiResponse.Success(null, "AMT菜单已添加成功")); + } } /// diff --git a/backend-csharp/AmtScanner.Api/Controllers/RemoteDesktopController.cs b/backend-csharp/AmtScanner.Api/Controllers/RemoteDesktopController.cs index 58b1973..f22c082 100644 --- a/backend-csharp/AmtScanner.Api/Controllers/RemoteDesktopController.cs +++ b/backend-csharp/AmtScanner.Api/Controllers/RemoteDesktopController.cs @@ -25,24 +25,34 @@ public class RemoteDesktopController : ControllerBase _logger = logger; } + /// + /// 生成远程访问 Token(管理员使用) + /// [HttpPost("generate-token/{deviceId}")] - public async Task> GenerateToken( + public async Task>> GenerateToken( long deviceId, [FromBody] GenerateTokenRequest request) { var device = await _context.AmtDevices.FindAsync(deviceId); if (device == null) - return NotFound(new { error = "设备不存在" }); + return Ok(ApiResponse.Fail(404, "设备不存在")); - WindowsCredential? credential = request.CredentialId.HasValue - ? await _context.WindowsCredentials.FindAsync(request.CredentialId.Value) - : await _context.WindowsCredentials.FirstOrDefaultAsync(c => c.IsDefault); + WindowsCredential? credential = null; + if (request.CredentialId.HasValue) + { + credential = await _context.WindowsCredentials.FindAsync(request.CredentialId.Value); + } + else + { + credential = await _context.WindowsCredentials.FirstOrDefaultAsync(c => c.IsDefault); + } if (credential == null) - return BadRequest(new { error = "请先配置 Windows 凭据" }); + return Ok(ApiResponse.Fail(400, "请先配置 Windows 凭据")); var token = GenerateRandomToken(); var expiresAt = DateTime.UtcNow.AddMinutes(request.ExpiresInMinutes ?? 30); + var accessToken = new RemoteAccessToken { Token = token, @@ -57,22 +67,27 @@ public class RemoteDesktopController : ControllerBase await _context.SaveChangesAsync(); var baseUrl = $"{Request.Scheme}://{Request.Host}"; + var accessUrl = $"{baseUrl}/remote/{token}"; + _logger.LogInformation("Generated remote access token for device {Ip}, expires at {ExpiresAt}", device.IpAddress, expiresAt); - return Ok(new GenerateTokenResponse + return Ok(ApiResponse.Success(new GenerateTokenResponse { Success = true, Token = token, - AccessUrl = $"{baseUrl}/remote/{token}", + AccessUrl = accessUrl, ExpiresAt = expiresAt, MaxUseCount = accessToken.MaxUseCount, DeviceIp = device.IpAddress - }); + }, "Token 生成成功")); } + /// + /// 通过 Token 连接远程桌面 + /// [HttpGet("connect-by-token/{token}")] - public async Task> ConnectByToken(string token) + public async Task>> ConnectByToken(string token) { var accessToken = await _context.RemoteAccessTokens .Include(t => t.Device) @@ -80,13 +95,13 @@ public class RemoteDesktopController : ControllerBase .FirstOrDefaultAsync(t => t.Token == token); if (accessToken == null) - return NotFound(new { error = "无效的访问链接" }); + return Ok(ApiResponse.Fail(404, "无效的访问链接")); if (!accessToken.IsValid()) - return BadRequest(new { error = "访问链接已过期或已达到使用次数上限" }); + return Ok(ApiResponse.Fail(400, "访问链接已过期或已达到使用次数上限")); if (accessToken.Device == null || accessToken.WindowsCredential == null) - return BadRequest(new { error = "设备或凭据信息不完整" }); + return Ok(ApiResponse.Fail(400, "设备或凭据信息不完整")); accessToken.UseCount++; accessToken.UsedAt = DateTime.UtcNow; @@ -94,7 +109,7 @@ public class RemoteDesktopController : ControllerBase var guacToken = await _guacamoleService.GetAuthTokenAsync(); if (string.IsNullOrEmpty(guacToken)) - return StatusCode(503, new { error = "无法连接到 Guacamole 服务" }); + return Ok(ApiResponse.Fail(503, "无法连接到 Guacamole 服务")); var connectionName = $"AMT-{accessToken.Device.IpAddress}"; var connectionId = await _guacamoleService.CreateOrGetConnectionAsync( @@ -102,44 +117,50 @@ public class RemoteDesktopController : ControllerBase accessToken.WindowsCredential.Username, accessToken.WindowsCredential.Password); if (string.IsNullOrEmpty(connectionId)) - return StatusCode(500, new { error = "创建远程连接失败" }); + return Ok(ApiResponse.Fail(500, "创建远程连接失败")); var connectionUrl = await _guacamoleService.GetConnectionUrlAsync(guacToken, connectionId); - return Ok(new RemoteDesktopResponse + return Ok(ApiResponse.Success(new RemoteDesktopResponse { Success = true, ConnectionUrl = connectionUrl, ConnectionId = connectionId, Token = guacToken, DeviceIp = accessToken.Device.IpAddress - }); + })); } + /// + /// 验证 Token 是否有效 + /// [HttpGet("validate-token/{token}")] - public async Task> ValidateToken(string token) + public async Task>> ValidateToken(string token) { var accessToken = await _context.RemoteAccessTokens .Include(t => t.Device) .FirstOrDefaultAsync(t => t.Token == token); if (accessToken == null) - return Ok(new ValidateTokenResponse { Valid = false, Error = "无效的访问链接" }); + return Ok(ApiResponse.Success(new ValidateTokenResponse { Valid = false, Error = "无效的访问链接" })); if (!accessToken.IsValid()) - return Ok(new ValidateTokenResponse { Valid = false, Error = "访问链接已过期或已达到使用次数上限" }); + return Ok(ApiResponse.Success(new ValidateTokenResponse { Valid = false, Error = "访问链接已过期或已达到使用次数上限" })); - return Ok(new ValidateTokenResponse + return Ok(ApiResponse.Success(new ValidateTokenResponse { Valid = true, DeviceIp = accessToken.Device?.IpAddress, ExpiresAt = accessToken.ExpiresAt, RemainingUses = accessToken.MaxUseCount > 0 ? accessToken.MaxUseCount - accessToken.UseCount : -1 - }); + })); } + /// + /// 获取设备的所有有效 Token + /// [HttpGet("list-tokens/{deviceId}")] - public async Task>> GetDeviceTokens(long deviceId) + public async Task>>> GetDeviceTokens(long deviceId) { var tokens = await _context.RemoteAccessTokens .Where(t => t.DeviceId == deviceId && t.ExpiresAt > DateTime.UtcNow) @@ -156,66 +177,78 @@ public class RemoteDesktopController : ControllerBase }) .ToListAsync(); - return Ok(tokens); + return Ok(ApiResponse>.Success(tokens)); } + /// + /// 撤销 Token + /// [HttpDelete("revoke-token/{tokenId}")] - public async Task RevokeToken(long tokenId) + public async Task>> RevokeToken(long tokenId) { var token = await _context.RemoteAccessTokens.FindAsync(tokenId); if (token == null) - return NotFound(new { error = "Token 不存在" }); + return Ok(ApiResponse.Fail(404, "Token 不存在")); _context.RemoteAccessTokens.Remove(token); await _context.SaveChangesAsync(); - return Ok(new { success = true }); + return Ok(ApiResponse.Success(null, "Token 已撤销")); } + /// + /// 清理过期 Token + /// [HttpPost("cleanup-tokens")] - public async Task CleanupExpiredTokens() + public async Task>> CleanupExpiredTokens() { var count = await _context.RemoteAccessTokens .Where(t => t.ExpiresAt < DateTime.UtcNow) .ExecuteDeleteAsync(); - return Ok(new { success = true, deletedCount = count }); + return Ok(ApiResponse.Success(new CleanupTokensResponse { DeletedCount = count }, "已清理 " + count + " 个过期 Token")); } + /// + /// 直接连接(需要输入凭据) + /// [HttpPost("connect/{deviceId}")] - public async Task> Connect(long deviceId, [FromBody] RdpCredentials credentials) + public async Task>> Connect(long deviceId, [FromBody] RdpCredentials credentials) { var device = await _context.AmtDevices.FindAsync(deviceId); if (device == null) - return NotFound(new { error = "设备不存在" }); + return Ok(ApiResponse.Fail(404, "设备不存在")); var guacToken = await _guacamoleService.GetAuthTokenAsync(); if (string.IsNullOrEmpty(guacToken)) - return StatusCode(503, new { error = "无法连接到 Guacamole 服务" }); + return Ok(ApiResponse.Fail(503, "无法连接到 Guacamole 服务")); var connectionName = $"AMT-{device.IpAddress}"; var connectionId = await _guacamoleService.CreateOrGetConnectionAsync( guacToken, connectionName, device.IpAddress, credentials.Username, credentials.Password); if (string.IsNullOrEmpty(connectionId)) - return StatusCode(500, new { error = "创建远程连接失败" }); + return Ok(ApiResponse.Fail(500, "创建远程连接失败")); var connectionUrl = await _guacamoleService.GetConnectionUrlAsync(guacToken, connectionId); - return Ok(new RemoteDesktopResponse + return Ok(ApiResponse.Success(new RemoteDesktopResponse { Success = true, ConnectionUrl = connectionUrl, ConnectionId = connectionId, Token = guacToken - }); + })); } + /// + /// 测试 Guacamole 连接 + /// [HttpGet("test")] - public async Task TestConnection() + public async Task>> TestConnection() { var token = await _guacamoleService.GetAuthTokenAsync(); if (string.IsNullOrEmpty(token)) - return StatusCode(503, new { success = false, error = "无法连接到 Guacamole 服务" }); - return Ok(new { success = true, message = "Guacamole 服务连接正常" }); + return Ok(ApiResponse.Fail(503, "无法连接到 Guacamole 服务")); + return Ok(ApiResponse.Success(new TestConnectionResponse { Success = true, Message = "Guacamole 服务连接正常" })); } private static string GenerateRandomToken() @@ -284,4 +317,15 @@ public class RemoteDesktopResponse public string? Error { get; set; } } +public class CleanupTokensResponse +{ + public int DeletedCount { get; set; } +} + +public class TestConnectionResponse +{ + public bool Success { get; set; } + public string Message { get; set; } = string.Empty; +} + #endregion diff --git a/backend-csharp/AmtScanner.Api/Data/DbSeeder.cs b/backend-csharp/AmtScanner.Api/Data/DbSeeder.cs index 271cd67..17acb71 100644 --- a/backend-csharp/AmtScanner.Api/Data/DbSeeder.cs +++ b/backend-csharp/AmtScanner.Api/Data/DbSeeder.cs @@ -105,6 +105,13 @@ public static class DbSeeder new() { Id = 1, Name = "Dashboard", Path = "/dashboard", Component = "/index/index", Title = "menus.dashboard.title", Icon = "ri:pie-chart-line", Sort = 1, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true }, new() { Id = 2, ParentId = 1, Name = "Console", Path = "console", Component = "/dashboard/console", Title = "menus.dashboard.console", KeepAlive = false, Sort = 1, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true }, + // AMT 设备管理菜单(系统内置) + new() { Id = 5, Name = "AmtManage", Path = "/amt", Component = "/index/index", Title = "设备管理", Icon = "ri:computer-line", Sort = 2, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { Id = 6, ParentId = 5, Name = "AmtScan", Path = "scan", Component = "/amt/scan", Title = "网络扫描", KeepAlive = true, Sort = 1, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { Id = 7, ParentId = 5, Name = "AmtDevices", Path = "devices", Component = "/amt/devices", Title = "设备列表", KeepAlive = true, Sort = 2, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { Id = 8, ParentId = 5, Name = "AmtCredentials", Path = "credentials", Component = "/amt/credentials", Title = "AMT凭据", KeepAlive = true, Sort = 3, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + new() { Id = 9, ParentId = 5, Name = "WindowsCredentials", Path = "windows-credentials", Component = "/amt/windows-credentials", Title = "Windows凭据", KeepAlive = true, Sort = 4, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, + // 系统管理菜单 - 与前端 system.ts 匹配(系统内置) new() { Id = 10, Name = "System", Path = "/system", Component = "/index/index", Title = "menus.system.title", Icon = "ri:user-3-line", Sort = 99, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, new() { Id = 11, ParentId = 10, Name = "User", Path = "user", Component = "/system/user", Title = "menus.system.user", KeepAlive = true, Sort = 1, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, diff --git a/backend-csharp/AmtScanner.Api/add_amt_menus.sql b/backend-csharp/AmtScanner.Api/add_amt_menus.sql new file mode 100644 index 0000000..07777e2 --- /dev/null +++ b/backend-csharp/AmtScanner.Api/add_amt_menus.sql @@ -0,0 +1,48 @@ +-- 添加 AMT 设备管理菜单 +-- 先检查是否已存在,避免重复插入 + +-- 插入目录菜单 +INSERT INTO Menus (Id, ParentId, Name, Path, Component, Title, Icon, Sort, Roles, IsHide, KeepAlive, IsSystem, CreatedAt, UpdatedAt) +SELECT 5, NULL, 'AmtManage', '/amt', '/index/index', '设备管理', 'ri:computer-line', 2, 'R_SUPER,R_ADMIN', 0, 0, 1, NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM Menus WHERE Id = 5 OR Name = 'AmtManage'); + +-- 插入子菜单:网络扫描 +INSERT INTO Menus (Id, ParentId, Name, Path, Component, Title, Icon, Sort, Roles, IsHide, KeepAlive, IsSystem, CreatedAt, UpdatedAt) +SELECT 6, 5, 'AmtScan', 'scan', '/amt/scan', '网络扫描', NULL, 1, 'R_SUPER,R_ADMIN', 0, 1, 1, NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM Menus WHERE Id = 6 OR Name = 'AmtScan'); + +-- 插入子菜单:设备列表 +INSERT INTO Menus (Id, ParentId, Name, Path, Component, Title, Icon, Sort, Roles, IsHide, KeepAlive, IsSystem, CreatedAt, UpdatedAt) +SELECT 7, 5, 'AmtDevices', 'devices', '/amt/devices', '设备列表', NULL, 2, 'R_SUPER,R_ADMIN', 0, 1, 1, NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM Menus WHERE Id = 7 OR Name = 'AmtDevices'); + +-- 插入子菜单:AMT凭据 +INSERT INTO Menus (Id, ParentId, Name, Path, Component, Title, Icon, Sort, Roles, IsHide, KeepAlive, IsSystem, CreatedAt, UpdatedAt) +SELECT 8, 5, 'AmtCredentials', 'credentials', '/amt/credentials', 'AMT凭据', NULL, 3, 'R_SUPER,R_ADMIN', 0, 1, 1, NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM Menus WHERE Id = 8 OR Name = 'AmtCredentials'); + +-- 插入子菜单:Windows凭据 +INSERT INTO Menus (Id, ParentId, Name, Path, Component, Title, Icon, Sort, Roles, IsHide, KeepAlive, IsSystem, CreatedAt, UpdatedAt) +SELECT 9, 5, 'WindowsCredentials', 'windows-credentials', '/amt/windows-credentials', 'Windows凭据', NULL, 4, 'R_SUPER,R_ADMIN', 0, 1, 1, NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM Menus WHERE Id = 9 OR Name = 'WindowsCredentials'); + +-- 为超级管理员和管理员分配新菜单权限 +-- 获取角色ID +SET @superRoleId = (SELECT Id FROM Roles WHERE RoleCode = 'R_SUPER' LIMIT 1); +SET @adminRoleId = (SELECT Id FROM Roles WHERE RoleCode = 'R_ADMIN' LIMIT 1); + +-- 为超级管理员分配菜单 +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@superRoleId, 5); +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@superRoleId, 6); +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@superRoleId, 7); +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@superRoleId, 8); +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@superRoleId, 9); + +-- 为管理员分配菜单 +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@adminRoleId, 5); +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@adminRoleId, 6); +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@adminRoleId, 7); +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@adminRoleId, 8); +INSERT IGNORE INTO RoleMenus (RoleId, MenuId) VALUES (@adminRoleId, 9); + +SELECT '✅ AMT菜单已添加完成' AS Result; diff --git a/backend-csharp/adminSystem/src/views/testdir/mypage.vue b/backend-csharp/adminSystem/src/views/testdir/mypage.vue new file mode 100644 index 0000000..bc80006 --- /dev/null +++ b/backend-csharp/adminSystem/src/views/testdir/mypage.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/backend-csharp/adminSystem/src/views/testdir/mypage2.vue b/backend-csharp/adminSystem/src/views/testdir/mypage2.vue new file mode 100644 index 0000000..d9eca33 --- /dev/null +++ b/backend-csharp/adminSystem/src/views/testdir/mypage2.vue @@ -0,0 +1,21 @@ + + + + +