سرور مجازی

۱۱۸ مطلب در مرداد ۱۳۹۹ ثبت شده است

  • ۰
  • ۰

مقدمه
بخش بزرگی از مدیریت سیستم جمع آوری اطلاعات دقیق در مورد سرور مجازی ها و زیرساخت های تان میباشد. ابزار و گزینه هایی برای جمع آوری و پردازش این نوع اطلاعات وجود دارد. بسیاری از آنها براساس فناوری به نام SNMP ساخته شده اند.
SNMP مخفف simple network management protocol یعنی پروتکل ساده مدیریت شبکه است. روشی است که سرور مجازی ها می توانند اطلاعاتی را درباره وضعیت فعلی خود به اشتراک بگذارند ، و همچنین کانالی را که یک ادمین می تواند مقادیر از پیش تعریف شده را تغییر دهد. در حالی که خود پروتکل ساده است ، ساختار برنامه هایی که SNMP را پیاده سازی می کند می تواند به سرعت پیچیده شوند. برای اطلاعات بیشتر در مورد اصول اولیه پروتکل SNMP ، به مقاله مقدمه ای بر SNMP مراجعه کنید.
در این راهنما ابزارهایی برای برقراری ارتباط با استفاده از SNMP تنظیم می کنید. برای نشان دادن از دو سرور مجازی اوبونتو 18.04 استفاده خواهید کرد. یک مدیر SNMP وجود دارد که برای پیاده سازی دستگاه های شبکه با نماینده صحبت خواهد کرد. به آن manager server گفته می شود. سرور مجازی دیگر نماینده SNMP را خواهد داشت که به دستورات سرور مجازی مدیر عمل خواهد کرد. به این سرور مجازی agent server گفته می شود. شما می توانید انتخاب کنید که ایجنت را نیز روی دستگاه مدیر نصب کنید ، اما جدا نگه داشتن آنها باعث می شود بتوانید عملکرد هر یک از مؤلفه ها را آسان تر کنید.
پیش نیازها
برای دنبال کردن این آموزش ، به موارد زیر نیاز دارید:
• دو سرور مجازی Ubuntu 18.04 با که پیروی از راهنمای اولیه تنظیم سرور مجازی Ubuntu 18.04 تنظیم شده اند ، شامل کاربر غیر ریشه ای با امتیازات sudo و فایروال تنظیم شده با ufw.
مرحله 1 – نصب SNMP Daemon و امکانات
می توانید با نصب Daemon و ابزارهای موجود در سرور مجازی های اوبونتو به بررسی نحوه اجرای SNMP بر روی یک سیستم بپردازید.
از دستگاه محلی خود ، به عنوان کاربر غیر ریشه خود وارد manager server شوید:
$ ssh your_username@manager_server_ip_address

فهرست بسته بندی را برای مدیر بسته APT به روز کنید:
$ sudo apt update

سپس ، نرم افزار SNMP را نصب کنید:
$ sudo apt install snmp snmp-mibs-downloader

بسته snmp مجموعه ای از ابزارهای خط فرمان را برای صدور درخواست های SNMP به نمایندگان فراهم می کند. بسته snmp-mibs-downloader به نصب و مدیریت فایل های پایه اطلاعات مدیریت (MIB) کمک میکند، که رد آبجکت های شبکه را پیگیری میکند.
سپس یک ترمینال جدید را در دستگاه محلی خود باز کرده و وارد agent server شوید:
$ ssh your_username@agent_server_ip_address

در سرور مجازی نماینده ، فهرست بسته را به روز کنید:
$ sudo apt update

سپس Daemon SNMP را نصب کنید
$ sudo apt install snmpd

توجه داشته باشید که نیازی به بسته snmp-mibs-downloader ندارید ، زیرا سرور مجازی نماینده قادر به مدیریت فایل های MIB نخواهد بود.
اکنون که این مؤلفه ها را نصب کردید ، سرور مجازی مدیر خود را پیکربندی می کنید.
مرحله 2 – پیکربندی منیجر سرور مجازی SNMP
همانطور که قبلاً ذکر شد ، عمده کار در سرور مجازی ایجنت (عامل) اتفاق می افتد ، بنابراین پیکربندی شما در سرور مجازی مدیر کمتر درگیر خواهد شد. فقط باید یک فایل را اصلاح کنید تا مطمئن شوید که ابزارهای SNMP می توانند از داده های MIB اضافی که نصب کرده اید استفاده کنند.
در سرور مجازی مدیر خود ، فایل /etc/snmp/snmp.conf را در ویرایشگر متن خود با امتیازات sudo باز کنید. در این آموزش از nano استفاده می شود:
$ sudo nano /etc/snmp/snmp.conf

در این فایل ، چند خط کامنت دار و یک خط بدون کامنت وجود دارد. برای اینکه مدیر بتواند فایل های MIB را وارد کند ، خط mibs را کامنت اوت کنید:
/etc/snmp/snmp.conf
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
#mibs :

اگر از nano استفاده می کنید، با فشار دادن CTRL + X ، و سپس Y و enter ، snpt.conf را ذخیره کرده و ببندید.
اکنون پیکربندی سرور مجازی مدیر را به پایان رسانده اید ، اما همچنان باید از این سرور مجازی برای پیکربندی سرور مجازی نماینده خود استفاده کنید ، که در مرحله بعدی انجام خواهید داد.
مرحله 3 – پیکربندی سرور مجازی عامل SNMP
به عنوان یک سیستم سرور مجازی کلاینت واقعی ، سرور مجازی نماینده هیچ یک از ابزارهای خارجی لازم برای پیکربندی تنظیم SNMP خود را ندارد. شما می توانید برخی از فایل های پیکربندی را اصلاح کنید تا تغییراتی ایجاد شود ، اما بیشتر تغییراتی که شما باید انجام دهید با اتصال به سرور مجازی نماینده خود از طریق سرور مجازی مدیریت شما انجام می شود.
در این آموزش از نسخه 3 پروتکل SNMP استفاده خواهید کرد. برخلاف SNMPv1 و v2 ، در SNMPv3 هر پیام حاوی پارامترهای امنیتی رمزگذاری شده است. در این مرحله قوانین احراز هویت و کنترل دسترسی SNMPv3 را پیکربندی خواهید کرد.
برای شروع ، در سرور مجازی نماینده خود ، فایل پیکربندی Daemon را با امتیازات sudo باز کنید:
$ sudo nano /etc/snmp/snmpd.conf

در داخل ، باید چند تغییر ایجاد کنید. عمدتاً برای راه اندازی تنظیمات شما استفاده می شوند تا بتوانید آن را از سرور مجازی دیگر خود مدیریت کنید.
ابتدا ، باید دستورالعمل agentAddress را تغییر دهید. در حال حاضر ، به گونه ای تنظیم شده است که فقط اتصالات حاصل از رایانه محلی را اجازه میدهد. باید خط فعلی را کامنت اوت کنید و خط زیر آن را که به همه اتصالات اجازه می دهد ، uncomment کنید.
/etc/snmp/snmpd.conf
# Listen for connections from the local system only
#agentAddress udp:127.0.0.1:161
# Listen for connections on all interfaces (both IPv4 *and* IPv6)
agentAddress udp:161,udp6:[::1]:161

توجه: از آنجا که اجازه دادن به کلیه اتصالات مانند این بهترین راهکار امنیتی نیست ، بهتر است بعد از اتمام بوت استرپینگ ، این امکان را به زودی قفل کنید.

در مرحله بعد ، به طور موقت یک خط createUser را وارد می کنید. این دستورالعمل ها معمولاً در این فایل نگهداری نمی شوند. شما دوباره آن را در یک لحظه حذف خواهید کرد.
کاربری که ایجاد می کنید bootstrap نامیده می شود و به عنوان الگویی برای ایجاد اولین کاربر واقعی شما از آن استفاده می شود. بسته های SNMP این کار را از طریق فرآیند کلون سازی ویژگی های کاربر انجام می دهند.
در هنگام تعریف کاربر جدید ، باید نوع تأیید اعتبار خود را تعیین کنید (MD5 یا SHA) و همچنین یک عبارت عبور تهیه کنید که حداقل باید هشت کاراکتر باشد. اگر قصد دارید از رمزگذاری برای انتقال استفاده کنید همانند کاری که در این آموزش میکنید، باید پروتکل حریم خصوصی (DES یا AES) و به صورت اختیاری یک عبارت عبور پروتکل حریم خصوصی را نیز مشخص کنید. اگر هیچ عبارت عبور پروتکل حریم خصوصی ارائه نشده باشد ، عبارت عبور تأیید اعتبار، برای پروتکل حریم خصوصی نیز استفاده می شود.
این خط CreatUser را به انتهای فایل اضافه کنید:
/etc/snmp/snmpd.conf

createUser bootstrap MD5 temp_password DES

اکنون که کاربر جدیدی را مشخص کرده اید ، می توانید سطح دسترسی را که این کاربر در اختیار دارد تنظیم کنید. در این آموزش این کار را برای کاربر bootstrap خود تنظیم می کنید ، همچنین برای کاربر جدیدی که ایجاد می کنید با نام demo تنظیم می شود. با استفاده از بخشنامه rwuser به آنها اجازه دسترسی و خواندن و نوشتن را می دهید (گزینه جایگزین برای دسترسی فقط خواندن rouser است).
همچنین می توانید استفاده از رمزگذاری را با مشخص کردن priv بعد از کاربر خود اعمال کنید. اگر می خواهید کاربر را به قسمت خاصی از MIB محدود کنید ، می توانید شناساگر آبجکت در بالاترین سطح (OID) را تعیین کنید که کاربر باید در انتهای خط به آن دسترسی داشته باشد.
برای اهداف این آموزش ، هر دو خط شما به شرح زیر است:
/etc/snmp/snmpd.conf

rwuser bootstrap priv
rwuser demo priv

پس از اتمام انجام این تغییرات ، فایل را ذخیره کنید و ببندید.
برای اجرای این تغییرات ، سرویس snmpd را در سرور مجازی نماینده خود مجدداً راه اندازی کنید:
$ sudo systemctl restart snmpd

SNMP daemon اتصالات پورت را شنود میکند: 161. UFW را پیکربندی کنید تا بتوانید از سرور مجازی مدیر به این پورت ارتباط برقرار کنید:
می توانید اطلاعات بیشتری در مورد UFW را در راهنمای نحوه راه اندازی فایروال با UFW در اوبونتو 18.04 به دست آورید.
اکنون که سرور مجازی ایجنت پیکربندی شده است ، می توانید از طریق سرور مجازی مدیر به سرور مجازی ایجنت خود متصل شوید تا ارتباط را تأیید کنید.
مرحله 4 – تأیید صحت هویت سرور مجازی نماینده
در این مرحله آزمایش خواهید کرد تا مطمئن شوید که می توانید با حساب bootstrap خود به سرور مجازی نماینده وصل شوید. با این حال ، قبل از آن ، این آموزش کمی در مورد ساختار کلی ارسال یک دستور SNMP صحبت خواهد کرد.
هنگام استفاده از مجموعه ابزارهای موجود در پکیج snmp (مجموعه نرم افزار net-snmp) ، دستورالعمل هایی در مورد نحوه فراخوانی فرمان ها وجود دارد. اولین کاری که باید انجام دهید تایید اعتبارDaemon SNMP است که می خواهید با آن ارتباط برقرار کنید. این معمولاً شامل تهیه چند بخش اطلاعات است. موارد معمول به شرح زیر است:
-v: از این فلگ برای مشخص کردن نسخه پروتکل SNMP که می خواهید به کار بگیرید، استفاده می شود. این آموزش از v3 استفاده خواهد کرد.
-c: در صورت استفاده از رشته های جامع SNMP v1 یا سبک v2 برای احراز هویت ، از این فلگ استفاده می شود. از آنجا که از تأیید هویت مبتنی بر کاربر به سبک V3 استفاده می کنید ، نیازی به انجام این کار ندارید.
-u: این پارامتر برای مشخص کردن نام کاربری مورد نظر برای تأیید اعتبار استفاده می شود. برای خواندن یا تغییر هر چیزی با استفاده از SNMP ، باید با یک نام کاربری شناخته شده تأیید اعتبار کنید.
-l: برای مشخص کردن سطح امنیتی که با آنها ارتباط برقرار می کنید ، استفاده می شود. مقادیر احتمالی برای عدم احراز هویت و عدم رمزگذاری noAuthNoPriv میباشد ، و برای احراز هویت و عدم رمزگذاری authNoPriv ، و برای احراز هویت و رمزگذاری authPriv خواهد بود. نام کاربری که شما استفاده می کنید باید پیکربندی شود تا در سطح امنیتی که مشخص کرده اید ، کار کند وگرنه تأیید اعتبار موفق نخواهد شد.
-a: این پارامتر برای مشخص کردن پروتکل احراز هویت مورد استفاده قرار می گیرد. مقادیر ممکن MD5 یا SHA است. باید با اطلاعاتی که هنگام ایجاد کاربر مشخص شده است مطابقت داشته باشد.
-x: از این پارامتر برای مشخص کردن پروتکل رمزگذاری استفاده می شود. مقادیر ممکن DES یا AES باشند. این باید با اطلاعاتی که هنگام ایجاد کاربر مشخص شده است مطابقت داشته باشد. این کار هر زمان که مشخصات امتیاز کاربر بعد از آن priv داشته باشد ، لازم است تا رمزگذاری را اجباری کند.
-A: از این عبارت برای دادن عبارت عبور تأیید اعتبار استفاده می شود که هنگام ایجاد کاربر مشخص شده است.
-X: این عبارت رمزگذاری است که هنگام ایجاد کاربر مشخص شده است. اگر هیچ عبارتی مشخص نشده باشد اما الگوریتم رمزگذاری داده شده باشد ، از عبارت عبور تأیید اعتبار استفاده خواهد شد. این مورد هنگام ارائه پارامتر -x یا هر زمان که مشخصات امتیاز کاربر بعد از آن دارای priv باشد ، لازم است که رمزگذاری شود.
با استفاده از این اطلاعات می توانید دستورات خود را بسازید. با توجه به چگونگی تنظیم کاربر bootstrap خود ، دستوراتی که با آن حساب استفاده خواهید کرد چنین خواهد بود:
snmp_command -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password remote_host snmp_sub_command_or_options

از سرور مجازی مدیر خود ، تست کنید تا مطمئن شوید که حساب bootstrap  شما در دسترس است. موارد زیر را برای نمایش اطلاعات سیستم برای سرور مجازی نماینده تایپ کنید:
$ snmpget -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address 1.3.6.1.2.1.1.1.0

رشته 1.3.6.1.2.1.1.1.0 ، OID است که وظیفه نمایش اطلاعات سیستم را بر عهده دارد. خروجی نام uname -a را در سیستم از راه دور برمی گرداند.
خروجی زیر را نشان می دهد:
Output
SNMPv2-MIB::sysDescr.0 = STRING: Linux agent 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64

اکنون که تأیید کردید که می توانید به سرور مجازی ی که SNMP را اجرا میکند تأیید اعتبار دهید ، می توانید به کار خود ادامه دهید تا بتوانید حساب کاربری منظم خود را ایجاد کنید.
مرحله 5 – تنظیم حساب کاربری منظم
اگرچه امتیازات اشتراک کاربر نمایشی را در فایل snmpd.conf مشخص کرده اید ، اما شما در واقع هنوز این کاربر را ایجاد نکرده اید. در این مرحله می خواهید از کاربر bootstrap به عنوان الگویی برای کاربر جدید خود استفاده کنید. شما این کار را با استفاده از ابزار snmpusm که برای مدیریت کاربر استفاده می شود ، انجام می دهید.
در سرور مجازی مدیر ، با استفاده از ابزار snmpusm و دستور کلی زیر می توانید کاربر را از قالب موجود ایجاد کنید:
snmpusm authentication_info agent_server_ip_address create new_user existing_user

با استفاده از آنچه در مورد فلگ های تأیید هویت موردنیاز می دانید و با استفاده از حساب کاربری که در اختیار دارید (bootstrap) ، می توانید یک کاربر متناسب با امتیازات کاربری که قبلاً تعریف کرده اید (نسخه ی نمایشی) ایجاد کنید.
این دستور به شرح زیر خواهد بود:
$ snmpusm -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address create demo bootstrap

پیام زیر را دریافت خواهید کرد:
Output
User successfully created.

اکنون یک کاربر کاملاً عملکردی به نام demo روی سرور مجازی نماینده خود دارید. با این حال ، هنوز از همان اطلاعات تأیید اعتبار به عنوان حساب bootstrap استفاده می کند. برای افزایش امنیت ، می توانید رمز عبور را به چیز دیگری تغییر دهید. این بار ، از اکانت demo برای تأیید اعتبار استفاده می کنید. به یاد داشته باشید ، گذرواژه‌ها باید حداقل هشت کاراکتر داشته باشند:
$ snmpusm -u demo -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address passwd temp_password new_password

پیام زیر را دریافت خواهید کرد:
Output
SNMPv3 Key(s) successfully changed.

می توانید با درخواست از سرور مجازی نماینده مدت زمان اجرای سرویس SNMP ، اعتبار و رمز جدید خود را آزمایش کنید. برای بدست آوردن یک مقدار واحد از سرور مجازی نماینده ، از دستور snmpget استفاده خواهید کرد.
این بار ، از تعاریف اضافی MIB که دانلود کرده اید ، استفاده کنید تا به جای ID عددی OID ، مقدار را با نام بخواهید.
$ snmpget -u demo -l authPriv -a MD5 -x DES -A new_password -X new_password agent_server_ip_address sysUpTime.0

شما مقداری را به دست خواهید آورد که آخرین بار شروع مجدد SNMP daemonاز راه دور است:
Output
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (53309) 0:08:53.09

اکنون یک حساب کاربری در حال کار با نام demo دارید. در مرحله بعدی کار با دستورات SNMP را با پیکربندی کلاینت ساده سازی خواهید کرد.
مرحله 6 – ایجاد فایل پیکربندی کلاینت
احتمالاً به این نکته توجه کرده اید که جزئیات تأیید اعتبار برای همه دستورات SNMP شما با هر درخواست نسبتاً ثابت خواهد بود. به جای هر بار تایپ کردن این موارد، می توانید یک فایل پیکربندی سمت کلاینت ایجاد کنید که اعتبارنامه ای را که با آن در ارتباط هستید را شامل شود.
فایل پیکربندی کلاینت بسته به میزان گستره ای که می خواهید آن را به اشتراک بگذارید ، می تواند در دو مکان مختلف قرار گیرد.
اگر می خواهید اعتبار ورود به سیستم را با هر کاربر معتبری در دستگاه مدیریت خود به اشتراک بگذارید ، می توانید جزئیات پیکربندی خود را در فایل جهانی snmp.conf در سرور مجازی مدیر قرار دهید. لازم است آن فایل را با امتیازات sudo باز کنید:
$ sudo nano /etc/snmp/snmp.conf

در حالی که ، اگر می خواهید تأیید اعتبار را فقط برای کاربر خود تعیین کنید ، می توانید یک دایرکتوری پنهان .snmp را در دیرکتوری هوم کاربر خود در سرور مجازی مدیر ایجاد کنید و فایل را در آنجا ایجاد کنید:
$ mkdir ~/.snmp

$ nano ~/.snmp/snmp.conf

صرف نظر از تصمیم شما در مورد قرار دادن پیکربندی، مطالب یکسان خواهند بود.
دستوراتی که برای تأیید اعتبار از آنها استفاده خواهید کرد در جدول زیر است. در ستون سمت راست ، می توانید نامهای بخشنامه ای را که برای تنظیم آن جزئیات پیکربندی در فایل snmp.conf استفاده می شود ، مشاهده کنید:
Command Flag Description Translated snmp.conf directive
-u username نام کاربری SNMPv3 برای تایید اعتبار defSecurityName username
-l authPriv سطح امنیتی برای تایید اعتبار defSecurityLevel authPriv
-a MD5 پروتکل تایید اعتبار برای استفاده defAuthType MD5
-x DES پروتکل خصوصی برای استفاده defPrivType DES
-A passphrase عبارت عبور تایید اعتبار از سمت نام کاربری ارائه شده defAuthPassphrase passphrase
-X passphrase عبارت عبور خصوصی از سمت نام کاربری ارائه شده defPrivPassphrase passphrase

با استفاده از این اطلاعات می توانید یک فایل مناسب snmp.conf بسازید. برای این راهنما ، اینگونه خواهد بود:
snmp.conf
defSecurityName demo
defSecurityLevel authPriv
defAuthType MD5
defPrivType DES
defAuthPassphrase new_password
defPrivPassphrase new_password

پس از اتمام ، فایل را ذخیره کنید و ببندید.
اکنون ، می توانید دستورات خود را بدون تهیه جزئیات تأیید اعتبار صادر کنید. فقط نیاز به دستور SNMP ، هاست و آرگومانهای فرمان دارید.
به جای تایپ کردن دستور زیر:
$ snmpget -u demo -l authPriv -a MD5 -x DES -A new_password -X new_password agent_server_ip_address sysUpTime.0

می توانید تایپ کنید:
$ snmpget agent_server_ip_address sysUpTime.0

همانطور که مشاهده می کنید ، این امر به میزان قابل توجهی میزان اطلاعات مورد نیاز برای تهیه در هر درخواست را کاهش می دهد. در مرحله بعد ، برای محکم کردن امنیت شبکه ، حساب bootstrap را حذف می کنید.
مرحله 7 – حذف حساب Bootstrap
اکنون که حساب منظم شما به درستی پیکربندی شده است ، می توانید حساب ناامن بوت استرپ را حذف کنید.
در سرور مجازی نماینده خود ، فایل /etc/snmp/snmpd.conf را دوباره با امتیازات sudo باز کنید.
$ sudo nano /etc/snmp/snmpd.conf

هر دو خط را که قبلاً اضافه کرده اید و کاربر bootstrap را ارجاع میدهد، پیدا کرده و کامنت اوت کنید (یا حذف کنید):
/etc/snmp/snmpd.conf

#createUser bootstrap MD5 temp_password DES
#rwuser bootstrap priv

ذخیره کنید و فایل را ببندید.
اکنون ، Daemon SNMP را مجدداً راه اندازی کنید:
$ sudo systemctl restart snmpd

• این کار توصیه ی عدم داشتن دیرکتیو های createUser در فایل عادی snmpd.conf را برآورده میکند. همچنین امتیازات مربوط به آن کاربر موقت را حذف می کند.
اگر می خواهید کاربر bootstrap را از usmUserTable به طور کامل حذف کنید ، می توانید با صدور این دستور از سرور مجازی مدیر این کار را انجام دهید:
$ snmpusm agent_server_ip_address delete bootstrap

پاسخ زیر را دریافت خواهید کرد:
Output
User successfully deleted.

نتیجه
در این مرحله ، تنظیمات کاملاً پیکربندی شده کلاینت-سرور مجازی را دارید که می تواند با استفاده از پروتکل SNMP با امنیت ارتباط برقرار کند. اکنون می توانید daemon های بیشتر در میزبان های دیگر اضافه کنید و دسترسی به حساب را در کل زیرساخت های خود پیکربندی کنید.
برای مطالعه بیشتر ، می توانید از آموزش نحوه استفاده از ابزار SNMP شبکه برای مدیریت و نظارت بر سرور مجازی ها استفاده کنید تا در مورد ابزارهای SNMP و نحوه استفاده از آنها برای بازیابی مقادیر یک به یک یا به صورت فله ای و نحوه تغییر داده ها اطلاعات کسب کنید..

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

مقدمه
Terminalizer یک برنامه ثبت ترمینال است که به شما امکان می دهد بخش ترمینال خود را در زمان واقعی ثبت و ضبط کنید ، و سپس در یک تاریخ بعد دوباره آن را پخش کنید. به همان روش ضبط صفحه نمایش دسکتاپ کار می کند ، با این تفاوت که در ترمینال شما اجرا می شود.
اگر می خواهید یک فعالیت خاص را دوباره مرور کنید ، یا به اشکال زدایی در یک خطای فریبنده خاص کمک کنید ، ضبط بخش پایانه مفید خواهد بود. ضبط های ساخته شده با Terminalizer همچنین می توانند به عنوان GIF های متحرک صادر شوند ، که برای به اشتراک گذاری آنلاین یا افزودن به مواد بازاریابی برای نرم افزار شما فوق العاده است.
در این آموزش Terminalizer را نصب می کنید ، از آن برای ضبط و پخش بخش های ترمینال استفاده می کنید ، ضبط های خود را سفارشی می کنید و سپس آنها را برای اشتراک گذاری آنلاین صادر می کنید.
پیش نیازها
برای تکمیل این آموزش ، به موارد زیر نیاز دارید:
⦁ سرور مجازی Ubuntu 18.04 که با دنبال کردن راهنمای راه اندازی اولیه سرور مجازی با اوبونتو 18.04 تنظیم شده است ، و شامل یک کاربر غیر ریشه sudoباشد.
⦁ Node.js و npm که با دنبال کردن نصب نسخه Distro-Stable برای بخش اوبونتو در راهنمای نحوه نصب Node.js در اوبونتو 18.04 قابل نصب است.
اگر می خواهید ضبط های خود را به صورت آنلاین به اشتراک بگذارید ، به این موارد نیز نیاز خواهید داشت:
• یک حساب کاربری رایگان در وب سایت Terminalizer.
پس از آماده شدن ، به عنوان کاربر غیر ریشه خود وارد سرور مجازی شوید.
مرحله 1 – نصب ترمینالایزر
در این مرحله ، Terminalizer را روی سیستم خود دانلود و نصب خواهید کرد. Terminalizer با استفاده از Node.js نوشته شده است و برای نصب با استفاده از مدیر بسته npm در دسترس است.
برای نصب Terminalizer در سطح جهانی بر روی سیستم خود ، دستور زیر را اجرا کنید:
⦁ $ sudo npm install –global –allow-root –unsafe-perm=true terminalizer

Terminalizer از چارچوب برنامه Electron برای صادر کردن بخش های ترمینال ضبط شده در قالب GIF استفاده می کند. به منظور نصب الکترون در سطح سیستم ، آرگومان فرمان –unsafe-perms = true لازم است.
پس از نصب Terminalizer ، خروجی مشابه زیر را مشاهده خواهید کرد:
Output
. . .
/usr/local/lib
└── terminalizer@0.7.1

سپس ، نصب خود را از طریق Terminalizer بررسی کنید:
⦁ $ terminalizer –version

