|
| 1 | +# Vue3 Starter Template |
| 2 | + |
| 3 | +ماجرای ساخت starter kit از آنجایی آغاز شد که قرار بود پروژههای جدید و شروع کنیم. میتونستیم هر پروژه رو به صورت جداگانهای توسعه بدیم و برای |
| 4 | +هر کدوم یک تیم قرار بدیم و مشخصا راه پروژهها و تیم ها از هم جدا میشد. برای حل این مشکل و یکپارچه کردن پروژهها تصمیم گرفتیم یک استاندارد |
| 5 | +کلی بزاریم و تمامی پروژهها از این استاندارد پیروی کنند. پیروی از این استاندارد باعث شد پروژهها تا حد زیادی در یک مسیر قرار بگیرن و نگهداری |
| 6 | +اونها آسونتر بشه و همچنین سازگاری تیمها با پروژهها افزایش پیدا کنه. |
| 7 | + |
| 8 | +## **مشکلات استفاده از فریمورکها** |
| 9 | + |
| 10 | +استفاده از UI فریمورک ها باعث افزایش سرعت develop میشه و کامپوننتهای زیادی رو در اختیار ما قرار میده و این کامپوننتها قابلیتهای زیادی رو |
| 11 | +پشتیبانی میکنه که با دادن پراپسها و اسلاتهای مختلف میشه از این قابلیتها استفاده کرد اما استفاده از این قابلیت ها باعث بروز مشکلاتی مانند |
| 12 | +سرعت پایین کامپوننتها، قابلیت شخصی سازی پایین استایلها، امکانات اضافه و در دسترس نبودن منطق کامپوننت ها اشاره کرد که در starter kit این |
| 13 | +مشکلات بر طرف شده |
| 14 | + |
| 15 | +## **چرا این پروژه ایجاد شده؟** |
| 16 | + |
| 17 | +راه اندازی سریع یک پروژه vue به خاطر اینکه استور، سرویسها، کامپوننتها و پیش نیاز های پروژه نوشته شدهاند، قابلیت شخصی سازی استایل کامپوننت |
| 18 | +ها، سبک بودن کامپوننتها و افزایش سرعت پروژه، برآورده کردن نیازهای اولیه پروژه مثل سرویسها و ابزارها و پیروی پروژهها از یک استاندارد کلی |
| 19 | +علت های اصلی ایجاد این پروژه هستند. |
| 20 | + |
| 21 | +## **چرا کامپوننت ها بازنویسی شدن؟** |
| 22 | + |
| 23 | +* سرعت: وجود پراپس ها و اسلات های کم و مورد استفاده باعث شده که سرعت صفحات حتی با وجود استفاده زیاد از کامپوننت ها به شدت بالا باشه و تفاوت |
| 24 | + کمی با استفاده از تگهای HTML داشته باشه. |
| 25 | +* امکانات لازم: به صورت پیشفرض برای کامپوننتها قابلیت های پر استفاده و لازم پیاده سازی شده و در هر پروژه اگر نیاز به فیچر و قابلیت خاصی |
| 26 | + باشد باید پیاده سازی شود. |
| 27 | +* شخصیسازی استایلها: برای هر کامپوننت یک فایل SCSS ساخته شده که استایلهای مربوط به اون کامپوننت داخلش نوشته شده. استایل هر کامپوننت با |
| 28 | + توجه به دیزاین پروژه تغییر پذیره. |
| 29 | +* منطق: با توجه به اینکه کامپوننتها به صورت اوپن سورس هستند به منطق هر کامپوننت دسترسی کامل دارید و برای اضافه کردن فیچر جدید یا رفع باگ ( |
| 30 | + در صورت وجود) نیاز به انتظار برای نسخه جدید ندارید. |
| 31 | + |
| 32 | +## **این پروژه شامل چه بخش هایی است؟** |
| 33 | + |
| 34 | +در این پروژه نیازهای اولیه که برای راه اندازی یک پروژه vue لازم است پیاده سازی شده که شامل بخش های استور[^1]، روتر[^2]، سرویسها[^3]، |
| 35 | +چندزبانه[^4]، ابزارها[^5] است.برای استور و روتر از pinia و vue-router استفاده شده است که پکیج های رسمی vue هستند. |
| 36 | +سرویسها: شامل یک پروایدر برای مدیریت درخواستهای AJAX و سرویس های لازم برای مدیریت لوکالاستورج ، توکنها، دسترسی ها، زبان برنامه و احراز |
| 37 | +هویت کاربر است. |
| 38 | +چندزبانه: مدیریت متنها به وسیله کتابخانه قدرتمند i18n و تعریف متنهای پیشفرض برنامه به زبان های فارسی و انگلیسی. |
| 39 | +ابزارها: متدهای پر استفاده به صورت پیشفرض در این بخش قرار داده شدهاند. |
| 40 | + |
| 41 | +## **اعتبارسنجی فرمها** |
| 42 | + |
| 43 | +برخی از فیلدهای فرم، نیازمند اعتبارسنجی با توجه به نوع ورودی که برای آنها تعیین شده دارند و برای این کار پکیج های زیادی وجود داره اما برای |
| 44 | +اینکه وابستگی های پروژه کم بشه این امکان برای فرمها و اینپوتها پیاده سازی شده. |
| 45 | +این امکان قابلیت اضافه کردن قوانین مورد نیاز برای اعتبار سنجی فیلدها به صورت نامحدود رو داره و میشه چند قانون رو برای یک فیلد در نظر گرفت. |
| 46 | +داخل بخش کامپوننت ها مثال هایی زده شده. |
| 47 | + |
| 48 | +## **از چه پکیج هایی استفاده شده؟** |
| 49 | + |
| 50 | +* Vite |
| 51 | + از vite ورژن 4.3 به خاطر سرعت بالا در توسعه و امکاناتی که برای توسعه دهنده قرار میده استفاده شده. |
| 52 | +* Pinia |
| 53 | + سرعت بالا و راحتی توسعه و همچنین پشتیبانی از قابلیت composition api از pinia استفاده شده |
| 54 | +* Vue-router |
| 55 | + از نسخه 4 به خاطر پشتیبانی از composition api استفاده شده |
| 56 | +* Vue-i18n |
| 57 | + برای مدیریت چند زبانی پروژه از این پکیج استفاده شده و زبان های فارسی و انگلیسی به صورت پیشفرض اضافه شده است |
| 58 | +* Bootstrap |
| 59 | + استایل پیشفرض کامپوننت ها و پروژه با bootstrap ورژن 5 پیاده سازی شده و میشه با پکیج هایی مثل tailwind و … جایگزین بشه |
| 60 | +* Axios |
| 61 | + درخواست های سرویس با این پکیج مدیریت میشه |
| 62 | +* Rtlcss |
| 63 | + مدیریت استایل rtl و ltr در زبان های مختلف توسط این پکیج مدیریت میشه |
| 64 | + |
| 65 | +## **Folder Structure** |
| 66 | + |
| 67 | +`📂starter kit` |
| 68 | +`├──📂 src` |
| 69 | +`│ ├──📂 asset` |
| 70 | +`│ ├──📂 components` |
| 71 | +`│ ├──📂 composables` |
| 72 | +`│ ├──📂 directives` |
| 73 | +`│ ├──📂 enums` |
| 74 | +`│ ├──📂 locales` |
| 75 | +`│ ├──📂 router` |
| 76 | +`│ ├──📂 services` |
| 77 | +`│ ├──📂 stores` |
| 78 | +`│ ├──📂 utils` |
| 79 | +`│ ├──📂 views` |
| 80 | +`│ ├──📄 app.vue` |
| 81 | +`│ ├──📄 bootstrap.js` |
| 82 | +`│ └──📄 main.js` |
| 83 | +`├──📄 vite.config.js` |
| 84 | +`├──📄 package.json` |
| 85 | +`└──🌐 index.html` |
| 86 | + |
| 87 | +## **چه کامپوننت هایی ساخته شده است و هر کدام چه امکاناتی دارند** |
| 88 | + |
| 89 | +VForm |
| 90 | +این کامپوننت به جای تگ form استفاده میشه و امکان ولیدیشن (validation) رو فراهم میسازه. |
| 91 | + |
| 92 | +VInput |
| 93 | +این کامپوننت علاوه بر امکاناتی که خود تگ input داره چند قابلیت دیگه رو هم پشتیبانی میکنه: |
| 94 | + |
| 95 | +* اعتبارسنجی و نمایش متن خطا با توجه به قانون تعریف شده در پراپس rules |
| 96 | +* اسلاتهای append و prepend که قابلیت شخصی سازی بیشتری رو فراهم میکنند |
| 97 | +* امکان حذف مقادیر input با استفاده از پراپس clearable |
| 98 | +* غیرفعال کردن با استفاده از پراپس disabled |
| 99 | +* اسلات label |
| 100 | + |
| 101 | +```vue |
| 102 | +
|
| 103 | +<VInput v-model="value" :rules="[validator.required('required')]" clearable disabled> |
| 104 | + <template #prepend>prepend</template> |
| 105 | + <template #label>test</template> |
| 106 | + <template #append>append</template> |
| 107 | +</VInput> |
| 108 | +``` |
| 109 | + |
| 110 | +VAutoComplete |
| 111 | +یکی از پرکاربردترین کامپوننت ها که قابلیت های زیادی رو پشتیبانی میکنه: |
| 112 | + |
| 113 | +* پاس دادن آیتم ها به کامپوننت به وسیله پراپس items |
| 114 | +* اعتبارسنجی و نمایش متن خطا با توجه به قانون تعریف شده در پراپس rules |
| 115 | +* اسلاتهای append و prepend که قابلیت شخصی سازی بیشتری رو فراهم میکنند |
| 116 | +* امکان حذف مقادیر input با استفاده از پراپس clearable |
| 117 | +* تعیین متن آیتمهای منو بر اساس فیلد خاصی از آیتم های پاس داده شده با استفاده از پراپس item-text |
| 118 | +* تعیین value کامپوننت بر اساس فیلد خاصی از آیتم های پاس داده شده با استفاده از پراپس item-key |
| 119 | +* شخصی سازی آیتمهای منو به وسیله اسلات item |
| 120 | +* اسلات label |
| 121 | +* غیرفعال کردن با استفاده از پراپس disabled |
| 122 | +* تعین سایز کامپوننت به وسیله پراپس size |
| 123 | + |
| 124 | +```vue |
| 125 | +
|
| 126 | +<VAutoComplete |
| 127 | + v-model="value" |
| 128 | + :items="items" |
| 129 | + item-key="id" |
| 130 | + item-text="name" |
| 131 | + size="md" |
| 132 | + clearable |
| 133 | + disabled |
| 134 | + :rules="[validator.required('required')]" |
| 135 | +> |
| 136 | + <template #label>test</template> |
| 137 | + <template #item="{item}">{{item}}</template> |
| 138 | +</VAutoComplete> |
| 139 | +``` |
| 140 | + |
| 141 | +VRadioGroup |
| 142 | +این کامپوننت به عنوان پروایدر عمل میکنه و گروه بندی input ها رو انجام میده |
| 143 | + |
| 144 | +* اعتبارسنجی و نمایش متن خطا با توجه به قانون تعریف شده در پراپس rules |
| 145 | +* تعیین name مشترک برای تمام input ها با پراپس name |
| 146 | + |
| 147 | +VRadio |
| 148 | +این کامپوننت به عنوان input با تایپ radio استفاده میشه: |
| 149 | + |
| 150 | +* پراپس value برای مشخص کردن مقدار input |
| 151 | +* غیرفعال کردن با استفاده از پراپس disabled |
| 152 | +* پراپس های outlined و button برای تغییر استایل |
| 153 | +* پراپس theme برای تغییر رنگ کامپوننت |
| 154 | +* اسلات label |
| 155 | + |
| 156 | +```vue |
| 157 | +
|
| 158 | +<VRadioGroup name="radio-button" v-model="value" :rules="[validator.required('required')]"> |
| 159 | + <VRadio outlined value="1"> |
| 160 | + <template #label>number one</template> |
| 161 | + </VRadio> |
| 162 | + <VRadio button theme="danger" value="2"> |
| 163 | + <template #label>number two</template> |
| 164 | + </VRadio> |
| 165 | + <VRadio disabled outlined theme="dark" value="3"> |
| 166 | + <template #label>number three</template> |
| 167 | + </VRadio |
| 168 | +</VRadioGroup> |
| 169 | +``` |
| 170 | + |
| 171 | +VTextArea |
| 172 | +این کامپوننت علاوه بر امکاناتی که خود تگ textarea داره چند قابلیت دیگه رو هم پشتیبانی میکنه: |
| 173 | + |
| 174 | +* اعتبارسنجی و نمایش متن خطا با توجه به قانون تعریف شده در پراپس rules |
| 175 | +* غیرفعال کردن با استفاده از پراپس disabled |
| 176 | +* اسلات label |
| 177 | + |
| 178 | +```vue |
| 179 | +
|
| 180 | +<VTextArea v-model="value" :rules="[validator.required('required')]" disabled> |
| 181 | + <template #label>label</template> |
| 182 | +</VTextArea> |
| 183 | +``` |
| 184 | + |
| 185 | +VTooltip |
| 186 | + |
| 187 | +* پراپس position برای تعیین مکان tooltip |
| 188 | +* پراپس trigger برای تعیین ایونت کامپوننت (hover , click , focus) |
| 189 | +* تغییر استایل کامپوننت با استفاده از پراپس theme |
| 190 | +* اسلات activator |
| 191 | + |
| 192 | +```vue |
| 193 | +
|
| 194 | +<VTooltip theme="warning" position="start"> |
| 195 | + <template #activator="{on}"> |
| 196 | + <button v-on="on">activator</button> |
| 197 | + </template> |
| 198 | + <template #default>Tooltip</template> |
| 199 | +</VTooltip> |
| 200 | +``` |
| 201 | + |
| 202 | +VModal |
| 203 | +یکی از پرکاربردترین کامپوننت ها که قابلیت های زیادی رو پشتیبانی میکنه و قابلیت شخصی سازی زیادی هم داره: |
| 204 | + |
| 205 | +* پراپس show برای نمایش کامپوننت |
| 206 | +* پراپس size برای تعیین اندازه کامپوننت |
| 207 | +* پراپس mobile-breakpoint برای تمام صفحه شدن کامپوننت در سایز های موبایل |
| 208 | +* اسلات header برای شخصی سازی header کامپوننت |
| 209 | +* اسلات title برای تغییر عنوان کامپوننت |
| 210 | +* اسلات body برای پیاده سازی محتوای کامپوننت |
| 211 | +* اسلات footer برای قرار دادن اکشن ها و شخصی سازی footer کامپوننت |
| 212 | +* ایونت show قابلیت انجام عملیات هنگام بازٰشدن مودال رو میده |
| 213 | +* ایونت hide قابلیت انجام عملیات هنگام بسته شدن مودال رو میده |
| 214 | + |
| 215 | +```vue |
| 216 | +
|
| 217 | +<VModal v-model:show="value" size="md" mobile-breakpoint="sm" @show="doSomthingOnShow" @hide="doSomthingOnHide"> |
| 218 | + <template #title>title</template> |
| 219 | + <template #body>body</template> |
| 220 | + <template #footer>footer</template> |
| 221 | +</VModal> |
| 222 | +``` |
| 223 | + |
| 224 | +ٰTable |
| 225 | +این پروژه دو کامپوننت جدول دارد که یکی برای دادههای سمت سرور و دیگری داده های استاتیک. |
| 226 | + |
| 227 | +VTable و VTableServer |
| 228 | +VTable جدولی برای داده های استاتیک و VTableServer برای دادههای سمت سرور |
| 229 | + |
| 230 | +* پاس دادن آیتم ها به کامپوننت به وسیله پراپس items |
| 231 | +* تعداد کل آیتمها توسط پراپس items-length |
| 232 | +* تعداد ردیفهای جدول با پراپس items-per-page |
| 233 | +* تعیین شماره صفحه با پراپس page |
| 234 | +* حالت لودینگ جدول با پراپس is-loading |
| 235 | +* اسلات row برای شخصی سازی ردیف های جدول |
| 236 | + |
| 237 | +```vue |
| 238 | +
|
| 239 | +<VTable :items="items" :items-length="items.length" items-per-page="10" :page="page" :is-loading="isLoading"> |
| 240 | + <template #row="{item, columns}"> |
| 241 | + <tr> |
| 242 | + <component :is="column" v-for="(column, index) of columns" :key="index"/> |
| 243 | + </tr> |
| 244 | + </template> |
| 245 | + <VColumn field="name" header="name"></VColumn> |
| 246 | + <VColumn field="id" header="id"></VColumn> |
| 247 | +</VTable> |
| 248 | +<VTableServer :items="items" :items-length="items.length" items-per-page="10" :page="page" :is-loading="isLoading"> |
| 249 | + <template #row="{item, columns}"> |
| 250 | + <tr> |
| 251 | + <component :is="column" v-for="(column, index) of columns" :key="index"/> |
| 252 | + </tr> |
| 253 | + </template> |
| 254 | + <VColumn field="name" header="name"></VColumn> |
| 255 | + <VColumn field="id" header="id"></VColumn> |
| 256 | +</VTableServer> |
| 257 | +``` |
| 258 | + |
| 259 | +VColumn |
| 260 | + |
| 261 | +کامپوننتی برای تعین ستون های جدول |
| 262 | + |
| 263 | +* پراپس field برای تعیین مقدار ستون با توجه به هر آیتم |
| 264 | +* پراپس header برای تعیین هدر هر ستون |
| 265 | +* اسلات body برای شخصی سازی مقدار هر ستون |
| 266 | +* اسلات header برای شخصی سازی هدر هر ستون |
| 267 | + |
| 268 | +```vue |
| 269 | +
|
| 270 | +<VColumn> |
| 271 | + <template #header> name</template> |
| 272 | + <template #body="{item}"> {{item.name}}</template> |
| 273 | +</VColumn> |
| 274 | +``` |
| 275 | + |
| 276 | +[^1]: store |
| 277 | + |
| 278 | +[^2]: router |
| 279 | + |
| 280 | +[^3]: services |
| 281 | + |
| 282 | +[^4]: localization |
| 283 | + |
| 284 | +[^5]: utils |
0 commit comments