Compare commits

...

3 Commits
V2.0 ... V2.2

  1. 389
      design-qa.md
  2. 0
      docs/assets/AlibabaPuHuiTi-14435b65-balabala-1785726778446.woff2
  3. 0
      docs/assets/AlimamaShuHeiTi-Bold-6401fd0d-balabala-1785726778446.ttf
  4. 0
      docs/assets/AlimamaShuHeiTi-Bold-a95023f2-balabala-1785726778446.woff
  5. 0
      docs/assets/AlimamaShuHeiTi-Bold-fa4a258d-balabala-1785726778446.woff2
  6. 1
      docs/assets/FeatureInfoPanel-528fd437-balabala-1785726778446.css
  7. 1
      docs/assets/FeatureInfoPanel-84703f43-balabala-1784132792831.css
  8. 3
      docs/assets/FeatureInfoPanel-8ee1b2b1-1784132792831.js
  9. 3
      docs/assets/FeatureInfoPanel-e0a0d741-1785726778446.js
  10. 1
      docs/assets/LayerPanel-60397a69-balabala-1785726778446.css
  11. 1
      docs/assets/LayerPanel-7a55b2bc-balabala-1784132792831.css
  12. 1
      docs/assets/LayerPanel-921f9e3d-1785726778446.js
  13. 1
      docs/assets/LayerPanel-fa97fc8c-1784132792831.js
  14. 0
      docs/assets/SmartChartRenderer-7a3a96b9-balabala-1785726778446.css
  15. 4
      docs/assets/SmartChartRenderer-d940c77a-1785726778446.js
  16. 4
      docs/assets/TopicSwitcher-0aae51d1-1785726778446.js
  17. 1
      docs/assets/TopicSwitcher-b6474311-balabala-1785726778446.css
  18. 1
      docs/assets/TopicSwitcher-f90bcf5a-balabala-1784132792831.css
  19. 0
      docs/assets/area-b57940eb-balabala-1785726778446.png
  20. 2
      docs/assets/assets-5661f996-1785726778446.js
  21. 1
      docs/assets/balanceApi-994e7f98-1785726778446.js
  22. 0
      docs/assets/bg-3acb94e3-balabala-1785726778446.png
  23. 0
      docs/assets/bottom-menu-arrow-big-180b7071-balabala-1785726778446.svg
  24. 0
      docs/assets/bottom-menu-arrow-small-19304179-balabala-1785726778446.svg
  25. 0
      docs/assets/bottom-menu-bg-b465793d-balabala-1785726778446.png
  26. 0
      docs/assets/bottom-menu-btn-ee5c8064-balabala-1785726778446.png
  27. 0
      docs/assets/bottom-menu-btn-hover-df33e514-balabala-1785726778446.png
  28. 2
      docs/assets/chartTheme-330b271e-1785726778446.js
  29. 0
      docs/assets/chinaBlurLine-1a2cbc0f-balabala-1785726778446.png
  30. 0
      docs/assets/content-bottom-left-arrow-3a8a61f3-balabala-1785726778446.svg
  31. 0
      docs/assets/content-bottom-right-arrow-a3c5270d-balabala-1785726778446.svg
  32. 0
      docs/assets/content-middle-line-162bc0d5-balabala-1785726778446.svg
  33. 2
      docs/assets/data-0d4a0513-1785726778446.js
  34. 4
      docs/assets/data-112f1d11-1785726778446.js
  35. 1
      docs/assets/data-56996d99-1785726778446.js
  36. 10540
      docs/assets/data-6350cbbd-1785726778446.js
  37. 1
      docs/assets/data-85b25709-1784132792831.js
  38. 1
      docs/assets/data-aa09e6f1-1785726778446.js
  39. 16380
      docs/assets/data-b4247fde-1784132792831.js
  40. 2
      docs/assets/data-e7a95cad-1785726778446.js
  41. 1
      docs/assets/data-ee410ed3-1784132792831.js
  42. 19041
      docs/assets/familyPastureData-f64283c3-1785726778446.js
  43. 2
      docs/assets/featurePanelLayout-b5234356-1785726778446.js
  44. 0
      docs/assets/flyline6-525edf67-balabala-1785726778446.png
  45. 0
      docs/assets/focus_bg-b6803e2d-balabala-1785726778446.png
  46. 0
      docs/assets/focus_move_bg-cf41417a-balabala-1785726778446.png
  47. 2
      docs/assets/geoserver-d05ee620-1785726778446.js
  48. 0
      docs/assets/header-bg-65b38012-balabala-1785726778446.png
  49. 0
      docs/assets/huiguang-3c5dfda5-balabala-1785726778446.png
  50. 0
      docs/assets/icon1-6f7c222f-balabala-1785726778446.png
  51. 0
      docs/assets/icon2-4f77ccec-balabala-1785726778446.png
  52. 4
      docs/assets/index-007453d8-1784132792831.js
  53. 1
      docs/assets/index-02d2dea9-balabala-1785726778446.css
  54. 1
      docs/assets/index-08ee8551-balabala-1784132792831.css
  55. 2
      docs/assets/index-0a7426a0-balabala-1785726778446.css
  56. 0
      docs/assets/index-148a2898-balabala-1785726778446.css
  57. 1
      docs/assets/index-1683923b-balabala-1785726778446.css
  58. 66
      docs/assets/index-1785726778446.js
  59. 1
      docs/assets/index-1d3ffd1c-balabala-1784132792831.css
  60. 2
      docs/assets/index-2044d487-balabala-1785726778446.css
  61. 2
      docs/assets/index-24267a69-1784132792831.js
  62. 1
      docs/assets/index-29c113f9-1784132792831.js
  63. 1
      docs/assets/index-2bde92c2-balabala-1784132792831.css
  64. 13
      docs/assets/index-2c5309f9-1785726778446.js
  65. 1
      docs/assets/index-3099739a-balabala-1784132792831.css
  66. 1
      docs/assets/index-30f157a6-1785726778446.js
  67. 1
      docs/assets/index-343df101-1785726778446.js
  68. 1
      docs/assets/index-3dbe23d2-1785726778446.js
  69. 115
      docs/assets/index-3dc02a03-1785726778446.js
  70. 2
      docs/assets/index-427feaa9-1784132792831.js
  71. 1
      docs/assets/index-5afedc21-balabala-1784132792831.css
  72. 1
      docs/assets/index-6965fbd6-balabala-1784132792831.css
  73. 2
      docs/assets/index-69cc5a72-1785726778446.js
  74. 1
      docs/assets/index-69e64e91-1784132792831.js
  75. 1
      docs/assets/index-70900b52-1785726778446.js
  76. 4
      docs/assets/index-7b46d381-1785726778446.js
  77. 2
      docs/assets/index-7b548b42-1785726778446.js
  78. 1
      docs/assets/index-7c335907-balabala-1784132792831.css
  79. 1
      docs/assets/index-81cb110f-1785726778446.js
  80. 0
      docs/assets/index-8d752fbe-balabala-1785726778446.css
  81. 16
      docs/assets/index-a1b5e9c0-1784132792831.js
  82. 13
      docs/assets/index-a9ca4fc7-1784132792831.js
  83. 1
      docs/assets/index-b3415e08-balabala-1785726778446.css
  84. 1
      docs/assets/index-b72a9c1f-1784132792831.js
  85. 1
      docs/assets/index-c36df85d-balabala-1784132792831.css
  86. 1
      docs/assets/index-c4c25a3c-balabala-1785726778446.css
  87. 2
      docs/assets/index-c633956d-balabala-1785726778446.css
  88. 1
      docs/assets/index-c9a77e56-balabala-1785726778446.css
  89. 112
      docs/assets/index-cc6a0a71-1784132792831.js
  90. 1
      docs/assets/index-cda407a6-balabala-1785726778446.css
  91. 2
      docs/assets/index-cfeb180f-1785726778446.js
  92. 1
      docs/assets/index-d7210760-balabala-1785726778446.css
  93. 16
      docs/assets/index-e33f4373-1785726778446.js
  94. 116
      docs/assets/index-e5aecffb-1785726778446.js
  95. 1
      docs/assets/index-e6c4062a-balabala-1785726778446.css
  96. 0
      docs/assets/index-e9f36657-1785726778446.js
  97. 1
      docs/assets/index-ee5660f2-1784132792831.js
  98. 116
      docs/assets/index-fe494e89-1784132792831.js
  99. 2
      docs/assets/index-fea14f56-balabala-1785726778446.css
  100. 4
      docs/assets/index.esm.min-4f309085-1785726778446.js
  101. Some files were not shown because too many files have changed in this diff Show More