چیزی شبیه به زیر را نشان می دهد:
Output
0.7.1
سرانجام ، یک فایل پیکربندی پیش فرض Terminalizer ایجاد کنید ، که می توانید برای شخصی سازی پیشرفته ترمینالایزر استفاده کنید (جزئیات بیشتر در مرحله 4):
⦁ $ terminalizer init

این کار خروجی شبیه به زیر را به همراه خواهد داشت:
output
The global config directory is created at
/home/user/.terminalizer
اکنون که Terminalizer را نصب کردید ، می توانید اولین ضبط ترمینال خود را انجام دهید.
مرحله 2 – ضبط و پخش یک بخش ترمینال
در این مرحله یک بخش ترمینال را ضبط و دوباره پخش می کنید.
برای شروع ، ضبط جدید Terminalizer را با استفاده از نام مورد نظر خود تنظیم کنید:
⦁ $ terminalizer record your-recording

خروجی زیر را ارائه می دهد تا نشان دهد ضبط شروع شده است:
Output
The recording session has started
Press Ctrl+D to exit and save the recording

اکنون می توانید هر کاری را که می خواهید در ترمینال خود انجام دهید. فشردن هر کلید و هر دستوری در زمان واقعی توسط Terminalizer ضبط می شود.
مثلا:
⦁ $ pwd

⦁ $ date

⦁ $ whoami

⦁ $ echo “Hello, world!”
وقتی می خواهید ضبط را متوقف کنید ، CTRL + D را فشار دهید. سپس Terminalizer ضبط را در فایل مشخص شده با فرمت YAML ذخیره می کند ، به عنوان مثال ، your-record.yml.
Output
Successfully Recorded
The recording data is saved into the file:
/home/user/your-recording.yml

ممکن است توسط Terminalizer از شما خواسته شود تا ضبط خود را به صورت آنلاین به اشتراک بگذارید. کافی است CTRL + C را فشار دهید تا فعلا این کار را لغو کنید ، زیرا می توانید ابتدا ضبط ترمینال را به صورت محلی پخش کنید.
در مرحله بعدی ، بخش پایانی ضبط شده خود را با دستور followng پخش کنید:
⦁ $ terminalizer play your-recording

این دستور بخش ضبط شده را در زمان واقعی در ترمینال شما پخش می کند:
Output
user@droplet:~$ pwd
/home/user
user@droplet:~$ date
Sun Mar 8 14:55:36 UTC 2020
user@droplet:~$ whoami
user
user@droplet:~$ echo “Hello, world!”
Hello, world!
user@droplet:~$ logout

همچنین می توانید با استفاده از گزینه –speed-Factor سرعت پخش ضبط خود را تنظیم کنید.
به عنوان مثال ، دستور زیر سرعت پخش موارد ضبط شده شما نصف می کند:
⦁ $ terminalizer play your-recording –speed-factor 2

از طرف دیگر ، می توانید ضبط خود را دو برابر سریعتر پخش کنید:
⦁ $ terminalizer play your-recording –speed-factor 0.5

اکنون یک بخش ترمینال را ضبط و پخش کرده اید. در مرحله بعد ، می توانید یک بخش ترمینال ضبط شده را به صورت آنلاین به اشتراک بگذارید.
مرحله 3 – اشتراک یک بخش ترمینال ضبط شده
در این مرحله ، بخش ترمینال ضبط شده خود را بصورت آنلاین در صفحه جستجوی Terminalizer به اشتراک می گذارید.
با انتخاب یک بخش ضبط شده برای اشتراک گذاری شروع کنید:
⦁ $ terminalizer share your-recording

از شما خواسته خواهد شد که متاداده پایه درباره ضبط خود ، مانند عنوان و توضیحات را ارائه دهید:
هشدار: ضبط های Terminalizer به طور پیش فرض به طور عمومی به اشتراک گذاشته می شوند ، بنابراین اطمینان حاصل کنید که هیچ جزئیات شخصی یا محرمانه موجود در ضبط ترمینال شما که نمی خواهید به اشتراک بگذارید وجود ندارد.
Output
Please enter some details about your recording
? Title Title of Your Recording
? Description Description of Your Recording
? Tags such as git,bash,game Comma-separated Tags for Your Recording

هشدار: از انجا که ضبط های Terminalizer به صورت پیش فرض در معرض دیدم عموم قرار ، اطمینان حاصل کنید که هیچ اطلاعات یا جزییات معتبری که نمیخواهید به اشتراک بگذارید در ضبط ترمینال شما نباشد.
اولین بار است که یک بخش ضبط شده را با استفاده از Terminalizer به اشتراک می گذارید، باید حساب Terminalizer خود را پیوند دهید. در صورت نیاز Terminalizer یک لینک تأیید را نشان می دهد:
Output
Open the following link in your browser and login into your account
https://terminalizer.com/token?token=your-token

When you do it, press any key to continue

هشدار: اطمینان حاصل کنید که نشانه Terminalizer خود را خصوصی نگه دارید، زیرا به هر کسی اجازه میدهد که به حساب Terminalizer شما دسترسی داشته باشد.

هنگامی که پیوند را در مرورگر وب خود مشاهده کرده و به حساب Terminalizer خود وارد شدید ، برای ادامه هر کلیدی را میتوانید فشار دهید.
Terminalizer اکنون ضبط شما را آپلود می کند و پیوند را برای مشاهده آن در اختیار شما قرار می دهد:
Output
Successfully Uploaded
The recording is available on the link:
https://terminalizer.com/view/your-recording-id

بازدید از پیوند در یک مرورگر وب دسکتاپ به شما امکان می دهد ضبط اشتراکی خود را مشاهده کنید:

شما یک بخش ضبط شده ترمینال را در وب سایت Terminalizer به اشتراک گذاشته اید و آن را در مرورگر وب خود مشاهده کرده اید.
مرحله 4 – تنظیم پیکربندی پیشرفته Terminalizer
اکنون که با Terminalizer آشنا شدید ، می توانید برخی از گزینه های پیشرفته تر سفارشی سازی، و همچنین امکان تنظیم رنگ و استایل صفحه نمایش را انجام دهید.
هر ضبط، پیکربندی پیش فرض را از فایل پیکربندی جهانی Terminalizer که در ~ / .terminalizer / config.yml قرار دارد دریافت میکند. این بدان معنی است که می توانید پیکربندی ضبط های فردی را مستقیماً با ویرایش فایل ضبط (به عنوان مثال your-record.yml) ویرایش کنید. از طرف دیگر ، می توانید پیکربندی جهانی را ویرایش کنید ، که تأثیر آن بر همه ضبط های جدید خواهد بود.
در این مثال فایل پیکربندی جهانی را ویرایش می کنید ، اما همان راهنما در مورد فایل های تنظیمات ضبط فردی نیز صدق می کند.
با باز کردن فایل پیکربندی جهانی Terminalizer در ویرایشگر متن خود ، مانند nano شروع کنید :
⦁ $ nano ~/.terminalizer/config.yml

در مورد هر یک از گزینه های موجود در پیکربندی در فایل به منظور توضیح آنچه انجام می دهند ، اظهار نظر می شود.
چندین گزینه پیکربندی معمول وجود دارد که ممکن است بخواهید مطابق میل خود تنظیم کنید:
⦁ Cols: به طور صریح تعداد ستون های ترمینال مورد استفاده برای ضبط خود را تنظیم کنید.
⦁ rows: به طور صریح تعداد ردیف های ترمینال مورد استفاده برای ضبط خود را تنظیم کنید.
⦁ FrameDelay: در هنگام پخش ، تأخیر بین هر فشردن کلید را حذف کنید.
⦁ MaxIdleTime: حداکثر زمان بین ضربات کلید را هنگام پخش مشخص کنید.
⦁ CursorStyle: سبک پیش فرض مکان نمای ترمینال را از بین block ، bar و underline مشخص کنید.
⦁ FontFamily: به ترتیب ترجیحی لیستی از فونت های پخش دلخواه را مشخص کنید.
⦁ theme: طرح رنگ پخش را تنظیم کنید به عنوان مثال برای ایجاد یک ترمینال سیاه و سفید و غیره ،.
به عنوان نمونه ، می توانید با پیکربندی گزینه های زیر به یک صفحه نمایش ترمینال سیاه و سفید برسید:
config.yml
. . .
theme:
background: “white”
foreground: “black”
. . .

نتیجه ای مشابه زیر خواهد داشت:

شما می توانید سبک مکان نما را تنظیم کنید تا فهمیدن ضبط راحت تر شود ، به عنوان مثال با تعویض حالت پیش فرض مکان نما از سبک بلوک به سبک آندرلاین:
config.yml
. . .
cursorStyle: underline
. . .

نتیجه ای مشابه زیر حاصل می شود:

پس از ایجاد تغییرات مورد نظر ، فایل را ذخیره کرده و به ترمینال خود برگردید.
اگر پیکربندی جهانی Terminalizer را ویرایش کرده باشید ، این تنظیمات برای همه ضبط های جدید که انجام میشوند اعمال می شود. اگر یک پیکربندی ضبط خاص را ویرایش می کنید ، Terminalizer بلافاصله تغییرات را برای آن ضبط خاص اعمال می کند.
توجه داشته باشید که یک ظاهر طراحی پخش سفارشی فقط در بخش های ضبط مشترک اعمال می شود. پخش آنها به طور مستقیم در ترمینال شما همیشه از یک ظاهر طراحی ترمینال و رنگ بندی پیش فرض شما استفاده می کند.
در این مرحله آخر ، برخی از گزینه های پیشرفته پیکربندی Terminalizer را مرور کردید.
نتیجه
در این مقاله از Terminalizer برای ضبط و اشتراک یک بخش ترمینال استفاده کرده اید. اکنون شما دانش لازم را برای ایجاد نسخه های نمایشی ضبط شده از نرم افزار خود برای استفاده در موارد بازاریابی یا به اشتراک گذاری ترفندهای خط فرمان با دوستان خود دارید.
اگر می خواهید ضبط های Terminalizer را به فرمت GIF ارسال و صادر کنید ، می توانید Terminalizer را روی یک دستگاه با یک رابط کاربری / دسکتاپ گرافیکی نصب کرده و از ویژگی های داخلی رندر استفاده کنید:
• ایجاد GIF با استفاده از Terminalizer
همچنین می توانید برای دیدن بخش های ضبط شده ترمینال به اشتراک گذاشته شده توسط سایر کاربران ، وب سایت Terminalizer را بررسی کنید:
• جستجو در ضبط های Terminalizer

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

GraphQL یک استاندارد API است که توسط فیس بوک به عنوان جایگزینی برای API های REST ایجاد و منبع باز شده است. بر خلاف API های REST ،GraphQL از یک سیستم تایپ شده برای تعریف ساختار داده خود استفاده می کند ، جایی که تمام اطلاعات باید مطابق با یک طرح از پیش تعریف شده ارسال و دریافت شوند. همچنین به جای چندین URL برای منابع مختلف، یک انتهای واحد برای همه ارتباطات در معرض دید قرار می دهد و با بازگرداندن تنها داده های درخواست شده توسط کلاینت ، مشکل overfetching  را حل می کند و از این طریق پاسخ های کوچکتر و مختصر تری ایجاد می کند.
در این آموزش شما یک پس زمینه برای کوتاه کننده URL ایجاد می کنید – خدماتی که هر URL را در اختیار شما قرار می دهد و یک نسخه کوتاهتر و خواندنی تر تولید می کند – در حالی که به مفاهیم GraphQL مانند نمایش داده ها و جهش ها و ابزارهایی مانند رابط GraphiQL می پردازید. ممکن است قبلاً مانند سرویس bit.ly از چنین سرویس هایی استفاده کرده باشید.
از آنجا که GraphQL یک فناوری آگنوستیک زبانی است ، روی زبانها و چارچوبهای مختلف پیاده سازی می شود. در اینجا ، شما از زبان برنامه نویسی Python هدف کلی ، چارچوب وب Django ، و کتابخانه Graphene-Django به عنوان اجرای GraphQL Python با ادغام های ویژه برای Django استفاده خواهید کرد.
پیش نیازها
• برای ادامه این آموزش ، به نصب پایتون نسخه 3.5 یا بالاتر در دستگاه توسعه خود نیاز دارید. برای نصب Python ، آموزش ما را در مورد نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای Python 3 برای سیستم عامل خود را دنبال کنید. اطمینان حاصل کنید که یک محیط مجازی نیز ایجاد و راه اندازی کنید؛ برای دنبال کردن این آموزش ، می توانید دیرکتوری پروژه خود را shorty بنامید.
• دانش سطح ورود به Django نیز توصیه میشود ، اما اجباری نیست. اگر کنجکاو هستید ، می توانید مجموعه توسعه Django ایجاد شده توسط انجمن vpsgol را دنبال کنید.
مرحله 1 – تنظیم پروژه Django
در این مرحله تمام ابزارهای لازم برای برنامه را نصب کرده و پروژه Django خود را تنظیم می کنید.
هنگامی که دایرکتوری پروژه خود را ایجاد کردید و محیط مجازی خود را راه اندازی کردید ، همانطور که در پیش نیازها پوشش داده شده است ، بسته های لازم را با استفاده از pip ، مدیر بسته پایتون نصب کنید. در این آموزش Django نسخه 2.1.7 و Graphene-Django نسخه 2.2.0 یا بالاتر نصب می شوند:
⦁ $ pip install “django==2.1.7” “graphene-django>==2.2.0”

اکنون تمام ابزارهای مورد نیاز خود را در کمربند ابزار خود دارید. در مرحله بعد با استفاده از دستور django-admin یک پروژه Django ایجاد خواهید کرد. یک پروژه به طور پیش فرض متن استاندارد Django است – مجموعه ای از پوشه ها و فایل ها با هر چیز لازم برای شروع توسعه یک برنامه وب. در این حالت ، شما پروژه خود را shorty می خوانید و با مشخص کردن نقطه در انتها، آن را در پوشه فعلی خود ایجاد می کنید:
⦁ $ django-admin startproject shorty .

بعد از ایجاد پروژه خود ،  Django migrations را اجرا خواهید کرد. این فایل ها حاوی کد پایتونی هستند که توسط Django تولید شده است و وظیفه تغییر ساختار برنامه را مطابق مدل های Django دارند. به عنوان مثال تغییرات ممکن است شامل ایجاد جدول باشد. به طور پیش فرض ، Django با مجموعه ای از جابه جایی های خود که مسئول زیر سیستم هایی مانند Django Authentication هستند ، همراه است ، بنابراین لازم است آنها را با دستور زیر اجرا کنید:
⦁ $ python manage.py migrate

این دستور از مفسر پایتون برای استناد به اسکریپت Django به نام managet.py استفاده می کند که مسئولیت مدیریت جنبه های مختلف پروژه شما ، مانند ایجاد برنامه ها یا اجرای جا به جایی ها را بر عهده دارد.
این دستور خروجی شبیه به زیر را ارائه می دهد:
Output
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial… OK
Applying auth.0001_initial… OK
Applying admin.0001_initial… OK
Applying admin.0002_logentry_remove_auto_add… OK
Applying admin.0003_logentry_add_action_flag_choices… OK
Applying contenttypes.0002_remove_content_type_name… OK
Applying auth.0002_alter_permission_name_max_length… OK
Applying auth.0003_alter_user_email_max_length… OK
Applying auth.0004_alter_user_username_opts… OK
Applying auth.0005_alter_user_last_login_null… OK
Applying auth.0006_require_contenttypes_0002… OK
Applying auth.0007_alter_validators_add_error_messages… OK
Applying auth.0008_alter_user_username_max_length… OK
Applying auth.0009_alter_user_last_name_max_length… OK
Applying sessions.0001_initial… OK

پس از آماده شدن پایگاه داده Django ، سرور مجازی توسعه محلی خود را شروع کنید:
⦁ $ python manage.py runserver

خروجی زیر را می دهد:
Output
Performing system checks…

System check identified no issues (0 silenced).
March 18, 2020 – 15:46:15
Django version 2.1.7, using settings ‘shorty.settings’
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

این دستور اعلان را در ترمینال شما از بین می برد و سرور مجازی را شروع می کند.
از صفحه http://127.0.0.1:8000 در مرورگر محلی خود بازدید کنید. این صفحه را مشاهده خواهید کرد:

برای متوقف کردن سرور مجازی و بازگشت به ترمینال خود ، CTRL + C را فشار دهید. هر زمان که نیاز به دسترسی به مرورگر داشته باشید ، اطمینان حاصل کنید که دستور قبلی در حال اجرا است.
در مرحله بعد ، با فعال کردن کتابخانه Django-Graphene در پروژه ، این مرحله را تمام خواهید کرد. Django دارای محتوای app ، یک برنامه وب با مسئولیت خاص میباشد. یک پروژه از یک یا چندین برنامه تشکیل شده است. در حال حاضر ، فایل shorty / settings.py را در ویرایشگر متن مورد نظر خود باز کنید. این آموزش از vim استفاده خواهد کرد:
⦁ $ vim shorty/settings.py

فایل settings.py تمام تنظیمات موجود در پروژه شما را مدیریت می کند. در داخل آن ، INSTALLED_APPS را جستجو کرده و خط “graphene_django” را اضافه کنید:
shorty/shorty/settings.py

INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘graphene_django’,
]

این افزونه به Django می گوید که شما از برنامه ای به نام graphene_django که در مرحله 1 نصب کرده اید ، استفاده خواهید کرد.
در پایین فایل ، متغیر زیر را اضافه کنید:
shorty/shorty/settings.py

GRAPHENE = {
‘SCHEMA’: ‘shorty.schema.schema’,
}

این متغیر آخر به طرح اصلی شما اشاره دارد که بعداً ایجاد خواهید کرد. در GraphQL ، یک شماتیک شامل انواع شیء مانند منابع ، جستجوها و جهش ها است. آن را به عنوان مستنداتی که تمام داده ها و عملکردهای موجود در سیستم شما را نشان می دهد ، در نظر بگیرید.
پس از اصلاحات ، فایل را ذخیره کرده و ببندید.
اکنون پروژه Django را پیکربندی کرده اید. در مرحله بعد ، یک برنامه Django و مدل های آن را ایجاد خواهید کرد.
مرحله 2 – تنظیم برنامه و مدل های Django
یک پلتفرم Django معمولاً از یک پروژه و بسیاری برنامه یا app تشکیل شده است. یک app مجموعه ای از ویژگی های درون پروژه ای را توصیف می کند و در صورت طراحی مناسب می تواند در پروژه های Django استفاده مجدد شود.
در این مرحله برنامه ای به نام shortener ایجاد خواهید کرد ، که مسئول ویژگی کوتاه کردن URL واقعی است. برای ایجاد اسکلت اصلی آن ، دستور بعدی را در ترمینال خود تایپ کنید:
⦁ $ python manage.py startapp shortener

در اینجا شما از پارامترهای startapp app_name استفاده کرده و از دستور manage.py برای ایجاد یک app با نام shortener استفاده می کنید.
برای پایان دادن به ایجاد برنامه ، فایل shorty / settings.py را باز کنید
⦁ $ vim shorty/settings.py

نام برنامه را به همان ورودی INSTALLED_APPS که قبلاً اصلاح کرده اید اضافه کنید:
shorty/shorty/settings.py

INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘graphene_django’
‘shortener’,
]

فایل را ذخیره کنید و ببندید.
با افزودن shortener خود به shorty / settings.py ، می توانید به سمت ایجاد مدل هایی برای پروژه خود بروید. مدل ها یکی از ویژگی های مهم در Django هستند. از آنها برای نشان دادن یک پایگاه داده به روش “Pythonic” استفاده می شود و به شما امکان می دهد داده ها را با استفاده از کد پایتون مدیریت ، پرس و جو و ذخیره کنید.
پیش از باز کردن فایل model.py برای تغییرات ، این آموزش مختصری از تغییراتی را که شما ایجاد خواهید کرد را ارائه می دهد.
پس از تعویض کد موجود ، فایل مدل — shortener / model.py — شامل محتوای زیر خواهد بود:
shorty/shortener/models.py
from hashlib import md5

from django.db import models
در اینجا بسته های مورد نیاز کد مورد نظر خود را وارد می کنید. برای وارد کردن کتابخانه استاندارد Python که برای ایجاد hash  در URL از آن استفاده می شود ، خط from hashlib import md5 را در قسمت بالا اضافه خواهید کرد. خط from django.db import models به Django برای ایجاد مدل ها کمک میکند.
اخطار: این آموزش به hash  به عنوان نتیجه عملکردی که یک ورودی را می گیرد و همیشه همان بازده را برمی گرداند اشاره دارد. این آموزش با استفاده از عملکرد hash  MD5 برای اهداف نمایشی استفاده می شود.
توجه داشته باشید که MD5 دارای مشکلات برخوردی است و باید در تولید از آن جلوگیری کرد.
در مرحله بعد ، یک مدل به نام URL با فیلدهای زیر اضافه خواهید کرد:
⦁ full_url: URL ای که باید کوتاه شود.
⦁ url_hash: یک hash  کوتاه است که URL کامل را نشان می دهد.
⦁ clicks: تعداد دفعاتی که به URL کوتاه دسترسی پیدا شده است.
⦁ created_at: تاریخ و زمانی که URL ایجاد شده است.
shorty/shortener/models.py

class URL(models.Model):
full_url = models.URLField(unique=True)
url_hash = models.URLField(unique=True)
clicks = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)

شما می توانید url_hash را با اعمال الگوریتم hash MD5 در قسمت full_url و با استفاده از فقط 10 کاراکتر اول برگردانده شده در طی روش save() در مدل ، تولید کنید ، که هر بار Django ورودی را در پایگاه داده ذخیره می کند، اجرا می شود. علاوه بر این ، کوتاه کننده های URL معمولاً تعداد دفعاتی که روی پیوند کلیک شده است را دنبال می کنند. با فراخوانی روش clicked() در هنگام بازدید از URL توسط کاربر ، به این هدف دست خواهید یافت.
عملیات ذکر شده با این کد در مدل URL شما اضافه می شود:
shorty/shortener/models.py

def clicked(self):
self.clicks += 1
self.save()

def save(self, *args, **kwargs):
if not self.id:
self.url_hash = md5(self.full_url.encode()).hexdigest()[:10]

return super().save(*args, **kwargs)

اکنون که کد را مرور کرده اید ، فایل shortener/models.py را باز کنید:
⦁ $ vim shortener/models.py

کد را با محتوای زیر جایگزین کنید:
shorty/shortener/models.py
from hashlib import md5

from django.db import models

class URL(models.Model):
full_url = models.URLField(unique=True)
url_hash = models.URLField(unique=True)
clicks = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)

def clicked(self):
self.clicks += 1
self.save()

def save(self, *args, **kwargs):
if not self.id:
self.url_hash = md5(self.full_url.encode()).hexdigest()[:10]

return super().save(*args, **kwargs)

حتما فایل را ذخیره کنید و ببندید.
برای اعمال این تغییرات در پایگاه داده ، باید با اجرای دستور زیر migrations  را ایجاد کنید:
⦁ $ python manage.py makemigrations

این کار خروجی زیر را به شما می دهد:
Output
Migrations for ‘shortener’:
shortener/migrations/0001_initial.py
– Create model URL

سپس migrations را اجرا کنید:
⦁ $ python manage.py migrate

خروجی زیر را در ترمینال خود مشاهده خواهید کرد:
Output
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, shortener
Running migrations:
Applying shortener.0001_initial… OK

اکنون که مدل ها را تنظیم کرده اید ، در مرحله بعدی نقطه پایانی GraphQL و یک جستار ایجاد خواهید کرد.
مرحله 3 – ایجاد جستارها (Queries)
معماری REST منابع مختلفی را در نقاط پایانی مختلف در معرض دید قرار می دهد ، هرکدام دارای یک ساختار داده به خوبی تعریف شده هستند. به عنوان مثال ، ممکن است لیست کاربران را از /api/users دریافت کنید ، که همیشه انتظار فیلدهای مشابه دارید. از طرف دیگر GraphQL یک نقطه پایانی واحد برای همه تعامل ها دارد و از جستارها برای دسترسی به داده ها استفاده می کند. اصلی ترین و با ارزش ترین تفاوت این است که می توانید از Query برای بازیابی همه کاربران خود در طی یک درخواست استفاده کنید.
با ایجاد یک Query برای واکشی همه URL ها شروع کنید. به چند مورد نیاز خواهید داشت:
• نوع URL ، مربوط به مدل تعریف شده قبلی شما.
• یک عبارت پرس و جو به نام urls .
• روشی برای کار با Query ، به معنای واکشی کلیه آدرس ها از پایگاه داده و برگرداندن آنها به کلاینت.
یک فایل جدید به نام shortener / schema.py ایجاد کنید:
⦁ $ vim shortener/schema.py

با افزودن عبارتات import  پایتون شروع کنید:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType

from .models import URL

اولین خط ، کتابخانه اصلی graphene  است، که شامل انواع پایه GraphQL مانند Listاست.
. DjangoObjectType کمکی برای ایجاد تعریف شماتیک از هر مدل Django ، و خط سوم مدل ایجاد URL قبلی شما را وارد می کند.
پس از آن ، با افزودن خطوط زیر ، یک نوع GraphQL جدید برای مدل URL ایجاد کنید:
shorty/shortener/schema.py

class URLType(DjangoObjectType):
class Meta:
model = URL

در آخر ، این خطوط را اضافه کنید تا یک نوع Query برای مدل URL ایجاد شود:
shorty/shortener/schema.py

class Query(graphene.ObjectType):
urls = graphene.List(URLType)

def resolve_urls(self, info, **kwargs):
return URL.objects.all()

این کد یک کلاس Query با یک فیلد به نام urls ایجاد می کند ، که لیستی از URLType قبلاً تعریف شده است. هنگام حل Query از طریق روش remove_urls ، تمام URL های ذخیره شده در پایگاه داده را برمی گردانید.
فایل کامل shortener/schema.py در اینجا نشان داده شده است:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType

from .models import URL

class URLType(DjangoObjectType):
class Meta:
model = URL

class Query(graphene.ObjectType):
urls = graphene.List(URLType)

def resolve_urls(self, info, **kwargs):
return URL.objects.all()

فایل را ذخیره کنید و ببندید.
اکنون باید تمام Query ها به طرح اصلی اضافه شوند. آن را به عنوان نگه دارنده تمام منابع خود تصور کنید.
یک فایل جدید در مسیر shorty / schema.py ایجاد کنید و آن را با ویرایشگر خود باز کنید:
⦁ $ vim shorty/schema

بسته های Python بعدی را با اضافه کردن خطوط زیر وارد کنید. اولین مورد ، همانطور که قبلاً نیز گفته شد ، شامل انواع پایه GraphQL است. خط دوم فایل شماتیک قبلاً ایجاد شده را وارد می کند.
shorty/shorty/schema.py
import graphene

