พื้นที่เก็บข้อมูลนี้มีแดชบอร์ดอีคอมเมิร์ซทดลองซึ่งทำหน้าที่เป็นแอปพลิเคชันเชิงปฏิบัติสำหรับการเรียนรู้และการใช้งาน Laravel ฉันนั่งร้านสิ่งนี้ด้วย Laravel Breeze และใช้ Laravel Valet เพื่อการพัฒนาท้องถิ่น
route()
ช่วยให้สร้างเส้นทางได้ง่ายในส่วนประกอบ Vueโปรเจ็กต์นี้ทำหน้าที่เป็นตัวอย่างที่ครอบคลุมสำหรับทุกคนที่สนใจพัฒนาเว็บแอปพลิเคชันที่มีคุณสมบัติครบถ้วนโดยใช้เทคโนโลยีเหล่านี้
โคลนพื้นที่เก็บข้อมูล (ลงในไดเร็กทอรีไซต์ Valet ของคุณ):
git clone [email protected]:gregrickaby/vue-commerce-lab.git
ติดตั้งการพึ่งพา:
composer install && npm install
สร้างไฟล์ .env
:
cp .env.example .env
สร้างไฟล์ database.sqlite
:
touch database/database.sqlite
สร้างรหัสแอปพลิเคชัน:
php artisan key:generate
ดำเนินการย้ายข้อมูล:
php artisan migrate:fresh
เพาะฐานข้อมูล:
php artisan db:seed
ตั้งค่าเวอร์ชัน PHP เป็น 8.3:
valet isolate [email protected]
รักษาความปลอดภัยเว็บไซต์:
valet secure
เริ่มเซิร์ฟเวอร์การพัฒนา:
npm run dev
เยี่ยมชมเว็บไซต์: https://vue-commerce-lab.test และเข้าสู่ระบบด้วยข้อมูลรับรองต่อไปนี้:
password
โมเดลอยู่ในไดเร็กทอรี app/Models
แต่ละรุ่นมีโรงงานและ Seeder ที่สอดคล้องกันในไดเร็กทอรี database/factories
และไดเร็กทอรี database/seeders
โมเดลมีหน้าที่ในการจัดการข้อมูลของแอปพลิเคชัน พวกเขารับอินพุตจากคอนโทรลเลอร์ ตรวจสอบความถูกต้อง แล้วส่งไปยังฐานข้อมูล
แอปพลิเคชันนี้ใช้ Vue และ Inertia ดังนั้นมุมมองจึงอยู่ในไดเร็กทอรี resources/js/pages
และกำหนดเส้นทางผ่านไฟล์ web.php
มุมมองมีหน้าที่รับผิดชอบในการแสดงข้อมูลให้กับผู้ใช้ พวกเขารับข้อมูลจากคอนโทรลเลอร์ จากนั้นเรนเดอร์ไปยังเบราว์เซอร์
คอนโทรลเลอร์อยู่ในไดเร็กทอรี app/Http/Controllers
คอนโทรลเลอร์แต่ละตัวมีการทดสอบที่สอดคล้องกันในไดเร็กทอรี tests/Feature
ผู้ควบคุมมีหน้าที่รับผิดชอบในการจัดการคำขอและการตอบกลับ พวกเขารับอินพุตจากผู้ใช้ ตรวจสอบความถูกต้อง จากนั้นส่งต่อไปยังโมเดล
เส้นทางอยู่ในไดเรกทอรี routes
ไฟล์ web.php
มีเส้นทางทั้งหมดสำหรับแอปพลิเคชัน
ไฟล์ Vue.js อยู่ในไดเร็กทอรี resources/js
โครงสร้างไดเร็กทอรีเป็นไปตามแบบแผนมาตรฐานของ Laravel โดยมีการเพิ่มไดเร็กทอรี types
สำหรับอินเทอร์เฟซและประเภท TypeScript และไดเร็กทอรี utils
สำหรับฟังก์ชันยูทิลิตี้และตัวช่วย
├── resources
│ ├── css
│ │ └── app.css <-- TailwindCSS
│ ├── js
│ │ ├── Components
│ │ │ ├── Atoms
│ │ │ │ ├── ApplicationLogo
│ │ │ │ │ ├── ApplicationLogo.stories.ts <-- Storybook
│ │ │ │ │ ├── ApplicationLogo.test.ts <-- Test
│ │ │ │ │ ├── ApplicationLogo.test.ts.snap <-- Snapshot
│ │ │ │ │ └── ApplicationLogo.vue <-- Vue Component
│ │ │ ├── Molecules
│ │ │ ├── Organisms
│ │ ├── Layouts
│ │ ├── Pages
│ │ │ ├── Customers
│ │ │ │ ├── Create.vue
│ │ │ │ ├── Index.vue
│ │ │ │ └── {customer} <-- Dynamic route
│ │ │ │ ├── Edit.vue
│ │ │ │ └── Show.vue
│ │ ├── app.ts <-- Vue app
│ │ ├── types
│ │ │ └── index.d.ts <-- Typescript interfaces and types
│ │ └── utils
│ │ └── index.ts <-- Utility and helper functions
│ └── views
│ ├── app.blade.php
│ └── welcome.blade.php
โฟลเดอร์ที่มี {}
ล้อมรอบเป็นเส้นทางแบบไดนามิก ตัวอย่างเช่น /Pages/Customers/{customers}/Edit.vue
เป็นเส้นทางแบบไดนามิกที่จะตรงกับรหัสลูกค้าใดๆ จากนั้น ID จะพร้อมใช้งานในคอมโพเนนต์ Edit.vue
แอปพลิเคชั่นนี้มีทั้ง PHPUnit และ Vitest สำหรับการทดสอบ นอกจากนี้ยังใช้ประโยชน์จาก Github Actions สำหรับการรวมและการทดสอบอย่างต่อเนื่อง และ Storybook สำหรับการพัฒนาส่วนประกอบ UI แบบแยกส่วน
แอปพลิเคชั่นนี้มาพร้อมกับการทดสอบ PHPUnit สำหรับทุกรุ่นและคอนโทรลเลอร์ การทดสอบ PHP อยู่ในไดเร็กทอรี /tests
:
├── tests
│ ├── Feature
│ │ ├── Auth
│ │ │ ├── AuthenticationTest.php
│ │ └── ExampleTest.php
│ └── Unit
│ └── ExampleTest.php
เส้นทาง Laravel ส่งคืนการตอบสนองความเฉื่อยที่ขึ้นอยู่กับการมีอยู่ของส่วนประกอบ Vue หากไม่มีสินทรัพย์ส่วนหน้าที่สร้างขึ้น ส่วนประกอบเหล่านี้จะไม่พร้อมใช้งาน ซึ่งนำไปสู่ความล้มเหลวในการทดสอบที่ส่งคำขอไปยังเส้นทางเหล่านี้ เพื่อหลีกเลี่ยงปัญหานี้ คุณต้องรันเซิร์ฟเวอร์การพัฒนาในเบื้องหลังขณะรันการทดสอบ
เริ่มเซิร์ฟเวอร์การพัฒนา:
npm run dev
รันการทดสอบ PHPUnit ด้วย:
php artisan test
ดำเนินการทดสอบเฉพาะด้วย:
php artisan test --filter=CustomerTest
แอปพลิเคชั่นนี้มีทั้ง Vitest (นักวิ่งทดสอบอย่างเป็นทางการ) และ Vue Test Utils (ไลบรารีการทดสอบอย่างเป็นทางการ) สำหรับการทดสอบส่วนประกอบ Vue การทดสอบจะต้องวางไว้ถัดจากส่วนประกอบและชื่อ ComponentName.test.ts
:
├── resources
│ ├── js
│ │ ├── Components
│ │ │ ├── Atoms
│ │ │ │ ├── ApplicationLogo
│ │ │ │ │ ├── ApplicationLogo.stories.ts <-- Storybook
│ │ │ │ │ ├── ApplicationLogo.test.ts <-- Test
│ │ │ │ │ ├── ApplicationLogo.test.ts.snap <-- Snapshot
│ │ │ │ │ └── ApplicationLogo.vue <-- Vue Component
คุณสามารถทำการทดสอบด้วย:
npm run test
Vitest จะทำการทดสอบในโหมดนาฬิกา ดังนั้นคุณจึงสามารถเปลี่ยนแปลงส่วนประกอบและดูผลลัพธ์ได้แบบเรียลไทม์
การทดสอบส่วนประกอบเขียนด้วย TypeScript และใช้ Vitest API สำหรับการยืนยัน นี่คือตัวอย่าง:
import ApplicationLogo from '@/Components/Atoms/ApplicationLogo/ApplicationLogo.vue'
import { mount } from '@vue/test-utils'
import { describe , expect , test } from 'vitest'
/**
* Define a test suite.
*
* @see https://vitest.dev/api/#describe
*/
describe ( 'ApplicationLogo' , ( ) => {
/**
* Mount the component.
*
* @see https://vue-test-utils.vuejs.org/api/#mount
*/
const wrapper = mount ( ApplicationLogo )
/**
* Assert the component renders.
*
* @see https://vitest.dev/api/expect.html
*/
test ( 'component renders' , ( ) => {
expect ( wrapper ) . toBeTruthy ( )
} )
/**
* Assert the component is a SVG.
*/
test ( 'component is SVG' , ( ) => {
wrapper . find ( 'svg' )
} )
/**
* Assert the component matches the snapshot.
*
* @see https://vitest.dev/api/expect.html#tomatchsnapshot
*/
test ( 'component matches snapshot' , ( ) => {
expect ( wrapper . html ( ) ) . toMatchSnapshot ( )
} )
} )
Github Actions จะทำการทดสอบทุก PR ไปยังสาขา main
ด้วย
แอปพลิเคชั่นนี้ติดตั้ง ESLint และกำหนดค่าสำหรับการแยกวิเคราะห์ TypeScript ไฟล์ JavaScript และ Vue linting อัตโนมัติเกิดขึ้น on_save
คุณยังสามารถเรียกใช้ผ้าสำลีด้วยตนเองได้:
npm run lint
แอปพลิเคชันนี้มาพร้อมกับปลั๊กอิน Stylelint และ Prettier สำหรับ TailwindCSS การขุยและการจัดรูปแบบอัตโนมัติจะเกิดขึ้น on_save
การจัดรูปแบบอัตโนมัติสำหรับทั้งไฟล์ JavaScript และ PHP ได้รับการกำหนดค่าสำหรับ on_save
โปรดดูการตั้งค่า VSCode และการกำหนดค่าส่วนขยายสำหรับข้อมูลเพิ่มเติม
รัน Prettier และ Pint ด้วยตนเองด้วย:
npm run format && composer run lint
ดูหนังสือนิทาน: https://gregrickaby.github.io/vue-commerce-lab/
แอปพลิเคชั่นนี้มาพร้อมกับ Storybook สำหรับการพัฒนาส่วนประกอบ UI แบบแยกส่วน เรื่องราวต้องเขียนด้วย CSF โดยวางไว้ข้างส่วนประกอบในไดเร็กทอรี resources/js/Components
เรื่องราวต้องตั้งชื่อ ComponentName.stories.ts
:
├── resources
│ ├── js
│ │ ├── Components
│ │ │ ├── Atoms
│ │ │ │ ├── ApplicationLogo
│ │ │ │ │ ├── ApplicationLogo.stories.ts <-- Storybook
│ │ │ │ │ ├── ApplicationLogo.test.ts <-- Test
│ │ │ │ │ ├── ApplicationLogo.test.ts.snap <-- Snapshot
│ │ │ │ │ └── ApplicationLogo.vue <-- Vue Component
เรียกใช้ Storybook ด้วย:
npm run storybook
สร้างหนังสือนิทานด้วย:
npm run build:storybook
ใบอนุญาตเอ็มไอที (MIT) โปรดดูใบอนุญาต