Compare commits

...

9 Commits
V2.0 ... V3.0

  1. 10
      .dockerignore
  2. 9
      .env
  3. 8
      Dockerfile
  4. BIN
      design-qa-assets/20260814-wetland-detail-v3-final.png
  5. BIN
      design-qa-assets/20260814-wetland-detail-v3.png
  6. BIN
      design-qa-assets/20260814-wetland-full-v3.png
  7. BIN
      design-qa-assets/admin-users-1920x1080.png
  8. BIN
      design-qa-assets/admin-users-748x900.png
  9. 431
      design-qa.md
  10. 5
      docker-entrypoint.d/05-v3-network-lockdown.sh
  11. 1
      docs/assets/AdminForbidden-17545195-balabala-1786807848259.css
  12. 1
      docs/assets/AdminForbidden-1d2d2690-1786807848259.js
  13. 1
      docs/assets/AdminLayout-8db5b2b6-balabala-1786807848259.css
  14. 1
      docs/assets/AdminLayout-a6cc5677-1786807848259.js
  15. 0
      docs/assets/AlibabaPuHuiTi-14435b65-balabala-1786807848259.woff2
  16. 0
      docs/assets/AlimamaShuHeiTi-Bold-6401fd0d-balabala-1786807848259.ttf
  17. 0
      docs/assets/AlimamaShuHeiTi-Bold-a95023f2-balabala-1786807848259.woff
  18. 0
      docs/assets/AlimamaShuHeiTi-Bold-fa4a258d-balabala-1786807848259.woff2
  19. 1
      docs/assets/FeatureInfoPanel-84703f43-balabala-1784132792831.css
  20. 3
      docs/assets/FeatureInfoPanel-8ee1b2b1-1784132792831.js
  21. 3
      docs/assets/FeatureInfoPanel-9b5cdecf-1786807848259.js
  22. 1
      docs/assets/FeatureInfoPanel-ca5da623-balabala-1786807848259.css
  23. 1
      docs/assets/LayerPanel-60397a69-balabala-1786807848259.css
  24. 1
      docs/assets/LayerPanel-7a55b2bc-balabala-1784132792831.css
  25. 1
      docs/assets/LayerPanel-e92912ff-1786807848259.js
  26. 1
      docs/assets/LayerPanel-fa97fc8c-1784132792831.js
  27. 1
      docs/assets/LoginLogs-100aa744-balabala-1786807848259.css
  28. 1
      docs/assets/LoginLogs-75fd6d65-1786807848259.js
  29. 1
      docs/assets/OperationLogs-2a1ead4a-balabala-1786807848259.css
  30. 1
      docs/assets/OperationLogs-5a9b02d9-1786807848259.js
  31. 2
      docs/assets/SmartChartRenderer-3587e73a-1786807848259.js
  32. 0
      docs/assets/SmartChartRenderer-7a3a96b9-balabala-1786807848259.css
  33. 1
      docs/assets/SmartManagementSettings-51339aa1-balabala-1786807848259.css
  34. 1
      docs/assets/SmartManagementSettings-f7b2af66-1786807848259.js
  35. 2
      docs/assets/TopicSwitcher-2e4ca291-1784132792831.js
  36. 1
      docs/assets/TopicSwitcher-b6474311-balabala-1786807848259.css
  37. 2
      docs/assets/TopicSwitcher-c91bad20-1786807848259.js
  38. 1
      docs/assets/TopicSwitcher-f90bcf5a-balabala-1784132792831.css
  39. 1
      docs/assets/UserManagement-03008e91-balabala-1786807848259.css
  40. 1
      docs/assets/UserManagement-a36e0e73-1786807848259.js
  41. 1
      docs/assets/_plugin-vue_export-helper-c27b6911-1786807848259.js
  42. 1
      docs/assets/admin-pages-c250a1ad-balabala-1786807848259.css
  43. 0
      docs/assets/area-b57940eb-balabala-1786807848259.png
  44. 2
      docs/assets/assets-8728b943-1786807848259.js
  45. 0
      docs/assets/bg-3acb94e3-balabala-1786807848259.png
  46. 0
      docs/assets/bottom-menu-arrow-big-180b7071-balabala-1786807848259.svg
  47. 0
      docs/assets/bottom-menu-arrow-small-19304179-balabala-1786807848259.svg
  48. 0
      docs/assets/bottom-menu-bg-b465793d-balabala-1786807848259.png
  49. 0
      docs/assets/bottom-menu-btn-ee5c8064-balabala-1786807848259.png
  50. 0
      docs/assets/bottom-menu-btn-hover-df33e514-balabala-1786807848259.png
  51. 1
      docs/assets/chartTheme-7114e4ea-1786807848259.js
  52. 1
      docs/assets/chartTheme-73e4a943-1784132792831.js
  53. 0
      docs/assets/chinaBlurLine-1a2cbc0f-balabala-1786807848259.png
  54. 0
      docs/assets/content-bottom-left-arrow-3a8a61f3-balabala-1786807848259.svg
  55. 0
      docs/assets/content-bottom-right-arrow-a3c5270d-balabala-1786807848259.svg
  56. 0
      docs/assets/content-middle-line-162bc0d5-balabala-1786807848259.svg
  57. 1
      docs/assets/data-85b25709-1784132792831.js
  58. 458
      docs/assets/data-888ba847-1784132792831.js
  59. 16380
      docs/assets/data-b4247fde-1784132792831.js
  60. 1
      docs/assets/data-bbf42c91-1784132792831.js
  61. 1
      docs/assets/data-ee3975ea-1784132792831.js
  62. 1
      docs/assets/data-ee410ed3-1784132792831.js
  63. 1
      docs/assets/featurePanelLayout-9d4ef87e-1784132792831.js
  64. 1
      docs/assets/featurePanelLayout-f3191169-1786807848259.js
  65. 0
      docs/assets/flyline6-525edf67-balabala-1786807848259.png
  66. 0
      docs/assets/focus_bg-b6803e2d-balabala-1786807848259.png
  67. 0
      docs/assets/focus_move_bg-cf41417a-balabala-1786807848259.png
  68. 1
      docs/assets/geoserver-c6c88e84-1784132792831.js
  69. 0
      docs/assets/header-bg-65b38012-balabala-1786807848259.png
  70. 0
      docs/assets/huiguang-3c5dfda5-balabala-1786807848259.png
  71. 0
      docs/assets/icon1-6f7c222f-balabala-1786807848259.png
  72. 0
      docs/assets/icon2-4f77ccec-balabala-1786807848259.png
  73. 4
      docs/assets/index-007453d8-1784132792831.js
  74. 1
      docs/assets/index-01de7c66-balabala-1786807848259.css
  75. 1
      docs/assets/index-08ee8551-balabala-1784132792831.css
  76. 1
      docs/assets/index-09f1c557-balabala-1786807848259.css
  77. 2
      docs/assets/index-0a7426a0-balabala-1786807848259.css
  78. 4
      docs/assets/index-0eddac6c-1786807848259.js
  79. 1
      docs/assets/index-10abf3f4-balabala-1784132792831.css
  80. 0
      docs/assets/index-148a2898-balabala-1786807848259.css
  81. 16
      docs/assets/index-15d14f49-1786807848259.js
  82. 84
      docs/assets/index-1784132792831.js
  83. 560
      docs/assets/index-1786807848259.js
  84. 2
      docs/assets/index-188d593b-1786807848259.js
  85. 1
      docs/assets/index-1b1ea210-1786807848259.js
  86. 1
      docs/assets/index-1d3ffd1c-balabala-1784132792831.css
  87. 2
      docs/assets/index-24267a69-1784132792831.js
  88. 1
      docs/assets/index-29c113f9-1784132792831.js
  89. 1
      docs/assets/index-2bde92c2-balabala-1784132792831.css
  90. 1
      docs/assets/index-3099739a-balabala-1784132792831.css
  91. 2
      docs/assets/index-427feaa9-1784132792831.js
  92. 1
      docs/assets/index-5095c6be-balabala-1786807848259.css
  93. 115
      docs/assets/index-51b64c4c-1786807848259.js
  94. 1
      docs/assets/index-539da005-1786807848259.js
  95. 1
      docs/assets/index-57a3f5c2-balabala-1786807848259.css
  96. 1
      docs/assets/index-5afedc21-balabala-1784132792831.css
  97. 2
      docs/assets/index-693b4119-1786807848259.js
  98. 1
      docs/assets/index-6965fbd6-balabala-1784132792831.css
  99. 1
      docs/assets/index-69e64e91-1784132792831.js
  100. 1
      docs/assets/index-71d0c80d-balabala-1786807848259.css
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,10 @@
.git
node_modules
.vite
tmp
logs
*.log
.env
.env.*
*.local
.DS_Store

@ -1,9 +0,0 @@
# VITE_APP_BASE_URL=/VisualTemplate/
VITE_APP_BASE_URL=/
VITE_OPEN_API_BASE=/openApi
VITE_JSY_API_BASE=/jsyApi
VITE_GEOSERVER_WMS_URL=/geoserver/ne/wms
VITE_ACCOUNT_API_PROXY_TARGET=http://127.0.0.1:8888
VITE_OPEN_API_PROXY_TARGET=http://127.0.0.1:9999
VITE_JSY_API_PROXY_TARGET=http://127.0.0.1:9999
VITE_GEOSERVER_PROXY_TARGET=http://127.0.0.1:8080

@ -0,0 +1,8 @@
FROM nginx:1.27-alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY nginx-main.conf /etc/nginx/nginx.conf
COPY docker-entrypoint.d/05-v3-network-lockdown.sh /docker-entrypoint.d/05-v3-network-lockdown.sh
RUN chmod 0755 /docker-entrypoint.d/05-v3-network-lockdown.sh
# 宿主机完成 Vite 构建和校验;镜像只替换 V3 静态运行包,不重复构建依赖。
COPY docs /usr/share/nginx/html
EXPOSE 80 55433 56380 19999 18081

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

