Readme
122
README.md
@@ -1,30 +1,116 @@
|
||||
# EventMaster
|
||||
<p align="center">
|
||||
<img src="misc/images/logo.png" width="300" />
|
||||
</p>
|
||||
|
||||
The most hackable Ticket-Shop!
|
||||
<h1 align="center">EventMaster</h1>
|
||||
<h2 align="center">The most hackable Ticket-Shop!</h2>
|
||||
|
||||

|
||||
|
||||
## About the project
|
||||
|
||||
EventMaster is a desktop application for simulating various hacking methods for web applications. It's the perfect tool to understand vulnerabilities in modern web applications.
|
||||
|
||||
The shop offers tickets for concerts of popular bands with a complete ordering system, account management and admin interface. The program has been deliberately provided with vulnerabilities for teaching purposes, e.g. SQL injections. If a task is solved and a vulnerability is identified, the system provides visual feedback. The progress can be viewed on an overview page.
|
||||
|
||||
This project is created during my Bachelor thesis. It will be used at Leibniz University Hannover for foundation lectures.
|
||||
|
||||
## Important notes!
|
||||
- ⚠️ The project is under development, bugs may occur
|
||||
- ⚠️ The software is developed for educational purposes, don't use the attack techniques without permission on other applications and systems!
|
||||
- ⚠️ Works 100% offline, no data transmission to or from external services
|
||||
|
||||
## Features
|
||||
- 13 exercises
|
||||
- 3 attack techniques
|
||||
- SQL-Injections
|
||||
- Cross-Site-Scripting
|
||||
- Broken Access Control
|
||||
- Exercise control system - check the progress and get feedback for solved exercises!
|
||||
- Full working ticket shop:
|
||||
- Vuetify design
|
||||
- Account management system
|
||||
- Order process system
|
||||
- Event locations with seat plan and seat reservation system during ordering process
|
||||
- Global search
|
||||
- Admin panel
|
||||
- Product pages
|
||||
- ExpressJs-Backend server
|
||||
- REST-API
|
||||
- SQLite Database
|
||||
- URL simulation bar for electron application
|
||||
- Works 100% offline
|
||||
- Multi language support (German, English)
|
||||
- Dark/Light-Mode
|
||||
- Exercise progress PDF generation
|
||||
- API-Documentation with Swagger
|
||||
- Desktop application packed with Electron
|
||||
- Database can be resetted complete or partially
|
||||
|
||||
### Techstack
|
||||
|
||||
- Axios
|
||||
- Electron
|
||||
- Electron Builder
|
||||
- Express.js
|
||||
- JsonWebToken
|
||||
- jspdf
|
||||
- Moment.js
|
||||
- NPM
|
||||
- Nodemon
|
||||
- Pinia
|
||||
- Sequelize
|
||||
- SQLite 3
|
||||
- Swagger
|
||||
- TypeScript
|
||||
- Vite
|
||||
- Vue i18n
|
||||
- Vue.js
|
||||
- VueRouter
|
||||
- Vuetify
|
||||
|
||||
### Planned features
|
||||
|
||||
- More attack techniques
|
||||
- More exercises
|
||||
- More languages
|
||||
- Customize the offered set of exercises (for trainer)
|
||||
- Image license view system (currently only in admin panel)
|
||||
|
||||
### Screenshots
|
||||
|
||||
#### Band Detail page
|
||||

|
||||
|
||||
#### Booking page
|
||||

|
||||
|
||||
#### Admin panel
|
||||

|
||||
|
||||
#### Global search
|
||||

|
||||
|
||||
#### Feedback on exercise solution
|
||||

