Ventas era uma plataforma de comércio eletrônico WIP escrito inteiramente em Clojure.
Documentação
Nenhum projeto de comércio eletrônico de código aberto me satisfaz. Trabalho com a maioria deles há anos e acho que eles são péssimos. Não vou citar nenhum, mas isso é aproximadamente o que penso sobre as soluções disponíveis:
Eles tendem a ser difíceis de estender ou modificar . Eles tentam resolver o problema com os sistemas de extensão, mas no final você precisa modificar o código do núcleo para fazer alterações significativas. Isso força você a escolher entre nunca atualizar o software ou fazer um esforço excepcional para manter suas alterações aplicadas. É por isso que uma das principais decisões de design deste projeto é facilitar a extensão e a modificação.
Eles tendem a ser difíceis de raciocinar . Como eles são construídos em um modelo fundamentalmente mutável, é impossível saber como o banco de dados chegou ao estado atual. Na melhor das hipóteses, algo ruim acontece e não sei por quê. Na pior das hipóteses, algo ruim acontece e eu nem noto (até que seja tarde demais). Ter objetos mutáveis em todos os lugares também não ajuda.
Eles tendem a ter um desempenho ruim fora da caixa . É claro que tudo pode ser feito com desempenho, mas eu não deveria precisar fazer o esforço. Particularmente quando o "esforço" significa reescrever consultas SQL ou desperdiçar vários dias tentando descobrir o que está fazendo com que minha loja leve 20 segundos para carregar.
Eles tendem a ser super-engenhados ou a ter "recursos" do usuário. Este é um problema em muito software, mas existe, no entanto.
Observe que esses pontos não significam que Ventas não comete ou não os mesmos pecados. Eu apenas tento não fazê -lo.
No momento, Ventas é inapto de seu propósito. No entanto, se você é um desenvolvedor e só deseja ver o projeto em ação, continue lendo.
Você precisa ter git e leiningen instalado. Você também precisa acessar um banco de dados de dados e uma instância do Elasticsearch. (Consulte Configurando um ambiente local com o Docker-Compose se você se sentir confortável com o Docker)
Primeiro clone o projeto e cd nele:
$ git clone https://github.com/JoelSanchez/ventas
$ cd ventasAgora você pode começar o repl:
$ lein repl Quando o repl estiver pronto, execute 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 Em seguida, execute a setup! função, que migrará o banco de dados, instalará acessórios, etc.:
( ventas.core/setup! ) Agora você pode abrir localhost:3450/admin para ver a administração. Um frontOffice não está incluído, mas você pode conferir Ventas-Demo para um exemplo.
Para entrar no backoffice, você precisará criar um usuário administrador para si mesmo:
(entity/create :user {:first-name "Admin"
:email "[email protected]"
:password "yourpassword"}
Para fazer o desenvolvimento de front -end no backoffice:
lein sass4clj auto
shadow-cljs watch :admin
Você pode se conectar ao servidor NREPL criado pelo Shadow-CLJS para obter um RPEL CLJS:
lein repl :connect localhost:4002
user= > (shadow.cljs.devtools.api/nrepl-select :admin)Um arquivo Docker-Compose.yaml está incluído:
docker-compose up -d
Escrito em clojure.
Usa o Mount e realmente gosta de desenvolvimento orientado por REPR. Recarregar o código é feito ligando para repl/r . A inicialização do aplicativo é feita ligando para 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
=> :doneO banco de dados é datomic. Um sistema de entidade de banco de dados personalizado, que depende do Core.Spec, abstraia o banco de dados e permite testes e geração fáceis de dados de amostra.
; ; recreates the database, applies the schema, creates the fixtures and seeds the database with randomly generated entities
( seed/seed :recreate? true :generate? true )Muitas funções de utilidade tornam a exploração do banco de dados e obtendo dados mais interativos e rápidos.
; ; 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 " }) Adicionar novas entidades é fácil e as adições de esquema são tratadas atrás das cortinas (procure chamadas para entity/register-type! Para saber mais)
O servidor HTTP é http-kit. O roteamento é tratado pela Compojure, mas são apenas 4 manipuladores, porque a comunicação real acontece nos websockets, com a ajuda do acorde.
( register-endpoint!
:products/get
( fn [{ :keys [params]} state]
( entity/serialize ( entity/find ( :id params)))))A autenticação é feita com os tokens JWT (fornecidos pela Buddy).
Escrito no clojurescript e usa o re-quadro.
O desenvolvimento é feito com Shadow-CLJs.
A comunicação com o servidor é feita usando um efeito de re-quadro que abstrata as solicitações do WebSocket. Todas as solicitações e respostas são registradas no nível verbose do console JS, para que você possa ver o que está acontecendo.
O roteamento do lado do cliente é tratado pela BIDI, mas existe um invólucro personalizado para ele, o que facilita a lida das coisas.
( 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})As folhas de estilo são escritas no SCSS. O observador também é tratado pelo REPL do servidor.
I18n está pronto com a língua
Componentes semânticos da interface do usuário.
Eu apreciaria ajuda em qualquer parte do projeto.
Leia contribuindo.md