Compare commits
4 Commits
8c70cce8a2
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 50f4af92ea | |||
| a4eeb8430d | |||
| 0267789f49 | |||
|
|
c37d89c2f5 |
200
README.md
200
README.md
@@ -1,31 +1,37 @@
|
|||||||
# 🗂️ 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 │
|
||||||
@@ -39,48 +45,50 @@ Jedes Repository, das auf dieser Gitea-Instanz mit dem Topic-Tag `dashboard` ver
|
|||||||
└──────────────────────┘
|
└──────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
## 🖥️ 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,43 +98,36 @@ 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,
|
||||||
@@ -134,7 +135,7 @@ CREATE TABLE projects (
|
|||||||
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,
|
||||||
@@ -142,7 +143,7 @@ CREATE TABLE projects (
|
|||||||
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,
|
||||||
@@ -154,7 +155,7 @@ CREATE TABLE issues (
|
|||||||
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),
|
||||||
@@ -163,47 +164,38 @@ CREATE TABLE webhook_events (
|
|||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 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
16
controllers/fortnite.go
Normal 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
BIN
gitea-projekt-dashboard
Executable file
Binary file not shown.
22
go.mod
22
go.mod
@@ -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
56
go.sum
Normal 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=
|
||||||
@@ -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
13
views/fortnite.tpl
Normal 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>
|
||||||
Reference in New Issue
Block a user