添加项目文件。

master
陈伟 2025-03-13 09:58:16 +08:00
parent dffc03a785
commit 74fa884eda
12 changed files with 236 additions and 0 deletions

9
App.xaml Normal file
View File

@ -0,0 +1,9 @@
<Application x:Class="Hopytry.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Hopytry"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

14
App.xaml.cs Normal file
View File

@ -0,0 +1,14 @@
using System.Configuration;
using System.Data;
using System.Windows;
namespace Hopytry
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

10
AssemblyInfo.cs Normal file
View File

@ -0,0 +1,10 @@
using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]

8
Config/minio-config.json Normal file
View File

@ -0,0 +1,8 @@
{
"Minio": {
"Endpoint": "your-minio-endpoint",
"AccessKey": "your-access-key",
"SecretKey": "your-secret-key",
"BucketName": "uploads"
}
}

25
Hopetry.csproj Normal file
View File

@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.3" />
<PackageReference Include="Minio" Version="6.0.4" />
<PackageReference Include="WPF-UI" Version="4.0.2" />
</ItemGroup>
<ItemGroup>
<Folder Include="Models\" />
</ItemGroup>
</Project>

13
MainWindow.xaml Normal file
View File

@ -0,0 +1,13 @@
<Window x:Class="Hopytry.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Hopytry"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>

39
MainWindow.xaml.cs Normal file
View File

@ -0,0 +1,39 @@
using System.Collections.ObjectModel;
using System;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Windows;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using FileUploader.Models;
using Hopetry.Services;
namespace Hopytry
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private AppDbContext _db = new AppDbContext();
private MinioService _minioService;
public ObservableCollection<FileRecord> UploadQueue { get; } = new ObservableCollection<FileRecord>();
public bool ShutdownAfterUpload { get; set; }
public MainWindow()
{
InitializeComponent();
}
}
}

18
Models/AppDbContext.cs Normal file
View File

@ -0,0 +1,18 @@
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
namespace FileUploader.Models
{
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<FileRecord> FileRecords { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=fileuploader.db");
optionsBuilder.EnableSensitiveDataLogging();
}
}
}

15
Models/FileRecord.cs Normal file
View File

@ -0,0 +1,15 @@
using System;
namespace FileUploader.Models
{
public class FileRecord
{
public int Id { get; set; }
public string FileName { get; set; }
public string LocalPath { get; set; }
public string MinioPath { get; set; }
public DateTime UploadTime { get; set; } = DateTime.Now;
public int UserId { get; set; }
public User User { get; set; }
}
}

11
Models/User.cs Normal file
View File

@ -0,0 +1,11 @@
using System;
namespace FileUploader.Models
{
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public DateTime CreatedAt { get; set; } = DateTime.Now;
}
}

52
Services/MinioService.cs Normal file
View File

@ -0,0 +1,52 @@
using Minio.DataModel.Args;
using Minio;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using FileUploader.Models;
namespace Hopetry.Services
{
class MinioService
{
private readonly IMinioClient _minioClient;
private readonly string _bucketName;
public MinioService(IConfiguration config)
{
var minioConfig = config.GetSection("Minio");
_minioClient = new MinioClient()
.WithEndpoint(minioConfig["Endpoint"])
.WithCredentials(minioConfig["AccessKey"], minioConfig["SecretKey"]);
_bucketName = minioConfig["BucketName"];
EnsureBucketExistsAsync().Wait();
}
private async Task EnsureBucketExistsAsync()
{
var existsArgs = new BucketExistsArgs().WithBucket(_bucketName);
if (!await _minioClient.BucketExistsAsync(existsArgs))
{
var makeArgs = new MakeBucketArgs().WithBucket(_bucketName);
await _minioClient.MakeBucketAsync(makeArgs);
}
}
public async Task UploadFileAsync(FileRecord fileRecord)
{
var putArgs = new PutObjectArgs()
.WithBucket(_bucketName)
.WithObject(fileRecord.FileName)
.WithFileName(fileRecord.LocalPath)
.WithContentType("application/octet-stream");
await _minioClient.PutObjectAsync(putArgs);
}
}
}

22
外业端.sln Normal file
View File

@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35728.132
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hopetry", "Hopetry.csproj", "{F188B608-9F6D-4C06-8719-50AD6F7C30C1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F188B608-9F6D-4C06-8719-50AD6F7C30C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F188B608-9F6D-4C06-8719-50AD6F7C30C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F188B608-9F6D-4C06-8719-50AD6F7C30C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F188B608-9F6D-4C06-8719-50AD6F7C30C1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal