feat: 初始化NewLife Studio项目,完成基础框架与数据管理模块
何炳宏 authored at 2026-05-26 12:09:09
3.03 KiB
NewLife.Studio
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using NewLife.Studio.Core.DTOs;
using NewLife.Studio.Data;
using NewLife.Studio.Store;
using NewLife.Log;

namespace NewLife.Studio.Modules.DataStudio.ViewModels;

/// <summary>连接列表 ViewModel</summary>
public partial class ConnectionListViewModel : ObservableObject
{
    private readonly IStoreService _storeService;
    private readonly IDataProvider _dataProvider;

    [ObservableProperty]
    private ObservableCollection<ConnectionInfo> _connections = [];

    [ObservableProperty]
    private ConnectionInfo? _selectedConnection;

    public event EventHandler<IDbSession>? ConnectionOpened;

    public ConnectionListViewModel(IStoreService storeService, IDataProvider dataProvider)
    {
        _storeService = storeService;
        _dataProvider = dataProvider;
    }

    public async Task LoadAsync()
    {
        var list = await _storeService.ListConnectionsAsync();
        Connections = new ObservableCollection<ConnectionInfo>(list);
        XTrace.WriteLine($"ConnectionList: Loaded {Connections.Count} connections");
    }

    [RelayCommand]
    private async Task AddConnection()
    {
        // 简单实现:添加一个 SQLite 文件连接
        var conn = new ConnectionInfo
        {
            Name = $"SQLite-{DateTime.Now:yyyyMMdd-HHmmss}",
            ConnectionString = "Data Source=:memory:",
            ProviderType = "sqlite"
        };
        await _storeService.SaveConnectionAsync(conn);
        Connections.Add(conn);
        SelectedConnection = conn;
    }

    [RelayCommand]
    private async Task EditConnection()
    {
        if (SelectedConnection == null) return;
        await _storeService.SaveConnectionAsync(SelectedConnection);
    }

    [RelayCommand]
    private async Task DeleteConnection()
    {
        if (SelectedConnection == null) return;
        await _storeService.DeleteConnectionAsync(SelectedConnection.Id);
        Connections.Remove(SelectedConnection);
        SelectedConnection = null;
    }

    [RelayCommand]
    private async Task TestConnection()
    {
        if (SelectedConnection == null) return;
        var ok = await _dataProvider.TestConnectionAsync(SelectedConnection);
        var msg = ok ? "连接测试成功" : "连接测试失败";
        XTrace.WriteLine($"TestConnection: {SelectedConnection.Name} -> {msg}");
    }

    [RelayCommand]
    private async Task OpenConnection()
    {
        if (SelectedConnection == null) return;

        try
        {
            var session = await _dataProvider.OpenSessionAsync(SelectedConnection);
            SelectedConnection.LastUsedAt = DateTime.Now;
            await _storeService.SaveConnectionAsync(SelectedConnection);
            ConnectionOpened?.Invoke(this, session);
            XTrace.WriteLine($"ConnectionList: Opened {SelectedConnection.Name}");
        }
        catch (Exception ex)
        {
            XTrace.WriteLine($"ConnectionList: Failed to open {SelectedConnection.Name}: {ex.Message}");
        }
    }
}