Ventas เป็นแพลตฟอร์มอีคอมเมิร์ซ WIP ที่เขียนขึ้นทั้งหมดใน Clojure
เอกสาร
ไม่มีโครงการอีคอมเมิร์ซโอเพนซอร์สที่ทำให้ฉันพอใจ ฉันทำงานกับพวกเขาส่วนใหญ่มาหลายปีแล้วและฉันคิดว่าพวกเขาดูด ฉันจะไม่ตั้งชื่อใด ๆ แต่นี่เป็นสิ่งที่ฉันคิดเกี่ยวกับวิธีแก้ปัญหาที่มีอยู่:
พวกเขามีแนวโน้ม ที่จะขยายหรือแก้ไขได้ยาก พวกเขาพยายามที่จะจัดการกับปัญหาด้วยระบบส่วนขยาย แต่ในที่สุดคุณต้องแก้ไขรหัสของแกนเพื่อทำการเปลี่ยนแปลงที่มีความหมาย สิ่งนี้บังคับให้คุณเลือกระหว่างการอัพเดทซอฟต์แวร์หรือใช้ความพยายามพิเศษเพื่อให้การเปลี่ยนแปลงของคุณนำไปใช้ นี่คือเหตุผลที่หนึ่งในการตัดสินใจออกแบบหลักสำหรับโครงการนี้คือทำให้ง่ายต่อการขยายและปรับเปลี่ยน
พวกเขามักจะเป็น เรื่องยากที่จะให้เหตุผล เนื่องจากพวกเขาถูกสร้างขึ้นตามรูปแบบที่ไม่แน่นอนพื้นฐานจึงเป็นไปไม่ได้ที่จะรู้ว่าฐานข้อมูลไปถึงสถานะปัจจุบันได้อย่างไร ในกรณีที่ดีที่สุดสิ่งเลวร้ายเกิดขึ้นและฉันไม่รู้ว่าทำไม ในกรณีที่เลวร้ายที่สุดสิ่งเลวร้ายเกิดขึ้นและฉันก็ไม่ได้สังเกต (จนกว่าจะสายเกินไป) การมีวัตถุที่ไม่แน่นอนทุกที่ไม่ได้ช่วยอะไรเช่นกัน
พวกเขามักจะมี ประสิทธิภาพที่ไม่ดีออกจากกล่อง แน่นอนว่าทุกอย่างสามารถทำได้ แต่ฉันไม่ควรใช้ความพยายาม โดยเฉพาะอย่างยิ่งเมื่อ "ความพยายาม" หมายถึงการเขียนแบบสอบถาม SQL ใหม่หรือเสียเวลาหลายวันพยายามค้นหาสิ่งที่ทำให้ร้านค้าของฉันใช้เวลา 20 วินาทีในการโหลด
พวกเขามีแนวโน้มที่จะได้ รับการออกแบบมากเกินไป หรือมี "คุณสมบัติ" ของผู้ใช้ที่เป็นของผู้ใช้ นี่เป็นปัญหาในซอฟต์แวร์จำนวนมาก แต่ก็ยังมีอยู่
โปรดทราบว่าประเด็นเหล่านี้ไม่ได้หมายความว่า Ventas ไม่ได้หรือจะไม่ทำบาปเดียวกัน ฉันแค่พยายามไม่ทำ
ในขณะนี้ Ventas ไม่เหมาะสำหรับจุดประสงค์ของมัน อย่างไรก็ตามหากคุณเป็นนักพัฒนาและต้องการเห็นโครงการในการดำเนินการอ่านต่อ
คุณต้องติดตั้ง git และ leiningen คุณต้องเข้าถึงฐานข้อมูล Datomic และอินสแตนซ์ ElasticSearch (ดูการตั้งค่าสภาพแวดล้อมในท้องถิ่นด้วย compose นักเทียบท่าหากคุณรู้สึกสะดวกสบายกับนักเทียบท่า)
clone First โครงการและ cd ลงไป:
$ git clone https://github.com/JoelSanchez/ventas
$ cd ventasตอนนี้คุณสามารถเริ่ม REPL:
$ 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 เพื่อดูการบริหาร ไม่รวม frontoffice แต่คุณสามารถตรวจสอบ Ventas-Demo สำหรับตัวอย่าง
ในการเข้าสู่ backoffice คุณจะต้องสร้างผู้ใช้ผู้ดูแลระบบด้วยตัวคุณเอง:
(entity/create :user {:first-name "Admin"
:email "[email protected]"
:password "yourpassword"}
เพื่อทำการพัฒนาส่วนหน้าใน Backoffice:
lein sass4clj auto
shadow-cljs watch :admin
คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ NREPL ที่สร้างโดย Shadow-Cljs เพื่อรับ CLJS RPEL:
lein repl :connect localhost:4002
user= > (shadow.cljs.devtools.api/nrepl-select :admin)รวมไฟล์ Docker-compose.yaml:
docker-compose up -d
เขียนใน Clojure
ใช้ Mount และชอบการพัฒนาที่ขับเคลื่อนด้วยการเติม การโหลดรหัสซ้ำเสร็จสิ้นโดยการโทร 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 แต่เป็นเพียงตัวจัดการเพียง 4 ตัวเนื่องจากการสื่อสารจริงเกิดขึ้นผ่าน WebSockets ด้วยความช่วยเหลือของคอร์ด
( register-endpoint!
:products/get
( fn [{ :keys [params]} state]
( entity/serialize ( entity/find ( :id params)))))การรับรองความถูกต้องทำด้วยโทเค็น JWT (จัดทำโดย Buddy)
เขียนใน Clojurescript และใช้เฟรมใหม่
การพัฒนาจะทำด้วย Shadow-Cljs
การสื่อสารกับเซิร์ฟเวอร์ทำได้โดยใช้เอฟเฟกต์เฟรมใหม่ที่มีการร้องขอ Webstracts คำขอและคำตอบทั้งหมดจะถูกบันทึกไว้ในระดับ verbose ของคอนโซล JS ดังนั้นคุณจะเห็นสิ่งที่เกิดขึ้น
การกำหนดเส้นทางฝั่งไคลเอ็นต์ได้รับการจัดการโดย 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 ความหมาย
ฉันขอขอบคุณความช่วยเหลือในส่วนใด ๆ ของโครงการ
โปรดอ่าน Inteding.md