Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4780d2545 | ||
|
|
0023313266 | ||
|
|
e68d49abd5 | ||
|
|
0fdac7b2cf | ||
|
|
ade0f8cd88 | ||
|
|
7884f5c57a | ||
|
|
4215bbf9c2 | ||
|
|
9df62d037d | ||
|
|
c08645a294 | ||
|
|
1d49f210c5 | ||
|
|
878c21be4f | ||
|
|
fb9e85552a | ||
|
|
ea2fc7f6f4 | ||
|
|
feca0934a3 | ||
|
|
fd2a2dd345 | ||
|
|
ba700eb050 | ||
|
|
7baa8e2b25 | ||
|
|
1f6ebf5b2e | ||
|
|
1a4b438191 | ||
|
|
51a2599545 | ||
|
|
fe6f2840e9 | ||
|
|
17907a51be | ||
|
|
bfc4b6681b | ||
|
|
85f34dd087 | ||
|
|
f7cdaacceb | ||
|
|
628c1f97c0 | ||
|
|
836c5c5d1c | ||
|
|
4b4517cc4b | ||
|
|
5eab947b8c | ||
|
|
cfc466b92e | ||
|
|
9b04e0ce69 | ||
|
|
f923b34b77 | ||
|
|
b347df7c6e | ||
|
|
9fa2b753ec | ||
|
|
22684fea44 | ||
|
|
24561fba23 | ||
|
|
e2c45c6be0 | ||
|
|
9fbd9a1375 | ||
|
|
d92533ab6a | ||
|
|
c61a628ed4 | ||
|
|
f4d5f54846 | ||
|
|
c2fe6ee3d2 | ||
|
|
20b9a59257 | ||
|
|
cb86720b13 | ||
|
|
5124ec4e6d | ||
|
|
860432ead3 | ||
|
|
af26e64ad8 | ||
|
|
b7291577b7 | ||
|
|
9875b99631 | ||
|
|
47992b92c9 | ||
|
|
c5d18218c0 | ||
|
|
18235c4e4c | ||
|
|
d762a9d8ab | ||
|
|
2c9b2cc509 | ||
|
|
fbae1b9f3a | ||
|
|
c2a337e051 | ||
|
|
33880069a0 | ||
|
|
b892d93379 | ||
|
|
b06b81f140 | ||
|
|
1088060580 | ||
|
|
07c4b7ba80 | ||
|
|
7e649240ca | ||
|
|
a776431738 | ||
|
|
0844b3d5b5 | ||
|
|
aeb28fe5a7 | ||
|
|
201714403c | ||
|
|
1f9987ba22 | ||
|
|
159b4434df | ||
|
|
98e2a3c3db | ||
|
|
370278fddc | ||
|
|
0c70e43c7d | ||
|
|
e464b52394 | ||
|
|
f8e1a191b3 | ||
|
|
57819f5a2f | ||
|
|
76a98b8a16 | ||
|
|
db72a94468 | ||
|
|
37f9f50da3 | ||
|
|
c5c5a2da8b | ||
|
|
093eba9af6 | ||
|
|
376a4ec385 | ||
|
|
d0d4c469fb | ||
|
|
048a8c30ff | ||
|
|
cf9a888a97 | ||
|
|
4b43757dd4 | ||
|
|
9140765772 | ||
|
|
780ab85a9e | ||
|
|
b1b731f3d3 | ||
|
|
18a7814747 | ||
|
|
ff36345382 | ||
|
|
7fc1f45574 | ||
|
|
b490d058e4 | ||
|
|
60a9cea147 | ||
|
|
3204e4a658 | ||
|
|
60e217db03 | ||
|
|
7b991d2ff8 | ||
|
|
8f0de99634 | ||
|
|
8e7c9a949d | ||
|
|
461bc753e6 | ||
|
|
ba752fa906 | ||
|
|
5f8adbaf10 | ||
|
|
8d78a9eeb7 | ||
|
|
23b9fa3dd2 | ||
|
|
48bfcc9c75 | ||
|
|
f81e9be320 | ||
|
|
4a62c7a96b | ||
|
|
c050560fba | ||
|
|
c54e6f3743 | ||
|
|
a676ce3d86 | ||
|
|
519fa210e9 | ||
|
|
e0a8748184 | ||
|
|
0cf0c6be76 | ||
|
|
ed4fa90f75 | ||
|
|
c611cc04fc | ||
|
|
2b7e87a68d | ||
|
|
2cbee721c7 | ||
|
|
6c8d8dadaf | ||
|
|
142d574f78 | ||
|
|
04678f9913 | ||
|
|
f898c0c5b9 | ||
|
|
422a5e1722 | ||
|
|
4bcc2b86d5 | ||
|
|
9b325c849e | ||
|
|
848e7abf92 | ||
|
|
2977c73a10 | ||
|
|
e3863058a0 | ||
|
|
941fd711d5 | ||
|
|
f5204578e4 | ||
|
|
787c5a61e5 | ||
|
|
080610cd7e | ||
|
|
f41cf1ba90 | ||
|
|
cbd01f6d59 | ||
|
|
e00107ab6a | ||
|
|
14da64ecbe | ||
|
|
76c5e953a1 | ||
|
|
03ff8b402f | ||
|
|
22d3e8d177 | ||
|
|
0b34174ce9 | ||
|
|
8395b4427d | ||
|
|
87f3516b54 | ||
|
|
6aae064902 | ||
|
|
a55248ecef | ||
|
|
98cc551f76 | ||
|
|
eb84351231 | ||
|
|
1f48ec6ae1 | ||
|
|
c27dc747b7 | ||
|
|
871f8cac7a | ||
|
|
88c43d62c6 | ||
|
|
58fcae647a | ||
|
|
fbefa52e01 | ||
|
|
ddc96bac13 | ||
|
|
fbbfcdf365 | ||
|
|
a254f99404 | ||
|
|
5134a9df31 | ||
|
|
0c20ef4366 | ||
|
|
463b49ba93 | ||
|
|
ee07a5a5af | ||
|
|
628d1e7bee | ||
|
|
c9a80a0a74 | ||
|
|
5a1b28dd60 | ||
|
|
40586f18b2 | ||
|
|
dff6992db3 | ||
|
|
b577ddf47d | ||
|
|
ed99709afd | ||
|
|
3f061f0136 | ||
|
|
b585ceb81b | ||
|
|
53d079c95f | ||
|
|
c1208b5762 | ||
|
|
5fdf9315c9 | ||
|
|
4662a929a0 | ||
|
|
6464521b04 | ||
|
|
7ca15a66b3 | ||
|
|
955758ec4c | ||
|
|
64f3769953 | ||
|
|
4ec710e899 | ||
|
|
36c5e5b583 |
@@ -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
|
||||
|
||||

|
||||
|
||||
@@ -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>
|
||||
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 11 MiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 11 KiB |