添加页面

This commit is contained in:
yxw
2025-12-17 17:16:11 +08:00
parent da8ac8a22b
commit 903d6d9304
14 changed files with 348 additions and 175 deletions

View File

@@ -27,6 +27,7 @@
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.1" /> <PackageReference Include="Microsoft.Extensions.Http" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="10.0.1" /> <PackageReference Include="Microsoft.Extensions.Localization" Version="10.0.1" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.15.0" /> <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.15.0" />
<PackageReference Include="TinyMCE.Blazor" Version="2.2.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -0,0 +1,24 @@
@page "/content/blog/create"
@page "/content/blog/edit/{id:long}"
@page "/{locale}/content/blog/create"
@page "/{locale}/content/blog/edit/{id:long}"
<PageContainer Title="@(Id > 0 ? "编辑博客文章" : "新增博客文章")">
<Breadcrumb>
<Breadcrumb>
<BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<BreadcrumbItem Href="/content/page/list">内容管理</BreadcrumbItem>
<BreadcrumbItem>博客文章</BreadcrumbItem>
</Breadcrumb>
</Breadcrumb>
<ChildContent>
<h3>Tools</h3>
</ChildContent>
</PageContainer>
@code {
[Parameter]
public string Locale { get; set; } = string.Empty;
[Parameter]
public long? Id { get; set; }
}

View File

@@ -0,0 +1,20 @@
@page "/content/blog/list"
@page "/{locale}/content/blog/list"
<PageContainer Title="博客文章">
<Breadcrumb>
<Breadcrumb>
<BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<BreadcrumbItem Href="/content/page/list">内容管理</BreadcrumbItem>
<BreadcrumbItem>博客文章</BreadcrumbItem>
</Breadcrumb>
</Breadcrumb>
<ChildContent>
<h3>Tools</h3>
</ChildContent>
</PageContainer>
@code {
[Parameter]
public string Locale { get; set; } = string.Empty;
}

View File

@@ -1,5 +1,24 @@
<h3>PageEdit</h3> @page "/content/page/create"
@page "/content/page/edit/{id:long}"
@page "/{locale}/content/page/create"
@page "/{locale}/content/page/edit/{id:long}"
<PageContainer Title="@(Id > 0 ? "编辑主题页面" : "新增主题页面")">
<Breadcrumb>
<Breadcrumb>
<BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<BreadcrumbItem Href="/content/page/list">内容管理</BreadcrumbItem>
<BreadcrumbItem>主题页面</BreadcrumbItem>
</Breadcrumb>
</Breadcrumb>
<ChildContent>
<h3>Tools</h3>
</ChildContent>
</PageContainer>
@code { @code {
[Parameter]
public string Locale { get; set; } = string.Empty;
[Parameter]
public long? Id { get; set; }
} }

View File

@@ -1,8 +1,20 @@
@page "/content/page/list" @page "/content/page/list"
@page "/{locale}/content/page/list"
<PageContainer Title="主题页面">
<h3>PageList</h3> <Breadcrumb>
<Breadcrumb>
<BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<BreadcrumbItem Href="/content/page/list">内容管理</BreadcrumbItem>
<BreadcrumbItem>主题页面</BreadcrumbItem>
</Breadcrumb>
</Breadcrumb>
<ChildContent>
<h3>Tools</h3>
</ChildContent>
</PageContainer>
@code { @code {
[Parameter]
public string Locale { get; set; } = string.Empty;
} }

View File

@@ -0,0 +1,20 @@
@page "/deposit/list"
@page "/{locale}/deposit/list"
<PageContainer Title="储值订单">
<Breadcrumb>
<Breadcrumb>
<BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<BreadcrumbItem Href="/content/page/list">内容管理</BreadcrumbItem>
<BreadcrumbItem>储值订单</BreadcrumbItem>
</Breadcrumb>
</Breadcrumb>
<ChildContent>
<h3>Tools</h3>
</ChildContent>
</PageContainer>
@code {
[Parameter]
public string Locale { get; set; } = string.Empty;
}

View File

@@ -0,0 +1,22 @@
@page "/deposit/detail/{id:long}"
@page "/{locale}/deposit/detail/{id:long}"
<PageContainer Title="@($"订单{Id}详情")">
<Breadcrumb>
<Breadcrumb>
<BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<BreadcrumbItem Href="/content/page/list">内容管理</BreadcrumbItem>
<BreadcrumbItem>主题页面</BreadcrumbItem>
</Breadcrumb>
</Breadcrumb>
<ChildContent>
<h3>Tools</h3>
</ChildContent>
</PageContainer>
@code {
[Parameter]
public string Locale { get; set; } = string.Empty;
[Parameter]
public long? Id { get; set; }
}

View File

@@ -1,5 +1,20 @@
<h3>OrderList</h3> @page "/order/list"
@page "/{locale}/order/list"
<PageContainer Title="购物订单">
<Breadcrumb>
<Breadcrumb>
<BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<BreadcrumbItem Href="/content/page/list">内容管理</BreadcrumbItem>
<BreadcrumbItem>购物订单</BreadcrumbItem>
</Breadcrumb>
</Breadcrumb>
<ChildContent>
<h3>Tools</h3>
</ChildContent>
</PageContainer>
@code { @code {
[Parameter]
public string Locale { get; set; } = string.Empty;
} }

View File

