Tento projekt představuje vlastní home page browseru jako webovou stránku, která získává různé informace a nástroje na jednom místě. Zahrnuje zobrazení aktuálního času a data, vyhledávací a "ask AI" panel, seznam oblíbených stránek, sekci s denním citátem, předpověď počasí, seznam úkolů (TODO) a sekci s náhodným vtipem a zprávami.
Projekt je postaven na technologiích Node.js s Express.js na straně serveru a čistého JavaScriptu, HTML (EJS šablony) a CSS (Tailwind CSS) na straně klienta.
Zde je podrobný rozpis jednotlivých částí:
Soubor server.js je srdcem backendu. Používá Express.js k obsluze HTTP požadavků a integraci s různými externími API.
-
Použité moduly:
express: Webový framework pro Node.js.node-fetch: Pro provádění HTTP požadavků na externí API.dotenv: Pro načítání proměnných prostředí ze souboru.env.cors: Middleware pro povolení Cross-Origin Resource Sharing.path,url: Vestavěné moduly Node.js pro práci s cestami k souborům.fs: Vestavěný modul Node.js pro práci se souborovým systémem (používá se pro čtení SSL certifikátů a ukládání potřebných dat na disk).https: Vestavěný modul Node.js pro vytvoření HTTPS serveru.
-
Konfigurace:
- Načtení proměnné prostředí pomocí
dotenv.config(). - Definice portu a IP adresy pro server.
- Načtení SSL certifikátu a klíče pro spuštění HTTPS serveru.
- Nastevení EJS jako template engine na složku
views. - Nastevení složky
publicjako statickou složku pro obsluhu klientských souborů (CSS, JavaScript, obrázky atd.). - Použití
cors()jako middleware.
- Načtení proměnné prostředí pomocí
-
API Endpoints:
GET /: Hlavní endpoint, který renderujeindex.ejs. Před renderováním asynchronně načítá data z externích API (pozadí, denní citát, zprávy) a předává je do šablony.GET /api/favicon: Přijímá URL jako query parametr a vrací URL favicony pomocí Google Favicon API.GET /api/joke: Vrací náhodný vtip z Apiverve API.GET /api/getCity: Přijímá název města jako query parametr a vrací zeměpisnou šířku a délku města pomocí OpenWeatherMap Geocoding API.GET /api/getWeather: Přijímá zeměpisnou šířku a délku jako query parametry a vrací aktuální počasí a hodinovou předpověď z OpenWeatherMap API.GET /api/getNews: Vrací jednu zprávu z Newsdata.io API. Data zpráv jsou cachována po dobu 24 hodin.
-
Pomocné funkce:
save(): Ukládá pole URL obrázků pozadí do souboruimgs.json.fetchBG(): Načítá náhodný obrázek pozadí z Unsplash API. V případě chyby vrací náhodný obrázek z lokálně uloženého seznamu (imgs.json).fetchDaily(): Načítá denní citát z Viewbits ZenQuotes API. Cachuje citát pro aktuální den.getJoke(): Načítá náhodný vtip z Apiverve API.getCity(city): Načítá zeměpisné souřadnice pro dané město z OpenWeatherMap Geocoding API.fetchCurrentWeather(lat, lon): Načítá aktuální data o počasí z OpenWeatherMap API.fetchHourlyWeather(lat, lon): Načítá hodinovou předpověď počasí z OpenWeatherMap API.getNews(): Načítá zprávy z Newsdata.io API. Cachuje zprávy po dobu 24 hodin a vrací jednu po druhé.
-
Spuštění serveru:
- Server je spuštěn pomocí
https.createServerna definované IP adrese a portu s použitím poskytnutých SSL certifikátů.
- Server je spuštěn pomocí
Klientská část se skládá z EJS šablony index.ejs a několika JavaScriptových souborů ve složce public/script.
-
views/index.ejs:
- Hlavní HTML struktura stránky.
- Používá EJS syntaxi (
<%= variable %>) k vložení dat načtených serverem (obrázek pozadí, denní citát, zprávy). - Definuje strukturu layoutu pomocí Tailwind CSS.
- Obsahuje sekce pro datum/čas, vyhledávací panely, oblíbené stránky, denní citát, počasí, TODO seznam, vtip a zprávy.
- Obsahuje HTML pro kontextové menu (
todoItemRCMenu,favPageRCMenu) a hint pro obrázky (cursorHint). - Obsahuje HTML pro překryvné vrstvy (overlays) pro přidání oblíbené stránky a konfiguraci počasí.
- Načítá všechny potřebné JavaScriptové soubory na konci těla dokumentu.
-
public/script/time.js:
- Nastavuje a aktualizuje zobrazení aktuálního času a data na stránce.
- Používá
setIntervalk aktualizaci času každých 5 sekund.
-
public/script/bars.js:
- Obsluhuje události klávesy 'Enter' na vyhledávacím panelu (
search_bar) a panelu "ask AI" (ask_bar). - Při stisku 'Enter' přesměruje uživatele na Brave Search nebo ChatGPT s dotazem zadaným v panelu.
- Obsluhuje události klávesy 'Enter' na vyhledávacím panelu (
-
public/script/contextMenu.js:
- Obsahuje pomocné funkce pro zobrazení a skrytí vlastních kontextových menu.
renderRCMenu(e, menu): Zobrazí dané kontextové menu na pozici kurzoru, přičemž zohlední okraje okna, aby menu nebylo oříznuto.resetRCMenu(): Skryje všechna vlastní kontextová menu.- Zakazuje výchozí kontextové menu prohlížeče na celém dokumentu.
-
public/script/fav_pages.js:
- Spravuje seznam oblíbených stránek.
- Načítá seznam stránek z
localStorage. renderFavPages(): Vykresluje seznam oblíbených stránek na stránce.newFavPage(page): Vytvoří nový HTML element pro oblíbenou stránku, nastaví jeho href a src obrázku (favicony) a přidá event listenery pro kontextové menu.AddFavPageCreate(): Zpracovává přidání a edit oblíbené stránky. Načítá faviconu pomocí/api/faviconendpointu, ukládá stránku dolocalStoragea vykresluje ji.FavPageEdit(): Zobrazí overlay pro úpravu oblíbené stránky a nastavíisEditna true. Samotná úprava dat probíhá vAddFavPageCreate().FavPageDelete(): Smaže vybranou oblíbenou stránku ze seznamu a zlocalStorage.getSelectedIndex(): Pomocná funkce pro získání indexu vybrané oblíbené stránky v seznamu.- Definuje třídu
FavPagepro strukturování dat oblíbené stránky.
-
public/script/img_hint.js:
- Zobrazuje hint (nápovědu) s textem
altatributu obrázku, když uživatel najede myší na obrázek. - Hint se zobrazí se zpožděním 500 ms a sleduje kurzor myši.
- Zohledňuje okraje okna, aby hint nebyl oříznut.
- Zobrazuje hint (nápovědu) s textem
-
public/script/joke.js:
- Načítá a zobrazuje náhodný vtip.
joke_reload(): Volá/api/jokeendpoint, zobrazí spinner během načítání a po načtení zobrazí setup a punchline vtipu.
-
public/script/news.js:
- Načítá a zobrazuje zprávy.
news_reload(): Volá/api/getNewsendpoint, zobrazí spinner během načítání a po načtení aktualizuje odkaz, titulek a popis zprávy.
-
public/script/overlay_util.js:
- Obsahuje pomocné funkce pro zobrazení a skrytí překryvných vrstev (overlays).
showOverlay(div): Zobrazí hlavní overlay a daný div uvnitř něj. Zajišťuje, že se zobrazí pouze jeden overlay najednou.hideOverlay(): Skryje aktuálně zobrazený overlay a hlavní overlay.
-
public/script/todo.js:
- Spravuje seznam úkolů (TODO list).
- Načítá seznam úkolů z
localStorage. renderTodos(): Vykresluje seznam úkolů na stránce.newTodo(text): Vytvoří nový HTML element<li>pro úkol, nastaví jeho text a přidá posluchače událostí pro kontextové menu (pravé kliknutí) a smazání (dvojklik).todoAdd(event): Zpracovává přidání nového úkolu při stisku 'Enter' v input poli. Přidá úkol do poletodos, vykreslí ho a uloží dolocalStorage.todoDel(itemToDelete): Smaže daný úkol z poletodos, odstraní jeho HTML element a uloží aktualizovaný seznam dolocalStorage.todoRclick(e): Obsluhuje pravé kliknutí na úkol, uloží referenci na element a zobrazí kontextové menu pro úkoly.editTodo(itemToEdit): Nahradí text úkolu input polem pro úpravu.saveEdit(inputElement, originalText): Uloží upravený text úkolu, aktualizuje poletodos,localStoragea nahradí input pole zpět<li>elementem.
-
public/script/weather.js:
- Spravuje zobrazení počasí.
- Načítá uloženou polohu z
localStorage. Pokud není uložena, zobrazí varování a tlačítko pro nastavení. - Definuje třídu
Locationpro strukturování dat o poloze. setupWeather(): Zobrazí overlay pro konfiguraci počasí.ApplyConfig(): Zpracovává nastavení města. Volá/api/getCitypro získání souřadnic, ukládá polohu dolocalStoragea volágetWeather(). V případě chyby zobrazí chybovou zprávu.getWeather(): Asynchronně volá/api/getWeatherendpoint pro získání aktuálního počasí a hodinové předpovědi. Po načtení aktualizuje HTML elementy na stránce s daty o počasí.- Obsluhuje události pro tlačítka nastavení a obnovení počasí (včetně zobrazení spinneru).
- Obsluhuje události kolečka myši pro horizontální scroll předpovědi počasí.
Soubor input.css definuje styly pro stránku pomocí Tailwind CSS.
- Importuje základní Tailwind styly.
- Definuje vlastní font (
Kode Mono). - Definuje vlastní barevné proměnné (
--color-dark,--color-ldark). - Nastavuje výchozí font a zakazuje výběr textu (
select-none) pro všechny prvky. - Definuje styly pro hlavní layout (
main) pomocí gridu. - Definuje obecné styly pro sekce a kontejnery.
- Definuje specifické styly pro TODO seznam, oblíbené stránky, kontextová menu, předpověď počasí a input pole pro úpravu úkolů.
- Obsahuje styly pro skrytí scrollbaru (
scrollable).
Pro spuštění projektu je potřeba:
- Nainstalovat Node.js a npm.
- Nainstalovat závislosti projektu (
npm install). - Vytvořit soubor
.envv kořenovém adresáři projektu s následujícími proměnnými prostředí (klíče API je nutné získat od příslušných poskytovatelů):UNSPLASH_SECRETUNSPLASH_IDAPIVERVE_KEY2OPENWEATHER_KEYNEWSDATA_KEY
- Vytvořit soubory
server.keyaserver.certpro HTTPS server. - Spustit server (
node server.js). - Spustit proces pro kompilaci Tailwind CSS (např. pomocí
npx tailwindcss -i ./src/input.css -o ./public/output.css --watch).