项目优化,构建文件Lombok异常问题修复

This commit is contained in:
2026-06-29 13:55:42 +08:00
parent 53b3b2c989
commit 0799f9cb4d
47 changed files with 1034 additions and 865 deletions
+1 -1
View File
@@ -127,7 +127,7 @@
margin: 8px 8px 0 0;
border-radius: 2px;
display: inline-block;
box-shadow: 0 1px 3px rgba(0 0 0, 0.1);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
vertical-align: top;
position: relative;
cursor: pointer;
@@ -17,7 +17,7 @@ export default defineComponent({
const store = useAppStore();
return {
value: computed(() => `${props.modelValue}`),
dataList: getDictDataList(store.state.dicts, props.dictType)
dataList: computed(() => getDictDataList(store.state.dicts, props.dictType))
};
}
});
@@ -18,7 +18,7 @@ export default defineComponent({
const store = useAppStore();
return {
value: computed(() => `${props.modelValue}`),
dataList: getDictDataList(store.state.dicts, props.dictType)
dataList: computed(() => getDictDataList(store.state.dicts, props.dictType))
};
}
});
@@ -3,7 +3,7 @@
// 消息队列 / 通知中心抽屉 / 详情弹窗 / 悬浮滚动条位置
// 获取:SSE 主通道 + 10s 轮询降级 + 每60s全量对账
import { ref, computed } from "vue";
import { ref, computed, onBeforeUnmount } from "vue";
import baseService from "@/service/baseService";
import app from "@/constants/app";
import { getToken } from "@/utils/cache";
@@ -329,6 +329,10 @@ function setPosition(pos: { x: number; y: number }): void {
// ---------- composable 导出 ----------
export function useAlertMarquee() {
onBeforeUnmount(() => {
stopPolling();
});
return {
// 消息
messages,
@@ -1,7 +1,7 @@
// composables/useFloatingDrag.ts
// 浮窗拖动逻辑 — Pointer Events 统一处理鼠标和触屏
import { ref, type Ref } from "vue";
import { ref, onBeforeUnmount, type Ref } from "vue";
export interface DragPosition {
x: number;
@@ -16,6 +16,24 @@ export function useFloatingDrag(
const dragMoved = ref(false);
let dragResetTimer: ReturnType<typeof setTimeout> | null = null;
/** 清理拖拽期间注册的事件监听器(组件卸载时使用) */
function cleanupDragListeners(): void {
const el = elementRef.value;
if (el) {
el.removeEventListener("pointermove", onPointerMove);
el.removeEventListener("pointerup", onPointerUp);
el.removeEventListener("pointercancel", onPointerUp);
}
if (dragResetTimer) {
clearTimeout(dragResetTimer);
dragResetTimer = null;
}
}
onBeforeUnmount(() => {
cleanupDragListeners();
});
/** pointerdown 时记录的元素尺寸和指针在元素内的偏移 */
let dragMeta: {
width: number;
@@ -9,7 +9,7 @@ export const RAIN_LEVELS = [
{ label: "大雨", min: 25, max: 50 },
{ label: "暴雨", min: 50, max: 100 },
{ label: "大暴雨", min: 100, max: 250 },
{ label: "特大暴雨", min: 250, max: 9999 }
{ label: "特大暴雨", min: 250, max: Infinity }
] as const;
/** 可筛选的降雨等级(排除"无雨",因为无雨通常单独判断) */
+1 -1
View File
@@ -58,7 +58,7 @@ export default defineComponent({
});
</script>
<template>
<el-container :class="`rr ${containerClassNames}`" v-loading="state.loading" element-loading-background="#0000" element-loading-lock="true" element-loading-custom-class="rr-loading">
<el-container :class="`rr ${containerClassNames}`" v-loading="state.loading" element-loading-background="transparent" element-loading-lock="true" element-loading-custom-class="rr-loading">
<el-header class="rr-header" height="50px">
<base-header></base-header>
</el-header>
@@ -7,7 +7,7 @@ import emits from "@/utils/emits";
import { toValidRoutes } from "@/utils/router";
import { getThemeConfigCacheByKey } from "@/utils/theme";
import { useWindowSize } from "@vueuse/core";
import { defineComponent, onMounted, reactive, ref, watch } from "vue";
import { defineComponent, onMounted, onBeforeUnmount, reactive, ref, watch } from "vue";
import { RouteRecordRaw, useRoute, useRouter } from "vue-router";
import { useAppStore } from "@/store";
import SidebarMenusItems from "./sidebar-menus-items.vue";
@@ -84,16 +84,25 @@ export default defineComponent({
state.menus = ms;
}
);
emits.on(EMitt.OnSwitchLeftSidebar, () => {
const onSwitchLeftSidebar = () => {
state.collapseSidebar = !state.collapseSidebar;
});
emits.on(EMitt.OnSetThemeNotUniqueOpened, (vl) => {
};
const onSetThemeNotUniqueOpened = (vl: boolean) => {
state.uniqueOpened = vl;
});
emits.on(EMitt.OnSetTheme, ([vl]) => {
};
const onSetTheme = ([vl]: [string, string]) => {
if (vl === EThemeSetting.Sidebar) {
state.popClassName = getPopClassName();
}
};
emits.on(EMitt.OnSwitchLeftSidebar, onSwitchLeftSidebar);
emits.on(EMitt.OnSetThemeNotUniqueOpened, onSetThemeNotUniqueOpened);
emits.on(EMitt.OnSetTheme, onSetTheme);
onBeforeUnmount(() => {
emits.off(EMitt.OnSwitchLeftSidebar, onSwitchLeftSidebar);
emits.off(EMitt.OnSetThemeNotUniqueOpened, onSetThemeNotUniqueOpened);
emits.off(EMitt.OnSetTheme, onSetTheme);
});
watch(
() => route.path,
@@ -15,7 +15,7 @@ export default defineComponent({
setup(props) {
const getStyle = (index: number): string => {
const styles: Array<any> = [];
const isHidden = props.hiddenIndex ? props.hiddenIndex > -1 && index > props.hiddenIndex : false;
const isHidden = props.hiddenIndex != null ? props.hiddenIndex > -1 && index > props.hiddenIndex : false;
styles.push("display:" + (isHidden ? "none" : "block"));
return styles.join(";");
};
+24 -17
View File
@@ -27,6 +27,8 @@ const router = createRouter({
routes: baseRoutes
});
let initAppPromise: Promise<any> | null = null;
// 路由加载前
router.beforeEach((to, from, next) => {
//外链
@@ -65,23 +67,28 @@ router.beforeEach((to, from, next) => {
}
} else {
if (token) {
store.initApp().then((res: Array<RouteRecordRaw>) => {
const mergeRoute = baseRoutes.concat(res);
router.options.routes = mergeRoute;
registerToRouter(router, mergeRoute);
if (!to.matched.length) {
registerDynamicToRouterAndNext({ path: to.path, query: to.query });
}
store.updateState({
appIsReady: true,
routes: mergeRoute,
routeToMeta: { ...store.state.routeToMeta, ...getBaseRouteToMeta(baseRoutes) }
if (!initAppPromise) {
initAppPromise = store.initApp().then((res: Array<RouteRecordRaw>) => {
const mergeRoute = baseRoutes.concat(res);
router.options.routes = mergeRoute;
registerToRouter(router, mergeRoute);
if (!to.matched.length) {
registerDynamicToRouterAndNext({ path: to.path, query: to.query });
}
store.updateState({
appIsReady: true,
routes: mergeRoute,
routeToMeta: { ...store.state.routeToMeta, ...getBaseRouteToMeta(baseRoutes) }
});
setTimeout(() => {
store.updateState({ appIsRender: true, appIsLogin: true });
}, 600);
next({ ...to, replace: true });
}).finally(() => {
initAppPromise = null;
});
setTimeout(() => {
store.updateState({ appIsRender: true, appIsLogin: true });
}, 600);
next({ ...to, replace: true });
});
}
initAppPromise.then(() => {});
} else {
if (isPop) {
if (!to.matched.length) {
@@ -126,7 +133,7 @@ export const getSysRouteMap = (): IObject => {
* @returns
*/
export const toSysViewComponentPath = (path: string): string => {
path = path.replace("_", "-");
path = path.replace(/_/g, "-");
return `/src/views${path}.vue`;
};
/**
+2 -36
View File
@@ -1,36 +1,2 @@
// utils/chartBuilder.ts
import type { WeatherRecord } from "../service/weatherDataService";
import type { WeatherExtremes } from "../service/weatherStatsService";
export function buildWeatherOption(rows: WeatherRecord[], stats: WeatherExtremes) {
return {
tooltip: { trigger: "axis" },
xAxis: {
type: "category",
data: rows.map((r) => r.year)
},
yAxis: {
type: "value"
},
series: [
{
name: "最高温",
type: "bar",
data: rows.map((r) => {
const isMax = r.year === stats.maxTmaxYear;
return {
value: r.tmax,
itemStyle: {
color: isMax ? "#ff4d4f" : "#5b8ff9"
},
label: {
show: isMax,
position: "top",
fontWeight: 600
}
};
})
}
]
};
}
// utils/chartBuilder.ts — 已废弃,请使用 composables/useWeatherChart.ts
export {}
+6 -6
View File
@@ -87,9 +87,9 @@ export const getThemeCluster = (theme: string): string[] => {
green += Math.round(tint * (255 - green));
blue += Math.round(tint * (255 - blue));
red = red.toString(16);
green = green.toString(16);
blue = blue.toString(16);
red = red.toString(16).padStart(2, "0");
green = green.toString(16).padStart(2, "0");
blue = blue.toString(16).padStart(2, "0");
return `#${red}${green}${blue}`;
}
@@ -104,9 +104,9 @@ export const getThemeCluster = (theme: string): string[] => {
green = Math.round((1 - shade) * green);
blue = Math.round((1 - shade) * blue);
red = red.toString(16);
green = green.toString(16);
blue = blue.toString(16);
red = red.toString(16).padStart(2, "0");
green = green.toString(16).padStart(2, "0");
blue = blue.toString(16).padStart(2, "0");
return `#${red}${green}${blue}`;
};
+11 -9
View File
@@ -237,19 +237,21 @@ export const treeDataTranslate = (data: IObject[], id?: string, pid?: string): I
const temp: IObject = {};
id = id || "id";
pid = pid || "pid";
for (let i = 0; i < data.length; i++) {
temp[data[i][id]] = data[i];
// 浅拷贝避免修改输入数组元素
const cloned = data.map((item) => ({ ...item }));
for (let i = 0; i < cloned.length; i++) {
temp[cloned[i][id]] = cloned[i];
}
for (let k = 0; k < data.length; k++) {
if (!temp[data[k][pid]] || data[k][id] === data[k][pid]) {
res.push(data[k]);
for (let k = 0; k < cloned.length; k++) {
if (!temp[cloned[k][pid]] || cloned[k][id] === cloned[k][pid]) {
res.push(cloned[k]);
continue;
}
if (!temp[data[k][pid]]["children"]) {
temp[data[k][pid]]["children"] = [];
if (!temp[cloned[k][pid]]["children"]) {
temp[cloned[k][pid]]["children"] = [];
}
temp[data[k][pid]]["children"].push(data[k]);
data[k]["_level"] = (temp[data[k][pid]]._level || 0) + 1;
temp[cloned[k][pid]]["children"].push(cloned[k]);
cloned[k]["_level"] = (temp[cloned[k][pid]]._level || 0) + 1;
}
return res;
};
@@ -29,13 +29,13 @@
<el-divider content-position="left">温湿度与气压</el-divider>
<el-col :span="12">
<el-form-item label="相对湿度" prop="avgTemp" label-width="80px">
<el-form-item label="相对湿度" prop="relativeHumidity" label-width="80px">
<el-input-number v-model="dataForm.relativeHumidity" :precision="1" :step="0.1" controls-position="right" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="气压" prop="avgTemp" label-width="80px">
<el-form-item label="气压" prop="atmospheres" label-width="80px">
<el-input-number v-model="dataForm.atmospheres" :precision="1" :step="0.1" controls-position="right" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
@@ -80,13 +80,13 @@
</el-col>
<el-col :span="12">
<el-form-item label="日平均风速" prop="maxWindSpeed">
<el-form-item label="日平均风速" prop="dayAvgWindSpeed">
<el-input-number v-model="dataForm.dayAvgWindSpeed" :precision="1" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="日平均风向" prop="maxWindSpeed">
<el-form-item label="日平均风向" prop="dayAvgWindDirection">
<el-input-number v-model="dataForm.dayAvgWindDirection" :precision="1" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
@@ -103,23 +103,23 @@
</el-col>
<el-col :span="12">
<el-form-item label="极大风速" prop="maxWindSpeed">
<el-form-item label="极大风速" prop="extremeWindSpeed">
<el-input-number v-model="dataForm.extremeWindSpeed" :precision="1" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="极大风速风向" prop="maxWindSpeed">
<el-form-item label="极大风速风向" prop="extremeWindDirection">
<el-input-number v-model="dataForm.extremeWindDirection" :precision="1" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="极大风速出现时间" prop="minTempTime" label-width="125px">
<el-form-item label="极大风速出现时间" prop="extremeWindTime" label-width="125px">
<el-input v-model="dataForm.extremeWindTime" placeholder="HHmm"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="最大风速出现时间" prop="minTempTime" label-width="125px">
<el-form-item label="最大风速出现时间" prop="maxWindTime" label-width="125px">
<el-input v-model="dataForm.maxWindTime" placeholder="HHmm"></el-input>
</el-form-item>
</el-col>
+9 -1
View File
@@ -18,12 +18,20 @@ export default defineComponent({
title: "404",
message: "访问页面不存在"
},
403: {
title: "403",
message: "无权限访问"
},
500: {
title: "500",
message: "服务器错误"
},
error: {
title: "错误",
message: "访问出错了"
}
};
const tip: ITip = tips[to?.toString() ?? "error"];
const tip: ITip = tips[to?.toString()] || tips["error"];
const onBack = () => {
router.back();
};
+2 -1
View File
@@ -273,7 +273,8 @@
</section>
<!-- ==================== 主体 ==================== -->
<div class="main-grid">
<el-empty v-if="!loading && pageState.weatherData.length === 0" description="暂无历史气象数据" :image-size="120" style="margin-top: 60px" />
<div class="main-grid" v-else>
<div class="col-main">
<el-card class="mod-card" shadow="never">
<template #header>
@@ -16,7 +16,7 @@
<aside class="file-list-panel">
<div v-for="(item, index) in state.fileItems" :key="item.anchorId" class="file-list-item" :class="{ 'is-active': state.selectedFileIndex === index }" @click="selectFile(index)">
<div class="file-list-item__thumb">
<img v-if="blobUrlCache[item.fileId]" :src="blobUrlCache[item.fileId]" class="file-list-item__img" alt="{{item.displayName}}}" />
<img v-if="blobUrlCache[item.fileId]" :src="blobUrlCache[item.fileId]" class="file-list-item__img" :alt="item.displayName" />
<span v-else-if="isImageFile(item.type)" class="file-list-item__icon file-list-item__icon--img">GIF</span>
<span v-else class="file-list-item__icon file-list-item__icon--other"></span>
</div>