@ -1,346 +1,153 @@
**Source Visual Truth**
- Reference screenshot: `/Users/mocker/.codex/attachments/448ee497-991a-4afa-b23d-00015b35ab41/image-1.png`
- Reference source: `/Users/mocker/Downloads/ThreeProject-gd_副本/src/components/mCard/index.vue`
- Reference chart source: `/Users/mocker/Downloads/ThreeProject-gd_副本/src/views/gdMap/components/BulkCommoditySalesChart.vue`
**Implementation Evidence**
- Home: `/tmp/screen2-home-bright-pass2-wait.png`
- Forest-Grass-Wet: `/tmp/screen2-forest-grass-wet-bright-check.png`
- Ecological Protection: `/tmp/screen2-ecological-protection-bright-check.png`
- Yak Management: `/tmp/screen2-yak-management-bright-check.png`
- Pasture Management: `/tmp/screen2-pasture-management-bright-check.png`
- Yak Industry Chain before final label fix: `/tmp/screen2-yak-industry-chain-four-card-check.png`
- Yak Industry Chain artificial grassland final: `/tmp/screen2-yak-industry-chain-final-check.png`
- Viewport: `1920x1080`
- Local route base: `http://127.0.0.1:5174/#/platform`
**Checks Completed**
- Card shell uses the reference fill/opacity, with page-level extra `filter`, drop-shadow, and title glow removed.
- Homepage chart labels, dashed grid lines, units, and bar proportions were aligned with the reference chart style.
- `forestGrassWet`, `ecologicalProtection`, `yakManagement`, `pastureManagement`, and `yakIndustryChain` no longer override `m-card` into the darker/blurrier style.
- WebGL pixel ratio cap is now `2`, improving map and canvas sharpness on the 1920x1080 target.
- Yak Industry Chain default stage now has four meaningful left cards:
- 家庭生态牧场乡镇分布
- 标准化建设配置
- 乡镇割草地、储草基地面积
- 草料配套类型占比
- Yak Industry Chain top metric label was shortened from `活动场地及通道` to `活动场地` to avoid text/value collision; the source data field remains unchanged.
**Yak Industry Chain DOM Verification**
- Left card positions: `y=128/367/606/831`, widths about `385px`, four cards present.
- Right list card height: `466px`, matching the previous “最高占据两个卡片高度” direction.
- Top metrics after fix:
- 家庭生态牧场 252处
- 标准化暖棚 61600㎡
- 饲草料库 12000㎡
- 活动场地 108800㎡
- Artificial grassland topic uses business dimensions instead of plot-only wording:
- 人工种草乡镇面积
- 年度项目建设面积
- 建设类型面积
- 作业方式面积
- Artificial grassland top metrics verified in browser:
- 实测种草面积 5.64万亩
- 建设项目 6项
- 覆盖乡镇 7个
- 项目投资 4309.48万元
**Notes**
- The in-app browser screenshot channel timed out after the final HMR refresh on the WebGL-heavy industry page, but DOM verification confirmed the final four-card and label state.
- A standalone Playwright screenshot reached the login page because it had no authenticated session; no browser cookies or local storage were copied.
**Final Result**
- Visual standardization pass: passed for the requested style foundation.
- Remaining product decision: Ecological Protection still contains some low-density/empty-data panels; this pass did not invent new business data for empty modules.
## 2026-07-12 Homepage Brightness Correction
**Source Visual Truth**
- User reference crop: `/var/folders/dh/pf6z830j3w3drsd1k4ncl7br0000gn/T/codex-clipboard-ab9196eb-0d73-4022-9008-0da0dbe7948e.png`
- Reference project: `/Users/mocker/Downloads/ThreeProject-gd_副本`
- Reference card source: `/Users/mocker/Downloads/ThreeProject-gd_副本/src/components/mCard/index.vue`
- Reference chart source: `/Users/mocker/Downloads/ThreeProject-gd_副本/src/views/gdMap/components/BulkCommoditySalesChart.vue`
**Implementation Evidence**
- Browser-rendered homepage: `/tmp/screen2-home-overlay-fixed-loaded.png`
- Full-view comparison: `/tmp/screen2-reference-vs-home-fixed-full.png`
- Focused card comparison: `/tmp/screen2-reference-vs-home-fixed-card.png`
- Browser viewport: `1280x720`; platform design canvas: `1920x1080` through the existing autofit layer.
- State: homepage loaded, left and right panels visible, map animation complete.
**Comparison History**
- Earlier P1: card titles, chart labels, values, and borders were uniformly dimmer than the reference even though `m-card` used the same SVG and body opacity.
- Root cause: `.large-screen-wrap::after` belongs to a shell with `z-index: 3`, while each platform module is a sibling at `z-index: 1`. The background texture therefore covered the entire module in the integrated platform. In the standalone reference page the cards are children above that texture.
- Fix: disable the shell pseudo-element in the integrated platform. Map and module-owned backgrounds remain unchanged; only the unintended foreground veil is removed.
- Post-fix evidence: browser-computed overlay content is `none`; title is `16px/600`, opacity `1`; card body opacity remains the reference value `0.6`.
**Required Fidelity Surfaces**
- Fonts and typography: title size, weight, gradient, chart labels, and values now follow the reference source; ten-town density remains intentionally higher than the five-category reference.
- Spacing and layout: four-card stacks, 398px design width, 12px gaps, and the existing left/right perspective are unchanged.
- Colors and tokens: the foreground dimming veil is removed; card fill, border cyan, title gradient, and chart colors remain source-aligned.
- Image quality: original SVG card assets are byte-identical to the reference project; no replacement raster or CSS approximation was introduced.
- Copy and content: real Hongyuan business titles and ten-town data are preserved.
- Primary interaction and console check: homepage loaded successfully; no browser warnings or errors were recorded.
**Findings**
- No remaining actionable P0/P1/P2 mismatch in the homepage card brightness treatment.
- P3: the ten-town chart necessarily uses smaller labels than the five-item reference chart; this is an intentional data-density difference requested for the project.
# Admin User Management Design QA
final result: passed
- Source visual truth:
- `/var/folders/dh/pf6z830j3w3drsd1k4ncl7br0000gn/T/codex-clipboard-4f350d7a-605f-4e3a-af3a-baef9478d5a3.png`
- `/var/folders/dh/pf6z830j3w3drsd1k4ncl7br0000gn/T/codex-clipboard-9a503763-7c19-436d-b9a5-734fd8d88ac5.png`
- Implementation screenshots:
- `design-qa-assets/admin-users-748x900.png`
- `design-qa-assets/admin-users-1920x1080.png`
- Viewports: 748 × 900 CSS px and 1920 × 1080 CSS px.
- Pixel dimensions: source crops are 748 × 330 and 748 × 72; implementation captures match their stated CSS viewport at device scale 1.
- State: authenticated user-management default list after Magic API reload.
## 2026-07-13 Yak Industry Chain Stage Rhythm Pass
**Scope**
- Page: `http://127.0.0.1:5174/#/platform?module=yak-industry-chain`
- Files changed:
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/yakIndustryChain/data.js`
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/yakIndustryChain/index.vue`
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/screen2-ui-standard.md`
**Stage Audit**
- Checked all 10 bottom stages: 家庭生态牧场、人工种草、规模化养殖基地、选育/扩繁基地、防灾减灾、奶源站、屠宰与加工、农机装备、牧草交易、社会化服务.
- All left sides render 4 visible cards.
- Generic right-side stages now follow the four-slot rhythm: list card `466px` + `环节核心指标 227px` + `建设要点 239px`.
- Artificial grassland remains four separate right cards; family pasture remains `2+1+1`.
**Fixes**
- Removed accidental `fillHeight` stretching from generic right-side `环节核心指标` and `建设要点`, which had made those cards `306/322px` and broke the four-slot rhythm.
- Added empty-state handling for yak-industry town column panels. When a stage has no positive business data, the panel shows `暂无业务统计数据` instead of an empty coordinate grid.
- Updated the UI standard: no-data charts must not render empty axes/grids.
**Evidence**
- 规模化养殖基地 fixed screenshot: `/tmp/screen2-standard-audit/yak-industry-规模化养殖基地-fixed-20260713.png`
- 奶源站 empty-state screenshot: `/tmp/screen2-standard-audit/yak-industry-奶源站-empty-standard-20260713.png`
- 牧草交易 empty-state screenshot: `/tmp/screen2-standard-audit/yak-industry-牧草交易-empty-standard-20260713.png`
- Browser console error check: no errors.
- Production build check: `npm run build` passed.
## Full-view comparison evidence
final result: passed
- The source showed a horizontal form overflowing beyond the card and action buttons wrapping under the first field. At 748 px the implementation now collapses the sidebar, keeps all six controls inside the card, and places actions in a dedicated right-aligned row.
- The source showed a secondary explanatory sentence below the page title. The implementation removes that sentence on user management, operation logs, and login logs.
- At 1920 px the filter card uses a balanced three-column grid and the table remains fully usable.
## 2026-07-13 Ecological National Park Top Metrics
## Focused region comparison evidence
**Scope**
- Page: `http://127.0.0.1:5174/#/platform?module=ecological-protection&view=national-park`
- File changed: `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/platform/index.vue`
- Screenshot evidence: `/tmp/screen2-standard-audit/ecology-national-park-top-metrics-home-style-stable-20260713.png`
- Filter labels use a fixed 76 px label track with flexible controls, preventing the clipped `用户昵称` case shown in the source.
- The first two data rows are `超级管理员` users; the first ordinary `牧户` user follows after them.
- Querying phone `18015775886` returns one row and retains the `超级管理员` tag. Reset restores the administrator-first order.
**Fix**
- The national park five-metric strip now reuses the homepage top-stat presentation instead of a custom full-width summary band.
- Removed the top-stat sweep pseudo-background inside the platform top metric area so five indicators no longer visually merge into one dark translucent bar.
- Added a compact national-park five-item rule so `公益岗位` stays clear of the right-side cards while preserving the homepage-style icon, label, value and unit.
## Required fidelity surfaces
**Validation**
- Browser check at `1920x1080`: five metrics render as separate homepage-style indicators.
- Computed top metric wrapper: `display: flex`, width `1100px`, no summary-strip background.
- First right-side card begins at `x=1502`; last metric ends at `x=1528`, with text no longer sitting on the right-card title area.
- Browser console error check: no errors.
- Fonts and typography: existing PingFang/Alibaba PuHui system stack preserved; labels, headings, and table hierarchy remain consistent.
- Spacing and layout rhythm: fixed overflow replaced by responsive 3/2/1-column grid; cards retain existing radius and elevation.
- Colors and visual tokens: existing Ant Design primary blue, neutral background, borders, and semantic states preserved.
- Image quality and assets: no raster assets are required by this admin UI; existing Ant Design icon components are preserved.
- Copy and content: all requested page-description remarks are removed; functional labels and data remain unchanged.
final result: passed
## Comparison history
## 2026-07-13 Platform Loading And Yak/Pasture Recheck
**Scope**
- Pages:
- `http://127.0.0.1:5174/#/platform?module=yak-industry-chain`
- `http://127.0.0.1:5174/#/platform?module=pasture-management`
- `http://127.0.0.1:5174/#/platform?module=yak-management&view=epidemic`
- File changed: `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/platform/index.vue`
- Screenshot evidence:
- `/tmp/screen2-standard-audit/audit-yak-industry-chain-loading-fixed-20260713.jpg`
- `/tmp/screen2-standard-audit/audit-pasture-management-loading-fixed-20260713.jpg`
- `/tmp/screen2-standard-audit/audit-yak-management-epidemic-clean-20260713.jpg`
**Fix**
- Added a platform startup-loading safety timeout:
- Homepage keeps up to `12s`.
- Other platform-loading modules keep up to `8s`.
- This prevents Yak Industry Chain and Pasture Management from remaining covered by a `100%` platform loading layer when map initialization is slow or background-tab rendering is throttled.
**Validation**
- Yak Industry Chain: loading node removed; top metrics render with real values; console error check passed.
- Pasture Management: loading node removed; top metrics render with real values; yellow yak-recognition layer remains.
- Yak Management / Epidemic: clean reload shows active `2026`, top metric `涉及村数 10 个`, and no console errors.
- `npm run build` passed; remaining warnings are existing Cesium/Sass/chunk-size warnings.
- Earlier P1: filter controls overflowed the card and wrapped unpredictably. Fixed with responsive grid tracks, fixed label widths, fluid controls, and automatic sidebar collapse. Post-fix evidence: `admin-users-748x900.png`.
- Earlier P2: explanatory remarks consumed vertical space and were explicitly unwanted. Removed from all three admin pages. Post-fix evidence: DOM checks and both implementation screenshots.
- Earlier P1: ordinary users could precede real administrators. Fixed in the Magic API query with an active `admin` role priority expression. Post-fix evidence: first two table rows in `admin-users-1920x1080.png`.
final result: passed
## Primary interactions tested
- User phone filter and reset.
- User list server pagination response after Magic API resource reload.
- Operation-log and login-log page rendering with descriptions removed.
- Browser console checked: zero errors.
## Findings
## 2026-07-13 Forest-Grass-Wet / National Park Follow-Up QA
**Scope**
- Pages:
- `http://127.0.0.1:5174/#/platform?module=forest-grass-wet`
- `http://127.0.0.1:5174/#/platform?module=ecological-protection&view=national-park`
- Files changed:
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/platform/index.vue`
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/services/openApi.js`
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/ecologicalProtection/data.js`
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/forestGrassWet/components/BusinessPanelRenderer.vue`
- Screenshot evidence:
- `/tmp/screen2-standard-audit/forest-grass-wet-overview-final-20260713.jpg`
- `/tmp/screen2-standard-audit/forest-grass-wet-woodland-click-final-20260713.jpg`
- `/tmp/screen2-standard-audit/national-park-final-20260713.jpg`
**Fix**
- Four-item top metric layout now has more horizontal room and smaller four-card-specific icon/value/unit sizing, so long values such as `林草湿面积 1226.11 万亩` no longer visually clip.
- Platform startup loading now only remains for modules that actively report platform-level loading progress; direct links to Forest-Grass-Wet, Ecological Protection, Yak Management and Smart Management no longer stay covered by a 100% loading mask.
- Woodland `优势树种面积` now uses the compact no-wrap rank-bar treatment instead of the larger default bar style.
- National Park `公益岗位分布` uses the homepage-like thin-column style, matching the restrained chart direction.
**Validation**
- Browser check: bottom `林地资源` was clicked through the real UI state, not a guessed URL query.
- Forest-Grass-Wet overview: no platform loading mask; top metric text is present in DOM; left/right cards keep the current restrained cyan-blue style.
- Woodland: `林地面积分布` and `优势树种面积` both present; right-side `优势树种面积` text remains readable and no longer fills the entire card width.
- National Park: grass/wetland stacked columns and job distribution keep weaker glow and clearer labels.
- Browser console error check: no errors.
- `npm run build` passed; remaining warnings are existing Cesium/Sass/chunk-size warnings.
- No actionable P0, P1, or P2 issue remains for the requested changes.
## Follow-up polish
- On very narrow widths, the wide table intentionally scrolls horizontally; fixed identity/status/action columns preserve the core task.
final result: passed
## 2026-07-13 Yak Management Trade Right Rhythm
---
**Scope**
- Page: `http://127.0.0.1:5174/#/platform?module=yak-management&view=trade`
- File changed: `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/yakManagement/index.vue`
- Screenshot evidence: `/tmp/screen2-standard-audit/yak-trade-right-four-slot-fixed-20260713.png`
# V3 湿地详情与优势小类 Design QA
**Fix**
- Removed manual height offsets from the trade right column.
- `出栏来源排行` now uses one standard side-card height.
- `交易出证台账` now uses the shared `getScreen2SpanHeight(sideCardHeight, 2)` two-slot formula.
- Source visual truth:
- `/var/folders/dh/pf6z830j3w3drsd1k4ncl7br0000gn/T/codex-clipboard-aa4dddc8-f0fc-49c0-b747-2d91faaeee84.png`
- `/var/folders/dh/pf6z830j3w3drsd1k4ncl7br0000gn/T/codex-clipboard-7c67797b-b847-4cef-bc14-f87d626013e7.png`
- `/var/folders/dh/pf6z830j3w3drsd1k4ncl7br0000gn/T/codex-clipboard-088c5496-47e0-4855-b0ef-1db3743a6c90.png`
- Implementation screenshot: `/Users/mocker/Documents/code/hy-screen/v3/screen/design-qa-assets/20260814-wetland-detail-v3-final.png`
- Viewport: 1920 × 1080 CSS px, device scale 1.
- Pixel dimensions: source detail crops are 742 × 454 and 936 × 456; the clipped advantages crop is 628 × 370; implementation capture is 1920 × 1080. The focused panel and chart regions were compared without density normalization.
- State: 林草湿资源 → 湿地资源 → 湿地分布,选中查尔玛乡达尔龙村目标湿地。
**Validation**
- Browser check at `1920x1080`.
- Right side measured as `出证结构统计 239px` + `出栏来源排行 227px` + `交易出证台账 466px`.
- Left side remains four cards: `246px + 227px + 227px + 246px`.
## Full-view comparison evidence
final result: passed
- The wetland detail panel starts below the three top KPI cards and no longer overlaps or hides them.
- All nine legacy detail rows fit inside the panel at the 1920 × 1080 baseline, with no vertical clipping or scroll required.
- The surrounding map, KPI rail, charts, layer selector, navigation, and visual theme remain intact.
## 2026-07-13 Ecological Protection National Park Chart Cleanup
## Focused region comparison evidence
**Scope**
- Page: `http://127.0.0.1:5174/#/platform?module=ecological-protection&view=national-park`
- Files changed:
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/ecologicalProtection/data.js`
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/forestGrassWet/components/BusinessPanelRenderer.vue`
- Screenshot evidence: `/tmp/screen2-standard-audit/national-park-chart-style-optimized-v2-20260713.png`
- The detail contract exactly matches the old system: 湿地类型、所在区域、湿地面积、地类名称、湿地级别、鲜草产量、干草产量、小班干草产量、小班鲜草产量。
- The selected legacy sample renders as 矮生嵩草、杂类草型 / 查尔玛乡达尔龙村 / 709.68亩 / 沼泽草地 / 2级湿地 / 1752.06斤 / 2.77吨 / 41.45吨 / 148.79吨。
- `数据年份` is absent from the detail DOM and screenshot.
- All six `湿地优势小类` names render on one line and remain fully readable; the previous ellipsis/clipping is gone.
**Fix**
- Kept the park business dimensions unchanged: grass/wetland area, grass/wetland productivity, township yak count, balance, zoning, households, jobs, capacity.
- National park grass/wetland stack columns now use a restrained slim style: thin body, light grid, weak glow, values above the bars.
- `乡镇牦牛数量` now uses a single lightweight horizontal distribution style.
- `公益岗位分布` now uses the homepage-like `plain` thin-column treatment instead of the stronger glowing column style.
## Required fidelity surfaces
**Validation**
- Browser check at `1920x1080`.
- Left side keeps four cards: `246px + 227px + 227px + 246px`.
- Right side keeps four cards: `239px + 227px + 227px + 239px`.
- Browser console error check: no errors.
- `npm run build` passed; remaining warnings are existing Cesium/Sass/chunk-size warnings.
- Typography: existing V3 font family and hierarchy are preserved; field labels remain quieter than values.
- Spacing and layout: the panel keeps its intended height and uses a preferred top offset of 190 px, preventing collision with the KPI rail.
- Colors: existing dark translucent panels, cyan borders, aqua highlights, and chart palette are unchanged.
- Image assets: existing terrain map, frame assets, chart icons, and map overlays are preserved without resampling.
- Copy and content: the old-system nine-field wording, order, values, and units are restored; no data-year field is shown.
final result: passed
## Comparison history
- Iteration 1 — P1: the detail panel was clamped upward and overlapped the top KPI cards. Fixed by preserving the desired panel height and honoring the 190 px preferred top position.
- Iteration 1 — P2: the previous implementation did not expose the full old-system wetland detail contract. Fixed across the V3 migration, API DTO, and UI row builder.
- Iteration 1 — P2: long `湿地优势小类` names were clipped. Fixed by applying the dedicated nowrap layout to this chart variant.
- Iteration 2: final screenshot confirms no overlap, all nine detail rows visible, and all six long category names complete.
## 2026-07-13 Cross-Module Four-Card Continuation
**Scope**
- Excluded as requested: Grass-Livestock Balance, Smart Management.
- Checked modules: Home, Forest-Grass-Wet, Ecological Protection, Yak Management, Pasture Management, Yak Industry Chain.
- Viewport: `1920x1080`.
- Local route base: `http://127.0.0.1:5174/#/platform`.
**New Evidence**
- Ecological Protection / National Park right side four cards: `/tmp/screen2-standard-audit/ecological-national-park-right-four-20260713.png`
- Ecological Protection / Ecological Redline right side four cards: `/tmp/screen2-standard-audit/ecology-ecological-redline-right-four-20260713.png`
- Ecological Protection / Natural Protected Area right side four cards: `/tmp/screen2-standard-audit/ecology-natural-protected-area-right-four-20260713.png`
- Yak Management / Epidemic right side four-slot layout: `/tmp/screen2-standard-audit/yak-management-epidemic-map-visible-check-20260713.png`
- Yak Industry Chain / Artificial Grassland real topic click verification: `/tmp/screen2-standard-audit/yak-industry-artificial-real-20260713.png`
- Forest-Grass-Wet shared renderer cleanup: `/tmp/screen2-standard-audit/forest-grass-wet-overview-shared-style-20260712.png`
- Pasture Management glow cleanup: `/tmp/screen2-standard-audit/pasture-management-glow-cleanup-20260712.png`
**Fixes Completed**
- Ecological Protection national park right side no longer has a blank fourth slot; added `草畜承载能力` as a metric card.
- Ecological redline and natural protected area right side now use four cards:
- `草原类型`: ring chart
- `草原级占比`: rank bar
- `林地质量`: heat/grade grid
- `林草湿面积构成`: structure band
- Yak Management epidemic view now uses `乡镇覆盖均衡 + 村级覆盖进度 + 防疫记录台账(2 slots)` instead of one full-height ledger.
- Yak Industry Chain artificial grassland topic was verified through the real bottom topic switch, not a guessed URL parameter; left and right sides both render four cards.
- Shared `BusinessPanelRenderer` glow was reduced for heat cells, structure bands and split rows so retained charts match the current restrained cyan-blue system.
**Open Follow-Up**
- Engineering Analysis is an independent workspace rather than a side-card dashboard; it should be reviewed with its own workflow standard instead of forcing four side cards.
- Full production deployment was not performed in this pass.
## 2026-07-13 Cesium Map Label Crispness
**Scope**
- Shared component: `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/components/CesiumMap/index.vue`
- Affected modules: Forest-Grass-Wet, Ecological Protection, Pasture Management, Yak Management, Yak Industry Chain.
- Viewport: `1920x1080`.
**Issue**
- Township badges on the 3D map looked soft/blurry.
- Cause: the badges are rendered as canvas images and then displayed as Cesium billboards inside a WebGL scene. When Cesium renders at browser-recommended 1x resolution and FXAA is enabled, the whole scene is post-processed, so text textures become softened.
**Fix**
- Enabled high-DPI Cesium rendering with `useBrowserRecommendedResolution: false`.
- Set `viewer.resolutionScale` to the current device pixel ratio, capped at `2`.
- Disabled Cesium FXAA post-process for this shared map to avoid blurring billboard text.
- Regenerated township badge cache (`v14-crisp-map-badge`) with 3x-4x canvas backing pixels.
- Removed glow blur from the badge text and kept a thinner dark outline for readable but sharper labels.
**Validation**
- Screenshot evidence: `/tmp/screen2-standard-audit/cesium-label-crisp-20260713.png`
- Browser route verified: `http://127.0.0.1:5174/#/platform?module=forest-grass-wet`
- Browser console: only external resource 404s during local map loading; no Vue/runtime errors.
## Primary interactions and console
- Switched to 湿地资源, enabled 湿地分布, and selected the exact legacy sample on the map.
- DOM assertion confirmed the nine labels and values above and confirmed `数据年份` is absent.
- Browser console checked after the final deployment: zero errors.
- Production build passed; `hy-v3-screen` and `hy-v3-openapi` are healthy.
## Findings
- No actionable P0, P1, or P2 issue remains in the requested scope.
final result: passed
## 2026-07-13 Ecological Restoration Chart Fixes
---
**Scope**
- Page: `http://127.0.0.1:5174/#/platform?module=ecological-protection&view=restoration`
- Source files:
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/ecologicalProtection/data.js`
- `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/forestGrassWet/components/BusinessPanelRenderer.vue`
- Viewport: `1920x1080`.
# 自然保护地“湿地面积”图表 Design QA
**Fixes**
- `治理面积分布`, `年度工程长度`, and `年度项目数量` now use horizontal year labels instead of vertical split digits.
- `乡镇治理面积分布` changed from a crowded horizontal bar list to the same water-column style used by `湿地面积`, with horizontal township labels and no horizontal scrollbar.
- Source visual truth: `/Users/mocker/Documents/code/hy-screen/v3/evidence/ui-fix/20260814-ecowet-chart-style/05-final.jpg`
- Implementation screenshot: `/Users/mocker/Documents/code/hy-screen/v3/evidence/ui-fix/20260814-natural-wet-chart-style/02-final.jpg`
- Before screenshot: `/Users/mocker/Documents/code/hy-screen/v3/evidence/ui-fix/20260814-natural-wet-chart-style/01-before.jpg`
- Viewport and pixel dimensions: 534 × 872 CSS px, device scale 1; all comparison images are 534 × 872 px.
- State: ecological-protection module, `natural-protected-area` selected, default township scope.
**Validation**
- Year-axis screenshot evidence: `/tmp/screen2-standard-audit/ecology-restoration-year-axis-fixed-20260713.png`
- Township water-column screenshot evidence: `/tmp/screen2-standard-audit/ecology-restoration-town-column-20260713.png`
- Automated DOM check confirmed the target township panel renders as `business-columns is-variant-water is-dense has-unit-label`.
## Full-view comparison evidence
final result: passed
- The target and implementation were opened side by side at the same viewport and application state.
- The natural-protected-area wetland card now uses the same circular rank badge, cyan progress bar, area/value hierarchy, and percentage pill as the accepted ecological-redline chart.
- The card position, title treatment, map hierarchy, and neighboring panels remain unchanged.
## Focused region comparison evidence
- DOM inspection confirms the target card uses `.business-bars.is-rank-bar`; the natural-protected-area card now uses the same rank-bar structure and no longer renders the old `.business-list` presentation.
- All 7 rows fit within the card bounds with no overflow.
- Row copy, order, area values, and percentages are preserved: 邛溪镇、安曲镇、查尔玛乡、瓦切镇、阿木乡、麦洼乡、色地镇。
## Required fidelity surfaces
- Typography: existing project font stack and value hierarchy are preserved.
- Spacing: the accepted two-tier row layout and card padding are reused; every row remains inside the panel.
- Colors: the same `#43d9e8` wetland cyan palette, subtle row backgrounds, and percentage pills are reused.
- Image and asset fidelity: no new raster or icon assets were introduced; existing map and panel assets are unchanged.
- Copy and content: natural-protected-area data and ordering are unchanged.
## Comparison history
- Before: the natural-protected-area wetland card used the legacy list presentation, visually inconsistent with the optimized ecological-redline card.
- After: the chart reuses the accepted rank-bar grammar through the shared wetland panel decorator and scoped card styles.
- No actionable P0, P1, or P2 issue remains in the requested scope.
## Primary interactions and console
## 2026-07-12 Homepage Chart Variety Pass
**Scope**
- Page: `http://127.0.0.1:5174/#/platform?module=home`
- Source file: `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/home/index.vue`
- Screenshot evidence: `/tmp/screen2-home-left-chart-stack-qa.png`
**Design Rule**
- The same screen must not repeat the exact same chart expression for adjacent cards.
- Chart style differences must come from the business reading task, not only from color changes.
**Homepage Mapping**
- 草地面积: vertical bar, used for ten-town area comparison without an extra trend overlay.
- 湿地面积: water-style capsule vertical bar, aligned with the resource-area comparison grammar but visually distinct from grassland.
- 草原类别: category proportion card, used for structure reading.
- 草地生产力: area line chart, used for productivity trend-like comparison.
- 牦牛存栏分布: vertical bar plus trend line, used for town livestock scale comparison and distribution fluctuation.
- 畜群结构: donut chart, used for herd composition.
- 草畜平衡: gauge cards, used for status comparison.
**Parameter Checks**
- Grassland and wetland both use full-width vertical composition, avoiding the right-side emptiness caused by the previous horizontal rank layout.
- Wetland uses a wider blue water-column treatment with rounded caps, while grassland keeps the slimmer square-cap column treatment.
- Yak stock distribution carries the subtle trend line so the page still has one bar-line combination without overloading both left resource cards.
- Background bars are dimmed to keep the data layer dominant.
- Browser console error check: no errors.
- Natural-protected-area view route loaded successfully and remained selected.
- Top statistics and all 7 wetland rows rendered.
- Browser console checked after the final deployment: zero new errors.
- Production build passed and `hy-v3-screen` reported healthy.
final result: passed