import shortener.schema

سپس ، کلاس اصلی Query را اضافه کنید. به صورت موروثی ، تمام جستارها و عملیات ایجاد شده آینده را نگه میدارد:
shorty/shorty/schema.py

class Query(shortener.schema.Query, graphene.ObjectType):
pass

در آخر ، متغیر شماتیک را ایجاد کنید:
shorty/shorty/schema.py

schema = graphene.Schema(query=Query)

تنظیم SCHEMA که در مرحله 2 تعریف کرده اید به متغیر schema  که اخیراً ایجاد کرده اید اشاره می کند.
فایل کامل shorty/schema.pyدر اینجا نشان داده شده است:
shorty/shorty/schema.py
import graphene

import shortener.schema

class Query(shortener.schema.Query, graphene.ObjectType):
pass

schema = graphene.Schema(query=Query)

فایل را ذخیره کنید و ببندید.
در مرحله بعد ، نقطه انتهایی GraphQL و رابط GraphiQL را فعال کنید که یک رابط وب گرافیکی مورد استفاده برای تعامل با سیستم GraphQL میباشد.
فایل shorty / urls.py را باز کنید:
⦁ $ vim shorty/urls.py

برای اهداف یادگیری ، محتوای فایل را حذف کرده و آن را ذخیره کنید ، تا بتوانید از ابتدا شروع کنید.
اولین سطرهایی که اضافه خواهید کرد عبارت ورودی پایتون است:
shorty/shorty/urls.py
from django.urls import path
from django.views.decorators.csrf import csrf_exempt

from graphene_django.views import GraphQLView

تابع path  توسط Django برای ایجاد یک URL در دسترس برای رابط GraphiQL استفاده می شود. پس از آن ، csrf_exempt را وارد می کنید ، که به کلاینت ها امکان می دهد داده ها را به سرور مجازی ارسال کنند. توضیحات کامل را می توان در مستندات Graphene یافت. در آخرین خط ، کد واقعی مسئول رابط را از طریق GraphQLView وارد کردید.
سپس ، یک متغیر به نام urlpatterns ایجاد کنید.
shorty/shorty/urls.py

urlpatterns = [
path(‘graphql/’, csrf_exempt(GraphQLView.as_view(graphiql=True))),
]

با این کار تمام کدهای لازم برای ایجاد رابط GraphiQL در مسیر graphql/ در کنار هم قرار می گیرد:
فایل کامل shortener/urls.py در اینجا آمده است:
shorty/shorty/urls.py
from django.urls import path
from django.views.decorators.csrf import csrf_exempt

from graphene_django.views import GraphQLView

urlpatterns = [
path(‘graphql/’, csrf_exempt(GraphQLView.as_view(graphiql=True))),
]

فایل را ذخیره کنید و آن را ببندید.
به ترمینال برگردید ، دستور runderver python management.py را اجرا کنید (اگر قبلاً اجرا نشده است):
⦁ $ python manage.py runserver

مرورگر وب خود را در آدرس http: // localhost: 8000 / Graphql باز کنید. به شما این صفحه نمایش داده می شود:

GraphiQL رابطی است که در آن می توانید عبارت GraphQL را اجرا کرده و نتایج را مشاهده کنید. یکی از ویژگی ها، بخش Docs در بالا سمت راست میباشد. از آنجا که همه چیز در GraphQL تایپ شده است ، در مورد انواع ، پرس و جوها ، جهش ها و غیره مطالب رایگان دریافت می کنید.
پس از جستجو در صفحه ، اولین Query خود را در قسمت متن اصلی وارد کنید:
query {
urls {
id
fullUrl
urlHash
clicks
createdAt
}
}

این محتوا چگونگی ساخت یک جستار GraphQL را نشان می دهد: ابتدا ، از کلیدواژه query استفاده می کنید تا به سرور مجازی بگویید که شما فقط می خواهید برخی داده ها را پس بگیرید. در مرحله بعد ، از فیلد url تعریف شده در فایل shortener / schema.py در داخل کلاس Query استفاده می کنید. از این طریق ، به طور صریح تمام فیلدهای تعریف شده در مدل URL را با استفاده از سبک شتر ، که پیش فرض آن برای GraphQL است ، درخواست می کنید.
حالا روی play arrow button در سمت چپ بالای صفحه کلیک کنید.
پاسخ ذیل را دریافت خواهید کرد ، که نشان میدهد شما هنوز URL ندارید:
Output
{
“data”: {
“urls”: []
}
}

این نشان می دهد که GraphQL در حال کار است. در ترمینال خود ، CTRL + C را فشار دهید تا سرور مجازی شما متوقف شود.
شما در این مرحله کارهای بسیاری انجام داده اید ، نقطه پایانی GraphQL را ایجاد کردید، یک جستار برای دریافت همه URL ها تهیه کردید و رابط GraphiQL را فعال نمدید. اکنون ، برای تغییر بانک اطلاعاتی ، جهش هایی ایجاد خواهید کرد.
مرحله 4 – ایجاد جهش ها
اکثر برنامه ها با اضافه کردن ، به روزرسانی یا حذف داده ها راهی برای تغییر وضعیت پایگاه داده دارند. در GraphQL ، این عملیات Mutations نامیده می شود. Mutations یا جهش ها مانند Query به نظر می رسند اما از آرگومانهایی برای ارسال داده به سرور مجازی استفاده می کنند.
برای ایجاد اولین جهش خود ، Shortener / schema.py را باز کنید:
⦁ $ vim shortener/schema.py

در پایان فایل ، با اضافه کردن یک کلاس جدید به نام CreatURL شروع کنید:
shorty/shortener/schema.py

class CreateURL(graphene.Mutation):
url = graphene.Field(URLType)

این کلاس کمک کننده graphene.Mutation را به ارث می برد تا از قابلیت های یک جهش GraphQL برخوردار باشد. همچنین دارای یک ویژگی به نام url است که محتویاتی را که پس از اتمام جهش توسط سرور مجازی برگردانده می شود ، تعریف می کند. در این حالت ، ساختار داده URLType خواهد بود.
در مرحله بعد ، زیرکلاسی به نام Argument را به کلاس از قبل تعریف شده اضافه کنید:
shorty/shortener/schema.py

class Arguments:
full_url = graphene.String()

این کلاس تعریف می کند که چه داده هایی توسط سرور مجازی پذیرفته می شوند. در اینجا ، در انتظار یک پارامتر به نام full_url با محتوای String هستید:
اکنون خطوط زیر را برای ایجاد روش mutate  اضافه کنید:
shorty/shortener/schema.py

def mutate(self, info, full_url):
url = URL(full_url=full_url)
url.save()

این روش mutate  با دریافت داده ها از کلاینت و ذخیره آن در پایگاه داده ، کارهای زیادی را انجام می دهد. در پایان ، خود کلاس را که حاوی آیتم تازه ایجاد شده است ، برمی گرداند.
در آخر ، یک کلاس Mutation  ایجاد کنید تا با اضافه کردن این خطوط ، تمام جهش ها را برای برنامه خود نگه دارید:
shorty/shortener/schema.py

class Mutation(graphene.ObjectType):
create_url = CreateURL.Field()

تا کنون ، شما فقط یک جهش به نام create_url خواهید داشت.
فایل کامل shortener/schema.py در اینجا نشان داده شده است:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType

from .models import URL

class URLType(DjangoObjectType):
class Meta:
model = URL

class Query(graphene.ObjectType):
urls = graphene.List(URLType)

def resolve_urls(self, info, **kwargs):
return URL.objects.all()

class CreateURL(graphene.Mutation):
url = graphene.Field(URLType)

class Arguments:
full_url = graphene.String()

def mutate(self, info, full_url):
url = URL(full_url=full_url)
url.save()

return CreateURL(url=url)

class Mutation(graphene.ObjectType):
create_url = CreateURL.Field()

فایل را ذخیره کنید و ببندید.
برای اتمام اضافه کردن جهش ، فایل shorty / schema.py را تغییر دهید:
⦁ $ vim shorty/schema.py

فایل را تغییر دهید تا کد هایلایت شده زیر را شامل میشود:
shorty/shorty/schema.py

import graphene

import shortener.schema

class Query(shortener.schema.Query, graphene.ObjectType):
pass

class Mutation(shortener.schema.Mutation, graphene.ObjectType):
pass

schema = graphene.Schema(query=Query, mutation=Mutation)

فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را شروع کنید:
⦁ $ python manage.py runserver

در مرورگر وب خود به http: // localhost: 8000 / Graphql بروید. اولین جهش خود را در رابط وب GraphiQL با اجرای جمله زیر انجام دهید:
mutation {
createUrl(fullUrl:”https://www.vpsgol.net/community”) {
url {
id
fullUrl
urlHash
clicks
createdAt
}
}
}

شما جهش را با نام CreatURL ، آرگومان fullUrl و داده هایی که می خواهید در پاسخ در فیلد url تعریف شود را تهیه کردید.
خروجی شامل اطلاعات URL شما میباشد که اکنون در قسمت data  در GraphQL ایجاد شده است ، همانطور که در اینجا نشان داده شده:
Output
{
“data”: {
“createUrl”: {
“url”: {
“id”: “1”,
“fullUrl”: “https://www.vpsgol.net/community”,
“urlHash”: “077880af78”,
“clicks”: 0,
“createdAt”: “2020-01-30T19:15:10.820062+00:00”
}
}
}
}

با این کار ، همانطور که در قسمت urlHash مشاهده می کنید ،URL با نسخه hashed خود به بانک اطلاعاتی اضافه شد. سعی کنید Query را که در آخرین مرحله ایجاد کرده اید اجرا کنید تا نتیجه آن را ببینید:
query {
urls {
id
fullUrl
urlHash
clicks
createdAt
}
}

خروجی URL ذخیره شده را نشان می دهد:
Output
{
“data”: {
“urls”: [
{
“id”: “1”,
“fullUrl”: “https://www.vpsgol.net/community”,
“urlHash”: “077880af78”,
“clicks”: 0,
“createdAt”: “2020-03-18T21:03:24.664934+00:00”
}
]
}
}

همچنین می توانید همان Query را اجرا کنید ، اما فقط فیلدهایی را که می خواهید درخواست کنید.
سپس ، یک بار دیگر آن را با URL متفاوت امتحان کنید:
mutation {
createUrl(fullUrl:”https://www.vpsgol.net/write-for-donations/”) {
url {
id
fullUrl
urlHash
clicks
createdAt
}
}
}

خروجی به صورت زیر خواهد بود:
Output
{
“data”: {
“createUrl”: {
“url”: {
“id”: “2”,
“fullUrl”: “https://www.vpsgol.net/write-for-donations/”,
“urlHash”: “703562669b”,
“clicks”: 0,
“createdAt”: “2020-01-30T19:31:10.820062+00:00”
}
}
}
}

اکنون سیستم قادر به ایجاد URL های کوتاه و لیست آنهاست. در مرحله بعد ، شما کاربران را قادر خواهید ساخت تا با نسخه کوتاه آن به یک URL دسترسی پیدا کنند و آنها را به صفحه صحیح هدایت کنید.
مرحله 5 – ایجاد نقطه پایان دسترسی
در این مرحله ، از Django Views استفاده می کنید – روشی که یک درخواست را می گیرد و پاسخی را برمی گرداند- تا هر شخصی که به نقطه پایان http: // localhost: 8000 / url_hash دسترسی دارد را به آدرس اینترنتی کامل آن هدایت کنید.
فایل shortener / views.py را با ویرایشگر خود باز کنید:
⦁ $ vim shortener/views.py

برای شروع ، دو بسته را با جایگزین کردن محتوا با سطرهای زیر وارد کنید:
shorty/shortener/views.py
from django.shortcuts import get_object_or_404, redirect

from .models import URL

در ادامه اینها با جزئیات بیشتری توضیح داده می شوند.
سپس ، Django Views را با نام root ایجاد می کنید. این قطعه کد که مسئول View  در انتهای فایل شماست را اضافه کنید:
shorty/shortener/views.py

def root(request, url_hash):
url = get_object_or_404(URL, url_hash=url_hash)
url.clicked()

return redirect(url.full_url)

آرگومانی به نام url_hash را از URL دریافت می کند که توسط کاربر درخواست شده است. در داخل تابع ، خط اول سعی می کند URL را با استفاده از آرگومان url_hash از پایگاه داده دریافت کند. در صورت عدم یافتن ، خطای HTTP 404 را به کلاینت باز می گرداند ، به این معنی که منبع از دست رفته است. پس از آن ، ویژگی clicked  در ورود URL را افزایش می دهد ، و اطمینان حاصل میکند که تعداد دفعات دسترسی به URL را ثبت کرده است. در پایان ، کلاینت را به URL درخواست شده هدایت می کند.
فایل کامل shortener/views.py در اینجا نشان داده شده است:
shorty/shortener/views.py
from django.shortcuts import get_object_or_404, redirect

from .models import URL

def root(request, url_hash):
url = get_object_or_404(URL, url_hash=url_hash)
url.clicked()

return redirect(url.full_url)

فایل را ذخیره کنید و ببندید.
سپس ، shorty / urls.py را باز کنید:
⦁ $ vim shorty/urls.py

کد هایلایت شده زیر را برای فعال کردن نمای root اضافه کنید.
shorty/shorty/urls.py

from django.urls import path
from django.views.decorators.csrf import csrf_exempt

from graphene_django.views import GraphQLView

from shortener.views import root

urlpatterns = [
path(‘graphql/’, csrf_exempt(GraphQLView.as_view(graphiql=True))),
path(‘<str:url_hash>/’, root, name=’root’),
]

نمای root در مسیر / سرور مجازی شما قابل دسترسی خواهد بود و url_hash را به عنوان یک پارامتر رشته قبول می کند.
فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را با اجرای فرمان python manage.py runserver شروع کنید.
برای آزمایش متعلقات جدید ، مرورگر وب خود را باز کرده و به URL http: // localhost: 8000 / 077880af78 دسترسی پیدا کنید. توجه داشته باشید که قسمت آخر، URL hash باشد که توسط جهش از مرحله 5 ایجاد شده است. شما به صفحه URL hash هدایت می شوید .
اکنون که تغییر مسیر URL کار می کند ، با اجرای خطا هنگام اجرای جهش ، برنامه را ایمن تر می کنید.
مرحله 6 – اجرای مدیریت خطا
مدیریت خطاها بهترین روش در همه برنامه ها است ، زیرا برنامه نویسان معمولاً چیزی که برای سرور مجازی ارسال می کنند را کنترل نمیکنند. در این حالت ، می توانید سعی کنید نواقص را پیش بینی کنید و تأثیرات آنها را به حداقل برسانید. در سیستم پیچیده ای مانند GraphQL ، بسیاری از موارد ممکن است اشتباه پیش بروند ، از درخواست کلاینت برای داده های اشتباه تا از دست دادن دسترسی سرور مجازی به پایگاه داده.
به عنوان یک سیستم تایپ شده ، GraphQL می تواند هر کاری را که کلاینت درخواست کرده و در عملیاتی به نام Schema Validation دریافت می کند را تأیید نماید. با ساختن یک جستار با یک فیلد غیر موجود می توانید این کار را در عمل مشاهده کنید.
یک بار دیگر به مرورگر خود به http: // localhost: 8000 / Graphql بروید و جستار بعدی را در رابط GraphiQL با فیلد iDontExist اجرا کنید:
query {
urls {
id
fullUrl
urlHash
clicks
createdAt
iDontExist
}
}

از آنجا که هیچ فیلد iDontExist تعریف شده در جستار شما وجود ندارد ، GraphQL یک پیام خطا را برمی گرداند:
Output

{
“errors”: [
{
“message”: “Cannot query field \”iDontExist\” on type \”URLType\”.”,
“locations”: [
{
“line”: 8,
“column”: 5
}
]
}
]
}

این مسئله مهمی است زیرا ، در سیستم تایپ شده GraphQL ، هدف ارسال و دریافت اطلاعاتی است که قبلاً در این شماتیک تعریف شده است.
برنامه فعلی، هر رشته دلخواه را در قسمت full_url می پذیرد. مشکل این است که اگر شخصی آدرس اینترنتی ضعیفی ارسال کند ، هنگام امتحان کردن اطلاعات ذخیره شده ، کاربر را به ناکجا هدایت خواهید کرد. در این حالت ، باید تأیید کنید که آیا full_url قبل از ذخیره کردن آن در بانک اطلاعاتی به خوبی قالب بندی شده است ، و در صورت بروز هرگونه خطایی ، استثناء GraphQLError را با یک پیام سفارشی اعلام کنید.
بیایید این قابلیت را در دو مرحله پیاده سازی کنیم. ابتدا فایل shortener / models.py را باز کنید:
⦁ $ vim shortener/models.py

خطوط هایلایت شده را در بخش ورودی ها اضافه کنید:
shorty/shortener/models.py
from hashlib import md5

from django.db import models
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError

from graphql import GraphQLError

URLValidator یاور Django است که اعتبار یک رشته URL را تأیید می کند و از GraphQLError توسط گرافن برای اعلام استثنائات با یک پیام سفارشی استفاده می شود.
سپس ، مطمئن شوید که URL دریافت شده توسط کاربر را قبل از ذخیره کردن آن در پایگاه داده ، اعتبار دهید. این عملکرد را با اضافه کردن کد هایلایت شده در فایل shortener / models.py فعال کنید:
shorty/shortener/models.py
class URL(models.Model):
full_url = models.URLField(unique=True)
url_hash = models.URLField(unique=True)
clicks = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)

def clicked(self):
self.clicks += 1
self.save()

def save(self, *args, **kwargs):
if not self.id:
self.url_hash = md5(self.full_url.encode()).hexdigest()[:10]

validate = URLValidator()
try:
validate(self.full_url)
except ValidationError as e:
raise GraphQLError(‘invalid url’)

return super().save(*args, **kwargs)

ابتدا این کد URLValidator را در متغیر validate  معرفی می کند. در داخل بلوک try/except ، URL دریافت شده را تأیید می کنید و اگر چیزی اشتباه باشد ، یک GraphQLErr را با پیام سفارشی invalid url مطرح می کنید.
فایل کامل shortener/models.py در اینجا نشان داده شده است:
shorty/shortener/models.py
from hashlib import md5

from django.db import models
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError

from graphql import GraphQLError

class URL(models.Model):
full_url = models.URLField(unique=True)
url_hash = models.URLField(unique=True)
clicks = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)

def clicked(self):
self.clicks += 1
self.save()

def save(self, *args, **kwargs):
if not self.id:
self.url_hash = md5(self.full_url.encode()).hexdigest()[:10]

validate = URLValidator()
try:
validate(self.full_url)
except ValidationError as e:
raise GraphQLError(‘invalid url’)

return super().save(*args, **kwargs)

فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را با دستور python manage.py runserver شروع کنید.
سپس ، خطای جدید خود را در آدرس http: // localhost: 8000 / Graphql آزمایش کنید. سعی کنید یک URL جدید با full_url نامعتبر در رابط GraphiQL ایجاد کنید:
mutation {
createUrl(fullUrl:”not_valid_url”){
url {
id
fullUrl
urlHash
clicks
createdAt
}
}
}

هنگام ارسال URL نامعتبر ، استثناء شما با پیام سفارشی مطرح می شود:
Output

{
“errors”: [
{
“message”: “invalid url”,
“locations”: [
{
“line”: 2,
“column”: 3
}
],
“path”: [
“createUrl”
]
}
],
“data”: {
“createUrl”: null
}
}

اگر به ترمینال خود نگاه کنید جایی که فرمان python manage.py runserverدر حال اجرا است ، خطایی ظاهر می شود:
Output


graphql.error.located_error.GraphQLLocatedError: invalid url

[30/Jan/2020 19:46:32] “POST /graphql/ HTTP/1.1” 200 121

یک نقطه پایانی GraphQL همیشه با کد وضعیت HTTP 200 مواجه خواهد شد ، که معمولاً نشان دهنده موفقیت است. به یاد داشته باشید که ، حتی اگر GraphQL طبق HTTP ساخته شده باشد ، از مفاهیم کدهای وضعیت HTTP یا روشهای HTTP مانند REST استفاده نمی کند.
با استفاده از خطای عملی شده ، اکنون می توانید مکانیزمی را برای فیلتر کردن جستارهای خود ایجاد کنید ، که اطلاعات را توسط سرور مجازی به حداقل برساند.
مرحله 7 – اجرای فیلترها
تصور کنید که برای افزودن پیوندهای شخصی خود ، از استفاده از ابزار کوتاه کننده URL استفاده کرده اید. پس از مدتی ، ورودی های زیادی وجود خواهند داشت که پیدا کردن ورودی درست دشوار خواهد شد. می توانید با استفاده از فیلترها این مسئله را حل کنید.
فیلترینگ یک مفهوم رایج در API های REST است ، که معمولاً یک پارامتر Query با یک فیلد و مقدار در URL اضافه می شود. به عنوان نمونه ، برای فیلتر کردن تمام کاربران با نام jojo ، می توانید از GET /api/users?name=jojo استفاده کنید.
در GraphQL از آرگومان های Query به عنوان فیلتر استفاده خواهید کرد. که یک رابط درست و تمیز ایجاد می کنند.
با اجازه دادن به کلاینت جهت فیلتر کردن نام آدرس های اینترنتی با استفاده از فیلد full_url میتوانید مشکل دشواری در یافت URL را حل کنید. برای پیاده سازی، فایل shortener/schema.py را در ویرایشگر مورد علاقه خود باز کنید.
⦁ $ vim shortener/schema.py
ابتدا روش Q را در خط هایلایت شده وارد کنید:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType
from django.db.models import Q

from .models import URL

این مورد برای فیلتر کردن جستار پایگاه داده شما استفاده می شود.
در مرحله بعد ، کل کلاس Query را با محتوای زیر بازنویسی کنید:
shorty/shortener/schema.py

class Query(graphene.ObjectType):
urls = graphene.List(URLType, url=graphene.String())

def resolve_urls(self, info, url=None, **kwargs):
queryset = URL.objects.all()

if url:
_filter = Q(full_url__icontains=url)
queryset = queryset.filter(_filter)

return queryset

تغییراتی که شما ایجاد می کنید عبارتند از:
⦁ اضافه کردن پارامتر فیلتر url در متغیر url و روش resolve_url.
⦁ در داخل resolve_url اگر پارامتری به نام url داده شده باشد ، با استفاده از روش Q (full_url__icontains = url) تنها URL هایی را که حاوی مقدار داده شده هستند ، برگردانید.
فایل کامل shortener/schema.py در اینجا نشان داده شده است:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType
from django.db.models import Q

from .models import URL

class URLType(DjangoObjectType):
class Meta:
model = URL

class Query(graphene.ObjectType):
urls = graphene.List(URLType, url=graphene.String())

def resolve_urls(self, info, url=None, **kwargs):
queryset = URL.objects.all()

if url:
_filter = Q(full_url__icontains=url)
queryset = queryset.filter(_filter)

return queryset

class CreateURL(graphene.Mutation):
url = graphene.Field(URLType)

class Arguments:
full_url = graphene.String()

def mutate(self, info, full_url)
url = URL(full_url=full_url)
url.save()

return CreateURL(url=url)

class Mutation(graphene.ObjectType):
create_url = CreateURL.Field()

فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را با اجرای python manage.py runserver شروع کنید.
آخرین تغییرات خود را در http: // localhost: 8000 / Graphql آزمایش کنید. در رابط GraphiQL عبارت زیر را بنویسید. این عبارت کلیه آدرس ها با کلمه community را فیلتر می کند:
query {
urls(url:”community”) {
id
fullUrl
urlHash
clicks
createdAt
}
}
خروجی فقط یک ورودی است زیرا شما فقط یک URL را با رشته community  در آن اضافه کرده اید. اگر URL های بیشتری را قبل از آن اضافه کرده باشید ، ممکن است خروجی شما متفاوت باشد.
Output

{
“data”: {
“urls”: [
{
“id”: “1”,
“fullUrl”: “https://www.vpsgol.net/community”,
“urlHash”: “077880af78”,
“clicks”: 1,
“createdAt”: “2020-01-30T19:27:36.243900+00:00”
}
]
}
}

اکنون این امکان را دارید که آدرس های اینترنتی خود را جستجو کنید. با این حال ، با ایجاد پیوندهای فراوان ، ممکن است کلاینت های شما از این که لیست URL ، داده های بیشتری نسبت به ظرفیت برنامه هایشان برمیگرداند، شکایت کنند. برای حل این مسئله ، صفحه بندی را اجرا خواهید کرد.
مرحله 8 – پیاده سازی صفحه بندی
کلاینت هایی که از پشت خط شما استفاده می کنند ممکن است شکایت کنند که زمان پاسخگویی خیلی طول می کشد یا اگر تعداد ورودی های URL بیش از حد زیاد باشد ، شاکی باشند که اندازه آن خیلی بزرگ است. حتی پایگاه داده شما ممکن است برای جمع آوری مجموعه عظیمی از اطلاعات با مشکل مواجه شود. برای حل این مسئله ، می توانید به کلاینت اجازه دهید با استفاده از تکنیکی به نام صفحه بندی ، تعداد موارد مورد نظر خود را در هر درخواست مشخص کند.
هیچ راه پیش فرضی برای اجرای این ویژگی وجود ندارد. حتی در API های REST ، ممکن است آن را در هدرهای HTTP یا پارامترهای پرس و جو ، با نام ها و رفتارهای مختلف مشاهده کنید.
در این برنامه با فعال کردن دو آرگومان دیگر برای جستار URL ، صفحه بندی را پیاده سازی می کنید: first  و skip. first  تعداد متغیر اول عناصر را انتخاب می کند و skip تعداد عناصری را که از ابتدا باید رد شوند، مشخص می کند. به عنوان مثال ، با استفاده از first == 10 و skip == 5 ، 10 URL اول را بدست می آورید ، اما 5 تا از آنها را رد می کنید و 5 مورد باقی مانده را برمیگردانید.
اجرای این راه حل مشابه اضافه کردن فیلتر است.
فایل shortener / schema.py را باز کنید:
⦁ vim shortener/schema.py

در فایل ، کلاس Query را با اضافه کردن دو پارامتر جدید به متغیر url و روش resolve_urls که در کد زیر هایلایت شده است ، تغییر دهید:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType
from django.db.models import Q

from .models import URL

class Query(graphene.ObjectType):
urls = graphene.List(URLType, url=graphene.String(), first=graphene.Int(), skip=graphene.Int())

