Hur bygger jag mitt första projekt (rest-api, webbsida, databas)?

Permalänk
Medlem

Hur bygger jag mitt första projekt (rest-api, webbsida, databas)?

Ärade SweCare,

jag kontakter er i en tid av stor förvirring i jakt på kunskap som min Google-Fu varit på tok för svag för att lösa åt mig. Mina försök att åkalla ChatGPT har även de varit lite över huvudet på mig. Jag antar att jag antingen inte vet vad det är jag vill, är för korkad för att förstå svaret eller, ve och fasa, kanske en kombination av de två?

Problemet jag vill lösa
En hobby är att odla diverse ätbara saker på tomten. Anteckningar om dessa görs i diverse kollegieblock, lösa papper, på post-its, via bilder/video på telefonen etc. Det är milt uttryckt svårt att få en god överblick i slutet på året över vad som är gjort, vad som finns vart och vad varje odling fått till sig i form av gödsel och vatten för att prestera som den gör.

Jag vill få ordning på all data på ett ställe (digitaliserat) och kunna använda den för att skapa diagram, se trender och liknande.

Hur jag tror att jag ska lösa det hela
Jag har fått för mig att lösningen är att skapa en databas innehållandes de saker jag vill hålla ordning på, den tänker jag mig sedan att det ska gå att interagera med via en webbsida (webapp?) där man kan peta in när man vattnat, gödslat, skördat etc men även se vilka saker som finns på de olika odlingsplatserna på tomten och vilka odlingsmedium som finns i krukorna etc.

Jag har fått för mig att de bitar jag behöver är:
1. En databas
2. Ett sätt att interagera med databasen från webbsidan, här tänker jag mig rest-api skrivet i java
3. En webbsida med användarvänlig och lämplig design för syftet som använder javascript för att prata med databasen

Till en början är min tanke att det hela ska rulla lokalt på min dator med mig som enda användare. Får jag till något bra som faktiskt fungerar är tanken att sedan lära mig hur det fungerar att lägga upp det på en server nåbar utifrån så även några andra kan använda det.

Vad jag gjort hittills
Jag har gjort ett försök på att rita upp hur jag tänker mig att databasen ska se ut på diagrams.net

Försökt läsa på om REST-API via bland annat Freeodecamps video om API för nybörjare och genom att chatta med ChatGPT.

Jag har börjat skissa på hur jag tänker mig att hemsidan ser ut, dock på papper...

Mina funderingar

  • Är jag på rätt väg?

  • Är min databasdesign någorlunda resonlig eller är jag helt ute och cyklar?

  • ChatGPT rekommenderar något som kallas Spring Boot, är det ett bra ställe att börja på?

  • Om jag vill ha ett API, behöver jag då skapa vyer i min databas för olika saker jag vill visa eller skriver jag sql kommandon i logiken för mina api-rutter/"endpoints" (ChatGPT är lite flytande på om det är någon skillnad på de begreppen eller ej)?

  • Vad borde jag börja med för att få till en första produkt som känns användbar? Min tanke är att kanske börja med en liten testdatabas med bara plantor och bevattningstabellerna samt skapa ett api dit och ha en så enkel hemsida som möjligt som kanske visar en lista på plantor med knappar som går att trycka på när man vattnat dem.

  • Kommer ovan gå att skala upp till resten sedan eller är det bara bortkastat att börja litet pga overhead?

Jag är införstådd med att mina språkval kanske inte är perfekta (?) men jag har en uppföljningskurs i Java kommande termin och tänkte att det väl är bra att värma upp lite innan dess. Javascript kan jag inte alls men det är mycket snack om react.js på jobbet för tillfället så jag tänker mig väl att det är något jag bör bekanta mig med. I övrigt är jag en synnerligen medioker kodare vars största erfarenhet hittills är lite terminalprogram i python/c#/Java samt småscript i Powershell så för mig är det här ett väldigt stort projekt

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem

Jag tycker förstås det är kul om man har ett projekt man vill förverkliga med kod och bra tillfälle att lära sig, men i ditt fall, som jag förstår det, känns det som att du kan komma undan rätt mycket lättare genom att använda dig av Excel och ev. nåt antecknings program för fritext anteckningar. Men om känner att du verkligen vill göra det med programmering för att lära dig, så kan jag istället ge lite tips och råd för hur du går tillväga där, men spontant känns det som ett projekt som du kommer få jobba med en lång tid för att få de resultat som du vill ha.

Men utöver excel så kan jag även slå ett slag för Obsidian.md med några extra plugins för att få statistik och ritningar. Det är ett program för att skriva ostrukturerade Markdown anteckningar, men blir otroligt kraftfullt när man ger anteckningarna struktur och länkar mellan sidor. Det skapar en sorts text-databas som du kan söka i, se relationer mellan och skriva fria anteckningar där du behöver dem. Är gratis att ladda ner till Windows, Mac, Linux, Android, iOS och du kan synca mellan enheterna antingen via ett tredje parts plugin, dropbox, iCloud, eller genom att betala en mindre månadsavgift för deras egna sync (om du behöver).

Tog mig tillfället i akt och gjorde ett enkelt exempel på hur det skulle kunna se ut för ditt projekt.

Här kan vi se ett exempel på sidan för en enskild planta:

Här är det fritt att skriva anteckningar som längst ner, eller ha mer strukturerad data i en tabell som under "Gödslad"
Alla blåa ord är länkar till andra sidor, som du kan se längst till vänster i bilden. Klickar vi ex. på "Melon" som jag länkat till att vara dess sort, kommer vi direkt till den sidan.

Det går även att skapa taggar för saker som behöver en kategori, men kanske inte en helt egen sida. Så klickar jag istället på "#SommarPlanta" längst ner, så söker den bland alla andra sidor som är taggade med samma sak, som du kan se till vänster i sidomenyn.

Går jag till "Planteringsplats" sidan så kan du även se att man kan infoga egna bilder från datorn, eller som i mitt exempel, ett diagram jag ritade i pluginet Excalidraw.

Det går också att skapa grafer från tabelldata, med hjälp av pluginet "Obsidian Charts":

Men något som jag tycket är riktigt coolt och användbart är den inbyggda "Graph view" som visar relationer mellan sidor och taggar. Här kan du se hur allt hänger ihop utifrån vad som länkar till vad.

Kan fortsätta ge tips om Obsidian om du vill, men tycker denna video ger en bra förklaring till det mesta gällande Obsidian https://www.youtube.com/watch?v=DbsAQSIKQXk

Permalänk
Avstängd

Vad du vill göra är ju egentligen en av de vanligaste typerna av webbapplikationer. Alltså en databas med en frontend för att lägga in, filtrera, hämta och presentera data. På en högre nivå är det ju vad en "blogg" är, men också en webbutik, eller diverse exempelprojekt som folk försöker lösa i sina skoluppgifter och så, typ "javabiblioteket" (fast där är det sällan webb-baserat) och så.

Så hitta en tutorial med de tekniker du vill använda, och följ den typ. Vad jag jobbar med är Angular så det hade jag valt. Inte superenkelt att komma igång med men ändå hyfsat, och modernt och populärt så det finns mycket resurser online.

Ett alternativ är ju annars att typ köra något program för enklare databashantering. Då får du sannolikt inte ett webbgränssnitt, men du behöver heller inte koda något egentligen utan bara skapa en databas och formulär för input och sökningar och rapporter eller grafer för att presentera informationen. Access är rätt bra på sådana saker exempelvis, Excel kan funka också men det kräver ju lite mer jobb då det inte är en databas och inte har några formulär. Har du gamla MS Works så räcker nog dess databasfunktionalitet för detta också.

Permalänk
Medlem

Ett alternativ till obsidian är LogSeq som är open source.

Permalänk
Medlem

Om du endast vill lära dig så skulle jag börjat med en webbapp som kör lokalt och som databas hade jag haft Excel. Enkelt att populera med testdata och se resultat när du kör trial and error för att lära dig.

