refactor: 重构项目结构 - enums/config/types/plugins

- 重构 enums: 按业务域合并为 5 个文件
- 创建 config: storage.ts, vxe-table.ts
- 删除 plugins,功能迁移到 main.ts
- 创建完整 types 结构
- 新增 utils: validators, websocket, register-components
- 创建 router/guards/permission.ts
- 更新配置文件
This commit is contained in:
Ray.Hao
2025-12-12 13:59:40 +08:00
parent add4237b1f
commit 9fb1942619
45 changed files with 836 additions and 834 deletions

View File

@@ -0,0 +1,18 @@
/**
* 全局组件注册工具
*
* @description
* 批量注册 Element Plus 图标等全局组件
*/
import type { App } from "vue";
import * as ElementPlusIconsVue from "@element-plus/icons-vue";
/**
* 注册 Element Plus 所有图标为全局组件
*/
export function registerElementIcons(app: App) {
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component);
}
}

69
src/utils/validators.ts Normal file
View File

@@ -0,0 +1,69 @@
/**
* 表单验证规则工具
*
* @description
* 提供常用的表单验证规则
*/
import type { FormItemRule } from "element-plus";
/**
* 验证规则生成器
*/
export const VALIDATORS = {
/**
* 必填项验证
*/
required(message: string): FormItemRule {
return {
required: true,
message,
trigger: "blur",
};
},
/**
* 邮箱验证
*/
email: {
type: "email",
message: "请输入正确的邮箱地址",
trigger: "blur",
} as FormItemRule,
/**
* 手机号验证
*/
mobile: {
pattern: /^1[3-9]\d{9}$/,
message: "请输入正确的手机号码",
trigger: "blur",
} as FormItemRule,
/**
* URL 验证
*/
url: {
type: "url",
message: "请输入正确的URL地址",
trigger: "blur",
} as FormItemRule,
/**
* 数字验证
*/
number: {
type: "number",
message: "请输入数字",
trigger: "blur",
} as FormItemRule,
/**
* 整数验证
*/
integer: {
type: "integer",
message: "请输入整数",
trigger: "blur",
} as FormItemRule,
};

114
src/utils/websocket.ts Normal file
View File

@@ -0,0 +1,114 @@
/**
* WebSocket 服务管理
*
* @description
* 统一管理应用中的所有 WebSocket 连接
* - 字典同步 WebSocket
* - 在线用户计数 WebSocket
* - 其他业务 WebSocket
*
* @author 有来技术团队
*/
import { useDictSync } from "@/composables";
import { AuthStorage } from "@/utils/auth";
/**
* WebSocket 服务实例约定接口
*/
type WebSocketService = {
disconnect?: () => void;
closeWebSocket?: () => void;
cleanup?: () => void;
[key: string]: any;
};
/**
* 全局 WebSocket 实例管理
*/
const websocketInstances = new Map<string, WebSocketService>();
/**
* 防止重复初始化的状态标记
*/
let isInitialized = false;
let dictWebSocketInstance: ReturnType<typeof useDictSync> | null = null;
/**
* 注册 WebSocket 实例
*/
export function registerWebSocketInstance(key: string, instance: WebSocketService) {
websocketInstances.set(key, instance);
}
/**
* 获取 WebSocket 实例
*/
export function getWebSocketInstance(key: string) {
return websocketInstances.get(key);
}
/**
* 初始化 WebSocket 服务
*/
export function setupWebSocket() {
if (isInitialized) {
console.warn("[WebSocket] 已初始化,跳过重复初始化");
return;
}
if (!AuthStorage.getAccessToken()) {
console.warn("[WebSocket] 未登录,跳过 WebSocket 初始化");
return;
}
try {
dictWebSocketInstance = useDictSync();
registerWebSocketInstance("dict-sync", dictWebSocketInstance);
isInitialized = true;
console.log("[WebSocket] 初始化成功");
} catch (error) {
console.error("[WebSocket] 初始化失败:", error);
}
}
/**
* 清理所有 WebSocket 连接
*/
export function cleanupWebSocket() {
console.log("[WebSocket] 开始清理连接...");
websocketInstances.forEach((instance, key) => {
try {
if (instance.disconnect) {
instance.disconnect();
} else if (instance.closeWebSocket) {
instance.closeWebSocket();
} else if (instance.cleanup) {
instance.cleanup();
}
console.log(`[WebSocket] ${key} 已断开`);
} catch (error) {
console.error(`[WebSocket] ${key} 清理失败:`, error);
}
});
websocketInstances.clear();
dictWebSocketInstance = null;
isInitialized = false;
console.log("[WebSocket] 清理完成");
}
/**
* 重新初始化 WebSocket
*/
export function reinitializeWebSocket() {
cleanupWebSocket();
setupWebSocket();
}
if (typeof window !== "undefined") {
window.addEventListener("beforeunload", () => {
cleanupWebSocket();
});
}