zkqh-lagrange-utils 0.0.58 → 0.0.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,74 +1,74 @@
1
- {
2
- "name": "zkqh-lagrange-utils",
3
- "private": false,
4
- "version": "0.0.58",
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "vite build",
9
- "gen-style": "node ./scripts/generate-naiveui-common-style.mjs"
10
- },
11
- "main": "dist/lagrange-utils.umd.cjs",
12
- "module": "dist/lagrange-utils.js",
13
- "sideEffects": [
14
- "*.css"
15
- ],
16
- "exports": {
17
- ".": {
18
- "import": "./dist/lagrange-utils.js",
19
- "require": "./dist/lagrange-utils.umd.cjs"
20
- },
21
- "./export_plugin": {
22
- "import": "./src/service/export_plugin/index.js",
23
- "default": "./src/service/export_plugin/index.js"
24
- },
25
- "./export_plugin/api": {
26
- "import": "./src/service/export_plugin/api/index.js",
27
- "default": "./src/service/export_plugin/api/index.js"
28
- },
29
- "./style.css": {
30
- "default": "./dist/style.css"
31
- },
32
- "./assets/*": "./dist/assets/*",
33
- "./assets/css/*": "./dist/assets/css/*",
34
- "./assets/font/*": "./dist/assets/font/*",
35
- "./assets/image/*": "./dist/assets/image/*",
36
- "./postcss.config.js": {
37
- "import": "./postcss.config.js",
38
- "require": "./postcss.config.cjs",
39
- "default": "./postcss.config.js"
40
- }
41
- },
42
- "files": [
43
- "dist",
44
- "assets",
45
- "src/service",
46
- "postcss.config.js",
47
- "postcss.config.cjs"
48
- ],
49
- "dependencies": {
50
- "autoprefixer": "^10.4.22",
51
- "axios": "^1.18.1",
52
- "postcss-pxtorem": "^6.1.0",
53
- "vue": "^3.3.0"
54
- },
55
- "peerDependencies": {
56
- "naive-ui": "^2.40.0",
57
- "vue": "^3.3.0"
58
- },
59
- "peerDependenciesMeta": {
60
- "naive-ui": {
61
- "optional": true
62
- }
63
- },
64
- "devDependencies": {
65
- "@vitejs/plugin-vue": "^5.0.4",
66
- "@vitejs/plugin-vue-jsx": "^3.0.2",
67
- "less": "^4.4.2",
68
- "naive-ui": "2.43.1",
69
- "vite": "^5.4.10",
70
- "vite-plugin-static-copy": "^0.17.0"
71
- },
72
- "author": "zkqh-ddh",
73
- "license": "MIT"
74
- }
1
+ {
2
+ "name": "zkqh-lagrange-utils",
3
+ "private": false,
4
+ "version": "0.0.60",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "gen-style": "node ./scripts/generate-naiveui-common-style.mjs"
10
+ },
11
+ "main": "dist/lagrange-utils.umd.cjs",
12
+ "module": "dist/lagrange-utils.js",
13
+ "sideEffects": [
14
+ "*.css"
15
+ ],
16
+ "exports": {
17
+ ".": {
18
+ "import": "./dist/lagrange-utils.js",
19
+ "require": "./dist/lagrange-utils.umd.cjs"
20
+ },
21
+ "./export_plugin": {
22
+ "import": "./src/service/export_plugin/index.js",
23
+ "default": "./src/service/export_plugin/index.js"
24
+ },
25
+ "./export_plugin/api": {
26
+ "import": "./src/service/export_plugin/api/index.js",
27
+ "default": "./src/service/export_plugin/api/index.js"
28
+ },
29
+ "./style.css": {
30
+ "default": "./dist/style.css"
31
+ },
32
+ "./assets/*": "./dist/assets/*",
33
+ "./assets/css/*": "./dist/assets/css/*",
34
+ "./assets/font/*": "./dist/assets/font/*",
35
+ "./assets/image/*": "./dist/assets/image/*",
36
+ "./postcss.config.js": {
37
+ "import": "./postcss.config.js",
38
+ "require": "./postcss.config.cjs",
39
+ "default": "./postcss.config.js"
40
+ }
41
+ },
42
+ "files": [
43
+ "dist",
44
+ "assets",
45
+ "src/service",
46
+ "postcss.config.js",
47
+ "postcss.config.cjs"
48
+ ],
49
+ "dependencies": {
50
+ "autoprefixer": "^10.4.22",
51
+ "axios": "^1.18.1",
52
+ "postcss-pxtorem": "^6.1.0",
53
+ "vue": "^3.3.0"
54
+ },
55
+ "peerDependencies": {
56
+ "naive-ui": "^2.40.0",
57
+ "vue": "^3.3.0"
58
+ },
59
+ "peerDependenciesMeta": {
60
+ "naive-ui": {
61
+ "optional": true
62
+ }
63
+ },
64
+ "devDependencies": {
65
+ "@vitejs/plugin-vue": "^5.0.4",
66
+ "@vitejs/plugin-vue-jsx": "^3.0.2",
67
+ "less": "^4.4.2",
68
+ "naive-ui": "2.43.1",
69
+ "vite": "^5.4.10",
70
+ "vite-plugin-static-copy": "^0.17.0"
71
+ },
72
+ "author": "zkqh-ddh",
73
+ "license": "MIT"
74
+ }
@@ -4,12 +4,14 @@
4
4
  :key="treeSelectKey"
