Parcourir la source

chore(deps): update dependencies and improve error handling

0xJacky il y a 4 jours
Parent
commit
22e3c69371

+ 0 - 14
app/components.d.ts

@@ -10,30 +10,20 @@ declare module 'vue' {
   export interface GlobalComponents {
     AAlert: typeof import('ant-design-vue/es')['Alert']
     AApp: typeof import('ant-design-vue/es')['App']
-    AAutoComplete: typeof import('ant-design-vue/es')['AutoComplete']
     AAvatar: typeof import('ant-design-vue/es')['Avatar']
     ABadge: typeof import('ant-design-vue/es')['Badge']
     ABreadcrumb: typeof import('ant-design-vue/es')['Breadcrumb']
     ABreadcrumbItem: typeof import('ant-design-vue/es')['BreadcrumbItem']
     AButton: typeof import('ant-design-vue/es')['Button']
     ACard: typeof import('ant-design-vue/es')['Card']
-    ACheckbox: typeof import('ant-design-vue/es')['Checkbox']
-    ACheckboxGroup: typeof import('ant-design-vue/es')['CheckboxGroup']
     ACol: typeof import('ant-design-vue/es')['Col']
-    ACollapse: typeof import('ant-design-vue/es')['Collapse']
-    ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel']
     AComment: typeof import('ant-design-vue/es')['Comment']
     AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
     ADivider: typeof import('ant-design-vue/es')['Divider']
     ADrawer: typeof import('ant-design-vue/es')['Drawer']
     ADropdown: typeof import('ant-design-vue/es')['Dropdown']
-    AEmpty: typeof import('ant-design-vue/es')['Empty']
-    AForm: typeof import('ant-design-vue/es')['Form']
-    AFormItem: typeof import('ant-design-vue/es')['FormItem']
     AInput: typeof import('ant-design-vue/es')['Input']
     AInputGroup: typeof import('ant-design-vue/es')['InputGroup']
-    AInputNumber: typeof import('ant-design-vue/es')['InputNumber']
-    AInputPassword: typeof import('ant-design-vue/es')['InputPassword']
     ALayout: typeof import('ant-design-vue/es')['Layout']
     ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent']
     ALayoutFooter: typeof import('ant-design-vue/es')['LayoutFooter']
@@ -45,7 +35,6 @@ declare module 'vue' {
     AMenu: typeof import('ant-design-vue/es')['Menu']
     AMenuDivider: typeof import('ant-design-vue/es')['MenuDivider']
     AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
-    AModal: typeof import('ant-design-vue/es')['Modal']
     APopconfirm: typeof import('ant-design-vue/es')['Popconfirm']
     APopover: typeof import('ant-design-vue/es')['Popover']
     AppProvider: typeof import('./src/components/AppProvider.vue')['default']
@@ -54,10 +43,8 @@ declare module 'vue' {
     ASelect: typeof import('ant-design-vue/es')['Select']
     ASelectOption: typeof import('ant-design-vue/es')['SelectOption']
     ASpace: typeof import('ant-design-vue/es')['Space']
-    ASpin: typeof import('ant-design-vue/es')['Spin']
     AStatistic: typeof import('ant-design-vue/es')['Statistic']
     ASubMenu: typeof import('ant-design-vue/es')['SubMenu']
-    ASwitch: typeof import('ant-design-vue/es')['Switch']
     ATable: typeof import('ant-design-vue/es')['Table']
     ATabPane: typeof import('ant-design-vue/es')['TabPane']
     ATabs: typeof import('ant-design-vue/es')['Tabs']
@@ -65,7 +52,6 @@ declare module 'vue' {
     ATextarea: typeof import('ant-design-vue/es')['Textarea']
     ATooltip: typeof import('ant-design-vue/es')['Tooltip']
     ATypographyText: typeof import('ant-design-vue/es')['TypographyText']
-    ATypographyTitle: typeof import('ant-design-vue/es')['TypographyTitle']
     AutoCertFormAutoCertForm: typeof import('./src/components/AutoCertForm/AutoCertForm.vue')['default']
     AutoCertFormDNSChallenge: typeof import('./src/components/AutoCertForm/DNSChallenge.vue')['default']
     BaseEditorBaseEditor: typeof import('./src/components/BaseEditor/BaseEditor.vue')['default']

+ 2 - 2
app/package.json

@@ -19,7 +19,7 @@
     "@formkit/auto-animate": "^0.9.0",
     "@simplewebauthn/browser": "^13.2.0",
     "@uozi-admin/curd": "^4.17.0",
-    "@uozi-admin/request": "^2.9.0",
+    "@uozi-admin/request": "^2.9.1",
     "@vue/reactivity": "^3.5.22",
     "@vue/shared": "^3.5.22",
     "@vueuse/components": "^13.9.0",
@@ -87,7 +87,7 @@
     "unplugin-auto-import": "^20.2.0",
     "unplugin-vue-components": "^29.1.0",
     "unplugin-vue-define-options": "^3.1.1",
-    "vite": "^7.1.7",
+    "vite": "^7.1.8",
     "vite-plugin-inspect": "^11.3.3",
     "vite-svg-loader": "^5.1.0",
     "vue-tsc": "^3.1.0"

Fichier diff supprimé car celui-ci est trop grand
+ 199 - 199
app/pnpm-lock.yaml


+ 11 - 4
app/src/lib/http/interceptors.ts

@@ -125,6 +125,10 @@ export function setupResponseInterceptor() {
     },
 
     async error => {
+      // Ignore canceled requests (navigation, component unmount, deduped requests)
+      if (error?.code === 'ERR_CANCELED' || /canceled/i.test(error?.message || '')) {
+        return Promise.reject(error)
+      }
       // Setup stores and refs
       const user = useUserStore()
       const { secureSessionId } = storeToRefs(user)
@@ -155,11 +159,14 @@ export function setupResponseInterceptor() {
           console.error('Failed to parse blob error response as JSON', e)
         }
       }
+      console.error(error)
+      const errData = (error.response?.data as CosyError) || {
+        code: error?.code || 'NETWORK_ERROR',
+        message: error?.message || 'Network error',
+      }
+      await handleApiError(errData, dedupe)
 
-      const err = error.response?.data as CosyError
-      await handleApiError(err, dedupe)
-
-      return Promise.reject(error.response?.data)
+      return Promise.reject(error.response?.data ?? errData)
     },
   )
 }

+ 2 - 16
app/src/main.ts

@@ -1,5 +1,5 @@
 import { autoAnimatePlugin } from '@formkit/auto-animate/vue'
-import { createCurdConfig } from '@uozi-admin/curd'
+import { createCosyProConfig } from '@uozi-admin/curd'
 import { createRequestConfig } from '@uozi-admin/request'
 import { createPinia } from 'pinia'
 import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
@@ -44,21 +44,7 @@ app.use(pinia)
     },
   })
   .use(setupInterceptors)
