سرور مجازی

۱۹ مطلب در دی ۱۴۰۰ ثبت شده است

  • ۰
  • ۰

نحوه استایل دادن به عناصر HTML با حاشیه ها، سایه ها و خطوط در CSS

ورود به سایت

معرفی

کار با سایه‌ها، حاشیه‌ها و خطوط کلی یکی از اجزای کلیدی توسعه وب است و می‌تواند تعریف بصری پیرامون عناصر HTML و آیتم‌های متنی ارائه دهد. ظاهر حاشیه ها و سایه ها را می توان از طریق پنج ویژگی اصلی CSS دستکاری کرد: border، border-radius، box-shadow، text-shadow و outline. سایه ها عمق را فراهم می کنند و به عناصر کمک می کنند تا برجسته شوند، در حالی که ویژگی های حاشیه می توانند عملکردهای بصری مختلفی را انجام دهند، از ایجاد یک تقسیم کننده خطی بین محتوا تا تعریف فضای یک شبکه. ویژگی border-radius گوشه های گردی را روی جعبه ها ایجاد می کند و حتی می تواند یک شکل دایره ای ایجاد کند. در نهایت، outline یک ویژگی است که اغلب نادیده گرفته می شود که بسیاری از عملکردهای مشابه ویژگی مرزی را بدون ایجاد اختلال در جریان محتوا ارائه می دهد.

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

پیش نیازها

  • درک درستی از ویژگی‌های آبشار و ویژگی‌های CSS، که می‌توانید با خواندن نحوه اعمال سبک‌های CSS در HTML با Cascade و Specificity به آن دست پیدا کنید.
  • آشنایی با انتخابگرهای نوع، انتخابگرهای ترکیب‌کننده و گروه‌های انتخابگر، که می‌توانید در نحوه انتخاب عناصر HTML به سبک با CSS بیابید.
  • آشنایی با خواص رنگ در CSS برای اطلاعات بیشتر، نحوه استفاده از مقادیر رنگ با CSS را ببینید.
    آشنایی با گرادیان های CSS با ویژگی های پس زمینه. نحوه اعمال سبک‌های پس‌زمینه به عناصر HTML با CSS را بررسی کنید تا تجربه ایجاد پس‌زمینه گرادیان را به دست آورید.
  • یک فایل HTML خالی که در دستگاه محلی شما به عنوان index.html ذخیره شده است که می توانید از ویرایشگر متن و مرورگر وب انتخابی خود به آن دسترسی داشته باشید. برای شروع، آموزش نحوه تنظیم پروژه HTML خود را بررسی کنید و نحوه استفاده و درک عناصر HTML را برای دستورالعمل‌هایی در مورد نحوه مشاهده HTML خود در مرورگر خود دنبال کنید. اگر در HTML تازه کار هستید، کل نحوه ساخت یک وب سایت در سری HTML را امتحان کنید.

راه اندازی پایه HTML و CSS

در این بخش، پایه HTML را برای تمام سبک های بصری که در طول آموزش می نویسید، تنظیم می کنید. شما همچنین فایل styles.css خود را ایجاد کرده و سبک هایی را اضافه می کنید که طرح بندی محتوا را تنظیم می کند.

با باز کردن index.html در ویرایشگر متن خود شروع کنید. سپس HTML زیر را به فایل اضافه کنید:

index.html

<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Travel Disclosure - Destination: Moon</title>
    <link href="styles.css" rel="stylesheet" />
  </head>
  <body>
  </body>
</html>

تنظیمات صفحه زیادی در عنصر <head> تعریف شده است. اولین عنصر <meta> مجموعه کاراکتری را برای استفاده از متن تعریف می کند. به این ترتیب اکثر کاراکترهای خاص، مانند علائم تاکیدی، بدون کدهای HTML خاص ارائه می شوند. عنصر دوم <meta> به مرورگرها و به ویژه مرورگرهای تلفن همراه می گوید که چگونه با عرض محتوا رفتار کنند. در غیر این صورت، مرورگر عرض دسکتاپ 960 پیکسلی را شبیه سازی می کند. عنصر <title> عنوان صفحه را در اختیار مرورگر قرار می دهد. عنصر <link> فایل CSS را بارگیری می کند که در آن استایل های خود را در طول این آموزش می نویسید.

صفحه همچنین برای استایل دادن به محتوا نیاز دارد. برای متن قانونی، شما از محتوای نمونه از Legal Ipsum به عنوان کپی پرکننده استفاده خواهید کرد که فقط برای اهداف طراحی در نظر گرفته شده است.

در ویرایشگر متن خود به index.html برگردید و HTML برجسته شده را از بلوک کد زیر اضافه کنید:

index.html

<!doctype html>
<html>
  ...
  <body>
    <section class="disclosure-alert">
      <header class="disclosure-header">
        <h2  class="disclosure-title"><em>Destination: Moon</em> Travel Disclosure</h2>
      </header>
      <div class="disclosure-content">
        <p>Although space travel is routine practice, there are many unknown possibilities that any traveller must be aware of before traveling with <em>Destination: Moon</em>. Agreeing to this disclosure of knowns is required prior to purchase of tickets with <em>Destination: Moon</em>. PLEASE, READ AND AGREE TO THE FOLLOWING DISCLOSURE OF TRAVEL UNKNOWNS BEFORE PROCEEDING TO PURCHASE.</p>
        <div class="legal-contents">
          <p>Effect of Termination. Upon termination, You agree not to use it under the terms of Sections 4(a) through 4(e) for that Covered Code, or any third party. Description of Modifications.<p>
          <p>You must make sure that you know you can do these things. To make sure the requirements of this Agreement. REQUIREMENTS A Contributor may participate in any way. Notwithstanding the foregoing, if applicable law or agreed to in writing, the Copyright Holder, but only to the terms applicable to Covered Code. Inability to Comply Due to Statute or Regulation.</p>
          <p>If it is impossible for You to the Recipient retains any such Additional Terms. Versions of This License. If you are re-using, b) a hyperlink (where possible) or URL to the terms of Sections 4(a) through 4(e) for that Work shall terminate if it fails to comply with the exception of content that is granting the License. License Terms 1.</p>
          <p>Grant of Patent Infringement. If you have knowledge of patent infringement litigation, then the only applicable Base Interpreter is a "commercial item" as defined in 48 C.F.R. Consistent with 48 C.F.R.</p>
          <p>U.S. Government End Users acquire Covered Code (Original Code and/or as part of a Larger Work; and b) allow the Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Distributor in writing of such Contributor, if any, to grant more extensive warranty protection to some or all of these conditions: (a) You must make it clear that any Modifications made by such Respondent, or (ii) withdraw Your litigation claim is resolved (such as Wikimedia-internal copying), it is Recipient's responsibility to secure any other exploitation. Program, and in any of the provisions set forth in Section 4(b), you shall terminate if it fails to comply with.</p>
          <p>Please note that these licenses do allow commercial uses of your company or organization, to others outside of this License Agreement), provided that You meet the following terms which differ from this License) and (b) You must duplicate the notice in Exhibit A in each changed file stating how and when you changed the files and the definitions are repeated for your past or future use of the Original Code; or 3) for infringements caused by: i) third party against the drafter will not be used as a handle): 1895.22/1011. This Agreement shall be held by the terms of this agreement. If any provision of this license which gives you legal permission to modify NetHack, or otherwise using this software in source and binary forms, with or without modification in printed materials or in related documentation, stating that you provide a service, including but not limited to the terms under which you distribute, wherever you describe the origin or ownership of such termination, the Recipient a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6b1 or any part of Derivative Works. If You initiate litigation by asserting a patent infringement against You in that instance.</p>
          <p>Effect of New York and the like. While this license document the following disclaimer in the Work contain all the conditions listed in Clause 6 above, concerning changes from the Work. If you created a Modification, you may at your option offer warranty protection to some or all of the Licensed Program as a product of your Modifications available to others outside of this License.</p>
          <p>Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted to Licensor for inclusion in the documentation and/or other rights consistent with this program; if not, write to the modified files to carry prominent notices stating that You distribute, all copyright, patent, trademark, and attribution notices from the Public Domain or from the Original Code; 2) separate from the Public Domain or from the Work, you may distribute a Compiled Work on their system exactly as it is being maintained, then ask the Current Maintainer to update their communication data within one month. If the program is free software; you can change the License will not have to defend and indemnify every other Contributor to control, and cooperate with the Source Code version of the Licensed Program, or any Contributor.</p>
        </div>
        <div class="button-group">
          <a href="#" class="button button-primary">
            Agree
          </a>
          <a href="#" class="button button-secondary">
            Disagree
          </a>
        </div>
      </div>
    </section>
  </body>
</html>

تغییرات خود را در index.html ذخیره کنید و سپس مرورگر وب خود را باز کنید. آیتم منوی File را انتخاب کنید و سپس گزینه Open را انتخاب کنید و فایل index.html خود را در مرورگر بارگذاری کنید. تصویر زیر نحوه نمایش این HTML در مرورگر را نشان می دهد:

یک فایل جدید به نام styles.css در همان دایرکتوری index.html ایجاد کنید، سپس آن را در ویرایشگر متن خود باز کنید. این فایل شامل تمام سبک های استفاده شده در طول آموزش است. اولین مجموعه از سبک ها یک زیبایی شناسی کلی را اعمال می کند که شما از آن خواهید ساخت. CSS را از بلوک کد زیر در فایل styles.css خود اعمال کنید:

styles.css

html, body {
  height: 100%;
}

body {
  display: flex;
  margin: 0;
  font: 100% / 1.5 sans-serif;
  background: url("images/moon-bg.jpg") no-repeat fixed center / cover black;
}
.disclosure-alert {
  background-color: hsl(0, 0%, 95%);
  width: 85%;
  max-width: 48rem;
  margin: auto;
  color: hsl(0, 0%, 20%);
}
.disclosure-header {
  background: linear-gradient(hsl(300, 50%, 20%), hsl(300, 50%, 10%));
  padding: 2rem 0.5rem;
  text-align: center;
  color: hsl(300, 50%, 95%);
}
.disclosure-title {
  margin: 0;
  font-size: 2rem;
  line-height: 1.25;
}
.disclosure-content {
  margin: 1.5rem;
}
.legal-contents {
  margin-top: 1.5rem;
  background-color: white;
  padding: 0.75rem;
  font-family: "Times New Roman", serif;
}
.button-group {
  margin-top: 1.5rem;
  display: flex;
  justify-content: center;
}
.button {
  display: inline-block;
  text-align: center;
  padding: 0.5rem 1rem;
  background: black;
  text-decoration: none;
  color: white;
  width: 50%;
  max-width: 8rem;
}
.button + .button {
  margin-left: 1.5rem;
}
.button-primary {
  background: linear-gradient(to bottom, hsl(200, 100%, 30%), hsl(200, 100%, 20%));
}
.button-primary:hover {
  background: linear-gradient(to bottom, hsl(200, 100%, 25%), hsl(200, 100%, 15%));
}
.button-secondary {
  background: linear-gradient(to bottom, hsl(200, 10%, 30%), hsl(200, 10%, 20%));
}
.button-secondary:hover {
  background: linear-gradient(to bottom, hsl(200, 10%, 25%), hsl(200, 10%, 15%));
}

استایل موجود در این فایل، طرح‌بندی اولیه صفحه را با افشای قانونی متمرکز، دکمه‌هایی با فاصله و رندر با گرادیان خطی، و تصویری از ماه به‌عنوان پس‌زمینه تنظیم می‌کند. قبل از ادامه، حتما فایل styles.css را ذخیره کنید.

برای نمایش تصویر پیوند شده در ویژگی پس‌زمینه مجموعه قوانین بدن، به تصویر پس‌زمینه ماه نیاز دارید. ابتدا یک پوشه images در همان پوشه فایل index.html خود بسازید:

mkdir images

از مرورگر خود برای دانلود این فایل در فهرست تصاویر جدید خود استفاده کنید یا از دستور curl زیر برای دانلود آن از طریق خط فرمان استفاده کنید:

curl -sL https://assets.digitalocean.com/articles/68102/moon-bg.jpg -o images/moon-bg.jpg

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

طول محتوا باعث ایجاد یک صفحه بسیار طولانی می شود. از آنجایی که این به عنوان کپی قانونی در نظر گرفته شده است، محتوای .legal-contents می تواند به فضایی قابل پیمایش تبدیل شود. این کار از طریق ترکیبی از ویژگی های ارتفاع، حداکثر ارتفاع و سرریز انجام می شود.

برای ایجاد یک ناحیه قابل پیمایش، styles.css را در ویرایشگر متن خود باز کنید. سپس ارتفاع محتوای قانونی را با کد زیر تنظیم کنید:

styles.css

...
.legal-contents {
  height: 50vh;
  max-height: 20rem;
  overflow: auto;
  margin-top: 1.5rem;
  background-color: white;
  padding: 0.75rem;
  font-family: "Times New Roman", serif;
}
...

در این کد، یک ویژگی height را در بلوک انتخابگر محتوای قانونی ایجاد کردید، سپس مقدار آن را روی 50vh تنظیم کردید، یعنی 50 درصد از ارتفاع پنجره viewport. شما همچنین یک ویژگی max-height ایجاد کردید که مقدار آن روی 20rem تنظیم شده است. در نهایت، یک ویژگی سرریز با مقدار خودکار اضافه کردید، که در صورت سرریز شدن محتوا از ظرف، نوار اسکرول ایجاد می‌کند.

این موارد اضافه شده را در فایل styles.css خود ذخیره کنید، سپس به مرورگر خود بازگردید و index.html را بازخوانی کنید. ارتفاع کامل صفحه و ظرف اصلی متراکم شده است. اکنون، همانطور که در انیمیشن زیر نشان داده شده است، کپی Legal Ipsum را می توان در داخل ظرف تعیین شده خود پیمایش کرد:

در سراسر این بخش، HTML اصلی را تنظیم می کنید که برای بقیه آموزش استفاده خواهید کرد. شما همچنین یک فضای قابل پیمایش را با ویژگی overflow تنظیم می کنید. در قسمت بعدی با خاصیت border برای اعمال حاشیه بر روی این کانتینرها کار خواهید کرد.

با استفاده از مرز Property

ویژگی border یکی از روش های اصلی اعمال سبک ها در لبه های عناصر است. یک خط به هر رنگی در محیط بیرونی ظرف اعمال می کند. ارزش ملک از سه جزء تشکیل شده است: ضخامت، سبک و رنگ. ویژگی border این مقادیر را برای هر چهار طرف یک عنصر اعمال می کند. می‌توانید تک تک طرف‌ها را با تغییرات جهت حاشیه مشخص کنید، مانند ویژگی border-top، که فقط برای بالای یک عنصر اعمال می‌شود.

برای شروع کار با ویژگی border، styles.css را در ویرایشگر متن خود باز کنید و به انتخابگر کلاس .disclosure-alert بروید. در بلوک انتخابگر، همانطور که در بلوک کد زیر مشخص شده است، یک ویژگی مرزی با مقدار 1px solid hsl (0، 0٪، 0%) اضافه کنید:

styles.css

...
.disclosure-alert {
  background-color: hsl(0, 0%, 95%);
  width: 85%;
  max-width: 48rem;
  margin: auto;
  color: hsl(0, 0%, 20%);
  border: 1px solid hsl(0, 0%, 0%);
}
...

این ویژگی مرزی یک ویژگی مختصر است، یعنی مقدار آن ترکیبی از مقادیر دیگر است. در این مورد، ضخامت 1px مقدار خاصیت عرض حاشیه را نشان می دهد. این مقدار می تواند هر مقدار عددی با یک واحد همراه با چند مقدار نامگذاری شده باشد: نازک، متوسط و ضخیم. در مرحله بعد، solid مقدار به سبک مرزی است که نحوه ظاهر شدن خط اطراف عنصر را مشخص می کند، در این مورد به عنوان یک خط پیوسته و پیوسته. سایر مقادیر برای سبک حاشیه عبارتند از: نقطه چین، چین، دوتایی و هیچ. مقدار نهایی خاصیت border-color را مشخص می کند که می تواند هر مقدار رنگ معتبری باشد.

تغییرات خود را در styles.css ذخیره کنید، سپس index.html را در یک مرورگر وب باز کنید. محفظه محتوای اصلی اکنون دارای یک حاشیه سیاه نازک در اطراف خود خواهد بود، که بیشتر مشهود است زیرا تصویر پس‌زمینه ماه را پوشانده است. تصویر زیر نحوه نمایان شدن حاشیه در قسمت محتوای اصلی را نشان می دهد:

 

در مرحله بعد، می‌توانید از ویژگی border برای ایجاد حس عمق با اعمال برجسته‌ها و سایه‌ها به یک عنصر استفاده کنید. می توانید این کار را با استفاده از یک حاشیه جهت دار در یک طرف که از رنگ پس زمینه روشن تر است و سپس یک رنگ تیره تر در سمت مجاور انجام دهید.

در ویرایشگر متن خود به styles.css برگردید، سپس به بلوک انتخابگر کلاس .disclosure-header بروید. خطی-gradient() در ویژگی پس زمینه یک گرادیان بنفش تیره را تعریف می کند که به یک سایه کمی تیره تر تبدیل می شود. برای ایجاد عمق بیشتر از گرادیان به تنهایی، حاشیه را با کد زیر تنظیم کنید:

 

styles.css

 
...
.disclosure-header {
  background: linear-gradient(hsl(300, 50%, 20%), hsl(300, 50%, 10%));
  padding: 2rem 0.5rem;
  text-align: center;
  color: hsl(300, 50%, 95%);
  border-top: 1px solid hsl(300, 50%, 35%);
  border-bottom: 1px solid hsl(300, 50%, 5%);
}
...
 

شما یک ویژگی border-top با مقدار 1px solid hsl (300، 50٪، 35%) اضافه کردید، که کمی سبکتر از مقدار گرادیان شروع است. سپس، یک ویژگی حاشیه-پایین را با مقدار 1px solid hsl (300، 50٪، 5%) ایجاد کردید، که کمی تیره تر از انتهای گرادیان است.

تغییرات خود را در styles.css ذخیره کنید، سپس به مرورگر بازگردید و index.html را بازخوانی کنید. پس‌زمینه هدر بنفش اکنون کمی برجسته از رنگ بنفش در بالای سرصفحه و سایه‌ای جزئی در امتداد پایین دارد. تصویر زیر نشان می دهد که چگونه در مرورگر ظاهر می شود:

از آنجایی که border یک ویژگی مختصر است، می توانید ویژگی های longhand اضافی اضافه کنید. یک حاشیه می تواند اعمال شود که عرض و سبک دو کلاس دکمه را مشخص می کند، در حالی که یک رنگ حاشیه می تواند روی کلاس های جداگانه اعمال شود.

برای شروع کار با border-color، styles.css را در ویرایشگر متن خود باز کنید. در بلوک انتخاب کننده برای دکمه، یک ویژگی حاشیه با مقدار 1px جامد اضافه کنید، سپس یک ویژگی border-color برای .button-primary و .button-secondary اضافه کنید:

styles.css

...
.button {
  ...
  border: 1px solid;
}
...
.button-primary {
  background: linear-gradient(to bottom, hsl(200, 100%, 30%), hsl(200, 100%, 20%));
  border-color: hsl(200, 100%, 15%);
}
.button-primary:hover {
  background: linear-gradient(to bottom, hsl(200, 100%, 25%), hsl(200, 100%, 15%));
  border-color: hsl(200, 100%, 10%);
}
.button-secondary {
  background: linear-gradient(to bottom, hsl(200, 10%, 30%), hsl(200, 10%, 20%));
  border-color: hsl(200, 10%, 15%);
}
.button-secondary:hover {
  background: linear-gradient(to bottom, hsl(200, 10%, 25%), hsl(200, 10%, 15%));
  border-color: hsl(200, 10%, 10%);
}

این یک حاشیه به سبک جامد با عرض 1 پیکسل برای هر دو دکمه تعریف می کند. سپس، یک ویژگی حاشیه رنگ برای سفارشی کردن رنگ‌ها برای انتخابگرهای حالت .button-primary، .button-secondary و مرتبط با آنها اضافه کردید.

این تغییرات را در styles.css ذخیره کنید، سپس صفحه را در مرورگر وب خود بازخوانی کنید. همانطور که در تصویر زیر نشان داده شده است، دکمه‌ها اکنون با یک حاشیه رنگ تیره‌تر منطبق، تعریف کمی دارند:

در نهایت، هر جهت مرزی نیز مختصری است. این به این معنی است که -width، -style و -color هر کدام می‌توانند برای یک ویژگی جهت اعمال شوند. برای مثال، ویژگی longhand border-right-color فقط یک رنگ را در حاشیه سمت راست اعمال می کند.

برای کار با این ویژگی های حاشیه longhand جهت دار، در ویرایشگر متن خود به styles.css بازگردید. به بلوک انتخابگر .legal-contents بروید و عرض و سبک را برای هر چهار طرف حاشیه تنظیم کنید، سپس رنگ‌های هر طرف را سفارشی کنید:

styles.css

...
.legal-contents {
  height: 50vh;
  max-height: 20rem;
  margin-top: 1.5rem;
  overflow: auto;
  background-color: white;
  border: 1px solid;
  border-top-color: hsl(0, 0%, 65%);
  border-bottom-color: hsl(0, 0%, 100%);
  border-right-color: hsl(0, 0%, 80%);
  border-left-color: hsl(0, 0%, 80%);
  padding: 0.75rem;
  font-family: "Times New Roman", serif;
}
...

در این کد، حاشیه: 1px جامد را به انتهای فایل اضافه کردید. پس از آن، ویژگی های حاشیه-بالا-رنگ، رنگ حاشیه-پایین، رنگ حاشیه-راست-رنگ و رنگ حاشیه-چپ را نیز ایجاد کردید. برای مقادیر، از مقادیر مختلف hsl() برای خاکستری استفاده کردید.

تغییرات خود را در styles.css ذخیره کنید، سپس صفحه را دوباره در مرورگر بارگیری کنید. ظرف محتوی قابل پیمایش اکنون دارای یک حاشیه خاکستری تیره در امتداد بالا، خاکستری کمی روشن تر در طرفین و یک حاشیه سفید در پایین است. این برای این است که این تصور را ایجاد کنیم که محتوا در پشت پس‌زمینه خاکستری روشن قرار می‌گیرد و باعث ایجاد یک اثر می‌شود که برجسته‌سازی در لبه پایینی است، همانطور که در تصویر زیر نشان داده شده است:

در این قسمت از ویژگی border و تغییرات طولانی آن استفاده کردید. شما چندین حاشیه ایجاد کردید که در صورت نیاز به طرف های مختلف اعمال شد. در بخش بعدی، با ویژگی border-radius کار خواهید کرد که اجازه می دهد گوشه های کانتینرها گرد شوند.

اعمال یکborder-radius

گوشه‌های گرد مدت‌ها قبل از اینکه ویژگی حاشیه‌ای برای انجام این کار وجود داشته باشد، یک طراحی زیبایی‌شناسی در وب بوده است. این ویژگی می‌تواند هر واحد عددی یا مقدار درصدی را بپذیرد و یک ویژگی کوتاه‌نویسی مانند خواص حاشیه یا padding است. این بدان معنی است که هر گوشه را می توان به صورت جداگانه در صورت نیاز تنظیم کرد.

برای شروع کار با ویژگی border-radius، styles.css را در ویرایشگر متن خود باز کنید. به بلوک انتخابگر .disclosure-alert و ویژگی border-radius بروید. سپس، مقدار را روی 1.5rem قرار دهید، که این مقدار را در هر چهار گوشه ویژگی اعمال می کند. CSS هایلایت شده در بلوک کد زیر نشان می دهد که چگونه این نوشته شده است:

styles.css

...
.disclosure-alert {
  ...
  border: 1px solid hsl(0, 0%, 0%);
  border-radius: 1.5rem;
}
...

این افزونه را در styles.css ذخیره کنید و سپس index.html را در یک مرورگر وب باز کنید یا به‌روزرسانی کنید. فقط دو گوشه پایینی گرد به نظر می رسد، در حالی که دو گوشه بالایی لبه های نوک تیز باقی می مانند. تصویر زیر نشان می دهد که چگونه این در مرورگر رندر می شود:

 

دلیل اینکه فقط دو گوشه گرد قابل مشاهده است به دلیل نحوه تعامل عناصر نزولی با یکدیگر در وب است. مرورگر در نمایان نگه داشتن محتوا اشتباه می کند. .disclosure-alert دارای چهار گوشه گرد است، اما از آنجایی که .disclosure-header داخل عنصر است و گوشه‌های گرد ندارد، بر گوشه‌های گرد همپوشانی دارد. یک راه حل سریع اضافه کردن سرریز: مخفی به .disclosure-alert است که باعث می‌شود کانتینر هر ظروف و محتوای نزولی را حذف کند. با این حال، این رویکرد می تواند منجر به ناخوانا یا نامرئی شدن محتوای ضروری شود. یک تمرین بهتر این است که یک شعاع مرزی برای کلاس .disclosure-header اعمال کنید تا با منحنی گوشه اجداد خود مطابقت داشته باشد.

برای تنظیم گوشه های همپوشانی، به styles.css در ویرایشگر متن خود بازگردید. به بلوک انتخابگر .disclosure-header بروید و ویژگی border-radius را اضافه کنید. از آنجایی که فقط دو گوشه بالا نیاز به تنظیم دارند، مقدار 1.5rem 1.5rem 0 0 خواهد بود:

styles.css

...
.disclosure-header {
  ...
  border-top: 1px solid hsl(300, 50%, 35%);
  border-bottom: 1px solid hsl(300, 50%, 5%);
  border-radius: 1.5rem 1.5rem 0 0;
}
...

فرمت توسعه‌یافته این مقدار یک منحنی 1.5 میلی‌متری را در گوشه‌های بالا-چپ و بالا-راست اعمال می‌کند.

تغییرات خود را در styles.css ذخیره کنید و index.html را در مرورگر بازخوانی کنید. هدر بنفش اکنون گوشه ای گرد دارد و ظرف اصلی را نمی پوشاند. یک مشکل جدید ظاهر شده است، همانطور که در تصویر بزرگنمایی شده زیر نشان داده شده است، زیرا یک برش سفید از ظرف اصلی از پشت سرصفحه بنفش به اوج می رسد:

گوشه های هر دو .disclosure-alert و .disclosure-header به اندازه 1.5rem هستند، اما عرض آنها تفاوت اندازه دارند. این تفاوت اندازه ناشی از حاشیه سمت چپ و راست عنصر .disclosure-alert است. از آنجایی که عرض حاشیه در هر دو طرف 1px است، تفاوت اندازه آن 2px یا 0.125rem است. برای مطابقت دادن منحنی ها، شعاع مرزی برای .disclosure-header باید 0.125 rem کوچکتر از آنچه در حال حاضر است باشد. همانطور که در بلوک کد زیر مشخص شده است، مقادیر حاشیه 1.5rem را به 1.375rem تغییر دهید:

styles.css

...
.disclosure-header {
  background: linear-gradient(hsl(300, 50%, 20%), hsl(300, 50%, 10%));
  padding: 2rem 0.5rem;
  text-align: center;
  color: hsl(300, 50%, 95%);
  border-top: 1px solid hsl(300, 50%, 35%);
  border-bottom: 1px solid hsl(300, 50%, 5%);
  border-radius: 1.375rem 1.375rem 0 0;
}
...

این تغییر را در styles.css ذخیره کنید و سپس صفحه را در مرورگر وب بازخوانی کنید. برش سفید اکنون از بین رفته است و منحنی های دو عنصر در مکان مناسب به هم می رسند. تصویر بزرگنمایی شده زیر نشان می‌دهد که این منحنی‌ها چگونه کنار هم قرار می‌گیرند:

در نهایت، یک گوشه گرد روی دکمه های پایین ظرف اصلی اعمال می کنید. این دکمه ها به شکل قرص، با بالا و پایین صاف و بلند و کناره های کاملا گرد خواهند بود. برای انجام این کار، مقدار شعاع مرزی باید یک مقدار مبتنی بر واحد بزرگتر از ارتفاع عنصر باشد.

برای ایجاد دکمه ای به شکل قرص، styles.css را در ویرایشگر متن خود باز کنید. در بلوک انتخابگر دکمه، ویژگی border-radius را اضافه کنید و سپس مقدار را روی 2rem قرار دهید. این عدد می‌تواند یک عدد دلخواه باشد تا زمانی که بزرگتر از ارتفاع محاسبه‌شده، ترکیبی از اندازه قلم، ارتفاع خط، لایه‌بندی و عرض حاشیه باشد که می‌تواند بر ارتفاع کلی یک عنصر تاثیر بگذارد. CSS هایلایت شده در بلوک کد زیر نشان می دهد که کجا باید این ویژگی را اضافه کرد:

