diff --git a/packages/backend/src/database/migrations.ts b/packages/backend/src/database/migrations.ts index df72037..6a47164 100644 --- a/packages/backend/src/database/migrations.ts +++ b/packages/backend/src/database/migrations.ts @@ -107,6 +107,20 @@ const definedMigrations: Migration[] = [ ); ` } +, +{ + id: 4, + name: 'Add notes column to connections table', + check: async (db: Database): Promise => { + const notesColumnExists = await columnExists(db, 'connections', 'notes'); + // Only run if the column does NOT exist + return !notesColumnExists; + }, + sql: ` + -- Add the notes column to the connections table, allowing NULL values + ALTER TABLE connections ADD COLUMN notes TEXT NULL; + ` + }, // --- 未来可以添加更多迁移 --- ]; diff --git a/packages/backend/src/database/schema.ts b/packages/backend/src/database/schema.ts index 7925657..b9f3be6 100644 --- a/packages/backend/src/database/schema.ts +++ b/packages/backend/src/database/schema.ts @@ -86,6 +86,7 @@ CREATE TABLE IF NOT EXISTS connections ( encrypted_passphrase TEXT NULL, proxy_id INTEGER NULL, ssh_key_id INTEGER NULL, -- 新增 ssh_key_id 列 +notes TEXT NULL, created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), last_connected_at INTEGER NULL, diff --git a/packages/backend/src/repositories/connection.repository.ts b/packages/backend/src/repositories/connection.repository.ts index d2c0ca6..3e652c3 100644 --- a/packages/backend/src/repositories/connection.repository.ts +++ b/packages/backend/src/repositories/connection.repository.ts @@ -17,6 +17,7 @@ interface ConnectionBase { updated_at: number; last_connected_at: number | null; ssh_key_id?: number | null; // +++ Add ssh_key_id here as well +++ +notes?: string | null; // 新增备注字段 } // ConnectionWithTagsRow implicitly includes 'type' and 'ssh_key_id' via ConnectionBase @@ -35,6 +36,7 @@ export interface FullConnectionData extends ConnectionBase { encrypted_password?: string | null; encrypted_private_key?: string | null; encrypted_passphrase?: string | null; +notes?: string | null; // 新增备注字段 tag_ids?: number[]; } @@ -61,7 +63,7 @@ interface FullConnectionDbRow extends FullConnectionData { export const findAllConnectionsWithTags = async (): Promise => { const sql = ` SELECT - c.id, c.name, c.type, c.host, c.port, c.username, c.auth_method, c.proxy_id, c.ssh_key_id, -- +++ Select ssh_key_id +++ + c.id, c.name, c.type, c.host, c.port, c.username, c.auth_method, c.proxy_id, c.ssh_key_id, c.notes, -- +++ Select ssh_key_id and notes +++ c.created_at, c.updated_at, c.last_connected_at, GROUP_CONCAT(ct.tag_id) as tag_ids_str FROM connections c @@ -87,7 +89,7 @@ export const findAllConnectionsWithTags = async (): Promise => { const sql = ` SELECT - c.id, c.name, c.type, c.host, c.port, c.username, c.auth_method, c.proxy_id, c.ssh_key_id, -- +++ Select ssh_key_id +++ + c.id, c.name, c.type, c.host, c.port, c.username, c.auth_method, c.proxy_id, c.ssh_key_id, c.notes, -- +++ Select ssh_key_id and notes +++ c.created_at, c.updated_at, c.last_connected_at, GROUP_CONCAT(ct.tag_id) as tag_ids_str FROM connections c @@ -140,7 +142,7 @@ export const findFullConnectionById = async (id: number): Promise => { - const sql = `SELECT id, name, type, host, port, username, auth_method, proxy_id, ssh_key_id, created_at, updated_at, last_connected_at FROM connections WHERE name = ?`; + const sql = `SELECT id, name, type, host, port, username, auth_method, proxy_id, ssh_key_id, notes, created_at, updated_at, last_connected_at FROM connections WHERE name = ?`; try { const db = await getDbInstance(); const row = await getDbRow(db, sql, [name]); @@ -154,13 +156,13 @@ export const findFullConnectionById = async (id: number): Promise): Promise => { const now = Math.floor(Date.now() / 1000); const sql = ` - INSERT INTO connections (name, type, host, port, username, auth_method, encrypted_password, encrypted_private_key, encrypted_passphrase, proxy_id, ssh_key_id, created_at, updated_at) -- +++ Add ssh_key_id column +++ - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; // +++ Add placeholder for ssh_key_id +++ + INSERT INTO connections (name, type, host, port, username, auth_method, encrypted_password, encrypted_private_key, encrypted_passphrase, proxy_id, ssh_key_id, notes, created_at, updated_at) -- +++ Add ssh_key_id and notes columns +++ + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; // +++ Add placeholders for ssh_key_id and notes +++ const params = [ data.name ?? null, data.type, // Add type parameter @@ -168,6 +170,7 @@ export const createConnection = async (data: Omit & { tag_ids?: number[] }> ): Promise<{ connectionId: number, originalData: any }[]> => { - const insertConnSql = `INSERT INTO connections (name, type, host, port, username, auth_method, encrypted_password, encrypted_private_key, encrypted_passphrase, proxy_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; // Add type column and placeholder + const insertConnSql = `INSERT INTO connections (name, type, host, port, username, auth_method, encrypted_password, encrypted_private_key, encrypted_passphrase, proxy_id, notes, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; // Add type and notes columns and placeholders const results: { connectionId: number, originalData: any }[] = []; const now = Math.floor(Date.now() / 1000); @@ -356,6 +359,7 @@ export const bulkInsertConnections = async ( connData.encrypted_private_key || null, connData.encrypted_passphrase || null, connData.proxy_id || null, +connData.notes || null, // Add notes parameter now, now ]; try { diff --git a/packages/backend/src/services/connection.service.ts b/packages/backend/src/services/connection.service.ts index 05fbbd6..16b2730 100644 --- a/packages/backend/src/services/connection.service.ts +++ b/packages/backend/src/services/connection.service.ts @@ -130,6 +130,7 @@ export const createConnection = async (input: CreateConnectionInput): Promise props.connectionToEdit, (newVal) => { formData.username = newVal.username; formData.auth_method = newVal.auth_method; formData.proxy_id = newVal.proxy_id ?? null; +formData.notes = newVal.notes ?? ''; // 填充备注 formData.tag_ids = newVal.tag_ids ? [...newVal.tag_ids] : []; // 填充 tag_ids (深拷贝) // +++ 填充 selected_ssh_key_id (如果认证方式是 key) +++ @@ -104,6 +106,7 @@ watch(() => props.connectionToEdit, (newVal) => { Object.assign(formData, initialFormData); formData.tag_ids = []; // 确保 tag_ids 也被重置为空数组 formData.selected_ssh_key_id = null; // 确保添加模式下也重置 +formData.notes = ''; // 重置备注 } }, { immediate: true }); @@ -202,6 +205,7 @@ const handleSubmit = async () => { name: formData.name, host: formData.host, port: formData.port, +notes: formData.notes, // 添加备注 username: formData.username, proxy_id: formData.proxy_id || null, tag_ids: formData.tag_ids || [], // 发送 tag_ids @@ -528,6 +532,13 @@ const testButtonText = computed(() => {
{{ t('tags.loading') }}
{{ t('tags.error', { error: tagStoreError }) }}
+ +
+ + +
diff --git a/packages/frontend/src/components/CommandInputBar.vue b/packages/frontend/src/components/CommandInputBar.vue index e7a82dc..f2d44b1 100644 --- a/packages/frontend/src/components/CommandInputBar.vue +++ b/packages/frontend/src/components/CommandInputBar.vue @@ -1,5 +1,5 @@