Full Code of yupingyong/kite.gateway for AI

master 9f31083395a2 cached
224 files
414.1 KB
101.2k tokens
418 symbols
1 requests
Download .txt
Showing preview only (487K chars total). Download the full file or copy to clipboard to get everything.
Repository: yupingyong/kite.gateway
Branch: master
Commit: 9f31083395a2
Files: 224
Total size: 414.1 KB

Directory structure:
gitextract_jlijv6d0/

├── .dockerignore
├── .gitignore
├── Kite.Gateway.sln
├── README.en.md
├── README.md
├── admin/
│   └── Kite.Gateway.Admin/
│       ├── .config/
│       │   └── dotnet-tools.json
│       ├── App.razor
│       ├── Controllers/
│       │   └── RefreshController.cs
│       ├── Core/
│       │   └── AuthorizationServerStorage.cs
│       ├── Dockerfile
│       ├── GatewayAdminModule.cs
│       ├── Kite.Gateway.Admin.csproj
│       ├── Pages/
│       │   ├── Administrator/
│       │   │   ├── Administrator.razor
│       │   │   ├── Login.razor
│       │   │   ├── Login.razor.css
│       │   │   ├── Logout.razor
│       │   │   ├── Logout.razor.css
│       │   │   ├── NewAdministrator.razor
│       │   │   └── UpdateAdministrator.razor
│       │   ├── Authorization/
│       │   │   └── Authentication.razor
│       │   ├── Error.cshtml
│       │   ├── Error.cshtml.cs
│       │   ├── Home.razor
│       │   ├── Middleware/
│       │   │   ├── Middleware.razor
│       │   │   ├── NewMiddleware.razor
│       │   │   └── UpdateMiddleware.razor
│       │   ├── Node/
│       │   │   ├── NewNode.razor
│       │   │   ├── Node.razor
│       │   │   ├── RefreshConfigure.razor
│       │   │   └── UpdateNode.razor
│       │   ├── PaginationComponent.razor
│       │   ├── ServiceGovernance/
│       │   │   └── ServiceGovernance.razor
│       │   ├── Whitelist/
│       │   │   ├── NewWhitelist.razor
│       │   │   ├── UpdateWhitelist.razor
│       │   │   └── WhiteList.razor
│       │   ├── Yarp/
│       │   │   ├── NewRoute.razor
│       │   │   ├── Route.razor
│       │   │   └── UpdateRoute.razor
│       │   ├── _Host.cshtml
│       │   └── _Layout.cshtml
│       ├── Program.cs
│       ├── Properties/
│       │   └── launchSettings.json
│       ├── Shared/
│       │   ├── MainLayout.razor
│       │   ├── MainLayout.razor.cs
│       │   ├── MainLayout.razor.css
│       │   └── SimpleLayout.razor
│       ├── _Imports.razor
│       ├── appsettings.json
│       └── wwwroot/
│           └── css/
│               ├── open-iconic/
│               │   ├── FONT-LICENSE
│               │   ├── ICON-LICENSE
│               │   ├── README.md
│               │   └── font/
│               │       └── fonts/
│               │           └── open-iconic.otf
│               ├── signin.css
│               └── site.css
├── simples/
│   ├── Kite.Simple.Account/
│   │   ├── Authorization/
│   │   │   ├── ClaimModel.cs
│   │   │   ├── IJwtTokenManager.cs
│   │   │   ├── JwtTokenAuthenticateResult.cs
│   │   │   ├── JwtTokenManager.cs
│   │   │   ├── JwtTokenOptions.cs
│   │   │   └── JwtTokenResult.cs
│   │   ├── Controllers/
│   │   │   ├── AccountController.cs
│   │   │   ├── LoginController.cs
│   │   │   ├── MiddlewareController.cs
│   │   │   └── WeatherForecastController.cs
│   │   ├── Kite.Simple.Account.csproj
│   │   ├── Models/
│   │   │   ├── AccountLoginDto.cs
│   │   │   ├── AccountLoginResultDto.cs
│   │   │   └── CreateAccountDto.cs
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── WeatherForecast.cs
│   │   └── appsettings.json
│   ├── Kite.Simple.Order/
│   │   ├── Controllers/
│   │   │   ├── OrderController.cs
│   │   │   └── WeatherForecastController.cs
│   │   ├── Kite.Simple.Order.csproj
│   │   ├── Models/
│   │   │   └── CreateOrderDto.cs
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── WeatherForecast.cs
│   │   └── appsettings.json
│   └── Kite.SimpleServices.sln
└── src/
    ├── Kite.Gateway.Application/
    │   ├── AdministratorAppService.cs
    │   ├── ApplicationModule.cs
    │   ├── AuthorizationAppService.cs
    │   ├── BaseApplicationService.cs
    │   ├── ConfigureAppService.cs
    │   ├── Kite.Gateway.Application.csproj
    │   ├── MiddlewareAppService.cs
    │   ├── NodeAppService.cs
    │   ├── RefreshAppService.cs
    │   ├── RouteAppService.cs
    │   ├── ServiceGovernanceAppService.cs
    │   └── WhitelistAppService.cs
    ├── Kite.Gateway.Application.Contracts/
    │   ├── ApplicationContractsModule.cs
    │   ├── Dtos/
    │   │   ├── Administrator/
    │   │   │   ├── AdministratorDto.cs
    │   │   │   ├── CreateAdministratorDto.cs
    │   │   │   ├── LoginAdministratorDto.cs
    │   │   │   └── UpdateAdministratorDto.cs
    │   │   ├── Authorization/
    │   │   │   └── SaveAuthenticationDto.cs
    │   │   ├── Middleware/
    │   │   │   ├── CreateMiddlewareDto.cs
    │   │   │   ├── MiddlewareDto.cs
    │   │   │   ├── MiddlewareListDto.cs
    │   │   │   └── UpdateMiddlewareDto.cs
    │   │   ├── Node/
    │   │   │   ├── CreateNodeDto.cs
    │   │   │   ├── NodeDto.cs
    │   │   │   ├── ReloadConfigureDto.cs
    │   │   │   └── UpdateNodeDto.cs
    │   │   ├── RefreshConfigureDto.cs
    │   │   ├── ReverseProxy/
    │   │   │   ├── ClusterDestinationDto.cs
    │   │   │   ├── ClusterDto.cs
    │   │   │   ├── ClusterHealthCheckDto.cs
    │   │   │   ├── CreateRouteDto.cs
    │   │   │   ├── RouteDto.cs
    │   │   │   ├── RouteMainDto.cs
    │   │   │   ├── RoutePageDto.cs
    │   │   │   ├── RouteTransformDto.cs
    │   │   │   └── UpdateRouteDto.cs
    │   │   ├── ServiceGovernance/
    │   │   │   └── ServiceGovernanceConfigureDto.cs
    │   │   ├── ValidateTokenDto.cs
    │   │   └── Whitelist/
    │   │       ├── CreateWhitelistDto.cs
    │   │       ├── UpdateWhitelistDto.cs
    │   │       └── WhitelistDto.cs
    │   ├── Http/
    │   │   └── SimpleHttpException.cs
    │   ├── IAdministratorAppService.cs
    │   ├── IAuthorizationAppService.cs
    │   ├── IConfigureAppService.cs
    │   ├── IMiddlewareAppService.cs
    │   ├── INodeAppService.cs
    │   ├── IRefreshAppService.cs
    │   ├── IRouteAppService.cs
    │   ├── IServiceGovernanceAppService.cs
    │   ├── IWhitelistAppService.cs
    │   ├── Kite.Gateway.Application.Contracts.csproj
    │   ├── KitePageResult.cs
    │   └── KiteResult.cs
    ├── Kite.Gateway.Domain/
    │   ├── Administrator/
    │   │   ├── AdministratorManager.cs
    │   │   └── IAdministratorManager.cs
    │   ├── Authorization/
    │   │   ├── AuthenticationManager.cs
    │   │   ├── ClaimModel.cs
    │   │   ├── IAuthenticationManager.cs
    │   │   ├── IJwtTokenManager.cs
    │   │   ├── JwtTokenManager.cs
    │   │   ├── JwtTokenOptions.cs
    │   │   └── JwtTokenValidationResult.cs
    │   ├── ConfigureManager.cs
    │   ├── DomainModule.cs
    │   ├── Entities/
    │   │   ├── Administrator.cs
    │   │   ├── AuthenticationConfigure.cs
    │   │   ├── Cluster.cs
    │   │   ├── ClusterDestination.cs
    │   │   ├── ClusterHealthCheck.cs
    │   │   ├── Middleware.cs
    │   │   ├── Node.cs
    │   │   ├── Route.cs
    │   │   ├── RouteTransform.cs
    │   │   ├── ServiceGovernanceConfigure.cs
    │   │   └── Whitelist.cs
    │   ├── IConfigureManager.cs
    │   ├── Kite.Gateway.Domain.csproj
    │   ├── Middlewares/
    │   │   ├── IMiddlewareContext.cs
    │   │   ├── IMiddlewareManager.cs
    │   │   ├── MiddlewareManager.cs
    │   │   └── MiddlewareResult.cs
    │   ├── Node/
    │   │   ├── INodeManager.cs
    │   │   └── NodeManager.cs
    │   ├── ReverseProxy/
    │   │   ├── ClusterManager.cs
    │   │   ├── GatewayOptions.cs
    │   │   ├── IClusterManager.cs
    │   │   ├── IRefreshManager.cs
    │   │   ├── IReverseProxyDatabaseStore.cs
    │   │   ├── IRouteManager.cs
    │   │   ├── IYarpManager.cs
    │   │   ├── InDatabaseReloadToken.cs
    │   │   ├── InDatabaseStoreConfig.cs
    │   │   ├── InDatabaseStoreConfigProvider.cs
    │   │   ├── InDatabaseStoreReloadToken.cs
    │   │   ├── Models/
    │   │   │   ├── NacosServiceHostModel.cs
    │   │   │   ├── NacosServiceModel.cs
    │   │   │   └── ServiceGovernanceModel.cs
    │   │   ├── RefreshManager.cs
    │   │   ├── ReverseProxyDatabaseStore.cs
    │   │   ├── RouteManager.cs
    │   │   └── YarpManager.cs
    │   └── Whitelist/
    │       ├── IWhiteListManager.cs
    │       └── WhiteListManager.cs
    ├── Kite.Gateway.Domain.Shared/
    │   ├── DomainSharedModule.cs
    │   ├── Enums/
    │   │   ├── FilterTypeEnum.cs
    │   │   ├── ServiceGovernanceType.cs
    │   │   └── SignalTypeEnum.cs
    │   ├── Kite.Gateway.Domain.Shared.csproj
    │   ├── Options/
    │   │   ├── AuthenticationOption.cs
    │   │   ├── ClusterDestinationOption.cs
    │   │   ├── ClusterHealthCheckOption.cs
    │   │   ├── ClusterOption.cs
    │   │   ├── KiteGatewayOption.cs
    │   │   ├── MiddlewareOption.cs
    │   │   ├── RouteOption.cs
    │   │   ├── RouteTransformOption.cs
    │   │   ├── WhitelistOption.cs
    │   │   └── YarpOption.cs
    │   └── TextHelper.cs
    ├── Kite.Gateway.EntityFrameworkCore/
    │   ├── EntityFrameworkCoreModule.cs
    │   ├── Kite.Gateway.EntityFrameworkCore.csproj
    │   ├── KiteDbContext.cs
    │   └── Migrations/
    │       ├── 20220726095023_Migration_v1.0.0.Designer.cs
    │       ├── 20220726095023_Migration_v1.0.0.cs
    │       ├── 20220727061321_Migration_v1.0.1.Designer.cs
    │       ├── 20220727061321_Migration_v1.0.1.cs
    │       ├── 20220731131935_Migration_v1.0.2.Designer.cs
    │       ├── 20220731131935_Migration_v1.0.2.cs
    │       ├── 20220801073938_Migration_v1.0.3.Designer.cs
    │       ├── 20220801073938_Migration_v1.0.3.cs
    │       └── KiteDbContextModelSnapshot.cs
    └── Kite.Gateway.Web/
        ├── Controllers/
        │   └── RefreshController.cs
        ├── Dockerfile
        ├── Filters/
        │   ├── AbpCoreExceptionFilter.cs
        │   └── KiteCoreActionFilter.cs
        ├── Kite.Gateway.Web.csproj
        ├── Middlewares/
        │   ├── KiteAuthorizationMiddleware.cs
        │   └── KiteExternalMiddleware.cs
        ├── Program.cs
        ├── Properties/
        │   └── launchSettings.json
        ├── WebModule.cs
        └── appsettings.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md

================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# Logs
logs/

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