@ -0,0 +1,5 @@
#!/bin/sh
set -eu
# 保留 V3 内网和发布网的直连路由,删除通往其他 Docker 网段的默认路由。
/sbin/ip route del default

@ -0,0 +1 @@
.forbidden-page[data-v-59c03ff7]{height:100%;display:grid;place-items:center;background:#f5f7fa}

@ -0,0 +1 @@
import{_}from"./_plugin-vue_export-helper-c27b6911-1786807848259.js";import{O as t,o as d,c,b as o,x as n,B as i}from"./index-1786807848259.js";const l={},p={class:"forbidden-page"};function f(s,e){const r=t("a-button"),a=t("a-result");return d(),c("div",p,[o(a,{status:"403",title:"无后台管理权限","sub-title":"当前账号可以访问业务大屏,但未被授予后台管理员角色。"},{extra:n(()=>[o(r,{type:"primary",onClick:e[0]||(e[0]=m=>s.$router.replace("/platform"))},{default:n(()=>[...e[1]||(e[1]=[i("返回业务大屏",-1)])]),_:1})]),_:1})])}const x=_(l,[["render",f],["__scopeId","data-v-59c03ff7"]]);export{x as default};

@ -0,0 +1 @@
.admin-shell[data-v-db35a763]{width:100%;height:100%;min-width:0;background:#f3f5f8;color:#1f2937;font-family:AlibabaPuHuiTi,PingFang SC,Microsoft YaHei,sans-serif}.admin-sider[data-v-db35a763]{position:relative;z-index:2;overflow:hidden;background:#001529!important;box-shadow:2px 0 12px #0015291f}.admin-brand[data-v-db35a763]{height:64px;display:flex;align-items:center;gap:11px;padding:0 18px;border-bottom:1px solid rgba(255,255,255,.08);color:#fff;white-space:nowrap}.admin-brand-mark[data-v-db35a763]{flex:0 0 auto;width:34px;height:34px;display:grid;place-items:center;border-radius:9px;background:linear-gradient(145deg,#1677ff,#4096ff);font-size:18px;font-weight:700;box-shadow:0 6px 18px #1677ff57}.admin-brand-copy[data-v-db35a763]{display:flex;flex-direction:column;line-height:1.2}.admin-brand-copy strong[data-v-db35a763]{font-size:15px;letter-spacing:.5px}.admin-brand-copy span[data-v-db35a763]{margin-top:4px;color:#ffffff8a;font-size:11px}.admin-menu[data-v-db35a763]{margin-top:12px;border-inline-end:0!important}.admin-main-layout[data-v-db35a763]{min-width:0;background:#f3f5f8}.admin-header[data-v-db35a763]{height:64px;padding:0 22px 0 12px;display:flex;align-items:center;justify-content:space-between;background:#fff;border-bottom:1px solid #edf0f4;box-shadow:0 1px 4px #0f172a0a}.admin-header-left[data-v-db35a763],.admin-header-actions[data-v-db35a763],.admin-user[data-v-db35a763]{display:flex;align-items:center}.admin-header-left[data-v-db35a763]{gap:14px}.admin-header-actions[data-v-db35a763]{gap:6px}.admin-collapse[data-v-db35a763]{width:40px;height:40px;border:0;border-radius:8px;background:transparent;color:#4b5563;font-size:18px;cursor:pointer}.admin-collapse[data-v-db35a763]:hover{background:#f2f5f9;color:#1677ff}.admin-user[data-v-db35a763]{gap:9px;padding:5px 7px;border:0;border-radius:8px;background:transparent;color:#27364a;cursor:pointer}.admin-user[data-v-db35a763]:hover{background:#f4f7fb}.admin-avatar[data-v-db35a763]{background:#1677ff;font-weight:600}.admin-user-copy[data-v-db35a763]{display:flex;flex-direction:column;align-items:flex-start;line-height:1.2}.admin-user-copy strong[data-v-db35a763]{font-size:13px;font-weight:600}.admin-user-copy small[data-v-db35a763]{margin-top:3px;color:#8c97a8;font-size:11px}.admin-user-arrow[data-v-db35a763]{color:#9aa4b2;font-size:10px}.admin-content[data-v-db35a763]{min-height:0;overflow:auto;padding:20px}@media (max-width: 900px){.admin-header[data-v-db35a763]{padding-right:12px}.admin-header-actions[data-v-db35a763]>.ant-btn{display:none}.admin-user-copy[data-v-db35a763],.admin-user-arrow[data-v-db35a763]{display:none}.admin-content[data-v-db35a763]{padding:14px}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
import{g as o,o as s,C as z,x as I,a as i,n as g,c as r,F as k,y as m,f as L,t as w,K as C,j as h}from"./index-1786807848259.js";import{_ as R}from"./index-0eddac6c-1786807848259.js";import{d as j}from"./index-80cb981f-1786807848259.js";const D={key:0,class:"layer-panel-list"},E=["onClick"],$=["onClick"],G={key:0,class:"layer-panel-empty"},J={key:1,class:"layer-panel-legend"},Q=["disabled","title","onClick"],U={class:"legend-name"},W={key:0,class:"legend-check"},X={key:1,class:"layer-panel-empty is-legend"},le={__name:"LayerPanel",props:{topicKey:{type:String,required:!0},modelValue:{type:[String,Array],default:""},legends:{type:Array,default:()=>[]},selectedLegendKey:{type:String,default:""},height:{type:Number,default:0},width:{type:Number,default:248},layers:{type:Array,default:null},overlayLayers:{type:Array,default:()=>[]},overlayKeys:{type:Array,default:()=>[]},legendOnly:{type:Boolean,default:!1},multiple:{type:Boolean,default:!1},compact:{type:Boolean,default:!1},showLegend:{type:Boolean,default:!0}},emits:["update:modelValue","update:selectedLegendKey","update:overlayKeys"],setup(d,{emit:V}){const t=d,p=V,f=o(()=>Array.isArray(t.layers)?t.layers:j(t.topicKey)),v=o(()=>Array.isArray(t.overlayLayers)?t.overlayLayers:[]),c=o(()=>Array.isArray(t.legends)?t.legends:[]),b=o(()=>Array.isArray(t.modelValue)?t.modelValue.map(String).filter(Boolean):t.modelValue?[String(t.modelValue)]:[]),A=o(()=>Array.isArray(t.overlayKeys)?t.overlayKeys.map(String).filter(Boolean):[]),x=o(()=>c.value.filter(K).length>1),M=o(()=>c.value.length===1),O=o(()=>t.legendOnly?"图例":t.compact?"图层":"图层控制"),T=o(()=>{const l=t.legendOnly?0:f.value.length+v.value.length,e=t.showLegend?Math.ceil(c.value.length/2):0,a=l?l*34+Math.max(0,l-1)*5:30,u=t.showLegend?c.value.length?30+Math.max(28,e*28):28:0,q=t.showLegend?172:108;return Math.max(q,Math.min(430,72+a+u))}),N=o(()=>t.compact?t.height||T.value:t.height?t.height:430);function F(n,l){var e,a;if((a=(e=n.currentTarget)==null?void 0:e.blur)==null||a.call(e),t.multiple){const u=new Set(b.value);u.has(l)?u.delete(l):u.add(l),p("update:modelValue",Array.from(u));return}p("update:modelValue",t.modelValue===l?"":l)}function S(n){return b.value.includes(String(n))}function H(n,l){var a,u;(u=(a=n.currentTarget)==null?void 0:a.blur)==null||u.call(a);const e=new Set(A.value);e.has(l)?e.delete(l):e.add(l),p("update:overlayKeys",Array.from(e))}function _(n){return A.value.includes(String(n))}function B(n={}){const l=n.color||n.fillColor||n.strokeColor||"";return l?{"--layer-item-color":l}:null}function P(n,l){var e,a;(a=(e=n.currentTarget)==null?void 0:e.blur)==null||a.call(e),y(l)&&p("update:selectedLegendKey",t.selectedLegendKey===l.key?"":l.key)}function K(n){return(n==null?void 0:n.selectable)===!1?!1:!!(n!=null&&n.key&&(n.cqlFilter||n.rankingValueKey))}function y(n){return x.value&&K(n)}return(n,l)=>(s(),z(R,{title:O.value,width:d.width,height:N.value},{default:I(()=>[i("div",{class:g(["layer-panel",{"is-legend-only":d.legendOnly,"is-compact":d.compact,"is-without-legend":!d.showLegend}])},[d.legendOnly?h("",!0):(s(),r("div",D,[(s(!0),r(k,null,m(f.value,e=>(s(),r("button",{key:e.key,class:g(["layer-panel-item",{"is-active":S(e.key),"is-checked":S(e.key)}]),type:"button",onMousedown:l[0]||(l[0]=L(()=>{},["prevent"])),onClick:a=>F(a,e.key)},[i("span",null,w(e.name),1),i("i",{style:C(B(e))},null,4)],42,E))),128)),(s(!0),r(k,null,m(v.value,e=>(s(),r("button",{key:e.key,class:g(["layer-panel-item is-overlay",{"is-active":_(e.key),"is-checked":_(e.key)}]),type:"button",onMousedown:l[1]||(l[1]=L(()=>{},["prevent"])),onClick:a=>H(a,e.key)},[i("span",null,w(e.name),1),i("i",{style:C(B(e))},null,4)],42,$))),128)),!f.value.length&&!v.value.length?(s(),r("div",G,"暂无图层配置")):h("",!0)])),d.showLegend?(s(),r("div",J,[l[3]||(l[3]=i("div",{class:"layer-panel-section-title"},"图例",-1)),c.value.length?(s(),r("div",{key:0,class:g(["layer-panel-legend-grid",{"is-single":M.value}])},[(s(!0),r(k,null,m(c.value,e=>(s(),r("button",{key:e.key||e.name,class:g(["layer-panel-legend-row",{"is-selected":y(e)&&e.key===d.selectedLegendKey,"is-checkable":y(e),"is-disabled":!y(e)}]),type:"button",disabled:!y(e),title:e.name,onMousedown:l[2]||(l[2]=L(()=>{},["prevent"])),onClick:a=>P(a,e)},[i("span",{class:"legend-swatch",style:C({backgroundColor:e.fillColor,borderColor:e.strokeColor||e.fillColor})},null,4),i("span",U,w(e.name),1),y(e)?(s(),r("i",W)):h("",!0)],42,Q))),128))],2)):(s(),r("div",X,"暂无图例"))])):h("",!0)],2)]),_:1},8,["title","width","height"]))}};export{le as _};

@ -1 +0,0 @@
import{g as o,o as r,C as P,x as q,a as u,n as g,c as s,F as h,y as k,f as m,t as b,j as A,J as z}from"./index-1784132792831.js";import{_ as H}from"./index-a4d3ff67-1784132792831.js";import{b as j}from"./townshipBoundaries-822b7d9e-1784132792831.js";const D={key:0,class:"layer-panel-list"},E=["onClick"],I=["onClick"],J={key:0,class:"layer-panel-empty"},R={class:"layer-panel-legend"},$=["disabled","title","onClick"],G={class:"legend-name"},Q={key:0,class:"legend-check"},U={key:1,class:"layer-panel-empty is-legend"},Z={__name:"LayerPanel",props:{topicKey:{type:String,required:!0},modelValue:{type:[String,Array],default:""},legends:{type:Array,default:()=>[]},selectedLegendKey:{type:String,default:""},height:{type:Number,default:0},width:{type:Number,default:232},layers:{type:Array,default:null},overlayLayers:{type:Array,default:()=>[]},overlayKeys:{type:Array,default:()=>[]},legendOnly:{type:Boolean,default:!1},multiple:{type:Boolean,default:!1},compact:{type:Boolean,default:!1}},emits:["update:modelValue","update:selectedLegendKey","update:overlayKeys"],setup(y,{emit:V}){const t=y,p=V,v=o(()=>Array.isArray(t.layers)?t.layers:j(t.topicKey)),f=o(()=>Array.isArray(t.overlayLayers)?t.overlayLayers:[]),d=o(()=>Array.isArray(t.legends)?t.legends:[]),L=o(()=>Array.isArray(t.modelValue)?t.modelValue.map(String).filter(Boolean):t.modelValue?[String(t.modelValue)]:[]),C=o(()=>Array.isArray(t.overlayKeys)?t.overlayKeys.map(String).filter(Boolean):[]),B=o(()=>d.value.filter(_).length>1),K=o(()=>d.value.length===1),x=o(()=>t.legendOnly?"图例":t.compact?"图层":"图层控制"),O=o(()=>{const n=t.legendOnly?0:v.value.length+f.value.length,l=t.compact?d.value.length:Math.ceil(d.value.length/2),e=n?n*32:30,a=d.value.length?30+Math.max(28,l*28):28;return Math.max(172,Math.min(520,96+e+a))}),M=o(()=>t.compact?t.height||O.value:t.height?t.height:430);function T(n,l){var e,a;if((a=(e=n.currentTarget)==null?void 0:e.blur)==null||a.call(e),t.multiple){const i=new Set(L.value);i.has(l)?i.delete(l):i.add(l),p("update:modelValue",Array.from(i));return}p("update:modelValue",t.modelValue===l?"":l)}function S(n){return L.value.includes(String(n))}function N(n,l){var a,i;(i=(a=n.currentTarget)==null?void 0:a.blur)==null||i.call(a);const e=new Set(C.value);e.has(l)?e.delete(l):e.add(l),p("update:overlayKeys",Array.from(e))}function w(n){return C.value.includes(String(n))}function F(n,l){var e,a;(a=(e=n.currentTarget)==null?void 0:e.blur)==null||a.call(e),c(l)&&p("update:selectedLegendKey",t.selectedLegendKey===l.key?"":l.key)}function _(n){return(n==null?void 0:n.selectable)===!1?!1:!!(n!=null&&n.key&&(n.cqlFilter||n.rankingValueKey))}function c(n){return B.value&&_(n)}return(n,l)=>(r(),P(H,{title:x.value,width:y.width,height:M.value},{default:q(()=>[u("div",{class:g(["layer-panel",{"is-legend-only":y.legendOnly,"is-compact":y.compact}])},[y.legendOnly?A("",!0):(r(),s("div",D,[(r(!0),s(h,null,k(v.value,e=>(r(),s("button",{key:e.key,class:g(["layer-panel-item",{"is-active":S(e.key),"is-checked":S(e.key)}]),type:"button",onMousedown:l[0]||(l[0]=m(()=>{},["prevent"])),onClick:a=>T(a,e.key)},[u("span",null,b(e.name),1),l[3]||(l[3]=u("i",null,null,-1))],42,E))),128)),(r(!0),s(h,null,k(f.value,e=>(r(),s("button",{key:e.key,class:g(["layer-panel-item is-overlay",{"is-active":w(e.key),"is-checked":w(e.key)}]),type:"button",onMousedown:l[1]||(l[1]=m(()=>{},["prevent"])),onClick:a=>N(a,e.key)},[u("span",null,b(e.name),1),l[4]||(l[4]=u("i",null,null,-1))],42,I))),128)),!v.value.length&&!f.value.length?(r(),s("div",J,"暂无图层配置")):A("",!0)])),u("div",R,[l[5]||(l[5]=u("div",{class:"layer-panel-section-title"},"图例",-1)),d.value.length?(r(),s("div",{key:0,class:g(["layer-panel-legend-grid",{"is-single":K.value}])},[(r(!0),s(h,null,k(d.value,e=>(r(),s("button",{key:e.key||e.name,class:g(["layer-panel-legend-row",{"is-selected":c(e)&&e.key===y.selectedLegendKey,"is-checkable":c(e),"is-disabled":!c(e)}]),type:"button",disabled:!c(e),title:e.name,onMousedown:l[2]||(l[2]=m(()=>{},["prevent"])),onClick:a=>F(a,e)},[u("span",{class:"legend-swatch",style:z({backgroundColor:e.fillColor,borderColor:e.strokeColor||e.fillColor})},null,4),u("span",G,b(e.name),1),c(e)?(r(),s("i",Q)):A("",!0)],42,$))),128))],2)):(r(),s("div",U,"暂无图例"))])],2)]),_:1},8,["title","width","height"]))}};export{Z as _};

@ -0,0 +1 @@
.log-message[data-v-bf0e68fe]{display:inline-block;max-width:210px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}

@ -0,0 +1 @@
var W=Object.defineProperty,$=Object.defineProperties;var A=Object.getOwnPropertyDescriptors;var z=Object.getOwnPropertySymbols;var F=Object.prototype.hasOwnProperty,G=Object.prototype.propertyIsEnumerable;var B=(s,l,e)=>l in s?W(s,l,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[l]=e,V=(s,l)=>{for(var e in l||(l={}))F.call(l,e)&&B(s,e,l[e]);if(z)for(var e of z(l))G.call(l,e)&&B(s,e,l[e]);return s},q=(s,l)=>$(s,A(l));var O=(s,l,e)=>new Promise((c,f)=>{var m=i=>{try{r(e.next(i))}catch(v){f(v)}},u=i=>{try{r(e.throw(i))}catch(v){f(v)}},r=i=>i.done?c(i.value):Promise.resolve(i.value).then(m,u);r((e=e.apply(s,l)).next())});import{O as n,o as w,c as H,a as g,b as t,x as o,a1 as K,S as X,B as k,u as N,V as Z,W as U,t as h,C,j as ee,L as Y,d as I}from"./index-1786807848259.js";/* empty css */import{_ as ae}from"./_plugin-vue_export-helper-c27b6911-1786807848259.js";const te={class:"admin-page"},oe={class:"admin-table-toolbar"},le={style:{color:"#8c97a8"}},ne={class:"log-message"},se={__name:"LoginLogs",setup(s){const l=[{title:"日志编号",dataIndex:"infoId",key:"infoId",width:105},{title:"用户账号",dataIndex:"userName",key:"userName",width:140},{title:"登录地址",dataIndex:"ipaddr",key:"ipaddr",width:145},{title:"登录地点",dataIndex:"loginLocation",key:"loginLocation",width:150,ellipsis:!0},{title:"浏览器",key:"browser",width:110},{title:"操作系统",dataIndex:"os",key:"os",width:120},{title:"登录状态",key:"status",width:100},{title:"提示消息",key:"msg",width:220,ellipsis:!0},{title:"登录时间",dataIndex:"loginTime",key:"loginTime",width:175}],e=Y({userName:"",ipaddr:"",status:void 0}),c=I([]),f=I([]),m=I(!1),u=Y({current:1,pageSize:20,total:0,showSizeChanger:!0,showQuickJumper:!0,showTotal:_=>`共 ${_} 条`});function r(){return O(this,null,function*(){var _,a;m.value=!0;try{const p=yield K(q(V({},e),{beginTime:(_=c.value)==null?void 0:_[0],endTime:(a=c.value)==null?void 0:a[1],pageNum:u.current,pageSize:u.pageSize}));f.value=p.rows||[],u.total=Number(p.total||0)}catch(p){X.error(p.message)}finally{m.value=!1}})}function i(){u.current=1,r()}function v(){Object.assign(e,{userName:"",ipaddr:"",status:void 0}),c.value=[],i()}function D(_){u.current=_.current,u.pageSize=_.pageSize,r()}return r(),(_,a)=>{const p=n("a-input"),y=n("a-form-item"),L=n("a-select-option"),E=n("a-select"),P=n("a-range-picker"),x=n("a-button"),S=n("a-space"),R=n("a-form"),T=n("a-card"),j=n("a-badge"),M=n("a-tag"),Q=n("a-tooltip"),J=n("a-table");return w(),H("div",te,[a[9]||(a[9]=g("div",{class:"admin-page-heading"},[g("h1",null,"登录日志")],-1)),t(T,{class:"admin-query-card",bordered:!1},{default:o(()=>[t(R,{class:"admin-query-form",model:e},{default:o(()=>[t(y,{label:"用户账号"},{default:o(()=>[t(p,{value:e.userName,"onUpdate:value":a[0]||(a[0]=d=>e.userName=d),"allow-clear":"",placeholder:"请输入用户账号",onPressEnter:i},null,8,["value"])]),_:1}),t(y,{label:"登录地址"},{default:o(()=>[t(p,{value:e.ipaddr,"onUpdate:value":a[1]||(a[1]=d=>e.ipaddr=d),"allow-clear":"",placeholder:"请输入 IP 地址",onPressEnter:i},null,8,["value"])]),_:1}),t(y,{label:"登录状态"},{default:o(()=>[t(E,{value:e.status,"onUpdate:value":a[2]||(a[2]=d=>e.status=d),"allow-clear":"",placeholder:"全部状态"},{default:o(()=>[t(L,{value:"0"},{default:o(()=>[...a[4]||(a[4]=[k("成功",-1)])]),_:1}),t(L,{value:"1"},{default:o(()=>[...a[5]||(a[5]=[k("失败",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(y,{label:"登录时间"},{default:o(()=>[t(P,{value:c.value,"onUpdate:value":a[3]||(a[3]=d=>c.value=d),"value-format":"YYYY-MM-DD"},null,8,["value"])]),_:1}),t(y,{class:"admin-query-actions"},{default:o(()=>[t(S,null,{default:o(()=>[t(x,{type:"primary",onClick:i},{default:o(()=>[t(N(Z)),a[6]||(a[6]=k(" 查询",-1))]),_:1}),t(x,{onClick:v},{default:o(()=>[t(N(U)),a[7]||(a[7]=k(" 重置",-1))]),_:1})]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),t(T,{class:"admin-table-card",bordered:!1},{default:o(()=>[g("div",oe,[a[8]||(a[8]=g("strong",null,"登录日志列表",-1)),t(S,null,{default:o(()=>[g("span",le,"共 "+h(u.total)+" 条",1),t(x,{type:"text",loading:m.value,onClick:r},{default:o(()=>[t(N(U))]),_:1},8,["loading"])]),_:1})]),t(J,{"row-key":"infoId",columns:l,"data-source":f.value,loading:m.value,pagination:u,scroll:{x:1180},onChange:D},{bodyCell:o(({column:d,record:b})=>[d.key==="status"?(w(),C(j,{key:0,status:b.status==="0"?"success":"error",text:b.status==="0"?"成功":"失败"},null,8,["status","text"])):d.key==="browser"?(w(),C(M,{key:1},{default:o(()=>[k(h(b.browser||"未知"),1)]),_:2},1024)):d.key==="msg"?(w(),C(Q,{key:2,title:b.msg},{default:o(()=>[g("span",ne,h(b.msg||"—"),1)]),_:2},1032,["title"])):ee("",!0)]),_:1},8,["data-source","loading","pagination"])]),_:1})])}}},_e=ae(se,[["__scopeId","data-v-bf0e68fe"]]);export{_e as default};

@ -0,0 +1 @@
.error-block[data-v-823675cb]{color:#cf1322;background:#fff2f0}

File diff suppressed because one or more lines are too long

@ -1,2 +1,2 @@
var D=Object.defineProperty,R=Object.defineProperties;var W=Object.getOwnPropertyDescriptors;var z=Object.getOwnPropertySymbols;var H=Object.prototype.hasOwnProperty,P=Object.prototype.propertyIsEnumerable;var L=(a,r,o)=>r in a?D(a,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):a[r]=o,m=(a,r)=>{for(var o in r||(r={}))H.call(r,o)&&L(a,o,r[o]);if(z)for(var o of z(r))P.call(r,o)&&L(a,o,r[o]);return a},d=(a,r)=>R(a,W(r));import{g as p,q as Z,A as F,L as b,o as g,c as h,a as y,t as x,j as _,b as V,u as q,n as E}from"./index-1784132792831.js";import{H as j}from"./index.esm.min-da05f706-1784132792831.js";const G={class:"smart-chart-header"},I={key:0},M={key:0},A="口径",Q={__name:"SmartChartRenderer",props:{chart:{type:Object,required:!0}},emits:["ready"],setup(a,{emit:r}){const o=r,i=a,l=["#30dcff","#27f0c0","#ffd76c","#7aa7ff","#ff8f6b","#a6f06d"],k=p(()=>{const t=(i.chart.rows||[]).filter(e=>Number.isFinite(Number(e.value)));return i.chart.type==="pie"?T(t):i.chart.type==="line"?$(t):C(t)}),w=p(()=>{const t=i.chart.rows||[];return i.chart.type==="bar"&&v(t)}),S=p(()=>B(i.chart.subtitle));Z(()=>{F(()=>{window.requestAnimationFrame(()=>o("ready"))})});function C(t){return v(t)?N(t):{animationDuration:700,grid:{left:52,right:26,top:28,bottom:54},tooltip:c(),xAxis:{type:"category",data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.28)"}},axisLabel:{color:"rgba(223, 250, 255, 0.76)",fontSize:11,interval:0,rotate:t.length>6?28:0}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},series:[{name:i.chart.title,type:"bar",barWidth:t.length>7?16:22,data:t.map((e,n)=>({value:e.value,name:e.name,itemStyle:{borderRadius:[8,8,0,0],color:new b(0,0,0,1,[{offset:0,color:l[n%l.length]},{offset:1,color:"rgba(48, 220, 255, 0.08)"}])}})),label:{show:!0,position:"top",color:"#ffffff",fontSize:11,formatter:({value:e})=>u(e)}}]}}function N(t){return{animationDuration:700,grid:{left:78,right:72,top:22,bottom:20},tooltip:d(m({},c()),{trigger:"axis",axisPointer:{type:"shadow"}}),xAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},yAxis:{type:"category",inverse:!0,data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.22)"}},axisLabel:{color:"rgba(223, 250, 255, 0.82)",fontSize:12}},series:[{name:i.chart.title,type:"bar",barWidth:13,data:t.map((e,n)=>({value:e.value,name:e.name,itemStyle:{borderRadius:[0,8,8,0],color:new b(0,0,1,0,[{offset:0,color:"rgba(48, 220, 255, 0.16)"},{offset:1,color:l[n%l.length]}])}})),label:{show:!0,position:"right",color:"#ffffff",fontSize:11,formatter:({value:e})=>u(e)}}]}}function T(t){return{animationDuration:700,tooltip:c(),legend:{orient:"vertical",right:10,top:"middle",itemWidth:10,itemHeight:10,textStyle:{color:"rgba(223, 250, 255, 0.78)",fontSize:11}},series:[{name:i.chart.title,type:"pie",radius:["48%","68%"],center:["35%","52%"],avoidLabelOverlap:!0,label:{color:"#fff",fontSize:11,formatter:`{b}
var D=Object.defineProperty,R=Object.defineProperties;var W=Object.getOwnPropertyDescriptors;var z=Object.getOwnPropertySymbols;var H=Object.prototype.hasOwnProperty,P=Object.prototype.propertyIsEnumerable;var L=(a,r,o)=>r in a?D(a,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):a[r]=o,m=(a,r)=>{for(var o in r||(r={}))H.call(r,o)&&L(a,o,r[o]);if(z)for(var o of z(r))P.call(r,o)&&L(a,o,r[o]);return a},d=(a,r)=>R(a,W(r));import{g as p,q as Z,A as F,a9 as b,o as g,c as h,a as y,t as x,j as _,b as V,u as q,n as E}from"./index-1786807848259.js";import{H as j}from"./index.esm.min-024ee703-1786807848259.js";const G={class:"smart-chart-header"},I={key:0},M={key:0},A="口径",Q={__name:"SmartChartRenderer",props:{chart:{type:Object,required:!0}},emits:["ready"],setup(a,{emit:r}){const o=r,i=a,l=["#30dcff","#27f0c0","#ffd76c","#7aa7ff","#ff8f6b","#a6f06d"],k=p(()=>{const t=(i.chart.rows||[]).filter(e=>Number.isFinite(Number(e.value)));return i.chart.type==="pie"?T(t):i.chart.type==="line"?$(t):C(t)}),w=p(()=>{const t=i.chart.rows||[];return i.chart.type==="bar"&&v(t)}),S=p(()=>B(i.chart.subtitle));Z(()=>{F(()=>{window.requestAnimationFrame(()=>o("ready"))})});function C(t){return v(t)?N(t):{animationDuration:700,grid:{left:52,right:26,top:28,bottom:54},tooltip:c(),xAxis:{type:"category",data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.28)"}},axisLabel:{color:"rgba(223, 250, 255, 0.76)",fontSize:11,interval:0,rotate:t.length>6?28:0}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},series:[{name:i.chart.title,type:"bar",barWidth:t.length>7?16:22,data:t.map((e,n)=>({value:e.value,name:e.name,itemStyle:{borderRadius:[8,8,0,0],color:new b(0,0,0,1,[{offset:0,color:l[n%l.length]},{offset:1,color:"rgba(48, 220, 255, 0.08)"}])}})),label:{show:!0,position:"top",color:"#ffffff",fontSize:11,formatter:({value:e})=>u(e)}}]}}function N(t){return{animationDuration:700,grid:{left:78,right:72,top:22,bottom:20},tooltip:d(m({},c()),{trigger:"axis",axisPointer:{type:"shadow"}}),xAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},yAxis:{type:"category",inverse:!0,data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.22)"}},axisLabel:{color:"rgba(223, 250, 255, 0.82)",fontSize:12}},series:[{name:i.chart.title,type:"bar",barWidth:13,data:t.map((e,n)=>({value:e.value,name:e.name,itemStyle:{borderRadius:[0,8,8,0],color:new b(0,0,1,0,[{offset:0,color:"rgba(48, 220, 255, 0.16)"},{offset:1,color:l[n%l.length]}])}})),label:{show:!0,position:"right",color:"#ffffff",fontSize:11,formatter:({value:e})=>u(e)}}]}}function T(t){return{animationDuration:700,tooltip:c(),legend:{orient:"vertical",right:10,top:"middle",itemWidth:10,itemHeight:10,textStyle:{color:"rgba(223, 250, 255, 0.78)",fontSize:11}},series:[{name:i.chart.title,type:"pie",radius:["48%","68%"],center:["35%","52%"],avoidLabelOverlap:!0,label:{color:"#fff",fontSize:11,formatter:`{b}
{d}%`},labelLine:{lineStyle:{color:"rgba(223, 250, 255, 0.42)"}},itemStyle:{borderColor:"rgba(3, 18, 31, 0.92)",borderWidth:3},data:t.map((e,n)=>({name:e.name,value:e.value,itemStyle:{color:l[n%l.length]}}))}]}}function $(t){return{animationDuration:760,grid:{left:52,right:28,top:30,bottom:48},tooltip:d(m({},c()),{trigger:"axis",axisPointer:{type:"line",lineStyle:{color:"rgba(255, 215, 108, 0.52)"}}}),xAxis:{type:"category",boundaryGap:!1,data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.28)"}},axisLabel:{color:"rgba(223, 250, 255, 0.76)",fontSize:11,interval:0}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},series:[{name:i.chart.title,type:"line",smooth:!0,symbol:"circle",symbolSize:8,lineStyle:{width:3,color:"#30dcff"},itemStyle:{color:"#ffd76c",borderColor:"#041522",borderWidth:2},areaStyle:{color:new b(0,0,0,1,[{offset:0,color:"rgba(48, 220, 255, 0.24)"},{offset:1,color:"rgba(48, 220, 255, 0.02)"}])},label:{show:!0,position:"top",color:"#ffffff",fontSize:11,formatter:({value:e})=>u(e)},data:t.map(e=>({value:e.value,name:e.name}))}]}}function c(){return{trigger:"item",backgroundColor:"rgba(2, 13, 22, 0.94)",borderColor:"rgba(48, 220, 255, 0.34)",borderWidth:1,textStyle:{color:"#fff",fontSize:12},formatter:t=>{const e=(i.chart.rows||[]).find(s=>s.name===t.name),n=(e==null?void 0:e.unit)||i.chart.unit||"",f=e!=null&&e.extra?`<br/><span style="color:rgba(223,250,255,.62)">${e.extra}</span>`:"";return`${t.marker}${t.name}: ${u(t.value)}${n}${f}`}}}function v(t=[]){return t.length>6||t.some(e=>String(e.name||"").length>4)}function B(t){const e=String(t||"").trim();if(!e||/^(数据)?来源[::]/.test(e)||e.includes("固定展示"))return"";const n=new RegExp(A,"g"),f=new RegExp(`统计${A}`,"g"),s=e.replace(f,"统计数据").replace(n,"数据").replace(/来源[::]\s*openApi\s*统计库\s*[a-zA-Z0-9_./:-]*[,,、]?\s*/gi,"").replace(/openApi\s*统计库\s*/gi,"").replace(/\b[a-zA-Z][a-zA-Z0-9]*(?:_[a-zA-Z0-9]+){2,}\b/g,"").replace(/[,,、]\s*[,,、]+/g,",").replace(/^[\s,,、::]+|[\s,,、]+$/g,"");return!s||/^来源[::]?$/.test(s)||O(s)?"":s}function O(t){return/^[a-zA-Z0-9_./:-]+$/.test(t)&&(t.includes("_")||t.length>24)}function u(t){const e=Number(t);return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString("zh-CN"):e.toLocaleString("zh-CN",{maximumFractionDigits:2}):"--"}return(t,e)=>(g(),h("div",{class:E(["smart-chart-card",{"is-horizontal":w.value}])},[y("div",G,[y("div",null,[y("strong",null,x(a.chart.title),1),S.value?(g(),h("span",I,x(S.value),1)):_("",!0)]),a.chart.unit?(g(),h("em",M,x(a.chart.unit),1)):_("",!0)]),V(q(j),{class:"smart-chart",option:k.value,autoresize:""},null,8,["option"])],2))}};export{Q as default};

@ -0,0 +1 @@
.smart-admin-page[data-v-958d95b5]{display:flex;flex-direction:column;gap:18px;color:#1f2937}.page-heading[data-v-958d95b5]{display:flex;align-items:flex-start;justify-content:space-between;gap:20px}.page-heading h1[data-v-958d95b5]{margin:0;color:#172033;font-size:22px;font-weight:650}.page-heading p[data-v-958d95b5]{margin:7px 0 0;color:#7b8798;font-size:13px}.settings-card[data-v-958d95b5]{border-radius:10px;box-shadow:0 2px 10px #0f172a0d}.model-form[data-v-958d95b5]{max-width:1120px}.switch-line[data-v-958d95b5]{display:flex;align-items:center;gap:12px;min-height:32px;color:#667085}.field-help[data-v-958d95b5]{margin-top:6px;color:#98a2b3;font-size:12px}.form-actions[data-v-958d95b5]{display:flex;justify-content:flex-end;gap:10px}.context-alert[data-v-958d95b5]{margin-bottom:16px}.context-summary[data-v-958d95b5]{margin-top:4px}.snapshot-collapse[data-v-958d95b5]{margin-top:18px;background:#fff}.snapshot-toolbar[data-v-958d95b5]{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:10px;color:#7b8798;font-size:12px}.snapshot-viewer[data-v-958d95b5]{max-height:560px;margin:0;overflow:auto;padding:16px;border:1px solid #e5e9f0;border-radius:6px;background:#f7f9fc;color:#24324a;font:12px/1.65 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}@media (max-width: 900px){.page-heading[data-v-958d95b5]{align-items:center}.snapshot-toolbar[data-v-958d95b5]{align-items:flex-start;flex-direction:column}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.topic-switcher{display:inline-flex;align-items:center;justify-content:center;width:max-content;max-width:calc(100vw - 96px);min-height:32px;padding:2px;border:1px solid rgba(91,224,244,.34);border-radius:18px;background:linear-gradient(180deg,rgba(5,34,48,.92),rgba(2,18,29,.9));box-shadow:inset 0 1px #ffffff0d,0 10px 26px #00070e52;box-sizing:border-box;overflow:hidden;pointer-events:all}.topic-switcher-menu{display:flex;gap:2px;max-width:100%;border-radius:15px;overflow:hidden}.topic-switcher-item{position:relative;flex:0 0 var(--topic-item-width, 112px);width:var(--topic-item-width, 112px);min-height:26px;padding:0 10px;border:1px solid transparent;border-radius:15px;color:#dcf6f9d1;background:rgba(5,38,52,.42);cursor:pointer;overflow:hidden;transition:color .16s ease,border-color .16s ease,background .16s ease,box-shadow .16s ease}.topic-switcher-item:hover{border-color:#5be0f461;color:#f5ffff;background:rgba(14,78,94,.54)}.topic-switcher-item.is-active{border-color:#7efbf6a3;color:#fff;background:linear-gradient(180deg,rgba(19,101,116,.9),rgba(5,48,62,.9));box-shadow:inset 0 0 0 1px #7efbf61f,inset 0 -2px 0 var(--topic-color, #30dcff),0 0 14px #30dcff24}.topic-switcher-item:focus-visible{outline:2px solid #7efbf6;outline-offset:2px}.topic-switcher .topic-name{position:relative;display:flex;align-items:center;justify-content:center;flex-direction:column;height:100%;padding:0 5px;text-align:center;white-space:nowrap}.topic-switcher .topic-name,.topic-switcher .topic-title,.topic-switcher .topic-name small{padding-top:0;color:inherit;font-size:13px;font-weight:600;line-height:16px}.topic-switcher .topic-name.has-sub-name{gap:1px}.topic-switcher .topic-name small{display:block;max-width:100%;overflow:hidden;font-size:9px;font-weight:500;line-height:10px;opacity:.68;text-overflow:ellipsis}.topic-switcher.is-compact{min-height:29px;padding:1px;border-radius:16px}.topic-switcher.is-compact .topic-switcher-menu{gap:1px}.topic-switcher.is-compact .topic-switcher-item{flex-basis:min(var(--topic-item-width, 104px),104px);width:min(var(--topic-item-width, 104px),104px);min-height:25px;padding:0 2px;border-radius:14px}.topic-switcher.is-compact .topic-name,.topic-switcher.is-compact .topic-title{font-size:12px;line-height:15px}

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
.topic-switcher{display:flex;align-items:flex-start;justify-content:center;width:600px;height:52px;padding-top:10px;background:url(./bottom-menu-bg-b465793d-balabala-1784132792831.png) no-repeat center bottom;background-size:100% 52px;pointer-events:all}.topic-switcher-arrow{display:flex;align-items:center;height:30px;margin:0 12px}.topic-switcher-arrow.is-reverse{transform:scaleX(-1)}.topic-switcher-arrow img{animation:arrowAnimate 2s ease-in-out infinite}.topic-switcher-arrow img:last-child{animation:arrowAnimate2 2s ease-in-out infinite}.topic-switcher-menu{display:flex;gap:4px}.topic-switcher-item{position:relative;width:var(--topic-item-width, 112px);height:32px;padding:0;border:0;background:url(./bottom-menu-btn-ee5c8064-balabala-1784132792831.png) no-repeat;background-size:100% 100%;color:#fff;cursor:pointer;overflow:hidden}.topic-switcher-item:hover,.topic-switcher-item.is-active{background:url(./bottom-menu-btn-hover-df33e514-balabala-1784132792831.png) no-repeat;background-size:100% 100%}.topic-switcher .topic-name{position:relative;display:flex;align-items:center;justify-content:center;flex-direction:column;height:100%;padding:0 5px;text-align:center;white-space:nowrap}.topic-switcher .topic-name,.topic-switcher .topic-title,.topic-switcher .topic-name small{padding-top:0;font-size:16px;font-weight:700;line-height:18px;background:-webkit-linear-gradient(rgb(117,232,255),rgb(255,255,255));-webkit-background-clip:text;-webkit-text-fill-color:transparent}.topic-switcher .topic-name.has-sub-name{gap:1px}.topic-switcher .topic-name small{display:block;max-width:100%;overflow:hidden;font-size:10px;font-weight:600;line-height:11px;text-overflow:ellipsis}

@ -0,0 +1 @@
.user-identity[data-v-c3907d06]{display:flex;align-items:center;gap:10px;min-width:0}.user-avatar[data-v-c3907d06]{flex:0 0 auto;background:#e8f1ff;color:#1677ff;font-weight:650}.user-identity div[data-v-c3907d06],.contact-cell[data-v-c3907d06]{min-width:0;display:flex;flex-direction:column}.user-identity strong[data-v-c3907d06]{overflow:hidden;color:#27364a;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.user-identity span[data-v-c3907d06],.contact-cell small[data-v-c3907d06],.muted[data-v-c3907d06]{margin-top:3px;color:#98a2b2;font-size:12px}.contact-cell span[data-v-c3907d06]{color:#445064}.form-grid[data-v-c3907d06]{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}.drawer-footer[data-v-c3907d06]{display:flex;justify-content:flex-end;gap:8px}

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _};

@ -0,0 +1 @@
.admin-page{min-height:100%}.admin-page-heading{display:flex;align-items:center;justify-content:space-between;min-height:32px;margin-bottom:14px}.admin-page-heading h1{margin:0;color:#1f2937;font-size:22px;font-weight:650;line-height:32px}.admin-query-card,.admin-table-card{border:1px solid #edf0f4;border-radius:8px;box-shadow:0 1px 3px #0f172a06}.admin-query-card{margin-bottom:14px}.admin-query-card .ant-card-body{padding:18px 20px}.admin-query-form{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px 24px}.admin-query-form .ant-form-item{min-width:0;margin:0}.admin-query-form .ant-form-item-row{flex-wrap:nowrap;align-items:center}.admin-query-form .ant-form-item-label{flex:0 0 76px;width:76px;padding:0;overflow:visible;text-align:right;white-space:nowrap}.admin-query-form .ant-form-item-label>label{height:32px;color:#374151}.admin-query-form .ant-form-item-control{min-width:0}.admin-query-form .ant-input-affix-wrapper,.admin-query-form .ant-select,.admin-query-form .ant-picker{width:100%}.admin-query-actions{grid-column:1/-1;justify-self:end}.admin-query-actions .ant-form-item-row,.admin-query-actions .ant-form-item-control-input-content{display:flex;justify-content:flex-end}.admin-table-card .ant-card-body{padding:0}.admin-table-toolbar{min-height:57px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #edf0f4}.admin-table-toolbar strong{color:#283548;font-size:14px}.admin-table-card .ant-table-thead>tr>th{background:#f8fafc;color:#445064;font-weight:600}.admin-table-card .ant-pagination{margin:16px}.admin-table-card .ant-table-cell{font-size:13px}.admin-link-danger{color:#ff4d4f}.admin-code-block{max-height:240px;overflow:auto;margin:0;padding:12px 14px;border-radius:6px;background:#f6f8fa;color:#334155;font:12px/1.65 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap;word-break:break-all}@media (max-width: 1280px){.admin-query-form{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 760px){.admin-query-card .ant-card-body{padding:16px}.admin-query-form{grid-template-columns:minmax(0,1fr);gap:14px}.admin-query-actions,.admin-query-actions .ant-form-item-control{width:100%}}

@ -1 +1 @@
var m=Object.defineProperty;var p=Object.getOwnPropertySymbols;var y=Object.prototype.hasOwnProperty,T=Object.prototype.propertyIsEnumerable;var i=(t,e,a)=>e in t?m(t,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[e]=a,o=(t,e)=>{for(var a in e||(e={}))y.call(e,a)&&i(t,a,e[a]);if(p)for(var a of p(e))T.call(e,a)&&i(t,a,e[a]);return t};import{p as d}from"./screen2Standard-41868f75-1784132792831.js";import{R as x,b as u,d as g,p as l,h as f,r as L,a as A,g as B,e as N,c as M,o as O,s as _,f as H,i as S,j as w,k as C,l as F,m as P,n as E}from"./TopicSwitcher-2e4ca291-1784132792831.js";import{g as n,a as h,H as q,C as G}from"./index-24267a69-1784132792831.js";const s=new Map;class b{constructor(e={}){this.options=o({includeChinaMap:!1},e),this.ready=null,this.init()}init(){const e=this.getSharedKey(),a=R(e,()=>this.createAssetList());this.instance=a.instance,this.ready=a.ready}getSharedKey(){return this.options.includeChinaMap?"hongyuan-map-with-china":"hongyuan-map"}createAssetList(){let e=[{type:"Texture",name:"flyline",path:u},{type:"Texture",name:"pathLine",path:u},{type:"Texture",name:"pathLine2",path:g},{type:"Texture",name:"pathLine3",path:l},{type:"File",name:"china",path:n(h)},{type:"File",name:"mapJson",path:n(q)},{type:"File",name:"mapStroke",path:n(h)},{type:"Texture",name:"huiguang",path:f},{type:"Texture",name:"rotationBorder1",path:L},{type:"Texture",name:"rotationBorder2",path:A},{type:"Texture",name:"guangquan1",path:B},{type:"Texture",name:"guangquan2",path:N},{type:"Texture",name:"chinaBlurLine",path:M},{type:"Texture",name:"ocean",path:O},{type:"Texture",name:"side",path:_},{type:"Texture",name:"arrow",path:H},{type:"Texture",name:"point",path:S},{type:"Texture",name:"focusArrows",path:w},{type:"Texture",name:"focusBar",path:C},{type:"Texture",name:"focusBg",path:F},{type:"Texture",name:"focusMidQuan",path:P},{type:"Texture",name:"focusMoveBg",path:E}];return this.options.includeChinaMap&&e.push({type:"File",name:"chinaMap",path:n(G)}),e}}function R(t,e){if(s.has(t))return s.get(t);const a=new x({cloneTextures:!0});a.addLoader(d,"FileLoader");const c=a.loadAll(e()),r={instance:a,ready:c};return s.set(t,r),r}export{b as A};
var m=Object.defineProperty;var p=Object.getOwnPropertySymbols;var y=Object.prototype.hasOwnProperty,T=Object.prototype.propertyIsEnumerable;var i=(t,e,a)=>e in t?m(t,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[e]=a,o=(t,e)=>{for(var a in e||(e={}))y.call(e,a)&&i(t,a,e[a]);if(p)for(var a of p(e))T.call(e,a)&&i(t,a,e[a]);return t};import{p as d}from"./screen2Standard-03f7f908-1786807848259.js";import{R as x,b as u,d as g,p as l,h as f,r as L,a as A,g as B,e as N,c as M,o as O,s as _,f as H,i as S,j as w,k as C,l as F,m as P,n as E}from"./TopicSwitcher-c91bad20-1786807848259.js";import{g as n,b as h,H as q,C as G}from"./index-80cb981f-1786807848259.js";const s=new Map;class Y{constructor(e={}){this.options=o({includeChinaMap:!1},e),this.ready=null,this.init()}init(){const e=this.getSharedKey(),a=R(e,()=>this.createAssetList());this.instance=a.instance,this.ready=a.ready}getSharedKey(){return this.options.includeChinaMap?"hongyuan-map-with-china":"hongyuan-map"}createAssetList(){let e=[{type:"Texture",name:"flyline",path:u},{type:"Texture",name:"pathLine",path:u},{type:"Texture",name:"pathLine2",path:g},{type:"Texture",name:"pathLine3",path:l},{type:"File",name:"china",path:n(h)},{type:"File",name:"mapJson",path:n(q)},{type:"File",name:"mapStroke",path:n(h)},{type:"Texture",name:"huiguang",path:f},{type:"Texture",name:"rotationBorder1",path:L},{type:"Texture",name:"rotationBorder2",path:A},{type:"Texture",name:"guangquan1",path:B},{type:"Texture",name:"guangquan2",path:N},{type:"Texture",name:"chinaBlurLine",path:M},{type:"Texture",name:"ocean",path:O},{type:"Texture",name:"side",path:_},{type:"Texture",name:"arrow",path:H},{type:"Texture",name:"point",path:S},{type:"Texture",name:"focusArrows",path:w},{type:"Texture",name:"focusBar",path:C},{type:"Texture",name:"focusBg",path:F},{type:"Texture",name:"focusMidQuan",path:P},{type:"Texture",name:"focusMoveBg",path:E}];return this.options.includeChinaMap&&e.push({type:"File",name:"chinaMap",path:n(G)}),e}}function R(t,e){if(s.has(t))return s.get(t);const a=new x({cloneTextures:!0});a.addLoader(d,"FileLoader");const c=a.loadAll(e()),r={instance:a,ready:c};return s.set(t,r),r}export{Y as A};

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 93 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
var i=Math.pow;import{g as W,d as m,t as b,s as M,h as c,e as A}from"./livestockData-36ec0ae2-1784132792831.js";import{c as T}from"./data-ee410ed3-1784132792831.js";const e=(a,n=2)=>{const t=i(10,n);return Math.round((Number(a)||0)*t)/t},g=(a,n)=>a.reduce((t,u)=>t+(Number(u[n])||0),0),k=a=>e((Number(a)||0)/1e4,2),x=g(b,"value"),S=g(m,"yakCount"),d=A,o=e(c.grasslandArea/1e4,2),l=e(c.wetArea/1e4,2),r=177.92,P=e(o+l+r,2),N=e(d/Math.max(o,1),1),v=e(l/Math.max(P,1)*100,1),w=637.07,s=108.84,R=297.29,y=159.33,C=e(o+l,2),Y=e((R+s)*2e3/Math.max(C,1),2),I=[{key:"pasture-area",zh:"草场面积",name:"草场面积",value:C,unit:"万亩",decimals:2,icon:"area"},{key:"pasture-productivity",zh:"草场生产力",name:"草场生产力",value:Y,unit:"斤/亩",decimals:2,icon:"yield"},{key:"yak-stock",zh:"牦牛存栏",name:"牦牛存栏",value:d,unit:"头",decimals:0,icon:"stack"},{key:"today-outflow",zh:"今日出栏",name:"今日出栏",value:0,unit:"头",decimals:0,icon:"length"},{key:"county-overload-rate",zh:"超载率",name:"超载率",value:T.overloadRate,unit:"%",decimals:2,icon:"rate"}],j=[{key:"grassland",name:"草地面积",value:o,unit:"万亩",tone:"green"},{key:"wetland",name:"湿地面积",value:l,unit:"万亩",tone:"cyan"},{key:"woodland",name:"林地面积",value:r,unit:"万亩",tone:"mint"},{key:"yak-density",name:"草畜密度",value:N,unit:"头/万亩",tone:"gold"}],D=[{key:"grassland",name:"草地",value:o,unit:"万亩",color:"#24f6c4"},{key:"wetland",name:"湿地",value:l,unit:"万亩",color:"#32dcff"},{key:"woodland",name:"林地",value:r,unit:"万亩",color:"#8bf7ff"}],J=[{key:"basic-grassland",name:"基本草原",value:w,unit:"万亩",percent:e(w/Math.max(o,1)*100,1),note:"草地保护底盘"},{key:"wetland-yield",name:"湿地生产力",value:s,unit:"万吨",percent:e(s/Math.max(R+s,1)*100,1),note:"鲜草产能"},{key:"public-woodland",name:"公益林面积",value:y,unit:"万亩",percent:e(y/Math.max(r,1)*100,1),note:"林地保护占比"},{key:"wetland-rate",name:"湿地占比",value:v,unit:"%",percent:v,note:"林草湿结构"}],L=W.map(a=>{const n=m.find(z=>z.zoneName===a.zoneName)||{},t=k(a.grasslandArea),u=k(a.wetArea);return{key:a.zoneName,name:a.zoneName,grasslandArea:t,wetlandArea:u,yakCount:n.yakCount||0,resourceTotal:e(t+u,2),density:e((n.yakCount||0)/Math.max(t+u,1),1)}}).sort((a,n)=>n.yakCount-a.yakCount),O=m.map(a=>({key:a.zoneName,name:a.zoneName,value:a.yakCount,unit:"头",percent:e(a.yakCount/Math.max(S,1)*100,1)})).sort((a,n)=>n.value-a.value),p=b.map(a=>({key:a.label,name:a.label,value:a.value,unit:"头",yoy:a.yoy,percent:e(a.value/Math.max(x,1)*100,1)})),B=Math.max(...M.map(a=>Number(a.value)||0),1),V=M.map(a=>{const n=a.name.includes("储备")||a.name.includes("加工")?`${Number(a.capacity||0).toLocaleString("zh-CN")}吨`:"已接入";return{key:a.name,name:a.name,value:a.value,unit:a.unit,capacity:a.capacity,capacityNote:n,percent:e((Number(a.value)||0)/B*100,1)}});var f,h;const $=[{key:"flow-grassland",module:"林草湿",name:"草地面积分布完成乡镇归集",value:o,unit:"万亩",trend:"+0.8%"},{key:"flow-wetland",module:"林草湿",name:"湿地生产力指标进入总览",value:s,unit:"万吨",trend:"+1.2%"},{key:"flow-woodland",module:"林草湿",name:"公益林保护面积同步",value:y,unit:"万亩",trend:"89.6%"},{key:"flow-yak-town",module:"牦牛",name:"畜群结构总量同步",value:d,unit:"头",trend:"+2.4%"},{key:"flow-yak-density",module:"草畜",name:"草畜密度联动核算",value:N,unit:"头/万亩",trend:"联动"},{key:"flow-trade-1",module:"交易",name:"屠宰出栏流通记录入库",value:((f=p[0])==null?void 0:f.value)||0,unit:"头",trend:"+6%"},{key:"flow-trade-2",module:"交易",name:"活畜交易影响扣减存栏",value:((h=p[1])==null?void 0:h.value)||0,unit:"头",trend:"-3%"},{key:"flow-industry",module:"产业",name:"饲草储备与加工主体纳入画像",value:c.baseCount+c.projectCount,unit:"个",trend:"在线"}],q=[{key:"grassland",label:"草地",value:o,unit:"万亩",x:50,y:15,color:"#24f6c4"},{key:"wetland",label:"湿地",value:l,unit:"万亩",x:83,y:48,color:"#32dcff"},{key:"trade",label:"交易",value:x,unit:"头",x:68,y:72,color:"#8bf7ff"},{key:"yak",label:"牦牛",value:d,unit:"头",x:24,y:74,color:"#24f6c4"},{key:"woodland",label:"林地",value:r,unit:"万亩",x:16,y:35,color:"#8bf7ff"}];export{j as a,J as b,p as c,$ as d,q as e,I as h,D as r,V as s,L as t,O as y};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
const u=480;function o(H,A,n){return Math.min(Math.max(H,A),n)}function F({point:H,rowCount:A=0,loading:n=!1,empty:s=!1,safeLeft:h=448,safeRight:r=1472,preferredTop:T=112,safeTop:L=72,preserveDesiredHeight:P=!1}){if(!H)return{width:480,height:176,style:{}};const i=o(Number(A)||0,0,12),R=n||s?176:58+Math.max(i,1)*38,E=o(R,176,420),t=o(H.y-18,72,1080-28),a=t-T,I=t-L;let _=E,e=t-E;a>=112?(_=Math.min(E,a),e=t-_):I>=112?(_=Math.min(E,I),e=t-_):(_=Math.max(112,Math.min(E,t-72)),e=t-_),P&&(_=E,e=o(t-E,T,1080-E-28));const N=o(h,24,1920-480-24),D=o(r,N+480,1920-24),c=o(H.x-480/2,N,D-480),M=o(H.x-c,28,480-28);return{width:480,height:Math.round(_),style:{left:`${Math.round(c)}px`,top:`${Math.round(e)}px`,right:"auto",bottom:"auto",width:"480px","--feature-panel-anchor-x":`${Math.round(M)}px`}}}export{u as F,F as c};

@ -1 +0,0 @@
var m=(e,t,r)=>new Promise((s,u)=>{var a=i=>{try{c(r.next(i))}catch(l){u(l)}},n=i=>{try{c(r.throw(i))}catch(l){u(l)}},c=i=>i.done?s(i.value):Promise.resolve(i.value).then(a,n);c((r=r.apply(e,t)).next())});import{H as f,W as S}from"./townshipBoundaries-822b7d9e-1784132792831.js";import{r as E}from"./index-a1b5e9c0-1784132792831.js";const d="/geoserver/ne/wms",_={}.VITE_GEOSERVER_WFS_URL||d.replace(/\/wms$/i,"/wfs"),h={}.VITE_GEOSERVER_WMTS_URL||"/geoserver/gwc/service/wmts";function o(e,t){const r=new URLSearchParams;return Object.entries(t).forEach(([s,u])=>{u!=null&&u!==""&&r.append(s,u)}),`${e}${e.includes("?")?"&":"?"}${r.toString()}`}function y(e,t={}){const r=t.bounds||f,s=t.size||S;return o(t.url||d,{service:"WMS",version:"1.1.1",request:"GetMap",layers:e.layerName,styles:e.styles||"",format:"image/png",transparent:!0,tiled:!0,srs:"EPSG:4326",bbox:[r.west,r.south,r.east,r.north].join(","),width:s.width,height:s.height,CQL_FILTER:t.cqlFilter||e.cqlFilter,SLD_BODY:t.sldBody||e.sldBody,_:Date.now()})}function W(e,t={}){var a,n,c,i,l;const r=e.tileMatrixSetID||e.tileMatrixSet||"EPSG:900913",s=Number((i=(c=(n=(a=t.z)!=null?a:t.zoom)!=null?n:e.wmtsZoom)!=null?c:e.homeWmtsZoom)!=null?i:0),u=t.tileMatrix||((l=e.tileMatrixLabels)==null?void 0:l[s])||`${r}:${s}`;return o(t.url||e.url||h,{service:"WMTS",version:"1.0.0",request:"GetTile",layer:e.layerName,style:e.style||e.styles||"",format:e.format||"image/png",tileMatrixSet:r,tileMatrix:u,tileRow:t.y,tileCol:t.x})}function F(e,t,r={}){var a,n;const s=r.bounds||f,u=r.size||S;return o(r.url||d,{service:"WMS",version:"1.1.1",request:"GetFeatureInfo",layers:e.layerName,query_layers:e.layerName,styles:e.styles||"",info_format:"application/json",feature_count:5,srs:"EPSG:4326",bbox:[s.west,s.south,s.east,s.north].join(","),width:u.width,height:u.height,x:Math.round(t.x),y:Math.round(t.y),buffer:(n=(a=r.buffer)!=null?a:e.queryBuffer)!=null?n:8,CQL_FILTER:r.cqlFilter||e.cqlFilter,SLD_BODY:r.sldBody||e.sldBody})}function g(s,u){return m(this,arguments,function*(e,t,r={}){const a=F(e,t,r);return E(a,{credentials:"include"})})}function R(e,t={}){return o(t.url||_,{service:"WFS",version:t.version||"1.0.0",request:"GetFeature",typeName:e,outputFormat:"json",propertyName:Array.isArray(t.propertyName)?t.propertyName.join(","):t.propertyName,CQL_FILTER:t.cqlFilter,maxFeatures:t.maxFeatures||2e5})}function w(r){return m(this,arguments,function*(e,t={}){const s=R(e,t);return E(s,{credentials:"include",timeout:t.timeout||2e4})})}export{g as a,y as b,W as c,w as g};

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.isolation-page[data-v-69e5473e]{min-height:100vh;display:grid;place-items:center;padding:32px;color:#e9fbff;background:radial-gradient(circle at 50% 0%,#153a52 0,#071b2a 46%,#04121d 100%)}.isolation-card[data-v-69e5473e]{width:min(760px,100%);padding:42px;border:1px solid rgba(87,211,255,.35);border-radius:18px;background:rgba(5,24,38,.86);box-shadow:0 24px 80px #00000059}.eyebrow[data-v-69e5473e]{margin:0 0 8px;color:#62d7ff;letter-spacing:.18em}h1[data-v-69e5473e]{margin:0;font-size:clamp(28px,4vw,42px)}.summary[data-v-69e5473e]{margin:14px 0 30px;color:#9bb8c7}.status-grid[data-v-69e5473e]{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}.status-item[data-v-69e5473e]{display:flex;gap:12px;align-items:center;padding:16px;border-radius:10px;background:rgba(23,57,76,.62)}.status-item p[data-v-69e5473e]{margin:4px 0 0;color:#9bb8c7}.status-dot[data-v-69e5473e]{width:12px;height:12px;flex:none;border-radius:50%;background:#e0aa46;box-shadow:0 0 12px currentColor}.status-dot.up[data-v-69e5473e]{color:#37d693;background:currentColor}.status-dot.down[data-v-69e5473e]{color:#ff6b74;background:currentColor}.result[data-v-69e5473e]{margin:28px 0 16px}.result.up[data-v-69e5473e]{color:#37d693}.result.down[data-v-69e5473e]{color:#ff6b74}button[data-v-69e5473e]{padding:10px 18px;border:0;border-radius:8px;color:#042033;background:#62d7ff;cursor:pointer;font-weight:700}button[data-v-69e5473e]:disabled{cursor:wait;opacity:.65}

@ -1 +0,0 @@
.login-screen[data-v-8ebd0d6e]{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;overflow:hidden;background:linear-gradient(180deg,rgba(4,16,38,.1),rgba(2,8,22,.62)),url(./bg-3acb94e3-balabala-1784132792831.png) center/cover no-repeat,#05142f;color:#fff}.login-screen[data-v-8ebd0d6e]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(90deg,rgba(0,0,0,.46),transparent 42%,rgba(0,0,0,.35)),radial-gradient(circle at 52% 46%,rgba(48,220,255,.16),transparent 32%)}.login-shell[data-v-8ebd0d6e]{position:relative;z-index:1;width:min(980px,100vw - 48px);display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:56px;align-items:center}.login-brand[data-v-8ebd0d6e]{display:flex;flex-direction:column;gap:14px;min-width:0;text-shadow:0 0 20px rgba(48,220,255,.36)}.login-brand span[data-v-8ebd0d6e]{font-size:42px;line-height:1.2;font-weight:700}.login-brand small[data-v-8ebd0d6e]{color:#c4f3feb8;font-size:13px;letter-spacing:0}.login-panel[data-v-8ebd0d6e]{width:360px;padding:30px 28px 28px;border:1px solid rgba(48,220,255,.34);background:rgba(3,14,32,.82);box-shadow:0 24px 70px #00000057,inset 0 0 28px #30dcff14;box-sizing:border-box}.login-panel-title[data-v-8ebd0d6e]{margin-bottom:26px;color:#fff;font-size:22px;font-weight:700;text-align:center}.login-field[data-v-8ebd0d6e]{display:block;margin-bottom:18px}.login-field span[data-v-8ebd0d6e]{display:block;margin-bottom:8px;color:#c4f3fec7;font-size:13px}.login-field input[data-v-8ebd0d6e]{width:100%;height:42px;padding:0 12px;border:1px solid rgba(48,220,255,.26);outline:none;background:rgba(0,10,24,.62);color:#fff;font-size:15px;box-sizing:border-box}.login-field input[data-v-8ebd0d6e]:focus{border-color:#30dcffb8;box-shadow:0 0 0 2px #30dcff1f}.login-error[data-v-8ebd0d6e]{min-height:20px;margin:-4px 0 12px;color:#ffcf8a;font-size:13px;line-height:20px}.login-submit[data-v-8ebd0d6e]{width:100%;height:44px;border:1px solid rgba(48,220,255,.52);background:linear-gradient(90deg,rgba(24,140,196,.92),rgba(37,204,218,.92));color:#fff;cursor:pointer;font-size:16px;font-weight:700}.login-submit[data-v-8ebd0d6e]:disabled{cursor:not-allowed;opacity:.68}@media (max-width: 820px){.login-shell[data-v-8ebd0d6e]{grid-template-columns:1fr;gap:28px}.login-brand span[data-v-8ebd0d6e]{font-size:30px}.login-panel[data-v-8ebd0d6e]{width:100%}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
.cesium-map[data-v-19fc4a4c]{position:absolute;z-index:1;top:0;right:0;bottom:0;left:0;overflow:hidden;background:#020b12}.cesium-map__viewer[data-v-19fc4a4c],.cesium-map__viewer[data-v-19fc4a4c] .cesium-viewer,.cesium-map__viewer[data-v-19fc4a4c] .cesium-viewer-cesiumWidgetContainer,.cesium-map__viewer[data-v-19fc4a4c] .cesium-widget,.cesium-map__viewer[data-v-19fc4a4c] canvas{width:100%;height:100%}.cesium-map__viewer[data-v-19fc4a4c] canvas{display:block;outline:none}.cesium-map__viewer[data-v-19fc4a4c] .cesium-viewer-bottom,.cesium-map__viewer[data-v-19fc4a4c] .cesium-widget-credits{display:none!important}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
var y=(h,o,e)=>new Promise((p,i)=>{var d=s=>{try{c(e.next(s))}catch(a){i(a)}},v=s=>{try{c(e.throw(s))}catch(a){i(a)}},c=s=>s.done?p(s.value):Promise.resolve(s.value).then(d,v);c((e=e.apply(h,o)).next())});import{_ as V}from"./_plugin-vue_export-helper-c27b6911-1786807848259.js";import{g,q as S,o as k,c as _,a as n,F as C,y as q,n as A,t as u,d as M,L as B}from"./index-1786807848259.js";const E={class:"isolation-page"},I={class:"isolation-card"},j={class:"status-grid"},F=["disabled"],G={__name:"index",setup(h){const o=M(!1),e=B({screen:"up",openApi:"checking",database:"checking",redis:"checking",geoserver:"checking"}),p=g(()=>[{key:"screen",label:"V3 Screen",status:e.screen},{key:"openApi",label:"V3 OpenAPI",status:e.openApi},{key:"database",label:"本机 qkl2",status:e.database},{key:"redis",label:"V3 Redis",status:e.redis},{key:"geoserver",label:"V3 GeoServer",status:e.geoserver}]),i=g(()=>{const s=Object.values(e);return s.includes("down")?"down":s.includes("checking")?"checking":"up"}),d=g(()=>({up:"V3 空环境服务已连通。",down:"存在未通过的服务,请查看状态并重试。",checking:"正在检查 V3 服务。"})[i.value]);function v(s){return{up:"正常",down:"失败",checking:"检查中"}[s]}function c(){return y(this,null,function*(){var s,a,r,w,b,f,m,x;o.value=!0,e.openApi="checking",e.database="checking",e.redis="checking",e.geoserver="checking";try{const t=yield(yield fetch("/openApi/screen2/_health",{cache:"no-store"})).json();e.openApi=((a=(s=t==null?void 0:t.services)==null?void 0:s.openApi)==null?void 0:a.status)==="up"?"up":"down",e.database=((w=(r=t==null?void 0:t.services)==null?void 0:r.database)==null?void 0:w.status)==="up"&&((f=(b=t==null?void 0:t.services)==null?void 0:b.database)==null?void 0:f.database)==="qkl2"?"up":"down",e.redis=((x=(m=t==null?void 0:t.services)==null?void 0:m.redis)==null?void 0:x.status)==="up"?"up":"down"}catch(l){e.openApi="down",e.database="down",e.redis="down"}try{const l=yield fetch("/geoserver/v3/wms?service=WMS&request=GetCapabilities",{cache:"no-store"}),t=yield l.text();e.geoserver=l.ok&&/WMS_Capabilities/i.test(t)?"up":"down"}catch(l){e.geoserver="down"}o.value=!1})}return S(c),(s,a)=>(k(),_("main",E,[n("section",I,[a[0]||(a[0]=n("p",{class:"eyebrow"},"HY SCREEN V3",-1)),a[1]||(a[1]=n("h1",null,"V3 空环境隔离检查",-1)),a[2]||(a[2]=n("p",{class:"summary"},"这里只检查新环境连通性,不加载旧业务页面或旧数据。",-1)),n("div",j,[(k(!0),_(C,null,q(p.value,r=>(k(),_("article",{key:r.key,class:"status-item"},[n("span",{class:A(["status-dot",r.status])},null,2),n("div",null,[n("strong",null,u(r.label),1),n("p",null,u(v(r.status)),1)])]))),128))]),n("p",{class:A(["result",i.value])},u(d.value),3),n("button",{type:"button",disabled:o.value,onClick:c},u(o.value?"检查中...":"重新检查"),9,F)])]))}},R=V(G,[["__scopeId","data-v-69e5473e"]]);export{R as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save