styles.css

...
.button {
  ...
  border: 1px solid;
  border-radius: 2rem;
}
...

در مورد این رویکرد دو نکته قابل ذکر است. اولین مورد این است که مقدار ارتفاع روی این عنصر تنظیم نشده است. از تنظیم مقدار ارتفاع باید اجتناب شود زیرا محتوا می تواند و در موقعیتی قرار می گیرد که خارج از ظرف جریان داشته باشد. با اجتناب از تعیین ارتفاع، دکمه می تواند رشد کند تا با کل محتوا مطابقت داشته باشد. دوم این است که با یک مقدار مبتنی بر درصد به درستی کار نخواهد کرد. مقادیر مبتنی بر درصد در ویژگی شعاع حاشیه، درصدی از ارتفاع و عرض را منحنی می‌کنند و به جای گوشه‌ای گرد، شکلی بیضی ایجاد می‌کنند.

تغییرات خود را در styles.css ذخیره کنید، سپس به مرورگر بازگردید و index.html را بازخوانی کنید. این صفحه اکنون دو دکمه مستطیلی به شکل قرص را نمایش می دهد، همانطور که در تصویر زیر نشان داده شده است:

در سرتاسر این بخش، شما از ویژگی border-radius برای اعمال گوشه های گرد به چندین عنصر استفاده کردید، و متوجه شدید که یک border-radius مانع از خروج عناصر نزولی از فضای منحنی نمی شود. شما همچنین مقدار شعاع حاشیه را طوری تنظیم کردید که با عرض یک عنصر مطابقت داشته باشد، زمانی که چندین عنصر گرد روی هم قرار می گیرند. در بخش بعدی، از ویژگی text-shadow برای اعمال سایه های در حال پخش بر روی محتوای متن استفاده می کنید.

با استفاده از ویژگی text-shadow

اعمال سایه روی متن کاربردهای زیادی در توسعه روزمره وب دارد. سایه‌ها می‌توانند عمق، جلوه درخشش ایجاد کنند، یا در مکان‌هایی که ممکن است نادیده گرفته شوند، به برجسته‌تر شدن متن کمک کنند. در سرتاسر این بخش، text-shadow را به چندین عنصر برای ایجاد جلوه های بصری مختلف اعمال می کنید.

ویژگی text-shadow حداکثر از چهار مقدار تشکیل شده است: offset محور x، offset محور y، blur radius و color. به عنوان مثال، مقادیر می توانند به این شکل باشند: 2px 4px 10px قرمز. از این چهار مقدار، فقط مقادیر افست مورد نیاز است. رنگ سایه به طور پیش فرض رنگ متن است.

برای شروع کار با text-shadow، با ایجاد یک افکت درخشش در هدر شروع می‌کنید. styles.css را در ویرایشگر متن خود باز کنید و به انتخابگر کلاس .disclosure-header بروید. در بلوک انتخابگر، ویژگی text-shadow زیر را اضافه کنید:

styles.css

...
.disclosure-header {
  ...
  border-radius: 1.375rem 1.375rem 0 0;
  text-shadow: 0 0 0.375rem hsl(300, 50%, 50%);
}
...

جلوه درخشش به این معنی است که رنگ از هر لبه متن بیرون می‌آید، بنابراین مقادیر افست محور x و y در اینجا روی 0 تنظیم می‌شوند. شما تاری برای درخشش را روی 0.375 rem (معادل 6 پیکسل) تنظیم می‌کنید تا کمی ظریف باشد. هاله رنگ به متن در نهایت، مقدار رنگ کمی تیره تر از ویژگی رنگ تنظیم شد: hsl (300، 50٪، 50%).

این افزودنی را در فایل styles.css خود ذخیره کنید. بعد، index.html را در یک مرورگر وب باز کنید. متن عنوان پررنگ در پس‌زمینه گرادیان بنفش اکنون درخششی از بنفش میانی در اطراف خود دارد. تصویر زیر نحوه نمایش این افکت در مرورگر را نشان می دهد:

در مرحله بعد، چندین سایه را می توان روی عناصر متن قرار داد، که امکان ایجاد یک جلوه برجسته روی متن را فراهم می کند. این افکت با قرار دادن یک سایه با رنگ روشن تر در زیر جسم و یک سایه با رنگ تیره در بالا انجام می شود.

برای ایجاد یک جلوه برجسته، به styles.css در ویرایشگر متن خود بازگردید. افکت به دکمه های پایین ظرف اضافه می شود. برای انتخابگرهای .button-primary، .button-primary:hover، .button-secondary و .button-secondary:hover یک ویژگی text-shadow اضافه کنید. CSS هایلایت شده را در بلوک کد زیر برای مقادیر بررسی کنید:

styles.css

...
.button-primary {
  border: 1px solid hsl(200, 100%, 5%);
  background: linear-gradient(to bottom, hsl(200, 100%, 30%), hsl(200, 100%, 20%));
  text-shadow: 0 1px hsl(200, 100%, 50%),
               0 -1px hsl(200, 100%, 5%);
}
.button-primary:hover {
  border: 1px solid hsl(200, 100%, 0%);
  background: linear-gradient(to bottom, hsl(200, 100%, 25%), hsl(200, 100%, 15%));
  text-shadow: 0 1px hsl(200, 100%, 45%),
               0 -1px hsl(200, 100%, 0%);
}
.button-secondary {
  border: 1px solid hsl(200, 10%, 5%);
  background: linear-gradient(to bottom, hsl(200, 10%, 30%), hsl(200, 10%, 20%));
  text-shadow: 0 1px hsl(200, 10%, 50%),
               0 -1px hsl(200, 10%, 5%);
}
.button-secondary:hover {
  border: 1px solid hsl(200, 10%, 0%);
  background: linear-gradient(to bottom, hsl(200, 10%, 25%), hsl(200, 10%, 15%));
  text-shadow: 0 1px hsl(200, 10%, 45%),
               0 -1px hsl(200, 10%, 0%);
}

سایه اول یک برجسته روشن تر از پایین است. این کار با آفست 0 1px و سپس نسخه روشن‌تر رنگ‌های گرادیان پس‌زمینه انجام می‌شود. در مرحله بعد، سایه بالای متن را با آفست 0 -1 پیکسل ایجاد کردید، که سایه را 1 پیکسل به بالا می کشد و از تنوع تیره تری از رنگ های پس زمینه استفاده می کند.

این تغییرات را در styles.css ذخیره کنید، سپس صفحه را در مرورگر وب خود بازخوانی کنید. اکنون متن داخل دکمه‌ها دارای یک برجسته‌سازی جزئی در زیر متن و یک سایه کمی در بالای متن است. ترکیب این مقادیر متن-سایه افکت برجسته را همانطور که در تصویر زیر ارائه می شود ایجاد می کند:

در این بخش، ویژگی text-shadow را روی چند عنصر اعمال کردید. شما یک افکت درخشش روی هدر و یک جلوه برجسته با سایه های متعدد روی دکمه ها ایجاد کردید. در بخش بعدی، سایه هایی را با ویژگی box-shadow به عناصر HTML اعمال می کنید.

افزودن box-shadow به عناصر

همانطور که ویژگی text-shadow به محتوای متن اجازه می دهد سایه داشته باشد، ویژگی box-shadow نیز به عناصر و کانتینرها اجازه می دهد سایه داشته باشند. box-shadow دارای دو ویژگی اضافی است که در این بخش بررسی خواهید کرد، از جمله توانایی کنترل گسترش تاری و تنظیم سایه در داخل عنصر.

برای شروع کار با ویژگی box-shadow، styles.css را در ویرایشگر متن خود باز کنید. در بلوک انتخابگر .disclosure-alert، ویژگی box-shadow را اضافه کنید. درست مانند text-shadow، مقادیر افست محور x و y مورد نیاز است و اگر رنگی ارائه نشده باشد، از مقدار ویژگی رنگ استفاده می شود. برای اولین کادر سایه، offset ها را روی 0، blur را روی 0.5rem، و رنگ را روی یک hsl تیره (300، 40٪، 5%) تنظیم کنید، همانطور که در بلوک کد زیر مشخص شده است:

styles.css

...
.disclosure-alert {
  ...
  border-radius: 1.5rem;
  text-shadow: 0 0 0.375rem hsl(300, 50%, 50%);
  box-shadow: 0 0 0.5rem hsl(300, 40%, 5%);
}
...

تغییرات را در styles.css ذخیره کنید و صفحه را در مرورگر وب خود بازخوانی کنید. اکنون یک سایه سیاه تقریباً از ظرف پخش شده است. همچنین توجه داشته باشید که سایه به منحنی هایی که با ویژگی border-radius ایجاد کرده اید احترام گذاشته و از آنها پیروی می کند. تصویر زیر نشان می دهد که چگونه این در مرورگر ارائه می شود:

در مرحله بعد، به styles.css بازگردید و با افزودن دو افکت درخشش بزرگ اضافی به box-shadow شروع به ایجاد یک افکت پیچیده تر کنید. بین هر سایه جدید یک کاما اضافه کنید، و هر کدام را به گونه‌ای تنظیم کنید که آفست محور y 0.5rem باشد. سپس تاری های بزرگ را تنظیم کنید و از تغییرات کم رنگ آبی و بنفش از پالت رنگ استفاده کنید، همانطور که در بلوک کد زیر مشخص شده است:

styles.css

...
.disclosure-alert {
  ...
  box-shadow: 0 0 0.5rem hsl(300, 40%, 5%),
              0 0.5rem 6rem hsl(200, 40%, 30%),
              0 0.5rem 10rem hsl(300, 40%, 30%);
}
...

ترتیب این سایه ها مهم است. اولین سایه با رنگ تقریبا مشکی در بالای سایه های جدید ارائه می شود و هر سایه بعدی پشت سایه بعدی اضافه می شود.

تغییرات خود را در styles.css ذخیره کنید و صفحه را در مرورگر خود بازخوانی کنید. همانطور که در تصویر زیر نشان داده شده است، ترکیب سایه های متعدد جلوه ای منحصر به فرد را ارائه می دهد:

ویژگی گسترش تاری ویژگی box-shadow را می توان برای ایجاد احساس عمق استفاده کرد. ارزش اسپرد هر دو ارزش مثبت و منفی را می پذیرد. گسترش ارزش منفی همراه با یک افست قوی و تاری سایه ای ایجاد می کند که دور و دور از ظرف منبع ایجاد می کند.

برای شروع، به styles.css در ویرایشگر متن خود بازگردید. بین سایه کوچک تیره و سایه آبی بزرگتر در انتخابگر .disclosure-alert، CSS هایلایت شده زیر را از بلوک کد اضافه کنید:

styles.css

...
.disclosure-alert {
  ...
  box-shadow: 0 0 0.5rem hsl(300, 40%, 5%),
              0 6rem 4rem -2rem hsl(300, 40%, 5%),
              0 0.5rem 6rem hsl(200, 40%, 30%),
              0 0.5rem 10rem hsl(300, 40%, 30%);
}
...

این اضافه شدن به مجموعه سایه، افست محور x را روی 0 نگه می دارد، اما محور y را به طور قابل توجهی به 6rem می رساند. بعد، تاری به اندازه درخشش بزرگ نیست، اما در اندازه مناسب 4 rem است. سپس به مقدار گسترش blur می رسد که در این حالت روی -2rem تنظیم می شود. مقدار پیش فرض اسپرد 0 است که برابر با ظرف است. در -2rem، گسترش از ظرف به سمت داخل متراکم می شود تا جلوه بصری عمق ایجاد کند.

تغییرات خود را در styles.css ذخیره کنید، سپس index.html را در مرورگر بازخوانی کنید. سایه یک رنگ بنفش تیره است که این حس را ایجاد می کند که جعبه محتوای اصلی به خوبی بالای سطح ماه شناور است، همانطور که در تصویر زیر نشان داده شده است:

یکی دیگر از موارد استفاده از box-shadow ایجاد یک هایلایت و افکت مخروطی سایه است، همانطور که قبلاً با ویژگی border در هدر انجام دادید. مزیت استفاده از box-shadow به جای حاشیه این است که بر مدل جعبه تأثیر نمی گذارد، که باعث تغییر در جریان محتوا می شود. همچنین می توان از آن در ارتباط با حاشیه استفاده کرد. هنگام استفاده از این افکت با حاشیه، مقدار inset باید به box-shadow اضافه شود تا سایه در داخل ظرف باشد.

برای شروع استفاده از مقدار inset در box-shadow، styles.css را در ویرایشگر متن خود باز کنید. این افکت به دکمه‌ها اضافه می‌شود، بنابراین شما این استایل‌ها را در .button-primary، .button-primary:hover، .button-secondary و .button-secondary:hover اعمال خواهید کرد. مانند text-shadow، این شامل یک ترکیب افست 0 1px و 0 -1px خواهد بود. تفاوت این است که کلمه inset را می توان به ابتدا یا انتهای مقدار اضافه کرد، همانطور که در بلوک کد زیر مشخص شده است:

styles.css

...
.button-primary {
  ...
  text-shadow: 0 1px hsl(200, 100%, 50%),
               0 -1px hsl(200, 100%, 5%);
  box-shadow: inset 0 1px hsl(200, 100%, 50%),
              inset 0 -1px hsl(200, 100%, 15%);
}
.button-primary:hover {
  ...
  text-shadow: 0 1px hsl(200, 100%, 45%),
               0 -1px hsl(200, 100%, 0%);
  box-shadow: inset 0 1px hsl(200, 100%, 45%),
              inset 0 -1px hsl(200, 100%, 10%);
}
.button-secondary {
  ...
  text-shadow: 0 1px hsl(200, 10%, 50%),
               0 -1px hsl(200, 10%, 5%);
  box-shadow: inset 0 1px hsl(200, 10%, 50%),
              inset 0 -1px hsl(200, 10%, 15%);
}
.button-secondary:hover {
  ...
  text-shadow: 0 1px hsl(200, 10%, 45%),
               0 -1px hsl(200, 10%, 0%);
  box-shadow: inset 0 1px hsl(200, 10%, 45%),
              inset 0 -1px hsl(200, 10%, 10%);
}

این تغییرات را در styles.css ذخیره کنید و سپس index.html را در مرورگر خود refresh کنید. اکنون دکمه ها دارای یک برجسته و یک سایه هستند، شبیه به متن. این ترکیب با پس‌زمینه گرادیان، جلوه‌ای ساده و در عین حال متمایز برای دکمه‌ها ایجاد می‌کند. تصویر زیر نشان می دهد که چگونه این در مرورگر ارائه می شود:

 

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

برای شروع ایجاد این افکت، styles.css را در ویرایشگر متن خود باز کنید. به انتخابگر کلاس .legal-contents بروید و یک ویژگی box-shadow اضافه کنید. این سایه از سه سایه تشکیل خواهد شد. اولی یک سایه کوتاه در اطراف داخل کل ظرف ایجاد می کند و دو مورد بعدی یک سایه روشن دراز در بالا و پایین عنصر ایجاد می کند. CSS هایلایت شده در بلوک کد زیر نحوه تنظیم این را نشان می دهد:

styles.css

...
.legal-contents {
  ...
  font-family: "Times New Roman", serif;
  box-shadow: 0 0 0.25rem hsl(0, 0%, 80%) inset,
              0 4rem 2rem -4rem hsl(0, 0%, 85%) inset,
              0 -4rem 2rem -4rem hsl(0, 0%, 85%) inset;
}
...

تغییرات خود را در styles.css ذخیره کنید، سپس صفحه را در مرورگر بازخوانی کنید. اکنون سایه‌ها جلوه‌ای ایجاد می‌کنند که باعث می‌شود متن قانونی مانند پنجره‌ای به داخل ظرف ظاهر شود. سایه ها همچنین به تقویت رنگ های حاشیه ای که روی این عنصر اعمال شده اند کمک می کند. تصویر زیر نشان می دهد که چگونه این در مرورگر رندر می شود:

در این قسمت ویژگی box-shadow را عملی می کنید. شما همچنین از ویژگی‌های پخش تاری و درج کردن جعبه سایه استفاده کردید تا گزینه‌های یک ظاهر طراحی بیشتری داشته باشید. در بخش آخر، ویژگی outline را پیاده سازی می کنید، سپس از box-shadow برای ایجاد یک طرح کلی همه کاره تر استفاده می کنید.

با استفاده از ویژگی طرح کلی

آخرین ویژگی که بر لبه های عناصر تأثیر می گذارد، ویژگی outline است. در تمام مرورگرها، حالت :focus عناصر با استفاده از ویژگی outline ساخته می‌شود. با این حال، اجرای سبک :focus پیش فرض هر مرورگر به طور قابل توجهی متفاوت است. ویژگی outline شبیه به ویژگی border است، به جز دو تفاوت کلیدی: تغییرات خاصیت جهت دار را ندارد و مدل جعبه را تحت تأثیر قرار نمی دهد. آخرین مورد از این دو تفاوت، آن را برای سبک‌های فوکوس ایده‌آل می‌کند، زیرا نشانگر بصری عنصر فعال را بدون ایجاد اختلال در جریان محتوا ارائه می‌کند.

برای مشاهده پیش فرض مرورگر حالت :focus، index.html را در مرورگر خود باز کنید. از کلید TAB برای پیمایش در صفحه استفاده کنید تا زمانی که یکی از دکمه های پایین فوکوس شود. بسته به اینکه از چه مرورگری استفاده می کنید، ممکن است نتوانید سبک های پیش فرض :focus را ببینید. به عنوان مثال، فایرفاکس یک طرح کلی با نقطه سفید را نشان می دهد، اما در پس زمینه خاکستری روشن قابل درک نیست. تصویر زیر از چپ به راست نشان می دهد که چگونه سبک فوکوس پیش فرض در فایرفاکس، سافاری و کروم ظاهر می شود:

برای شروع سفارشی کردن حالت :focus خود با ویژگی outline، styles.css را در ویرایشگر متن خود باز کنید. به انتخابگر کلاس .button بروید و ویژگی outline را اضافه کنید:

styles.css

...
.button {
  ...
}
.button:focus {
  outline: 0.25rem solid hsl(200, 100%, 50%);
}
...

همانند ویژگی border، مقدار طرح کلی شامل یک مقدار عرض، سبک و رنگ است. از آنجایی که هدف یک حالت فوکوس جلب توجه به یک عنصر است، عرض به 0.25rem افزایش می یابد که معادل 4px است. در مرحله بعد، استایل را روی حالت جامد قرار می دهید تا حالت فوکوس بیشتر شبیه سافاری و کروم باشد. در نهایت، رنگ را با hsl (200، 100، 50%) روی آبی تیره قرار می دهید.

تغییرات خود را در styles.css ذخیره کنید، سپس به مرورگر خود بازگردید و صفحه را بازخوانی کنید. یک بار دیگر، مرورگر نحوه نمایش طرح کلی را تعیین می کند. تصویر زیر نشان می دهد که این سبک ها در فایرفاکس، سافاری و کروم از چپ به راست چگونه هستند:

در هر سه مرورگر، ویژگی outline کاملاً متفاوت نمایش داده می شود. فایرفاکس دور کل شکل گرد دکمه را محکم نگه می دارد. سافاری یک کادر با زاویه راست ایجاد می کند، اما لبه های دکمه را لمس می کند. کروم شبیه سافاری است، اما فضای اضافی بین دکمه و طرح کلی اضافه می کند.

برای ایجاد سبکی که در همه مرورگرها شبیه به فایرفاکس باشد، به جای طرح کلی، باید از box-shadow استفاده کنید.

برای شروع ایجاد حالت :focus سفارشی تر، به فایل styles.css خود در ویرایشگر متن خود بازگردید. اولین کاری که باید انجام دهید این است که سبک طرح کلی پیش فرض مرورگر را با تغییر مقدار .button:focus نمایه انتخابگر به none غیرفعال کنید، همانطور که در بلوک کد زیر مشخص شده است:

styles.css

...
.button {
  ...
}
.button:focus {
  outline: none;
}
...

سپس، به انتخابگرهای button-primary:hover و button-secondary:hover بروید و یک کاما به دنبال آن یک تغییر حالت :focus اضافه کنید، همانطور که در بلوک کد زیر مشخص شده است:

styles.css

...

.button-primary {
  ...
}
.button-primary:hover,
.button-primary:focus {
  ...
}
.button-secondary {
  ...
}
.button-secondary:hover,
.button-secondary:focus {
  ...
}

در نهایت، دو انتخابگر جدید برای هر دکمه ایجاد کنید: فوکوس، .button-primary: focus، و .button-secondary:focus. در داخل بلوک‌های انتخابگر جدید، یک ویژگی box-shadow جدید با همان سایه‌های داخلی از همتای :hover، :focus آن‌ها اضافه کنید. سپس، سایه دیگری را با offset ها به مجموعه اضافه کنید و همه را روی 0 تار کنید. پس از آن، یک اسپرد 0.25rem اضافه کنید، که یک خط ثابت و غیر تار در اطراف عنصر ایجاد می کند. در نهایت رنگ یکسان را به هر دو نمونه اضافه کنید. CSS هایلایت شده در بلوک کد زیر نشان می دهد که چگونه این نوشته شده است:

styles.css

...

.button-primary {
  ...
}
.button-primary:hover,
.button-primary:focus {
  ...
}
.button-primary:focus {
  box-shadow: inset 0 1px hsl(200, 100%, 45%),
              inset 0 -1px hsl(200, 100%, 10%),
              0 0 0 0.25rem hsl(200, 100%, 50%);
}
.button-secondary {
  ...
}
.button-secondary:hover,
.button-secondary:focus<^> {
  ...
}
.button-secondary:focus {
  box-shadow: inset 0 1px hsl(200, 10%, 45%),
              inset 0 -1px hsl(200, 10%, 10%),
              0 0 0 0.25rem hsl(200, 100%, 50%);
}

این تغییرات را در styles.css ذخیره کنید و برای بازخوانی index.html به مرورگر خود بازگردید. اکنون، همانطور که از کلید TAB برای پیمایش در صفحه استفاده می کنید. صرف نظر از مرورگر، سبک :focus روی دکمه ها اکنون یکسان به نظر می رسد. تصویر زیر نشان می دهد که چگونه نسخه box-shadow یک طرح کلی به همراه کل صفحه در مرورگر ظاهر می شود:

این بخش آخر شما را با ویژگی outline و نحوه استفاده هر مرورگر از آن به روش های مختلف آشنا کرد. حداقل، یک نشانگر :focus برای دسترسی مورد نیاز است و ویژگی outline کار را انجام می دهد. با گسترش این موضوع، شما همچنین با ایجاد یک جعبه سایه با ارزش گسترش زیاد، یک سبک فوکوس پیشرفته‌تر و سازگارتر از نظر بصری ایجاد کردید.

نتیجه

سبک دادن به لبه های عناصر به طراحی یک وب سایت اجازه می دهد تا تنوع و توجه را به خود جلب کند. ویژگی border می تواند به ارائه تعریف و تفکیک بین محتوا کمک کند. ویژگی حاشیه-شعاع زیبایی شناسی را نرم می کند و به تعریف نگرش طرح کمک می کند. سایه های روی متن و جعبه ها عمق می بخشد و به جلب توجه به محتوا کمک می کند. در نهایت، ویژگی outline راه‌های در دسترس را برای جلب توجه به عناصر با فوکوس صفحه کلید فراهم می‌کند. در این آموزش، شما از تمام این ویژگی ها برای ایجاد یک صفحه وب از نظر بصری جالب و قابل استفاده استفاده کردید. درک هر یک از این ویژگی ها و نحوه و زمان استفاده از آنها به حل انواع مشکلات رابط فرانت اند و ایجاد تجربیات جدید کمک می کند.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:CSSVPS یا سرور مجازیآشنایی با خواص رنگ در CSSایجاد سرور مجازیایجاد یکborder-radiusخرید سرور مجازیراه اندازی پایه HTMLراه اندازی پایه HTML و CSSسرورمجازیسرورمجازی آمریکا

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه بازنشانی رمز عبور MySQL یا MariaDB Root در اوبونتو 20.04

ورود به سایت

معرفی

رمز عبور پایگاه داده خود را فراموش کرده اید؟ برای بهترین ما اتفاق می افتد. اگر رمز عبور اصلی پایگاه داده MySQL یا MariaDB خود را فراموش کرده یا گم کرده اید، اگر به سرور و یک حساب کاربری با امتیازات sudo دسترسی دارید، همچنان می توانید دسترسی داشته باشید و رمز عبور را بازنشانی کنید.

این آموزش نشان می دهد که چگونه رمز عبور ریشه برای پایگاه های داده MySQL و MariaDB نصب شده با مدیر بسته apt در اوبونتو 20.04 را بازنشانی کنید. روش تغییر رمز عبور ریشه بسته به اینکه MySQL یا MariaDB را نصب کرده باشید و پیکربندی سیستمی پیش‌فرض که با توزیع یا بسته‌های فروشندگان دیگر ارسال می‌شود، متفاوت است. در حالی که دستورالعمل‌های این آموزش ممکن است با سایر نسخه‌های سرور سیستم یا پایگاه داده کار کند، اما با Ubuntu 20.04 و بسته‌های عرضه‌شده توسط توزیع آزمایش شده‌اند.

پیش نیازها

برای بازیابی رمز عبور ریشه MySQL یا MariaDB، به موارد زیر نیاز دارید:

  • دسترسی به سرور اوبونتو 20.04 در حال اجرا MySQL یا MariaDB با کاربر sudo یا راه دیگری برای دسترسی به سرور با امتیازات ریشه.
  • برای اینکه روش های بازیابی را در این آموزش بدون تاثیر روی سرور تولید خود آزمایش کنید، یک سرور آزمایشی ایجاد کنید و سپس آموزش اولیه راه اندازی سرور ما را دنبال کنید. مطمئن شوید که یک کاربر معمولی و غیر ریشه با امتیازات sudo ایجاد کنید. سپس MySQL را طبق راهنمای ما در مورد نحوه نصب MySQL در اوبونتو 20.04 نصب کنید یا MariaDB را به دنبال نحوه نصب MariaDB در اوبونتو 20.04 نصب کنید.

مرحله 1 – شناسایی نسخه پایگاه داده و توقف سرور

اوبونتو 20.04 یا MySQL یا MariaDB را اجرا می‌کند—یک جایگزین محبوب که با MySQL سازگار است. بسته به اینکه کدام یک از آنها را نصب کرده اید، باید از دستورات مختلفی برای بازیابی رمز عبور root استفاده کنید، بنابراین مراحل این بخش را دنبال کنید تا مشخص کنید کدام سرور پایگاه داده را اجرا می کنید.

نسخه خود را با دستور زیر بررسی کنید:

mysql –version

اگر MariaDB را اجرا می کنید، “MariaDB” را با شماره نسخه در خروجی مشاهده خواهید کرد:

 

MariaDB output

mysql  Ver 15.1 Distrib 10.3.25-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

اگر MySQL را اجرا می کنید، خروجی مانند زیر را خواهید دید:

 

MySQL output

mysql  Ver 8.0.22-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))

به پایگاه داده ای که در حال اجرا هستید توجه کنید. این دستورات مناسب را برای دنبال کردن در ادامه این آموزش تعیین می کند.

برای تغییر رمز عبور ریشه، باید سرور پایگاه داده را خاموش کنید. اگر MariaDB را اجرا می کنید، می توانید این کار را با دستور زیر انجام دهید:

sudo systemctl stop mariadb

برای MySQL، سرور پایگاه داده را با اجرای زیر خاموش کنید:

sudo systemctl stop mysql

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

مرحله 2 – راه اندازی مجدد سرور پایگاه داده بدون بررسی مجوز

اجرای MySQL و MariaDB بدون بررسی مجوز امکان دسترسی به خط فرمان پایگاه داده با امتیازات root را بدون ارائه رمز عبور معتبر فراهم می کند. برای انجام این کار، باید پایگاه داده را از بارگیری جداول کمک هزینه، که اطلاعات امتیازات کاربر را ذخیره می کند، متوقف کنید. از آنجایی که این کمی یک خطر امنیتی است، ممکن است بخواهید شبکه را غیرفعال کنید تا از اتصال سایر کلاینت ها به سرور آسیب پذیر موقت جلوگیری کنید.

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

پیکربندی MariaDB برای شروع بدون Grant Tables

برای راه‌اندازی سرور MariaDB بدون جداول کمک هزینه، از فایل unit systemd برای تنظیم پارامترهای اضافی برای سرور MariaDB استفاده می‌کنیم.

دستور زیر را اجرا کنید، که متغیر محیطی MYSQLD_OPTS مورد استفاده توسط MariaDB را هنگام راه اندازی تنظیم می کند. گزینه های –skip-grant-tables و –skip-networking به MariaDB می گویند که بدون بارگیری جداول کمک هزینه یا ویژگی های شبکه راه اندازی شود:

sudo systemctl set-environment MYSQLD_OPTS=”–skip-grant-tables –skip-networking”

سپس سرور MariaDB را راه اندازی کنید:

sudo systemctl start mariadb

این دستور هیچ خروجی تولید نمی کند، اما با در نظر گرفتن تنظیمات متغیر محیط جدید، سرور پایگاه داده را مجددا راه اندازی می کند.

می توانید مطمئن شوید که با sudo systemctl status mariadb شروع شده است.

اکنون باید بتوانید به عنوان کاربر ریشه MariaDB بدون ارائه رمز عبور به پایگاه داده متصل شوید:

sudo mysql -u root

بلافاصله یک درخواست پوسته پایگاه داده را خواهید دید

اکنون که به سرور پایگاه داده دسترسی دارید، می توانید رمز عبور root را همانطور که در مرحله 3 نشان داده شده است تغییر دهید.

پیکربندی MySQL برای شروع بدون Grant Tables

برای راه‌اندازی سرور MySQL بدون جداول کمکی آن، پیکربندی systemd را برای MySQL تغییر می‌دهید تا هنگام راه‌اندازی، پارامترهای اضافی خط فرمان را به سرور ارسال کنید.

برای این کار دستور زیر را اجرا کنید:

sudo systemctl edit mysql

این دستور یک فایل جدید را در ویرایشگر نانو باز می کند که از آن برای ویرایش سرویس های MySQL استفاده می کنید. اینها پارامترهای سرویس پیش فرض MySQL را تغییر می دهند.

این فایل خالی خواهد بود. مطالب زیر را اضافه کنید:

MySQL service overrides