|
||||
|
||||
## How to use
|
||||
|
||||
### Prepare development environment
|
||||
### Download pre-builded images
|
||||
|
||||
1. Install node.js
|
||||
Go to releases and download one of the pre-builded images for your operating system.
|
||||
|
||||
```bash
|
||||
sudo apt install npm
|
||||
### Build yourself
|
||||
|
||||
# If outdated version:
|
||||
sudo npm install -g n
|
||||
sudo n stable
|
||||
```
|
||||
|
||||
2. Download + extract the project
|
||||
3. Open the root folder with VS Code (recommended)
|
||||
4. Open the bash inside VS Code and install all necessary packages:
|
||||
1. Download + extract the project
|
||||
2. Open the root folder with VS Code (recommended)
|
||||
3. Open the bash inside VS Code and install all necessary packages:
|
||||
|
||||
```bash
|
||||
npm i
|
||||
```
|
||||
|
||||
### Test/development
|
||||
#### Test/development
|
||||
|
||||
There are multiple commands to test parts or the whole project:
|
||||
|
||||
@@ -34,7 +120,7 @@ There are multiple commands to test parts or the whole project:
|
||||
|
||||
The frontend runs on `http://localhost:5173/` and the backend on `http://localhost:3000/`
|
||||
|
||||
### Build
|
||||
#### Build
|
||||
|
||||
- `npm run vite:build`: Build Vue frontend only
|
||||
- `npm run server:build`: Build ExpressJs backend only
|
||||
@@ -47,3 +133,7 @@ The frontend runs on `http://localhost:5173/` and the backend on `http://localho
|
||||
|
||||
### Database
|
||||

|
||||
|
||||
### Frontend-Backend-System
|
||||
|
||||

|
||||
|
||||
84
misc/frontend-backend-system.drawio
Normal file
@@ -0,0 +1,84 @@
|
||||
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.0.9 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="26.0.9">
|
||||
<diagram name="Page-1" id="6ideKt-3XiqBCAVgAsyQ">
|
||||
<mxGraphModel dx="1195" dy="689" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-49" value="Frontend" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="90" width="400" height="220" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-52" value="Subpage<div>"All Bands"</div>" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="50" y="120" width="150" height="180" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-50" value="Backend" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="630" y="90" width="210" height="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-55" value="API Endpoint" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="650" y="120" width="170" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-46" value="bandStore" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="270" y="120" width="160" height="160" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-70" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#00CC00;" parent="1" source="KDqfIFqn06qLZiIO6-10-47" target="KDqfIFqn06qLZiIO6-10-65" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-71" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#00CC00;" parent="1" source="KDqfIFqn06qLZiIO6-10-47" target="KDqfIFqn06qLZiIO6-10-66" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-73" value="<font color="#00cc00">Handles</font><div><font color="#00cc00">changes</font></div>" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#00CC00;" parent="1" source="KDqfIFqn06qLZiIO6-10-47" target="KDqfIFqn06qLZiIO6-10-72" edge="1">
|
||||
<mxGeometry x="0.168" y="24" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-47" value="bands" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="290" y="230" width="120" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-59" value="<div style=""><font style="color: rgb(204, 0, 0);">Stores</font></div><div style=""><font style="color: rgb(204, 0, 0);">results</font></div>" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;align=left;fillColor=#e51400;strokeColor=#B20000;" parent="1" source="KDqfIFqn06qLZiIO6-10-48" target="KDqfIFqn06qLZiIO6-10-47" edge="1">
|
||||
<mxGeometry x="-0.2" y="10" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-67" value="<font style="color: rgb(0, 29, 188);">requests</font>" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;verticalAlign=bottom;fillColor=#0050ef;strokeColor=#001DBC;" parent="1" source="KDqfIFqn06qLZiIO6-10-48" target="KDqfIFqn06qLZiIO6-10-56" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-48" value="getBands()" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="290" y="150" width="120" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-53" value="<font color="#bd7000">Call function</font>" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;verticalAlign=bottom;fillColor=#f0a30a;strokeColor=#BD7000;" parent="1" source="KDqfIFqn06qLZiIO6-10-52" target="KDqfIFqn06qLZiIO6-10-48" edge="1">
|
||||
<mxGeometry x="-0.2148" y="7" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-68" value="<font style="color: rgb(0, 87, 0);">send http code &amp;</font><div><span style="color: light-dark(rgb(0, 87, 0), rgb(0, 87, 0)); background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));">data sets</span></div>" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;verticalAlign=top;fillColor=#008a00;strokeColor=#005700;" parent="1" source="KDqfIFqn06qLZiIO6-10-56" target="KDqfIFqn06qLZiIO6-10-48" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-56" value="/bands" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="670" y="150" width="120" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-63" value="<font style="color: rgb(0, 153, 153);">get raw</font><div><font color="#009999">datasets</font></div>" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.855;exitY=0;exitDx=0;exitDy=4.35;exitPerimeter=0;align=left;strokeColor=#009999;" parent="1" source="KDqfIFqn06qLZiIO6-10-61" edge="1">
|
||||
<mxGeometry x="-0.2154" y="-9" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
<mxPoint x="751" y="180" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-61" value="DB" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" parent="1" vertex="1">
|
||||
<mxGeometry x="700" y="280" width="60" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-62" value="<font style="color: rgb(255, 0, 255);">sends</font><div><font style="color: rgb(255, 0, 255);">SQL</font></div><div><font style="color: rgb(255, 0, 255);">command</font></div>" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.321;exitY=1.017;exitDx=0;exitDy=0;entryX=0.145;entryY=0;entryDx=0;entryDy=4.35;entryPerimeter=0;align=right;strokeColor=#FF00FF;exitPerimeter=0;" parent="1" source="KDqfIFqn06qLZiIO6-10-56" target="KDqfIFqn06qLZiIO6-10-61" edge="1">
|
||||
<mxGeometry x="0.2159" y="-9" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-65" value="Coldplay" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="65" y="170" width="120" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-66" value="Muse" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="65" y="210" width="120" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="KDqfIFqn06qLZiIO6-10-72" value="Radiohead" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="65" y="250" width="120" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
@@ -1,181 +0,0 @@
|
||||
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.17">
|
||||
<diagram name="Page-1" id="z4ePnmX8JLkG3N1GDPOr">
|
||||
<mxGraphModel dx="1783" dy="1720" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-1" target="Fk8QGSgGJ1bhqam2HO4i-3" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-1" target="Fk8QGSgGJ1bhqam2HO4i-15" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="fY-Wzga6seKQwhded4A5-7">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="-360" y="700" as="targetPoint" />
|
||||
<mxPoint x="-720" y="240" as="sourcePoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="-720" y="540" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-1" target="Fk8QGSgGJ1bhqam2HO4i-13">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-1" target="fY-Wzga6seKQwhded4A5-8">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="-680" y="-20" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="-720" y="-20" />
|
||||
<mxPoint x="-680" y="-20" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-1" target="fY-Wzga6seKQwhded4A5-1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-1" target="Fk8QGSgGJ1bhqam2HO4i-14">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-1" target="Fk8QGSgGJ1bhqam2HO4i-4">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-1" value="Homepage<div><font face="Courier New"><b>/</b></font></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-800" y="-120" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-2" target="Fk8QGSgGJ1bhqam2HO4i-9">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-2" target="Fk8QGSgGJ1bhqam2HO4i-8">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-2" target="Fk8QGSgGJ1bhqam2HO4i-7">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;fillColor=#6d8764;strokeColor=#3A5431;" edge="1" parent="1" target="Fk8QGSgGJ1bhqam2HO4i-2">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="-679.6666666666667" y="70" as="targetPoint" />
|
||||
<mxPoint x="-680" y="-20" as="sourcePoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-2" target="fY-Wzga6seKQwhded4A5-42">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-2" value="AccountHomePage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/account</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-600" y="-40" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-3" target="Fk8QGSgGJ1bhqam2HO4i-5">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-3" value="BandsPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/bands</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-600" y="280" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-4" value="PreferencesPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/preferences</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-600" y="600" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-5" target="fY-Wzga6seKQwhded4A5-5">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="-280" y="330" />
|
||||
<mxPoint x="-280" y="330" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-5" value="BandDetailPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/bands/detail/:bandName</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-360" y="280" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;fillColor=#e51400;strokeColor=#B20000;" edge="1" parent="1" target="Fk8QGSgGJ1bhqam2HO4i-7">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="-200" y="-220" as="targetPoint" />
|
||||
<mxPoint x="-680" y="-20" as="sourcePoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="-680" y="140" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-7" value="LoginPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/account/login</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-360" y="120" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-8" value="AccountData<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/account/data</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-360" y="40" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-9" value="OrdersPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/account/orders</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-360" y="-40" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-13" value="AdminHome<span style="background-color: initial;">Page</span><div><div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/admin</font></b><br></div></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-600" y="760" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-14" value="HelpPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/help</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-600" y="680" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-15" target="Fk8QGSgGJ1bhqam2HO4i-16">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-15" value="LocationsPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/locations</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-600" y="440" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="Fk8QGSgGJ1bhqam2HO4i-16" target="fY-Wzga6seKQwhded4A5-5">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="-280" y="420" />
|
||||
<mxPoint x="-280" y="420" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="Fk8QGSgGJ1bhqam2HO4i-16" value="LocationsDetailPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/locations/detail/:name</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-360" y="440" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="fY-Wzga6seKQwhded4A5-1" target="fY-Wzga6seKQwhded4A5-5">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-1" value="ConcertsPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/concerts</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="-600" y="360" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-3" value="if logged in" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="-680" y="-60" width="80" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-4" value="else" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="-690" y="110" width="80" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="fY-Wzga6seKQwhded4A5-5" target="fY-Wzga6seKQwhded4A5-7">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="-160" y="380" />
|
||||
<mxPoint x="-160" y="540" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-5" value="ConcertsBookingPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/concerts/booking/:id</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="-360" y="360" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-7" value="BasketPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/basket</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="-600" y="520" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="fY-Wzga6seKQwhded4A5-8" target="Fk8QGSgGJ1bhqam2HO4i-5">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="fY-Wzga6seKQwhded4A5-8" target="fY-Wzga6seKQwhded4A5-5">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="fY-Wzga6seKQwhded4A5-8" target="Fk8QGSgGJ1bhqam2HO4i-16">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-8" value="SearchPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/search</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="-600" y="200" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-14" value="if ticket add to basket" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="-290" y="510" width="130" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-29" value="on log out" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="-460" y="90" width="60" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fY-Wzga6seKQwhded4A5-42" value="AccountRatingsPage<div><b style="font-family: &quot;Courier New&quot;;"><font style="font-size: 10px;">/account/ratings</font></b><br></div>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="-360" y="-120" width="160" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
BIN
misc/images/admin-panel.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
misc/images/band-detail-seite.png
Normal file
|
After Width: | Height: | Size: 11 MiB |
BIN
misc/images/booking-concert.png
Normal file
|
After Width: | Height: | Size: 133 KiB |
BIN
misc/images/frontend-backend-system.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
misc/images/homepage.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
misc/images/logo.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
misc/images/search.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
misc/images/snackbar-feedback.png
Normal file
|
After Width: | Height: | Size: 11 KiB |