File size: 6,969 Bytes
5fc700d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
using ToolHub.Services;
using Microsoft.AspNetCore.Authentication.Cookies;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
// 添加HttpContext访问器
builder.Services.AddHttpContextAccessor();
// 配置FreeSql
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
?? "Data Source=toolhub.db";
builder.Services.AddSingleton<IFreeSql>(provider =>
{
var freeSql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, connectionString)
.UseAutoSyncStructure(true) // 自动同步数据库结构
.Build();
return freeSql;
});
// 注册服务
builder.Services.AddScoped<IToolService, ToolService>();
builder.Services.AddScoped<IUserService, UserService>();
// 配置身份验证
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Admin/Login";
options.LogoutPath = "/Admin/Logout";
options.ExpireTimeSpan = TimeSpan.FromDays(7);
});
var app = builder.Build();
// 初始化数据库和种子数据
using (var scope = app.Services.CreateScope())
{
var freeSql = scope.ServiceProvider.GetRequiredService<IFreeSql>();
// 确保数据库表已创建
freeSql.CodeFirst.SyncStructure<ToolHub.Models.User>();
freeSql.CodeFirst.SyncStructure<ToolHub.Models.Category>();
freeSql.CodeFirst.SyncStructure<ToolHub.Models.Tool>();
freeSql.CodeFirst.SyncStructure<ToolHub.Models.Tag>();
freeSql.CodeFirst.SyncStructure<ToolHub.Models.ToolTag>();
freeSql.CodeFirst.SyncStructure<ToolHub.Models.UserFavorite>();
freeSql.CodeFirst.SyncStructure<ToolHub.Models.UserToolAccess>();
freeSql.CodeFirst.SyncStructure<ToolHub.Models.ToolStatistics>();
// 添加初始数据
await SeedDataAsync(freeSql);
}
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapStaticAssets();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}")
.WithStaticAssets();
app.Run();
// 数据初始化方法
static async Task SeedDataAsync(IFreeSql freeSql)
{
// 检查是否已有数据
var categoryCount = await freeSql.Select<ToolHub.Models.Category>().CountAsync();
if (categoryCount > 0) return;
// 添加分类
var categories = new List<ToolHub.Models.Category>
{
new() { Name = "PDF工具", Description = "PDF文档处理相关工具", Icon = "fas fa-file-pdf", Color = "#dc3545", SortOrder = 1 },
new() { Name = "图片工具", Description = "图片处理和编辑工具", Icon = "fas fa-image", Color = "#165DFF", SortOrder = 2 },
new() { Name = "视频工具", Description = "视频处理和编辑工具", Icon = "fas fa-video", Color = "#FF7D00", SortOrder = 3 },
new() { Name = "文档转换", Description = "各种文档格式转换工具", Icon = "fas fa-file-alt", Color = "#52C41A", SortOrder = 4 },
new() { Name = "数据计算", Description = "数据计算和统计工具", Icon = "fas fa-calculator", Color = "#36CFC9", SortOrder = 5 },
new() { Name = "开发工具", Description = "程序开发相关工具", Icon = "fas fa-code", Color = "#722ED1", SortOrder = 6 },
new() { Name = "文本工具", Description = "文本处理和编辑工具", Icon = "fas fa-font", Color = "#13C2C2", SortOrder = 7 },
new() { Name = "生活娱乐", Description = "日常生活和娱乐工具", Icon = "fas fa-gamepad", Color = "#FA8C16", SortOrder = 8 }
};
await freeSql.Insert(categories).ExecuteAffrowsAsync();
// 添加示例工具
var tools = new List<ToolHub.Models.Tool>
{
new() { Name = "PDF转Word", Description = "高效将PDF文件转换为可编辑的Word文档,保留原始格式和排版",
Icon = "fas fa-file-word", Image = "https://design.gemcoder.com/staticResource/echoAiSystemImages/33769d8fd6cd6c3290700a9a1849a860.png",
CategoryId = 1, IsHot = true, Rating = 4.9m, RatingCount = 1250, ViewCount = 125000, SortOrder = 1 },
new() { Name = "图片压缩", Description = "减小图片文件大小,保持高质量,支持批量处理多种图片格式",
Icon = "fas fa-compress", Image = "https://design.gemcoder.com/staticResource/echoAiSystemImages/34a8fb1fdc206c992dddf5cda0318963.png",
CategoryId = 2, IsHot = true, Rating = 4.8m, RatingCount = 980, ViewCount = 98000, SortOrder = 2 },
new() { Name = "证件照生成", Description = "快速制作符合各国签证和证件要求的标准证件照,支持多种尺寸",
Icon = "fas fa-user-circle", Image = "https://design.gemcoder.com/staticResource/echoAiSystemImages/47b898b061a999bcbb5ee1defbdb6800.png",
CategoryId = 2, IsRecommended = true, Rating = 4.7m, RatingCount = 750, ViewCount = 75000, SortOrder = 3 },
new() { Name = "在线录屏", Description = "无需安装软件,直接在浏览器中录制屏幕、摄像头和音频,支持多种格式导出",
Icon = "fas fa-video", Image = "https://design.gemcoder.com/staticResource/echoAiSystemImages/930732ebbce6d0418fefe467d9f74ebc.png",
CategoryId = 3, IsNew = true, Rating = 4.6m, RatingCount = 520, ViewCount = 52000, SortOrder = 4 },
new() { Name = "PDF转Excel", Description = "将PDF表格数据转换为可编辑的Excel文件",
Icon = "fas fa-file-excel", CategoryId = 4, IsNew = true, Rating = 4.5m, RatingCount = 320, ViewCount = 32000, SortOrder = 5 },
new() { Name = "房贷利率计算器", Description = "计算不同贷款方式下的月供和总利息",
Icon = "fas fa-calculator", CategoryId = 5, Rating = 4.6m, RatingCount = 890, ViewCount = 89000, SortOrder = 6 }
};
await freeSql.Insert(tools).ExecuteAffrowsAsync();
// 添加默认管理员用户
var adminPassword = "admin123"; // 实际应用中应该使用更安全的密码
using var sha256 = System.Security.Cryptography.SHA256.Create();
var hashedBytes = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(adminPassword + "ToolHub_Salt"));
var hashedPassword = Convert.ToBase64String(hashedBytes);
var admin = new ToolHub.Models.User
{
UserName = "admin",
Email = "admin@toolhub.com",
PasswordHash = hashedPassword,
NickName = "管理员",
Role = "Admin"
};
await freeSql.Insert(admin).ExecuteAffrowsAsync();
}
|