feat: 初始化NewLife Studio项目,完成基础框架与数据管理模块
何炳宏 authored at 2026-05-26 12:09:09
2.44 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>查询 Tab</summary>
public partial class QueryTab : ObservableObject
{
    [ObservableProperty]
    private string _sql = "SELECT * FROM ";

    [ObservableProperty]
    private QueryResult? _result;

    [ObservableProperty]
    private string _title = "查询 1";

    public ResultGridViewModel ResultGrid { get; } = new();

    partial void OnResultChanged(QueryResult? value)
    {
        if (value != null)
        {
            ResultGrid.SetResult(value);
        }
    }
}

/// <summary>SQL 编辑器 ViewModel</summary>
public partial class SqlEditorViewModel : ObservableObject
{
    private readonly IStoreService _storeService;
    private IDbSession? _session;

    [ObservableProperty]
    private ObservableCollection<QueryTab> _tabs = [];

    [ObservableProperty]
    private QueryTab? _activeTab;

    private int _tabCounter;

    public SqlEditorViewModel(IStoreService storeService)
    {
        _storeService = storeService;
    }

    public void SetSession(IDbSession session)
    {
        _session = session;
    }

    [RelayCommand]
    private void NewTab()
    {
        _tabCounter++;
        var tab = new QueryTab
        {
            Title = $"查询 {_tabCounter}"
        };
        Tabs.Add(tab);
        ActiveTab = tab;
    }

    [RelayCommand]
    private void CloseTab(QueryTab? tab)
    {
        if (tab != null)
        {
            Tabs.Remove(tab);
        }
    }

    [RelayCommand]
    private async Task ExecuteAsync()
    {
        if (ActiveTab == null || _session == null)
            return;

        var request = new QueryRequest
        {
            Sql = ActiveTab.Sql,
            MaxRows = 1000,
            TimeoutSeconds = 30
        };

        var result = await _session.ExecuteQueryAsync(request);
        ActiveTab.Result = result;

        // 写入历史
        _ = _storeService.AddQueryHistoryAsync(new QueryHistoryEntry
        {
            Sql = request.Sql,
            ConnectionName = _session.Connection.Name,
            ElapsedMs = result.ElapsedMs,
            RowCount = result.RowCount
        });

        XTrace.WriteLine($"SqlEditor: Executed query, {result.RowCount} rows, {result.ElapsedMs}ms");
    }
}