[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --skip-grant-tables --skip-networking

اولین عبارت ExecStart مقدار پیش‌فرض را پاک می‌کند، در حالی که دستور دوم دستور راه‌اندازی جدید، از جمله پارامترهایی برای غیرفعال کردن بارگیری جداول اعطایی و قابلیت‌های شبکه را در اختیار systemd قرار می‌دهد.

CTRL-x را برای خروج از فایل فشار دهید، سپس Y را فشار دهید تا تغییراتی که ایجاد کرده اید ذخیره شود، سپس برای تایید نام فایل، ENTER را فشار دهید.

برای اعمال این تغییرات، پیکربندی systemd را دوباره بارگیری کنید:

sudo systemctl daemon-reload

اکنون سرور MySQL را راه اندازی کنید:

sudo systemctl start mysql

فرمان هیچ خروجی نشان نمی دهد، اما سرور پایگاه داده شروع به کار می کند. جداول کمک هزینه و شبکه فعال نخواهد شد.

به عنوان کاربر ریشه به پایگاه داده متصل شوید:

sudo mysql -u root

بلافاصله یک درخواست پوسته پایگاه داده را خواهید دید

اکنون که به سرور دسترسی دارید، می توانید رمز عبور root را تغییر دهید.

مرحله 3 – تغییر رمز عبور ریشه

سرور پایگاه داده اکنون در حالت محدود در حال اجرا است. جداول کمک هزینه بارگیری نمی شوند و هیچ پشتیبانی شبکه ای فعال نیست. این به شما امکان می دهد بدون ارائه رمز عبور به سرور دسترسی داشته باشید، اما شما را از اجرای دستوراتی که داده ها را تغییر می دهند منع می کند. برای بازنشانی رمز عبور ریشه، اکنون که به سرور دسترسی پیدا کرده اید، باید جداول کمک هزینه را بارگیری کنید.

با صدور دستور FLUSH PRIVILEGES به سرور پایگاه داده بگویید جداول کمک هزینه را دوباره بارگیری کند:

FLUSH PRIVILEGES;

اکنون می توانید رمز عبور root را تغییر دهید. روشی که استفاده می کنید بستگی به این دارد که آیا از MariaDB یا MySQL استفاده می کنید.

تغییر رمز عبور MariaDB

اگر از MariaDB استفاده می‌کنید، عبارت زیر را برای تنظیم رمز عبور برای حساب اصلی اجرا کنید، و مطمئن شوید که new_password را با یک رمز عبور قوی جدید جایگزین کنید که به خاطر بسپارید:

ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new_password’;

این خروجی را خواهید دید که نشان می دهد رمز عبور تغییر کرده است:

 

Output

Query OK, 0 rows affected (0.001 sec)

MariaDB امکان استفاده از مکانیزم های احراز هویت سفارشی را فراهم می کند، بنابراین دو عبارت زیر را اجرا کنید تا مطمئن شوید که MariaDB از مکانیسم احراز هویت پیش فرض خود برای رمز عبور جدیدی که به حساب root اختصاص داده اید استفاده می کند:

UPDATE mysql.user SET authentication_string = ” WHERE user = ‘root’;
UPDATE mysql.user SET plugin = ” WHERE user = ‘root’;

خروجی زیر را برای هر عبارت خواهید دید:

 

Output

Query OK, 0 rows affected (0.01 sec)

رمز عبور اکنون تغییر کرده است. برای خروج از کنسول MariaDB عبارت exit را تایپ کنید و برای راه اندازی مجدد سرور پایگاه داده در حالت عادی به مرحله 4 بروید.

تغییر رمز عبور MySQL

برای MySQL، عبارت زیر را اجرا کنید تا رمز عبور کاربر اصلی را تغییر دهید، و new_password را با یک رمز عبور قوی که به خاطر بسپارید جایگزین کنید. MySQL امکان استفاده از مکانیسم‌های احراز هویت سفارشی را فراهم می‌کند، بنابراین عبارت زیر همچنین مطمئن می‌شود که MySQL از مکانیسم احراز هویت پیش‌فرض خود برای احراز هویت کاربر root با استفاده از رمز عبور جدید استفاده می‌کند:

ALTER USER ‘root’@’localhost’ IDENTIFIED WITH caching_sha2_password BY ‘new_password’;

این خروجی را مشاهده خواهید کرد که نشان می دهد رمز عبور با موفقیت تغییر کرده است:

 

Output

Query OK, 0 rows affected (0.01 sec)

رمز عبور اکنون تغییر کرده است. با تایپ exit از کنسول MySQL خارج شوید.

بیایید پایگاه داده را در حالت عملیاتی معمولی راه اندازی مجدد کنیم.

مرحله 4 – سرور پایگاه داده خود را به تنظیمات عادی برگردانید

برای راه اندازی مجدد سرور پایگاه داده در حالت عادی خود، باید تغییراتی را که ایجاد کرده اید برگردانید تا شبکه فعال شود و جداول کمک هزینه بارگذاری شوند. باز هم، روشی که استفاده می کنید بستگی به این دارد که آیا از MariaDB یا MySQL استفاده کرده اید.

برای MariaDB، متغیر محیطی MYSQLD_OPTS را که قبلا تنظیم کرده بودید، از حالت تنظیم خارج کنید:

sudo systemctl unset-environment MYSQLD_OPTS

سپس، سرویس را با استفاده از systemctl راه اندازی مجدد کنید:

sudo systemctl restart mariadb

برای MySQL، پیکربندی اصلاح شده systemd را حذف کنید:

sudo systemctl revert mysql

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

 

Output

Removed /etc/systemd/system/mysql.service.d/override.conf.
Removed /etc/systemd/system/mysql.service.d.

سپس، پیکربندی systemd را دوباره بارگیری کنید تا تغییرات اعمال شود:

sudo systemctl daemon-reload

در نهایت سرویس را مجددا راه اندازی کنید:

sudo systemctl restart mysql

اکنون پایگاه داده مجدداً راه اندازی شده و به حالت عادی خود بازگشته است. با ورود به عنوان کاربر اصلی با رمز عبور، تأیید کنید که رمز عبور جدید کار می کند:

mysql -u root -p

از شما یک رمز عبور خواسته می شود. رمز عبور جدید خود را وارد کنید و همانطور که انتظار می رود به اعلان پایگاه داده دسترسی پیدا خواهید کرد.

نتیجه

شما دسترسی مدیریتی به سرور MySQL یا MariaDB را بازیابی کرده اید. مطمئن شوید رمز عبور جدیدی که انتخاب کرده اید قوی و ایمن است و آن را در مکانی امن نگه دارید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

MySQLاوبونتو 20.04بازیابی رمز عبور MariaDBپایگاه داده MySQLپیکربندی MariaDBخرید سرورخرید سرور لینوکسراه اندازی مجدد سرورراه‌اندازی سرور MySQLسرور مجازیفراموش کردن رمز پایگاه دادهنحوه بازنشانی رمز عبور MySQL

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از Opacity و Transparency برای ایجاد یک Modal در CSS

ورود به سایت

معرفی

هنگام استایل‌سازی HTML با CSS، راه‌های متعددی برای تنظیم شفافیت عناصر و دلایل متعددی برای استفاده از این افکت در طراحی وجود دارد. کدورت می‌تواند به نرم کردن سایه، کاهش تاکید بر محتوای غیر ضروری در طول یک کار خاص، یا محو کردن محتوا در داخل یا خارج از دید کمک کند. شما می‌توانید این افکت‌ها را با ویژگی opacity، نام رنگ شفاف یا کانال‌های آلفا، که بسط مقادیر رنگ با یک بخش اضافی برای کنترل کدورت هستند، انجام دهید.

در طول این آموزش، شما از روش‌های مختلفی برای اعمال کدورت و خواص اضافی برای انجام مؤثر جلوه‌های خاص استفاده خواهید کرد. شما یک مودال ایجاد خواهید کرد که با رویکرد بدون جاوا اسکریپت با استفاده از کلاس شبه :target و ویژگی های opacity، pointer-events و transition ظاهر می شود. سپس از هر یک از مقادیر رنگ کانال آلفا برای ایجاد همپوشانی سایه، حاشیه و محتوا استفاده خواهید کرد. شما همچنین از مقدار رنگ شفاف برای کمک به ایجاد شیب متحرک رنگ ها در یک رویداد :hover استفاده خواهید کرد.

پیش نیازها

  • درک درستی از ویژگی‌های آبشار و ویژگی‌های CSS، که می‌توانید با خواندن نحوه اعمال سبک‌های CSS در HTML با Cascade و Specificity به آن دست پیدا کنید.
  • آشنایی با انتخابگرهای نوع، انتخابگرهای ترکیب‌کننده و گروه‌های انتخابگر، که می‌توانید در نحوه انتخاب عناصر HTML به سبک با CSS بیابید.
  • درک خواص رنگ .
  • آشنایی با گرادیان های CSS با ویژگی های پس زمینه. نحوه اعمال سبک‌های پس‌زمینه به عناصر HTML با CSS را بررسی کنید تا تجربه ایجاد پس‌زمینه گرادیان را به دست آورید.
  • ویژگی box-shadow را تجربه کنید،
  • یک فایل HTML خالی که در دستگاه محلی شما به عنوان index.html ذخیره شده است که می توانید از ویرایشگر متن و مرورگر وب انتخابی خود به آن دسترسی داشته باشید. برای شروع، آموزش نحوه تنظیم پروژه HTML خود را بررسی کنید و نحوه استفاده و درک عناصر HTML را برای دستورالعمل‌هایی در مورد نحوه مشاهده HTML خود در مرورگر خود دنبال کنید. اگر در HTML تازه کار هستید، کل نحوه ساخت یک وب سایت در سری HTML را امتحان کنید.

راه اندازی پایه HTML و CSS

در این بخش اول، HTML را برای سبک های بصری که در طول آموزش خواهید نوشت، تنظیم خواهید کرد. شما همچنین فایل styles.css خود را ایجاد کرده و سبک هایی را اضافه می کنید که طرح بندی محتوا را تنظیم می کند.

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

index.html

<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Destination: Moon</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=MuseoModerno:wght@400;700&display=swap" rel="stylesheet">
    <link href="styles.css" rel="stylesheet" />
  </head>
  <body>
  </body>
</html>

چندین تنظیمات صفحه در عنصر <head> HTML تعریف شده است. عنصر <meta> مجموعه کاراکتری را برای استفاده از متن تعریف می‌کند، که به مرورگر می‌گوید چگونه کاراکترهای خاص را بدون استفاده از کدهای کاراکتر HTML تفسیر کند. عنصر <title> عنوان صفحه را در اختیار مرورگر قرار می دهد. عناصر <link> در سبک های صفحه بارگیری می شوند. سه مورد اول در فونت، Museo Moderno، از فونت‌های Google بارگیری می‌شوند، و آخرین مورد، سبک‌هایی را که به styles.css اضافه می‌کنید، بارگیری می‌کند.

در مرحله بعد، صفحه برای استایل دادن به محتوا نیاز دارد. شما از محتوای نمونه از Sagan Ipsum به عنوان کپی پرکننده برای استفاده با سبک ها استفاده خواهید کرد. شما همچنین HTML را برای سرصفحه سایت، حاوی نام سایت و یک نوار ناوبری کوچک اعمال خواهید کرد. در ویرایشگر متن خود به index.html برگردید و HTML برجسته شده را از بلوک کد زیر اضافه کنید:

index.html

<!doctype html>
<html>
  <head>
    ...
  </head>
  <body>
    <header class="site-header">
      <h1 class="site-name">Destination: <strong>Moon</strong></h1>
      <nav>
        <ul class="nav-list">
          <li><a href="#" class="nav-link">Base Station</a></li>
          <li><a href="#" class="nav-link">Travel Packages</a></li>
          <li><a href="#" class="nav-link">Accommodations</a></li>
          <li><a href="#" class="nav-link">Plan Your Trip</a></li>
      </ul>
      </nav>
    </header>
    <main>
      <section>
        <h2>Schedule Your Trip</h2>
        <p>Sea of Tranquility great turbulent clouds with pretty stories for which there's little good evidence extraordinary claims require extraordinary evidence. Citizens of distant epochs rings of Uranus intelligent beings birth take root and flourish across the centuries. Corpus callosum invent the universe as a patch of light the only home we've ever known a mote of dust suspended in a sunbeam made in the interiors of collapsing stars. Kindling the energy hidden in matter Orion's sword.</p>
        <p>Vastness is bearable only through love emerged into consciousness not a sunrise but a galaxyrise emerged into consciousness courage of our questions across the centuries and billions upon billions upon billions upon billions upon billions upon billions upon billions.</p>
          <a href="#" class="button">Read the Disclaimer!</a>
      </section>
    </main>
  </body>
</html>

حتما فایل index.html خود را ذخیره کنید و آن را در ویرایشگر متن خود باز بگذارید. سپس یک فایل جدید به نام styles.css ایجاد کنید و آن را در ویرایشگر متن باز کنید. این فایلی است که در عنصر <head> index.html ارجاع داده شده است. در فایل styles.css کد زیر را اضافه کنید:

styles.css

body {
  margin: 0;
  font: 100%/1.5 sans-serif;
}

main {
  margin: 6rem auto;
  width: 75ch;
  font-size: 1.125rem;
}

h2 {
  font: 400 1.875rem/1.25 MuseoModerno, sans-serif;
  color: #6b2d6b;
}

.site-header {
  font: 1.125rem / 1.25 MuseoModerno, sans-serif;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 2rem;
  color: white;
  background: linear-gradient(135deg, #8e3d8e, #230f23);
}

.site-name {
  margin: 0;
  font-size: 1.75rem;
  font-weight: 400;
}

.nav-list {
  margin: 0;
  padding: 0;
  list-style: none;
  display: flex;
  align-items: stretch;
}

.nav-link {
  color: inherit;
  display: block;
  text-decoration: none;
  padding: 1.25rem 1.5rem;
}

.nav-link:hover,
.nav-link:focus {
  color: #230f23;
  background-color: white;
}

.button {
  text-decoration: none;
  display: inline-block;
  padding: 0.5rem 1.25rem;
  color: white;
  background: #4c90b2;
  border: 1px solid #2d566b;
  border-radius: 0.5rem;
}

.button:hover,
.button:focus {
  background-color: #2d566b;
}

این سبک‌ها زیبایی‌شناسی و چیدمان کلی صفحه را با سبک‌های اعمال شده روی بدنه و عناصر اصلی تنظیم می‌کنند. انتخابگرهای .site-header، site-name، .nav-list و .nav-link همگی سبک ها را در سرصفحه صفحه تعریف می کنند. قوانین .button و .button:hover یک عنصر <a> را تغییر می دهند تا مانند یک دکمه بزرگ و قابل کلیک ظاهر شود.

تغییرات خود را در styles.css ذخیره کنید، سپس یک مرورگر وب باز کنید. آیتم منوی File را انتخاب کرده و سپس گزینه Open را انتخاب کنید. سپس به پوشه پروژه خود بروید و فایل index.html خود را در مرورگر بارگذاری کنید. تصویر زیر نحوه نمایش صفحه در مرورگر را نشان می دهد:

CSS که تا به حال نوشته اید یک هدر بنفش در بالای صفحه با عنوان سایت و پیمایش در متن سفید ایجاد می کند. در زیر، محتوا از یک عنوان بنفش و دو پاراگراف متن تشکیل شده است. عرض محتوا به 75 کاراکتر با مقدار ویژگی max-width: 76ch در انتخابگر عنصر اصلی محدود شده است. در نهایت، دکمه آبی با متن Read the Disclaimer! یک عنصر بزرگ و تعاملی در زیر محتوا است.

در سراسر این بخش شما HTML خود را در فایل index.html تنظیم کرده و سبک های پایه را در فایل styles.css ایجاد می کنید. در بخش بعدی، از ویژگی opacity برای ناپدید شدن یک عنصر جدید و ظاهر شدن مجدد با کلاس :target شبه استفاده خواهید کرد.

ایجاد :target State با opacity برای نمایش و پنهان کردن عناصر

یکی از کاربردهای مفید ویژگی opacity این است که باعث محو شدن و محو شدن محتوا در صفحه می شود. یکی از نمونه‌های چنین جلوه‌ای زمانی است که یک مودال، یک عنصر رابط کاربری (که به عنوان جعبه نور نیز شناخته می‌شود) که در جلوی بقیه محتوای صفحه شما ظاهر می‌شود، به نمایش تبدیل می‌شود. می توانید این افکت را با ترکیبی از ویژگی های opacity و pointer-events و شبه کلاس :target ایجاد کنید.

با باز کردن index.html برای ایجاد محتویات مدال شروع کنید. HTML برجسته شده را از بلوک کد زیر بین تگ های بسته </section> و </main> اضافه کنید:

index.html

<!doctype html>
<html>
  <head>
    ...
  </head>
  <body>
    ...
    <main>
      <section>
        ...
      </section>
      <div class="modal-container">
        <section class="modal">
          <header class="modal-header">
            <h2 class="modal-title">Destination: Moon Disclaimer</h2>
            <a href="#" class="modal-close">Close</a>
          </header>
          <div class="modal-content">
            <p><strong>Disclaimer:</strong> Vastness is bearable only through love emerged into consciousness not a sunrise but a galaxyrise emerged into consciousness courage of our questions across the centuries and billions upon billions upon billions upon billions upon billions upon billions upon billions.</p>
          </div>
        </section>
      </div>
    </main>
  </body>
</html>

تغییرات خود را در index.html ذخیره کنید، سپس به styles.css در ویرایشگر متن خود بازگردید و CSS هایلایت شده را در بلوک کد زیر به فایل خود اضافه کنید:

styles.css

...

.button:hover {
  background-color: #2d566b;
}

.modal-container {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 1000;
  background-color: black;
  display: flex;
}

.modal {
  margin: auto;
  width: 90%;
  max-width: 40rem;
  background-color: white;
  border-radius: 1.5rem;
}

.modal-header,
.modal-content {
  padding: 1.5rem;
}

کلاس .modal-container ناحیه ای را تعریف می کند که فضای کامل قابل مشاهده را با یک عنصر ثابت پوشش می دهد. سپس صفحه نمایش: خم شدن در کانتینر .modal همراه با حاشیه: خودکار در انتخابگر .modal، محتوا را به صورت عمودی و افقی روی صفحه متمرکز می کند.

تغییرات خود را در styles.css ذخیره کنید و برای بازخوانی index.html به مرورگر خود بازگردید. همانطور که در تصویر زیر نشان داده شده است، محتوای صفحه دیگر قابل مشاهده نیست زیرا یک پوشش سیاه روی صفحه با یک ظرف سفید پوشانده شده است:

اکنون که مدال در جای خود قرار دارد و محتویات صفحه را پوشش می‌دهد، باید تا زمانی که نمونه‌سازی شود، پنهان شود. ویژگی opacity یک ویژگی قدیمی است که اجازه می دهد تا شفافیت روی یک عنصر و محتویات آن قرار گیرد. مقدار ویژگی opacity می تواند از 0 تا 1 با هر نقطه اعشاری بین آن متغیر باشد.

برای شروع استفاده از ویژگی opacity، به styles.css در ویرایشگر متن خود بازگردید. در انتخابگر کلاس .modal، یک ویژگی opacity با مقدار 0 اضافه کنید، همانطور که در بلوک کد زیر مشخص شده است:

styles.css

...
.modal-container {
   position: fixed;
   top: 0;
   right: 0;
   bottom: 0;
   left: 0;
   z-index: 1000;
   background-color: black;
   display: flex;
  opacity: 0;
}
...

این باعث می شود که کل نمای مودال به صورت بصری روی صفحه پنهان شود. مودال فقط باید زمانی قابل مشاهده باشد که لازم باشد. برای دستیابی به این ظاهر شرطی، می توانید از شبه کلاس :target استفاده کنید.

بعد از انتخابگر .modal-container، یک انتخابگر جدید برای .modal-container:target اضافه کنید. در داخل بلوک انتخابگر، یکی دیگر از ویژگی های opacity را به مقدار 1 تنظیم کنید. CSS برجسته شده در بلوک کد زیر، نحوه قالب بندی آن را نشان می دهد:

styles.css

...
.modal-container {
  ...
  opacity: 0;
}

.modal-container:target {
  opacity: 1;
}
...

این تغییرات را در styles.css ذخیره کنید.

:target زمانی که یک عنصر دارای تمرکز URL باشد، نمونه سازی می شود. در مرورگرهای وب، ویژگی id در یک عنصر HTML را می توان در URL همانطور که با نماد پوند یا هش (#) نشان می دهد ارجاع داد. برای اینکه .modal-container:target فعال شود، همان عنصر به یک عنصر id نیاز دارد و صفحه به راهی برای فعال کردن آن URL نیاز دارد.

در ویرایشگر متن خود به index.html برگردید. در عنصر <div class=”modal-container”>، یک مجموعه ویژگی id را به سلب مسئولیت مقدار اضافه کنید. سپس، در عنصر <a href=”#” class=”button”>، مقدار href را از # به #سلب مسئولیت تغییر دهید. برای نحوه نوشتن به HTML برجسته شده در بلوک کد زیر مراجعه کنید:

index.html

<!doctype html>
<html>
  <head>
    ...
  </head>
  <body>
    ...
    <main>
      <section>
         ...
         <a href="#disclaimer" class="button">Read the Disclaimer!</a>
       </section>
       <div id="disclaimer" class="modal-container">
         ...
       </div>
    </main>
  </body>
</html>

تغییر در مقدار href به مرورگر می‌گوید که به عنصری با مقدار شناسه سلب مسئولیت صفحه فعلی برود. هنگامی که #سلب مسئولیت به URL اضافه شد، سپس :target در CSS فعال می شود.

این تغییرات را در index.html ذخیره کنید، سپس به styles.css بازگردید.

همانطور که صفحه اکنون ساختار یافته است، مودال تمام رویدادهای کلیک و لمسی را که از تعامل ماوس یا صفحه لمسی حاصل می شود، ضبط می کند. این به این دلیل است که اگرچه کاملاً شفاف است، اما عنصر مدال هنوز کل صفحه را پوشش می دهد. برای حذف تعامل از عنصر، یک ویژگی pointer-events با مقدار هیچ به انتخابگر .modal-container اضافه می‌کنید. سپس، هنگامی که مدال قابل مشاهده است، باید بتواند دوباره رویدادهای تعامل را دریافت کند. در شبه کلاس :target، اشاره گر رویدادها را به همه اضافه کنید، همانطور که در بلوک کد زیر مشخص شده است:

styles.css

...
.modal-container {
  ...
  opacity: 0;
  pointer-events: none;
}

.modal-container:target {
  opacity: 1;
  pointer-events: all;
}
...

ویژگی pointer-events نحوه تعامل یک عنصر با ماوس یا دستگاه ورودی مبتنی بر لمس را تغییر می دهد. با تنظیم مقدار روی هیچ، این عنصر نه تنها برای کاربران بینا، بلکه برای دستگاه های ورودی مبتنی بر اشاره گر نیز نامرئی می شود. سپس، مقدار all تعامل را دوباره برقرار می‌کند، اما تنها زمانی که .modal-container در URL فعال و قابل مشاهده باشد.

در نهایت، برای اینکه مدال در داخل و خارج از دید محو شود، یک ویژگی انتقال برای متحرک سازی بین 0 و 1 مقادیر برای کدورت اضافه می‌کنید.

به styles.css برگردید و یک ویژگی انتقال به انتخابگر .modal-container اضافه کنید، همانطور که در بلوک کد زیر مشخص شده است:

styles.css

...
.modal-container {
  ...
  opacity: 0;
  pointer-events: none;
  transition: opacity 250ms ease;
}

.modal-container:target {
  opacity: 1;
  pointer-events: all;
}
...

ویژگی transition مختصر یک سری از خواص است. کدورت به مرورگر می گوید که این ویژگی برای انتقال بین است. 250 میلی‌ثانیه زمانی است که انتقال باید تکمیل شود و واحد برای میلی‌ثانیه ایستاده است. در نهایت، سهولت توضیح می دهد که چگونه انتقال رخ خواهد داد. در این مورد، ease به این معنی است که آهسته شروع می‌شود، سرعت می‌گیرد و سپس در نزدیکی پایان انتقال دوباره کاهش می‌یابد.

انتقال زمانی کار خواهد کرد که مودال ظاهر شود و با فشار دادن پیوند بستن در داخل مدال ناپدید شود. این پیوند بستن دارای یک مقدار href است که روی # تنظیم شده است، که URL را از #سلب مسئولیت به # تغییر می‌دهد و حالت :target را حذف می‌کند.

تغییرات خود را در styles.css ذخیره کنید و index.html را در مرورگر refresh کنید. انیمیشن زیر نحوه ظاهر و ناپدید شدن مودال را نشان می دهد

این بخش شما را با خاصیت opacity آشنا کرد که از آن برای پنهان کردن بصری یک ظرف مدال استفاده کردید. شما همچنین از ویژگی شبه کلاس :target، ویژگی pointer-events و ویژگی transition برای ایجاد یک افکت fade-in و fade-out استفاده کردید. در بخش بعدی، از رنگ‌هایی با کانال‌های آلفا برای شفاف‌تر کردن مودال استفاده خواهید کرد.

استفاده از کانال های آلفا برای ایجاد مقادیر رنگ شفاف

یک کانال آلفا مانند ویژگی opacity است، اما در عوض یک بخش اضافی برای یک مقدار رنگ است که از طریق rgb()، hsl() یا هگزادسیمال تعریف شده است. در جایی که ویژگی opacity کل عنصر و فرزندان آن را تنظیم می کند، کانال آلفا فقط کدورت رنگ را در یک ویژگی مشخص تنظیم می کند. در طول این بخش، شما از هر یک از مقادیر رنگ کانال آلفا استفاده کرده و آنها را عملی خواهید کرد.

برای شروع کار با مقادیر رنگ کانال آلفا، stlyes.css را در ویرایشگر متن خود باز کنید. سپس به انتخابگر کلاس .modal-container بروید. همانطور که در بلوک کد زیر مشخص شده است، مقدار ویژگی پس زمینه رنگ را از #000 به rgba (0، 0، 0، 0.75) تغییر دهید:

styles.css

...
.modal-container {
  ...
  background-color: rgba(0,0,0,0.75);
  ...
}
...

مقدار رنگ rgba () مانند rgb () عمل می کند که شامل سه عدد جدا شده با کاما است که سطح نور قرمز، سبز و آبی را نشان می دهد. وقتی یکی از مقادیر رنگ روی 0 تنظیم شود، کاملاً خاموش است (سیاه) و 255 به این معنی است که در روشنایی کامل (سفید) است. بین این سه کانال رنگی می توان میلیون ها رنگ تولید کرد. عدد چهارم کانال آلفا است که مانند خاصیت opacity کار می کند و یک مقدار اعشاری از 0 تا 1 است. تنظیم کانال آلفا باعث شفاف شدن رنگ می شود و به محتوای پشت آن اجازه می دهد از طریق رنگ قابل مشاهده باشد.

تغییرات خود را در styles.css ذخیره کنید و index.html را در یک مرورگر وب باز کنید. خواندن سلب مسئولیت را فشار دهید! را فشار دهید تا مودال فعال شود. پس‌زمینه پوشش سیاه همچنان سیاه است، اما اکنون نیز شفاف است و صفحه پشت آن را آشکار می‌کند:

اکنون که روکش شفاف است، به مدال بچرخید و با تغییر پس‌زمینه به یک گرادیان بنفش با متن سفید، استایل بصری بیشتری به آن بدهید. در ویرایشگر متن خود به styles.css برگردید و CSS هایلایت شده زیر را از بلوک کد بعدی اضافه کنید:

styles.css

...
.modal {
  margin: auto;
  width: 90%;
  max-width: 40rem;
  background: linear-gradient(135deg, hsl(300, 40%, 20%),hsl(300, 40%, 5%));
  border-radius: 1.5rem;
}

.modal-header,
.modal-content {
  padding: 1.5rem;
}

.modal-header {
  display: flex;
  justify-content: space-between;
}

.modal-title {
  margin: 0;
  color: white;
}

.modal-close {
  color: white;
}

.modal-content {
  color: white;
}

این به روز رسانی را در styles.css ذخیره کنید، سپس index.html را در مرورگر خود بازخوانی کنید. سبک مودال همانطور که در تصویر زیر نشان داده شده است به روز می شود و ارائه می شود:

اکنون در ویرایشگر متن خود به styles.css بازگردید. اکنون از مقدار رنگ ()hsla برای روشن کردن رنگ هدر modal استفاده خواهید کرد. همچنین باید گوشه های بالایی را طوری تنظیم کنید که یک مقدار شعاع مرزی مطابق با مدال داشته باشد، بنابراین هدر خارج از ناحیه مدال ظاهر نشود. CSS هایلایت شده در بلوک کد زیر نحوه تنظیم این را نشان می دهد:

styles.css

...
.modal-header {
  display: flex;
  justify-content: space-between;
  background-color: hsla(300, 80%, 90%, 0.2);
  border-radius: 1.5rem 1.5rem 0 0;
}
...

مقدار پس زمینه رنگ از فرمت hsla() استفاده می کند و مانند مقدار rgba()، فرمت hsl() است اما با کانال آلفا. hsl() از سه بخش تشکیل شده است: یک مقدار درجه از چرخه رنگ، یک مقدار درصد اشباع، و یک مقدار درصد روشنایی، که رنگ نهایی را ایجاد می کند. 300 مقدار رنگ را بین آبی و قرمز در چرخه رنگ قرار می دهد، 80٪ اشباع سنگین به معنای رنگ بیشتر و خاکستری کمتر است، و 90٪ رنگ نهایی را روشن می کند. در نهایت، کانال آلفا مانند خاصیت opacity کار می کند و 0.2 مقدار را نزدیک به کاملا شفاف می کند. این یک پوشش روشن در بالای گرادیان ایجاد می کند و تعریفی را برای هدر ارائه می دهد.

این تغییرات را در styles.css ذخیره کنید و برای بازخوانی index.html به مرورگر بازگردید. سرصفحه مدال اکنون دارای یک برجسته صورتی تر در ناحیه است که آن را از محتوای مدال متمایز می کند. تصویر زیر نشان می دهد که چگونه هدر مدال اکنون در مرورگر رندر می شود:

راه دیگر برای ایجاد مقادیر رنگ شفاف، استفاده از مقادیر هگزادسیمال است. مقادیر رنگ هگزادسیمال از سه جفت ترکیبی از 0 تا 9 یا a تا f تشکیل شده و معادل عددی از 0 تا 255 است. سه رقم اول یک مقدار قرمز، سبز و آبی هستند که به صورت #RRGGBB فرمت شده اند. برای ایجاد یک کانال آلفا، مجموعه چهارم اضافه می شود و الگوی #RRGGBBAA را می سازد.

برای شروع کار با کانال های آلفای هگزادسیمال، به styles.css در ویرایشگر متن خود بازگردید. اکنون یک حاشیه به قسمت سرصفحه و محتوای مدال اضافه می‌کنید تا تعریف بیشتری به آن بدهید. این مرزها از مقدار هگزادسیمال یکسانی استفاده می کنند، اما مقادیر متفاوتی برای کانال آلفا به آنها داده می شود. CSS هایلایت شده از بلوک کد زیر نحوه نوشتن این سبک ها را نشان می دهد:

styles.css

...
.modal-header {
  display: flex;
  justify-content: space-between;
  background-color: hsla(300, 80%, 90%, 0.2);
  border-radius: 1.5rem 1.5rem 0 0;
  border: 4px solid #f7baf72f;
  border-bottom: none;
}
...
.modal-content {
  color: white;
  border-radius: 0 0 1.5rem 1.5rem;
  border: 4px solid #f7baf744;
  border-top: none;
}
...

هدر و محتوا هر کدام یک رنگ هگزادسیمال با #f7baf7 دارند، اما مقادیر کانال آلفای متفاوتی دارند. رنگ حاشیه انتخابگر هدر مدال دارای یک کانال آلفا تنظیم شده روی 2f است که شفاف تر است، زیرا 00 یک مقدار کانال آلفا کاملاً شفاف است. کانال آلفای .modal-content روی 44 تنظیم شده است که باعث شفاف‌تر شدن آن می‌شود.

تغییرات خود را در styles.css ذخیره کنید و index.html را در مرورگر وب بازخوانی کنید. تصویر زیر نحوه نمایش این حاشیه ها در مرورگر را نشان می دهد:

در نهایت، یک رنگ شش رقمی هگزا دسیمال را می توان به صورت خلاصه سه رقمی نوشت، که در آن #33ccee همان #3ce است. به همین ترتیب، یک مقدار هگزادسیمال با یک کانال آلفا را می توان به صورت خلاصه چهار رقمی نوشت به طوری که #33ccee99 را بتوان به #3ce9 کوتاه کرد و یک رنگ باشد.

برای شروع کار با یک هگزادسیمال کوتاه با کانال آلفا، به stlyes.css در ویرایشگر متن خود بازگردید. سپس، به انتخابگر کلاس .modal بروید و یک ویژگی box-shadow اضافه کنید. در اینجا یک سایه بزرگ روی مدال ایجاد می کنید که سیاه است اما توسط یک کانال آلفا نرم می شود. CSS هایلایت شده را در بلوک کد زیر به بلوک انتخابگر .modal خود اضافه کنید:

styles.css

...
.modal {
  margin: auto;
  width: 90%;
  max-width: 40rem;
  background: linear-gradient(135deg, hsl(300, 40%, 20%),hsl(300, 40%, 5%));
  border-radius: 1.5rem;
  box-shadow: 0 1rem 2rem #000a;
}
...

این سایه محور x را 1 rem پایین می آورد و تاری 2 rem را پخش می کند. در مرحله بعد، مقدار #000a با خاموش کردن هر سه مقدار رنگ، یک رنگ سیاه کامل را مشخص می کند. a که معادل aa است و دارای مقدار عددی 170 است، کانال آلفا را با شفافیت تقریباً 66٪ ارائه می کند. این کار سایه را کمی کم می کند، اما آن را به اندازه کافی قابل توجه نگه می دارد تا عمق زیر مودال را فراهم کند.

حتما این افزودنی را در styles.css ذخیره کنید، سپس index.html را در مرورگر refresh کنید. مدال اکنون تعریف و عمق بیشتری دارد. تصویر زیر رندر مودال را با مقادیر رنگ های مختلف ارائه می دهد:

در این بخش، شما از سه مقدار رنگ مختلف با کانال های آلفا برای اعمال کدورت به رنگ ها در ویژگی های خاص استفاده کردید. شما این رنگ ها را به ویژگی های پس زمینه رنگ، ویژگی های حاشیه و ویژگی box-shadow اضافه کردید. در بخش بعدی، از مقدار رنگ نام‌گذاری شده شفاف برای ایجاد گرادینت‌های منحصر به فرد و مخفی کردن محتوا استفاده می‌کنید.

افزودن مقدار رنگ شفاف به گرادیان خطی

مقادیر مختلف رنگی که از کانال های آلفا پشتیبانی می کنند برای زمانی که یک رنگ هنوز نیاز به شناسایی دارد مفید است. با این حال، زمانی که هیچ رنگی مورد نیاز نیست، رنگ شفاف به نام مفید می شود. در این بخش، دکمه Close را در حالت مخفی می‌کنید و یک شکل X با یک خطی-gradient() ایجاد می‌کنید که همه اینها با استفاده از مقدار شفاف است.

برای شروع استفاده از مقدار شفاف، styles.css را در ویرایشگر متن خود باز کنید. سپس، به انتخابگر کلاس .modal-close که قبلا اضافه کردید بروید. در داخل انتخابگر، همانطور که در بلوک کد زیر مشخص شده است، مقدار ویژگی رنگ را از سفید به شفاف تغییر دهید:

styles.css

...
.modal-close {
  color: transparent;
}
...

این تغییر متن را از فضای خالی حذف نمی کند. فقط آن را از رندر بصری در صفحه حذف می کند.

بعد، یک مربع از پیوند نزدیک ایجاد می کنید تا جایی برای ایجاد شکل X وجود داشته باشد. با افزودن یک ویژگی نمایشگر به بلاک شروع کنید، که به <a> امکان پیکربندی بصری بیشتری را می دهد. در مرحله بعد، یک ویژگی height و width ایجاد کنید و هر کدام را روی 1.5rem قرار دهید که شکل مربع را ایجاد می کند. در نهایت، یک ویژگی overflow را به hidden اضافه کنید، که از خروج متن به خارج از ظرف و افزودن فضای تعاملی جلوگیری می کند. CSS هایلایت شده از بلوک کد زیر نحوه تنظیم مربع را نشان می دهد:

styles.css

...
.modal-close {
  color: transparent;
  display: block;
  height: 1.5rem;
  width: 1.5rem;
  overflow: hidden;
}
...

بخش آخر ایجاد شکل X با یک نمونه پس زمینه چندگانه متشکل از دو مقدار خطی-gradient() است. برای تنظیم این، کد برجسته شده را از بلوک کد زیر اضافه کنید:

styles.css

...
.modal-close {
  color: transparent;
  display: block;
  height: 1.5rem;
  width: 1.5rem;
  overflow: hidden;
  background-image:
    linear-gradient(
      to top right,
      transparent 48%,
      white 48%,
      white 52%,
      transparent 52%
    ),
    linear-gradient(
      to top left,
      transparent 48%,
      white 48%,
      white 52%,
      transparent 52%
    );
}
...

اولین چیزی که در مورد این کد باید به آن توجه کرد این است که بخش های مختلف خطی-gradient() در خطوط جداگانه قرار دارند، که برای کمک به درک و خوانایی بیشتر پس زمینه پیچیده انجام می شود. این CSS هنوز معتبر است و نیازی نیست که مقادیر در یک خط با ویژگی باشند. سپس، مقادیر تکراری درصد برای شفاف و سفید به این معنی است که درجه بندی وجود نخواهد داشت. در عوض رنگ بلافاصله از شفاف به سفید تغییر می کند. در نهایت، سمت راست و بالا دو شیب در زوایای 45 درجه ایجاد می کند که همپوشانی دارند.

این تغییر را در styles.css ذخیره کنید و index.html را در یک مرورگر وب باز کنید. خواندن سلب مسئولیت را انتخاب کنید! دکمه و مدال اکنون به جای پیوند نزدیک، یک شکل X بزرگ و نازک خواهد داشت، همانطور که در تصویر زیر ارائه شده است:

در نهایت، حالت :hover و :focus مورد نیاز است تا به شکل X زمانی که مرکز تعامل است بیشتر قابل توجه باشد. برای این کار، گرادیان های قبلی را کپی می کنید و موقعیت را برای رشد ناحیه سفید جامد تنظیم می کنید.

برای ایجاد یک حالت تعاملی برای X، به styles.css در ویرایشگر متن خود بازگردید. به دنبال انتخابگر کلاس .modal-close، یک انتخابگر گروه جدید متشکل از .modal-close:hover و .modal-close:focus ایجاد کنید. سپس، ویژگی و مقدار background-image را از .modal-close در انتخابگر جدید کپی کنید. در نهایت، بخش های 48 درصدی را به 46 درصد کاهش دهید و 52 درصد را به 54 درصد افزایش دهید.

style.css

...
.modal-close {
  ...
}

.modal-close:hover,
.modal-close:focus {
  background-image:
    linear-gradient(
      to top right,
      transparent 46%,
      white 46%,
      white 54%,
      transparent 54%
    ),
    linear-gradient(
      to top left,
      transparent 46%,
      white 46%,
      white 54%,
      transparent 54%
    );
}
...

این تغییرات را در styles.css ذخیره کنید و صفحه را در مرورگر خود بازخوانی کنید. اکنون، زمانی که X روی ماوس قرار می‌گیرد یا فوکوس صفحه‌کلید به آن داده می‌شود، اندازه شیب‌هایی که شکل را ایجاد می‌کنند افزایش می‌یابد و جلوه‌ای می‌دهد که گویی X پررنگ است. انیمیشن زیر نشان می دهد که چگونه این افکت در یک مرورگر در طول یک رویداد شناور ارائه می شود:

این بخش شما را با ویژگی transparent آشنا می کند و شما از آن برای مخفی کردن محتوا و ایجاد نماد X با استفاده از مقادیر ()linear-gradient استفاده می کنید. در بخش آخر، از مقدار شفاف بر روی یک گرادیان برای کمک به ارائه افکت انیمیشن بر روی یک عنصر استایل دکمه ای استفاده خواهید کرد.

با استفاده از حالت :hover برای انتقال بین مقادیر رنگ شفاف

یکی از جنبه‌های ویژگی انتقال که گاهی به راه‌حل‌های خلاقانه نیاز دارد این است که همه ویژگی‌ها را نمی‌توان متحرک کرد. یکی از این ویژگی ها تصویر پس زمینه است، به این معنی که مقادیر یک گرادیان خطی در این ویژگی نمی توانند متحرک شوند. با این حال، مقدار رنگ پس‌زمینه حتی اگر تصویر پس‌زمینه وجود داشته باشد، می‌تواند متحرک شود. در این بخش، با استفاده از مقادیر رنگی شفاف و کانال آلفا، یک انیمیشن انتقال ایجاد می کنید که به نظر می رسد یک انیمیشن گرادیان باشد.

برای ایجاد یک گرادیان متحرک، styles.css را در ویرایشگر متن خود باز کنید. سپس به انتخابگر کلاس .button بروید. کلاس .button از قبل تغییری در رنگ پس زمینه بین انتخابگر خود و دکمه .:hover دارد. ویژگی و مقدار انتقال برجسته شده را از بلوک کد زیر به فایل styles.css خود اضافه کنید:

styles.css

...
.button {
  text-decoration: none;
  display: inline-block;
  padding: 0.5rem 1.25rem;
  color: white;
  background: #4c90b2;
  border: 1px solid #2d566b;
  border-radius: 0.5rem;
  transition: background-color 250ms ease;
}

.button:hover,
.button:focus {
  background-color: #2d566b;
}
...

تغییرات خود را در styles.css ذخیره کنید و index.html را در مرورگر وب خود باز کنید. نگه داشتن دکمه با مکان نما اکنون باعث می شود که رنگ پس زمینه بین آبی روشن و آبی تیره متحرک شود. انیمیشن زیر نشان می دهد که چگونه این در مرورگر ارائه می شود:

اکنون، برای افزودن گرادیان، به styles.css در ویرایشگر متن خود برگردید. به انتخابگر دکمه .برگردید و یک ویژگی پس زمینه تصویر با یک خطی-gradient() اضافه کنید. جهت گرادیان به سمت پایین خواهد بود و با یک کانال آلفا آبی روشن شروع می شود و سپس به سمت شفاف می رود. انیمیشن با کانال آلفا آبی تیره به پایان می رسد. CSS هایلایت شده در بلوک کد زیر نحوه نوشتن این گرادیان را نشان می دهد:

styles.css

...
.button {
  text-decoration: none;
  display: inline-block;
  padding: 0.5rem 1.25rem;
  color: white;
  background: #4c90b2;
  border: 1px solid #2d566b;
  border-radius: 0.5rem;
  background-image:
    linear-gradient(
      to bottom,
      hsla(200, 40%, 80%, 0.4),
      transparent,
      hsla(200, 40%, 20%, 0.6)
    );
  transition: background-color 250ms ease;
}
...

این گرادیان رنگ پس‌زمینه را پوشش می‌دهد و به این شکل ظاهر می‌شود که گرادیان از آبی روشن به آبی میانی و سپس آبی تیره می‌گذرد. هنگامی که دکمه با یک رویداد تعاملی روبرو می شود، رنگ پس زمینه به آبی تیره تر تغییر می کند و این توهم ایجاد می کند که شیب کلی تیره شده است.

این به روز رسانی ها را در styles.css ذخیره کنید و سپس به فایل index.html خود در مرورگر بازگردید و صفحه را بازخوانی کنید. همانطور که در انیمیشن زیر نشان داده شده است، هنگامی که مکان نما روی دکمه حرکت می کند، به نظر می رسد گرادیان از یک گرادیان آبی روشن به یک گرادیان آبی تیره متحرک می شود:

در این بخش آخر، از مقادیر رنگ، مقدار شفاف نامگذاری شده و ویژگی transition برای ایجاد توهم متحرک سازی گرادیان استفاده کردید. با توجه به این، شما همچنین یاد گرفتید که چه نوع ویژگی هایی را می توان متحرک کرد.

نتیجه

در طول این آموزش، از ویژگی opacity و مقادیر رنگی زیادی با کانال های آلفا استفاده کردید. شما از کدورت با رویدادهای اشاره گر و انتقال برای ایجاد یک افکت محو برای نمایش یک مدال در صورت تقاضا استفاده کردید. شما همچنین از مقادیر مختلف رنگ موجود برای کنترل شفافیت و پوشش رنگ روی محتوا استفاده کردید. شما از مقدار با نام شفاف برای ایجاد یک نماد X برای بستن مدال استفاده کردید. در نهایت، شما از ترکیبی از رنگ‌ها، مقدار شفاف، گرادیان‌ها و انتقال برای ایجاد توهم شیب متحرک روی یک دکمه استفاده کردید.

دلایل مفید زیادی برای استفاده از رنگ‌های شفاف و شفاف در طراحی وب وجود دارد. ویژگی opacity را می توان برای متحرک سازی یک افکت محو و محو بر روی عناصری که قرار است در صورت نیاز قابل مشاهده باشند، استفاده کرد. مقادیر رنگ های مختلف که امکان کنترل شفافیت را فراهم می کند، راه های بسیاری را برای ترکیب رنگ ها و محتوا با یکدیگر فراهم می کند. در مجموع، این روش‌های ایجاد شفافیت می‌توانند جلوه‌ها و سبک‌های منحصربه‌فردی را ایجاد کنند.

برچسب‌ها:CSSاستایل‌سازی HTML با CSSانواع سرور مجازیایجاد سرور مجازیایجاد یک Modal در CSSخرید سرور لینوکسراه اندازی پایه HTML و CSSسرور مجازی

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه راه اندازی یک شمارنده بازدید وب سایت با Redis و PHP در اوبونتو 20.04

ورود به سایت

معرفی

شمارنده ضربه برنامه‌ای است که تعداد بازدیدهایی را که صفحه وب شما دریافت کرده است را ثبت و نشان می‌دهد. شمارنده از 1 شروع می شود و هر بار که از یک صفحه وب بازدید می شود یک بار افزایش می یابد.

برای پیگیری بازدیدها، برنامه آمارگیری ضربه به شکلی از پایگاه داده نیاز دارد. در حالی که سیستم های مدیریت پایگاه داده مبتنی بر دیسک مانند MySQL می توانند کار کنند، یک پایگاه داده در حافظه از نظر سرعت، عملکرد، مقیاس پذیری، سادگی و سهولت استفاده بهتر است. اینجاست که سرور Redis وارد عمل می شود. Redis داده ها را به جای ضربه زدن به دیسک هر بار که یک عملیات ورودی/خروجی انجام می دهید، در رم کامپیوتر شما ذخیره می کند. این باعث افزایش قابل توجهی می شود.

برای ردیابی بازدیدهای سایت خود، به یک نقشه هش Redis نیاز دارید. این یک ساختار داده است که یک جفت کلید-مقدار را پیاده سازی می کند. نقشه هش یک جدول هش ارائه می دهد که کلیدها را به مقادیر نگاشت می کند. هنگامی که کاربر از صفحه وب شما بازدید می کند، کلیدی را بر اساس آدرس IP عمومی یا نام کاربری (برای کاربران تأیید شده) ایجاد می کنید و سپس تعداد بازدیدهای او را به مقدار 1 مقداردهی می کنید. سپس، هر بار که کاربر مجدداً از صفحه وب شما بازدید می کند. کل بازدیدهای آنها را از نقشه هش Redis بر اساس آدرس IP/نام کاربری آنها بررسی می کنید و مقدار را افزایش می دهید.

 

پیش نیازها

برای دنبال کردن این راهنما، مطمئن شوید که موارد زیر را دارید:

  • یک سرور اوبونتو 20.04 که با استفاده از راه اندازی اولیه سرور با راهنمای اوبونتو 20.04 پیکربندی شده است.
  • یک کاربر غیر ریشه با امتیازات sudo..
  • آپاچی و پی اچ پی.
  • سرور Redis

مرحله 1 – نصب برنامه افزودنی PHP Redis

در این مرحله، یک پسوند Redis را نصب می‌کنید که به PHP اجازه می‌دهد با سرور Redis صحبت کند. همچنین یک صفحه وب آزمایشی ایجاد خواهید کرد که نقشه هش Redis را برای ردیابی بازدیدهای وب پیاده سازی می کند.

قبل از نصب برنامه افزودنی Redis، فهرست اطلاعات بسته Ubuntu خود را بازخوانی کنید:

sudo apt update

سپس دستور زیر را برای نصب php-redis اجرا کنید. برنامه افزودنی یک API برای برقراری ارتباط با ذخیره‌سازی کلید ارزش سرور Redis ارائه می‌کند:

sudo apt install -y php-redis

برای بارگیری افزونه جدید، آپاچی را مجددا راه اندازی کنید:

sudo systemctl restart apache2

اکنون یک پسوند PHP نصب کرده اید که با سرور Redis شما صحبت می کند. در مرحله بعد، یک صفحه وب test.php در زیر فهرست اصلی وب سرور آپاچی ایجاد خواهید کرد. این فقط یک فایل نمونه است که بازدیدکنندگان هنگام بازدید از وب سایت شما با مرورگر درخواست می کنند. در زیر سرپوش، فایل صفحه test.php یک اسکریپت hit_counter.php را بارگیری می کند که بعداً برای پیگیری بازدید از صفحه با استفاده از سرور Redis ایجاد خواهید کرد.

در یک سناریوی واقعی، وب سایت شما ممکن است ده ها یا حتی صدها صفحه وب داشته باشد. برای این راهنما، شما یک صفحه وب واحد را برای اهداف نمایشی راه اندازی خواهید کرد.

در پنجره ترمینال خود، از nano برای ایجاد یک فایل test.php جدید در زیر پوشه اصلی وب سرور خود /var/www/html/ استفاده کنید:

sudo nano /var/www/html/test.php

سپس اطلاعات زیر را در فایل test.php وارد کنید:

/var/www/html/test.php

<?php
  require_once 'hit_counter.php';
?>

<!DOCTYPE html>
<html>

  <head>
    <title>Sample Test Page</title>
  </head>

  <body>
    <h1>Sample test page</h1>
    <p>This is a sample test page.</p>
  </body>

</html>

پس از اتمام ویرایش فایل را ذخیره کرده و ببندید. در این مرحله، یک صفحه وب ساده HTML ایجاد کرده‌اید که هنگام بازدید، فایل hit_counter.php را بارگیری می‌کند. در مرحله بعد، فایل hit_counter.php را برای ردیابی بازدیدهای صفحه آزمایشی کدنویسی می کنید.

مرحله 2 – ایجاد یک اسکریپت شمارنده ضربه Redis

هنگام کار در یک محیط تولید، جدا کردن فایل های PHP قابل استفاده مجدد بسیار متعارف است. این به شما این امکان را می دهد که منطق این فایل ها را در قسمت های مختلف پروژه فقط با درج مسیرهای آنها به جای کپی پیست کد پیاده سازی کنید. این امر تعمیر و نگهداری را آسان تر می کند زیرا در صورت نیاز به تغییر منطق، فقط باید یک فایل را ویرایش کنید. این باعث صرفه جویی در وقت شما می شود.

شما در این راهنما همان استراتژی را اعمال خواهید کرد. شما یک فایل hit_counter.php ایجاد خواهید کرد که می توانید آن را در هر صفحه وب که نیاز به ردیابی بازدیدکنندگان دارد قرار دهید.

در این فایل، از کتابخانه php-redis برای اتصال به سرور Redis از PHP استفاده خواهید کرد. سپس، یک نقشه هش Redis برای ذخیره تعداد بازدیدهایی که یک بازدیدکننده از وب سایت شما داشته است ایجاد می کنید. شما از آدرس های IP منحصر به فرد بازدیدکنندگان به عنوان کلیدهای Redis برای تشخیص تعداد بازدید بازدیدکنندگان در سرور Redis استفاده خواهید کرد.

در پنجره ترمینال خود، یک فایل hit_counter.php جدید را با استفاده از nano برای اهداف ویرایش باز کنید:

sudo nano /var/www/html/hit_counter.php

با ایجاد فایل hit_counter.php، یک تگ جدید PHP <?php را باز کنید. سپس، در داخل یک بلوک try { کد زیر را برای اتصال به سرور Redis محلی خود در پورت 6379 وارد کنید. EXAMPLE_PASSWORD را با رمز احراز هویت سرور Redis جایگزین کنید:

/var/www/html/hit_counter.php

<?php

    try {

        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->auth('EXAMPLE_PASSWORD');

سپس، به نقشه هش Redis ($siteVisitsMap) یک نام دلخواه بدهید. این راهنما از siteStats برای اهداف نمایشی استفاده می کند:

/var/www/html/hit_counter.php

$siteVisitsMap = 'siteStats';

پس از تعریف نقشه هش Redis، اکنون یک کلید خالی Redis ($visitorHashKey) را مقداردهی اولیه می کنید. سپس، آن را با آدرس های IP بازدیدکنندگان پر می کنید. شما از مقدار متغیر $visitorHashKey برای شناسایی منحصر به فرد هر بازدید کننده ای که صفحه وب شما را درخواست می کند استفاده می کنید:

/var/www/html/hit_counter.php

$visitorHashKey = '';

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {

    $visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];

} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

    $visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];

} else {

    $visitorHashKey = $_SERVER['REMOTE_ADDR'];
}

در این کد، شما از دستور PHP if برای تعیین آدرس IP بازدیدکننده با بررسی اینکه آیا متغیرهای $_SERVER[‘HTTP_CLIENT_IP’]، $_SERVER[‘HTTP_X_FORWARDED_FOR’]، یا $_SERVER[‘REMOTE_ADDR’] پر شده اند، استفاده می کنید.

پس از این، یک متغیر $totalVisits را مقداردهی اولیه کنید تا کل بازدیدها برای هر آدرس IP ذخیره شود و مقدار 0 به آن اختصاص دهید. سپس از PHP if (…) {…} else {…} و $redis استفاده کنید. ->hExists($siteVisitsMap، $visitorHashKey) برای بررسی اینکه آیا آدرس IP ورودی هایی در سرور Redis دارد یا خیر.

شما از عبارت if ($redis->hExists($siteVisitsMap، $visitorHashKey)) {…} برای بررسی اینکه آیا $visitorHashKey در نقشه ای به نام $siteVisitsMap وجود دارد استفاده خواهید کرد.

در صورتی که نقشه و کلید با آدرس IP نامگذاری شده در سرور Redis وجود دارد، آن را با عبارت $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey)) بازیابی کنید. و از $totalVisits = $visitorData[$visitorHashKey] + 1 استفاده کنید. برای افزایش متغیر $totalVisits. شما از دستور $redis->hMget برای دریافت داده های تعداد ضربه مرتبط با یک آدرس IP استفاده می کنید. تابع hMget نام نقشه شما ($siteVisitsMap) و آرایه ای از کلیدهایی را که می خواهید از سرور Redis بازیابی کنید، می پذیرد. در این مورد، شما فقط یک کلید دارید ($visitorHashKey)، اما باید آن را با استفاده از دستور array ($visitorHashKey) به یک آرایه تبدیل کنید.

