mirror of https://github.com/EasyAbp/EShop.git
138 changed files with 3705 additions and 0 deletions
@ -0,0 +1 @@ |
|||||
|
**/wwwroot/libs/** linguist-vendored |
||||
@ -0,0 +1,258 @@ |
|||||
|
## Ignore Visual Studio temporary files, build results, and |
||||
|
## files generated by popular Visual Studio add-ons. |
||||
|
|
||||
|
# User-specific files |
||||
|
*.suo |
||||
|
*.user |
||||
|
*.userosscache |
||||
|
*.sln.docstates |
||||
|
|
||||
|
# 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/ |
||||
|
|
||||
|
# 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 |
||||
|
|
||||
|
# ProductTag |
||||
|
host/EasyAbp.EShop.Plugins.ProductTag.IdentityServer/Logs/logs.txt |
||||
|
host/EasyAbp.EShop.Plugins.ProductTag.HttpApi.Host/Logs/logs.txt |
||||
|
host/EasyAbp.EShop.Plugins.ProductTag.Web.Host/Logs/logs.txt |
||||
|
host/EasyAbp.EShop.Plugins.ProductTag.Web.Unified/Logs/logs.txt |
||||
@ -0,0 +1,139 @@ |
|||||
|
|
||||
|
Microsoft Visual Studio Solution File, Format Version 12.00 |
||||
|
# Visual Studio Version 16 |
||||
|
VisualStudioVersion = 16.0.29001.49 |
||||
|
MinimumVisualStudioVersion = 10.0.40219.1 |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.Domain.Shared", "src\EasyAbp.EShop.Plugins.ProductTag.Domain.Shared\EasyAbp.EShop.Plugins.ProductTag.Domain.Shared.csproj", "{D64C1577-4929-4B60-939E-96DE1534891A}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.Domain", "src\EasyAbp.EShop.Plugins.ProductTag.Domain\EasyAbp.EShop.Plugins.ProductTag.Domain.csproj", "{F2840BC7-0188-4606-9126-DADD0F5ABF7A}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.Application.Contracts", "src\EasyAbp.EShop.Plugins.ProductTag.Application.Contracts\EasyAbp.EShop.Plugins.ProductTag.Application.Contracts.csproj", "{BD65D04F-08D5-40C1-8C24-77CA0BACB877}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.Application", "src\EasyAbp.EShop.Plugins.ProductTag.Application\EasyAbp.EShop.Plugins.ProductTag.Application.csproj", "{78040F9E-3501-4A40-82DF-00A597710F35}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{649A3FFA-182F-4E56-9717-E6A9A2BEC545}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "host", "host", "{E400416D-2895-4512-9D17-90681EEC7E0A}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore", "src\EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore\EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore.csproj", "{0CE86223-D31D-4315-A1F5-87BA3EE1B844}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.MongoDB", "src\EasyAbp.EShop.Plugins.ProductTag.MongoDB\EasyAbp.EShop.Plugins.ProductTag.MongoDB.csproj", "{F1C58097-4C08-4D88-8976-6B3389391481}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.HttpApi", "src\EasyAbp.EShop.Plugins.ProductTag.HttpApi\EasyAbp.EShop.Plugins.ProductTag.HttpApi.csproj", "{077AA5F8-8B61-420C-A6B5-0150A66FDB34}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.HttpApi.Client", "src\EasyAbp.EShop.Plugins.ProductTag.HttpApi.Client\EasyAbp.EShop.Plugins.ProductTag.HttpApi.Client.csproj", "{36E2735F-CEAB-44C8-A6D1-2CDAFF399751}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.TestBase", "test\EasyAbp.EShop.Plugins.ProductTag.TestBase\EasyAbp.EShop.Plugins.ProductTag.TestBase.csproj", "{C5BB573D-3030-4BCB-88B7-F6A85C32766C}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore.Tests", "test\EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore.Tests\EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore.Tests.csproj", "{527F645C-C1FC-406E-8479-81386C8ECF13}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.MongoDB.Tests", "test\EasyAbp.EShop.Plugins.ProductTag.MongoDB.Tests\EasyAbp.EShop.Plugins.ProductTag.MongoDB.Tests.csproj", "{D0AD9179-125C-40B2-A8EE-CD4C1EE24BB6}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.Domain.Tests", "test\EasyAbp.EShop.Plugins.ProductTag.Domain.Tests\EasyAbp.EShop.Plugins.ProductTag.Domain.Tests.csproj", "{E60895E5-79C4-447D-88B7-85CB5BA336A4}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.Application.Tests", "test\EasyAbp.EShop.Plugins.ProductTag.Application.Tests\EasyAbp.EShop.Plugins.ProductTag.Application.Tests.csproj", "{90CB5DC4-C040-45C7-8900-9688B26405BC}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.Web", "src\EasyAbp.EShop.Plugins.ProductTag.Web\EasyAbp.EShop.Plugins.ProductTag.Web.csproj", "{3B7B6317-1B85-4164-8E11-75574F80AE17}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.HttpApi.Client.ConsoleTestApp", "test\EasyAbp.EShop.Plugins.ProductTag.HttpApi.Client.ConsoleTestApp\EasyAbp.EShop.Plugins.ProductTag.HttpApi.Client.ConsoleTestApp.csproj", "{1EDCD6D4-DF3A-4E3B-ABB6-C0D0B373EAB8}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.EShop.Plugins.ProductTag.Host.Shared", "host\EasyAbp.EShop.Plugins.ProductTag.Host.Shared\EasyAbp.EShop.Plugins.ProductTag.Host.Shared.csproj", "{F6AC8D4A-EDD7-4514-8E8A-5BCB019864DB}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{D64C1577-4929-4B60-939E-96DE1534891A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{D64C1577-4929-4B60-939E-96DE1534891A}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{D64C1577-4929-4B60-939E-96DE1534891A}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{D64C1577-4929-4B60-939E-96DE1534891A}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{F2840BC7-0188-4606-9126-DADD0F5ABF7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{F2840BC7-0188-4606-9126-DADD0F5ABF7A}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{F2840BC7-0188-4606-9126-DADD0F5ABF7A}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{F2840BC7-0188-4606-9126-DADD0F5ABF7A}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{BD65D04F-08D5-40C1-8C24-77CA0BACB877}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{BD65D04F-08D5-40C1-8C24-77CA0BACB877}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{BD65D04F-08D5-40C1-8C24-77CA0BACB877}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{BD65D04F-08D5-40C1-8C24-77CA0BACB877}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{78040F9E-3501-4A40-82DF-00A597710F35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{78040F9E-3501-4A40-82DF-00A597710F35}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{78040F9E-3501-4A40-82DF-00A597710F35}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{78040F9E-3501-4A40-82DF-00A597710F35}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{0CE86223-D31D-4315-A1F5-87BA3EE1B844}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{0CE86223-D31D-4315-A1F5-87BA3EE1B844}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{0CE86223-D31D-4315-A1F5-87BA3EE1B844}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{0CE86223-D31D-4315-A1F5-87BA3EE1B844}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{F1C58097-4C08-4D88-8976-6B3389391481}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{F1C58097-4C08-4D88-8976-6B3389391481}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{F1C58097-4C08-4D88-8976-6B3389391481}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{F1C58097-4C08-4D88-8976-6B3389391481}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{077AA5F8-8B61-420C-A6B5-0150A66FDB34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{077AA5F8-8B61-420C-A6B5-0150A66FDB34}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{077AA5F8-8B61-420C-A6B5-0150A66FDB34}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{077AA5F8-8B61-420C-A6B5-0150A66FDB34}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{36E2735F-CEAB-44C8-A6D1-2CDAFF399751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{36E2735F-CEAB-44C8-A6D1-2CDAFF399751}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{36E2735F-CEAB-44C8-A6D1-2CDAFF399751}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{36E2735F-CEAB-44C8-A6D1-2CDAFF399751}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{C5BB573D-3030-4BCB-88B7-F6A85C32766C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{C5BB573D-3030-4BCB-88B7-F6A85C32766C}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{C5BB573D-3030-4BCB-88B7-F6A85C32766C}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{C5BB573D-3030-4BCB-88B7-F6A85C32766C}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{527F645C-C1FC-406E-8479-81386C8ECF13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{527F645C-C1FC-406E-8479-81386C8ECF13}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{527F645C-C1FC-406E-8479-81386C8ECF13}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{527F645C-C1FC-406E-8479-81386C8ECF13}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{D0AD9179-125C-40B2-A8EE-CD4C1EE24BB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{D0AD9179-125C-40B2-A8EE-CD4C1EE24BB6}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{D0AD9179-125C-40B2-A8EE-CD4C1EE24BB6}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{D0AD9179-125C-40B2-A8EE-CD4C1EE24BB6}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{E60895E5-79C4-447D-88B7-85CB5BA336A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{E60895E5-79C4-447D-88B7-85CB5BA336A4}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{E60895E5-79C4-447D-88B7-85CB5BA336A4}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{E60895E5-79C4-447D-88B7-85CB5BA336A4}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{90CB5DC4-C040-45C7-8900-9688B26405BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{90CB5DC4-C040-45C7-8900-9688B26405BC}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{90CB5DC4-C040-45C7-8900-9688B26405BC}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{90CB5DC4-C040-45C7-8900-9688B26405BC}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{3B7B6317-1B85-4164-8E11-75574F80AE17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{3B7B6317-1B85-4164-8E11-75574F80AE17}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{3B7B6317-1B85-4164-8E11-75574F80AE17}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{3B7B6317-1B85-4164-8E11-75574F80AE17}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{1EDCD6D4-DF3A-4E3B-ABB6-C0D0B373EAB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{1EDCD6D4-DF3A-4E3B-ABB6-C0D0B373EAB8}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{1EDCD6D4-DF3A-4E3B-ABB6-C0D0B373EAB8}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{1EDCD6D4-DF3A-4E3B-ABB6-C0D0B373EAB8}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{F6AC8D4A-EDD7-4514-8E8A-5BCB019864DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{F6AC8D4A-EDD7-4514-8E8A-5BCB019864DB}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{F6AC8D4A-EDD7-4514-8E8A-5BCB019864DB}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{F6AC8D4A-EDD7-4514-8E8A-5BCB019864DB}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(NestedProjects) = preSolution |
||||
|
{D64C1577-4929-4B60-939E-96DE1534891A} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} |
||||
|
{F2840BC7-0188-4606-9126-DADD0F5ABF7A} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} |
||||
|
{BD65D04F-08D5-40C1-8C24-77CA0BACB877} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} |
||||
|
{78040F9E-3501-4A40-82DF-00A597710F35} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} |
||||
|
{0CE86223-D31D-4315-A1F5-87BA3EE1B844} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} |
||||
|
{F1C58097-4C08-4D88-8976-6B3389391481} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} |
||||
|
{077AA5F8-8B61-420C-A6B5-0150A66FDB34} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} |
||||
|
{36E2735F-CEAB-44C8-A6D1-2CDAFF399751} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} |
||||
|
{C5BB573D-3030-4BCB-88B7-F6A85C32766C} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} |
||||
|
{527F645C-C1FC-406E-8479-81386C8ECF13} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} |
||||
|
{D0AD9179-125C-40B2-A8EE-CD4C1EE24BB6} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} |
||||
|
{E60895E5-79C4-447D-88B7-85CB5BA336A4} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} |
||||
|
{90CB5DC4-C040-45C7-8900-9688B26405BC} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} |
||||
|
{3B7B6317-1B85-4164-8E11-75574F80AE17} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} |
||||
|
{1EDCD6D4-DF3A-4E3B-ABB6-C0D0B373EAB8} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} |
||||
|
{F6AC8D4A-EDD7-4514-8E8A-5BCB019864DB} = {E400416D-2895-4512-9D17-90681EEC7E0A} |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {4324B3B4-B60B-4E3C-91D8-59576B4E26DD} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,23 @@ |
|||||
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> |
||||
|
<s:Boolean x:Key="/Default/CodeEditing/Intellisense/CodeCompletion/IntelliSenseCompletingCharacters/CSharpCompletingCharacters/UpgradedFromVSSettings/@EntryValue">True</s:Boolean> |
||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceDoWhileStatementBraces/@EntryIndexedValue">WARNING</s:String> |
||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceFixedStatementBraces/@EntryIndexedValue">WARNING</s:String> |
||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceForeachStatementBraces/@EntryIndexedValue">WARNING</s:String> |
||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceForStatementBraces/@EntryIndexedValue">WARNING</s:String> |
||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceIfStatementBraces/@EntryIndexedValue">WARNING</s:String> |
||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceLockStatementBraces/@EntryIndexedValue">WARNING</s:String> |
||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceUsingStatementBraces/@EntryIndexedValue">WARNING</s:String> |
||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceWhileStatementBraces/@EntryIndexedValue">WARNING</s:String> |
||||
|
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOR/@EntryValue">Required</s:String> |
||||
|
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOREACH/@EntryValue">Required</s:String> |
||||
|
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_IFELSE/@EntryValue">Required</s:String> |
||||
|
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_WHILE/@EntryValue">Required</s:String> |
||||
|
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_REDUNDANT/@EntryValue">False</s:Boolean> |
||||
|
<s:Boolean x:Key="/Default/CodeStyle/Generate/=Implementations/@KeyIndexDefined">True</s:Boolean> |
||||
|
<s:String x:Key="/Default/CodeStyle/Generate/=Implementations/Options/=Async/@EntryIndexedValue">False</s:String> |
||||
|
<s:String x:Key="/Default/CodeStyle/Generate/=Implementations/Options/=Mutable/@EntryIndexedValue">False</s:String> |
||||
|
<s:Boolean x:Key="/Default/CodeStyle/Generate/=Overrides/@KeyIndexDefined">True</s:Boolean> |
||||
|
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Async/@EntryIndexedValue">False</s:String> |
||||
|
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Mutable/@EntryIndexedValue">False</s:String> |
||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SQL/@EntryIndexedValue">SQL</s:String> |
||||
|
</wpf:ResourceDictionary> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<Project> |
||||
|
<PropertyGroup> |
||||
|
<LangVersion>latest</LangVersion> |
||||
|
<Version>0.1.0</Version> |
||||
|
<NoWarn>$(NoWarn);CS1591</NoWarn> |
||||
|
<AbpProjectType>module</AbpProjectType> |
||||
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> |
||||
|
<Authors>EasyAbp Team</Authors> |
||||
|
<Description>An abp application module group that provides basic e-shop service.</Description> |
||||
|
<PackageIconUrl>https://avatars3.githubusercontent.com/u/58311641?s=128</PackageIconUrl> |
||||
|
<PackageProjectUrl>https://github.com/EasyAbp/EShop</PackageProjectUrl> |
||||
|
<RepositoryUrl>https://github.com/EasyAbp/EShop</RepositoryUrl> |
||||
|
<PackageTags>abp module easyabp EShop shopping shop ordering product payment store mall</PackageTags> |
||||
|
<Company>EasyAbp</Company> |
||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.3" PrivateAssets="All" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="ConfigureAwait.Fody" Version="3.3.1" PrivateAssets="All" /> |
||||
|
<PackageReference Include="Fody" Version="6.2.4"> |
||||
|
<PrivateAssets>all</PrivateAssets> |
||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> |
||||
|
</PackageReference> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,13 @@ |
|||||
|
version: '3.4' |
||||
|
|
||||
|
services: |
||||
|
migrations: |
||||
|
build: |
||||
|
context: ../../ |
||||
|
dockerfile: templates/service/database/Dockerfile |
||||
|
depends_on: |
||||
|
- sqlserver |
||||
|
environment: |
||||
|
- IdentityServer_DB=ProductTag_Identity |
||||
|
- ProductTag_DB=ProductTag_ModuleDb |
||||
|
- SA_PASSWORD=yourStrong(!)Password |
||||
@ -0,0 +1,29 @@ |
|||||
|
version: '3.4' |
||||
|
|
||||
|
services: |
||||
|
sqlserver: |
||||
|
environment: |
||||
|
- SA_PASSWORD=yourStrong(!)Password |
||||
|
- ACCEPT_EULA=Y |
||||
|
ports: |
||||
|
- "51599:1433" |
||||
|
|
||||
|
identity-server: |
||||
|
environment: |
||||
|
- ASPNETCORE_URLS=http://0.0.0.0:80 |
||||
|
- ConnectionStrings__Default=Server=sqlserver;Database=ProductTag_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false |
||||
|
- ConnectionStrings__SqlServerCache=Server=sqlserver;Database=ProductTag_Cache;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false |
||||
|
ports: |
||||
|
- "51600:80" |
||||
|
|
||||
|
product-tag: |
||||
|
environment: |
||||
|
- ASPNETCORE_URLS=http://0.0.0.0:80 |
||||
|
- ConnectionStrings__Default=Server=sqlserver;Database=ProductTag_ModuleDb;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false |
||||
|
- ConnectionStrings__AbpSettingManagement=Server=sqlserver;Database=ProductTag_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false |
||||
|
- ConnectionStrings__AbpPermissionManagement=Server=sqlserver;Database=ProductTag_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false |
||||
|
- ConnectionStrings__AbpAuditLogging=Server=sqlserver;Database=ProductTag_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false |
||||
|
- ConnectionStrings__SqlServerCache=Server=sqlserver;Database=ProductTag_Cache;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false |
||||
|
- AuthServer__Authority=http://identity-server |
||||
|
ports: |
||||
|
- "51601:80" |
||||
@ -0,0 +1,25 @@ |
|||||
|
version: '3.4' |
||||
|
|
||||
|
services: |
||||
|
sqlserver: |
||||
|
image: mcr.microsoft.com/mssql/server |
||||
|
volumes: |
||||
|
- dbdata:/var/opt/mssql |
||||
|
|
||||
|
identity-server: |
||||
|
build: |
||||
|
context: ../../ |
||||
|
dockerfile: templates/service/host/IdentityServerHost/Dockerfile |
||||
|
depends_on: |
||||
|
- sqlserver |
||||
|
|
||||
|
product-tag: |
||||
|
build: |
||||
|
context: ../../ |
||||
|
dockerfile: templates/service/host/EasyAbp.EShop.Plugins.ProductTag.Host/Dockerfile |
||||
|
depends_on: |
||||
|
- sqlserver |
||||
|
- identity-server |
||||
|
|
||||
|
volumes: |
||||
|
dbdata: |
||||
@ -0,0 +1,10 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag</RootNamespace> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,10 @@ |
|||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.MultiTenancy |
||||
|
{ |
||||
|
public static class MultiTenancyConsts |
||||
|
{ |
||||
|
/* Enable/disable multi-tenancy in a single point |
||||
|
* to test your module with multi-tenancy. |
||||
|
*/ |
||||
|
public const bool IsEnabled = false; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag</RootNamespace> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.Ddd.Application.Contracts" Version="3.0.5" /> |
||||
|
<PackageReference Include="Volo.Abp.Authorization" Version="3.0.5" /> |
||||
|
<ProjectReference Include="..\EasyAbp.EShop.Plugins.ProductTag.Domain.Shared\EasyAbp.EShop.Plugins.ProductTag.Domain.Shared.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Stores\src\EasyAbp.EShop.Stores.Domain.Shared\EasyAbp.EShop.Stores.Domain.Shared.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,3 @@ |
|||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
|
<ConfigureAwait ContinueOnCapturedContext="false" /> |
||||
|
</Weavers> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
@ -0,0 +1,25 @@ |
|||||
|
using EasyAbp.EShop.Plugins.ProductTag.Localization; |
||||
|
using Volo.Abp.Authorization.Permissions; |
||||
|
using Volo.Abp.Localization; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Permissions |
||||
|
{ |
||||
|
public class ProductTagPermissionDefinitionProvider : PermissionDefinitionProvider |
||||
|
{ |
||||
|
public override void Define(IPermissionDefinitionContext context) |
||||
|
{ |
||||
|
var moduleGroup = context.AddGroup(ProductTagPermissions.GroupName, L("Permission:ProductTag")); |
||||
|
|
||||
|
var tags = moduleGroup.AddPermission(ProductTagPermissions.Tags.Default, L("Permission:Tag")); |
||||
|
tags.AddChild(ProductTagPermissions.Tags.Create, L("Permission:Create")); |
||||
|
tags.AddChild(ProductTagPermissions.Tags.Update, L("Permission:Update")); |
||||
|
tags.AddChild(ProductTagPermissions.Tags.Delete, L("Permission:Delete")); |
||||
|
tags.AddChild(ProductTagPermissions.Tags.CrossStore, L("Permission:CrossStore")); |
||||
|
} |
||||
|
|
||||
|
private static LocalizableString L(string name) |
||||
|
{ |
||||
|
return LocalizableString.Create<ProductTagResource>(name); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
using Volo.Abp.Reflection; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Permissions |
||||
|
{ |
||||
|
public class ProductTagPermissions |
||||
|
{ |
||||
|
public const string GroupName = "EasyAbp.EShop.ProductTag"; |
||||
|
|
||||
|
public class Tags |
||||
|
{ |
||||
|
public const string Default = GroupName + ".Tag"; |
||||
|
public const string Delete = Default + ".Delete"; |
||||
|
public const string Update = Default + ".Update"; |
||||
|
public const string Create = Default + ".Create"; |
||||
|
public const string CrossStore = Default + ".CrossStore"; |
||||
|
} |
||||
|
|
||||
|
public static string[] GetAll() |
||||
|
{ |
||||
|
return ReflectionHelper.GetPublicConstantsRecursively(typeof(ProductTagPermissions)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
using EasyAbp.EShop.Stores; |
||||
|
using Volo.Abp.Application; |
||||
|
using Volo.Abp.Modularity; |
||||
|
using Volo.Abp.Authorization; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(ProductTagDomainSharedModule), |
||||
|
typeof(AbpDddApplicationContractsModule), |
||||
|
typeof(AbpAuthorizationModule), |
||||
|
typeof(EShopStoresDomainSharedModule) |
||||
|
)] |
||||
|
public class ProductTagApplicationContractsModule : AbpModule |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using Volo.Abp.ObjectExtending; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags.Dtos |
||||
|
{ |
||||
|
public class CreateUpdateProductTagsDto : ExtensibleObject |
||||
|
{ |
||||
|
public Guid StoreId { get; set; } |
||||
|
|
||||
|
public Guid ProductId { get; set; } |
||||
|
|
||||
|
public List<Guid> TagIds { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
using EasyAbp.EShop.Stores.Stores; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags.Dtos |
||||
|
{ |
||||
|
public class GetProductTagListDto : PagedAndSortedResultRequestDto, IMultiStore |
||||
|
{ |
||||
|
public Guid StoreId { get; set; } |
||||
|
|
||||
|
public Guid? TagId { get; set; } |
||||
|
|
||||
|
public Guid? ProductId { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,14 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags.Dtos |
||||
|
{ |
||||
|
public class ProductTagDto : ExtensibleAuditedEntityDto<Guid> |
||||
|
{ |
||||
|
public Guid TagId { get; set; } |
||||
|
|
||||
|
public Guid ProductId { get; set; } |
||||
|
|
||||
|
public int DisplayOrder { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,14 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags.Dtos |
||||
|
{ |
||||
|
public class UpdateProductTagDto : ExtensibleEntityDto |
||||
|
{ |
||||
|
public Guid TagId { get; set; } |
||||
|
|
||||
|
public Guid ProductId { get; set; } |
||||
|
|
||||
|
public int DisplayOrder { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using EasyAbp.EShop.Plugins.ProductTag.ProductTags.Dtos; |
||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Application.Services; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags |
||||
|
{ |
||||
|
public interface IProductTagAppService : |
||||
|
IReadOnlyAppService< |
||||
|
ProductTagDto, |
||||
|
Guid, |
||||
|
GetProductTagListDto>, |
||||
|
IUpdateAppService<ProductTagDto, Guid, UpdateProductTagDto> |
||||
|
{ |
||||
|
Task UpdateAsync(CreateUpdateProductTagsDto input); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,31 @@ |
|||||
|
using System; |
||||
|
using System.ComponentModel; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using EasyAbp.EShop.Stores.Stores; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Tags.Dtos |
||||
|
{ |
||||
|
public class UpdateTagDto : ExtensibleEntityDto |
||||
|
{ |
||||
|
[DisplayName("TagParentId")] |
||||
|
public Guid? ParentId { get; set; } |
||||
|
|
||||
|
[Required] |
||||
|
[DisplayName("TagDisplayName")] |
||||
|
public string DisplayName { get; set; } |
||||
|
|
||||
|
[DisplayName("TagDescription")] |
||||
|
public string Description { get; set; } |
||||
|
|
||||
|
[DisplayName("TagMediaResources")] |
||||
|
public string MediaResources { get; set; } |
||||
|
} |
||||
|
|
||||
|
public class CreateTagDto : UpdateTagDto, IMultiStore |
||||
|
{ |
||||
|
[Required] |
||||
|
[DisplayName("TagStoreId")] |
||||
|
public Guid StoreId { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using EasyAbp.EShop.Stores.Stores; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Tags.Dtos |
||||
|
{ |
||||
|
public class GetTagListDto : PagedAndSortedResultRequestDto, IMultiStore |
||||
|
{ |
||||
|
[Required] |
||||
|
public Guid StoreId { get; set; } |
||||
|
|
||||
|
public bool ShowHidden { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
using EasyAbp.EShop.Stores.Stores; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Tags.Dtos |
||||
|
{ |
||||
|
public class TagDto : ExtensibleFullAuditedEntityDto<Guid>, IMultiStore |
||||
|
{ |
||||
|
public Guid StoreId { get; set; } |
||||
|
|
||||
|
public Guid? ParentId { get; set; } |
||||
|
|
||||
|
public string Code { get; set; } |
||||
|
|
||||
|
public int Level { get; set; } |
||||
|
|
||||
|
public string DisplayName { get; set; } |
||||
|
|
||||
|
public string Description { get; set; } |
||||
|
|
||||
|
public string MediaResources { get; set; } |
||||
|
|
||||
|
public ICollection<TagDto> Children { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags.Dtos; |
||||
|
using Volo.Abp.Application.Services; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Tags |
||||
|
{ |
||||
|
public interface ITagAppService : ICrudAppService< |
||||
|
TagDto, |
||||
|
Guid, |
||||
|
GetTagListDto, |
||||
|
CreateTagDto, |
||||
|
UpdateTagDto> |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag</RootNamespace> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.AutoMapper" Version="3.0.5" /> |
||||
|
<PackageReference Include="Volo.Abp.Ddd.Application" Version="3.0.5" /> |
||||
|
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Products\src\EasyAbp.EShop.Products.Application.Contracts\EasyAbp.EShop.Products.Application.Contracts.csproj" /> |
||||
|
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Products\src\EasyAbp.EShop.Products.Domain\EasyAbp.EShop.Products.Domain.csproj" /> |
||||
|
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Stores\src\EasyAbp.EShop.Stores.Application\EasyAbp.EShop.Stores.Application.csproj" /> |
||||
|
<ProjectReference Include="..\EasyAbp.EShop.Plugins.ProductTag.Application.Contracts\EasyAbp.EShop.Plugins.ProductTag.Application.Contracts.csproj" /> |
||||
|
<ProjectReference Include="..\EasyAbp.EShop.Plugins.ProductTag.Domain\EasyAbp.EShop.Plugins.ProductTag.Domain.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,3 @@ |
|||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
|
<ConfigureAwait ContinueOnCapturedContext="false" /> |
||||
|
</Weavers> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
@ -0,0 +1,14 @@ |
|||||
|
using EasyAbp.EShop.Plugins.ProductTag.Localization; |
||||
|
using Volo.Abp.Application.Services; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
public abstract class ProductTagAppService : ApplicationService |
||||
|
{ |
||||
|
protected ProductTagAppService() |
||||
|
{ |
||||
|
LocalizationResource = typeof(ProductTagResource); |
||||
|
ObjectMapperContext = typeof(ProductTagApplicationModule); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
using AutoMapper; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.ProductTags.Dtos; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags.Dtos; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
public class ProductTagApplicationAutoMapperProfile : Profile |
||||
|
{ |
||||
|
public ProductTagApplicationAutoMapperProfile() |
||||
|
{ |
||||
|
/* You can configure your AutoMapper mapping configuration here. |
||||
|
* Alternatively, you can split your mapping configurations |
||||
|
* into multiple profile classes for a better organization. */ |
||||
|
CreateMap<CreateTagDto, TagDto>(MemberList.Source); |
||||
|
CreateMap<UpdateTagDto, TagDto>(MemberList.Source); |
||||
|
CreateMap<Tag, TagDto>(); |
||||
|
CreateMap<CreateTagDto, Tag>(MemberList.Source); |
||||
|
CreateMap<UpdateTagDto, Tag>(MemberList.Source); |
||||
|
|
||||
|
CreateMap<ProductTags.ProductTag, ProductTagDto>(); |
||||
|
CreateMap<UpdateProductTagDto, ProductTags.ProductTag>(MemberList.Source); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,27 @@ |
|||||
|
using EasyAbp.EShop.Products; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Volo.Abp.AutoMapper; |
||||
|
using Volo.Abp.Modularity; |
||||
|
using Volo.Abp.Application; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(ProductTagDomainModule), |
||||
|
typeof(ProductTagApplicationContractsModule), |
||||
|
typeof(AbpDddApplicationModule), |
||||
|
typeof(AbpAutoMapperModule), |
||||
|
typeof(EShopProductsDomainModule) |
||||
|
)] |
||||
|
public class ProductTagApplicationModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
context.Services.AddAutoMapperObjectMapper<ProductTagApplicationModule>(); |
||||
|
Configure<AbpAutoMapperOptions>(options => |
||||
|
{ |
||||
|
options.AddMaps<ProductTagApplicationModule>(validate: true); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,130 @@ |
|||||
|
using EasyAbp.EShop.Plugins.ProductTag.ProductTags.Dtos; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags; |
||||
|
using EasyAbp.EShop.Products.Permissions; |
||||
|
using EasyAbp.EShop.Products.ProductStores; |
||||
|
using EasyAbp.EShop.Stores.Permissions; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Collections.Immutable; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using EasyAbp.EShop.Products.Products; |
||||
|
using Microsoft.AspNetCore.Authorization; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
using Volo.Abp.Application.Services; |
||||
|
using Volo.Abp.Domain.Repositories; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags |
||||
|
{ |
||||
|
public class ProductTagAppService : ReadOnlyAppService<ProductTag, ProductTagDto, Guid, GetProductTagListDto>, |
||||
|
IProductTagAppService |
||||
|
{ |
||||
|
private readonly IProductTagRepository _repository; |
||||
|
private readonly ITagRepository _tagRepository; |
||||
|
private readonly IProductStoreRepository _productStoreRepository; |
||||
|
|
||||
|
public ProductTagAppService(IProductTagRepository repository, |
||||
|
ITagRepository tagRepository, |
||||
|
IProductStoreRepository productStoreRepository) : base(repository) |
||||
|
{ |
||||
|
_repository = repository; |
||||
|
_tagRepository = tagRepository; |
||||
|
_productStoreRepository = productStoreRepository; |
||||
|
} |
||||
|
|
||||
|
protected override string GetListPolicyName { get; set; } = ProductsPermissions.Products.Default; |
||||
|
protected string UpdatePolicyName { get; set; } = ProductsPermissions.Products.Update; |
||||
|
|
||||
|
[RemoteService(false)] |
||||
|
public override Task<ProductTagDto> GetAsync(Guid id) |
||||
|
{ |
||||
|
throw new NotSupportedException(); |
||||
|
} |
||||
|
|
||||
|
public override async Task<PagedResultDto<ProductTagDto>> GetListAsync(GetProductTagListDto input) |
||||
|
{ |
||||
|
await CheckGetListPolicyAsync(); |
||||
|
|
||||
|
await AuthorizationService.CheckStoreOwnerAsync(input.StoreId, GetListPolicyName); |
||||
|
|
||||
|
var query = CreateFilteredQuery(input); |
||||
|
|
||||
|
var totalCount = await AsyncExecuter.CountAsync(query); |
||||
|
|
||||
|
query = ApplySorting(query, input); |
||||
|
query = ApplyPaging(query, input); |
||||
|
|
||||
|
var entities = await AsyncExecuter.ToListAsync(query); |
||||
|
|
||||
|
return new PagedResultDto<ProductTagDto>( |
||||
|
totalCount, |
||||
|
entities.Select(MapToGetListOutputDto).ToList()); |
||||
|
} |
||||
|
|
||||
|
protected override IQueryable<ProductTag> CreateFilteredQuery(GetProductTagListDto input) |
||||
|
{ |
||||
|
var queryable = Repository.AsQueryable(); |
||||
|
|
||||
|
queryable = queryable.Where(x => x.StoreId == input.StoreId); |
||||
|
|
||||
|
if (input.TagId.HasValue) |
||||
|
{ |
||||
|
queryable = queryable.Where(x => x.TagId == input.TagId); |
||||
|
} |
||||
|
|
||||
|
if (input.ProductId.HasValue) |
||||
|
{ |
||||
|
queryable = queryable.Where(x => x.ProductId == input.ProductId); |
||||
|
} |
||||
|
|
||||
|
return queryable; |
||||
|
} |
||||
|
|
||||
|
public async Task<ProductTagDto> UpdateAsync(Guid id, UpdateProductTagDto input) |
||||
|
{ |
||||
|
var entity = await GetEntityByIdAsync(id); |
||||
|
|
||||
|
await AuthorizationService.CheckStoreOwnerAsync(entity.StoreId, UpdatePolicyName); |
||||
|
|
||||
|
MapToEntity(input, entity); |
||||
|
await _repository.UpdateAsync(entity, autoSave: true); |
||||
|
|
||||
|
return MapToGetOutputDto(entity); |
||||
|
} |
||||
|
|
||||
|
public async Task UpdateAsync(CreateUpdateProductTagsDto input) |
||||
|
{ |
||||
|
await AuthorizationService.CheckStoreOwnerAsync(input.StoreId, UpdatePolicyName); |
||||
|
|
||||
|
var productStore = await _productStoreRepository.GetAsync(input.ProductId, input.StoreId, false); |
||||
|
|
||||
|
if (!productStore.IsOwner) |
||||
|
{ |
||||
|
throw new StoreIsNotProductOwnerException(input.ProductId, input.StoreId); |
||||
|
} |
||||
|
|
||||
|
input.TagIds ??= new List<Guid>(); |
||||
|
|
||||
|
var storeTags = (await _tagRepository.GetListByAsync(input.StoreId)).Select(x => x.Id); |
||||
|
|
||||
|
var productTags = await _repository.GetListByProductIdAsync(input.ProductId, input.StoreId); |
||||
|
|
||||
|
foreach (var productTag in productTags.Where(x => !input.TagIds.Contains(x.TagId))) |
||||
|
{ |
||||
|
await _repository.DeleteAsync(productTag, true); |
||||
|
} |
||||
|
|
||||
|
foreach (var tagId in input.TagIds.Except(productTags.Select(x => x.TagId).Concat(storeTags))) |
||||
|
{ |
||||
|
await _repository.InsertAsync( |
||||
|
new ProductTag(GuidGenerator.Create(), CurrentTenant.Id, tagId, input.ProductId), true); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
protected virtual ProductTag MapToEntity(UpdateProductTagDto input, ProductTag entity) |
||||
|
{ |
||||
|
return ObjectMapper.Map(input, entity); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,40 @@ |
|||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Permissions; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags.Dtos; |
||||
|
using EasyAbp.EShop.Stores.Stores; |
||||
|
using JetBrains.Annotations; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
using Volo.Abp.Linq; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Tags |
||||
|
{ |
||||
|
public class TagAppService : MultiStoreCrudAppService<Tag, TagDto, Guid, GetTagListDto, CreateTagDto, UpdateTagDto>, |
||||
|
ITagAppService |
||||
|
{ |
||||
|
private readonly IAsyncQueryableExecuter _asyncQueryableExecuter; |
||||
|
protected override string CreatePolicyName { get; set; } = ProductTagPermissions.Tags.Create; |
||||
|
protected override string DeletePolicyName { get; set; } = ProductTagPermissions.Tags.Delete; |
||||
|
protected override string UpdatePolicyName { get; set; } = ProductTagPermissions.Tags.Update; |
||||
|
protected override string GetPolicyName { get; set; } = ProductTagPermissions.Tags.Default; |
||||
|
protected override string GetListPolicyName { get; set; } = ProductTagPermissions.Tags.Default; |
||||
|
|
||||
|
protected override string CrossStorePolicyName { get; set; } = ProductTagPermissions.Tags.CrossStore; |
||||
|
|
||||
|
public TagAppService(ITagRepository repository, |
||||
|
[NotNull] IAsyncQueryableExecuter asyncQueryableExecuter) : base(repository) |
||||
|
{ |
||||
|
_asyncQueryableExecuter = asyncQueryableExecuter ?? throw new ArgumentNullException(nameof(asyncQueryableExecuter)); |
||||
|
} |
||||
|
|
||||
|
protected override IQueryable<Tag> CreateFilteredQuery(GetTagListDto input) |
||||
|
{ |
||||
|
var query = base.CreateFilteredQuery(input); |
||||
|
|
||||
|
query = query.Where(x => x.StoreId == input.StoreId); |
||||
|
|
||||
|
return input.ShowHidden ? query : query.Where(x => !x.IsHidden); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag</RootNamespace> |
||||
|
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.Validation" Version="3.0.5" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.5" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<EmbeddedResource Include="Localization\ProductTag\*.json" /> |
||||
|
<Content Remove="Localization\ProductTag\*.json" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,3 @@ |
|||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
|
<ConfigureAwait ContinueOnCapturedContext="false" /> |
||||
|
</Weavers> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
@ -0,0 +1,22 @@ |
|||||
|
{ |
||||
|
"culture": "cs", |
||||
|
"texts": { |
||||
|
"ManageYourProfile": "Spravovat profil", |
||||
|
"Menu:Tag": "MenuTag", |
||||
|
"Tag": "Tag", |
||||
|
"TagTenantId": "TagTenantId", |
||||
|
"TagStoreId": "TagStoreId", |
||||
|
"TagDisplayName": "TagDisplayName", |
||||
|
"TagDescription": "TagDescription", |
||||
|
"TagMediaResources": "TagMediaResources", |
||||
|
"CreateTag": "CreateTag", |
||||
|
"EditTag": "EditTag", |
||||
|
"TagDeletionConfirmationMessage": "Are you sure to delete the tag {0}?", |
||||
|
"Permission:ProductTag": "ProductTag", |
||||
|
"Permission:Tag": "Tag", |
||||
|
"Permission:Create": "Create", |
||||
|
"Permission:Update": "Update", |
||||
|
"Permission:Delete": "Delete", |
||||
|
"Permission:CrossStore": "CrossStore" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
{ |
||||
|
"culture": "en", |
||||
|
"texts": { |
||||
|
"ManageYourProfile": "Manage your profile", |
||||
|
"SamplePageMessage": "A sample page for the ProductTag module", |
||||
|
"Menu:Tag": "MenuTag", |
||||
|
"Tag": "Tag", |
||||
|
"TagTenantId": "TagTenantId", |
||||
|
"TagStoreId": "TagStoreId", |
||||
|
"TagDisplayName": "TagDisplayName", |
||||
|
"TagDescription": "TagDescription", |
||||
|
"TagMediaResources": "TagMediaResources", |
||||
|
"CreateTag": "CreateTag", |
||||
|
"EditTag": "EditTag", |
||||
|
"TagDeletionConfirmationMessage": "Are you sure to delete the tag {0}?", |
||||
|
"Permission:ProductTag": "ProductTag", |
||||
|
"Permission:Tag": "Tag", |
||||
|
"Permission:Create": "Create", |
||||
|
"Permission:Update": "Update", |
||||
|
"Permission:Delete": "Delete", |
||||
|
"Permission:CrossStore": "CrossStore" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
{ |
||||
|
"culture": "pl-PL", |
||||
|
"texts": { |
||||
|
"Menu:Tag": "MenuTag", |
||||
|
"Tag": "Tag", |
||||
|
"TagTenantId": "TagTenantId", |
||||
|
"TagStoreId": "TagStoreId", |
||||
|
"TagDisplayName": "TagDisplayName", |
||||
|
"TagDescription": "TagDescription", |
||||
|
"TagMediaResources": "TagMediaResources", |
||||
|
"CreateTag": "CreateTag", |
||||
|
"EditTag": "EditTag", |
||||
|
"TagDeletionConfirmationMessage": "Are you sure to delete the tag {0}?", |
||||
|
"Permission:ProductTag": "ProductTag", |
||||
|
"Permission:Tag": "Tag", |
||||
|
"Permission:Create": "Create", |
||||
|
"Permission:Update": "Update", |
||||
|
"Permission:Delete": "Delete", |
||||
|
"Permission:CrossStore": "CrossStore" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
{ |
||||
|
"culture": "pt-BR", |
||||
|
"texts": { |
||||
|
"Menu:Tag": "MenuTag", |
||||
|
"Tag": "Tag", |
||||
|
"TagTenantId": "TagTenantId", |
||||
|
"TagStoreId": "TagStoreId", |
||||
|
"TagDisplayName": "TagDisplayName", |
||||
|
"TagDescription": "TagDescription", |
||||
|
"TagMediaResources": "TagMediaResources", |
||||
|
"CreateTag": "CreateTag", |
||||
|
"EditTag": "EditTag", |
||||
|
"TagDeletionConfirmationMessage": "Are you sure to delete the tag {0}?", |
||||
|
"Permission:ProductTag": "ProductTag", |
||||
|
"Permission:Tag": "Tag", |
||||
|
"Permission:Create": "Create", |
||||
|
"Permission:Update": "Update", |
||||
|
"Permission:Delete": "Delete", |
||||
|
"Permission:CrossStore": "CrossStore" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
{ |
||||
|
"culture": "sl", |
||||
|
"texts": { |
||||
|
"ManageYourProfile": "Upravljajte svojim profilom", |
||||
|
"Menu:Tag": "MenuTag", |
||||
|
"Tag": "Tag", |
||||
|
"TagTenantId": "TagTenantId", |
||||
|
"TagStoreId": "TagStoreId", |
||||
|
"TagDisplayName": "TagDisplayName", |
||||
|
"TagDescription": "TagDescription", |
||||
|
"TagMediaResources": "TagMediaResources", |
||||
|
"CreateTag": "CreateTag", |
||||
|
"EditTag": "EditTag", |
||||
|
"TagDeletionConfirmationMessage": "Are you sure to delete the tag {0}?", |
||||
|
"Permission:ProductTag": "ProductTag", |
||||
|
"Permission:Tag": "Tag", |
||||
|
"Permission:Create": "Create", |
||||
|
"Permission:Update": "Update", |
||||
|
"Permission:Delete": "Delete", |
||||
|
"Permission:CrossStore": "CrossStore" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
{ |
||||
|
"culture": "tr", |
||||
|
"texts": { |
||||
|
"ManageYourProfile": "Profil yönetimi", |
||||
|
"SamplePageMessage": "ProductTag modulünden örnek bir sayfa", |
||||
|
"Menu:Tag": "MenuTag", |
||||
|
"Tag": "Tag", |
||||
|
"TagTenantId": "TagTenantId", |
||||
|
"TagStoreId": "TagStoreId", |
||||
|
"TagDisplayName": "TagDisplayName", |
||||
|
"TagDescription": "TagDescription", |
||||
|
"TagMediaResources": "TagMediaResources", |
||||
|
"CreateTag": "CreateTag", |
||||
|
"EditTag": "EditTag", |
||||
|
"TagDeletionConfirmationMessage": "Are you sure to delete the tag {0}?", |
||||
|
"Permission:ProductTag": "ProductTag", |
||||
|
"Permission:Tag": "Tag", |
||||
|
"Permission:Create": "Create", |
||||
|
"Permission:Update": "Update", |
||||
|
"Permission:Delete": "Delete", |
||||
|
"Permission:CrossStore": "CrossStore" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
{ |
||||
|
"culture": "vi", |
||||
|
"texts": { |
||||
|
"Menu:Tag": "MenuTag", |
||||
|
"Tag": "Tag", |
||||
|
"TagTenantId": "TagTenantId", |
||||
|
"TagStoreId": "TagStoreId", |
||||
|
"TagDisplayName": "TagDisplayName", |
||||
|
"TagDescription": "TagDescription", |
||||
|
"TagMediaResources": "TagMediaResources", |
||||
|
"CreateTag": "CreateTag", |
||||
|
"EditTag": "EditTag", |
||||
|
"TagDeletionConfirmationMessage": "Are you sure to delete the tag {0}?", |
||||
|
"Permission:ProductTag": "ProductTag", |
||||
|
"Permission:Tag": "Tag", |
||||
|
"Permission:Create": "Create", |
||||
|
"Permission:Update": "Update", |
||||
|
"Permission:Delete": "Delete", |
||||
|
"Permission:CrossStore": "CrossStore" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
{ |
||||
|
"culture": "zh-Hans", |
||||
|
"texts": { |
||||
|
"ManageYourProfile": "管理个人资料", |
||||
|
"Menu:Tag": "MenuTag", |
||||
|
"Tag": "Tag", |
||||
|
"TagTenantId": "TagTenantId", |
||||
|
"TagStoreId": "TagStoreId", |
||||
|
"TagDisplayName": "TagDisplayName", |
||||
|
"TagDescription": "TagDescription", |
||||
|
"TagMediaResources": "TagMediaResources", |
||||
|
"CreateTag": "CreateTag", |
||||
|
"EditTag": "EditTag", |
||||
|
"TagDeletionConfirmationMessage": "Are you sure to delete the tag {0}?", |
||||
|
"Permission:ProductTag": "ProductTag", |
||||
|
"Permission:Tag": "Tag", |
||||
|
"Permission:Create": "Create", |
||||
|
"Permission:Update": "Update", |
||||
|
"Permission:Delete": "Delete", |
||||
|
"Permission:CrossStore": "CrossStore" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
{ |
||||
|
"culture": "zh-Hant", |
||||
|
"texts": { |
||||
|
"ManageYourProfile": "管理個人資料", |
||||
|
"Menu:Tag": "MenuTag", |
||||
|
"Tag": "Tag", |
||||
|
"TagTenantId": "TagTenantId", |
||||
|
"TagStoreId": "TagStoreId", |
||||
|
"TagDisplayName": "TagDisplayName", |
||||
|
"TagDescription": "TagDescription", |
||||
|
"TagMediaResources": "TagMediaResources", |
||||
|
"CreateTag": "CreateTag", |
||||
|
"EditTag": "EditTag", |
||||
|
"TagDeletionConfirmationMessage": "Are you sure to delete the tag {0}?", |
||||
|
"Permission:ProductTag": "ProductTag", |
||||
|
"Permission:Tag": "Tag", |
||||
|
"Permission:Create": "Create", |
||||
|
"Permission:Update": "Update", |
||||
|
"Permission:Delete": "Delete", |
||||
|
"Permission:CrossStore": "CrossStore" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,10 @@ |
|||||
|
using Volo.Abp.Localization; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Localization |
||||
|
{ |
||||
|
[LocalizationResourceName("ProductTag")] |
||||
|
public class ProductTagResource |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
using Volo.Abp.Modularity; |
||||
|
using Volo.Abp.Localization; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Localization; |
||||
|
using Volo.Abp.Localization.ExceptionHandling; |
||||
|
using Volo.Abp.Validation; |
||||
|
using Volo.Abp.Validation.Localization; |
||||
|
using Volo.Abp.VirtualFileSystem; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpValidationModule) |
||||
|
)] |
||||
|
public class ProductTagDomainSharedModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
Configure<AbpVirtualFileSystemOptions>(options => |
||||
|
{ |
||||
|
options.FileSets.AddEmbedded<ProductTagDomainSharedModule>(); |
||||
|
}); |
||||
|
|
||||
|
Configure<AbpLocalizationOptions>(options => |
||||
|
{ |
||||
|
options.Resources |
||||
|
.Add<ProductTagResource>("en") |
||||
|
.AddBaseTypes(typeof(AbpValidationResource)) |
||||
|
.AddVirtualJson("/Localization/ProductTag"); |
||||
|
}); |
||||
|
|
||||
|
Configure<AbpExceptionLocalizationOptions>(options => |
||||
|
{ |
||||
|
options.MapCodeNamespace("ProductTag", typeof(ProductTagResource)); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
public static class ProductTagErrorCodes |
||||
|
{ |
||||
|
//Add your business exception error codes here...
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag</RootNamespace> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="EasyAbp.Abp.Trees.Domain" Version="1.0.0" /> |
||||
|
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="3.0.5" /> |
||||
|
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Stores\src\EasyAbp.EShop.Stores.Domain.Shared\EasyAbp.EShop.Stores.Domain.Shared.csproj" /> |
||||
|
<ProjectReference Include="..\EasyAbp.EShop.Plugins.ProductTag.Domain.Shared\EasyAbp.EShop.Plugins.ProductTag.Domain.Shared.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,3 @@ |
|||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
|
<ConfigureAwait ContinueOnCapturedContext="false" /> |
||||
|
</Weavers> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
@ -0,0 +1,11 @@ |
|||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
public static class ProductTagDbProperties |
||||
|
{ |
||||
|
public static string DbTablePrefix { get; set; } = "ProductTag"; |
||||
|
|
||||
|
public static string DbSchema { get; set; } = null; |
||||
|
|
||||
|
public const string ConnectionStringName = "ProductTag"; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using EasyAbp.Abp.Trees; |
||||
|
using EasyAbp.EShop.Stores; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(ProductTagDomainSharedModule), |
||||
|
typeof(AbpTreesDomainModule), |
||||
|
typeof(EShopStoresDomainSharedModule) |
||||
|
)] |
||||
|
public class ProductTagDomainModule : AbpModule |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Domain.Repositories; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags |
||||
|
{ |
||||
|
public interface IProductTagRepository : IRepository<ProductTag, Guid> |
||||
|
{ |
||||
|
Task<List<ProductTag>> GetListByTagIdAsync(Guid tagId, Guid? storeId = null, CancellationToken cancellationToken = default); |
||||
|
|
||||
|
Task<List<ProductTag>> GetListByProductIdAsync(Guid productId, Guid? storeId = null, CancellationToken cancellationToken = default); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Domain.Entities.Auditing; |
||||
|
using Volo.Abp.MultiTenancy; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags |
||||
|
{ |
||||
|
public class ProductTag : AuditedAggregateRoot<Guid>, IMultiTenant |
||||
|
{ |
||||
|
public virtual Guid? TenantId { get; protected set; } |
||||
|
|
||||
|
public virtual Guid StoreId { get; set; } |
||||
|
|
||||
|
public virtual Guid TagId { get; protected set; } |
||||
|
|
||||
|
public virtual Guid ProductId { get; protected set; } |
||||
|
|
||||
|
public virtual int DisplayOrder { get; protected set; } |
||||
|
|
||||
|
protected ProductTag() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public ProductTag( |
||||
|
Guid id, |
||||
|
Guid? tenantId, |
||||
|
Guid tagId, |
||||
|
Guid productId, |
||||
|
int displayOrder = 0 |
||||
|
) : base(id) |
||||
|
{ |
||||
|
TenantId = tenantId; |
||||
|
TagId = tagId; |
||||
|
ProductId = productId; |
||||
|
DisplayOrder = displayOrder; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,14 @@ |
|||||
|
using Volo.Abp.Settings; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Settings |
||||
|
{ |
||||
|
public class ProductTagSettingDefinitionProvider : SettingDefinitionProvider |
||||
|
{ |
||||
|
public override void Define(ISettingDefinitionContext context) |
||||
|
{ |
||||
|
/* Define module settings here. |
||||
|
* Use names from ProductTagSettings class. |
||||
|
*/ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Settings |
||||
|
{ |
||||
|
public static class ProductTagSettings |
||||
|
{ |
||||
|
public const string GroupName = "ProductTag"; |
||||
|
|
||||
|
/* Add constants for setting names. Example: |
||||
|
* public const string MySettingName = GroupName + ".MySettingName"; |
||||
|
*/ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,13 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Domain.Repositories; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Tags |
||||
|
{ |
||||
|
public interface ITagRepository : IRepository<Tag, Guid> |
||||
|
{ |
||||
|
Task<List<Tag>> GetListByAsync(Guid storeId, bool includeDetails = false, CancellationToken cancellationToken = default); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,67 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using EasyAbp.Abp.Trees; |
||||
|
using EasyAbp.EShop.Stores.Stores; |
||||
|
using JetBrains.Annotations; |
||||
|
using Volo.Abp.Domain.Entities.Auditing; |
||||
|
using Volo.Abp.MultiTenancy; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Tags |
||||
|
{ |
||||
|
public class Tag : FullAuditedAggregateRoot<Guid>, ITree<Tag>, IMultiTenant, IMultiStore |
||||
|
{ |
||||
|
public virtual Guid? TenantId { get; protected set; } |
||||
|
|
||||
|
public virtual Guid StoreId { get; protected set; } |
||||
|
|
||||
|
[CanBeNull] |
||||
|
public virtual string Description { get; protected set; } |
||||
|
|
||||
|
[CanBeNull] |
||||
|
public virtual string MediaResources { get; protected set; } |
||||
|
|
||||
|
public virtual bool IsHidden { get; protected set; } |
||||
|
|
||||
|
#region Properties of ITree
|
||||
|
|
||||
|
[NotNull] |
||||
|
public virtual string DisplayName { get; set; } |
||||
|
|
||||
|
[NotNull] |
||||
|
public virtual string Code { get; set; } |
||||
|
|
||||
|
public virtual int Level { get; set; } |
||||
|
|
||||
|
public virtual Guid? ParentId { get; set; } |
||||
|
|
||||
|
public virtual Tag Parent { get; set; } |
||||
|
|
||||
|
public virtual ICollection<Tag> Children { get; set; } |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
protected Tag() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public Tag( |
||||
|
Guid id, |
||||
|
Guid? tenantId, |
||||
|
Guid storeId, |
||||
|
Guid? parentId, |
||||
|
string displayName, |
||||
|
string description, |
||||
|
string mediaResources, |
||||
|
bool isHidden |
||||
|
) : base(id) |
||||
|
{ |
||||
|
TenantId = tenantId; |
||||
|
StoreId = storeId; |
||||
|
ParentId = parentId; |
||||
|
DisplayName = displayName; |
||||
|
Description = description; |
||||
|
MediaResources = mediaResources; |
||||
|
IsHidden = isHidden; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag</RootNamespace> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="EasyAbp.Abp.Trees.EntityFrameworkCore" Version="1.0.0" /> |
||||
|
<PackageReference Include="Volo.Abp.EntityFrameworkCore" Version="3.0.5" /> |
||||
|
<ProjectReference Include="..\EasyAbp.EShop.Plugins.ProductTag.Domain\EasyAbp.EShop.Plugins.ProductTag.Domain.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,17 @@ |
|||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore |
||||
|
{ |
||||
|
[ConnectionStringName(ProductTagDbProperties.ConnectionStringName)] |
||||
|
public interface IProductTagDbContext : IEfCoreDbContext |
||||
|
{ |
||||
|
/* Add DbSet for each Aggregate Root here. Example: |
||||
|
* DbSet<Question> Questions { get; } |
||||
|
*/ |
||||
|
DbSet<Tag> Tags { get; set; } |
||||
|
DbSet<ProductTags.ProductTag> ProductTags { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,31 @@ |
|||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore |
||||
|
{ |
||||
|
[ConnectionStringName(ProductTagDbProperties.ConnectionStringName)] |
||||
|
public class ProductTagDbContext : AbpDbContext<ProductTagDbContext>, IProductTagDbContext |
||||
|
{ |
||||
|
/* Add DbSet for each Aggregate Root here. Example: |
||||
|
* public DbSet<Question> Questions { get; set; } |
||||
|
*/ |
||||
|
|
||||
|
public DbSet<Tag> Tags { get; set; } |
||||
|
public DbSet<ProductTags.ProductTag> ProductTags { get; set; } |
||||
|
|
||||
|
public ProductTagDbContext(DbContextOptions<ProductTagDbContext> options) |
||||
|
: base(options) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
protected override void OnModelCreating(ModelBuilder builder) |
||||
|
{ |
||||
|
base.OnModelCreating(builder); |
||||
|
|
||||
|
builder.ConfigureProductTag(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,66 @@ |
|||||
|
using System; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.EntityFrameworkCore.Modeling; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore |
||||
|
{ |
||||
|
public static class ProductTagDbContextModelCreatingExtensions |
||||
|
{ |
||||
|
public static void ConfigureProductTag( |
||||
|
this ModelBuilder builder, |
||||
|
Action<ProductTagModelBuilderConfigurationOptions> optionsAction = null) |
||||
|
{ |
||||
|
Check.NotNull(builder, nameof(builder)); |
||||
|
|
||||
|
var options = new ProductTagModelBuilderConfigurationOptions( |
||||
|
ProductTagDbProperties.DbTablePrefix, |
||||
|
ProductTagDbProperties.DbSchema |
||||
|
); |
||||
|
|
||||
|
optionsAction?.Invoke(options); |
||||
|
|
||||
|
/* Configure all entities here. Example: |
||||
|
|
||||
|
builder.Entity<Question>(b => |
||||
|
{ |
||||
|
//Configure table & schema name
|
||||
|
b.ToTable(options.TablePrefix + "Questions", options.Schema); |
||||
|
|
||||
|
b.ConfigureByConvention(); |
||||
|
|
||||
|
//Properties
|
||||
|
b.Property(q => q.Title).IsRequired().HasMaxLength(QuestionConsts.MaxTitleLength); |
||||
|
|
||||
|
//Relations
|
||||
|
b.HasMany(question => question.Tags).WithOne().HasForeignKey(qt => qt.QuestionId); |
||||
|
|
||||
|
//Indexes
|
||||
|
b.HasIndex(q => q.CreationTime); |
||||
|
}); |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
|
||||
|
builder.Entity<Tag>(b => |
||||
|
{ |
||||
|
b.ToTable(options.TablePrefix + "Tags", options.Schema); |
||||
|
b.ConfigureByConvention(); |
||||
|
/* Configure more properties here */ |
||||
|
|
||||
|
b.HasIndex(x => x.StoreId); |
||||
|
}); |
||||
|
|
||||
|
builder.Entity<ProductTags.ProductTag>(b => |
||||
|
{ |
||||
|
b.ToTable(options.TablePrefix + "ProductTags", options.Schema); |
||||
|
b.ConfigureByConvention(); |
||||
|
/* Configure more properties here */ |
||||
|
|
||||
|
b.HasIndex(x => x.TagId); |
||||
|
b.HasIndex(x => x.ProductId); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,29 @@ |
|||||
|
using EasyAbp.Abp.Trees.EntityFrameworkCore; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.ProductTags; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(ProductTagDomainModule), |
||||
|
typeof(AbpEntityFrameworkCoreModule), |
||||
|
typeof(AbpTreesEntityFrameworkCoreModule) |
||||
|
)] |
||||
|
public class ProductTagEntityFrameworkCoreModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
context.Services.AddAbpDbContext<ProductTagDbContext>(options => |
||||
|
{ |
||||
|
/* Add custom repositories here. Example: |
||||
|
* options.AddRepository<Question, EfCoreQuestionRepository>(); |
||||
|
*/ |
||||
|
options.AddRepository<Tag, TagRepository>(); |
||||
|
options.AddRepository<ProductTags.ProductTag, ProductTagRepository>(); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
using Volo.Abp.EntityFrameworkCore.Modeling; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore |
||||
|
{ |
||||
|
public class ProductTagModelBuilderConfigurationOptions : AbpModelBuilderConfigurationOptions |
||||
|
{ |
||||
|
public ProductTagModelBuilderConfigurationOptions( |
||||
|
[NotNull] string tablePrefix = "", |
||||
|
[CanBeNull] string schema = null) |
||||
|
: base( |
||||
|
tablePrefix, |
||||
|
schema) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,3 @@ |
|||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
|
<ConfigureAwait ContinueOnCapturedContext="false" /> |
||||
|
</Weavers> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
@ -0,0 +1,43 @@ |
|||||
|
using EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Domain.Repositories.EntityFrameworkCore; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags |
||||
|
{ |
||||
|
public class ProductTagRepository : EfCoreRepository<ProductTagDbContext, ProductTag, Guid>, IProductTagRepository |
||||
|
{ |
||||
|
public ProductTagRepository(IDbContextProvider<ProductTagDbContext> dbContextProvider) : base(dbContextProvider) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public virtual async Task<List<ProductTag>> GetListByTagIdAsync(Guid categoryId, Guid? storeId = null, |
||||
|
CancellationToken cancellationToken = default) |
||||
|
{ |
||||
|
var queryable = GetQueryable(); |
||||
|
if (storeId.HasValue) |
||||
|
{ |
||||
|
queryable = queryable.Where(x => x.StoreId == storeId.Value); |
||||
|
} |
||||
|
|
||||
|
return await queryable.Where(pc => pc.TagId == categoryId).ToListAsync(cancellationToken); |
||||
|
} |
||||
|
|
||||
|
public virtual async Task<List<ProductTag>> GetListByProductIdAsync(Guid productId, Guid? storeId = null, |
||||
|
CancellationToken cancellationToken = default) |
||||
|
{ |
||||
|
var queryable = GetQueryable(); |
||||
|
if (storeId.HasValue) |
||||
|
{ |
||||
|
queryable = queryable.Where(x => x.StoreId == storeId.Value); |
||||
|
} |
||||
|
|
||||
|
return await queryable.Where(pc => pc.ProductId == productId).ToListAsync(cancellationToken); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
using EasyAbp.Abp.Trees; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Tags |
||||
|
{ |
||||
|
public class TagRepository : EfCoreTreeRepository<ProductTagDbContext, Tag>, ITagRepository |
||||
|
{ |
||||
|
public TagRepository(IDbContextProvider<ProductTagDbContext> dbContextProvider) : base(dbContextProvider) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public async Task<List<Tag>> GetListByAsync(Guid storeId, bool includeDetails = false, CancellationToken cancellationToken = default) |
||||
|
{ |
||||
|
return includeDetails |
||||
|
? await WithDetails().Where(x => x.StoreId == storeId).ToListAsync(GetCancellationToken(cancellationToken)) |
||||
|
: await GetQueryable().Where(x => x.StoreId == storeId).ToListAsync(GetCancellationToken(cancellationToken)); |
||||
|
} |
||||
|
|
||||
|
[Obsolete("Should use GetListByAsync(Guid storeId, bool includeDetails, CancellationToken cancellationToken)")] |
||||
|
public override Task<List<Tag>> GetListAsync(bool includeDetails = false, CancellationToken cancellationToken = new CancellationToken()) |
||||
|
{ |
||||
|
return base.GetListAsync(includeDetails, cancellationToken); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag</RootNamespace> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.Http.Client" Version="3.0.5" /> |
||||
|
<ProjectReference Include="..\EasyAbp.EShop.Plugins.ProductTag.Application.Contracts\EasyAbp.EShop.Plugins.ProductTag.Application.Contracts.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,3 @@ |
|||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
|
<ConfigureAwait ContinueOnCapturedContext="false" /> |
||||
|
</Weavers> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
@ -0,0 +1,22 @@ |
|||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Volo.Abp.Http.Client; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(ProductTagApplicationContractsModule), |
||||
|
typeof(AbpHttpClientModule))] |
||||
|
public class ProductTagHttpApiClientModule : AbpModule |
||||
|
{ |
||||
|
public const string RemoteServiceName = "ProductTag"; |
||||
|
|
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
context.Services.AddHttpClientProxies( |
||||
|
typeof(ProductTagApplicationContractsModule).Assembly, |
||||
|
RemoteServiceName |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netcoreapp3.1</TargetFramework> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag</RootNamespace> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="3.0.5" /> |
||||
|
<ProjectReference Include="..\EasyAbp.EShop.Plugins.ProductTag.Application.Contracts\EasyAbp.EShop.Plugins.ProductTag.Application.Contracts.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,3 @@ |
|||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
|
<ConfigureAwait ContinueOnCapturedContext="false" /> |
||||
|
</Weavers> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
@ -0,0 +1,13 @@ |
|||||
|
using EasyAbp.EShop.Plugins.ProductTag.Localization; |
||||
|
using Volo.Abp.AspNetCore.Mvc; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
public abstract class ProductTagBaseController : AbpController |
||||
|
{ |
||||
|
protected ProductTagBaseController() |
||||
|
{ |
||||
|
LocalizationResource = typeof(ProductTagResource); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
using Localization.Resources.AbpUi; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Localization; |
||||
|
using Volo.Abp.AspNetCore.Mvc; |
||||
|
using Volo.Abp.Localization; |
||||
|
using Volo.Abp.Modularity; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(ProductTagApplicationContractsModule), |
||||
|
typeof(AbpAspNetCoreMvcModule))] |
||||
|
public class ProductTagHttpApiModule : AbpModule |
||||
|
{ |
||||
|
public override void PreConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
PreConfigure<IMvcBuilder>(mvcBuilder => |
||||
|
{ |
||||
|
mvcBuilder.AddApplicationPartIfNotExists(typeof(ProductTagHttpApiModule).Assembly); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
Configure<AbpLocalizationOptions>(options => |
||||
|
{ |
||||
|
options.Resources |
||||
|
.Get<ProductTagResource>() |
||||
|
.AddBaseTypes(typeof(AbpUiResource)); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,48 @@ |
|||||
|
using EasyAbp.EShop.Plugins.ProductTag.ProductTags.Dtos; |
||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.ProductTags |
||||
|
{ |
||||
|
[RemoteService(Name = "ProductTagService")] |
||||
|
[Route("/api/eShop/products/productTag")] |
||||
|
public class ProductTagController : ProductTagBaseController, IProductTagAppService |
||||
|
{ |
||||
|
private readonly IProductTagAppService _service; |
||||
|
|
||||
|
public ProductTagController(IProductTagAppService service) |
||||
|
{ |
||||
|
_service = service; |
||||
|
} |
||||
|
|
||||
|
[HttpPut] |
||||
|
public virtual Task UpdateAsync(CreateUpdateProductTagsDto input) |
||||
|
{ |
||||
|
return _service.UpdateAsync(input); |
||||
|
} |
||||
|
|
||||
|
[RemoteService(false)] |
||||
|
[NonAction] |
||||
|
public Task<ProductTagDto> GetAsync(Guid id) |
||||
|
{ |
||||
|
throw new NotSupportedException(); |
||||
|
} |
||||
|
|
||||
|
[HttpGet] |
||||
|
public Task<PagedResultDto<ProductTagDto>> GetListAsync(GetProductTagListDto input) |
||||
|
{ |
||||
|
return _service.GetListAsync(input); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
[HttpPut] |
||||
|
[Route("{id}")] |
||||
|
public Task<ProductTagDto> UpdateAsync(Guid id, UpdateProductTagDto input) |
||||
|
{ |
||||
|
return _service.UpdateAsync(id, input); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,54 @@ |
|||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags.Dtos; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Tags |
||||
|
{ |
||||
|
[RemoteService(Name = "TagService")] |
||||
|
[Route("/api/eShop/products/tag")] |
||||
|
public class TagController : ProductTagBaseController, ITagAppService |
||||
|
{ |
||||
|
private readonly ITagAppService _service; |
||||
|
|
||||
|
public TagController(ITagAppService service) |
||||
|
{ |
||||
|
_service = service; |
||||
|
} |
||||
|
|
||||
|
[HttpGet] |
||||
|
[Route("{id}")] |
||||
|
public Task<TagDto> GetAsync(Guid id) |
||||
|
{ |
||||
|
return _service.GetAsync(id); |
||||
|
} |
||||
|
|
||||
|
[HttpGet] |
||||
|
public Task<PagedResultDto<TagDto>> GetListAsync(GetTagListDto input) |
||||
|
{ |
||||
|
return _service.GetListAsync(input); |
||||
|
} |
||||
|
|
||||
|
[HttpPost] |
||||
|
public Task<TagDto> CreateAsync(CreateTagDto input) |
||||
|
{ |
||||
|
return _service.CreateAsync(input); |
||||
|
} |
||||
|
|
||||
|
[HttpPut] |
||||
|
[Route("{id}")] |
||||
|
public Task<TagDto> UpdateAsync(Guid id, UpdateTagDto input) |
||||
|
{ |
||||
|
return _service.UpdateAsync(id, input); |
||||
|
} |
||||
|
|
||||
|
[HttpDelete] |
||||
|
[Route("{id}")] |
||||
|
public Task DeleteAsync(Guid id) |
||||
|
{ |
||||
|
return _service.DeleteAsync(id); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netcoreapp3.1</TargetFramework> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag</RootNamespace> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.MongoDB" Version="3.0.5" /> |
||||
|
<ProjectReference Include="..\EasyAbp.EShop.Plugins.ProductTag.Domain\EasyAbp.EShop.Plugins.ProductTag.Domain.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,3 @@ |
|||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
|
<ConfigureAwait /> |
||||
|
</Weavers> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
@ -0,0 +1,13 @@ |
|||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.MongoDB; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.MongoDB |
||||
|
{ |
||||
|
[ConnectionStringName(ProductTagDbProperties.ConnectionStringName)] |
||||
|
public interface IProductTagMongoDbContext : IAbpMongoDbContext |
||||
|
{ |
||||
|
/* Define mongo collections here. Example: |
||||
|
* IMongoCollection<Question> Questions { get; } |
||||
|
*/ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.MongoDB; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.MongoDB |
||||
|
{ |
||||
|
[ConnectionStringName(ProductTagDbProperties.ConnectionStringName)] |
||||
|
public class ProductTagMongoDbContext : AbpMongoDbContext, IProductTagMongoDbContext |
||||
|
{ |
||||
|
/* Add mongo collections here. Example: |
||||
|
* public IMongoCollection<Question> Questions => Collection<Question>(); |
||||
|
*/ |
||||
|
|
||||
|
protected override void CreateModel(IMongoModelBuilder modelBuilder) |
||||
|
{ |
||||
|
base.CreateModel(modelBuilder); |
||||
|
|
||||
|
modelBuilder.ConfigureProductTag(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.MongoDB; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.MongoDB |
||||
|
{ |
||||
|
public static class ProductTagMongoDbContextExtensions |
||||
|
{ |
||||
|
public static void ConfigureProductTag( |
||||
|
this IMongoModelBuilder builder, |
||||
|
Action<AbpMongoModelBuilderConfigurationOptions> optionsAction = null) |
||||
|
{ |
||||
|
Check.NotNull(builder, nameof(builder)); |
||||
|
|
||||
|
var options = new ProductTagMongoModelBuilderConfigurationOptions( |
||||
|
ProductTagDbProperties.DbTablePrefix |
||||
|
); |
||||
|
|
||||
|
optionsAction?.Invoke(options); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Volo.Abp.Modularity; |
||||
|
using Volo.Abp.MongoDB; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.MongoDB |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(ProductTagDomainModule), |
||||
|
typeof(AbpMongoDbModule) |
||||
|
)] |
||||
|
public class ProductTagMongoDbModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
context.Services.AddMongoDbContext<ProductTagMongoDbContext>(options => |
||||
|
{ |
||||
|
/* Add custom repositories here. Example: |
||||
|
* options.AddRepository<Question, MongoQuestionRepository>(); |
||||
|
*/ |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,14 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
using Volo.Abp.MongoDB; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.MongoDB |
||||
|
{ |
||||
|
public class ProductTagMongoModelBuilderConfigurationOptions : AbpMongoModelBuilderConfigurationOptions |
||||
|
{ |
||||
|
public ProductTagMongoModelBuilderConfigurationOptions( |
||||
|
[NotNull] string collectionPrefix = "") |
||||
|
: base(collectionPrefix) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,47 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk.Web"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netcoreapp3.1</TargetFramework> |
||||
|
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> |
||||
|
<IsPackable>true</IsPackable> |
||||
|
<OutputType>Library</OutputType> |
||||
|
<RootNamespace>EasyAbp.EShop.Plugins.ProductTag.Web</RootNamespace> |
||||
|
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.AutoMapper" Version="3.0.5" /> |
||||
|
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared" Version="3.0.5" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Products\src\EasyAbp.EShop.Products.Web\EasyAbp.EShop.Products.Web.csproj" /> |
||||
|
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Stores\src\EasyAbp.EShop.Stores.Application.Contracts\EasyAbp.EShop.Stores.Application.Contracts.csproj" /> |
||||
|
<ProjectReference Include="..\EasyAbp.EShop.Plugins.ProductTag.HttpApi\EasyAbp.EShop.Plugins.ProductTag.HttpApi.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.5" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<EmbeddedResource Include="Pages\**\*.css" /> |
||||
|
<EmbeddedResource Include="Pages\**\*.js" /> |
||||
|
<EmbeddedResource Include="wwwroot\**\*.*" /> |
||||
|
<Content Remove="Pages\**\*.css" /> |
||||
|
<Content Remove="Pages\**\*.js" /> |
||||
|
<Content Remove="wwwroot\**\*.*" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<None Remove="Pages\EShop\Products\Tags\Tag\index.css" /> |
||||
|
<None Remove="Pages\EShop\Products\Tags\Tag\index.js" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<Folder Include="wwwroot\" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,3 @@ |
|||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
|
<ConfigureAwait ContinueOnCapturedContext="false" /> |
||||
|
</Weavers> |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
@ -0,0 +1,39 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Localization; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Permissions; |
||||
|
using EasyAbp.EShop.Products.Web.Menus; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.UI.Navigation; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Web.Menus |
||||
|
{ |
||||
|
public class ProductTagMenuContributor : IMenuContributor |
||||
|
{ |
||||
|
public async Task ConfigureMenuAsync(MenuConfigurationContext context) |
||||
|
{ |
||||
|
if (context.Menu.Name == StandardMenus.Main) |
||||
|
{ |
||||
|
await ConfigureMainMenu(context); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private async Task ConfigureMainMenu(MenuConfigurationContext context) |
||||
|
{ |
||||
|
//Add main menu items.
|
||||
|
var l = context.GetLocalizer<ProductTagResource>(); |
||||
|
|
||||
|
var eShopMenuItem = context.Menu.Items.GetOrAdd(i => i.Name == ProductsMenus.ModuleGroupPrefix, |
||||
|
() => new ApplicationMenuItem(ProductsMenus.ModuleGroupPrefix, l["Menu:EasyAbpEShop"])); |
||||
|
|
||||
|
var productManagementMenuItem = eShopMenuItem.Items.GetOrAdd(x => x.Name == ProductsMenus.Prefix, |
||||
|
() => new ApplicationMenuItem(ProductsMenus.Prefix, l["Menu:ProductManagement"])); |
||||
|
|
||||
|
if (await context.IsGrantedAsync(ProductTagPermissions.Tags.Default)) |
||||
|
{ |
||||
|
productManagementMenuItem.AddItem( |
||||
|
new ApplicationMenuItem(ProductTagMenus.Tag, l["Menu:Tag"], "/EShop/Products/Tags/Tag") |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,13 @@ |
|||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Web.Menus |
||||
|
{ |
||||
|
public class ProductTagMenus |
||||
|
{ |
||||
|
private const string Prefix = "ProductTag"; |
||||
|
|
||||
|
//Add your menu items here...
|
||||
|
//public const string Home = Prefix + ".MyNewMenuItem";
|
||||
|
|
||||
|
|
||||
|
public const string Tag = Prefix + ".Tag"; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
@page |
||||
|
@using Microsoft.Extensions.Localization |
||||
|
@using EasyAbp.EShop.Plugins.ProductTag.Localization |
||||
|
@model EasyAbp.EShop.Plugins.ProductTag.Web.Pages.EShop.Products.ProductTag.IndexModel |
||||
|
@inject IStringLocalizer<ProductTagResource> L |
||||
|
@{ |
||||
|
} |
||||
|
<h1>ProductTag</h1> |
||||
|
<p>@L["SamplePageMessage"]</p> |
||||
@ -0,0 +1,9 @@ |
|||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Web.Pages.EShop.Products.ProductTag |
||||
|
{ |
||||
|
public class IndexModel : ProductTagPageModel |
||||
|
{ |
||||
|
public void OnGet() |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,4 @@ |
|||||
|
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers |
||||
|
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI |
||||
|
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap |
||||
|
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling |
||||
@ -0,0 +1,18 @@ |
|||||
|
@page |
||||
|
@using EasyAbp.EShop.Plugins.ProductTag.Localization |
||||
|
@using Microsoft.AspNetCore.Mvc.Localization |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal; |
||||
|
@inject IHtmlLocalizer<ProductTagResource> L |
||||
|
@model EasyAbp.EShop.Plugins.ProductTag.Web.Pages.EShop.Products.Tags.Tag.CreateModalModel |
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
<abp-dynamic-form abp-model="ViewModel" data-ajaxForm="true" asp-page="CreateModal"> |
||||
|
<abp-modal> |
||||
|
<abp-modal-header title="@L["CreateTag"].Value"></abp-modal-header> |
||||
|
<abp-modal-body> |
||||
|
<abp-form-content /> |
||||
|
</abp-modal-body> |
||||
|
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer> |
||||
|
</abp-modal> |
||||
|
</abp-dynamic-form> |
||||
@ -0,0 +1,26 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags.Dtos; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Web.Pages.EShop.Products.Tags.Tag |
||||
|
{ |
||||
|
public class CreateModalModel : ProductTagPageModel |
||||
|
{ |
||||
|
[BindProperty] |
||||
|
public CreateTagDto ViewModel { get; set; } |
||||
|
|
||||
|
private readonly ITagAppService _service; |
||||
|
|
||||
|
public CreateModalModel(ITagAppService service) |
||||
|
{ |
||||
|
_service = service; |
||||
|
} |
||||
|
|
||||
|
public virtual async Task<IActionResult> OnPostAsync() |
||||
|
{ |
||||
|
await _service.CreateAsync(ViewModel); |
||||
|
return NoContent(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
@page |
||||
|
@using EasyAbp.EShop.Plugins.ProductTag.Localization |
||||
|
@using Microsoft.AspNetCore.Mvc.Localization |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal; |
||||
|
@inject IHtmlLocalizer<ProductTagResource> L |
||||
|
@model EasyAbp.EShop.Plugins.ProductTag.Web.Pages.EShop.Products.Tags.Tag.EditModalModel |
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
<abp-dynamic-form abp-model="ViewModel" data-ajaxForm="true" asp-page="EditModal"> |
||||
|
<abp-modal> |
||||
|
<abp-modal-header title="@L["EditTag"].Value"></abp-modal-header> |
||||
|
<abp-modal-body> |
||||
|
<abp-input asp-for="Id" /> |
||||
|
<abp-form-content /> |
||||
|
</abp-modal-body> |
||||
|
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer> |
||||
|
</abp-modal> |
||||
|
</abp-dynamic-form> |
||||
@ -0,0 +1,37 @@ |
|||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags; |
||||
|
using EasyAbp.EShop.Plugins.ProductTag.Tags.Dtos; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
|
||||
|
namespace EasyAbp.EShop.Plugins.ProductTag.Web.Pages.EShop.Products.Tags.Tag |
||||
|
{ |
||||
|
public class EditModalModel : ProductTagPageModel |
||||
|
{ |
||||
|
[HiddenInput] |
||||
|
[BindProperty(SupportsGet = true)] |
||||
|
public Guid Id { get; set; } |
||||
|
|
||||
|
[BindProperty] |
||||
|
public UpdateTagDto ViewModel { get; set; } |
||||
|
|
||||
|
private readonly ITagAppService _service; |
||||
|
|
||||
|
public EditModalModel(ITagAppService service) |
||||
|
{ |
||||
|
_service = service; |
||||
|
} |
||||
|
|
||||
|
public virtual async Task OnGetAsync() |
||||
|
{ |
||||
|
var dto = await _service.GetAsync(Id); |
||||
|
ViewModel = ObjectMapper.Map<TagDto, UpdateTagDto>(dto); |
||||
|
} |
||||
|
|
||||
|
public virtual async Task<IActionResult> OnPostAsync() |
||||
|
{ |
||||
|
await _service.UpdateAsync(Id, ViewModel); |
||||
|
return NoContent(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue