Compare commits

..

4 Commits

Author SHA1 Message Date
50f4af92ea Update README.md 2026-05-13 08:39:38 +00:00
a4eeb8430d put right link in the warning
put right link in warning
2026-05-06 09:43:35 +00:00
0267789f49 README: Projekt pausiert – eigene Lösung in Entwicklung 2026-05-06 09:35:58 +00:00
Jannis Heydemann
c37d89c2f5 tried out bee, will replace with own solution 2026-05-06 11:28:17 +02:00
7 changed files with 242 additions and 142 deletions

276
README.md
View File

@@ -1,86 +1,94 @@
# 🗂️ Gitea Projekt-Dashboard # 🗂️ Gitea Project Dashboard
Ein selbst gehostetes Dashboard zur zentralen Verwaltung aller persönlichen Projekte technische wie nicht-technische. Projekte können mit einer Gitea-Repository verknüpft sein, müssen es aber nicht. > [!WARNING]
> **⏸️ Project paused**
>
> This project is currently paused. I am continuing to develop my own solution to replace Beego. Once my own web framework is far enough along, this project will be rebuilt with it.
>
> 👉 **Own solution in development:** [go-webframework](https://gitea.starfour.de/Jannis/go-webframework)
A self-hosted dashboard for centrally managing all personal projects technical and non-technical alike. Projects can be linked to a Gitea repository, but don't have to be.
--- ---
## 🏷️ Funktionsprinzip: Tag-basierte Projektanzeige ## 🏷️ How It Works: Tag-Based Project Display
Jedes Repository, das auf dieser Gitea-Instanz mit dem Topic-Tag `dashboard` versehen ist, wird automatisch im Dashboard angezeigt. Every repository on this Gitea instance that has the topic tag `dashboard` is automatically shown in the dashboard.
### So funktioniert es: ### How it works:
1. In a Gitea repository, go to **Settings → Topics** and add the tag `dashboard`
2. The backend service polls the Gitea API regularly (or via webhook) for all repos with this tag
3. The found repos are stored and cached in the PostgreSQL database
4. The frontend displays all tagged repos as project cards with live data
1. Du setzt in einem Gitea-Repository unter **Settings → Topics** das Tag `dashboard` > **Example:** Repo `my-project` gets the topic `dashboard` → immediately appears in the dashboard with issues, last commit, status, and description.
2. Der Backend-Service pollt regelmäßig (oder per Webhook) die Gitea API nach allen Repos mit diesem Tag
3. Die gefundenen Repos werden in der PostgreSQL-Datenbank gespeichert und gecacht
4. Das Frontend zeigt alle getaggten Repos als Projektkarten mit Live-Daten an
> **Beispiel:** Repo `mein-projekt` bekommt das Topic `dashboard` → erscheint sofort im Dashboard mit Issues, letztem Commit, Status und Beschreibung.
--- ---
## 🧱 Architektur ## 🧱 Architecture
``` ```
┌─────────────────┐ Gitea REST API v1 ┌──────────────────────┐ ┌─────────────────┐ Gitea REST API v1 ─────────────────────┐
Gitea Server │ ◄────────────────────────► │ Backend Service │ Gitea Server │ ◄────────────────────► │ Backend Service │
│ (Repos + Topics)│ │ (Go, net/http) │ (Repos + Topics)│ │ (Go, net/http) │
└─────────────────┘ └──────────┬────────── └─────────────────┘ └──────────┬──────────┘
┌──────────▼───────────┐ ┌──────────▼───────────┐
│ PostgreSQL DB PostgreSQL DB │
│ (Repos, Issues, (Repos, Issues, │
│ Milestones, Cache) │ │ Milestones, Cache) │
└──────────┬───────────┘ └──────────┬───────────┘
┌──────────▼───────────┐ ┌──────────▼───────────┐
Frontend Frontend │
│ (SvelteKit) (SvelteKit) │
└──────────────────────┘ └──────────────────────┘
``` ```
--- ## 🖥️ Frontend: SvelteKit
## 🖥️ Frontend: **SvelteKit** **Why SvelteKit?**
**Warum SvelteKit?** - Lightweight and fast ideal for an internal dashboard
- Leichtgewichtig und schnell ideal für ein internes Dashboard - Server-Side Rendering (SSR) out of the box no flickering on load
- Server-Side Rendering (SSR) out of the box kein Flackern beim Laden - Simple reactivity without overhead
- Einfache Reaktivität ohne Overhead - Perfect for data-driven dashboards with real-time updates via SSE or WebSocket
- Perfekt für datengetriebene Dashboards mit Echtzeit-Updates via SSE oder WebSocket
**Features im Frontend:** **Frontend features:**
- Projektkarten mit Repo-Name, Beschreibung, letztem Commit, offenen Issues
- Filterfunktion nach Topics, Sprache, Aktivität
- Detailansicht: Issues & Milestones direkt im Dashboard bearbeiten (bi-direktional)
- Live-Updates via Webhook-Events (Server-Sent Events)
- Dark Mode, responsive Design
--- - Project cards with repo name, description, last commit, open issues
- Filter function by topics, language, activity
- Detail view: edit issues & milestones directly in the dashboard (bi-directional)
- Live updates via webhook events (Server-Sent Events)
- Dark mode, responsive design
## ⚙️ Backend: **Go (net/http + pgx)** ## ⚙️ Backend: Go (net/http + pgx)
Go eignet sich hervorragend als Backend-Sprache die Standardbibliothek ist so vollständig, dass kein Web-Framework nötig ist. `net/http` liefert alles was gebraucht wird: Routing, Handler, Middleware. Das Ergebnis ist eine dependency-arme, gut lesbare Codebasis. Go is an excellent backend language the standard library is so complete that no web framework is needed. `net/http` provides everything required: routing, handlers, middleware. The result is a dependency-light, readable codebase.
**Warum kein Framework?** **Why no framework?**
- `net/http` aus der Standardbibliothek reicht für ~6 Endpoints vollständig aus
- Kein Framework-Overhead, keine Breaking Changes durch externe Dependencies
- Go-typischer Ansatz: explizit, simpel, lesbar
- Kompiliert zu einer einzigen statischen Binary minimaler Docker-Footprint
**Externe Dependencies (minimal):** - `net/http` from the standard library is fully sufficient for ~6 endpoints
- `pgx` PostgreSQL-Treiber (direktes SQL, kein ORM) - No framework overhead, no breaking changes from external dependencies
- `godotenv` `.env`-Datei laden - The Go-typical approach: explicit, simple, readable
- `golang.org/x/oauth2` OAuth2-Flow für Gitea-Login - Compiles to a single static binary minimal Docker footprint
**Backend-Aufgaben:** **External dependencies (minimal):**
- `GET /api/projects` alle getaggten Repos aus der DB zurückgeben
- `POST /api/webhook` Gitea Webhook-Listener für Push, Issue, Tag-Events - `pgx` PostgreSQL driver (direct SQL, no ORM)
- `GET /api/projects/{id}/issues` Issues eines Repos live aus Gitea holen - `godotenv` load `.env` file
- Hintergrund-Goroutine: alle 5 Minuten Gitea API nach Repos mit Tag `dashboard` abfragen - `golang.org/x/oauth2` OAuth2 flow for Gitea login
- Repo-Daten in PostgreSQL cachen (inkl. Topics, letzter Aktivität, Issue-Count)
**Backend tasks:**
- `GET /api/projects` return all tagged repos from the DB
- `POST /api/webhook` Gitea webhook listener for push, issue, tag events
- `GET /api/projects/{id}/issues` fetch issues for a repo live from Gitea
- Background goroutine: query Gitea API every 5 minutes for repos with tag `dashboard`
- Cache repo data in PostgreSQL (incl. topics, last activity, issue count)
**Example HTTP server without a framework:**
**Beispiel HTTP-Server ohne Framework:**
```go ```go
mux := http.NewServeMux() mux := http.NewServeMux()
mux.HandleFunc("GET /api/projects", h.listProjects) mux.HandleFunc("GET /api/projects", h.listProjects)
@@ -90,120 +98,104 @@ mux.HandleFunc("GET /api/projects/{id}/issues", h.listIssues)
log.Fatal(http.ListenAndServe(":8080", mux)) log.Fatal(http.ListenAndServe(":8080", mux))
``` ```
--- ## 🔐 Auth: Gitea OAuth2
## 🔐 Auth: **Gitea OAuth2** Gitea can act as its own OAuth2 provider users log into the dashboard with their Gitea account, just like "Login with GitHub".
Gitea kann selbst als OAuth2-Provider fungieren Nutzer loggen sich mit ihrem Gitea-Account im Dashboard ein, genau wie "Login with GitHub". **Setup in Gitea:**
1. In Gitea under **Settings → Applications → OAuth2 Applications**, register a new app
2. Enter Client ID and Client Secret in the `.env` file
3. Set the Redirect URI to `https://dashboard.example.com/auth/callback`
### Setup in Gitea: **Flow:**
- User clicks "Login with Gitea"
- → Redirect to Gitea instance (Authorization Endpoint)
- → User confirms access
- → Gitea redirects back with Authorization Code
- → Backend exchanges code for Access Token
- → User is logged in, Gitea identity is known
1. In Gitea unter **Settings → Applications → OAuth2 Applications** eine neue App registrieren **Advantages:**
2. `Client ID` und `Client Secret` in die `.env` eintragen
3. Redirect URI auf `https://dashboard.example.com/auth/callback` setzen
### Flow: - No custom auth system needed Gitea handles passwords and sessions
- User identity directly available → repos and issues can be filtered per user
- Write permissions (create/close issues) only for the respective repo owner
- Implemented with `golang.org/x/oauth2` official Go package, no third-party lib needed
``` ## 🗄️ Database: PostgreSQL
Nutzer klickt "Login mit Gitea"
→ Weiterleitung zur Gitea-Instanz (Authorization Endpoint)
→ Nutzer bestätigt Zugriff
→ Gitea leitet mit Authorization Code zurück
→ Backend tauscht Code gegen Access Token
→ Nutzer ist eingeloggt, Gitea-Identität bekannt
```
**Vorteile:** **Schema overview:**
- Kein eigenes Auth-System nötig Gitea übernimmt Passwörter und Sessions
- Nutzeridentität direkt bekannt → Repos und Issues können nutzerbasiert gefiltert werden
- Schreibrechte (Issues erstellen/schließen) nur für den jeweiligen Repo-Owner
- Implementiert mit `golang.org/x/oauth2` offizielles Go-Paket, keine Drittanbieter-Lib nötig
---
## 🗄️ Datenbank: **PostgreSQL**
**Schema-Übersicht:**
```sql ```sql
-- Gecachte Repo-Informationen -- Cached repo information
CREATE TABLE projects ( CREATE TABLE projects (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
gitea_id INTEGER UNIQUE NOT NULL, gitea_id INTEGER UNIQUE NOT NULL,
name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL,
full_name VARCHAR(255) NOT NULL, full_name VARCHAR(255) NOT NULL,
description TEXT, description TEXT,
html_url TEXT, html_url TEXT,
topics TEXT[], -- z.B. ["dashboard", "freelancer"] topics TEXT[], -- e.g. ["dashboard", "freelancer"]
language VARCHAR(100), language VARCHAR(100),
open_issues INTEGER DEFAULT 0, open_issues INTEGER DEFAULT 0,
last_push TIMESTAMPTZ, last_push TIMESTAMPTZ,
is_private BOOLEAN DEFAULT false, is_private BOOLEAN DEFAULT false,
synced_at TIMESTAMPTZ DEFAULT NOW() synced_at TIMESTAMPTZ DEFAULT NOW()
); );
-- Gemanagte Issues / Aufgaben -- Managed issues / tasks
CREATE TABLE issues ( CREATE TABLE issues (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
gitea_id INTEGER NOT NULL, gitea_id INTEGER NOT NULL,
project_id INTEGER REFERENCES projects(id), project_id INTEGER REFERENCES projects(id),
title TEXT NOT NULL, title TEXT NOT NULL,
state VARCHAR(20), -- open / closed state VARCHAR(20), -- open / closed
assignee VARCHAR(100), assignee VARCHAR(100),
milestone TEXT, milestone TEXT,
updated_at TIMESTAMPTZ updated_at TIMESTAMPTZ
); );
-- Webhook-Event-Log -- Webhook event log
CREATE TABLE webhook_events ( CREATE TABLE webhook_events (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
event_type VARCHAR(50), event_type VARCHAR(50),
payload JSONB, payload JSONB,
received_at TIMESTAMPTZ DEFAULT NOW() received_at TIMESTAMPTZ DEFAULT NOW()
); );
``` ```
---
## 🚀 Roadmap ## 🚀 Roadmap
- v0.1 Repo listing via tag `dashboard`, polling every 5 min
- [ ] **v0.1** Repo-Listing via Tag `dashboard`, Polling alle 5 min - v0.2 Webhook listener for real-time updates
- [ ] **v0.2** Webhook-Listener für Echtzeit-Updates - v0.3 Display issues & milestones in the dashboard
- [ ] **v0.3** Issues & Milestones im Dashboard anzeigen - v0.4 Create/close issues directly from the dashboard (bi-directional)
- [ ] **v0.4** Issues direkt aus dem Dashboard erstellen/schließen (bi-direktional) - v0.5 Gitea OAuth2 login
- [ ] **v0.5** Gitea OAuth2 Login - v0.6 Integration with freelancer dashboard (repos = projects)
- [ ] **v0.6** Verknüpfung mit Freelancer-Dashboard (Repos = Projekte) - v1.0 Multi-user, public project pages
- [ ] **v1.0** Multi-User, öffentliche Projektsseiten
---
## 🔧 Tech Stack ## 🔧 Tech Stack
| Schicht | Technologie | | Layer | Technology |
|--------------|--------------------------------| |----------|-------------------------------------|
| Frontend | SvelteKit + TailwindCSS | | Frontend | SvelteKit + TailwindCSS |
| Backend | Go + net/http (Standardlib) | | Backend | Go + net/http (standard lib) |
| Datenbank | PostgreSQL + pgx | | Database | PostgreSQL + pgx |
| Auth | Gitea OAuth2 + golang.org/x/oauth2 | | Auth | Gitea OAuth2 + golang.org/x/oauth2 |
| API | Gitea REST API v1 | | API | Gitea REST API v1 |
| Deployment | Docker Compose | | Deploy | Docker Compose |
---
## 📦 Getting Started ## 📦 Getting Started
```bash ```bash
# Repo klonen # Clone the repo
git clone https://gitea.starfour.de/Jannis/gitea-projekt-dashboard git clone https://gitea.starfour.de/Jannis/gitea-projekt-dashboard
# Umgebungsvariablen setzen # Set environment variables
cp .env.example .env cp .env.example .env
# GITEA_URL, GITEA_TOKEN, GITEA_CLIENT_ID, GITEA_CLIENT_SECRET, DATABASE_URL, DASHBOARD_TAG eintragen # Fill in GITEA_URL, GITEA_TOKEN, GITEA_CLIENT_ID, GITEA_CLIENT_SECRET, DATABASE_URL, DASHBOARD_TAG
# Mit Docker starten # Start with Docker
docker compose up -d docker compose up -d
``` ```
--- This project is part of the personal project ideas collection. Related overview repo: [projekt-ideen](https://gitea.starfour.de/Jannis/projekt-ideen)
*Dieses Projekt ist Teil der persönlichen Projekt-Ideen-Sammlung. Zugehöriges Übersichts-Repo: [projekt-ideen](https://gitea.starfour.de/Jannis/projekt-ideen)*

16
controllers/fortnite.go Normal file
View File

@@ -0,0 +1,16 @@
package controllers
import (
beego "github.com/beego/beego/v2/server/web"
)
type FortniteController struct {
beego.Controller
}
func (c *FortniteController) Get() {
c.TplName = "fortnite.tpl"
c.Data["fort"] = "nite"
c.Data["nite"] = "fort"
c.Data["testarray"] = "hi"
}

BIN
gitea-projekt-dashboard Executable file

Binary file not shown.

22
go.mod
View File

@@ -3,4 +3,26 @@ module gitea-projekt-dashboard
go 1.26 go 1.26
require github.com/beego/beego/v2 v2.1.0 require github.com/beego/beego/v2 v2.1.0
require github.com/smartystreets/goconvey v1.6.4 require github.com/smartystreets/goconvey v1.6.4
require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.15.1 // indirect
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.42.0 // indirect
github.com/prometheus/procfs v0.9.0 // indirect
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd // indirect
golang.org/x/net v0.7.0 // indirect
golang.org/x/sys v0.6.0 // indirect
golang.org/x/text v0.7.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

56
go.sum Normal file
View File

@@ -0,0 +1,56 @@
github.com/beego/beego/v2 v2.1.0 h1:Lk0FtQGvDQCx5V5yEu4XwDsIgt+QOlNjt5emUa3/ZmA=
github.com/beego/beego/v2 v2.1.0/go.mod h1:6h36ISpaxNrrpJ27siTpXBG8d/Icjzsc7pU1bWpp0EE=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38=
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -7,4 +7,5 @@ import (
func init() { func init() {
beego.Router("/", &controllers.MainController{}) beego.Router("/", &controllers.MainController{})
beego.Router("/fortnite", &controllers.FortniteController{})
} }

13
views/fortnite.tpl Normal file
View File

@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>mörda on mai maind</title>
</head>
<body>
<div>hi!</div>
<div>{{.nite}}{{.fort}}</div>
<div>{{.testarray}}</div>
</body>
</html>