Pereiti prie turinio

finansai

Patvirtinti nariai
  • Pranešimai

    1.848
  • Užsiregistravo

  • Lankėsi

  • Laimėta dienų

    8
  • Atsiliepimai

    100%

finansai Pranešimai

  1. Manau, gerai sugalvojai. Atsimink, kad gali būti scenarijus pvz.: user'is turėjo kokią nors moderatoriaus role, jį demotini, tačiau pas jį vis dar lokaliai yra sena role. Reikės šitą atsiminti. Dėl pačio componento struktūros, tai gali pačiame routerio faile pasiimt iš selectoriaus userio rolę ir nereikės passint per propsus. Taip pat gali įdėt redux store persistorių, kad kitą kartą atėjus nedingtų rolė.

    Beje, čia webinis appsas ar react native?

    Cia webinis. Pusiau realus projektas, pusiau mokomasis :) Nes iki siol mokinausi Java, bet dabar prireike ir fronta pasijungti.

     

    Tirsa ziurejau apie Context Api kur prieš tainkitas narys rrkomendavo. Tai kiek pasidomejau, visai tinkamas variantas laikyti rolei. Is tokeno issiparsinu role, ir Context Api pasiduodu. O is contexto galiu pasiimti bet kur.

  2. Siulyčiau vis tiek nedėti nes reikės anyway validuoti ar info teisinga. https://stackoverflow.com/a/18128078

    Taip, del ID manau tikrai nereikia, nes chekinsiu backe is security contexto pasiimdamas info. Kaip geriausia tada daryti su protected routes? Jei yra kelios roles. Vienas is variantu, tuomet su tokenu pasiduoti tik role. Ja laikyti reduxo pagalba (ko gero gal teisingiausia, tiesa apie redux minimaliai dar turiu ziniu) ir tada i routu propsus pasiduodu role, ir jei ji atitinka, rodo ta route.

  3. Nors pats renkuosi localstorage, JWT taip pat galima saugoti cookies, kokiam redux persisted storage, jei graphql, tai cache.

    Jei darai simple auth eksperimentą, šitai nėra taip svarbu, tačiau dažniausiai yra naudojami du tokenai: auth ir refresh. Auth naudojamas darant API requestus, jeigu auth tokenas failina (dažniausiai turi expiration laiką), tada daromas requestas prašant naujo auth tokeno headeryje prikabinant refresh tokeną. https://stackoverflow.com/questions/38986005/what-is-the-purpose-of-a-refresh-token

    Dėkui už info. Dabar darau kaip tik web varianta, kur tokena saugosiu localstorage. Tik kilo klausimas. Ar is backo pasiduoti json kur butu tokenas bei papildomai userio info (ID, role) ar paduoti is backo tik tokena, o user info pasiimti is tokeno payload?

  4. Gal kas galite pasidalinti rekomendacijom apie initial/default stylinimo settingsus, kuriant React web su Material UI. Esme, kad sukuriant nauja React projekta, buna defaultiniai index.css ir App.css As noriu viska stylinti su Material UI makeStyles. Viskas kaip ir gerai, bet kartais, buna kad atsiranda margin ant AppBar, nors reenderinant kitus komponentus, dingsta ir pan. Tai radau, viena .css default kodo gabala, kuris ale pritaiko initial nustatymus, kad to isvengti. Bet tada neradau tikslaus pvz., kaip footeri susitvarkyti, kad visada butu apacioje. Vienintelis ka padariau, tai i pagrindini div isidejau komponentus:

    <Header />

    <Main />

    <Footer />

    Ir padariau kad main aukstis minHeight butu 100vh. Bet itariu, kad cia nera gal teisingas sprendimas. O daugelis tutorialu apie atskirus komponentus, bet kaip pati pagrinda Material UI web ant React pradeti, kaip ir neuzmaciau.

  5. udemy, youtube, google java fundamentals, siaip del javos maciau lietuvis padare gal 30 video pamoku arba jei nori angliskai parasyk i youtube" thenewboston".

    Kuris lietuvis? Būtų idomu paziureti lietuvisku video.

  6. Aš su heroku nedeployinęs, bet iš eilučių 'rm -rf package-lock.json' ir '- rm -rf node_modules' nepanašu, kad tas žmogus, kuris rašė tutorial, labai gerai išmano ką daro.

     

    Grubiai buildas turėtų vykti taip:

    1. Parsitraukiamas tavo kodas iš repo (node_modules neturėtų būti sucommitinti, jų trinti dėl to nereikia)

    2. Praleidi npm install ir surašai node_modules.

    3. Praleidi testus, kodo stiliaus patikrinimus, jei tokie yra.

    4. Subuildini savo projectą (dažniausiai tai būna `npm run build` komanda, priklauso nuo to, kaip pas tave aprašytas package.json).

    5. Subuildintą projektą sukeli į serverį, kuris servins tavo subuildintus failus.

     

    Tai spėčiau, kad tas pipe į heroku turėtų praleisti buildą ir pahostinti jį. Reiktų pasigilinti kas ten vyksta.

     

    Pabandyk gal kitą tutorial pasižiūrėti.

    Dekui! Panasiai ir masciau, nes realiai cia kaip ir nevyksta buildas, o kaip suprantu archivinamas repo. Nes lieka eslint, pretier, ko neturetu buti build'e. Bandysiu perdaryti, nes ant Vercel.com viskas graziai susibuildina, o ant heroku neteisingai, tai reiskia bloga bitbucket-pipelines.yml konfiguracija.

  7. bitbucket-pipelines.yml:

     

    image: node:12.19.0 
    pipelines:
     branches:
       master:
         - step:
             name: Install App
             caches:
               - node
             script:
               - rm -rf package-lock.json
               - rm -rf node_modules
               - npm install
         - step:
              name: Create artifact
              script: 
                - git archive --format=tar.gz master -o                   app.tar.gz 
              artifacts: 
              - app.tar.gz
         - step:
              name: Deploy to heroku
              deployment: production
              caches:
                - node
              script:
                - pipe: atlassian/heroku-deploy:1.2.1
                  variables:
                   HEROKU_API_KEY: 'ggggg-bbbb-cccc-bbbb-aaaaa'
                   HEROKU_APP_NAME: 'pavadinimas' 
                   ZIP_FILE: "app.tar.gz"
                   WAIT: 'true'
    

     

    Pirmą kartą dariau, tai gali buti, kad problema su situ failu.

  8. Turiu toki docker-compose faila:

     

    version: '3'
    services:
     db:
       image: postgres:13
       container_name: myproject
       volumes:
         - data:/var/lib/postgresql/data
       ports:
         - "5435:5432"
       environment:
         - POSTGRES_PASSWORD=newpassword
         - POSTGRES_USER=newuser
    volumes:
     data:

     

    kai pasileidziu, viskas startuoja, bet buna toks pranesimas:

    PostgreSQL Database directory appears to contain a database; Skipping initialization

    Man rodo nauja konteineri, viskas kaip ir veikia.

    Prie DB prisijungiu per url jdbc:postgresql://localhost:5435/postgres, bet be default duombazes, is kazkur rodo sena DB pavadinima, nors tas konteineris jau istrintas kuriame buvau kures db tokiu pavadinimu. Gal kas gali paskyti ar cia kazkoks cach'as ar cia reikia kazka prasivalyti. Ar cia naudojamas tas pats postgres image su kazkur saugoma data?

  9. Jei vien basic authentication, tada tiesiog vartotojo vardas ir slaptažodis (juos saugoti localstorage ir kartu su užklausa perduoti). P.S kas nurodė, jei ne paslaptis, kad reikia naudoti tik basic authenticationą?

    Čia kol kas šiame etape, toks labiau mokymosi tikslais kodinimas, bet projektui įpusėjus, gali tekti jau pajungti ir tokenus. Tik galvoju, kad gal reikia Redux naudoti, bent jau iš info kiek googlinau, kad naudinga saugant kažkokią user info.

  10. Vartotojo duomenys turėtų būti naudojami tik prisijungimo metu. Jei prisijungimas sėkmingas, tuomet backend grąžina vartotojo tokeną (pvz. JWT). Jis sukuriamas kiekvienam prietaisui atskirai (dažniausiai, jei naudojamas kažkoks frameworkas backend'ui (pvz Laravel), tai jie jau turi paruoštus pluginus tam). React'as tą JWT išsaugo pas save (ir būtinai javascript localstorage, kad išliktų ir perkrovus puslapį). Tada kiekvieną kartą kreipiantis į backend'ą reikia perduoti tą JWT ir backend'as pagal jį ieško vartotojo ir apdoroja užklausą.

     

    1. Permission tipas ir vartotojo ID gali būti naudojama atvaizdavimui, bet visos užklausos, kurioms reikia permission'ų, turėtų būti apsaugotos backend'e.

     

    2. Logout'as daromas kreipiantis į backend'ą kuris ištrina token'ą pas save ir papildomai ištrinti React'e ir js localstorage token'ą, kuriuo identifikuojamaa vartotojas.

    Dėl JWT tokeno skaitinejau, buvau pasidaręs backe su Spring Security, bet kol kas gavau nurodymą naudoti tik basic authentication be tokeno, tai ir sprendžiu kaip tą daryti.

  11. Kol kas dar mokinuosi React. Ir turiu keletą klausimų. Backend su React bendrauja per API. Šiam momentui viskas vyksta su Basic Authentication. Ką pavyko pasidaryti, tai per Axios siunčiamas headeris su base64 užkoduotu email:password, ir backas jau grąžina kažkokią info jei prisijungimas pavyko. Kadangi naudojamas kol kas tik basic authentication, tai reiškia teks kas kart siųsti headeriuose athentication į backą, kad gauti duomenis. Klausimai, kurių kol kas normaliai neišsigooglinau:

     


    1.  
    2. Po user prisijungimo, kaip saugoti jo info (backas grąžina permission tipą ir ID). Tai reiktų saugoti permission tipą, kad pagal jį valdyti router linkus, pagal ID daryti kai kuriuos requestus, ir kažkur saugoti email+password uženkodintą su base64.
    3. Kaip atlikti logoutą? Kaip suprantu, tiesiog kažkur pakeisti state į empty stringus (permission-empty, id-empty, ir encodintas passwordas-empty)? Ir taip imituojamas logout?

  12. Čia labai gera niša uždarbiui tie kurie mokina, programuotoju tikrai netapsi baiges tuos kursus, cia nerealu, nebent tikrai talenta turi tam ir tiesiog zmogus neatrades saves, bet paprastam mirtingajam tai pinigu ismetimas i bala. Pats galvoju pradeti mokinti, nes pinigai geri, bet ir del to kad manau jog sugebeciau uzvesti zmogu ant kelio, nes kiek pats perejas tu kursu ir univere kiek mokinisies, tai galiu pasakyti kad visiskai ne nuo to galo mokina :D

    Programuotoju tampa ir po kursu isidarbina tikrai nedidele dalis (bent kiek teko is destytoju suprasti, tai is vienos laidos daznai buna koks 3-5 zmones, jei grupe apie 15-20 zmoniu). Dar problema, kad dalis jau kurso eigoje iskrenta, nes nespeja su tempu, kuris man atrodo pakankmai normalus. Pas mus jau iskrito 4 zmones is kurso, o dar liko 4 menesiai iki pabaigos.

  13. Gal kas patars del single responsability principo tokiame kode. Cia formuojamas path is user inputu. Kaip ir klase atlieka tai kas yra pavadinime, bet kiek skaiciau, klases kodas turi tilpti i ekrana, kitaip pazeidziamas SRP. Ka daryti su tokia klase, kaip ja perdaryti pagal SRP. Cia naudojami enum vietoje konstantu:

     

    public class PathBuilder {
    
      public String getPath() {
           Messages.printMessage("\nEnter search keyword or phrase.");
           return String.format("%s%s%s%s", UrlPart.PATH_BEGINNING.getName(), UserInput.getSearchTerm(), UrlPart.SLUG_IMAGE_TYPE.getName(), getSlugWithSelectedFeatures());
       }
    
       private String getPhotoOrientationValue() {
           Messages.printMessage("Select photo orientation: [1] horizontal, [2] vertical. \nEnter number or press 0 to continue without selection:");
           int number = UserInput.getNumberInput();
           switch (number) {
               case 1:
                   return UrlPart.SLUG_PHOTO_ORIENTATION.getName() + "horizontal";
               case 2:
                   return UrlPart.SLUG_PHOTO_ORIENTATION.getName() + "vertical";
               default:
                   return "";
           }
       }
    
       private String getColorValue() {
           Messages.printMessage("Select photo color: [1] black/white, [2] green, [3] blue. \nEnter number or press 0 to continue without selection:");
           int number = UserInput.getNumberInput();
           switch (number) {
               case 1:
                   return UrlPart.SLUG_COLOR_SELECTION.getName() + "bw";
               case 2:
                   return UrlPart.SLUG_COLOR_SELECTION.getName() + "green";
               case 3:
                   return UrlPart.SLUG_COLOR_SELECTION.getName() + "blue";
               default:
                   return "";
           }
       }
    
       private String getOderValue() {
           Messages.printMessage("Select photo order: [1] newest or press 0 to continue without selection:");
           int number = UserInput.getNumberInput();
           if (number == 1) {
               return UrlPart.SLUG_ORDER_BY.getName();
           }
           return "";
       }
    
       private String getSlugWithSelectedFeatures() {
           String color = getColorValue();
           String orientation = getPhotoOrientationValue();
           String order = getOderValue();
           if (!(color.equals("")) && !(orientation.equals("")) && !(order.equals(""))) {
               return UrlPart.AND_SIGN.getName() + color + UrlPart.AND_SIGN.getName() + orientation + "&" + order;
           } else if (!(color.equals("")) && !(orientation.equals(""))) {
               return UrlPart.AND_SIGN.getName() + color + UrlPart.AND_SIGN.getName() + orientation;
           } else if (!(orientation.equals("")) && !(order.equals(""))) {
               return UrlPart.AND_SIGN.getName() + orientation + UrlPart.AND_SIGN.getName() + order;
           } else if (!(color.equals("")) && !(order.equals(""))) {
               return UrlPart.AND_SIGN.name() + color + UrlPart.AND_SIGN.getName() + order;
           } else if (!(color.equals(""))) {
               return UrlPart.AND_SIGN.getName() + color;
           } else if (!(order.equals(""))) {
               return UrlPart.AND_SIGN.getName() + order;
           } else if (!(orientation.equals(""))) {
               return UrlPart.AND_SIGN.getName() + orientation;
           }
           return "";
       }
    }

  14. Radau kol kas tik toki sprendima, kad tvarkingai rodytu neisdidinant bloku su bet kokio apect-ratio foto:

     

    @media (min-width: 1200px) {
     .member-thumbnail-wrapper img {
     max-height: 200px;
     object-fit: cover;
     border-radius: 6px;
     -webkit-border-radius: 6px;
     -moz-border-radius: 6px;
     -ms-border-radius: 6px;
     -o-border-radius: 6px;
     }
    }

     

    Nustatciau max-height: 200px; ir object-fit: cover; lyg ir ok, dabar rodo. Beliko sulaukti pagalbos del sito kodo logikos, nes veikia, bet butu gerai ideju, kaip dar prideti salyga jei nera adreso, tel numerio, kad nerodytu:

     

    <?php
    if ( ! defined( 'ABSPATH' ) ) {
           exit;
    }
    
    global $post;
    
    ?>
    
    <?php do_action( 'wp_realestate_before_agent_content', $post->ID ); ?>
    
    ---->  <?php if ( has_post_thumbnail() ) { ?>
    
    <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
       <div class="agent-list agent-item">
           <div class="flex">
                   <?php if ( has_post_thumbnail() ) { ?>
                   <div class="member-thumbnail-wrapper flex-middle justify-content-center">
                       <?php homeo_agent_display_image( $post ,'medium'); ?>
                       <?php homeo_agent_display_nb_properties($post); ?>
                   </div>
               <?php } ?>
    
               <div class="agent-information flex-middle <?php echo esc_attr( (!has_post_thumbnail())?'no-image':''); ?>">
                   <div class="inner">
                           <?php the_title( sprintf( '<h2 class="agent-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
                       <?php homeo_agent_display_job( $post ); ?>
                       <div class="metas">
                           <?php homeo_agent_display_phone($post, 'title'); ?>
                           <?php homeo_agent_display_fax($post, 'title'); ?>
                           <?php homeo_agent_display_email($post, 'title'); ?>
                           <?php homeo_agent_display_website($post, 'title'); ?>
                       </div>
    
                       <div class="agent-information-bottom flex-middle">
                           <?php homeo_agent_display_socials($post); ?>
                           <div class="ali-right">
                               <a href="<?php the_permalink(); ?>" class="view-my-listings text-theme"><?php esc_html_e('View My Listings', 'homeo'); ?><i class="fas fa-chevron-right"></i></a>
                           </div>
                       </div>
                   </div>
               </div>
           </div>
       </div>
    </article><!-- #post-## -->
    
    ----->   <?php } ?>
    
    <?php do_action( 'wp_realestate_after_agent_content', $post->ID ); ?>

×
×
  • Pasirinkite naujai kuriamo turinio tipą...