Så fokusera på rest api backend o frontend först. När det är på plats så kan du alltid byta ut Excel mot en databas (din relationsdb kändes väldigt overkill för en sån här simpel sak. En rad i Excel med id och kolumner för alla attribut fyller samma syfte. För misstänker att du inte når tusentals rader?)

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Medlem

Underlättar nog en del att lära sig basic JavaScript innan man dyker på React eller Angular. När du lärt dig basic JavaScript kan du skippa vanlig JavaScript och köra TypeScript. Vad gäller API är det kanske lättare att labba lite med Node.js och express först, Spring Boot är nog ganska verbose i jämförelse.

Permalänk
Medlem
Skrivet av martengooz:

Jag tycker förstås det är kul om man har ett projekt man vill förverkliga med kod och bra tillfälle att lära sig, men i ditt fall, som jag förstår det, känns det som att du kan komma undan rätt mycket lättare genom att använda dig av Excel och ev. nåt antecknings program för fritext anteckningar. Men om känner att du verkligen vill göra det med programmering för att lära dig, så kan jag istället ge lite tips och råd för hur du går tillväga där, men spontant känns det som ett projekt som du kommer få jobba med en lång tid för att få de resultat som du vill ha.

Men utöver excel så kan jag även slå ett slag för Obsidian.md med några extra plugins för att få statistik och ritningar. Det är ett program för att skriva ostrukturerade Markdown anteckningar, men blir otroligt kraftfullt när man ger anteckningarna struktur och länkar mellan sidor. Det skapar en sorts text-databas som du kan söka i, se relationer mellan och skriva fria anteckningar där du behöver dem. Är gratis att ladda ner till Windows, Mac, Linux, Android, iOS och du kan synca mellan enheterna antingen via ett tredje parts plugin, dropbox, iCloud, eller genom att betala en mindre månadsavgift för deras egna sync (om du behöver).

Tog mig tillfället i akt och gjorde ett enkelt exempel på hur det skulle kunna se ut för ditt projekt.

Här kan vi se ett exempel på sidan för en enskild planta:
https://i.ibb.co/fN1LQT4/Screenshot-from-2023-07-16-07-57-25.png

Här är det fritt att skriva anteckningar som längst ner, eller ha mer strukturerad data i en tabell som under "Gödslad"
Alla blåa ord är länkar till andra sidor, som du kan se längst till vänster i bilden. Klickar vi ex. på "Melon" som jag länkat till att vara dess sort, kommer vi direkt till den sidan.
<Uppladdad bildlänk>

Det går även att skapa taggar för saker som behöver en kategori, men kanske inte en helt egen sida. Så klickar jag istället på "#SommarPlanta" längst ner, så söker den bland alla andra sidor som är taggade med samma sak, som du kan se till vänster i sidomenyn.
https://i.ibb.co/8MY13sc/Screenshot-from-2023-07-16-07-54-42.png

Går jag till "Planteringsplats" sidan så kan du även se att man kan infoga egna bilder från datorn, eller som i mitt exempel, ett diagram jag ritade i pluginet Excalidraw.
https://i.ibb.co/WDXH7Yt/Screenshot-from-2023-07-16-07-58-51.png

Det går också att skapa grafer från tabelldata, med hjälp av pluginet "Obsidian Charts":
https://i.ibb.co/cXxszMf/Screenshot-from-2023-07-16-08-01-29.png

Men något som jag tycket är riktigt coolt och användbart är den inbyggda "Graph view" som visar relationer mellan sidor och taggar. Här kan du se hur allt hänger ihop utifrån vad som länkar till vad.
https://i.ibb.co/ZK5bZ2H/Screenshot-from-2023-07-16-08-04-07.png

Kan fortsätta ge tips om Obsidian om du vill, men tycker denna video ger en bra förklaring till det mesta gällande Obsidian https://www.youtube.com/watch?v=DbsAQSIKQXk

Ser riktigt coolt ut ska erkännas och det faktum att du skapat något, som jag uppfattar det, så pass snabbt som ser ut att matcha mitt databasförslag tolkar jag som att den delen i varje fall är förståelig

Du är inne på lite rätt sak där i början att detta också är för att lära mig då det snackas mer och mer API på jobbet och jag känner mig rätt så efter på det hela och nu när jag hittade ett projekt som jag faktiskt tycker känns användbart tänkte jag ge mig på det. Har ingen tanke på att det här ska vara igång och körbart inom en vecka eller så utan misstänker att det säkert kommer börjas på och sen när jag kommit så långt att jag förstår att jag gjort fel i början så lär jag få börja om.

Skrivet av robbas:

Ett alternativ till obsidian är LogSeq som är open source.

Antecknar för eventuella framtida behov, jag har inte jobbat med den här typen av program tidigare men de ser väldigt användabara ut!

Skrivet av talonmas:

Om du endast vill lära dig så skulle jag börjat med en webbapp som kör lokalt och som databas hade jag haft Excel. Enkelt att populera med testdata och se resultat när du kör trial and error för att lära dig.

Så fokusera på rest api backend o frontend först. När det är på plats så kan du alltid byta ut Excel mot en databas (din relationsdb kändes väldigt overkill för en sån här simpel sak. En rad i Excel med id och kolumner för alla attribut fyller samma syfte. För misstänker att du inte når tusentals rader?)

Tusentals rader tror jag inte jag kommer nå i det korta loppet. Om jag kan få igång det här så som jag hoppas och i framtiden även kan få upp det på nätet så andra delar av familjen kan använda det finns det dock risk för att tabellerna BevattningsTillfällen och HarGödslats kommer innehålla rätt mycket data då det totalt rör sig om 100-200 plantor som bevattnas minst dagligen och gödslas minst en gång i veckan, beroende på gödseltyp.

Det kan nog gå att lösa genom Excel, även om jag är lite osäker på hur jag ska lösa N:M sambanden på ett bra sätt då en planta mycket väl kan ha 150 vattningar kopplade till sig och jag gärna vill ha alla datum tillgänliga. Hur skulle du lösa det i Excel, ett separat ark med alla vattningar och sedan pivottabeller för att skapa eventuella diagram kanske?

Att börja i liten skala är dock en väldigt bra idé och jag skapade just en testdb med bara Plantor, BevattningsTillfällen och Vatten tabellerna enligt följande:

create table Plants ( PlantID INT, SowDate DATE primary key (PlantID) ); create table Water ( WID INT, Source varchar(30), Name varchar(30) primary key (WID) ); create table IrrigationEvents ( WID INT, PlantID INT, EventDate DATE primary key (WID, PlantID), foreign key (WID) references Water(WID), foreign key (PlantID) references Plants(PlantID) );

La in det hela på engelska då jag antog att svenska tecken kan ge mig problem i framtiden.

Dold text

Tänkte försöka hinna peta ihop ett testcase baserat på guiden jag länkar till senare i svaret som jag hittade för node.js+express.js. Java verkar onekligen tungt i jämförelse...

Skrivet av snajk:

Vad du vill göra är ju egentligen en av de vanligaste typerna av webbapplikationer. Alltså en databas med en frontend för att lägga in, filtrera, hämta och presentera data. På en högre nivå är det ju vad en "blogg" är, men också en webbutik, eller diverse exempelprojekt som folk försöker lösa i sina skoluppgifter och så, typ "javabiblioteket" (fast där är det sällan webb-baserat) och så.

Så hitta en tutorial med de tekniker du vill använda, och följ den typ. Vad jag jobbar med är Angular så det hade jag valt. Inte superenkelt att komma igång med men ändå hyfsat, och modernt och populärt så det finns mycket resurser online.

Ett alternativ är ju annars att typ köra något program för enklare databashantering. Då får du sannolikt inte ett webbgränssnitt, men du behöver heller inte koda något egentligen utan bara skapa en databas och formulär för input och sökningar och rapporter eller grafer för att presentera informationen. Access är rätt bra på sådana saker exempelvis, Excel kan funka också men det kräver ju lite mer jobb då det inte är en databas och inte har några formulär. Har du gamla MS Works så räcker nog dess databasfunktionalitet för detta också.

Skrivet av ChrisDev:

Underlättar nog en del att lära sig basic JavaScript innan man dyker på React eller Angular. När du lärt dig basic JavaScript kan du skippa vanlig JavaScript och köra TypeScript. Vad gäller API är det kanske lättare att labba lite med Node.js och express först, Spring Boot är nog ganska verbose i jämförelse.

När jag letar runt så verkar javascript vara populärt för "snabba" projekt och som @ChrisDev skriver så verkar SpringBoot vara rätt stort. Jag hittade en guide med just node.js+express.js som ser relativt lättföljd ut vid första anblick. Den är dock från 2018 så jag vet inte hur aktuell den är då det ju kan gå väldigt fort i teknikvärlden ibland. Den svarar dock på något jag funderar om och det är hur man via ett api skriver och hämtar ur en databas och det verkar vara genom något som kallas stored procedures som man triggar på något sätt. Jag är nu spontant irriterad över att det inte ingick i kursen om databaser som jag läste förra året för det verkar riktigt användbart

Om småbarnsgudarna är snälla så kanske jag hinner börja peta lite redan ikväll

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem

Du kan också använda ett färdigbyggt backend-as-a-service, t ex Firebase (Google, körs endast på deras servrar) eller Pocketbase (kan köras lokalt). Jag förordar Pocketbase av dessa, dels för att kunna köra lokalt men också för att det använder en SQL-databas (SQLite, fullt tillräcklig för ditt ändamål).

Då får du databas, API, autentisering med mera direkt. Då kan du lägga mer tid på att bygga en vettig webbapplikation. Vill du sen byta ut din backend mot något egenbyggt är det relativt simpelt.

Permalänk
Medlem

Det har nämnts redan, men kan nämna att min morfar körde MS Access och Excell för sin trädgård. Han hade även CADat upp landen som han sedan länkade i Access. Jag har aldrig riktigt lärt mig Access så det sitter, men var ända ganska lätt att komma in i trots min då väldigt unga ålder. Tror detta skulle innebära minst jobb om du enbart kör lokalt.

Men vill du prompt programmera en webbsida så skulle jag rekommendera att du inte gör allt direkt. Utan dela upp det i flera steg.
Detta är ett råd jag skulle ge mig själv om jag kunde innan jag började med mitt projekt jag håller på med. Har tagit längre tid än vad jag trodde. Till stor del för att jag bara köttade på med allt direkt istället för att dela upp det.

  1. Håll det simpelt i detta steg. Gör så lite som möjligt för att få sidan att fungera. Skippa javascript. Skriv ingen "onödig" serverside kod. För körs sidan enbart lokalt så behöver du inte bry dig om säkerheten och det gör absolut ingenting om sidan måste laddas om när du lägger till eller ändrar information. Bry dig heller inte om pixelperfection, använd css för att enbart få till en grundstruktur.

  2. Börja implementera javascript.

  3. Jobba på designen

  4. Lägg till annan funktionalitet som du möjligen har kommit på som skulle vara trevlig att ha.

  5. Förbättra säkerheten om sidan ska publiceras publikt. Räkna dock inte med att den är säker om du inte har koll på ämnet.

Är du okej med att hela sidan laddas om vid användning, det kanske inte stör så mycket. Då kan du göra punkt 2 och 3 i omvänd ordning.

Visa signatur

www.fckdrm.com - DRM år 2024? Ha pyttsan.

Permalänk
Avstängd
Skrivet av Daz:

Ser riktigt coolt ut ska erkännas och det faktum att du skapat något, som jag uppfattar det, så pass snabbt som ser ut att matcha mitt databasförslag tolkar jag som att den delen i varje fall är förståelig

Du är inne på lite rätt sak där i början att detta också är för att lära mig då det snackas mer och mer API på jobbet och jag känner mig rätt så efter på det hela och nu när jag hittade ett projekt som jag faktiskt tycker känns användbart tänkte jag ge mig på det. Har ingen tanke på att det här ska vara igång och körbart inom en vecka eller så utan misstänker att det säkert kommer börjas på och sen när jag kommit så långt att jag förstår att jag gjort fel i början så lär jag få börja om.

Antecknar för eventuella framtida behov, jag har inte jobbat med den här typen av program tidigare men de ser väldigt användabara ut!

Tusentals rader tror jag inte jag kommer nå i det korta loppet. Om jag kan få igång det här så som jag hoppas och i framtiden även kan få upp det på nätet så andra delar av familjen kan använda det finns det dock risk för att tabellerna BevattningsTillfällen och HarGödslats kommer innehålla rätt mycket data då det totalt rör sig om 100-200 plantor som bevattnas minst dagligen och gödslas minst en gång i veckan, beroende på gödseltyp.

Det kan nog gå att lösa genom Excel, även om jag är lite osäker på hur jag ska lösa N:M sambanden på ett bra sätt då en planta mycket väl kan ha 150 vattningar kopplade till sig och jag gärna vill ha alla datum tillgänliga. Hur skulle du lösa det i Excel, ett separat ark med alla vattningar och sedan pivottabeller för att skapa eventuella diagram kanske?

Att börja i liten skala är dock en väldigt bra idé och jag skapade just en testdb med bara Plantor, BevattningsTillfällen och Vatten tabellerna enligt följande:

create table Plants ( PlantID INT, SowDate DATE primary key (PlantID) ); create table Water ( WID INT, Source varchar(30), Name varchar(30) primary key (WID) ); create table IrrigationEvents ( WID INT, PlantID INT, EventDate DATE primary key (WID, PlantID), foreign key (WID) references Water(WID), foreign key (PlantID) references Plants(PlantID) );

La in det hela på engelska då jag antog att svenska tecken kan ge mig problem i framtiden.

Dold text

Tänkte försöka hinna peta ihop ett testcase baserat på guiden jag länkar till senare i svaret som jag hittade för node.js+express.js. Java verkar onekligen tungt i jämförelse...

När jag letar runt så verkar javascript vara populärt för "snabba" projekt och som @ChrisDev skriver så verkar SpringBoot vara rätt stort. Jag hittade en guide med just node.js+express.js som ser relativt lättföljd ut vid första anblick. Den är dock från 2018 så jag vet inte hur aktuell den är då det ju kan gå väldigt fort i teknikvärlden ibland. Den svarar dock på något jag funderar om och det är hur man via ett api skriver och hämtar ur en databas och det verkar vara genom något som kallas stored procedures som man triggar på något sätt. Jag är nu spontant irriterad över att det inte ingick i kursen om databaser som jag läste förra året för det verkar riktigt användbart

Om småbarnsgudarna är snälla så kanske jag hinner börja peta lite redan ikväll

Stored procedures går att använda men idag kör man normalt någon ORM (Object Relational Mapping) som EF (Entity Framework) så behöver man inte tänka på databasen utan bara jobba med koden, eller försåts någon DB som inte kör SQL. På jobbet kör vi MongoDB exempelvis, lätt att använda från .Net.

Permalänk
Skrivet av Daz:

Ärade SweCare,

jag kontakter er i en tid av stor förvirring i jakt på kunskap som min Google-Fu varit på tok för svag för att lösa åt mig. Mina försök att åkalla ChatGPT har även de varit lite över huvudet på mig. Jag antar att jag antingen inte vet vad det är jag vill, är för korkad för att förstå svaret eller, ve och fasa, kanske en kombination av de två?

Problemet jag vill lösa
En hobby är att odla diverse ätbara saker på tomten. Anteckningar om dessa görs i diverse kollegieblock, lösa papper, på post-its, via bilder/video på telefonen etc. Det är milt uttryckt svårt att få en god överblick i slutet på året över vad som är gjort, vad som finns vart och vad varje odling fått till sig i form av gödsel och vatten för att prestera som den gör.