@ -88,6 +88,160 @@
final result: passed final result: passed
## 2026-07-18 Visual Differentiation, Input, Toolbar, and Performance Pass
**Scope**
- Branch: `V2.2`
- Runtime: `http://127.0.0.1:5173`
- Verified viewport: `1920 × 1080` (16:9)
- Release boundary: local source and local Vite runtime only; no commit, push, deployment, production write, or online update
**Visual Corrections**
- Ecological redline / natural protected area: `草原级占比` now uses a rose chart, so it no longer repeats the ranked-horizontal-bar grammar used by `湿地面积` on the same screen.
- Home: `牦牛存栏分布` now uses the supplied cyan line/area language with dashed value grid, horizontal town axis, luminous line, filled area, and labels on the three largest peaks. The real town data and card dimensions are unchanged.
- Yak industry chain: the nine-stage toolbar is constrained to the center map safe area. Its measured rectangle is `x=442–1478`; the left card rail ends at `x=430` and the right rail begins at `x=1490`, leaving a `12px` gap on both sides. All nine labels remain visible and clickable.
- Smart management: the input shell is `864 × 54px`; the inner text field is `668 × 38px`. Search, text input, voice, and send affordances now have consistent spacing, borders, focus hierarchy, and disabled opacity without changing their behavior.
**Performance Findings and Fixes**
- Root cause 1: Yak Management mounted structure, epidemic, and trade requests together. Structure entry previously triggered 10 endpoint requests (3 structure + 4 epidemic + 3 trade) even though only one business view was visible.
- Fix: data is now requested once per first-visible business view. Structure entry triggers only its three endpoints; epidemic and trade load on first use and are then retained for subsequent tab visits. Year changes still perform their explicit refresh.
- Root cause 2: switching between epidemic and trade reset the same already-mounted 3D map and scheduled a full map load again.
- Fix: the shared 3D map is retained; those switches now update the layer/ranking and refresh the existing view without resetting map readiness or reloading assets.
- Controlled in-app-browser timing sample: Home → Yak Management visible `3546ms → 3290ms`; Structure → Epidemic visible `757ms → 389ms`; Epidemic → Trade remained effectively flat (`3392ms → 3334ms`) because first-time chart construction is still the dominant synchronous cost. The implemented request and map fixes avoid hidden work without weakening data correctness.
**Accepted Evidence**
- Ecology before: `tmp/duplicate-chart-audit-20260718/01-eco-before.png`
- Home before: `tmp/duplicate-chart-audit-20260718/02-home-before.png`
- Home after: `tmp/duplicate-chart-audit-20260718/04-home-after.png`
- Ecology after: `tmp/duplicate-chart-audit-20260718/05-eco-after.png`
- Industry toolbar after: `tmp/duplicate-chart-audit-20260718/06-industry-after.png`
- Smart input after: `tmp/duplicate-chart-audit-20260718/07-smart-after.png`
- User references: the four `/var/folders/.../codex-clipboard-*.png` images provided in this task
**Validation**
- Production build: `npm run build` passed.
- `git diff --check`: passed.
- Browser interactions: nine industry stages present; smart textbox, voice button, and send button present; ecology and home target charts rendered at 1920 × 1080.
- Console: no new Vue/runtime errors were introduced. Existing nonblocking local warnings include a Cesium height-reference warning, occasional ECharts zero-size warnings during HMR, and an ecological API timeout that falls back to the local screen data.
final result: passed
## 2026-07-17 Secondary Navigation Hierarchy
**Issue**
- The bottom topic switcher visually outweighed the primary top navigation: its outer height, item height, typography, and ecological-protection width were all larger than the first-level menu.
**Fix**
- Shared secondary switcher outer height: `32px`; item height: `26px`; label size: `13px`.
- Primary menu remains `34px` high with `14px` labels at the rendered 1920×1080 viewport.
- Ecological-protection topic items were reduced to `120px` each; the five-item switcher now measures `614px` including gaps and padding.
- The same compact shared component now serves Forest/Grass/Wet, Ecological Protection, Home, Yak Management, and Yak Industry Chain.
**Validation**
- No label overflow in Ecological Protection, Forest/Grass/Wet, or Yak Industry Chain.
- Accepted screenshot: `tmp/chart-dup-audit/22-secondary-menu-final-retry.png`.
- Browser console errors: none.
final result: passed
## 2026-07-17 Screen V2.2 KPI, Menu, and Forest Chart Correction
**Viewport**
- Verified at the required `1920 × 1080` 16:9 viewport.
- Document size remained exactly `1920 × 1080`; no horizontal or vertical overflow was introduced.
**Home KPI and Navigation**
- Home KPI rail moved down to `y = 96px` and narrowed to `936px` (`x = 492px`, right edge `1428px`) so it no longer stretches toward the side panels.
- Shared top navigation items now use an `18px` restrained pill radius instead of hard square blocks.
- Shared bottom topic navigation uses a `26px` capsule shell with semicircular ends; the home switcher measures `384 × 50px` and remains centered.
**Forest / Grass / Wet Chart Differentiation**
- Grass distribution remains a restrained thin-column comparison.
- Wetland distribution is now a line/area comparison with point values and hover-only tooltip; endpoint labels are inset to avoid clipping.
- Woodland distribution remains a column-plus-line combination, so the three adjacent panels no longer repeat one column-chart grammar.
**Runtime Checks**
- Verified through the local Vite dev server and in-app browser after hot reload.
- Vite was restarted explicitly with `--host 127.0.0.1 --port 5173 --strictPort` after an invalid implicit HMR socket was detected.
- Browser logs contained no errors after the corrected Vite session connected at `10:02:21Z`; only existing nonblocking warnings remained.
- `git diff --check` passed.
- No production build, push, deployment, production write, or online-server access was performed.
final result: passed
## 2026-07-17 Guidance, Menu, and Chart Restraint Pass
**Scope**
- Branch: `V2.2`
- Runtime: local Vite/HMR at `http://127.0.0.1:5173`
- Viewport: `1920 × 1080` (16:9)
- Release boundary: local only; no commit, push, deploy, production write, or online update
- Yak industry-chain boundary: business cards, charts, data, and logic unchanged; only shared top and bottom navigation styling unified
**Implemented**
- Smart management: removed the three starter cards, introductory guidance copy, and capability-boundary note. Empty state now contains only the AI mark and `智慧辅助分析`, with the primary input remaining available.
- Shared topic menu: removed left/right arrow controls from `TopicSwitcher`, added tab semantics, and replaced module-specific textures with one compact shared segmented-navigation treatment.
- Home: removed the oversized bottom-tab trough; town columns now use one restrained cyan and no decorative cap or duplicate trend overlay.
- Forest/grass/wet and ecology: ordered town columns use one cyan family and no pictorial water caps. On the overview screen, adjacent grassland, wetland, and woodland panels now use thin columns, rounded columns, and one intentional woodland trend overlay so the three panels do not repeat the same expression. Pie/donut charts retain category colors because hue encodes distinct categories.
- Yak management: herd-composition slices retain six category colors; ordered town ranks, epidemic ranks, and trade-impact columns use restrained cyan. Decorative pictorial caps, bases, and scatter endpoints were removed where they did not encode data.
- Pasture management: township household and grassland rankings use one cyan accent; the age chart no longer adds a duplicate line overlay.
- Shared top navigation: the yak industry-chain module now receives the same rectangular top-menu state as the other modules, while its business body remains untouched.
**Browser Verification**
- Home: compact four-tab bottom menu; no arrows; town columns single cyan.
- Smart management: DOM contains only AI mark, `智慧辅助分析`, textbox, voice input, and send button; no guide cards or boundary note.
- Forest/grass/wet overview: the three town-distribution cards share one restrained cyan palette but use visibly different marks; category charts remain distinguishable.
- Yak management structure: six herd categories are visibly distinct; town ranking uses one cyan without decorative end markers.
- Yak epidemic: statistical bars have no pictorial top/base caps; owner ranking has no white endpoint scatter.
- Pasture management: household and grassland rankings use one cyan.
- Yak industry chain: all ten stage tabs render in the shared bottom component, stage switching was tested, and the top navigation matches other modules.
**Evidence**
- Updated comparison after-captures: `deliverables/v2.2-ui-comparison/screenshots/after/02-home.jpg`, `03-forest-overview.jpg`, `12-yak-structure.jpg`, `14-yak-epidemic.jpg`, `16-pasture-management.jpg`, and `17-smart-management.jpg`
- Shared-menu current-state capture: `deliverables/v2.2-ui-comparison/screenshots/after/19-yak-industry-chain-menu.jpg`
- All listed screenshots: JPEG, `1920 × 1080`
**Validation**
- `git diff --check`: passed
- Removed-pattern scan outside the intentionally unchanged industry-chain business body: no smart guide blocks, topic arrows, water-cap variants, duplicate trend overlays, or production `pictorialBar` chart decorations remain
- No production build was run for this local HMR-only UI pass; repository guidance prefers browser verification for app-code/style changes and reserves builds for release/configuration work
final result: passed
## 2026-07-17 KPI, Adjacent-Chart Variety, And Forecast Alignment Correction
**Scope**
- Runtime: local Vite/HMR and local Docker services only
- Route base: `http://127.0.0.1:5173/#/platform`
- Design canvas: 16:9; application layout uses the existing 1920 × 1080 autofit canvas
- Release boundary: no commit, push, deploy, production read, or online write
**Implemented**
- Home KPI strip: changed each of the five dense indicators to a two-row structure. The label sits above the value/unit row, while the existing icon remains on the left.
- Forest/grass/wet overview: kept one restrained cyan family, but changed the three adjacent distributions to thin columns, rounded wide columns, and a slim column-plus-line combination.
- Column header spacing: increased the reserved unit-label area so `单位:万亩` no longer collides with the highest value.
- Forecast year selector: widened the shared selector container and removed the child-button minimum width that exceeded the parent's content box.
**Browser Verification**
- Home: all five value and unit boxes stay within their KPI cards; every label is above its corresponding value.
- Forest/grass/wet: rendered classes are `is-variant-plain`, `is-variant-rounded`, and `is-variant-slim`; only woodland contains the meaningful trend overlay.
- All three distribution units end above the first value label with no rectangle overlap.
- Forecast: the 2026, 2027, and 2028 button rectangles are all contained by the forecast selector rectangle.
- Browser console error check: no errors.
**Evidence**
- Home after: `tmp/v22-correction-audit/04-home-after.png`
- Forest/grass/wet after: `tmp/v22-correction-audit/05-forest-after.png`
- Forecast after: `tmp/v22-correction-audit/06-forecast-after.png`
- Updated 1920 × 1080 comparison after-captures: `deliverables/v2.2-ui-comparison/screenshots/after/02-home.jpg`, `03-forest-overview.jpg`, and `13-yak-forecast.jpg`
**Validation**
- Local Docker services required by authentication and APIs are running.
- Vite HMR applied all source/style changes successfully.
- No production build was run; repository guidance prefers browser verification for this local-only UI pass.
final result: passed
## 2026-07-13 Yak Industry Chain Stage Rhythm Pass ## 2026-07-13 Yak Industry Chain Stage Rhythm Pass
**Scope** **Scope**
@ -318,6 +472,8 @@ final result: passed
## 2026-07-12 Homepage Chart Variety Pass ## 2026-07-12 Homepage Chart Variety Pass
> Superseded on 2026-07-17 by the full-screen chart-grammar audit below. The homepage no longer reuses the same vertical-column grammar for grassland, wetland, and yak stock.
**Scope** **Scope**
- Page: `http://127.0.0.1:5174/#/platform?module=home` - 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` - Source file: `/Users/mocker/Documents/code/hy-screen/screenV2.0/src/views/home/index.vue`
@ -329,18 +485,243 @@ final result: passed
**Homepage Mapping** **Homepage Mapping**
- 草地面积: vertical bar, used for ten-town area comparison without an extra trend overlay. - 草地面积: 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. - 湿地面积: restrained vertical bar using the same ordered-comparison grammar as grassland; category distinction comes from the panel title and values, not ornamental color changes.
- 草原类别: category proportion card, used for structure reading. - 草原类别: category proportion card, used for structure reading.
- 草地生产力: area line chart, used for productivity trend-like comparison. - 草地生产力: area line chart, used for productivity trend-like comparison.
- 牦牛存栏分布: vertical bar plus trend line, used for town livestock scale comparison and distribution fluctuation. - 牦牛存栏分布: restrained vertical bar for town livestock scale comparison without a duplicate trend overlay.
- 畜群结构: donut chart, used for herd composition. - 畜群结构: donut chart, used for herd composition.
- 草畜平衡: gauge cards, used for status comparison. - 草畜平衡: gauge cards, used for status comparison.
**Parameter Checks** **Parameter Checks**
- Grassland and wetland both use full-width vertical composition, avoiding the right-side emptiness caused by the previous horizontal rank layout. - 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. - Grassland, wetland, and yak-town comparisons now use the same restrained cyan column grammar; decorative water caps are not used.
- Yak stock distribution carries the subtle trend line so the page still has one bar-line combination without overloading both left resource cards. - Yak stock distribution no longer overlays the same values as a trend line; combined bar-line charts are reserved for genuinely different measures.
- Background bars are dimmed to keep the data layer dominant. - Background bars are dimmed to keep the data layer dominant.
- Browser console error check: no errors. - Browser console error check: no errors.
final result: passed final result: passed
## 2026-07-17 Full-Screen Chart Grammar Audit
**Scope**
- Viewport: `1920 × 1080` (16:9).
- Coverage: 27 visible states across Home (1), Forest/Grass/Wet (4), Ecological Protection (5), Yak Management (4), Pasture Management (1), Yak Industry Chain (10), Smart Management (1), and Grass-Livestock Balance (1).
- Rule: chart duplication is evaluated across the whole visible screen, including both side rails. Recoloring or changing bar width alone does not count as a different expression.
**Implemented Changes**
- Forest/Grass/Wet: panel diversification now runs across the combined left/right layout instead of independently per side. Grassland, wetland, woodland, and their layer-topic variants share the same screen-level rule.
- Home: grassland remains a vertical comparison column; wetland is a horizontal ranking; yak stock is a lollipop chart; productivity remains a line.
- Ecological Protection: wetland distribution is a ranked list rather than a duplicate column; national-park productivity is a line rather than a second stacked column; restoration year length is a horizontal ranking and project count is a heat grid.
- Pasture Management: household age uses a structure chart rather than repeating the household-distribution column.
- Yak Industry Chain: artificial-grassland annual construction is a line; equipment service distribution is a heat grid; training distribution is a horizontal ranking; fallback town coverage is a heat grid.
**Runtime Audit Results**
- Ecological redline and natural protected area each render the unique sequence: `column / rank / split / line / donut / bar / heat / structure`.
- National park renders: `stackColumn / line / bar / balanceGaugeGrid / donut / split / column`.
- Ecological restoration renders: `line / column / donut / bar / structure / heat / projectTable`.
- Yak Industry Chain tabs were switched one by one; affected stages no longer expose two same-grammar columns in the same state.
- Forest/Grass/Wet overview, grassland, wetland, and woodland states were switched and inspected independently. Cross-rail duplicate columns are removed; intentionally retained bar/donut pairs use materially different business grammars.
- Yak structure, forecast, epidemic, and trade were checked against their rendered ECharts canvases and source configurations; no repeated same-grammar columns were found.
- Smart Management and Grass-Livestock Balance do not render duplicated column-chart panels.
**Accepted Screenshot Evidence**
- `tmp/chart-dup-audit/10-home-after.png`
- `tmp/chart-dup-audit/12-forest-overview-after.png`
- `tmp/chart-dup-audit/14-restoration-after.png`
- `tmp/chart-dup-audit/15-pasture-after.png`
- `tmp/chart-dup-audit/16-industry-equipment-after.png`
**Validation Boundary**
- Vite development server and HMR were used for verification; no production build, push, deployment, or online write was performed.
- Live API values and WebGL map settling can vary between captures; chart type, ordering, label layout, and whole-screen visual grammar were the acceptance focus.
final result: passed
## 2026-07-16 Screen V2.2 Local Unified UI Pass
**Scope**
- Branch: `V2.2`
- Baseline: V2.0 commit `87f624a`
- Rendered implementation: local V2.2 working tree at `http://localhost:5173`
- Comparison artifact: `deliverables/v2.2-ui-comparison/index.html`
- Viewport: `1920 × 1080` (16:9)
- Captured states: 18 before + 18 after + 18 combined comparisons
- Exclusion: “牦牛全产业链” business content was intentionally left unchanged; only its shared top and bottom menu presentation was unified on 2026-07-17
- Release boundary: local only; no push, deploy, production write, or online update
**QA Coverage**
- Typography: panel titles, secondary copy, KPI values, project tables, epidemic/trade ledgers, and dense labels were checked at the 1920 × 1080 target viewport.
- Spacing and layout: header, two side rails, map controls, topic switchers, legends, tables, and county boundaries remain inside the 16:9 safe area across all captured states.
- Colors and tokens: V2.2 uses the existing dark cyan product language with a scoped token layer. Township rankings now use one restrained cyan; herd composition uses six labeled, high-contrast category colors.
- Assets and image quality: maps and imagery were allowed to settle before capture. Every source screenshot is 1920 × 1080, nonblank, and paired with the same-state baseline.
- Copy and content: loading, timeout, retry, login help, and balance errors use user-facing language. Raw HTTP errors are not exposed.
- Accessibility: focus-visible states, password visibility control, caps-lock feedback, `aria-live` loading/error states, and inactive-module focus removal were checked in code and browser state.
**Screen-State Matrix**
1. Login
2. Home
3. Forest/grass/wet resource overview
4. Grassland resources
5. Wetland resources
6. Woodland resources
7. Ecological redline
8. Natural protected area
9. National park
10. Ecological restoration
11. Engineering analysis
12. Yak herd structure
13. Yak forecast
14. Yak epidemic prevention
15. Yak trade
16. Pasture management
17. Smart management
18. Grass-livestock balance
**Interaction Checks**
- Main module routes and retained-module visibility states work; inactive panes are removed from the focus order.
- Forest/grass/wet and ecological topic switchers preserve selected states and map safe areas.
- Yak structure/forecast/epidemic/trade switches work; map loading exposes a recoverable timeout state.
- Trade ledger density is limited to eight rows per page for the 16:9 layout.
- Smart management keeps the core AI workspace and input flow without starter cards, onboarding prompts, or capability-boundary notes.
- Grass-livestock balance keeps normal live data and maps failures to a retryable user-facing state.
- Comparison HTML filters to each module and its range control updates the before/after divider.
**User-Feedback Verification**
- Pasture township charts: removed unrelated category hues; bar length and printed value now communicate ranking while a single cyan accent preserves visual consistency.
- Herd-composition chart: replaced near-identical cyan slices with cyan, blue, amber, green, violet, and coral. Legend labels and values remain present, so categories do not rely on color alone.
- Both changes were re-captured at 1920 × 1080 and rechecked in combined before/after images.
**Build and Runtime Checks**
- Production build: passed with Vite output redirected to `/tmp/hy-screen-v22-build-final-color`.
- Application modules transformed: 1031.
- Browser console: no blocking application errors during the final capture set.
- Nonblocking existing warnings: Cesium height-reference warning, ECharts tick readability warning, Vite Cesium script/CSS resolution notice, and Sass legacy API deprecation notice.
**Known Comparison Notes**
- Live local API data can change numeric values between V2.0 and V2.2 captures; visual and interaction changes are assessed independently of those data refreshes.
- Login field contents are hidden in screenshots for privacy.
- The baseline yak structure map was captured before all map labels settled; the V2.2 capture was allowed to stabilize and is materially more complete.
final result: passed
## 2026-07-18 Non-Engineering 16:9 Detail Audit
**Scope**
- Branch: `V2.2`
- Runtime: `http://127.0.0.1:5173/#/platform`
- Exact viewport: `1920 × 1080` (16:9)
- Excluded by request: ecological protection `engineering-analysis`; it was neither opened nor modified during this pass.
- Product boundary: visual completion and fit only. Business data, stage meaning, chart semantics, and interactions were not redesigned.
**Screen-State Matrix**
1. Home
2. Forest/grass/wet resource overview
3. Grassland resources
4. Wetland resources
5. Woodland resources
6. Ecological redline
7. Natural protected area
8. National park
9. Ecological restoration
10. Yak herd structure
11. Yak forecast
12. Yak epidemic prevention
13. Yak trade
14. Pasture management
15. Industry chain — family ecological pasture
16. Industry chain — artificial grassland
17. Industry chain — scaled breeding base
18. Industry chain — breeding/expansion base
19. Industry chain — disaster prevention and mitigation
20. Industry chain — milk source station
21. Industry chain — slaughter and processing
22. Industry chain — forage trade
23. Industry chain — social services
24. Smart management
25. Grass-livestock balance
**Findings And Corrections**
- Woodland `林龄组结构`: six short age-group labels were rendered as vertical stacked characters. The panel now opts into the existing horizontal label mode; labels remain inside the card and are readable at a glance.
- Ecological restoration `重点项目库`: long project names forced irregular multiline rows and obscured the lower table. Rows now keep a fixed rhythm, use single-line ellipsis, and retain the existing internal scroll for the full dataset.
- Industry-chain bottom cards: the spotlight component defined two rows while rendering up to three metrics, so the third metric overflowed. The industry-only card style now provides three compact rows without changing metric content.
- Artificial grassland `项目面积明细`: the six specification rows now use a denser industry-only row rhythm, allowing all six to remain visible in the 227px card.
- Artificial grassland `作业方式面积` and family pasture rank density were tightened only within their existing cards; no data or ordering changed.
- Industry-chain left/right cards remain flat and use the previously approved unified card shell. No tilt was reintroduced.
**Design QA Comparison**
- Woodland before/after: `tmp/v22-detail-audit-20260718/05-forest-woodland.png` and `tmp/v22-detail-qa-20260718/woodland-after.png`
- Ecological restoration before/after: `tmp/v22-detail-audit-20260718/09-eco-restoration.png` and `tmp/v22-detail-qa-20260718/restoration-after.png`
- Industry family, artificial grassland, and scaled breeding before/after: `tmp/v22-detail-audit-20260718/15-industry-family.png` through `17-industry-scale.png`, compared with the matching `tmp/v22-detail-qa-20260718/*-after*.png` captures.
- Remaining industry stages were re-captured after the shared industry-only correction and inspected individually.
- Audit contact sheets: `tmp/v22-detail-qa-20260718/contact-sheets/01-home-forest.jpg` through `05-industry.jpg`.
**Verification**
- All 25 in-scope states were inspected from current-run screenshots at 1920 × 1080.
- Same-state before/after images were reviewed together for every implemented correction.
- Production build: passed (`vite build`, 921 modules transformed).
- Existing nonblocking build notices: Vite Cesium script/CSS resolution notice and Dart Sass legacy API deprecation notice.
- Generated `docs/` build output was cleaned after validation; no release artifact was retained.
final result: passed
## 2026-08-02 Screen 2.0 Requested Interaction And Visual Updates
**Scope**
- Login redesign from the supplied 830 × 712 reference screenshot.
- Township map-label alignment, industry-overview default point layers, ecological engineering-analysis reveal, and pasture boundary weight.
- Runtime: `http://192.168.31.202:4173/`
**Login Visual Comparison**
- Source: `/var/folders/dh/pf6z830j3w3drsd1k4ncl7br0000gn/T/codex-clipboard-6fff2f37-5438-40b0-aaa8-517b58318a6f.png`
- Implementation: `tmp/login-redesign-830x712.png`
- Combined comparison: `tmp/login-design-qa-comparison.png`
- Viewport/state: 830 × 712 CSS px, DPR 1, empty login form with password initially hidden.
- Removed the version label, login explanatory sentence, and account-allocation note. Conditional Caps Lock and validation messages remain because they are functional feedback rather than remarks.
- No P0, P1, or P2 visual issues were found. The two-zone glass layout is an intentional redesign requested by the user, while retaining the existing cyan dark-screen design language and source background asset.
**Authenticated Runtime Verification**
- Default overview layers: all nine point categories rendered active on first entry; the artificial-grass polygon overlay remains a separate optional layer.
- Engineering analysis: the loading overlay appeared immediately, the map grew from 0 to 5,250 candidate features by page 7, and completed at 9,046 features after the minimum staged duration. Controls were disabled during analysis and restored afterward.
- Pasture boundary: the WMS boundary layer was enabled and visually inspected after reducing stroke width to 0.55 with lighter opacity.
- Map labels: town labels render centered on the current home map. Ranking mode now binds the town name and number inside one label object so they cannot drift independently.
- Login flow: password visibility control worked, the supplied test account authenticated successfully, and routing continued to `#/platform`.
- Browser console: no blocking application errors were observed during the checked flows.
**Build Verification**
- Production build: passed, 923 modules transformed.
- Existing nonblocking notices: Vite Terser option notice, Cesium script/CSS resolution notice, and Dart Sass legacy API deprecation notice.
final result: passed
## 2026-08-03 Map Label Re-centering And Seven-Stage Engineering Analysis
**Scope**
- Corrected the visible township-name and metric labels in both Yak Management map implementations: the 3D trade map and the OpenLayers structure/forecast map.
- Expanded ecological engineering analysis into seven visible analysis phases with progressive map rendering.
- Confirmed the reusable local test-login entry without recording a plaintext password in the repository or QA artifacts.
**Map Label Visual QA**
- Reference: `/var/folders/dh/pf6z830j3w3drsd1k4ncl7br0000gn/T/codex-clipboard-8178eec6-6fc1-4cb3-bff5-8f2cc7fe3927.png`
- Correct matching state: Yak Management → Yak Trade.
- Combined comparison: `tmp/design-qa/yak-trade-map-labels-reference-vs-current.png`.
- The 3D label shell no longer retains the previous `50%` horizontal translation during its reveal animation or later data refreshes.
- Township statistic labels no longer apply a second vertical-centering transform on top of the CSS3D anchor.
- The structure/forecast OpenLayers map now renders township name and stock value as one centered rich-text label sharing the same point anchor.
- No cropped labels, detached values, or independently drifting name/value pairs were found in the final runtime capture.
**Engineering Analysis Runtime QA**
- Seven visible phases render in order: environment initialization, condition validation, base-candidate calculation, historical-project exclusion, spatial overlay, suitable-patch generation, and result validation.
- The panel and central overlay both display the current phase, description, determinate progress, and `x/7` step count.
- Progressive feature batches were observed during phase 6; final output remained 9,046 suitable features from 9,061 base features with 15 exclusions.
- User-visible completion time was approximately 35 seconds in the checked run, exceeding the configured 18-second minimum and eliminating the previous near-instant transition.
**Test Login Persistence**
- The reusable credential is stored in macOS Keychain under the Screen 2.0 test-login service.
- Product-design long-term context stores only the Keychain lookup pointer. No plaintext password is present in source, logs, screenshots, or this QA report.
**Verification**
- Production build passed with Vite; 923 modules transformed.
- The authenticated Yak Trade and Yak Structure states were inspected in the current in-app Browser session.
- Browser console contained no application-level error entries. Existing Cesium image-tile availability messages are nonblocking external imagery notices.
final result: passed

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 b,K as w,j as h}from"./index-1785726778446.js";import{_ as R}from"./index-7b46d381-1785726778446.js";import{b as j}from"./townshipBoundaries-8867fad4-1785726778446.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:[]),C=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(C.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 C.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,b(e.name),1),i("i",{style:w(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,b(e.name),1),i("i",{style:w(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:w({backgroundColor:e.fillColor,borderColor:e.strokeColor||e.fillColor})},null,4),i("span",U,b(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 _};