def resolve_urls(self, info, url=None, first=None, skip=None, **kwargs):
queryset = URL.objects.all()

if url:
_filter = Q(full_url__icontains=url)
queryset = queryset.filter(_filter)

if first:
queryset = queryset[:first]

if skip:
queryset = queryset[skip:]

return queryset

این کد از پارامترهای تازه ایجاد شده first  و skip  موجود در روش resolve_urls برای فیلتر کردن پرس و جو از پایگاه داده استفاده میکند.
فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را با اجرای python manage.py runserver شروع کنید.
برای آزمایش صفحه بندی ، جستار زیر را در رابط GraphiQL به آدرس http: // localhost: 8000 / Graphql:صادر کنید:
query {
urls(first: 2, skip: 1) {
id
fullUrl
urlHash
clicks
createdAt
}
}

کوتاه کننده URL شما URL دوم ایجاد شده در پایگاه داده شما را برمی گرداند:
Output

{
“data”: {
“urls”: [
{
“id”: “2”,
“fullUrl”: “https://www.vpsgol.net/write-for-donations/”,
“urlHash”: “703562669b”,
“clicks”: 0,
“createdAt”: “2020-01-30T19:31:10.820062+00:00”
}
]
}
}

این نشان می دهد که ویژگی صفحه بندی کار می کند. به راحتی افزودن آدرس های اینترنتی بیشتر و آزمایش مجموعه های مختلف first  و skip را انجام دهید.
نتیجه
تمام اکوسیستم GraphQL هر روز در حال رشد است و جامعه ای فعال در پشت آن وجود دارد. این محصول توسط شرکت هایی مانند GitHub و Facebook به اثبات رسیده است و اکنون می توانید این فناوری را برای پروژه های خود اعمال کنید.
در این آموزش شما با استفاده از مفاهیمی مانند Query و Mutations یک سرویس کوتاه کننده URL با استفاده از GraphQL ، Python و Django ایجاد کرده اید. اما فراتر از آن ، اکنون می دانید که چگونه می توانید با استفاده از چارچوب وب Django به این فناوری ها اعتماد کنید تا بتوانید برنامه های وب ایجاد کنید.
می توانید اطلاعات بیشتری در مورد GraphQL و ابزارهای مورد استفاده در اینجا را در وب سایت GraphQL و وب سایت های مطالب Graphene کسب کنید.

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

GraphQL و React به خوبی همکاری می کنند تا ابزارهایی را برای کارهای برنامه نویسی معمول وب از جمله ادغام در زمان حقیقی برای توسعه دهندگان فراهم کنند. در این مقاله ، از React و GraphQL برای ایجاد یک برنامه چت در زمان حقیقی استفاده خواهید کرد.
کارهای زیر را انجام خواهید داد:
پروژه React و GraphQL را تنظیم میکنید
از Apollo برای تعامل با سرور مجازی GraphQL از React استفاده میکنید
جستجو کرده و موارد را تغییر میدهید
پیغام و اشتراک در زمان حقیقی را پیاده سازی می کنید
GraphQL یک نمونه جستار است که حول الگوریتم Graph ساخته شده توسط فیسبوک ایجاد شده است. GraphQL به جای ارسال بارهای JSON از طریق REST به سرور مجازی که بعدا سرور مجازی بانک اطلاعاتی را جستجو کند، این سؤالات را مستقیم از کلاینت ارائه می دهد. به این ترتیب کار شما فقط با آنچه کلاینت نیاز دارد پایان می یابد و نه آنچه که نقطه انتهایی REST در معرض آن قرار دارد. برای ارتباط برقرار کردن با سرور مجازی GraphQL از React خود ، از Apollo – کلاینت GraphQL -استفاده خواهید کرد. روند تنظیم سرور مجازی و ابزارهای درگیر نیز می تواند بسیار زیاد شود. بعضی اوقات حتی ممکن است اشتباه کنید ، و از این رو محصولات خود را در معرض آسیب پذیری های امنیتی قرار دهید. Graphcool یک سرور مجازی GraphQL میزبان بسیار گسترده است که می توانید با آن کار کنید. با استفاده از توابع بدون سرور مجازی می توانید هر چیزی را روی سرور مجازی دستکاری کنید.
راه اندازی یک پروژه React
create-react-app ابزار مورد علاقه برنامه نویسان برای چهارچوب بندی برنامه های React بوده است. با اجرای دستور زیر ، پروژه جدیدی را در React قرار دهید:
$ create-react-app graphql-chat

با این کار یک پوشه جدید به نام Graphql-chat ایجاد شده و تمامی فایلهای React لازم برای کار با آنها را دانلود می کند.
متعلقات را در pack.json به شرح زیر به روز کنید:
package.json
“dependencies”: {

“apollo-client-preset”: “^1.0.6”,
“apollo-link-ws”: “^1.0.4”,
“graphql”: “^0.12.3”,
“graphql-tag”: “^2.6.1”,
“react”: “^16.2.0”,
“react-apollo”: “^2.0.4”,
“react-dom”: “^16.2.0”,
“react-scripts”: “1.0.17”,
“subscriptions-transport-ws”: “^0.9.4″
},

سپس دستور نصب را اجرا کنید تا همه این فایل ها دانلود شوند:
$ npm install

$ # OR

$ yarn

در ادامه یاد میگیریم که هریک از این متعلقات هنگامی که با آنها مواجهه میشویم، چه کاری انجام میدهند.
برخی از فایل های جهانی CSS باید در بر گرفته شده باشند تا نگرانی های طراحی برای این پروژه از طرف ما برطرف شود. برچسب head  را در public/index.html به روز کنید تا فایل های CSS زیر را شامل شود:
public/index.html
<link rel=”stylesheet” href=”https://cdnjs.cloudflare.com/ajax/libs/normalize/7.0.0/normalize.min.css” />
<link rel=”stylesheet” href=”https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css” />

تنظیم یک نمونه GraphQL
به جای اینکه یک سرور مجازی محلی در حال اجرا باشد ، می توانیم از یک سرویس میزبانی شده رایگان موجود برای تنظیم یک نمونه GraphQL استفاده کنیم. این نه تنها رایگان است بلکه کار کمتری دارد و کار با آن آسانتر است. Graphcool برای پروژه های کوچک ، بزرگ و در حال رشد مفید است.
برای راه‌ اندازی نمونه ، ابتدا باید ابزار Graphcool CLI را نصب کنید. این ابزار دستورهایی را برای ایجاد سرور مجازی های جدید GraphQL ، به روزرسانی آنها و همچنین استقرار آنها ارائه می دهد. همچنین می تواند برای مدیریت توابع ابری Graphcool مورد استفاده قرار گیرد. دستور زیر را برای نصب اجرا کنید:
$ npm install -g graphcool-framework

به برنامه React که از طریق ترمینال تنظیم کرده ایم بروید و یک سرور مجازی جدید Graphool را راه اندازی کنید:
$ graphcool-framework init server


این دستور یک پوشه در پروژه React به نام server ایجاد می کند. دستور server حاوی تعاریف نوع و شماتیک برای داده های GraphQL شماست. برای کسب اطلاعات بیشتر در مورد اصول GraphQL می توانید به مقاله درک جستارهای API GraphQL و همچنین مقالاتی در این لینک جستجو مراجعه کنید.
برای برنامه چت ما ، فقط باید روی فایل types.graphql تولید شده در پوشه سرور مجازی تمرکز کنیم. اینجاست که به GraphQl می گویید ساختار داده های شما چگونه است. این کار به تعریف نوع شناخته شده است. محتوای آن را با موارد زیر جایگزین کنید:
type Chat @model {
id: ID! @isUnique
from: String!
content: String!
createdAt: DateTime!
}

باید این شماتیک را در سرور مجازی Graphcool به کار گیرید:
$ graphcool-framework deploy

این دستور ابتدا یک مرورگر برای شما باز می کند تا یک حساب Graphcool را راه اندازی کنید و سپس نمونه خود را مستقر کنید. می توانید نمونه را از منوی سمت چپ بالای داشبورد Graphcool خود باز کنید.
در این ترمینال ، فرآیند یک URL مهم را برای تعامل با سرور مجازی Graphcool شما چاپ می کند. لطفاً این URL را در جایی ذخیره کنید که بتوانید به آنها مراجعه کنید.
هنگامی که برنامه مستقر شد ، playground را باز کنید تا آزمایش کنید آیا روند استقرار ، تمام تعاریف نوع شما را در جای خود قرار داده است یا خیر:
graphcool-framework playground

جستار و جهش زیر را در ویرایشگر در سمت چپ اجرا کنید و برای راه اندازی آنها روی دکمه اجرا کلیک کنید:
query FETCH_CHATS{
allChats{
from,
content
}
}

mutation CREATE_CHAT {
createChat(content: “test”, from: “test”) {
content,
from
}
}

playground از شما می پرسد کدام یک از دستوراتی را که می خواهید اجرا کنید:
نمونه GraphQL را به React ارائه دهید
یک پروژه React و یک سرور مجازی GraphQL آماده است. بعدش چی؟ باید آنها را با تمام ماژول هایی که با فایل pack.json نصب کردیم ، گره بزنیم.
بیایید با وارد کردن آنها شروع کنیم. فایل ورودی src / index.js را برای وارد کردن متعلقات زیر به روز کنید:
src/index.js
import { ApolloProvider } from ‘react-apollo’;
import { ApolloClient } from ‘apollo-client’;
import { HttpLink } from ‘apollo-link-http’;
import { InMemoryCache } from ‘apollo-cache-inmemory’;
import { ApolloLink, split } from ‘apollo-client-preset’
import { WebSocketLink } from ‘apollo-link-ws’
import { getMainDefinition } from ‘apollo-utilities’

درست در زیر ورودی ها ، پیوند WebSocket را پیکربندی کنید. می توانید این کار را با استفاده از ماژول WebSocketLink انجام دهید:
src/index.js

const wsLink = new WebSocketLink({

uri: ‘[Subscriptions API URI]’,
options: {
reconnect: true
}
})

عملکرد سازنده با استفاده از گزینه های پیکربندی یک آبجکت را می گیرد. uri مورد نیاز است و باید همان Subscriptions API URI باشد که پس از استقرار دریافت کردید. ما از گزینه اتصال مجدد استفاده خواهیم کرد تا از WebSocket بخواهیم دوباره پس از یک تلاش ناموفق دوباره برای اتصال تلاش کند.
ما فقط در حال ایجاد ارتباط WebSocket نیستیم. بلکه برای انجام عملیات درخواست-پاسخگویی باید یک اتصال HTTP را تنظیم کنیم. این محتوا را درست زیر ستاپ پیوند WebSocket اضافه کنید:
src/index.js

const httpLink = new HttpLink({ uri: ‘[SIMPLE API URI]’ })

همانند سازنده WebSocketLink است اما از API URI ساده استفاده می کند. لازم نیست از هیچ گزینه پیکربندی عبور کنیم.
در این مرحله دو لینک داریم. ما از روش spliet استفاده خواهیم کرد تا به سرور مجازی بگوییم چه زمانی از کدام لینک استفاده کند:
src/index.js

const link = split(

({ query }) => {
const { kind, operation } = getMainDefinition(query)
return kind === ‘OperationDefinition’ && operation === ‘subscription’
},
wsLink,
httpLink,
)

روش split  سه آرگومان میگیرد. اولی تستی است که یک بولین را برمی گرداند. اگر مقدار بولی (دو بایتی) true باشد ، درخواست به آرگومان دوم(wsLink) ارسال می شود. اگر نادرست باشد ، به آرگومان سوم (httpLink) ارسال می شود.
اکنون می توانیم یک کلاینت Apollo با لینک برگشتی ایجاد کنیم:
src/index.js

const client = new ApolloClient({

link,
cache: new InMemoryCache()
})

با استفاده از URL های ارائه شده می توانید مستقیماً به سرور مجازی خود درخواست دهید. این کار نسبت به کتابخانه بسته بندی که عملکرد هایی را برای ساده کردن تعامل سرور مجازی فراهم می کند، کمی نابه سامان تر است. Apollo یکی از این کتابخانه ها است.
با استفاده از مؤلفه AppProvider کلاینت را ارائه دهید:
src/index.js

ReactDOM.render(

<ApolloProvider client={client}>
<App />
</ApolloProvider>,
document.getElementById(‘root’)
);

جستجوی سرور مجازی GraphQL
با پیوند بین برنامه React و مجموعه GraphQL ، زمان آن رسیده است که پرس و جو از پایگاه داده و نمایش داده ها در مرورگر آغاز شود.
src / App.js را برای تنظیم یک جستار به روز کنید:
src/App.js
import React, { Component } from ‘react’;

// Import GraphQL helpers
import { graphql } from ‘react-apollo’;
import gql from ‘graphql-tag’;

// App component styles
import ‘./App.css’;

class App extends Component {
state = {
from: ‘anonymous’,
content: ”
};
componentDidMount() {
// Get username form prompt
// when page loads
const from = window.prompt(‘username’);
from && this.setState({ from });
}
render() {
// Coming up next
}
}

const ALL_CHATS_QUERY = gql`
query AllChatsQuery {
allChats {
id
createdAt
from
content
}
}
`;

export default graphql(ALL_CHATS_QUERY, { name: ‘allChatsQuery’ })(App);

بیایید آنچه را که در اینجا اتفاق می افتد تجزیه کنیم:
ابتدا grafl و gql را وارد می کنیم. این کتابخانه ها به ترتیب به تنظیم و تجزیه پرس و جو کمک می کنند.
در پایان تعریف کلاس کامپوننت ، query را ایجاد می کنیم. دقیقاً شبیه کارهایی است که ما در playground انجام دادیم اما با استفاده از برچسب قالب به روش gql پیچیده شده است.
از HOC graphql  استفاده می شود تا نتیجه این پرس و جو را به ویژگی های مؤلفه برنامه نشان دهد.
اکنون می توانید از طریق props پرس و جو را در DOM ارائه دهید:
// Chatbox UI component
import Chatbox from ‘./components/Chatbox’;

class App extends Component {

//…

render() {
const allChats = this.props.allChatsQuery.allChats || [];
return (
<div className=””>
<div className=”container”>
<h2>Chats</h2>
{allChats.map(message => (
<Chatbox key={message.id} message={message} />
))}
</div>
</div>
);
}
}

// …

export default graphql(ALL_CHATS_QUERY, { name: ‘allChatsQuery’ })(App);

روش ارائه حول هر یک از نتایج پرس و جو تکرار می شود و آنها را با استفاده از مؤلفه Chatbox روی صفحه چاپ می کند. این همان شکل کامپوننت در components/Chatbox.js: میباشد:
import React from ‘react’;
import ‘./Chatbox.css’
const Chatbox = ({message}) => (
<div className=”chat-box”>
<div className=”chat-message”>
<h5>{message.from}</h5>
<p>
{message.content}
</p>
</div>
</div>
);
export default Chatbox;

برای بدست آوردن سبک های اصلی Chatbox.css و App.css می توانید به repo مراجعه کنید.
ایجاد پیام های جدید
جهش ها در GraphQL برای ایجاد ، ویرایش و حذف مقادیر از پایگاه داده شما استفاده می شود. جایی که یک جستار R (Read) در CRUD است ، یک جهش می تواند CUD (ایجاد ، به روز رسانی ، حذف) باشد. ما در حال حاضر قادر به خواندن پیام های موجود در برنامه چت خود هستیم. مورد بعدی که باید به آن توجه کنیم ایجاد پیامهایی از سوی برنامه React میباشد.
درست مانند روشی که یک پرس و جو ایجاد کردیم ، می توانیم جهشی نیز ایجاد کنیم:
import { graphql, compose } from ‘react-apollo’;

// App component …

const CREATE_CHAT_MUTATION = gql`
mutation CreateChatMutation($content: String!, $from: String!) {
createChat(content: $content, from: $from) {
id
createdAt
from
content
}
}
`;

export default compose(
graphql(ALL_CHATS_QUERY, { name: ‘allChatsQuery’ }),
graphql(CREATE_CHAT_MUTATION, { name: ‘createChatMutation’ })
)(App);

جهش بسیار شبیه به یک پرس و جو است اما پارامترها و محتوایی دریافت میکند. ما باید مؤلفه برنامه را در این جهش و جستار موجود محاصره کنیم. به همین دلیل روش کامپوزیت را نیز وارد می کنیم و از این روش برای پیچیدن هر دو HOC استفاده می کنیم.
در روش رندر ، می توانیم یک عنصر ورودی داشته باشیم که این محتوای پیام را جمع آوری کند:
render() {
const allChats = this.props.allChatsQuery.allChats || [];
return (
<div className=””>
<div className=”container”>
<h2>Chats</h2>
{allChats.map(message => (
<Chatbox key={message.id} message={message} />
))}

{/* Message content input */}
<input
value={this.state.content}
onChange={e => this.setState({ content: e.target.value })}
type=”text”
placeholder=”Start typing”
onKeyPress={this._createChat}
/>
</div>
</div>
);
}
}

ورودی باعث ایجاد یک رویداد در هر keyPress می شود و این رویداد متد _createChat نامیده می شود. در اینجا تعریف این روش در کلاس App آمده است:
_createChat = async e => {
if (e.key === ‘Enter’) {
const { content, from } = this.state;
await this.props.createChatMutation({
variables: { content, from }
});
this.setState({ content: ” });
}
};

ما فقط می خواهیم هنگام فشار دادن کلید enter ، جهش را اجرا کنیم. توجه کنید که چگونه CreatChatMutation نیز در props  قرار می گیرد و متغیر به عنوان یک شیء به روش جهش منتقل می شود.
هنگام ارسال پیام جدید ، هیچ اتفاقی نمی افتد تا مجدد لود کنید.
این کار، به روزرسانی های زمان حقیقی را فراخوانی می کند.
تنظیم اشتراک زمان حقیقی
اشتراک در GraphQL برای ردیابی تغییرات ایجاد شده توسط کلاینت های متصل شده استفاده می شود. این کلاینت ها می توانند بر اساس این تغییرات عمل کنند. احتمالاً با به روزرسانی رابط کاربری با داده های تغییر یافته یا حتی ارسال نوتیفیکیشن این کار انجام میشود. فن آوری که اشتراک را تقویت می کند ، WebSockets مشهور است.
برای تنظیم اشتراک ، این روش را به کلاس App  اضافه کنید:
_subscribeToNewChats = () => {
this.props.allChatsQuery.subscribeToMore({
document: gql`
subscription {
Chat(filter: { mutation_in: [CREATED] }) {
node {
id
from
content
createdAt
}
}
}
`,
updateQuery: (previous, { subscriptionData }) => {
const newChatLinks = [
…previous.allChats,
subscriptionData.data.Chat.node
];
const result = {
…previous,
allChats: newChatLinks
};
return result;
}
});
};

allChatsQuery یک روش SubscribToMore را در معرض دید شما قرار می دهد. پس از فراخوانی این روش ، کانال ارتباطی در زمان حقیقی باز می شود. این روش آبجکتی دریافت می کند که می توانیم سند پرس و جو و یک متد updateQuery را تعریف کنیم.
این سند اشتراکی را تعریف کرده و به دنبال این میگردد که قبل از شروع یک رویداد ، چه زمان جهش در chat رخ می دهد. روش بروزرسانی مقدار قدیمی و جدید را دریافت می کند و ما برای به روز کردن مقدار قدیمی از این مقادیر جدید استفاده می کنیم.
می توانید این اشتراک را با روش چرخه عمر componentDidMount شروع کنید:
پس از اجرای مجدد ، یک برنامه چت کاری خواهید داشت.
مطالب بیشتر
مجموعه آموزش هایGraphQL شما را در مراحل یادگیری اصول GraphQL راهنمایی می کنند.

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

مقدمه
Caddy یک وب سرور مجازی است که حول سادگی و امنیت طراحی شده است و ویژگی هایی دارد که برای میزبانی وب سایت ها مفید است. به عنوان مثال ، می تواند مجوزهای TLS را از Lets Encrypt برای فعال کردن HTTPS به طور خودکار دریافت و مدیریت کند ، و پشتیبانی از HTTP / 2 را نیز شامل می شود. HTTPS سیستمی برای تأمین امنیت ترافیک بین کاربران و سرور مجازی شماست و به سرعت در حال تبدیل شدن به یک خصیصه اصلی از وب سایتهای در حال تولید است – بدون وجود آن ، اگر کاربران سعی در ورود اطلاعات به سیستم داشته باشند، کروم و فایرفاکس هشدار می دهند که وب سایت شما “امن نیست”.
پیش از این ، روش پیشنهادی برای نصب Caddy ، دانلود باینری های از پیش ساخته از وب سایت پروژه Caddy بود. با این حال ، تغییر در نحوه صدور مجوز Caddy بدان معنی است که شما دیگر مجاز به استفاده از این باینری های از پیش ساخته برای مقاصد تجاری نیستید ، مگر اینکه هزینه مجوز را بپردازید ، حتی اگر فقط در داخل یک بیزینس از Caddy استفاده کنید. خوشبختانه ، کد منبع Caddy هنوز کاملاً منبع باز است و می توانید خودتان Caddy را بسازید تا از مشکلات مربوط به مجوز جلوگیری کنید.
در این آموزش ، شما Caddy را از مبدا ایجاد خواهید کرد و از آن برای میزبانی وب سایتی امن با HTTPS استفاده خواهید کرد. این کار مستلزم کامپایل کردن آن ، پیکربندی آن با استفاده از یک Caddyfile و نصب افزونه ها است. در پایان یاد خواهید گرفت که پس از انتشار نسخه جدید ، نصب خود را به روز کنید.
پیش نیازها
• سرور مجازی اوبونتو 18.04 با امتیازات اصلی و یک حساب ثانویه و غیر ریشه. می توانید با دنبال کردن راهنمای تنظیم اولیه سرور مجازی برای اوبونتو 18.04 ، این کار را انجام دهید. برای این آموزش کاربر غیر ریشه sammy است.
• نام دامنه کاملاً ثبت شده. در کل این آموزش از your_domain استفاده خواهد شد. می توانید نام دامنه را در Namecheap خریداری کنید ، یک نابهم صورت رایگان در Freenom دریافت کنید ، یا از ثبت دامنه مورد نظر خود استفاده کنید.
• رکورد DNS با your_domain که آدرس IP عمومی سرور مجازی شما نشان می دهد. برای جزئیات بیشتر در مورد چگونگی اضافه کردن آنها می توانید این مقدمه را در vpsgol DNS دنبال کنید.
• زنجیره ابزار Go language که روی سرور مجازی شما نصب شده باشد. برای تنظیم Go ، راهنمای ما را در مورد نحوه نصب و ستاپ یک محیط برنامه نویسی محلی در اوبونتو 18.04 دنبال کنید. نیازی نیست پروژه های نمونه ای ایجاد کنید.
• یک نشانه دسترسی شخصی (کلید API) با مجوزهای خواندن و نوشتن برای حساب vpsgol نیاز دارید. برای ایجاد آن، به نحوه ایجاد نشانه دسترسی شخصی مراجعه کنید.
مرحله 1 – ساخت Caddy
در این مرحله ، Caddy را با قابلیت اضافه کردن افزونه ها در آینده، و بدون تغییر کد منبع Caddy ، از مبدأ میسازید.
برای اهداف این آموزش ، کد منبع را تحت ~ / caddy ذخیره می کنید. با اجرای دستور زیر آن دیرکتوری را ایجاد کنید:
⦁ $ mkdir ~/caddy

به آن بروید:
⦁ $ cd ~/caddy

کد منبع را برای اجرا و شخصی سازی Caddy در فایلی به نام caddy.go ذخیره خواهید کرد. با استفاده از دستور زیر آن را ایجاد کنید:
⦁ $ nano caddy.go

خطوط زیر را اضافه کنید:
~/caddy/caddy.go
package main

import (
“github.com/caddyserver/caddy/caddy/caddymain”
)

func main() {
// caddymain.EnableTelemetry = false
caddymain.Run()
}
این کد Caddy را مستقیماً از Github ) با استفاده از Git) وارد می کند و آن را از تابع main ورودی شروع می کند. اگر می خواهید تله متری را فعال کنید ، خط caddymain.EnableTelemetry را لغو اعتبار کنید و مقدار را روی true تنظیم کنید. وقتی کارتان تمام شد ، فایل را ذخیره کنید و ببندید.
برای اینکه caddy.go بتواند از متعلقات وارد شده استفاده کند ، باید آن را به عنوان یک ماژول معرفی کنید:
⦁ $ go mod init caddy

Output
go: creating new go.mod: module caddy

در این مرحله ، قصد دارید نسخه جدید Caddy را از طریق کد منبع فوق با اجرای دستور زیر بسازید:
⦁ $ go install

خروجی بسیار زیادی وجود خواهد داشت ، و جزئیات مربوط به کتابخانه هایی که Go به عنوان متعلقات لازم برای کامپایل کردن دانلود کرده است ، را نشان میدهند. عملکرد اجرایی تحت $GOPATH/bin ذخیره می شود ، همانطور که در پیش نیازها توضیح داده شده است.
پس از اتمام ، سعی کنید Caddy را اجرا کنید:
⦁ $ caddy

خروجی مشابه زیر را مشاهده خواهید کرد:
Output
Activating privacy features… done.

Serving HTTP on port 2015
http://:2015

WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with `ulimit -n 8192`.

این بدان معناست که Caddy با موفقیت شروع به کار کرده و روی پورت 2015 نیز موجود است. می توانید پیام هشدار را نادیده بگیرید ، زیرا این محدوده در مراحل بعدی و بدون مداخله شما تنظیم می شود. برای خروج ، CTRL + C را فشار دهید.
اکنون Caddy را ساخته و اجرا کرده اید. در مرحله بعدی ، Caddy را به عنوان یک سرویس نصب خواهید کرد تا به طور خودکار از بوت شروع شود ، و سپس تنظیمات مالکیت و مجوزهای آن را انجام میدهید تا از امنیت سرور مجازی اطمینان حاصل شود.
مرحله 2 – نصب Caddy
اکنون که تأیید کرده اید که قادر به ساخت و اجرای Caddy هستید ، وقت آن است که یک سرویس سیستمی را پیکربندی کنید تا بتوانید Caddy را به طور خودکار در هنگام شروع کار سیستم راه اندازی کنید. برای کسب اطلاعات بیشتر در مورد systemd ، به آموزش Systemd Essentials ما مراجعه کنید.
برای شروع ، binary caddy را به / usr / local / bin منتقل کنید ، که مکان استاندارد برای باینری هایی است که توسط مدیر بسته Ubuntu مدیریت نمی شوند و کلید کار سیستم نیستند:
⦁ $ sudo mv $GOPATH/bin/caddy /usr/local/bin/

سپس ، مالکیت باینری Caddy را به کاربر اصلی تغییر دهید:
⦁ $ sudo chown root:root /usr/local/bin/caddy

این کار باعث جلوگیری از تغییر سایر حسابهای اجرایی می شود. با این حال ، حتی اگر کاربر اصلی دارای Caddy باشد ، توصیه می شود آن را فقط با استفاده از سایر حساب های غیر ریشه موجود در سیستم اجرا کنید. این کار اطمینان می دهد که در صورت به خطر افتادن Caddy (یا هر برنامه دیگر) ، حمله کننده قادر نخواهد بود که باینری را تغییر دهد یا دستورات را به عنوان ریشه اجرا کند.
سپس ، مجوزهای فایل باینری را روی 755 تنظیم کنید – که به root مجوزهای کامل خواندن / نوشتن / اجرای فایل را می دهد ، در حالی که سایر کاربران فقط قادر به خواندن و اجرای آن هستند:
⦁ $ sudo chmod 755 /usr/local/bin/caddy

از آنجا که فرآیند Caddy به صورت root اجرا نمی شود ، لینوکس مانع از اتصال آن به پورت های 80 و 443 (به ترتیب پورت های استاندارد برای HTTP و HTTPS) می شود ، زیرا اینها عملیات امتیازی هستند. برای اینکه به راحتی در دامنه خود قابل دسترسی باشید ، بسته به پروتکل ، Caddy باید به یکی از این پورت ها متصل شود. در غیر اینصورت ، برای مشاهده محتویات ارائه شده ، باید شماره پورت خاصی را به URL دامنه در مرورگر خود اضافه کنید.
برای اینکه Caddy بدون اتصال به عنوان root به پورت های پایین متصل شود ، دستور زیر را اجرا کنید:
⦁ $ sudo setcap ‘cap_net_bind_service=+ep’ /usr/local/bin/caddy

ابزار setcap قابلیت های فایل را تنظیم می کند. در این دستور قابلیت CAP_NET_BIND_SERVICE را به باینری Caddy اختصاص می دهد ، که به یک دستور اجرایی اجازه می دهد تا به درگاه پایین تر از 1024 وصل شوند.
اکنون تنظیم باینری Caddy به پایان رسیده است و آماده نوشتن پیکربندی Caddy هستید. با اجرای دستور زیر دایرکتوری ایجاد کنید که فایل های پیکربندی Caddy را ذخیره کنید:
⦁ $ sudo mkdir /etc/caddy

سپس ، مجوزهای صحیح کاربر و گروه را برای آن تنظیم کنید:
⦁ $ sudo chown -R root:www-data /etc/caddy

تنظیم کاربر به عنوان root و گروه به عنوان www-data تضمین می کند که Caddy دسترسی خواندن و نوشتن به پوشه )از طریق گروه www-data ( را خواهد داشت و فقط حساب superuser از همان حقوق خواندن و تغییر برخوردار است. www-data کاربر و گروه پیش فرض سرور مجازی های وب در اوبونتو است.
در مرحله بعد ، مجوز TLS اتوماتیک را که از Let’s Encrypt تهیه می کند ، فعال خواهید کرد. برای تهیه آن ، دایرکتوری ایجاد کنید تا هرگونه گواهی TLS را که Caddy به دست خواهد آورد در آن ذخیره کنید و همان قوانین مالکیت مشابه دیرکتوری / etc / caddy ، را به آن بدهید:
⦁ $ sudo mkdir /etc/ssl/caddy

⦁ $ sudo chown -R root:www-data /etc/ssl/caddy

caddy باید بتواند گواهینامه هایی را در این دیرکتوری بنویسد و از آن بخواند تا درخواست ها را رمزگذاری کند. در همین راستا ، مجوزهای مربوط به دیرکتوری / etc / ssl / caddy را تغییر دهید تا فقط برای root و www-data در دسترس باشد:
⦁ $ sudo chmod 0770 /etc/ssl/caddy

سپس ، دایرکتوری ایجاد کنید تا فایل هایی که Caddy در آن میزبان خواهد بود را ذخیره کنید:
⦁ $ sudo mkdir /var/www

سپس ، مالک و گروه پوشه را روی www-data تنظیم کنید:
⦁ $ sudo chown www-data:www-data /var/www

Caddy پیکربندی خود را از فایلی به نام Caddyfile که تحت / etc / caddy ذخیره شده است ، می خواند. با اجرا دستور زیر، فایل را بر روی دیسک ایجاد کنید:
⦁ $ sudo touch /etc/caddy/Caddyfile

برای نصب سرویس Caddy ، فایل واحد systemd را از منبع Caddy Github روی / etc / systemd / system دانلود کنید:
⦁ $ sudo sh -c ‘curl https://raw.githubusercontent.com/caddyserver/caddy/master/dist/init/linux-systemd/caddy.service > /etc/systemd/system/caddy.service’

مجوزهای فایل سرویس را تغییر دهید تا فقط توسط مالک آن ، یعنی root قابل تغییر باشد:
⦁ $ sudo chmod 644 /etc/systemd/system/caddy.service

سپس سیستم را مجدد لود کنید تا سرویس Caddy را شناسایی کند:
⦁ $ sudo systemctl daemon-reload

با اجرای systemctl status بررسی کنید که systemd سرویس Caddy را شناسایی کرده است:
⦁ $ sudo systemctl status caddy

خروجی مشابه زیر را مشاهده میکنید:
Output
● caddy.service – Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: e
Active: inactive (dead)
Docs: https://caddyserver.com/docs

اگر همین خروجی را مشاهده می کنید ، سرویس جدید توسط systemd به درستی تشخیص داده شده است.
به عنوان بخشی از پیش نیاز اولیه راه اندازی سرور مجازی ، ufw ، فایروال کامپایل نشده و اتصالات SSH مجاز را فعال کنید. برای اینکه Caddy بتواند از طریق سرور مجازی خود ترافیک HTTP و HTTPS را سرویس دهی کند ، باید با اجرای دستور زیر در ufw به آنها اجازه دهید:
⦁ $ sudo ufw allow proto tcp from any to any port 80,443

خروجی مشابه زیر خواهد بود:
Output
Rule added
Rule added (v6)

از ufw status برای بررسی کارکرد تغییرات خود استفاده کنید:
⦁ $ sudo ufw status

خروجی زیر را مشاهده خواهید کرد:
Output
Status: active

To Action From
— —— —-
OpenSSH ALLOW Anywhere
80,443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80,443/tcp (v6) ALLOW Anywhere (v6)

نصب شما در Caddy اکنون کامل است ، اما پیکربندی نشده است که به هر چیزی سرویس دهد. در مرحله بعدی ، Caddy را برای ارائه فایل از فهرست / var / www پیکربندی می کنید.
مرحله 3 – پیکربندی Caddy
در این بخش ، پیکربندی اصلی Caddy را برای ارائه فایل های استاتیک از سرور مجازی خود می نویسید.
با ایجاد یک فایل HTML پایه در / var / www با نام index.html شروع کنید:
⦁ $ sudo nano /var/www/index.html

خطوط زیر را اضافه کنید:
/var/www/index.html
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style=”font-family: sans-serif”>This page is being served via Caddy</h1>
</body>
</html>

هنگامی که این فایل در یک مرورگر وب نمایش داده می شود ، عنوانی با متن This page is being served via Caddy نمایش داده می شود. فایل را ذخیره کنید و ببندید.
فایل پیکربندی Caddyfile را که قبلاً ایجاد کرده اید برای ویرایش باز کنید:
⦁ $ sudo nano /etc/caddy/Caddyfile

خطوط زیر را اضافه کنید:
/etc/caddy/Caddyfile
:80 {
root /var/www
gzip
}

این یک پیکربندی اولیه Caddy است ، و اعلام می کند که پورت 80 سرور مجازی شما باید با فایل هایی از / var / www سرویس دهی شود و با استفاده از gzip فشرده شود تا دفعات لود صفحه در سمت کلاینت کاهش یابد.
در اکثر موارد ، Caddy به شما امکان می دهد بخشنامه های پیکربندی را بیشتر تنظیم کنید. به عنوان مثال ، می توانید با بسط دادن دستورالعمل با بریس های موج دار و لیست دستورالعمل های تحت آن، فشرده سازی gzip را فقط به فایل های HTML و PHP محدود کنید و سطح فشرده سازی را روی 6 تنظیم کنید (1 پایین ترین و 9 بالاترین است):
/etc/caddy/Caddyfile
:80 {
root /var/www
gzip {
ext .html .htm .php
level 6
}
}

پس از اتمام کار ، فایل را ذخیره کنید و ببندید.
Caddy تعداد زیادی دستورالعمل مختلف برای بسیاری از موارد استفاده دارد. به عنوان مثال ، دستورالعمل fastcgi می تواند برای فعال کردن PHP مفید باشد. از دستورالعملmarkdown می توان برای تبدیل خودکار فایل های Markdown به HTML قبل از ارائه آنها استفاده کرد ، که می تواند برای ایجاد یک وبلاگ ساده مفید باشد.
برای آزمایش اینکه همه چیز به درستی کار می کند ، Caddy را شروع کنید:
⦁ $ sudo systemctl start caddy

سپس ، برای پیدا کردن اطلاعات در مورد وضعیت سرویس دهی Caddy ، systemctl status را اجرا کنید:
⦁ $ sudo systemctl status caddy

خروجی زیر را مشاهده خواهید کرد:
Output
● caddy.service – Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2020-03-12 11:17:49 UTC; 11s ago
Docs: https://caddyserver.com/docs
Main PID: 3893 (caddy)
Tasks: 7 (limit: 1152)
CGroup: /system.slice/caddy.service
└─3893 /usr/local/bin/caddy -log stdout -log-timestamps=false -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp

Mar 12 11:17:49 caddy-article-update systemd[1]: Started Caddy HTTP/2 web server.
Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Caddy version: v1.0.5
Mar 12 11:17:49 caddy-article-update caddy[3893]: Activating privacy features… done.
Mar 12 11:17:49 caddy-article-update caddy[3893]: Serving HTTP on port 80
Mar 12 11:17:49 caddy-article-update caddy[3893]: http://
Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Serving http://
Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO][cache:0xc00007a7d0] Started certificate maintenance routine
Mar 12 11:17:49 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 1): Post “https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42
Mar 12 11:17:57 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 2): Post “https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42

اکنون می توانید IP مرورگر وب را در IP سرور مجازی خود مرور کنید. صفحه وب نمونه شما نمایش داده می شود:

اکنون Caddy را برای ارائه فایلهای ثابت از سرور مجازی خود پیکربندی کرده اید. در مرحله بعد ، عملکرد Caddy را با استفاده از افزونه ها گسترش می دهید.
مرحله 4 – استفاده از افزونه ها
افزونه ها راهی برای تغییر و گسترش عملکرد Caddy ارائه می دهند. به طور کلی ، آنها مطابق مورد استفاده شما ، دستورالعمل های پیکربندی بیشتری را برای استفاده ارائه می دهند. در این بخش با نصب افزونه minify افزونه های اضافی را حذف کرده و از آنها استفاده خواهید کرد، که فضای سفید را حذف کرده و کدی را که برای کلاینت ارسال می شود ساماندهی می کند ، که باعث کاهش بیشتر اثرات قبلی و دفعات لود می شود.
منبع GitHub افزونه minify،  hacdias/caddy-minify میباشد.
با کد منبعی که در مرحله اول ایجاد کردید به دیرکتوری بروید:
⦁ $ cd ~/caddy

برای اضافه کردن افزونه به Caddy ، باید آن را در فایل caddy.go که قبلاً برای ساخت Caddy استفاده کرده اید وارد کنید. caddy.go را برای ویرایش باز کنید:
⦁ $ nano caddy.go

افزونه minify را با اضافه کردن خط هایلایت شده مانند زیر وارد کنید:
~/caddy/caddy.go
package main

import (
“github.com/caddyserver/caddy/caddy/caddymain”

_ “github.com/hacdias/caddy-minify”
)

func main() {
// caddymain.EnableTelemetry = false
caddymain.Run()
}

فایل را ذخیره کنید و ببندید.
ممکن است برخی از افزونه ها به اندکی تنظیمات جزئی پیکربندی نیاز داشته باشند ، بنابراین حتماً مطالب مربوطه را برای هر نوع نصب مطالعه کنید. می توانید لیستی از افزونه های محبوب را در قسمت سمت چپ مقاله های Caddy ، در زیر افزونه ها پیدا کنید.
هر زمان که افزونه جدیدی اضافه کنید ، باید Caddy را مجدداً بازسازی کنید. دلیل این است که Go یک زبان برنامه نویسی کامپایل شده است ، به این معنی که کد منبع قبل از اجرا به کد دستگاه تبدیل می شود. تغییر شما در اعلان ورود کد منبع را تغییر داده است ، اما تا زمان کامپایل آن روی باینری تأثیر نخواهد گذاشت.
برای کامپایل Caddy از دستور go install استفاده کنید:
⦁ $ go install

پس از اتمام ، باینری ایجاد شده را به / usr / local / bin منتقل کنید و مانند دفعه قبل مجوزهای باینری را تنظیم کنید. برای اطمینان از کارایی و امنیت آن ، باید هر بار که Caddy را بازسازی کنید ، این مراحل را انجام دهید:
⦁ $ sudo mv $GOPATH/bin/caddy /usr/local/bin/

⦁ $ sudo chown root:root /usr/local/bin/caddy

⦁ $ sudo chmod 755 /usr/local/bin/caddy

⦁ $ sudo setcap ‘cap_net_bind_service=+ep’ /usr/local/bin/caddy

برای شروع استفاده از افزونه minify ، لازم است بخشنامه minify را به Caddyfile خود اضافه کنید. آن را برای ویرایش باز کنید:
⦁ $ sudo nano /etc/caddy/Caddyfile

افزونه را با افزودن خط زیر به بلوک پیکربندی فعال کنید:
/etc/caddy/Caddyfile
:80 {
root /var/www
gzip
minify
}

اکنون ، سرور مجازی خود را با استفاده از systemctl مجدداً راه اندازی کنید:
⦁ $ sudo systemctl restart caddy

اکنون Caddy در حال اجراست و فایل های ارائه شده از جمله فایل index.html را که قبلاً ایجاد کرده اید ، کمینه می کند. با واکشی مطالب دامنه خود با استفاده از curl ، می توانید “حداقل سازی” را در کار مشاهده کنید:
⦁ $ curl http://your_domain

خروجی زیر را مشاهده خواهید کرد. توجه کنید که فضای سفید غیر ضروری حذف شده است ، نشان می دهد که افزونه minify در حال کار است.
Output
<!doctype html><title>Hello from Caddy!</title><h1 style=font-family:sans-serif>This page is being served via Caddy</h1>

در این مرحله یاد گرفتید که چگونه Caddy را با افزونه ها گسترش دهید. در مرحله بعد ، شما با نصب افزونه tls.dns.vpsgol ، HTTPS را فعال می کنید.
مرحله 5 – فعال کردن خودکار TLS با Let’s Encrypt
در این بخش ، صدور گواهینامه Let’s Encrypt خودکار را با استفاده از رکوردهای TXT DNS برای تأیید فعال می کنید.
برای تأیید صحت استفاده از رکوردهای TXT DNS ، افزونه ای برای رابط با vpsgol API با نام tls.dns.vpsgol نصب خواهید کرد. روش نصب آن تقریباً با نحوه نصب افزونه minify در مرحله قبل یکسان است. برای شروع ،caddy.go را باز کنید:
⦁ $ nano caddy.go

منبع افزونه را به ورودی ها اضافه کنید:
~/caddy/caddy.go
package main

import (
“github.com/caddyserver/caddy/caddy/caddymain”

_ “github.com/hacdias/caddy-minify”

_ “github.com/caddyserver/dnsproviders/vpsgol”
)

func main() {
// caddymain.EnableTelemetry = false
caddymain.Run()
}

با اجرای دستور زیر آن را کامپایل کنید:
⦁ $ go install

اطمینان حاصل کنید که Caddy از طریق systemctl متوقف شده است ، سپس نصب افزونه را با کپی کردن باینری تازه ساخته Caddy پایان دهید و یکبار دیگر مالکیت و مجوزهای خود را تنظیم کنید:
⦁ $ sudo systemctl stop caddy

⦁ $ sudo mv $GOPATH/bin/caddy /usr/local/bin/

⦁ $ sudo chown root:root /usr/local/bin/caddy

⦁ $ sudo chmod 755 /usr/local/bin/caddy

⦁ $ sudo setcap ‘cap_net_bind_service=+ep’ /usr/local/bin/caddy

در مرحله بعدی ، Caddy را تنظیم کنید تا با API vpsgol برای تنظیم رکوردهای DNS کار کند. برای پیکربندی DNS vpsgol ، Caddy باید به این نشانه به عنوان یک متغیر محیط دسترسی پیدا کند ، بنابراین باید فایل واحد سیستم شده آن را ویرایش کنید:
⦁ $ sudo nano /etc/systemd/system/caddy.service

خطی که با Environment= در بخش [Service] شروع میشود را پیدا کنید. این خط متغیرهای محیطی را که باید به فرآیند Caddy منتقل شوند ، تعریف می کند. فضایی را در انتهای این خط اضافه کنید ، سپس یک متغیر DO_AUTH_TOKEN و به دنبال آن نشانه تازه ایجاد شده را اضافه کنید:
/etc/systemd/system/caddy.service
[Service]
Restart=on-abnormal

; User and group the process will run as.
User=www-data
Group=www-data

; Letsencrypt-issued certificates will be written to this directory.
Environment=CADDYPATH=/etc/ssl/caddy DO_AUTH_TOKEN=your_token_here

این فایل را ذخیره کنید و ببندید ، سپس systemd daemon را مانند قبل لود کنید تا اطمینان حاصل شود که پیکربندی به روز شده است:
⦁ $ sudo systemctl daemon-reload

systemctl status را اجرا کنید تا بررسی کنید که تغییرات پیکربندی شما درست است:
⦁ $ sudo systemctl status caddy

خروجی باید به این شکل باشد:
Output
● caddy.service – Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://caddyserver.com/docs

باید چند تغییر جزئی در Caddyfile خود ایجاد کنید ، بنابراین آن را برای ویرایش باز کنید:
⦁ $ sudo nano /etc/caddy/Caddyfile

خطوط هایلایت شده را به Caddyfile اضافه کنید ، مطمئن شوید که your_domain را با دامنه خود جایگزین (به جای فقط پورت: 80) و gzip را کامنت میکنید:
/etc/caddy/Caddyfile
your_domain {
root /var/www
#gzip
minify
tls {
dns vpsgol
}
}

استفاده از یک دامنه به جای فقط یک درگاه برای نام میزبان باعث خواهد شد که Caddy درخواستهایی را از طریق HTTPS ارائه دهد. دستورالعمل tls رفتار Caddy را هنگام استفاده از TLS پیکربندی می کند ، و dns subdirective مشخص می کند که Caddy باید از سیستم DNS-01 استفاده کند نه HTTP-01.
با این کار وب سایت شما آماده به کارگیری است. Caddy را با systemctl شروع کرده و سپس آن را فعال کنید ، تا روی بوت اجرا شود:
⦁ $ sudo systemctl start caddy

⦁ $ sudo systemctl enable caddy
اگر در دامنه خود جستجو کنید ، با همان پیام نشان داده شده به صورت خودکار به HTTPS هدایت می شوید.
نصب شما در Caddy اکنون کامل و ایمن است و می توانید با توجه به مورد استفاده خود ، سفارشی سازی کنید.
اگر می خواهید Caddy را با انتشار نسخه جدید به روز کنید ، باید فایل go.mod (ذخیره شده در همان دیرکتوری) را به روز کنید ، که اینگونه خواهد بود:
~/caddy/go.mod
module caddy

go 1.14

require (
github.com/caddyserver/caddy v1.0.5
github.com/caddyserver/dnsproviders v0.4.0
github.com/hacdias/caddy-minify v1.0.2
)

قسمت هایلایت شده ، نسخه Caddy مورد استفاده شماست. هنگامی که نسخه جدیدی در Github منتشر شد (به صفحه برچسب های انتشار مراجعه کنید) ، می توانید نسخه موجود در go.mod را با آن جایگزین کرده و با توجه به دو مرحله اول ،Caddy را کامپایل کنید. همین کار را می توانید برای همه افزونه های وارد شده انجام دهید.
نتیجه
اکنون Caddy روی سرور مجازی شما نصب و پیکربندی شده است ، و در صفحات ایستا در دامنه مورد نظر شما ، با گواهی نامه Let’s Encrypt TLS رایگان، ایمن شده است.
قدم درست بعدی این است که راهی بیابید که از انتشار نسخه های جدید Caddy اطلاع پیدا کنید. به عنوان مثال ، می توانید از Feed Atom برای نسخه های Caddy یا سرویس اختصاصی مانند  dependencies.io استفاده کنید.
شما می توانید برای اطلاعات بیشتر در مورد پیکربندی Caddy، مطالب Caddy را جستجو کنید.

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

در این آموزش با استفاده از SuperAgent یک اسلایدر تصویر با تصاویر گرفته شده از اینستاگرام ایجاد می کنید. کتابخانه های مختلف بسیاری وجود دارد که می تواند برای برقراری تماس Ajax مورد استفاده قرار گیرند. Fetch API ، Axios ، Request ، jQuery $ .ajax و SuperAgent برخی از محبوب ترین راه ها برای واکشی داده ها از API هستند.
به طور خاص ، با استفاده از چارچوب جاوااسکریپت  [reactjs](reactjs.org/) ، یک اسلایدر تصویر ایجاد خواهید کرد. که تصاویر اینستاگرامی که با استفاده از کتابخانه درخواست SuperAgent Ajax گرفته شده اند را نمایش میدهد.
پیش نیازها
برای دنبال کردن این آموزش ، به nodej هایی که به صورت محلی بر روی رایانه نصب شده اند ، نیاز دارید. همچنین باید برنامه Creat React را نصب کنید.
پس از نصب این موارد ، با تنظیم فضای کاری پروژه خود شروع کنید.
راه اندازی پروژه
دستور create-react-app روشی مناسب برای راه‌اندازی پروژه ما است. این دستور به پیکربندی متعلقات کمک می کند و به شما امکان می دهد تا روی سمت React موارد متمرکز شوید.
با اجرای این دستور در ترمینال خود شروع کنید:
$ create-react-app image_slider

نتیجه یک پوشه پروژه به نام image_slider خواهد بود (برای استفاده از یک نام دیگر ، به سادگی image_slider را در ترمینال با نام دلخواه خود جایگزین کنید). پوشه پروژه حاوی فایل های مهمی از جمله pack.json ، node_modules و پوشه src ما است که در آن فایلهای برنامه ما قرار دارند.
در ترمینال خود ، برنامه را شروع کنید تا با اجرای دستور زیر مطمئن شوید که همه چیز به طور کامل کار می کند:
$ yarn start

این دستور باید URL http: // localhost: 3000 / را در مرورگر ما باز کند. هر تغییری که در فایل های React ایجاد کنید باعث می شود صفحه به طور خودکار در مرورگر مجدد لود انجام شود.
تنظیم React
تمام متعلقات react که نیاز داریم، در حال حاضر برای ما نصب شده اند. برای این آموزش فقط یک فایل در پروژه ویرایش می شود. در صورت تمایل می توانید اجزای مختلفی را که ایجاد می کنید به صورت جداگانه در فایل های مجزا جدا نمایید. در صورت انجام این کار ، اطمینان حاصل کنید که آن ها را به درستی export و import میکنید.
برای شروع ، App.js را ویرایش کنید و برچسب <p> </p> را حذف کنید چون لازم نیست، مگر اینکه بخواهید یک مقدمه کوچک برای برنامه خود بنویسید. توجه کنید که هنگام ایجاد تغییر در فایل ، مرورگر به طور خودکار مجدد لود می شود و آن را ذخیره می کند.
در این مرحله ، فایل App.js شما باید به این شکل باشد.
import React, { Component } from ‘react’;
import logo from ‘./logo.svg’;
import ‘./App.css’;

class App extends Component {
render() {
return (
<div className=”App”>
<header className=”App-header”>
<h1 className=”App-title”>My Instagram</h1>
</header>
</div>
);
}
}

export default App;