در صورتی که اسکریپت شما برای اولین بار با آدرس IP مواجه شد، متغیر $totalVisits را روی 1 قرار دهید. در نهایت، از $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits) استفاده کنید. برای تنظیم مقدار $visitorHashKey مطابق نتایج عبارت if (…) {…} else {…} قبلی. دستور $redis->hSet($siteVisitsMap، $visitorHashKey، $totalVisits) یک نقشه هش $siteVisitsMap در سرور Redis با کلیدی به نام $visitorHashKey با مقدار $totalVisits ایجاد می‌کند.

سپس با تکرار کل بازدیدها به بازدیدکننده خوش آمد گویید و بلوک } catch (…) {…} را ببندید:

/var/www/html/hit_counter.php

$totalVisits = 0;

    if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {

        $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
        $totalVisits = $visitorData[$visitorHashKey] + 1;

    } else {

        $totalVisits = 1;

    }

    $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);

    echo "Welcome, you've visited this page " .  $totalVisits . " times\n";

} catch (Exception $e) {
    echo $e->getMessage();
}

پس از تکمیل، فایل /var/www/html/hit_counter.php شما باید شبیه کد زیر باشد:

/var/www/html/hit_counter.php

<?php

    try {

        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->auth('EXAMPLE_PASSWORD');

        $siteVisitsMap  = 'siteStats';
        $visitorHashKey = '';

        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {

           $visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];

        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

           $visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];

        } else {

           $visitorHashKey = $_SERVER['REMOTE_ADDR'];
        }

        $totalVisits = 0;

        if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {

            $visitorData = $redis->hMget($siteVisitsMap,  array($visitorHashKey));
            $totalVisits = $visitorData[$visitorHashKey] + 1;

        } else {

            $totalVisits = 1;

        }

        $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);

        echo "Welcome, you've visited this page " .  $totalVisits . " times\n";

    } catch (Exception $e) {
        echo $e->getMessage();
    }

پس از اتمام ویرایش فایل را ذخیره کرده و ببندید. شما اکنون یک اسکریپت hit_counter.php را کدگذاری کرده اید. در مرحله بعد، یک اسکریپت PHP دیگر ایجاد خواهید کرد که گزارشی از داده های جمع آوری شده در نقشه هش Redis ایجاد می کند.

مرحله 3 – ایجاد یک اسکریپت گزارش آمار سایت

هنگامی که داده‌ها را در یک نقشه هش Redis جمع‌آوری کردید، اگر نتوانید اطلاعات را در یک گزارش بازیابی و نمایش دهید، ممکن است منطقی نباشد. در این مرحله، یک گزارش گزارش برای نشان دادن بازدیدکنندگان مختلف سایت و کل بازدیدهایی که در صفحه وب آزمایشی انجام داده‌اند ایجاد می‌کنید.

برای ایجاد اسکریپت گزارش گزارش، nano را در پنجره ترمینال خود اجرا کنید و یک فایل /var/www/html/log_report.php جدید ایجاد کنید:

sudo nano /var/www/html/log_report.php

سپس اطلاعات زیر را در فایل وارد کنید. رمز عبور صحیح سرور Redis را جایگزین EXAMPLE_PASSWORD کنید:

/var/www/html/log.php

<!DOCTYPE html>
<html>

  <head>
    <title>Site Visits Report</title>
  </head>

  <body>

      <h1>Site Visits Report</h1>

      <table border = '1'>
        <tr>
          <th>No.</th>
          <th>Visitor</th>
          <th>Total Visits</th>
        </tr>

        <?php

            try {

                $redis = new Redis();
                $redis->connect('127.0.0.1', 6379);
                $redis->auth('EXAMPLE_PASSWORD');

                $siteVisitsMap = 'siteStats';

                $siteStats = $redis->HGETALL($siteVisitsMap);

                $i = 1;

                foreach ($siteStats as $visitor => $totalVisits) {

                    echo "<tr>";
                      echo "<td align = 'left'>"   . $i . "."     . "</td>";
                      echo "<td align = 'left'>"   . $visitor     . "</td>";
                      echo "<td align = 'right'>"  . $totalVisits . "</td>";
                    echo "</tr>";

                    $i++;
                }

            } catch (Exception $e) {
                echo $e->getMessage();
            }

        ?>

      </table>
  </body>

</html>