@ -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,M 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-1785726778446.js";import{H as j}from"./index.esm.min-4f309085-1785726778446.js";const G={class:"smart-chart-header"},M={key:0},I={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}; {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",M,x(S.value),1)):_("",!0)]),a.chart.unit?(g(),h("em",I,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 @@
.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}

@ -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}

@ -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-f38b9a2d-1785726778446.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-0aae51d1-1785726778446.js";import{g as n,a as h,H as q,C as G}from"./index-7b548b42-1785726778446.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};

@ -0,0 +1 @@
var u=(r,t,e)=>new Promise((i,c)=>{var a=n=>{try{s(e.next(n))}catch(f){c(f)}},A=n=>{try{s(e.throw(n))}catch(f){c(f)}},s=n=>n.done?i(n.value):Promise.resolve(n.value).then(a,A);s((e=e.apply(r,t)).next())});import{r as g,n as w}from"./index-e33f4373-1785726778446.js";const l=b("/jsyApi"),y="/openApi";function v(r,t){return/^https?:\/\//.test(t)?t:`${r}${t.startsWith("/")?t:`/${t}`}`}function b(r){const t=String(r||"/jsyApi").replace(/\/+$/,"");return t.endsWith("/api")?t:`${t}/api`}function h(r){if((r==null?void 0:r.success)===!1||(r==null?void 0:r.code)!==void 0&&![0,200,"0","200"].includes(r.code)){const e=new Error((r==null?void 0:r.msg)||(r==null?void 0:r.message)||"接口请求失败");throw e.code=r==null?void 0:r.code,e}return w(r)}function o(r,t,e,i={}){return g(v(r,t),{params:e,timeout:i.timeout||16e3}).then(h)}function m(r){return Array.isArray(r)?r:Array.isArray(r==null?void 0:r.rows)?r.rows:Array.isArray(r==null?void 0:r.list)?r.list:Array.isArray(r==null?void 0:r.data)?r.data:[]}function _(r){return Array.isArray(r)?r.length>0:!r||typeof r!="object"?r!=null&&r!=="":["areaRange","area_range","acreage","grasslandArea","grassland_area","arearange","area","yakNumber","yak_number","yaknumber","number","yakCount","yak_count","livestockCount","livestock_count","bearingCapacity","bearing_capacity","bearingcapacity","capacity","theoryCapacity","livestockCapacity","livestock_capacity","livestockcapacity","carryingCapacity","actualCapacity","overloadRate","overload_rate","overloadrate","rate","level","conclusion","advice","balanceAdvice","balance_advice"].some(e=>r[e]!==void 0&&r[e]!==null&&r[e]!=="")}function R(){return u(this,arguments,function*({areaCode:r}={}){const t={areaCode:r},e=[()=>o(l,"/ai/livestockBalance",t,{timeout:18e3}),()=>o(y,"/ai/balance/advice",t,{timeout:18e3})];let i;for(const c of e)try{const a=yield c();if(_(a))return a}catch(a){i=a}throw i||new Error("草畜平衡接口不可用")})}function B(){return u(this,null,function*(){const r=[()=>o(l,"/ai/livestockBalanceRows",{},{timeout:18e3}),()=>o(y,"/ai/balance/areaRows",{},{timeout:18e3})];let t;for(const e of r)try{const i=m(yield e());if(i.length)return i}catch(i){t=i}if(t)throw t;return[]})}function C(r){return u(this,null,function*(){const t=[()=>o(l,"/area/children",{areaCode:r},{timeout:12e3}),()=>o(l,"/map/areaCode",{areaCode:r},{timeout:12e3})];let e,i=!1;for(const c of t)try{const a=m(yield c());if(a.length)return a;i=!0}catch(a){e=a}if(i)return[];throw e||new Error("区划接口不可用")})}export{C as a,R as b,B as g};

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

@ -1 +1 @@
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}; 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-1785726778446.js";import{c as T}from"./data-56996d99-1785726778446.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 it is too large Load Diff

