Ventas était une plate-forme de commerce électronique WIP entièrement écrite à Clojure.
Documentation
Aucun projet de commerce électronique open source ne me satisfait. Je travaille avec la plupart d'entre eux depuis des années et je pense qu'ils craignent. Je n'en nommerai pas, mais c'est à peu près ce que je pense des solutions disponibles:
Ils ont tendance à être difficiles à étendre ou à modifier . Ils essaient de résoudre le problème avec les systèmes d'extension, mais à la fin, vous devez modifier le code du noyau pour effectuer des changements significatifs. Cela vous oblige à choisir entre ne jamais mettre à jour le logiciel ou faire un effort exceptionnel pour maintenir vos modifications appliquées. C'est pourquoi l'une des principales décisions de conception de ce projet est de faciliter la prolongation et la modification de l'étendue et de la modification.
Ils ont tendance à être difficiles à raisonner . Parce qu'ils sont construits sur un modèle fondamentalement mutable, il est impossible de savoir comment la base de données est-elle arrivée à l'état actuel. Dans le meilleur cas, quelque chose de mal se produit et je ne sais pas pourquoi. Dans le pire des cas, quelque chose de mal se produit et je ne le remarque même pas (jusqu'à ce qu'il soit trop tard). Avoir des objets mutables partout n'aide pas non plus.
Ils ont tendance à avoir de mauvaises performances hors de la boîte . Bien sûr, tout peut être rendu performant, mais je ne devrais pas avoir besoin de faire l'effort. En particulier lorsque "l'effort" signifie réécrire des requêtes SQL ou gaspiller plusieurs jours à essayer de découvrir ce qui fait que mon magasin prend 20 secondes.
Ils ont tendance à être sur-conçus ou à avoir des "fonctionnalités" hostiles des utilisateurs. C'est un problème dans beaucoup de logiciels, mais il est néanmoins là.
Notez que ces points ne signifient pas que Ventas ne commet pas ou non les mêmes péchés. J'essaye juste de ne pas le faire.
Pour le moment, Ventas est inapte à son objectif. Cependant, si vous êtes un développeur et que vous voulez juste voir le projet en action, lisez la suite.
Vous devez installer git et leiningen . Vous avez également besoin d'accéder à une base de données Datomic et à une instance Elasticsearch. (Voir la configuration d'un environnement local avec Docker-Compose si vous vous sentez à l'aise avec Docker)
clone le projet et cd dedans:
$ git clone https://github.com/JoelSanchez/ventas
$ cd ventasMaintenant, vous pouvez démarrer le REP:
$ lein repl Lorsque le REP est prêt, exécutez 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 Ensuite, exécutez la setup! Fonction, qui migrera la base de données, installera les luminaires, etc .:
( ventas.core/setup! ) Vous pouvez maintenant ouvrir localhost:3450/admin pour voir l'administration. Une frontoffice n'est pas incluse, mais vous pouvez consulter Ventas-Demo pour un exemple.
Pour entrer dans le backoffice, vous devrez créer un utilisateur d'administration pour vous-même:
(entity/create :user {:first-name "Admin"
:email "[email protected]"
:password "yourpassword"}
Pour faire le développement du frontend dans le backoffice:
lein sass4clj auto
shadow-cljs watch :admin
Vous pouvez vous connecter au serveur NREPL créé par Shadow-CLJS pour obtenir un CLJS RPEL:
lein repl :connect localhost:4002
user= > (shadow.cljs.devtools.api/nrepl-select :admin)Un fichier docker-compose.yaml est inclus:
docker-compose up -d
Écrit à Clojure.
Utilise Mount et aime vraiment le développement axé sur les remplacements. Le rechargement de code est effectué en appelant repl/r L'initialisation de l'application est effectuée en appelant 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 données est Datomic. Un système d'entités de base de données personnalisé, qui s'appuie sur Core.Spec, résume la base de données et permet des tests faciles et de la génération d'échantillons de données.
; ; recreates the database, applies the schema, creates the fixtures and seeds the database with randomly generated entities
( seed/seed :recreate? true :generate? true )De nombreuses fonctions utilitaires rendent l'exploration de la base de données et l'obtenir des données plus interactives et plus rapides.
; ; 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 " }) L'ajout de nouvelles entités est facile et les ajouts de schéma sont traités derrière les rideaux (recherchez des appels à entity/register-type! Pour en savoir plus)
Le serveur HTTP est HTTP-KIT. Le routage est géré par Compojure, mais ce ne sont que 4 gestionnaires, car la communication réelle se produit sur WebSockets, avec l'aide de Chord.
( register-endpoint!
:products/get
( fn [{ :keys [params]} state]
( entity/serialize ( entity/find ( :id params)))))L'authentification se fait avec les jetons JWT (fournis par Buddy).
Écrit dans Clojurescript et utilise un redégramme.
Le développement se fait avec Shadow-CLJS.
La communication avec le serveur est effectuée à l'aide d'un effet de rediffusion qui résume les demandes de WebSocket. Toutes les demandes et réponses sont enregistrées au niveau verbose de la console JS, afin que vous puissiez voir ce qui se passe.
Le routage côté client est géré par Bidi, mais un wrapper personnalisé existe, ce qui rend les choses beaucoup plus faciles à gérer.
( 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})Les feuilles de style sont écrites en SCSS. L'observateur est également géré par le REPL du serveur.
i18n a terminé avec la langue
Composants d'interface utilisateur sémantique.
J'apprécierais l'aide dans n'importe quelle partie du projet.
Veuillez lire contribution.md