#屏蔽本地配置文件
appsettings.Development.json

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
node_modules/

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# DNX
project.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# Gateway
src/Pterosaur.Gateway.Web/Logs/*
src/Pterosaur.Gateway.Web.Host/Logs/*
src/Pterosaur.Gateway.IdentityServer/Logs/*
src/Pterosaur.Gateway.HttpApi.Host/Logs/*
src/Pterosaur.Gateway.HttpApi.Host/Logs/*
src/Pterosaur.Gateway.DbMigrator/Logs/*
src/Pterosaur.Gateway.Blazor.Server/Logs/*
src/Pterosaur.Gateway.Blazor.Server.Tiered/Logs/*

================================================
FILE: Kite.Gateway.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32328.378
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kite.Gateway.EntityFrameworkCore", "src\Kite.Gateway.EntityFrameworkCore\Kite.Gateway.EntityFrameworkCore.csproj", "{22772D7B-C655-491D-8CED-3DD6961D59F8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kite.Gateway.Application", "src\Kite.Gateway.Application\Kite.Gateway.Application.csproj", "{FCECED16-7C02-47CC-A325-5D710C9C57D7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kite.Gateway.Domain", "src\Kite.Gateway.Domain\Kite.Gateway.Domain.csproj", "{28CE009E-4E3D-4F06-9811-9A083637A5DC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kite.Gateway.Domain.Shared", "src\Kite.Gateway.Domain.Shared\Kite.Gateway.Domain.Shared.csproj", "{C8BF159F-19BC-4E05-BA6C-BD3BB1D4A397}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CD55B1DC-925D-4B8D-8B43-47AE9A9661BD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "admin", "admin", "{5DCEB584-F097-4769-8172-4FFBA9E1898D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kite.Gateway.Application.Contracts", "src\Kite.Gateway.Application.Contracts\Kite.Gateway.Application.Contracts.csproj", "{E50AB14E-6DB5-4DE3-95EA-BECF1ED6AB75}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kite.Gateway.Admin", "admin\Kite.Gateway.Admin\Kite.Gateway.Admin.csproj", "{45989E3A-AFC8-46B2-A4B7-E38D22E8D93A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kite.Gateway.Web", "src\Kite.Gateway.Web\Kite.Gateway.Web.csproj", "{BA1CBE4F-E321-453F-94D7-F6CE7117851D}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{22772D7B-C655-491D-8CED-3DD6961D59F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{22772D7B-C655-491D-8CED-3DD6961D59F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{22772D7B-C655-491D-8CED-3DD6961D59F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{22772D7B-C655-491D-8CED-3DD6961D59F8}.Release|Any CPU.Build.0 = Release|Any CPU
		{FCECED16-7C02-47CC-A325-5D710C9C57D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{FCECED16-7C02-47CC-A325-5D710C9C57D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{FCECED16-7C02-47CC-A325-5D710C9C57D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{FCECED16-7C02-47CC-A325-5D710C9C57D7}.Release|Any CPU.Build.0 = Release|Any CPU
		{28CE009E-4E3D-4F06-9811-9A083637A5DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{28CE009E-4E3D-4F06-9811-9A083637A5DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{28CE009E-4E3D-4F06-9811-9A083637A5DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{28CE009E-4E3D-4F06-9811-9A083637A5DC}.Release|Any CPU.Build.0 = Release|Any CPU
		{C8BF159F-19BC-4E05-BA6C-BD3BB1D4A397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{C8BF159F-19BC-4E05-BA6C-BD3BB1D4A397}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{C8BF159F-19BC-4E05-BA6C-BD3BB1D4A397}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{C8BF159F-19BC-4E05-BA6C-BD3BB1D4A397}.Release|Any CPU.Build.0 = Release|Any CPU
		{E50AB14E-6DB5-4DE3-95EA-BECF1ED6AB75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{E50AB14E-6DB5-4DE3-95EA-BECF1ED6AB75}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{E50AB14E-6DB5-4DE3-95EA-BECF1ED6AB75}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{E50AB14E-6DB5-4DE3-95EA-BECF1ED6AB75}.Release|Any CPU.Build.0 = Release|Any CPU
		{45989E3A-AFC8-46B2-A4B7-E38D22E8D93A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{45989E3A-AFC8-46B2-A4B7-E38D22E8D93A}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{45989E3A-AFC8-46B2-A4B7-E38D22E8D93A}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{45989E3A-AFC8-46B2-A4B7-E38D22E8D93A}.Release|Any CPU.Build.0 = Release|Any CPU
		{BA1CBE4F-E321-453F-94D7-F6CE7117851D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{BA1CBE4F-E321-453F-94D7-F6CE7117851D}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{BA1CBE4F-E321-453F-94D7-F6CE7117851D}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{BA1CBE4F-E321-453F-94D7-F6CE7117851D}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(NestedProjects) = preSolution
		{22772D7B-C655-491D-8CED-3DD6961D59F8} = {CD55B1DC-925D-4B8D-8B43-47AE9A9661BD}
		{FCECED16-7C02-47CC-A325-5D710C9C57D7} = {CD55B1DC-925D-4B8D-8B43-47AE9A9661BD}
		{28CE009E-4E3D-4F06-9811-9A083637A5DC} = {CD55B1DC-925D-4B8D-8B43-47AE9A9661BD}
		{C8BF159F-19BC-4E05-BA6C-BD3BB1D4A397} = {CD55B1DC-925D-4B8D-8B43-47AE9A9661BD}
		{E50AB14E-6DB5-4DE3-95EA-BECF1ED6AB75} = {CD55B1DC-925D-4B8D-8B43-47AE9A9661BD}
		{45989E3A-AFC8-46B2-A4B7-E38D22E8D93A} = {5DCEB584-F097-4769-8172-4FFBA9E1898D}
		{BA1CBE4F-E321-453F-94D7-F6CE7117851D} = {CD55B1DC-925D-4B8D-8B43-47AE9A9661BD}
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {43E3871F-1034-4291-B5C2-FA50167CC09D}
	EndGlobalSection
EndGlobal


================================================
FILE: README.en.md
================================================
# 基于Yarp的API网关

#### Description
基于Yarp的API网关

#### Software Architecture
Software architecture description

#### Installation

1.  xxxx
2.  xxxx
3.  xxxx

#### Instructions

1.  xxxx
2.  xxxx
3.  xxxx

#### Contribution

1.  Fork the repository
2.  Create Feat_xxx branch
3.  Commit your code
4.  Create Pull Request


#### Gitee Feature

1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4.  The most valuable open source project [GVP](https://gitee.com/gvp)
5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)


================================================
FILE: README.md
================================================
# Kite Api网关

#### 介绍
基于微软反向代理组件Yarp开发的Api网关


#### 软件架构

开发框架 .Net 7 + Abp Vnext 7.0.1 + Blazor(UI框架:BootstrapBlazor)

admin 目录为网关管理后台
simples 目录为服务案例
src 目录为项目源代码目录


#### 使用说明
Supervision
#### 参与贡献

1.  Fork 本仓库
2.  新建 dev_xxx 分支
3.  提交代码
4.  新建 Pull Request



================================================
FILE: admin/Kite.Gateway.Admin/.config/dotnet-tools.json
================================================
{
  "version": 1,
  "isRoot": true,
  "tools": {
    "dotnet-ef": {
      "version": "6.0.8",
      "commands": [
        "dotnet-ef"
      ]
    }
  }
}

================================================
FILE: admin/Kite.Gateway.Admin/App.razor
================================================
<BootstrapBlazorRoot>
    <Router AppAssembly="@typeof(App).Assembly">
        <Found Context="routeData">
            <PageTitle>Kite Gateway System Manager</PageTitle>
            <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
            <FocusOnNavigate RouteData="@routeData" Selector="h1" />
        </Found>
        <NotFound>
            <PageTitle>Not found</PageTitle>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>正在玩命开发中 ...</p>
            </LayoutView>
        </NotFound>
    </Router>
</BootstrapBlazorRoot>

================================================
FILE: admin/Kite.Gateway.Admin/Controllers/RefreshController.cs
================================================
using Kite.Gateway.Application;
using Kite.Gateway.Application.Contracts;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
using Kite.Gateway.Application.Contracts.Dtos;
using Kite.Gateway.Application.Contracts.Dtos.Node;

namespace Kite.Gateway.Admin.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class RefreshController : ControllerBase
    {
        private readonly IConfigureAppService _configureAppService;
        public RefreshController(IConfigureAppService configureAppService)
        {
            _configureAppService = configureAppService;
        }
        [HttpGet("/api/kite/refresh/configure")]
        public async Task<KiteResult<RefreshConfigureDto>> GetConfigureAsync()
        {
            var result= await _configureAppService.GetConfigureAsync(new ReloadConfigureDto() 
            {
                IsReloadAuthentication = true,
                IsReloadMiddleware = true,
                IsReloadWhitelist = true,
                IsReloadYarp = true,
            });
            return result;
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Core/AuthorizationServerStorage.cs
================================================
using Kite.Gateway.Application.Contracts.Dtos.Administrator;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage;
using System;
using System.Linq;
using Microsoft.Extensions.Caching.Memory;
namespace Kite.Gateway.Admin.Core
{
    public class AuthorizationServerStorage
    {
        private readonly IMemoryCache _memoryCache;
        public AuthorizationServerStorage(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }
        /// <summary>
        /// 判断是否已经登录
        /// </summary>
        /// <returns></returns>
        public bool IsLogin()
        {
            if (_memoryCache.TryGetValue("administrator", out AdministratorDto administrator))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 删除登录会话信息
        /// </summary>
        /// <returns></returns>
        public void DeleteServerStorage()
        {
            if (_memoryCache.TryGetValue("administrator", out AdministratorDto administrator))
            {
                _memoryCache.Remove("administrator");
            }
        }
        /// <summary>
        /// 设置登录会话信息
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public void SetServerStorage(AdministratorDto value)
        {
            if (_memoryCache.TryGetValue("administrator", out AdministratorDto administrator))
            {
                _memoryCache.Remove("administrator");
            }
            _memoryCache.Set("administrator", value, DateTimeOffset.Now.AddMinutes(120));
        }
        /// <summary>
        /// 获取登录会话
        /// </summary>
        /// <returns></returns>
        public AdministratorDto GetServerStorage()
        {
            if (_memoryCache.TryGetValue("administrator", out AdministratorDto administrator))
            {
                return administrator;
            }
            else
            {
                return new AdministratorDto();
            }
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Dockerfile
================================================
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["admin/Kite.Gateway.Admin/Kite.Gateway.Admin.csproj", "admin/Kite.Gateway.Admin/"]
COPY ["src/Kite.Gateway.EntityFrameworkCore/Kite.Gateway.EntityFrameworkCore.csproj", "src/Kite.Gateway.EntityFrameworkCore/"]
COPY ["src/Kite.Gateway.Domain/Kite.Gateway.Domain.csproj", "src/Kite.Gateway.Domain/"]
COPY ["src/Kite.Gateway.Domain.Shared/Kite.Gateway.Domain.Shared.csproj", "src/Kite.Gateway.Domain.Shared/"]
COPY ["src/Kite.Gateway.Application/Kite.Gateway.Application.csproj", "src/Kite.Gateway.Application/"]
COPY ["src/Kite.Gateway.Application.Contracts/Kite.Gateway.Application.Contracts.csproj", "src/Kite.Gateway.Application.Contracts/"]
RUN dotnet restore "admin/Kite.Gateway.Admin/Kite.Gateway.Admin.csproj"
COPY . .
WORKDIR "/src/admin/Kite.Gateway.Admin"
RUN dotnet build "Kite.Gateway.Admin.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Kite.Gateway.Admin.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Kite.Gateway.Admin.dll"]

================================================
FILE: admin/Kite.Gateway.Admin/GatewayAdminModule.cs
================================================
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Kite.Gateway.Application;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
using Microsoft.AspNetCore.Http;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Volo.Abp.Json;
using Kite.Gateway.Admin.Core;
using Volo.Abp.AspNetCore;
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.EntityFrameworkCore;
using BootstrapBlazor.Components;
using Microsoft.Extensions.Options;

namespace Kite.Gateway.Admin
{
    [DependsOn(
        typeof(AbpAspNetCoreModule),
         typeof(AbpAutofacModule),
         typeof(ApplicationModule),
         typeof(EntityFrameworkCoreModule)
     )]
    public class GatewayAdminModule:AbpModule
    {
        #region 中间件注入
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.AddMemoryCache();
            context.Services.AddHttpClient();
            ConfigureBlazor(context);
            ConfigureMvc(context);
        }
        private void ConfigureMvc(ServiceConfigurationContext context)
        {
            context.Services.AddControllers();
        }
        /// <summary>
        /// Blazor
        /// </summary>
        /// <param name="context"></param>
        private void ConfigureBlazor(ServiceConfigurationContext context)
        {
            context.Services.AddRazorPages();
            context.Services.AddServerSideBlazor();
            context.Services.AddBootstrapBlazor(options =>
            {
                // 统一设置 Toast 组件自动消失时间
                options.ToastDelay = 4000;
                options.ToastPlacement = Placement.TopEnd;
                options.SupportedCultures = new List<string> { "zh" };

                options.FallbackCulture = "zh";
                options.DefaultCultureInfo = "zh";
            });
            // 增加多语言支持配置信息
            context.Services.AddRequestLocalization<IOptionsMonitor<BootstrapBlazorOptions>>((localizerOption, blazorOption) =>
            {
                blazorOption.OnChange(op => Invoke(op));
                Invoke(blazorOption.CurrentValue);

                void Invoke(BootstrapBlazorOptions option)
                {
                    var supportedCultures = option.GetSupportedCultures();
                    localizerOption.SupportedCultures = supportedCultures;
                    localizerOption.SupportedUICultures = supportedCultures;
                }
            });
        }
        
        #endregion
        public override void OnApplicationInitialization(ApplicationInitializationContext context)
        {
            var app = context.GetApplicationBuilder();
            var env = context.GetEnvironment();

            var option = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
            if (option != null)
            {
                app.UseRequestLocalization(option.Value);
            }
            app.UseStaticFiles();
            app.UseRouting();

            app.UseExceptionHandler("/Error");
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Kite.Gateway.Admin.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
    <DockerfileContext>..\..</DockerfileContext>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <NoWarn>1701;1702;8601;8602;8618;8625;</NoWarn>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <NoWarn>1701;1702;8601;8602;8618;8625;</NoWarn>
  </PropertyGroup>

  <ItemGroup>
    <Compile Remove="Models\**" />
    <Content Remove="Models\**" />
    <EmbeddedResource Remove="Models\**" />
    <None Remove="Models\**" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="BootstrapBlazor" Version="7.2.4" />
    <PackageReference Include="BootstrapBlazor.FontAwesome" Version="7.0.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Volo.Abp.AspNetCore" Version="7.0.1" />
    <PackageReference Include="Volo.Abp.Autofac" Version="7.0.1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\src\Kite.Gateway.Application\Kite.Gateway.Application.csproj" />
    <ProjectReference Include="..\..\src\Kite.Gateway.EntityFrameworkCore\Kite.Gateway.EntityFrameworkCore.csproj" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="wwwroot\upload\" />
    <Folder Include="data\" />
  </ItemGroup>

</Project>


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Administrator/Administrator.razor
================================================
@page "/Administrator"

@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Administrator
@using Mapster
@using Kite.Gateway.Domain.Shared.Enums
@inject ToastService ToastService
@inject IAdministratorAppService AdministratorAppService

<div class="row">
    <div class="col=12">
        <Button OnClick="@OnAddAsync" Color="Color.Primary">添加管理员</Button>
    </div>
</div>
<div class="row" style="margin-top:10px;">
    <table class="table">
      <thead class="table-light">
        <tr>
            <th>管理员名</th>
            <th>昵称</th>
            <th>创建时间</th>
            <th>更新时间</th>
            <th>操作</th>
        </tr>
      </thead>
      <tbody>
          @if(Administrators!=null&&Administrators.Any())
          {
              foreach(var item in Administrators)
              {
                <tr>
                    <td>@item.AdminName</td>
                    <td>@item.NickName</td>
                    <td>@item.Created</td>
                    <td>@item.Updated</td>
                    <td>
                        <div class="btn-group" role="group">
                            <Button Color="Color.Info" Size="Size.ExtraSmall" OnClick="@(e=>OnUpdateAsync(item.Id))">编辑</Button>
                            <PopConfirmButton  Size="Size.ExtraSmall" Placement="Placement.Bottom" Color="Color.Danger" ConfirmIcon="fa fa-exclamation-triangle text-danger"
                  ConfirmButtonColor="Color.Danger" Text="删除" Content="确定删除数据吗?" Icon="fa fa-fa fa-fw" IsAsync="true"
                  OnConfirm="@(()=>OnDeleteAsync(item.Id))" />
                        </div>
                    </td>
                </tr>
              }
            }
        </tbody>
    </table>
    
</div>
<div class="row col-12"  style="margin-top:15px;">
    <Pagination PageItems="@PageSize" PageItemsSource="@(new int[] { 10,20 })" TotalCount="@TotalCount" OnPageClick="@OnPageClick" OnPageItemsChanged="@OnPageItemsChanged"></Pagination>
</div>

<Modal @ref="Modal">
    <ModalDialog  IsScrolling="true" Title="添加管理员" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
          <NewAdministrator OnClickCallback="OnAddCallbackAsync"></NewAdministrator>
        </BodyTemplate>
    </ModalDialog>
</Modal>

<Modal @ref="UpdateModal">
    <ModalDialog  IsScrolling="true" Title="管理员编辑" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
           <UpdateAdministrator Model="@UpdateModel" OnClickCallback="OnUpdateCallbackAsync"></UpdateAdministrator>
        </BodyTemplate>
    </ModalDialog>
</Modal>

@code {
    private Modal Modal;

    private Modal UpdateModal;

    public UpdateAdministratorDto UpdateModel { get; set; }
    //分页数据

    private List<AdministratorDto>? Administrators { get; set; }

    private int TotalCount { get; set; } = 0;
    private int PageSize { get; set; } = 10;
    private int PageIndex { get; set; } = 1;
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        OnQueryAsync();
        base.OnInitialized();
    }
    #region 管理员编辑更新
    private async void OnUpdateAsync(Guid id)
    {
        UpdateModel= await GetAsync(id);
        await UpdateModal.Toggle();
    }
    private async Task<UpdateAdministratorDto> GetAsync(Guid id)
    {
        var result = await AdministratorAppService.GetAsync(id);
        if (result.Code != 0 || result.Data == null)
        {
            await ToastService.Warning("系统警告", "数据不存在");
        }
        var model= TypeAdapter.Adapt<UpdateAdministratorDto>(result.Data);
        return model;
    }
    private async void OnUpdateCallbackAsync()
    {
        await UpdateModal.Close();
        OnQueryAsync();
    }
    #endregion
    #region 新增管理员
    private async void OnAddAsync()
    {
        await Modal.Toggle();
    }
    private async void OnAddCallbackAsync()
    {
        await Modal.Close();
        OnQueryAsync();
    }
    #endregion
    private async Task OnDeleteAsync(Guid id)
    {
        var result= await AdministratorAppService.DeleteAsync(id);
        if (result.Code == 0)
        {
            OnQueryAsync();
            await ToastService.Success("系统通知","数据删除成功!");
            return;
        }
        await ToastService.Warning("系统警告","数据删除失败");
    }

    private Task OnPageClick(int pageIndex, int pageItems)
    {
        PageIndex = pageIndex;
        OnQueryAsync();
        return Task.CompletedTask;
    }
    private Task OnPageItemsChanged(int pageItems)
    {
        PageIndex=1;
        PageSize = pageItems;
        OnQueryAsync();
        return Task.CompletedTask;
    }

    private async void OnQueryAsync()
    {
        var result = await AdministratorAppService.GetListAsync(PageIndex, PageSize);

        if (result.Code == 0)
        {
            Administrators = result.Data;
            TotalCount = result.Count;
            StateHasChanged();
        }
        else
        {
            await ToastService.Warning("系统警告", "数据加载失败");
        }
    }

}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Administrator/Login.razor
================================================
@page "/Login"
@layout SimpleLayout

@using Kite.Gateway.Admin.Core
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Administrator
@using Mapster
@using Kite.Gateway.Domain.Shared.Enums
@inject ToastService ToastService
@inject NavigationManager NavigationManager
@inject IAdministratorAppService AdministratorAppService
@inject AuthorizationServerStorage AuthorizationServerStorage


<main class="form-signin text-center">
  <ValidateForm Model="@LoginAdministrator"  OnValidSubmit="@OnLoginAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
    <img class="mb-4" src="/images/kitelogo.png" alt="" width="72" height="57">
    <h1 class="h3 mb-3 fw-normal">Kite Gateway</h1>

    <div class="form-floating">
      <input type="text" class="form-control" @bind-value="LoginAdministrator.AdminName" id="floatingInput" placeholder="请输入管理员账号名">
            <label for="floatingInput" style="text-align:left;">账号名:<em style="color:red">*</em></label>
    </div>
    <div class="form-floating">
      <input type="password" class="form-control" @bind-value="LoginAdministrator.Password" id="floatingPassword" placeholder="请输入管理员密码">
      <label for="floatingPassword" style="text-align:left;">登录密码:<em style="color:red">*</em></label>
    </div>
    <Button ButtonType="ButtonType.Submit"  class="w-100 btn btn-lg btn-primary" IsAsync="true" Color="Color.Primary">登 录</Button>
@*    <button class="w-100 btn btn-lg btn-primary" type="submit">登录</button>*@
  </ValidateForm>
</main>

@code {
    //表单数据
    private LoginAdministratorDto LoginAdministrator { get; set; }= new LoginAdministratorDto();
    private EditContext? editContext;
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        editContext = new(LoginAdministrator);
        base.OnInitialized();
    }
    private Task OnInvalidSubmitAsync(EditContext editContext)
    {
        return Task.CompletedTask;
    }
    private async Task OnLoginAsync(EditContext editContext)
    {
        try
        {
            if (string.IsNullOrEmpty(LoginAdministrator.AdminName) || LoginAdministrator.AdminName.Trim() == "")
            {
                await ToastService.Warning("系统警告","管理员账号名不能为空");
                return;
            }
            if (string.IsNullOrEmpty(LoginAdministrator.Password) || LoginAdministrator.Password.Trim() == "")
            {
                await ToastService.Warning("系统警告","管理员密码不能为空");
                return;
            }
            var result = await AdministratorAppService.LoginAsync(LoginAdministrator);
            if (result.Code != 0)
            {
                await ToastService.Warning("系统警告",result.Message);
            }
            else
            {
                AuthorizationServerStorage.SetServerStorage(result.Data);
                NavigationManager.NavigateTo("/");
            }
            await Task.CompletedTask;    
        }
        catch (Exception ex)
        {
            await ToastService.Warning("系统警告", ex.Message);
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Administrator/Login.razor.css
================================================
html,
body {
    height: 100%;
}

body {
    display: flex;
    align-items: center;
    padding-top: 40px;
    padding-bottom: 40px;
    background-color: #f5f5f5;
}

.form-signin {
    width: 100%;
    max-width: 330px;
    padding: 15px;
    margin: auto;
    margin-top:260px;
}

    .form-signin .checkbox {
        font-weight: 400;
    }

    .form-signin .form-floating:focus-within {
        z-index: 2;
    }

    .form-signin input[type="email"] {
        margin-bottom: -1px;
        border-bottom-right-radius: 0;
        border-bottom-left-radius: 0;
    }

    .form-signin input[type="password"] {
        margin-bottom: 10px;
        border-top-left-radius: 0;
        border-top-right-radius: 0;
    }

.bd-placeholder-img {
    font-size: 1.125rem;
    text-anchor: middle;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
}

@media (min-width: 768px) {
    .bd-placeholder-img-lg {
        font-size: 3.5rem;
    }
}

================================================
FILE: admin/Kite.Gateway.Admin/Pages/Administrator/Logout.razor
================================================
@page "/Logout"
@using System
@layout SimpleLayout
@using Kite.Gateway.Admin.Core
@using Mapster
@using Kite.Gateway.Domain.Shared.Enums
@inject ToastService ToastService
@inject NavigationManager NavigationManager
@inject AuthorizationServerStorage AuthorizationServerStorage


<main class="form-signin text-center">
  <form>
    <img class="mb-4" src="/images/kitelogo.png" alt="" width="72" height="57">
    <h1 class="h3 mb-3 fw-normal">正在退出登录...</h1>
    <Spinner Color="Color.Primary"></Spinner>
  </form>
</main>

@code {
    protected override void OnInitialized()
    {
        base.OnInitialized();
        //如果没有登录则跳转到登录页面
        if (!AuthorizationServerStorage.IsLogin())
        {
            NavigationManager.NavigateTo("/Login");
        }
        else
        {
            //清理服务器登录存储信息
            AuthorizationServerStorage.DeleteServerStorage();
            //跳转到登录页面
            NavigationManager.NavigateTo("/Login");
           
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Administrator/Logout.razor.css
================================================
html,
body {
    height: 100%;
}

body {
    display: flex;
    align-items: center;
    padding-top: 40px;
    padding-bottom: 40px;
    background-color: #f5f5f5;
}

.form-signin {
    width: 100%;
    max-width: 330px;
    padding: 15px;
    margin: auto;
    margin-top: 260px;
}

    .form-signin .checkbox {
        font-weight: 400;
    }

    .form-signin .form-floating:focus-within {
        z-index: 2;
    }

    .form-signin input[type="email"] {
        margin-bottom: -1px;
        border-bottom-right-radius: 0;
        border-bottom-left-radius: 0;
    }

    .form-signin input[type="password"] {
        margin-bottom: 10px;
        border-top-left-radius: 0;
        border-top-right-radius: 0;
    }

.bd-placeholder-img {
    font-size: 1.125rem;
    text-anchor: middle;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
}

@media (min-width: 768px) {
    .bd-placeholder-img-lg {
        font-size: 3.5rem;
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Administrator/NewAdministrator.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Administrator
@inject ToastService ToastService
@inject IAdministratorAppService AdministratorAppService

<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                   <BootstrapInput @bind-Value="Model.AdminName" DisplayText="管理员账号名" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.Password" DisplayText="登录密码" type="password" IsTrim="true" />
             </div>
            <div class="col-12"  style="margin-top:5px;" >
                 <BootstrapInput @bind-Value="Model.NickName" DisplayText="昵称" IsTrim="true" />
            </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
    </ValidateForm>
</div>


@code {
    
    [Parameter]
    public EventCallback OnClickCallback { get; set; }
    //表单数据
    private CreateAdministratorDto Model { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
        Model = new CreateAdministratorDto();
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await AdministratorAppService.CreateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
            Model = new CreateAdministratorDto();
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Administrator/UpdateAdministrator.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Administrator
@inject ToastService ToastService
@inject IAdministratorAppService AdministratorAppService

<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                   <BootstrapInput @bind-Value="Model.AdminName" DisplayText="管理员账号名" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.Password" DisplayText="登录密码(不修改则留空)" type="password" IsTrim="true" />
             </div>
            <div class="col-12"  style="margin-top:5px;" >
                 <BootstrapInput @bind-Value="Model.NickName" DisplayText="昵称" IsTrim="true" />
            </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
     </ValidateForm>
</div>


@code {

    [Parameter]
    public EventCallback OnClickCallback { get; set; }
    //表单数据
    [Parameter]
    public UpdateAdministratorDto Model { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await AdministratorAppService.UpdateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Authorization/Authentication.razor
================================================
@page "/Authentication"
@using System.IO;
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Authorization
@inject ToastService ToastService
@inject IAuthorizationAppService AuthorizationAppService
@inject IWebHostEnvironment WebHostEnvironment;
<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-5"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.UseState" DisplayText="状态" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="col-5">
                   <BootstrapInput @bind-Value="Model.Issuer" DisplayText="颁发者" IsTrim="true" />
             </div>
             <div class="col-5"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.Audience" DisplayText="观察者" IsTrim="true" />
             </div>
             <div class="col-5"  style="margin-top:5px;" >
                 
                 <BootstrapInputNumber @bind-Value="Model.ClockSkew" DisplayText="时间偏移(秒)" IsTrim="true" />
             </div>
            <div class="col-5"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.ValidateIssuerSigningKey" DisplayText="是否验证签名" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="col-5"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.ValidateIssuer" DisplayText="是否验证颁发者" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="col-5"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.ValidateAudience" DisplayText="是否验证观察者" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="col-5"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.ValidateLifetime" DisplayText="是否验证失效时间" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="col-5"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.RequireExpirationTime" DisplayText="是否需要过期时间" OnText="开启" OffText="关闭"></Switch>
            </div>
            
             <div class="col-5"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.UseSSL" OnValueChanged="@OnUseSSLSwitch" DisplayText="是否启用SSL证书" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="col-5" style="margin-top:5px;">
                  <InputUpload Accept="" @bind-Value="@Model.CertificateFileName"  OnChange="@OnFileChange" DisplayText="证书文件(.pfx Or .cer)" />  
             </div>
             
            <div class="col-5" style="margin-top:5px;">
                 <BootstrapInput @bind-Value="Model.CertificatePassword" DisplayText="证书密码" IsDisabled="@(IsDisabledUseSSL)" IsTrim="true" />
             </div>
             <div class="col-5" style="margin-top:5px;">
                   <BootstrapInput @bind-Value="Model.SecurityKeyStr" DisplayText="自定义秘钥" IsDisabled="@IsDisabledSecurityKey" IsTrim="true" />
             </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-5">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {

    [Parameter]
    public EventCallback OnClickCallback { get; set; }
    //表单数据
    private SaveAuthenticationDto Model { get; set; }

    private bool IsDisabledUseSSL { get; set; }
    private bool IsDisabledSecurityKey { get; set; }

    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override async void OnInitialized()
    {
        base.OnInitialized();
        var result = await AuthorizationAppService.GetAuthenticationAsync();
        if (result.Code == 0)
        {
            Model = result.Data;
            IsDisabledUseSSL = Model.UseSSL ? false : true;
            IsDisabledSecurityKey = Model.UseSSL;
        }
    }
    private Task OnUseSSLSwitch(bool val)
    {
        IsDisabledSecurityKey = val;
        IsDisabledUseSSL = val ? false : true;
        return Task.FromResult(true);
    }
    private async Task OnFileChange(UploadFile file)
    {
        if (file.File != null)
        {
            //保存证书文件
            var filePath = Path.Combine(WebHostEnvironment.WebRootPath, $"upload/{file.File.Name}");
            await file.SaveToFile(filePath);
            //读取文件并且转换为BASE64字符串存储
            using var fs = new FileStream(filePath, FileMode.Open);
            fs.Seek(0, SeekOrigin.Begin);
            var buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            Model.CertificateFileName = file.File.Name;
            Model.CertificateFile = Convert.ToBase64String(buffer);
        }
        else
        {
            Model.CertificateFileName = "";
            Model.CertificateFile = "";
        }
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await AuthorizationAppService.SaveAuthenticationAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Error.cshtml
================================================
@page
@model Kite.Gateway.Admin.Pages.ErrorModel

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <title>Error</title>
    <link href="~/css/bootstrap/bootstrap.min.css" rel="stylesheet" />
    <link href="~/css/site.css" rel="stylesheet" asp-append-version="true" />
</head>

<body>
    <div class="main">
        <div class="content px-4">
            <h1 class="text-danger">Error.</h1>
            <h2 class="text-danger">An error occurred while processing your request.</h2>

            @if (Model.ShowRequestId)
            {
                <p>
                    <strong>Request ID:</strong> <code>@Model.RequestId</code>
                </p>
            }

            <h3>Development Mode</h3>
            <p>
                Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
            </p>
            <p>
                <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
                It can result in displaying sensitive information from exceptions to end users.
                For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
                and restarting the app.
            </p>
        </div>
    </div>
</body>

</html>


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Error.cshtml.cs
================================================
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Diagnostics;

namespace Kite.Gateway.Admin.Pages
{
    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    [IgnoreAntiforgeryToken]
    public class ErrorModel : PageModel
    {
        public string? RequestId { get; set; }

        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);

        private readonly ILogger<ErrorModel> _logger;

        public ErrorModel(ILogger<ErrorModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {
            RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
        }
    }
}

================================================
FILE: admin/Kite.Gateway.Admin/Pages/Home.razor
================================================
@page "/"

<div role="alert" class="alert fade show alert-info is-bar">
    <div class="alert-content">
        <h4><i class="fa fa-lightbulb-o"></i>有言</h4><!--!-->
        <p>
            .Net版本: .Net 7  <br/>
            数据库:   Sqlite <br/>
            后台管理: Blazor (<a href="https://www.blazor.zone">Bootstrap Blazor UI</a>)  <br/>
            开发框架: Abp Vnext 7.X <br/>
            反向代理组件: Yarp 2.X
        </p>
        <p>
            开源地址:<a href="https://github.com/yupingyong/kite.gateway">https://github.com/yupingyong/kite.gateway</a>
        </p>
        <p>
            怕什么真理无穷,进一寸有一寸的欢喜--胡适
        </p>
    </div>
</div>

<Timeline Items="AlternateTimelineItems" />

@code {
    private List<TimelineItem> AlternateTimelineItems { get; set; }

    protected override void OnInitialized()
    {
        base.OnInitialized();
        AlternateTimelineItems = new List<TimelineItem>()
        {
            new TimelineItem()
            {
                Description="2022-09-21",
                Content="升级到.NET 7"
            }
            ,
            new TimelineItem()
            {
                Description="2022-07-28",
                Content="第一个小迭代版本(数据库更换成Sqlite、调整配置数据热更新功能)"
            }
            ,
            new TimelineItem()
            {
                Description="2022-07-21",
                Content="完成第一个版本的更替,并且分享源代码到github上"
            }
        };
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Middleware/Middleware.razor
================================================
@page "/Middleware"

@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Middleware
@using Mapster
@using Kite.Gateway.Domain.Shared.Enums
@inject ToastService ToastService
@inject IMiddlewareAppService MiddlewareAppService

<div class="row">
    <div class="col-4">
        <BootstrapInputGroup>
            <BootstrapInput @bind-Value="@SearchKw" PlaceHolder="中间件名称/服务端地址" />
            <Button Icon="fa fa-search" IsAsync="true" @onclick="OnSearchAsync"></Button>
        </BootstrapInputGroup>
    </div>
    <div class="col-2">
          <Button OnClick="@OnAddAsync" Color="Color.Primary">添加中间件</Button>
    </div>
</div>
<div class="row" style="margin-top:10px;">
    <table class="table">
      <thead class="table-light">
        <tr>
            <th>中间件名称</th>
            <th>服务端</th>
            <th>通信类型</th>
            <th>执行权重</th>
            <th>状态</th>
            <th>描述</th>
            <th>创建时间</th>
            <th>更新时间</th>
            <th>操作</th>
        </tr>
      </thead>
      <tbody>
          @if(Middlewares!=null&&Middlewares.Any())
          {
              foreach(var item in Middlewares)
              {
                <tr>
                    <td>@item.Name</td>
                    <td>@item.Server</td>
                    <td>
                        @switch(item.SignalType)
                        {
                            case SignalTypeEnum.Http:
                                <div>http</div>
                            break;
                            default:
                                <div>grpc</div>
                            break;
                        }
                    </td>
                    <td>@item.ExecWeight</td>
                    <td>
                        <Switch OnValueChanged="@(async (val)=>{ OnUpdateStateAsync(item.Id,val);await Task.CompletedTask; })" OnColor="Color.Success" @bind-Value="item.UseState" ShowLabel="false" style="max-height:18px;"  ></Switch>
                    </td>
                    <td>@item.Description</td>
                    <td>@item.Created</td>
                    <td>@item.Updated</td>
                    <td>
                        <div class="btn-group" role="group">
                            <Button Color="Color.Info" Size="Size.ExtraSmall" OnClick="@(e=>OnUpdateAsync(item.Id))">编辑</Button>
                            <PopConfirmButton  Size="Size.ExtraSmall" Placement="Placement.Bottom" Color="Color.Danger" ConfirmIcon="fa fa-exclamation-triangle text-danger"
                  ConfirmButtonColor="Color.Danger" Text="删除" Content="确定删除数据吗?" Icon="fa fa-fa fa-fw" IsAsync="true"
                  OnConfirm="@(()=>OnDeleteAsync(item.Id))" />
                        </div>
                    </td>
                </tr>
              }
            }
        </tbody>
    </table>
    
</div>
<div class="row col-12"  style="margin-top:15px;">
    <Pagination PageItems="@PageSize" PageItemsSource="@(new int[] { 10,20 })" TotalCount="@TotalCount" OnPageClick="@OnPageClick" OnPageItemsChanged="@OnPageItemsChanged"></Pagination>
</div>
<Modal @ref="Modal">
    <ModalDialog  IsScrolling="true" Title="添加中间件" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
          <NewMiddleware OnClickCallback="OnAddCallbackAsync"></NewMiddleware>
        </BodyTemplate>
    </ModalDialog>
</Modal>

<Modal @ref="UpdateModal">
    <ModalDialog  IsScrolling="true" Title="中间件信息编辑" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
           <UpdateMiddleware Model="@UpdateModel" OnClickCallback="OnUpdateCallbackAsync"></UpdateMiddleware>
        </BodyTemplate>
    </ModalDialog>
</Modal>

@code {
    private Modal Modal;

    private Modal UpdateModal;

    public UpdateMiddlewareDto UpdateModel { get; set; }
    //分页数据

    private List<MiddlewareListDto>? Middlewares { get; set; }

    private int TotalCount { get; set; } = 0;
    private int PageSize { get; set; } = 10;
    private int PageIndex { get; set; } = 1;
    private string SearchKw { get; set; } = "";
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        OnQueryAsync();
        base.OnInitialized();
    }
    #region 中间件编辑更新
    private async void OnUpdateStateAsync(Guid id,bool val)
    {
        var result = await MiddlewareAppService.UpdateUseStateAsync(id, val);
        if (result.Code != 0)
        {
            await ToastService.Warning("系统警告",result.Message);
        }
        else
        {
            await ToastService.Success("系统通知","保存成功");
        }
    }
    private async void OnUpdateAsync(Guid id)
    {
        UpdateModel= await GetAsync(id);
        await UpdateModal.Toggle();
    }
    private async Task<UpdateMiddlewareDto> GetAsync(Guid id)
    {
        var result = await MiddlewareAppService.GetAsync(id);
        if (result.Code != 0 || result.Data == null)
        {
            await ToastService.Warning("系统警告", "数据不存在");
        }
        var model= TypeAdapter.Adapt<UpdateMiddlewareDto>(result.Data);
        return model;
    }
    private async void OnUpdateCallbackAsync()
    {
        await UpdateModal.Close();
        OnQueryAsync();
    }
    #endregion
    #region 新增中间件
    private async void OnAddAsync()
    {
        await Modal.Toggle();
    }
    private async void OnAddCallbackAsync()
    {
        await Modal.Close();
        OnQueryAsync();
    }
    #endregion
    private async Task OnDeleteAsync(Guid id)
    {
        var result= await MiddlewareAppService.DeleteAsync(id);
        if (result.Code == 0)
        {
            OnQueryAsync();
            await ToastService.Success("系统通知","数据删除成功!");
            return;
        }
        await ToastService.Warning("系统警告","数据删除失败");
    }

    private Task OnPageClick(int pageIndex, int pageItems)
    {
        PageIndex = pageIndex;
        OnQueryAsync();
        return Task.CompletedTask;
    }
    private Task OnPageItemsChanged(int pageItems)
    {
        PageIndex=1;
        PageSize = pageItems;
        OnQueryAsync();
        return Task.CompletedTask;
    }

     private void OnSearchAsync()
    {
        PageIndex=1;
        OnQueryAsync();
    }
    private async void OnQueryAsync()
    {
        var result = await MiddlewareAppService.GetListAsync(SearchKw, PageIndex, PageSize);

        if (result.Code == 0)
        {
            Middlewares = result.Data;
            TotalCount = result.Count;
            StateHasChanged();
        }
        else
        {
            await ToastService.Warning("系统警告", "数据加载失败");
        }
    }

}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Middleware/NewMiddleware.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Middleware
@inject ToastService ToastService
@inject IMiddlewareAppService MiddlewareAppService

<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                   <BootstrapInput @bind-Value="Model.Name" DisplayText="中间件名称" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.Server" DisplayText="服务端地址" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <Select @bind-Value="Model.SignalType" DisplayText="通信类型">
                   </Select>
             </div>
            <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInputNumber  @bind-Value="Model.ExecWeight" DisplayText="执行权重" IsTrim="true" />
             </div>
            <div class="col-12"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.UseState" DisplayText="状态" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="col-12"  style="margin-top:5px;" >
                 <Textarea  @bind-Value="Model.Description" DisplayText="描述" IsTrim="true"/>
            </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {
    
    [Parameter]
    public EventCallback OnClickCallback { get; set; }
    //表单数据
    private CreateMiddlewareDto Model { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
        Model = new CreateMiddlewareDto()
        {
            UseState=true
        };
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await MiddlewareAppService.CreateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
            Model = new CreateMiddlewareDto()
            {
                UseState=true
            };
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Middleware/UpdateMiddleware.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Middleware
@inject ToastService ToastService
@inject IMiddlewareAppService MiddlewareAppService

<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                   <BootstrapInput @bind-Value="Model.Name" DisplayText="中间件名称" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.Server" DisplayText="服务端地址" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <Select @bind-Value="Model.SignalType" DisplayText="通信类型">
                   </Select>
             </div>
            <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInputNumber  @bind-Value="Model.ExecWeight" DisplayText="执行权重" IsTrim="true" />
             </div>
            <div class="col-12"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.UseState" DisplayText="状态" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="col-12"  style="margin-top:5px;" >
                 <Textarea  @bind-Value="Model.Description" DisplayText="描述" IsTrim="true"/>
            </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {

    [Parameter]
    public EventCallback OnClickCallback { get; set; }
    //表单数据
    [Parameter]
    public UpdateMiddlewareDto Model { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await MiddlewareAppService.UpdateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Node/NewNode.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Node
@inject ToastService ToastService
@inject INodeAppService NodeAppService

<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                   <BootstrapInput @bind-Value="Model.NodeName" DisplayText="节点名称" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.Server" DisplayText="服务端地址(结尾勿带 / )" IsTrim="true" />
             </div>
              <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.AccessToken" DisplayText="访问Token" IsTrim="true" />
             </div>

            <div class="col-12"  style="margin-top:5px;" >
                 <Textarea  @bind-Value="Model.Description" DisplayText="描述" IsTrim="true"/>
            </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {
    
    [Parameter]
    public EventCallback OnClickCallback { get; set; }
    //表单数据
    private CreateNodeDto Model { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
        Model = new CreateNodeDto();
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await NodeAppService.CreateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
            Model = new CreateNodeDto();
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Node/Node.razor
================================================
@page "/Node"
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Node
@using Mapster
@using Kite.Gateway.Domain.Shared.Enums
@inject ToastService ToastService
@inject INodeAppService NodeAppService

<div class="row">
    <div class="col=12">
        <Button OnClick="@OnAddAsync" Color="Color.Primary">添加节点</Button>
        <Button OnClick="@OnRefreshAsync" Color="Color.Success">刷新节点配置数据</Button>
    </div>
</div>
<div class="row" style="margin-top:10px;">
    <table class="table">
      <thead class="table-light">
        <tr>
            <th>节点名称</th>
            <th>节点服务端地址</th>
            <th>授权访问Token</th>
            <th>描述</th>
            <th>创建时间</th>
            <th>更新时间</th>
            <th>操作</th>
        </tr>
      </thead>
      <tbody>
          @if(Nodes!=null&&Nodes.Any())
          {
              foreach(var item in Nodes)
              {
                <tr>
                    <td>@item.NodeName</td>
                    <td>@item.Server</td>
                    <td>@item.AccessToken</td>
                    <td>@item.Description</td>
                    <td>@item.Created</td>
                    <td>@item.Updated</td>
                    <td>
                        <div class="btn-group" role="group">
                            <Button Color="Color.Info" Size="Size.ExtraSmall" OnClick="@(e=>OnUpdateAsync(item.Id))">编辑</Button>
                            <PopConfirmButton  Size="Size.ExtraSmall" Placement="Placement.Bottom" Color="Color.Danger" ConfirmIcon="fa fa-exclamation-triangle text-danger"
                  ConfirmButtonColor="Color.Danger" Text="删除" Content="确定删除数据吗?" Icon="fa fa-fa fa-fw" IsAsync="true"
                  OnConfirm="@(()=>OnDeleteAsync(item.Id))" />
                        </div>
                    </td>
                </tr>
              }
            }
        </tbody>
    </table>
    
</div>
<div class="row col-12"  style="margin-top:15px;">
    <Pagination PageItems="@PageSize" PageItemsSource="@(new int[] { 10,20 })" TotalCount="@TotalCount" OnPageClick="@OnPageClick" OnPageItemsChanged="@OnPageItemsChanged"></Pagination>
</div>
<Modal @ref="Modal">
    <ModalDialog  IsScrolling="true" Title="添加节点" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
          <NewNode OnClickCallback="OnAddCallbackAsync"></NewNode>
        </BodyTemplate>
    </ModalDialog>
</Modal>

<Modal @ref="UpdateModal">
    <ModalDialog  IsScrolling="true" Title="节点信息编辑" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
           <UpdateNode Model="@UpdateModel" OnClickCallback="OnUpdateCallbackAsync"></UpdateNode>
        </BodyTemplate>
    </ModalDialog>
</Modal>

<Modal @ref="RefreshModal">
    <ModalDialog  IsScrolling="true" Title="刷新节点配置数据" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
           <RefreshConfigure OnClickCallback="OnRefreshCallbackAsync"></RefreshConfigure>
        </BodyTemplate>
    </ModalDialog>
</Modal>

@code {
    private Modal Modal;

    private Modal UpdateModal;
    private Modal RefreshModal;

    public UpdateNodeDto UpdateModel { get; set; }
    //分页数据

    private List<NodeDto>? Nodes { get; set; }

    private int TotalCount { get; set; } = 0;
    private int PageSize { get; set; } = 10;
    private int PageIndex { get; set; } = 1;
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        OnQueryAsync();
        base.OnInitialized();
    }
    #region 刷新节点配置数据
    private async void OnRefreshAsync()
    {
        await RefreshModal.Toggle();
    }
    private async void OnRefreshCallbackAsync()
    {
        await Modal.Close();
        OnQueryAsync();
    }
    #endregion
    #region 节点编辑更新
    private async void OnUpdateAsync(Guid id)
    {
        UpdateModel= await GetAsync(id);
        await UpdateModal.Toggle();
    }
    private async Task<UpdateNodeDto> GetAsync(Guid id)
    {
        var result = await NodeAppService.GetAsync(id);
        if (result.Code != 0 || result.Data == null)
        {
            await ToastService.Warning("系统警告", "数据不存在");
        }
        var model= TypeAdapter.Adapt<UpdateNodeDto>(result.Data);
        return model;
    }
    private async void OnUpdateCallbackAsync()
    {
        await UpdateModal.Close();
        OnQueryAsync();
    }
    #endregion
    #region 新增节点
    private async void OnAddAsync()
    {
        await Modal.Toggle();
    }
    private async void OnAddCallbackAsync()
    {
        await Modal.Close();
        OnQueryAsync();
    }
    #endregion
    private async Task OnDeleteAsync(Guid id)
    {
        var result= await NodeAppService.DeleteAsync(id);
        if (result.Code == 0)
        {
            OnQueryAsync();
            await ToastService.Success("系统通知","数据删除成功!");
            return;
        }
        await ToastService.Warning("系统警告","数据删除失败");
    }

    private Task OnPageClick(int pageIndex, int pageItems)
    {
        PageIndex = pageIndex;
        OnQueryAsync();
        return Task.CompletedTask;
    }
    private Task OnPageItemsChanged(int pageItems)
    {
        PageIndex=1;
        PageSize = pageItems;
        OnQueryAsync();
        return Task.CompletedTask;
    }
    private async void OnQueryAsync()
    {
        var result = await NodeAppService.GetListAsync(PageIndex, PageSize);

        if (result.Code == 0)
        {
            Nodes = result.Data;
            TotalCount = result.Count;
            StateHasChanged();
        }
        else
        {
            await ToastService.Warning("系统警告", "数据加载失败");
        }
    }

}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Node/RefreshConfigure.razor
================================================
@using Kite.Gateway.Application
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Node
@using Kite.Gateway.Application.Contracts.Dtos
@using System.Linq
@inject ToastService ToastService
@inject IHttpClientFactory HttpClientFactory
@inject INodeAppService NodeAppService
@inject IConfigureAppService ConfigureAppService;

<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                   <Switch OnColor="Color.Success" @bind-Value="Model.IsReloadAuthentication" DisplayText="是否重新加载身份认证数据" OnText="开启" OffText="关闭"></Switch>
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <Switch OnColor="Color.Success" @bind-Value="Model.IsReloadMiddleware" DisplayText="是否重新加载中间件数据" OnText="开启" OffText="关闭"></Switch>
             </div>
            <div class="col-12"  style="margin-top:5px;" >
                 <Switch OnColor="Color.Success" @bind-Value="Model.IsReloadWhitelist" DisplayText="是否重新加载白名单数据" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="col-12"  style="margin-top:5px;" >
                 <Switch OnColor="Color.Success" @bind-Value="Model.IsReloadYarp" DisplayText="是否重新加载Yarp相关数据" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {

    [Parameter]
    public EventCallback OnClickCallback { get; set; }
    //表单数据
    private ReloadConfigureDto Model { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
        Model = new ReloadConfigureDto()
        {
            IsReloadAuthentication=false,
            IsReloadMiddleware=false,
            IsReloadWhitelist=false,
            IsReloadYarp=false
        };
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        try
        {
            var nodeResult = await NodeAppService.GetAllAsync();
            if (nodeResult.Code == 0 && nodeResult.Data.Any())
            {
                var configureResult = await ConfigureAppService.GetConfigureAsync(Model);
                foreach (var node in nodeResult.Data)
                {
                    var httpClient = HttpClientFactory.CreateClient();
                    httpClient.DefaultRequestHeaders.Add("AccessToken", node.AccessToken);
                    var response = await httpClient.PostAsJsonAsync($"{node.Server}/api/kite/refresh/configure", configureResult.Data);

                    if (response.IsSuccessStatusCode)
                    {
                        var jsonResult = await response.Content.ReadFromJsonAsync<KiteResult>();
                        await ToastService.Success("系统提示", $"节点[{node.NodeName}]配置数据刷新成功-{jsonResult.Message}");
                    }
                    else
                    {
                        var responseContent =await response.Content.ReadAsStringAsync();
                        await ToastService.Warning("系统警告", $"节点[{node.NodeName}]配置数据刷新失败-{responseContent}");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            await ToastService.Error("系统警告", $"节点配置数据刷新失败:{ex.Message}");
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Node/UpdateNode.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Node
@inject ToastService ToastService
@inject INodeAppService NodeAppService

<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
           <div class="col-12">
                   <BootstrapInput @bind-Value="Model.NodeName" DisplayText="节点名称" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.Server" DisplayText="服务端地址(结尾勿带 / )" IsTrim="true" />
             </div>
              <div class="col-12"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.AccessToken" DisplayText="访问Token" IsTrim="true" />
             </div>

            <div class="col-12"  style="margin-top:5px;" >
                 <Textarea  @bind-Value="Model.Description" DisplayText="描述" IsTrim="true"/>
            </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {

    [Parameter]
    public EventCallback OnClickCallback { get; set; }
    //表单数据
    [Parameter]
    public UpdateNodeDto Model { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await NodeAppService.UpdateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/PaginationComponent.razor
================================================

<nav aria-label="Page navigation example">
  <ul class="pagination">
    <li class="page-item disabled">
      <span class="page-link">
          总记录条数:&nbsp;@(TotalCount)&nbsp;&nbsp;@(PageIndex)/@(PageCount) 页
      </span>
    </li>
    <li class="page-item"><a class="page-link" @onclick="@(e=>OnClickAsync(1))">首页</a></li>
    <li class="page-item"><a class="page-link" @onclick="@(e=>OnClickAsync(PreviousPage))">上一页</a></li>
    <li class="page-item"><a class="page-link" @onclick="@(e=>OnClickAsync(NextPage))">下一页</a></li>
    <li class="page-item"><a class="page-link" @onclick="@(e=>OnClickAsync(PageCount))">最后一页</a></li>
  </ul>
</nav>

@code {
    /// <summary>
    /// 当前页码
    /// </summary>
    [Parameter]
    public int PageIndex { get; set; }
    /// <summary>
    /// 每页记录数
    /// </summary>

    [Parameter]
    public int PageSize { get; set; }
    /// <summary>
    /// 总记录数
    /// </summary>
    [Parameter]
    public int TotalCount { get; set; }
    /// <summary>
    /// 点击分页页码时回调事件
    /// </summary>
    [Parameter]
    public EventCallback<int> OnClickCallback { get; set; }

    private int PageCount { get; set; }
    private int PreviousPage { get; set; }
    private int NextPage { get; set; }

    protected override void OnInitialized()
    {
        HandlePagination();
        base.OnInitialized();
    }
    private async void OnClickAsync(int page)
    {
        PageIndex = page;
        await OnClickCallback.InvokeAsync(page);
        HandlePagination();
    }
    /// <summary>
    /// 处理页码信息
    /// </summary>
    private void HandlePagination()
    {
        if (TotalCount % PageSize == 0)
        {
            PageCount = TotalCount / PageSize;
        }
        else
        {
            PageCount = TotalCount / PageSize + 1;
        }
        PreviousPage = 1;
        if (PageIndex >1)
        {

            PreviousPage = PageIndex - 1;
        }
        NextPage = PageCount;
        if (PageCount < PageIndex )
        {
            NextPage = PageIndex + 1;
        }
        StateHasChanged();
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/ServiceGovernance/ServiceGovernance.razor
================================================
@page "/ServiceGovernance"

@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.ServiceGovernance
@inject ToastService ToastService
@inject IServiceGovernanceAppService ServiceGovernanceAppService
<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-5">
                   <BootstrapInput @bind-Value="Model.ConsulServer" DisplayText="Consul服务端地址" IsTrim="true" />
             </div>
             <div class="col-5"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.ConsulDatacenter" DisplayText="Consul数据中心" IsTrim="true" />
             </div>
             <div class="col-5"  style="margin-top:5px;" >
                   <BootstrapInput @bind-Value="Model.ConsulToken" DisplayText="Consul访问令牌" IsTrim="true" />
             </div>
            <div class="col-5">
                   <BootstrapInput @bind-Value="Model.NacosServer" DisplayText="Nacos服务端地址" IsTrim="true" />
             </div>
             <div class="col-5">
                   <BootstrapInput @bind-Value="Model.NacosNamespaceId" DisplayText="Nacos命名空间ID" IsTrim="true" />
             </div>
             <div class="col-5">
                   <BootstrapInput @bind-Value="Model.NacosGroupName" DisplayText="Nacos服务端地址" IsTrim="true" />
             </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-5">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {

    [Parameter]
    public EventCallback OnClickCallback { get; set; }
    //表单数据
    private ServiceGovernanceConfigureDto Model { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override async void OnInitialized()
    {
        base.OnInitialized();
        var result = await ServiceGovernanceAppService.GetServiceGovernanceConfigureAsync();
        if (result.Code == 0)
        {
            Model = result.Data;
        }
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await ServiceGovernanceAppService.SaveServiceGovernanceConfigureAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
        }
    }
}



================================================
FILE: admin/Kite.Gateway.Admin/Pages/Whitelist/NewWhitelist.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Whitelist
@inject ToastService ToastService
@inject IWhitelistAppService WhitelistAppService
@inject IRouteAppService RouteAppService
<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                   <BootstrapInput @bind-Value="Model.Name" DisplayText="白名单名称" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <Select @bind-Value="Model.RouteId" Items="@Routes" DisplayText="所属作用域">
                         
                   </Select>
             </div>
            <div class="col-12"  style="margin-top:5px;" >
                    <BootstrapInput @bind-Value="Model.FilterText" DisplayText="过滤文本(根据类型保存的值为路径或者正则表达式)" IsTrim="true"/>
            </div>
            <div class="col-12"  style="margin-top:5px;">
                   <CheckboxList @bind-Value="@Model.RequestMethod" Items="@RequestMethods" DisplayText="请求方式"></CheckboxList>
            </div>
            <div class="col-12"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.UseState" DisplayText="状态" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {

    [Parameter]
    public EventCallback OnClickCallback { get; set; }


    //表单数据
    private CreateWhitelistDto Model { get; set; }

    private List<SelectedItem> RequestMethods{ get; set; }
    private List<SelectedItem> Routes { get; set; }

    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override async void OnInitialized()
    {
        base.OnInitialized();
        Model = new CreateWhitelistDto()
        {
            UseState=true
        };
        //初始化请求方式数据
        var requestMethods = new string[] { "POST", "GET", "PUT", "DELETE", "OPTIONS", "PATCH", "HEAD" };
        RequestMethods = new List<SelectedItem>();
        foreach (var m in requestMethods)
        {
            RequestMethods.Add(new SelectedItem()
            {
                Text=m,
                Value=m
            });
        }
        //初始化路由数据
        Routes = new List<SelectedItem>()
        {
            new SelectedItem()
            {
                Text="全局",
                Value="00000000-0000-0000-0000-000000000000"
            }
        };
        var routeResult =await RouteAppService.GetListAsync();
        if (routeResult.Code == 0)
        {
            foreach (var item in routeResult.Data)
            {
                Routes.Add(new SelectedItem()
                    {
                        Text = item.RouteName,
                        Value = item.Id.ToString()
                    });
            }
        }
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await WhitelistAppService.CreateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
            Model = new CreateWhitelistDto()
            {
                UseState=true
            };
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Whitelist/UpdateWhitelist.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Whitelist
@inject ToastService ToastService
@inject IWhitelistAppService WhitelistAppService
@inject IRouteAppService RouteAppService
<div class="row">
    <ValidateForm Model="@Model" OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                   <BootstrapInput @bind-Value="Model.Name" DisplayText="白名单名称" IsTrim="true" />
             </div>
             <div class="col-12"  style="margin-top:5px;" >
                   <Select @bind-Value="Model.RouteId" Items="@Routes" DisplayText="所属作用域">
                         
                   </Select>
             </div>
            <div class="col-12"  style="margin-top:5px;" >
                    <BootstrapInput @bind-Value="Model.FilterText" DisplayText="过滤文本(根据类型保存的值为路径或者正则表达式)" IsTrim="true"/>
            </div>
            <div class="col-12"  style="margin-top:5px;">
                   <CheckboxList @bind-Value="@Model.RequestMethod" Items="@RequestMethods" DisplayText="请求方式"></CheckboxList>
            </div>
            <div class="col-12"  style="margin-top:5px;">
                   <Switch OnColor="Color.Success" @bind-Value="Model.UseState" DisplayText="状态" OnText="开启" OffText="关闭"></Switch>
            </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {

    [Parameter]
    public EventCallback OnClickCallback { get; set; }


    //表单数据
    [Parameter]
    public UpdateWhitelistDto Model { get; set; }

    private List<SelectedItem> RequestMethods{ get; set; }
    private List<SelectedItem> Routes { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override async void OnInitialized()
    {
        base.OnInitialized();
        //初始化请求方式数据
        var requestMethods = new string[] { "POST", "GET", "PUT", "DELETE", "OPTIONS", "PATCH", "HEAD" };
        RequestMethods = new List<SelectedItem>();
        foreach (var m in requestMethods)
        {
            RequestMethods.Add(new SelectedItem()
            {
                Text=m,
                Value=m
            });
        }
        //初始化路由数据
        Routes = new List<SelectedItem>()
        {
            new SelectedItem()
            {
                Text="全局",
                Value="00000000-0000-0000-0000-000000000000"
            }
        };
        var routeResult =await RouteAppService.GetListAsync();
        if (routeResult.Code == 0)
        {
            foreach (var item in routeResult.Data)
            {
                Routes.Add(new SelectedItem()
                    {
                        Text = item.RouteName,
                        Value = item.Id.ToString()
                    });
            }
        }
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await WhitelistAppService.UpdateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Whitelist/WhiteList.razor
================================================
@page "/Whitelist"

@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.Whitelist
@using Mapster
@using Kite.Gateway.Domain.Shared.Enums
@inject ToastService ToastService
@inject IWhitelistAppService WhitelistAppService
@inject NavigationManager NavigationManager

<div class="row">
    <div class="col-4">
        <BootstrapInputGroup>
            <BootstrapInput @bind-Value="@SearchKw" PlaceHolder="白名单名称/过滤文本值" />
            <Button Icon="fa fa-search" IsAsync="true" @onclick="OnSearchAsync"></Button>
        </BootstrapInputGroup>
    </div>
    <div class="col-2">
        <Button OnClick="@OnAddAsync" Color="Color.Primary">添加白名单</Button>
    </div>
</div>
<div class="row" style="margin-top:10px;">
    <table class="table">
      <thead class="table-light">
        <tr>
            <th>白名单名称</th>
            <th>作用域</th>
            <th>过滤文本</th>
            <th>请求方式</th>
            <th>状态</th>
            <th>创建时间</th>
            <th>操作</th>
        </tr>
      </thead>
      <tbody>
          @if(Whitelists!=null&&Whitelists.Any())
          {
              foreach(var item in Whitelists)
              {
                <tr>
                    <td>@item.Name</td>
                    <td>@item.RouteName</td>
                    <td>@item.FilterText</td>
                    <td>@item.RequestMethod</td>
                    <td>
                        <Switch OnValueChanged="@(async (val)=>{ OnUpdateStateAsync(item.Id,val);await Task.CompletedTask; })" OnColor="Color.Success" @bind-Value="item.UseState" ShowLabel="false" style="max-height:18px;"  ></Switch>
                    </td>
                    
                    <td>@item.Created</td>
                    
                    <td>
                        <div class="btn-group" role="group">
                            <Button Color="Color.Info" Size="Size.ExtraSmall" OnClick="@(e=>OnUpdateAsync(item.Id))">编辑</Button>
                            <PopConfirmButton  Size="Size.ExtraSmall" Placement="Placement.Bottom" Color="Color.Danger" ConfirmIcon="fa fa-exclamation-triangle text-danger"
                  ConfirmButtonColor="Color.Danger" Text="删除" Content="确定删除数据吗?" Icon="fa fa-fa fa-fw" IsAsync="true"
                  OnConfirm="@(()=>OnDeleteAsync(item.Id))" />
                        </div>
                    </td>
                </tr>
              }
            }
        </tbody>
    </table>
    
</div>
<div class="row col-12"  style="margin-top:15px;">
     <Pagination PageItems="@PageSize" PageItemsSource="@(new int[] { 10,20 })" TotalCount="@TotalCount" OnPageClick="@OnPageClick" OnPageItemsChanged="@OnPageItemsChanged"></Pagination>
</div>
<Modal @ref="Modal">
    <ModalDialog  IsScrolling="true" Title="新增白名单" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
           <NewWhitelist OnClickCallback="OnAddCallbackAsync"></NewWhitelist>
        </BodyTemplate>
    </ModalDialog>
</Modal>

<Modal @ref="UpdateModal">
    <ModalDialog  IsScrolling="true" Title="白名单编辑" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
           <UpdateWhitelist Model="@UpdateModel" OnClickCallback="OnUpdateCallbackAsync"></UpdateWhitelist>
        </BodyTemplate>
    </ModalDialog>
</Modal>

@code {
    private Modal Modal;

    private Modal UpdateModal;

    public UpdateWhitelistDto UpdateModel { get; set; }
    //分页数据

    private List<WhitelistDto> Whitelists { get; set; }

    private int TotalCount { get; set; } = 0;
    private int PageSize { get; set; } = 10;
    private int PageIndex { get; set; } = 1;
    private string SearchKw { get; set; } = "";

    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        OnQueryAsync();
        base.OnInitialized();
    }
    #region 白名单编辑更新
    private async void OnUpdateStateAsync(Guid id,bool val)
    {
        var result = await WhitelistAppService.UpdateUseStateAsync(id, val);
        if (result.Code != 0)
        {
            await ToastService.Warning("系统警告",result.Message);
        }
        else
        {
            await ToastService.Success("系统通知","保存成功");
        }
    }
    private async void OnUpdateAsync(Guid id)
    {
        UpdateModel= await GetAsync(id);
        await UpdateModal.Toggle();
    }
    private async Task<UpdateWhitelistDto> GetAsync(Guid id)
    {
        var result = await WhitelistAppService.GetAsync(id);
        if (result.Code != 0 || result.Data == null)
        {
            await ToastService.Warning("系统警告", "数据不存在");
        }
        var model= TypeAdapter.Adapt<UpdateWhitelistDto>(result.Data);
        return model;
    }
    private async void OnUpdateCallbackAsync()
    {
        await UpdateModal.Close();
        OnQueryAsync();
    }
    #endregion
    #region 新增白名单
    private async void OnAddAsync()
    {
        await Modal.Toggle();
    }
    private async void OnAddCallbackAsync()
    {
        await Modal.Close();
        OnQueryAsync();
    }
    #endregion
    private async Task OnDeleteAsync(Guid routeId)
    {
        var result= await WhitelistAppService.DeleteAsync(routeId);
        if (result.Code == 0)
        {
            OnQueryAsync();
            await ToastService.Success("系统通知","数据删除成功!");
            return;
        }
        await ToastService.Warning("系统警告","数据删除失败");
    }

    private Task OnPageClick(int pageIndex, int pageItems)
    {
        PageIndex = pageIndex;
        OnQueryAsync();
        return Task.CompletedTask;
    }
    private Task OnPageItemsChanged(int pageItems)
    {
        PageIndex=1;
        PageSize = pageItems;
        OnQueryAsync();
        return Task.CompletedTask;
    }
    private void OnSearchAsync()
    {
        PageIndex = 1;
        OnQueryAsync();
    }
    private async void OnQueryAsync()
    {
        var result = await WhitelistAppService.GetListAsync(SearchKw, PageIndex, PageSize);

        if (result.Code == 0)
        {
            Whitelists = result.Data;
            TotalCount = result.Count;
            StateHasChanged();
        }
        else
        {
            await ToastService.Warning("系统警告", "数据加载失败");
        }
    }

}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Yarp/NewRoute.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.ReverseProxy
@inject ToastService ToastService
@inject IRouteAppService RouteAppService

<div class="row">
    <ValidateForm Model="@Model" class="form-inline"  OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                    <GroupBox Title="路由基础信息"  class="col-12">
                        <BootstrapInput @bind-Value="Model.RouteName" DisplayText="路由名称" IsTrim="true" />
                        <BootstrapInput @bind-Value="Model.RouteMatchPath" DisplayText="路由规则" IsTrim="true"  style="margin-top:5px;" />
                        <Switch OnColor="Color.Success" @bind-Value="Model.UseState" DisplayText="开启状态" OnText="开启" OffText="关闭"  style="margin-top:5px;"></Switch>
                    </GroupBox>
                    
                </div>
             <div class="col-12">
                    <GroupBox Title="路由转换"  class="col-12">
                       <BootstrapInput @bind-Value="Model.PathRemovePrefix" DisplayText="移除路径前缀" IsTrim="true" />
                       <BootstrapInput @bind-Value="Model.PathPrefix" DisplayText="添加加路径前缀" IsTrim="true"  style="margin-top:5px;" />
                    </GroupBox>
             </div>
            <div class="col-12">
                    <GroupBox Title="集群配置"  class="col-12">
                        <Select @bind-Value="Model.LoadBalancingPolicy" DisplayText="集群策略">
                            <Options>
                                <SelectOption Text="默认" Value="PowerOfTwoChoices"/>
                                <SelectOption Text="第一可用" Value="FirstAlphabetical" />
                                <SelectOption Text="随机" Value="Random" />
                                <SelectOption Text="顺序循环" Value="RoundRobin" />
                                 <SelectOption Text="请求最少" Value="LeastRequests" />
                            </Options>
                        </Select>
                        <Select @bind-Value="Model.ServiceGovernanceType" DisplayText="服务治理类型"  style="margin-top:5px;" >
                        </Select>
                       <BootstrapInput @bind-Value="Model.ClusterDestinationValue" ShowLabel="true" DisplayText="集群目的地" IsTrim="true"   style="margin-top:5px;" />
                       <Tag Icon="fa fa-fw fa-question-circle" Color="Color.Info">如果治理类型为默认时多个目的地用,(逗号,半角)分隔,否则为服务治理名称</Tag>
                    </GroupBox>
                </div>
            <div class="col-12">
                    <GroupBox Title="集群健康检查配置"  class="col-12">
                       <Switch OnColor="Color.Success" @bind-Value="Model.ClusterHealthCheck.Enabled" DisplayText="是否开启" OnText="开启" OffText="关闭"></Switch>
                       <BootstrapInputNumber @bind-Value="Model.ClusterHealthCheck.Interval" DisplayText="间隔时间(秒)" IsSelectAllTextOnFocus="true" style="margin-top:5px;" />
                       <BootstrapInputNumber @bind-Value="Model.ClusterHealthCheck.Timeout" DisplayText="超时时间(秒)" IsSelectAllTextOnFocus="true"  style="margin-top:5px;" />
                       <BootstrapInput @bind-Value="Model.ClusterHealthCheck.Path" DisplayText="路径" IsTrim="true" style="margin-top:5px;" />
                    </GroupBox>
                </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {

    [Parameter]
    public EventCallback OnClickCallback { get; set; }


    //表单数据
    private CreateRouteDto Model { get; set; }

    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
        Model = new CreateRouteDto()
        {
            UseState=true,
            ClusterHealthCheck=new ClusterHealthCheckDto()
            {
                Enabled = false
            }
        };
    }
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await RouteAppService.CreateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
            Model = new CreateRouteDto()
            {
                UseState=true,
                ClusterHealthCheck=new ClusterHealthCheckDto()
                {
                    Enabled = false
                }
            };  
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Yarp/Route.razor
================================================
@page "/Route"

@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.ReverseProxy
@using Mapster
@using Kite.Gateway.Domain.Shared.Enums
@inject ToastService ToastService
@inject IRouteAppService RouteAppService
@inject NavigationManager NavigationManager
@inject DialogService? DialogService

<div class="row">
    <div class="col-4">
        <BootstrapInputGroup>
            <BootstrapInput @bind-Value="@SearchKw" PlaceHolder="路由名称" />
            <Button Icon="fa fa-search" IsAsync="true" @onclick="OnSearchAsync"></Button>
        </BootstrapInputGroup>
    </div>
    <div class="col-2">
         <Button OnClick="@OnAddAsync" Color="Color.Primary">添加路由</Button>
    </div>
</div>
<div class="row" style="margin-top:10px;">
    <table class="table">
      <thead class="table-light">
        <tr>
            <th>路由名称</th>
            <th>路由路径</th>
            <th>负载均衡策略</th>
            <th>服务治理类型</th>
            <th>服务治理名称</th>
            <th>状态</th>
            <th>创建时间</th>
            <th>描述</th>
            <th>操作</th>
        </tr>
      </thead>
      <tbody>
          @if(Routes!=null&&Routes.Any())
          {
              foreach(var item in Routes)
              {
                <tr>
                    <td>@item.RouteName</td>
                    <td>@item.RouteMatchPath</td>
                    <td>
                        @switch(item.LoadBalancingPolicy)
                        {
                            case "FirstAlphabetical" :
                                <div>第一个可用</div>
                            break;
                            case "Random":
                                <div>随机</div>
                            break;
                            case "RoundRobin":
                                <div>顺序循环</div>
                            break;
                            case "LeastRequests":
                                <div>请求最少</div>
                            break;
                            default:
                                <div>默认</div>
                            break;
                        }
                    </td>
                    <td>
                        @switch(item.ServiceGovernanceType)
                            {
                                case ServiceGovernanceType.Consul:
                                    <div>Consul</div>
                                    break;
                                default:
                                    <div>默认</div>
                                    break;
                            }
                        </td>
                    <td>@item.ServiceGovernanceName</td>
                    <td>
                        <Switch  OnValueChanged="@(async (val)=>{ OnUpdateStateAsync(item.Id,val);await Task.CompletedTask; })" OnColor="Color.Success" @bind-Value="item.UseState" ShowLabel="false" style="max-height:18px;" ></Switch>
                    </td>
                    <td>@item.Created</td>
                    <td>@item.Description</td>
                    <td>
                        <div class="btn-group" role="group">
                            <Button Color="Color.Info" Size="Size.ExtraSmall" OnClick="@(e=>OnUpdateAsync(item.Id))">编辑</Button>
                            <PopConfirmButton  Size="Size.ExtraSmall" Placement="Placement.Bottom" Color="Color.Danger" ConfirmIcon="fa fa-exclamation-triangle text-danger"
                  ConfirmButtonColor="Color.Danger" Text="删除" Content="确定删除数据吗?" Icon="fa fa-fa fa-fw" IsAsync="true"
                  OnConfirm="@(()=>OnDeleteAsync(item.Id))" />
                        </div>
                    </td>
                </tr>
              }
            }
        </tbody>
    </table>
    
</div>
<div class="row col-12"  style="margin-top:15px;">
    <Pagination PageItems="@PageSize" PageItemsSource="@(new int[] { 10,20 })" TotalCount="@TotalCount" OnPageClick="@OnPageClick" OnPageItemsChanged="@OnPageItemsChanged"></Pagination>
</div>


<Modal @ref="Modal">
    <ModalDialog  IsScrolling="true" Title="新增路由" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
           <NewRoute OnClickCallback="OnAddCallbackAsync"></NewRoute>
        </BodyTemplate>
    </ModalDialog>
</Modal>

<Modal @ref="UpdateModal">
    <ModalDialog  IsScrolling="true" Title="编辑路由" IsCentered="true" Size="Size.Large" ShowCloseButton="false">
        <BodyTemplate >
           <UpdateRoute Model="@UpdateModel" OnClickCallback="OnUpdateCallbackAsync"></UpdateRoute>
        </BodyTemplate>
    </ModalDialog>
</Modal>

@code {
    private Modal Modal;

    private Modal UpdateModal;

    public UpdateRouteDto UpdateModel { get; set; }
    //分页数据

    private List<RoutePageDto> Routes { get; set; }

    private int TotalCount { get; set; } = 0;
    private int PageSize { get; set; } = 10;
    private int PageIndex { get; set; } = 1;
    private string SearchKw { get; set; } = "";
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        OnQueryAsync();
        base.OnInitialized();
    }
    #region 路由编辑更新
    private async void OnUpdateStateAsync(Guid id,bool val)
    {
        var result = await RouteAppService.UpdateStateAsync(id, val);
        if (result.Code != 0)
        {
            await ToastService.Warning("系统警告",result.Message);
        }
        else
        {
            await ToastService.Success("系统通知","保存成功");
        }
    }
    private async void OnUpdateAsync(Guid id)
    {
        UpdateModel= await GetUpdateRouteDataAsync(id);
        await UpdateModal.Toggle();
    }
    private async Task<UpdateRouteDto> GetUpdateRouteDataAsync(Guid id)
    {
        var result =await RouteAppService.GetAsync(id);
        if (result.Code != 0 || result.Data == null)
        {
            await ToastService.Warning("系统警告","信息获取失败");
        }
        var data = result.Data;
        var updateDataModel = new UpdateRouteDto()
            {
                ClusterHealthCheck = TypeAdapter.Adapt<ClusterHealthCheckDto>(data.Cluster.HealthCheck),
                Description = "",
                UseState = data.UseState,
                LoadBalancingPolicy = data.Cluster.LoadBalancingPolicy,
                PathPrefix = data.RouteTransforms.Where(x => x.TransformsName == "PathPrefix").Select(x => x.TransformsValue).FirstOrDefault(),
                PathRemovePrefix = data.RouteTransforms.Where(x => x.TransformsName == "PathRemovePrefix").Select(x => x.TransformsValue).FirstOrDefault(),
                RouteId = data.Id,
                RouteMatchPath = data.RouteMatchPath,
                RouteName = data.RouteName,
                ServiceGovernanceType = data.Cluster.ServiceGovernanceType
            };
        if (data.Cluster.ServiceGovernanceType == ServiceGovernanceType.Default)
        {
            updateDataModel.ClusterDestinationValue = string.Join(',', data.Cluster.ClusterDestinations.Select(x => x.DestinationAddress).ToList());
        }
        else
        {
            updateDataModel.ClusterDestinationValue = data.Cluster.ServiceGovernanceName;
        }
        return updateDataModel;
    }
    private async void OnUpdateCallbackAsync()
    {
        await UpdateModal.Close();
        OnQueryAsync();
    }
    #endregion
    #region 新增路由
    private async void OnAddAsync()
    {
        await Modal.Toggle();
    }
    private async void OnAddCallbackAsync()
    {
        await Modal.Close();
        OnQueryAsync();
    }
    #endregion
    private async Task OnDeleteAsync(Guid routeId)
    {
        var result= await RouteAppService.DeleteAsync(routeId);
        if (result.Code == 0)
        {
            OnQueryAsync();
            await ToastService.Success("系统通知","数据删除成功!");
            return;
        }
        await ToastService.Warning("系统警告","数据删除失败");
    }

    private Task OnPageClick(int pageIndex, int pageItems)
    {
        PageIndex = pageIndex;
        OnQueryAsync();
        return Task.CompletedTask;
    }
    private Task OnPageItemsChanged(int pageItems)
    {
        PageIndex=1;
        PageSize = pageItems;
        OnQueryAsync();
        return Task.CompletedTask;
    }

    private void OnSearchAsync()
    {
        PageIndex = 1;
        OnQueryAsync();
    }
    private async void OnQueryAsync()
    {
        var result = await RouteAppService.GetListAsync(SearchKw, PageIndex, PageSize);

        if (result.Code == 0)
        {
            Routes = result.Data;
            TotalCount = result.Count;
            StateHasChanged();
        }
        else
        {
            await ToastService.Warning("系统警告", "路由数据加载失败");
        }
    }

}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/Yarp/UpdateRoute.razor
================================================
@using Kite.Gateway.Application.Contracts
@using Kite.Gateway.Application.Contracts.Dtos.ReverseProxy
@using Mapster;
@inject ToastService ToastService
@inject IRouteAppService RouteAppService

<div class="row">
    <ValidateForm Model="@Model" class="form-inline"  OnValidSubmit="@OnSaveAsync" OnInvalidSubmit="@OnInvalidSubmitAsync">
            <div class="col-12">
                    <GroupBox Title="路由基础信息"  class="col-12">
                        <BootstrapInput @bind-Value="Model.RouteName" DisplayText="路由名称" IsTrim="true" />
                        <BootstrapInput @bind-Value="Model.RouteMatchPath" DisplayText="路由规则" IsTrim="true"  style="margin-top:5px;" />
                        <Switch OnColor="Color.Success" @bind-Value="Model.UseState" DisplayText="开启状态" OnText="开启" OffText="关闭"  style="margin-top:5px;"></Switch>
                    </GroupBox>
                    
                </div>
             <div class="col-12">
                    <GroupBox Title="路由转换"  class="col-12">
                       <BootstrapInput @bind-Value="Model.PathRemovePrefix" DisplayText="移除路径前缀" IsTrim="true" />
                       <BootstrapInput @bind-Value="Model.PathPrefix" DisplayText="添加加路径前缀" IsTrim="true"  style="margin-top:5px;" />
                    </GroupBox>
             </div>
            <div class="col-12">
                    <GroupBox Title="集群配置"  class="col-12">
                        <Select @bind-Value="Model.LoadBalancingPolicy" DisplayText="集群策略">
                            <Options>
                                <SelectOption Text="默认" Value="PowerOfTwoChoices"/>
                                <SelectOption Text="第一可用" Value="FirstAlphabetical" />
                                <SelectOption Text="随机" Value="Random" />
                                <SelectOption Text="顺序循环" Value="RoundRobin" />
                                 <SelectOption Text="请求最少" Value="LeastRequests" />
                            </Options>
                        </Select>
                       <Select @bind-Value="Model.ServiceGovernanceType" DisplayText="服务治理类型"  style="margin-top:5px;" >
                        </Select>
                       <BootstrapInput @bind-Value="Model.ClusterDestinationValue" ShowLabel="true" DisplayText="集群目的地" IsTrim="true"   style="margin-top:5px;" />
                       <Tag Icon="fa fa-fw fa-question-circle" Color="Color.Info">如果治理类型为默认时多个目的地用,(逗号,半角)分隔,否则为服务治理名称</Tag>
                    </GroupBox>
                </div>
            <div class="col-12">
                    <GroupBox Title="集群健康检查配置"  class="col-12">
                       <Switch OnColor="Color.Success" @bind-Value="Model.ClusterHealthCheck.Enabled" DisplayText="是否开启" OnText="开启" OffText="关闭"></Switch>
                       <BootstrapInputNumber @bind-Value="Model.ClusterHealthCheck.Interval" DisplayText="间隔时间(秒)" IsSelectAllTextOnFocus="true" style="margin-top:5px;" />
                       <BootstrapInputNumber @bind-Value="Model.ClusterHealthCheck.Timeout" DisplayText="超时时间(秒)" IsSelectAllTextOnFocus="true"  style="margin-top:5px;" />
                       <BootstrapInput @bind-Value="Model.ClusterHealthCheck.Path" DisplayText="路径" IsTrim="true" style="margin-top:5px;" />
                    </GroupBox>
                </div>
            <div class="row" style="margin-top:10px;">
                <div class="col-12">
                    <Button ButtonType="ButtonType.Submit"  IsAsync="true" Color="Color.Primary">保 存</Button>
                </div>
            </div>
           </ValidateForm>
</div>


@code {


    [Parameter]
    public EventCallback OnClickCallback { get; set; }

    //表单数据
    [Parameter]
    public UpdateRouteDto Model { get; set; }

    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
    }
    
    private Task OnInvalidSubmitAsync(EditContext context)
    {
        return Task.CompletedTask;
    }
    private async Task OnSaveAsync(EditContext context)
    {
        var result= await RouteAppService.UpdateAsync(Model);
        if (result.Code != 0)
        {
            await ToastService.Warning(result.Message);
        }
        else
        {
            await OnClickCallback.InvokeAsync();
            await ToastService.Success("保存成功");
        }
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Pages/_Host.cshtml
================================================
@page "/"
@namespace Kite.Gateway.Admin.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{

    Layout = "_Layout";
}
<component type="typeof(App)" render-mode="ServerPrerendered" />


================================================
FILE: admin/Kite.Gateway.Admin/Pages/_Layout.cshtml
================================================
@using Microsoft.AspNetCore.Components.Web
@namespace Kite.Gateway.Admin.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <base href="~/" />
    <link href="_content/BootstrapBlazor.FontAwesome/css/font-awesome.min.css" rel="stylesheet">
    <link href="_content/BootstrapBlazor/css/bootstrap.blazor.bundle.min.css" rel="stylesheet">
    <link href="css/site.css" rel="stylesheet" />
    <link href="Kite.Gateway.Admin.styles.css" rel="stylesheet" />
    <component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
</head>
<body>
    @RenderBody()

   @* <div id="blazor-error-ui">
        <environment include="Staging,Production">
            An error has occurred. This application may no longer respond until reloaded.
        </environment>
        <environment include="Development">
            An unhandled exception has occurred. See browser dev tools for details.
        </environment>
        <a href="" class="reload">Reload</a>
        <a class="dismiss">🗙</a>
    </div>*@
    <script src="_content/BootstrapBlazor/js/bootstrap.blazor.bundle.min.js"></script>
    <script src="_framework/blazor.server.js"></script>
</body>
</html>


================================================
FILE: admin/Kite.Gateway.Admin/Program.cs
================================================

using Kite.Gateway.Admin;
using Kite.Gateway.Admin.Core;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Http.Features;
using Serilog;
using Serilog.Events;

var builder = WebApplication.CreateBuilder(args);

//־
builder.Logging.ClearProviders();
Log.Logger = new LoggerConfiguration()
          .Enrich.FromLogContext()
          .WriteTo.Console()// ־̨
          .WriteTo.File($"data/logs/log-.txt", restrictedToMinimumLevel: LogEventLevel.Warning, rollingInterval: RollingInterval.Day)
          .MinimumLevel.Information()
          .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
          .CreateLogger();
builder.Host
     .UseSerilog(dispose:true)
     .UseAutofac();
//ļ
builder.Services.ReplaceConfiguration(builder.Configuration);//ô
//ע
builder.Services.AddApplication<GatewayAdminModule>();
builder.Services.AddHttpClient();
builder.Services.AddSingleton<AuthorizationServerStorage>();

var app = builder.Build();
await app.InitializeApplicationAsync();
await app.RunAsync();


================================================
FILE: admin/Kite.Gateway.Admin/Properties/launchSettings.json
================================================
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:29547",
      "sslPort": 0
    }
  },
  "profiles": {
    "Kite.Gateway.Admin": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:55661",
      "dotnetRunMessages": true
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Docker": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
      "publishAllPorts": true
    }
  }
}

================================================
FILE: admin/Kite.Gateway.Admin/Shared/MainLayout.razor
================================================
@inherits LayoutComponentBase
@inject SwalService swalService
@inject NavigationManager navigationManager

<Layout SideWidth="0" IsPage="true" ShowGotoTop="true" ShowCollapseBar="true"
        IsFullSide="@IsFullSide" IsFixedHeader="@IsFixedHeader" IsFixedFooter="@IsFixedFooter" ShowFooter="@ShowFooter"
        TabDefaultUrl="/"
        Menus="@Menus"  UseTabSet="@UseTabSet" AdditionalAssemblies="new[] { GetType().Assembly }" class="@Theme">
    <Header>
        <span class="ms-3 flex-sm-fill d-none d-sm-block">Kite Gateway</span>
        <div class="flex-fill d-sm-none">
        </div>
        <Logout ImageUrl="images/kitelogo.png" DisplayName="@(Administrator.NickName)" UserName="@(Administrator.AdminName)">
            <LinkTemplate>
                <LogoutLink Url="/Logout" />
            </LinkTemplate>
        </Logout>
    </Header>
    <Side>
        <div class="layout-banner">
            <div class="layout-title">
                <span>后台管理</span>
            </div>
        </div>
    </Side>
    <Main>
        <CascadingValue Value="this" IsFixed="true">
            @Body
        </CascadingValue>
    </Main>
    <Footer>
        <div class="text-center flex-fill">
            
        </div>
    </Footer>
    <NotFound>
        <p>Sorry, there's nothing at this address.</p>
    </NotFound>
</Layout>
@code {
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (Administrator.Id == Guid.Empty)
        {

            var op = new SwalOption()
                {
                    Category = SwalCategory.Warning,
                    Title = "你还未登录,请先登录",
                    ShowClose = false
                };
            op.ButtonTemplate = new RenderFragment(builder =>
            {
                builder.OpenComponent<Button>(0);
                builder.AddAttribute(1, nameof(Button.Text), "前往登录");
                builder.AddAttribute(2, nameof(Button.OnClick), EventCallback.Factory.Create<MouseEventArgs>(this, () =>
                {
                    navigationManager.NavigateTo("/Login");
                    op.Close();
                }));
                builder.CloseComponent();
            });
            await swalService.Show(op);
        }
        await base.OnAfterRenderAsync(firstRender);
	}
 
}

================================================
FILE: admin/Kite.Gateway.Admin/Shared/MainLayout.razor.cs
================================================
using BootstrapBlazor.Components;
using Microsoft.AspNetCore.Components.Routing;

using Kite.Gateway.Admin.Core;
using Kite.Gateway.Application.Contracts.Dtos.Administrator;
using Microsoft.AspNetCore.Components;


namespace Kite.Gateway.Admin.Shared;

/// <summary>
/// 
/// </summary>
public sealed partial class MainLayout
{
    private bool UseTabSet { get; set; } = true;

    private string Theme { get; set; } = "";

    private bool IsFixedHeader { get; set; } = true;

    private bool IsFixedFooter { get; set; } = true;

    private bool IsFullSide { get; set; } = true;

    private bool ShowFooter { get; set; } = false;

    private List<MenuItem>? Menus { get; set; }

    [Inject]
    private AuthorizationServerStorage ServerStorage { get; set; }

    [Inject]
    private NavigationManager NavigationManager { get; set; }

    private AdministratorDto Administrator { get; set; }
    /// <summary>
    /// OnInitialized 方法
    /// </summary>
    protected override void OnInitialized()
    {
        base.OnInitialized();
        //如果没有登录则跳转到登录页面
        if (ServerStorage.IsLogin())
        {
            Administrator = ServerStorage.GetServerStorage();
        }
        else
        {
            //
            Administrator = new AdministratorDto() 
            {
                AdminName="未登录",
                NickName="未登录",
                Id=Guid.Empty
            };
        }
        Menus = GetIconSideMenuItems();
    }

    private static List<MenuItem> GetIconSideMenuItems()
    {
        var menus = new List<MenuItem>
            {
               new MenuItem()
                        {
                            Text = "首页",
                            Icon = "fa fa-home",
                            Url = "/",
                            IsActive = true
                        },
               new MenuItem()
               {
                   Text ="系统设置",
                   Icon ="fa fa-gear",
                   Url = "",
                   Id = "1",
                   Items = new List<MenuItem>()
                   {
                       
                       new MenuItem()
                        {
                            Text = "账号管理",
                            Icon = "fa fa-user",
                            Url = "/Administrator"
                        },
                        new MenuItem()
                        {
                            Text = "节点管理",
                            Icon = "fa fa-chain",
                            Url = "/Node"
                        }
                   }
               },         
               new MenuItem()
               {
                   Text="网关配置",
                   Icon = "fa fa-fw fa-database",
                   Items=new List<MenuItem>()
                   {
                       new MenuItem() { Text = "服务治理配置", Icon = "fa fa-cogs", Url = "/ServiceGovernance" },
                       new MenuItem() { Text = "身份认证配置(Jwt)", Icon = "fas fa-user-secret", Url = "/Authentication" },
                       new MenuItem() { Text = "白名单管理", Icon = "fas fa-paper-plane", Url = "/WhiteList" },
                       new MenuItem() { Text = "路由管理", Icon = "fa fa-external-link", Url = "/Route" },
                       new MenuItem(){ Text="中间件管理", Icon="fa fa-plug",Url="/Middleware"}
                   }
               } 
            };

        return menus;
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Shared/MainLayout.razor.css
================================================
.page {
    position: relative;
    display: flex;
    flex-direction: column;
}

main {
    flex: 1;
}

.sidebar {
    background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}

.top-row {
    background-color: #f7f7f7;
    border-bottom: 1px solid #d6d5d5;
    justify-content: flex-end;
    height: 3.5rem;
    display: flex;
    align-items: center;
}

    .top-row ::deep a, .top-row .btn-link {
        white-space: nowrap;
        margin-left: 1.5rem;
    }

    .top-row a:first-child {
        overflow: hidden;
        text-overflow: ellipsis;
    }

@media (max-width: 640.98px) {
    .top-row:not(.auth) {
        display: none;
    }

    .top-row.auth {
        justify-content: space-between;
    }

    .top-row a, .top-row .btn-link {
        margin-left: 0;
    }
}

@media (min-width: 641px) {
    .page {
        flex-direction: row;
    }

    .sidebar {
        width: 250px;
        height: 100vh;
        position: sticky;
        top: 0;
    }

    .top-row {
        position: sticky;
        top: 0;
        z-index: 1;
    }

    .top-row, article {
        padding-left: 2rem !important;
        padding-right: 1.5rem !important;
    }
}


================================================
FILE: admin/Kite.Gateway.Admin/Shared/SimpleLayout.razor
================================================
@inherits LayoutComponentBase


 @Body

@code {

}


================================================
FILE: admin/Kite.Gateway.Admin/_Imports.razor
================================================
@using System.Net.Http
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using Kite.Gateway.Admin
@using Kite.Gateway.Admin.Shared
@using BootstrapBlazor.Components

================================================
FILE: admin/Kite.Gateway.Admin/appsettings.json
================================================
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Default": "DataSource=./data/KiteGateway.db"
  }
}


================================================
FILE: admin/Kite.Gateway.Admin/wwwroot/css/open-iconic/FONT-LICENSE
================================================
SIL OPEN FONT LICENSE Version 1.1

Copyright (c) 2014 Waybury

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.


================================================
FILE: admin/Kite.Gateway.Admin/wwwroot/css/open-iconic/ICON-LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2014 Waybury

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

================================================
FILE: admin/Kite.Gateway.Admin/wwwroot/css/open-iconic/README.md
================================================
[Open Iconic v1.1.1](http://useiconic.com/open)
===========

### Open Iconic is the open source sibling of [Iconic](http://useiconic.com). It is a hyper-legible collection of 223 icons with a tiny footprint&mdash;ready to use with Bootstrap and Foundation. [View the collection](http://useiconic.com/open#icons)



## What's in Open Iconic?

* 223 icons designed to be legible down to 8 pixels
* Super-light SVG files - 61.8 for the entire set 
* SVG sprite&mdash;the modern replacement for icon fonts
* Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats
* Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats
* PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px.


## Getting Started

#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](http://useiconic.com/open#icons) and [Reference](http://useiconic.com/open#reference) sections.

### General Usage

#### Using Open Iconic's SVGs

We like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute).

```
<img src="/open-iconic/svg/icon-name.svg" alt="icon name">
```

#### Using Open Iconic's SVG Sprite

Open Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack.

Adding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `<svg>` *tag and a unique class name for each different icon in the* `<use>` *tag.*  

```
<svg class="icon">
  <use xlink:href="open-iconic.svg#account-login" class="icon-account-login"></use>
</svg>
```

Sizing icons only needs basic CSS. All the icons are in a square format, so just set the `<svg>` tag with equal width and height dimensions.

```
.icon {
  width: 16px;
  height: 16px;
}
```

Coloring icons is even easier. All you need to do is set the `fill` rule on the `<use>` tag.

```
.icon-account-login {
  fill: #f00;
}
```

To learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/).

#### Using Open Iconic's Icon Font...


##### …with Bootstrap

You can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}`


```
<link href="/open-iconic/font/css/open-iconic-bootstrap.css" rel="stylesheet">
```


```
<span class="oi oi-icon-name" title="icon name" aria-hidden="true"></span>
```

##### …with Foundation

You can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}`

```
<link href="/open-iconic/font/css/open-iconic-foundation.css" rel="stylesheet">
```


```
<span class="fi-icon-name" title="icon name" aria-hidden="true"></span>
```

##### …on its own

You can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}`

```
<link href="/open-iconic/font/css/open-iconic.css" rel="stylesheet">
```

```
<span class="oi" data-glyph="icon-name" title="icon name" aria-hidden="true"></span>
```


## License

### Icons

All code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT).

### Fonts

All fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web).


================================================
FILE: admin/Kite.Gateway.Admin/wwwroot/css/signin.css
================================================
html,
body {
  height: 100%;
}

body {
  display: flex;
  align-items: center;
  padding-top: 40px;
  padding-bottom: 40px;
  background-color: #f5f5f5;
}

.form-signin {
  width: 100%;
  max-width: 330px;
  padding: 15px;
  margin: auto;
}

.form-signin .checkbox {
  font-weight: 400;
}

.form-signin .form-floating:focus-within {
  z-index: 2;
}

.form-signin input[type="email"] {
  margin-bottom: -1px;
  border-bottom-right-radius: 0;
  border-bottom-left-radius: 0;
}

.form-signin input[type="password"] {
  margin-bottom: 10px;
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}


================================================
FILE: admin/Kite.Gateway.Admin/wwwroot/css/site.css
================================================
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');

html, body {
    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}

h1:focus {
    outline: none;
}

a, .btn-link {
    color: #0071c1;
}

.btn-primary {
    color: #fff;
    background-color: #1b6ec2;
    border-color: #1861ac;
}

.content {
    padding-top: 1.1rem;
}

.valid.modified:not([type=checkbox]) {
    outline: 1px solid #26b050;
}

.invalid {
    outline: 1px solid red;
}

.validation-message {
    color: red;
}

#blazor-error-ui {
    background: lightyellow;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui .dismiss {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }

.blazor-error-boundary {
    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
    padding: 1rem 1rem 1rem 3.7rem;
    color: white;
}

    .blazor-error-boundary::after {
        content: "An error has occurred."
    }


================================================
FILE: simples/Kite.Simple.Account/Authorization/ClaimModel.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kite.Simple.Account.Authorization
{
    public class ClaimModel
    {
        /// <summary>
        /// 声明名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 声明值
        /// </summary>
        public string Value { get; set; }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Authorization/IJwtTokenManager.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace Kite.Simple.Account.Authorization
{
    public interface IJwtTokenManager
    {
        /// <summary>
        /// 生成token
        /// </summary>
        /// <param name="claims"></param>
        /// <returns></returns>
        JwtTokenResult GenerateToken(List<Claim> claims);
    }
}


================================================
FILE: simples/Kite.Simple.Account/Authorization/JwtTokenAuthenticateResult.cs
================================================
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace Kite.Simple.Account.Authorization
{
    public class JwtTokenAuthenticateResult
    {
        /// <summary>
        /// 验证是否成功
        /// </summary>
        public bool Successed { get; set; }
        /// <summary>
        /// 消息
        /// </summary>
        public string Message { get; set; }
        /// <summary>
        /// 声明信息(验证成功时返回)
        /// </summary>
        public List<ClaimModel> Claims { get; set; }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Authorization/JwtTokenManager.cs
================================================
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.Extensions.Options;
using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.Hosting;
using System.IO;

namespace Kite.Simple.Account.Authorization
{
    public class JwtTokenManager: IJwtTokenManager
    {
        private readonly JwtTokenOptions _options;
        private readonly IWebHostEnvironment _env;
        public JwtTokenManager(IOptions<JwtTokenOptions> options, IWebHostEnvironment env)
        {
            _options = options?.Value;
            _env = env;
        }
        /// <summary>
        /// 生成Token
        /// </summary>
        /// <param name="claims">声明对象集合</param>
        /// <returns></returns>
        public JwtTokenResult GenerateToken(List<Claim> claims)
        {

            var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_options.SecurityKeyStr));
            var credentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
            var token = new JwtSecurityToken(
                _options.Issuer,
                _options.Audience,
                claims,
                DateTime.Now,
                DateTime.Now.AddSeconds(_options.ExpiresTime),
                credentials
            );
            var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
            return new JwtTokenResult()
            {
                AccessToken = jwtToken,
                EffectiveTime = _options.ExpiresTime,
                IssueTime = DateTime.Now,
                ExpiresTime = DateTime.Now.AddSeconds(_options.ExpiresTime)
            };
        }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Authorization/JwtTokenOptions.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kite.Simple.Account.Authorization
{
    public class JwtTokenOptions
    {
        /// <summary>
        /// 颁发者
        /// </summary>
        public string Issuer { get; set; }
        /// <summary>
        /// 观察者
        /// </summary>
        public string Audience { get; set; }
        /// <summary>
        /// token生成与验证密钥
        /// </summary>
        public string SecurityKeyStr { get; set; }
        /// <summary>
        /// 过期时间(单位:秒)
        /// </summary>
        public int ExpiresTime { get; set; }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Authorization/JwtTokenResult.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kite.Simple.Account.Authorization
{
    public class JwtTokenResult
    {
        /// <summary>
        /// token
        /// </summary>
        public string AccessToken {  get; set; }
        /// <summary>
        /// 有效时长(单位:分钟)
        /// </summary>
        public int EffectiveTime { get; set; }
        /// <summary>
        /// 颁发时间
        /// </summary>
        public DateTime IssueTime { get; set; }
        /// <summary>
        /// 过期时间
        /// </summary>
        public DateTime ExpiresTime { get; set; }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Controllers/AccountController.cs
================================================
using Kite.Simple.Account.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Kite.Simple.Account.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AccountController : ControllerBase
    {
        /// <summary>
        /// 创建账号
        /// </summary>
        /// <param name="createAccount"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CreateAsync(CreateAccountDto createAccount)
        {
            return Ok(createAccount);
        }
        /// <summary>
        /// 获取账号信息
        /// </summary>
        /// <param name="accountName">账号名</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAsync(string accountName)
        {
            return Ok(new 
            {
                AccountName= accountName,
                Password="123456",
                NickName="法外狂徒张三"
            });
        }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Controllers/LoginController.cs
================================================
using Kite.Simple.Account.Authorization;
using Kite.Simple.Account.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
namespace Kite.Simple.Account.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class LoginController : ControllerBase
    {
        private readonly IJwtTokenManager _jwtTokenManager;

        public LoginController(IJwtTokenManager jwtTokenManager)
        {
            _jwtTokenManager = jwtTokenManager;
        }

        /// <summary>
        /// 登录(测试账号:test/123456)
        /// </summary>
        /// <param name="accountLogin"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult PostAsync(AccountLoginDto accountLogin)
        {
            if (accountLogin.AccountName != "test" && accountLogin.Password != "123456")
            {
                throw new Exception("账号密码错误");
            }
            var result = new AccountLoginResultDto();
            result.AccountName = accountLogin.AccountName;
            result.NickName = "法外狂徒张三";
            //
            var claims = new List<Claim>();
            claims.Add(new Claim("AccountName", accountLogin.AccountName));
            claims.Add(new Claim("NickName", result.NickName));
            result.JwtToken = _jwtTokenManager.GenerateToken(claims);
            return Ok(result);
        }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Controllers/MiddlewareController.cs
================================================
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
namespace Kite.Simple.Account.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class MiddlewareController : ControllerBase
    {
        /// <summary>
        /// 中间件判断
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult PostAsync()
        {
            foreach (var item in Request.Headers)
            {
                Console.WriteLine(JsonSerializer.Serialize(item));
            }
            return Ok();
        }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Controllers/WeatherForecastController.cs
================================================
using Microsoft.AspNetCore.Mvc;

namespace Kite.Simple.Account.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}

================================================
FILE: simples/Kite.Simple.Account/Kite.Simple.Account.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.6" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
  </ItemGroup>

</Project>


================================================
FILE: simples/Kite.Simple.Account/Models/AccountLoginDto.cs
================================================
using System.ComponentModel.DataAnnotations;

namespace Kite.Simple.Account.Models
{
    public class AccountLoginDto
    {
        /// <summary>
        /// 账号名
        /// </summary>
        [Required]
        public string AccountName { get; set; }
        /// <summary>
        /// 密码
        /// </summary>
        [Required]
        public string Password { get; set; }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Models/AccountLoginResultDto.cs
================================================
using Kite.Simple.Account.Authorization;

namespace Kite.Simple.Account.Models
{
    public class AccountLoginResultDto
    {
        /// <summary>
        /// 账号名
        /// </summary>
        public string AccountName { get; set; }
        /// <summary>
        /// 昵称
        /// </summary>
        public string NickName { get; set; }
        /// <summary>
        /// 授权token
        /// </summary>
        public JwtTokenResult JwtToken { get; set; }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Models/CreateAccountDto.cs
================================================
using System.ComponentModel.DataAnnotations;
namespace Kite.Simple.Account.Models
{
    public class CreateAccountDto
    {
        /// <summary>
        /// 账号名
        /// </summary>
        [Required]
        public string AccountName { get; set; }
        /// <summary>
        /// 密码
        /// </summary>
        [Required]
        public string Password { get; set; }
        /// <summary>
        /// 昵称
        /// </summary>
        [Required]
        public string NickName { get; set; }
    }
}


================================================
FILE: simples/Kite.Simple.Account/Program.cs
================================================
using Kite.Simple.Account.Authorization;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.Configure<JwtTokenOptions>(builder.Configuration.GetSection("Authorization"));
builder.Services.AddSingleton<IJwtTokenManager, JwtTokenManager>();
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();

app.MapControllers();

app.Run();


================================================
FILE: simples/Kite.Simple.Account/Properties/launchSettings.json
================================================
{
  "$schema": "https://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:24268",
      "sslPort": 0
    }
  },
  "profiles": {
    "Kite.Simple.Account": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:55667",
      "dotnetRunMessages": true
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

================================================
FILE: simples/Kite.Simple.Account/WeatherForecast.cs
================================================
namespace Kite.Simple.Account
{
    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

        public string? Summary { get; set; }
    }
}

================================================
FILE: simples/Kite.Simple.Account/appsettings.json
================================================
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Authorization": {
    "Issuer": "kite.top", //颁发者
    "Audience": "kite.top", //观察者
    "SecurityKeyStr": "SFYHDzdXrFRZIPhbpkJdWbpgBfQ3yNUa", //密钥字符串
    "ExpiresTime": 7200
  }
}


================================================
FILE: simples/Kite.Simple.Order/Controllers/OrderController.cs
================================================
using Kite.Simple.Order.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Kite.Simple.Order.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class OrderController : ControllerBase
    {
        /// <summary>
        /// 创建订单
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CreateAsync(CreateOrderDto createOrder)
        {
            var result = new
            {
                AccountId = createOrder.AccountId,
                ProductId = createOrder.ProductId,
                Price = createOrder.Price,
                BuyCount = createOrder.BuyCount,
                OrderNo = "T202207090001",
                TotalAmount= createOrder.Price* createOrder.BuyCount
            };
            return Ok(result);
        }
        /// <summary>
        /// 获取订单信息
        /// </summary>
        /// <param name="orderNo">订单号</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAsync(string orderNo)
        {
            var result = new
            {
                AccountId = 1,
                ProductId = 1,
                Price = 9.9,
                BuyCount = 10,
                OrderNo = orderNo,
                TotalAmount = 99
            };
            return Ok(result);
        }
    }
}


================================================
FILE: simples/Kite.Simple.Order/Controllers/WeatherForecastController.cs
================================================
using Microsoft.AspNetCore.Mvc;

namespace Kite.Simple.Order.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}

================================================
FILE: simples/Kite.Simple.Order/Kite.Simple.Order.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
  </ItemGroup>

</Project>


================================================
FILE: simples/Kite.Simple.Order/Models/CreateOrderDto.cs
================================================
namespace Kite.Simple.Order.Models
{
    public class CreateOrderDto
    {
        /// <summary>
        /// 下单账号ID
        /// </summary>
        public int AccountId { get; set; }
        /// <summary>
        /// 产品ID
        /// </summary>
        public int ProductId { get; set; }
        /// <summary>
        /// 单价
        /// </summary>
        public decimal Price { get; set; }
        /// <summary>
        /// 购买数量
        /// </summary>
        public int BuyCount { get; set; }
    }
}


================================================
FILE: simples/Kite.Simple.Order/Program.cs
================================================
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();

app.MapControllers();

app.Run();


================================================
FILE: simples/Kite.Simple.Order/Properties/launchSettings.json
================================================
{
  "$schema": "https://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:31561",
      "sslPort": 0
    }
  },
  "profiles": {
    "Kite.Simple.Order": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:55665",
      "dotnetRunMessages": true
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

================================================
FILE: simples/Kite.Simple.Order/WeatherForecast.cs
================================================
namespace Kite.Simple.Order
{
    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

        public string? Summary { get; set; }
    }
}

================================================
FILE: simples/Kite.Simple.Order/appsettings.json
================================================
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}


================================================
FILE: simples/Kite.SimpleServices.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32616.157
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kite.Simple.Account", "Kite.Simple.Account\Kite.Simple.Account.csproj", "{C8CABF49-AC3C-4409-9052-DCD4DB05D95B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kite.Simple.Order", "Kite.Simple.Order\Kite.Simple.Order.csproj", "{5B542B99-706E-4233-8DC8-FC6323DCFDCC}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{C8CABF49-AC3C-4409-9052-DCD4DB05D95B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{C8CABF49-AC3C-4409-9052-DCD4DB05D95B}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{C8CABF49-AC3C-4409-9052-DCD4DB05D95B}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{C8CABF49-AC3C-4409-9052-DCD4DB05D95B}.Release|Any CPU.Build.0 = Release|Any CPU
		{5B542B99-706E-4233-8DC8-FC6323DCFDCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{5B542B99-706E-4233-8DC8-FC6323DCFDCC}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{5B542B99-706E-4233-8DC8-FC6323DCFDCC}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{5B542B99-706E-4233-8DC8-FC6323DCFDCC}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {A0942BEF-2D59-4E9C-AC1A-95B5603A89D3}
	EndGlobalSection
EndGlobal


================================================
FILE: src/Kite.Gateway.Application/AdministratorAppService.cs
================================================
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Application.Contracts.Dtos.Administrator;
using Kite.Gateway.Domain.Administrator;
using Kite.Gateway.Domain.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Mapster;
using Kite.Gateway.Domain.Shared;

namespace Kite.Gateway.Application
{
    public class AdministratorAppService : BaseApplicationService, IAdministratorAppService
    {
        private readonly IRepository<Administrator> _repository;
        private readonly IAdministratorManager _administratorManager;

        public AdministratorAppService(IAdministratorManager administratorManager, IRepository<Administrator> repository)
        {
            _administratorManager = administratorManager;
            _repository = repository;
        }
        public async Task<KiteResult<AdministratorDto>> LoginAsync(LoginAdministratorDto loginAdministrator)
        {
            //如果账号未初始化则默认初始化一个账号
            if (await _repository.CountAsync() <= 0)
            {
                await _repository.InsertAsync(new Administrator(GuidGenerator.Create())
                {
                    AdminName = "admin",
                    Password = TextHelper.MD5Encrypt("admin"),
                    Created = DateTime.Now,
                    NickName = "默认管理员",
                    Updated = DateTime.Now
                });
                await CurrentUnitOfWork.SaveChangesAsync();
            }
            var administrator =await _administratorManager.LoginAsync(loginAdministrator.AdminName, TextHelper.MD5Encrypt(loginAdministrator.Password));
            var result = TypeAdapter.Adapt<AdministratorDto>(administrator);
            return Ok(result);
        }

        public async Task<KiteResult> CreateAsync(CreateAdministratorDto createAdministrator)
        {
            var model =await _administratorManager.CreateAsync(createAdministrator.AdminName);
            model.AdminName = createAdministrator.AdminName;
            model.NickName = createAdministrator.NickName;
            model.Password = TextHelper.MD5Encrypt(createAdministrator.Password);
            await _repository.InsertAsync(model);
            return Ok();
        }

        public async Task<KiteResult> DeleteAsync(Guid id)
        {
            await _repository.DeleteAsync(x => x.Id == id);
            return Ok();
        }

        public async Task<KiteResult<AdministratorDto>> GetAsync(Guid id)
        {
            var result = (await _repository.GetQueryableAsync())
                .Where(x => x.Id == id)
                .ProjectToType<AdministratorDto>()
                .FirstOrDefault();
            return Ok(result);
        }

        public async Task<KitePageResult<List<AdministratorDto>>> GetListAsync(int page = 1, int pageSize = 10)
        {
            var query = (await _repository.GetQueryableAsync());
            var result = query.OrderByDescending(x => x.Created)
                .PageBy((page - 1) * pageSize, pageSize)
                .ProjectToType<AdministratorDto>()
                .ToList();
            return Ok(result, query.Count());
        }

        

        public async Task<KiteResult> UpdateAsync(UpdateAdministratorDto updateAdministrator)
        {
            var model = await _administratorManager.UpdateAsync(updateAdministrator.Id, updateAdministrator.AdminName);
            model.AdminName = updateAdministrator.AdminName;
            model.NickName = updateAdministrator.NickName;
            model.Updated = DateTime.Now;
            if (!string.IsNullOrEmpty(updateAdministrator.Password) && updateAdministrator.Password != "")
            {
                model.Password = TextHelper.MD5Encrypt(updateAdministrator.Password);
            }
            await _repository.UpdateAsync(model);
            return Ok();
        }
    }
}


================================================
FILE: src/Kite.Gateway.Application/ApplicationModule.cs
================================================
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Domain;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Modularity;

namespace Kite.Gateway.Application
{
    [DependsOn(
        typeof(DomainModule),
        typeof(ApplicationContractsModule)
        )]
    public class ApplicationModule:AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            //在此处注入依赖项
        }
    }
}


================================================
FILE: src/Kite.Gateway.Application/AuthorizationAppService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Application.Contracts.Dtos.Authorization;
using Kite.Gateway.Domain.Entities;
using Volo.Abp.Domain.Repositories;
using Mapster;
namespace Kite.Gateway.Application
{
    public class AuthorizationAppService : BaseApplicationService, IAuthorizationAppService
    {
        private readonly IRepository<AuthenticationConfigure> _authenticationRepository;

        public AuthorizationAppService(IRepository<AuthenticationConfigure> authenticationRepository)
        {
            _authenticationRepository = authenticationRepository;

        }

        public async Task<KiteResult<SaveAuthenticationDto>> GetAuthenticationAsync()
        {
            var result= (await _authenticationRepository.GetQueryableAsync())
                .ProjectToType<SaveAuthenticationDto>()
                .FirstOrDefault();
            if (result == null)
            {
                result = new SaveAuthenticationDto() 
                {
                    UseState = true
                };
            }
            return Ok(result);
        }

        public async Task<KiteResult> SaveAuthenticationAsync(SaveAuthenticationDto authenticationDto)
        {
            var model =await _authenticationRepository.FirstOrDefaultAsync();
            if (model == null)
            {
                model = new AuthenticationConfigure(GuidGenerator.Create());
                TypeAdapter.Adapt(authenticationDto, model);
                await _authenticationRepository.InsertAsync(model);
            }
            else
            {
                TypeAdapter.Adapt(authenticationDto, model);
                
                await _authenticationRepository.UpdateAsync(model);
            }
            return Ok();
        }
    }
}


================================================
FILE: src/Kite.Gateway.Application/BaseApplicationService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Services;

namespace Kite.Gateway.Application
{
    /// <summary>
    /// 
    /// </summary>
    public class BaseApplicationService : ApplicationService
    {
        /// <summary>
        /// 抛出异常
        /// </summary>
        /// <param name="msg">消息</param>
        /// <exception cref="Exception"></exception>
        [RemoteService(IsEnabled = false)]
        public static void ThrownFailed(string msg)
        {
            throw new SimpleHttpException(msg);
        }
        /// <summary>
        /// 成功返回
        /// </summary>
        /// <returns></returns>
        [RemoteService(IsEnabled = false)]
        public static KiteResult Ok()
        {
            return new KiteResult()
            {
                Code = 0,
                Message = "success"
            };
        }
        /// <summary>
        /// 成功返回
        /// </summary>
        /// <param name="data">数据</param>
        /// <returns></returns>
        [RemoteService(IsEnabled = false)]
        public static KiteResult<TResult> Ok<TResult>(TResult data)
        {
            return new KiteResult<TResult>()
            {
                Code = 0,
                Message = "success",
                Data = data
            };
        }
        /// <summary>
        /// 成功返回
        /// </summary>
        /// <param name="data">数据</param>
        /// <param name="totalCount">总记录数</param>
        /// <returns></returns>
        [RemoteService(IsEnabled = false)]
        public static KitePageResult<TResult> Ok<TResult>(TResult data, int totalCount)
        {
            return new KitePageResult<TResult>()
            {
                Code = 0,
                Message = "success",
                Data = data,
                Count = totalCount
            };
        }
        /// <summary>
        /// 返回自定义状态码 
        /// </summary>
        /// <param name="code">状态码</param>
        /// <param name="message"></param>
        /// <returns></returns>
        [RemoteService(IsEnabled = false)]
        public static KiteResult Customize(int code, string message = "")
        {
            return new KiteResult()
            {
                Code = code,
                Message = message
            };
        }
        /// <summary>
        /// 返回自定义状态码 
        /// </summary>
        /// <param name="code">状态码</param>
        /// <param name="message"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        [RemoteService(IsEnabled = false)]
        public static KiteResult<TResult> Customize<TResult>(int code, string message, TResult data)
        {
            return new KiteResult<TResult>()
            {
                Code = code,
                Message = message,
                Data = data
            };
        }
    }
}


================================================
FILE: src/Kite.Gateway.Application/ConfigureAppService.cs
================================================
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Application.Contracts.Dtos;
using Kite.Gateway.Application.Contracts.Dtos.Node;
using Kite.Gateway.Domain;
using Kite.Gateway.Domain.Entities;
using Kite.Gateway.Domain.ReverseProxy;
using Kite.Gateway.Domain.Shared.Options;
using Mapster;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;

namespace Kite.Gateway.Application
{
    public class ConfigureAppService: BaseApplicationService,IConfigureAppService
    {
        private readonly IServiceProvider _serviceProvider;
        public ConfigureAppService(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
        public async Task<KiteResult<RefreshConfigureDto>> GetConfigureAsync(ReloadConfigureDto reloadConfigure)
        {
            var result = new RefreshConfigureDto();
            if (reloadConfigure.IsReloadAuthentication)
            {
                var repository = _serviceProvider.GetService<IRepository<AuthenticationConfigure>>();
                result.Authentication = (await repository.GetQueryableAsync())
                    .ProjectToType<AuthenticationOption>()
                    .FirstOrDefault();
            }
            if (reloadConfigure.IsReloadMiddleware)
            {
                var repository = _serviceProvider.GetService<IRepository<Middleware>>();
                result.Middlewares = (await repository.GetQueryableAsync())
                    .Where(x => x.UseState)
                    .OrderByDescending(x => x.ExecWeight)
                    .ProjectToType<MiddlewareOption>()
                    .ToList();
            }
            if (reloadConfigure.IsReloadWhitelist)
            {
                var repository = _serviceProvider.GetService<IRepository<Whitelist>>();
                result.Whitelists = (await repository.GetQueryableAsync())
                    .Where(x => x.UseState)
                    .Select(x => new WhitelistOption()
                    {
                        FilterText = x.FilterText,
                        Id = x.Id,
                        Name = x.Name,
                        RequestMethod = x.RequestMethod,
                        RouteId = x.RouteId.HasValue ? x.RouteId.ToString().ToLower() : "00000000-0000-0000-0000-000000000000"
                    })
                    .ToList();
            }
            if (reloadConfigure.IsReloadYarp)
            {
                var yarpManager = _serviceProvider.GetService<IYarpManager>();
                result.Yarp = await yarpManager.GetConfigureAsync();
            }
            return Ok(result);
        }

    }
}


================================================
FILE: src/Kite.Gateway.Application/Kite.Gateway.Application.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <BaseOutputPath></BaseOutputPath>
    <GenerateDocumentationFile>False</GenerateDocumentationFile>
    <DocumentationFile>Kite.Gateway.Application.xml</DocumentationFile>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <NoWarn>1701;1702;8602;1591</NoWarn>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <NoWarn>1701;1702;8602;1591</NoWarn>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Volo.Abp.Ddd.Application" Version="7.0.1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\Kite.Gateway.Application.Contracts\Kite.Gateway.Application.Contracts.csproj" />
    <ProjectReference Include="..\Kite.Gateway.Domain\Kite.Gateway.Domain.csproj" />
  </ItemGroup>

</Project>


================================================
FILE: src/Kite.Gateway.Application/MiddlewareAppService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Application.Contracts.Dtos.Middleware;
using Kite.Gateway.Domain.Entities;
using Kite.Gateway.Domain.Middlewares;
using Mapster;
using Volo.Abp.Domain.Repositories;

namespace Kite.Gateway.Application
{
    /// <summary>
    /// 中间件管理服务
    /// </summary>
    public class MiddlewareAppService : BaseApplicationService, IMiddlewareAppService
    {
        private readonly IMiddlewareManager _middlewareManager;
        private readonly IRepository<Middleware> _repository;
        public MiddlewareAppService(IMiddlewareManager middlewareManager, IRepository<Middleware> repository)
        {
            _middlewareManager = middlewareManager;
            _repository = repository;
        }

        public async Task<KiteResult> CreateAsync(CreateMiddlewareDto middlewareDto)
        {
            var model =await _middlewareManager.CreateAsync(middlewareDto.Name, middlewareDto.Server);
            TypeAdapter.Adapt(middlewareDto, model);
            await _repository.InsertAsync(model);
            return Ok();
        }

        public async Task<KiteResult> DeleteAsync(Guid id)
        {
            await _repository.DeleteAsync(x => x.Id == id);
            return Ok();
        }

        public async Task<KiteResult<MiddlewareDto>> GetAsync(Guid id)
        {
            var result = (await _repository.GetQueryableAsync())
                .Where(x => x.Id == id)
                .ProjectToType<MiddlewareDto>()
                .FirstOrDefault();
            return Ok(result);
        }

        public async Task<KitePageResult<List<MiddlewareListDto>>> GetListAsync(string kw = "", int page = 1, int pageSize = 10)
        {
            var query = (await _repository.GetQueryableAsync())
                .WhereIf(!string.IsNullOrEmpty(kw) && kw != "", x => x.Name.Contains(kw) || x.Server.Contains(kw));
            var totalCount = query.Count();
            var result = query
                .OrderByDescending(x => x.Created)
                .PageBy((page - 1) * pageSize, pageSize)
                .ProjectToType<MiddlewareListDto>()
                .ToList();
            return Ok(result, totalCount);
        }

        public async Task<KiteResult> UpdateAsync(UpdateMiddlewareDto middlewareDto)
        {
            var model =await _middlewareManager.UpdateAsync(middlewareDto.Id, middlewareDto.Name, middlewareDto.Server);
            TypeAdapter.Adapt(middlewareDto, model);
            model.Updated = DateTime.Now;
            await _repository.UpdateAsync(model);
            return Ok();
        }

        public async Task<KiteResult> UpdateUseStateAsync(Guid id, bool useState)
        {
            var model = await _repository.FirstOrDefaultAsync(x=>x.Id==id);
            model.UseState = useState;
            model.Updated = DateTime.Now;
            await _repository.UpdateAsync(model);
            return Ok();
        }
    }
}


================================================
FILE: src/Kite.Gateway.Application/NodeAppService.cs
================================================
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Application.Contracts.Dtos.Node;
using Kite.Gateway.Domain.Entities;
using Kite.Gateway.Domain.Node;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Mapster;
namespace Kite.Gateway.Application
{
    public class NodeAppService : BaseApplicationService, INodeAppService
    {
        private readonly IRepository<Node> _repository;
        private readonly INodeManager _nodeManager;

        public NodeAppService(IRepository<Node> repository, INodeManager nodeManager)
        {
            _repository = repository;
            _nodeManager = nodeManager;
        }

        public async Task<KiteResult> CreateAsync(CreateNodeDto createNode)
        {
            createNode.Server = createNode.Server.TrimEnd('/');
            var model =await _nodeManager.CreateAsync(createNode.NodeName, createNode.Server);
            TypeAdapter.Adapt(createNode, model);
            await _repository.InsertAsync(model);
            return Ok();
        }

        public async Task<KiteResult> DeleteAsync(Guid id)
        {
            await _repository.DeleteAsync(x=>x.Id==id);
            return Ok();
        }

        public async Task<KiteResult<List<NodeDto>>> GetAllAsync()
        {
            var result = (await _repository.GetQueryableAsync())
                .OrderByDescending(x => x.Created)
                .ProjectToType<NodeDto>()
                .ToList();
            return Ok(result);
        }

        public async Task<KiteResult<NodeDto>> GetAsync(Guid id)
        {
            var result= (await _repository.GetQueryableAsync())
                .Where(x => x.Id == id)
                .ProjectToType<NodeDto>()
                .FirstOrDefault();
            return Ok(result);
        }

        public async Task<KitePageResult<List<NodeDto>>> GetListAsync(int page = 1, int pageSize = 10)
        {
            var query = await _repository.GetQueryableAsync();
            var result = query
                .OrderByDescending(x => x.Created)
                .PageBy((page - 1) * pageSize, pageSize)
                .ProjectToType<NodeDto>()
                .ToList();
            return Ok(result, query.Count());
        }

        public async Task<KiteResult> UpdateAsync(UpdateNodeDto updateNode)
        {
            updateNode.Server = updateNode.Server.TrimEnd('/');
            var model =await _nodeManager.UpdateAsync(updateNode.Id, updateNode.NodeName, updateNode.Server);
            TypeAdapter.Adapt(updateNode, model);
            model.Updated = DateTime.Now;
            await _repository.UpdateAsync(model);
            return Ok();
        }
    }
}


================================================
FILE: src/Kite.Gateway.Application/RefreshAppService.cs
================================================
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.DependencyInjection;
using Kite.Gateway.Domain.ReverseProxy;
using Volo.Abp;
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Domain;
using Kite.Gateway.Application.Contracts.Dtos.Node;
using Kite.Gateway.Application.Contracts.Dtos;
using Mapster;
using Kite.Gateway.Domain.Shared.Options;
using Kite.Gateway.Domain.Entities;

namespace Kite.Gateway.Application
{
    public class RefreshAppService : BaseApplicationService, IRefreshAppService
    {
        private readonly IRefreshManager _refreshManager;
        private readonly IConfigureManager _configureManager;
        public RefreshAppService( IConfigureManager configureManager, IRefreshManager refreshManager)
        {
            _configureManager = configureManager;
            _refreshManager = refreshManager;
        }
        public async Task<KiteResult> RefreshConfigureAsync(RefreshConfigureDto refreshConfigure)
        {
            //加载基础配置
            if (refreshConfigure.Authentication != null)
            {
                _configureManager.ReloadAuthentication(refreshConfigure.Authentication);
            }
            if (refreshConfigure.Whitelists!=null)
            {
                _configureManager.ReloadWhitelist(refreshConfigure.Whitelists);
            }
            if (refreshConfigure.Middlewares != null)
            {
                _configureManager.ReloadMiddleware(refreshConfigure.Middlewares);
            }
            //加载路由等数据
            if (refreshConfigure.Yarp != null)
            {
                _configureManager.ReloadYayp(refreshConfigure.Yarp);
                await _refreshManager.ReloadConfigAsync();
            }
            return Ok();
        }
    }
}


================================================
FILE: src/Kite.Gateway.Application/RouteAppService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Services;
using Mapster;
using Volo.Abp.Application.Services;
using Kite.Gateway.Domain;
using Microsoft.AspNetCore.Mvc;
using Kite.Gateway.Domain.ReverseProxy;
using Volo.Abp;
using Kite.Gateway.Application.Contracts.Dtos.ReverseProxy;
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Domain.Entities;
using Kite.Gateway.Domain.Shared.Enums;

namespace Kite.Gateway.Application
{
    /// <summary>
    /// 路由相关接口
    /// </summary>
    public class RouteAppService: BaseApplicationService,IRouteAppService
    {
        private readonly IClusterManager _clusterManager;
        private readonly IRouteManager _routeManager;

        private readonly IRepository<Route> _routeRepository;
        private readonly IRepository<RouteTransform> _routeTransformRepository;
        private readonly IRepository<Cluster> _clusterRepository;
        private readonly IRepository<ClusterDestination> _clusterDestinationRepository;
        private readonly IRepository<ClusterHealthCheck> _clusterHealthCheckRepository;
        public RouteAppService(IRepository<Route> routeRepository
            , IRepository<Cluster> clusterRepository
            , IRepository<ClusterDestination> clusterDestinationRepository
            , IRepository<RouteTransform> routeTransformRepository
            , IClusterManager clusterManager, IRouteManager routeManager, IRepository<ClusterHealthCheck> clusterHealthCheckRepository)
        {
            _clusterManager = clusterManager;
            _routeManager = routeManager;

            _routeRepository = routeRepository;
            _clusterRepository = clusterRepository;
            _clusterDestinationRepository = clusterDestinationRepository;
            _routeTransformRepository = routeTransformRepository;
            _clusterHealthCheckRepository = clusterHealthCheckRepository;
        }
        /// <summary>
        /// 创建路由
        /// </summary>
        /// <param name="createRouteDto"></param>
        /// <returns></returns>
        public async Task<KiteResult> CreateAsync(CreateRouteDto createRouteDto)
        {
            var route = await _routeManager.CreateAsync(createRouteDto.RouteName, createRouteDto.RouteMatchPath, createRouteDto.UseState, createRouteDto.Description);
            //插入路由信息
            await _routeRepository.InsertAsync(route);
            await CurrentUnitOfWork.SaveChangesAsync();
            //路由转换配置
            if (!string.IsNullOrEmpty(createRouteDto.PathRemovePrefix)&&createRouteDto.PathRemovePrefix!="")
            {
                await _routeTransformRepository.InsertAsync(await _routeManager.CreateRouteTransformAsync(route.Id, "PathRemovePrefix", createRouteDto.PathRemovePrefix));
            }
            if (!string.IsNullOrEmpty(createRouteDto.PathPrefix) && createRouteDto.PathPrefix != "")
            {
                await _routeTransformRepository.InsertAsync(await _routeManager.CreateRouteTransformAsync(route.Id, "PathPrefix", createRouteDto.PathPrefix));
            }
            //插入集群信息
            var cluster = await _clusterManager.CreateAsync(route.Id, route.RouteName
                , createRouteDto.ServiceGovernanceType
                , createRouteDto.ServiceGovernanceType != ServiceGovernanceType.Default ? createRouteDto.ClusterDestinationValue : ""
                , createRouteDto.LoadBalancingPolicy);

            await _clusterRepository.InsertAsync(cluster);
            await CurrentUnitOfWork.SaveChangesAsync();
            //集群目的地信息
            if (createRouteDto.ServiceGovernanceType == ServiceGovernanceType.Default)
            {
                var clusterDestinations = new List<ClusterDestination>();

                var destinations = createRouteDto.ClusterDestinationValue.Split(',');
                foreach (var destination in destinations)
                {
                    clusterDestinations.Add(await _clusterManager.CreateClusterDestinationAsync(cluster.Id, GuidGenerator.Create().ToString().Replace("-", ""), destination));
                }
                await _clusterDestinationRepository.InsertManyAsync(clusterDestinations);
            }
            //集群健康检查信息
            if (createRouteDto.ClusterHealthCheck != null)
            {
                createRouteDto.ClusterHealthCheck.ClusterId = cluster.Id;
                var healthCheck =await _clusterManager.CreateHealthCheckAsync(createRouteDto.ClusterHealthCheck);
                await _clusterHealthCheckRepository.InsertAsync(healthCheck);
            }
            await CurrentUnitOfWork.SaveChangesAsync();
            return Ok();
        }
        /// <summary>
        /// 删除路由
        /// </summary>
        /// <param name="routeId">路由ID</param>
        /// <returns></returns>
        public async Task<KiteResult> DeleteAsync(Guid routeId)
        {
            await _routeRepository.DeleteAsync(x=>x.Id==routeId);
            return Ok();
        }
        /// <summary>
        /// 获取路由列表
        /// </summary>
        /// <param name="kw">关键字</param>
        /// <param name="page">当前页码</param>
        /// <param name="pageSize">每页记录数</param>
        /// <returns></returns>
        public async Task<KitePageResult<List<RoutePageDto>>> GetListAsync(string kw = "", int page = 1, int pageSize = 10)
        {
            var query =(await _routeRepository.GetQueryableAsync()).WhereIf(!string.IsNullOrEmpty(kw) && kw != "", x => x.RouteName.Contains(kw));
            var totalCount = query.Count();
            var result = query
                .Join((await _clusterRepository.GetQueryableAsync()), x => x.Id, y => y.RouteId, (x, y) =>new RoutePageDto()
                {
                    Created = x.Created,
                    Description=x.Description,
                    Id = x.Id,
                    LoadBalancingPolicy=y.LoadBalancingPolicy,
                    RouteMatchPath=x.RouteMatchPath,
                    RouteName=x.RouteName,
                    ServiceGovernanceName=y.ServiceGovernanceName,
                    ServiceGovernanceType=y.ServiceGovernanceType,
                    UseState =x.UseState,
                    ClusterId=y.Id
                })
                .OrderByDescending(x => x.Created)
                .PageBy((page - 1) * pageSize, pageSize)
                .ToList();
            //获取集群目的地
            var clusters = await _clusterDestinationRepository.GetListAsync();
            foreach (var item in result)
            {
                if (item.ServiceGovernanceType == ServiceGovernanceType.Default)
                {
                    item.ServiceGovernanceName = string.Join(',', clusters.Where(x => x.ClusterId == item.ClusterId).Select(x => x.DestinationAddress).ToList());
                }
            }
            return Ok(result, totalCount);
        }
        /// <summary>
        /// 根据路由ID获取路由信息
        /// </summary>
        /// <param name="routeId">路由ID</param>
        /// <returns></returns>
        public async Task<KiteResult<RouteDto>> GetAsync(Guid routeId)
        {
            var query = await _routeRepository.GetQueryableAsync();
            //查询基本信息
            var route = query.ProjectToType<RouteDto>().Where(x => x.Id == routeId).FirstOrDefault();
            if (route == null)
            {
                ThrownFailed("路由数据不存在");
            }
            route.RouteTransforms = (await _routeTransformRepository.GetQueryableAsync()).ProjectToType<RouteTransformDto>().Where(x => x.RouteId == route.Id).ToList();

            //查询集群信息
            route.Cluster = (await _clusterRepository.GetQueryableAsync()).ProjectToType<ClusterDto>().Where(x => x.RouteId == route.Id).First();
            route.Cluster.ClusterDestinations = (await _clusterDestinationRepository.GetQueryableAsync()).ProjectToType<ClusterDestinationDto>().Where(x => x.ClusterId == route.Cluster.Id).ToList();
            route.Cluster.HealthCheck = (await _clusterHealthCheckRepository.GetQueryableAsync())
                .Where(x => x.ClusterId == route.Cluster.Id)
                .ProjectToType<ClusterHealthCheckDto>()
                .FirstOrDefault();
            return Ok(route);
        }
        /// <summary>
        /// 更新路由信息
        /// </summary>
        /// <param name="updateRouteDto"></param>
        /// <returns></returns>
        public async Task<KiteResult> UpdateAsync(UpdateRouteDto updateRouteDto)
        {
            //更新路由信息
            var model = await _routeRepository.FirstOrDefaultAsync(x => x.Id == updateRouteDto.RouteId);
            model.Updated = DateTime.Now;
            TypeAdapter.Adapt(updateRouteDto, model);
            await _routeRepository.UpdateAsync(model);
            //路由转换配置
            await _routeTransformRepository.DeleteAsync(x => x.RouteId == model.Id);
            if (!string.IsNullOrEmpty(updateRouteDto.PathRemovePrefix) && updateRouteDto.PathRemovePrefix != "")
            {
                await _routeTransformRepository.InsertAsync(await _routeManager.CreateRouteTransformAsync(model.Id, "PathRemovePrefix", updateRouteDto.PathRemovePrefix));
            }
            if (!string.IsNullOrEmpty(updateRouteDto.PathPrefix) && updateRouteDto.PathPrefix != "")
            {
                await _routeTransformRepository.InsertAsync(await _routeManager.CreateRouteTransformAsync(model.Id, "PathPrefix", updateRouteDto.PathPrefix));
            }
            //更新集群信息
            var cluster = await _clusterRepository.FirstOrDefaultAsync(x => x.RouteId == updateRouteDto.RouteId);
            TypeAdapter.Adapt(updateRouteDto, cluster);
            if (updateRouteDto.ServiceGovernanceType != ServiceGovernanceType.Default)
            {
                cluster.ServiceGovernanceName = updateRouteDto.ClusterDestinationValue;
            }
            else
            {
                cluster.ServiceGovernanceName = "";
            }
            await _clusterRepository.UpdateAsync(cluster);

            var clusterDestinations = await _clusterDestinationRepository.GetListAsync(x=>x.ClusterId==cluster.Id);
            //移除原有集群下的目的地数据
            await _clusterDestinationRepository.DeleteManyAsync(clusterDestinations);
            //新增集群下目的地地址
            //集群目的地信息
            if (updateRouteDto.ServiceGovernanceType == ServiceGovernanceType.Default)
            {
                var newDestinations = new List<ClusterDestination>();

                var destinations = updateRouteDto.ClusterDestinationValue.Split(',');
                foreach (var destination in destinations)
                {
                    newDestinations.Add(await _clusterManager.CreateClusterDestinationAsync(cluster.Id, GuidGenerator.Create().ToString().Replace("-", ""), destination));
                }
                await _clusterDestinationRepository.InsertManyAsync(newDestinations);
            }
            //集群健康检查信息
            if (updateRouteDto.ClusterHealthCheck != null)
            {
                var healthCheck = await _clusterHealthCheckRepository.FirstOrDefaultAsync(x=>x.ClusterId==cluster.Id);
                await _clusterHealthCheckRepository.UpdateAsync(healthCheck);
            }
            
            return Ok();
        }
        /// <summary>
        /// 更新路由状态
        /// </summary>
        /// <param name="routeId">路由ID</param>
        /// <param name="useState">路由状态(1.开启 0.关闭)</param>
        /// <returns></returns>
        public async Task<KiteResult> UpdateStateAsync(Guid routeId, bool useState)
        {
            var model = await _routeRepository.FindAsync(x => x.Id == routeId);
            model.UseState = useState;
            model.Updated = DateTime.Now;
            await _routeRepository.UpdateAsync(model);

            return Ok();
        }

        public async Task<KiteResult<List<RouteMainDto>>> GetListAsync()
        {
            var result = (await _routeRepository.GetQueryableAsync())
                .OrderByDescending(x => x.Created)
                .ProjectToType<RouteMainDto>()
                .ToList();
            return Ok(result);
        }
    }
}


================================================
FILE: src/Kite.Gateway.Application/ServiceGovernanceAppService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Application.Contracts.Dtos.ServiceGovernance;
using Volo.Abp.Domain.Repositories;
using Kite.Gateway.Domain.Entities;
using Mapster;

namespace Kite.Gateway.Application
{
    public class ServiceGovernanceAppService : BaseApplicationService, IServiceGovernanceAppService
    {
        private readonly IRepository<ServiceGovernanceConfigure> _repository;

        public ServiceGovernanceAppService(IRepository<ServiceGovernanceConfigure> repository)
        {
            _repository = repository;
        }

        public async Task<KiteResult<ServiceGovernanceConfigureDto>> GetServiceGovernanceConfigureAsync()
        {
            var result = (await _repository.GetQueryableAsync())
                .ProjectToType<ServiceGovernanceConfigureDto>()
                .FirstOrDefault();
            if (result == null)
            {
                result = new ServiceGovernanceConfigureDto();
            }
            return Ok(result);
        }

        public async Task<KiteResult> SaveServiceGovernanceConfigureAsync(ServiceGovernanceConfigureDto configure)
        {
            var model = await _repository.FirstOrDefaultAsync();
            if (model == null)
            {
                model = new ServiceGovernanceConfigure(GuidGenerator.Create());
                TypeAdapter.Adapt(configure, model);
                await _repository.InsertAsync(model);
            }
            else
            {
                TypeAdapter.Adapt(configure, model);
                await _repository.UpdateAsync(model);
            }
            return Ok();
        }
    }
}


================================================
FILE: src/Kite.Gateway.Application/WhitelistAppService.cs
================================================
using Mapster;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp;
using Kite.Gateway.Application.Contracts;
using Kite.Gateway.Domain.Entities;
using Kite.Gateway.Domain.Whitelist;
using Kite.Gateway.Application.Contracts.Dtos.Whitelist;

namespace Kite.Gateway.Application
{
    /// <summary>
    /// 
    /// </summary>
    public class WhitelistAppService: BaseApplicationService, IWhitelistAppService
    {
        private readonly IWhiteListManager _whiteListManager;
        private readonly IRepository<Whitelist> _whiteListRepository;
        private readonly IRepository<Route> _routeRepository;
        public WhitelistAppService(
             IRepository<Whitelist> whiteListRepository, IWhiteListManager whiteListManager, IRepository<Route> routeListRepository)
        {
            _whiteListRep
Download .txt
gitextract_jlijv6d0/

├── .dockerignore
├── .gitignore
├── Kite.Gateway.sln
├── README.en.md
├── README.md
├── admin/
│   └── Kite.Gateway.Admin/
│       ├── .config/
│       │   └── dotnet-tools.json
│       ├── App.razor
│       ├── Controllers/
│       │   └── RefreshController.cs
│       ├── Core/
│       │   └── AuthorizationServerStorage.cs
│       ├── Dockerfile
│       ├── GatewayAdminModule.cs
│       ├── Kite.Gateway.Admin.csproj
│       ├── Pages/
│       │   ├── Administrator/
│       │   │   ├── Administrator.razor
│       │   │   ├── Login.razor
│       │   │   ├── Login.razor.css
│       │   │   ├── Logout.razor
│       │   │   ├── Logout.razor.css
│       │   │   ├── NewAdministrator.razor
│       │   │   └── UpdateAdministrator.razor
│       │   ├── Authorization/
│       │   │   └── Authentication.razor
│       │   ├── Error.cshtml
│       │   ├── Error.cshtml.cs
│       │   ├── Home.razor
│       │   ├── Middleware/
│       │   │   ├── Middleware.razor
│       │   │   ├── NewMiddleware.razor
│       │   │   └── UpdateMiddleware.razor
│       │   ├── Node/
│       │   │   ├── NewNode.razor
│       │   │   ├── Node.razor
│       │   │   ├── RefreshConfigure.razor
│       │   │   └── UpdateNode.razor
│       │   ├── PaginationComponent.razor
│       │   ├── ServiceGovernance/
│       │   │   └── ServiceGovernance.razor
│       │   ├── Whitelist/
│       │   │   ├── NewWhitelist.razor
│       │   │   ├── UpdateWhitelist.razor
│       │   │   └── WhiteList.razor
│       │   ├── Yarp/
│       │   │   ├── NewRoute.razor
│       │   │   ├── Route.razor
│       │   │   └── UpdateRoute.razor
│       │   ├── _Host.cshtml
│       │   └── _Layout.cshtml
│       ├── Program.cs
│       ├── Properties/
│       │   └── launchSettings.json
│       ├── Shared/
│       │   ├── MainLayout.razor
│       │   ├── MainLayout.razor.cs
│       │   ├── MainLayout.razor.css
│       │   └── SimpleLayout.razor
│       ├── _Imports.razor
│       ├── appsettings.json
│       └── wwwroot/
│           └── css/
│               ├── open-iconic/
│               │   ├── FONT-LICENSE
│               │   ├── ICON-LICENSE
│               │   ├── README.md
│               │   └── font/
│               │       └── fonts/
│               │           └── open-iconic.otf
│               ├── signin.css
│               └── site.css
├── simples/
│   ├── Kite.Simple.Account/
│   │   ├── Authorization/
│   │   │   ├── ClaimModel.cs
│   │   │   ├── IJwtTokenManager.cs
│   │   │   ├── JwtTokenAuthenticateResult.cs
│   │   │   ├── JwtTokenManager.cs
│   │   │   ├── JwtTokenOptions.cs
│   │   │   └── JwtTokenResult.cs
│   │   ├── Controllers/
│   │   │   ├── AccountController.cs
│   │   │   ├── LoginController.cs
│   │   │   ├── MiddlewareController.cs
│   │   │   └── WeatherForecastController.cs
│   │   ├── Kite.Simple.Account.csproj
│   │   ├── Models/
│   │   │   ├── AccountLoginDto.cs
│   │   │   ├── AccountLoginResultDto.cs
│   │   │   └── CreateAccountDto.cs
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── WeatherForecast.cs
│   │   └── appsettings.json
│   ├── Kite.Simple.Order/
│   │   ├── Controllers/
│   │   │   ├── OrderController.cs
│   │   │   └── WeatherForecastController.cs
│   │   ├── Kite.Simple.Order.csproj
│   │   ├── Models/
│   │   │   └── CreateOrderDto.cs
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── WeatherForecast.cs
│   │   └── appsettings.json
│   └── Kite.SimpleServices.sln
└── src/
    ├── Kite.Gateway.Application/
    │   ├── AdministratorAppService.cs
    │   ├── ApplicationModule.cs
    │   ├── AuthorizationAppService.cs
    │   ├── BaseApplicationService.cs
    │   ├── ConfigureAppService.cs
    │   ├── Kite.Gateway.Application.csproj
    │   ├── MiddlewareAppService.cs
    │   ├── NodeAppService.cs
    │   ├── RefreshAppService.cs
    │   ├── RouteAppService.cs
    │   ├── ServiceGovernanceAppService.cs
    │   └── WhitelistAppService.cs
    ├── Kite.Gateway.Application.Contracts/
    │   ├── ApplicationContractsModule.cs
    │   ├── Dtos/
    │   │   ├── Administrator/
    │   │   │   ├── AdministratorDto.cs
    │   │   │   ├── CreateAdministratorDto.cs
    │   │   │   ├── LoginAdministratorDto.cs
    │   │   │   └── UpdateAdministratorDto.cs
    │   │   ├── Authorization/
    │   │   │   └── SaveAuthenticationDto.cs
    │   │   ├── Middleware/
    │   │   │   ├── CreateMiddlewareDto.cs
    │   │   │   ├── MiddlewareDto.cs
    │   │   │   ├── MiddlewareListDto.cs
    │   │   │   └── UpdateMiddlewareDto.cs
    │   │   ├── Node/
    │   │   │   ├── CreateNodeDto.cs
    │   │   │   ├── NodeDto.cs
    │   │   │   ├── ReloadConfigureDto.cs
    │   │   │   └── UpdateNodeDto.cs
    │   │   ├── RefreshConfigureDto.cs
    │   │   ├── ReverseProxy/
    │   │   │   ├── ClusterDestinationDto.cs
    │   │   │   ├── ClusterDto.cs
    │   │   │   ├── ClusterHealthCheckDto.cs
    │   │   │   ├── CreateRouteDto.cs
    │   │   │   ├── RouteDto.cs
    │   │   │   ├── RouteMainDto.cs
    │   │   │   ├── RoutePageDto.cs
    │   │   │   ├── RouteTransformDto.cs
    │   │   │   └── UpdateRouteDto.cs
    │   │   ├── ServiceGovernance/
    │   │   │   └── ServiceGovernanceConfigureDto.cs
    │   │   ├── ValidateTokenDto.cs
    │   │   └── Whitelist/
    │   │       ├── CreateWhitelistDto.cs
    │   │       ├── UpdateWhitelistDto.cs
    │   │       └── WhitelistDto.cs
    │   ├── Http/
    │   │   └── SimpleHttpException.cs
    │   ├── IAdministratorAppService.cs
    │   ├── IAuthorizationAppService.cs
    │   ├── IConfigureAppService.cs
    │   ├── IMiddlewareAppService.cs
    │   ├── INodeAppService.cs
    │   ├── IRefreshAppService.cs
    │   ├── IRouteAppService.cs
    │   ├── IServiceGovernanceAppService.cs
    │   ├── IWhitelistAppService.cs
    │   ├── Kite.Gateway.Application.Contracts.csproj
    │   ├── KitePageResult.cs
    │   └── KiteResult.cs
    ├── Kite.Gateway.Domain/
    │   ├── Administrator/
    │   │   ├── AdministratorManager.cs
    │   │   └── IAdministratorManager.cs
    │   ├── Authorization/
    │   │   ├── AuthenticationManager.cs
    │   │   ├── ClaimModel.cs
    │   │   ├── IAuthenticationManager.cs
    │   │   ├── IJwtTokenManager.cs
    │   │   ├── JwtTokenManager.cs
    │   │   ├── JwtTokenOptions.cs
    │   │   └── JwtTokenValidationResult.cs
    │   ├── ConfigureManager.cs
    │   ├── DomainModule.cs
    │   ├── Entities/
    │   │   ├── Administrator.cs
    │   │   ├── AuthenticationConfigure.cs
    │   │   ├── Cluster.cs
    │   │   ├── ClusterDestination.cs
    │   │   ├── ClusterHealthCheck.cs
    │   │   ├── Middleware.cs
    │   │   ├── Node.cs
    │   │   ├── Route.cs
    │   │   ├── RouteTransform.cs
    │   │   ├── ServiceGovernanceConfigure.cs
    │   │   └── Whitelist.cs
    │   ├── IConfigureManager.cs
    │   ├── Kite.Gateway.Domain.csproj
    │   ├── Middlewares/
    │   │   ├── IMiddlewareContext.cs
    │   │   ├── IMiddlewareManager.cs
    │   │   ├── MiddlewareManager.cs
    │   │   └── MiddlewareResult.cs
    │   ├── Node/
    │   │   ├── INodeManager.cs
    │   │   └── NodeManager.cs
    │   ├── ReverseProxy/
    │   │   ├── ClusterManager.cs
    │   │   ├── GatewayOptions.cs
    │   │   ├── IClusterManager.cs
    │   │   ├── IRefreshManager.cs
    │   │   ├── IReverseProxyDatabaseStore.cs
    │   │   ├── IRouteManager.cs
    │   │   ├── IYarpManager.cs
    │   │   ├── InDatabaseReloadToken.cs
    │   │   ├── InDatabaseStoreConfig.cs
    │   │   ├── InDatabaseStoreConfigProvider.cs
    │   │   ├── InDatabaseStoreReloadToken.cs
    │   │   ├── Models/
    │   │   │   ├── NacosServiceHostModel.cs
    │   │   │   ├── NacosServiceModel.cs
    │   │   │   └── ServiceGovernanceModel.cs
    │   │   ├── RefreshManager.cs
    │   │   ├── ReverseProxyDatabaseStore.cs
    │   │   ├── RouteManager.cs
    │   │   └── YarpManager.cs
    │   └── Whitelist/
    │       ├── IWhiteListManager.cs
    │       └── WhiteListManager.cs
    ├── Kite.Gateway.Domain.Shared/
    │   ├── DomainSharedModule.cs
    │   ├── Enums/
    │   │   ├── FilterTypeEnum.cs
    │   │   ├── ServiceGovernanceType.cs
    │   │   └── SignalTypeEnum.cs
    │   ├── Kite.Gateway.Domain.Shared.csproj
    │   ├── Options/
    │   │   ├── AuthenticationOption.cs
    │   │   ├── ClusterDestinationOption.cs
    │   │   ├── ClusterHealthCheckOption.cs
    │   │   ├── ClusterOption.cs
    │   │   ├── KiteGatewayOption.cs
    │   │   ├── MiddlewareOption.cs
    │   │   ├── RouteOption.cs
    │   │   ├── RouteTransformOption.cs
    │   │   ├── WhitelistOption.cs
    │   │   └── YarpOption.cs
    │   └── TextHelper.cs
    ├── Kite.Gateway.EntityFrameworkCore/
    │   ├── EntityFrameworkCoreModule.cs
    │   ├── Kite.Gateway.EntityFrameworkCore.csproj
    │   ├── KiteDbContext.cs
    │   └── Migrations/
    │       ├── 20220726095023_Migration_v1.0.0.Designer.cs
    │       ├── 20220726095023_Migration_v1.0.0.cs
    │       ├── 20220727061321_Migration_v1.0.1.Designer.cs
    │       ├── 20220727061321_Migration_v1.0.1.cs
    │       ├── 20220731131935_Migration_v1.0.2.Designer.cs
    │       ├── 20220731131935_Migration_v1.0.2.cs
    │       ├── 20220801073938_Migration_v1.0.3.Designer.cs
    │       ├── 20220801073938_Migration_v1.0.3.cs
    │       └── KiteDbContextModelSnapshot.cs
    └── Kite.Gateway.Web/
        ├── Controllers/
        │   └── RefreshController.cs
        ├── Dockerfile
        ├── Filters/
        │   ├── AbpCoreExceptionFilter.cs
        │   └── KiteCoreActionFilter.cs
        ├── Kite.Gateway.Web.csproj
        ├── Middlewares/
        │   ├── KiteAuthorizationMiddleware.cs
        │   └── KiteExternalMiddleware.cs
        ├── Program.cs
        ├── Properties/
        │   └── launchSettings.json
        ├── WebModule.cs
        └── appsettings.json
Download .txt
SYMBOL INDEX (418 symbols across 156 files)

FILE: admin/Kite.Gateway.Admin/Controllers/RefreshController.cs
  class RefreshController (line 12) | [Route("api/[controller]")]
    method RefreshController (line 17) | public RefreshController(IConfigureAppService configureAppService)
    method GetConfigureAsync (line 21) | [HttpGet("/api/kite/refresh/configure")]

FILE: admin/Kite.Gateway.Admin/Core/AuthorizationServerStorage.cs
  class AuthorizationServerStorage (line 9) | public class AuthorizationServerStorage
    method AuthorizationServerStorage (line 12) | public AuthorizationServerStorage(IMemoryCache memoryCache)
    method IsLogin (line 20) | public bool IsLogin()
    method DeleteServerStorage (line 35) | public void DeleteServerStorage()
    method SetServerStorage (line 47) | public void SetServerStorage(AdministratorDto value)
    method GetServerStorage (line 59) | public AdministratorDto GetServerStorage()

FILE: admin/Kite.Gateway.Admin/GatewayAdminModule.cs
  class GatewayAdminModule (line 27) | [DependsOn(
    method ConfigureServices (line 36) | public override void ConfigureServices(ServiceConfigurationContext con...
    method ConfigureMvc (line 43) | private void ConfigureMvc(ServiceConfigurationContext context)
    method ConfigureBlazor (line 51) | private void ConfigureBlazor(ServiceConfigurationContext context)
    method OnApplicationInitialization (line 81) | public override void OnApplicationInitialization(ApplicationInitializa...

FILE: admin/Kite.Gateway.Admin/Pages/Error.cshtml.cs
  class ErrorModel (line 7) | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoSt...
    method ErrorModel (line 17) | public ErrorModel(ILogger<ErrorModel> logger)
    method OnGet (line 22) | public void OnGet()

FILE: admin/Kite.Gateway.Admin/Shared/MainLayout.razor.cs
  class MainLayout (line 14) | public sealed partial class MainLayout
    method OnInitialized (line 40) | protected override void OnInitialized()
    method GetIconSideMenuItems (line 61) | private static List<MenuItem> GetIconSideMenuItems()

FILE: simples/Kite.Simple.Account/Authorization/ClaimModel.cs
  class ClaimModel (line 9) | public class ClaimModel

FILE: simples/Kite.Simple.Account/Authorization/IJwtTokenManager.cs
  type IJwtTokenManager (line 10) | public interface IJwtTokenManager
    method GenerateToken (line 17) | JwtTokenResult GenerateToken(List<Claim> claims);

FILE: simples/Kite.Simple.Account/Authorization/JwtTokenAuthenticateResult.cs
  class JwtTokenAuthenticateResult (line 11) | public class JwtTokenAuthenticateResult

FILE: simples/Kite.Simple.Account/Authorization/JwtTokenManager.cs
  class JwtTokenManager (line 18) | public class JwtTokenManager: IJwtTokenManager
    method JwtTokenManager (line 22) | public JwtTokenManager(IOptions<JwtTokenOptions> options, IWebHostEnvi...
    method GenerateToken (line 32) | public JwtTokenResult GenerateToken(List<Claim> claims)

FILE: simples/Kite.Simple.Account/Authorization/JwtTokenOptions.cs
  class JwtTokenOptions (line 9) | public class JwtTokenOptions

FILE: simples/Kite.Simple.Account/Authorization/JwtTokenResult.cs
  class JwtTokenResult (line 9) | public class JwtTokenResult

FILE: simples/Kite.Simple.Account/Controllers/AccountController.cs
  class AccountController (line 7) | [Route("api/[controller]")]
    method CreateAsync (line 16) | [HttpPost]
    method GetAsync (line 26) | [HttpGet]

FILE: simples/Kite.Simple.Account/Controllers/LoginController.cs
  class LoginController (line 8) | [Route("api/[controller]")]
    method LoginController (line 14) | public LoginController(IJwtTokenManager jwtTokenManager)
    method PostAsync (line 24) | [HttpPost]

FILE: simples/Kite.Simple.Account/Controllers/MiddlewareController.cs
  class MiddlewareController (line 6) | [Route("api/[controller]")]
    method PostAsync (line 14) | [HttpPost]

FILE: simples/Kite.Simple.Account/Controllers/WeatherForecastController.cs
  class WeatherForecastController (line 5) | [ApiController]
    method WeatherForecastController (line 16) | public WeatherForecastController(ILogger<WeatherForecastController> lo...
    method Get (line 21) | [HttpGet(Name = "GetWeatherForecast")]

FILE: simples/Kite.Simple.Account/Models/AccountLoginDto.cs
  class AccountLoginDto (line 5) | public class AccountLoginDto

FILE: simples/Kite.Simple.Account/Models/AccountLoginResultDto.cs
  class AccountLoginResultDto (line 5) | public class AccountLoginResultDto

FILE: simples/Kite.Simple.Account/Models/CreateAccountDto.cs
  class CreateAccountDto (line 4) | public class CreateAccountDto

FILE: simples/Kite.Simple.Account/WeatherForecast.cs
  class WeatherForecast (line 3) | public class WeatherForecast

FILE: simples/Kite.Simple.Order/Controllers/OrderController.cs
  class OrderController (line 7) | [Route("api/[controller]")]
    method CreateAsync (line 15) | [HttpPost]
    method GetAsync (line 34) | [HttpGet]

FILE: simples/Kite.Simple.Order/Controllers/WeatherForecastController.cs
  class WeatherForecastController (line 5) | [ApiController]
    method WeatherForecastController (line 16) | public WeatherForecastController(ILogger<WeatherForecastController> lo...
    method Get (line 21) | [HttpGet(Name = "GetWeatherForecast")]

FILE: simples/Kite.Simple.Order/Models/CreateOrderDto.cs
  class CreateOrderDto (line 3) | public class CreateOrderDto

FILE: simples/Kite.Simple.Order/WeatherForecast.cs
  class WeatherForecast (line 3) | public class WeatherForecast

FILE: src/Kite.Gateway.Application.Contracts/ApplicationContractsModule.cs
  class ApplicationContractsModule (line 11) | public class ApplicationContractsModule:AbpModule
    method ConfigureServices (line 13) | public override void ConfigureServices(ServiceConfigurationContext con...

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Administrator/AdministratorDto.cs
  class AdministratorDto (line 9) | public class AdministratorDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Administrator/CreateAdministratorDto.cs
  class CreateAdministratorDto (line 10) | public class CreateAdministratorDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Administrator/LoginAdministratorDto.cs
  class LoginAdministratorDto (line 10) | public class LoginAdministratorDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Administrator/UpdateAdministratorDto.cs
  class UpdateAdministratorDto (line 10) | public class UpdateAdministratorDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Authorization/SaveAuthenticationDto.cs
  class SaveAuthenticationDto (line 13) | public class SaveAuthenticationDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Middleware/CreateMiddlewareDto.cs
  class CreateMiddlewareDto (line 14) | public class CreateMiddlewareDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Middleware/MiddlewareDto.cs
  class MiddlewareDto (line 13) | public class MiddlewareDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Middleware/MiddlewareListDto.cs
  class MiddlewareListDto (line 13) | public class MiddlewareListDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Middleware/UpdateMiddlewareDto.cs
  class UpdateMiddlewareDto (line 11) | public class UpdateMiddlewareDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Node/CreateNodeDto.cs
  class CreateNodeDto (line 10) | public class CreateNodeDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Node/NodeDto.cs
  class NodeDto (line 9) | public class NodeDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Node/ReloadConfigureDto.cs
  class ReloadConfigureDto (line 11) | public class ReloadConfigureDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Node/UpdateNodeDto.cs
  class UpdateNodeDto (line 9) | public class UpdateNodeDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/RefreshConfigureDto.cs
  class RefreshConfigureDto (line 11) | public class RefreshConfigureDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/ClusterDestinationDto.cs
  class ClusterDestinationDto (line 9) | public class ClusterDestinationDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/ClusterDto.cs
  class ClusterDto (line 10) | public class ClusterDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/ClusterHealthCheckDto.cs
  class ClusterHealthCheckDto (line 10) | public class ClusterHealthCheckDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/CreateRouteDto.cs
  class CreateRouteDto (line 11) | public class CreateRouteDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/RouteDto.cs
  class RouteDto (line 9) | public class RouteDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/RouteMainDto.cs
  class RouteMainDto (line 9) | public class RouteMainDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/RoutePageDto.cs
  class RoutePageDto (line 10) | public class RoutePageDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/RouteTransformDto.cs
  class RouteTransformDto (line 9) | public class RouteTransformDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/UpdateRouteDto.cs
  class UpdateRouteDto (line 11) | public class UpdateRouteDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ServiceGovernance/ServiceGovernanceConfigureDto.cs
  class ServiceGovernanceConfigureDto (line 13) | public class ServiceGovernanceConfigureDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/ValidateTokenDto.cs
  class ValidateTokenDto (line 10) | public class ValidateTokenDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Whitelist/CreateWhitelistDto.cs
  class CreateWhitelistDto (line 11) | public class CreateWhitelistDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Whitelist/UpdateWhitelistDto.cs
  class UpdateWhitelistDto (line 11) | public class UpdateWhitelistDto

FILE: src/Kite.Gateway.Application.Contracts/Dtos/Whitelist/WhitelistDto.cs
  class WhitelistDto (line 10) | public class WhitelistDto

FILE: src/Kite.Gateway.Application.Contracts/Http/SimpleHttpException.cs
  class SimpleHttpException (line 12) | public class SimpleHttpException:Exception
    method SimpleHttpException (line 18) | public SimpleHttpException(string message) : base(message)

FILE: src/Kite.Gateway.Application.Contracts/IAdministratorAppService.cs
  type IAdministratorAppService (line 10) | public interface IAdministratorAppService
    method LoginAsync (line 17) | Task<KiteResult<AdministratorDto>> LoginAsync(LoginAdministratorDto lo...
    method GetAsync (line 23) | Task<KiteResult<AdministratorDto>> GetAsync(Guid id);
    method UpdateAsync (line 29) | Task<KiteResult> UpdateAsync(UpdateAdministratorDto updateAdministrator);
    method GetListAsync (line 36) | Task<KitePageResult<List<AdministratorDto>>> GetListAsync(int page = 1...
    method DeleteAsync (line 42) | Task<KiteResult> DeleteAsync(Guid id);
    method CreateAsync (line 48) | Task<KiteResult> CreateAsync(CreateAdministratorDto createAdministrator);

FILE: src/Kite.Gateway.Application.Contracts/IAuthorizationAppService.cs
  type IAuthorizationAppService (line 14) | public interface IAuthorizationAppService:IApplicationService
    method GetAuthenticationAsync (line 20) | Task<KiteResult<SaveAuthenticationDto>> GetAuthenticationAsync();
    method SaveAuthenticationAsync (line 27) | Task<KiteResult> SaveAuthenticationAsync(SaveAuthenticationDto authent...

FILE: src/Kite.Gateway.Application.Contracts/IConfigureAppService.cs
  type IConfigureAppService (line 12) | public interface IConfigureAppService : IApplicationService
    method GetConfigureAsync (line 19) | Task<KiteResult<RefreshConfigureDto>> GetConfigureAsync(ReloadConfigur...

FILE: src/Kite.Gateway.Application.Contracts/IMiddlewareAppService.cs
  type IMiddlewareAppService (line 14) | public interface IMiddlewareAppService:IApplicationService
    method GetListAsync (line 23) | Task<KitePageResult<List<MiddlewareListDto>>> GetListAsync(string kw =...
    method GetAsync (line 29) | Task<KiteResult<MiddlewareDto>> GetAsync(Guid id);
    method UpdateAsync (line 35) | Task<KiteResult> UpdateAsync(UpdateMiddlewareDto middlewareDto);
    method UpdateUseStateAsync (line 42) | Task<KiteResult> UpdateUseStateAsync(Guid id,bool useState);
    method CreateAsync (line 48) | Task<KiteResult> CreateAsync(CreateMiddlewareDto middlewareDto);
    method DeleteAsync (line 54) | Task<KiteResult> DeleteAsync(Guid id);

FILE: src/Kite.Gateway.Application.Contracts/INodeAppService.cs
  type INodeAppService (line 11) | public interface INodeAppService:IApplicationService
    method GetAllAsync (line 17) | Task<KiteResult<List<NodeDto>>> GetAllAsync();
    method GetAsync (line 23) | Task<KiteResult<NodeDto>> GetAsync(Guid id);
    method UpdateAsync (line 29) | Task<KiteResult> UpdateAsync(UpdateNodeDto updateNode);
    method GetListAsync (line 36) | Task<KitePageResult<List<NodeDto>>> GetListAsync(int page = 1, int pag...
    method DeleteAsync (line 42) | Task<KiteResult> DeleteAsync(Guid id);
    method CreateAsync (line 48) | Task<KiteResult> CreateAsync(CreateNodeDto createNode);

FILE: src/Kite.Gateway.Application.Contracts/IRefreshAppService.cs
  type IRefreshAppService (line 12) | public interface IRefreshAppService: IApplicationService
    method RefreshConfigureAsync (line 20) | Task<KiteResult> RefreshConfigureAsync(RefreshConfigureDto refreshConf...

FILE: src/Kite.Gateway.Application.Contracts/IRouteAppService.cs
  type IRouteAppService (line 14) | public interface IRouteAppService:IApplicationService
    method GetListAsync (line 20) | Task<KiteResult<List<RouteMainDto>>> GetListAsync();
    method GetListAsync (line 28) | Task<KitePageResult<List<RoutePageDto>>> GetListAsync(string kw = "", ...
    method GetAsync (line 34) | Task<KiteResult<RouteDto>> GetAsync(Guid routeId);
    method CreateAsync (line 40) | Task<KiteResult> CreateAsync(CreateRouteDto createRouteDto);
    method DeleteAsync (line 46) | Task<KiteResult> DeleteAsync(Guid routeId);
    method UpdateAsync (line 52) | Task<KiteResult> UpdateAsync(UpdateRouteDto updateRouteDto);
    method UpdateStateAsync (line 59) | Task<KiteResult> UpdateStateAsync(Guid routeId, bool useState);

FILE: src/Kite.Gateway.Application.Contracts/IServiceGovernanceAppService.cs
  type IServiceGovernanceAppService (line 13) | public interface IServiceGovernanceAppService
    method GetServiceGovernanceConfigureAsync (line 19) | Task<KiteResult<ServiceGovernanceConfigureDto>> GetServiceGovernanceCo...
    method SaveServiceGovernanceConfigureAsync (line 25) | Task<KiteResult> SaveServiceGovernanceConfigureAsync(ServiceGovernance...

FILE: src/Kite.Gateway.Application.Contracts/IWhitelistAppService.cs
  type IWhitelistAppService (line 14) | public interface IWhitelistAppService : IApplicationService
    method GetAsync (line 21) | Task<KiteResult<WhitelistDto>> GetAsync(Guid id);
    method UpdateUseStateAsync (line 28) | Task<KiteResult> UpdateUseStateAsync(Guid id,bool useState);
    method UpdateAsync (line 34) | Task<KiteResult> UpdateAsync(UpdateWhitelistDto updateWhiteList);
    method GetListAsync (line 42) | Task<KitePageResult<List<WhitelistDto>>> GetListAsync(string kw = "", ...
    method DeleteAsync (line 48) | Task<KiteResult> DeleteAsync(Guid id);
    method CreateAsync (line 54) | Task<KiteResult> CreateAsync(CreateWhitelistDto createWhiteList);

FILE: src/Kite.Gateway.Application.Contracts/KitePageResult.cs
  class KitePageResult (line 9) | public class KitePageResult<TResult> : KiteResult<TResult>

FILE: src/Kite.Gateway.Application.Contracts/KiteResult.cs
  class KiteResult (line 8) | public class KiteResult<TResult>
  class KiteResult (line 24) | public class KiteResult

FILE: src/Kite.Gateway.Application/AdministratorAppService.cs
  class AdministratorAppService (line 16) | public class AdministratorAppService : BaseApplicationService, IAdminist...
    method AdministratorAppService (line 21) | public AdministratorAppService(IAdministratorManager administratorMana...
    method LoginAsync (line 26) | public async Task<KiteResult<AdministratorDto>> LoginAsync(LoginAdmini...
    method CreateAsync (line 46) | public async Task<KiteResult> CreateAsync(CreateAdministratorDto creat...
    method DeleteAsync (line 56) | public async Task<KiteResult> DeleteAsync(Guid id)
    method GetAsync (line 62) | public async Task<KiteResult<AdministratorDto>> GetAsync(Guid id)
    method GetListAsync (line 71) | public async Task<KitePageResult<List<AdministratorDto>>> GetListAsync...
    method UpdateAsync (line 83) | public async Task<KiteResult> UpdateAsync(UpdateAdministratorDto updat...

FILE: src/Kite.Gateway.Application/ApplicationModule.cs
  class ApplicationModule (line 14) | [DependsOn(
    method ConfigureServices (line 20) | public override void ConfigureServices(ServiceConfigurationContext con...

FILE: src/Kite.Gateway.Application/AuthorizationAppService.cs
  class AuthorizationAppService (line 13) | public class AuthorizationAppService : BaseApplicationService, IAuthoriz...
    method AuthorizationAppService (line 17) | public AuthorizationAppService(IRepository<AuthenticationConfigure> au...
    method GetAuthenticationAsync (line 23) | public async Task<KiteResult<SaveAuthenticationDto>> GetAuthentication...
    method SaveAuthenticationAsync (line 38) | public async Task<KiteResult> SaveAuthenticationAsync(SaveAuthenticati...

FILE: src/Kite.Gateway.Application/BaseApplicationService.cs
  class BaseApplicationService (line 14) | public class BaseApplicationService : ApplicationService
    method ThrownFailed (line 21) | [RemoteService(IsEnabled = false)]
    method Ok (line 30) | [RemoteService(IsEnabled = false)]
    method Ok (line 44) | [RemoteService(IsEnabled = false)]
    method Ok (line 60) | [RemoteService(IsEnabled = false)]
    method Customize (line 77) | [RemoteService(IsEnabled = false)]
    method Customize (line 93) | [RemoteService(IsEnabled = false)]

FILE: src/Kite.Gateway.Application/ConfigureAppService.cs
  class ConfigureAppService (line 19) | public class ConfigureAppService: BaseApplicationService,IConfigureAppSe...
    method ConfigureAppService (line 22) | public ConfigureAppService(IServiceProvider serviceProvider)
    method GetConfigureAsync (line 26) | public async Task<KiteResult<RefreshConfigureDto>> GetConfigureAsync(R...

FILE: src/Kite.Gateway.Application/MiddlewareAppService.cs
  class MiddlewareAppService (line 18) | public class MiddlewareAppService : BaseApplicationService, IMiddlewareA...
    method MiddlewareAppService (line 22) | public MiddlewareAppService(IMiddlewareManager middlewareManager, IRep...
    method CreateAsync (line 28) | public async Task<KiteResult> CreateAsync(CreateMiddlewareDto middlewa...
    method DeleteAsync (line 36) | public async Task<KiteResult> DeleteAsync(Guid id)
    method GetAsync (line 42) | public async Task<KiteResult<MiddlewareDto>> GetAsync(Guid id)
    method GetListAsync (line 51) | public async Task<KitePageResult<List<MiddlewareListDto>>> GetListAsyn...
    method UpdateAsync (line 64) | public async Task<KiteResult> UpdateAsync(UpdateMiddlewareDto middlewa...
    method UpdateUseStateAsync (line 73) | public async Task<KiteResult> UpdateUseStateAsync(Guid id, bool useState)

FILE: src/Kite.Gateway.Application/NodeAppService.cs
  class NodeAppService (line 14) | public class NodeAppService : BaseApplicationService, INodeAppService
    method NodeAppService (line 19) | public NodeAppService(IRepository<Node> repository, INodeManager nodeM...
    method CreateAsync (line 25) | public async Task<KiteResult> CreateAsync(CreateNodeDto createNode)
    method DeleteAsync (line 34) | public async Task<KiteResult> DeleteAsync(Guid id)
    method GetAllAsync (line 40) | public async Task<KiteResult<List<NodeDto>>> GetAllAsync()
    method GetAsync (line 49) | public async Task<KiteResult<NodeDto>> GetAsync(Guid id)
    method GetListAsync (line 58) | public async Task<KitePageResult<List<NodeDto>>> GetListAsync(int page...
    method UpdateAsync (line 69) | public async Task<KiteResult> UpdateAsync(UpdateNodeDto updateNode)

FILE: src/Kite.Gateway.Application/RefreshAppService.cs
  class RefreshAppService (line 21) | public class RefreshAppService : BaseApplicationService, IRefreshAppService
    method RefreshAppService (line 25) | public RefreshAppService( IConfigureManager configureManager, IRefresh...
    method RefreshConfigureAsync (line 30) | public async Task<KiteResult> RefreshConfigureAsync(RefreshConfigureDt...

FILE: src/Kite.Gateway.Application/RouteAppService.cs
  class RouteAppService (line 24) | public class RouteAppService: BaseApplicationService,IRouteAppService
    method RouteAppService (line 34) | public RouteAppService(IRepository<Route> routeRepository
    method CreateAsync (line 54) | public async Task<KiteResult> CreateAsync(CreateRouteDto createRouteDto)
    method DeleteAsync (line 104) | public async Task<KiteResult> DeleteAsync(Guid routeId)
    method GetListAsync (line 116) | public async Task<KitePageResult<List<RoutePageDto>>> GetListAsync(str...
    method GetAsync (line 153) | public async Task<KiteResult<RouteDto>> GetAsync(Guid routeId)
    method UpdateAsync (line 178) | public async Task<KiteResult> UpdateAsync(UpdateRouteDto updateRouteDto)
    method UpdateStateAsync (line 239) | public async Task<KiteResult> UpdateStateAsync(Guid routeId, bool useS...
    method GetListAsync (line 249) | public async Task<KiteResult<List<RouteMainDto>>> GetListAsync()

FILE: src/Kite.Gateway.Application/ServiceGovernanceAppService.cs
  class ServiceGovernanceAppService (line 14) | public class ServiceGovernanceAppService : BaseApplicationService, IServ...
    method ServiceGovernanceAppService (line 18) | public ServiceGovernanceAppService(IRepository<ServiceGovernanceConfig...
    method GetServiceGovernanceConfigureAsync (line 23) | public async Task<KiteResult<ServiceGovernanceConfigureDto>> GetServic...
    method SaveServiceGovernanceConfigureAsync (line 35) | public async Task<KiteResult> SaveServiceGovernanceConfigureAsync(Serv...

FILE: src/Kite.Gateway.Application/WhitelistAppService.cs
  class WhitelistAppService (line 22) | public class WhitelistAppService: BaseApplicationService, IWhitelistAppS...
    method WhitelistAppService (line 27) | public WhitelistAppService(
    method GetListAsync (line 35) | public async Task<KitePageResult<List<WhitelistDto>>> GetListAsync(str...
    method DeleteAsync (line 59) | public async Task<KiteResult> DeleteAsync(Guid id)
    method CreateAsync (line 69) | public async Task<KiteResult> CreateAsync(CreateWhitelistDto createWhi...
    method UpdateAsync (line 76) | public async Task<KiteResult> UpdateAsync(UpdateWhitelistDto updateWhi...
    method GetAsync (line 88) | public async Task<KiteResult<WhitelistDto>> GetAsync(Guid id)
    method UpdateUseStateAsync (line 97) | public async Task<KiteResult> UpdateUseStateAsync(Guid id, bool useState)

FILE: src/Kite.Gateway.Domain.Shared/DomainSharedModule.cs
  class DomainSharedModule (line 10) | [DependsOn(
    method ConfigureServices (line 15) | public override void ConfigureServices(ServiceConfigurationContext con...

FILE: src/Kite.Gateway.Domain.Shared/Enums/FilterTypeEnum.cs
  type FilterTypeEnum (line 13) | public enum FilterTypeEnum

FILE: src/Kite.Gateway.Domain.Shared/Enums/ServiceGovernanceType.cs
  type ServiceGovernanceType (line 13) | public enum ServiceGovernanceType

FILE: src/Kite.Gateway.Domain.Shared/Enums/SignalTypeEnum.cs
  type SignalTypeEnum (line 13) | public enum SignalTypeEnum

FILE: src/Kite.Gateway.Domain.Shared/Options/AuthenticationOption.cs
  class AuthenticationOption (line 12) | public class AuthenticationOption

FILE: src/Kite.Gateway.Domain.Shared/Options/ClusterDestinationOption.cs
  class ClusterDestinationOption (line 9) | public class ClusterDestinationOption

FILE: src/Kite.Gateway.Domain.Shared/Options/ClusterHealthCheckOption.cs
  class ClusterHealthCheckOption (line 9) | public class ClusterHealthCheckOption

FILE: src/Kite.Gateway.Domain.Shared/Options/ClusterOption.cs
  class ClusterOption (line 10) | public class ClusterOption

FILE: src/Kite.Gateway.Domain.Shared/Options/KiteGatewayOption.cs
  class KiteGatewayOption (line 9) | public class KiteGatewayOption

FILE: src/Kite.Gateway.Domain.Shared/Options/MiddlewareOption.cs
  class MiddlewareOption (line 13) | public class MiddlewareOption

FILE: src/Kite.Gateway.Domain.Shared/Options/RouteOption.cs
  class RouteOption (line 9) | public class RouteOption

FILE: src/Kite.Gateway.Domain.Shared/Options/RouteTransformOption.cs
  class RouteTransformOption (line 9) | public class RouteTransformOption

FILE: src/Kite.Gateway.Domain.Shared/Options/WhitelistOption.cs
  class WhitelistOption (line 14) | public class WhitelistOption

FILE: src/Kite.Gateway.Domain.Shared/Options/YarpOption.cs
  class YarpOption (line 10) | public class YarpOption

FILE: src/Kite.Gateway.Domain.Shared/TextHelper.cs
  class TextHelper (line 7) | public class TextHelper
    method MD5Encrypt (line 14) | public static string MD5Encrypt(string SourceText)
    method SHA1_Encrypt (line 33) | public static string SHA1_Encrypt(string Source_String)
    method HmacSHA256 (line 51) | public static string HmacSHA256(string message, string secret)

FILE: src/Kite.Gateway.Domain/Administrator/AdministratorManager.cs
  class AdministratorManager (line 13) | internal class AdministratorManager : DomainService, IAdministratorManager
    method AdministratorManager (line 17) | public AdministratorManager(IRepository<Entities.Administrator> reposi...
    method LoginAsync (line 21) | public async Task<Entities.Administrator> LoginAsync(string adminName,...
    method CreateAsync (line 33) | public async Task<Entities.Administrator> CreateAsync(string adminName)
    method UpdateAsync (line 48) | public async Task<Entities.Administrator> UpdateAsync(Guid id, string ...

FILE: src/Kite.Gateway.Domain/Administrator/IAdministratorManager.cs
  type IAdministratorManager (line 10) | public interface IAdministratorManager
    method LoginAsync (line 18) | Task<Entities.Administrator> LoginAsync(string adminName,string passwo...
    method UpdateAsync (line 25) | Task<Entities.Administrator> UpdateAsync(Guid id, string adminName);
    method CreateAsync (line 31) | Task<Entities.Administrator> CreateAsync(string adminName);

FILE: src/Kite.Gateway.Domain/Authorization/AuthenticationManager.cs
  class AuthenticationManager (line 13) | internal class AuthenticationManager : DomainService, IAuthenticationMan...
    method AuthenticationManager (line 20) | public AuthenticationManager(IMemoryCache memoryCache, IRepository<Aut...
    method GetConfigureAsync (line 26) | public async Task<AuthenticationConfigure> GetConfigureAsync()

FILE: src/Kite.Gateway.Domain/Authorization/ClaimModel.cs
  class ClaimModel (line 9) | public class ClaimModel

FILE: src/Kite.Gateway.Domain/Authorization/IAuthenticationManager.cs
  type IAuthenticationManager (line 10) | public interface IAuthenticationManager
    method GetConfigureAsync (line 16) | Task<AuthenticationConfigure> GetConfigureAsync();

FILE: src/Kite.Gateway.Domain/Authorization/IJwtTokenManager.cs
  type IJwtTokenManager (line 11) | public interface IJwtTokenManager
    method ValidationTokenAsync (line 18) | Task<JwtTokenValidationResult> ValidationTokenAsync(HttpContext httpCo...

FILE: src/Kite.Gateway.Domain/Authorization/JwtTokenManager.cs
  class JwtTokenManager (line 22) | internal class JwtTokenManager: DomainService,IJwtTokenManager
    method JwtTokenManager (line 25) | public JwtTokenManager(IOptions<TokenValidationParameters> tokenValida...
    method ValidationTokenAsync (line 30) | public Task<JwtTokenValidationResult> ValidationTokenAsync(HttpContext...

FILE: src/Kite.Gateway.Domain/Authorization/JwtTokenOptions.cs
  class JwtTokenOptions (line 9) | public class JwtTokenOptions

FILE: src/Kite.Gateway.Domain/Authorization/JwtTokenValidationResult.cs
  class JwtTokenValidationResult (line 11) | public class JwtTokenValidationResult

FILE: src/Kite.Gateway.Domain/ConfigureManager.cs
  class ConfigureManager (line 23) | internal class ConfigureManager : DomainService, IConfigureManager
    method ConfigureManager (line 30) | public ConfigureManager(IOptions<List<MiddlewareOption>> middlewareOpt...
    method ReloadAuthentication (line 42) | public void ReloadAuthentication(AuthenticationOption authenticationOp...
    method GetTokenValidationParameters (line 48) | private void GetTokenValidationParameters()
    method ReloadMiddleware (line 76) | public void ReloadMiddleware(List<MiddlewareOption> middlewareOptions)
    method ReloadWhitelist (line 88) | public void ReloadWhitelist(List<WhitelistOption> whitelistOptions)
    method ReloadYayp (line 97) | public void ReloadYayp(YarpOption yarpOption)

FILE: src/Kite.Gateway.Domain/DomainModule.cs
  class DomainModule (line 15) | [DependsOn(
    method ConfigureServices (line 20) | public override void ConfigureServices(ServiceConfigurationContext con...

FILE: src/Kite.Gateway.Domain/Entities/Administrator.cs
  class Administrator (line 11) | public class Administrator : Entity<Guid>
    method Administrator (line 13) | public Administrator() { }
    method Administrator (line 14) | public Administrator(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/AuthenticationConfigure.cs
  class AuthenticationConfigure (line 10) | public class AuthenticationConfigure : Entity<Guid>
    method AuthenticationConfigure (line 12) | public AuthenticationConfigure() { }
    method AuthenticationConfigure (line 13) | public AuthenticationConfigure(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/Cluster.cs
  class Cluster (line 15) | public class Cluster : Entity<Guid>
    method Cluster (line 17) | public Cluster() { }
    method Cluster (line 18) | public Cluster(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/ClusterDestination.cs
  class ClusterDestination (line 14) | public class ClusterDestination : Entity<Guid>
    method ClusterDestination (line 16) | public ClusterDestination() { }
    method ClusterDestination (line 17) | public ClusterDestination(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/ClusterHealthCheck.cs
  class ClusterHealthCheck (line 14) | public class ClusterHealthCheck : Entity<Guid>
    method ClusterHealthCheck (line 16) | public ClusterHealthCheck() { }
    method ClusterHealthCheck (line 17) | public ClusterHealthCheck(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/Middleware.cs
  class Middleware (line 15) | public class Middleware : Entity<Guid>
    method Middleware (line 17) | public Middleware() { }
    method Middleware (line 18) | public Middleware(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/Node.cs
  class Node (line 14) | public class Node : Entity<Guid>
    method Node (line 16) | public Node() { }
    method Node (line 17) | public Node(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/Route.cs
  class Route (line 14) | public class Route : Entity<Guid>
    method Route (line 16) | public Route() { }
    method Route (line 17) | public Route(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/RouteTransform.cs
  class RouteTransform (line 14) | public class RouteTransform : Entity<Guid>
    method RouteTransform (line 16) | public RouteTransform() { }
    method RouteTransform (line 17) | public RouteTransform(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/ServiceGovernanceConfigure.cs
  class ServiceGovernanceConfigure (line 13) | public class ServiceGovernanceConfigure : Entity<Guid>
    method ServiceGovernanceConfigure (line 15) | public ServiceGovernanceConfigure() { }
    method ServiceGovernanceConfigure (line 16) | public ServiceGovernanceConfigure(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/Entities/Whitelist.cs
  class Whitelist (line 15) | public class Whitelist : Entity<Guid>
    method Whitelist (line 17) | public Whitelist() { }
    method Whitelist (line 18) | public Whitelist(Guid id) : base(id)

FILE: src/Kite.Gateway.Domain/IConfigureManager.cs
  type IConfigureManager (line 14) | public interface IConfigureManager
    method ReloadYayp (line 20) | void ReloadYayp(YarpOption yarpOption);
    method ReloadAuthentication (line 25) | void ReloadAuthentication(AuthenticationOption authenticationOption);
    method ReloadWhitelist (line 30) | void ReloadWhitelist(List<WhitelistOption> whitelistOptions);
    method ReloadMiddleware (line 35) | void ReloadMiddleware(List<MiddlewareOption> middlewareOptions);

FILE: src/Kite.Gateway.Domain/Middlewares/IMiddlewareContext.cs
  type IMiddlewareContext (line 9) | public interface IMiddlewareContext
    method InvokeMiddlewareAsync (line 16) | Task<MiddlewareResult> InvokeMiddlewareAsync();

FILE: src/Kite.Gateway.Domain/Middlewares/IMiddlewareManager.cs
  type IMiddlewareManager (line 10) | public interface IMiddlewareManager
    method GetListAsync (line 16) | Task<List<Middleware>> GetListAsync();
    method UpdateAsync (line 24) | Task<Middleware> UpdateAsync(Guid id,string name, string server);
    method CreateAsync (line 31) | Task<Middleware> CreateAsync(string name,string server);

FILE: src/Kite.Gateway.Domain/Middlewares/MiddlewareManager.cs
  class MiddlewareManager (line 13) | internal class MiddlewareManager : DomainService, IMiddlewareManager
    method MiddlewareManager (line 20) | public MiddlewareManager(IRepository<Middleware> repository, IMemoryCa...
    method GetListAsync (line 25) | public async Task<List<Middleware>> GetListAsync()
    method CreateAsync (line 40) | public async Task<Middleware> CreateAsync(string name, string server)
    method UpdateAsync (line 59) | public async Task<Middleware> UpdateAsync(Guid id, string name, string...

FILE: src/Kite.Gateway.Domain/Middlewares/MiddlewareResult.cs
  class MiddlewareResult (line 9) | public class MiddlewareResult

FILE: src/Kite.Gateway.Domain/Node/INodeManager.cs
  type INodeManager (line 9) | public interface INodeManager
    method UpdateAsync (line 18) | Task<Entities.Node> UpdateAsync(Guid id,string nodeName, string server);
    method CreateAsync (line 25) | Task<Entities.Node> CreateAsync(string nodeName,string server);

FILE: src/Kite.Gateway.Domain/Node/NodeManager.cs
  class NodeManager (line 12) | internal class NodeManager : DomainService, INodeManager
    method NodeManager (line 17) | public NodeManager(IRepository<Entities.Node> repository)
    method CreateAsync (line 22) | public async Task<Entities.Node> CreateAsync(string nodeName, string s...
    method UpdateAsync (line 43) | public async Task<Entities.Node> UpdateAsync(Guid id, string nodeName,...

FILE: src/Kite.Gateway.Domain/ReverseProxy/ClusterManager.cs
  class ClusterManager (line 16) | internal class ClusterManager: DomainService, IClusterManager
    method ClusterManager (line 19) | public ClusterManager(IRepository<Cluster> clusterRepository)
    method CreateAsync (line 24) | public async Task<Cluster> CreateAsync(Guid routeId, string clusterNam...
    method CreateClusterDestinationAsync (line 40) | public Task<ClusterDestination> CreateClusterDestinationAsync(Guid clu...
    method CreateHealthCheckAsync (line 52) | public Task<ClusterHealthCheck> CreateHealthCheckAsync<TDto>(TDto heal...

FILE: src/Kite.Gateway.Domain/ReverseProxy/GatewayOptions.cs
  class GatewayOptions (line 9) | public class GatewayOptions

FILE: src/Kite.Gateway.Domain/ReverseProxy/IClusterManager.cs
  type IClusterManager (line 11) | public interface IClusterManager
    method CreateHealthCheckAsync (line 19) | Task<ClusterHealthCheck> CreateHealthCheckAsync<TDto>(TDto healthCheck...
    method CreateAsync (line 29) | Task<Cluster> CreateAsync(Guid routeId,string clusterName, ServiceGove...
    method CreateClusterDestinationAsync (line 37) | Task<ClusterDestination> CreateClusterDestinationAsync(Guid clusterId,...

FILE: src/Kite.Gateway.Domain/ReverseProxy/IRefreshManager.cs
  type IRefreshManager (line 9) | public  interface IRefreshManager
    method ReloadConfigAsync (line 15) | Task ReloadConfigAsync();

FILE: src/Kite.Gateway.Domain/ReverseProxy/IReverseProxyDatabaseStore.cs
  type IReverseProxyDatabaseStore (line 7) | public interface IReverseProxyDatabaseStore
    method GetConfig (line 13) | InDatabaseStoreConfig GetConfig();
    method Reload (line 17) | void Reload();
    method GetReloadToken (line 22) | IChangeToken GetReloadToken();

FILE: src/Kite.Gateway.Domain/ReverseProxy/IRouteManager.cs
  type IRouteManager (line 10) | public interface IRouteManager
    method CreateAsync (line 20) | Task<Route> CreateAsync(string routeName,string routeMatchPath, bool u...
    method CreateRouteTransformAsync (line 28) | Task<RouteTransform> CreateRouteTransformAsync(Guid routeId,string tra...

FILE: src/Kite.Gateway.Domain/ReverseProxy/IYarpManager.cs
  type IYarpManager (line 10) | public interface IYarpManager
    method GetConfigureAsync (line 16) | Task<YarpOption> GetConfigureAsync();

FILE: src/Kite.Gateway.Domain/ReverseProxy/InDatabaseReloadToken.cs
  class InDatabaseReloadToken (line 11) | public class InDatabaseReloadToken : IChangeToken
    method OnReload (line 14) | public void OnReload() => tokenSource.Cancel();
    method RegisterChangeCallback (line 19) | public IDisposable RegisterChangeCallback(Action<object> callback, obj...

FILE: src/Kite.Gateway.Domain/ReverseProxy/InDatabaseStoreConfig.cs
  class InDatabaseStoreConfig (line 12) | public class InDatabaseStoreConfig : IProxyConfig
    method InDatabaseStoreConfig (line 15) | public InDatabaseStoreConfig(IReadOnlyList<RouteConfig> routes, IReadO...
    method SignalChange (line 26) | internal void SignalChange()

FILE: src/Kite.Gateway.Domain/ReverseProxy/InDatabaseStoreConfigProvider.cs
  class InDatabaseStoreConfigProvider (line 13) | public class InDatabaseStoreConfigProvider : IProxyConfigProvider, IDisp...
    method InDatabaseStoreConfigProvider (line 23) | public InDatabaseStoreConfigProvider(IReverseProxyDatabaseStore strore...
    method GetConfig (line 28) | public IProxyConfig GetConfig()
    method Dispose (line 37) | public void Dispose()
    method UpdateConfig (line 46) | private void UpdateConfig()

FILE: src/Kite.Gateway.Domain/ReverseProxy/InDatabaseStoreReloadToken.cs
  class InDatabaseStoreReloadToken (line 7) | public class InDatabaseStoreReloadToken : IChangeToken
    method OnReload (line 10) | public void OnReload() => tokenSource.Cancel();
    method RegisterChangeCallback (line 15) | public IDisposable RegisterChangeCallback(Action<object> callback, obj...

FILE: src/Kite.Gateway.Domain/ReverseProxy/Models/NacosServiceHostModel.cs
  class NacosServiceHostModel (line 9) | public class NacosServiceHostModel

FILE: src/Kite.Gateway.Domain/ReverseProxy/Models/NacosServiceModel.cs
  class NacosServiceModel (line 9) | public class NacosServiceModel

FILE: src/Kite.Gateway.Domain/ReverseProxy/Models/ServiceGovernanceModel.cs
  class ServiceGovernanceModel (line 12) | public class ServiceGovernanceModel

FILE: src/Kite.Gateway.Domain/ReverseProxy/RefreshManager.cs
  class RefreshManager (line 11) | internal class RefreshManager:DomainService, IRefreshManager
    method RefreshManager (line 14) | public RefreshManager(IReverseProxyDatabaseStore reverseProxyMemoryStore)
    method ReloadConfigAsync (line 18) | public Task ReloadConfigAsync()

FILE: src/Kite.Gateway.Domain/ReverseProxy/ReverseProxyDatabaseStore.cs
  class ReverseProxyDatabaseStore (line 16) | public class ReverseProxyDatabaseStore : ISingletonDependency, IReverseP...
    method ReverseProxyDatabaseStore (line 20) | public ReverseProxyDatabaseStore(IOptions<YarpOption> options)
    method GetConfig (line 24) | public InDatabaseStoreConfig GetConfig()
    method GetReloadToken (line 92) | public IChangeToken GetReloadToken()
    method Reload (line 97) | public void Reload()

FILE: src/Kite.Gateway.Domain/ReverseProxy/RouteManager.cs
  class RouteManager (line 14) | internal class RouteManager: DomainService,IRouteManager
    method RouteManager (line 17) | public RouteManager(IRepository<Route> routeRepository)
    method CreateAsync (line 22) | public async Task<Route> CreateAsync(string routeName, string routeMat...
    method CreateRouteTransformAsync (line 42) | public Task<RouteTransform> CreateRouteTransformAsync(Guid routeId, st...

FILE: src/Kite.Gateway.Domain/ReverseProxy/YarpManager.cs
  class YarpManager (line 24) | internal class YarpManager : DomainService, IYarpManager
    method YarpManager (line 37) | public YarpManager(IRepository<Route> routeRepository, IRepository<Rou...
    method GetConfigureAsync (line 51) | public async Task<YarpOption> GetConfigureAsync()
    method GetConsulServiceAsync (line 138) | private async Task<List<ClusterDestinationOption>> GetConsulServiceAsy...
    method GetNacosServiceAsync (line 184) | private async Task<List<ClusterDestinationOption>> GetNacosServiceAsyn...

FILE: src/Kite.Gateway.Domain/Whitelist/IWhiteListManager.cs
  type IWhiteListManager (line 9) | public interface IWhiteListManager
    method GetListAsync (line 11) | Task<List<Entities.Whitelist>> GetListAsync();
    method CreateAsync (line 17) | Task<Entities.Whitelist> CreateAsync<T>(T whiteList);

FILE: src/Kite.Gateway.Domain/Whitelist/WhiteListManager.cs
  class WhiteListManager (line 13) | internal class WhiteListManager : DomainService, IWhiteListManager
    method WhiteListManager (line 16) | public WhiteListManager(IRepository<Entities.Whitelist> repository)
    method CreateAsync (line 20) | public async Task<Entities.Whitelist> CreateAsync<T>(T whiteList)
    method GetListAsync (line 33) | public Task<List<Entities.Whitelist>> GetListAsync()

FILE: src/Kite.Gateway.EntityFrameworkCore/EntityFrameworkCoreModule.cs
  class EntityFrameworkCoreModule (line 16) | [DependsOn(
    method ConfigureServices (line 22) | public override void ConfigureServices(ServiceConfigurationContext con...
    method OnApplicationInitialization (line 34) | public override void OnApplicationInitialization(ApplicationInitializa...

FILE: src/Kite.Gateway.EntityFrameworkCore/KiteDbContext.cs
  class KiteDbContext (line 9) | [ConnectionStringName("Default")]
    method KiteDbContext (line 27) | public KiteDbContext(DbContextOptions<KiteDbContext> options): base(op...
    method OnModelCreating (line 32) | protected override void OnModelCreating(ModelBuilder builder)

FILE: src/Kite.Gateway.EntityFrameworkCore/Migrations/20220726095023_Migration_v1.0.0.Designer.cs
  class Migration_v100 (line 14) | [DbContext(typeof(KiteDbContext))]
    method BuildTargetModel (line 18) | protected override void BuildTargetModel(ModelBuilder modelBuilder)

FILE: src/Kite.Gateway.EntityFrameworkCore/Migrations/20220726095023_Migration_v1.0.0.cs
  class Migration_v100 (line 8) | public partial class Migration_v100 : Migration
    method Up (line 10) | protected override void Up(MigrationBuilder migrationBuilder)
    method Down (line 201) | protected override void Down(MigrationBuilder migrationBuilder)

FILE: src/Kite.Gateway.EntityFrameworkCore/Migrations/20220727061321_Migration_v1.0.1.Designer.cs
  class Migration_v101 (line 14) | [DbContext(typeof(KiteDbContext))]
    method BuildTargetModel (line 18) | protected override void BuildTargetModel(ModelBuilder modelBuilder)

FILE: src/Kite.Gateway.EntityFrameworkCore/Migrations/20220727061321_Migration_v1.0.1.cs
  class Migration_v101 (line 7) | public partial class Migration_v101 : Migration
    method Up (line 9) | protected override void Up(MigrationBuilder migrationBuilder)
    method Down (line 17) | protected override void Down(MigrationBuilder migrationBuilder)

FILE: src/Kite.Gateway.EntityFrameworkCore/Migrations/20220731131935_Migration_v1.0.2.Designer.cs
  class Migration_v102 (line 14) | [DbContext(typeof(KiteDbContext))]
    method BuildTargetModel (line 18) | protected override void BuildTargetModel(ModelBuilder modelBuilder)

FILE: src/Kite.Gateway.EntityFrameworkCore/Migrations/20220731131935_Migration_v1.0.2.cs
  class Migration_v102 (line 7) | public partial class Migration_v102 : Migration
    method Up (line 9) | protected override void Up(MigrationBuilder migrationBuilder)
    method Down (line 33) | protected override void Down(MigrationBuilder migrationBuilder)

FILE: src/Kite.Gateway.EntityFrameworkCore/Migrations/20220801073938_Migration_v1.0.3.Designer.cs
  class Migration_v103 (line 14) | [DbContext(typeof(KiteDbContext))]
    method BuildTargetModel (line 18) | protected override void BuildTargetModel(ModelBuilder modelBuilder)

FILE: src/Kite.Gateway.EntityFrameworkCore/Migrations/20220801073938_Migration_v1.0.3.cs
  class Migration_v103 (line 7) | public partial class Migration_v103 : Migration
    method Up (line 9) | protected override void Up(MigrationBuilder migrationBuilder)
    method Down (line 16) | protected override void Down(MigrationBuilder migrationBuilder)

FILE: src/Kite.Gateway.EntityFrameworkCore/Migrations/KiteDbContextModelSnapshot.cs
  class KiteDbContextModelSnapshot (line 13) | [DbContext(typeof(KiteDbContext))]
    method BuildModel (line 16) | protected override void BuildModel(ModelBuilder modelBuilder)

FILE: src/Kite.Gateway.Web/Controllers/RefreshController.cs
  class RefreshController (line 11) | [Route("api/[controller]")]
    method RefreshController (line 16) | public RefreshController(IRefreshAppService refreshAppService)
    method ReloadConfigureAsync (line 20) | [HttpPost("/api/kite/refresh/configure")]

FILE: src/Kite.Gateway.Web/Filters/AbpCoreExceptionFilter.cs
  class AbpCoreExceptionFilter (line 9) | public class AbpCoreExceptionFilter : IExceptionFilter
    method OnException (line 11) | public void OnException(ExceptionContext context)

FILE: src/Kite.Gateway.Web/Filters/KiteCoreActionFilter.cs
  class KiteCoreActionFilter (line 9) | public class KiteCoreActionFilter : IActionFilter
    method OnActionExecuted (line 11) | public void OnActionExecuted(ActionExecutedContext context)
    method OnActionExecuting (line 16) | public void OnActionExecuting(ActionExecutingContext context)

FILE: src/Kite.Gateway.Web/Middlewares/KiteAuthorizationMiddleware.cs
  class KiteAuthorizationMiddleware (line 16) | public class KiteAuthorizationMiddleware
    method KiteAuthorizationMiddleware (line 22) | public KiteAuthorizationMiddleware(RequestDelegate next
    method Invoke (line 30) | public async Task Invoke(HttpContext context)
    method CheckWhitelist (line 67) | private bool CheckWhitelist(HttpContext context)

FILE: src/Kite.Gateway.Web/Middlewares/KiteExternalMiddleware.cs
  class KiteExternalMiddleware (line 15) | public class KiteExternalMiddleware
    method KiteExternalMiddleware (line 20) | public KiteExternalMiddleware(RequestDelegate next
    method Invoke (line 27) | public async Task Invoke(HttpContext context)
    method HttpRequestAsync (line 47) | private async Task<MiddlewareResult> HttpRequestAsync(MiddlewareOption...

FILE: src/Kite.Gateway.Web/WebModule.cs
  class WebModule (line 42) | [DependsOn(
    method ConfigureServices (line 50) | public override void ConfigureServices(ServiceConfigurationContext con...
    method ConfigureCore (line 73) | private void ConfigureCore(ServiceConfigurationContext context)
    method ConfigureMvc (line 97) | private void ConfigureMvc(ServiceConfigurationContext context)
    method ConfigureReverseProxy (line 120) | private void ConfigureReverseProxy(ServiceConfigurationContext context)
    method ConfigureCors (line 130) | private void ConfigureCors(ServiceConfigurationContext context)
    method OnApplicationInitialization (line 146) | public override void OnApplicationInitialization(ApplicationInitializa...
    method LoadMainConfigureAsync (line 183) | private void LoadMainConfigureAsync(ApplicationInitializationContext c...
Condensed preview — 224 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (476K chars).
[
  {
    "path": ".dockerignore",
    "chars": 316,
    "preview": "**/.classpath\n**/.dockerignore\n**/.env\n**/.git\n**/.gitignore\n**/.project\n**/.settings\n**/.toolstarget\n**/.vs\n**/.vscode\n"
  },
  {
    "path": ".gitignore",
    "chars": 4605,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# Logs"
  },
  {
    "path": "Kite.Gateway.sln",
    "chars": 5181,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.3232"
  },
  {
    "path": "README.en.md",
    "chars": 822,
    "preview": "# 基于Yarp的API网关\n\n#### Description\n基于Yarp的API网关\n\n#### Software Architecture\nSoftware architecture description\n\n#### Instal"
  },
  {
    "path": "README.md",
    "chars": 263,
    "preview": "# Kite Api网关\n\n#### 介绍\n基于微软反向代理组件Yarp开发的Api网关\n\n\n#### 软件架构\n\n开发框架 .Net 7 + Abp Vnext 7.0.1 + Blazor(UI框架:BootstrapBlazor)\n\n"
  },
  {
    "path": "admin/Kite.Gateway.Admin/.config/dotnet-tools.json",
    "chars": 153,
    "preview": "{\n  \"version\": 1,\n  \"isRoot\": true,\n  \"tools\": {\n    \"dotnet-ef\": {\n      \"version\": \"6.0.8\",\n      \"commands\": [\n      "
  },
  {
    "path": "admin/Kite.Gateway.Admin/App.razor",
    "chars": 577,
    "preview": "<BootstrapBlazorRoot>\n    <Router AppAssembly=\"@typeof(App).Assembly\">\n        <Found Context=\"routeData\">\n            "
  },
  {
    "path": "admin/Kite.Gateway.Admin/Controllers/RefreshController.cs",
    "chars": 1150,
    "preview": "using Kite.Gateway.Application;\nusing Kite.Gateway.Application.Contracts;\nusing Microsoft.Extensions.Configuration;\nusi"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Core/AuthorizationServerStorage.cs",
    "chars": 2140,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos.Administrator;\nusing Microsoft.AspNetCore.Components;\nusing Microsoft.Asp"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Dockerfile",
    "chars": 1320,
    "preview": "#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for fast"
  },
  {
    "path": "admin/Kite.Gateway.Admin/GatewayAdminModule.cs",
    "chars": 3516,
    "preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Kite.Gateway.Admin.csproj",
    "chars": 1964,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <Nullable>ena"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Administrator/Administrator.razor",
    "chars": 5072,
    "preview": "@page \"/Administrator\"\n\n@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Admini"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Administrator/Login.razor",
    "chars": 3076,
    "preview": "@page \"/Login\"\n@layout SimpleLayout\n\n@using Kite.Gateway.Admin.Core\n@using Kite.Gateway.Application.Contracts\n@using Ki"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Administrator/Login.razor.css",
    "chars": 970,
    "preview": "html,\nbody {\n    height: 100%;\n}\n\nbody {\n    display: flex;\n    align-items: center;\n    padding-top: 40px;\n    padding"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Administrator/Logout.razor",
    "chars": 973,
    "preview": "@page \"/Logout\"\n@using System\n@layout SimpleLayout\n@using Kite.Gateway.Admin.Core\n@using Mapster\n@using Kite.Gateway.Do"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Administrator/Logout.razor.css",
    "chars": 972,
    "preview": "html,\nbody {\n    height: 100%;\n}\n\nbody {\n    display: flex;\n    align-items: center;\n    padding-top: 40px;\n    padding"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Administrator/NewAdministrator.razor",
    "chars": 1992,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Administrator\n@inject ToastSer"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Administrator/UpdateAdministrator.razor",
    "chars": 1916,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Administrator\n@inject ToastSer"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Authorization/Authentication.razor",
    "chars": 5580,
    "preview": "@page \"/Authentication\"\n@using System.IO;\n@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Con"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Error.cshtml",
    "chars": 1532,
    "preview": "@page\n@model Kite.Gateway.Admin.Pages.ErrorModel\n\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Error.cshtml.cs",
    "chars": 716,
    "preview": "using Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.Mvc.RazorPages;\nusing System.Diagnostics;\n\nnamespace Kite.Ga"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Home.razor",
    "chars": 1406,
    "preview": "@page \"/\"\n\n<div role=\"alert\" class=\"alert fade show alert-info is-bar\">\n    <div class=\"alert-content\">\n        <h4><i "
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Middleware/Middleware.razor",
    "chars": 6667,
    "preview": "@page \"/Middleware\"\n\n@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Middlewar"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Middleware/NewMiddleware.razor",
    "chars": 2640,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Middleware\n@inject ToastServic"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Middleware/UpdateMiddleware.razor",
    "chars": 2457,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Middleware\n@inject ToastServic"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Node/NewNode.razor",
    "chars": 2110,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Node\n@inject ToastService Toas"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Node/Node.razor",
    "chars": 5699,
    "preview": "@page \"/Node\"\n@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Node\n@using Maps"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Node/RefreshConfigure.razor",
    "chars": 3695,
    "preview": "@using Kite.Gateway.Application\n@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dto"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Node/UpdateNode.razor",
    "chars": 2042,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Node\n@inject ToastService Toas"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/PaginationComponent.razor",
    "chars": 2067,
    "preview": "\n<nav aria-label=\"Page navigation example\">\n  <ul class=\"pagination\">\n    <li class=\"page-item disabled\">\n      <span c"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/ServiceGovernance/ServiceGovernance.razor",
    "chars": 2667,
    "preview": "@page \"/ServiceGovernance\"\n\n@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Se"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Whitelist/NewWhitelist.razor",
    "chars": 3678,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Whitelist\n@inject ToastService"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Whitelist/UpdateWhitelist.razor",
    "chars": 3500,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Whitelist\n@inject ToastService"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Whitelist/WhiteList.razor",
    "chars": 6239,
    "preview": "@page \"/Whitelist\"\n\n@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.Whitelist\n"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Yarp/NewRoute.razor",
    "chars": 4774,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.ReverseProxy\n@inject ToastServ"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Yarp/Route.razor",
    "chars": 8721,
    "preview": "@page \"/Route\"\n\n@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.ReverseProxy\n@"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/Yarp/UpdateRoute.razor",
    "chars": 4367,
    "preview": "@using Kite.Gateway.Application.Contracts\n@using Kite.Gateway.Application.Contracts.Dtos.ReverseProxy\n@using Mapster;\n@"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/_Host.cshtml",
    "chars": 195,
    "preview": "@page \"/\"\n@namespace Kite.Gateway.Admin.Pages\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n@{\n\n    Layout = \"_L"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Pages/_Layout.cshtml",
    "chars": 1321,
    "preview": "@using Microsoft.AspNetCore.Components.Web\n@namespace Kite.Gateway.Admin.Pages\n@addTagHelper *, Microsoft.AspNetCore.Mv"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Program.cs",
    "chars": 1102,
    "preview": "\nusing Kite.Gateway.Admin;\nusing Kite.Gateway.Admin.Core;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Properties/launchSettings.json",
    "chars": 835,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      "
  },
  {
    "path": "admin/Kite.Gateway.Admin/Shared/MainLayout.razor",
    "chars": 2296,
    "preview": "@inherits LayoutComponentBase\n@inject SwalService swalService\n@inject NavigationManager navigationManager\n\n<Layout Side"
  },
  {
    "path": "admin/Kite.Gateway.Admin/Shared/MainLayout.razor.cs",
    "chars": 3413,
    "preview": "using BootstrapBlazor.Components;\nusing Microsoft.AspNetCore.Components.Routing;\n\nusing Kite.Gateway.Admin.Core;\nusing "
  },
  {
    "path": "admin/Kite.Gateway.Admin/Shared/MainLayout.razor.css",
    "chars": 1187,
    "preview": ".page {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n}\n\nmain {\n    flex: 1;\n}\n\n.sidebar {\n    "
  },
  {
    "path": "admin/Kite.Gateway.Admin/Shared/SimpleLayout.razor",
    "chars": 52,
    "preview": "@inherits LayoutComponentBase\n\n\n @Body\n\n@code {\n\n}\n"
  },
  {
    "path": "admin/Kite.Gateway.Admin/_Imports.razor",
    "chars": 431,
    "preview": "@using System.Net.Http\n@using Microsoft.AspNetCore.Authorization\n@using Microsoft.AspNetCore.Components.Authorization\n@"
  },
  {
    "path": "admin/Kite.Gateway.Admin/appsettings.json",
    "chars": 222,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  "
  },
  {
    "path": "admin/Kite.Gateway.Admin/wwwroot/css/open-iconic/FONT-LICENSE",
    "chars": 4017,
    "preview": "SIL OPEN FONT LICENSE Version 1.1\n\nCopyright (c) 2014 Waybury\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to "
  },
  {
    "path": "admin/Kite.Gateway.Admin/wwwroot/css/open-iconic/ICON-LICENSE",
    "chars": 1073,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Waybury\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "admin/Kite.Gateway.Admin/wwwroot/css/open-iconic/README.md",
    "chars": 3495,
    "preview": "[Open Iconic v1.1.1](http://useiconic.com/open)\n===========\n\n### Open Iconic is the open source sibling of [Iconic](http"
  },
  {
    "path": "admin/Kite.Gateway.Admin/wwwroot/css/signin.css",
    "chars": 598,
    "preview": "html,\nbody {\n  height: 100%;\n}\n\nbody {\n  display: flex;\n  align-items: center;\n  padding-top: 40px;\n  padding-bottom: 40"
  },
  {
    "path": "admin/Kite.Gateway.Admin/wwwroot/css/site.css",
    "chars": 2746,
    "preview": "@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');\n\nhtml, body {\n    font-family: 'Helvetica Neue', Helv"
  },
  {
    "path": "simples/Kite.Simple.Account/Authorization/ClaimModel.cs",
    "chars": 411,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "simples/Kite.Simple.Account/Authorization/IJwtTokenManager.cs",
    "chars": 443,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Security.Claims;\nusing System.Text;\nusi"
  },
  {
    "path": "simples/Kite.Simple.Account/Authorization/JwtTokenAuthenticateResult.cs",
    "chars": 626,
    "preview": "using Microsoft.IdentityModel.Tokens;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.S"
  },
  {
    "path": "simples/Kite.Simple.Account/Authorization/JwtTokenManager.cs",
    "chars": 1910,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IdentityModel.Tokens.Jwt;\nusing System.Linq;\nusing System."
  },
  {
    "path": "simples/Kite.Simple.Account/Authorization/JwtTokenOptions.cs",
    "chars": 655,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "simples/Kite.Simple.Account/Authorization/JwtTokenResult.cs",
    "chars": 660,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "simples/Kite.Simple.Account/Controllers/AccountController.cs",
    "chars": 966,
    "preview": "using Kite.Simple.Account.Models;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace Kite.Simp"
  },
  {
    "path": "simples/Kite.Simple.Account/Controllers/LoginController.cs",
    "chars": 1409,
    "preview": "using Kite.Simple.Account.Authorization;\nusing Kite.Simple.Account.Models;\nusing Microsoft.AspNetCore.Http;\nusing Micro"
  },
  {
    "path": "simples/Kite.Simple.Account/Controllers/MiddlewareController.cs",
    "chars": 600,
    "preview": "using Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\nusing System.Text.Json;\nnamespace Kite.Simple.Account."
  },
  {
    "path": "simples/Kite.Simple.Account/Controllers/WeatherForecastController.cs",
    "chars": 1021,
    "preview": "using Microsoft.AspNetCore.Mvc;\n\nnamespace Kite.Simple.Account.Controllers\n{\n    [ApiController]\n    [Route(\"[controller"
  },
  {
    "path": "simples/Kite.Simple.Account/Kite.Simple.Account.csproj",
    "chars": 411,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>ena"
  },
  {
    "path": "simples/Kite.Simple.Account/Models/AccountLoginDto.cs",
    "chars": 385,
    "preview": "using System.ComponentModel.DataAnnotations;\n\nnamespace Kite.Simple.Account.Models\n{\n    public class AccountLoginDto\n "
  },
  {
    "path": "simples/Kite.Simple.Account/Models/AccountLoginResultDto.cs",
    "chars": 467,
    "preview": "using Kite.Simple.Account.Authorization;\n\nnamespace Kite.Simple.Account.Models\n{\n    public class AccountLoginResultDto"
  },
  {
    "path": "simples/Kite.Simple.Account/Models/CreateAccountDto.cs",
    "chars": 509,
    "preview": "using System.ComponentModel.DataAnnotations;\nnamespace Kite.Simple.Account.Models\n{\n    public class CreateAccountDto\n "
  },
  {
    "path": "simples/Kite.Simple.Account/Program.cs",
    "chars": 710,
    "preview": "using Kite.Simple.Account.Authorization;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n// Add services to the cont"
  },
  {
    "path": "simples/Kite.Simple.Account/Properties/launchSettings.json",
    "chars": 787,
    "preview": "{\n  \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n  \"iisSettings\": {\n    \"windowsAuthentication\": false"
  },
  {
    "path": "simples/Kite.Simple.Account/WeatherForecast.cs",
    "chars": 285,
    "preview": "namespace Kite.Simple.Account\n{\n    public class WeatherForecast\n    {\n        public DateTime Date { get; set; }\n\n     "
  },
  {
    "path": "simples/Kite.Simple.Account/appsettings.json",
    "chars": 324,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  "
  },
  {
    "path": "simples/Kite.Simple.Order/Controllers/OrderController.cs",
    "chars": 1367,
    "preview": "using Kite.Simple.Order.Models;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace Kite.Simple"
  },
  {
    "path": "simples/Kite.Simple.Order/Controllers/WeatherForecastController.cs",
    "chars": 1019,
    "preview": "using Microsoft.AspNetCore.Mvc;\n\nnamespace Kite.Simple.Order.Controllers\n{\n    [ApiController]\n    [Route(\"[controller]\""
  },
  {
    "path": "simples/Kite.Simple.Order/Kite.Simple.Order.csproj",
    "chars": 314,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>ena"
  },
  {
    "path": "simples/Kite.Simple.Order/Models/CreateOrderDto.cs",
    "chars": 503,
    "preview": "namespace Kite.Simple.Order.Models\n{\n    public class CreateOrderDto\n    {\n        /// <summary>\n        /// 下单账号ID\n   "
  },
  {
    "path": "simples/Kite.Simple.Order/Program.cs",
    "chars": 504,
    "preview": "var builder = WebApplication.CreateBuilder(args);\n\n// Add services to the container.\n\nbuilder.Services.AddControllers();"
  },
  {
    "path": "simples/Kite.Simple.Order/Properties/launchSettings.json",
    "chars": 785,
    "preview": "{\n  \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n  \"iisSettings\": {\n    \"windowsAuthentication\": false"
  },
  {
    "path": "simples/Kite.Simple.Order/WeatherForecast.cs",
    "chars": 283,
    "preview": "namespace Kite.Simple.Order\n{\n    public class WeatherForecast\n    {\n        public DateTime Date { get; set; }\n\n       "
  },
  {
    "path": "simples/Kite.Simple.Order/appsettings.json",
    "chars": 142,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  "
  },
  {
    "path": "simples/Kite.SimpleServices.sln",
    "chars": 1635,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.2.3261"
  },
  {
    "path": "src/Kite.Gateway.Application/AdministratorAppService.cs",
    "chars": 3937,
    "preview": "using Kite.Gateway.Application.Contracts;\nusing Kite.Gateway.Application.Contracts.Dtos.Administrator;\nusing Kite.Gatew"
  },
  {
    "path": "src/Kite.Gateway.Application/ApplicationModule.cs",
    "chars": 601,
    "preview": "using Kite.Gateway.Application.Contracts;\nusing Kite.Gateway.Domain;\nusing Microsoft.Extensions.DependencyInjection;\nus"
  },
  {
    "path": "src/Kite.Gateway.Application/AuthorizationAppService.cs",
    "chars": 1906,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application/BaseApplicationService.cs",
    "chars": 2949,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application/ConfigureAppService.cs",
    "chars": 2794,
    "preview": "using Kite.Gateway.Application.Contracts;\nusing Kite.Gateway.Application.Contracts.Dtos;\nusing Kite.Gateway.Application"
  },
  {
    "path": "src/Kite.Gateway.Application/Kite.Gateway.Application.csproj",
    "chars": 919,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <BaseOutputPath><"
  },
  {
    "path": "src/Kite.Gateway.Application/MiddlewareAppService.cs",
    "chars": 3060,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application/NodeAppService.cs",
    "chars": 2771,
    "preview": "using Kite.Gateway.Application.Contracts;\nusing Kite.Gateway.Application.Contracts.Dtos.Node;\nusing Kite.Gateway.Domain"
  },
  {
    "path": "src/Kite.Gateway.Application/RefreshAppService.cs",
    "chars": 1910,
    "preview": "using Microsoft.Extensions.DependencyInjection;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusin"
  },
  {
    "path": "src/Kite.Gateway.Application/RouteAppService.cs",
    "chars": 12198,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application/ServiceGovernanceAppService.cs",
    "chars": 1763,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application/WhitelistAppService.cs",
    "chars": 4012,
    "preview": "using Mapster;\nusing Microsoft.AspNetCore.Mvc;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/ApplicationContractsModule.cs",
    "chars": 429,
    "preview": "using Kite.Gateway.Application.Contracts;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Syst"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Administrator/AdministratorDto.cs",
    "chars": 763,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Administrator/CreateAdministratorDto.cs",
    "chars": 660,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Administrator/LoginAdministratorDto.cs",
    "chars": 535,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Administrator/UpdateAdministratorDto.cs",
    "chars": 759,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Authorization/SaveAuthenticationDto.cs",
    "chars": 2254,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Middleware/CreateMiddlewareDto.cs",
    "chars": 1153,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Dat"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Middleware/MiddlewareDto.cs",
    "chars": 1287,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Middleware/MiddlewareListDto.cs",
    "chars": 1291,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Middleware/UpdateMiddlewareDto.cs",
    "chars": 1215,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Dat"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Node/CreateNodeDto.cs",
    "chars": 760,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Node/NodeDto.cs",
    "chars": 968,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Node/ReloadConfigureDto.cs",
    "chars": 913,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Node/UpdateNodeDto.cs",
    "chars": 894,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/RefreshConfigureDto.cs",
    "chars": 911,
    "preview": "using Kite.Gateway.Domain.Shared.Options;\nusing Microsoft.AspNetCore.Mvc.ModelBinding.Validation;\nusing System;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/ClusterDestinationDto.cs",
    "chars": 677,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/ClusterDto.cs",
    "chars": 1546,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/ClusterHealthCheckDto.cs",
    "chars": 910,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/CreateRouteDto.cs",
    "chars": 2001,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/RouteDto.cs",
    "chars": 1229,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/RouteMainDto.cs",
    "chars": 773,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/RoutePageDto.cs",
    "chars": 1733,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/RouteTransformDto.cs",
    "chars": 671,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ReverseProxy/UpdateRouteDto.cs",
    "chars": 2124,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Dat"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ServiceGovernance/ServiceGovernanceConfigureDto.cs",
    "chars": 1147,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/ValidateTokenDto.cs",
    "chars": 524,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Whitelist/CreateWhitelistDto.cs",
    "chars": 965,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Dat"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Whitelist/UpdateWhitelistDto.cs",
    "chars": 1079,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Dat"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Dtos/Whitelist/WhitelistDto.cs",
    "chars": 1093,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Http/SimpleHttpException.cs",
    "chars": 475,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/IAdministratorAppService.cs",
    "chars": 1677,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos.Administrator;\nusing System;\nusing System.Collections.Generic;\nusing Syst"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/IAuthorizationAppService.cs",
    "chars": 822,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos.Authorization;\nusing System;\nusing System.Collections.Generic;\nusing Syst"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/IConfigureAppService.cs",
    "chars": 634,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos;\nusing Kite.Gateway.Application.Contracts.Dtos.Node;\nusing System;\nusing "
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/IMiddlewareAppService.cs",
    "chars": 1818,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos.Middleware;\nusing System;\nusing System.Collections.Generic;\nusing System."
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/INodeAppService.cs",
    "chars": 1535,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos.Node;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/IRefreshAppService.cs",
    "chars": 619,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos;\nusing Kite.Gateway.Application.Contracts.Dtos.Node;\nusing System;\nusing "
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/IRouteAppService.cs",
    "chars": 1969,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos.ReverseProxy;\nusing System;\nusing System.Collections.Generic;\nusing Syste"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/IServiceGovernanceAppService.cs",
    "chars": 792,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos.ServiceGovernance;\nusing System;\nusing System.Collections.Generic;\nusing "
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/IWhitelistAppService.cs",
    "chars": 1798,
    "preview": "using Kite.Gateway.Application.Contracts.Dtos.Whitelist;\nusing System;\nusing System.Collections.Generic;\nusing System.L"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/Kite.Gateway.Application.Contracts.csproj",
    "chars": 856,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>e"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/KitePageResult.cs",
    "chars": 339,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Application.Contracts/KiteResult.cs",
    "chars": 764,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Kite.Gatewa"
  },
  {
    "path": "src/Kite.Gateway.Domain/Administrator/AdministratorManager.cs",
    "chars": 1956,
    "preview": "using Kite.Gateway.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Tex"
  },
  {
    "path": "src/Kite.Gateway.Domain/Administrator/IAdministratorManager.cs",
    "chars": 1002,
    "preview": "using Kite.Gateway.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Tex"
  },
  {
    "path": "src/Kite.Gateway.Domain/Authorization/AuthenticationManager.cs",
    "chars": 1353,
    "preview": "using Kite.Gateway.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Tex"
  },
  {
    "path": "src/Kite.Gateway.Domain/Authorization/ClaimModel.cs",
    "chars": 411,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/Authorization/IAuthenticationManager.cs",
    "chars": 418,
    "preview": "using Kite.Gateway.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Tex"
  },
  {
    "path": "src/Kite.Gateway.Domain/Authorization/IJwtTokenManager.cs",
    "chars": 514,
    "preview": "using Microsoft.AspNetCore.Http;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Securi"
  },
  {
    "path": "src/Kite.Gateway.Domain/Authorization/JwtTokenManager.cs",
    "chars": 3359,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IdentityModel.Tokens.Jwt;\nusing System.Linq;\nusing System."
  },
  {
    "path": "src/Kite.Gateway.Domain/Authorization/JwtTokenOptions.cs",
    "chars": 1592,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/Authorization/JwtTokenValidationResult.cs",
    "chars": 624,
    "preview": "using Microsoft.IdentityModel.Tokens;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.S"
  },
  {
    "path": "src/Kite.Gateway.Domain/ConfigureManager.cs",
    "chars": 4637,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing Sys"
  },
  {
    "path": "src/Kite.Gateway.Domain/DomainModule.cs",
    "chars": 581,
    "preview": "using Kite.Gateway.Domain.Shared;\nusing Kite.Gateway.Domain;\nusing System;\nusing System.Collections.Generic;\nusing Syst"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/Administrator.cs",
    "chars": 1011,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/AuthenticationConfigure.cs",
    "chars": 2187,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/Cluster.cs",
    "chars": 1472,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Dat"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/ClusterDestination.cs",
    "chars": 861,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/ClusterHealthCheck.cs",
    "chars": 1155,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/Middleware.cs",
    "chars": 1436,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Dat"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/Node.cs",
    "chars": 1189,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/Route.cs",
    "chars": 1289,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/RouteTransform.cs",
    "chars": 844,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/ServiceGovernanceConfigure.cs",
    "chars": 1351,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Domain/Entities/Whitelist.cs",
    "chars": 1233,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Dat"
  },
  {
    "path": "src/Kite.Gateway.Domain/IConfigureManager.cs",
    "chars": 1029,
    "preview": "using Kite.Gateway.Domain.Entities;\nusing Kite.Gateway.Domain.Shared.Options;\nusing System;\nusing System.Collections.Ge"
  },
  {
    "path": "src/Kite.Gateway.Domain/Kite.Gateway.Domain.csproj",
    "chars": 360,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n "
  },
  {
    "path": "src/Kite.Gateway.Domain/Middlewares/IMiddlewareContext.cs",
    "chars": 410,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/Middlewares/IMiddlewareManager.cs",
    "chars": 955,
    "preview": "using Kite.Gateway.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Tex"
  },
  {
    "path": "src/Kite.Gateway.Domain/Middlewares/MiddlewareManager.cs",
    "chars": 2593,
    "preview": "using Kite.Gateway.Domain.Entities;\nusing Microsoft.Extensions.Caching.Memory;\nusing System;\nusing System.Collections.G"
  },
  {
    "path": "src/Kite.Gateway.Domain/Middlewares/MiddlewareResult.cs",
    "chars": 452,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/Node/INodeManager.cs",
    "chars": 778,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/Node/NodeManager.cs",
    "chars": 1837,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/ClusterManager.cs",
    "chars": 2388,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/GatewayOptions.cs",
    "chars": 210,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/IClusterManager.cs",
    "chars": 1521,
    "preview": "using Kite.Gateway.Domain.Entities;\nusing Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Gene"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/IRefreshManager.cs",
    "chars": 345,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/IReverseProxyDatabaseStore.cs",
    "chars": 587,
    "preview": "using Microsoft.Extensions.Primitives;\nusing System.Threading.Tasks;\nusing Yarp.ReverseProxy.Configuration;\n\nnamespace "
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/IRouteManager.cs",
    "chars": 1021,
    "preview": "using Kite.Gateway.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Tex"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/IYarpManager.cs",
    "chars": 399,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/InDatabaseReloadToken.cs",
    "chars": 756,
    "preview": "using Microsoft.Extensions.Primitives;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System."
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/InDatabaseStoreConfig.cs",
    "chars": 949,
    "preview": "using Microsoft.Extensions.Primitives;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System."
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/InDatabaseStoreConfigProvider.cs",
    "chars": 2383,
    "preview": "using Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Primitives;\nusing System;\nusing System.Collections.Gener"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/InDatabaseStoreReloadToken.cs",
    "chars": 659,
    "preview": "using Microsoft.Extensions.Primitives;\nusing System;\nusing System.Threading;\n\nnamespace Kite.Gateway.Domain.ReverseProx"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/Models/NacosServiceHostModel.cs",
    "chars": 1596,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/Models/NacosServiceModel.cs",
    "chars": 1270,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/Models/ServiceGovernanceModel.cs",
    "chars": 1085,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/RefreshManager.cs",
    "chars": 747,
    "preview": "using Kite.Gateway.Domain.ReverseProxy;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/ReverseProxyDatabaseStore.cs",
    "chars": 3970,
    "preview": "using Microsoft.Extensions.Primitives;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System."
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/RouteManager.cs",
    "chars": 1852,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Domain/ReverseProxy/YarpManager.cs",
    "chars": 10565,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing Sys"
  },
  {
    "path": "src/Kite.Gateway.Domain/Whitelist/IWhiteListManager.cs",
    "chars": 470,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain/Whitelist/WhiteListManager.cs",
    "chars": 1205,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/DomainSharedModule.cs",
    "chars": 403,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Enums/FilterTypeEnum.cs",
    "chars": 524,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Enums/ServiceGovernanceType.cs",
    "chars": 658,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Enums/SignalTypeEnum.cs",
    "chars": 553,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing S"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Kite.Gateway.Domain.Shared.csproj",
    "chars": 774,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>e"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/AuthenticationOption.cs",
    "chars": 1987,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/ClusterDestinationOption.cs",
    "chars": 454,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/ClusterHealthCheckOption.cs",
    "chars": 751,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/ClusterOption.cs",
    "chars": 1065,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/KiteGatewayOption.cs",
    "chars": 452,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/MiddlewareOption.cs",
    "chars": 1060,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/RouteOption.cs",
    "chars": 786,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/RouteTransformOption.cs",
    "chars": 449,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/WhitelistOption.cs",
    "chars": 910,
    "preview": "using Kite.Gateway.Domain.Shared.Enums;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/Options/YarpOption.cs",
    "chars": 365,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "src/Kite.Gateway.Domain.Shared/TextHelper.cs",
    "chars": 2200,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Security.Cryptography;\nnamespace Kite.G"
  }
]

// ... and 24 more files (download for full content)

About this extraction

This page contains the full source code of the yupingyong/kite.gateway GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 224 files (414.1 KB), approximately 101.2k tokens, and a symbol index with 418 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!