diff --git a/src/components.d.ts b/src/components.d.ts index 02102df..7b5fc82 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -13,11 +13,13 @@ declare module 'vue' { LanguageSwitcher: typeof import('./components/LanguageSwitcher.vue')['default'] MainConsole: typeof import('./components/index/mainConsole.vue')['default'] MainDrawer: typeof import('./components/index/mainDrawer.vue')['default'] + NodeConfigurator: typeof import('./components/nodeEdit/nodeConfigurator.vue')['default'] NodeList: typeof import('./components/nodeEdit/nodeList.vue')['default'] NodesFloatButton: typeof import('./components/nodeEdit/nodesFloatButton.vue')['default'] NotificationProvider: typeof import('./components/notify/notificationProvider.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + SchemaField: typeof import('./components/nodeEdit/SchemaField.vue')['default'] Spary: typeof import('./components/index/spary.vue')['default'] } } diff --git a/src/components/nodeEdit/SchemaField.vue b/src/components/nodeEdit/SchemaField.vue new file mode 100644 index 0000000..5cc30a1 --- /dev/null +++ b/src/components/nodeEdit/SchemaField.vue @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + {{ label }} + + { + const newObjectValue = { ...value.value }; + newObjectValue[key] = newValue; + value.value = newObjectValue; + }" + /> + + + + + + + + + + Unsupported type: {{ typeName }} for {{label}} + + + + + diff --git a/src/components/nodeEdit/addNode.vue b/src/components/nodeEdit/addNode.vue index 9912fb5..f774e36 100644 --- a/src/components/nodeEdit/addNode.vue +++ b/src/components/nodeEdit/addNode.vue @@ -6,6 +6,7 @@ import {nodeRepository} from "@/entities/node.ts"; import {notify} from "@/components/notify/notifyStore.ts"; import {ConfigurationSchema} from "@/utils/core/configurator/schema/schema.ts"; import {CoreTypes} from "@/utils/core/CoreDef.ts"; +import NodeConfigurator from "@/components/nodeEdit/nodeConfigurator.vue"; const { t } = useI18n() @@ -14,6 +15,7 @@ const props = defineProps<{ groupId: string }>() const allGroups = ref([]) const selectedGroupId = ref(null) const configurationSchema= ref(null) +const nodeConfig = ref(null) const loadGroups = async () => { allGroups.value = await groupRepository.findAll() @@ -24,33 +26,47 @@ const loadGroups = async () => { onMounted(loadGroups) const nodeAlias = ref('') -const nodeArguments = ref(null) const isAdding = ref(false) const isAddDisabled = computed(() => { return !nodeAlias.value || nodeAlias.value.length < 3 || nodeAlias.value.length > 15 || isAdding.value }) +function onConfigurationSchemaChange(value: any) { + console.log('Configuration schema changed:', value); + // 确保设置的值是正确的对象结构 + configurationSchema.value = value; +} + async function addNode() { if (!isAddDisabled.value && selectedGroupId.value !== null) { isAdding.value = true - await nodeRepository.insert({ - created_at: null, - id: null, - updated_at: null, - alias: nodeAlias.value, - arguments: nodeArguments.value, - group_id: selectedGroupId.value - }) - notify(t('addNode.nodeAddedSuccess')) - isAdding.value = false + try { + await nodeRepository.insert({ + created_at: null, + id: null, + updated_at: null, + alias: nodeAlias.value, + arguments: nodeConfig.value || {}, + group_id: selectedGroupId.value + }) + notify(t('addNode.nodeAddedSuccess')) + // Reset form after successful submission + nodeAlias.value = '' + nodeConfig.value = null + } catch (error) { + console.error('Error adding node:', error) + notify(t('addNode.nodeAddedError')) + } finally { + isAdding.value = false + } } } - + + return-object + variant="solo" + @update:modelValue="onConfigurationSchemaChange"> + + + :loading="isAdding"> {{ $t('addNode.addNodeButton') }} diff --git a/src/components/nodeEdit/nodeConfigurator.vue b/src/components/nodeEdit/nodeConfigurator.vue index 83be746..1c28b91 100644 --- a/src/components/nodeEdit/nodeConfigurator.vue +++ b/src/components/nodeEdit/nodeConfigurator.vue @@ -1,14 +1,58 @@ - + + + { + const newConfig = { ...localConfig.value }; + newConfig[key.toString()] = newValue; + localConfig.value = newConfig; + }" + /> + + \ No newline at end of file diff --git a/src/locales/en.json b/src/locales/en.json index f4c11c0..ecfa420 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -32,7 +32,8 @@ "arguments": "Arguments", "addGroupButton": "Add", "groupExists": "Group already exists.", - "groupAdded": "Group added." + "groupAdded": "Group added.", + "nodeType": "Node Type" }, "addNode": { "title": "Add Node", @@ -40,7 +41,8 @@ "nodeAlias": "Node alias", "arguments": "Arguments", "addNodeButton": "Add", - "nodeAddedSuccess": "Node added successfully" + "nodeAddedSuccess": "Node added successfully", + "nodeAddedError": "Error adding node" }, "common": { "save": "Save", diff --git a/src/locales/zh.json b/src/locales/zh.json index e28695b..2b1a057 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -41,7 +41,9 @@ "nodeAlias": "节点别名", "arguments": "参数", "addNodeButton": "添加", - "nodeAddedSuccess": "节点添加成功" + "nodeAddedSuccess": "节点添加成功", + "nodeAddedError": "添加节点时出错", + "nodeType": "节点类型" }, "common": { "save": "保存", diff --git a/src/utils/core/CoreDef.ts b/src/utils/core/CoreDef.ts index 9bd7a07..fab8647 100644 --- a/src/utils/core/CoreDef.ts +++ b/src/utils/core/CoreDef.ts @@ -1,8 +1,8 @@ import {XraySchema} from "@/utils/core/configurator/schema/xray.schema.ts"; -import {ConfigurationSchema} from "@/utils/core/configurator/schema/schema.ts"; +import {createConfigurationSchema} from "@/utils/core/configurator/schema/schema.ts"; import {V2flySchema} from "@/utils/core/configurator/schema/v2fly.schema.ts"; export const CoreTypes = [ - new ConfigurationSchema("xray", XraySchema), - new ConfigurationSchema("v2fly", V2flySchema), + createConfigurationSchema("xray", XraySchema), + createConfigurationSchema("v2fly", V2flySchema), ] \ No newline at end of file diff --git a/src/utils/core/configurator/schema/schema.ts b/src/utils/core/configurator/schema/schema.ts index 6f978a3..7b0bf4f 100644 --- a/src/utils/core/configurator/schema/schema.ts +++ b/src/utils/core/configurator/schema/schema.ts @@ -1,9 +1,13 @@ import {ZodObject} from "zod"; +import { markRaw } from 'vue'; -export class ConfigurationSchema { - constructor( - public readonly name: string, - public readonly schema: ZodObject - ) { - } +// Use a simple plain object type to avoid Proxy issues +export type ConfigurationSchema = { + name: string; + schema: ZodObject; +}; + +export function createConfigurationSchema(name: string, schema: ZodObject): ConfigurationSchema { + // Use markRaw to mark the schema object to prevent Vue from converting it to reactive, thus avoiding Proxy issues + return { name, schema: markRaw(schema) }; } \ No newline at end of file
Unsupported type: {{ typeName }} for {{label}}