Compare commits

..

7 Commits

Author SHA1 Message Date
zsyg
3bae74dcbe Update README.md 2025-06-15 11:07:57 +08:00
zsyg
933333bfbf 修改alist为openlist 2025-06-15 11:07:16 +08:00
zsyg
da1e95a11c Add files via upload 2025-06-15 11:06:22 +08:00
zsyg
24a352f67b Add files via upload 2025-06-14 16:41:29 +08:00
zsyg
9dfa777c6d Update log_cleaner.cpp 2025-06-14 10:51:12 +08:00
zsyg
30d1c0c8c6 Update logger.cs 2025-06-14 10:50:39 +08:00
zsyg
efd2c615bc 修改主要程序 2025-06-14 10:05:11 +08:00
13 changed files with 333 additions and 47 deletions

View File

@@ -16,10 +16,13 @@
<ItemGroup> <ItemGroup>
<None Include="help.txt" /> <None Include="help.txt" />
<None Include="resource\aria2c.exe"> <None Include="resource\*.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Include="img\png\WindowsCleaner.png"> <None Include="img\png\*.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="img\jpg\*.jpg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Include="img\ico\icon.ico"> <None Include="img\ico\icon.ico">

View File

@@ -2,76 +2,157 @@
using System; using System;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using AppStore;
namespace AppStore namespace AppStore
{ {
/// <summary>
/// 主窗体类,负责应用程序的主界面显示和交互
/// </summary>
public class MainForm : Form public class MainForm : Form
{ {
// 软件下载按钮
private Button btnApps = null!; private Button btnApps = null!;
// 下载进度按钮
private Button btnDownloads = null!; private Button btnDownloads = null!;
// 设置按钮
private Button btnSettings = null!;
// 内容显示面板
private Panel contentPanel = null!; private Panel contentPanel = null!;
/// <summary>
/// 初始化窗体组件
/// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
// 设置窗体基本属性
// 窗体基本设置 // 窗体基本设置
this.Text = "kortapp-z"; this.Text = "kortapp-z";
this.Size = new Size(1430, 1050); // 增加窗体高度 this.Size = new Size(1430, 1050); // 增加窗体高度
this.MinimumSize = new Size(600, 600); // 设置最小尺寸 this.MinimumSize = new Size(600, 600); // 设置最小尺寸
this.StartPosition = FormStartPosition.CenterScreen; this.StartPosition = FormStartPosition.CenterScreen;
this.Icon = new Icon("img/ico/icon.ico"); this.Icon = new Icon("img/ico/icon.ico"); // 设置窗体图标
// 顶部按钮面板 // 顶部按钮面板
// 创建顶部按钮面板
Panel buttonPanel = new Panel(); Panel buttonPanel = new Panel();
buttonPanel.Dock = DockStyle.Top; buttonPanel.Dock = DockStyle.Top; // 停靠在顶部
buttonPanel.Height = 60; buttonPanel.Height = 60; // 设置高度
buttonPanel.BackColor = Color.LightGray; buttonPanel.BackColor = Color.LightGray; // 设置背景色
// 软件下载按钮 // 软件下载按钮
// 初始化软件下载按钮
// 初始化软件下载按钮
btnApps = new Button(); btnApps = new Button();
btnApps.Text = "软件下载"; btnApps.Text = "软件下载"; // 设置按钮文本
btnApps.Size = new Size(100, 30); btnApps.Size = new Size(100, 30); // 设置按钮大小(宽度,高度)
btnApps.Location = new Point(20, 10); btnApps.Location = new Point(20, 10); // 设置按钮位置(X坐标,Y坐标)
btnApps.Font = new Font("Microsoft YaHei", 9); btnApps.Font = new Font("Microsoft YaHei", 9); // 设置字体(字体名称,字号)
btnApps.Click += (s, e) => ShowAppsView(); btnApps.Click += (s, e) => // 按钮点击事件处理器
{
// 点击后显示软件下载视图
Logger.Log("用户点击了'软件下载'按钮");
ShowAppsView();
};
buttonPanel.Controls.Add(btnApps); buttonPanel.Controls.Add(btnApps);
// 下载进度按钮 // 下载进度按钮
// 初始化下载进度按钮
// 初始化下载进度按钮
btnDownloads = new Button(); btnDownloads = new Button();
btnDownloads.Text = "下载进度"; btnDownloads.Text = "下载进度"; // 设置按钮文本
btnDownloads.Size = new Size(100, 30); btnDownloads.Size = new Size(100, 30); // 设置按钮大小(宽度,高度)
btnDownloads.Location = new Point(140, 10); btnDownloads.Location = new Point(140, 10); // 设置按钮位置(X坐标,Y坐标)
btnDownloads.Font = new Font("Microsoft YaHei", 9); btnDownloads.Font = new Font("Microsoft YaHei", 9); // 设置字体(字体名称,字号)
btnDownloads.Click += (s, e) => ShowDownloadsView(); btnDownloads.Click += (s, e) => // 按钮点击事件处理器
{
// 点击后显示下载进度视图
Logger.Log("用户点击了'下载进度'按钮");
ShowDownloadsView();
};
buttonPanel.Controls.Add(btnDownloads); buttonPanel.Controls.Add(btnDownloads);
this.Controls.Add(buttonPanel); // 设置按钮
// 初始化设置按钮
btnSettings = new Button
{
// 设置按钮属性
Text = "设置",
Size = new Size(100, 30),
Location = new Point(260, 10),
Font = new Font("Microsoft YaHei", 9)
};
btnSettings.Click += (s, e) =>
{
// 点击后显示设置窗口
Logger.Log("用户点击了'设置'按钮");
ShowSettingsView();
};
buttonPanel.Controls.Add(btnSettings);
// 内容区域 // 内容区域
// 初始化内容面板
// 初始化内容显示面板
contentPanel = new Panel(); contentPanel = new Panel();
contentPanel.Dock = DockStyle.Fill; contentPanel.Dock = DockStyle.Fill; // 设置停靠方式为填充剩余空间
contentPanel.Padding = new Padding(10); // 减少内边距 contentPanel.Padding = new Padding(10); // 设置内边距为10像素
this.Controls.Add(contentPanel); this.Controls.Add(contentPanel); // 将面板添加到主窗体
this.Controls.Add(buttonPanel);
// 默认显示软件下载视图 // 默认显示软件下载视图
ShowAppsView(); ShowAppsView();
} }
/// <summary>
/// 显示设置窗口
/// </summary>
private void ShowSettingsView()
{
var settingsForm = new SettingsForm();
settingsForm.ShowDialog(); // 以模态对话框形式显示设置窗口
}
/// <summary>
/// 创建应用卡片
/// </summary>
/// <param name="appName">应用名称</param>
/// <param name="downloadUrl">下载URL</param>
/// <param name="iconPath">图标路径</param>
/// <returns>创建好的应用卡片</returns>
/// <summary>
/// 创建应用卡片控件
/// </summary>
/// <param name="appName">应用名称</param>
/// <param name="downloadUrl">应用下载地址</param>
/// <param name="iconPath">应用图标路径</param>
/// <returns>创建完成的应用卡片对象</returns>
private AppCard CreateAppCard(string appName, string downloadUrl, string iconPath) private AppCard CreateAppCard(string appName, string downloadUrl, string iconPath)
{ {
// 创建新的应用卡片实例
AppCard card = new AppCard(); AppCard card = new AppCard();
card.AppName = appName;
card.DownloadUrl = downloadUrl; // 设置卡片基本属性
card.AppName = appName; // 设置显示的应用名称
card.DownloadUrl = downloadUrl; // 设置下载链接地址
try try
{ {
// 尝试从指定路径加载应用图标
card.AppIcon = Image.FromFile(iconPath); card.AppIcon = Image.FromFile(iconPath);
Logger.Log($"成功创建应用卡片: {appName}, 图标路径: {iconPath}");
} }
catch catch (Exception ex)
{ {
// 图标加载失败时使用系统默认图标
card.AppIcon = SystemIcons.Application.ToBitmap(); card.AppIcon = SystemIcons.Application.ToBitmap();
Logger.LogError($"创建应用卡片时加载图标失败: {appName}, 使用默认图标", ex);
} }
// 更新卡片UI显示
card.UpdateDisplay(); card.UpdateDisplay();
// 返回创建完成的应用卡片
return card; return card;
} }
@@ -98,9 +179,9 @@ namespace AppStore
"img/png/WindowsCleaner.png")); "img/png/WindowsCleaner.png"));
flowPanel.Controls.Add(CreateAppCard( flowPanel.Controls.Add(CreateAppCard(
"Alist", "openlist",
"https://ghproxy.net/https://github.com/AlistGo/alist/releases/download/v3.45.0/alist-windows-amd64.zip", "https://ghproxy.net/https://github.com/OpenListTeam/OpenList/releases/download/beta/openlist-windows-amd64.zip",
"img/png/alist.png")); "img/png/openlist.png"));
flowPanel.Controls.Add(CreateAppCard( flowPanel.Controls.Add(CreateAppCard(
"OpenSpeedy", "OpenSpeedy",
@@ -386,73 +467,136 @@ namespace AppStore
"RIME", "RIME",
"https://objects.githubusercontent.com/github-production-release-asset-2e65be/3777237/08e5cfdc-492c-444a-80b3-f8d8caeb5a2a?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250614%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250614T012552Z&X-Amz-Expires=300&X-Amz-Signature=9d6c9431a037a9e520d506c917b0286f904a538ee6f95063783939b4c9cf9307&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dweasel-0.17.4.0-installer.exe&response-content-type=application%2Foctet-stream", "https://objects.githubusercontent.com/github-production-release-asset-2e65be/3777237/08e5cfdc-492c-444a-80b3-f8d8caeb5a2a?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250614%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250614T012552Z&X-Amz-Expires=300&X-Amz-Signature=9d6c9431a037a9e520d506c917b0286f904a538ee6f95063783939b4c9cf9307&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dweasel-0.17.4.0-installer.exe&response-content-type=application%2Foctet-stream",
"img/png/RIME.png")); "img/png/RIME.png"));
flowPanel.Controls.Add(CreateAppCard(
"PyDebloatX",
"https://ghproxy.net/https://github.com/Teraskull/PyDebloatX/releases/download/1.12.0/PyDebloatX_setup.exe",
"img/ico/PyDebloatX.ico"));
flowPanel.Controls.Add(CreateAppCard(
"DropPoint",
"https://ghproxy.net/https://github.com/GameGodS3/DropPoint/releases/download/v1.2.1/DropPoint-Setup-1.2.1.exe",
"img/png/DropPoint.png"));
flowPanel.Controls.Add(CreateAppCard(
"Dnest",
"https://ghproxy.net/https://github.com/davidkane0526/Dnest/releases/download/V1.3.0/Dnest.exe",
"img/png/Dnest.png"));
flowPanel.Controls.Add(CreateAppCard(
"lockpass",
"https://ghproxy.net/https://github.com/ftyszyx/lockpass/releases/download/v0.0.14/lockpass-0.0.14-win32-x64-setup.exe",
"img/png/lockpass.png"));
flowPanel.Controls.Add(CreateAppCard(
"WinMerge",
"https://downloads.sourceforge.net/winmerge/WinMerge-2.16.48.2-x64-Setup.exe",
"img/png/winmerge.png"));
flowPanel.Controls.Add(CreateAppCard(
"Keypirinha",
"https://ghproxy.net/https://github.com/Keypirinha/Keypirinha/releases/download/v2.26/keypirinha-2.26-x64-portable.7z",
"img/png/Keypirinha.png"));
flowPanel.Controls.Add(CreateAppCard(
"FileBrowser",
"https://ghproxy.net/https://github.com/filebrowser/filebrowser/releases/download/v2.32.0/windows-amd64-filebrowser.zip",
"img/png/FileBrowser.png"));
} }
private FlowLayoutPanel downloadsFlowPanel = new FlowLayoutPanel(); private FlowLayoutPanel downloadsFlowPanel = new FlowLayoutPanel();
private List<DownloadItem> downloadItems = new List<DownloadItem>(); private List<DownloadItem> downloadItems = new List<DownloadItem>();
/// <summary>
/// 主窗体构造函数
/// </summary>
public MainForm() public MainForm()
{ {
Logger.Log("应用程序启动"); // 记录启动日志
// 初始化窗体组件
InitializeComponent(); InitializeComponent();
// 订阅下载管理器事件 // 订阅下载管理器事件
DownloadManager.Instance.DownloadAdded += OnDownloadAdded; DownloadManager.Instance.DownloadAdded += OnDownloadAdded; // 下载添加事件
DownloadManager.Instance.DownloadProgressChanged += OnDownloadProgressChanged; DownloadManager.Instance.DownloadProgressChanged += OnDownloadProgressChanged; // 下载进度变化事件
DownloadManager.Instance.DownloadCompleted += OnDownloadCompleted; DownloadManager.Instance.DownloadCompleted += OnDownloadCompleted; // 下载完成事件
} }
/// <summary>
/// 显示下载视图
/// </summary>
private void ShowDownloadsView() private void ShowDownloadsView()
{ {
contentPanel.Controls.Clear(); contentPanel.Controls.Clear(); // 清空内容面板
// 使用FlowLayoutPanel组织下载项 // 初始化下载项容器面板
downloadsFlowPanel = new FlowLayoutPanel(); downloadsFlowPanel = new FlowLayoutPanel();
downloadsFlowPanel.Dock = DockStyle.Fill; downloadsFlowPanel.Dock = DockStyle.Fill; // 填充整个内容区域
downloadsFlowPanel.AutoScroll = true; downloadsFlowPanel.AutoScroll = true; // 启用自动滚动
downloadsFlowPanel.Padding = new Padding(10, 50, 10, 10); // 增加顶部间距 downloadsFlowPanel.Padding = new Padding(10, 50, 10, 10); // 设置内边距(增加顶部间距)
downloadsFlowPanel.FlowDirection = FlowDirection.TopDown; downloadsFlowPanel.FlowDirection = FlowDirection.TopDown; // 垂直排列下载项
downloadsFlowPanel.WrapContents = false; downloadsFlowPanel.WrapContents = false; // 禁止换行
downloadsFlowPanel.AutoScrollMinSize = new Size(0, 2000); // 增加滑动距离 downloadsFlowPanel.AutoScrollMinSize = new Size(0, 2000); // 设置最小滚动区域
contentPanel.Controls.Add(downloadsFlowPanel); contentPanel.Controls.Add(downloadsFlowPanel); // 添加到内容面板
// 显示所有下载项 // 加载并显示所有下载项
foreach (var item in DownloadManager.Instance.DownloadItems) foreach (var item in DownloadManager.Instance.DownloadItems)
{ {
downloadsFlowPanel.Controls.Add(item); downloadsFlowPanel.Controls.Add(item); // 添加下载项到面板
} }
} }
/// <summary>
/// 处理下载添加事件
/// </summary>
/// <param name="item">新添加的下载项</param>
private void OnDownloadAdded(DownloadItem item) private void OnDownloadAdded(DownloadItem item)
{ {
// 检查是否需要跨线程调用
if (InvokeRequired) if (InvokeRequired)
{ {
Invoke(new Action<DownloadItem>(OnDownloadAdded), item); Invoke(new Action<DownloadItem>(OnDownloadAdded), item);
return; return;
} }
downloadItems.Add(item); Logger.Log($"添加新下载任务: {item.FileName}"); // 记录日志
downloadsFlowPanel?.Controls.Add(item); downloadItems.Add(item); // 添加到下载项列表
downloadsFlowPanel?.Controls.Add(item); // 添加到下载面板显示
} }
/// <summary>
/// 处理下载进度更新事件
/// </summary>
/// <param name="item">进度更新的下载项</param>
private void OnDownloadProgressChanged(DownloadItem item) private void OnDownloadProgressChanged(DownloadItem item)
{ {
// 检查是否需要跨线程调用
if (InvokeRequired) if (InvokeRequired)
{ {
Invoke(new Action<DownloadItem>(OnDownloadProgressChanged), item); Invoke(new Action<DownloadItem>(OnDownloadProgressChanged), item);
return; return;
} }
item.UpdateDisplay(); Logger.Log($"下载进度更新: {item.FileName}, 进度: {item.Progress}%"); // 记录日志
item.UpdateDisplay(); // 更新UI显示
} }
/// <summary>
/// 处理下载完成事件
/// </summary>
/// <param name="item">完成的下载项</param>
private void OnDownloadCompleted(DownloadItem item) private void OnDownloadCompleted(DownloadItem item)
{ {
// 检查是否需要跨线程调用
if (InvokeRequired) if (InvokeRequired)
{ {
Invoke(new Action<DownloadItem>(OnDownloadCompleted), item); Invoke(new Action<DownloadItem>(OnDownloadCompleted), item);
return; return;
} }
item.UpdateDisplay(); Logger.Log($"下载完成: {item.FileName}, 状态: {item.Status}"); // 记录日志
item.UpdateDisplay(); // 更新UI显示
} }
} }
} }

