Частина 4. Адміністратор даних

У цій частині ми покажемо, як написати простий переглядач ланцюжків KVS на NITRO та N2O.

Постановка задачі

Cторінки

KVS.Index

def event(:init) def event(:writers) def event({:link,id}) def event(:user) def event(:session) def event(:enode))

Червоним кольором виділені ідентифікатори DOM елементів, які заміняются на згенеровані на сервері частини HTML сторінок. Так, як це відбувається в Live View і навіть в PHP! Але, на відміну від використання Suck and Blow нотації для шаблонізаторів, таких як ASP, PHP, EEX, DTL та інших, NITRO пропонує вбудовування HTML5 в головну мову Erlang, та є фреймворком, який посідає достойне місце у своєму класі: OCaml Ocsigen, Scala Lift, SML UrWeb, F# WebSharper, Erlang Nitrogen. Основна ідея — пишемо усе на одній мові та навчаємо новачків на одній мові, причому одразу показуємо як писати на ній прості для розуміння веб додатки, що дозволяє швидше заглибитися у мову.

priv/static/kvs.htm

<nav> <a href='login.htm'>LOGIN</a> <a href='plm.htm'>PLM</a> <a href='bpe.htm'>BPE</a> <a href='form.htm'>FORM</a> <a href='kvs.htm'>KVS</a> </nav> <aside> <article> <section> <h2>KVS</h2> <p>Abstract chain database</p> <div>USER: <span id=user></span> SSD: <span id=disc></span> RAM: <span id=ram></span><br> SESSION: <span id=session></span> VM: <span id=enode></span></div> </section> <div class=container> <div><h2>WRITERS</h2> <div id=writers></div></div> <div><h2>CHAINS</h2> <div id=feeds>To display the chain select the writer.</div></div> </div> </article> </aside>

lib/events/kvs.ex

defmodule KVS.Index do use N2O, with: [:n2o, :nitro] use FORM use KVS require ERP require Logger def parse(ERP."Employee"(person: ERP."Person"(cn: name))), do: name def parse(_), do: [] def event(:init), do: [:user, :writers, :session, :enode] |> Enum.map(fn x -> [ NITRO.clear(x), send(self(), {:direct, x})] end) def event(:user), do: NITRO.update(:user, span(body: parse(:n2o.user()))) def event(:session), do: NITRO.update(:session, span(body: :n2o.sid())) def event(:enode), do: NITRO.update(:enode, span(body: NITRO.compact(:erlang.node()))) def event({:link, i}), do: [ NITRO.clear(:feeds), :kvs.feed(i) |> Enum.map(fn t -> NITRO.insert_bottom(:feeds, panel(body: NITRO.compact(t))) end) ] def event(:writers), do: :writer |> :kvs.all() |> :lists.sort() |> Enum.map(fn writer(id: i, count: c) -> NITRO.insert_bottom( :writers, panel(body: [link(body: i, postback: {:link, i}), ' (' ++ NITRO.to_list(c) ++ ')'])) end) def event(_), do: [] def ram(os), do: NITRO.compact(os) end

Роутер

kvs — KVS.Index

Код додатку можна знайти в наступних репозиторіях:

o7/plm