Compare commits
No commits in common. 'f/react-grundstruktur' and 'master' have entirely different histories.
f/react-gr
...
master
68 changed files with 2 additions and 14265 deletions
@ -1,70 +0,0 @@ |
|||||||
stages: |
|
||||||
- build_docker |
|
||||||
- build_fe |
|
||||||
|
|
||||||
|
|
||||||
build_frontend: |
|
||||||
stage: build_fe |
|
||||||
tags: |
|
||||||
- docker |
|
||||||
image: registry.gitlab.com/fia72-dev/eva_lernsituation/frontend-build |
|
||||||
before_script: |
|
||||||
- eval $(ssh-agent -s) |
|
||||||
- ssh-add <(echo "${DEPLOY_ENV_KEY}") |
|
||||||
- mkdir -p ~/.ssh |
|
||||||
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' |
|
||||||
- cp -r Frontend/src/ /workdir/src/ |
|
||||||
- cp -r Frontend/public/ /workdir/public/ |
|
||||||
script: |
|
||||||
- pwd |
|
||||||
- ls -la |
|
||||||
- cd /workdir |
|
||||||
- npm run build |
|
||||||
- ls -la /workdir/build |
|
||||||
- ssh $DEPLOY_ENV_USER@$DEPLOY_ENV_TARGET "mkdir -p /home/$DEPLOY_ENV_USER/serve" |
|
||||||
- ssh $DEPLOY_ENV_USER@$DEPLOY_ENV_TARGET "rm -rf /home/$DEPLOY_ENV_USER/serve/*" |
|
||||||
- ssh $DEPLOY_ENV_USER@$DEPLOY_ENV_TARGET "mkdir -p /home/$DEPLOY_ENV_USER/serve/$CI_COMMIT_REF_NAME" |
|
||||||
- rsync --progress -av -e ssh /workdir/build/* $DEPLOY_ENV_USER@$DEPLOY_ENV_TARGET:/home/$DEPLOY_ENV_USER/serve/ |
|
||||||
environment: |
|
||||||
name: deploy |
|
||||||
url: https://$DEPLOY_ENV_TARGET |
|
||||||
|
|
||||||
build_docker_host: |
|
||||||
stage: build_docker |
|
||||||
tags: |
|
||||||
- docker-builder |
|
||||||
before_script: |
|
||||||
- eval $(ssh-agent -s) |
|
||||||
- ssh-add <(echo "${DEPLOY_ENV_KEY}") |
|
||||||
- mkdir -p ~/.ssh |
|
||||||
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config |
|
||||||
- docker info |
|
||||||
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY |
|
||||||
script: |
|
||||||
- docker build -f Docker/Dockerfile_FE_Host.dockerfile -t registry.gitlab.com/fia72-dev/eva_lernsituation/frontend-serve . |
|
||||||
- docker push registry.gitlab.com/fia72-dev/eva_lernsituation/frontend-serve |
|
||||||
- ls -la Docker/config/restart-host.sh |
|
||||||
- rsync --progress -av -e ssh Docker/config/restart-host.sh $DEPLOY_ENV_USER@$DEPLOY_ENV_TARGET:/home/$DEPLOY_ENV_USER/restart-host.sh |
|
||||||
- ssh $DEPLOY_ENV_USER@$DEPLOY_ENV_TARGET "./restart-host.sh" |
|
||||||
only: |
|
||||||
changes: |
|
||||||
- Docker/Dockerfile_FE_Host.dockerfile |
|
||||||
- Docker/config/* |
|
||||||
|
|
||||||
build_docker_builder: |
|
||||||
stage: build_docker |
|
||||||
tags: |
|
||||||
- docker-builder |
|
||||||
before_script: |
|
||||||
- docker info |
|
||||||
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY |
|
||||||
script: |
|
||||||
- docker build -f Docker/Dockerfile_FE_Builder.dockerfile -t registry.gitlab.com/fia72-dev/eva_lernsituation/frontend-build . |
|
||||||
- docker push registry.gitlab.com/fia72-dev/eva_lernsituation/frontend-build |
|
||||||
only: |
|
||||||
changes: |
|
||||||
- Docker/Dockerfile_FE_Builder.dockerfile |
|
||||||
- Docker/config/* |
|
||||||
- Frontend/package.json |
|
||||||
- Frontend/package-lock.json |
|
||||||
|
|
||||||
@ -1,9 +0,0 @@ |
|||||||
.dockerignore |
|
||||||
.env |
|
||||||
.git |
|
||||||
.gitignore |
|
||||||
.vs |
|
||||||
.vscode |
|
||||||
*/bin |
|
||||||
*/obj |
|
||||||
**/.toolstarget |
|
||||||
@ -1,348 +0,0 @@ |
|||||||
## Ignore Visual Studio temporary files, build results, and |
|
||||||
## files generated by popular Visual Studio add-ons. |
|
||||||
## |
|
||||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore |
|
||||||
|
|
||||||
# User-specific files |
|
||||||
*.rsuser |
|
||||||
*.suo |
|
||||||
*.user |
|
||||||
*.userosscache |
|
||||||
*.sln.docstates |
|
||||||
|
|
||||||
# User-specific files (MonoDevelop/Xamarin Studio) |
|
||||||
*.userprefs |
|
||||||
|
|
||||||
# Mono auto generated files |
|
||||||
mono_crash.* |
|
||||||
|
|
||||||
# Build results |
|
||||||
[Dd]ebug/ |
|
||||||
[Dd]ebugPublic/ |
|
||||||
[Rr]elease/ |
|
||||||
[Rr]eleases/ |
|
||||||
x64/ |
|
||||||
x86/ |
|
||||||
[Aa][Rr][Mm]/ |
|
||||||
[Aa][Rr][Mm]64/ |
|
||||||
bld/ |
|
||||||
[Bb]in/ |
|
||||||
[Oo]bj/ |
|
||||||
[Ll]og/ |
|
||||||
|
|
||||||
# Visual Studio 2015/2017 cache/options directory |
|
||||||
.vs/ |
|
||||||
# Uncomment if you have tasks that create the project's static files in wwwroot |
|
||||||
#wwwroot/ |
|
||||||
|
|
||||||
# Visual Studio 2017 auto generated files |
|
||||||
Generated\ Files/ |
|
||||||
|
|
||||||
# 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 |
|
||||||
|
|
||||||
# Benchmark Results |
|
||||||
BenchmarkDotNet.Artifacts/ |
|
||||||
|
|
||||||
# .NET Core |
|
||||||
project.lock.json |
|
||||||
project.fragment.lock.json |
|
||||||
artifacts/ |
|
||||||
|
|
||||||
# StyleCop |
|
||||||
StyleCopReport.xml |
|
||||||
|
|
||||||
# Files built by Visual Studio |
|
||||||
*_i.c |
|
||||||
*_p.c |
|
||||||
*_h.h |
|
||||||
*.ilk |
|
||||||
*.meta |
|
||||||
*.obj |
|
||||||
*.iobj |
|
||||||
*.pch |
|
||||||
*.pdb |
|
||||||
*.ipdb |
|
||||||
*.pgc |
|
||||||
*.pgd |
|
||||||
*.rsp |
|
||||||
*.sbr |
|
||||||
*.tlb |
|
||||||
*.tli |
|
||||||
*.tlh |
|
||||||
*.tmp |
|
||||||
*.tmp_proj |
|
||||||
*_wpftmp.csproj |
|
||||||
*.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 |
|
||||||
|
|
||||||
# Visual Studio Trace Files |
|
||||||
*.e2e |
|
||||||
|
|
||||||
# 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 |
|
||||||
|
|
||||||
# AxoCover is a Code Coverage Tool |
|
||||||
.axoCover/* |
|
||||||
!.axoCover/settings.json |
|
||||||
|
|
||||||
# Visual Studio code coverage results |
|
||||||
*.coverage |
|
||||||
*.coveragexml |
|
||||||
|
|
||||||
# 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 |
|
||||||
# Note: 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 |
|
||||||
# NuGet Symbol Packages |
|
||||||
*.snupkg |
|
||||||
# The packages folder can be ignored because of Package Restore |
|
||||||
**/[Pp]ackages/* |
|
||||||
# except build/, which is used as an MSBuild target. |
|
||||||
!**/[Pp]ackages/build/ |
|
||||||
# Uncomment if necessary however generally it will be regenerated when needed |
|
||||||
#!**/[Pp]ackages/repositories.config |
|
||||||
# NuGet v3's project.json files produces more ignorable 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 |
|
||||||
*.appx |
|
||||||
*.appxbundle |
|
||||||
*.appxupload |
|
||||||
|
|
||||||
# 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 |
|
||||||
*.jfm |
|
||||||
*.pfx |
|
||||||
*.publishsettings |
|
||||||
orleans.codegen.cs |
|
||||||
|
|
||||||
# Including strong name files can present a security risk |
|
||||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424) |
|
||||||
#*.snk |
|
||||||
|
|
||||||
# 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 |
|
||||||
ServiceFabricBackup/ |
|
||||||
*.rptproj.bak |
|
||||||
|
|
||||||
# SQL Server files |
|
||||||
*.mdf |
|
||||||
*.ldf |
|
||||||
*.ndf |
|
||||||
|
|
||||||
# Business Intelligence projects |
|
||||||
*.rdl.data |
|
||||||
*.bim.layout |
|
||||||
*.bim_*.settings |
|
||||||
*.rptproj.rsuser |
|
||||||
*- [Bb]ackup.rdl |
|
||||||
*- [Bb]ackup ([0-9]).rdl |
|
||||||
*- [Bb]ackup ([0-9][0-9]).rdl |
|
||||||
|
|
||||||
# Microsoft Fakes |
|
||||||
FakesAssemblies/ |
|
||||||
|
|
||||||
# GhostDoc plugin setting file |
|
||||||
*.GhostDoc.xml |
|
||||||
|
|
||||||
# Node.js Tools for Visual Studio |
|
||||||
.ntvs_analysis.dat |
|
||||||
node_modules/ |
|
||||||
|
|
||||||
# Visual Studio 6 build log |
|
||||||
*.plg |
|
||||||
|
|
||||||
# Visual Studio 6 workspace options file |
|
||||||
*.opt |
|
||||||
|
|
||||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) |
|
||||||
*.vbw |
|
||||||
|
|
||||||
# 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/ |
|
||||||
|
|
||||||
# CodeRush personal settings |
|
||||||
.cr/personal |
|
||||||
|
|
||||||
# Python Tools for Visual Studio (PTVS) |
|
||||||
__pycache__/ |
|
||||||
*.pyc |
|
||||||
|
|
||||||
# Cake - Uncomment if you are using it |
|
||||||
# tools/** |
|
||||||
# !tools/packages.config |
|
||||||
|
|
||||||
# Tabs Studio |
|
||||||
*.tss |
|
||||||
|
|
||||||
# Telerik's JustMock configuration file |
|
||||||
*.jmconfig |
|
||||||
|
|
||||||
# BizTalk build output |
|
||||||
*.btp.cs |
|
||||||
*.btm.cs |
|
||||||
*.odx.cs |
|
||||||
*.xsd.cs |
|
||||||
|
|
||||||
# OpenCover UI analysis results |
|
||||||
OpenCover/ |
|
||||||
|
|
||||||
# Azure Stream Analytics local run output |
|
||||||
ASALocalRun/ |
|
||||||
|
|
||||||
# MSBuild Binary and Structured Log |
|
||||||
*.binlog |
|
||||||
|
|
||||||
# NVidia Nsight GPU debugger configuration file |
|
||||||
*.nvuser |
|
||||||
|
|
||||||
# MFractors (Xamarin productivity tool) working folder |
|
||||||
.mfractor/ |
|
||||||
|
|
||||||
# Local History for Visual Studio |
|
||||||
.localhistory/ |
|
||||||
|
|
||||||
# BeatPulse healthcheck temp database |
|
||||||
healthchecksdb |
|
||||||
|
|
||||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017 |
|
||||||
MigrationBackup/ |
|
||||||
@ -1,25 +0,0 @@ |
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00 |
|
||||||
# Visual Studio Version 16 |
|
||||||
VisualStudioVersion = 16.0.28803.156 |
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1 |
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EVABackend", "EVABackend\EVABackend.csproj", "{35629A48-394C-4EE6-B853-1B92641B9FED}" |
|
||||||
EndProject |
|
||||||
Global |
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
|
||||||
Debug|Any CPU = Debug|Any CPU |
|
||||||
Release|Any CPU = Release|Any CPU |
|
||||||
EndGlobalSection |
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
|
||||||
{35629A48-394C-4EE6-B853-1B92641B9FED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|
||||||
{35629A48-394C-4EE6-B853-1B92641B9FED}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|
||||||
{35629A48-394C-4EE6-B853-1B92641B9FED}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|
||||||
{35629A48-394C-4EE6-B853-1B92641B9FED}.Release|Any CPU.Build.0 = Release|Any CPU |
|
||||||
EndGlobalSection |
|
||||||
GlobalSection(SolutionProperties) = preSolution |
|
||||||
HideSolutionNode = FALSE |
|
||||||
EndGlobalSection |
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution |
|
||||||
SolutionGuid = {9D649B10-EA35-49B9-BCB5-A989D21D6832} |
|
||||||
EndGlobalSection |
|
||||||
EndGlobal |
|
||||||
@ -1,45 +0,0 @@ |
|||||||
using System; |
|
||||||
using System.Collections.Generic; |
|
||||||
using System.Linq; |
|
||||||
using System.Threading.Tasks; |
|
||||||
using Microsoft.AspNetCore.Mvc; |
|
||||||
|
|
||||||
namespace EVABackend.Controllers |
|
||||||
{ |
|
||||||
[Route("api/[controller]")]
|
|
||||||
[ApiController] |
|
||||||
public class ValuesController : ControllerBase |
|
||||||
{ |
|
||||||
// GET api/values |
|
||||||
[HttpGet] |
|
||||||
public ActionResult<IEnumerable<string>> Get() |
|
||||||
{ |
|
||||||
return new string[] { "value1", "value2" }; |
|
||||||
} |
|
||||||
|
|
||||||
// GET api/values/5 |
|
||||||
[HttpGet("{id}")] |
|
||||||
public ActionResult<string> Get(int id) |
|
||||||
{ |
|
||||||
return "value"; |
|
||||||
} |
|
||||||
|
|
||||||
// POST api/values |
|
||||||
[HttpPost] |
|
||||||
public void Post([FromBody] string value) |
|
||||||
{ |
|
||||||
} |
|
||||||
|
|
||||||
// PUT api/values/5 |
|
||||||
[HttpPut("{id}")] |
|
||||||
public void Put(int id, [FromBody] string value) |
|
||||||
{ |
|
||||||
} |
|
||||||
|
|
||||||
// DELETE api/values/5 |
|
||||||
[HttpDelete("{id}")] |
|
||||||
public void Delete(int id) |
|
||||||
{ |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,20 +0,0 @@ |
|||||||
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base |
|
||||||
WORKDIR /app |
|
||||||
EXPOSE 80 |
|
||||||
EXPOSE 443 |
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build |
|
||||||
WORKDIR /src |
|
||||||
COPY ["EVABackend/EVABackend.csproj", "EVABackend/"] |
|
||||||
RUN dotnet restore "EVABackend/EVABackend.csproj" |
|
||||||
COPY . . |
|
||||||
WORKDIR "/src/EVABackend" |
|
||||||
RUN dotnet build "EVABackend.csproj" -c Release -o /app |
|
||||||
|
|
||||||
FROM build AS publish |
|
||||||
RUN dotnet publish "EVABackend.csproj" -c Release -o /app |
|
||||||
|
|
||||||
FROM base AS final |
|
||||||
WORKDIR /app |
|
||||||
COPY --from=publish /app . |
|
||||||
ENTRYPOINT ["dotnet", "EVABackend.dll"] |
|
||||||
@ -1,20 +0,0 @@ |
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web"> |
|
||||||
|
|
||||||
<PropertyGroup> |
|
||||||
<TargetFramework>netcoreapp2.1</TargetFramework> |
|
||||||
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS> |
|
||||||
<UserSecretsId>81a3ba40-5295-4382-9a09-5339b5d22d08</UserSecretsId> |
|
||||||
</PropertyGroup> |
|
||||||
|
|
||||||
<ItemGroup> |
|
||||||
<Folder Include="wwwroot\" /> |
|
||||||
</ItemGroup> |
|
||||||
|
|
||||||
<ItemGroup> |
|
||||||
<PackageReference Include="Microsoft.AspNetCore.App" /> |
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" /> |
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.1.8" /> |
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.7.8" /> |
|
||||||
</ItemGroup> |
|
||||||
|
|
||||||
</Project> |
|
||||||
@ -1,24 +0,0 @@ |
|||||||
using System; |
|
||||||
using System.Collections.Generic; |
|
||||||
using System.IO; |
|
||||||
using System.Linq; |
|
||||||
using System.Threading.Tasks; |
|
||||||
using Microsoft.AspNetCore; |
|
||||||
using Microsoft.AspNetCore.Hosting; |
|
||||||
using Microsoft.Extensions.Configuration; |
|
||||||
using Microsoft.Extensions.Logging; |
|
||||||
|
|
||||||
namespace EVABackend |
|
||||||
{ |
|
||||||
public class Program |
|
||||||
{ |
|
||||||
public static void Main(string[] args) |
|
||||||
{ |
|
||||||
CreateWebHostBuilder(args).Build().Run(); |
|
||||||
} |
|
||||||
|
|
||||||
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => |
|
||||||
WebHost.CreateDefaultBuilder(args) |
|
||||||
.UseStartup<Startup>(); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,38 +0,0 @@ |
|||||||
{ |
|
||||||
"iisSettings": { |
|
||||||
"windowsAuthentication": false, |
|
||||||
"anonymousAuthentication": true, |
|
||||||
"iisExpress": { |
|
||||||
"applicationUrl": "http://localhost:50570", |
|
||||||
"sslPort": 44374 |
|
||||||
} |
|
||||||
}, |
|
||||||
"$schema": "http://json.schemastore.org/launchsettings.json", |
|
||||||
"profiles": { |
|
||||||
"IIS Express": { |
|
||||||
"commandName": "IISExpress", |
|
||||||
"launchBrowser": true, |
|
||||||
"launchUrl": "api/values", |
|
||||||
"environmentVariables": { |
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development" |
|
||||||
} |
|
||||||
}, |
|
||||||
"EVABackend": { |
|
||||||
"commandName": "Project", |
|
||||||
"launchBrowser": true, |
|
||||||
"launchUrl": "api/values", |
|
||||||
"environmentVariables": { |
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development" |
|
||||||
}, |
|
||||||
"applicationUrl": "https://localhost:5001;http://localhost:5000" |
|
||||||
}, |
|
||||||
"Docker": { |
|
||||||
"commandName": "Docker", |
|
||||||
"launchBrowser": true, |
|
||||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/api/values", |
|
||||||
"httpPort": 50571, |
|
||||||
"useSSL": true, |
|
||||||
"sslPort": 44375 |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,47 +0,0 @@ |
|||||||
using System; |
|
||||||
using System.Collections.Generic; |
|
||||||
using System.Linq; |
|
||||||
using System.Threading.Tasks; |
|
||||||
using Microsoft.AspNetCore.Builder; |
|
||||||
using Microsoft.AspNetCore.Hosting; |
|
||||||
using Microsoft.AspNetCore.HttpsPolicy; |
|
||||||
using Microsoft.AspNetCore.Mvc; |
|
||||||
using Microsoft.Extensions.Configuration; |
|
||||||
using Microsoft.Extensions.DependencyInjection; |
|
||||||
using Microsoft.Extensions.Logging; |
|
||||||
using Microsoft.Extensions.Options; |
|
||||||
|
|
||||||
namespace EVABackend |
|
||||||
{ |
|
||||||
public class Startup |
|
||||||
{ |
|
||||||
public Startup(IConfiguration configuration) |
|
||||||
{ |
|
||||||
Configuration = configuration; |
|
||||||
} |
|
||||||
|
|
||||||
public IConfiguration Configuration { get; } |
|
||||||
|
|
||||||
// This method gets called by the runtime. Use this method to add services to the container. |
|
||||||
public void ConfigureServices(IServiceCollection services) |
|
||||||
{ |
|
||||||
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); |
|
||||||
} |
|
||||||
|
|
||||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. |
|
||||||
public void Configure(IApplicationBuilder app, IHostingEnvironment env) |
|
||||||
{ |
|
||||||
if (env.IsDevelopment()) |
|
||||||
{ |
|
||||||
app.UseDeveloperExceptionPage(); |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
app.UseHsts(); |
|
||||||
} |
|
||||||
|
|
||||||
app.UseHttpsRedirection(); |
|
||||||
app.UseMvc(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,9 +0,0 @@ |
|||||||
{ |
|
||||||
"Logging": { |
|
||||||
"LogLevel": { |
|
||||||
"Default": "Debug", |
|
||||||
"System": "Information", |
|
||||||
"Microsoft": "Information" |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,8 +0,0 @@ |
|||||||
{ |
|
||||||
"Logging": { |
|
||||||
"LogLevel": { |
|
||||||
"Default": "Warning" |
|
||||||
} |
|
||||||
}, |
|
||||||
"AllowedHosts": "*" |
|
||||||
} |
|
||||||
@ -1,15 +0,0 @@ |
|||||||
# Tag: frontend-build |
|
||||||
|
|
||||||
FROM node:10.8-stretch |
|
||||||
RUN apt update |
|
||||||
RUN apt install -y rsync |
|
||||||
RUN mkdir -p /workdir |
|
||||||
COPY Frontend/package.json /workdir/package.json |
|
||||||
COPY Frontend/package-lock.json /workdir/package-lock.json |
|
||||||
|
|
||||||
WORKDIR /workdir |
|
||||||
|
|
||||||
RUN pwd && ls -la |
|
||||||
|
|
||||||
run npm install |
|
||||||
|
|
||||||
@ -1,5 +0,0 @@ |
|||||||
# Tag: frontend-serve |
|
||||||
|
|
||||||
FROM nginx |
|
||||||
|
|
||||||
COPY Docker/config/nginx.conf /etc/nginx/nginx.conf |
|
||||||
@ -1,14 +0,0 @@ |
|||||||
events { |
|
||||||
worker_connections 1024; |
|
||||||
} |
|
||||||
|
|
||||||
http { |
|
||||||
server { |
|
||||||
listen 80; |
|
||||||
root /usr/share/nginx/html; |
|
||||||
|
|
||||||
location / { |
|
||||||
autoindex on; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,7 +0,0 @@ |
|||||||
#! /bin/bash |
|
||||||
docker login -u gitlab+deploy-token-66068 -p vD23SzzitUn8y8xGknKz registry.gitlab.com |
|
||||||
docker stop eva_frontend_serve |
|
||||||
docker rm eva_frontend_serve |
|
||||||
docker rmi registry.gitlab.com/fia72-dev/eva_lernsituation/frontend-serve |
|
||||||
docker run -d -p 8083:80 -v /home/gitlab/serve:/usr/share/nginx/html:ro --name "eva_frontend_serve" registry.gitlab.com/fia72-dev/eva_lernsituation/frontend-serve |
|
||||||
|
|
||||||
@ -1,23 +0,0 @@ |
|||||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. |
|
||||||
|
|
||||||
# dependencies |
|
||||||
/node_modules |
|
||||||
/.pnp |
|
||||||
.pnp.js |
|
||||||
|
|
||||||
# testing |
|
||||||
/coverage |
|
||||||
|
|
||||||
# production |
|
||||||
/build |
|
||||||
|
|
||||||
# misc |
|
||||||
.DS_Store |
|
||||||
.env.local |
|
||||||
.env.development.local |
|
||||||
.env.test.local |
|
||||||
.env.production.local |
|
||||||
|
|
||||||
npm-debug.log* |
|
||||||
yarn-debug.log* |
|
||||||
yarn-error.log* |
|
||||||
@ -1,5 +0,0 @@ |
|||||||
# React App für die EVA_Lernsituatuin |
|
||||||
|
|
||||||
# Pakages |
|
||||||
|
|
||||||
- Material UI |
|
||||||
@ -1,12 +0,0 @@ |
|||||||
<!DOCTYPE html> |
|
||||||
<html lang="en"> |
|
||||||
<head> |
|
||||||
<meta charset="UTF-8"> |
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
||||||
<meta http-equiv="X-UA-Compatible" content="ie=edge"> |
|
||||||
<title>Temporäre Seite</title> |
|
||||||
</head> |
|
||||||
<body> |
|
||||||
Hallo bitte geh weg. |
|
||||||
</body> |
|
||||||
</html> |
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,35 +0,0 @@ |
|||||||
{ |
|
||||||
"name": "lernsituation", |
|
||||||
"version": "0.1.0", |
|
||||||
"private": true, |
|
||||||
"repository": "https://gitlab.com/fia72-dev/eva_lernsituation", |
|
||||||
"dependencies": { |
|
||||||
"@material-ui/core": "^4.0.0-beta.2", |
|
||||||
"react": "^16.8.6", |
|
||||||
"react-dom": "^16.8.6", |
|
||||||
"react-router-dom": "^5.0.0", |
|
||||||
"react-scripts": "3.0.0", |
|
||||||
"styled-components": "^4.2.0" |
|
||||||
}, |
|
||||||
"scripts": { |
|
||||||
"start": "react-scripts start", |
|
||||||
"build": "react-scripts build", |
|
||||||
"test": "react-scripts test", |
|
||||||
"eject": "react-scripts eject" |
|
||||||
}, |
|
||||||
"eslintConfig": { |
|
||||||
"extends": "react-app" |
|
||||||
}, |
|
||||||
"browserslist": { |
|
||||||
"production": [ |
|
||||||
">0.2%", |
|
||||||
"not dead", |
|
||||||
"not op_mini all" |
|
||||||
], |
|
||||||
"development": [ |
|
||||||
"last 1 chrome version", |
|
||||||
"last 1 firefox version", |
|
||||||
"last 1 safari version" |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,18 +0,0 @@ |
|||||||
<!DOCTYPE html> |
|
||||||
<html lang="de"> |
|
||||||
<head> |
|
||||||
<meta charset="utf-8" /> |
|
||||||
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" /> |
|
||||||
<meta |
|
||||||
name="viewport" |
|
||||||
content="minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no" |
|
||||||
/> |
|
||||||
<meta name="theme-color" content="#000000" /> |
|
||||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> |
|
||||||
<title>Lernsituation</title> |
|
||||||
</head> |
|
||||||
<body> |
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript> |
|
||||||
<div id="root"></div> |
|
||||||
</body> |
|
||||||
</html> |
|
||||||
@ -1,15 +0,0 @@ |
|||||||
{ |
|
||||||
"short_name": "Lernsituation", |
|
||||||
"name": "EVA_Lernsituation", |
|
||||||
"icons": [ |
|
||||||
{ |
|
||||||
"src": "favicon.ico", |
|
||||||
"sizes": "64x64 32x32 24x24 16x16", |
|
||||||
"type": "image/x-icon" |
|
||||||
} |
|
||||||
], |
|
||||||
"start_url": ".", |
|
||||||
"display": "standalone", |
|
||||||
"theme_color": "#000000", |
|
||||||
"background_color": "#ffffff" |
|
||||||
} |
|
||||||
@ -1,24 +0,0 @@ |
|||||||
import React, { Component } from "react"; |
|
||||||
import CssBaseline from "@material-ui/core/CssBaseline"; |
|
||||||
import { BrowserRouter as Router, Route, Link } from "react-router-dom"; |
|
||||||
import Login from "./Login.js"; |
|
||||||
import { Box } from "@material-ui/core"; |
|
||||||
|
|
||||||
|
|
||||||
class App extends Component { |
|
||||||
state = {}; |
|
||||||
render() { |
|
||||||
return ( |
|
||||||
<Router> |
|
||||||
<CssBaseline></CssBaseline> |
|
||||||
<Box
|
|
||||||
flexDirection="column" |
|
||||||
width="100%" |
|
||||||
> |
|
||||||
<Route path="/login" component={Login}/> |
|
||||||
</Box> |
|
||||||
</Router>); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
export default App; |
|
||||||
@ -1,47 +0,0 @@ |
|||||||
import React, { Component } from "react"; |
|
||||||
import TextField from '@material-ui/core/TextField'; |
|
||||||
import { makeStyles } from '@material-ui/core/styles'; |
|
||||||
|
|
||||||
const useStyles = makeStyles(theme => ({ |
|
||||||
form: { |
|
||||||
width: "90%", |
|
||||||
} |
|
||||||
})); |
|
||||||
|
|
||||||
class Login extends Component { |
|
||||||
state = {}; |
|
||||||
classes = useStyles(); |
|
||||||
|
|
||||||
render() { |
|
||||||
return ( |
|
||||||
<form className={this.classes.form}> |
|
||||||
<TextField |
|
||||||
variant="outlined" |
|
||||||
margin="normal" |
|
||||||
required |
|
||||||
fullWidth |
|
||||||
id="email" |
|
||||||
label="Email Address" |
|
||||||
name="email" |
|
||||||
autoComplete="email" |
|
||||||
autoFocus |
|
||||||
> |
|
||||||
</TextField> |
|
||||||
<TextField |
|
||||||
type="password" |
|
||||||
variant="outlined" |
|
||||||
margin="normal" |
|
||||||
required |
|
||||||
fullWidth |
|
||||||
id="password" |
|
||||||
label="Password" |
|
||||||
name="password" |
|
||||||
autoComplete="password" |
|
||||||
> |
|
||||||
</TextField> |
|
||||||
</form> |
|
||||||
) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
export default Login; |
|
||||||
@ -1,6 +0,0 @@ |
|||||||
import React from "react"; |
|
||||||
import ReactDOM from "react-dom"; |
|
||||||
import "./style/index.css"; |
|
||||||
import App from "./components/App"; |
|
||||||
|
|
||||||
ReactDOM.render(<App />, document.getElementById("root")); |
|
||||||
@ -1,14 +0,0 @@ |
|||||||
body { |
|
||||||
margin: 0; |
|
||||||
padding: 0; |
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", |
|
||||||
"Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", |
|
||||||
sans-serif; |
|
||||||
-webkit-font-smoothing: antialiased; |
|
||||||
-moz-osx-font-smoothing: grayscale; |
|
||||||
} |
|
||||||
|
|
||||||
code { |
|
||||||
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", |
|
||||||
monospace; |
|
||||||
} |
|
||||||
|
Before Width: | Height: | Size: 36 KiB |
@ -1,47 +0,0 @@ |
|||||||
<diagram program="umletino" version="14.3.0"><zoom_level>10</zoom_level><help_text></help_text><element><id>UMLClass</id><coordinates><x>5</x><y>30</y><w>240</w><h>190</h></coordinates><panel_attributes>Person |
|
||||||
<<abstract>> |
|
||||||
-- |
|
||||||
_Id_ |
|
||||||
Name, Vorname |
|
||||||
Preisklasse |
|
||||||
Geburtsdatum, Geburtsort |
|
||||||
PLZ, Ort, Strasse, Hausnummer |
|
||||||
Telefon, EMail |
|
||||||
Bankname |
|
||||||
BLZ |
|
||||||
KontoNr</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>5</x><y>250</y><w>100</w><h>30</h></coordinates><panel_attributes>Schueler</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>145</x><y>250</y><w>100</w><h>50</h></coordinates><panel_attributes>Dozent |
|
||||||
-- |
|
||||||
Stundensatz</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>184</x><y>210</y><w>30</w><h>60</h></coordinates><panel_attributes>lt=<<-</panel_attributes><additional_attributes>10;10;10;40</additional_attributes></element><element><id>Relation</id><coordinates><x>44</x><y>210</y><w>30</w><h>60</h></coordinates><panel_attributes>lt=<<-</panel_attributes><additional_attributes>10;10;10;40</additional_attributes></element><element><id>UMLClass</id><coordinates><x>64</x><y>411</y><w>120</w><h>130</h></coordinates><panel_attributes>Kurs |
|
||||||
-- |
|
||||||
_Id_ |
|
||||||
*Name* |
|
||||||
*Preis* |
|
||||||
Laufzeit |
|
||||||
Kuendigungsfrist |
|
||||||
Bestaetigt</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>514</x><y>321</y><w>100</w><h>80</h></coordinates><panel_attributes>Raum |
|
||||||
-- |
|
||||||
_Nr_ |
|
||||||
Name |
|
||||||
Belegt</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>344</x><y>411</y><w>100</w><h>120</h></coordinates><panel_attributes>Unterricht |
|
||||||
-- |
|
||||||
_Id_ |
|
||||||
Name |
|
||||||
Anfangszeit |
|
||||||
Endzeit |
|
||||||
</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>134</x><y>291</y><w>80</w><h>140</h></coordinates><panel_attributes>m1=1 |
|
||||||
m2=0..n</panel_attributes><additional_attributes>60;10;10;120</additional_attributes></element><element><id>Relation</id><coordinates><x>44</x><y>271</y><w>90</w><h>160</h></coordinates><panel_attributes>m1=0..n |
|
||||||
m2=1..n</panel_attributes><additional_attributes>10;10;60;140</additional_attributes></element><element><id>Relation</id><coordinates><x>174</x><y>451</y><w>190</w><h>40</h></coordinates><panel_attributes>m1=1..n |
|
||||||
m2=1</panel_attributes><additional_attributes>170;10;10;10</additional_attributes></element><element><id>Relation</id><coordinates><x>434</x><y>391</y><w>160</w><h>100</h></coordinates><panel_attributes>m1=1 |
|
||||||
m2=1..n</panel_attributes><additional_attributes>130;10;130;70;10;70</additional_attributes></element><element><id>UMLClass</id><coordinates><x>64</x><y>590</y><w>120</w><h>70</h></coordinates><panel_attributes>UnterrichtTyp |
|
||||||
<<enum>> |
|
||||||
-- |
|
||||||
Einzel |
|
||||||
Gruppe</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>114</x><y>531</y><w>50</w><h>80</h></coordinates><panel_attributes>*Typ*</panel_attributes><additional_attributes>10;60;10;10</additional_attributes></element><element><id>UMLClass</id><coordinates><x>344</x><y>181</y><w>100</w><h>120</h></coordinates><panel_attributes>Instrument |
|
||||||
<<enum>> |
|
||||||
-- |
|
||||||
Klavier |
|
||||||
Schlagzeug |
|
||||||
Geige |
|
||||||
Gitarre</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>434</x><y>241</y><w>160</w><h>100</h></coordinates><panel_attributes>m1=1..n |
|
||||||
m2=1</panel_attributes><additional_attributes>10;10;130;10;130;80</additional_attributes></element><element><id>Relation</id><coordinates><x>234</x><y>271</y><w>130</w><h>40</h></coordinates><panel_attributes>m1=1..n |
|
||||||
m2=0..n</panel_attributes><additional_attributes>110;10;10;10</additional_attributes></element></diagram> |
|
||||||
Binary file not shown.
Binary file not shown.
@ -1,11 +0,0 @@ |
|||||||
# Rollenverteilung |
|
||||||
|
|
||||||
* Teamleitung ( Levin, Alexej ) |
|
||||||
* Aufgbenverteilung |
|
||||||
* Kommuniktion Organisieren (intern und mit Kunden) |
|
||||||
* Probleme lösen (intern und extern) |
|
||||||
* Übernimmt Controlling Aufgaben |
|
||||||
* Prozessbeobachtung ( Tobi ) |
|
||||||
* Diverse Geschehen beobachten und chronologisch dokumentieren |
|
||||||
* Entwickler ( alle ) |
|
||||||
* Entwicklung |
|
||||||
@ -1,21 +0,0 @@ |
|||||||
# 2019-05-08 Protokoll |
|
||||||
|
|
||||||
_Teilnehmer: Levin Faber, Alexej Komnik, Tobias Schiffarth, Kai Senkowski_ |
|
||||||
|
|
||||||
_Ort: Schule_ |
|
||||||
|
|
||||||
## Agenda |
|
||||||
* Rollenverteilung |
|
||||||
* Kommunikationsplan besprechen |
|
||||||
* Was ist unser erstes Todo |
|
||||||
* Brainstroming |
|
||||||
* Fragenkatalog erstellen |
|
||||||
|
|
||||||
## Ergebnisse |
|
||||||
* Im Vorlauf wurde ein Projektportfolio auf GitLab eingerichtet |
|
||||||
* Ein Rollenplan wurde erstellt |
|
||||||
* Der KP wurde besprochen |
|
||||||
* Erstes ToDo ist: MindMap erstellen |
|
||||||
|
|
||||||
## Resultierende Aufgaben |
|
||||||
* Keine |
|
||||||
@ -1,41 +0,0 @@ |
|||||||
# 2019-05-15 Protokoll |
|
||||||
|
|
||||||
_Teilnehmer: Levin Faber, Alexej Komnik, Tobias Schiffarth, Kai Senkowski_ |
|
||||||
|
|
||||||
_Ort: Schule_ |
|
||||||
|
|
||||||
## Agenda |
|
||||||
* Papierprototyp |
|
||||||
* Pflichtenheft |
|
||||||
* ER-Diagram |
|
||||||
* Endpoints für Kommunikation zwischen FE und BE |
|
||||||
* Fragenkatalog erstellen |
|
||||||
* Verwendete Techniken |
|
||||||
* Programmiersprachen |
|
||||||
* Frameworks |
|
||||||
* Docker |
|
||||||
* Datenbank |
|
||||||
|
|
||||||
## Ergebnisse |
|
||||||
* Verwendete Techniken |
|
||||||
* Frontend |
|
||||||
* UI Library "React" (Version 16.8.6) |
|
||||||
* Designvorlage "Material UI" (Version 3) |
|
||||||
* Backend |
|
||||||
* C# mit ASP.NET Core WebAPI (Version 2.1) |
|
||||||
* EntityFrameworkCore (Version 6) |
|
||||||
* SQLite Datenbank für EntityFrameworkCore (Version 2.1) |
|
||||||
* Infrastruktur |
|
||||||
* Docker (Version 18.09.6) |
|
||||||
* Codeverwaltung Gitlab (Gitlab Cloud) |
|
||||||
### Fragenkatalog |
|
||||||
* Öffnungszeiten |
|
||||||
* Arbeitszeiten |
|
||||||
* Donzenten anlegen |
|
||||||
|
|
||||||
## Resultierende Aufgaben |
|
||||||
|Aufgabe|Verantwortlicher|Erledigt| |
|
||||||
|-|-|-| |
|
||||||
|Papierprototyp erstellen und im nächsten Metting weiter besprechen|Kai, Levin|| |
|
||||||
|Erstellung ER-Diagram und im nächsten Meeting weiter besprechen|Alexej, Tobias|| |
|
||||||
|Erstellung Pflichtenheft und Definition der Endpoints nach Besprechung von Papierprototyp und ER-Diagram||| |
|
||||||
Loading…
Reference in new issue