View File

@@ -2,7 +2,7 @@
小立一个flag从不接受广告不停更新 小立一个flag从不接受广告不停更新
![image](https://github.com/user-attachments/assets/7c269d0c-b008-43eb-af19-91d1bacbd360) ![image](https://github.com/user-attachments/assets/7c8e9b82-c5f8-4bfc-a63d-091e1ba8bdb0)
一个简单的Windows应用商店应用提供软件下载和管理功能。 一个简单的Windows应用商店应用提供软件下载和管理功能。

50
SettingsForm.cs Normal file
View File

@@ -0,0 +1,50 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
namespace AppStore
{
public class SettingsForm : Form
{
private Button btnCleanLogs;
public SettingsForm()
{
this.Text = "设置";
this.Size = new Size(400, 300);
this.StartPosition = FormStartPosition.CenterParent;
btnCleanLogs = new Button();
btnCleanLogs.Text = "清理日志";
btnCleanLogs.Size = new Size(150, 40);
btnCleanLogs.Location = new Point(120, 100);
btnCleanLogs.Font = new Font("Microsoft YaHei", 10);
btnCleanLogs.Click += (s, e) => CleanLogs();
this.Controls.Add(btnCleanLogs);
}
private void CleanLogs()
{
try
{
string logCleanerPath = Path.Combine("resource", "log_cleaner.exe");
if (File.Exists(logCleanerPath))
{
Process.Start(logCleanerPath);
MessageBox.Show("日志清理程序已启动", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("日志清理程序未找到", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
Logger.LogError("清理日志时出错", ex);
MessageBox.Show($"清理日志时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

BIN
img/ico/PyDebloatX.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
img/png/Dnest.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

BIN
img/png/DropPoint.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
img/png/Winmerge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
img/png/lockpass.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
img/png/openlist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

41
log_cleaner.cpp Normal file
View File

@@ -0,0 +1,41 @@
#include <iostream>
#include <filesystem>
#include <chrono>
namespace fs = std::filesystem;
int main() {
try {
auto start = std::chrono::high_resolution_clock::now();
// 定义日志目录路径
fs::path logDir = "logs";
size_t deletedCount = 0;
size_t errorCount = 0;
// 检查目录是否存在
if (fs::exists(logDir) && fs::is_directory(logDir)) {
// 遍历并删除所有日志文件
for (const auto& entry : fs::directory_iterator(logDir)) {
try {
if (fs::is_regular_file(entry)) {
fs::remove(entry);
deletedCount++;
}
} catch (const std::exception& e) {
std::cerr << "删除文件失败: " << entry.path() << " - " << e.what() << std::endl;
errorCount++;
}
}
} else {
std::cout << "日志目录不存在,无需清理" << std::endl;
return 0;
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "日志清理完成: " << std::endl;
std::cout << "删除文件数: " << deletedCount << std::endl;
std::cout << "错误数: " << errorCount << std::endl;
std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
} catch (const std::exception& e) {
std::cerr << "发生错误: " << e.what() << std::endl;
return 1;
}
return 0;
}

48
logger.cs Normal file
View File

@@ -0,0 +1,48 @@
using System;
using System.IO;
using System.Text;
namespace AppStore
{
public static class Logger
{
private static readonly string LogsDirectory = "logs";
private static readonly object LockObject = new object();
static Logger()
{
// 确保logs目录存在
if (!Directory.Exists(LogsDirectory))
{
Directory.CreateDirectory(LogsDirectory);
}
}
public static void Log(string message)
{
lock (LockObject)
{
try
{
string fileName = $"{DateTime.Now:yyyyMMddHHmmss}.log";
string filePath = Path.Combine(LogsDirectory, fileName);
using (StreamWriter writer = new StreamWriter(filePath, true, Encoding.UTF8))
{
writer.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}");
}
}
catch (Exception ex)
{
// 日志记录失败时输出到控制台
Console.WriteLine($"日志记录失败: {ex.Message}");
}
}
}
public static void LogError(string message, Exception? ex = null)
{
string errorMessage = $"ERROR: {message}";
if (ex != null)
{
errorMessage += $"\nException: {ex}\nStackTrace: {ex.StackTrace}";
}
Log(errorMessage);
}
}
}

BIN
resource/log_cleaner.exe Normal file

Binary file not shown.