Ventas는 Clojure에 전적으로 쓰여진 WIP 전자 상거래 플랫폼이었습니다.
선적 서류 비치
오픈 소스 전자 상거래 프로젝트는 저를 만족시키지 않습니다. 나는 몇 년 동안 그들 대부분과 함께 일해 왔으며 나는 그들이 빨리 생각합니다. 나는 이름을 밝히지 않을 것이지만 이것은 대략 사용 가능한 솔루션에 대해 생각하는 것입니다.
그들은 확장하거나 수정하기가 어려운 경향이 있습니다. 그들은 확장 시스템의 문제를 해결하려고 노력하지만 결국 의미있는 변경을 수행하려면 핵심 코드를 수정해야합니다. 이를 통해 소프트웨어를 업데이트하지 않거나 변경 사항을 적용하기 위해 탁월한 노력을 기울일 수 있습니다. 이것이 바로이 프로젝트의 주요 디자인 결정 중 하나가 확장하고 수정하기가 매우 쉽게 만드는 것입니다.
그들은 추론하기 어려운 경향이 있습니다. 기본적으로 변한 모델에 구축되었으므로 데이터베이스가 현재 상태에 어떻게 접근했는지 알 수 없습니다. 최선의 경우, 나쁜 일이 일어나고 왜 그런지 모르겠습니다. 최악의 경우, 나쁜 일이 일어나고 눈치 채지 못합니다 (너무 늦을 때까지). 모든 곳에서 돌연변이 가능한 물체를 갖는 것은 도움이되지 않습니다.
그들은 상자 밖에서 성능이 좋지 않은 경향이 있습니다. 물론 모든 것이 수행 될 수 있지만 노력을 기울일 필요는 없습니다. 특히 "노력"이 SQL 쿼리를 다시 작성하거나 며칠을 낭비하는 것을 의미 할 때, 내 매장이 20 초 동안로드하는 데 필요한 원인을 찾으려고 낭비합니다.
그들은 과도하게 엔지니어링 되거나 사용자가 "기능"을 갖는 경향이 있습니다. 이것은 많은 소프트웨어에서 문제이지만 그럼에도 불구하고 있습니다.
이 점이 벤타스가 같은 죄를 지키지 않거나 저 지르지 않는다는 것을 의미하지는 않습니다. 나는하지 않으려 고 노력한다.
현재 Ventas는 그 목적에 부적합합니다. 그러나 개발자이고 프로젝트를 실제로보고 싶다면 계속 읽으십시오.
git 과 leiningen 설치되어 있어야합니다. 또한 Datomic 데이터베이스 및 Elasticsearch 인스턴스에 대한 액세스가 필요합니다. (Docker에 익숙하다고 느끼면 Docker-Compose로 지역 환경 설정을 참조하십시오)
먼저 프로젝트를 clone 하고 cd 사용하십시오.
$ git clone https://github.com/JoelSanchez/ventas
$ cd ventas이제 대체를 시작할 수 있습니다.
$ 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"}
백 오피스에서 Frontend 개발을 수행하려면 :
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로 작성되었습니다.
Mount를 사용하고 실제로 대체 중심 개발을 좋아합니다. Code Reload는 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에 의해 처리되지만 실제 커뮤니케이션은 코드의 도움으로 WebSockets를 통해 발생하기 때문에 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})스타일 시트는 SCSS로 작성되었습니다. 감시자는 서버의 REPL에 의해 처리됩니다.
i18n은 혀로 완성됩니다
시맨틱 UI 구성 요소.
프로젝트의 어느 부분에서나 도움을 주셔서 감사합니다.
Contributing.md를 읽으십시오