+
+
+
{{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+

+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
+
diff --git a/frontend/src/components/gis/map.class.ts b/frontend/src/components/gis/map.class.ts
index 9c0ca759..66c2d8a7 100644
--- a/frontend/src/components/gis/map.class.ts
+++ b/frontend/src/components/gis/map.class.ts
@@ -33,6 +33,7 @@ export class MapClass implements MapClassInterface {
this.service = new MapOl();
}
static getInstance(): MapClass {
+ console.log('getInstance');
if (!this.instance) {
this.instance = new MapClass();
}
diff --git a/frontend/src/components/gis/map.ol.ts b/frontend/src/components/gis/map.ol.ts
index 7eed35d8..fc0bf1a3 100644
--- a/frontend/src/components/gis/map.ol.ts
+++ b/frontend/src/components/gis/map.ol.ts
@@ -72,6 +72,7 @@ export class MapOl implements MapInterface {
private hoveredFeatureId: string | number | null = null;
private popupManager: PopupManager;
private regionMaskManager: RegionMaskManager;
+ private isBatchPopupMode = false;
constructor() {
this.pointLayerManager = new PointLayerManager({
map: null,
@@ -142,7 +143,11 @@ export class MapOl implements MapInterface {
this.popupManager.setMap(this.map);
this.regionMaskManager.setContext(this.map, this.view);
- this.view.on('change:resolution', () => {});
+ this.view.on('change:resolution', () => {
+ this.handleZoomChange();
+ const zoom = this.view.getZoom();
+ console.log('mouse zoom:', zoom);
+ });
this.map.on('click', evt => {
this.popupManager.showPopup(undefined, undefined);
this.popupManager.handleMapClick(evt.pixel, detectedFeature => {
@@ -169,9 +174,24 @@ export class MapOl implements MapInterface {
targetElement.style.cursor = payload.hoveredId ? 'pointer' : '';
}
- this.showPopup(payload.detectedFeature, payload.coordinate);
+ // 批量 popup 模式下(>= 14 级)不触发 hover popup
+ if (!this.isBatchPopupMode) {
+ this.showPopup(payload.detectedFeature, payload.coordinate);
+ }
});
});
+
+ this.map.on('pointerdrag', () => {
+ if (this.isBatchPopupMode) {
+ this.updateBatchPopups();
+ }
+ });
+ this.map.on('moveend', () => {
+ if (this.isBatchPopupMode) {
+ this.updateBatchPopups();
+ }
+ });
+
return Promise.resolve(this.map);
} catch (e) {
console.error('OL Init Error', e);
@@ -220,6 +240,52 @@ export class MapOl implements MapInterface {
showPopup(feature: Feature | undefined, coordinate: number[] | undefined) {
this.popupManager.showPopup(feature, coordinate);
}
+
+ /**
+ * 监听缩放层级变化,>= 15 时自动显示可视区域内所有锚点的 popup
+ */
+ private handleZoomChange() {
+ if (!this.view) return;
+
+ const zoom = this.view.getZoom();
+ if (zoom === undefined) return;
+
+ if (zoom >= 15) {
+ this.enableBatchPopupMode();
+ } else {
+ this.disableBatchPopupMode();
+ }
+ }
+
+ /**
+ * 启用批量 popup 模式:自动显示可视区域内所有锚点的 popup
+ */
+ private enableBatchPopupMode() {
+ this.isBatchPopupMode = true;
+ this.popupManager.clearBatchPopups();
+ this.updateBatchPopups();
+ }
+
+ /**
+ * 禁用批量 popup 模式:恢复鼠标悬停显示 popup
+ */
+ private disableBatchPopupMode() {
+ this.isBatchPopupMode = false;
+ this.popupManager.clearBatchPopups();
+ this.popupManager.showPopup(undefined, undefined);
+ }
+
+ /**
+ * 更新批量显示的 popups(拖动地图后调用)
+ */
+ private updateBatchPopups() {
+ const features = this.pointLayerManager.getFeaturesInViewport();
+ // 传入样式检查器,过滤掉 declutter/距离过滤等隐藏的锚点
+ this.popupManager.showPopupsForFeatures(features, feature => {
+ const style = this.createPointStyle(feature);
+ return style !== null;
+ });
+ }
/**
* 创建点样式 (模拟 Leaflet 的 DivIcon 效果,支持随缩放动态调整大小)
*/
@@ -660,6 +726,10 @@ export class MapOl implements MapInterface {
const layerInstance = this.layerRegistry.get(registryKey as string);
if (layerInstance) {
layerInstance.setVisible(checked);
+ // 图层显隐变化时刷新 batch popup
+ if (this.isBatchPopupMode) {
+ this.updateBatchPopups();
+ }
} else {
console.warn(
`未找到标识为 [${registryKey}] 的图层实例,当前注册表 keys:`,
@@ -669,6 +739,10 @@ export class MapOl implements MapInterface {
}
mdLayerTreeShowOrHidden(layerType: string, checked?: boolean): void {
this.pointLayerManager.setLayerVisible(layerType, checked);
+ // 图层显隐变化时刷新 batch popup
+ if (this.isBatchPopupMode) {
+ this.updateBatchPopups();
+ }
}
hasLayer(layerType: string): void {
@@ -1212,7 +1286,6 @@ export class MapOl implements MapInterface {
// 使用 Object.assign 批量设置样式,代码更整洁
Object.assign(container.style, {
position: 'absolute',
- backgroundColor: 'rgba(255, 255, 255, 0.9)',
border: '1px solid #000',
padding: '4px 8px',
borderRadius: '4px',
@@ -1223,7 +1296,6 @@ export class MapOl implements MapInterface {
display: 'flex',
alignItems: 'center',
zIndex: '1001',
- boxShadow: '0 2px 4px rgba(0,0,0,0.2)',
pointerEvents: 'auto' // 确保可以点击
});
@@ -1309,6 +1381,10 @@ export class MapOl implements MapInterface {
key || '',
!!checked
);
+ // 图例变化时刷新 batch popup
+ if (this.isBatchPopupMode) {
+ this.updateBatchPopups();
+ }
}
/**
@@ -1327,6 +1403,10 @@ export class MapOl implements MapInterface {
anchoPointState,
checked
);
+ // 图例变化时刷新 batch popup
+ if (this.isBatchPopupMode) {
+ this.updateBatchPopups();
+ }
}
switchView(_type): void {}
diff --git a/frontend/src/components/gis/ol/point-layer-manager.ts b/frontend/src/components/gis/ol/point-layer-manager.ts
index 8cb6c29a..78903e68 100644
--- a/frontend/src/components/gis/ol/point-layer-manager.ts
+++ b/frontend/src/components/gis/ol/point-layer-manager.ts
@@ -32,6 +32,34 @@ export class PointLayerManager {
this.map = map;
}
+ // 备注:获取当前屏幕可视区域内的所有点要素(仅包含图层可见且图例可见的要素)。
+ getFeaturesInViewport(): Feature[] {
+ if (!this.map) return [];
+
+ const extent = this.map.getView().calculateExtent(this.map.getSize());
+ if (!extent) return [];
+
+ const [minX, minY, maxX, maxY] = extent;
+ const result: Feature[] = [];
+
+ this.forEachFeature((feature, layer) => {
+ // 跳过图层本身不可见的要素
+ if (!layer.getVisible()) return;
+
+ const geom = feature.getGeometry();
+ if (!geom || geom.getType() !== 'Point') return;
+
+ const coords = (geom as Point).getCoordinates();
+ const [x, y] = coords;
+
+ if (x >= minX && x <= maxX && y >= minY && y <= maxY) {
+ result.push(feature);
+ }
+ });
+
+ return result;
+ }
+
// 备注:统一返回当前点图层注册表,供外层做遍历或清理。
getRegistry() {
return this.layerRegistry;
@@ -128,6 +156,7 @@ export class PointLayerManager {
const vectorLayer = this.layerRegistry.get(layerKey);
if (vectorLayer && vectorLayer.getVisible() !== visible) {
vectorLayer.setVisible(visible);
+ vectorLayer.changed();
}
}
diff --git a/frontend/src/components/gis/ol/popup-manager.ts b/frontend/src/components/gis/ol/popup-manager.ts
index e9a947ee..d2f9f4a5 100644
--- a/frontend/src/components/gis/ol/popup-manager.ts
+++ b/frontend/src/components/gis/ol/popup-manager.ts
@@ -204,6 +204,213 @@ export class PopupManager {
this.popupElement.style.display = 'none';
}
+ // 备注:批量显示多个要素的 Popup,使用绝对定位的 div 而非 Overlay。
+ showPopupsForFeatures(
+ features: Feature[],
+ styleChecker?: (feature: Feature) => boolean
+ ) {
+ if (!this.map || !this.popupElement) return;
+
+ // 清除之前批量显示的 popups
+ this.clearBatchPopups();
+
+ // 过滤:只显示图例可见的要素
+ const visibleFeatures = features.filter(
+ f => f.get('_legendVisible') !== false
+ );
+
+ if (visibleFeatures.length === 0) return;
+
+ const mapElement = this.map.getTargetElement();
+ const batchContainer = document.createElement('div');
+ batchContainer.className = 'batch-popup-container';
+ batchContainer.style.cssText = `
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ z-index: 1000;
+ `;
+ batchContainer.id = 'batch-popup-container';
+
+ // 先添加容器到 DOM,以便后续元素能正确测量尺寸
+ mapElement.appendChild(batchContainer);
+
+ // 用于碰撞检测的已放置 popup 列表
+ const placedPopups: Array<{
+ left: number;
+ right: number;
+ top: number;
+ bottom: number;
+ }> = [];
+ let styleHiddenCount = 0;
+ let blockedCount = 0;
+ let renderedCount = 0;
+ const renderedIds: Array
= [];
+ const blockedIds: Array = [];
+
+ // 用于 declutter 模拟检测的已放置要素边界框列表
+ const placedAnchors: Array<{
+ bbLeft: number;
+ bbRight: number;
+ bbTop: number;
+ bbBottom: number;
+ }> = [];
+
+ visibleFeatures.forEach(feature => {
+ const geom = feature.getGeometry();
+ if (!geom || geom.getType() !== 'Point') return;
+
+ const coords = (geom as Point).getCoordinates();
+ const pixel = this.map?.getPixelFromCoordinate(coords);
+ if (!pixel) return;
+
+ // 检查样式是否隐藏(declutter、距离过滤等)
+ if (styleChecker && !styleChecker(feature)) {
+ styleHiddenCount += 1;
+ return;
+ }
+
+ // 模拟 OpenLayers declutter:基于图标+文字的边界框碰撞检测
+ const zoom = this.map.getView().getZoom() ?? 14;
+ let dynamicScale = 0.7 + (zoom - 4.5) * 0.08;
+ dynamicScale = Math.max(0.5, Math.min(3.0, dynamicScale));
+
+ // 计算要素的碰撞边界框
+ const labelText = (feature.get('_labelText') as string) || '';
+ const labelLineCount = labelText.split('\n').length;
+ const labelWidth = Math.min(
+ labelText
+ .split('\n')
+ .reduce((max, line) => Math.max(max, line.length), 0) *
+ 7 *
+ dynamicScale,
+ 200
+ );
+ const labelHeight = 12 * dynamicScale * labelLineCount;
+ const labelOffsetY =
+ labelLineCount > 1 ? -30 * dynamicScale : -22 * dynamicScale;
+ const iconSize = 32 * dynamicScale; // 假设图标原始大小 32x32
+
+ // 碰撞框 = 图标框 ∪ 文字框
+ const bbLeft = pixel[0] - Math.max(iconSize / 2, labelWidth / 2);
+ const bbRight = pixel[0] + Math.max(iconSize / 2, labelWidth / 2);
+ const bbTop = pixel[1] + labelOffsetY - labelHeight;
+ const bbBottom = pixel[1] + iconSize / 2;
+
+ // 检查是否和已放置的要素碰撞
+ let blocked = false;
+ for (const placed of placedAnchors) {
+ if (
+ bbRight > placed.bbLeft &&
+ bbLeft < placed.bbRight &&
+ bbBottom > placed.bbTop &&
+ bbTop < placed.bbBottom
+ ) {
+ blocked = true;
+ break;
+ }
+ }
+ if (blocked) {
+ blockedCount += 1;
+ blockedIds.push((feature.getId?.() as string | number | null) ?? null);
+ return;
+ }
+
+ const props = feature.getProperties();
+ const popupHtml = props.popupHtml || generatePopupHtml(props);
+ if (!popupHtml) return;
+
+ // 记录边界框用于 declutter 检测
+ placedAnchors.push({ bbLeft, bbRight, bbTop, bbBottom });
+
+ // 创建与原始 popupElement 完全相同的样式
+ const popupEl = document.createElement('div');
+ popupEl.className = this.popupElement.className;
+ popupEl.innerHTML = popupHtml;
+ // 不设置自定义 cssText,只设置定位(对应原始 popup 的 positioning: 'bottom-center', offset: [0, -10])
+ popupEl.style.position = 'absolute';
+ popupEl.style.display = 'block';
+ popupEl.style.transform = 'translate(-50%, -100%)'; // bottom-center 对齐
+ popupEl.style.pointerEvents = 'none';
+
+ // 临时设置 visibility: hidden 来测量尺寸
+ popupEl.style.visibility = 'hidden';
+ popupEl.style.left = `${pixel[0]}px`;
+ popupEl.style.top = `${pixel[1] - 10}px`;
+ batchContainer.appendChild(popupEl);
+
+ // 获取 popup 尺寸
+ const rect = popupEl.getBoundingClientRect();
+ const popupWidth = rect.width;
+ const popupHeight = rect.height;
+
+ // 计算 popup 的位置(对应原始 positioning: 'bottom-center', offset: [0, -10])
+ const popupX = pixel[0];
+ const popupY = pixel[1] - 10; // bottom-center 对齐 + 10px 偏移
+ const popupRect = {
+ left: popupX - popupWidth / 2,
+ right: popupX + popupWidth / 2,
+ top: popupY - popupHeight,
+ bottom: popupY
+ };
+
+ // 碰撞检测
+ let hasCollision = false;
+ for (const placed of placedPopups) {
+ if (this.checkCollision(popupRect, placed)) {
+ hasCollision = true;
+ break;
+ }
+ }
+
+ if (!hasCollision) {
+ // 无碰撞,显示 popup
+ popupEl.style.visibility = 'visible';
+ popupEl.style.left = `${popupX}px`;
+ popupEl.style.top = `${popupY}px`;
+ renderedCount += 1;
+ renderedIds.push((feature.getId?.() as string | number | null) ?? null);
+
+ placedPopups.push({
+ left: popupRect.left,
+ right: popupRect.right,
+ top: popupRect.top,
+ bottom: popupRect.bottom
+ });
+ } else {
+ // 有碰撞,移除该 popup
+ blockedCount += 1;
+ blockedIds.push((feature.getId?.() as string | number | null) ?? null);
+ batchContainer.removeChild(popupEl);
+ }
+ });
+ }
+
+ // 备注:清除批量显示的 popups。
+ clearBatchPopups() {
+ const existing = document.getElementById('batch-popup-container');
+ if (existing) {
+ existing.remove();
+ }
+ }
+
+ // 备注:检测两个 popup 矩形是否碰撞。
+ private checkCollision(
+ rect1: { left: number; right: number; top: number; bottom: number },
+ rect2: { left: number; right: number; top: number; bottom: number }
+ ): boolean {
+ const padding = 4;
+ return !(
+ rect1.right + padding < rect2.left ||
+ rect1.left - padding > rect2.right ||
+ rect1.bottom + padding < rect2.top ||
+ rect1.top - padding > rect2.bottom
+ );
+ }
+
// 备注:统一重置 hover 和 Popup 状态,供地图销毁和切换时复用。
reset() {
if (this.animationFrameId) {
@@ -264,6 +471,7 @@ export class PopupManager {
// 备注:销毁 Popup 管理器内部状态和 Overlay 引用。
destroy() {
+ this.clearBatchPopups();
this.reset();
if (this.popupElement && this.popupMouseEnterHandler) {
this.popupElement.removeEventListener(
diff --git a/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue b/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue
index 0f4d9c29..0f04e34d 100644
--- a/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue
+++ b/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue
@@ -1,11 +1,19 @@
-
+
-
+
@@ -15,18 +23,29 @@
diff --git a/frontend/src/modules/churukushuiwenMod/index.vue b/frontend/src/modules/churukushuiwenMod/index.vue
index b565b801..71ff0fb7 100644
--- a/frontend/src/modules/churukushuiwenMod/index.vue
+++ b/frontend/src/modules/churukushuiwenMod/index.vue
@@ -6,24 +6,42 @@
特性:支持月份选择、站点筛选、数据缩放、空值断开显示
-->
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
\ No newline at end of file
+
diff --git a/frontend/src/modules/map/application/map-orchestrator.ts b/frontend/src/modules/map/application/map-orchestrator.ts
index 2d29d449..1e70dcf4 100644
--- a/frontend/src/modules/map/application/map-orchestrator.ts
+++ b/frontend/src/modules/map/application/map-orchestrator.ts
@@ -107,6 +107,8 @@ export const useMapOrchestrator = () => {
mapDataStore.setLoading(true);
try {
+ const previousPageKey = mapConfigStore.lastLoadOptions?.pageKey || '';
+ const previousCheckedKeys = mapViewStore.getCheckedLayerKeys();
const { layerConfig, legendOriginal, pageLegend } =
await mapConfigStore.loadPageMapConfig({
systemId: SYSTEM_ID,
@@ -122,11 +124,26 @@ export const useMapOrchestrator = () => {
if (layerConfig.length > 0) {
mapStore.setLayerData(layerConfig);
ensureBaseLayersInitialized(layerConfig);
- const checkedKeys = mapViewStore.getCheckedLayerKeys();
+ let checkedKeys = mapViewStore.getCheckedLayerKeys();
+ if (previousPageKey === pageKey && previousCheckedKeys.length > 0) {
+ const currentLayerKeys = new Set(
+ layerConfig
+ .flatMap((item: any) => layerConfig2Flat([item]))
+ .map((item: any) => item?.key)
+ .filter(Boolean)
+ );
+ const runtimeCheckedKeys = previousCheckedKeys.filter(key =>
+ currentLayerKeys.has(key)
+ );
+ if (runtimeCheckedKeys.length > 0) {
+ mapViewStore.setCheckedLayerKeys(runtimeCheckedKeys);
+ checkedKeys = runtimeCheckedKeys;
+ }
+ }
await mapStore.loadAllLayerData(layerConfig, checkedKeys);
}
} finally {
- mapDataStore.setLoading(false);
+ // mapDataStore.setLoading(false);
}
};
@@ -380,7 +397,7 @@ export const useMapOrchestrator = () => {
};
// 备注:统一处理搜索定位,按点位编码从缓存数据中查找并飞行到目标位置。
- const focusPoint = (pointId: string, zoom: number = 14) => {
+ const focusPoint = (pointId: string, zoom: number = 15) => {
if (!pointId) return;
const targetPoint = mapDataStore.pointData.find((item: any) => {
return item.stcd === pointId || item._id === pointId;
diff --git a/frontend/src/modules/monthlyAvgWaterTemCompareHistory/monthlyAverage.vue b/frontend/src/modules/monthlyAvgWaterTemCompareHistory/monthlyAverage.vue
index 3ba5df66..c1a416c3 100644
--- a/frontend/src/modules/monthlyAvgWaterTemCompareHistory/monthlyAverage.vue
+++ b/frontend/src/modules/monthlyAvgWaterTemCompareHistory/monthlyAverage.vue
@@ -1,36 +1,73 @@
-
+
-
-
+
+
{{ item.wbsName }}
-
-
+
+
{{ item.label }}
-
-
+
+
{{ item.label }}
-
+
@@ -45,8 +82,14 @@
-
+
查看详情
@@ -254,10 +297,10 @@ const fetchLyData = async () => {
},
formValue.dataDimensionVal != 'all'
? {
- field: 'fullPath',
- operator: 'startswith',
- value: formValue.dataDimensionVal
- }
+ field: 'fullPath',
+ operator: 'startswith',
+ value: formValue.dataDimensionVal
+ }
: null
].filter(Boolean)
},
@@ -311,15 +354,15 @@ const fetchDmData = async () => {
{ field: 'mway', operator: 'eq', value: 2 },
formValue.dataDimensionVal == 'all'
? {
- field: 'rvcd',
- operator: 'contains',
- value: formValue.rvcd
- }
+ field: 'rvcd',
+ operator: 'contains',
+ value: formValue.rvcd
+ }
: {
- field: 'baseId',
- operator: 'contains',
- value: formValue.dataDimensionVal
- }
+ field: 'baseId',
+ operator: 'contains',
+ value: formValue.dataDimensionVal
+ }
]
},
select: ['stcd', 'stnm', 'lgtd', 'lttd', 'rstcdStepSort'],
@@ -816,8 +859,12 @@ const handleViewDetail = (record: any) => {
});
modelStore.modalVisible = true;
modelStore.params.sttp = 'WT';
- modelStore.title = stnm ;
+ modelStore.title = stnm;
modelStore.params.stcd = formValue.stcd;
+ modelStore.filter.rangeTm = [
+ dayjs(formValue.value.tm).startOf('month').format('YYYY-MM-DD HH:mm:ss'),
+ dayjs(formValue.value.tm).endOf('month').format('YYYY-MM-DD HH:mm:ss')
+ ];
};
defineExpose({
diff --git a/frontend/src/modules/qixidiliuliangbianhua/index.vue b/frontend/src/modules/qixidiliuliangbianhua/index.vue
index 6204a489..cb30c56f 100644
--- a/frontend/src/modules/qixidiliuliangbianhua/index.vue
+++ b/frontend/src/modules/qixidiliuliangbianhua/index.vue
@@ -1,17 +1,22 @@
-
-
-
-
-
-
-
-
+
+
+
\ No newline at end of file
+
diff --git a/frontend/src/modules/qixidishuiwenbianhua/index.vue b/frontend/src/modules/qixidishuiwenbianhua/index.vue
index 9550aefa..42cb222a 100644
--- a/frontend/src/modules/qixidishuiwenbianhua/index.vue
+++ b/frontend/src/modules/qixidishuiwenbianhua/index.vue
@@ -1,17 +1,22 @@
-
-
-
-
-
-
-
-
+
+
+
\ No newline at end of file
+
diff --git a/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue b/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue
index d3836f4c..7aa7f981 100644
--- a/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue
+++ b/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue
@@ -298,8 +298,12 @@ const handleExport = async () => {};
const handleViewDetail = (record: any) => {
modelStore.modalVisible = true;
modelStore.params.sttp = 'WT';
- modelStore.title = record.stnm ;
+ modelStore.title = record.stnm;
modelStore.params.stcd = record.stcd;
+ modelStore.filter.rangeTm = [
+ dayjs(record.dt).startOf('month').format('YYYY-MM-DD HH:mm:ss'),
+ dayjs(record.dt).endOf('month').format('YYYY-MM-DD HH:mm:ss')
+ ];
};
// 关闭弹窗
diff --git a/frontend/src/modules/shuiWenNianNeiFenBu/index.vue b/frontend/src/modules/shuiWenNianNeiFenBu/index.vue
index de788324..42ec49b6 100644
--- a/frontend/src/modules/shuiWenNianNeiFenBu/index.vue
+++ b/frontend/src/modules/shuiWenNianNeiFenBu/index.vue
@@ -1,540 +1,585 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
+
diff --git a/frontend/src/modules/waterQuality/index.vue b/frontend/src/modules/waterQuality/index.vue
index 02a4141c..ba62cf76 100644
--- a/frontend/src/modules/waterQuality/index.vue
+++ b/frontend/src/modules/waterQuality/index.vue
@@ -1,19 +1,24 @@
-
-
-
-
-
-
-
-
+
+
+
diff --git a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue
index d6d30b22..cc98cf77 100644
--- a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue
+++ b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue
@@ -1,34 +1,42 @@
-
+
-
-
+
+
-