Ventasは、Clojureで完全に書かれたWIP eコマースプラットフォームでした。
ドキュメント
オープンソースのeコマースプロジェクトは私を満足させません。私は何年も彼らのほとんどと仕事をしてきましたが、彼らは吸うと思います。名前はありませんが、これはおおよそ私が利用可能な解決策について考えていることです。
それらは拡張または変更が難しい傾向があります。彼らは拡張システムの問題に取り組むようにしますが、最終的には、意味のある変更を行うためにコアのコードを変更する必要があります。これにより、ソフトウェアを更新しないか、変更を適用するために例外的な努力をするかどうかを選択する必要があります。これが、このプロジェクトの主な設計上の決定の1つが、拡張と変更を非常に簡単にすることです。
彼らは推論するのが難しい傾向があります。それらは根本的に可変モデルに基づいて構築されているため、データベースが現在の状態にどのように到達したかを知ることは不可能です。最良の場合、何か悪いことが起こり、理由がわかりません。最悪の場合、何か悪いことが起こり、私は気づかないことさえありません(手遅れになるまで)。どこにでも変動するオブジェクトを持つことも役に立ちません。
彼らは箱から出してパフォーマンスが低い傾向があります。もちろん、すべてを実行することができますが、努力する必要はありません。特に、「努力」とは、SQLクエリの書き換えを意味する場合、または数日間無駄にして、ストアが20秒かかる原因を見つけようとする場合。
それらは、エンジニアリング過剰になったり、ユーザーホッスルの「機能」を持っている傾向があります。これは多くのソフトウェアの問題ですが、それでもそこにあります。
これらの点は、ベンタスが同じ罪を犯さない、または犯さないことを意味しないことに注意してください。私はしないようにしています。
現時点では、Ventasはその目的にふさわしくありません。ただし、あなたが開発者であり、プロジェクトが実行されているのを見たいだけなら、読んでください。
gitとleiningenをインストールする必要があります。また、DatomicデータベースとElasticSearchインスタンスへのアクセスも必要です。 (Dockerに慣れている場合は、Docker-Composeでローカル環境のセットアップを参照してください)
最初にプロジェクトとcdをclone :
$ git clone https://github.com/JoelSanchez/ventas
$ cd ventasこれで、REPLを開始できます。
$ lein repl REPLの準備ができたら、 initを実行します。
user=> ( init )
:reloading (ventas.common.utils ventas.utils ventas.config ventas.database ventas.database.schema ventas.database.entity ventas.entities.product-variation ventas.database.generators ventas.entities.i18n ventas.entities.brand ventas.plugin ventas.database.seed ventas.entity-test ventas.events repl ventas.entities.image-size ventas.paths ventas.entities.file ventas.server.ws ventas.logging ventas.server ventas.server-test ventas.auth ventas.entities.user ventas.test-tools ventas.database-test ventas.entities.product-taxonomy ventas.server.pagination ventas.utils.images ventas.server.api ventas.entities.configuration ventas.entities.address ventas.entities.product-term client ventas.plugins.featured-categories.core ventas.plugins.slider.core ventas.entities.order-line ventas.entities.order ventas.common.utils-test ventas.entities.resource ventas.entities.category ventas.entities.product ventas.entities.country ventas.entities.tax ventas.entities.state ventas.plugins.blog.core ventas.plugins.featured-products.core user)
INFO [ventas.database:27] - Starting database, URL: datomic:dev://localhost:4334/ventas
INFO [ventas.server:99] - Starting server
INFO [ventas.server:102] - Starting server on 0.0 .0.0:3450
INFO [client:28] - Starting Figwheel
Figwheel: Starting server at http:// 0.0 .0.0:3449
Figwheel: Watching build - app
Compiling " resources/public/files/js/compiled/ventas.js " from [ " src/cljs " " src/cljc " " test/cljs " " test/cljc " ]...
Successfully compiled " resources/public/files/js/compiled/ventas.js " in 8.252 seconds.
Figwheel: Starting CSS Watcher for paths [ " resources/public/files/css " ]
INFO [client:42] - Starting SASS
:done次に、 setup!データベースを移行し、備品をインストールする機能など。
( ventas.core/setup! )これで、 localhost:3450/adminを開くと、管理を確認できます。フロントオフィスは含まれていませんが、例についてはventas-demoを確認できます。
バックオフィスを入力するには、自分で管理者ユーザーを作成する必要があります。
(entity/create :user {:first-name "Admin"
:email "[email protected]"
:password "yourpassword"}
バックオフィスでフロントエンド開発を行うには:
lein sass4clj auto
shadow-cljs watch :admin
Shadow-Cljsによって作成されたNREPLサーバーに接続して、CLJS RPELを取得できます。
lein repl :connect localhost:4002
user= > (shadow.cljs.devtools.api/nrepl-select :admin)docker-compose.yamlファイルが含まれています。
docker-compose up -d
Clojureで書かれています。
マウントを使用し、REPL駆動型の開発が本当に好きです。コードリロードはrepl/rを呼び出すことによって行われます。アプリの初期化は、 repl/initを呼び出すことによって行われます。
; ; (r) reloads changed namespaces, restarts defstates within them, and optionally
; ; restarts given defstates as keywords
( r :db )
INFO [ventas.database:34] - Stopping database
:reloading ()
INFO [ventas.database:27] - Starting database, URL: datomic:dev://localhost:4334/ventas
=> :doneデータベースはdatomicです。 core.specに依存するカスタムデータベースエンティティシステムは、データベースを抽象化し、簡単なテストとサンプルデータの生成を可能にします。
; ; recreates the database, applies the schema, creates the fixtures and seeds the database with randomly generated entities
( seed/seed :recreate? true :generate? true )多くのユーティリティ関数により、データベースを探索し、そこからデータをよりインタラクティブで高速に取得できます。
; ; returns a list of active users
( entity/query :user { :status :user.status/active })
; ; returns an entity by EID
( entity/find 17592186045760 )
; ; creates an user and returns the result
( entity/create :user { :email " test@email "
:first-name " Test "
:last-name " User " })
; ; generates three users
( entity/generate :user 3 )
; ; updates an user's company
( entity/update { :id 17592186045920
:company " Test " })新しいエンティティの追加は簡単で、スキーマの追加がカーテンの後ろに処理されます( entity/register-type!
HTTPサーバーはHTTP-KITです。ルーティングはCompojureによって処理されますが、実際の通信はコードの助けを借りてWebSocketを介して行われるため、わずか4つのハンドラーです。
( register-endpoint!
:products/get
( fn [{ :keys [params]} state]
( entity/serialize ( entity/find ( :id params)))))認証は、JWTトークン(Buddyが提供)で行われます。
ClojureScriptで記述され、再フレームを使用します。
開発はShadow-Cljsで行われます。
サーバーとの通信は、WebSocketリクエストを抽象化する再フレーム効果を使用して行われます。すべてのリクエストと応答は、JSコンソールのverboseレベルに記録されるため、何が起こっているのかを確認できます。
クライアント側のルーティングはBidiによって処理されますが、カスタムラッパーが存在し、物事が非常に簡単になります。
( routes/define-route!
:frontend.product ; ; this route is nested inside the :frontend route
{ :name ( i18n ::the-name-of-this-page )
:url [ " product/ " :id ]
:component a-re-frame-component-for-this-route})StyleSheetsはSCSSで書かれています。ウォッチャーは、サーバーのREPLによっても処理されます。
I18Nは舌で行われます
セマンティックUIコンポーネント。
プロジェクトのどの部分でも助けに感謝します。
Convributing.mdをお読みください