تنظیم SuperAgent
همانطور که در مستندات آن مشخص شده است ، SuperAgent یک API ajax پیشرونده کم حجم است که برای انعطاف پذیری ، خوانایی و انحنای یادگیری کم ساخته شده است.
یک درخواست انجام شده باید از روش یا عملی برخوردار باشد که شما می خواهید انجام دهید و به دنبال آن یک تابع .then () یا .end () برای انجام عملیات بر روی / با پاسخ باشد. برای کنترل خطا می توانید یک روش .catch داشته باشید اما اختیاری است.
از این رو درخواست GET چنین به نظر می رسد:
request
.get(‘/getsomedata’)
.then((res) => {
console.log(res)
}
.catch((err) => {
console.log(err)
}

با نصب superAgent شروع کنید.yarn add supertest را روی ترمینال اجرا کنید. در مرحله بعد ، آن را در فایل App.js خود وارد کرده و آن را ویرایش کنید تا مانند زیر باشد:
import React, { Component } from ‘react’;
import request from ‘superagent’;
import logo from ‘./logo.svg’;
import ‘./App.css’;

class App extends Component {
constructor(props) {
super(props);
this.state = {
photos: []
}
}

componentWillMount() {
this.fetchPhotos();
}

fetchPhotos() {
request
.get(‘https://api.instagram.com/v1/users/self/media/recent/?access_token=ACCESS-TOKEN’)
.then((res) => {
this.setState({
photos: res.body.data
})
})
}

render() {
return (
<div className=”App”>
<header className=”App-header”>
<img src={logo} className=”App-logo” alt=”logo” />
<h1 className=”App-title”>Welcome to My Instagram</h1>
</header>
<div>
{console.log(this.state.photos)}
</div>
</div>
);
}
}

export default App;

عملکردی به نام fetchPhotos مسئول واکشی داده ها از اینستاگرام است. هنگامی که داده ها را دریافت می کند ، در آرایه ای به نام photos  ذخیره می کند. تابع fetchPhotos درست قبل از سوار شدن کامپوننت با استفاده از computerWillMount فراخوانی می شود. فعلاً ، ما آرایه را وارد می کنیم تا ببینیم داده ها را گرفته ایم یا نه. هنوز هیچ تأیید هویتی انجام نداده ایم بنابراین نباید قادر به دیدن هر چیزی باشیم ، در عوض باید یک پیام خطا به ما بدهد.
API اینستاگرام
API اینستاگرام عکسهایی را که ایجاد می کنیم برای نمایش با اسلایدر ارائه می دهد. از آنجا که ما فقط در سمت کلاینت کار می کنیم و روی نحوه استفاده از API اینستاگرام تمرکز نداریم ، لازم نیست که مراحل تأیید اعتبار را طی کنیم تا نشانه دسترسی خود را دریافت کنیم. با این حال ، اگر می خواهید در مورد نحوه استفاده از API اینستاگرام اطلاعات بیشتری کسب کنید ، می توانید مستندات آنها را مشاهده کنید.
می توانید با استفاده از http://instagram.pixelunion.net نشانه تولید کنید. برای جلوگیری از اشتراک گذاری ، حتماً این فایل را در یک فایل .env نگه دارید.
ایجاد اسلایدر تصویر
نمایش تصاویر
عکس هایی که گرفته ایم در یک مجموعه قرار دارند اما باید هرکدام از آنها را به عنوان یک عکس واحد نمایش دهیم. بنابراین ، نیاز به نوشتن یک تابع map برای حلقه زدن در آرایه و برگرداندن عکس های خود داریم که همگی در صفحه ما نمایش داده می شوند.
قبل از افزودن عکس ها به صفحه خود، می توانیم با اضافه کردن این خط در داخل تابع نقشه {console.log(photo)} عکس را روی کنسول مرورگر وارد کنیم. این به ما آبجکتی می دهد که شامل چندین ویژگی است ، چند عکس ، کپشن ، تاریخ ایجاد شده ، لایک ها ، نظرات ، افرادی که بر روی عکس تگ شده اند و غیره.
تابع جدید ما در div جدیدی تحت هدر قرار خواهد گرفت و باید به صورت زیر باشد:
<div>
{this.state.photos.map((photo, key) => {
return (
<div key={photo.id}>
<img src={photo.images.standard_resolution.url} alt={photo.caption}/>
</div>
)
})}
</div>

همچنین این اسلایدر باید کپشن تصاویر را در پایین عکس ها نشان دهد. برای انجام این کار ، div  دیگری زیر برچسب تصویر اضافه کنید. سرانجام برای جلوگیری از بروز هرگونه خطایی در صورت عدم وجود کپشن عکس در اینستاگرام ، شرطی را اضافه کنید که یک رشته خالی را برگرداند:
<div style={{width:’600px’, margin: ’24px auto’, fontStyle: ‘italic’}}>
{photo.caption !== null ? photo.caption.text : ”}
</div>

اضافه کردن فلش های اسلایدر
تاکنون تمامی عکس های دریافت شده از API اینستاگرام با هم در همان صفحه نمایش داده می شوند. مرحله بعدی نمایش هر عکس به طور جداگانه و افزودن پیمایش از یک عکس به عکس دیگر است.
فلش ها یک روش مفید برای حرکت در اسلایدر هستند. برای این قابلیت ، دو فلش را به عنوان اجزای جداگانه مانند این در نظر بگیرید:
const BackArrow = () => (
<div style={{fontSize: ‘2em’, marginRight: ’12px’}}>
<i className=”fa fa-angle-left fa-2x” aria-hidden=”true”></i>
</div>
)

const NextArrow = () => (
<div style={{fontSize: ‘2em’, marginLeft: ’12px’}}>
<i className=”fa fa-angle-right fa-2x” aria-hidden=”true”></i>
</div>
)

Create-react-app فاقد اسکریپتی است که برای استفاده از آیکنهای بسیار جذاب نیاز داریم ، بنابراین باید yarn add font-awesome را اجرا کنید تا آن را به پروژه اضافه کنید و سپس ‘font-awesome / css / font-awesome.css’ را وارد پروژه کنید تا آیکون های ما را شامل شود.
اضافه کردن شمارش اسلایدها به وضعیت
اکنون همه مؤلفه های مورد نیاز خود را داریم اما فلش ها کاربردی نیستند و تمام عکس های ما هنوز در صفحه قابل مشاهده اند.
برای پیگیری اینکه روی کدام عکس قرار داریم ، slideCount را به حالت اضافه کنید. slideCount به سادگی یک عدد صحیح خواهد بود که در ابتدا با 0 تنظیم می شود و هر بار که روی پیکان بعدی کلیک می کنیم افزایش می یابد و وقتی روی پیکان قبلی کلیک می کنیم کاهش می یابد.
constructor(props) {
super(props);
this.state = {
photos: [],
slideCount: 0
}
}

برای نمایش یک عکس واحد در هر زمان ، فهرست عکس را بررسی کنید و عکسی را که با تعداد اسلایدها مطابقت دارد نمایش دهید. این باید در عملکرد نقشه ما اینگونه باشد:
<div className=”App”>
<header className=”App-header”>
<img src={logo} className=”App-logo” alt=”logo” />
<h1 className=”App-title”>Welcome to My Instagram</h1>
</header>
<div style={{display: ‘flex’, alignItems: ‘center’, justifyContent: ‘center’,marginTop: ’30px’}}>
{this.state.slideCount !== 0 ? <BackArrow previousImage={this.previousImage}/> : ”}
{this.state.photos.map((photo, key) => {
if (this.state.photos.indexOf(photo) === this.state.slideCount) {
return (
<div key={photo.id} style={{margin: ‘0 auto’}}>
<img src={photo.images.standard_resolution.url} alt=”/>
<div style={{width:’600px’, margin: ’24px auto’, fontStyle: ‘italic’}}>
{photo.caption !== null ? photo.caption.text : ”}
</div>
</div>
)
}
return ”
})}
{this.state.slideCount !== (this.state.photos.length – 1) ? <NextArrow nextImage={this.nextImage}/> : ”} </div>

وقتی مؤلفه BackArrow خود را فراخوانی می کنیم ، یک عبارت if وارد می کنیم زیرا نمی خواهیم وقتی در اولین عکس هستیم ، آن را ببینیم. به همین ترتیب ، وقتی آخرین عکس را می بینیم ، نمی خواهیم NextArrow نمایش داده شود.
در این مرحله از آنجا که حالت ما 0 است ، مرورگر باید یک تصویر (آخرین تصویر در حساب اینستاگرام) و فلش next  را نمایش دهد.
کاربردی کردن فلش ها
برای کاربردی کردن فلش ها ، دو تابع ایجاد کنید که عکس فعلی که در حال مشاهده است را تغییر دهد. این توابع عدد وضعیت را افزایش یا کاهش میدهند تا عکس در حال نمایش را تغییر دهند:
nextImage() {
this.setState({ slideCount: this.state.slideCount + 1 })
}

previousImage() {
this.setState({ slideCount: this.state.slideCount – 1 })
}

همچنین لازم است یک کنترل کننده رویداد را اضافه کنیم که هر زمان که روی فلش ها کلیک شد ، این توابع را فراخوانی کند. رویداد onClick را به 2 مؤلفه فلشی که ایجاد کردیم اضافه کنید.
const BackArrow = (props) => (
<div onClick={props.previousImage} style={{fontSize: ‘2em’, marginRight: ’12px’}}>
<i className=”fa fa-angle-left fa-2x” aria-hidden=”true”></i>
</div>
)

const NextArrow = (props) => (
<div onClick={props.nextImage} style={{fontSize: ‘2em’, marginLeft: ’12px’}}>
<i className=”fa fa-angle-right fa-2x” aria-hidden=”true”></i>
</div>
)

به یاد داشته باشید که 2 عملکرد را به عنوان props از مؤلفه parent عبور دهید.
<BackArrow previousImage={this.previousImage}/>
<NextArrow nextImage={this.nextImage}/>

برای دسترسی به توابع ، لازم است که توابع را به نمونه مولفه (this) متصل کنیم .
this.nextImage = this.nextImage.bind(this);
this.previousImage = this.previousImage.bind(this);

در این مرحله ، باید یک اسلایدر تصویر کاملاً کاربردی داشته باشید.
نتیجه
در این آموزش یاد گرفتید که چگونه از SuperAgent به عنوان یک کتابخانه درخواست در ترکیب با React برای ساخت اسلایدر تصویر تعاملی استفاده کنید. با استفاده از این مجموعه ابزارها ، می توانید اسلایدر را نیز گسترش دهید تا قابلیت های دیگری مانند ایجاد URL های مختلف سفارشی و استفاده از روش های post ، delete  و put  برای اضافه کردن ، حذف و ویرایش تصاویر یا کپشن ها را شامل شود.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

در طراحی تجربه کاربر ، ریزتعاملات لحظه های کوچکی از بازخورد هستند که به کاربر کمک می کند تا یک رابط را دنبال کند. غالباً در طراحی وب سایت ریزتعاملات با انیمیشن ظریف ساخته می شوند.
در این آموزش دکمه دانلود کاربردی با ریزتعاملات ایجاد خواهید کرد. برای اینکه این کار عملی شود ، ما از گذارها و انیمیشن های CSS به همراه کتابخانه انیمیشن کم حجم anime.js و segment.js برای انیمیشن های مسیر SVG استفاده خواهیم کرد.
در پایان آموزش ، دکمه دانلود مانند این را دریافت خواهیم کرد:

طراحی اصلی دکمه دانلود متعلق به Pedro Aquino است و در این عکس Dribbble می توان آن را یافت. کد کامل را می توانید در این مخزن Github پیدا کنید ، و در اینجا صفحه نسخه ی نمایشی آمده است.
مرحله 1 – ساخت ساختار HTML
بیایید کد HTML مورد استفاده را ببینیم:
<!– Button container –>
<div class=”download-button-container”>
<!– The real button –>
<button class=”download-button”>
<span class=”button-text-real hidden”>download</span>
<!– Extra elements to perform the animations –>
<span class=”button-icon”>
<span class=”button-linear-progress”>
<span class=”button-linear-progress-bar”></span>
</span>
<svg class=”button-icon-svg” viewBox=”0 0 60 60″>
<path class=”button-icon-path button-icon-path-square” d=”M 20 40 l 0 -20 l 20 0 l 0 20 Z”></path>
<path class=”button-icon-path button-icon-path-line” d=”M 40 20 l -20 20″></path>
</svg>
</span>
</button>
<!– Extra elements to perform the animations –>
<svg class=”border-svg” width=”240px” height=”100px” viewBox=”0 0 240 100″>
<path class=”border-path hidden” d=”M 40 3.5 a 36.5 36.5 0 0 0 -36.5 36.5 a 36.5 36.5 0 0 0 36.5 36.5 C 70 76.5 90 76.5 120 76.5 S 170 76.5 200 76.5 a 36.5 36.5 0 0 0 36.5 -36.5 a 36.5 36.5 0 0 0 -36.5 -36.5 Z”></path>
</svg>
<span class=”button-text button-text-download”>download</span>
<span class=”button-text button-text-done”>done!</span>
<div class=”button-wave”></div>
<div class=”button-progress-container”>
<svg class=”button-svg”>
<path class=”button-circular-progress” d=”M 50 50 m 0 -32.5 a 32.5 32.5 0 0 1 0 65 a 32.5 32.5 0 0 1 0 -65″></path>
</svg>
<span class=”button-ball”></span>
</div>
</div>

توجه به این نکته ضروری است که عناصر مسیر SVG به صورت دستی کشیده شده اند تا نتیجه مورد نظر خود را بگیریم. به عنوان مثال ، در بعضی از مواقع می خواهیم مرز دکمه دانلود حالت یک انیمیشن الاستیک را داشته باشد ، بنابراین به یک مسیر SVG نیاز داریم که برای آن انیمیشن مورفینگ با anime.js آماده باشد (همان ساختار در هر دو مسیر):

مرحله 2 – اضافه کردن سبک ها
با آماده شدن نشانه گذاری ، برای دکمه خود طرحی ایجاد کنید. لطفاً توجه داشته باشید که ما کل صفحه استایل را در اینجا نمی گنجانیم ، بلکه مهمترین بخش ها را آورده ایم. می توانید کل کد را در منبع Github پیدا کنید. برای درک بهتر، کد به طور کامل اظهار نظر شده است.
بیایید متغیرهای SCSS را که تعریف کرده ایم و کلاس ککی برای مخفی کردن عناصر را ببینیم:
// Some variables to use later
$button-width: 300px;
$button-height: 70px;
$button-border: 3px;
$icon-padding: 5px;
$icon-width: $button-height – ($icon-padding * 2);
$ball-width: 18px;

// Helper class to hide elements
.hidden {
visibility: hidden !important;
opacity: 0 !important;
}

سبک های عنصر دکمه واقعی به این شکل هستند:
// Real button styles
.download-button {
position: relative;
display: inline-block;
width: $button-width;
height: $button-height;
background-color: #2C2E2F;
border: none;
box-shadow: 0 0 0 $button-border #02D1FF; // This will be our ‘border’
border-radius: 100px;
cursor: pointer;
transition: 1s width, 0.3s box-shadow;

// Remove the custom behavior in some browsers
&, &:focus {
padding: 0;
outline: none;
}
&::-moz-focus-inner {
border: 0;
}

// Styles for the different states of the button
&:hover, &:active, &:focus {
box-shadow: 0 0 0 $button-border #02D1FF, 0 0 20px $button-border darken(#02D1FF, 20%);
}
}
دکمه ما می تواند در سه حالت مختلف باشد: downloading ، progressing و completed. بنابراین ما سبک های مورد نیاز برای هر ناحیه را با استفاده از ساختار زیر تعریف کرده ایم:
// Button container
.download-button-container {
// …CODE…

// Following are the different states for the button: downloading, progressing and completed
// We have defined the states in the container to have access to all descendants in CSS

// Downloading: The download button has been pressed
&.downloading {
// …CODE…
}

// Progressing: The progress starts
&.progressing {
// …CODE…
}

// Completed: The progress ends
&.completed {
// …CODE…
}
}

یکی دیگر از کد های جالب برای دستیابی به انیمیشن توپ پس از اتمام دانلود، استفاده می شود:
.button-ball {
left: 50%;
transition: none;
// CSS animations for the ball. All of them start at the same time, so we need to take care of delays
animation:
ball-throw-up 0.5s ease-out forwards, // Throw up the ball for 0.5s
ball-throw-down 0.5s 0.5s ease-in forwards, // Wait 0.5 seconds (throw up), and throw down the ball for 0.5s
ball-rubber 1s forwards; // Move the ball like a rubber deformation during 1s (throw up + throw down)
}

// Throw up animation
@keyframes ball-throw-up {
from {
transform: translate(-50%, 17.5px);
}
to {
transform: translate(-50%, -60px);
background-color: #00FF8D;
}
}

// Throw down animation
@keyframes ball-throw-down {
from {
transform: translate(-50%, -60px);
}
to {
transform: translate(-50%, 80px);
}
}

// Rubber animation
@keyframes ball-rubber {
from {
width: $ball-width;
}
25% {
width: $ball-width * 0.75;
}
50% {
width: $ball-width;
}
to {
width: $ball-width / 2;
}
}

تمام سبک های دیگر مورد استفاده را می توان در منبع Github یافت.
مرحله 3 – انیمیشن سازی با Javascript
برای کمک به انیمیشن سازی از هر دو کتابخانه کم حجم anime.js و segment.js استفاده خواهیم کرد.
لطفاً توجه داشته باشید که ما خاطر شفافیت ، برخی اعلامیه های متغیر را در قطعه کد زیر نمی گنجانیم. اگر شک دارید ، منبع Github را بررسی کنید.
در اینجا کد اصلی ما برای ثبت رویدادهای کلیک بر روی button  و اجرای رفتار مورد نظر ما آورده شده است:
// Capture click events
button.addEventListener(‘click’, function () {
if (!completed) { // Don’t do anything if downloading has been completed
if (downloading) { // If it’s downloading, stop the download
stopDownload();
} else { // Start the download
startDownload();
}
}
});

// Start the download
function startDownload() {
// Update variables and CSS classes
downloading = true;
buttonContainer.classList.add(‘downloading’);
animateIcon();
// Update progress after 1s
progressTimer = setTimeout(function () {
buttonContainer.classList.add(‘progressing’);
animateProgress();
}, 1000);
}

// Stop the download
function stopDownload() {
// Update variables and CSS classes
downloading = false;
clearTimeout(progressTimer);
buttonContainer.classList.remove(‘downloading’);
buttonContainer.classList.remove(‘progressing’);
// Stop progress and draw icons back to initial state
stopProgress();
iconLine.draw(0, ‘100%’, 1, {easing: anime.easings[‘easeOutCubic’]});
iconSquare.draw(‘30%’, ‘70%’, 1, {easing: anime.easings[‘easeOutQuad’]});
}

پیشروی انیمیشن در نسخه ی نمایشی واقعی نیست. برای نمونه واقعی ، با داده های پیشرفت واقعی جایگزین خواهند شد. این تابعی است که پیشروی را انجام می دهد:
// Progress animation
function animateProgress() {
// Fake progress animation from 0 to 100%
// This should be replaced with real progress data (real progress percent instead ‘100%’), and maybe called multiple times
circularProgressBar.draw(0, ‘100%’, 2.5, {easing: anime.easings[‘easeInQuart’], update: updateProgress, callback: completedAnimation});
}

سرانجام ، در اینجا قطعه کد استفاده شده برای انجام انیمیشن سازی هنگام اتمام دانلود آورده شده است ، جایی که انیمیشن توپ آغاز می شود و عناصر مسیر را اصلاح می کنیم.
// Animation performed when download has been completed
function completedAnimation() {
// Update variables and CSS classes
completed = true;
buttonContainer.classList.add(‘completed’);
// Wait 1s for the ball animation
setTimeout(function () {
button.classList.add(‘button-hidden’);
ball.classList.add(‘hidden’);
borderPath.classList.remove(‘hidden’);
// Morphing the path to the second shape
var morph = anime({
targets: borderPath,
d: ‘M 40 3.5 a 36.5 36.5 0 0 0 -36.5 36.5 a 36.5 36.5 0 0 0 10.5 26.5 C 35 86.5 90 91.5 120 91.5 S 205 86.5 226 66.5 a 36.5 36.5 0 0 0 10.5 -26.5 a 36.5 36.5 0 0 0 -36.5 -36.5 Z’,
duration: 100,
easing: ‘linear’,
complete: function () {
// Morphing the path back to the original shape with elasticity
morph = anime({
targets: borderPath,
d: ‘M 40 3.5 a 36.5 36.5 0 0 0 -36.5 36.5 a 36.5 36.5 0 0 0 36.5 36.5 C 70 76.5 90 76.5 120 76.5 S 170 76.5 200 76.5 a 36.5 36.5 0 0 0 36.5 -36.5 a 36.5 36.5 0 0 0 -36.5 -36.5 Z’,
duration: 1000,
elasticity: 600,
complete: function () {
// Update variables and CSS classes, and return the button to the original state
completed = false;
setTimeout(function () {
buttonContainer.classList.remove(‘completed’);
button.classList.remove(‘button-hidden’);
ball.classList.remove(‘hidden’);
borderPath.classList.add(‘hidden’);
stopDownload();
}, 500);
}
});
}
});
}, 1000);
}

نتیجه
این مقاله قسمتهای اصلی کد مورد استفاده در ساخت این دکمه دانلود را نشان می دهد:

می توانید با DEMO زنده آن را پخش کنید ، یا کد کامل را در Github دریافت کنید. لطفاً توجه داشته باشید که این مؤلفه برای تولید کاملاً نیست ، زیرا به داده های پیشرفت واقعی و برخی ملاحظات در مورد چگونگی تأثیر بر روی ریزتعاملات نیاز دارد.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

در این مقاله وبلاگی ایجاد خواهید کرد که از سرور مجازی GraphQL استفاده میکند. ما برنامه وبلاگ را با استفاده از کلاینت Apollo و Vue می سازیم. می توانید سرور مجازی GraphQL را بگیرید تا بتوانید همراه با آموزش آن را دنبال کنید.
فعال کردن CORS
سرور مجازی GraphQL با AdonisJS ساخته شده است. AdonisJS بسته ای را ارائه می دهد که می توانیم از آن برای مدیریت اشتراک گذاری مقطعی منبع (CORS) در API استفاده کنیم. به طور پیش فرض CORS در AdonisJS شروع میشود ، بنابراین باید آن را فعال کنیم. برای فعال کردن CORS در برنامه AdonisJS ، origin  را به صورت زیر در config/cors.js روی true  تنظیم می کنیم:
config/cors.js
origin: true
اگرچه سرور مجازی GraphQL کلون شده قبلاً CORS را فعال کرده است ، اما ذکر آن خالی از لطف نیست.
راه اندازی سرور مجازی GraphQL
از آنجا که برنامه وبلاگ ما از سرور مجازی GraphQL استفاده می کند ، باید سرور مجازی را شروع کرده و آن را برای بقیه آموزش در حالت اجرا نگه داریم. برای شروع ، وارد دیرکتوری پروژه سرور مجازی GraphQL می شویم و دستور زیر را اجرا می کنیم:
⦁ $ adonis serve –dev

با این کار سرور مجازی GraphQL شروع به کار می کند.

بقیه آموزش بر این فرض است که شما قبلاً سرور مجازی GraphQL را راه اندازی کرده اید و در حال اجرا است.
با توجه به این مسئله ، بیایید شروع به ساخت برنامه وبلاگ خود کنیم.
ایجاد یک برنامه Vue
با ایجاد یک برنامه جدید Vue با استفاده از Vue CLI شروع خواهیم کرد:
⦁ $ vue init webpack graphql-blog-app

⦁ $ // select `Y` to use Vue router

با این کار یک برنامه جدید Vue با نام Graphql-blog-app ایجاد می شود و متعلقات آن را نصب می کند.
نصب بسته های لازم
با ایجاد برنامه ، می توانیم به سراغ نصب بسته های لازم برای ساخت برنامه وبلاگ GraphQL برویم:
⦁ $ cd graphql-blog-app

⦁ $ npm install –save vue-apollo@next graphql apollo-client apollo-link apollo-link-context apollo-link-http apollo-cache-inmemory graphql-tag
بیایید به سرعت روی همه بسته ها مروری کنیم:
⦁ vue-apollo: یکپارچه سازی Apollo / GraphQL برای VueJS است. ما آخرین نسخه این افزونه را نصب می کنیم که به ما امکان می دهد از تمام ویژگی های فوق العاده ای که همراه با کلاینت آپولو 2.0 وجود دارد استفاده کنیم.
⦁ graphql: اجرای مرجع GraphQL برای JavaScript .
⦁ apollo-client: یک کلاینت ذخیره سازی GraphQL ، جامع و آماده تولید ، برای هر سرور مجازی یا چارچوب UI .
⦁ apollo-link: یک رابط استاندارد برای اصلاح جریان کنترل درخواستهای GraphQL و واکشی نتایج GraphQL .
⦁ apollo-link-context: برای تنظیم زمینه ای روی عملکرد شما استفاده میشود ، که توسط سایر پیوندها در پایین زنجیره استفاده می شود.
⦁ apollo-link-http: برای گرفتن نتایج GraphQL از طریق شبکه با استفاده از واکشی HTTP استفاده می شود.
⦁ apollo-cache-inmemory: اجرای حافظه پنهان برای آپولو Client 2.0.
⦁ Graphql-tag: برچسب تحت اللفظی قالب JavaScript که نمایش داده های GraphQL را تجزیه می کند.
راه اندازی Vue Apollo
در مرحله بعد ، اجازه دهید بسته ها را برای استفاده قرار دهیم. ما با ایجاد یک نمونه ApolloClient و نصب افزونه VueApollo شروع خواهیم کرد. src / main.js را باز کنید و کد زیر را به آن اضافه کنید:
src/main.js
import { ApolloClient } from ‘apollo-client’
import { HttpLink } from ‘apollo-link-http’
import { InMemoryCache } from ‘apollo-cache-inmemory’
import VueApollo from ‘vue-apollo’

const httpLink = new HttpLink({
// URL to graphql server, you should use an absolute URL here
uri: ‘http://localhost:3333/graphql’
})

// create the apollo client
const apolloClient = new ApolloClient({
link: httpLink,
cache: new InMemoryCache()
})

// install the vue plugin
Vue.use(VueApollo)

یک نمونه جدید از httpLink را با URL (http: // localhost: 3333 / Graphql) سرور مجازی GraphQL خود ایجاد می کنیم. سپس با استفاده از httpLink ایجاد شده در بالا ، یک کلاینت Apollo ایجاد می کنیم و مشخص می کنیم حافظه پنهان را می خواهیم. در آخر ، افزونه Vue Apollo را نصب می کنیم.
در مرحله بعدی، بیایید یک آبجکت apolloProvider ایجاد کنیم که در مؤلفه اصلی خود آن را مشخص خواهیم کرد:
src/main.js
const apolloProvider = new VueApollo({
defaultClient: apolloClient
})

// update Vue instance by adding `apolloProvider`
new Vue({
el: ‘#app’,
router,
apolloProvider,
template: ‘<App/>’,
components: { App }
})

ما نمونه جدیدی از افزونه Vue Apollo را با استفاده از apolloClient ایجاد شده به عنوان کلاینت پیش فرض مان ایجاد می کنیم. در آخر ، با اضافه کردن آن در نمونه Vue ، از آبجکت apolloProvider استفاده می کنیم ، به همان روشی که از روتر Vue استفاده خواهیم کرد.
اضافه کردن Bulma
به منظور استفاده از این آموزش ، از Bulma CSS استفاده خواهیم کرد. بنابراین ، اجازه دهید آن را اضافه کنیم. index.html را باز کنید و به شرح زیر به روز کنید:
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<meta name=”viewport” content=”width=device-width,initial-scale=1.0″>
<title>GraphQL Blog App</title>
<link rel=”stylesheet” href=”https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.1/css/bulma.min.css”>
</head>
<body>
<div id=”app”></div>
<!– built files will be auto injected –>
</body>
</html>

ما Bulma را در CDN ارجاع می دهیم.
حذف کد استفاده نشده
هنگامی که برنامه Vue خود را ایجاد کردیم که در این آموزش استفاده نمی کنیم ، برخی از فایل ها و کد ها هستند که همراه آن می آیند. باید آنها را حذف کنیم تا در برنامه ما دخالت نکنند. مؤلفه Hello  را حذف کرده و تمام منابع آن را از src / router / index.js حذف کنید.
اضافه کردن چیدمان مستر
این وبلاگ از یک طرح کلی در صفحات خود استفاده می کند. در این حالت ، بیایید یک چیدمان تعریف کنیم که همه صفحات از آن استفاده کنند. برای انجام این کار ، src / App.vue را باز کنید و به شرح زیر آپدیت کنید:
src/App.vue
<template>
<div id=”app”>
<nav class=”navbar is-primary” role=”navigation” aria-label=”main navigation”>
<div class=”container”>
<div class=”navbar-brand”>
<router-link class=”navbar-item” to=”/”>Blog App</router-link>

<button class=”button navbar-burger”>
<span></span>
<span></span>
<span></span>
</button>
</div>
</div>
</nav>
<router-view/>
</div>
</template>

<script>
export default {
name: ‘app’
}
</script>

یک هدر اضافه می کنیم که همه صفحات از آن استفاده خواهند کرد.
ثبت نام کاربر
کاربران باید بتوانند در برنامه وبلاگ ما عضو شوند. ما یک مؤلفه SignUp ایجاد خواهیم کرد که آن را مدیریت کند. بنابراین ، در src/components یک پوشه ادمین جدید ایجاد کنید. تمام مؤلفه های مربوط به ادمین در این پوشه به صورت داخلی ایجاد می شوند.
قبل از ایجاد مؤلفه SignUp ، اجازه دهید یک فایل اختصاصی ایجاد کنیم که تمام نمایشگرها و جهش های GraphQL ما را در خود نگه می دارد. ما این فایل را مستقیماً در داخل src ایجاد خواهیم کرد. یک فایل Graphql.js را در داخل src ایجاد کنید و کد زیر را درون آن پیست کنید:
src/graphql.js
import gql from ‘graphql-tag’

export const SIGNUP_MUTATION = gql`mutation SignupMutation($username: String!, $email: String!, $password: String!) {
createUser(
username: $username,
email: $email,
password: $password
) {
id
username
email
}
}`

این جهش GraphQL است که ایجاد کاربر جدید در سرور مجازی GraphQL ما را کنترل می کند. نام کاربری ، ایمیل و رمز عبور کاربر را می گیرد. این متغیرها از مؤلفه SignUp منتقل می شوند.
در مرحله بعد ، بیایید مؤلفه SignUp را ایجاد کنیم. در داخل پوشه ادمین ، یک فایل SignUp.vue ایجاد کنید و کد زیر را در آن قرار دهید:
src/components/Admin/SignUp.vue
<template>
<section class=”section”>
<div class=”columns”>
<div class=”column is-4 is-offset-4″>
<h2 class=”title has-text-centered”>Signup</h2>

<form method=”POST” @submit.prevent=”signup”>
<div class=”field”>
<label class=”label”>Username</label>

<p class=”control”>
<input
type=”text”
class=”input”
v-model=”username”>
</p>
</div>

<div class=”field”>
<label class=”label”>E-Mail Address</label>

<p class=”control”>
<input
type=”email”
class=”input”
v-model=”email”>
</p>
</div>

<div class=”field”>
<label class=”label”>Password</label>

<p class=”control”>
<input
type=”password”
class=”input”
v-model=”password”>
</p>
</div>

<p class=”control”>
<button class=”button is-primary is-fullwidth is-uppercase”>SignUp</button>
</p>
</form>
</div>
</div>
</section>
</template>

<script>
import { SIGNUP_MUTATION } from ‘@/graphql’

export default {
name: ‘SignUp’,
data () {
return {
username: ”,
email: ”,
password: ”
}
},
methods: {
signup () {
this.$apollo
.mutate({
mutation: SIGNUP_MUTATION,
variables: {
username: this.username,
email: this.email,
password: this.password
}
})
.then(response => {
// redirect to login page
this.$router.replace(‘/login’)
})
}
}
}
</script>

این مؤلفه فرم ثبت نام را برای کاربران ارائه می دهد. پس از ارسال فرم ، یک روش signup  فراخوانی می شود. در روش signup  ، از روش mutate  موجود در this.$apollo استفاده می کنیم (از افزونه Vue Apollo. از جهش SIGNUP_MUTATION که قبلاً ایجاد شده استفاده می کنیم و متغیرهای لازم را می گذرانیم. پس از موفقیت در روند ثبت نام (یعنی وقتی کاربر ایجاد شد) کاربر را به صفحه ورود (که به زودی ایجاد خواهیم کرد) هدایت می کنیم.
اضافه کردن مسیر ثبت نام
src / router / index.js را باز کنید ، و کد زیر را به آن اضافه کنید:
src/router/index.js
import SignUp from ‘@/components/Admin/SignUp’

// add these inside the `routes` array
{
path: ‘/signup’,
name: ‘SignUp’,
component: SignUp
},

حال هنگامی که از مسیر /signup بازدید می کنیم ، باید فرم ثبت نام خود را مانند تصویر زیر ببینیم:

ورود کاربر
بیایید به کاربران امکان ورود به سیستم را اضافه کنیم. درست مانند کاری که با استفاده از کاربر انجام دادیم ، اجازه دهید ابتدا جهش GraphQL را ایجاد کنیم. کد زیر را به src / Graphql.js اضافه کنید:
src/graphql.js
export const LOGIN_MUTATION = gql`mutation LoginMutation($email: String!, $password: String!) {
login(
email: $email,
password: $password
)
}`

این جهش GraphQL دسترسی کاربر را به سرور مجازی GraphQL ما مدیریت می کند. ایمیل و رمز عبور کاربر را می گیرد.
سپس ، درون پوشه ادمین، یک فایل LogIn.vue ایجاد کنید و کد زیر را درون آن پیست کنید:
src/components/Admin/LogIn.vue
<template>
<section class=”section”>
<div class=”columns”>
<div class=”column is-4 is-offset-4″>
<h2 class=”title has-text-centered”>Login</h2>

<form method=”POST” @submit.prevent=”login”>
<div class=”field”>
<label class=”label”>E-Mail Address</label>

<p class=”control”>
<input
type=”email”
class=”input”
v-model=”email”>
</p>
</div>

<div class=”field”>
<label class=”label”>Password</label>

<p class=”control”>
<input
type=”password”
class=”input”
v-model=”password”>
</p>
</div>

<p class=”control”>
<button class=”button is-primary is-fullwidth is-uppercase”>Login</button>
</p>
</form>
</div>
</div>
</section>
</template>

<script>
import { LOGIN_MUTATION } from ‘@/graphql’

export default {
name: ‘LogIn’,
data () {
return {
email: ”,
password: ”
}
},
methods: {
login () {
this.$apollo
.mutate({
mutation: LOGIN_MUTATION,
variables: {
email: this.email,
password: this.password
}
})
.then(response => {
// save user token to localstorage
localStorage.setItem(‘blog-app-token’, response.data.login)

// redirect user
this.$router.replace(‘/admin/posts’)
})
}
}
}
</script>

این مؤلفه فرم ساده ای را برای ورود کاربران فراهم می کند. پس از ارسال فرم ، یک روش login  فراخوانی می شود. در روش login ، ما از روش mutate  استفاده می کنیم. ما از جهش LOGIN_MUTATION که قبلاً ایجاد شده است استفاده می کنیم و از متغیرهای لازم عبور می کنیم. پس از موفقیت در فرآیند ورود به سیستم ، توکنی را که از سرور مجازی GraphQL دریافت کرده ایم در ذخیره سازی محلی سیو کرده و کاربر را هدایت می کنیم.
افزودن مسیر ورود
src / router / index.js را باز کنید و کد زیر را به آن اضافه کنید:
src/router/index.js
import LogIn from ‘@/components/Admin/LogIn’

// add these inside the `routes` array
{
path: ‘/login’,
name: ‘LogIn’,
component: LogIn
},

حال وقتی از مسیر /login بازدید می کنیم ، باید فرم ورود به سیستم را مانند تصویر زیر مشاهده کنیم:

ایجاد مؤلفه منو
قبل از شروع به اشغال قسمتهای ادمین وبلاگ خود ، بیایید یک مولفه منو ایجاد کنیم که به عنوان منوی پیمایش نوار کناری ارائه شود. در پوشه ادمین ، یک فایل Menu.vue ایجاد کنید و کد زیر را در آن قرار دهید:
src/components/Admin/Menu.vue
<template>
<aside class=”menu”>
<p class=”menu-label”>Post</p>
<ul class=”menu-list”>
<li>
<router-link to=”/admin/posts/new”>New Post</router-link>
</li>
<li>
<router-link to=”/admin/posts”>Posts</router-link>
</li>
</ul>
<p class=”menu-label”>User</p>
<ul class=”menu-list”>
<li>
<router-link to=”/admin/users”>Users</router-link>
</li>
</ul>
</aside>
</template>

این به سادگی پیوندهایی را به برخی بخش های ادمین برنامه وبلاگ ارائه می دهد.
نمایش کاربران
در بخش ادمین ، می خواهیم بتوانیم لیست کاربرانی که ایجاد شده اند را ببینیم. برای همین ، یک مولفه کاربران ایجاد کردیم. اما اول ، بیایید جستار GraphQL را بنویسیم که تمام کاربرهای ایجاد شده را منتقل می کند. کد زیر را به src / Graphql.js اضافه کنید:
src/graphql.js
export const ALL_USERS_QUERY = gql`query AllUsersQuery {
allUsers {
id
username
email
}
}`
این جستار GraphQL همه کاربران را از سرور مجازی GraphQL ما دریافت می کند.
در مرحله بعد ، بیایید مؤلفه Users  را ایجاد کنیم. در داخل پوشه ادمین ، یک فایل Users.vue ایجاد کنید و کد زیر را در آن قرار دهید:
src/components/Admin/Users.vue
<template>
<section class=”section”>
<div class=”container”>
<div class=”columns”>
<div class=”column is-3″>
<Menu/>
</div>
<div class=”column is-9″>
<h2 class=”title”>Users</h2>

<table class=”table is-striped is-narrow is-hoverable is-fullwidth”>
<thead>
<tr>
<th>Username</th>
<th>Email</th>
<th></th>
</tr>
</thead>
<tbody>
<tr
v-for=”user in allUsers”
:key=”user.id”>
<td>{{ user.username }}</td>
<td>{{ user.email }}</td>
<td>
<router-link :to=”`/admin/users/${user.id}`”>View</router-link>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</section>
</template>

<script>
import Menu from ‘@/components/Admin/Menu’
import { ALL_USERS_QUERY } from ‘@/graphql’

export default {
name: ‘Users’,
components: {
Menu
},
data () {
return {
allUsers: []
}
},
apollo: {
// fetch all users
allUsers: {
query: ALL_USERS_QUERY
}
}
}
</script>

ما از مؤلفه Menu  ایجاد شده قبلی استفاده می کنیم. سپس داده های خود را تعریف می کنیم که پس از بدست آوردن اطلاعات از سرور مجازی GraphQL جمع می شوند. در درون آبجکت apollo ، برای جستجوی همه کاربران ، عبارت GraphQL را اضافه می کنیم. از ALL_USERS_QUERY که در بالا ایجاد کردیم استفاده می کند. ذکر این نکته حائز اهمیت است که ، نام داده های ما (allUsers در این مورد) باید به همان نامی باشد که در جستار GraphQL استفاده می شود (در این مورد allUsers). هنگامی که allUsers با داده های سرور مجازی GraphQL ما جمع می شود ، کاربران را با حلقه زدن در آرایه کاربران در یک جدول نمایش می دهیم. همچنین برای مشاهده جزئیات هر کاربر پیوندی اضافه می کنیم.
اضافه کردن مسیر کاربران
src / router / index.js را باز کنید و کد زیر را به آن اضافه کنید:
src/router/index.js
import Users from ‘@/components/Admin/Users’

// add these inside the `routes` array
{
path: ‘/admin/users’,
name: ‘Users’,
component: Users
},
حال وقتی از مسیر /admin/users بازدید می کنیم ، باید لیستی از کاربران را مانند تصویر زیر ببینیم:

مشاهده جزئیات کاربر
در قسمت آخر پیوندی برای مشاهده جزئیات کاربر اضافه می کنیم. اکنون ، بیایید آن را پیاده سازی کنیم. کد زیر را به src / Graphql.js اضافه کنید:
src/graphql.js
export const USER_QUERY = gql`query UserQuery($id: Int!) {
user(id: $id) {
id
username
email
posts {
id
}
}
}`

این جستار GraphQL کاربر را با شناسه خود از سرور مجازی GraphQL دریافت می کند. شناسه کاربر را به عنوان یک آرگومان در نظر می گیرد. شناسه کاربر از مؤلفه UserDetails منتقل می شود.
در مرحله بعد ، بیایید مؤلفه UserDetails را ایجاد کنیم. در داخل پوشه ادمین ، یک فایل UserDetails.vue ایجاد کنید و کد زیر را در آن قرار دهید:
src/components/Admin/UserDetails.vue
<template>
<section class=”section”>
<div class=”container”>
<div class=”columns”>
<div class=”column is-3″>
<Menu/>
</div>
<div class=”column is-9″>
<h2 class=”title”>User Details</h2>

<div class=”field is-horizontal”>
<div class=”field-label is-normal”>
<label class=”label”>Username</label>
</div>
<div class=”field-body”>
<div class=”field”>
<p class=”control”>
<input class=”input is-static” :value=”user.username” readonly>
</p>
</div>
</div>
</div>

<div class=”field is-horizontal”>
<div class=”field-label is-normal”>
<label class=”label”>Email Address</label>
</div>
<div class=”field-body”>
<div class=”field”>
<p class=”control”>
<input class=”input is-static” :value=”user.email” readonly>
</p>
</div>
</div>
</div>

<div class=”field is-horizontal”>
<div class=”field-label is-normal”>
<label class=”label”>Number of posts</label>
</div>
<div class=”field-body”>
<div class=”field”>
<p class=”control”>
<input class=”input is-static” :value=”user.posts.length” readonly>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</template>

<script>
import Menu from ‘@/components/Admin/Menu’
import { USER_QUERY } from ‘@/graphql’

export default {
name: ‘UserDetails’,
components: {
Menu
},
data () {
return {
user: ”,
id: this.$route.params.id
}
},
apollo: {
// fetch user by ID
user: {
query: USER_QUERY,
variables () {
return {
id: this.id
}
}
}
}
}
</script>

ما نام کاربری ، ایمیل و تعداد پست های ایجاد شده مشخص را نمایش می دهیم. USER_QUERY شناسه ی کاربری را که می خواهیم جزئیات او را مشاهده کنیم دریافت می کند. شناسه کاربری از پارامترهای مسیر گرفته می شود. یعنی /admin/users/12 داده شده، 12 شناسه یک کاربر خاص میباشد. نیاز به راهی داریم تا بتوانیم این شناسه را به جستار خود منتقل کنیم. برای این کار با تعریف یک تابع variables  که یک آبجکت حاوی شناسه کاربر را برمیگرداند ، از  reactive parameter استفاده می کنیم.
افزودن مسیر اطلاعات کاربر
src / router / index.js را باز کنید و کد زیر را به آن اضافه کنید. این مسیر باید زیر مسیرهای قبلی باشد:
src/router/index.js
import UserDetails from ‘@/components/Admin/UserDetails’

// add these inside the `routes` array
{
path: ‘/admin/users/:id’,
name: ‘UserDetails’,
component: UserDetails,
props: true
},

در حال حاضر باید بتوانیم جزئیات خاصی از کاربر را مشاهده کنیم:

اعتباردهی به کاربر
فقط کاربران معتبر می توانند پست جدیدی اضافه کنند. بنابراین ، به راهی نیاز داریم تا یک هدر Autorization را با استفاده از نشانه کاربر به همراه درخواست اضافه کردن پست جدید که نشان دهنده کاربر است ، ارسال کنیم. می توانیم با apollo-link-context به راحتی این کار را انجام دهیم. src / main.js را باز کنید و کد زیر را به آن اضافه کنید:
src/main.js
import { setContext } from ‘apollo-link-context’

const authLink = setContext((_, { headers }) => {
// get the authentication token from localstorage if it exists
const token = localStorage.getItem(‘blog-app-token’)

// return the headers to the context so httpLink can read them
return {
headers: {
…headers,
authorization: token ? `Bearer ${token}` : null
}
}
})

// update apollo client as below
const apolloClient = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache()
})

ابتدا ، apollo-link-context را وارد می کنیم. سپس از آن استفاده می کنیم تا authLink را ایجاد کنیم که نشانه کاربر را از فضای ذخیره محلی دریافت کند و هدرهایی را که حاوی عنوان Authorization  می باشد برگرداند. سرانجام ، در کلاینت Apollo از authLink استفاده می کنیم.
اکنون یک هدر اعتباردهی به همراه کلیه درخواستهای ایجاد شده به سرور مجازی GraphQL ما ارسال می شود.
افزودن پست جدید
پست ها قلب هر وبلاگ هستند. کاربران باید بتوانند یک پست جدید اضافه کنند. باز هم ، برای اضافه کردن پست جدید به وبلاگ خود، ابتدا جهش GraphQL را ایجاد خواهیم کرد. کد زیر را به src / Graphql.js اضافه کنید:
src/graphql.js
export const ADD_POST_MUTATION = gql`mutation AddPostMutation($title: String!, $content: String!) {
addPost(
title: $title,
content: $content
) {
id
slug
title
content
user {
id
username
email
}
}
}`
این جهش عنوان و محتوای پستی را که می خواهیم به آن اضافه کنیم به سرور مجازی GraphQL اضافه می کند.
سپس ، یک مولفه AddPost را در پوشه ادمین ایجاد کنید و کد زیر را درون آن پیست کنید:
src/components/Admin/AddPost.vue
<template>
<section class=”section”>
<div class=”container”>
<div class=”columns”>
<div class=”column is-3″>
<Menu/>
</div>
<div class=”column is-9″>
<h2 class=”title”>Add Post</h2>

<form method=”post” @submit.prevent=”addPost”>
<div class=”field”>
<label class=”label”>Title</label>

<p class=”control”>
<input
class=”input”
v-model=”title”
placeholder=”Post title”>
</p>
</div>

<div class=”field”>
<label class=”label”>Content</label>

<p class=”control”>
<textarea
class=”textarea”
rows=”10″
v-model=”content”
placeholder=”Post content”
></textarea>
</p>
</div>

<p class=”control”>
<button class=”button is-primary”>Add Post</button>
</p>
</form>
</div>
</div>
</div>
</section>
</template>

<script>
import Menu from ‘@/components/Admin/Menu’
import { ADD_POST_MUTATION, ALL_POSTS_QUERY } from ‘@/graphql’

export default {
name: ‘AddPost’,
components: {
Menu
},
data () {
return {
title: ”,
content: ”
}
},
methods: {
addPost () {
this.$apollo
.mutate({
mutation: ADD_POST_MUTATION,
variables: {
title: this.title,
content: this.content
},
update: (store, { data: { addPost } }) => {
// read data from cache for this query
const data = store.readQuery({ query: ALL_POSTS_QUERY })

// add new post from the mutation to existing posts
data.allPosts.push(addPost)

// write data back to the cache
store.writeQuery({ query: ALL_POSTS_QUERY, data })
}
})
.then(response => {
// redirect to all posts
this.$router.replace(‘/admin/posts’)
})
}
}
}
</script>
این مؤلفه فرم اضافه کردن پست جدید را ارائه می دهد. با استفاده از ADD_POST_MUTATION متغیرهای لازم را به آن منتقل می کند. از آنجا که کلاینت Apollo جستار را کش میکند(در این مورد در حافظه قرار میدهد) ، در زمان اجرای اقدامات جهش به روشی برای به روزرسانی حافظه پنهان نیاز داریم. توجه کنید یک تابع update  وجود دارد که ما با اضافه کردن پست جدید به حافظه نهان، از آن برای به روز کردن فروشگاه استفاده می کنیم. ابتدا داده ها را از حافظه نهان مطابق با جستار خود (ALL_POSTS_QUERY) می گیریم ، سپس پست جدید را به آرایه allPosts اضافه می کنیم. در آخر ، داده های جدید را دوباره در حافظه نهان می نویسیم. پس از ارسال موفق، به لیست پستها (که به زودی ایجاد خواهیم کرد) هدایت می شویم.
افزودن مسیر ارسال پست
src / router / index.js را باز کنید و کد زیر را به آن اضافه کنید:
src/router/index.js
import AddPost from ‘@/components/Admin/AddPost’

// add these inside the `routes` array
{
path: ‘/admin/posts/new’,
name: ‘AddPost’,
component: AddPost
}
کاربران باید بتوانند اکنون پست جدیدی اضافه کنند:

نمایش پست ها
ما ابتدا با اضافه کردن کد زیر به src / Graphql.js ، عبارت GraphQL را ایجاد می کنیم:
src/graphql.js
export const ALL_POSTS_QUERY = gql`query AllPostsQuery {
allPosts {
id
title
slug
user {
username
}
}
}`
این جستار GraphQL تمام پست ها را از سرور مجازی GraphQL ما دریافت می کند.
سپس ، یک مولفه Posts را درون پوشه ادمین بسازید و کد زیر را در آن قرار دهید:
src/components/Admin/Posts.vue
<template>
<section class=”section”>
<div class=”container”>
<div class=”columns”>
<div class=”column is-3″>
<Menu/>
</div>
<div class=”column is-9″>
<h2 class=”title”>Posts</h2>

<table class=”table is-striped is-narrow is-hoverable is-fullwidth”>
<thead>
<tr>
<th>title</th>
<th>User</th>
<th></th>
</tr>
</thead>
<tbody>
<tr
v-for=”post in allPosts”
:key=”post.id”>
<td>{{ post.title }}</td>
<td>{{ post.user.username }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</section>
</template>

<script>
import Menu from ‘@/components/Admin/Menu’
import { ALL_POSTS_QUERY } from ‘@/graphql’

export default {
name: ‘Posts’,
components: {
Menu
},
data () {
return {
allPosts: []
}
},
apollo: {
// fetch all posts
allPosts: {
query: ALL_POSTS_QUERY
}
}
}
</script>

ما از مؤلفه Menu  ایجاد شده قبلی استفاده می کنیم. سپس داده های خود را تعریف می کنیم که پس از بدست آوردن اطلاعات از سرور مجازی GraphQL ما جمع می شوند. در درون آبجکت apollo ، برای دریافت همه کاربران ، عبارت GraphQL را اضافه می کنیم. که از ALL_USERS_QUERY که در بالا ایجاد کردیم، استفاده می کند. ذکر این نکته حائز اهمیت است که ، نام داده های ما (allUsers در این مورد) باید به همان نامی باشد که در جستار GraphQL  ما استفاده می شود (در این مورد allUsers). هنگامی که allUsers با داده های سرور مجازی GraphQL ما جمع می شود ، کاربران را با حلقه زدن در آرایه کاربران در یک جدول نمایش می دهیم. همچنین برای مشاهده جزئیات هر کاربر پیوندی اضافه می کنیم.
افزودن مسیر پست ها
src / router / index.js را باز کنید و کد زیر را به آن اضافه کنید:
src/router/index.js
import Posts from ‘@/components/Admin/Posts’

// add these inside the `routes` array
{
path: ‘/admin/posts’,
name: ‘Posts’,
component: Posts
}
حال وقتی از مسیر /admin/posts بازدید می کنیم ، باید لیستی از پست ها را در تصویر زیر مشاهده کنیم:

ایجاد صفحه هوم وبلاگ
صفحه اصلی وبلاگ لیستی از تمام پست های ایجاد شده را درست مانند بخش نمایش پست ها نشان می دهد. در حقیقت ، صفحه اصلی دقیقاً از همان GraphQL استفاده می کند که در نمایش پست ها استفاده می شود. این تنها نشانه صفحه اصلی است که متفاوت خواهد بود. یک مولفه Home در قسمت src/components ایجاد کنید و کد زیر را به آن اضافه کنید:
src/components/Home.vue
<template>
<section class=”section”>
<div class=”columns”>
<div class=”column is-6 is-offset-3″>
<h1 class=”title”>Latest Posts</h1>

<h3
v-for=”post in allPosts”
:key=”post.id”
class=”title is-5″>
<router-link :to=”post.slug”>
{{ post.title }}
</router-link>
</h3>
</div>
</div>
</section>
</template>

<script>
import { ALL_POSTS_QUERY } from ‘@/graphql’

export default {
name: ‘Home’,
data () {
return {
allPosts: []
}
},
apollo: {
// fetch all posts
allPosts: {
query: ALL_POSTS_QUERY
}
}
}
</script>

همانطور که می بینیم بخش JavaScript با کامپوننت Posts یکسان است. فقط نشانه گذاری متفاوت دارد. ما آرایه ی پست ها را دور می زنیم و عنوان هر پست را که با کد شماره صفحه آنها مرتبط است، نشان می دهیم.
اضافه کردن مسیر خانه
src / router / index.js را باز کنید و کد زیر را به آن اضافه کنید:
src/router/index.js
import Home from ‘@/components/Home’

// add these inside the `routes` array
{
path: ‘/’,
name: ‘Home’,
component: Home
}

در بازدید از مسیر / ، باید صفحه اصلی وبلاگ خود را مانند تصویر زیر مشاهده کنید:

مشاهده پست
آخرین موردی که باید اضافه شو ، امکان مشاهده پست خاص است. کد زیر را به src / Graphql.js اضافه کنید:
src/graphql.js
export const POST_QUERY = gql`query PostQuery($slug: String!) {
post(slug: $slug) {
id
title
slug
content
user {
id
username
email
}
}
}`

این جستار یک پست را با کد شماره صفحه خود دریافت میکند. کد شماره صفحه پست را به عنوان یک آرگومان میگیرد.
سپس ، یک مولفه SinglePost را در داخل src/components ایجاد کرده و کد زیر را به آن اضافه کنید:
src/components/SinglePost.vue
<template>
<section class=”section”>
<div class=”columns”>
<div class=”column is-6 is-offset-3″>
<router-link class=”button is-link is-small” to=”/”>Back Home</router-link>

<h1 class=”title”>
{{ post.title }}
</h1>

<div class=”content”>
{{ post.content }}
</div>
</div>
</div>
</section>
</template>

<script>
import { POST_QUERY } from ‘@/graphql’

export default {
name: ‘SinglePost’,
data () {
return {
post: ”,
slug: this.$route.params.slug
}
},
apollo: {
// fetch post by slug
post: {
query: POST_QUERY,
variables () {
return {
slug: this.slug
}
}
}
}
}
</script>

ما به سادگی عنوان پست و محتوای آن و سپس پیوندی را برای بازگشت به صفحه اصلی نمایش می دهیم. بخش JavaScript پیاده سازی مورد استفاده در نمایش جزئیات کاربر را دنبال می کند. در این حالت ، کد شماره صفحه پست را از پارامترهای مسیر دریافت می کنیم.
افزودن مسیر مشاهده پست
src / router / index.js را باز کنید و کد زیر را به آن اضافه کنید:
src/router/index.js
import SinglePost from ‘@/components/SinglePost’

// add these inside the `routes` array
{
path: ‘/:slug’,
name: ‘SinglePost’,
component: SinglePost,
props: true
}
توجه: این مسیر باید آخرین مسیر در آرایه مسیرها باشد.
اکنون باید بتوانیم یک پست واحد را مشاهده کنیم:

نتیجه
در این آموزش ، نحوه ساختن یک برنامه وبلاگ با GraphQL ، کلاینت Apollo و VueJS را مشاهده کردیم. همچنین دیدیم که چگونه برنامه frontend  خود را به یک سرور مجازی GraphQL وصل کنیم. کد کامل این آموزش در GitHub موجود است.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

Progressive web apps برنامه های وب هستند که با فناوری هایی ساخته شده اند که باعث می شود آنها مانند برنامه های بومی (native) رفتار کنند. فواید برنامه های وب پیشرونده ، امکان کار یکنواخت در زمان غیرقابل اطمینان بودن پوشش شبکه است. همچنین بر خلاف برنامه های بومی ، نیازی به نصب نیست اما سریعتر از برنامه های وب معمولی هستند. در این مقاله شما می توانید یک برنامه وب پیشرونده را با Angular بسازید و آن را با Firebase مستقر کنید.
شروع
برای ساختن یک برنامه وب پیشرونده با Angular ، یک وب سایت کوچک در این آموزش ایجاد خواهید کرد. پس از اتمام کار ، از افزونه Lighthouse Chrome برای آزمایش پیشرفت برنامه خود استفاده می کنید. همچنین می توانید این پروژه را از GitHub کلون کنید.

ایجاد یک پروژه جدید Angular
برای ایجاد یک پروژه جدید Angular از طریق Angular CLI ، باید Angular CLI را روی دستگاه خود نصب کنید. اگر Angular CLI هنوز روی دستگاه شما نصب نشده است ، دستور زیر را برای نصب آن در سطح جهانی اجرا کنید:
⦁ $ npm install -g ⦁ @angular/cli

پس از نصب Angular CLI در سطح جهانی ، می توانید یک پروژه جدید را با آن ایجاد کنید. به طور پیش فرض Angular فایلهای آزمایشی تولید می کند که در این پروژه آموزشی استفاده ای ندارند. برای جلوگیری از این تولید ، می توانید فلگ –skip-tests را به دستور زیر اضافه کنید که یک پروژه جدید ایجاد می کند:
⦁ $ ng new ng-pwa –skip-tests

ایجاد مانیفست برنامه وب
مانیفست برنامه وب یک فایل JSON است که شامل پیکربندی میباشد که به یک برنامه وب امکان ذخیره در صفحه اصلی کاربر را می دهد. همچنین ظاهر و رفتار آن را هنگام راه اندازی از صفحه اصلی تعریف می کند. مانیفست برنامه وب یک نیاز اساسی برای برنامه های وب پیشرونده است اما می تواند در هر وب سایتی مورد استفاده قرار گیرد.
برای ایجاد یک مانیفست برنامه وب برای برنامه خود ، به پوشه src / بروید و فایلی با نام manifest.json را در ریشه پوشه ایجاد کنید. محتوای زیر را در فایل اضافه کنید:
src/manifest.json
{
“name”: “Angular Progressive Web App”,
“short_name”: “Ng-PWA”,
“start_url”: “./”,
“theme_color”: “#008080”,
“background_color”: “#008B8B”,
“display”: “standalone”,
“description”: “A PWA that is built with Angular”,
“icons”: [
{
“src”: “/assets/images/icons/icon-16×16.png”,
“sizes”: “16×16”,
“type”: “image/png”
},
{
“src”: “/assets/images/icons/icon-32×32.png”,
“sizes”: “32×32”,
“type”: “image/png”
},
{
“src”: “/assets/images/icons/icon-150×150.png”,
“sizes”: “150×150”,
“type”: “image/png”
},
{
“src”: “/assets/images/icons/icon-180×180.png”,
“sizes”: “180×180”,
“type”: “image/png”
},
{
“src”: “/assets/images/icons/icon-192×192.png”,
“sizes”: “192×192”,
“type”: “image/png”
},
{
“src”: “/assets/images/icons/icon-512×512.png”,
“sizes”: “512×512”,
“type”: “image/png”
}
]

}

در مانیفست برنامه وب ما ، نامی را که در صفحه هوم کاربران به آیکون برنامه ما پیوست خواهد شد و یک short_name که در صورت طولانی بودن آن جایگزین میشود را تعریف کردیم . همچنین صفحه فرود برنامه را هنگامی که از صفحه اصلی با start_url راه اندازی میشود ، مشخص کردیم. theme_color رنگی را که UI مرورگر هنگام بازدید از سایت ما مشاهده می کند را مشخص می نماید. ویژگی background_color رنگ پس زمینه ای را کنترل می کند که هنگام اجرای برنامه توسط کاربران از صفحه هوم آن ها، آیکون برنامه ما را نمایش میدهد . با display ، مشخص میکنید که وقتی کاربر از سایت شما بازدید می کند باید UI مرورگر پنهان شود یا خیر.
انتظار داریم کاربران با انواع مختلف دستگاه ها با اندازه صفحه های مختلف از سایت ما بازدید کنند ، بنابراین نیاز به ایجاد نسخه های تکراری از آیکون های برنامه خود در ابعاد مختلف داریم. realfavicongenerator.net می تواند به خودکارسازی این روند کمک کند.

پس از اتمام کار ، به فایل index.html بروید و موارد زیر را به بخش head اضافه کنید:
src/index.html

<link rel=”manifest” href=”/manifest.json”>
<meta name=”theme-color” content=”#008080″>

مانیفست برنامه وب به پوشه build اضافه نمی شود مگر اینکه ما به Angular دستورالعمل این کار را بدهیم. ما این کار را با اضافه کردن فایل manifest.json به آرایه دارایی ها در بخش apps فایل .angular-cli.json انجام خواهیم داد.
.angular-cli.json

“apps”: [
{

“assets”: [

“manifest.json”
],

اضافه کردن ارائه دهندگان خدمات
ارائه دهندگان خدمات پایه و اساس برنامه های وب پیشرونده هستند که در جاوا اسکریپت نوشته شده اند و به ذخیره کردن دارایی ها و فایل های مهم کمک می کنند ، این ویژگی به شما کمک می کند تا هنگامی که پوشش شبکه غیرقابل دسترسی یا غیرقابل اطمینان باشد ، عملکرد یک برنامه را حفظ کنید. ارائه دهندگان خدمات همچنین می توانند درخواست ها را رهگیری کنند و پاسخ های سرور مجازی را در میان موارد دیگر مدیریت کنند.
ما باید برنامه خود را قبل از وارد کردن آن به تولید ، با Webpack بسازیم و مسئول سرویس ما باید بتواند فایل های ساخت را ردیابی و ذخیره کند. با بسته npm sw-precache-webpack-plugin ، بسته را نصب می کنیم و آن را پیکربندی می کنیم. سپس می توانیم یک فرمان را اجرا کنیم که به صورت خودکار ارائه دهنده سرویس را در پوشه build ایجاد کند.
دستور نصب npm را برای نصب بسته اجرا کنید:
⦁ $ npm install –save-dev sw-precache-webpack-plugin

پس از نصب بسته ، به ریشه برنامه بروید و فایلی با نام precache-config.js ایجاد کنید. موارد زیر را در فایل اضافه کنید:
pre-cache.config.js
var SWPrecacheWebpackPlugin = require(‘sw-precache-webpack-plugin’);

module.exports = {
navigateFallback: ‘/index.html’,
navigateFallbackWhitelist: [],
stripePrefix: ‘dist’,
root: ‘dist/’,
plugins:[
new SWPrecacheWebpackPlugin({
cacheId: ‘ng-pwa’,
filename: ‘service-worker.js’,
staticFileGlobs: [
‘dist/index.html’,
‘dist/**.js’,
‘dist/**.css’
],

})
],
stripePrefix: ‘dist/assets’,
mergeStaticsConfig: true
};

فایل precache-config.js با استفاده از آبجکت های لفظی جفتهای مقدار کلیدی sw-precache-webpack-plugin را پیکربندی می کند.
Angular به عنوان یک چارچوب نرم افزار نهایی برای ایجاد برنامه های تک صفحه ای، از مسیریابی URL سمت کلاینت استفاده می کند و بنابراین می تواند URL های دلخواه تولید کند که توسط ارائه دهنده سرویس خودکار تولید شده، ذخیره نمی شود. در چنین شرایطی ما یک ورودی HTML را تعریف خواهیم کرد که URL درخواستی روی آن نگاشت شود و navigateFallback آن را مدیریت کند. ورودی HTML باید بتواند منابع مورد نظر را تأمین کند. از آنجا که برنامه ما SPA است ، و index.html نقطه ورود است – می تواند URL های دلخواه را اداره کند ، بنابراین باید در بین فایل هایی که برای ذخیره در آرایه staticFileGlobs انتخاب شده اند قرار بگیرد. navigateFallbackWhitelist می تواند خالی و یا حاوی یک regex باشد که نوع / الگوی URL را که برای استفاده از navigateFallback استفاده می شود ، تعریف کند.
برای درک عمیق تر از نحوه پیکربندی افزونه sw-precache-webpack ، مستندات آن را بخوانید.
برای به پایان رساندن راه اندازی ارائه دهنده سرویس ، یک اسکریپت / دستور سفارشی npm ایجاد خواهیم کرد که برای ساختن برنامه ما و تولید خودکار فایل ارائه دهنده سرویس در پوشه build استفاده خواهد شد. به فایل pack.json بروید و موارد زیر را به اسکریپت ها اضافه کنید:
package.json

“scripts”: {

“pwa”: “ng build –prod && sw-precache –root=dist –config=precache-config.js”
},

بررسی نما
از آنجا که تمرکز اصلی ما بر روند ساخت برنامه وب پیشرونده با Angular است، فقط یک نمای واحد داریم .
src/app/app.component.html
<div class=”container”>
<h1>
A Progressive Web App Built with Angular.
</h1>
<img width=”300″ src=”data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAyNTAgMjUwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNTAgMjUwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDojREQwMDMxO30NCgkuc3Qxe2ZpbGw6I0MzMDAyRjt9DQoJLnN0MntmaWxsOiNGRkZGRkY7fQ0KPC9zdHlsZT4NCjxnPg0KCTxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMTI1LDMwIDEyNSwzMCAxMjUsMzAgMzEuOSw2My4yIDQ2LjEsMTg2LjMgMTI1LDIzMCAxMjUsMjMwIDEyNSwyMzAgMjAzLjksMTg2LjMgMjE4LjEsNjMuMiAJIi8+DQoJPHBvbHlnb24gY2xhc3M9InN0MSIgcG9pbnRzPSIxMjUsMzAgMTI1LDUyLjIgMTI1LDUyLjEgMTI1LDE1My40IDEyNSwxNTMuNCAxMjUsMjMwIDEyNSwyMzAgMjAzLjksMTg2LjMgMjE4LjEsNjMuMiAxMjUsMzAgCSIvPg0KCTxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0xMjUsNTIuMUw2Ni44LDE4Mi42aDBoMjEuN2gwbDExLjctMjkuMmg0OS40bDExLjcsMjkuMmgwaDIxLjdoMEwxMjUsNTIuMUwxMjUsNTIuMUwxMjUsNTIuMUwxMjUsNTIuMQ0KCQlMMTI1LDUyLjF6IE0xNDIsMTM1LjRIMTA4bDE3LTQwLjlMMTQyLDEzNS40eiIvPg0KPC9nPg0KPC9zdmc+DQo=” alt=”Angular logo”>

<h2>Get Started With Progressive Web Apps: </h2>
<ul>
<li>
<h4><a target=”_blank” rel=”noopener” href=”https://developers.google.com/web/fundamentals/primers/service-workers/”>Service Workers</a></h4>
</li>
<li>
<h4><a target=”_blank” rel=”noopener” href=”https://developers.google.com/web/fundamentals/web-app-manifest/”>Web App Manifest</a></h4>
</li>
<li>
<h4><a target=”_blank” rel=”noopener” href=”https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp/”>Code Lab (PWA)</a></h4>
</li>
</ul>

</div>

اگر مشخصه target عنصر لنگرگاه به دلایل امنیتی و عملکردی روی _blank تنظیم شود ، ویژگی rel = “noopener” در برنامه های وب پیشرونده ضروری است:
در ادامه کد CSS آمده است:
src/styles.css
body{
background-color: teal;
}

.container{
text-align: center;
}

ul{
list-style: none;
}

h1, h2, a {
color: white;
}

به کارگیری برنامه
اراده دهنده خدمات ضربان قلب هر برنامه وب پیشرونده است. با این حال برای اینکه ارائه دهنده سرویس خوب عمل کند ، برنامه ما باید از طریق یک اتصال مطمئن ارائه شود. از این رو ، برنامه خود را به Firebase میفرستیم ، که میزبان یک اتصال امن است و مراحل را طی خواهید کرد.

برای شروع ، به firebase.google.com مراجعه کنید. اگر از قبل حساب کاربری ندارید ، یک حساب کاربری ایجاد کنید تا به کنسول دسترسی داشته باشید. از کنسول ، یک پروژه Firebase جدید ایجاد کنید.

پس از ایجاد یک پروژه Firebase جدید ، به ترمینال فرمان بروید و به پوشه برنامه وب پیشرونده خود بروید. npm install -g firebase-tools را برای نصب ابزارهای firebase در سطح جهانی اجرا کنید. بسته ابزارهای firebase به ما امکان می دهد برنامه های اجرایی و استقراری را از ترمینال فرمان آزمایش کنیم.
پس از اتمام نصب ، باید برنامه خود را برای آماده سازی جهت استقرار بسازیم. برای ساخت برنامه Angular و تولید خودکار ارائه دهنده سرویس، npm run pwa را اجرا کنید. این دستور اسکریپت سفارشی را که قبلاً ایجاد کردیم اجرا می کند و تولید برنامه ما را آماده می کند.

زمان معرفی Firebase به برنامه ما است. برای ورود به Firebase دستور firebase login را اجرا کنید. دستور firebase init را برای شروع اولیه Firebase در پروژه اجرا کنید. سپس به سؤالات به شرح زیر پاسخ دهید:
• آیا آماده ادامه کار هستید؟ (Y / n) = Y
• کدام ویژگی Firebase CLI را برای تنظیم این پوشه می خواهید؟ = میزبانی
• یک پروژه Firebase پیش فرض برای این فهرست انتخاب کنید = نام پروژه Firebase تان
• به عنوان دایرکتوری عمومی خود می خواهید از چه مواردی استفاده کنید؟ = dist
• به عنوان یک برنامه تک صفحه پیکربندی شود (همه آدرس ها به /index.html بازنویسی شوند) ؟ (y / N) = Y
• فایل dist / index.html از قبل موجود است. بازنویسی شود؟ (y / N) = N

برنامه ما آماده استقرار است. برای استقرار برنامه در Firebase ، firebase deploy را اجرا کنید.
در آخر ، firebase open hosting: site را اجرا کنید تا برنامه خود را ببینید.

تست با Lighthouse
Lighthouse یک افزونه کروم است که توسط گوگل ساخته شده است. می توان از آن علاوه بر سایر آزمایشات، برای تست میزان سازگاری یک برنامه وب پیشرونده با استاندارد برنامه پیشرونده وب استفاده کرد. بالاترین امتیاز 100٪ و امتیاز PWA برای این برنامه 91٪ است.

نتیجه
برنامه های وب پیشرونده تجربه ای مشابه برنامه های بومی را در اختیار کاربران قرار می دهند. با این حال ، PWA ها سبک تر و بسیار انعطاف پذیر هستند. Angular یک چارچوب محبوب نرم افزار نهایی است. در این مقاله شما یک برنامه وب پیشرونده با Angular ایجاد و از طریق Firebase مستقر کرده اید.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

Express یکی از محبوب ترین چارچوب های Node.js است. Koa یک چارچوب وب جدید است که توسط تیم اکسپرس ایجاد شده است. هدف آن این است که یک نسخه مدرن و مینیمالیستی اکسپرس باشد. برخی از ویژگی های آن پشتیبانی و اتکا به ویژگی های جدید JavaScript مانند ژنراتور و async / await است. Koa همچنین با هیچ میان افزاری ارسال نمی شود اما می توان آن را با استفاده از افزونه های سفارشی و موجود گسترش داد.
با دنبال کردن این مقاله ، با چارچوب Koa بیشتر آشنا می شوید و یک اپلیکیشن درست می کنید تا با عملکرد و فلسفه آن آشنا شوید.
پیش نیازها
برای دنبال کردن این آموزش ، به نصب موارد زیر نیاز دارید:
Node.js و NPM
همچنین نیاز به دانش کار با دستور JavaScript و ES6 دارید.
ستاپ و پیکربندی
برای شروع ، یک دیرکتوری جدید برای پروژه خود ایجاد کنید. این کار با کپی کردن و اجرای دستور زیر در ترمینال شما قابل انجام است:
$ mkdir koala

توجه: شما می توانید پروژه خود را به هر نامی ایجاد کنید ، اما در این مقاله ما از Koala به عنوان نام و دیرکتوری پروژه استفاده خواهیم کرد.

در این مرحله ، شما دایرکتوری پروژه koala را ایجاد کرده اید. در مرحله بعد ، پروژه گره خود را از داخل دیرکتوری شروع می کنید. می توانید با اجرای دستورات زیر این کار را انجام دهید:
$ cd koala

$ npm init koala
پس از اجرای دستور npm init ، اعلان ها را دنبال کنید و جزئیات پروژه خود را پر کنید. در پایان این کار ، یک فایل pack.json با اطلاعاتی که هنگام درخواست از شما وارد کرده اید ، خواهید داشت. توجه داشته باشید که می توانید npm init -y را برای ایجاد فایل pack.json با مقادیر پیش فرض اجرا کنید.
سپس ، برای نصب Koa این دستور را اجرا کنید:
$ npm install koa –save

بسته به نسخه Node موردنظر شما ممکن است نیازی به افزودن فلگ –save نداشته باشید. این فلگ به نسخه های قدیمی تر Node می گوید که کتابخانه نصب شده (در این حالت Koa) را به لیست متعلقات موجود در فایل pack.json شما اضافه کند. در نسخه های Node جدیدتر ، فقط می توانید npm i koa را اجرا کنید تا Koa را نصب کنید.
ایجاد سرور مجازی Koa
در طول راه اندازی و شروع پروژه ، از شما خواسته شد که وارد قسمت ورود برنامه خود شوید. در این مقاله از index.js استفاده خواهید کرد که مقدار پیش فرض به عنوان نقطه ورود شما بود.
ابتدا فایل index.js را ایجاد کنید. این کار را از راه های گوناگون می توان انجام داد. برای کاربران MacOS و Linux ، این کار با اجرای دستور زیر در ترمینال شما قابل انجام است:
$ touch index.js
با استفاده از ویرایشگر کد / متن مورد نظر خود ، پروژه خود را باز کرده و قطعه زیر را در فایل index.js کپی کنید:
// index.js

‘use strict’;

const koa = require(‘koa’)
const app = new koa()

app.use(function *(){
this.body = “Hello World !!!”;
});

app.listen(1234)

در قسمت بالا ، شما یک برنامه koa ایجاد کرده اید که روی پورت 1234 اجرا می شود. می توانید برنامه را با استفاده از دستور زیر اجرا کنید:
$ node index.js

و از برنامه در http: // localhost: 1234 بازدید کنید.
ساخت برنامه شما
همانطور که قبلاً نیز اشاره شد ، Koa.js با هیچ میان افزاری حمل نمی کند و برخلاف ماقبل خود ، یعنی Express ، مسیریابی را به طور پیش فرض انجام نمی دهد.
به منظور اجرای مسیرها در برنامه Koa ، یک کتابخانه میان افزار برای مسیریابی در Koa ، یعنی Koa Routerنصب خواهید کرد. با اجرای این دستور آن را نصب کنید:
$ npm install koa-router –save

برای استفاده از روتر در برنامه خود ، فایل index.js خود را اصلاح کنید:
// index.js

‘use strict’;
const koa = require(‘koa’)
const koaRouter = require(‘koa-router’)

const app = new koa()
const router = new koaRouter()

router.get(‘koala’, ‘/’, (ctx) => {
ctx.body = “Welcome! To the Koala Book of Everything!”
})

app.use(router.routes())
.use(router.allowedMethods())

app.listen(1234, () => console.log(‘running on port 1234’))

در بالا ، شما یک مسیر را بر روی آدرس اصلی برنامه خود تعیین کرده اید (http: // localhost: 1234) و این مسیر را برای برنامه Koa خود ثبت کرده اید.
برای اطلاعات بیشتر در مورد تعریف مسیر در برنامه های Koa.js ، به اسناد کتابخانه Koa Router در این لینک مراجعه کنید.
همانطور که قبلاً گفته شد، Koa به عنوان یک چارچوب حداقلی به کار می رود ، بنابراین ، برای اجرای رندر نمای با موتور قالب باید یک کتابخانه میان افزار را نصب کنید. چندین کتابخانه برای انتخاب وجود دارد اما در این مقاله از koa-ejs استفاده خواهید کرد.
برای این کار ابتدا کتابخانه را با استفاده از دستور زیر نصب کنید:
$ npm install koa-ejs –save

در مرحله بعدی ، فایل index.js خود را اصلاح کنید تا الگوی خود را با قطعه کد زیر ثبت کنید:
// index.js

‘use strict’;
const koa = require(‘koa’)
const path = require(‘path’)
const render = require(‘koa-ejs’)
const koaRouter = require(‘koa-router’)

const app = new koa()
const router = new koaRouter()

render(app, {
root: path.join(__dirname, ‘views’),
layout: ‘layout’,
viewExt: ‘html’,
cache: false,
debug: true
})

router.get(‘koala’, ‘/’, (ctx) => {
ctx.body = “Welcome! To the Koala Book of Everything!”
})

app.use(router.routes())
.use(router.allowedMethods())

app.listen(1234, () => console.log(‘running on port 1234’))

همانطور که در بالا مشاهده شد ، در ثبت نام تمپلیت خود ، دیرکتوری اصلی فایل های نما (view)، بسط فایل های نما و فایل نمای پایه (که نماهای دیگر گسترش می دهند) را به برنامه خود میگویید.
اکنون که میان افزار قالب خود را ثبت کرده اید ، تعریف مسیر خود را برای ارائه یک فایل الگو اصلاح کنید:
// index.js

router.get(‘koala’, ‘/’, (ctx) => {
let koala_attributes = [];
koala_attributes.push({
meta_name: ‘Color’,
meta_value: ‘Black and white’
})
koala_attributes.push({
meta_name: ‘Native Country’,
meta_value: ‘Australia’
})
koala_attributes.push({
meta_name: ‘Animal Classification’,
meta_value: ‘Mammal’
})
koala_attributes.push({
meta_name: ‘Life Span’,
meta_value: ’13 – 18 years’
})
koala_attributes.push({
meta_name: ‘Are they bears?’,
meta_value: ‘no!’
})
return ctx.render(‘index’, {
attributes: koala_attributes
})
})

در بالا ، مسیر پایه شما فایل index.html را که در دیرکتوری نماها موجود است را ارائه می دهد. فایل index.html شما حاوی چند HTML اساسی برای نمایش ویژگی های koala شما است. در زیر مشاهده کنید:
<!– views/index.html –>

<h2>Koala – a directory Koala of attributes</h2>
<ul class=”list-group”>
<% attributes.forEach( function(attribute) { %>
<li class=”list-group-item”>
<%= attribute.meta_name %> – <%= attribute.meta_value %>
</li>
<% }); %>
</ul>

برای دریافت گزینه های بیشتر با استفاده از میان افزار الگوی Koa-ejs ، مطالب کتابخانه را در اینجا مشاهده کنید.
مدیریت خطاها و پاسخ ها
Koa با مشخص کردن زود هنگام میان افزار خطا در فایل ورود به سیستم ، خطاها را مدیریت می کند. میان افزار خطا باید زود تعریف شود زیرا فقط خطاهایی که بعد از معرفی میان افزار خطا ایجاد شده باشند، دریافت میشوند. با استفاده از فایل index.js خود ، آن را تنظیم کنید تا موارد زیر را شامل شود:
// index.js

‘use strict’;
const koa = require(‘koa’)
const render = require(‘koa-ejs’)
const koaRouter = require(‘koa-router’)

const app = new koa()
const router = new koaRouter()

app.use( async (ctx, next) => {
try {
await next()
} catch(err) {
console.log(err.status)
ctx.status = err.status || 500;
ctx.body = err.message;
}
})

بلوک فوق هر گونه خطایی را که هنگام اجرای برنامه شما به وجود آمده است ، دریافت می کند. ما این کار را با ایجاد خطایی در بدنه عملکرد مسیری که تعریف کرده اید آزمایش خواهیم کرد:
// index.js

router.get(‘koala’, ‘/’, (ctx) => {
ctx.throw(‘Test Error Message’, 500)
})

هدف پاسخ Koa معمولاً در آبجکت زمینه آن قرار گرفته است. بیایید با استفاده از تعریف مسیر ، نمونه ای از تنظیم پاسخ ها را نشان دهیم:
// index.js

‘use strict’;
const koa = require(‘koa’)
const koaRouter = require(‘koa-router’)

const app = new koa()
const router = new koaRouter()

app.use( async (ctx, next) => {
try {
await next()
} catch(err) {
console.log(err.status)
ctx.status = err.status || 500;
ctx.body = err.message;
}
})

router.get(‘koala’, ‘/’, (ctx) => {
ctx.status = 200
ctx.body = “Well this is the response body”
})

نتیجه
در این مقاله ، شما مختصراً با Koa و چگونگی اجرای برخی کارکردهای متداول در یک پروژه Koa آشنا شدید. Koa یک چارچوب حداقلی و انعطاف پذیر است که می تواند به قابلیت های بیشتری از آنچه این مقاله نشان داده است ، گسترش یابد. به دلیل مشابه بودن آن به اکپرس ، برخی حتی ماهیت آن را با Express 5.0 توصیف کرده اند.
کل کد این مقاله در Github موجود است و منبع شامل برخی مفاهیم بیشتر میباشد که در اینجا مورد بحث نیستند ، زیرا خارج از محدوده مقدمه میباشند.

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi