Form kullanımı, yeni kullanıcılar eklemek

Bu makalede oluşturduğumuz günlüğe nasıl yeni kullanıcılar ekleyebileceğimizi öğreneceğiz.

Form kullanımı, yeni kullanıcılar eklemek

Öncelikle bu makalede sizi biraz yokuşa süreceğim.

Diğer taraftan anlatılanları uygulayıp anlamakta fayda var.

Eğer hazırsanız koltuklarınıza yaslanın ve derse başlayalım.

Önceki derste sayfa desenlerinden bahsetmiştik.

İlk önce yeni kullanıcı kaydı ile başlayalım.

Bu derste views klasöründe kullanici isimli bir dizin oluşturuyoruz.

Bu dizinin içinde olustur.dt isimli bir sayfa deseni oluşturuyoruz.

extends desenler/ana

block icerik
  .kullanici-olustur
    h1.icerik-altbaslik Yeni bir kullanıcı oluşturun
    section.kullanici-olustur
      form.pure-form.pure-form-aligned(method='post', action='/kullanıcı/oluştur')
        fieldset
          .pure-control-group
            label(for='isim') İsim
            |
            input#isim(name='isim', type='text')
          |
          .pure-control-group
            label(for='eposta') Elektronik posta
            |
            input#eposta(name="eposta", type='email')
          |
          .pure-control-group
            label(for='kullaniciismi') Kullanıcı ismi
            |
            input#kullaniciismi(name="kullaniciismi", type='text')
          |
          .pure-control-group
            label(for='sifre') Şifre
            |
            input#sifre(name='sifre', type='password')
          |
          .pure-control-group
            label(for='sifretekrar') Şifreyi tekrar giriniz
            |
            input#sifretekrar(name='sifretekrar', type='password')
            |
          |
          .pure-controls
            label.pure-checkbox(for='aligned-cb')
              input#aligned-cb(type='checkbox')
              |  Kullanım şartlarını okudum ve kabul ediyorum
            |
            button.pure-button.pure-button-primary(type='submit') Gönder

Sayfayı html'den kullandığımız desene çevirmek için bu aracı kullanabilirsiniz.

Bu aşamada kaynak kütüğüne oluşturduğumuz sayfa desenini ekleyip dub komutunu çalıştırarak yeni oluşturduğumuz kullanıcı kayıt sayfasının nasıl göründüğüne bakabiliriz.

import vibe.vibe;

void main()
{
    auto yolAtayıcı = new URLRouter;
    yolAtayıcı.get("/", staticTemplate!"gunluk/index.dt");
    yolAtayıcı.get("/kayıtol", staticTemplate!"kullanici/olustur.dt");
    yolAtayıcı.get("*", serveStaticFiles("public"));
    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8080;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, yolAtayıcı);

    logInfo("Lütfen tarayıcınızla http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Uygulamayı dub komutu ile derledikten sonra http://localhost:8080/kayıtol adresinden kullanıcı kayıt sayfasının son halini görebilirsiniz.

Vibe.d kullanıcı eklemek

Ancak bu aşamada henüz kayıt yapmıyor.

Eski kayıtları siliyoruz

Öncelikle kullanıcılar isimli belgedeki kayıtları silip, sayaç isimli bir belge oluşturalım.

Öncelikle mongo uygulamasını açıyoruz.

mongo

Daha sonra kiraz veritabanına geçelim.

> use kiraz

Eski kayıtları silelim.

> db.kullanıcılar.drop()

Aşağıdaki komutla sayaç isimli bir belge oluşturalım. Bu belgeye de bir kayıt ekliyoruz.

> db.sayaç.insert({_id: "kullanıcıno" , değer: NumberInt(0)})

Uygulamadan çıkmak için aşağıdaki komutu kullanabilirsiniz.

> exit

Eğer Robo3T uygulaması kurulu ise oluşturduğumuz sayaç isimli belgeye bakabilirsiniz.

{
    "_id" : "kullanıcıno",
    "değer" : 0
}

Yeni kullanıcılar eklemek

Yeni kullanıcı eklemek için kiraz dizininin içindeki ana.d kütüğünü aşağıdaki gibi değiştirelim.

import vibe.vibe;
import vibe.db.mongo.mongo;
import std.datetime.systime : SysTime, Clock;

struct Kullanıcı
{
    @name("_id") int no;
    string isim;
    string eposta;
    string kullanıcı;
    string şifre;
    SysTime oluşturmazamanı;
}

int sonrakiKaydaGeç(string isim)
{
    auto veritabanı = connectMongoDB("127.0.0.1").getDatabase("kiraz");
    auto sayaç = veritabanı["sayaç"];
    auto sonuç = sayaç.findAndModifyExt(["_id": isim], ["$inc": ["değer": 1]], ["new": true]);
    logInfo("Sonuç %s", sonuç);
    return sonuç["değer"].get!int;
}

void kullanıcıOluştur (HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    import std.array:empty;

    string isim = istek.form.get("isim");
    string ePosta = istek.form.get("eposta");
    string kullanıcıİsmi = istek.form.get("kullaniciismi");
    string şifre = istek.form.get("sifre");
    string şifreTekrar = istek.form.get("sifretekrar");

    logInfo("Alınan bilgiler İsim = %s Eposta = %s", isim, ePosta);

    if (isim.empty || ePosta.empty || şifre.empty || şifre != şifreTekrar)
        yanıt.redirect("/kayıtol");
    else
    {
        auto veritabanı = connectMongoDB("127.0.0.1").getDatabase("kiraz");
        auto kullanıcılar = veritabanı["kullanıcılar"];

        Kullanıcı yeniKullanıcı;
        yeniKullanıcı.no = sonrakiKaydaGeç("kullanıcıno");
        yeniKullanıcı.isim = isim;
        yeniKullanıcı.eposta = ePosta;
        yeniKullanıcı.kullanıcı = kullanıcıİsmi;
        yeniKullanıcı.şifre = şifre;
        yeniKullanıcı.oluşturmazamanı = Clock.currTime();

        kullanıcılar.insertOne(yeniKullanıcı);
        yanıt.redirect("/");
    }
}

void main()
{
    auto yolAtayıcı = new URLRouter;
    yolAtayıcı.get("/", staticTemplate!"gunluk/index.dt");
    yolAtayıcı.get("/kayıtol", staticTemplate!"kullanici/olustur.dt");
    yolAtayıcı.post("/kullanıcı/oluştur", &kullanıcıOluştur);
    yolAtayıcı.get("*", serveStaticFiles("public"));
    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8080;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, yolAtayıcı);

    logInfo("Lütfen tarayıcınızla http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Uygulamayı dub ile çalıştırıp derleyiniz.

Tekrardan http://localhost:8080/kayıtol sayfasını açtığınızda artık yeni kayıt eklendiğini görebilirsiniz.

Uygulamaya parça parça bakacak olursak, kullanıcıOluştur() işlevinde kullanıcının girdiği form bilgilerini istek.form.get yordamıyla alıyoruz.

Eğer şifre, elektronik posta ve isim alanlarından herhangi birisi boşsa, kullanıcıyı tekrar kayıtol sayfasına yönlendiriyoruz.

Daha önce nasıl MongoDB ile veri okuyup yazabileceğinizden bahsetmiştik. Burada farklı olan kısım SysTime ile kayıt zamanını tutuyoruz. Clock.currTime() işlevi ise o anki zamanı veriyor.

MongoDB ile sayaç oluşturmak

Uygulamada, bir tane MongoDB kayıt numarasına _id karşılık gelen no alanının sonrakiKaydaGeç() işlevinin döndürdüğü tam sayı değeri aldığını görebilirsiniz.

Aslında MongoDB kayıt numarası _id alanı için sizden bir değer oluşturmanızı istemez. Bunu yukarıdaki uygulamada yeniKullanıcı isimli yapıdan no alanını çıkarak da kendiniz deneyebilirsiniz.

Diğer taraftan kayıt numarası _id alanı için 1, 2, 3 .. şeklinde değerler çok okunaklı oluyor.

sonrakiKaydaGeç() işlevine bakacak olursak, bu işleve "kullanıcıno" değerini geçiyoruz.

Bu işlev yeni oluşturduğumuz sayaç isimli belge ağacından kayıt kimliği (_id alanı) kullanıcıno olan belgeyi buluyor. ["$inc": ["değer": 1]] ifadesi ise değer alanını bir arttırıyor.

Hatırlarsanız MongoDB kayıtlarının BSON veri biçiminde sakladığından bahsetmiştik.

auto sonuç değişkeni BSON türünde bir değer döndürüyor. En sonda da bu değeri bir tamsayıya döndürüyoruz.

BSON veri biçemi nedir?

Bu yazdığımız örnekler uygulamanın bir parçası değil. Ancak isterseniz kendiniz deneyebilirsiniz.

Hatırlayabileceğiniz üzere BSON veri biçemi JSON'un ikili olarak saklanması ile oluşuyordu.

Örneğin {"isim": "Ali", "yaş": 22, "kayıtlı": true} şeklinde bir BSON nesnesi oluşturalım.

// normal kurucu ile
Bson ali = Bson(["isim": Bson("Ali"), "yaş": Bson(22), "kayıtlı": Bson(true)]);

Eğer istersek boş bir BSON nesnesi kullanarak, parça parça da oluşturabiliriz.

Bson veli = Bson.emptyObject;
veli['isim'] = "Veli";
veli['yaş'] = 18;
veli["kayıtlı"] = true;

Ya da bir yapı oluşturup bunu BSON veri biçemine çevirebiliriz.

struct Kullanıcı
{
    string isim;
    int yaş;
    bool kayıtlı;
}

Bson ayşe = Kullanıcı("Ayşe", 19, true).serializeToBson();

Yorumlar

yorum yaz

Yorum yaz

Henüz yorum yok.