Jag vill få ordning på all data på ett ställe (digitaliserat) och kunna använda den för att skapa diagram, se trender och liknande.

Hur jag tror att jag ska lösa det hela
Jag har fått för mig att lösningen är att skapa en databas innehållandes de saker jag vill hålla ordning på, den tänker jag mig sedan att det ska gå att interagera med via en webbsida (webapp?) där man kan peta in när man vattnat, gödslat, skördat etc men även se vilka saker som finns på de olika odlingsplatserna på tomten och vilka odlingsmedium som finns i krukorna etc.

Jag har fått för mig att de bitar jag behöver är:
1. En databas
2. Ett sätt att interagera med databasen från webbsidan, här tänker jag mig rest-api skrivet i java
3. En webbsida med användarvänlig och lämplig design för syftet som använder javascript för att prata med databasen

Till en början är min tanke att det hela ska rulla lokalt på min dator med mig som enda användare. Får jag till något bra som faktiskt fungerar är tanken att sedan lära mig hur det fungerar att lägga upp det på en server nåbar utifrån så även några andra kan använda det.

Vad jag gjort hittills
Jag har gjort ett försök på att rita upp hur jag tänker mig att databasen ska se ut på diagrams.net

Försökt läsa på om REST-API via bland annat Freeodecamps video om API för nybörjare och genom att chatta med ChatGPT.

Jag har börjat skissa på hur jag tänker mig att hemsidan ser ut, dock på papper...

Mina funderingar

  • Är jag på rätt väg?

  • Är min databasdesign någorlunda resonlig eller är jag helt ute och cyklar?

  • ChatGPT rekommenderar något som kallas Spring Boot, är det ett bra ställe att börja på?

  • Om jag vill ha ett API, behöver jag då skapa vyer i min databas för olika saker jag vill visa eller skriver jag sql kommandon i logiken för mina api-rutter/"endpoints" (ChatGPT är lite flytande på om det är någon skillnad på de begreppen eller ej)?

  • Vad borde jag börja med för att få till en första produkt som känns användbar? Min tanke är att kanske börja med en liten testdatabas med bara plantor och bevattningstabellerna samt skapa ett api dit och ha en så enkel hemsida som möjligt som kanske visar en lista på plantor med knappar som går att trycka på när man vattnat dem.

  • Kommer ovan gå att skala upp till resten sedan eller är det bara bortkastat att börja litet pga overhead?

Jag är införstådd med att mina språkval kanske inte är perfekta (?) men jag har en uppföljningskurs i Java kommande termin och tänkte att det väl är bra att värma upp lite innan dess. Javascript kan jag inte alls men det är mycket snack om react.js på jobbet för tillfället så jag tänker mig väl att det är något jag bör bekanta mig med. I övrigt är jag en synnerligen medioker kodare vars största erfarenhet hittills är lite terminalprogram i python/c#/Java samt småscript i Powershell så för mig är det här ett väldigt stort projekt

Tjo! Jag hjälper gärna till i den utsträckning jag kan då min nästa programtermin börjar den 28 augusti 2023 inom Webbutveckling och jag har redan blivit uttråkad av min "enskild firma- & studentsemester". Eller snarare att jag tycker att webbutveckling är riktigt kul på riktigt nu när man faktiskt kan lite av grunderna och behöver "(arbets)livserfarenhet" inom det!

Den lösning jag ser framför mig (utifrån det jag kan än så länge) är:
- Simpel HTML+CSS för frontend (går ju alltid att göra snyggare i efterhand med Bootstrap, Tailwind, etc.)
- MySQL/MariaDB som databaslösning (SQL alltså)
- JavaScript för att skicka fetch()-anrop till REST API:t som i sin tur är PHP-baserat
- Allt detta kan köras lokalt via XAMPP(PC) eller LAMP(Mac)

Då databasen är själva hjärtat i projektet så är dess "design" (ER-diagram(?)) viktigt så att implementeringen och användningen av den sedan inte kommer med några irriterande överraskningar. Tänk om du exempelvis upptäcker att efter hundra raders databasinsättningar så skulle du behövt en ytterligare tabell med data för alla databasinsättningar, eller en ytterligare kolumn i en tabell med data. Och så blir det massa efterarbete på grund av ej välgenomtänkt databasdesign.

Några tankar jag har kring din nuvarande DB-design är:
- En sak som du kanske vill lägga till för de flesta tabeller är vem som genomfört så blir det enkelt sedan när en ny person vill använda sig av samma app och där det då står deras namn istället för ditt namn i tabeller som beskriver händelser som exempelvis Bevattningstillfällen och så?

- PK i "Plantor" samtidigt som du har FK "Planterad!" innebär ju att du inte får ha samma slags planta planterad på fler än en PK "PlanteringsPlatser" (eftersom PK måste vara unik för varje rad i Plantor-tabellen). Då tänker jag istället att du har en N:M-tabell mellan tabellerna "Plantor" och "PlanteringsPlatser" som då tillåter att Varje i "Plantor" kan vara "Planterad!" på flera olika "PlanteringsPlatser".

- Tabellen "BevattningsTillfällen" så kanske du även vill veta för vilken "PlanteringsPlatser" det ägde rum på? Då bör du ha en FK från den tabellen. Du kanske bevattnar en planta på en Planteringsplats en dag men sedan bevattnar samma slags planta men en annan dag på en annan Planteringsplats?

- Tabellen "OdlingsPlatser" kanske ska betraktas som en sammansatt PK (OdlingsPlatsNr+PlanteringsPlatsers PK) för varje OdlingsPlats kan ju ha ett platsnummer (odlingsplats 1, odlingsplats 2, osv) men de får bara existera om de finns på en PlanteringsPlats? Så du har exempelvis: Odlingsplats 1 på Planteringsplats 1, Odlingsplats 2 på Planteringsplats 1, osv? Då går det ej att ha Odlingsplats 1 på Planteringsplats 1 igen eftersom det blir en upprepning av PK vilket ej tillåts.

- Tabellerna "Gödsel", "Sorter", "OdlingsMedier" och "Vatten" tycker jag är bra som de är !

Hojta till här eller i "Meddelanden" om du vill tjöta vidare!

Mvh,
WKL.

Visa signatur

<WKL:"En kodrad i taget!";/>

Permalänk
Skrivet av snajk:

Stored procedures går att använda men idag kör man normalt någon ORM (Object Relational Mapping) som EF (Entity Framework) så behöver man inte tänka på databasen utan bara jobba med koden, eller försåts någon DB som inte kör SQL. På jobbet kör vi MongoDB exempelvis, lätt att använda från .Net.

När det gäller säkerheten i just MySQL/MariaDB så undrar jag hur mycket mer som faktiskt går att göra än:
1) Kryptera all data i databasen på något vis
2) Skydd mot SQL-injektioner (mysqli_real_escape_string + statements med binded parameters istället för vanliga SQL queries)
3) Begränsningar via Roles/Users så exempelvis bara "Systemadmin" kan radera data & tabeller ur databasen
4) Kräva tidsbegränsade API-nycklar vid varje klientanrop
5) Regelbundna säkerhetskopieringar via Stored Procedures om databasen är igång dygnet runt

Till slut är väl bara "social engineering" kvar att skydda sig emot?

Mvh,
WKL.

Visa signatur

<WKL:"En kodrad i taget!";/>

Permalänk
Avstängd
Skrivet av WebbkodsLärlingen:

