From c7ebb1eb86925f6ae89407587e90b42899b6ee9e Mon Sep 17 00:00:00 2001
From: Seany <17074267@qq.com>
Date: Wed, 7 Jan 2026 00:15:04 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=BD=91=E7=AB=99=E5=BA=94?=
=?UTF-8?q?=E7=94=A8=E7=AE=A1=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Atomx.Admin.Client/Models/SiteAppModel.cs | 5 +
.../Atomx.Admin.Client/Pages/Home.razor | 2 +-
.../Pages/SiteApps/SiteAppList.razor | 229 ++-
.../Controllers/SiteAppController.cs | 81 +-
Atomx.Common/Entities/SiteApp.cs | 9 +-
.../Migrations/20260106161128_0.3.Designer.cs | 1532 +++++++++++++++++
Atomx.Data/Migrations/20260106161128_0.3.cs | 29 +
.../Migrations/DataContextModelSnapshot.cs | 4 +
8 files changed, 1835 insertions(+), 56 deletions(-)
create mode 100644 Atomx.Data/Migrations/20260106161128_0.3.Designer.cs
create mode 100644 Atomx.Data/Migrations/20260106161128_0.3.cs
diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/SiteAppModel.cs b/Atomx.Admin/Atomx.Admin.Client/Models/SiteAppModel.cs
index ac11c6a..5293e58 100644
--- a/Atomx.Admin/Atomx.Admin.Client/Models/SiteAppModel.cs
+++ b/Atomx.Admin/Atomx.Admin.Client/Models/SiteAppModel.cs
@@ -18,6 +18,11 @@
///
public string Name { get; set; } = string.Empty;
+ ///
+ /// 介绍
+ ///
+ public string Description { get; set; } = string.Empty;
+
///
/// 是否可用
///
diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Home.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Home.razor
index 14bb3c0..ec85dd7 100644
--- a/Atomx.Admin/Atomx.Admin.Client/Pages/Home.razor
+++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Home.razor
@@ -19,7 +19,7 @@
多语言设置
- 多语言资源设置
+ 网站应用
角色管理
diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/SiteApps/SiteAppList.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/SiteApps/SiteAppList.razor
index 3997660..b7e1d68 100644
--- a/Atomx.Admin/Atomx.Admin.Client/Pages/SiteApps/SiteAppList.razor
+++ b/Atomx.Admin/Atomx.Admin.Client/Pages/SiteApps/SiteAppList.razor
@@ -3,20 +3,243 @@
@inject ILogger Logger
@attribute [Authorize]
-
+
管理后台
系统功能
- 系统工具
+ 网站应用
- Tools
+
+
+
+
+ 网站应用
+
+
+
+
+
+
+
+
+
+
+ @if (context.Enabled)
+ {
+
+
+ }
+ else
+ {
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @if (PagingList.Count > 0)
+ {
+
+ }
+
+
+
+
+
+
@code {
[Parameter]
public string Locale { get; set; } = string.Empty;
+
+ [SupplyParameterFromQuery]
+ int? Page { get; set; }
+
+ [SupplyParameterFromQuery(Name = "size")]
+ int? PageSize { get; set; }
+
+ [SupplyParameterFromForm]
+ SiteAppSearch search { get; set; } = default!;
+
+ [SupplyParameterFromForm]
+ SiteAppModel model { get; set; } = default!;
+ Form editform = null!;
+
+ PagingList PagingList = new();
+ bool loading { get; set; } = true;
+
+ bool drawerVisible;
+ bool isSave = false;
+
+ protected override void OnInitialized()
+ {
+ search ??= new SiteAppSearch();
+ model ??= new SiteAppModel();
+ base.OnInitialized();
+ }
+
+ protected override async Task OnParametersSetAsync()
+ {
+ await LoadList();
+ }
+
+
+ private async Task LoadList()
+ {
+
+ loading = true;
+ var url = "/api/siteapp/search";
+ var apiResult = await HttpService.GetPagingList(url, search ?? new SiteAppSearch(), Page.GetValueOrDefault(1), PageSize.GetValueOrDefault(20));
+ if (apiResult.Success)
+ {
+ if (apiResult.Data != null)
+ {
+ PagingList = apiResult.Data;
+ }
+ }
+ loading = false;
+ StateHasChanged();
+ }
+
+ private void OnSearch(int page)
+ {
+ var queryString = search.BuildQueryString();
+ if (string.IsNullOrEmpty(queryString))
+ {
+ if (page > 1)
+ {
+ Navigation.NavigateTo($"/system/app/list?page={page}");
+ }
+ else
+ {
+ Navigation.NavigateTo($"/system/app/list");
+ }
+ }
+ else
+ {
+ if (page > 1)
+ {
+ Navigation.NavigateTo($"/system/app/list?page={page}&{queryString}");
+ }
+ else
+ {
+ Navigation.NavigateTo($"/system/app/list?{queryString}");
+ }
+ }
+ }
+
+ void OnCreateClick()
+ {
+ model = new();
+ drawerVisible = true;
+ }
+
+ void OnEditClick(SiteApp role)
+ {
+ model = role.Adapt();
+ drawerVisible = true;
+ }
+
+ async Task HandleDeleteConfirmAsync(MouseEventArgs e, long id)
+ {
+ var url = $"/api/siteapp/delete/{id}";
+ var apiResult = await HttpService.Post>(url, new());
+ if (apiResult.Success)
+ {
+ await LoadList();
+ await ModalService.InfoAsync(new ConfirmOptions() { Title = "操作提示", Content = "删除数据成功" });
+ }
+ else
+ {
+ await ModalService.ErrorAsync(new ConfirmOptions() { Title = "操作提示", Content = $"数据删除失败.{apiResult.Message}" });
+ }
+ }
+
+ async Task OnFormFinish()
+ {
+ if (editform.Validate())
+ {
+ var apiResult = new ApiResult();
+ if (model != null)
+ {
+ var url = $"api/siteapp/save";
+ apiResult = await HttpService.Post>(url, model);
+
+ if (apiResult.Success)
+ {
+ ModalService.Success(new ConfirmOptions() { Title = "提示", Content = "数据提交成功!" });
+ CloseDrawer();
+ await LoadList();
+ }
+ else
+ {
+ await ModalService.ErrorAsync(new ConfirmOptions() { Title = "服务异常", Content = apiResult.Message });
+ }
+ }
+ }
+ StateHasChanged();
+ }
+
+ private void OnPageChanged(PaginationEventArgs args)
+ {
+ OnSearch(args.Page);
+ }
+
+ void CloseDrawer()
+ {
+ drawerVisible = false;
+ editform.Reset();
+ }
}
diff --git a/Atomx.Admin/Atomx.Admin/Controllers/SiteAppController.cs b/Atomx.Admin/Atomx.Admin/Controllers/SiteAppController.cs
index 990f21a..e2d0a6d 100644
--- a/Atomx.Admin/Atomx.Admin/Controllers/SiteAppController.cs
+++ b/Atomx.Admin/Atomx.Admin/Controllers/SiteAppController.cs
@@ -3,6 +3,7 @@ using Atomx.Admin.Client.Validators;
using Atomx.Admin.Services;
using Atomx.Common.Entities;
using Atomx.Common.Models;
+using Atomx.Core.Jos;
using Atomx.Data;
using Atomx.Data.CacheServices;
using Atomx.Data.Services;
@@ -24,8 +25,9 @@ namespace Atomx.Admin.Controllers
readonly IMapper _mapper;
readonly DataContext _dbContext;
readonly ICacheService _cacheService;
- private readonly IValidator _validator;
- private readonly IStringLocalizer _localizer;
+ readonly IBackgroundJobService _backgroundService;
+ readonly IValidator _validator;
+ readonly IStringLocalizer _localizer;
///
///
///
@@ -35,7 +37,7 @@ namespace Atomx.Admin.Controllers
///
///
public SiteAppController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dataContext, ICacheService cacheService,
- IValidator validator, IStringLocalizer localizer)
+ IBackgroundJobService backgroundJobService, IValidator validator, IStringLocalizer localizer)
{
_logger = logger;
_identityService = identityService;
@@ -43,6 +45,7 @@ namespace Atomx.Admin.Controllers
_mapper = mapper;
_dbContext = dataContext;
_cacheService = cacheService;
+ _backgroundService = backgroundJobService;
_validator = validator;
_localizer = localizer;
@@ -117,7 +120,7 @@ namespace Atomx.Admin.Controllers
///
///
///
- [HttpPost("add")]
+ [HttpPost("save")]
public IActionResult Add(SiteAppModel model)
{
var result = new ApiResult();
@@ -130,14 +133,31 @@ namespace Atomx.Admin.Controllers
}
try
{
- model.Id = _idCreator.CreateId();
- var message = _mapper.Map(model);
- message.CreateTime = DateTime.UtcNow;
+ if (model.Id > 0)
+ {
+ var data = _dbContext.SiteApps.SingleOrDefault(p => p.Id == model.Id);
+ if (data == null)
+ {
+ result = result.IsFail("数据不存在");
+ return new JsonResult(result);
+ }
- _dbContext.SiteApps.Add(message);
- var count = _dbContext.SaveChanges();
+ data.UpdateTime = DateTime.UtcNow;
- result = result.IsSuccess(count.ToString());
+ int count = _dbContext.SaveChanges();
+ result = result.IsSuccess(count.ToString());
+ }
+ else
+ {
+ model.Id = _idCreator.CreateId();
+ var message = _mapper.Map(model);
+ message.CreateTime = DateTime.UtcNow;
+
+ _dbContext.SiteApps.Add(message);
+
+ var count = _dbContext.SaveChanges();
+ result = result.IsSuccess(count.ToString());
+ }
}
catch (Exception ex)
{
@@ -146,46 +166,7 @@ namespace Atomx.Admin.Controllers
}
return new JsonResult(result);
}
-
- ///
- /// 编辑
- ///
- ///
- ///
- [HttpPost("edit")]
- public IActionResult Edit(SiteAppModel model)
- {
- var result = new ApiResult();
- var validation = _validator.Validate(model);
- if (!validation.IsValid)
- {
- var message = validation.Errors.FirstOrDefault()?.ErrorMessage;
- result = result.IsFail(message ?? string.Empty, null);
- return new JsonResult(result);
- }
-
- var data = _dbContext.SiteApps.SingleOrDefault(p => p.Id == model.Id);
- if (data == null)
- {
- result = result.IsFail("数据不存在");
- return new JsonResult(result);
- }
-
- data.UpdateTime = DateTime.UtcNow;
-
- try
- {
- int count = _dbContext.SaveChanges();
- result = result.IsSuccess(count.ToString());
- }
- catch (Exception ex)
- {
- result = result.IsFail(ex.Message);
- _logger.LogError(ex.Message);
- Console.WriteLine(ex.Message);
- }
- return new JsonResult(result);
- }
+
///
/// 根据ID删除
diff --git a/Atomx.Common/Entities/SiteApp.cs b/Atomx.Common/Entities/SiteApp.cs
index 4b1082a..fecc98a 100644
--- a/Atomx.Common/Entities/SiteApp.cs
+++ b/Atomx.Common/Entities/SiteApp.cs
@@ -17,17 +17,22 @@ namespace Atomx.Common.Entities
public int Id { get; set; }
///
- /// 网站应用类型
+ /// 网站应用类型,
///
public int Type { get; set; }
-
///
/// 网站应用名称
///
[Column(TypeName = "varchar(64)")]
public string Name { get; set; } = string.Empty;
+ ///
+ /// 介绍
+ ///
+ [Column(TypeName = "varchar(512)")]
+ public string Description { get; set; } = string.Empty;
+
///
/// 是否可用
///
diff --git a/Atomx.Data/Migrations/20260106161128_0.3.Designer.cs b/Atomx.Data/Migrations/20260106161128_0.3.Designer.cs
new file mode 100644
index 0000000..f280ead
--- /dev/null
+++ b/Atomx.Data/Migrations/20260106161128_0.3.Designer.cs
@@ -0,0 +1,1532 @@
+//
+using System;
+using Atomx.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace Atomx.Data.Migrations
+{
+ [DbContext(typeof(DataContext))]
+ [Migration("20260106161128_0.3")]
+ partial class _03
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Atomx.Common.Entities.Address", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("AddressDetails")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("City")
+ .IsRequired()
+ .HasColumnType("varchar(100)");
+
+ b.Property("CityId")
+ .HasColumnType("bigint");
+
+ b.Property("Company")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("Count")
+ .HasColumnType("integer");
+
+ b.Property("Country")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("CountryId")
+ .HasColumnType("bigint");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("FullAddress")
+ .IsRequired()
+ .HasColumnType("varchar(1024)");
+
+ b.Property("IsDelete")
+ .HasColumnType("boolean");
+
+ b.Property("IsVirtual")
+ .HasColumnType("boolean");
+
+ b.Property("Latitude")
+ .HasColumnType("decimal(10,6)");
+
+ b.Property("Longitude")
+ .HasColumnType("decimal(10,6)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(128)");
+
+ b.Property("Phone")
+ .IsRequired()
+ .HasColumnType("varchar(20)");
+
+ b.Property("PostalCode")
+ .IsRequired()
+ .HasColumnType("varchar(15)");
+
+ b.Property("Province")
+ .IsRequired()
+ .HasColumnType("varchar(100)");
+
+ b.Property("ProvinceId")
+ .HasColumnType("bigint");
+
+ b.Property("Region")
+ .IsRequired()
+ .HasColumnType("varchar(100)");
+
+ b.Property("RegionId")
+ .HasColumnType("bigint");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("UserId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.ToTable("Addresses");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Admin", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("Avatar")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("LastIp")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("LastLogin")
+ .HasColumnType("timestamptz");
+
+ b.Property("LockoutEndTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("LoginCount")
+ .HasColumnType("integer");
+
+ b.Property("Mobile")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("Password")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("RoleId")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("TimeOffset")
+ .IsRequired()
+ .HasColumnType("varchar(4)");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Username")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Admins");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.AppVersion", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("AppName")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Platform")
+ .HasColumnType("integer");
+
+ b.Property("SiteId")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Version")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("VersionDate")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("VersionState")
+ .HasColumnType("integer");
+
+ b.Property("VersionX")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("VersionY")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("VersionZ")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.HasKey("Id");
+
+ b.ToTable("AppVersions");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Area", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("Abbreviation")
+ .IsRequired()
+ .HasColumnType("varchar(32)");
+
+ b.Property("AllowShipping")
+ .HasColumnType("boolean");
+
+ b.Property("Count")
+ .HasColumnType("integer");
+
+ b.Property("CountryId")
+ .HasColumnType("bigint");
+
+ b.Property("Depth")
+ .HasColumnType("integer");
+
+ b.Property("DisplayOrder")
+ .HasColumnType("integer");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("Initial")
+ .IsRequired()
+ .HasColumnType("varchar(1)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("ParentId")
+ .HasColumnType("bigint");
+
+ b.Property("Path")
+ .IsRequired()
+ .HasColumnType("varchar(100)");
+
+ b.Property("StateProvinceId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.ToTable("Areas");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Category", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("Banner")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("Count")
+ .HasColumnType("integer");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Depth")
+ .HasColumnType("integer");
+
+ b.Property("DisplayOrder")
+ .HasColumnType("integer");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("FilterAttributes")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("Image")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("IsNode")
+ .HasColumnType("boolean");
+
+ b.Property("MetaDescription")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("MetaKeywords")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(25)");
+
+ b.Property("ParentId")
+ .HasColumnType("bigint");
+
+ b.Property("Path")
+ .IsRequired()
+ .HasColumnType("varchar(100)");
+
+ b.Property("SiteId")
+ .HasColumnType("integer");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.HasKey("Id");
+
+ b.ToTable("Categories");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Channel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Config")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("varchar(512)");
+
+ b.Property("DisplayOrder")
+ .HasColumnType("integer");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(20)");
+
+ b.Property("Network")
+ .HasColumnType("integer");
+
+ b.Property("SiteId")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("varchar(20)");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.HasKey("Id");
+
+ b.ToTable("Channels");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Country", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("AllowShipping")
+ .HasColumnType("boolean");
+
+ b.Property("DisplayOrder")
+ .HasColumnType("integer");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("Initial")
+ .IsRequired()
+ .HasColumnType("varchar(1)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("NumericISOCode")
+ .HasColumnType("integer");
+
+ b.Property("ThreeLetterISOCode")
+ .IsRequired()
+ .HasColumnType("varchar(3)");
+
+ b.Property("TwoLetterISOCode")
+ .IsRequired()
+ .HasColumnType("varchar(2)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Countries");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Currency", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("CurrencyCode")
+ .IsRequired()
+ .HasColumnType("varchar(10)");
+
+ b.Property("CustomFormatting")
+ .IsRequired()
+ .HasColumnType("varchar(20)");
+
+ b.Property("DisplayLocale")
+ .IsRequired()
+ .HasColumnType("varchar(15)");
+
+ b.Property("DisplayOrder")
+ .HasColumnType("integer");
+
+ b.Property("EnableDisplay")
+ .HasColumnType("boolean");
+
+ b.Property("EnablePay")
+ .HasColumnType("boolean");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("Rate")
+ .HasColumnType("decimal(16, 4)");
+
+ b.Property("SiteId")
+ .HasColumnType("integer");
+
+ b.Property("Symbolic")
+ .IsRequired()
+ .HasColumnType("varchar(8)");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.HasKey("Id");
+
+ b.ToTable("Currencies");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.CurrencyChannelRelation", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("ChannelId")
+ .HasColumnType("integer");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("CurrencyId")
+ .HasColumnType("integer");
+
+ b.Property("EndTime")
+ .HasColumnType("integer");
+
+ b.Property("Extended")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Rate")
+ .HasColumnType("numeric");
+
+ b.Property("StartTime")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("TimeZone")
+ .HasColumnType("integer");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.HasKey("Id");
+
+ b.ToTable("CurrencyChannelRelations");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Language", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Culture")
+ .IsRequired()
+ .HasColumnType("varchar(25)");
+
+ b.Property("DisplayOrder")
+ .HasColumnType("integer");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("FlagImage")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("ResourceVersion")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.HasKey("Id");
+
+ b.ToTable("Languages");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.LocaleResource", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("LanguageId")
+ .HasColumnType("integer");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasColumnType("varchar(1000)");
+
+ b.HasKey("Id");
+
+ b.ToTable("LocaleResources");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.LocalizedProperty", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("EntityId")
+ .HasColumnType("bigint");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("LanguageId")
+ .HasColumnType("integer");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("LocalizedProperties");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Menu", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("Code")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Depth")
+ .HasColumnType("integer");
+
+ b.Property("DisplayOrder")
+ .HasColumnType("integer");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("Icon")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("IsLink")
+ .HasColumnType("boolean");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(50)");
+
+ b.Property("ParentId")
+ .HasColumnType("bigint");
+
+ b.Property("Path")
+ .IsRequired()
+ .HasColumnType("varchar(100)");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Url")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Menus");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.MessageTemplate", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("Attachments")
+ .IsRequired()
+ .HasColumnType("varchar(1024)");
+
+ b.Property("Body")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasColumnType("varchar(64)");
+
+ b.Property("LanguageId")
+ .HasColumnType("integer");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("SiteId")
+ .HasColumnType("integer");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.HasKey("Id");
+
+ b.ToTable("MessageTemplates");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Permission", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("Category")
+ .IsRequired()
+ .HasColumnType("varchar(128)");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(128)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Permissions");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.Product", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("CategoryId")
+ .HasColumnType("bigint");
+
+ b.Property("CategoryPath")
+ .HasColumnType("varchar(200)");
+
+ b.Property("CorporationId")
+ .HasColumnType("bigint");
+
+ b.Property("CorporationStaffId")
+ .HasColumnType("bigint");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Deleted")
+ .HasColumnType("boolean");
+
+ b.Property("DeletedTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Description")
+ .HasColumnType("varchar(256)");
+
+ b.Property("DisplayOrder")
+ .HasColumnType("integer");
+
+ b.Property("Extended")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Feature")
+ .HasColumnType("varchar(256)");
+
+ b.Property("Image")
+ .HasColumnType("varchar(256)");
+
+ b.Property("InventoryMethod")
+ .HasColumnType("integer");
+
+ b.Property("ManufacturerId")
+ .HasColumnType("bigint");
+
+ b.Property("MarketPrice")
+ .HasColumnType("decimal(18,4)");
+
+ b.Property("MaxWeight")
+ .HasColumnType("decimal(6,2)");
+
+ b.Property("MinWeight")
+ .HasColumnType("decimal(6,2)");
+
+ b.Property("Photos")
+ .HasColumnType("text");
+
+ b.Property("PictureCount")
+ .HasColumnType("integer");
+
+ b.Property("Price")
+ .HasColumnType("decimal(18,4)");
+
+ b.Property("ProductTypeId")
+ .HasColumnType("bigint");
+
+ b.Property("ReviewStatus")
+ .HasColumnType("integer");
+
+ b.Property("SIN")
+ .HasColumnType("varchar(20)");
+
+ b.Property("SalesQuantity")
+ .HasColumnType("integer");
+
+ b.Property("SkuPrices")
+ .HasColumnType("text");
+
+ b.Property("SpecificationJson")
+ .HasColumnType("text");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("StockQuantity")
+ .HasColumnType("integer");
+
+ b.Property("StoreId")
+ .HasColumnType("bigint");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("varchar(256)");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("Weight")
+ .HasColumnType("decimal(6,2)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Products");
+ });
+
+ modelBuilder.Entity("Atomx.Common.Entities.ProductAttribute", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("CategoryId")
+ .HasColumnType("bigint");
+
+ b.Property("ControlType")
+ .HasColumnType("integer");
+
+ b.Property("Count")
+ .HasColumnType("integer");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamptz");
+
+ b.Property("DisplayOrder")
+ .HasColumnType("integer");
+
+ b.Property("IsRequired")
+ .HasColumnType("boolean");
+
+ b.Property