پس از اتمام ویرایش فایل را ذخیره کرده و ببندید. در اسکریپت بالا، شما در حال اتصال به سرور Redis هستید و از عبارت $redis->HGETALL($siteVisitsMap) استفاده می کنید. برای بازیابی نقشه هش بازدیدهای صفحه وب شما. سپس، شما از دستور PHP foreach ($siteStats به عنوان $visitor => $totalVisits) { برای حلقه و نمایش آدرس IP بازدیدکنندگان و تعداد بازدیدهایی که از سایت شما داشته اند استفاده می کنید. شما از دستور Redis HGETALL برای بازیابی تمام فیلدها (آدرس IP) و مقادیر (کل بازدیدها به ازای هر آدرس IP) از نقشه siteVisitsMap استفاده می کنید.

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

مرحله 4 – تست شمارشگر ضربه Redis

در این مرحله، کل منطق را برای شمارنده ضربه خود آزمایش خواهید کرد. به آدرس زیر در مرورگر وب خود بروید. IP-server-IP خود را با آدرس IP عمومی یا نام دامنه سرور خود جایگزین کنید.

http://your-server-IP/test.php

برای ایجاد آمار کافی، صفحه را چندین بار با استفاده از دستگاه های مختلف بازخوانی کنید.

سپس، از URL زیر دیدن کنید تا گزارش بازدید از سایت خود را در جدول HTML نمایش دهید

http://your-server-IP/log_report.php

اکنون باید گزارشی مشابه خروجی زیر مشاهده کنید.

شمارنده ضربه شما اکنون همانطور که انتظار می رود کار می کند.

نتیجه

در این راهنما، شما یک وب سایت با Redis و PHP روی سرور اوبونتو 20.04 خود راه اندازی کرده اید.

همانطور که در ابتدای این راهنما ذکر شد، استفاده از یک سیستم مدیریت پایگاه داده رابطه‌ای ممکن است همچنان کار کند، اما شما هزاران کد برای درج و به‌روزرسانی داده‌ها در جداول زیرین می‌نویسید. علاوه بر این، پایگاه‌های داده مبتنی بر دیسک ممکن است هنگام رشد سایت شما با مشکلات مقیاس‌پذیری مواجه شوند.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:MySQLRedisاسکریپت شمارنده ضربه Redisانواع سرور مجازیاوبونتو 20.04خرید سرورمجازیخریدvpsراه اندازی اولیه سرورراه اندازی سرور مجازیسرور مجازیشمارنده بازدید وب سایت

  • behnam gol mohamadi
  • ۰
  • ۰

 نحوه استقرار یک برنامه React در پلتفرم اپلیکیشن vpsgol

ورود به سایت

 

معرفی

پلتفرم برنامه vpsgol یک محصول پلتفرم به عنوان سرویس (PaaS) است که به شما امکان می دهد برنامه ها را از یک مخزن منبع پیکربندی و استقرار دهید. پس از پیکربندی برنامه شما، vpsgol برنامه را با هر تغییری ایجاد و مستقر می کند و به شما از مزایای یک وب سرور کامل و خط لوله استقرار با حداقل پیکربندی می دهد. این می تواند یک راه سریع و کارآمد برای استقرار برنامه های React شما باشد، و اگر از React برای ساختن سایتی بدون باطن استفاده می کنید، می توانید از لایه رایگان App Platform استفاده کنید.

در این آموزش، یک برنامه React را با استفاده از لایه Starter رایگان در پلتفرم برنامه vpsgol اجرا می‌کنید. با Create React App یک برنامه می‌سازید، کد را به یک مخزن GitHub فشار می‌دهید، سپس برنامه را به عنوان یک برنامه vpsgol پیکربندی می‌کنید. شما برنامه را به کد منبع خود متصل می کنید و پروژه را به عنوان مجموعه ای از فایل های ثابت اجرا می کنید.

در پایان این آموزش، می‌توانید یک برنامه React را به گونه‌ای پیکربندی کنید که در هر فشار به شاخه اصلی یک مخزن GitHub به طور خودکار مستقر شود.

پیش نیازها

  • در ماشین محلی خود، به یک محیط توسعه نیاز دارید که Node.js را اجرا کند. این آموزش بر روی Node.js نسخه 10.22.0 و npm نسخه 6.14.6 تست شده است.
  • Git روی دستگاه محلی شما نصب شده است.
  • یک حساب vpsgol.
  • یک حساب کاربری در GitHub که می توانید با رفتن به صفحه Create your Account ایجاد کنید.

مرحله 1 – ایجاد یک پروژه React

در این مرحله، یک برنامه React با استفاده از Create React App ایجاد می‌کنید و یک نسخه قابل استقرار از آن می‌سازید.

برای شروع، یک برنامه جدید با استفاده از Create React App در دستگاه محلی خود ایجاد کنید. در ترمینال، دستور ساخت اپلیکیشنی به نام vpsgol-app را اجرا کنید:

npx create-react-app vpsgol-app

دستور npx یک بسته Node را بدون بارگیری در دستگاه شما اجرا می کند. اسکریپت create-react-app همه وابستگی ها را نصب می کند و یک پروژه پایه را در فهرست راهنمای دیجیتال-اقیانوس-برنامه می سازد. برای اطلاعات بیشتر در مورد Create React App، آموزش نحوه راه اندازی یک پروژه React با ایجاد برنامه React را بررسی کنید.

کد وابستگی ها را دانلود می کند و یک پروژه پایه ایجاد می کند. ممکن است چند دقیقه طول بکشد تا تمام شود. پس از تکمیل، یک پیام موفقیت آمیز دریافت خواهید کرد. اگر به جای npm از نخ استفاده کنید، نسخه شما ممکن است کمی متفاوت باشد:

 

Output

Success! Created vpsgol-app at your_file_path/vpsgol-app
Inside that directory, you can run several commands:

  npm start
    Starts the development server.

  npm build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

  npm eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd vpsgol-app
  npm start

Happy hacking!

اکنون که یک پروژه پایه دارید، آن را به صورت محلی اجرا کنید تا بتوانید نحوه نمایش پروژه در سرور را آزمایش کنید. ابتدا به دایرکتوری تغییر دهید:

cd vpsgol-app

پروژه را با استفاده از اسکریپت شروع npm اجرا کنید:

npm start

هنگامی که دستور اجرا می شود، خروجی با URL سرور توسعه محلی دریافت خواهید کرد:

 

Output

Compiled successfully!

You can now view vpsgol-app in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://192.168.1.110:3000

Note that the development build is not optimized.
To create a production build, use npm build.

یک مرورگر به http://localhost:3000 باز کنید و پروژه خود را پیدا خواهید کرد:

پروژه را با تایپ کردن CTRL+C یا ⌘+C در ترمینال متوقف کنید.

اکنون که یک برنامه React در حال کار دارید، می توانید کد را به یک مخزن GitHub فشار دهید.

مرحله 2 – فشار دادن کد به GitHub

برای استقرار برنامه شما، App Platform کد منبع شما را از یک مخزن کد میزبانی شده بازیابی می کند. در این مرحله، کد برنامه React خود را به یک مخزن GitHub فشار می‌دهید تا App Platform بتواند بعداً به آن دسترسی داشته باشد.

به حساب GitHub خود وارد شوید. پس از ورود به سیستم، یک مخزن جدید به نام vpsgol-app ایجاد کنید. می توانید مخزن را خصوصی یا عمومی کنید:

Create React App به طور خودکار پروژه شما را با git مقداردهی اولیه می کند، بنابراین می توانید تنظیم کنید تا کد را مستقیماً به GitHub فشار دهید. ابتدا مخزن مورد نظر خود را با دستور زیر اضافه کنید:

git remote add origin https://github.com/your_name/vpsgol-app.git

 

در مرحله بعد، اعلام کنید که می‌خواهید با موارد زیر به شاخه اصلی بروید:

git branch -M main

در نهایت، کد را به مخزن خود فشار دهید:

git push -u origin main

هنگامی که از شما خواسته شد کد خود را فشار دهید، اعتبار GitHub خود را وارد کنید.

هنگامی که کد را فشار می دهید یک پیام موفقیت آمیز دریافت خواهید کرد. پیام شما کمی متفاوت خواهد بود:

 

Output

Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (22/22), done.
Writing objects: 100% (22/22), 187.50 KiB | 6.94 MiB/s, done.
Total 22 (delta 0), reused 0 (delta 0)
To github.com:your_name/vpsgol-app.git
   4011c66..647d2e1  main -> main

اکنون کد خود را در مخزن GitHub کپی کرده اید.

در این مرحله، پروژه خود را به GitHub هل دادید تا بتوانید با استفاده از vpsgol Apps به آن دسترسی داشته باشید. در مرحله بعد، با استفاده از پروژه خود یک برنامه vpsgol جدید ایجاد می کنید و استقرار خودکار را تنظیم می کنید.

مرحله 3 – استقرار در پلتفرم برنامه vpsgol

در این مرحله، یک برنامه React را در پلتفرم اپلیکیشن vpsgol مستقر خواهید کرد. شما مخزن GitHub خود را به vpsgol متصل می کنید، پروژه را برای ساخت پیکربندی می کنید و پروژه اولیه خود را می سازید. پس از اجرای پروژه، هر تغییر باعث ایجاد یک ساخت و به روز رسانی جدید می شود.

در پایان این مرحله، می‌توانید برنامه‌ای را با تحویل مداوم درvpsgol اجرا کنید.

برای شروع، وارد حساب vpsgol خود شوید و دکمه Create را فشار دهید، سپس Apps را انتخاب کنید:

در مرحله بعد از شما خواسته می شود که مخزن GitHub خود را پیوند دهید. اگر هنوز آن را متصل نکرده اید، باید با نام کاربری و رمز عبور خود وارد شوید و به vpsgol مجوز دسترسی به مخازن خود را بدهید:

هنگامی که حساب خود را پیوند دادید، مخزن مورد نظر برای اتصال را در صفحه مجوز GitHub انتخاب کنید. در این مورد، شما از مخزن دیجیتال-اقیانوس-برنامه استفاده می کنید، اما در صورت تمایل می توانید مخازن بیشتری را متصل کنید:

پس از انتخاب مخزن، دوباره به رابط vpsgol متصل خواهید شد. vpsgol-app را از لیست مخازن انتخاب کنید، سپس Next را فشار دهید. این برنامه شما را مستقیماً به مخزن GitHub متصل می کند:

اکنون که مخزن خود را انتخاب کرده اید، باید اپلیکیشن vpsgol را پیکربندی کنید. در این مثال، سرور با انتخاب نیویورک در قسمت Region، در آمریکای شمالی مستقر خواهد شد و شاخه استقرار اصلی خواهد بود. برای برنامه خود، منطقه ای را انتخاب کنید که به موقعیت مکانی فیزیکی شما نزدیک است:.

برای این آموزش، تغییرات کد Autodeploy را بررسی می کنید. هر بار که کد را به‌روزرسانی می‌کنید، این به طور خودکار برنامه شما را بازسازی می‌کند.

Next را فشار دهید تا به صفحه پیکربندی برنامه خود بروید.

در مرحله بعد، نوع برنامه ای را که اجرا می کنید انتخاب کنید. از آنجایی که React دارایی های استاتیک را می سازد، Static Site را از منوی کشویی در قسمت Type انتخاب کنید.

توجه: Create React App یک تولیدکننده سایت ایستا مانند گتسبی نیست، اما شما از دارایی های ثابت استفاده می کنید، زیرا سرور نیازی به اجرای کدهای سمت سرور مانند Ruby یا PHP ندارد. برنامه از Node برای اجرای مراحل نصب و ساخت استفاده می کند، اما کد برنامه را در لایه آزاد اجرا نمی کند.

شما همچنین می توانید از یک اسکریپت ساخت سفارشی استفاده کنید. اما در این حالت، می‌توانید از دستور پیش‌فرض npm run build استفاده کنید. اگر اسکریپت ساخت متفاوتی برای تضمین کیفیت (QA) یا یک محیط تولید دارید، ممکن است بخواهید یک اسکریپت ساخت سفارشی ایجاد کنید:

Next را فشار دهید تا به صفحه نهایی و راه اندازی بروید.

در اینجا می توانید طرح قیمت را انتخاب کنید. ردیف شروع رایگان برای سایت های استاتیک ساخته شده است، بنابراین یکی را انتخاب کنید:

دکمه Launch Starter App را فشار دهید و vpsgol شروع به ساخت برنامه شما می کند.

این برنامه اسکریپت های ساخت npm ci و npm را در مخزن شما اجرا می کند. این همه وابستگی ها را دانلود می کند و فهرست ساخت را با یک نسخه کامپایل شده و کوچک شده از همه جاوا اسکریپت، فایل های HTML و سایر دارایی های شما ایجاد می کند. همچنین می توانید یک اسکریپت سفارشی در package.json خود ایجاد کنید و دستورات را در تب Components برنامه خود در App Platform به روز کنید.

چند دقیقه طول می کشد تا بیلد اجرا شود، اما پس از اتمام آن، یک پیام موفقیت آمیز و یک لینک به سایت جدید خود دریافت خواهید کرد. پیوند شما یک نام منحصر به فرد خواهد داشت و کمی متفاوت خواهد بود:

برای دسترسی به پروژه خود در مرورگر، Live App را فشار دهید. این پروژه مانند پروژه ای است که به صورت محلی آزمایش کرده اید، اما با یک URL ایمن در وب به صورت زنده نمایش داده می شود:

 

اکنون که پروژه شما پیکربندی شده است، هر زمان که تغییری در مخزن پیوند داده شده ایجاد کنید، یک بیلد جدید اجرا خواهید کرد. در این حالت، اگر تغییری را به شاخه اصلی فشار دهید، vpsgol به طور خودکار یک استقرار جدید را اجرا می کند. نیازی به ورود نیست؛ به محض اینکه تغییر را فشار دهید اجرا می شود:

در این مرحله، یک برنامه vpsgol جدید در پلتفرم App ایجاد کردید. شما حساب GitHub خود را متصل کردید و برنامه را برای ساخت شعبه اصلی پیکربندی کردید. پس از پیکربندی برنامه، متوجه شدید که برنامه پس از هر تغییر، یک بیلد جدید را مستقر می کند.

نتیجه

پلتفرم برنامه vpsgol ابزاری سریع برای استقرار برنامه ها در اختیار شما قرار می دهد. با یک تنظیم اولیه کوچک، برنامه شما به طور خودکار پس از هر تغییر مستقر می شود. این می‌تواند همراه با React برای راه‌اندازی سریع برنامه وب شما استفاده شود.

برچسب‌ها:App PlatformNode.jsاتصال به سرور مجازی لینوکسایجاد سرور مجازیبرنامه Reactخرید سرور مجازیسرور مجازیسرویس (PaaS)

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از Vuls به عنوان یک اسکنر آسیب پذیری در اوبونتو 18.04

ورود به سایت

معرفی

Vuls یک اسکنر آسیب‌پذیری منبع باز و بدون عامل است که در Go نوشته شده است. تجزیه و تحلیل آسیب پذیری امنیتی نرم افزار نصب شده بر روی یک سیستم را خودکار می کند، که می تواند برای مدیران سیستم به صورت دستی در یک محیط تولید کار سنگینی باشد. Vuls از چندین پایگاه داده آسیب‌پذیری معروف مانند پایگاه داده ملی آسیب‌پذیری (NVD) استفاده می‌کند. با توجه به منابع، Vuls این توانایی را دارد که چندین سیستم را به طور همزمان اسکن کند و گزارش ها را از طریق ایمیل یا Slack ارسال کند. دارای سه حالت اسکن (سریع، سریع روت و عمیق) است که می توانید با توجه به شرایط آن را انتخاب کنید.

Vuls یک اسکنر امنیتی فناوری اطلاعات گسترده نیست. به عنوان مثال، ترافیک شبکه را کنترل نمی کند یا در برابر حملات brute-force لاگین محافظت نمی کند. با این حال، Vuls راهی برای خودکار کردن گزارش آسیب‌پذیری برای بسته‌های لینوکس ارائه می‌کند. هنگامی که پایگاه‌های داده‌ای که Vuls استفاده می‌کند از رفع آسیب‌پذیری‌های خاص مطلع می‌شوند، Vuls این اطلاعات اصلاحی را نیز در گزارش‌های خود می‌آورد. هنگام تولید گزارش ها، Vuls با استفاده از سیستم رتبه بندی ایجاد شده از پایگاه داده، فوری ترین آسیب پذیری ها را اولویت بندی می کند.

در این آموزش، Vuls را در سرور اوبونتو 18.04 مستقر خواهید کرد. این شامل ساخت Vuls و وابستگی‌های آن از کد منبع، پیکربندی اسکن و گزارش‌دهی به Slack و اتصال اختیاری آن به ماشین‌های هدف برای فعال کردن اسکن از راه دور است. در پایان، شما یک سیستم خودکار گزارش‌دهی آسیب‌پذیری خواهید داشت که به شما در مورد آسیب‌پذیری‌ها هشدار می‌دهد و نیاز به بررسی دستی را از بین می‌برد.

پیش نیازها

برای تکمیل این آموزش، شما نیاز دارید:

  • سروری با حداقل 2 گیگابایت رم که اوبونتو 18.04 را با دسترسی روت اجرا می کند و یک حساب ثانویه غیر روت.
  • فضای کاری Slack که شما عضو آن هستید.
  • (اختیاری) چندین سرور در حال اجرا (ترجیحا) Ubuntu 18.04 با دسترسی ریشه و یک حساب ثانویه و غیر ریشه، اگر می‌خواهید Vuls را برای اسکن از راه دور تنظیم کنید.

مرحله 1 – نصب Dependencies

در این بخش، پوشه ای برای ذخیره داده های Vuls ایجاد می کنید، آخرین نسخه زبان برنامه نویسی Go را نصب می کنید و سایر بسته های مورد نیاز Vuls و وابستگی های آن را نصب می کنید.

برای این آموزش، تمام داده های مربوط به Vuls را در پوشه /usr/share/vuls-data ذخیره می کنید. با اجرای دستور زیر آن را ایجاد کنید:

sudo mkdir /usr/share/vuls-data

برای دسترسی به سامی، دستور زیر را اجرا کنید:

sudo chown -R sammy /usr/share/vuls-data

اکنون پوشه vuls-data را ایجاد کرده اید که فضای کاری شما خواهد بود. قبل از ادامه نصب بسته‌های مورد نیاز، ابتدا حافظه پنهان بسته منیجر را به‌روزرسانی کنید:

sudo apt update

برای دانلود و کامپایل وابستگی ها، git، gcc، make، sqlite، debian-goodies و wget را نصب خواهید کرد.

sqlite یک سیستم پایگاه داده است که در اینجا برای ذخیره اطلاعات آسیب پذیری از آن استفاده خواهید کرد. debian-goodies حاوی ابزار checkrestart است که اطلاعاتی را در مورد اینکه چه بسته هایی می توانند و باید در هر لحظه از زمان راه اندازی مجدد شوند را ارائه می دهد.

شما می توانید همه آنها را در یک دستور نصب کنید:

sudo apt install sqlite git debian-goodies gcc make wget -y

اکنون بسته های مورد نیاز را نصب کرده اید. سپس با اجرای دستور زیر، Go را با استفاده از مدیریت بسته snap نصب کنید:

sudo snap install go –classic

شما از snap برای نصب Go استفاده می‌کنید زیرا آخرین نسخه زبان را نصب می‌کند، برخلاف apt، که ممکن است نسخه قدیمی‌تر را نصب کند. کار با نسخه قدیمی توصیه نمی شود و ممکن است شما را از تکمیل این آموزش باز دارد.

برای کار کردن، Go به چند متغیر محیطی نیاز دارد که شما آنها را تنظیم خواهید کرد: GOPATH و PATH. GOPATH دایرکتوری کاری Go را مشخص می کند. PATH که شامل دایرکتوری هایی است که برنامه ها در آنها قرار می گیرند، باید گسترش یابد تا به سیستم بگوید که خود Go را کجا پیدا کند.

این متغیرهای محیطی باید هر بار که کاربر وارد سیستم می شود تنظیم شود. برای خودکار کردن این کار، یک فایل اجرایی جدید به نام go-env.sh در زیر /etc/profile.d ایجاد خواهید کرد. این باعث می شود که هر بار که کاربر وارد می شود دایرکتوری اجرا شود.

go-env.sh را با استفاده از ویرایشگر متن خود ایجاد کنید:

sudo nano /etc/profile.d/go-env.sh

دستورات زیر را به فایل اضافه کنید:

/etc/profile.d/go-env.sh

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin:/snap/bin

دستور صادرات متغیر محیطی داده شده را به مقدار دلخواه تنظیم می کند. در اینجا شما از آن برای پر کردن GOPATH و PATH با مقادیر مناسب استفاده می کنید.

ذخیره کنید و فایل را ببندید.

در حال حاضر، go-env.sh قابل اجرا نیست. برای رفع این مشکل، با اجرای دستور زیر آن را به عنوان قابل اجرا علامت گذاری کنید:

sudo chmod +x /etc/profile.d/go-env.sh

برای جلوگیری از ورود مجدد به سیستم، می توانید go-env.sh را با اجرای:

source /etc/profile.d/go-env.sh

دستور منبع فایل داده شده را در پوسته فعلی بارگذاری مجدد می کند در حالی که حالت آن را حفظ می کند.

در این بخش، زبان Go را نصب کرده‌اید، متغیرهای محیطی آن را تنظیم کرده‌اید و بسته‌هایی را نصب کرده‌اید که بعداً به آنها نیاز خواهید داشت. در مراحل بعدی، برنامه های Go را که Vuls نیاز دارد دانلود و کامپایل خواهید کرد. این برنامه‌ها go-cve-dictionary و goval-dictionary هستند که Vuls از آنها برای جستجو در پایگاه‌های داده آسیب‌پذیری استفاده می‌کند.

مرحله 2 – نصب و اجرای go-cve-dictionary

در این بخش، go-cve-dictionary را دانلود و کامپایل می‌کنید، یک بسته Go که دسترسی به NVD (پایگاه ملی آسیب‌پذیری) را فراهم می‌کند. سپس، آن را اجرا می‌کنید و داده‌های آسیب‌پذیری را برای Vuls واکشی می‌کنید تا از آن استفاده کند. NVD مخزن آسیب‌پذیری‌های امنیت سایبری گزارش‌شده عمومی توسط دولت ایالات متحده است که حاوی شناسه‌های آسیب‌پذیری (CVE – آسیب‌پذیری‌های رایج و مواجهه‌ها)، خلاصه‌ها و تجزیه و تحلیل تأثیر است و در قالب قابل خواندن توسط ماشین در دسترس است.

برو بسته‌ها را تحت $GOPATH/src/ ذخیره می‌کند. شما می توانید این را با استفاده از زیر شاخه ها برای یادداشت مبدا گسترش دهید. به عنوان مثال، بسته‌های GitHub که توسط کاربر مثال کاربر ساخته شده است، در $GOPATH/src/github.com/example-user ذخیره می‌شوند.

ابتدا go-cve-dictionary را با شبیه سازی بسته Go از GitHub و سپس کامپایل کردن آن نصب خواهید کرد.

با ایجاد یک دایرکتوری برای ذخیره آن، مطابق مسیر مثال، شروع کنید:

mkdir -p $GOPATH/src/github.com/vulsio

با اجرای زیر به آن بروید:

cd $GOPATH/src/github.com/vulsio

اکنون با اجرای:

git clone https://github.com/vulsio/go-cve-dictionary.git

سپس به ریشه بسته بروید:

cd go-cve-dictionary

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

make install

به خاطر داشته باشید که اتمام این دستور ممکن است کمی طول بکشد. برای در دسترس قرار دادن آن در سطح سیستم، آن را در /usr/local/bin کپی کنید:

sudo cp $GOPATH/bin/go-cve-dictionary /usr/local/bin

go-cve-dictionary نیاز به دسترسی به دایرکتوری خروجی log دارد و به طور پیش فرض /var/log/vuls است. آن را با اجرا ایجاد کنید:

sudo mkdir /var/log/vuls

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

sudo chmod 700 /var/log/vuls

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

sudo chmod 700 /var/log/vuls

تنظیم پرچم های مجوز روی 700 دسترسی فقط به مالک را محدود می کند.

برای اینکه سامی یا کاربر دیگری به آن دسترسی داشته باشد، دستور زیر را اجرا کنید:

sudo chown -R sammy /var/log/vuls

اکنون، داده‌های آسیب‌پذیری را از NVD دریافت کرده و در فضای کاری Vuls خود ذخیره می‌کنید (/usr/share/vuls-data):

go-cve-dictionary fetch nvd –dbpath /usr/share/vuls-data/cve.sqlite3

این دستور داده‌های آسیب‌پذیری NVD را از سال 2002 تا سال جاری دریافت می‌کند و آن‌ها را در پایگاه داده تحت /usr/share/vuls-data ذخیره می‌کند.

در این مرحله، go-cve-dictionary را دانلود و نصب کرده‌اید و داده‌های NVD را برای Vuls برای استفاده بعدی واکشی کرده‌اید. در بخش بعدی، goval-dictionary را دانلود و نصب می‌کنید و داده‌های OVAL را برای اوبونتو واکشی می‌کنید.

مرحله 3 – نصب و اجرای Goval-Dictionary

در این بخش، goval-dictionary را دانلود و کامپایل می‌کنید، یک بسته Go که دسترسی به پایگاه داده OVAL را برای اوبونتو فراهم می‌کند. سپس آن را اجرا می‌کنید و داده‌های آسیب‌پذیری را برای استفاده Vuls واکشی می‌کنید. OVAL مخفف Open Vulnerability and Assessment Language است که یک زبان باز است که برای بیان بررسی‌ها برای تعیین اینکه آیا آسیب‌پذیری‌های نرم‌افزاری در یک سیستم خاص وجود دارد یا خیر استفاده می‌شود.

به پوشه $GOPATH/src/github.com/vulsio بروید:

cd $GOPATH/src/github.com/vulsio

با اجرای دستور زیر بسته را از GitHub کلون کنید:

git clone https://github.com/vulsio/goval-dictionary.git

وارد پوشه بسته شوید:

cd goval-dictionary

آن را با make کامپایل و نصب کنید:

make install

برای دسترسی جهانی آن را در /usr/local/bin کپی کنید:

sudo cp $GOPATH/bin/goval-dictionary /usr/local/bin

سپس، با اجرای دستور زیر، داده های OVAL را برای Ubuntu 18.x واکشی کنید:

sudo goval-dictionary fetch ubuntu –dbpath=/usr/share/vuls-data/oval.sqlite3 18

در این مرحله، goval-dictionary را دانلود و نصب کرده اید و داده های OVAL را برای Ubuntu 18.x واکشی کرده اید. در مرحله بعدی، gost را دانلود و نصب می‌کنید و داده‌های ردیاب امنیتی Debian را واکشی می‌کنید.

مرحله 4 – نصب و اجرای gost

در این بخش، gost را دانلود و کامپایل می‌کنید، بسته Go که دسترسی به ردیاب اشکال امنیتی دبیان را فراهم می‌کند. سپس آن را اجرا می‌کنید و داده‌های آسیب‌پذیری را برای Vuls واکشی می‌کنید تا از آن استفاده کند. ردیاب امنیتی اوبونتو تمام اطلاعات مربوط به وضعیت آسیب پذیری بسته های توزیع شده با اوبونتو را جمع آوری می کند.

این بسته را در همان دایرکتوری قبلی ذخیره خواهید کرد. با اجرای دستور زیر به آن بروید:

cd $GOPATH/src/github.com/vulsio

با اجرای زیر بسته را از GitHub کلون کنید:

git clone https://github.com/vulsio/gost.git

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

cd gost

آن را با make کامپایل و نصب کنید:

make install

برای دسترسی جهانی آن را در /usr/local/bin کپی کنید:

sudo cp $GOPATH/bin/gost /usr/local/bin

سپس یک فهرست فایل log برای gost ایجاد کنید:

sudo mkdir /var/log/gost

با دستور زیر دسترسی کاربر فعلی را محدود کنید:

sudo chmod 700 /var/log/gost

همانطور که قبلاً ذکر شد، تنظیم پرچم های مجوز روی 700 دسترسی فقط به مالک را محدود می کند.

برای اینکه سامی یا کاربر دیگری به آن دسترسی داشته باشد، دستور زیر را اجرا کنید:

sudo chown -R sammy /var/log/gost

سپس، داده‌های ردیاب امنیتی اوبونتو را با اجرای زیر واکشی کنید:

gost fetch ubuntu –dbpath=/usr/share/vuls-data/gost.sqlite3

خروجی طولانی خواهد بود و احتمالاً به درستی پاک نمی شود. برای پاک کردن آن می توانید دستور clear را اجرا کنید.

در این مرحله شما gost را دانلود و نصب کرده اید و داده ها را برای دبیان واکشی کرده اید. در مرحله بعد، Vuls را دانلود و نصب خواهید کرد.

مرحله 5 – دانلود و پیکربندی Vuls

با نصب تمام وابستگی ها، اکنون Vuls را از کد منبع دانلود و کامپایل خواهید کرد. پس از آن، آن را برای اسکن ماشین محلی پیکربندی خواهید کرد.

با این دستور یک دایرکتوری جدید ایجاد کنید که حاوی مسیر مخزن Vuls باشد:

mkdir -p $GOPATH/src/github.com/future-architect

به آن بروید:

cd $GOPATH/src/github.com/future-architect

با اجرای دستور زیر، Vuls را از GitHub کلون کنید:

git clone https://github.com/future-architect/vuls.git

وارد پوشه بسته شوید:

cd vuls

کامپایل و همزمان با اجرای:

make install

به یاد داشته باشید که ممکن است مدتی طول بکشد تا این دستور کامل شود.

برای دسترسی جهانی آن را در /usr/local/bin کپی کنید:

sudo cp $GOPATH/bin/vuls /usr/local/bin

اکنون، یک فایل پیکربندی برای Vuls ایجاد خواهید کرد. به /usr/share/vuls-data برگردید:

cd /usr/share/vuls-data

Vuls پیکربندی خود را در یک فایل TOML ذخیره می کند که شما آن را config.toml می نامید. آن را با استفاده از ویرایشگر متن خود ایجاد کنید:

sudo nano config.toml

پیکربندی زیر را وارد کنید:

/usr/share/vuls-data/config.toml

[cveDict]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/cve.sqlite3"

[ovalDict]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/oval.sqlite3"

[gost]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/gost.sqlite3"

[servers]

[servers.localhost]
host = "localhost"
port = "local"
scanMode = [ "fast" ]
#scanMode = ["fast", "fast-root", "deep", "offline"]

 

دو بخش اول این پیکربندی (cveDict و ovalDict) Vuls را به پایگاه‌های آسیب‌پذیری که در دو مرحله آخر ایجاد کردید، نشان می‌دهند. بخش بعدی (سرورها) شروع اطلاعات مربوط به سرور را نشان می دهد. بخش های جداگانه اطلاعات مربوط به هر سرور را گروه بندی می کند. تنها سروری که Vuls با این پیکربندی مشخص شده اسکن می‌کند، سرور محلی (localhost) است.

Vuls چهار حالت اسکن را ارائه می دهد:

  • حالت سریع (پیش‌فرض): بدون دسترسی ریشه اسکن می‌کند، وابستگی ندارد و روی سرور مورد نظر بسیار سبک است.
  • حالت ریشه سریع: با امتیازات ریشه اسکن می کند و می تواند فرآیندهای ارتقا یافته، اما هنوز راه اندازی مجدد نشده را شناسایی کند.
  • حالت اسکن عمیق: مانند حالت روت سریع، اما تغییرات لاگ را بررسی می کند، که می تواند منجر به بار زیاد روی سرور مورد نظر شود.
  • حالت آفلاین: دستگاه را بدون دسترسی به اینترنت اسکن می کند و می تواند همراه با حالت های دیگر استفاده شود.
    ذخیره کنید و فایل را ببندید.

برای تست اعتبار فایل پیکربندی، دستور زیر را اجرا کنید:

vuls configtest

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

 

Output

[Dec 14 09:07:28]  INFO [localhost] vuls-v0.19.0-build-20211214_090234_2b7294a
[Dec 14 09:07:28]  INFO [localhost] Validating config...
[Dec 14 09:07:28]  INFO [localhost] Detecting Server/Container OS...
[Dec 14 09:07:28]  INFO [localhost] Detecting OS of servers...
[Dec 14 09:07:28]  INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04
[Dec 14 09:07:28]  INFO [localhost] Detecting OS of containers...
[Dec 14 09:07:28]  INFO [localhost] Checking Scan Modes...
[Dec 14 09:07:28]  INFO [localhost] Checking dependencies...
[Dec 14 09:07:28]  INFO [localhost] Dependencies... Pass
[Dec 14 09:07:28]  INFO [localhost] Checking sudo settings...
[Dec 14 09:07:28]  INFO [localhost] sudo ... No need
[Dec 14 09:07:28]  INFO [localhost] It can be scanned with fast scan mode even if warn or err messages are displayed due to lack of dependent packages or sudo settings in fast-root or deep scan mode
[Dec 14 09:07:28]  INFO [localhost] Scannable servers are below...
localhost

شما پیکربندی را به درستی وارد کرده اید و Vuls تشخیص داده است که می تواند سرور محلی را اسکن کند.

شما Vuls را برای اسکن سرور محلی نصب و پیکربندی کرده اید. در مرحله بعد اسکن محلی را اجرا کرده و گزارش تولید شده را مشاهده خواهید کرد.

مرحله 6 – اجرای یک اسکن محلی

در این بخش، یک اسکن محلی را اجرا کرده و سپس گزارش آسیب‌پذیری ایجاد شده را مشاهده خواهید کرد. در حال حاضر، شما فقط سرور محلی را پیکربندی کرده اید که Vuls در مرحله آخر به درستی آن را شناسایی کرده است. حالت اسکن پیش فرض، اگر به صراحت مشخص نشده باشد، سریع است.

برای اجرای اسکن، دستور زیر را اجرا کنید:

vuls scan

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

[Dec 14 09:07:47]  INFO [localhost] vuls-v0.19.0-build-20211214_090234_2b7294a
[Dec 14 09:07:47]  INFO [localhost] Start scanning
[Dec 14 09:07:47]  INFO [localhost] config: /usr/share/vuls-data/config.toml
[Dec 14 09:07:47]  INFO [localhost] Validating config...
[Dec 14 09:07:47]  INFO [localhost] Detecting Server/Container OS...
[Dec 14 09:07:47]  INFO [localhost] Detecting OS of servers...
[Dec 14 09:07:47]  INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04
[Dec 14 09:07:47]  INFO [localhost] Detecting OS of containers...
[Dec 14 09:07:47]  INFO [localhost] Checking Scan Modes...
[Dec 14 09:07:47]  INFO [localhost] Detecting Platforms...
[Dec 14 09:07:47]  INFO [localhost] (1/1) localhost is running on other
[Dec 14 09:07:47]  INFO [localhost] Scanning OS pkg in fast mode
[Dec 14 09:07:47]  INFO [localhost] Scanning listen port...
[Dec 14 09:07:47]  INFO [localhost] Using Port Scanner: Vuls built-in Scanner


Scan Summary
================
localhost       ubuntu18.04     539 installed


To view the detail, vuls tui is useful.
To send a report, run vuls report -h.

Vuls کارهایی که در این فرآیند انجام داده را ثبت کرده است. برای مشاهده گزارشی از آسیب پذیری هایی که شناسایی کرده است، اجرا کنید:

vuls tui

Vuls نمای گزارش را به چهار پانل تقسیم می کند:

  • ماشین‌های اسکن شده: در سمت چپ بالا، ماشین‌هایی را که Vuls اسکن کرده‌اند فهرست می‌کند.
  • آسیب‌پذیری‌های یافت شده: در سمت راست لیست ماشین قرار دارد، آسیب‌پذیری‌های Vuls موجود در بسته‌های نصب شده را نشان می‌دهد.
  • اطلاعات دقیق: قسمت سمت چپ صفحه را اشغال می کند، اطلاعات دقیق در مورد آسیب پذیری را نشان می دهد که از پایگاه های داده استخراج شده است.
  • بسته های تحت تأثیر: در سمت راست اطلاعات دقیق قرار دارد، نشان می دهد که نسخه های بسته تحت تأثیر کدامند و آیا نسخه ثابت وجود دارد.

می توانید با فشار دادن ENTER مکان نما را در پانل ها بچرخانید و با فلش های صفحه کلید حرکت کنید. وقتی کارتان تمام شد، CTRL+C را برای خروج فشار دهید.

در این مرحله، یک اسکن محلی را اجرا کرده و نتایج را بررسی کردید. در بخش بعدی (اختیاری)، Vuls را برای اسکن چندین ماشین هدف پیکربندی خواهید کرد.

مرحله 7 – (اختیاری) پیکربندی ماشین‌های هدف چندگانه

در این بخش، Vuls را برای اسکن چندین ماشین هدف پیکربندی می‌کنید. این مستلزم پیکربندی /etc/sudoers روی هدف و پیکربندی Vuls برای اسکن هدف است.

در مرحله قبل، Vuls را برای اسکن ماشین محلی (localhost) پیکربندی کردید. شما می توانید هر تعداد سرور که می خواهید اضافه کنید، به شرطی که موارد زیر را داشته باشید:

  • IP سرور مورد نظر
  • دسترسی ریشه به سرور مورد نظر
  • یک حساب کاربری موجود در سرور مورد نظر

شما فقط می توانید از یک حساب کاربری غیر ریشه در سرور مورد نظر برای اسکن در حالت سریع استفاده کنید. برای فعال کردن اسکن در حالت‌های روت سریع و عمیق، باید فایل /etc/sudoers را در ماشین(های) مورد نظر ویرایش کنید. فایل sudoers کنترل می کند که کاربران می توانند چه دستوراتی را اجرا کنند و همچنین اینکه آیا برای دستورات مشخص شده به رمز عبور نیاز دارید یا خیر.

از آنجایی که visudo ابزاری برای تعریف قوانین برای دسترسی و دسترسی ممتاز است، شما فقط می توانید آن را به صورت root اجرا کنید. به دلیل اهمیت sudoers، فایل بدون دادن اخطار با خطا خارج نمی شود.

در سرور هدف، به عنوان root وارد شوید و با اجرای visudo، sudoers را برای ویرایش باز کنید:

visudo

این خط را به انتهای فایل اضافه کنید:

/etc/sudoers

sammy-shark ALL=(ALL) NOPASSWD: /usr/bin/apt-get update, /usr/bin/stat *, /usr/sbin/checkrestart

این خط به sudo دستور می دهد تا به کاربر sammy-shark اجازه دهد تا آپدیت apt-get، checkrestart و هر دستوری که از stat در دسترس است را بدون ارائه رمز عبور اجرا کند.

ذخیره کنید و فایل را ببندید. اگر در فرآیند یک خطای نحوی مرتکب شدید، visudo به شما اطلاع می‌دهد و پیشنهاد می‌کند دوباره آن را ویرایش کنید یا خارج شوید.

Vuls از ابزار checkrestart برای بررسی بسته هایی که به روز شده اند، اما نیاز به راه اندازی مجدد دارند، استفاده می کند. برای اطمینان از اینکه سرور هدف آن را دارد، با اجرای دستور زیر آن را نصب کنید:

apt install debian-goodies -y

این تنها کاری است که باید روی سرور مورد نظر انجام دهید. اکنون می توانید از هدف خارج شوید و دوباره وارد اولین سرور خود شوید.

برای افزودن یک سرور جدید برای اسکن، config.toml را باز کنید و خطوط زیر را زیر علامت [سرورها] اضافه کنید:

/usr/share/vuls-data/config.toml

[servers.target_name]
host = "target_ip"
port = "22"
user = "account_username"
keyPath = "/home/sammy/.ssh/id_rsa"
scanMode = [ "deep" ] # "fast", "fast-root" or "deep"

خطوط بالا به عنوان الگویی برای افزودن سرورهای جدید عمل می کنند. به یاد داشته باشید که target_name را با نام دلخواه، target_ip را با IP سرور مورد نظر، account_username را با نام کاربری جایگزین کنید و مسیر کلید RSA خصوصی خود را ارائه دهید. Vuls از احراز هویت رمز عبور SSH پشتیبانی نمی کند، بنابراین تعیین یک مسیر کلیدی ضروری است.

ذخیره کنید و فایل را ببندید.

در مرحله بعد، برای هر سرور هدفی که اضافه کرده اید، کلیدهای RSA را در دستگاه محلی تأیید خواهید کرد. برای رسیدن به این هدف، از اولین سرور خود با کلید مناسب وارد سرور مورد نظر می شوید، مانند:

ssh sammy-shark@target_ip -i /home/sammy/.ssh/id_rsa

به یاد داشته باشید که مسیر کلید RSA خصوصی خود را وارد کنید. وقتی از شما پرسیده شد که آیا می خواهید به اتصال ادامه دهید، بله را وارد کنید، سپس با فشار دادن CTRL + D از سیستم خارج شوید.

اگر در مورد باز بودن مجوزهای کلیدی با خطا مواجه شدید، با اجرای دستور زیر آنها را روی 600 تنظیم کنید:

chmod 600 account_rsa_key

تنظیم مجوزها روی 600 تضمین می کند که فقط مالک می تواند فایل کلید را بخواند و بنویسد.

برای بررسی اعتبار پیکربندی جدید، دستور زیر را اجرا کنید:

vuls configtest

خروجی جزئیات همه چیزهایی را که Vuls بررسی کرده است، مانند وابستگی‌ها، دسترسی ابرکاربر و نسخه‌های سیستم‌عامل نشان می‌دهد. اگر خطایی وجود دارد، config.toml خود را با تنظیمات موجود در آموزش بررسی کنید.

در این مرحله، سرورهای هدف بیشتری را به پیکربندی Vuls خود اضافه کردید، بنابراین آنها را برای اسکن علامت گذاری کردید. در بخش بعدی، Vuls را برای اسکن دوره ای و ارسال گزارش ها به یک فضای کاری پیکربندی شده Slack پیکربندی می کنید.

مرحله 8 – پیکربندی اسکن دوره ای و گزارش به Slack

در این بخش، Vuls را پیکربندی می‌کنید تا گزارش‌ها را به Slack ارسال کند و یک cron job برای اجرای دوره‌ای اسکن Vuls ایجاد کنید.

برای استفاده از ادغام Slack، باید یک وب هوک ورودی در Slack برای فضای کاری خود داشته باشید. وب هوک های ورودی یک راه ساده برای یک برنامه کاربردی برای ارائه اطلاعات بلادرنگ از سایر برنامه ها است. در این مورد، Vuls را برای گزارش به کانال Slack خود پیکربندی می‌کنید.

اگر تا به حال یک هوک ایجاد نکرده اید، ابتدا باید یک برنامه برای فضای کاری خود ایجاد کنید. برای انجام این کار ابتدا وارد Slack شده و به صفحه ایجاد اپلیکیشن بروید. نامی را که می‌شناسید انتخاب کنید، فضای کاری مورد نظر را انتخاب کنید و روی ایجاد برنامه کلیک کنید.

به صفحه تنظیمات برنامه جدید هدایت خواهید شد. روی Incoming Webhooks در نوار ناوبری سمت چپ کلیک کنید.

با چرخاندن دکمه سوئیچ در کنار عنوان فعال سازی وب هوک های ورودی، وب هوک ها را فعال کنید.

بخش جدیدی در پایین صفحه باز خواهد شد. به پایین بروید و روی دکمه Add New Webhook to Workspace کلیک کنید. در صفحه بعد کانالی که می خواهید گزارش ها به آن ارسال شود را انتخاب کنید و روی Allow کلیک کنید.

به صفحه تنظیمات مربوط به وب هوک ها هدایت می شوید و یک وب هوک جدید را در جدول می بینید. روی Copy کلیک کنید تا آن را در کلیپ بورد کپی کنید و برای استفاده بعدی یادداشت کنید.

سپس، config.toml را برای ویرایش باز کنید:

sudo nano config.toml

خطوط زیر را اضافه کنید:

/usr/share/vuls-data/config.toml

[slack]
hookURL      = "your_hook_url"
channel      = "#your_channel_name"
authUser     = "your_username"
#notifyUsers  = ["@username"]

your_hook_URL را با URL webhook که قبلاً ذکر کردید، your_channel_name را با نام کانال مورد نظر، و your_username را با نام کاربری که وب‌هوک را ایجاد کرده است، جایگزین کنید. ذخیره کنید و فایل را ببندید.

برای آزمایش ادغام، می‌توانید با اجرای گزارش vuls گزارشی مانند زیر ایجاد کنید:

sudo vuls report -to-slack

Vuls چند لحظه طول می کشد تا اجرا شود و با موفقیت از آن خارج شود. اگر خطایی نشان داد، آنچه را که وارد کرده‌اید در خطوط قبل بررسی کنید.

می توانید برنامه Slack را بررسی کنید و تأیید کنید که Vuls با موفقیت گزارش را ارسال کرده است.

اکنون که گزارش‌دهی را پیکربندی کرده‌اید، اسکن‌های زمان‌بندی شده را تنظیم می‌کنید. cron یک زمانبندی کار مبتنی بر زمان است که در هر ماشین اوبونتو یافت می شود. از طریق فایل crontab پیکربندی می‌شود که دستوری را با نحو دقیق مشخص می‌کند که چه زمانی باید اجرا شود. برای کمک به سهولت در ویرایش، از ابزار crontab استفاده خواهید کرد که فایل crontab فعلی را در یک ویرایشگر باز می کند.

فایل crontab فعلی را با اجرای دستور زیر باز کنید:

crontab -e

وقتی از شما خواسته شد، ویرایشگر متن دلخواه خود را از لیست انتخاب کنید.

خط زیر را به انتهای فایل اضافه کنید:

0 0 * * * vuls scan -config=/usr/share/vuls-data/config.toml; vuls report -config=/usr/share/vuls-data/config.toml > /dev/null 2>&1

خط بالا به cron دستور می دهد که اسکن vuls و گزارش vuls را با پیکربندی داده شده هر روز در ظهر اجرا کند (در نحو cron با 0 0 * * * مشخص می شود).

ذخیره کنید و فایل را ببندید.

در این مرحله، Vuls را به فضای کاری Slack خود متصل کرده‌اید و cron را برای اجرای اسکن Vuls و گزارش هر روز در ظهر پیکربندی کرده‌اید.

نتیجه

شما اکنون با موفقیت Vuls را با اسکن و گزارش خودکار روی سرور اوبونتو 18.04 راه اندازی کرده اید.

با Vuls، ارزیابی آسیب‌پذیری به فرآیند یکپارچه‌تر در محیط‌های تولید تبدیل می‌شود. به‌عنوان جایگزینی برای راه‌اندازی cron، می‌توان از Vuls در یک گردش کار استقرار مداوم استفاده کرد، زیرا اسکن‌های آن سبک هستند و می‌توانید در صورت نیاز آن‌ها را اجرا کنید. همچنین می توانید برای محدود کردن دسترسی و کاهش نیاز به دسترسی ریشه، یک فایروال با Vuls پیاده سازی کنید.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:VPS یا سرور مجازیVulsاوبونتو 18.04خرید سرور مجازیراهنمای سرور مجازیسرور اوبونتو 18.04سرور مجازی آمریکافایروال با Vulsنحوه استفاده از Vuls

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه نصب Node.js در اوبونتو 18.04

ورود به سایت

معرفی

Node.js یک پلت فرم جاوا اسکریپت برای برنامه نویسی همه منظوره است که به کاربران اجازه می دهد تا برنامه های شبکه را به سرعت بسازند. Node.js با استفاده از جاوا اسکریپت در قسمت جلویی و پشتیبان، توسعه را سازگارتر و یکپارچه تر می کند.

پیش نیازها

این راهنما فرض می کند که از اوبونتو 18.04 استفاده می کنید. قبل از شروع، باید یک حساب کاربری غیر ریشه با امتیازات sudo روی سیستم خود تنظیم کنید.

نصب Node.js از مخازن پیش فرض با Apt

اوبونتو 18.04 حاوی نسخه‌ای از Node.js در مخازن پیش‌فرض خود است که می‌توان از آن برای ارائه یک تجربه ثابت در چندین سیستم استفاده کرد. در زمان نگارش، نسخه موجود در مخازن 8.10.0 است. این آخرین نسخه نخواهد بود، اما باید پایدار و برای آزمایش سریع زبان کافی باشد.

برای دریافت این نسخه می توانید از apt package manager استفاده کنید. فهرست بسته محلی خود را تازه کنید:

sudo apt update

حالا Node.js را نصب کنید:

sudo apt install nodejs

تأیید کنید که Node.js را با موفقیت نصب کرده‌اید، با جستجو در node برای شماره نسخه آن:

node -v

 

Output

v8.10.0

اگر بسته موجود در مخازن با نیازهای شما مطابقت دارد، این تنها کاری است که برای راه اندازی Node.js باید انجام دهید. در بیشتر موارد، شما همچنین می خواهید npm، مدیر بسته Node.js را نیز نصب کنید. می توانید بسته npm را با apt نصب کنید:

sudo apt install npm

این به شما امکان می دهد ماژول ها و بسته هایی را برای استفاده با Node.js نصب کنید.

اکنون Node.js و npm را با استفاده از apt و مخازن نرم افزار پیش فرض اوبونتو با موفقیت نصب کرده اید. با این حال، ممکن است ترجیح دهید با نسخه‌های مختلف Node.js، آرشیو بسته‌ها یا مدیران نسخه کار کنید. مراحل بعدی این عناصر را به همراه روش‌های نصب انعطاف‌پذیرتر و قوی‌تر مورد بحث قرار خواهند داد.

نصب Node.js با Apt با استفاده از NodeSource PPA

برای نصب نسخه جدیدتر Node.js می توانید PPA (بایگانی بسته شخصی) را که توسط NodeSource نگهداری می شود اضافه کنید. این نسخه‌های به‌روز Node.js را نسبت به مخازن رسمی اوبونتو خواهد داشت و به شما امکان می‌دهد بین چندین نسخه موجود پلتفرم یکی را انتخاب کنید.

ابتدا PPA را نصب کنید تا به محتویات آن دسترسی داشته باشید. از فهرست اصلی خود، از curl برای بازیابی اسکریپت نصب نسخه دلخواه خود استفاده کنید، مطمئن شوید که 17.x را با رشته نسخه ترجیحی خود جایگزین کنید (در صورت متفاوت بودن):

cd ~
curl -sL https://deb.nodesource.com/setup_17.x -o nodesource_setup.sh

برای اطلاعات بیشتر در مورد نسخه های موجود می توانید به مستندات NodeSource مراجعه کنید.

در صورت تمایل، می توانید محتوای این اسکریپت را با nano (یا ویرایشگر متن دلخواه خود) بررسی کنید:

nano nodesource_setup.sh

هنگامی که از اجرای امن اسکریپت راضی شدید، از ویرایشگر متن خارج شوید. اگر از nano استفاده می‌کنید، می‌توانید با فشار دادن CTRL + X خارج شوید. سپس اسکریپت را با sudo اجرا کنید:

sudo bash nodesource_setup.sh

PPA به پیکربندی شما اضافه می شود و کش بسته محلی شما به طور خودکار به روز می شود. اکنون می توانید بسته Node.js را مانند قسمت قبل نصب کنید:

sudo apt install nodejs

با اجرای گره با پرچم -v، تأیید کنید که نسخه جدید را نصب کرده اید:

node -v

 

Output

v17.3.0

برخلاف آنچه در مخازن بسته پیش‌فرض اوبونتو وجود دارد، این بسته nodejs دارای هر دو نود و npm است، بنابراین نیازی به نصب جداگانه npm ندارید.

npm از یک فایل پیکربندی در فهرست اصلی شما برای پیگیری به‌روزرسانی‌ها استفاده می‌کند. اولین باری که npm را اجرا می کنید ایجاد می شود. برای اطمینان از نصب بودن npm و ایجاد فایل پیکربندی، دستور زیر را اجرا کنید:

npm -v

 

Output

8.3.0

برای اینکه برخی از بسته های npm کار کنند (مثلاً آنهایی که نیاز به کامپایل کد از منبع دارند)، باید بسته build-essential را نصب کنید:

sudo apt install build-essential

اکنون ابزارهای لازم برای کار با بسته های npm را دارید که نیاز به کامپایل کد از منبع دارند.

در این بخش، Node.js و npm را با استفاده از apt و NodeSource PPA با موفقیت نصب کردید. در مرحله بعد، از Node Version Manager برای نصب و مدیریت چندین نسخه Node.js استفاده خواهید کرد.

نصب Node با استفاده از Node Version Manager

یک جایگزین برای نصب Node.js استفاده از ابزاری به نام nvm، Node Version Manager (NVM) است. nvm به جای کار در سطح سیستم عامل، در سطح دایرکتوری مستقل در فهرست اصلی شما کار می کند. این بدان معناست که می‌توانید چندین نسخه مستقل Node.js را بدون تأثیر بر کل سیستم نصب کنید.

کنترل محیط خود با nvm به شما امکان می دهد به جدیدترین نسخه های Node.js دسترسی داشته باشید و نسخه های قبلی را حفظ و مدیریت کنید. با این حال، این یک ابزار متفاوت از apt است، و نسخه‌هایی از Node.js که با آن مدیریت می‌کنید با نسخه‌هایی که با apt مدیریت می‌کنید متمایز هستند.

برای نصب NVM در دستگاه اوبونتو 18.04، از صفحه GitHub پروژه بازدید کنید. دستور curl را از فایل README که در صفحه اصلی نمایش داده می شود کپی کنید تا آخرین نسخه اسکریپت نصب را دریافت کنید.

قبل از انتقال فرمان به bash، همیشه ایده خوبی است که اسکریپت را بررسی کنید تا مطمئن شوید که کاری را انجام نمی دهد که با آن موافق نیستید. با حذف | می توانید این کار را انجام دهید بخش bash در انتهای دستور curl:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh

خروجی را مرور کنید و مطمئن شوید که با تغییراتی که ایجاد می کند راحت هستید. پس از رضایت، همان دستور را با | اجرا کنید bash در انتها اضافه شده است. URL مورد استفاده شما بسته به آخرین نسخه NVM تغییر می کند، اما از هم اکنون، اسکریپت را می توان با اجرای موارد زیر دانلود و اجرا کرد:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

این اسکریپت nvm را در حساب کاربری شما نصب می کند. برای استفاده از آن، ابتدا فایل .bashrc را سورس کنید:

source ~/.bashrc

با نصب nvm، می توانید نسخه های ایزوله Node.js را نصب کنید. ابتدا از nvm بپرسید که چه نسخه هایی از Node موجود است:

nvm ls-remote

 

Output

...
        v14.18.2   (Latest LTS: Fermium)
        v15.0.0
        v15.0.1
        v15.1.0
        v15.2.0
        v15.2.1
        v15.3.0
        v15.4.0
        v15.5.0
        v15.5.1
        v15.6.0
        v15.7.0
        v15.8.0
        v15.9.0
       v15.10.0
       v15.11.0
       v15.12.0
       v15.13.0
       v15.14.0
        v16.0.0
        v16.1.0
        v16.2.0
        v16.3.0
        v16.4.0
        v16.4.1
        v16.4.2
        v16.5.0
        v16.6.0
        v16.6.1
        v16.6.2
        v16.7.0
        v16.8.0
        v16.9.0
        v16.9.1
       v16.10.0
       v16.11.0
       v16.11.1
       v16.12.0
       v16.13.0   (LTS: Gallium)
       v16.13.1   (Latest LTS: Gallium)
        v17.0.0
        v17.0.1
        v17.1.0
        v17.2.0
        v17.3.0

این یک لیست بسیار طولانی است، اما می توانید با وارد کردن هر یک از نسخه های منتشر شده لیست، نسخه ای از Node را نصب کنید. به عنوان مثال، برای دریافت نسخه v16.13.1، موارد زیر را اجرا کنید:

nvm install v16.13.1

Output
Now using node v16.13.1 (npm v8.1.2)

گاهی اوقات nvm به استفاده از آخرین نسخه نصب شده تغییر می کند. اما می‌توانید به nvm بگویید از نسخه‌ای که دانلود کرده‌اید استفاده کند (اگر متفاوت است):

nvm use v16.13.1

 

Output

Now using node v16.13.1 (npm v8.1.2)

گاهی اوقات nvm به استفاده از آخرین نسخه نصب شده تغییر می کند. اما می‌توانید به nvm بگویید از نسخه‌ای که دانلود کرده‌اید استفاده کند (اگر متفاوت است):

nvm use v16.13.1

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

node -v

 

Output

v16.13.1

اگر چندین نسخه Node را نصب کرده‌اید، می‌توانید ls را اجرا کنید تا لیستی از آنها را دریافت کنید:

nvm ls

 

Output

->     v16.13.1
         system
default -> v16.13.1
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v16.13.1) (default)
stable -> 16.13 (-> v16.13.1) (default)
lts/* -> lts/gallium (-> v16.13.1)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.8 (-> N/A)
lts/fermium -> v14.18.2 (-> N/A)
lts/gallium -> v16.13.1

همچنین می توانید به صورت پیش فرض یکی از نسخه ها را انتخاب کنید:

nvm alias default 16.13.1

 

Output

default -> 16.13.1 (-> v16.13.1)

این نسخه به صورت خودکار انتخاب می شود زمانی که یک جلسه جدید ایجاد می شود. همچنین می توانید با نام مستعار در دستور زیر به آن ارجاع دهید:

nvm use default

 

Output

Now using node v16.13.1 (npm v8.1.2)

هر نسخه از Node بسته های خود را پیگیری می کند و npm برای مدیریت آنها در دسترس است.

همچنین می توانید بسته های نصب npm را در دایرکتوری ./node_modules پروژه Node.js داشته باشید. برای نصب ماژول اکسپرس از دستور زیر استفاده کنید:

npm install express

 

Output

added 50 packages, and audited 51 packages in 4s

2 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice
npm notice New minor version of npm available! 8.1.2 -> 8.3.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.3.0
npm notice Run npm install -g npm@8.3.0 to update!
npm notice

اگر می‌خواهید ماژول را به صورت سراسری نصب کنید و آن را با استفاده از نسخه مشابه Node.js برای پروژه‌های دیگر در دسترس قرار دهید، می‌توانید پرچم -g را اضافه کنید:

npm install -g express

 

Output

added 50 packages, and audited 51 packages in 1s

2 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

با این کار بسته در زیر نصب می شود:

~/.nvm/versions/node/16.13.1/lib/node_modules/express

نصب ماژول به صورت سراسری به شما امکان می دهد دستورات را از خط فرمان اجرا کنید، اما باید بسته را به حوزه محلی خود پیوند دهید تا آن را از داخل یک برنامه درخواست کنید:

npm link express

با اجرای موارد زیر می‌توانید درباره گزینه‌های موجود با nvm اطلاعات بیشتری کسب کنید:

nvm help

شما با استفاده از Node Version Manager، nvm، Node را با موفقیت نصب کرده اید تا نسخه های مختلف Node را نصب و مدیریت کنید.

حذف Node.js

بسته به نسخه ای که می خواهید هدف بگیرید، می توانید Node.js را با استفاده از apt یا nvm حذف نصب کنید. برای حذف نسخه پیش فرض مخزن، از apt در سطح سیستم استفاده خواهید کرد. این دستور بسته را حذف می کند و فایل های پیکربندی را حفظ می کند. اگر قصد دارید در آینده بسته را دوباره نصب کنید، این کار مفید است:

sudo apt remove nodejs

اگر نمی‌خواهید فایل‌های پیکربندی را برای استفاده بعدی ذخیره کنید، دستور زیر را برای حذف نصب بسته و حذف فایل‌های پیکربندی مرتبط با آن اجرا کنید:

sudo apt purge nodejs

به عنوان آخرین مرحله، می‌توانید بسته‌های استفاده‌نشده را که به‌طور خودکار با بسته حذف شده نصب شده‌اند حذف کنید:

sudo apt autoremove

برای حذف نصب نسخه‌ای از Node.js که با استفاده از nvm فعال کرده‌اید، ابتدا مشخص کنید نسخه‌ای که می‌خواهید حذف کنید، نسخه فعال فعلی است یا خیر:

nvm current

اگر نسخه مورد نظر شما نسخه فعال فعلی نیست، می توانید اجرا کنید:

nvm uninstall node_version

 

Output

Uninstalled node node_version

این دستور نسخه انتخاب شده Node.js را حذف نصب می کند.

اگر نسخه ای که می خواهید حذف کنید نسخه فعال فعلی است، ابتدا باید nvm را غیرفعال کنید تا تغییرات خود را فعال کنید:

nvm deactivate

اکنون می توانید نسخه فعلی را با استفاده از دستور uninstall که قبلاً استفاده شده است، حذف نصب کنید. با این کار همه فایل‌های مرتبط با نسخه هدفمند Node.js به جز فایل‌های کش که می‌توانند برای نصب مجدد استفاده شوند، حذف می‌شوند.

نتیجه

راه‌های زیادی برای راه‌اندازی و اجرای Node.js در سرور اوبونتو 18.04 وجود دارد. شرایط شما تعیین می کند که کدام یک از روش ها برای نیازهای شما بهترین است. در حالی که استفاده از نسخه بسته بندی شده در مخزن اوبونتو یک روش است، استفاده از nvm یا NodeSource PPA انعطاف پذیری بیشتری را ارائه می دهد.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:UbuntuUbuntu 18.04اتصال به سرور مجازیانواع سرور مجازیاوبونتو 18.04پلت فرم جاوا اسکریپتجاوا اسکریپتخرید سرور مجازینصب Node.js

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده و اعتبارسنجی فرم های وب با Flask-WTF

ورود به سایت

معرفی

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

Flask یک چارچوب وب سبک وزن پایتون است که ابزارها و ویژگی های مفیدی را برای ایجاد برنامه های کاربردی وب در زبان پایتون ارائه می دهد. برای رندر و اعتبارسنجی فرم‌های وب به روشی ایمن و انعطاف‌پذیر در Flask، از Flask-WTF استفاده خواهید کرد، که یک پسوند Flask است که به شما کمک می‌کند از کتابخانه WTForms در برنامه Flask خود استفاده کنید.

WTForms یک کتابخانه پایتون است که ارائه فرم های وب انعطاف پذیر را ارائه می دهد. می توانید از آن برای رندر فیلدهای متنی، قسمت های متنی، فیلدهای رمز عبور، دکمه های رادیویی و موارد دیگر استفاده کنید. WTForms همچنین اعتبارسنجی داده قدرتمندی را با استفاده از اعتبارسنجی‌های مختلف ارائه می‌کند، که تأیید می‌کند داده‌هایی که کاربر ارسال می‌کند با معیارهای خاصی مطابقت دارد که شما تعریف می‌کنید. به عنوان مثال، اگر یک فیلد الزامی دارید، می توانید اطمینان حاصل کنید که داده هایی که کاربر ارسال می کند ارائه شده است یا دارای طول مشخصی است.

WTForms همچنین از یک توکن CSRF برای محافظت در برابر حملات CSRF استفاده می کند، حملاتی که به مهاجم اجازه می دهد تا اقدامات ناخواسته را روی یک برنامه وب که در آن کاربر احراز هویت شده است، انجام دهد. یک حمله موفق CSRF می‌تواند کاربر را مجبور به انجام درخواست‌های تغییر حالت مانند انتقال وجه به حساب بانکی مهاجم در یک برنامه بانکی، تغییر آدرس ایمیل کاربر و غیره کند. اگر قربانی یک حساب کاربری مدیریتی باشد، CSRF می تواند کل برنامه وب را در معرض خطر قرار دهد.

در این آموزش، یک برنامه وب کوچک می سازید که نحوه رندر و اعتبارسنجی فرم های وب با استفاده از Flask-WTF را نشان می دهد. برنامه دارای صفحه ای برای نمایش دوره هایی است که در لیست پایتون ذخیره شده اند و صفحه فهرست دارای فرمی برای وارد کردن عنوان دوره، توضیحات، قیمت، در دسترس بودن و سطح آن (مبتدی، متوسط ​​یا پیشرفته) خواهد بود.

پیش نیازها

  • یک محیط برنامه نویسی محلی Python 3.
  • درک مفاهیم پایه فلاسک، مانند مسیرها، توابع مشاهده، و الگوها.
  • درک مفاهیم اولیه HTML برای آگاهی از پیشینه،
  • (اختیاری) درک استفاده از فرم های وب اولیه در Flask.

مرحله 1 – نصب Flask و Flask-WTF

در این مرحله، Flask و Flask-WTF را نصب می‌کنید که کتابخانه WTForms را نیز به صورت خودکار نصب می‌کند.

با فعال شدن محیط مجازی، از pip برای نصب Flask و Flask-WTF استفاده کنید:

pip install Flask Flask-WTF

پس از اتمام نصب با موفقیت، در انتهای خروجی خطی مشابه شکل زیر مشاهده خواهید کرد:

Successfully installed Flask-2.0.2 Flask-WTF-1.0.0 Jinja2-3.0.3 MarkupSafe-2.0.1 WTForms-3.0.0 Werkzeug-2.0.2 click-8.0.3 itsdangerous-2.0.1

همانطور که می بینید، کتابخانه WTForms نیز به عنوان وابستگی بسته Flask-WTF نصب شده است. بقیه بسته ها وابسته به Flask هستند.

اکنون که بسته‌های پایتون مورد نیاز را نصب کرده‌اید، در مرحله بعد یک فرم وب راه‌اندازی می‌کنید.

مرحله 2 – تنظیم فرم ها

در این مرحله، با استفاده از فیلدها و اعتبار سنجی هایی که از کتابخانه WTForms وارد می کنید، یک فرم وب راه اندازی می کنید.

شما فیلدهای زیر را تنظیم خواهید کرد:

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

ابتدا یک فایل جدید به نام forms.py در پوشه flask_app خود باز کنید. این فایل دارای فرم هایی است که در برنامه شما نیاز دارید:

nano forms.py

این فایل دارای کلاسی است که فرم وب شما را نشان می دهد. واردات زیر را در بالا اضافه کنید:

flask_app/forms.py

from flask_wtf import FlaskForm
from wtforms import (StringField, TextAreaField, IntegerField, BooleanField,
                     RadioField)
from wtforms.validators import InputRequired, Length

برای ساخت یک فرم وب، یک زیر کلاس از کلاس پایه FlaskForm ایجاد می کنید که آن را از بسته flask_wtf وارد می کنید. همچنین باید فیلدهایی را که در فرم خود استفاده می کنید، که از بسته wtforms وارد می کنید، مشخص کنید.

شما فیلدهای زیر را از کتابخانه WTForms وارد می کنید:

  • StringField: یک ورودی متن.
  • TextAreaField: یک قسمت متنی.
  • IntegerField: فیلدی برای اعداد صحیح.
  • BooleanField: یک فیلد چک باکس.
  • RadioField: فیلدی برای نمایش لیستی از دکمه های رادیویی برای انتخاب کاربر.

در خط از wtforms.validators import InputRequired، Length، اعتبارسنجی‌ها را وارد می‌کنید تا در فیلدها استفاده کنید تا مطمئن شوید که کاربر داده‌های معتبری را ارسال می‌کند. InputRequired اعتبارسنجی است که از آن برای اطمینان از ارائه ورودی استفاده می کنید، و Length برای اعتبارسنجی طول یک رشته است تا اطمینان حاصل شود که دارای حداقل تعداد کاراکتر است یا اینکه از طول خاصی تجاوز نمی کند.

بعد، کلاس زیر را بعد از دستور import اضافه کنید:

flask_app/forms.py

class CourseForm(FlaskForm):
    title = StringField('Title', validators=[InputRequired(),
                                             Length(min=10, max=100)])
    description = TextAreaField('Course Description',
                                validators=[InputRequired(),
                                            Length(max=200)])
    price = IntegerField('Price', validators=[InputRequired()])
    level = RadioField('Level',
                       choices=['Beginner', 'Intermediate', 'Advanced'],
                       validators=[InputRequired()])
    available = BooleanField('Available', default='checked')

ذخیره کنید و فایل را ببندید.

در این کلاس CourseForm، شما از کلاس پایه FlaskForm که قبلا وارد کرده بودید، ارث می برید. شما با استفاده از فیلدهای فرمی که از کتابخانه WTForms وارد کرده اید، مجموعه ای از فیلدهای فرم را به عنوان متغیرهای کلاس تعریف می کنید. وقتی یک فیلد را نمونه‌سازی می‌کنید، اولین آرگومان برچسب فیلد است.

شما اعتباردهنده‌ها را برای هر فیلد با ارسال فهرستی از اعتبارسنجی‌هایی که از ماژول wtforms.validators وارد می‌کنید، تعریف می‌کنید. فیلد عنوان، به عنوان مثال، دارای رشته «عنوان» به عنوان یک برچسب، و دو اعتباردهنده است:

  • InputRequired: برای نشان دادن اینکه فیلد نباید خالی باشد.
  • Length: دو آرگومان می گیرد. دقیقه روی 10 تنظیم شده است تا مطمئن شوید که عنوان حداقل 10 کاراکتر است و حداکثر روی 100 تنظیم شده است تا مطمئن شوید که از 100 کاراکتر تجاوز نمی کند.

فیلد ناحیه متن توضیحات دارای یک اعتبارسنجی InputRequired و یک اعتبار سنج طول با حداکثر پارامتر تنظیم شده روی 200 است، بدون مقدار برای پارامتر min، به این معنی که تنها شرط این است که از 200 کاراکتر تجاوز نکند.

به طور مشابه شما یک فیلد عدد صحیح ضروری برای قیمت دوره به نام قیمت تعریف می کنید.

فیلد سطح یک میدان رادیویی با چندین گزینه است. شما انتخاب ها را در لیست پایتون تعریف می کنید و آن را به پارامتر گزینه ها ارسال می کنید. همچنین با استفاده از اعتبارسنجی InputRequired، فیلد مورد نیاز را تعریف کنید.

فیلد موجود یک فیلد چک باکس است. شما با ارسال آن به پارامتر پیش‌فرض، یک مقدار «بررسی» پیش‌فرض تنظیم می‌کنید. این به این معنی است که در هنگام افزودن دوره های جدید، علامت علامت زده می شود، مگر اینکه کاربر علامت آن را بردارید، به این معنی که دوره ها به طور پیش فرض در دسترس هستند.

برای اطلاعات بیشتر در مورد نحوه استفاده از کتابخانه WTForms، به صفحه Crash Course در مستندات WTForms مراجعه کنید. برای بررسی فیلدهای بیشتر به صفحه فیلدها و برای اعتبارسنجی داده‌های فرم به صفحه اعتبارسنجی‌ها برای اعتبارسنجی بیشتر مراجعه کنید.

شما فرم وب خود را در یک فایل forms.py پیکربندی کرده اید. بعد، یک برنامه Flask ایجاد می‌کنید، این فرم را وارد می‌کنید و فیلدهای آن را در صفحه فهرست نمایش می‌دهید. همچنین فهرستی از دوره ها را در صفحه دیگری نمایش خواهید داد.

مرحله 3 – نمایش فرم وب و دوره ها

در این مرحله یک اپلیکیشن Flask ایجاد می‌کنید، فرم وب که در مرحله قبل ایجاد کرده‌اید را در صفحه فهرست نمایش می‌دهید و همچنین فهرستی از دوره‌ها و صفحه‌ای برای نمایش دوره‌ها در آن ایجاد می‌کنید.

با فعال شدن محیط برنامه نویسی و نصب Flask، فایلی به نام app.py را برای ویرایش در دایرکتوری flask_app خود باز کنید:

nano app.py

این فایل کلاس و راهنماهای لازم را از Flask و CourseForm را از فایل forms.py وارد می کند. شما فهرستی از دوره ها را می سازید، سپس فرم را نمونه سازی می کنید و آن را به یک فایل الگو منتقل می کنید. کد زیر را به app.py اضافه کنید:

flask_app/app.py

from flask import Flask, render_template, redirect, url_for
from forms import CourseForm

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your secret key'


courses_list = [{
    'title': 'Python 101',
    'description': 'Learn Python basics',
    'price': 34,
    'available': True,
    'level': 'Beginner'
    }]


@app.route('/', methods=('GET', 'POST'))
def index():
    form = CourseForm()
    return render_template('index.html', form=form)

ذخیره کنید و فایل را ببندید.

در اینجا شما موارد زیر را از Flask وارد می کنید:

  • کلاس Flask برای ایجاد یک نمونه برنامه Flask.
  • تابع render_template() برای رندر کردن قالب ایندکس.
  • تابع redirect() برای هدایت کاربر به صفحه دوره ها پس از اضافه شدن یک دوره جدید.
  • تابع url_for() برای ساخت URL.

ابتدا کلاس CourseForm() را از فایل forms.py وارد می کنید، سپس یک نمونه برنامه Flask به نام app ایجاد می کنید.

شما یک پیکربندی کلید مخفی را برای WTForms تنظیم می کنید تا از آن هنگام تولید یک نشانه CSRF برای ایمن سازی فرم های وب خود استفاده کنید. کلید مخفی باید یک رشته تصادفی طولانی باشد. برای اطلاعات بیشتر در مورد نحوه به دست آوردن یک کلید مخفی، مرحله 3 نحوه استفاده از فرم های وب در یک برنامه Flask را ببینید.

سپس فهرستی از دیکشنری ها به نام courses_list را ایجاد می کنید که در حال حاضر دارای یک فرهنگ لغت با نمونه دوره ای به نام Python 101 است. در اینجا، شما از یک لیست پایتون به عنوان ذخیره‌سازی داده برای اهداف نمایشی استفاده می‌کنید. در یک سناریوی دنیای واقعی، از پایگاه داده ای مانند SQLite استفاده خواهید کرد. نحوه استفاده از پایگاه داده SQLite در یک برنامه Flask را ببینید تا نحوه استفاده از پایگاه داده برای ذخیره داده های دوره های خود را بیاموزید.

شما با استفاده از decorator ()app.route در تابع view index() یک مسیر / اصلی ایجاد می کنید. هر دو روش GET و POST HTTP را در پارامتر متدها می پذیرد. روش‌های GET برای بازیابی داده‌ها هستند و درخواست‌های POST برای ارسال داده‌ها به سرور، برای مثال از طریق یک فرم وب هستند. برای اطلاعات بیشتر، نحوه استفاده از فرم های وب در یک برنامه فلاسک را ببینید.

شما کلاس CourseForm() را که فرم وب را نشان می دهد نمونه سازی می کنید و نمونه را در متغیری به نام فرم ذخیره می کنید. سپس یک فراخوانی به تابع render_template() برمی‌گردانید و یک فایل الگو به نام index.html و نمونه فرم را ارسال می‌کنید.

برای نمایش فرم وب در صفحه فهرست، ابتدا یک الگوی پایه ایجاد می‌کنید که دارای تمام کدهای HTML اولیه است که سایر قالب‌ها نیز برای جلوگیری از تکرار کد استفاده می‌کنند. سپس فایل قالب index.html را که در تابع index() خود رندر کرده اید ایجاد می کنید. برای کسب اطلاعات بیشتر در مورد الگوها، به نحوه استفاده از الگوها در یک برنامه فلاسک مراجعه کنید.

یک پوشه templates در پوشه flask_app خود ایجاد کنید که در آن Flask الگوها را جستجو می کند، سپس یک فایل الگو به نام base.html را باز کنید، که الگوی پایه برای سایر الگوها خواهد بود:

mkdir templates
nano templates/base.html

کد زیر را در فایل base.html اضافه کنید تا الگوی پایه را با یک نوار ناوبری و یک بلوک محتوا ایجاد کنید:

flask_app/templates/base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %} - FlaskApp</title>
    <style>
        nav a {
            color: #d64161;
            font-size: 3em;
            margin-left: 50px;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <nav>
        <a href="{{ url_for('index') }}">FlaskApp</a>
        <a href="#">About</a>
    </nav>
    <hr>
    <div class="content">
        {% block content %} {% endblock %}
    </div>
</body>
</html>

این الگوی پایه دارای تمام صفحه بخاری HTML است که برای استفاده مجدد در قالب های دیگر خود نیاز دارید. بلوک عنوان برای تعیین عنوان برای هر صفحه جایگزین می شود و بلوک محتوا با محتوای هر صفحه جایگزین می شود. نوار پیمایش دارای دو پیوند است، یکی برای صفحه فهرست که در آن از تابع کمکی url_for() برای پیوند به تابع view index() استفاده می کنید، و دیگری برای صفحه About در صورتی که یکی را در برنامه خود قرار دهید.

ذخیره کنید و فایل را ببندید.

سپس یک قالب به نام index.html باز کنید. این الگوی است که در فایل app.py به آن اشاره کردید:

nano templates/index.html

این فایل دارای فرم وب است که از طریق متغیر فرم به قالب index.html ارسال کرده اید. کد زیر را به آن اضافه کنید:

flask_app/templates/index.html

{% extends 'base.html' %}

{% block content %}
    <h1>{% block title %} Add a New Course {% endblock %}</h1>

    <form method="POST" action="/">
        {{ form.csrf_token }}
        <p>
            {{ form.title.label }}
            {{ form.title(size=20) }}
        </p>

        {% if form.title.errors %}
            <ul class="errors">
                {% for error in form.title.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            {{ form.description.label }}
        </p>
        {{ form.description(rows=10, cols=50) }}

        {% if form.description.errors %}
            <ul class="errors">
                {% for error in form.description.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            {{ form.price.label }}
            {{ form.price() }}
        </p>

        {% if form.price.errors %}
            <ul class="errors">
                {% for error in form.price.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            {{ form.available() }} {{ form.available.label }}
        </p>

        {% if form.available.errors %}
            <ul class="errors">
                {% for error in form.available.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            {{ form.level.label }}
            {{ form.level() }}
        </p>

        {% if form.level.errors %}
            <ul class="errors">
                {% for error in form.level.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            <input type="submit" value="Add">
        </p>
    </form>

{% endblock %}

ذخیره کنید و فایل را ببندید.

شما قالب پایه را گسترش می دهید و عنوانی را در تگ <h1> تنظیم می کنید. سپس فیلدهای فرم وب را در داخل تگ <form> رندر می‌دهید، روش آن را روی POST و عمل را روی مسیر اصلی / که صفحه فهرست است، تنظیم می‌کنید. ابتدا توکن CSRF را که WTForms برای محافظت از فرم شما در برابر حملات CSRF استفاده می کند با استفاده از خط {{ ​​form.csrf_token }} رندر می کنید. این توکن با بقیه داده های فرم به سرور ارسال می شود. به خاطر داشته باشید که همیشه این نشانه را برای ایمن سازی فرم های خود رندر کنید.

شما هر فیلد را با استفاده از syntax form.field() و برچسب آن را با استفاده از syntax form.field.label رندر می‌دهید. می توانید آرگومان هایی را به فیلد ارسال کنید تا نحوه نمایش آن را کنترل کنید. به عنوان مثال، اندازه فیلد ورودی عنوان را در {{ form.title(size=20) }} تنظیم می‌کنید، و تعداد ردیف‌ها و ستون‌ها را برای ناحیه متن توضیحات از طریق ردیف‌ها و ستون‌های پارامترها به همان شیوه تنظیم می‌کنید. به طور معمول در HTML انجام می شود. می توانید از همین روش برای ارسال ویژگی های اضافی HTML به فیلدی مانند ویژگی class برای تنظیم یک کلاس CSS استفاده کنید.

خطاهای اعتبارسنجی را با استفاده از نحو if form.field.errors بررسی می کنید. اگر فیلدی دارای خطا باشد، آنها را با یک حلقه for حلقه زده و در لیستی در زیر فیلد نمایش می دهید.

در حالی که در دایرکتوری flask_app خود با محیط مجازی فعال هستید، با استفاده از متغیر محیطی FLASK_APP به Flask در مورد برنامه (در این مورد app.py) بگویید. سپس متغیر محیطی FLASK_ENV را روی توسعه تنظیم کنید تا برنامه در حالت توسعه اجرا شود و به دیباگر دسترسی پیدا کنید. برای اطلاعات بیشتر در مورد اشکال زدا Flask، به نحوه رسیدگی به خطاها در یک برنامه فلاسک مراجعه کنید. برای انجام این کار از دستورات زیر استفاده کنید (در ویندوز به جای صادرات از set استفاده کنید):

export FLASK_APP=app
export FLASK_ENV=development

بعد، برنامه را اجرا کنید:

flask run

با اجرای سرور توسعه، با استفاده از مرورگر خود از URL زیر دیدن کنید:

http://127.0.0.1:5000/

فرم وب را در صفحه فهرست نمایش داده می‌شوید:

سعی کنید فرم را بدون پر کردن عنوان ارسال کنید. یک پیغام خطایی خواهید دید که به شما اطلاع می دهد که عنوان مورد نیاز است. با ارسال داده‌های نامعتبر (مانند عنوان کوتاه کمتر از 10 کاراکتر یا توضیحی بیش از 200 نویسه) فرم را آزمایش کنید تا پیام‌های خطای دیگر را مشاهده کنید.

پر کردن فرم با داده های معتبر تا کنون هیچ کاری انجام نمی دهد زیرا کدی ندارید که ارسال فرم را مدیریت کند. بعداً کد آن را اضافه خواهید کرد.

در حال حاضر به صفحه ای نیاز دارید تا دوره هایی را که در لیست خود دارید نمایش دهد. بعداً، مدیریت داده‌های فرم وب، دوره جدیدی را به لیست اضافه می‌کند و کاربر را به صفحه دوره‌ها هدایت می‌کند تا دوره جدید اضافه شده به آن را ببیند.

سرور توسعه را در حال اجرا بگذارید و پنجره ترمینال دیگری را باز کنید.

سپس، app.py را باز کنید تا مسیر دوره ها را اضافه کنید:

nano app.py

مسیر زیر را در انتهای فایل اضافه کنید:

flask_app/app.py

# ...

@app.route('/courses/')
def courses():
    return render_template('courses.html', courses_list=courses_list)

ذخیره کنید و فایل را ببندید.

این مسیر الگویی به نام courses.html را ارائه می کند و آن را در لیست courses_list قرار می دهد.

سپس قالب courses.html را برای نمایش دوره ها ایجاد کنید:

nano templates/courses.html

کد زیر را به آن اضافه کنید:

flask_app/templates/courses.html

{% extends 'base.html' %}

{% block content %}
    <h1>{% block title %} Courses {% endblock %}</h1>
    <hr>
    {% for course in courses_list %}
        <h2> {{ course['title'] }} </h2>
        <h4> {{ course['description'] }} </h4>
        <p> {{ course['price'] }}$ </p>
        <p><i>({{ course['level'] }})</i></p>
        <p>Availability:
            {% if course['available'] %}
                Available
            {% else %}
                Not Available
            {% endif %}</p>
        <hr>
    {% endfor %}
{% endblock %}

ذخیره کنید و فایل را ببندید.

شما یک عنوان و حلقه را از طریق آیتم های لیست courses_list تنظیم می کنید. عنوان را در تگ <h2>، توضیحات را در تگ <h4> و قیمت و سطح دوره را در تگ <p> نمایش می دهید.
شما بررسی می کنید که آیا دوره با استفاده از شرط اگر دوره[‘available’] در دسترس است یا خیر. اگر دوره در دسترس باشد، متن «در دسترس» و اگر دوره در دسترس نباشد، متن «در دسترس نیست» را نمایش می‌دهید.

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

http://127.0.0.1:5000/courses/

صفحه ای را مشاهده می کنید که یک دوره در آن نمایش داده می شود، زیرا تا کنون فقط یک دوره در لیست دوره های خود دارید:

سپس، base.html را باز کنید تا پیوندی به صفحه دوره ها در نوار پیمایش اضافه کنید:

nano templates/base.html

آن را به شکل زیر ویرایش کنید:

flask_app/templates/base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %} - FlaskApp</title>
    <style>
        nav a {
            color: #d64161;
            font-size: 3em;
            margin-left: 50px;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <nav>
        <a href="{{ url_for('index') }}">FlaskApp</a>
        <a href="{{ url_for('courses') }}">Courses</a>
        <a href="#">About</a>
    </nav>
    <hr>
    <div class="content">
        {% block content %} {% endblock %}
    </div>
</body>
</html>

ذخیره کنید و فایل را ببندید.

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

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

برای کاربردی کردن برنامه، باید داده‌های فرم وب را زمانی که کاربر ارسال می‌کند، با اعتبارسنجی و افزودن آن به فهرست دوره‌ها مدیریت کنید. در ادامه این کار را انجام خواهید داد

مرحله 4 – دسترسی به داده های فرم

در این مرحله، به داده‌هایی که کاربر ارسال می‌کند دسترسی خواهید داشت، آن‌ها را تأیید می‌کنید و به لیست دوره‌ها اضافه می‌کنید.

برای اضافه کردن کد برای مدیریت داده‌های فرم وب در داخل تابع index() app.py را باز کنید:

nano app.py

تابع index() را به شکل زیر ویرایش کنید:

flask_app/app.py

# ...
@app.route('/', methods=('GET', 'POST'))
def index():
    form = CourseForm()
    if form.validate_on_submit():
        courses_list.append({'title': form.title.data,
                             'description': form.description.data,
                             'price': form.price.data,
                             'available': form.available.data,
                             'level': form.level.data
                             })
        return redirect(url_for('courses'))
    return render_template('index.html', form=form)

ذخیره کنید و فایل را ببندید.
در اینجا، متد ()validate_on_submit را روی شی فرم فراخوانی می‌کنید، که بررسی می‌کند که درخواست یک درخواست POST است و اعتبارسنجی‌هایی را که برای هر فیلد پیکربندی کرده‌اید اجرا می‌کند. اگر حداقل یکی از اعتباردهنده ها خطا را برگرداند، شرط False خواهد بود و هر خطا در زیر فیلدی که باعث آن شده است نمایش داده می شود.

اگر داده های فرم ارسالی معتبر باشد، شرط True است و کد زیر عبارت if اجرا می شود. شما یک فرهنگ لغت دوره می سازید و از روش append برای اضافه کردن دوره جدید به لیست courses_list استفاده می کنید. شما با استفاده از syntax form.field.data به مقدار هر فیلد دسترسی دارید. پس از افزودن فرهنگ لغت دوره جدید به لیست دوره ها، کاربر را به صفحه دوره ها هدایت می کنید.

با اجرای سرور توسعه، از صفحه فهرست بازدید کنید:

http://127.0.0.1:5000/

فرم را با اطلاعات معتبر پر کرده و ارسال کنید. به صفحه دوره ها هدایت می شوید و دوره جدید را در آن خواهید دید.

نتیجه

شما یک برنامه Flask ساخته اید که دارای فرم وب است که با استفاده از پسوند Flask-WTF و کتابخانه WTForms ساخته اید. این فرم دارای چندین نوع فیلد برای دریافت داده ها از کاربر، تأیید اعتبار با استفاده از اعتبار سنجی های ویژه WTForms و افزودن آن به یک فروشگاه داده است.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

چگونه یک ربات Discord با Node.js بسازیم

ورود به سایت

معرفی

Discord یک برنامه چت است که به میلیون ها کاربر در سراسر جهان امکان می دهد در جوامعی به نام اصناف یا سرورها به صورت آنلاین پیام و چت صوتی داشته باشند. Discord همچنین یک API گسترده ارائه می دهد که توسعه دهندگان می توانند از آن برای ساخت ربات های قدرتمند Discord استفاده کنند. ربات ها می توانند اقدامات مختلفی مانند ارسال پیام به سرورها، کاربران DM-ing، تعدیل سرورها و پخش صدا در چت های صوتی را انجام دهند. این به توسعه‌دهندگان اجازه می‌دهد تا ربات‌های قدرتمندی بسازند که شامل ویژگی‌های پیشرفته و پیچیده مانند ابزارهای تعدیل یا حتی بازی‌ها می‌شود. به عنوان مثال، ربات ابزار Dyno به میلیون‌ها انجمن خدمات ارائه می‌دهد و دارای ویژگی‌های مفیدی مانند محافظت از هرزنامه، پخش‌کننده موسیقی و سایر عملکردهای کاربردی است. یادگیری نحوه ایجاد ربات های Discord به شما امکان می دهد تا امکانات زیادی را پیاده سازی کنید که هزاران نفر می توانند هر روز با آنها تعامل داشته باشند.

در این آموزش، با استفاده از Node.js و کتابخانه Discord.js، یک ربات Discord را از ابتدا می سازید، که به کاربران اجازه می دهد مستقیماً با Discord API تعامل داشته باشند. شما یک نمایه برای یک ربات Discord تنظیم می‌کنید، نشانه‌های احراز هویت را برای ربات دریافت می‌کنید، و ربات را با قابلیت پردازش دستورات با آرگومان‌های کاربران برنامه‌ریزی می‌کنید.

پیش نیازها

قبل از شروع به موارد زیر نیاز دارید:

  • Node.js روی ماشین توسعه شما نصب شده است. برای نصب آن در macOS یا اوبونتو 20.04، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی در macOS یا نصب Node.js با Apt با استفاده از بخش NodeSource PPA در نحوه نصب Node.js در اوبونتو 20.04 را دنبال کنید. .
  • هر ویرایشگر متنی دلخواه شما، مانند Visual Studio Code، Atom، Sublime یا Nano.
  • یک حساب رایگان Discord با یک حساب ایمیل تأیید شده و یک سرور Discord رایگان که برای آزمایش ربات Discord خود استفاده خواهید کرد.

مرحله 1 – راه اندازی ربات Discord

در این مرحله، از رابط کاربری گرافیکی توسعه دهندگان Discord (GUI) برای راه اندازی ربات Discord و دریافت توکن ربات استفاده می کنید که آن را به برنامه خود منتقل می کنید.

برای ثبت ربات در پلتفرم دیسکورد، از داشبورد اپلیکیشن دیسکورد استفاده کنید. در اینجا توسعه دهندگان می توانند برنامه های Discord از جمله ربات های Discord را ایجاد کنند.

برای شروع، روی New Application کلیک کنید. Discord از شما می خواهد که یک نام برای برنامه جدید خود وارد کنید. سپس روی Create کلیک کنید تا اپلیکیشن ایجاد شود.

اکنون داشبورد برنامه خود را باز کنید. برای افزودن ربات به برنامه، به تب Bot در نوار پیمایش سمت چپ بروید.

روی دکمه افزودن ربات کلیک کنید تا یک ربات به برنامه اضافه شود. روی Yes, do it کلیک کنید! زمانی که از شما درخواست تایید می کند را فشار دهید. سپس روی داشبوردی قرار می گیرید که حاوی جزئیات نام ربات، نشانه احراز هویت و تصویر نمایه شما است.

اکنون باید یک دعوت نامه ایجاد کنید تا ربات را به انجمن Discord اضافه کنید تا بتوانید آن را آزمایش کنید. ابتدا به صفحه URL Generator زیر تب OAuth2 داشبورد برنامه بروید. برای ایجاد یک دعوت، به پایین پیمایش کنید و ربات را در زیر scopes انتخاب کنید. همچنین باید مجوزهایی را برای کنترل اعمالی که ربات شما می تواند در انجمن ها انجام دهد تنظیم کنید. برای اهداف این آموزش، Administrator را انتخاب کنید، که به ربات شما اجازه می دهد تقریباً تمام اقدامات را در Guild انجام دهد. لینک را با دکمه کپی کپی کنید.

سپس ربات را به سرور اضافه کنید. پیوند دعوتی را که ایجاد کردید دنبال کنید. می‌توانید ربات را به هر سروری که دارید اضافه کنید یا مجوزهای سرپرست را در منوی کشویی دارید.

حالا روی Continue کلیک کنید. مطمئن شوید که تیک باکس کنار Administrator را علامت زده اید – این به مدیر ربات مجوز می دهد. سپس روی Authorize کلیک کنید. Discord از شما می خواهد که قبل از پیوستن ربات به سرور، یک CAPTCHA را حل کنید. اکنون ربات Discord را در لیست اعضا در سروری که ربات را در حالت آفلاین به آن اضافه کرده اید خواهید داشت.

شما با موفقیت یک ربات Discord ایجاد کردید و آن را به یک سرور اضافه کردید. در مرحله بعد برنامه ای برای ورود به ربات می نویسید.

مرحله 2 – ایجاد پروژه شما

در این مرحله، محیط کدنویسی اولیه را راه‌اندازی می‌کنید که در آن ربات خود را می‌سازید و به صورت برنامه‌نویسی وارد ربات می‌شوید.

ابتدا باید یک پوشه پروژه و فایل های پروژه لازم برای ربات راه اندازی کنید.

پوشه پروژه خود را ایجاد کنید:

 

mkdir discord-bot

 

به پوشه پروژه ای که ایجاد کرده اید بروید:

 

cd discord-bot

 

در مرحله بعد، از ویرایشگر متن خود برای ایجاد فایلی به نام config.json برای ذخیره رمز احراز هویت ربات خود استفاده کنید:

 

nano config.json

 

سپس کد زیر را به فایل کانفیگ اضافه کنید و متن برجسته شده را با کد احراز هویت ربات خود جایگزین کنید:

discord-bot/config.json

{
    "BOT_TOKEN": "YOUR BOT TOKEN"
}

فایل را ذخیره کرده و از آن خارج شوید.

سپس یک فایل package.json ایجاد می‌کنید که جزئیات پروژه شما و اطلاعات مربوط به وابستگی‌هایی را که برای پروژه استفاده می‌کنید ذخیره می‌کند. با اجرای دستور npm زیر یک فایل package.json ایجاد خواهید کرد:

npm init

npm از شما جزئیات مختلفی در مورد پروژه شما می خواهد. اگر مایل به راهنمایی برای تکمیل این دستورات هستید، می توانید در مورد آنها در نحوه استفاده از ماژول های Node.js با npm و package.json مطالعه کنید.

اکنون بسته discord.js را که برای تعامل با Discord API استفاده خواهید کرد، نصب خواهید کرد. با دستور زیر می توانید discord.js را از طریق npm نصب کنید:

npm install discord.js

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

ابتدا یک فایل به نام index.js در پوشه discord-bot برای کد ایجاد کنید:

nano index.js

کدگذاری ربات را با نیاز به وابستگی discord.js و فایل پیکربندی با توکن ربات آغاز کنید.

discord-bot/index.js

const Discord = require("discord.js");
const config = require("./config.json");

پس از این، دو خط کد بعدی را اضافه کنید:

discord-bot/index.js

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]);

client.login(config.BOT_TOKEN);

فایل خود را ذخیره کرده و از آن خارج شوید.

خط اول کد یک Discord.Client جدید ایجاد می کند و آن را به مشتری ثابت اختصاص می دهد. این کلاینت تا حدودی نحوه تعامل شما با Discord API و نحوه اطلاع رسانی Discord از رویدادهایی مانند پیام های جدید است. کلاینت در واقع نشان دهنده ربات Discord است. شیء ارسال شده به سازنده Client، مقاصد دروازه ربات شما را مشخص می کند. این مشخص می کند که ربات شما به کدام رویدادهای WebSocket گوش می دهد. در اینجا GUILDS و GUILD_MESSAGES را مشخص کرده‌اید تا ربات بتواند رویدادهای پیام را در انجمن‌ها دریافت کند.

خط دوم کد از روش لاگین روی کلاینت برای ورود به ربات Discord که ایجاد کرده‌اید استفاده می‌کند و از رمز موجود در فایل config.json به عنوان رمز عبور استفاده می‌کند. توکن به Discord API اجازه می دهد بداند که برنامه برای کدام ربات است و اینکه شما برای استفاده از ربات احراز هویت شده اید.

اکنون فایل index.js را با استفاده از Node اجرا کنید:

node index.js

وضعیت ربات شما در سرور Discord که آن را به آن اضافه کرده اید به حالت آنلاین تغییر می کند.

شما با موفقیت یک محیط کدنویسی راه اندازی کرده اید و کد اصلی را برای ورود به ربات Discord ایجاد کرده اید. در مرحله بعد دستورات کاربر را کنترل می‌کنید و ربات خود را وادار می‌کنید تا اقداماتی مانند ارسال پیام را انجام دهد.

مرحله 3 – مدیریت اولین فرمان کاربر

در این مرحله رباتی ایجاد می کنید که می تواند دستورات کاربر را مدیریت کند. شما اولین پینگ فرمان خود را اجرا می کنید، که با “pong” و زمان صرف شده برای پاسخ به دستور پاسخ می دهد.

ابتدا باید پیام‌هایی را که کاربران ارسال می‌کنند شناسایی و دریافت کنید تا بتوانید هر دستوری را پردازش کنید. با استفاده از روش روشن در مشتری Discord، Discord یک اعلان در مورد رویدادهای جدید برای شما ارسال می کند. متد on دو آرگومان می گیرد: نام رویدادی که باید منتظر ماند و تابعی که هر بار که آن رویداد اجرا می شود اجرا می شود. با این روش می توانید منتظر پیام رویداد بمانید — این اتفاق هر بار که پیامی به انجمنی ارسال می شود که ربات مجوز مشاهده پیام ها را دارد، رخ می دهد. بنابراین شما یک تابع ایجاد خواهید کرد که هر بار که پیامی برای پردازش دستورات ارسال می شود اجرا می شود.

ابتدا فایل خود را باز کنید:

nano index.js

کد زیر را به فایل خود اضافه کنید:

discord-bot/index.js

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});


client.on("messageCreate", function(message) { 
                                         
});                                      

client.login(config.BOT_TOKEN);

این تابع که روی رویداد messageCreate اجرا می شود، پیام را به عنوان پارامتر می گیرد. پیام ارزش یک نمونه پیام Discord.js را خواهد داشت که حاوی اطلاعاتی در مورد پیام ارسال شده و روش هایی برای کمک به ربات برای پاسخ دادن است.

اکنون خط کد زیر را به تابع کنترل فرمان خود اضافه کنید:

discord-bot/index.js

...
client.on("messageCreate", function(message) {
  if (message.author.bot) return;
});
...

این خط بررسی می کند که آیا نویسنده پیام یک ربات است یا خیر، و در این صورت، پردازش دستور را متوقف می کند. این مهم است زیرا معمولاً نمی خواهید پیام های ربات ها را پردازش کنید یا به آنها پاسخ دهید. ربات‌ها معمولاً نیازی به استفاده از اطلاعات ربات‌های دیگر ندارند، بنابراین نادیده گرفتن پیام‌های آنها باعث صرفه‌جویی در قدرت پردازش و جلوگیری از پاسخ‌های تصادفی می‌شود.

اکنون یک کنترل کننده فرمان می نویسید. برای انجام این کار، خوب است که فرمت معمول یک فرمان Discord را درک کنید. به طور معمول، ساختار یک فرمان Discord شامل سه بخش به ترتیب زیر است: یک پیشوند، یک نام دستور، و (گاهی) آرگومان های فرمان.

  • پیشوند: پیشوند می تواند هر چیزی باشد، اما معمولاً یک قطعه نقطه گذاری یا عبارت انتزاعی است که معمولاً در ابتدای پیام نیست. این بدان معناست که وقتی پیشوند را در ابتدای پیام وارد می‌کنید، ربات می‌داند که قصد این دستور این است که یک ربات آن را پردازش کند.
  • نام فرمان: نام دستوری که کاربر می خواهد از آن استفاده کند. این بدان معناست که ربات می‌تواند از چندین فرمان با عملکردهای مختلف پشتیبانی کند و به کاربران اجازه دهد تا با ارائه یک نام فرمان متفاوت، بین آنها یکی را انتخاب کنند.
  • آرگومان‌ها: گاهی اوقات اگر دستور نیاز به اطلاعات اضافی از کاربر داشته باشد یا از آن استفاده کند، کاربر می‌تواند آرگومان‌هایی را پس از نام فرمان ارائه کند و هر آرگومان با یک فاصله از هم جدا شود.

برای شروع ایجاد یک تجزیه کننده فرمان که این قالب را مدیریت می کند، خطوط کد زیر را به تابع مدیریت پیام اضافه کنید:

discord-bot/index.js

...
const prefix = "!";

client.on("messageCreate", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;
});
...

شما خط اول کد را اضافه می کنید تا مقدار “!” به پیشوند ثابت که از آن به عنوان پیشوند ربات استفاده خواهید کرد.

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

اکنون باید بقیه پیام را به نام فرمان و هر آرگومان موجود در پیام تبدیل کنید. خطوط برجسته زیر را اضافه کنید:

discord-bot/index.js

...
client.on("messageCreate", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const commandBody = message.content.slice(prefix.length);
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();
});
...

شما از خط اول در اینجا برای حذف پیشوند از محتوای پیام استفاده می کنید و نتیجه را به commandBody ثابت اختصاص می دهید. این ضروری است زیرا نمی خواهید پیشوند را در نام فرمان تجزیه شده قرار دهید.

خط دوم پیام را با پیشوند حذف شده می گیرد و از روش تقسیم بر روی آن استفاده می کند و یک فاصله به عنوان جداکننده دارد. این آن را به آرایه‌ای از رشته‌های فرعی تقسیم می‌کند و هر جا که فاصله وجود داشته باشد، یک تقسیم می‌شود. این منجر به آرایه ای می شود که نام فرمان را در بر می گیرد، سپس، اگر در پیام گنجانده شود، هر گونه آرگومان. شما این آرایه را به آرگ های ثابت اختصاص می دهید.

خط سوم اولین عنصر را از آرایه args حذف می کند (که نام دستور ارائه شده است)، آن را به حروف کوچک تبدیل می کند و سپس آن را به دستور ثابت اختصاص می دهد. این به شما امکان می دهد نام فرمان را ایزوله کنید و فقط آرگومان ها را در آرایه باقی بگذارید. شما همچنین از روش toLowerCase استفاده می کنید زیرا دستورات معمولاً در ربات های Discord به حروف بزرگ و کوچک حساس نیستند.

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

برای شروع اجرای دستور ping کد زیر را اضافه کنید:

discord-bot/index.js

...
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();

  if (command === "ping") {
                           
  }                        
});
...

این دستور if بررسی می کند که آیا نام فرمانی که شما تجزیه کرده اید (به دستور ثابت اختصاص داده شده) با “ping” مطابقت دارد یا خیر. اگر این کار را کرد، نشان می دهد که کاربر می خواهد از دستور “ping” استفاده کند. کد دستور خاص را در بلوک دستور if قرار می دهید. شما این الگو را برای دستورات دیگری که می خواهید اجرا کنید تکرار خواهید کرد.

اکنون می توانید کد دستور “ping” را پیاده سازی کنید:

discord-bot/index.js

...
  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
  }
...

فایل خود را ذخیره کرده و از آن خارج شوید.

شما بلوک فرمان “ping” را اضافه می کنید که تفاوت بین زمان فعلی – که با استفاده از روش now در شیء Date یافت می شود – و مهر زمانی که پیام ایجاد شده را در میلی ثانیه محاسبه می کند. این محاسبه مدت زمان پردازش پیام و “پینگ” ربات را محاسبه می کند.

خط دوم با استفاده از روش پاسخ در ثابت پیام به دستور کاربر پاسخ می دهد. روش پاسخ به کاربر که دستور را فراخوانی کرده است پینگ می دهد (که به کاربر اطلاع می دهد و پیام را برای کاربر مشخص شده برجسته می کند) و به دنبال آن محتوای ارائه شده به عنوان اولین آرگومان متد. شما یک الگوی تحت اللفظی حاوی یک پیام و پینگ محاسبه شده به عنوان پاسخی که روش پاسخ استفاده خواهد کرد ارائه می دهید.

این به اجرای دستور “ping” پایان می دهد.

ربات خود را با استفاده از دستور زیر (در همان پوشه index.js) اجرا کنید:

node index.js

اکنون می توانید از دستور “!ping” در هر کانالی که ربات می تواند مشاهده کند و در آن پیام ارسال کند، استفاده کنید و در نتیجه پاسخ دهید.

شما با موفقیت یک ربات ایجاد کرده اید که می تواند دستورات کاربر را مدیریت کند و اولین دستور خود را اجرا کرده اید. در مرحله بعد با اجرای دستور sum به توسعه ربات خود ادامه می دهید.

مرحله 4 – اجرای دستور Sum

اکنون با اجرای دستور “!sum” برنامه خود را گسترش خواهید داد. دستور هر تعداد آرگومان را می گیرد و آنها را با هم جمع می کند، قبل از اینکه مجموع همه آرگومان ها را به کاربر برگرداند.

اگر ربات Discord شما همچنان در حال اجرا است، می توانید با CTRL + C روند آن را متوقف کنید.

فایل index.js خود را دوباره باز کنید:

nano index.js

برای شروع اجرای دستور “!sum” از بلوک else-if استفاده می کنید. پس از بررسی نام دستور ping، بررسی می کند که آیا نام دستور برابر با “sum” است یا خیر. شما از یک بلوک else-if استفاده خواهید کرد زیرا فقط یک دستور در یک زمان پردازش می شود، بنابراین اگر برنامه با نام دستور “ping” مطابقت داشته باشد، لازم نیست دستور “sum” را بررسی کند. خطوط هایلایت شده زیر را به فایل خود اضافه کنید:

discord-bot/index.js

...
  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
  }

  else if (command === "sum") {
                               
  }                            
});
...

می توانید اجرای کد دستور “sum” را شروع کنید. کد دستور “sum” داخل بلوک else-if که به تازگی ایجاد کرده اید می رود. حالا کد زیر را اضافه کنید:

discord-bot/index.js

...
  else if (command === "sum") {
    const numArgs = args.map(x => parseFloat(x));
    const sum = numArgs.reduce((counter, x) => counter += x);
    message.reply(`The sum of all the arguments you provided is ${sum}!`);
  }
...

شما از روش نقشه در لیست آرگومان ها برای ایجاد یک لیست جدید با استفاده از تابع parseFloat در هر آیتم در آرایه args استفاده می کنید. این یک آرایه جدید ایجاد می کند (به ثابت numArgs اختصاص داده می شود) که در آن همه موارد به جای رشته ها اعداد هستند. این بدان معناست که بعداً می توانید با جمع کردن آنها با موفقیت مجموع اعداد را پیدا کنید.

خط دوم از روش کاهش در numArgs ثابت استفاده می کند که تابعی را ارائه می دهد که تمام عناصر لیست را جمع می کند. شما مجموع تمام عناصر موجود در numArgs را به مجموع ثابت اختصاص می دهید.

سپس از روش reply روی شی پیام استفاده می‌کنید تا به دستور کاربر با یک الگوی واقعی پاسخ دهید، که شامل مجموع همه آرگومان‌هایی است که کاربر به ربات ارسال می‌کند.

این به اجرای دستور “sum” پایان می دهد. اکنون ربات را با استفاده از دستور زیر (در همان پوشه index.js) اجرا کنید:

node index.js

اکنون می توانید از دستور “!sum” در هر کانالی که ربات می تواند مشاهده کند و در آن پیام ارسال کند، استفاده کنید.

نسخه زیر یک نسخه کامل از اسکریپت ربات index.js است:

discord-bot/index.js

const Discord = require("discord.js");
const config = require("./config.json");

const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});

const prefix = "!";

client.on("messageCreate", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const commandBody = message.content.slice(prefix.length);
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();

  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
  }

  else if (command === "sum") {
    const numArgs = args.map(x => parseFloat(x));
    const sum = numArgs.reduce((counter, x) => counter += x);
    message.reply(`The sum of all the arguments you provided is ${sum}!`);
  }
});

client.login(config.BOT_TOKEN);

در این مرحله، ربات Discord خود را با اجرای دستور sum توسعه داده اید.

نتیجه

شما یک ربات Discord را با موفقیت پیاده‌سازی کرده‌اید که می‌تواند چندین دستور مختلف کاربر و آرگومان‌های فرمان را مدیریت کند. اگر می‌خواهید ربات خود را گسترش دهید، احتمالاً می‌توانید دستورات بیشتری را اجرا کنید یا بخش‌های بیشتری از Discord API را امتحان کنید تا یک ربات قدرتمند Discord بسازید. می توانید اسناد Discord.js یا اسناد Discord API را مرور کنید تا دانش خود را در مورد Discord API گسترش دهید. به طور خاص، می توانید دستورات ربات خود را به دستورات اسلش تبدیل کنید، که بهترین تمرین برای Discord.js نسخه 13 است.

هنگام ایجاد ربات‌های Discord، همیشه باید شرایط سرویس Discord API را در نظر داشته باشید که نشان می‌دهد توسعه‌دهندگان چگونه باید از Discord API استفاده کنند. اگر می‌خواهید درباره Node.js بیشتر بدانید، نحوه کدنویسی در سری Node.js را بررسی کنید.

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

 

برچسب‌ها:

 

  • behnam gol mohamadi