När det gäller säkerheten i just MySQL/MariaDB så undrar jag hur mycket mer som faktiskt går att göra än:
1) Kryptera all data i databasen på något vis
2) Skydd mot SQL-injektioner (mysqli_real_escape_string + statements med binded parameters istället för vanliga SQL queries)
3) Begränsningar via Roles/Users så exempelvis bara "Systemadmin" kan radera data & tabeller ur databasen
4) Kräva tidsbegränsade API-nycklar vid varje klientanrop
5) Regelbundna säkerhetskopieringar via Stored Procedures om databasen är igång dygnet runt

Till slut är väl bara "social engineering" kvar att skydda sig emot?

Mvh,
WKL.

Jag har mest jobbat med MS SQL, men allt det funkar där i alla fall. Det finns också mer funktionalitet där, med SSRS (Reporting Services för att skapa grafer och sånt) exempelvis, och massa olika typer av jobb som kan köras på schema, triggers eller så.

Men idag med Mongo så tänker man knappt på databasen alls. Man sätter upp lite regler vid skapandet, som rensning av gammalt, lite index och så, sen jobbar man i koden och sparar det i databasen bara typ.

Permalänk
Medlem
Skrivet av ELF:

Det har nämnts redan, men kan nämna att min morfar körde MS Access och Excell för sin trädgård. Han hade även CADat upp landen som han sedan länkade i Access. Jag har aldrig riktigt lärt mig Access så det sitter, men var ända ganska lätt att komma in i trots min då väldigt unga ålder. Tror detta skulle innebära minst jobb om du enbart kör lokalt.

Men vill du prompt programmera en webbsida så skulle jag rekommendera att du inte gör allt direkt. Utan dela upp det i flera steg.
Detta är ett råd jag skulle ge mig själv om jag kunde innan jag började med mitt projekt jag håller på med. Har tagit längre tid än vad jag trodde. Till stor del för att jag bara köttade på med allt direkt istället för att dela upp det.

  1. Håll det simpelt i detta steg. Gör så lite som möjligt för att få sidan att fungera. Skippa javascript. Skriv ingen "onödig" serverside kod. För körs sidan enbart lokalt så behöver du inte bry dig om säkerheten och det gör absolut ingenting om sidan måste laddas om när du lägger till eller ändrar information. Bry dig heller inte om pixelperfection, använd css för att enbart få till en grundstruktur.

  2. Börja implementera javascript.

  3. Jobba på designen

  4. Lägg till annan funktionalitet som du möjligen har kommit på som skulle vara trevlig att ha.

  5. Förbättra säkerheten om sidan ska publiceras publikt. Räkna dock inte med att den är säker om du inte har koll på ämnet.

Är du okej med att hela sidan laddas om vid användning, det kanske inte stör så mycket. Då kan du göra punkt 2 och 3 i omvänd ordning.

Förstår varför det är flera i tråden som pekar mig mot Access då det troligen är synnerligen optimalt för just mig och såna här projekt. Det känns dock inte som att jag skulle lära mig de saker jag önskar få ut av det här om jag körde Access dock då det känns rätt gammalt och inte används så mycket längre (eller snarare, inte borde användas så mycket längre).

Skrivet av snajk:

Stored procedures går att använda men idag kör man normalt någon ORM (Object Relational Mapping) som EF (Entity Framework) så behöver man inte tänka på databasen utan bara jobba med koden, eller försåts någon DB som inte kör SQL. På jobbet kör vi MongoDB exempelvis, lätt att använda från .Net.

Sökte lite på ORM, MSSQL, node.js och hittade sequelize. Om jag förstår det rätt så bygger man sina tabeller och allting direkt i koden om man vill köra det verktyget rakt igenom? Jag hittade en guide på youtube och har hunnit till video tre. Det känns som att ORM handlar om att interagera direkt med databasen från sin kod? Man bygger då inget REST-api som sådant utan använder t.ex. sequelize för att prata direkt med databasen, vilket verkar väldigt användbart men inte är vad jag är ute efter att lära mig i det här steget. Jag är dock genast sugen på att göra något med den här kunskapen så får väl hitta på nått framgent nu när jag känner till det.

Skrivet av WebbkodsLärlingen:

Tjo! Jag hjälper gärna till i den utsträckning jag kan då min nästa programtermin börjar den 28 augusti 2023 inom Webbutveckling och jag har redan blivit uttråkad av min "enskild firma- & studentsemester". Eller snarare att jag tycker att webbutveckling är riktigt kul på riktigt nu när man faktiskt kan lite av grunderna och behöver "(arbets)livserfarenhet" inom det!

Den lösning jag ser framför mig (utifrån det jag kan än så länge) är:
- Simpel HTML+CSS för frontend (går ju alltid att göra snyggare i efterhand med Bootstrap, Tailwind, etc.)
- MySQL/MariaDB som databaslösning (SQL alltså)
- JavaScript för att skicka fetch()-anrop till REST API:t som i sin tur är PHP-baserat
- Allt detta kan köras lokalt via XAMPP(PC) eller LAMP(Mac)

Då databasen är själva hjärtat i projektet så är dess "design" (ER-diagram(?)) viktigt så att implementeringen och användningen av den sedan inte kommer med några irriterande överraskningar. Tänk om du exempelvis upptäcker att efter hundra raders databasinsättningar så skulle du behövt en ytterligare tabell med data för alla databasinsättningar, eller en ytterligare kolumn i en tabell med data. Och så blir det massa efterarbete på grund av ej välgenomtänkt databasdesign.

Några tankar jag har kring din nuvarande DB-design är:
- En sak som du kanske vill lägga till för de flesta tabeller är vem som genomfört så blir det enkelt sedan när en ny person vill använda sig av samma app och där det då står deras namn istället för ditt namn i tabeller som beskriver händelser som exempelvis Bevattningstillfällen och så?

- PK i "Plantor" samtidigt som du har FK "Planterad!" innebär ju att du inte får ha samma slags planta planterad på fler än en PK "PlanteringsPlatser" (eftersom PK måste vara unik för varje rad i Plantor-tabellen). Då tänker jag istället att du har en N:M-tabell mellan tabellerna "Plantor" och "PlanteringsPlatser" som då tillåter att Varje i "Plantor" kan vara "Planterad!" på flera olika "PlanteringsPlatser".

- Tabellen "BevattningsTillfällen" så kanske du även vill veta för vilken "PlanteringsPlatser" det ägde rum på? Då bör du ha en FK från den tabellen. Du kanske bevattnar en planta på en Planteringsplats en dag men sedan bevattnar samma slags planta men en annan dag på en annan Planteringsplats?

- Tabellen "OdlingsPlatser" kanske ska betraktas som en sammansatt PK (OdlingsPlatsNr+PlanteringsPlatsers PK) för varje OdlingsPlats kan ju ha ett platsnummer (odlingsplats 1, odlingsplats 2, osv) men de får bara existera om de finns på en PlanteringsPlats? Så du har exempelvis: Odlingsplats 1 på Planteringsplats 1, Odlingsplats 2 på Planteringsplats 1, osv? Då går det ej att ha Odlingsplats 1 på Planteringsplats 1 igen eftersom det blir en upprepning av PK vilket ej tillåts.

- Tabellerna "Gödsel", "Sorter", "OdlingsMedier" och "Vatten" tycker jag är bra som de är !

Hojta till här eller i "Meddelanden" om du vill tjöta vidare!

Mvh,
WKL.

Jag har faktiskt ritat ett ER-diagram också men la inte in det i min startpost. Det går att hitta här.

När det kommer till plantorna så undrar jag om vi har olika idéer om vad det är jag avser att ha i den tabellen? Jag tänker mig att varje enskild planta ska finnas med där (och ha en märkning/id i sin kruka) så det kan t.ex. finnas 4st San Marzano tomatplantor med sina egna unika ID och planteringsplatser, eller alla fyra i en odlingsbädd med AntalPlatser = 4. När jag lägger in att en given planta vattnats kan jag således få fram dess planteringsplats och dylikt med joins om så behövs. De olika sorterna av planta bor i tabellen sorter och varje planta får sin sort från ÄrAvSort attributet som är FK från Sorter-tabellen.

När det kommer till PlanteringsPlatser och OdlingsPlatser kan jag bevisligen välja bättre namn. Min tanke är att planteringsplatser är krukor/odlingsbäddar av olika storlek. Dessa kan bara finnas på en OdlingsPlats i taget, vilka är t.ex. växthus 1, köksträdgården, altanen o.dyl. Givet den informationen, tror du fortfarande att jag borde tänka om något?

När det kommer till ägare av saker har jag också tänkt tanken men vet inte hur jag ska implementera det riktigt. Min tanke just nu är att göra ett Proof-of-concept först där saker är minimalt komplicerade (dvs mer än tillräckligt komplicerade för mig) och sen bygga ut. Att få med en användarkolumn tänker jag mig ska vara en relativt smal sak i en eventuell framtid om jag först är den enda användaren så kan jag i ett senare skeda lägga till kolumnen och sätta den till mitt ID för alla rader i alla tabeller.

Min "stack" som den ser ut i skrivande stund är:

  • SQLExpress (hade den installerad sen tidigare och ska använas i en kurs kommande termin så lika bra att fortsätta med den)

  • Node.js+Express.js som backend, eftersom jag hittade en guide om det.

  • Webbsidan har jag inte börjat med än men det lär väl bli html+css+js antar jag, är något jag verkligen drar mig för då jag har väldigt små kunskaper i området men hur svårt kan det vara

Min progression
Fick faktiskt lite tid för detta och är oerhört stolt över att jag lyckats skicka ett GET-anrop till min "server" och fått tillbaka data! Jag följer denna guide och har kommit till "The response of GET api" rubriken så nästa grej är att köra POST.

Om någon annan hittar den här tråden och vill följa samma guide så kan jag säga att det märks att den är gammal ibland. För det första tror jag att det kan vara så att man inte längre skriver var foo = required("foo") i javascript för alla nyare filmer jag hittar säger istället const foo = required("foo") men jag har kört med var och det verkar fungera.

Min connect.js funkade inte från början men jag hittade att man behöver lägga till

options: { "enableArithAbort": true, "encrypt":false }

i connectionpool objektet så funkade det sen, eller ja då funkade det så länge man hade skapat användaren på rätt sätt, tillåter sql authentication i SSMS/MSSQL, faktiskt har sql browsern igång och har satt en port som går att ansluta till. Att säga att det här tog mig lite googlande att lista ut är en underdrift!

För min egen skull lägger jag lite hjälpsamma länkar här:
Error 223 i MSSQL anslutning
Hitta dynamic port för MSSQL
Slå igång TCP/IP för MSSQL server
Slå igång SQL Server Browser servicen

Som avslut kan jag säga att jag verkligen inte känner mig hemma i node/express/javascript så det är mycket (bara) copy paste just nu men jag tänker mig att jag ska lära mig på vägen. I guiden finns alla standardmetoder för CRUD så jag tänkte försöka implementera det för en av mina testtabeller till en början via guiden och när det fungerar så tänkte jag ge mig på att göra så enkel hemsida som möjligt som kan använda anropen. För Create tänker jag mig i princip två rutor och en knapp för att skriva in datum och plantid, sen något liknande i svårighetsgrad för övriga saker. Den delen skrämmer mig som sagt mest i det här men jag tänkte luta mig en hel del mot chatgpt till en början.

Inser att om node+express är den mer lättskrivna varianten så lär java vara rent utsagt horribelt om det är mycket mer att skriva Fördelen där skulle kanske vara att det skulle finnas en chans att jag förstod vad jag höll på med mer än 5% av tiden

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Avstängd
Skrivet av Daz:

Förstår varför det är flera i tråden som pekar mig mot Access då det troligen är synnerligen optimalt för just mig och såna här projekt. Det känns dock inte som att jag skulle lära mig de saker jag önskar få ut av det här om jag körde Access dock då det känns rätt gammalt och inte används så mycket längre (eller snarare, inte borde användas så mycket längre).

Access är lite "DB Light" på vissa sätt, men samtidigt inte så "light" för det är rätt kraftfullt. Inte riktigt i nivå med typ SQL Server eller så, men å andra sidan är det ju ett verktyg för användare till skillnad från de flesta databaser som är ägnade åt utvecklare som i sin tur får bygga de användarinriktade applikationerna.

Men ja, det används på en del ställen där det verkligen inte borde användas. Mitt jobb använder exempelvis en mjukvara som ligger mellan vår hårdvara (och den mer hårdvarunära mjukvaran där) och vår mjukvara på högre nivå. Den är inte modern på något sätt utan tvärtom, stöder bara filnamn med 8+3 tecken exempelvis och känns i allmänhet som något från tidigt nittiotal. Ett av deras verktyg som man måste använda innan man kan använda själva runtime-mjukvaran för att bygga upp systemet är typ ett väldigt specifikt CAD-program vars output är en krypterad Access-DB som man sen får importera i den andra mjukvaran (på idag väldigt krångliga sätt som innefattar flera andra program för att packa upp och kompilera ihop lösningen). Det funkar men det är rätt begränsande, och vi slår ju i återvändsgränder hela tiden tack vare att vi kör på den mjukvaran liksom. Access är väl inte problemet dock, mer ett symptom på att en modernisering borde ha skett för många år sedan.

Citat:

Sökte lite på ORM, MSSQL, node.js och hittade sequelize. Om jag förstår det rätt så bygger man sina tabeller och allting direkt i koden om man vill köra det verktyget rakt igenom? Jag hittade en guide på youtube och har hunnit till video tre. Det känns som att ORM handlar om att interagera direkt med databasen från sin kod? Man bygger då inget REST-api som sådant utan använder t.ex. sequelize för att prata direkt med databasen, vilket verkar väldigt användbart men inte är vad jag är ute efter att lära mig i det här steget. Jag är dock genast sugen på att göra något med den här kunskapen så får väl hitta på nått framgent nu när jag känner till det.

Nja, tanken är väl att man använder en ORM när man bygger sitt REST-api. Du bygger en backend som i princip är ett hyfsat simpelt api mot databasen, med GET, PUT, PATCH, DELETE-metoder för respektive klass/objekttyp som då uppdaterar basen och sen anropar du dessa från din frontend (Swagger är trevligt för att testa detta, ger ett autogenererat gui mot ditt api). Validering exempelvis har man i backenden för säkerhet, men också i frontend för att göra det mer responsivt.

Eller så kör man en dokumentbaserad databas istället för en relationsbaserad. Då använder man inte en ORM utan en ODM (Object Document Mapper), men funktionsmässigt är det ju ungefär samma sak.

Poängen med en ORM/ODM är ju att utvecklaren får jobba med objekt i koden, som den är bra på, och behöver inte bry sig om att skriva SQL querys eller liknande utan bara skapa ett objekt från data, göra ändringarna som användaren begärt, och spara. Generellt får man också funktioner för att skapa databasen utifrån objektklasserna i koden, så att man inte behöver tänka på det.

Citat:

Jag har faktiskt ritat ett ER-diagram också men la inte in det i min startpost. Det går att hitta här.

När det kommer till plantorna så undrar jag om vi har olika idéer om vad det är jag avser att ha i den tabellen? Jag tänker mig att varje enskild planta ska finnas med där (och ha en märkning/id i sin kruka) så det kan t.ex. finnas 4st San Marzano tomatplantor med sina egna unika ID och planteringsplatser, eller alla fyra i en odlingsbädd med AntalPlatser = 4. När jag lägger in att en given planta vattnats kan jag således få fram dess planteringsplats och dylikt med joins om så behövs. De olika sorterna av planta bor i tabellen sorter och varje planta får sin sort från ÄrAvSort attributet som är FK från Sorter-tabellen.