5
5
  :value="treeSelectValue"
6
6
  size="small"
7
- placeholder="请选择本地目录"
7
+ :placeholder="initLoading ? '目录加载中…' : '请选择本地目录'"
8
8
  :consistent-menu-width="false"
9
9
  show-path
10
10
  separator="/"
11
11
  filterable
12
12
  clearable
13
+ :loading="initLoading"
14
+ :disabled="initLoading"
13
15
  :options="treeOptions"
14
16
  :expanded-keys="expandedKeys"
15
17
  :menu-props="{ class: 'plugin_dir_select_tree' }"
@@ -17,7 +19,13 @@
17
19
  :on-load="onLoadTreeNode"
18
20
  @update:expanded-keys="onExpandedKeysUpdate"
19
21
  @update:value="onDirChange" />
20
- <template v-if="diskUsageText">
22
+ <span
23
+ v-if="initLoading"
24
+ class="_pds_loading lc_fs_s">
25
+ <n-spin :size="14" />
26
+ 加载目录中…
27
+ </span>
28
+ <template v-else-if="diskUsageText">
21
29
  <span class="_pds_folder_icon">
22
30
  <i class="lc lc-tuxing1"></i>
23
31
  </span>
@@ -71,6 +79,7 @@ export default defineComponent({
71
79
  const expandedKeys = ref([])
72
80
  const treeSelectKey = ref(0)
73
81
  const defaultDisk = ref({})
82
+ const initLoading = ref(true)
74
83
 
75
84
  const treeSelectValue = computed(() => toTreeKey(modelValue.value))
76
85
 
@@ -86,17 +95,22 @@ export default defineComponent({
86
95
  return Math.min(100, (used / total) * 100)
87
96
  })
88
97
 
89
- const emitDiskInfo = () => {
98
+ const setDirname = (path) => {
99
+ emit("update:modelValue", path ? normalizeDir(path) : "")
100
+ }
101
+
102
+ /**
103
+ * 更新右侧占用;传空则清空
104
+ * @param {object | null} disk
105
+ */
106
+ const applyDisk = (disk) => {
107
+ defaultDisk.value = disk || {}
90
108
  emit("update:diskInfo", {
91
109
  total_size: defaultDisk.value?.total_size || 0,
92
110
  used_size: defaultDisk.value?.used_size || 0,
93
111
  })
94
112
  }
95
113
 
96
- const setDirname = (path) => {
97
- emit("update:modelValue", path)
98
- }
99
-
100
114
  /** 打开新建文件夹弹窗 */
101
115
  const openCreateFolder = (parentPath, e) => {
102
116
  e?.stopPropagation?.()
@@ -144,8 +158,8 @@ export default defineComponent({
144
158
  }
145
159
 
146
160
  /**
147
- * 按路径切分并行 listdir,再挂到树上,保证深层路径可回显
148
- * @param {string} targetPath 默认目录
161
+ * 按路径展开目录树,保证深层路径可回显
162
+ * @param {string} targetPath
149
163
  */
150
164
  const hydrateTreePath = async (targetPath) => {
151
165
  const targetKey = toTreeKey(targetPath)
@@ -223,20 +237,20 @@ export default defineComponent({
223
237
  await hydrateTreePath(newPath)
224
238
  }
225
239
 
226
- const loadDefault = async () => {
240
+ /**
241
+ * @returns {Promise<{ root: string, disk: object } | null>}
242
+ */
243
+ const fetchDefault = async () => {
227
244
  try {
228
245
  const res = await pluginApi.getDefaultDir()
229
246
  if (res.code === 200 && res.data) {
230
- defaultDisk.value = res.data
231
247
  const root = normalizeDir(res.data.root || "")
232
- setDirname(root)
233
- emitDiskInfo()
234
- return root
248
+ return root ? { root, disk: res.data } : null
235
249
  }
236
250
  } catch (e) {
237
251
  console.error(e)
238
252
  }
239
- return ""
253
+ return null
240
254
  }
241
255
 
242
256
  const loadDisks = async () => {
@@ -248,17 +262,51 @@ export default defineComponent({
248
262
  key: toTreeKey(disk.path) || disk.path,
249
263
  isLeaf: false,
250
264
  }))
265
+ return
251
266
  }
252
267
  } catch (e) {
253
- treeOptions.value = []
268
+ console.error(e)
254
269
  }
270
+ treeOptions.value = []
255
271
  }
256
272
 
273
+ /**
274
+ * 并行拉默认目录与磁盘列表;有默认目录则先反填,再展开树
275
+ */
257
276
  const initDirectory = async () => {
258
- await loadDisks()
259
- const root = await loadDefault()
260
- if (root) {
261
- await hydrateTreePath(root)
277
+ initLoading.value = true
278
+ try {
279
+ const [info] = await Promise.all([fetchDefault(), loadDisks()])
280
+ if (!info) {
281
+ setDirname("")
282
+ applyDisk(null)
283
+ return
284
+ }
285
+ setDirname(info.root)
286
+ applyDisk(info.disk)
287
+ await hydrateTreePath(info.root)
288
+ } finally {
289
+ initLoading.value = false
290
+ }
291
+ }
292
+
293
+ /**
294
+ * 写入默认目录并刷新占用;path 为空表示清空
295
+ * @param {string} path
296
+ */
297
+ const syncDefaultDir = async (path) => {
298
+ const next = path ? normalizeDir(path) : ""
299
+ setDirname(next)
300
+ try {
301
+ await pluginApi.setDefaultDir(next)
302
+ if (!next) {
303
+ applyDisk(null)
304
+ return
305
+ }
306
+ const info = await fetchDefault()
307
+ applyDisk(info?.disk || null)
308
+ } catch (e) {
309
+ console.error(e)
262
310
  }
263
311
  }
264
312
 
@@ -271,18 +319,7 @@ export default defineComponent({
271
319
  }
272
320
 
273
321
  const onDirChange = async (path) => {
274
- if (!path) {
275
- setDirname("")
276
- return
277
- }
278
- const next = normalizeDir(path)
279
- setDirname(next)
280
- try {
281
- await pluginApi.setDefaultDir(next)
282
- await loadDefault()
283
- } catch (e) {
284
- console.error(e)
285
- }
322
+ await syncDefaultDir(path || "")
286
323
  }
287
324
 
288
325
  /**
@@ -290,7 +327,7 @@ export default defineComponent({
290
327
  */
291
328
  const onFolderCreated = async ({ parentDir, newPath }) => {
292
329
  await refreshTreeAfterCreate(parentDir, newPath)
293
- await onDirChange(toTreeKey(newPath))
330
+ await syncDefaultDir(toTreeKey(newPath) || newPath)
294
331
  }
295
332
 
296
333
  initDirectory()
@@ -302,6 +339,7 @@ export default defineComponent({
302
339
  expandedKeys,
303
340
  treeSelectKey,
304
341
  treeSelectValue,
342
+ initLoading,
305
343
  diskUsageText,
306
344
  usagePercent,
307
345
  renderTreeLabel,
@@ -10,6 +10,14 @@
10
10
  flex-shrink: 0;
11
11
  }
12
12
 
13
+ ._pds_loading {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ gap: 6px;
17
+ color: var(--lc_text_color_secondary);
18
+ flex-shrink: 0;
19
+ }
20
+
13
21
  ._pds_folder_icon {
14
22
  display: inline-flex;
15
23
  align-items: center;
@@ -1,58 +1,58 @@
1
- /**
2
- * 默认读取平台登录 token
3
- * @returns {string}
4
- */
5
- export const getDefaultToken = () => {
6
- try {
7
- const token = localStorage.getItem("token")
8
- if (!token) return ""
9
- return JSON.parse(token)?.access_token || ""
10
- } catch {
11
- return ""
12
- }
13
- }
14
-
15
- /**
16
- * 默认平台根地址(当前页 origin,或 sys_con.baseURL)
17
- * @returns {string}
18
- */
19
- export const getDefaultUrl = () => {
20
- const base =
21
- (typeof window !== "undefined" && window.sys_con?.baseURL) ||
22
- `${location.protocol}//${location.host}`
23
- return String(base).replace(/\/$/, "")
24
- }
25
-
26
- /**
27
- * 默认插件安装包地址:当前域名端口 + /plugins/main.exe(对应前端 public/plugins/main.exe
28
- * @returns {string}
29
- */
30
- export const getDefaultDownloadUrl = () => {
31
- if (typeof window === "undefined" || !window.location) return "/plugins/main.exe"
32
- return `${window.location.origin}/plugins/main.exe`
33
- }
34
-
35
- /**
36
- * 默认校验:导出 args 需含完整时间范围
37
- * @param {Record<string, any>} args
38
- * @returns {boolean}
39
- */
40
- export const validateTimeRangeArgs = (args = {}) => {
41
- if (!(args.start_time && args.end_time)) {
42
- window.$message?.warning?.("请选择发生时间")
43
- return false
44
- }
45
- return true
46
- }
47
-
48
- /**
49
- * 生成导出默认名称:导出数据_<年><月><日>
50
- * @returns {string}
51
- */
52
- export const buildTaskName = () => {
53
- const d = new Date()
54
- const y = d.getFullYear()
55
- const m = String(d.getMonth() + 1).padStart(2, "0")
56
- const day = String(d.getDate()).padStart(2, "0")
57
- return `导出数据_${y}${m}${day}`
58
- }
1
+ /**
2
+ * 默认读取平台登录 token
3
+ * @returns {string}
4
+ */
5
+ export const getDefaultToken = () => {
6
+ try {
7
+ const token = localStorage.getItem("token")
8
+ if (!token) return ""
9
+ return JSON.parse(token)?.access_token || ""
10
+ } catch {
11
+ return ""
12
+ }
13
+ }
14
+
15
+ /**
16
+ * 默认平台根地址(当前页 origin,或 sys_con.baseURL)
17
+ * @returns {string}
18
+ */
19
+ export const getDefaultUrl = () => {
20
+ const base =
21
+ (typeof window !== "undefined" && window.sys_con?.baseURL) ||
22
+ `${location.protocol}//${location.host}`
23
+ return String(base).replace(/\/$/, "")
24
+ }
25
+
26
+ /**
27
+ * 默认插件安装包地址:当前域名端口 + /plugins.main.exe(由 nginx 代理到前端 dist
28
+ * @returns {string}
29
+ */
30
+ export const getDefaultDownloadUrl = () => {
31
+ if (typeof window === "undefined" || !window.location) return "/plugins/main.exe"
32
+ return `${window.location.origin}/plugins/main.exe`
33
+ }
34
+
35
+ /**
36
+ * 默认校验:导出 args 需含完整时间范围
37
+ * @param {Record<string, any>} args
38
+ * @returns {boolean}
39
+ */
40
+ export const validateTimeRangeArgs = (args = {}) => {
41
+ if (!(args.start_time && args.end_time)) {
42
+ window.$message?.warning?.("请选择发生时间")
43
+ return false
44
+ }
45
+ return true
46
+ }
47
+
48
+ /**
49
+ * 生成导出默认名称:导出数据_<年><月><日>
50
+ * @returns {string}
51
+ */
52
+ export const buildTaskName = () => {
53
+ const d = new Date()
54
+ const y = d.getFullYear()
55
+ const m = String(d.getMonth() + 1).padStart(2, "0")
56
+ const day = String(d.getDate()).padStart(2, "0")
57
+ return `导出数据_${y}${m}${day}`
58
+ }