server.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { defineStore } from 'pinia';
  2. import { ref, computed } from 'vue';
  3. import axios from 'axios';
  4. interface ServerConfig {
  5. id: string;
  6. name: string;
  7. url: string;
  8. isDefault?: boolean;
  9. }
  10. const STORAGE_KEY = 'server_configs';
  11. const CURRENT_SERVER_KEY = 'current_server';
  12. const SINGLE_SERVER_ID = 'server_default';
  13. export const useServerStore = defineStore('server', () => {
  14. const servers = ref<ServerConfig[]>([]);
  15. const currentServerId = ref<string | null>(null);
  16. const connectionStatus = ref<'connected' | 'disconnected' | 'checking'>('disconnected');
  17. const lastConnectionError = ref<string | null>(null);
  18. const currentServer = computed(() =>
  19. servers.value.find(s => s.id === currentServerId.value)
  20. );
  21. const isConfigured = computed(() => !!currentServer.value);
  22. // 加载配置
  23. function loadConfig() {
  24. const savedServers = localStorage.getItem(STORAGE_KEY);
  25. const savedCurrent = localStorage.getItem(CURRENT_SERVER_KEY);
  26. if (savedServers) {
  27. servers.value = JSON.parse(savedServers);
  28. }
  29. if (savedCurrent) {
  30. currentServerId.value = savedCurrent;
  31. }
  32. }
  33. // 保存配置
  34. function saveConfig() {
  35. localStorage.setItem(STORAGE_KEY, JSON.stringify(servers.value));
  36. if (currentServerId.value) {
  37. localStorage.setItem(CURRENT_SERVER_KEY, currentServerId.value);
  38. }
  39. }
  40. // 添加服务器
  41. function addServer(config: Omit<ServerConfig, 'id'>) {
  42. const id = `server_${Date.now()}`;
  43. const server: ServerConfig = { ...config, id };
  44. servers.value.push(server);
  45. if (servers.value.length === 1 || config.isDefault) {
  46. currentServerId.value = id;
  47. }
  48. saveConfig();
  49. return server;
  50. }
  51. // 更新服务器
  52. function updateServer(id: string, config: Partial<ServerConfig>) {
  53. const index = servers.value.findIndex(s => s.id === id);
  54. if (index !== -1) {
  55. servers.value[index] = { ...servers.value[index], ...config };
  56. saveConfig();
  57. }
  58. }
  59. // 删除服务器
  60. function removeServer(id: string) {
  61. const index = servers.value.findIndex(s => s.id === id);
  62. if (index !== -1) {
  63. servers.value.splice(index, 1);
  64. if (currentServerId.value === id) {
  65. currentServerId.value = servers.value[0]?.id || null;
  66. }
  67. saveConfig();
  68. }
  69. }
  70. // 切换当前服务器
  71. function setCurrentServer(id: string) {
  72. if (servers.value.find(s => s.id === id)) {
  73. currentServerId.value = id;
  74. saveConfig();
  75. }
  76. }
  77. // 单服务器模式:覆盖保存一个服务器配置并设为当前
  78. function setSingleServer(config: { url: string; name?: string }) {
  79. const url = config.url.replace(/\/$/, '');
  80. const name = (config.name || '').trim() || '服务器';
  81. servers.value = [{ id: SINGLE_SERVER_ID, name, url, isDefault: true }];
  82. currentServerId.value = SINGLE_SERVER_ID;
  83. saveConfig();
  84. }
  85. // 检查服务器连接
  86. async function checkConnection(url?: string): Promise<boolean> {
  87. const targetUrl = url || currentServer.value?.url;
  88. if (!targetUrl) return false;
  89. lastConnectionError.value = null;
  90. connectionStatus.value = 'checking';
  91. try {
  92. const electronApi = (window as any)?.electronAPI;
  93. if (electronApi?.testServerConnection) {
  94. const result = await electronApi.testServerConnection(targetUrl);
  95. if (result?.ok) {
  96. connectionStatus.value = 'connected';
  97. return true;
  98. }
  99. lastConnectionError.value = String(result?.error || '连接失败');
  100. connectionStatus.value = 'disconnected';
  101. return false;
  102. }
  103. const response = await axios.get(`${targetUrl}/api/health`, { timeout: 5000 });
  104. connectionStatus.value = response.data?.status === 'ok' ? 'connected' : 'disconnected';
  105. return connectionStatus.value === 'connected';
  106. } catch (e: any) {
  107. lastConnectionError.value = String(e?.message || '连接失败');
  108. connectionStatus.value = 'disconnected';
  109. return false;
  110. }
  111. }
  112. return {
  113. servers,
  114. currentServer,
  115. currentServerId,
  116. connectionStatus,
  117. lastConnectionError,
  118. isConfigured,
  119. loadConfig,
  120. addServer,
  121. updateServer,
  122. removeServer,
  123. setCurrentServer,
  124. setSingleServer,
  125. checkConnection,
  126. };
  127. });