När det kommer till PlanteringsPlatser och OdlingsPlatser kan jag bevisligen välja bättre namn. Min tanke är att planteringsplatser är krukor/odlingsbäddar av olika storlek. Dessa kan bara finnas på en OdlingsPlats i taget, vilka är t.ex. växthus 1, köksträdgården, altanen o.dyl. Givet den informationen, tror du fortfarande att jag borde tänka om något?

När det kommer till ägare av saker har jag också tänkt tanken men vet inte hur jag ska implementera det riktigt. Min tanke just nu är att göra ett Proof-of-concept först där saker är minimalt komplicerade (dvs mer än tillräckligt komplicerade för mig) och sen bygga ut. Att få med en användarkolumn tänker jag mig ska vara en relativt smal sak i en eventuell framtid om jag först är den enda användaren så kan jag i ett senare skeda lägga till kolumnen och sätta den till mitt ID för alla rader i alla tabeller.

Min "stack" som den ser ut i skrivande stund är:

  • SQLExpress (hade den installerad sen tidigare och ska använas i en kurs kommande termin så lika bra att fortsätta med den)

  • Node.js+Express.js som backend, eftersom jag hittade en guide om det.

  • Webbsidan har jag inte börjat med än men det lär väl bli html+css+js antar jag, är något jag verkligen drar mig för då jag har väldigt små kunskaper i området men hur svårt kan det vara

Min progression
Fick faktiskt lite tid för detta och är oerhört stolt över att jag lyckats skicka ett GET-anrop till min "server" och fått tillbaka data! Jag följer denna guide och har kommit till "The response of GET api" rubriken så nästa grej är att köra POST.

Om någon annan hittar den här tråden och vill följa samma guide så kan jag säga att det märks att den är gammal ibland. För det första tror jag att det kan vara så att man inte längre skriver var foo = required("foo") i javascript för alla nyare filmer jag hittar säger istället const foo = required("foo") men jag har kört med var och det verkar fungera.

Min connect.js funkade inte från början men jag hittade att man behöver lägga till

options: { "enableArithAbort": true, "encrypt":false }

i connectionpool objektet så funkade det sen, eller ja då funkade det så länge man hade skapat användaren på rätt sätt, tillåter sql authentication i SSMS/MSSQL, faktiskt har sql browsern igång och har satt en port som går att ansluta till. Att säga att det här tog mig lite googlande att lista ut är en underdrift!

För min egen skull lägger jag lite hjälpsamma länkar här:
Error 223 i MSSQL anslutning
Hitta dynamic port för MSSQL
Slå igång TCP/IP för MSSQL server
Slå igång SQL Server Browser servicen

Som avslut kan jag säga att jag verkligen inte känner mig hemma i node/express/javascript så det är mycket (bara) copy paste just nu men jag tänker mig att jag ska lära mig på vägen. I guiden finns alla standardmetoder för CRUD så jag tänkte försöka implementera det för en av mina testtabeller till en början via guiden och när det fungerar så tänkte jag ge mig på att göra så enkel hemsida som möjligt som kan använda anropen. För Create tänker jag mig i princip två rutor och en knapp för att skriva in datum och plantid, sen något liknande i svårighetsgrad för övriga saker. Den delen skrämmer mig som sagt mest i det här men jag tänkte luta mig en hel del mot chatgpt till en början.

Inser att om node+express är den mer lättskrivna varianten så lär java vara rent utsagt horribelt om det är mycket mer att skriva Fördelen där skulle kanske vara att det skulle finnas en chans att jag förstod vad jag höll på med mer än 5% av tiden

Ärligt talat låter det som att det hade kunnat passa med NoSQL, alltså en dokumentbaserad databas snarare än en relationsdatabas med tabeller, för dina behov. Det ändrar ju en del i hur man ska tänka i uppbyggnaden av databasen förstås, men det underlättar framtida ändringar väldigt mycket, och så länge det inte handlar om några enorma mängder data så är prestandan inget problem.

Permalänk
Medlem
Skrivet av snajk:

Access är lite "DB Light" på vissa sätt, men samtidigt inte så "light" för det är rätt kraftfullt. Inte riktigt i nivå med typ SQL Server eller så, men å andra sidan är det ju ett verktyg för användare till skillnad från de flesta databaser som är ägnade åt utvecklare som i sin tur får bygga de användarinriktade applikationerna.

Men ja, det används på en del ställen där det verkligen inte borde användas. Mitt jobb använder exempelvis en mjukvara som ligger mellan vår hårdvara (och den mer hårdvarunära mjukvaran där) och vår mjukvara på högre nivå. Den är inte modern på något sätt utan tvärtom, stöder bara filnamn med 8+3 tecken exempelvis och känns i allmänhet som något från tidigt nittiotal. Ett av deras verktyg som man måste använda innan man kan använda själva runtime-mjukvaran för att bygga upp systemet är typ ett väldigt specifikt CAD-program vars output är en krypterad Access-DB som man sen får importera i den andra mjukvaran (på idag väldigt krångliga sätt som innefattar flera andra program för att packa upp och kompilera ihop lösningen). Det funkar men det är rätt begränsande, och vi slår ju i återvändsgränder hela tiden tack vare att vi kör på den mjukvaran liksom. Access är väl inte problemet dock, mer ett symptom på att en modernisering borde ha skett för många år sedan.
Nja, tanken är väl att man använder en ORM när man bygger sitt REST-api. Du bygger en backend som i princip är ett hyfsat simpelt api mot databasen, med GET, PUT, PATCH, DELETE-metoder för respektive klass/objekttyp som då uppdaterar basen och sen anropar du dessa från din frontend (Swagger är trevligt för att testa detta, ger ett autogenererat gui mot ditt api). Validering exempelvis har man i backenden för säkerhet, men också i frontend för att göra det mer responsivt.

Eller så kör man en dokumentbaserad databas istället för en relationsbaserad. Då använder man inte en ORM utan en ODM (Object Document Mapper), men funktionsmässigt är det ju ungefär samma sak.

Poängen med en ORM/ODM är ju att utvecklaren får jobba med objekt i koden, som den är bra på, och behöver inte bry sig om att skriva SQL querys eller liknande utan bara skapa ett objekt från data, göra ändringarna som användaren begärt, och spara. Generellt får man också funktioner för att skapa databasen utifrån objektklasserna i koden, så att man inte behöver tänka på det.
Ärligt talat låter det som att det hade kunnat passa med NoSQL, alltså en dokumentbaserad databas snarare än en relationsdatabas med tabeller, för dina behov. Det ändrar ju en del i hur man ska tänka i uppbyggnaden av databasen förstås, men det underlättar framtida ändringar väldigt mycket, och så länge det inte handlar om några enorma mängder data så är prestandan inget problem.

Jag får ont i huvudet när du säger krypterad access-db som ska konverteras. Har erfarenhet av liknande hemskheter...

Ska se om jag kan få in lite läsning om NoSQL databaser framöver, gjorde en snabb titt på wikipediasidan om fenomenet men särskilt mycket fastnade inte ska erkännas... Som jag tror mig ha nämnt någonannanstans i tråden är en del av det här projektet att lära mig inför en kurs jag ska plugga kommande termin och däri är det nog (tyvärr?) bara sql databaser som gäller så jag kommer nog hålla mig till relationsbaserade sådana en stund till bara därför.

Sedan är dagens uppdatering att jag nu följt guiden och fått in en post-metod som fungerade med Restfox för att skicka post-request till servern. Eftersom jag är dålig på html+css+javascript bad jag sedan chatgpt skriva ihop ett minimalt exempel baserat på mina önskemål om funktionalitet. Den valde då att använda sig av XMLHTTPRequest i koden men baserat på @WebbkodsLärlingen svar ovan bad jag den istället använda fetch() och det blev, i min mening, mer läsbart. Stötte på problem med att servern inte svarade alls och efter lite resonemang med AI'n kom det fram att cors-headers behövde fixas, något jag inte ens visste vad det var men den rekommenderade att jag la till:

