Ventas是一个完全用Clojure编写的WIP电子商务平台。
文档
没有开源电子商务项目使我满意。我一直在与大多数人一起工作已有多年了,我认为它们很烂。我什么都不会命名,但这大致是我对可用解决方案的看法:
它们往往很难扩展或修改。他们试图通过扩展系统解决问题,但最终您需要修改核心代码以进行有意义的更改。这迫使您在永不更新软件或付出非凡的努力以保持更改的应用之间进行选择。这就是为什么该项目的主要设计决策之一是使扩展和修改非常容易。
他们往往很难推理。因为它们是基于一种根本可变的模型,所以不可能知道数据库是如何进入当前状态的。在最好的情况下,发生了一些不好的事情,我不知道为什么。在最坏的情况下,发生了一些不好的事情,我什至没有注意到(直到为时已晚)。到处都有可变的物体也无济于事。
他们的表现往往很差。当然,一切都可以使表演者做到,但是我不需要努力。特别是当“努力”是指重写SQL查询时,或者浪费几天的时间试图找出导致我的商店需要20秒钟的原因。
它们倾向于过度设计,或者具有用户敌对的“功能”。这在很多软件中都是一个问题,但是它仍然存在。
请注意,这些观点并不意味着Ventas不会或不会犯同样的罪过。我只是尽量不要。
目前,Ventas不适合其目的。但是,如果您是开发人员,并且只想查看该项目的行动,请继续阅读。
您需要安装git和leiningen 。您还需要访问数据程序数据库和Elasticsearch实例。 (如果您对Docker感到满意,请参阅设置带有Docker-Compose的本地环境)
首先clone该项目,并cd其中:
$ git clone https://github.com/JoelSanchez/ventas
$ cd ventas现在您可以启动重复:
$ lein 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/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数据库是数据组。依赖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处理的,但它们只是4个处理程序,因为在和弦的帮助下,实际通信发生在Websocket上。
( register-endpoint!
:products/get
( fn [{ :keys [params]} state]
( entity/serialize ( entity/find ( :id params)))))通过JWT令牌(由Buddy提供)进行身份验证。
用clojurescript编写,并使用重新框架。
开发是通过Shadow-CLJ进行的。
与服务器的通信是使用抽象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})样式表是用SCSS编写的。守望者还由服务器的替补处理。
I18N用舌头完成
语义UI组件。
我感谢项目的任何部分的帮助。
请阅读贡献