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

В этой статье я расскажу, как написать простую админку для KVS на NITRO и N2O, размером всего в 5 строчек!

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

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

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

enterprizing/plm