@@ -1,18 +1,25 @@
@page "/product/category/edit" @page "/product/category/edit"
@page "/product/category/edit/{Id:long?}" @page "/product/category/edit/{Id:long?}"
@page "/{locale}/product/category/edit"
@page "/{locale}/product/category/edit/{Id:long?}"
@inject ILogger<CategoryEdit> Logger @inject ILogger<CategoryEdit> Logger
@attribute [Authorize] @attribute [Authorize]
<PageTitle>分类编辑</PageTitle> <PageContainer Title="编辑产品分类">
<Title Level="4">分类信息</Title> <Breadcrumb>
<Breadcrumb>
<Spin Spinning="pageLoading"> <BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<Card Title="" Class="hideborder" <BreadcrumbItem Href="/product/list">系统功能</BreadcrumbItem>
Style="margin-top: 24px;" <BreadcrumbItem>分类管理</BreadcrumbItem>
BodyStyle="padding: 0 32px 40px 32px"> </Breadcrumb>
<Form @ref="editform" Model="@model" LabelColSpan="5" WrapperColSpan="19" OnFinish="OnFormFinishAsync"> </Breadcrumb>
@* @if (languages.Count > 1 && Id > 0) <ChildContent>
<Spin Spinning="pageLoading">
<Card Title="分类信息">
<Form @ref="editform" Model="@model" LabelColSpan="5" WrapperColSpan="19" OnFinish="OnFormFinishAsync">
@* @if (languages.Count > 1 && Id > 0)
{ {
<Tabs ActiveKey="@context.Language" OnTabClick="OnLanguageTabChange"> <Tabs ActiveKey="@context.Language" OnTabClick="OnLanguageTabChange">
<TabPane Key="0"> <TabPane Key="0">
@@ -59,28 +66,33 @@
} }
</Button> <Button Size="@ButtonSize.Large" Type="@ButtonType.Text" Icon="@formModel.Image"></Button> </Button> <Button Size="@ButtonSize.Large" Type="@ButtonType.Text" Icon="@formModel.Image"></Button>
</FormItem> *@ </FormItem> *@
<FormItem Label="Meta描述"> <FormItem Label="Meta描述">
<Input @bind-Value="@context.MetaDescription" Placeholder="Meta描述" /> <Input @bind-Value="@context.MetaDescription" Placeholder="Meta描述" />
</FormItem> </FormItem>
<FormItem Label="Meta关键词"> <FormItem Label="Meta关键词">
<Input @bind-Value="@context.MetaKeywords" Placeholder="Meta关键词" /> <Input @bind-Value="@context.MetaKeywords" Placeholder="Meta关键词" />
</FormItem> </FormItem>
<FormItem Label="显示排序"> <FormItem Label="显示排序">
<Input @bind-Value="@context.DisplayOrder" Placeholder="显示排序" /> <Input @bind-Value="@context.DisplayOrder" Placeholder="显示排序" />
</FormItem> </FormItem>
<FormItem Label="状态"> <FormItem Label="状态">
<Checkbox @bind-Checked="@context.Enabled">启用</Checkbox> <Checkbox @bind-Checked="@context.Enabled">启用</Checkbox>
</FormItem> </FormItem>
<FormItem WrapperCol="new ColLayoutParam { Span = 24, Offset = 5 }"> <FormItem WrapperCol="new ColLayoutParam { Span = 24, Offset = 5 }">
<Button Type="@ButtonType.Primary" HtmlType="submit"> <Button Type="@ButtonType.Primary" HtmlType="submit">
提交保存 提交保存
</Button> </Button>
</FormItem> </FormItem>
</Form> </Form>
</Card> </Card>
</Spin> </Spin>
</ChildContent>
</PageContainer>
@code { @code {
[Parameter]
public string Locale { get; set; } = string.Empty;
[SupplyParameterFromQuery] [SupplyParameterFromQuery]
int? Lang { get; set; } int? Lang { get; set; }

View File

@@ -1,141 +1,153 @@
@page "/category/list" @page "/category/list"
@page "/{locale}/category/list"
@inject ILogger<CategoryList> Logger @inject ILogger<CategoryList> Logger
@attribute [Authorize] @attribute [Authorize]
<PageTitle>分类管理</PageTitle> <PageContainer Title="产品分类管理">
<Title Level="4">菜单管理</Title> <Breadcrumb>
<Card> <Breadcrumb>
<Form @ref="searchForm" Model="search" Layout="FormLayout.Inline" Class="search-form" OnFinish="OnSearchFinish"> <BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<Row Justify="RowJustify.Start" Gutter="16"> <BreadcrumbItem Href="/product/list">系统功能</BreadcrumbItem>
<Col> <BreadcrumbItem>分类管理</BreadcrumbItem>
<FormItem Label="名称"> </Breadcrumb>
<Input @bind-Value="search.Name" Placeholder="名称" AllowClear /> </Breadcrumb>
</FormItem> <ChildContent>
</Col> <Card>
<Form @ref="searchForm" Model="search" Layout="FormLayout.Inline" Class="search-form" OnFinish="OnSearchFinish">
<Row Justify="RowJustify.Start" Gutter="16">
<Col>
<FormItem Label="名称">
<Input @bind-Value="search.Name" Placeholder="名称" AllowClear />
</FormItem>
</Col>
<Col> <Col>
<div class="ant-form-item" style="width:200px;display:flex;"> <div class="ant-form-item" style="width:200px;display:flex;">
<Button Type="ButtonType.Primary" HtmlType="submit">查询</Button> <Button Type="ButtonType.Primary" HtmlType="submit">查询</Button>
<Button Style="margin: 0 8px;" OnClick="OnSearchReset">重置</Button> <Button Style="margin: 0 8px;" OnClick="OnSearchReset">重置</Button>
</div> </div>
</Col> </Col>
</Row> </Row>
</Form> </Form>
</Card> </Card>
<Card Class="mt-3"> <br/>
<Table DataSource="categories" PageSize="100" HidePagination="true" Resizable> <Card Class="mt-3">
<TitleTemplate> <Table DataSource="categories" PageSize="100" HidePagination="true" Resizable>
<Flex Justify="FlexJustify.SpaceBetween"> <TitleTemplate>
菜单列表 <Flex Justify="FlexJustify.SpaceBetween">
<div> 菜单列表
<Button Class="me-3" OnClick="OnCreateClick" Type="ButtonType.Primary">新增</Button> <div>
</div> <Button Class="me-3" OnClick="OnCreateClick" Type="ButtonType.Primary">新增</Button>
</div>
</Flex> </Flex>
</TitleTemplate> </TitleTemplate>
<ColumnDefinitions> <ColumnDefinitions>
<PropertyColumn Property="c=>c.Name" Title="名称"> <PropertyColumn Property="c => c.Name" Title="名称">
<AntDesign.Text>@GetName(context)</AntDesign.Text> <AntDesign.Text>@GetName(context)</AntDesign.Text>
</PropertyColumn> </PropertyColumn>
<PropertyColumn Property="c=>c.Slug" Title="缩略名" Width="80px" Align="ColumnAlign.Center"> <PropertyColumn Property="c => c.Slug" Title="缩略名" Width="80px" Align="ColumnAlign.Center">
</PropertyColumn> </PropertyColumn>
<PropertyColumn Property="c=>c.DisplayOrder" Title="排序" Width="100px" /> <PropertyColumn Property="c => c.DisplayOrder" Title="排序" Width="100px" />
<PropertyColumn Property="c=>c.Enabled" Title="状态" Width="80px" Align="ColumnAlign.Center"> <PropertyColumn Property="c => c.Enabled" Title="状态" Width="80px" Align="ColumnAlign.Center">
@if (context.Enabled) @if (context.Enabled)
{ {
<AntDesign.Text Type="TextElementType.Success"><Icon Type="check" Theme=" IconThemeType.Outline" Width="1.3em" Height="1.3em" /></AntDesign.Text> <AntDesign.Text Type="TextElementType.Success"><Icon Type="check" Theme=" IconThemeType.Outline" Width="1.3em" Height="1.3em" /></AntDesign.Text>
} }
else else
{ {
<Icon Type="close" Theme="IconThemeType.Outline" Width="1.3em" Height="1.3em" /> <Icon Type="close" Theme="IconThemeType.Outline" Width="1.3em" Height="1.3em" />
} }
</PropertyColumn> </PropertyColumn>
<PropertyColumn Property="c=>c.CreateTime" Title="时间" Width="190px" /> <PropertyColumn Property="c => c.CreateTime" Title="时间" Width="190px" />
<ActionColumn Title="操作" Align="ColumnAlign.Right" Width="160px"> <ActionColumn Title="操作" Align="ColumnAlign.Right" Width="160px">
<Space> <Space>
@if (context.IsLast) @if (context.IsLast)
{ {
<SpaceItem> <SpaceItem>
<a Href="@($"/attribute/list?categoryid={context.Id}")">属性</a> <a Href="@($"/attribute/list?categoryid={context.Id}")">属性</a>
</SpaceItem> </SpaceItem>
<SpaceItem> <SpaceItem>
<a Href="@($"/specification/list?categoryid={context.Id}")">规格</a> <a Href="@($"/specification/list?categoryid={context.Id}")">规格</a>
</SpaceItem> </SpaceItem>
} }
<SpaceItem> <SpaceItem>
<Dropdown Trigger="@(new Trigger[] { Trigger.Click })"> <Dropdown Trigger="@(new Trigger[] { Trigger.Click })">
<Overlay> <Overlay>
<Menu> <Menu>
<MenuItem> <MenuItem>
<a @onclick="(e)=>OnEditClick(context)"> <Icon Type="@IconType.Outline.Edit" /> 编辑</a> <a @onclick="(e) => OnEditClick(context)"> <Icon Type="@IconType.Outline.Edit" /> 编辑</a>
</MenuItem> </MenuItem>
<MenuDivider /> <MenuDivider />
<MenuItem> <MenuItem>
<Popconfirm Placement="@Placement.Left" Title="@("删除这条数据无法恢复,您确定要删除吗?")" <Popconfirm Placement="@Placement.Left" Title="@("删除这条数据无法恢复,您确定要删除吗?")"
OnConfirm="@(e=>HandleDeleteConfirmAsync(e,context.Id))" OnConfirm="@(e=>HandleDeleteConfirmAsync(e,context.Id))"
OkText="确定" OkText="确定"
CancelText="取消"> CancelText="取消">
<a> <Icon Type="@IconType.Outline.Delete" /> 删除</a> <a> <Icon Type="@IconType.Outline.Delete" /> 删除</a>
</Popconfirm> </Popconfirm>
</MenuItem> </MenuItem>
</Menu> </Menu>
</Overlay> </Overlay>
<ChildContent> <ChildContent>
<a class="ant-dropdown-link" @onclick:preventDefault> <a class="ant-dropdown-link" @onclick:preventDefault>
<Icon Type="@IconType.Outline.Menu" /> <Icon Type="@IconType.Outline.Menu" />
</a> </a>
</ChildContent> </ChildContent>
</Dropdown> </Dropdown>
</SpaceItem> </SpaceItem>
</Space> </Space>
</ActionColumn> </ActionColumn>
</ColumnDefinitions> </ColumnDefinitions>
</Table> </Table>
</Card> </Card>
<Drawer Closable="true" Width="520" Visible="drawerVisible" Title='("设置菜单")' OnClose="_=>CloseDrawer()"> <Drawer Closable="true" Width="520" Visible="drawerVisible" Title='("设置菜单")' OnClose="_ => CloseDrawer()">
<Form LabelColSpan="5" @ref="@editform" Model="@model" OnFinish="OnFormFinish"> <Form LabelColSpan="5" @ref="@editform" Model="@model" OnFinish="OnFormFinish">
<FluentValidationValidator /> <FluentValidationValidator />
<FormItem Label="名称"> <FormItem Label="名称">
<Input @bind-Value="model.Name" For="(()=>model.Name)" /> <Input @bind-Value="model.Name" For="(()=>model.Name)" />
</FormItem> </FormItem>
<FormItem Label="缩略名"> <FormItem Label="缩略名">
<Input @bind-Value="model.Slug" For="(()=>model.Slug)" /> <Input @bind-Value="model.Slug" For="(()=>model.Slug)" />
</FormItem> </FormItem>
<FormItem Label="上级分类"> <FormItem Label="上级分类">
<Select @bind-Value="@model.ParentId" TItemValue="long" TItem="string" Placeholder="请选择上级分类"> <Select @bind-Value="@model.ParentId" TItemValue="long" TItem="string" Placeholder="请选择上级分类">
<SelectOptions> <SelectOptions>
<SelectOption Value="0L" Label="无" /> <SelectOption Value="0L" Label="无" />
@foreach (var item in categories) @foreach (var item in categories)
{ {
<SelectOption Value="@item.Id" Label="@GetName(item)" /> <SelectOption Value="@item.Id" Label="@GetName(item)" />
} }
</SelectOptions> </SelectOptions>
</Select> </Select>
</FormItem> </FormItem>
<FormItem Label="排序"> <FormItem Label="排序">
<Input @bind-Value="model.DisplayOrder" For="(()=>model.DisplayOrder)" /> <Input @bind-Value="model.DisplayOrder" For="(()=>model.DisplayOrder)" />
</FormItem> </FormItem>
<FormItem Label="状态"> <FormItem Label="状态">
<Checkbox @bind-Value="model.Enabled" For="(()=>model.Enabled)">启用</Checkbox> <Checkbox @bind-Value="model.Enabled" For="(()=>model.Enabled)">启用</Checkbox>
</FormItem> </FormItem>
<FormItem WrapperColOffset="4"> <FormItem WrapperColOffset="4">
<Button Type="ButtonType.Primary" HtmlType="submit" Style="width: 100%;">保存</Button> <Button Type="ButtonType.Primary" HtmlType="submit" Style="width: 100%;">保存</Button>
</FormItem> </FormItem>
</Form> </Form>
</Drawer> </Drawer>
</ChildContent>
</PageContainer>
@code { @code {
[Parameter]
public string Locale { get; set; } = string.Empty;
[SupplyParameterFromQuery] [SupplyParameterFromQuery]
int? Page { get; set; } int? Page { get; set; }

View File

@@ -4,12 +4,12 @@
@attribute [Authorize] @attribute [Authorize]
<PageContainer Title="管理员帐号"> <PageContainer Title="管理员管理">
<Breadcrumb> <Breadcrumb>
<Breadcrumb> <Breadcrumb>
<BreadcrumbItem Href="/">管理后台</BreadcrumbItem> <BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<BreadcrumbItem Href="/admin/list">系统功能</BreadcrumbItem> <BreadcrumbItem Href="/admin/list">系统功能</BreadcrumbItem>
<BreadcrumbItem>版本管理</BreadcrumbItem> <BreadcrumbItem>管理员管理</BreadcrumbItem>
</Breadcrumb> </Breadcrumb>
</Breadcrumb> </Breadcrumb>
<ChildContent> <ChildContent>

View File

@@ -23,11 +23,12 @@
</Flex> </Flex>
</TitleTemplate> </TitleTemplate>
<ColumnDefinitions> <ColumnDefinitions>
<PropertyColumn Property="c => c.Name" Title="语言名称"> <PropertyColumn Property="c => c.Title" Title="语言名称">
</PropertyColumn>
<PropertyColumn Property="c => c.Title" Title="语言标题">
</PropertyColumn> </PropertyColumn>
<PropertyColumn Property="c => c.Name" Title="语言本地化">
</PropertyColumn>
<PropertyColumn Property="c => c.Culture" Title="语言文化" Width="100px" /> <PropertyColumn Property="c => c.Culture" Title="语言文化" Width="100px" />
<PropertyColumn Property="c => c.Enabled" Title="状态" Width="80px" Align="ColumnAlign.Center"> <PropertyColumn Property="c => c.Enabled" Title="状态" Width="80px" Align="ColumnAlign.Center">
@if (context.Enabled) @if (context.Enabled)
@@ -83,10 +84,10 @@
<Form LabelColSpan="5" @ref="@editform" Model="@model" OnFinish="OnFormFinish"> <Form LabelColSpan="5" @ref="@editform" Model="@model" OnFinish="OnFormFinish">
<FluentValidationValidator /> <FluentValidationValidator />
<FormItem Label="语言标题"> <FormItem Label="语言标题">
<Input @bind-Value="model.Title" For="(()=>model.Title)" Placeholder="语言标题" /> <Input @bind-Value="model.Title" For="(()=>model.Title)" Placeholder="语言名称" />
</FormItem> </FormItem>
<FormItem Label="语言名称"> <FormItem Label="语言名称">
<Input @bind-Value="model.Name" For="(()=>model.Name)" Placeholder="语言名称" /> <Input @bind-Value="model.Name" For="(()=>model.Name)" Placeholder="语言本地化" />
</FormItem> </FormItem>
<FormItem Label="语言文化"> <FormItem Label="语言文化">
<SimpleSelect @bind-Value="model.Culture" For="(()=>model.Culture)" Placeholder="语言文化"> <SimpleSelect @bind-Value="model.Culture" For="(()=>model.Culture)" Placeholder="语言文化">

View File

@@ -1,5 +1,20 @@
<h3>UserList</h3> @page "/user/list"
@page "/{locale}/user/list"
<PageContainer Title="用户列表">
<Breadcrumb>
<Breadcrumb>
<BreadcrumbItem Href="/">管理后台</BreadcrumbItem>
<BreadcrumbItem Href="/content/page/list">内容管理</BreadcrumbItem>
<BreadcrumbItem>用户列表</BreadcrumbItem>
</Breadcrumb>
</Breadcrumb>
<ChildContent>
<h3>Tools</h3>
</ChildContent>
</PageContainer>
@code { @code {
[Parameter]
public string Locale { get; set; } = string.Empty;
} }

View File

@@ -17,19 +17,19 @@ namespace Atomx.Common.Entities
public int Id { get; set; } public int Id { get; set; }
/// <summary> /// <summary>
/// 语言名称 /// 语言本地化
/// </summary> /// </summary>
[Column(TypeName = "varchar(50)")] [Column(TypeName = "varchar(50)")]
public string Name { get; set; } = string.Empty; public string Name { get; set; } = string.Empty;
/// <summary> /// <summary>
/// 语言标题 /// 语言名称
/// </summary> /// </summary>
[Column(TypeName = "varchar(50)")] [Column(TypeName = "varchar(50)")]
public string Title { get; set; } = string.Empty; public string Title { get; set; } = string.Empty;
/// <summary> /// <summary>
/// 语言名称 /// 语言文化
/// </summary> /// </summary>
[Column(TypeName = "varchar(25)")] [Column(TypeName = "varchar(25)")]
public string Culture { get; set; } = string.Empty; public string Culture { get; set; } = string.Empty;