@ -1 +1 @@
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}; 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-8867fad4-1785726778446.js";import{r as E}from"./index-e33f4373-1785726778446.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

File diff suppressed because one or more lines are too long

@ -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

@ -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

@ -0,0 +1 @@
var y=(_,v,i)=>new Promise((r,n)=>{var l=t=>{try{o(i.next(t))}catch(p){n(p)}},d=t=>{try{o(i.throw(t))}catch(p){n(p)}},o=t=>t.done?r(t.value):Promise.resolve(t.value).then(l,d);o((i=i.apply(_,v)).next())});import{_ as S,l as V,m as C,g as M,o as f,c as g,a as s,B as w,f as L,s as h,H as D,I,t as m,j as k,d as u,J as N}from"./index-1785726778446.js";const R={class:"login-screen"},U={class:"login-shell"},q={class:"login-field"},E={class:"login-field login-password-field"},K={class:"login-password-control"},T=["type"],$=["aria-label","aria-pressed"],j={key:0,class:"login-field-assist","aria-live":"polite"},F={key:1,class:"login-error",role:"alert"},H=["disabled"],J={__name:"index",setup(_){const v=V(),i=C(),r=u(""),n=u(""),l=u(!1),d=u(!1),o=u(!1),t=u(""),p=M(()=>{const a=typeof v.query.redirect=="string"?decodeURIComponent(v.query.redirect):"/platform";return a.startsWith("/login")?"/platform":a||"/platform"});function x(){return y(this,null,function*(){if(t.value="",!r.value||!n.value){t.value="请输入账号和密码。";return}o.value=!0;try{yield N(r.value,n.value),i.replace(p.value)}catch(a){t.value=B(a)}finally{o.value=!1}})}function b(a){var e;d.value=!!((e=a==null?void 0:a.getModifierState)!=null&&e.call(a,"CapsLock"))}function B(a){const e=String((a==null?void 0:a.message)||"").trim();return/401|403|账号|密码|unauthor/i.test(e)?"账号或密码不正确,请核对后重试。":/network|fetch|timeout|连接|服务|502|503|504/i.test(e)?"登录服务暂时无法连接,请稍后重试。":"暂时无法登录,请稍后重试。"}return(a,e)=>(f(),g("div",R,[s("div",U,[e[8]||(e[8]=s("section",{class:"login-brand","aria-label":"红原县数字畜牧业监管平台"},[s("div",{class:"login-brand-rule","aria-hidden":"true"},[s("i"),s("span"),s("i")]),s("h1",null,[w("红原县数字畜牧业"),s("br"),w("监管平台")]),s("div",{class:"login-brand-glow","aria-hidden":"true"})],-1)),s("form",{class:"login-panel","aria-label":"平台用户登录",onSubmit:L(x,["prevent"])},[e[7]||(e[7]=s("header",{class:"login-panel-head"},[s("div",{class:"login-panel-title"},"用户登录"),s("span",{"aria-hidden":"true"})],-1)),s("label",q,[e[4]||(e[4]=s("span",null,"账号",-1)),h(s("input",{"onUpdate:modelValue":e[0]||(e[0]=c=>r.value=c),autocomplete:"username",autofocus:"",placeholder:"请输入平台账号"},null,512),[[D,r.value,void 0,{trim:!0}]])]),s("label",E,[e[5]||(e[5]=s("span",null,"密码",-1)),s("span",K,[h(s("input",{"onUpdate:modelValue":e[1]||(e[1]=c=>n.value=c),autocomplete:"current-password",placeholder:"请输入密码",type:l.value?"text":"password",onKeydown:b,onKeyup:b,onBlur:e[2]||(e[2]=c=>d.value=!1)},null,40,T),[[I,n.value]]),s("button",{class:"login-password-toggle",type:"button","aria-label":l.value?"隐藏密码":"显示密码","aria-pressed":l.value,onClick:e[3]||(e[3]=c=>l.value=!l.value)},m(l.value?"隐藏":"显示"),9,$)])]),d.value?(f(),g("div",j,[...e[6]||(e[6]=[s("span",{class:"login-caps-lock"},"大写锁定已开启",-1)])])):k("",!0),t.value?(f(),g("div",F,m(t.value),1)):k("",!0),s("button",{class:"login-submit",disabled:o.value,type:"submit"},m(o.value?"登录中":"登录"),9,H)],32)])]))}},W=S(J,[["__scopeId","data-v-b11615f4"]]);export{W 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

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

@ -1 +0,0 @@
var m=(v,d,n)=>new Promise((i,a)=>{var u=l=>{try{r(n.next(l))}catch(t){a(t)}},o=l=>{try{r(n.throw(l))}catch(t){a(t)}},r=l=>l.done?i(l.value):Promise.resolve(l.value).then(u,o);r((n=n.apply(v,d)).next())});import{_ as x,l as w,m as h,g as S,o as _,c as f,a as e,f as V,s as g,H as b,t as y,j as k,d as p,I as B}from"./index-1784132792831.js";const D={class:"login-screen"},H={class:"login-shell"},I={class:"login-field"},M={class:"login-field"},R={key:0,class:"login-error"},U=["disabled"],q={__name:"index",setup(v){const d=w(),n=h(),i=p(""),a=p(""),u=p(!1),o=p(""),r=S(()=>{const t=typeof d.query.redirect=="string"?decodeURIComponent(d.query.redirect):"/platform";return t.startsWith("/login")?"/platform":t||"/platform"});function l(){return m(this,null,function*(){if(o.value="",!i.value||!a.value){o.value="请输入账号和密码。";return}u.value=!0;try{yield B(i.value,a.value),n.replace(r.value)}catch(t){o.value=(t==null?void 0:t.message)||"登录失败,请稍后再试。"}finally{u.value=!1}})}return(t,s)=>(_(),f("div",D,[e("div",H,[s[5]||(s[5]=e("div",{class:"login-brand"},[e("span",null,"红原县数字畜牧业监管平台"),e("small",null,"Hongyuan Digital Animal Husbandry Supervision Platform")],-1)),e("form",{class:"login-panel",onSubmit:V(l,["prevent"])},[s[4]||(s[4]=e("div",{class:"login-panel-title"},"用户登录",-1)),e("label",I,[s[2]||(s[2]=e("span",null,"账号",-1)),g(e("input",{"onUpdate:modelValue":s[0]||(s[0]=c=>i.value=c),autocomplete:"username",autofocus:"",placeholder:"请输入账号"},null,512),[[b,i.value,void 0,{trim:!0}]])]),e("label",M,[s[3]||(s[3]=e("span",null,"密码",-1)),g(e("input",{"onUpdate:modelValue":s[1]||(s[1]=c=>a.value=c),autocomplete:"current-password",placeholder:"请输入密码",type:"password"},null,512),[[b,a.value]])]),o.value?(_(),f("div",R,y(o.value),1)):k("",!0),e("button",{class:"login-submit",disabled:u.value,type:"submit"},y(u.value?"登录中":"登录"),9,U)],32)])]))}},P=x(q,[["__scopeId","data-v-8ebd0d6e"]]);export{P 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

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