Ventas era una plataforma de comercio electrónico WIP escrita completamente en Clojure.
Documentación
Ningún proyecto de comercio electrónico de código abierto me satisface. He estado trabajando con la mayoría de ellos durante años y creo que apestan. No nombraré ninguno, pero esto es más o menos lo que pienso sobre las soluciones disponibles:
Tienden a ser difíciles de extender o modificar . Intentan abordar el problema con los sistemas de extensión, pero al final debe modificar el código del núcleo para hacer cambios significativos. Esto lo obliga a elegir entre nunca actualizar el software o hacer un esfuerzo excepcional para mantener sus cambios aplicados. Esta es la razón por la cual una de las principales decisiones de diseño para este proyecto es hacer que sea muy fácil de extender y modificar.
Tienden a ser difíciles de razonar . Debido a que se basan en un modelo fundamentalmente mutable, es imposible saber cómo llegó la base de datos al estado actual. En el mejor de los casos, sucede algo malo y no sé por qué. En el peor de los casos, sucede algo malo y ni siquiera me doy cuenta (hasta que es demasiado tarde). Tener objetos mutables en todas partes tampoco ayuda.
Tienden a tener un bajo rendimiento fuera de la caja . Por supuesto, todo se puede hacer rendimiento, pero no debería necesitar hacer el esfuerzo. Particularmente cuando el "esfuerzo" significa reescribir consultas SQL, o perder varios días tratando de averiguar qué está causando que mi tienda tarda 20 segundos en cargarse.
Tienden a ser demasiado diseñados o tienen "características" de usuarios hostiles. Este es un problema en mucho software, pero no obstante.
Tenga en cuenta que estos puntos no significan que Ventas no comete los mismos pecados. Solo trato de no hacerlo.
Por el momento, Ventas no es apto para su propósito. Sin embargo, si usted es un desarrollador y solo desea ver el proyecto en acción, siga leyendo.
Debe instalarse git y leiningen . También necesita acceso a una base de datos Datomic y una instancia de Elasticsearch. (Consulte la configuración de un entorno local con Docker-Compose si se siente cómodo con Docker)
Primer clone del proyecto y cd en él:
$ git clone https://github.com/JoelSanchez/ventas
$ cd ventasAhora puedes iniciar el repl:
$ lein repl Cuando el replio esté listo, ejecute 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 Entonces, ejecute la setup! función, que migrará la base de datos, instalará accesorios, etc.:
( ventas.core/setup! ) Ahora puede abrir localhost:3450/admin para ver la administración. No se incluye un FrontOffice, pero puede consultar Ventas-Demo para obtener un ejemplo.
Para ingresar al backoffice necesitará crear un usuario administrador para usted:
(entity/create :user {:first-name "Admin"
:email "[email protected]"
:password "yourpassword"}
Para hacer el desarrollo frontend en el backoffice:
lein sass4clj auto
shadow-cljs watch :admin
Puede conectarse al servidor NREPL creado por Shadow-CLJS para obtener un CLJS RPEL:
lein repl :connect localhost:4002
user= > (shadow.cljs.devtools.api/nrepl-select :admin)Se incluye un archivo Docker-Compose.yaml:
docker-compose up -d
Escrito en Clojure.
Utiliza el Monte y realmente le gusta el desarrollo impulsado por Repl. La recarga del código se realiza llamando repl/r . La inicialización de la aplicación se realiza llamando 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
=> :doneLa base de datos es datomic. Un sistema de entidad de base de datos personalizado, que se basa en Core.spec, abstrae la base de datos y permite pruebas fáciles y generación de datos de muestra.
; ; recreates the database, applies the schema, creates the fixtures and seeds the database with randomly generated entities
( seed/seed :recreate? true :generate? true )Muchas funciones de utilidad hacen que explorar la base de datos y obtener datos de ella más interactivos y 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 " }) Agregar nuevas entidades es fácil y las adiciones de esquema se manejan detrás de las cortinas (¡busca llamadas a entity/register-type! Para saber más)
El servidor HTTP es http-kit. CompoJure maneja el enrutamiento, pero son solo 4 manejadores, porque la comunicación real ocurre sobre WebSockets, con la ayuda de acorde.
( register-endpoint!
:products/get
( fn [{ :keys [params]} state]
( entity/serialize ( entity/find ( :id params)))))La autenticación se realiza con tokens JWT (proporcionados por Buddy).
Escrito en Clojurescript, y usa el reframo.
El desarrollo se realiza con Shadow-CLJS.
La comunicación con el servidor se realiza utilizando un efecto de reframo que resume las solicitudes de WebSocket. Todas las solicitudes y respuestas se registran al nivel verbose de la consola JS, para que pueda ver lo que está sucediendo.
BIDI maneja el enrutamiento del lado del cliente, pero existe un envoltorio personalizado para ello, lo que hace que las cosas sean mucho más fáciles de tratar.
( 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})Las hojas de estilo están escritas en SCSS. El observador también es manejado por el Repl.
i18n ha terminado con lengua
Componentes semánticos de la interfaz de usuario.
Agradecería la ayuda en cualquier parte del proyecto.
Por favor lea contribuir.md