-  .use(createCurdConfig({
-    listApi: {
-      paginationMap: {
-        params: {
-          current: 'page',
-          pageSize: 'page_size',
-        },
-        response: {
-          total: 'total',
-          current: 'current_page',
-          pageSize: 'per_page',
-          totalPages: 'total_pages',
-        },
-      },
-    },
+  .use(createCosyProConfig({
     i18n: {
       legacy: false,
       locale: 'zh-CN',

+ 31 - 39
app/src/views/terminal/components/TerminalStatusBar.vue

@@ -1,7 +1,6 @@
 <script setup lang="ts">
 import type { DiskStat, LoadStat, MemStat } from '@/api/analytic'
 import analytic from '@/api/analytic'
-import upgrade from '@/api/upgrade'
 import { formatDateTime } from '@/lib/helper'
 
 interface StatusData {
@@ -38,30 +37,27 @@ function formatUptime(uptime: number) {
 // Format memory usage as "used percentage"
 function formatMemoryUsage(memory: MemStat | null) {
   if (!memory)
-    return '0B0%'
+    return '0B 0%'
 
-  // Use the pressure value as percentage (since you said we can get it directly)
-  const percentage = memory.pressure.toFixed(1)
+  // Use percentage provided by the backend; keep 1 decimal place
+  const percentage = typeof memory.pressure === 'number' ? memory.pressure.toFixed(1) : '0.0'
 
-  // Remove space from used size and combine without space
-  const usedSize = memory.used.replace(' ', '')
+  // Preserve space in formatted size and add a space before percentage
+  const usedSize = memory.used
 
-  return `${usedSize}${percentage}%`
+  return `${usedSize} ${percentage}%`
 }
 
 // Format disk usage as "used percentage"
 function formatDiskUsage(disk: DiskStat | null) {
   if (!disk)
-    return '0B0%'
+    return '0B 0%'
 
-  // Value is already formatted string like "39 GiB"
-  // Use the pre-calculated percentage from the API
-  const percentage = disk.percentage.toFixed(1)
+  // Already a formatted string like "39 GiB"; percentage comes from API
+  const percentage = typeof disk.percentage === 'number' ? disk.percentage.toFixed(1) : '0.0'
+  const usedSize = disk.used
 
-  // Remove space from used size and combine without space
-  const usedSize = disk.used.replace(' ', '')
-
-  return `${usedSize}${percentage}%`
+  return `${usedSize} ${percentage}%`
 }
 
 // Format CPU frequency
@@ -75,50 +71,46 @@ function formatCpuFreq(freq: number) {
   return `${freq.toFixed(0)}MHz`
 }
 
+// Format CPU text as "<count>x<freq>" with graceful fallbacks
+function formatCpu(cpuCount: number, freq: number) {
+  const hasCount = typeof cpuCount === 'number' && cpuCount > 0
+  const hasFreq = typeof freq === 'number' && freq > 0
+
+  if (hasCount && hasFreq)
+    return `${cpuCount}x${formatCpuFreq(freq)}`
+  if (hasCount && !hasFreq)
+    return `${cpuCount}x`
+  if (!hasCount && hasFreq)
+    return `${formatCpuFreq(freq)}`
+  return 'N/A'
+}
+
 // Update current timestamp
 function updateTimestamp() {
   statusData.value.timestamp = formatDateTime(new Date().toISOString())
 }
 
-// Initialize data from analytic init API
+// Initialize data from analytic init API (no fallbacks)
 async function initializeData() {
   try {
     const analyticData = await analytic.init()
 
-    // Set system info with fallbacks
     statusData.value.uptime = analyticData?.host?.uptime || 0
     statusData.value.loadAvg = analyticData?.loadavg || null
     statusData.value.memory = analyticData?.memory || null
     statusData.value.disk = analyticData?.disk || null
 
-    // Set CPU info with fallbacks
+    // System version is taken directly from host.platformVersion
+    statusData.value.version = analyticData?.host?.platformVersion || ''
+
     const cpuInfo = analyticData?.cpu?.info || []
     statusData.value.cpuCount = cpuInfo.length || 0
-
-    // Get CPU frequency from first CPU info with fallback
-    if (cpuInfo.length > 0 && cpuInfo[0].mhz) {
-      statusData.value.cpuFreq = cpuInfo[0].mhz
-    }
-    else {
-      statusData.value.cpuFreq = 0
-    }
-
-    // Try to get version from upgrade API, fallback to host platform version
-    try {
-      const versionData = await upgrade.current_version()
-      statusData.value.version = versionData?.cur_version?.version || analyticData?.host?.platformVersion || 'unknown'
-    }
-    catch (versionError) {
-      console.warn('Failed to get app version, using platform version:', versionError)
-      statusData.value.version = analyticData?.host?.platformVersion || 'unknown'
-    }
+    statusData.value.cpuFreq = (cpuInfo.length > 0 && cpuInfo[0].mhz) ? cpuInfo[0].mhz : 0
 
     updateTimestamp()
   }
   catch (error) {
     console.error('Failed to initialize terminal status bar:', error)
-    // Set default values on error
-    statusData.value.version = 'error'
     updateTimestamp()
   }
 }
@@ -200,7 +192,7 @@ onMounted(() => {
 
       <div class="status-item cpu">
         <span class="icon i-tabler-cpu" />
-        <span class="value">{{ statusData.cpuCount || 0 }}x{{ formatCpuFreq(statusData.cpuFreq || 0) }}</span>
+        <span class="value">{{ formatCpu(statusData.cpuCount || 0, statusData.cpuFreq || 0) }}</span>
       </div>
 
       <div class="status-item memory">

+ 2 - 2
go.mod

@@ -46,7 +46,7 @@ require (
 	github.com/stretchr/testify v1.11.1
 	github.com/tufanbarisyildirim/gonginx v0.0.0-20250620092546-c3e307e36701
 	github.com/ulikunitz/xz v0.5.15
-	github.com/uozi-tech/cosy v1.26.15
+	github.com/uozi-tech/cosy v1.26.16
 	github.com/uozi-tech/cosy-driver-sqlite v0.2.1
 	github.com/urfave/cli/v3 v3.4.1
 	golang.org/x/crypto v0.42.0
@@ -351,7 +351,7 @@ require (
 	google.golang.org/api v0.250.0 // indirect
 	google.golang.org/genproto/googleapis/api v0.0.0-20250922171735-9219d122eba9 // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20250922171735-9219d122eba9 // indirect
-	google.golang.org/protobuf v1.36.9 // indirect
+	google.golang.org/protobuf v1.36.10 // indirect
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
 	gopkg.in/ns1/ns1-go.v2 v2.15.0 // indirect
 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect

+ 4 - 0
go.sum

@@ -2012,6 +2012,8 @@ github.com/uozi-tech/cosy v1.26.7 h1:1YkzOHneh5Dc+LWpEOUxNmmZpp7j8T862nZUDjizaMI
 github.com/uozi-tech/cosy v1.26.7/go.mod h1:g6HCFb0uEYHOw0GFLZWM25Qk/C0KgHZSh1BHZhf05v0=
 github.com/uozi-tech/cosy v1.26.15 h1:cHAP77B+whJKWfd6LjaEGX3ivkJwtmDXGm57J+gUMd0=
 github.com/uozi-tech/cosy v1.26.15/go.mod h1:S1b7yc/cvEZDw8cU8X1e6CwLsJ42FCGER4BVs6WcEyg=
+github.com/uozi-tech/cosy v1.26.16 h1:vh9TFdjEr2DB4FV880W2l9dtyATRUR6fxLXs3V4NUj0=
+github.com/uozi-tech/cosy v1.26.16/go.mod h1:S1b7yc/cvEZDw8cU8X1e6CwLsJ42FCGER4BVs6WcEyg=
 github.com/uozi-tech/cosy-driver-mysql v0.2.2 h1:22S/XNIvuaKGqxQPsYPXN8TZ8hHjCQdcJKVQ83Vzxoo=
 github.com/uozi-tech/cosy-driver-mysql v0.2.2/go.mod h1:EZnRIbSj1V5U0gEeTobrXai/d1SV11lkl4zP9NFEmyE=
 github.com/uozi-tech/cosy-driver-postgres v0.2.1 h1:OICakGuT+omva6QOJCxTJ5Lfr7CGXLmk/zD+aS51Z2o=
@@ -2952,6 +2954,8 @@ google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
 google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
 google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
+google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
+google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff