Izmena Readme.md fajla i dodat Readme_sr.md na srpskom
This commit is contained in:
@@ -1,148 +1,88 @@
|
|||||||
# NTech
|
# NTech
|
||||||
|
|
||||||
|
[🇷🇸 Srpska verzija](README.sr.md)
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
Poslovna aplikacija za upravljanje servisom računara, magacinom delova i prodajom. Napravljena u Go-u, radi u brauzeru, ne zahteva internet vezu ni eksterne servise.
|
A business application for computer repair shop management, parts inventory tracking, and sales. Built with Go, it runs in the browser and requires no internet connection or external services.
|
||||||
|
|
||||||
> ⚠️ Projekat je u aktivnom razvoju. Nije spreman za produkcijsku upotrebu.
|
> ⚠️ The project is under active development. It is not ready for production use.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## O projektu
|
## About the Project
|
||||||
|
|
||||||
NTech je interna aplikacija napravljena za konkretnog korisnika — servis računara koji pored popravki vodi i magacin delova, prodaju komponenti i gotovih konfiguracija, te evidenciju klijenata i dobavljača.
|
NTech is an internal application built for a specific user — a computer repair shop that, in addition to repairs, manages a parts inventory, sales of components and pre-built configurations, as well as client and supplier records.
|
||||||
|
|
||||||
Cilj je jednostavan: sve što servis treba da prati nalazi se na jednom mestu, bez oslanjanja na tabele u Excelu ili papirnu evidenciju.
|
The goal is simple: everything the repair shop needs to track is located in one place, without relying on Excel spreadsheets or paper records.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Funkcionalnosti
|
## Features
|
||||||
|
|
||||||
### Implementirano
|
### Implemented
|
||||||
|
|
||||||
- Inicijalno podešavanje pri prvom pokretanju (setup wizard)
|
- Initial setup on first run (setup wizard)
|
||||||
- Sistem migracija baze podataka
|
- Database migration system
|
||||||
- Korisnički interfejs — sidebar navigacija, sistem tema (tamna/svetla), dashboard sa statistikama
|
- User interface — sidebar navigation, theme system (dark/light), dashboard with statistics
|
||||||
- Prijava korisnika — sesije na serveru, zaključavanje naloga
|
- User login — server-side sessions, account locking
|
||||||
- Dvofaktorska autentifikacija (TOTP) — aktivacija sa QR kodom, rezervni kodovi
|
- Two-factor authentication (TOTP) — activation with a QR code, backup codes
|
||||||
- Bruteforce zaštita — IP zaključavanje nakon 5 neuspelih pokušaja u 15 minuta
|
- Brute-force protection — IP locking after 5 failed attempts within 15 minutes
|
||||||
- CSRF zaštita — double-submit cookie pattern, automatska injekcija tokena u sve forme
|
- CSRF protection — double-submit cookie pattern, automatic token injection into all forms
|
||||||
- Bezbednosni HTTP headeri (CSP, X-Frame-Options, Referrer-Policy, nosniff...)
|
- Security HTTP headers (CSP, X-Frame-Options, Referrer-Policy, nosniff...)
|
||||||
- Evidencija pokušaja prijave — istorija po korisniku, IP, razlog, datum
|
- Login attempt logging — history by user, IP, reason, date
|
||||||
- Korisnici i uloge — admin panel, upravljanje korisnicima
|
- Users and roles — admin panel, user management
|
||||||
- Magacin — artikli, kategorije, filtriranje, kritični nivoi zaliha
|
- Inventory — items, categories, filtering, critical stock levels
|
||||||
- Servisni nalozi — prijem, statusna traka, troškovi, priznanica
|
- Service orders — intake, status bar, costs, receipt
|
||||||
- Prodajni nalozi — stavke, obračun, priznanica sa podacima firme i klijenta
|
- Sales orders — items, calculation, receipt with company and client details
|
||||||
- Nabavke — evidencija nabavki od dobavljača
|
- Procurement — records of purchases from suppliers
|
||||||
- Klijenti i dobavljači — baza kontakata
|
- Clients and suppliers — contact database
|
||||||
- Podsetnici — evidencija sa rokom
|
- Reminders — records with deadlines
|
||||||
- Izveštaji — pregled prihoda, stanje magacina
|
- Reports — revenue overview, inventory status
|
||||||
- Podešavanja — naziv, adresa, PIB, logo firme; promena teme
|
- Settings — company name, address, Tax ID (PIB), logo; theme toggle
|
||||||
|
|
||||||
### Planirano
|
### Planned
|
||||||
|
|
||||||
- Podrška za PostgreSQL (za višekorisničko okruženje)
|
- PostgreSQL support (for multi-user environments)
|
||||||
- WebAuthn / Passkey prijava (šema baze je pripremljena)
|
- WebAuthn / Passkey login (database schema is already prepared)
|
||||||
- Obaveštenja (e-pošta / WhatsApp) — odloženo za kasniju fazu
|
- Notifications (email / WhatsApp) — deferred to a later phase
|
||||||
- Skeniranje barkodova putem kamere — odloženo za kasniju fazu
|
- Barcode scanning via camera — deferred to a later phase
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Tehnologije
|
## Technologies
|
||||||
|
|
||||||
| Tehnologija | Uloga |
|
| Technology | Role |
|
||||||
| ------------------------------------------------------------------------------------ | ------------------------------- |
|
| ------------------------------------------------------------------------------------ | ------------------------------- |
|
||||||
| [Go](https://go.dev) | backend jezik |
|
| [Go](https://go.dev) | backend language |
|
||||||
| [chi](https://github.com/go-chi/chi) | HTTP ruter |
|
| [chi](https://github.com/go-chi/chi) | HTTP router |
|
||||||
| [html/template](https://pkg.go.dev/html/template) | serverski šabloni |
|
| [html/template](https://pkg.go.dev/html/template) | server-side templates |
|
||||||
| [Alpine.js](https://alpinejs.dev) | UI logika na strani klijenta |
|
| [Alpine.js](https://alpinejs.dev) | client-side UI logic |
|
||||||
| [SQLite](https://sqlite.org) + [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) | glavna baza (čisti Go, bez CGO) |
|
| [SQLite](https://sqlite.org) + [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) | main database (pure Go, no CGO) |
|
||||||
| [PostgreSQL](https://www.postgresql.org) + [pgx/v5](https://github.com/jackc/pgx) | opciona baza za produkciju |
|
| [PostgreSQL](https://www.postgresql.org) + [pgx/v5](https://github.com/jackc/pgx) | optional production database |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Pokretanje
|
## Running the Application
|
||||||
|
|
||||||
### Zahtevi
|
### Requirements
|
||||||
|
|
||||||
- Go 1.22 ili noviji
|
- Go 1.22 or newer
|
||||||
- Git
|
- Git
|
||||||
|
|
||||||
### Koraci
|
### Steps
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Kloniranje repozitorijuma
|
# 1. Clone the repository
|
||||||
git clone <url-repozitorijuma>
|
git clone <repository-url>
|
||||||
cd GoNtech
|
cd GoNtech
|
||||||
|
|
||||||
# 2. Kopiranje konfiguracionog fajla
|
# 2. Copy the configuration file
|
||||||
cp ntech.env.example ntech.env
|
cp ntech.env.example ntech.env
|
||||||
# Otvori ntech.env i postavi vrednosti (videti tabelu ispod)
|
# Open ntech.env and set the values (see the table below)
|
||||||
|
|
||||||
# 3. Učitavanje promenljivih i pokretanje u razvojnom okruženju
|
# 3. Load environment variables and run in the development environment
|
||||||
export $(grep -v '^#' ntech.env | xargs)
|
export $(grep -v '^#' ntech.env | xargs)
|
||||||
go run ./cmd/ntech
|
go run ./cmd/ntech
|
||||||
```
|
```
|
||||||
|
|
||||||
Program se otvara na `http://localhost:8080` (ili na portu definisanom u `ntech.env`).
|
|
||||||
|
|
||||||
Pri prvom pokretanju automatski se pokreće setup wizard.
|
|
||||||
|
|
||||||
### Produkcioni build
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Pomoću build.sh skripte (prima opcioni argument verzije)
|
|
||||||
./build.sh 1.0.0
|
|
||||||
|
|
||||||
# Ili ručno
|
|
||||||
CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build \
|
|
||||||
-ldflags "-X main.Verzija=1.0.0 -s -w" \
|
|
||||||
-o ntech ./cmd/ntech
|
|
||||||
./ntech
|
|
||||||
```
|
|
||||||
|
|
||||||
Rezultat je jedan statički binarni fajl bez zavisnosti.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Promenljive okruženja
|
|
||||||
|
|
||||||
Kopirati `ntech.env.example` u `ntech.env` i popuniti vrednosti. Fajl `ntech.env` se **ne commituje** u Git.
|
|
||||||
|
|
||||||
| Promenljiva | Podrazumevano | Opis |
|
|
||||||
| -------------- | ------------- | -------------------------------------------- |
|
|
||||||
| `NTECH_ENV` | `development` | Okruženje: `development` ili `production` |
|
|
||||||
| `NTECH_PORT` | `8080` | HTTP port |
|
|
||||||
| `NTECH_DB` | `sqlite` | Tip baze: `sqlite` ili `postgres` |
|
|
||||||
| `NTECH_SQLITE` | `ntech.db` | Putanja do SQLite fajla |
|
|
||||||
| `NTECH_DSN` | — | PostgreSQL connection string |
|
|
||||||
| `NTECH_SECRET` | — | Ključ za potpisivanje sesija (min. 32 bajta) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Struktura projekta
|
|
||||||
|
|
||||||
```
|
|
||||||
ntech/
|
|
||||||
├── cmd/
|
|
||||||
│ └── ntech/ # ulazna tačka programa
|
|
||||||
├── internal/
|
|
||||||
│ ├── auth/ # prijava, sesije, fail2ban log
|
|
||||||
│ ├── config/ # podešavanja, setup wizard
|
|
||||||
│ ├── db/ # sloj baze podataka
|
|
||||||
│ │ └── sqlite/ # SQLite implementacija
|
|
||||||
│ ├── handler/ # HTTP handleri
|
|
||||||
│ ├── middleware/ # CSRF, bezbednost headeri, autentifikacija
|
|
||||||
│ └── model/ # zajednički tipovi podataka
|
|
||||||
├── web/
|
|
||||||
│ ├── static/ # CSS, JavaScript, slike, logotipi
|
|
||||||
│ └── templates/ # HTML šabloni
|
|
||||||
├── migrations/ # SQL migracije (001_opis.sql, 002_opis.sql, ...)
|
|
||||||
├── logs/ # auth.log i ostali logovi
|
|
||||||
├── backups/ # rezervne kopije baze
|
|
||||||
├── build.sh # skripta za produkcioni build
|
|
||||||
├── ntech.env # lokalna konfiguracija (ne commituje se)
|
|
||||||
├── go.mod
|
|
||||||
└── go.sum
|
|
||||||
```
|
|
||||||
|
|||||||
+150
@@ -0,0 +1,150 @@
|
|||||||
|
# NTech
|
||||||
|
|
||||||
|
[🇬🇧 English version](README.md)
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
Poslovna aplikacija za upravljanje servisom računara, magacinom delova i prodajom. Napravljena u Go-u, radi u brauzeru, ne zahteva internet vezu ni eksterne servise.
|
||||||
|
|
||||||
|
> ⚠️ Projekat je u aktivnom razvoju. Nije spreman za produkcijsku upotrebu.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## O projektu
|
||||||
|
|
||||||
|
NTech je interna aplikacija napravljena za konkretnog korisnika — servis računara koji pored popravki vodi i magacin delova, prodaju komponenti i gotovih konfiguracija, te evidenciju klijenata i dobavljača.
|
||||||
|
|
||||||
|
Cilj je jednostavan: sve što servis treba da prati nalazi se na jednom mestu, bez oslanjanja na tabele u Excelu ili papirnu evidenciju.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Funkcionalnosti
|
||||||
|
|
||||||
|
### Implementirano
|
||||||
|
|
||||||
|
- Inicijalno podešavanje pri prvom pokretanju (setup wizard)
|
||||||
|
- Sistem migracija baze podataka
|
||||||
|
- Korisnički interfejs — sidebar navigacija, sistem tema (tamna/svetla), dashboard sa statistikama
|
||||||
|
- Prijava korisnika — sesije na serveru, zaključavanje naloga
|
||||||
|
- Dvofaktorska autentifikacija (TOTP) — aktivacija sa QR kodom, rezervni kodovi
|
||||||
|
- Bruteforce zaštita — IP zaključavanje nakon 5 neuspelih pokušaja u 15 minuta
|
||||||
|
- CSRF zaštita — double-submit cookie pattern, automatska injekcija tokena u sve forme
|
||||||
|
- Bezbednosni HTTP headeri (CSP, X-Frame-Options, Referrer-Policy, nosniff...)
|
||||||
|
- Evidencija pokušaja prijave — istorija po korisniku, IP, razlog, datum
|
||||||
|
- Korisnici i uloge — admin panel, upravljanje korisnicima
|
||||||
|
- Magacin — artikli, kategorije, filtriranje, kritični nivoi zaliha
|
||||||
|
- Servisni nalozi — prijem, statusna traka, troškovi, priznanica
|
||||||
|
- Prodajni nalozi — stavke, obračun, priznanica sa podacima firme i klijenta
|
||||||
|
- Nabavke — evidencija nabavki od dobavljača
|
||||||
|
- Klijenti i dobavljači — baza kontakata
|
||||||
|
- Podsetnici — evidencija sa rokom
|
||||||
|
- Izveštaji — pregled prihoda, stanje magacina
|
||||||
|
- Podešavanja — naziv, adresa, PIB, logo firme; promena teme
|
||||||
|
|
||||||
|
### Planirano
|
||||||
|
|
||||||
|
- Podrška za PostgreSQL (za višekorisničko okruženje)
|
||||||
|
- WebAuthn / Passkey prijava (šema baze je pripremljena)
|
||||||
|
- Obaveštenja (e-pošta / WhatsApp) — odloženo za kasniju fazu
|
||||||
|
- Skeniranje barkodova putem kamere — odloženo za kasniju fazu
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tehnologije
|
||||||
|
|
||||||
|
| Tehnologija | Uloga |
|
||||||
|
| ------------------------------------------------------------------------------------ | ------------------------------- |
|
||||||
|
| [Go](https://go.dev) | backend jezik |
|
||||||
|
| [chi](https://github.com/go-chi/chi) | HTTP ruter |
|
||||||
|
| [html/template](https://pkg.go.dev/html/template) | serverski šabloni |
|
||||||
|
| [Alpine.js](https://alpinejs.dev) | UI logika na strani klijenta |
|
||||||
|
| [SQLite](https://sqlite.org) + [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) | glavna baza (čisti Go, bez CGO) |
|
||||||
|
| [PostgreSQL](https://www.postgresql.org) + [pgx/v5](https://github.com/jackc/pgx) | opciona baza za produkciju |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pokretanje
|
||||||
|
|
||||||
|
### Zahtevi
|
||||||
|
|
||||||
|
- Go 1.22 ili noviji
|
||||||
|
- Git
|
||||||
|
|
||||||
|
### Koraci
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Kloniranje repozitorijuma
|
||||||
|
git clone <url-repozitorijuma>
|
||||||
|
cd GoNtech
|
||||||
|
|
||||||
|
# 2. Kopiranje konfiguracionog fajla
|
||||||
|
cp ntech.env.example ntech.env
|
||||||
|
# Otvori ntech.env i postavi vrednosti (videti tabelu ispod)
|
||||||
|
|
||||||
|
# 3. Učitavanje promenljivih i pokretanje u razvojnom okruženju
|
||||||
|
export $(grep -v '^#' ntech.env | xargs)
|
||||||
|
go run ./cmd/ntech
|
||||||
|
```
|
||||||
|
|
||||||
|
Program se otvara na `http://localhost:8080` (ili na portu definisanom u `ntech.env`).
|
||||||
|
|
||||||
|
Pri prvom pokretanju automatski se pokreće setup wizard.
|
||||||
|
|
||||||
|
### Produkcioni build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Pomoću build.sh skripte (prima opcioni argument verzije)
|
||||||
|
./build.sh 1.0.0
|
||||||
|
|
||||||
|
# Ili ručno
|
||||||
|
CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build \
|
||||||
|
-ldflags "-X main.Verzija=1.0.0 -s -w" \
|
||||||
|
-o ntech ./cmd/ntech
|
||||||
|
./ntech
|
||||||
|
```
|
||||||
|
|
||||||
|
Rezultat je jedan statički binarni fajl bez zavisnosti.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Promenljive okruženja
|
||||||
|
|
||||||
|
Kopirati `ntech.env.example` u `ntech.env` i popuniti vrednosti. Fajl `ntech.env` se **ne commituje** u Git.
|
||||||
|
|
||||||
|
| Promenljiva | Podrazumevano | Opis |
|
||||||
|
| -------------- | ------------- | -------------------------------------------- |
|
||||||
|
| `NTECH_ENV` | `development` | Okruženje: `development` ili `production` |
|
||||||
|
| `NTECH_PORT` | `8080` | HTTP port |
|
||||||
|
| `NTECH_DB` | `sqlite` | Tip baze: `sqlite` ili `postgres` |
|
||||||
|
| `NTECH_SQLITE` | `ntech.db` | Putanja do SQLite fajla |
|
||||||
|
| `NTECH_DSN` | — | PostgreSQL connection string |
|
||||||
|
| `NTECH_SECRET` | — | Ključ za potpisivanje sesija (min. 32 bajta) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Struktura projekta
|
||||||
|
|
||||||
|
```
|
||||||
|
ntech/
|
||||||
|
├── cmd/
|
||||||
|
│ └── ntech/ # ulazna tačka programa
|
||||||
|
├── internal/
|
||||||
|
│ ├── auth/ # prijava, sesije, fail2ban log
|
||||||
|
│ ├── config/ # podešavanja, setup wizard
|
||||||
|
│ ├── db/ # sloj baze podataka
|
||||||
|
│ │ └── sqlite/ # SQLite implementacija
|
||||||
|
│ ├── handler/ # HTTP handleri
|
||||||
|
│ ├── middleware/ # CSRF, bezbednost headeri, autentifikacija
|
||||||
|
│ └── model/ # zajednički tipovi podataka
|
||||||
|
├── web/
|
||||||
|
│ ├── static/ # CSS, JavaScript, slike, logotipi
|
||||||
|
│ └── templates/ # HTML šabloni
|
||||||
|
├── migrations/ # SQL migracije (001_opis.sql, 002_opis.sql, ...)
|
||||||
|
├── logs/ # auth.log i ostali logovi
|
||||||
|
├── backups/ # rezervne kopije baze
|
||||||
|
├── build.sh # skripta za produkcioni build
|
||||||
|
├── ntech.env # lokalna konfiguracija (ne commituje se)
|
||||||
|
├── go.mod
|
||||||
|
└── go.sum
|
||||||
|
```
|
||||||
+4
-4
@@ -42,12 +42,12 @@ func main() {
|
|||||||
if _, err := os.Stat("migrations"); err == nil {
|
if _, err := os.Stat("migrations"); err == nil {
|
||||||
migrFS = os.DirFS(".")
|
migrFS = os.DirFS(".")
|
||||||
}
|
}
|
||||||
// staticFS je rootovan na "web/static" (isti kao fs.Sub embed-a) — uploads ostaju van embed-a
|
// staticFS je rootovan na "web/static" — u produkciji embed, u razvoju disk
|
||||||
var staticFS fs.FS
|
var staticFS fs.FS
|
||||||
if _, err := os.Stat("web/static"); err == nil {
|
if os.Getenv("NTECH_ENV") == "production" {
|
||||||
staticFS = os.DirFS("web/static")
|
|
||||||
} else {
|
|
||||||
staticFS, _ = fs.Sub(assets.StaticFS, "web/static")
|
staticFS, _ = fs.Sub(assets.StaticFS, "web/static")
|
||||||
|
} else {
|
||||||
|
staticFS = os.DirFS("web/static")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.JelPrvoPokretanje() {
|
if config.JelPrvoPokretanje() {
|
||||||
|
|||||||
@@ -66,9 +66,9 @@
|
|||||||
</td>
|
</td>
|
||||||
<td style="padding:10px 20px;text-align:center;">
|
<td style="padding:10px 20px;text-align:center;">
|
||||||
{{if .Aktivan}}
|
{{if .Aktivan}}
|
||||||
<span style="display:inline-block;padding:2px 10px;border-radius:20px;background:#f0fdf4;color:#16a34a;font-size:11px;font-weight:500;">Aktivan</span>
|
<span style="display:inline-block;padding:2px 10px;border-radius:20px;background:#26a269;color:#ffffff;font-size:11px;font-weight:500;">Aktivan</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
<span style="display:inline-block;padding:2px 10px;border-radius:20px;background:#fef2f2;color:#dc2626;font-size:11px;font-weight:500;">Deaktiviran</span>
|
<span style="display:inline-block;padding:2px 10px;border-radius:20px;background:#ed333b;color:#000000;font-size:11px;font-weight:500;">Deaktiviran</span>
|
||||||
{{end}}
|
{{end}}
|
||||||
</td>
|
</td>
|
||||||
<td style="padding:10px 20px;text-align:center;">
|
<td style="padding:10px 20px;text-align:center;">
|
||||||
|
|||||||
Reference in New Issue
Block a user