// Middleware för att sätta CORS-headers app.use(function(req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); res.setHeader('Access-Control-Allow-Credentials', true); next(); });

Den gav mig även en kort förklaring av vad de gör

Access-Control-Allow-Origin: Anger vilka domäner som har tillstånd att göra förfrågningar till servern. Om du vill tillåta förfrågningar från alla domäner kan du sätta värdet till "*", men för en mer restriktiv konfiguration kan du specificera de domäner som är tillåtna.

Access-Control-Allow-Methods: Anger vilka HTTP-metoder (t.ex. GET, POST, PUT, DELETE) som är tillåtna för förfrågningar från andra domäner.

Access-Control-Allow-Headers: Anger vilka HTTP headers som är tillåtna i förfrågningar från andra domäner. Detta inkluderar vanligtvis standardheaders som Accept, Content-Type, Authorization etc.

Access-Control-Allow-Credentials: Anger om webbläsaren ska inkludera cookies och autentiseringsuppgifter i förfrågningar från andra domäner. Om du tillåter att webbläsaren skickar cookies, måste även withCredentials-flaggan i JavaScript-XMLHttpRequest-objektet vara satt till true.

Dold text

Än så länge känns det som jag mest bara klipper och klistrar ihop saker men jag ber AI'n förklara vad de olika kodsnuttarna gör och upplever ändå en liten progression. Nästa steg i guiden är att lägga till .put och .delete som anrop för min tabell. Efter det tänkte jag försöka, manuellt, uppdatera den AI genererade html-koden och javascript filen så att det går att skicka även sådana kommandon

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem
Skrivet av Daz:

Jag får ont i huvudet när du säger krypterad access-db som ska konverteras. Har erfarenhet av liknande hemskheter...

Ska se om jag kan få in lite läsning om NoSQL databaser framöver, gjorde en snabb titt på wikipediasidan om fenomenet men särskilt mycket fastnade inte ska erkännas... Som jag tror mig ha nämnt någonannanstans i tråden är en del av det här projektet att lära mig inför en kurs jag ska plugga kommande termin och däri är det nog (tyvärr?) bara sql databaser som gäller så jag kommer nog hålla mig till relationsbaserade sådana en stund till bara därför.

Sedan är dagens uppdatering att jag nu följt guiden och fått in en post-metod som fungerade med Restfox för att skicka post-request till servern. Eftersom jag är dålig på html+css+javascript bad jag sedan chatgpt skriva ihop ett minimalt exempel baserat på mina önskemål om funktionalitet. Den valde då att använda sig av XMLHTTPRequest i koden men baserat på @WebbkodsLärlingen svar ovan bad jag den istället använda fetch() och det blev, i min mening, mer läsbart. Stötte på problem med att servern inte svarade alls och efter lite resonemang med AI'n kom det fram att cors-headers behövde fixas, något jag inte ens visste vad det var men den rekommenderade att jag la till:

// Middleware för att sätta CORS-headers app.use(function(req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); res.setHeader('Access-Control-Allow-Credentials', true); next(); });

Den gav mig även en kort förklaring av vad de gör

Access-Control-Allow-Origin: Anger vilka domäner som har tillstånd att göra förfrågningar till servern. Om du vill tillåta förfrågningar från alla domäner kan du sätta värdet till "*", men för en mer restriktiv konfiguration kan du specificera de domäner som är tillåtna.

Access-Control-Allow-Methods: Anger vilka HTTP-metoder (t.ex. GET, POST, PUT, DELETE) som är tillåtna för förfrågningar från andra domäner.

Access-Control-Allow-Headers: Anger vilka HTTP headers som är tillåtna i förfrågningar från andra domäner. Detta inkluderar vanligtvis standardheaders som Accept, Content-Type, Authorization etc.

Access-Control-Allow-Credentials: Anger om webbläsaren ska inkludera cookies och autentiseringsuppgifter i förfrågningar från andra domäner. Om du tillåter att webbläsaren skickar cookies, måste även withCredentials-flaggan i JavaScript-XMLHttpRequest-objektet vara satt till true.

Dold text

Än så länge känns det som jag mest bara klipper och klistrar ihop saker men jag ber AI'n förklara vad de olika kodsnuttarna gör och upplever ändå en liten progression. Nästa steg i guiden är att lägga till .put och .delete som anrop för min tabell. Efter det tänkte jag försöka, manuellt, uppdatera den AI genererade html-koden och javascript filen så att det går att skicka även sådana kommandon

Det finns ett npm-paket som heter cors annars, om du vill ha lite mindre kod.

app.use(cors());

Du kan lägga in ett objekt med config också, så det kanske inte blir så mycket mindre kod, men men paketet finns iaf.

Permalänk
Medlem
Skrivet av Daz:

Förstår varför det är flera i tråden som pekar mig mot Access då det troligen är synnerligen optimalt för just mig och såna här projekt. Det känns dock inte som att jag skulle lära mig de saker jag önskar få ut av det här om jag körde Access dock då det känns rätt gammalt och inte används så mycket längre (eller snarare, inte borde användas så mycket längre).

...

Tycker du gör helt rätt. Förstår varför du vill göra det. Och håller med att för att uppnå en lösning snabbt är du på fel väg, men för att lära dig så gör du helt rätt.

Mitt råd är tänk inte så mycket på vilken teknologi du använder. Jag hade kört med en traditionell SQL databas och populärt språk som används mycket idag. Mitt projekt är totalt OVERKILL men är till för mig själv och hålla mig uppdaterad. Fokuserade på datapipeline och automatisering. Nått jag itne har behov av at all hemma, men på jobbet - ja.

Men återigen, fundera på metodiken, du skriver du skall ha API och lära dig det, men det är ju bara ett sätt att kommunicera med en databas. (iofs inget dumt sätt, men ett sätt, inte för allt, men i ditt case rätt).

Jag hade gått på det du tänkt, med de verktyg du bestämt. Börjar du googla och fråga för mycket om teknik så finns det alltid en ny teknkik runt hörnet som är de bäst shit. (finns ett kul youtube klipp på nätet där man skapar det sämsta programmeringspråket evver - det finns en del avvarter, men poängen är det har kommit mycket som skall lösa gamla problem, men fortfarande lever sånt som är "dåligt" kvar eftersom det kommit att användas).

Men när du väl har koll på metodiken, t.ex skapa effektiva API calls, fokusera på hur det bör struktureras i din valda teknik platform. Mycket är samma. Det finns vktigare saker att förstå och implementera som testing, change management... osv. Har du koll på allt detta i din platform som du valt så kommer du kunna enkelt överföra den kunskapen till whatever.

Så egentligen, välj platform där det finns bra dokumentation. Bra hjälp på nätet. Det är alltid svårare om man skall va cutting edge. Det blir en hel del gissningar, och när du väl skall ut och nyttja det så möts du av en IBM maskin som kör databas med design från -80. (Japp ). Samtidigt så lever dom stora språken kvar på företagen, och det är få som investerar i att refaktorera dom till nått nytt.

Permalänk
Medlem

Jag tycker du har rätt idé och jag säger kör bara på det du har skrivit i huvudtråden.

Keep it simple och börja bygg en prototyp med de funktioner du vill uppnå, ha det lokalt till en början och se om det funkar och uppfyller dina behov.

Risken med att krångla till det för mycket i början är att du inte börjar alls, det är ingen svår app du vill bygga och du kan uppgradera sen när du har något

Visa signatur

Fractal Design Node 304 -> ASUS ROG STRIX Z370-I GAMING ->i5 8600K -> be quiet! Pure Rock -> MSI GeForce RTX 4070 VENTUS 2X E 12G OC -> Corsair Vengeance LPX 3200 32GB -> Seasonic FOCUS Plus 650W Gold -> Samsung 960 EVO 500GB -> 2 * Western Digital Black 2 TB -> Samsung 850 EVO Basic SSD 500GB