سرور مجازی

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

  • ۰
  • ۰

redux-form یک روش عالی برای مدیریت اشکال است که توسط Redux تهیه شده است. در واقع یک کامپوننت مرتبه بالاتر (HOC) است که از re-redux استفاده می کند تا مطمئن شود فرم های HTML در React از Redux برای ذخیره تمام وضعیت آن استفاده میکنند.
redux-form مولفه های زیر را برای کمک به شما در ساخت برنامه های تان دارد:
formReducer (): تابعی است که می گوید چگونه می توانید فروشگاه Redux را بر اساس تغییراتی که از برنامه اعمال می شود به روز کنید. این تغییرات توسط اقدامات Redux شرح داده شده است. formReducer باید روی فرم Redux نصب شود.
reduxForm (): تابع reduxForm () یک جزء مرتبه بالاتر است که یک آبجکت پیکربندی می گیرد و همیشه یک عملکرد جدید را برمی گرداند. و برای دربرگیری مؤلفه فرم و پیوند تعامل کاربر با اقدامات ارسالی Redux استفاده می شود.
مؤلفه <Field />: مؤلفه ای که در داخل مؤلفه فرم پیچیده شما قرار دارد. به عنوان روشی برای اتصال عناصر ورودی در یک فرم به redux-form logic ارائه میشود. به عبارت دیگر، این راهی است که ما می توانیم ورودی را از آنچه کاربر تایپ می کند ، دریافت کنیم.
می توانید اطلاعات بیشتر در مورد API redux-form را در مستندات آن بخوانید.
در این آموزش ، از فرم redux برای ساختن فرم با اعتبار و اتصال آن به فروشگاه Redux استفاده خواهید کرد.
پیش نیازها
برای تکمیل این آموزش به یک محیط توسعه محلی برای Node.js. نیاز دارید. نحوه نصب Node.js و ایجاد محیط توسعه محلی را در این لینک دنبال کنید.
مرحله 1 – ایجاد پروژه
ما می خواهیم با بسته  create-react-app، یک برنامه React بسازیم. create-react-app به شما امکان می دهد برنامه های React را بدون پیکربندی ساخت ایجاد کنید. با اجرای دستور ترمینال زیر می توانید از برنامه create-react-app استفاده کنید. این برنامه به صورت خودکار یک برنامه React را در یک پوشه با عنوان contact-redux ایجاد می کند.
⦁ $ npx create-react-app contact-redux

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

⦁ $ npm install -g create-react-app

⦁ $ create-react-app contact-redux
به دایرکتوری بروید و سرور مجازی توسعه را شروع کنید تا اطمینان حاصل شود که همه چیز کار می کند. برای شروع برنامه جدید ایجاد شده React در حالت توسعه ، دستور زیر را اجرا کنید:
⦁ $ npm start

موارد زیر را در مرورگر خود مشاهده خواهید کرد:

اکنون یک برنامه React فعال و در حال اجرا است.
دستور زیر را اضافه کنید تا متعلقات لازم برای فرم را اضافه کنید.
⦁ npm install –save redux react-redux redux-form

⦁ redux – یک کانتینر حالت و شرطی لازم برای کارکرد redux-form است.
⦁ React -Redux – React Redux اتصالات رسمی React برای Redux است و همچنین شرط لازم برای کارکردن redux-form
⦁ redux-form – بسته مورد استفاده برای این آموزش.
پس از نصب ، می توانید روی فرم تماس با ما کار کنید.
مرحله 2 – ایجاد فرم
ما پیوند Bulma CDN را به فایل index.html اضافه خواهیم کرد تا یک ظاهر طراحی پیش فرض اضافه شود. فایل public/index.html را باز کنید و خط کد زیر را به برچسب head اضافه کنید:
public/index.html
<link rel=”stylesheet” href=”https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.2/css/bulma.min.css”>

اکنون می خواهیم ویرایشهایی را در فایل src / App.js انجام دهیم. فایل src / App.js را باز کنید و خط کد زیر را در قسمت بالای فایل اضافه کنید.
src/App.js
import { reduxForm, Field } from ‘redux-form’;

سپس ، به تابع render () بروید و با کد زیر آن را اصلاح کنید:
src/App.js
render() {
return (
<div className=”App”>
<header className=”App-header”>
<img src={logo} className=”App-logo” alt=”logo” />
<h1 className=”App-title”>Welcome to React x redux-form</h1>
</header>
<div className=”container”>
<p className=”App-intro”>
Contact Form
</p>
<SignInForm />
</div>
</div>
);
}
متن مقدمه تغییر کرده است و از همه مهمتر یک مؤلفه <SignInForm /> را که در زیر ایجاد خواهیم کرد اضافه کردیم. این یک مؤلفه ساده خواهد بود که فرم مورد نیاز ما را برمی گرداند و آن را به مؤلفه redux-form وصل می کند. در همان فایل src / App.js ، قبل از اعلام class App extends Component ، این کد را در زیر تایپ کنید.
src/App.js
let SignInForm = props => {
return <form className=”form”>
<div className=”field”>
<div className=”control”>
<label className=”label”>First Name</label>
<Field className=”input” name=”firstName” component=”input” type=”text” placeholder=”First Name”/>
</div>
</div>

<div className=”field”>
<div className=”control”>
<label className=”label”>Last Name</label>
<Field className=”input” name=”lastName” component=”input” type=”text” placeholder=”Last Name”/>
</div>
</div>

<div className=”field”>
<div className=”control”>
<label className=”label”>Email</label>
<Field className=”input” name=”email” component=”input” type=”email” placeholder=”Email Address”/>
</div>
</div>

<div className=”field”>
<div className=”control”>
<label className=”label”>Proficiency</label>
<div className=”select”>
<Field className=”input” name=”proficiency” component=”select”>
<option />
<option value=”beginner”>Beginner Dev</option>
<option value=”intermediate”>Intermediate Dev</option>
<option value=”expert”>Expert Dev</option>
</Field>
</div>
</div>
</div>

<div className=”field”>
<div className=”control”>
<label className=”label”>Age</label>
<Field className=”input” name=”age” component=”input” type=”number” placeholder=”Age”/>
</div>
</div>

<div className=”field”>
<div className=”control”>
<label className=”checkbox”>
<Field name=”saveDetails” id=”saveDetails” component=”input” type=”checkbox”/>
Save Details
</label>
</div>
</div>

<div className=”field”>
<div className=”control”>
<label className=”label”>Message</label>
<Field className=”textarea” name=”message” component=”textarea” />
</div>
</div>

<div className=”field”>
<div className=”control”>
<button className=”button is-link”>Submit</button>
</div>
</div>

</form>;
};
در این کد فرم تماس با ما به صورت جزیی تنظیم می شود که از کاربر می خواهد اطلاعاتی مانند نام ، نام خانوادگی و سن را میخواهد. نکته جالب در این فرم مولفه Field است.
مولفه Field از بسته فرم redux تهیه می شود و نحوه نوشتن فیلد input  است. مشخصه type  تعیین می کند چه نوع ورودی باید باشد ، یعنی ورودی radio  ، ورودی checkbox  ، ورودی text  یا ورودی email . مشخصه component  تعیین می کند که چه نوع فیلد ورودی باید باشد ، می تواند برچسبهای input ، textarea  یا select  باشد و ویژگی prop همان چیزی است که برای شناسایی وضعیت فیلدهای فروشگاه redux که در زیر ایجاد خواهیم کرد ، استفاده خواهد شد.
بنابراین برای استفاده از فرم متصل به فرم redux ، باید یک نوع فروشگاه Redux ایجاد کنیم و این کاری است که در آینده انجام خواهیم داد.
مرحله 3 – راه اندازی فروشگاه Redux
ما به یک فروشگاه Redux احتیاج داریم که بتوانیم مؤلفه فرم (SignInForm) را که ایجاد کردیم به هم وصل کنیم. بیایید با وارد کردن بسته redux شروع کنیم. فایل src / index.js را باز کنید و خطوط کد زیر را اضافه کنید که در آن اساساً redux  را وارد برنامه React میکنیم.
src/index.js
import { createStore, combineReducers } from ‘redux’;
import { Provider } from ‘react-redux’;
import { reducer as formReducer } from ‘redux-form’;

اولین خط کد createStore  و combineReducers را وارد میکند. createStore کمک می کند تا یک فروشگاه Redux ایجاد کنید که وضعیت کامل برنامه شما را نگه میدارد و combineReducers  به ​​شما کمک می کند تا کلیه توابع کاهشی خود را در یک تابع کمکی منفرد مدیریت کنید که می تواند پس از آن به CreateStore منتقل شود. می توانید اطلاعات بیشتر در مورد این عملکردها را در صفحه مرجع Redux API مطالعه کنید.
خط دوم کد Provider  را از react-redux تأمین می کند. Provider  کمک می کند تا وضعیت فروشگاه به کلیه اجزای کانتینر موجود در برنامه منتقل شود و در ادامه نشان خواهیم داد که چگونه کار می کند.
خط سوم کد reducer  به عنوان formReducer وارد میکند و این چیزی است که ما می خواهیم از آن استفاده کنیم تا فرم خود را به فروشگاه Redux وصل کنیم.
در مرحله بعد ، ما فروشگاه واقعی Redux را ایجاد می کنیم و با استفاده از مؤلفه Provider  ، اطمینان حاصل می کنیم که برای همه اجزای کانتینر کاربرد دارد. فایل src / index.js را با بلوک کد زیر ویرایش کنید.
src/index.js
import React from ‘react’;
import ReactDOM from ‘react-dom’;

import { createStore, combineReducers } from ‘redux’;
import { Provider } from ‘react-redux’;
import { reducer as formReducer } from ‘redux-form’;

import ‘./index.css’;
import App from ‘./App’;
import registerServiceWorker from ‘./registerServiceWorker’;

const rootReducer = combineReducers({
form: formReducer,
});

const store = createStore(rootReducer);

ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById(‘root’)
);

registerServiceWorker();

در بلوک کد بالا ، ما از تابع CombineReducers استفاده می کنیم تا formReducer را از فرم به فروشگاه Redux وصل کنیم. در اصل برای به روزرسانی هر یک از حالت های ما در پاسخ به اقدامات ، که در این حالت ، تغییر فرم هستند ، مورد استفاده قرار می گیرد. خط بعدی کد برای ایجاد فروشگاه با استفاده از CreatStore از Redux استفاده می شود.
سپس این فروشگاه تازه ایجاد شده به کمک Provider که در قسمت کامپوننت برنامه است، در دسترس همه قسمتهای برنامه قرار میگیرد و همچنین خصیصه ای را قبول می کند که همانstore  است که در بالا ایجاد شد.
بیایید به فرم برگردیم و در آخر آن را به فروشگاه وصل کنیم.
مرحله 4 – اتصال فرم به redux-form
ما مؤلفه فرم خود را داریم اما هنوز به فرم redux وصل نشده است. بیایید آن را تنظیم کنیم. این بلوک کد را درست زیر class App extends Component و بلافاصله پس از اعلان مؤلفه ارائه دهنده SignInForm ، تایپ کنید.
src/index.js
SignInForm = reduxForm({
form: ‘signIn’,
})(SignInForm);

در بلوک کد بالا ، SignInForm با استفاده از کامپوننت مرتبه بالاتر reduxForm به فرم متصل به redux تبدیل می شود. این بدان معنی است که فرم ما اکنون به فروشگاه قلاب شده است.
نکته مهم این است که فرم کلید پیکربندی ، به عنوان شناسه استفاده می شود و از آن برای تهیه نامی منحصر به فرد برای مؤلفه فرم گردد. اگر چند فرم وجود داشته باشد ، برای مدیریت بهتر حالتهای مختلف ، باید از اسامی جداگانه استفاده کنید.
نکته بعدی که باید انجام دهیم پیکربندی مواردی است که هنگام کلیک بر روی دکمه اتفاق می افتد. در یک برنامه ایده آل ، شما می خواهید داده ها را به یک API راه دور یا برخی از پایگاه های داده ارسال کنید اما به خاطر اهداف نمایشی ، ما داده های فرم را در کنسول مرورگر وارد خواهیم کرد. برای انجام این کار ، باید داده های فرم را از مشخصه ها بگیریم و آنها را در جایی ذخیره کنیم.
در داخل مولفه SignInForm ، خط کد زیر را درست بالای عبارت return  اضافه کنید.
src/index.js
const { handleSubmit } = props;
return <form **onSubmit={handleSubmit}** className=”form”>

props  موجود در فرم SignInForm به دسته handleSubmit تجزیه می شوند. در هنگام کلیک بر روی دکمه ارسال ، از تابع handSubmit در فرم به عنوان کنترل کننده رویداد onSubmit استفاده می شود.

سرانجام ، در داخل مولفه app در فایل src / App.js ، تابعی را ایجاد می کنیم که داده های فرم را به کنسول مرورگر وارد می کند. درست قبل از تابع render() ، بلوک کد زیر را به فایل اضافه کنید.
src/App.js
handleSignIn = values => {
console.log(values);
};
سپس تابع handSignIn را به عنوان کنترل کننده رویداد برای مؤلفه SignInForm اضافه کنید. redux-form به طور خودکار مشخص می کند که داده های بدست آمده از فرم ، که اساساً مؤلفه SignInForm است باید به لطف توابع handleSubmit فوق در کنسول وارد شوند.
src/App.js
<SignInForm onSubmit={this.handleSignIn} />

اکنون می توانید برنامه را با اجرای دستور پایانه npm start شروع کنید. فرم را پر کنید ، روی ارسال کلیک کنید و مقادیر وارد شده به کنسول را مشاهده خواهید کرد.

مرحله 5 – افزودن اعتبارات
وقتی صحبت از فرم های ساخت و ارسال redux-form با برخی از ویژگی های اعتبار سنجی به میان می آید، افزودن اعتبارات مهم است و اکنون قصد داریم آن را اجرا کنیم. در فایل src / App.js ، بلوک کد زیر را تایپ کنید.
src/App.js
const validate = val => {
const errors = {};
if (!val.firstName) {
console.log(‘First Name is required’);
errors.firstName = ‘Required’;
}
if (!val.lastName) {
console.log(‘Last Name is required’);
errors.lastName = ‘Required’;
}
if (!val.email) {
console.log(’email is required’);
errors.email = ‘Required’;
} else if (!/^.+@.+$/i.test(val.email)) {
console.log(’email is invalid’);
errors.email = ‘Invalid email address’;
}
if (!val.age) {
errors.age = ‘Required’
} else if (isNaN(Number(val.age))) {
errors.age = ‘Must be a number’
} else if (Number(val.age) < 18) {
errors.age = ‘Sorry, you must be at least 18 years old’
}
return errors;
};
تابع validate  برای بررسی خطاهای اعتبار سنجی در فرم استفاده می شود. از پارامتر Val برای بررسی اعتبار سنجی فیلدهای مختلف استفاده می شود. ابتدا بررسی می کنیم که آیا آبجکت errors  خالی است ، بدیهی است که آبجکت خالی به این معنی است که خطایی وجود ندارد. سپس از منطق شرطی استفاده می کنیم تا بررسی کنیم که آیا یک فیلد خالی است یا خیر ، اگر هست شما خطای مربوطه را وارد می کنید. در بلوک کد بالا ، ما فقط اعتبار سنجی برای نام ، نام خانوادگی ، ایمیل و سن را انجام می دهیم.
در شرط اعتبار سنجی ایمیل ، بررسی می کنیم که آیا خالی است یا خیر و همچنین اینکه آیا یک ایمیل معتبر با استفاده از regex استفاده کرده است و در اعتبارسنجی مشروط سن ، بررسی می کنیم که خالی است ، یا یک عدد است و آیا کاربر کمتر از 18 سال است.
در مرحله بعدی ، عملکرد اعتبارسنجی خود را به صورت redux ثبت خواهیم کرد تا بتواند از آن استفاده کند و آزمایش های اعتبار سنجی را انجام دهد. تابع validate  را به مؤلفه مرتبه بالاتر redux-form اضافه کنید:
src/index.js
SignInForm = reduxForm({
form: ‘signIn’,
validate,
})(SignInForm);

اکنون که عملکرد اعتبارسنجی خود را آماده کرده ایم و در فرم Hux-redux ثبت شده است ، یک مؤلفه قابل استفاده مجدد ایجاد کنید که خطاها را در هر زمان وقوع، نشان دهد و از آن مؤلفه جدید ایجاد شده در فرم های ما استفاده کند.
src/index.js
const renderField = ({ input, label, type, meta: { touched, error, warning } }) => (
<div>
<div className=”control”>
<label className=”field”>{label}</label>
<input className=”input” {…input} placeholder={label} type={type}/>
{touched && ((error && <span>{error}</span>) || (warning && <span>{warning}</span>))}
</div>
</div>
)

مؤلفه renderField آبجکت input  ، یک label ، نوع ورودی و meta را که خاصیت redux-form است در اختیار شما قرار می دهد. خط {touched && ((error && <span>{error}</span>) || (warning && <span>{warning}</span>))}
به این معنی است که اگر هنگام کلیک/ تمرکز روی فیلد فرم ، خطایی وجود داشته باشد ، باید پیام خطایی نشان داده شود. همچنین در صورت بروز هرگونه خطا ، فرم ارسال نمی شود.
حال اگر فرم را بررسی کردید و سعی در وارد کردن ورودی های نامعتبر دارید یا از فیلدهایی که دارای تست های اعتبار سنجی هستند ، عبور میکنید ، باید پیام های خطا را دریافت کنید.

نتیجه
در این آموزش شما یک فرم با redux-form ساخته اید و آن را به فروشگاه Redux وصل کردید. بدون نیاز به اعتبار سنجی شماتیک خارجی، اعتبارات همزمان را در فرم اضافه کردید.
می توانید اطلاعات بیشتر در مورد redux-form را در سایت رسمی مطالعه کنید و برای آگاهی بیشتر می توانید از مثال های آنها استفاده کنید.
می توانید کد کامل این آموزش را در GitHub پیدا کنید.

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

Angular (2+) در دسترس است ، و همه ما از این موضوع بسیار هیجان زده هستیم. با این حال ، برای برخی از ما ، هنوز پایگاههای بزرگ کد AngularJS (1.x) در محل کار وجود دارد. چگونه می توانیم برنامه خود را به نسخه جدید Angular منتقل کنیم – به ویژه اگر نتوانیم برای بازنویسی کامل شش ماه از توسعه مشخصه فاصله بگیریم؟
این جاست که کتابخانه ngUpgrade وارد عمل می شود. ngUpgrade ابزار رسمی است که به شما امکان می دهد برنامه خود را اندک اندک منتقل کنید. در واقع بهAngular اجازه میدهد تا زمانی که نیاز به ارتقاء آهسته دارید ، به صورت پهلو به پهلو و به همراه کد AngularJS شما اجرا شود.
در این راهنما ngUpgrade و Angular را نصب و راه اندازی می کنید. سپس اصول اولیه نوشتن مولفه ها را یاد خواهید گرفت.
(اگر طولانی بودن این راهنما شما را خسته میکند ، نگران نباشید. من یک ویدیوی کاملاً مفصل به نام Upgrading AngularJS تهیه کرده ام که همه این موارد را با جزئیات پوشش می دهد).
<a href=“https://www.upgradingangularjs.com?ref=scotch.io”\>

</a\>
نقطه شروع ما
برای شروع کار با ngUpgrade ، برنامه شما باید چند پیش شرط را برآورده کند:
1- کد سازماندهی شده توسط مشخصه (نه براساس نوع) و هر فایل فقط شامل یک آیتم (مانند یک بخشنامه یا سرویس)
2- تنظیم TypeScript
3- استفاده از بسته نرم افزاری ماژول (بیشتر افراد از Webpack استفاده می کنند)
4- استفاده از AngularJS 1.5+ با کنترلرهای جایگزین شده توسط مولفه ها
(اگر در هر یک از این موارد گمراه شدید ، ما همه آن ها را در قسمت های 1 و 2 این لینک پوشش می دهیم)
در حال حاضر ، یک دقیقه وقت بگذارید تا پروژه نمونه دوره را در GitHub کلون یا فورک کنید (فراموش نکنید که npm install را نصب کنید). این تعهد را بررسی کنید تا نقطه شروع ما را ببینید:
git checkout fdfcf0bc3b812fa01063fbe98e18f3c2f4bcc5b4
ما یک پروژه سفارش سیستم داریم که می توانیم از طریق ngUpgrade برای کار استفاده کنیم. با شروع این تعهد ، برنامه ما تمامی معیارهای فوق را رعایت می کند. ما از معماری مؤلفه ها ، TypeScript و Webpack استفاده می کنیم (حتی در زمینه توسعه و تولید نیز ساختارهایی داریم).
توجه: در بسیاری از برنامه های بزرگ AngularJS ، شما نمی توانید همه چیز را به یک منبع کاملاً جدید Git منتقل کنید و سالها سابقه را از بین ببرید. همچنین ممکن است از ساختار برنامه ای متفاوت از CLI استفاده کنید. اگر می توانید از CLI برای ارتقاء خود استفاده کنید ، پس این کار را انجام دهید. با این حال ، این راهنما ، تنظیم دستی را در اینجا به شما آموزش می دهد تا بتوانید کنترل کاملی بر روی به روزرسانی خود داشته باشید.

نصب Angular & ngUpgrade
ما آماده نصب Angular ، ngUpgrade و همه متعلقات هستیم. در پروژه نمونه ، پیش بروید و آرایه متعلقات pack.json خود را به روز کنید تا این گونه به نظر برسد:
“dependencies”: {
“@angular/common”: “^5.2.5”,
“@angular/compiler”: “^5.2.5”,
“@angular/core”: “^5.2.5”,
“@angular/forms”: “^5.2.5”,
“@angular/platform-browser”: “^5.2.5”,
“@angular/platform-browser-dynamic”: “^5.2.5”,
“@angular/router”: “^5.2.5”,
“@angular/upgrade”: “^5.2.5”,
“angular”: “1.6.6”,
“angular-route”: “1.6.6”,
“bootstrap”: “3.3.7”,
“core-js”: “^2.5.3”,
“jquery”: “^2.2.4”,
“lodash”: “4.17.4”,
“moment”: “~2.17.1”,
“reflect-metadata”: “^0.1.12”,
“rxjs”: “^5.5.6”,
“zone.js”: “^0.8.20″
}

(ما می خواهیم از این Angular 5 در این سری استفاده کنیم ، حتی اگر پروژه نمونه از نسخه 4 استفاده کند. نگران نباشید. مراحل یکسان هستند.)
ما می توانیم همه این بسته ها را با یک پرچم ذخیره در یک دستور طولانی در پایانه قرار دهیم ، اما از زمان استفاده میکنیم تا توضیح دهیم که هرکدام از این بسته ها چیست.
ابتدا کتابخانه های ما تحت فضای نام @angular :
⦁ @angular/common: اینها خدمات ، اتصالات و دستورالعمل های مورد نیاز Angular هستند. این بسته همچنین حاوی HttpClient جدید مشابه نسخه 4.3 است ، بنابراین ما دیگر نیازی به @ angular / http نداریم.
⦁ @angular/compiler : کامپایلر الگوی Angular است. قالب ها را می گیرد و آنها را به کدی تبدیل می کند که باعث می شود برنامه شما اجرا و ارائه شود. تقریباً هرگز نیازی به تعامل با آن ندارید.
⦁ @angular/core: بخشهای مهم زمان اجرای Angular هستند که توسط هر برنامه مورد نیاز است. این موارد مانند دکوراتورهای ابرداده (به عنوان مثال ، Component ، Injectable) ، تمام متعلقات ورودی و چرخه زندگی مولفه مانند OnInit متصل میشوند.
⦁ @angular/forms : همه چیزهایی است که برای فرم ها نیاز داریم ، خواه قالب یا واکنش پذیر.
⦁ @angular/platform-browser: همه چیزی که به قلمرو و مرورگر مربوط است ، به خصوص بخش هایی که در ارائه قلمرو کمک می کند. بسته ای است که شامل bootstrapStatic میباشد ، روشی که ما برای راه اندازی برنامه های کاربردی خود برای تولید استفاده می کنیم.
⦁ @angular/platform-browser-dynamic: این بسته شامل ارائه دهندگان و یک روش بوت استرپ دیگر برای برنامه هایی است که الگوهای مربوط به مشتری را کامپایل می کنند. بسته ای است که ما در هنگام توسعه از bootstrapping استفاده می کنیم و در ویدیوی دیگری تعویض بین این دو را پوشش خواهیم داد.
⦁ @angular/router: همانطور که ممکن است حدس بزنید ، فقط روتر Angular است.
⦁ @angular/upgrade: کتابخانه ngUpgrade است که به ما امکان می دهد برنامه AngularJS ما را به Angular منتقل کنیم.
بعد از همه بسته های Angular ، بسته های چندکاره ما که وابسته به Angular هستند ، آمده اند:
⦁ core-js متن جهانی یا پنجره ای را با ویژگی های خاصی از ES6 یا ES2015 متصل می کند.
⦁ reflect-metadata یک کتابخانه چند منظوره برای حاشیه نویسی است که از Angular در کلاس های خود استفاده می کند.
⦁ Rxjs: کتابخانه ای است که شامل همه مشاهداتی است که برای دستیابی به داده های خود از آنها استفاده خواهیم کرد.
⦁ zone.js یک قطعه چندگانه برای مشخصات Zone است ، که بخشی از نحوه مدیریت Angular در تشخیص تغییر میباشد.
بعضی اوقات ، اختلافاتی در رابطه با نسخه TypeScript که استفاده می کنید وجود دارد. این می تواند به دلیل RxJS ، کامپایلر Angular یا Webpack باشد. اگر با خطاهای تلفیقی عجیب و غریب مواجه شدید ، تحقیقاتی انجام دهید تا متوجه شوید که کدام یک از آنها به یک دامنه نسخه خاص از TypeScript برای نسخه ای که استفاده می کنید نیاز دارند.
ترمینال خود را باز کنید، در پوشه public  پروژه وارد شوید و npm install را اجرا کنید (اگر ترجیح می دهید، میتوانید Yarn را نصب و از آن استفاده کنید). خواهید دید که تمام بسته های شما نصب شده است.
اکنون آماده هستیم تا با استفاده از بوت دوگانه AngularJS و Angular ، برنامه خود را به برنامه هیبریدی تبدیل کنیم.
تنظیم ngUpgrade
برای راه اندازی ngUpgrade ، باید یک سری مراحل انجام دهیم تا AngularJS و Angular بتوانند در کنار یکدیگر اجرا شوند.
مرحله 1: حذف Bootstrap از index.html
اولین کاری که باید انجام دهیم حذف دستورالعمل bootstrap از index.html است. اینگونه AngularJS به طور معمول با بارگذاری صفحه شروع می شود ، اما ما قصد داریم آن را از طریق Angular با استفاده از ngUpgrade بوت کنیم. بنابراین ، فقط index.html را باز کنید و آن برچسب data-ng-app را حذف کنید. (اگر در برنامه خود از DI جدی استفاده می کنید ، این برنامه را نیز در این مرحله حذف کنید.) فایل index.html شما اینگونه خواهد شد:
<html>
<head>
<title>Amazing, Inc. Order System</title>
</head>
<body>
<navigation></navigation>
<div class=”container” ng-view></div>
</body>
</html>

مرحله 2: تغییر ماژول AngularJS
حال باید تغییراتی در ماژول AngularJS ایجاد کنیم. app.ts را باز کنید. اولین کاری که باید انجام دهیم تغییر نام برنامه های app.ts به app.module.ajs.ts است تا نشان دهد که این ماژول برای AngularJS میباشد. این یک نام طولانی است ، اما در Angular می خواهیم نوع را در نام فایل خود داشته باشیم. در اینجا از app.module استفاده می کنیم و سپس ajs  را اضافه می کنیم تا مشخص کنند که به جای app.module اصلی برای Angular (که در یک ثانیه انجام خواهیم داد) برای AngularJS است.
با توجه به برنامه فعلی ، ما فقط از AngularJS استفاده می کنیم ، بنابراین همه عبارات ورودی خود را در اینجا داریم و همه چیز را در ماژول Angular خود ثبت می کنیم. با این حال ، آنچه اکنون قصد داریم انجام دهیم انتققال این ماژول و وارد کردن آن به ماژول Angular جدید برای آماده سازی و راه اندازی آن است. بنابراین ، در خط 28 اجازه دهید یک ثابت رشته ای از نام برنامه خود ایجاد کنیم:
const MODULE_NAME = ‘app’;
سپس رشته برنامه خود را با نام ماژول در اعلان Angular.module جایگزین خواهیم کرد:
angular.module(MODULE_NAME, [‘ngRoute’])
// component and service registrations continue here

و در آخر ، باید ثابت خود را منتشر کنیم:
export default MODULE_NAME;
می توانید ماژول AngularJS تمام شده را در این مرحله ببینید.
مرحله 3: ایجاد ماژول برنامه Angular
ماژول AngularJS ما آماده است ، بنابراین ما اکنون آماده ساختن ماژول Angular هستیم. سپس ماژول AngularJS را وارد خواهیم کرد تا بتوانیم به صورت دستی آن را در اینجا بوت کنیم. این همان چیزی است که اجازه می دهد این دو چارچوب با هم اجرا شوند ، و ngUpgrade را قادر می سازد تا شکاف بین آنها را پر کند.
اولین کاری که باید انجام دهیم ایجاد یک فایل جدید در همان سطح ماژول AngularJS به نام app.module.ts است. اکنون برای اولین بار ، الگویی را می بینید که در طی ارتقاء برای شما آشنا می شود: ساخت و ارائه کلاس ، تزئین آن با حاشیه نویسی و وارد کردن همه متعلقات.
در ماژول برنامه جدید خود ، بیایید یک کلاس بنام AppModule ایجاد کنیم:
export class AppModule {
}

اکنون بیایید اولین یادداشت خود را (که به آن دکوراتور نیز می گویند) اضافه کنیم. حاشیه نویسی فقط بخشی از ابرداده است که Angular هنگام ساختن برنامه ما استفاده می کند. فراتر از کلاس جدید ، از حاشیه نویسی NgModule استفاده خواهیم کرد و در یک آبجکت گزینه ها وارد میکنیم:

@NgModule({})
export class AppModule {
}

اگر دنبال ویرایشگری مانند Visual Studio Code هستید ، می بینید که TypeScript گیج شده است زیرا نمی داند NgModule چیست. دلیل این امر آن است که ما باید آن را از کتابخانه هسته Angular وارد کنیم. بعد از دکوراتور، می توانیم این کار را با:
import { NgModule } from ‘@angular/core’;
انجام دهیم.
حال ، در ابجکت گزینه های ما برای ngModule ، باید یک سری ورودی را وارد کنیم. آرایه ورودی ها سایر NgModules را که این NgModule به آن بستگی دارد ، مشخص می کند. (این ورودی ها متفاوت از ورودی TypeScript در بالای فایل ما است.) در حال حاضر ، ما به BrowserModule و UpgradeModule احتیاج داریم:
import { NgModule } from ‘@angular/core’;

@NgModule({
imports: [
BrowserModule,
UpgradeModule
]
})
export class AppModule { }

البته ، ما آنهایی که در بالای فایل ما وارد نشده اند را نداریم ، بنابراین باید این کار را نیز انجام دهیم. بعد از اولین ورودی ، می توانیم اضافه کنیم:
import { BrowserModule } from ‘@angular/platform-browser’;
import { UpgradeModule } from ‘@angular/upgrade/static’;
یک UpgradeModule هم در upgrade  و هم upgrade/static وجود دارد. ما می خواهیم از استاتیک استفاده کنیم زیرا گزارش خطای بهتری را ارائه می دهد و با کامپایل AOT کار می کند.
داربست اصلی ماژول ریشه را برای راه اندازی Angular دریافت کرده ایم و آماده هستیم تا بوت کردن را انجام دهیم.
مرحله 4: Bootstrapping در ماژول Angular
برای راه اندازی برنامه خود ، اولین کاری که باید انجام دهیم تزریق UpgradeModule با استفاده از یک تابع constructor است:
constructor(private upgrade: UpgradeModule){
}

در تابع constructor خود لازم نیست کاری انجام دهیم. نکته بعدی که انجام خواهیم داد ، رونویسی تابع doBootstrap است. بعد از constructor ، تایپ کنید:
ngDoBootstrap(){
}

در مرحله بعد ، از تابع bootstrap UpgradeModule استفاده خواهیم کرد. همان انضای بوت استرپ Angular را دارد ، اما برای ما چند کار اضافی انجام می دهد. ابتدا مطمئن شوید که Angular و AngularJS در نواحی صحیح اجرا می شوند ، و سپس یک ماژول اضافی را تنظیم می کند که اجازه می دهد AngularJS در Angular و Angular در AngularJS قابل مشاهده باشد. و در آخر اینکه ، API های قابلیت تست را سازگار می کند ، به طوری که Protrotor با برنامه های ترکیبی کار می کند ، که بسیار حائز هاهمیت است.
بیایید آن را اضافه کنیم:
ngDoBootstrap(){
this.upgrade.bootstrap(document.documentElement, [moduleName], {strictDi: true});
}

ما در ابتدا عنصر document  و سپس ماژول AngularJS درون یک آرایه را وارد میکنیم. در آخر، می توانید نمونه ای از این مورد را ببینید ، ما یک آبجکت پیکربندی اضافه می کنیم تا بتوانیم تزریق متعلقات را انجام دهیم.
ممکن است بپرسید که نام ماژول از کجا آمده است. ما باید آن را با سایر عبارات خود وارد کنیم:
import moduleName from ‘./app.module.ajs’;
فایل app.module.ts ما تکمیل شده و اینگونه خواهد بود:
import { NgModule } from ‘@angular/core’;
import { BrowserModule } from ‘@angular/platform-browser’;
import { UpgradeModule } from ‘@angular/upgrade/static’;
import moduleName from ‘./app.module.ajs’;

@NgModule({
imports: [
BrowserModule,
UpgradeModule
]
})
export class AppModule {
constructor(private upgrade: UpgradeModule) { }

ngDoBootstrap(){
this.upgrade.bootstrap(document.documentElement, [moduleName], {strictDi: true});
}
}

این الگویی خواهد بود که به مرور زمان برای شما آشنا می شود.
مرحله 5: ایجاد main.ts
اکنون که ماژول AngularJS و ماژول Angular خود را تنظیم کرده ایم ، به یک نقطه ورودی نیاز داریم که می خواهد این دو را جمع کرده و برنامه ما را اجرا کند. بیایید یک فایل جدید را تحت پوشه src با نام main.ts ایجاد کنیم.
در main.ts ، باید مواردی را وارد کنیم ، به Angular بگوییم که کدام نسخه از AngularJS را لود کند ، و سپس به آن بگوییم که ماژول Angular ما را راه اندازی کند. ابتدا باید دو کتابخانه چند نسخه ای و تابع platformBrowserDynamic را وارد کنیم:
import ‘zone.js’;
import ‘reflect-metadata’;
import { platformBrowserDynamic } from ‘@angular/platform-browser-dynamic’;

چرا platformBrowserDynamic به جای platformBrowser؟ Angular دو روش برای کامپایل دارد: یک گزینه دینامیکی و یک گزینه استاتیک. در گزینه دینامیکی (معروف به just-in-time یا JIT) ، کامپایلر Angular برنامه را در مرورگر کامپایل می کند و سپس برنامه را راه اندازی می کند. گزینه استاتیک (معروف به ahead-of-time یا AOT) یک برنامه بسیار کوچکتر تولید می کند که سریعتر راه اندازی می شود. این امر به این دلیل است که کامپایلر Angular بعنوان بخشی از فرآیند ساخت ، زودتر از زمان اجرا می شود. ما فقط می خواهیم از روش JIT در اینجا با سرور مجازی Webpack dev استفاده کنیم.
(در این دوره ما یک ماژول کامل را صرف راه اندازی AOT برای تولید می کنیم).
حال ما باید هر دو ماژول Angular و AngularJS را وارد کنیم و همچنین روشی را ارائه دهیم که به Angular بگویید از کدام نسخه AngularJS استفاده کند:
import { setAngularLib } from ‘@angular/upgrade/static’;
import * as angular from ‘angular’;

import { AppModule } from ‘./app.module’;

حال برای پایان این کار ، فقط باید setAngularLib را فراخوانی کنیم و در نسخه AngularJS خود وارد کنیم و باید platformBrowserDynamic را فراخوانی کنیم و به آن بگوییم که ماژول برنامه ما را راه اندازی کند. فایل نهایی به این صورت است:
import ‘zone.js’;
import ‘reflect-metadata’;
import { platformBrowserDynamic } from ‘@angular/platform-browser-dynamic’;
import { setAngularLib } from ‘@angular/upgrade/static’;
import * as angular from ‘angular’;
import { AppModule } from ‘./app.module’;

setAngularLib(angular);
platformBrowserDynamic().bootstrapModule(AppModule);

اکنون که این ستاپ را انجام دادیم ، فقط باید نقطه ورود Webpack را در پیکربندی خود تغییر دهیم.
مرحله ششم: بروزرسانی Webpack
خوشبختانه این روند بوت استرپ کردن یک برنامه ترکیبی برای شما منطقی شده است. ما یک فایل main.ts داریم که نقطه ورود ماست ، که کتابخانه AngularJS ما را تنظیم کرده و ماژول Angular ما را بوت می کند. سپس ، ماژول Angular ماژول AngularJS را بوت می کند. این همان چیزی است که اجازه می دهد هر دو چارچوب در کنار یکدیگر اجرا شوند.
اکنون آماده هستیم پیکربندی Webpack خود را تغییر دهیم تا با فایل main.ts ما و نه یکی از فایل های ماژول برنامه شروع شود. webpack.common.js را باز کنید (در زیر پوشه webpack-configs قرار دارد). در زیر module.exports ، برای entry ریشه برنامه خود را به main.ts تغییر خواهیم داد:
entry: {
app: ‘./src/main.ts’,
}

تست برنامه
اکنون ، آماده هستیم تا برنامه ترکیبی خود را در عمل مشاهده کنیم. با باز کردن یک ترمینال و اجرای این دستورات می توانید سرور مجازی dev را اجرا کنید:
cd server
npm start
cd ../public
npm run dev

خواهید دید که Webpack در حال لود شدن است و TypeScript ما با موفقیت کامپایل شده است.
بیایید مرورگر را در localhost:9000 بررسی کنیم: می بینید که برنامه ما هنوز روی سرور مجازی dev اجرا می شود.

بسته به نسخه مورد استفاده، ممکن است در کنسول هشدارهایی در مورد core-js مشاهده کنید ، اما نگران آنها نباشید ، روی کار ما تأثیری ندارند. همچنین می توانید سربرگ شبکه را باز کرده و vendor bundle و app bundle را ببینید:

بسته vendor کاملاً بزرگ است و به این دلیل است که 1) ما سرور مجازی Webpack dev را اجرا می کنیم ، بدان معنی که هیچ چیزی را حداقل نمی کند ، 2) ما در حال اجرای Angular در کامپایل پویا هستیم ، بنابراین کد کامپایلر را به مرورگر ارسال میکند. وقتی در مورد کامپایل AOT صحبت می کنیم این جریان رو به پایین را درست خواهیم کرد ، اما می توانیم همینجا بمانیم و ببینیم که همه داده های مان هنوز در حال لود شدن هستند.
اکنون Angular و AngularJS در کنار یکدیگر در حال اجرا هستند ، به این معنی که برنامه ترکیبی خود را با موفقیت تنظیم کرده ایم. این بدان معنی است که ما آماده هستیم تا نسخه برنامه خود را به صورت جز به جز ارتقا دهیم.
بازنویسی و تنزل رتبه اولین مؤلفه شما
مرحله 1: بازنویسی مؤلفه
ما برنامه خود را بوت کرده و در حالت ترکیبی اجرا نمودیم ، بنابراین آماده هستیم تا با انتقال هر بخش از برنامه خود ، کار را شروع کنیم. یکی از رویکردهای متداول انتخاب مسیر و سپس شروع به بازنویسی هر قطعه از پایین به بالا است ، که از چیزی شروع میشود که کمترین متعلقات را داشته باشد. این به ما امکان می دهد تا به طور تکراری برنامه خود را ارتقاء دهیم تا در هر نقطه ، چیزی داشته باشیم که قابل استفاده در تولید باشد.
بیایید از مسیر هوم شروع کنیم زیرا با تنها یک مولفه هوم کار آسانی خواهد بود. ابتدا مؤلفه هوم خود را به home.component.ts تغییر خواهیم داد.
حال باید مولفه هوم خود را به عنوان کلاس Angular بازنویسی کنیم. اولین کاری که باید انجام دهیم وارد کردن مؤلفه از کتابخانه هسته Angular در بالای فایل است:
import { Component } from ‘@angular/core’
نکته بعدی که انجام خواهیم داد این است که تابع homeComponentController را به یک کلاس تبدیل کنیم. همچنین می توانیم آن را با حروف بزرگ بنویسیم و controller  را در انتهای نام حذف کنیم ، به طوری که فقط HomeComponent نامیده شود. دست آخر ، بگذارید از پرانتز خلاص شویم. و در انتها اینچونه خواهد بود:
class HomeComponent {
var vm = this;
vm.title = ‘Awesome, Inc. Internal Ordering System’;
}

اکنون بیایید آنچه را که درون کلاس است پاک کنیم. ما دیگر نیازی به اعلام vm نداریم زیرا از کلاس استفاده می کنیم. همچنین می توانیم یک ویژگی از title  را به عنوان یک رشته اضافه کنیم و عنوان را روی یک تابع constructor تنظیم کنیم. کلاس ما اینگونه خواهد شد:
class HomeComponent {
title: string;
constructor(){
title = ‘Awesome, Inc. Internal Ordering System’;
}
}

همچنین نیاز به ارائه این کلاس و سپس حذف خط export default داریم.
حال باید از دکوراتور metadata کامپوننت که وارد کردیم استفاده کنیم تا به Angular بگوییم یک مولفه است. می توانیم آبجکت کامپوننت هوم را با دکوراتور کامپوننت و یک آبجکت options جایگزین کنیم:
@Component({
}

اولین گزینه دکوراتور مولفه ما selector است. که فقط برچسب HTML است که ما برای اشاره به این مؤلفه ، که فقط ” home ” خواهد بود ، استفاده خواهیم کرد. توجه داشته باشید که در Angular ، selector یک مورد رشته ای است. و متفاوت از AngularJS است ، که مولفه آن را در camel case نامگذاری می کنیم ، و سپس به یک برچسب HTML با خط فاصله ترجمه می کنیم. در اینجا ، ما می خواهیم دقیقاً برچسب مورد نظر خود را استفاده کنیم. در این حالت ، فقط آن را در ” home ” نگاه می داریم ، بنابراین چندان مهم نیست. پس از آن ، ما الگوی خود را مشخص خواهیم کرد ، دقیقاً مانند AngularJS ، بنابراین فقط می گویم: template: template. و کامپوننت تمام شده ما به شرح زیر است:
import { Component } from ‘@angular/core’;

const template = require(‘./home.html’);

@Component({
selector: ‘home’,
template: template
})
export class HomeComponent {
title: string;
constructor(){
this.title = ‘Awesome, Inc. Internal Ordering System’;
}
}

توجه: اگر در حال کار بر روی برنامه ای هستید که از کامپایلر AOT استفاده می کند ، بهتر است به جای کارهایی که در اینجا انجام می دهیم از patternUrl استفاده کنید و در Webpack تغییراتی ایجاد کنید. البته برای JIT و سرور مجازی توسعه کاملاً مناسب است.

مرحله 2: تنزل رتبه کامپوننت برای AngularJS
اکنون برای ” downgrade ” این مؤلفه باید از کتابخانه ngUpgrade استفاده کنیم. Downgrading به معنای ایجاد یک مولفه یا سرویس AngularJS در دسترس است. از طرف دیگر ” Upgrading ” به معنای تهیه یک مولفه یا سرویس AngularJS در دسترس برای Angular است. آن را در مقاله دیگری پوشش خواهیم داد. خوشبختانه ، تنزل رتبه بسیار آسان است.
ابتدا باید در بالای فایل به همراه ورودی های خود ، دو کار را انجام دهیم. نیاز به وارد کردن تابع downgradeComponent از کتابخانه ارتقاء Angular داریم. متغیری به نام Angular را اعلام کنیم تا بتوانیم این مؤلفه را در ماژول AngularJS خود ثبت کنیم. اینگونه به نظر می رسد:
import { downgradeComponent } from ‘@angular/upgrade/static’;
declare var angular: angular.IAngularStatic;
downgrade کردن مؤلفه کاملاً ساده است. در پایین مؤلفه ما ، این مؤلفه را به عنوان دستورالعمل ثبت خواهیم کرد. دستورالعمل خود ، که فقط home است ، وارد میکنیم ، همان selector در این مورد. پس از آن ، تابع downgradeComponent را از ngUpgrade عبور خواهیم کرد. این تابع مؤلفه Angular ما را به یک دستورالعمل AngularJS تبدیل می کند. سرانجام ، ما این آبجکت را به صورت angular.IDirectiveFactory به کار میگیریم. ثبت نام پایانی به شرح زیر است:
app.module(‘app’)
.directive(‘home’, downgradeComponent({component: HomeComponent} as angular.IDirectiveFactory);

اکنون یک مولفه Angular تنزل یافته داریم که برای برنامه AngularJS ما در دسترس است. شاید تعجب کنید که چرا به جای وارد کردن و ثبت آن در ماژول AngularJS ما ، آن دستورالعمل را در پایین این فایل ثبت کردیم. هدف نهایی این است که به محض اینکه همه برنامه ما تبدیل شد از شر آن فایل خلاص شویم ، بنابراین می خواهیم به تدریج همه چیز را از آن فایل حذف کنیم و سپس با لغو نصب AngularJS ، نهایتا آن را حذف کنیم. این کار برای برنامه های نمونه یا جابه جایی سریع بسیار مفید است (در یک ثانیه).
پیش بروید و app.module.ajs.ts را باز کنید و ورودی homeComponent را در خط 12 و ثبت مؤلفه در خط 37 را حذف کنید.
مطلب سریع در مورد کامپایل AOT
این روش تنزل رتبه – ثبت مؤلفه downgrade شده در فایل کامپوننت و حذف آن از فایل ماژول AngularJS برای توسعه کاملاً مناسب عمل می کند یا اگر به دنبال بازنویسی سریع برنامه قبل از استقرار برنامه خود هستید. با این حال ، کامپایلر Angular AOT برای تولید با این روش کار نخواهد کرد. بلکه همه ثبت نامهای تنزل رتبه ما در ماژول AngularJS را میخواهد.
تنزل رتبه یکسان است ، اما در عوض کارهای زیر را انجام میدهید:
1- downgradeComponent را در app.module.ajs.ts وارد کنید (قبلاً در آنجا angular  را دریافت کردید ، بنابراین نیازی به اعلام آن نیستید).
2- ورودی HomeComponent را به import { HomeComponent } from ‘./home/home.component’; وارد کنید چرا که به یک ارائه نام دار سوییچ کرده ایم.
3- ثبت نام مؤلفه ها را به همان رجیستری که دقیقاً در بالا نشان داده شده تغییر دهید.
در این لینک و همچنین در دوره 3 ارتقاء AngularJS می توانید اطلاعات بیشتری در مورد تنظیم ngUpgrade برای AOT مطالعه کنید (یک ماژول کامل وجود دارد که مرحله به مرحله آن را بیان می کند).
مرحله 3: به روزرسانی الگو
پس از به روزرسانی یک مولفه ، باید حتماً الگوی آن را به روز کنیم تا با دستور جدید Angular مطابقت داشته باشد. در این حالت ، حداقل تغییراتی وجود دارد که باید در homeComponent انجام دهید. فقط باید ctrl $ را در خط دو حذف کنیم. اکنون الگو اینگونه به نظر می رسد:
<div class=”row”>
<h1>{{title}}</h1>
</div>

اکنون ما در برنامه ترکیبی خود یک مولفه هوم کاملاً کاربردی تقلیل یافته داریم.
مرحله 4: افزودن به ماژول برنامه Angular
بیایید مؤلفه Angular جدید خود را به ماژول Angular اضافه کنیم. app.module.ts را باز کنید. ابتدا باید مولفه هوم خود را فقط بعد از ورودی های دیگر ، وارد کنیم:
import { HomeComponent } from ‘./home/home.component’;
حال ، باید HomeComponent را به برنامه Angular خود اضافه کنیم. کلیه مؤلفه های Angular باید به آرایه declarations  درNgModule ما اضافه شوند. بنابراین ، پس از خط 12 در آبجت گزینه ها ، آرایه جدیدی به نام declarations  اضافه می کنیم و مؤلفه خود را اضافه می کنیم:
declarations: [
HomeComponent
]

همچنین باید یک آرایه enterComponent ایجاد کنیم و HomeComponent خود را به آن اضافه کنیم. کلیه مؤلفه های کاهش یافته باید به این آرایه entryComponents اضافه شوند. آن را بعد از declarations اضافه خواهیم کرد
entryComponents: [
HomeComponent
]

با این کار ، عملیات ما تمام شد.
بررسی اینکه آیا کار کند
بیایید همان دستورات قبلی را اجرا کنیم و مطمئن شویم که برنامه ما هنوز کار می کند. این دستورات دوباره آمده است:
cd server
npm start
cd ../public
npm run dev

به localhost: 9000 برگردید. می بینید که مؤلفه اصلی ما در حال لود شدن در مرورگر به عنوان یک مولفه بازنویسی Angular است! حتی می توانید برای مثبت اندیشی، به سربرگ منابع Devtools کروم بروید. webpack:// را باز کنید ، به پایین بروید ./src/home/home.component.ts ، و مطمئناً ، در آنجا وجود دارد!

نتیجه
در این راهنما موارد زیر را انجام دادید:
• نصب Angular و ngUpgrade
• تنظیم یک ماژول Angular
• بوت کردن Angular و AngularJS
• به روزرسانی Webpack
• بازنویسی و کاهش رتبه اولین مؤلفه خود
در ادامه این راهنما ، ما در مورد اصول اولیه بازنویسی و سرویس های تنزل رتبه صحبت خواهیم کرد.

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

بسیاری از برنامه های وب و API ها از نوعی تأیید اعتبار برای محافظت از منابع استفاده می کنند و دسترسی خود را فقط برای کاربران تأیید شده محدود می کنند. این راهنما نحوه اجرای احراز هویت برای یک API را با استفاده از JSON Web Tokens (JWTs) و Passport ، یک میان افزار تأیید اعتبار برای Node مطرح می کند.
آشنایی با JSON Web Tokens
JSON Web Token (JWT) یک استاندارد باز است که روشی کم حجم و مختصر برای انتقال ایمن اطلاعات بین طرفین به عنوان یک شی JSON را تعریف می کند.
JWT ها به دلیل اینکه به صورت دیجیتالی امضا میشوند ، امن هستند و و اگر اطلاعات موجود در داخل به هر شکلی دستکاری شود، نشانه نامعتبر را ارائه می کند. در ادامه خواهیم دید که چگونه این کار امکان پذیر است.
JWT از سه تعریف جداگانه ساخته شده است: header (هدر)، Payload (لود) و Signature (امضا).
header: هدر نوع الگوریتم مورد استفاده برای تأیید نشانه و نوع نشانه را تعریف می کند:
{
“type” : “JWT”,
“alg” : “HS256”
}

* Payload : شامل ادعاها (Claims) میباشد. ادعاها اطلاعاتی در مورد کاربر به همراه سایر ابرداده های اضافی مانند موارد زیر است:
{
id : 1
name : ‘devgson’
iat : 1421211952
}

Signature: امضا اطلاعات را در header و Payload در فرمت base64 با یک کلید مخفی کدگذاری می کند. تمام این اطلاعات توسط الگوریتم مشخص شده در سربرگ امضا می شود. در مثال ما ، از HMACSHA256 استفاده می کنیم. امضا تأیید می کند که پیام ارسال شده در طول مسیر دستکاری نشده است.
HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
secret
)

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

تنظیم Passport
Passport یک میان افزار تأیید اعتبار است که برای تأیید اعتبار درخواست ها استفاده می شود. این امکان را به توسعه دهندگان می دهد تا برای تأیید اعتبار کاربران از استراتژی های مختلفی استفاده کنند ، از جمله استفاده از یک پایگاه داده محلی یا اتصال به شبکه های اجتماعی از طریق API . در این راهنما ، ما از استراتژی محلی (ایمیل / رمز عبور) استفاده خواهیم کرد.
بیایید یک ساختار پوشه را برای فایل هایی که از آنها استفاده خواهیم کرد ایجاد کنیم:
-model
—model.js
-routes
—routes.js
—secure-routes.js
-auth
—auth.js
-app.js
-package.json

بسته های لازم را با این دستور نصب کنید:
⦁ npm install –save bcrypt body-parser express jsonwebtoken mongoose passport passport-local passport-jwt

برای درهم سازی رمزهای عبور کاربر به bcrypt ، برای امضای نشانه ها به jsonwebtoken ، برای اجرای استراتژی محلی به passport-local و برای دریافت و تأیید JWT به passport-jwt نیاز خواهیم داشت.
در اینجا نحوه کار برنامه آمده است:
• کاربر با sign up و log in وارد سیستم شده و پس از ورود کاربر به سیستم ، یک نشانه وب JSON به کاربر داده می شود.
• از کاربر انتظار می رود این نشانه را به صورت محلی ذخیره کند.
• این نشانه هنگام تلاش برای دستیابی به برخی از مسیرهای امن توسط کاربر ارسال می شود ، پس از تأیید این نشانه ، به کاربر اجازه دسترسی به مسیر داده میشود.
تنظیم پایگاه داده
اول از همه ، ما طرح کاربر را ایجاد می کنیم. کاربر فقط باید ایمیل و رمز عبور خود را ارائه کند ، این اطلاعات کافی است.
model/model.js

const mongoose = require(‘mongoose’)
const bcrypt = require(‘bcrypt’);
const Schema = mongoose.Schema;

const UserSchema = new Schema({
email : {
type : String,
required : true,
unique : true
},
password : {
type : String,
required : true
}
});

اکنون ما نمی خواهیم رمزهای عبور را با متن ساده ذخیره کنیم ، زیرا اگر یک حمله کننده موفق به دسترسی به بانک اطلاعاتی شود ، می تواند رمز عبور را بخواند ، بنابراین می خواهیم از این امر جلوگیری کنیم. از بسته ای به نام “bcrypt” استفاده می کنیم تا کلمه عبور کاربر را در هم سازی (hash) کند و آنها را با خیال راحت ذخیره کند.
model/model.js
….
//This is called a pre-hook, before the user information is saved in the database
//this function will be called, we’ll get the plain text password, hash it and store it.
UserSchema.pre(‘save’, async function(next){
//’this’ refers to the current document about to be saved
const user = this;
//Hash the password with a salt round of 10, the higher the rounds the more secure, but the slower
//your application becomes.
const hash = await bcrypt.hash(this.password, 10);
//Replace the plain text password with the hash and then store it
this.password = hash;
//Indicates we’re done and moves on to the next middleware
next();
});

//We’ll use this later on to make sure that the user trying to log in has the correct credentials
UserSchema.methods.isValidPassword = async function(password){
const user = this;
//Hashes the password sent by the user for login and checks if the hashed password stored in the
//database matches the one sent. Returns true if it does else false.
const compare = await bcrypt.compare(password, user.password);
return compare;
}

const UserModel = mongoose.model(‘user’,UserSchema);

module.exports = UserModel;

تنظیم ثبت نام و ورود به میان افزار
ما از استراتژی محلی passport برای ایجاد میان افزار استفاده خواهیم کرد که ثبت نام کاربر و ورود را انجام میدهد. سپس به مسیرهای خاصی وصل شده و برای احراز هویت استفاده می شود.
auth/auth.js

const passport = require(‘passport’);
const localStrategy = require(‘passport-local’).Strategy;
const UserModel = require(‘../model/model’);

//Create a passport middleware to handle user registration
passport.use(‘signup’, new localStrategy({
usernameField : ’email’,
passwordField : ‘password’
}, async (email, password, done) => {
try {
//Save the information provided by the user to the the database
const user = await UserModel.create({ email, password });
//Send the user information to the next middleware
return done(null, user);
} catch (error) {
done(error);
}
}));

//Create a passport middleware to handle User login
passport.use(‘login’, new localStrategy({
usernameField : ’email’,
passwordField : ‘password’
}, async (email, password, done) => {
try {
//Find the user associated with the email provided by the user
const user = await UserModel.findOne({ email });
if( !user ){
//If the user isn’t found in the database, return a message
return done(null, false, { message : ‘User not found’});
}
//Validate password and make sure it matches with the corresponding hash stored in the database
//If the passwords match, it returns a value of true.
const validate = await user.isValidPassword(password);
if( !validate ){
return done(null, false, { message : ‘Wrong Password’});
}
//Send the user information to the next middleware
return done(null, user, { message : ‘Logged in Successfully’});
} catch (error) {
return done(error);
}
}));
….
ایجاد مسیرها
اکنون که میان افزاری برای مدیریت ثبت نام و ورود به سیستم داریم ، بیایید مسیری ایجاد کنیم که از این میان افزار استفاده کند.
routes/routes.js
const express = require(‘express’);
const passport = require(‘passport’);
const jwt = require(‘jsonwebtoken’);

const router = express.Router();

//When the user sends a post request to this route, passport authenticates the user based on the
//middleware created previously
router.post(‘/signup’, passport.authenticate(‘signup’, { session : false }) , async (req, res, next) => {
res.json({
message : ‘Signup successful’,
user : req.user
});
});

امضای JWT
هنگامی که کاربر وارد سیستم میشود ، اطلاعات کاربر به callback سفارشی ما ارسال می شود که به نوبه خود یک نشانه ایمن با اطلاعات ایجاد می کند. پس از دستیابی به مسیرهای ایمن (که بعداً ایجاد خواهیم کرد) باید این نشانه به عنوان یک پارامتر پرس و جو منتقل شود.

routes/routes.js
….
router.post(‘/login’, async (req, res, next) => {
passport.authenticate(‘login’, async (err, user, info) => { try {
if(err || !user){
const error = new Error(‘An Error occurred’)
return next(error);
}
req.login(user, { session : false }, async (error) => {
if( error ) return next(error)
//We don’t want to store the sensitive information such as the
//user password in the token so we pick only the email and id
const body = { _id : user._id, email : user.email };
//Sign the JWT token and populate the payload with the user email and id
const token = jwt.sign({ user : body },’top_secret’);
//Send back the token to the user
return res.json({ token });
}); } catch (error) {
return next(error);
}
})(req, res, next);
});

module.exports = router;

توجه: ما { session : false } را تنظیم کردیم زیرا نمی خواهیم جزئیات کاربر را در یک بخش ذخیره کنیم. انتظار داریم که کاربر در صورت درخواست هر یک از موارد را به مسیرهای امن ارسال کند. این امر به ویژه برای API مفید است ، اما به دلایل عملکردی روش پیشنهادی برای برنامه وب نیست.

تأیید نشانه کاربر
بنابراین اکنون ثبت نام و ورود کاربر به سیستم را مدیریت کرده ایم ، قدم بعدی این است که به کاربران دارای نشانه اجازه دسترسی به مسیرهای خاص ایمن را بدهیم ، اما چگونه می توانیم تأیید کنیم که توکن ارسال شده توسط کاربر معتبر است و به طریقی دستکاری نشده است. بیایید در مرحله بعد این کار را انجام دهیم.
auth/auth.js
….
const JWTstrategy = require(‘passport-jwt’).Strategy;
//We use this to extract the JWT sent by the user
const ExtractJWT = require(‘passport-jwt’).ExtractJwt;

//This verifies that the token sent by the user is valid
passport.use(new JWTstrategy({
//secret we used to sign our JWT
secretOrKey : ‘top_secret’,
//we expect the user to send the token as a query parameter with the name ‘secret_token’
jwtFromRequest : ExtractJWT.fromUrlQueryParameter(‘secret_token’)
}, async (token, done) => {
try {
//Pass the user details to the next middleware
return done(null, token.user);
} catch (error) {
done(error);
}
}));

توجه: اگر به اطلاعات اضافی یا حساسی در مورد کاربر نیاز دارید که در توکن موجود نیست ، می توانید از _id موجود در نشانه برای بازیابی آنها از پایگاه داده استفاده کنید.
ایجاد مسیرهای ایمن
اکنون اجازه می دهیم برخی از مسیرهای ایمن را ایجاد کنید که فقط کاربران دارای نشان های تأیید شده به آنها دسترسی داشته باشند.
routes/secure-routes.js
const express = require(‘express’);

const router = express.Router();

//Let’s say the route below is very sensitive and we want only authorized users to have access

//Displays information tailored according to the logged in user
router.get(‘/profile’, (req, res, next) => {
//We’ll just send back the user details and the token
res.json({
message : ‘You made it to the secure route’,
user : req.user,
token : req.query.secret_token
})
});

module.exports = router;

بنابراین اکنون با ایجاد مسیرها و میان افزار تأیید اعتبار کار ما انجام شده است ، بیایید همه چیز را کنار هم قرار دهیم و سپس آن را آزمایش کنیم.
app.js

const express = require(‘express’);
const mongoose = require(‘mongoose’);
const bodyParser = require(‘body-parser’);
const passport = require(‘passport’);
const app = express();
const UserModel = require(‘./model/model’);

mongoose.connect(‘mongodb://127.0.0.1:27017/passport-jwt’, { useMongoClient : true });
mongoose.connection.on(‘error’, error => console.log(error) );
mongoose.Promise = global.Promise;

require(‘./auth/auth’);

app.use( bodyParser.urlencoded({ extended : false }) );

const routes = require(‘./routes/routes’);
const secureRoute = require(‘./routes/secure-route’);

app.use(‘/’, routes);
//We plugin our jwt strategy as a middleware so only verified users can access this route
app.use(‘/user’, passport.authenticate(‘jwt’, { session : false }), secureRoute );

//Handle errors
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.json({ error : err });
});

app.listen(3000, () => {
console.log(‘Server started’)

تست با Postman
اکنون که همه چیز را کنار هم قرار داده ایم ، بگذارید از Postman برای آزمایش تأیید اعتبار API استفاده کنیم. اول از همه ما باید با یک ایمیل و رمز عبور وارد سیستم شوید. می توانیم این جزئیات را از طریق body درخواست خود ارسال کنیم. پس از اتمام این کار ، برای شروع درخواست POST روی دکمه ارسال کلیک کنید.

می توانیم رمز عبور رمزگذاری شده را ببینیم ، بنابراین هرکسی که به دیتابیس دسترسی دارد فقط به رمز عبور hashed دسترسی خواهد داشت ، ما امنیت را 10 دور افزایش دادیم. در این لینک میتوانید اطلاعات بیشتری در این مورد بیابید.
اکنون بیایید با اعتبارات خود وارد شویم و توکن را دریافت کنیم. مسیر /login را بازدید کنید و ایمیل و رمز عبوری که قبلا استفاده کردید را وارد نمایید و سپس درخواست را آغاز کنید.

اکنون ما نشانه خود را داریم ، هر زمان که بخواهیم به یک مسیر امن دسترسی پیدا کنیم ، این نشانه را ارسال خواهیم کرد. بیایید این کار را با دسترسی به یک مسیر امن user/profile امتحان کنیم ، نشانه خود را در یک پارامتر پرس و جو به نام secret_token ارسال خواهیم کرد ، این نشانه دریافت و بررسی می شود و در صورت صحت اعتبار دسترسی به مسیر را دریافت خواهیم کرد.

همانطور که مشاهده می کنید ، نشانه معتبر به ما امکان دسترسی به مسیر امن را می دهد. می توانید پیش بروید و دسترسی به این مسیر را امتحان کنید. اما در صورت وجود نشانه نامعتبر ، این درخواست یک خطای Unauthorized  را برمی گرداند.
نتیجه
JSON web tokens راهی مطمئن برای ایجاد تأیید اعتبار برای API ها ارائه می دهند. با رمزگذاری کلیه اطلاعات موجود در این نشانه می توان یک لایه امنیتی بیشتر اضافه کرد و از این طریق آن را ایمن تر کرد. برخی منابع برای یادگیری بیشتر در مورد JWT عبارتند از:
Getting started with JSON web tokens by Auth0
Using JSON web tokens as API keys by Auth0

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

اگر مدتی است که برای وب کار می کنید ، در ساخت swiper ها حداقل با برخی مشکلات روبرو شده اید – به دلایلی ، همیشه به نظر می رسد که راهکار خاص خود را دارند. این swiper ها به اندازه دلخواه شما پاسخگو نیستند و یا کار طراحی گسترده ای باید انجام شود تا به نیمی از آنچه انتظار داشتید برسید.
حال اگر تا کنون از Netflix استفاده کرده اید ، دیده اید که swiper های فیلم آنها چقدر ظریف و روان هستند. به لطف Vue و کتابخانه vue-awesome-swiper ، می توانید swiperهای مخصوص خود را بسازید.
در این آموزش یک swiper در Vue ایجاد خواهید کرد.
• یک محیط توسعه محلی برای Node.js. نیاز دارید. آموزش نحوه نصب Node.js و ایجاد محیط توسعه محلی را دنبال کنید.
مرحله 1 – ایجاد پروژه
Vue یک چارچوب frontend پیشرونده است که به ما کمک می کند تا رابط های تعاملی و شگفت انگیزی ایجاد کنیم. می توانید در این لینک درمورد Vue اطلاعات بیشتری کسب کنید
برای نصب Vue در دستگاه خود ، باید دستور زیر را اجرا کنید:
$ npm install -g vue-cli

این دستور Vue را به صورت جهانی روی دستگاه شما نصب می کند. برای تأیید نصب Vue ، دستور زیر را در ترمینال خود اجرا کنید:
$ vue –version

اگر به عنوان نتیجه یک عدد نسخه دریافت کردید ، یعنی Vue را روی دستگاه خود نصب کرده اید.
اکنون که Vue بر روی دستگاه های شما نصب شده است ، آماده هستیم تا ساخت خود را آغاز کنیم. برای ایجاد برنامه ، از Vue CLI برای شروع کار استفاده کنید. دستور زیر را در ترمینال خود اجرا کنید:
$ vue init webpack netflix-like-swipers

این دستور اعلانی را برای تکمیل کار به ما نشان می دهد و هنگامی که کارها را انجام دادیم ، یک پروژه نمونه Vue را با استفاده از webpack ایجاد می کنیم تا برنامه خود را تغییر داده و بسازیم.

مرحله 2 – ایجاد مؤلفه فیلم
هدف مؤلفه ها استفاده مجدد از برخی قسمت های UI ماست. در این حالت ، ما قصد داریم فیلم های زیادی داشته باشیم ، بنابراین می خواهیم یک مولفه فیلم بسازیم و سپس همانطور که می خواهیم در طول برنامه از آن استفاده کنیم.
برای ساخت مؤلفه فیلم ، یک فایل Movies.vue را در دیرکتوری src/components/ ایجاد کنید
$ nano src/components/Movie.vue

در Movie.vue ، مؤلفه خود را به شرح زیر می سازیم:
Movie.vue
<script>
export default {
name: ‘Movie’,
props : [
‘image’,
‘title’,
‘description’,
‘duration’
],
}
</script>

در اینجا ، ما کامپوننت خود را نامگذاری می کنیم و همچنین props  را برای مولفه ها مشخص میکنیم که در هر بار استفاده از مؤلفه اضافه می شود .
برای تعریف الگوی مؤلفه ، کد زیر را اضافه کنید:
Movie.vue
<template>
<div class=”movie” v-bind:style=”{ backgroundImage: ‘url(‘ + image + ‘)’ }”>
<div class=”content”>
<h1 class=”title”>{{ title }}</h1>
<p class=”description”>{{ description }}</p>
<p class=”duration”>{{ duration }}</p>
</div>
</div>
</template>

سپس برای کنترل نحوه نمایش فیلم ، یک ظاهر طراحی شده برای مؤلفه اضافه کنید:
Movie.vue
<style scoped>
h1, h2 {
font-weight: normal;
}
.movie{
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-end;
text-align: left;
padding: 10px;
width : 350px;
height : 500px;
background-color: rgba(255,255,255,0.7);
background-repeat: no-repeat;
background-blend-mode: overlay;
background-size: cover;
}
</style>

اکنون که مؤلفه فیلم خود را ایجاد کرده اید ، Swiper ها را در برنامه ادغام می کنید.
مرحله 3 – ایجاد مؤلفه HomePage با Vue-Awesome-Swiper
ماژول را با دستور زیر نصب کنید:
$ npm install vue-awesome-swiper –save

اکنون یک مولفه HomePage.vue را در دیرکتوری src/components ایجاد کنید که در آن از swiper استفاده خواهیم کرد.
$ touch src/components/HomePage.vue

در HomePage.vue ، مؤلفه را ایجاد کرده و مؤلفه های Movie، swiper، swiperSlide را وارد کنید. و اسلایدر را با استفاده از خصوصیات thedata برای مؤلفه پیکربندی کنید:
HomePage.vue
<script>
import Movie from ‘./Movie’
import ‘swiper/dist/css/swiper.css’
import { swiper, swiperSlide } from ‘vue-awesome-swiper’

export default {
name: ‘HomePage’,
components: {
Movie,
swiper,
swiperSlide
},
data() {
return {
swiperOption: {
direction : ‘vertical’,
pagination: {
el: ‘.swiper-pagination’,
type: ‘bullets’
},
}
}
}
}
</script>
در این حالت ، مشخص کردیم که می خواهیم swipers ما به صورت عمودی باشند و سبک صفحه بندی باید bullets باشد
قالب، مولفه های تکی Movie  را لود می کند و محتوا را تنظیم می کند:
https://via.placeholder.com/728×90.png?text=Visit+WhoIsHostingThis.com+Buyers+Guide
C/O https://placeholder.com/
HomePage.vue
<template>
<swiper :options=”swiperOption”>

<swiper-slide>
<Movie image=”https://via.placeholder.com/300×450.png?text=Movie1″ title=”Movie 1″ description=”Movie 1 description” duration=”2hrs”/>
</swiper-slide>
<swiper-slide>
<Movie image=”https://via.placeholder.com/300×450.png?text=Movie1″ title=”Movie 2″ description=”Movie 2 description” duration=”2hrs”/>
</swiper-slide>

<swiper-slide>
<Movie image=”https://via.placeholder.com/300×450.png?text=Movie1″ title=”Movie 5″ description=”Movie 5 description” duration=”2hrs”/>

</swiper-slide>

<div class=”swiper-pagination” slot=”pagination”></div>
</swiper>
</template>

ما از مؤلفه <swiper /> استفاده می کنیم و مولفه های <swiper-slide /> بسیاری در داخل آن داریم. برای نگه داشتن عنصر صفحه بندی نیز یک div اضافه کردیم.
CSS زیر را به فایل اضافه کنید تا swiper را طراحی کنید:
HomePage.vue
<style scoped>
.swiper-slide{
display: flex;
justify-content: center;
flex-direction: column;
}
.swiper-container {
height : 500px;
}
</style>

فایل را ذخیره کنید. اکنون می توانید مؤلفه را ارائه دهید.
مرحله 4 – ارائه مؤلفه های ما
برای ارائه مولفه ها ، آنها را وارد کنید و در فایل src / App.vue استفاده کنید.
فایل را در ویرایشگر خود باز کنید:
$ nano src/App.vue

ابتدا کامپوننت HomePage را وارد کنید و swiper را مقدار اولیه بدهید:
App.vue
<script>
import HomePage from ‘./components/HomePage’
export default {
name: ‘App’,
components: {
HomePage
},
data() {
return {
swiperType : ‘Easy Vertical Swiper’
}
}
}
</script>

سپس الگو را اضافه کنید:
App.vue
<template>
<div id=”app”>
<h1>{{ swiperType }}</h1>
<HomePage/>
</div>
</template>

در آخر ، یک ظاهر طراحی اضافه کنید:
App.vue
<style>
#app {
font-family: ‘Avenir’, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
display: flex;
align-items: center;
flex-direction: column;
}
</style>

اطمینان حاصل کنید که همه فایل ها ذخیره شده اند و سرور مجازی توسعه را با دستور زیر شروع می کنید:
npm run dev

با این دستور یک سرور مجازی توسعه شروع می شود. برای مشاهده برنامه خود به http: // localhost: 8080 مراجعه کنید.
مرحله 5 – جستجوی انواع دیگر Swiper ها
اکنون که مشاهده کردیم که Swiperهای ساده چطور کار می کنند ، بیایید گزینه های بیشتری را بررسی کنیم. به افکت های Swiper CoverFlow سه بعدی و Swiperهای جایگزیده نگاهی خواهیم انداخت. برای نمونه های بیشتر swiper ، می توانید مثال های آن را در صفحه پروژه vue-awesome-swiper مرور کنید.
برای ایجاد یک Swiper افکت سه بعدی CoverFlow ، گزینه های کشویی را در HomePage.vue تنظیم کنید تا به این شکل درآید: // HomePage.vue
<script>
[..]
export default {
name: ‘HomePage’,
[…]
data() {
return {
swiperOption: {
effect: ‘coverflow’,
grabCursor: true,
centeredSlides: true,
slidesPerView: ‘5’,
coverflowEffect: {
rotate: 50,
stretch: 0,
depth: 100,
modifier: 1,
slideShadows : false
},
pagination: {
el: ‘.swiper-pagination’
}
}
}
}
}
</script>

اکنون ممکن است از خودتان بپرسید ، “اگر می خواستم در swiper های خود swiper داشته باشم باید چه کار میکردم”. برای انجام این کار ، HomePage.vue خود را به شرح زیر تغییر دهید:
// HomePage.vue
<script>
[…]
export default {
[…]
data() {
return {
swiperOptionh: {
spaceBetween: 50,
pagination: {
el: ‘.swiper-pagination-h’,
clickable: true
}
},
swiperOptionv: {
direction: ‘vertical’,
spaceBetween: 50,
pagination: {
el: ‘.swiper-pagination-v’,
clickable: true
}
}
}
}
}
</script>

ما تنظیمات مربوط به swipers های مختلف را مشخص می کنیم و سپس در الگوی خود ، ساختاری مانند این داریم:
<template>
<swiper :options=”swiperOptionh”>
<swiper-slide>
[…]
</swiper-slide>
[…]
<swiper-slide>
<swiper :options=”swiperOptionv”>
<swiper-slide>
[…]
</swiper-slide>
[…]
<div class=”swiper-pagination swiper-pagination-v” slot=”pagination”></div>
</swiper>
</swiper-slide>
[…]
<div class=”swiper-pagination swiper-pagination-h” slot=”pagination”></div>
</swiper>
</template>

توجه کنید که چگونه از:options=”swiperOptionh” برای مشخص کردن پیکربندی های horizontal swiper و از :options=”swiperOptionv” برای vertical swiper استفاده می کنیم .
اکنون که نمونه های پایه swiper را دیدیم ، به خوبی میتوانیم به ساخت Netflix مانند swipers بپردازیم.
فایل HomePage.vue خود را ویرایش کنید تا به این شکل ظاهر شود:
// HomePage.vue
<script>
[…]
export default {
[…]
data() {
return {
swiperOptions : {
slidesPerView: 5,
spaceBetween: 0,
freeMode: true,
loop: true,
navigation: {
nextEl: ‘.swiper-button-next’,
prevEl: ‘.swiper-button-prev’
}
}
}
}
}
</script>

با انتخاب تعداد فیلم هایی که در هر نمایش می خواهیم ، گزینه های مربوط به swiper را تغییر دادیم. همچنین فاصله بین آنها را 0 قرار دادیم. برای اینکه swipe احساس بی پایان داشته باشد، حلقه را روی true قرار می دهیم. همچنین نام کلاس دکمه های ناوبری خود را مشخص کردیم – این کار عملکردی را به دکمه ها اضافه می کند.
تمپلیت را اصلاح کنید تا ساختار زیر را داشته باشد:
<template>
<swiper :options=”swiperOptions”>
<swiper-slide>
<Movie image=”http://res.cloudinary.com/og-tech/image/upload/s–4NgMf3RF–/v1521804358/avengers.jpg” title=”Avengers : Infinity War” description=”Thanos is around” duration=”2hrs”/>
</swiper-slide>
[…]
<swiper-slide>
<Movie image=”http://res.cloudinary.com/og-tech/image/upload/s–qXaW5V3E–/v1521804426/wakanda.jpg” title=”Black Panther” description=”Wakanda Forever” duration=”2hrs15mins”/>
</swiper-slide>
<div class=”swiper-button-prev” slot=”button-prev”></div>
<div class=”swiper-button-next” slot=”button-next”></div>
</swiper>
</template>

برای دیدن نتایج به سرور مجازی خود مراجعه کنید.
نتیجه
در این مقاله ، شما swipers را در یک برنامه Vue پیاده سازی کرده اید. اکنون می توانید آنها را با سهولت در برنامه های کاربردی خود اجرا کنید.

 

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

مستندات خوب بخش مهمی از یک پروژه موفق است ، اما یک سیستم مستندسازی کامل ممکن است بیشتر از آنچه پروژه شما نیاز دارد را شامل شود. در این حالت ، صفحات استاتیک اغلب کاملاً خوب عمل می کنند. در این پست ، ما می خواهیم یک وب سایت مستندات استاتیک ایجاد کنیم که همچنین یک برنامه تک صفحه با استفاده از سازنده استاتیک سایت یعنی VuePress است.
سایت های استاتیک
سایت های استاتیک وب سایتهایی هستند که همانطور که ذخیره شده اند ارائه می شوند. هیچ تعامل مستقیم مشتری-سرور مجازی به جز از سمت برنامه های جاسازی شده شخص ثالث وجود ندارد. تولید کنندگان سایت استاتیک در اینترنت بسیار زیاد هستند و هر یک نسبت به بقیه متفاوت است. برخی از آنها سرعت و دفعات لود را بیش از انعطاف پذیری ترجیح میدهند، و برخی دیگر از قابلیت های بسط یافته حمایت می کنند. سایتهای استاتیک به دلیل افزایش سرعت آنها ترجیح داده می شوند و نبود سرور مجازی احتمال نقص در امنیت را کاهش می دهد.
VuePress دارای یک مولد سایت استاتیک و همچنین یک تم پیش فرض مناسب برای ساخت سریع وب سایت های مستند سازی است. در این آموزش ، ما از تم مستندات پیش فرض برای ساخت سیستم خود استفاده خواهیم کرد.
VuePress
به طور پیش فرض ، VuePress فایل های markdown را همانطور که در پوشه ها شکل گرفته و برای ارائه به فایل های HTML ارسال می شوند، تجزیه میکند. VuePress با ایجاد Vue ،  Vue Router برای ایجاد مسیرهای جداگانه ، و webpack  برای دارایی های دسته شده به کار می آید. در حین ساخت ، هر فایل markdown به عنوان الگوی Vue تجزیه می شود ، در حالی که دارایی ها توسط یک webpack دسته می شوند. تجزیه فایل های markdown به الگوهای Vue راهی را ایجاد می کند که می توانید برای عبور از اسکریپت های بومی Vue به شکل مولفه های تک فایل استفاده کنید.
VuePress سازگار با سئو است و به طور پیش فرض ابزاری برای اجرای ردیابی تحلیلی با استفاده از Google Analytics در صفحات شما فراهم می کند. همچنین ، VuePress با یک سیستم جستجوی حداقلی همراه است که تمام عناوین موجود در وب سایت را فهرست بندی می کند و در هنگام جستجو آنها را نمایش می دهد.
اگرچه انتقالات VuePress با یک طرح پاسخگوی پیش فرض برای مستندات ، ارسال می شوند ، اما از طرح بندی های سفارشی برای یک ظاهر طراحی شده نیز پشتیبانی می کند. برای این پست ، ما باید یک سیستم مستندسازی حداقلی با استفاده از تم پیش فرض و همچنین ویژگی Vue در Markdown را با استفاده از ساخت یک شمارنده ساده در یک فایل Markdown ، پیاده سازی کنیم.
پیش نیازها
برای این آموزش ، باید دانش اساسی در مورد HTML ، CSS و JavaScript داشته باشید. آگاهی از Vue نیز مفید است اما لازم نیست.
نصب
برای این پروژه به Node و npm مدیر بسته آن نیاز دارید. با اجرای دستور زیر بررسی کنید که آیا آن را در پایانه خود نصب کرده اید:
node -v && npm -v

این دستور به ترتیب نسخه های نصب شده node و npm را نمایش می دهد. اگر نصب نکردید ، می توانید آن را از اینجا دانلود کنید.
سپس ، یک پروژه جدید ایجاد کنید. یک پوشه جدید ایجاد کنید و به آن دیرکتوری تغییر دهید:
mkdir vuepress && cd $_

یک پروژه node جدید را در دیرکتوری vuepress مقداردهی کنید:
npm init -y

به سرعت پروژه جدیدی را چارچوب بندی می کند و یک فایل pack.json ایجاد می نماید.
سپس ، VuePress را بصورت محلی با دستور زیر نصب میکنیم:
npm install -D vuepress

پس از نصب VuePress در پروژه ، همه موارد مورد نیاز خود را دارید ، زیرا VuePress با تم مستندات پیش فرض استفاده شده برای این پروژه ارسال می شود. با این حال ، می خواهیم مستندات را متناسب با نیاز خود تنظیم کنیم ، بنابراین در محله بعد پوشه ها و فایل ها را با متن ساختگی ایجاد خواهیم کرد.
ایجاد پوشه ها و فایل ها
هنگام ایجاد پوشه در VuePress ، مراقب باشید ، زیرا پوشه ها و فایل های علامت گذاری را مطابق ترتیب آنها ارزیابی می کند. هر فایل علامت گذاری به عنوان یک پوشه به یک فایل HTML وارد می شود که مسیر آن پوشه اصلی است.
ابتدا یک پوشه Docs ایجاد کنید تا تمام محتوای و پیکربندی اسناد را در خود جای دهد:
mkdir docs && cd $_

در دایرکتوری Docs ، پوشه .vuepress و پوشه های اسناد را که فایل ها را ذخیره می کند ایجاد کنید – counter  و guide.
برای کارکردن این مسیرها ، در هر پوشه به فایل README.md نیاز دارند. این به عنوان یک مسیر هوم به آن بخش ویژه خدمت می کند.
پوشه counter  حاوی فایل های نشانه گذاری برای تجزیه و همچنین فایل های پیش فرض README.md برای صفحه اصلی است. پوشه guide  حاوی مطالب مشابه با پوشه counter  میباشد.
پوشه .vuepress دیرکتوری مولفه ها را در خود جای میدهد، پوشه dist که در build ایجاد شده و فایل config.js که برای پیکربندی سیستم کلی استفاده می شود.
ایجاد مؤلفه های Vue
برای این پروژه ، ما یک شمارشگر ساده با استفاده از Vue می سازیم. دو مؤلفه Vue را با پسوند .vue به نام counter.vue و my-header.vue ایجاد کنید. این مؤلفه ها به ترتیب به عنوان یک مؤلفه شمارنده و یک هدر ساده عمل می کنند. در my-header.vue ، متن vue را ویرایش کنید:
<template>
<div>
<h1>This Header is actually a Vue Template</h1>
</div>
</template>
<script>

</script>
<style scoped>
</style>

اسکریپت counter.vue را مانند این ویرایش کنید:
<template>
<div class=”counter”>
<h1>{{number}}</h1>
<button @click = “increment”>Increment</button>
<button @click = “decrement”>Decrement</button>
</div>
</template>
<script>
export default {
data(){
return{
number: 0,
}
},
methods:{
increment(){
if(this.number >= 0){
this.number++
}
},
decrement(){
if(this.number > 0){
this.number —
}
}
}
}
</script>
<style scoped>
.counter{
display: inline-block;
margin-left: 30%;
}
button{
display: inline-block;
padding: 20px;
margin: 10px;
font-weight: bold;
border-radius: 5px;
box-shadow: 0px 0px 5px 0px rgb(11, 11, 114);
}
h1{
text-align: center;
}
</style>

این مؤلفه شامل همه چیزهایی است که برای شمارنده لازم دارید. در حال حاضر مولفه های Vue آماده استفاده هستند.
ایجاد فایل های Markdown
در مرحله بعد ، فایلهای Markdown را در دایرکتوری counter  و guide  ایجاد کنید. فایل های Markdown را برای counter و guide ببینید. از Frontmatter برای تنظیم دینامیکی عنوان صفحات جداگانه استفاده می شود. مؤلفه <counter /> نیز در فایل علامت گذاری قرار داده شده است.
این فایل ها بعداً به صفحات استاتیک تبدیل می شوند. برای صفحه اصلی خود ، همچنین نیاز به یک فایل Markdown با عنوان README.md داریم تا به عنوان صفحه اصلی ارائه شود. Frontmatter در فایل های Markdown برای تنظیم برخی از ویژگی های پویای صفحه اصلی استفاده می شود. یک فایل EADME.md در دایرکتوری اسناد ایجاد و آن را ویرایش کنید:

home: true
actionText: See Counter App
actionLink: /counter/counter-app
features:
– title: Embedded Vue Counter
details: A Vue counter developed using Vue is embedded in this doc, now that’s the power of VuePress!
– title: Fun Docs made with VuePress
details: This entire doc was basically made with VuePress which parsed markdown files and corresponding assets using webpack.
footer: Developed using VuePress by William Imoh

سپس ، مؤلفه my-header Vue را در مسیر هوم قرار دهید. فایل README.md را ویرایش کنید تا مؤلفه را شامل شود:

home: true
actionText: See Counter App
actionLink: /counter/counter-app
features:
– title: Embedded Vue Counter
details: A Vue counter developed using Vue is embedded in this doc, now that’s the power of VuePress!
– title: Fun Docs made with VuePress
details: This entire doc was basically made with VuePress which parsed markdown files and corresponding assets using webpack.
footer: Developed using VuePress by William Imoh

<my-header></my-header>

اکنون تمام فایل های مورد نیاز Markdown را دارید. بیایید پیکربندی ناوبری و نوار کناری (sidebar) را با استفاده از .vuepress / config.js انجام دهیم.
پیکربندی طرح بندی
فایل config.js برای شخصی سازی سیستم مستندات استفاده می شود. در ایجاد این سیستم سفارشی ، یک آبجکت که شامل فیلدهای مورد نیاز است صادر می کنیم:
module.exports = {
title: ‘VuePress’,
description: “A demo documentation using VuePress”,
themeConfig:{
nav: [
{ text: ‘COUNTER’, link: ‘/counter/’ },
{ text: ‘GUIDE’, link: ‘/guide/’ },
],
sidebar: [
{
title: ‘Counter’,
collapsable: false,
children: [
‘/counter/counter-app’
]
},
{
title: ‘API Guide’,
collapsable: false,
children: [
‘/guide/guide’,
‘/guide/api’
]
}
]
}
}

ابتدا عنوان وب سایت را مشخص می کنیم و توضیحی را به آن اختصاص می دهیم که برای سئو خوب باشد. این عنوان و توضیحات به طور خودکار یک سیستم جستجوی فهرست شده را در وب سایت با نوار جستجو ارائه می دهد.
مورد بعدی در اسکریپت ، آبجکت themeConfig است که پارامترهای مورد نیاز برای اجرای برخی عملکردهای خاص در تم را دریافت می کند. برای ایجاد نوار ناوبری ، یک آرایه nav ایجاد می کنیم که حاوی آبجکت های مشخص کننده متن و مسیر نمایش هر عنصر nav می باشد. می توانید اطلاعات بیشتری درباره پیکربندی تم پیش فرض را در اینجا مشاهده کنید.
ما از نوارهای کناری طبقه بندی شده استفاده کرده ایم تا کاربران بتوانند هر لحظه در مستندات ، نگاهی سریع به منو داشته باشند. با استفاده از ویژگی collapsable  در گروه نوار کناری ، می توان منوی نوار کناری را به طور پیش فرض روی collapse تنظیم کرد. در اینجا می توانید اطلاعات بیشتری را در نوار کناری بیابید.
اکنون همه چیز تنظیم شده است ، برای شروع یک سرور مجازی توسعه ، دستور زیر را اجرا کنید:
vuepress dev docs

سرور مجازی dev محلی در پورت 8080 میزبانی می شود. VuePress با ویژگی لود مجدد جدید ، اجرای هرگونه تغییر در برنامه را در حین توسعه اعمال می کند.
اگر مؤلفه های Vue در حالت لایو بودن سرور مجازی توسعه محلی ایجاد شوند، ریستارت سرور مجازی توسعه لازم خواهد بود.

اکنون که ما یک سرور مجازی dev در حال اجرا داریم، هدف استقرار سایت خواهد بود. برای تمیز کردن مسائل ، فایل package.json را ویرایش کنید تا شامل دستورات توسعه و همچنین دستورات ساخت باشد. فایل package.json را ویرایش کنید:
{
“name”: “vuepress”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.js”,
“scripts”: {
“test”: “echo \”Error: no test specified\” && exit 1″,
“docs:dev”: “vuepress dev docs”,
“docs:build”: “vuepress build docs”
},
“keywords”: [],
“author”: “”,
“license”: “MIT”,
“devDependencies”: {
“vuepress”: “^0.5.0”
}
}

برای ساختن فایل های استاتیک ، اکنون می توانیم این دستور را اجرا کنیم:
npm run docs:build

ممکن است ساخت آن مدت زمانی طول بکشد و پس از آن می توانید فایل های استاتیک ساخته شده را در .vuepress / dist پیدا کنید
تغییر استایل
VuePress از فایل های استاتیک و همچنین دارایی های webpack پشتیبانی می کند و توجه میکند که از صحت URL اختصاص داده شده به یک دارایی در نشانه گذاری قبل از ساخت اطمینان حاصل شود. برای مورد ما ، فقط باید رنگ پایه را کمی تغییر دهیم. ما با استفاده از سبک ها رنگ های پیش فرض را باطل می کنیم.
یک فایل جدید به نام override.styl را در Docs / .vuepress ایجاد کنید. در حالی که از اسامی متغیر اختصاص داده شده به رنگ مطابق مستندات رسمی استفاده می کنیم ، اسکریپت override.styl را ویرایش می کنیم تا accentColor را با موارد زیر تغییر دهیم:
$accentColor = #cfa809
$textColor = #2c3e50
$borderColor = #eaecef
$codeBgColor = #282c34

سرور مجازی توسعه را با دستور زیر مجدد راه اندازی کنید:
npm run docs:dev

توجه داشته باشید که تغییرات ایجاد شده در فایل استایل بلافاصله در مرورگر منعکس می شود.
اکنون سیستم مستندات را با صفحات جداگانه تکمیل کرده ایم.
به کار بردن Netlify
در مرحله بعدی با استفاده از Netlify سایت استاتیک را مستقر می کنید. Netlify با بکارگیری Github یا هر ارائه دهنده کنترل نسخه میزبانی و پشتیبانی شده ، گزینه ادغام مداوم را فراهم می کند. برای استقرار سایت خود در Netlify این مراحل را دنبال کنید:
گام 1
در Github و Netlify یک حساب کاربری ایجاد کنید. کد خود را با استفاده از Git به Github وارد کنید.
گام 2
وارد حساب Netlify خود شوید و گزینه ” New site from Git ” را انتخاب کنید. Github را به عنوان ارائه دهنده توسعه مداوم انتخاب کنید و منبع حاوی مستندات را انتخاب کنید.
گام 3
شعبه را تعیین کنید تا به عنوان master مستقر شوید یا هر شعبه ای را که می خواهید مستقر کنید انتخاب کنید. دستور build را روی npm run docs:build تنظیم کنید: دایرکتوری انتشار را روی  docs/.vuepress/distقرار دهید. روی ” Deploy Site” کلیک کنید. وب سایت شما باید در زمان کمی مستقر شود و یک URL عمومی برای دسترسی به آن فراهم گردد.
در اینجا نسخه مستقر شده از این آموزش در Netlify وجود دارد.
نتیجه
سایت های استاتیک به دلیل سرعت ، امنیت و قابلیت نگهداری مفید هستند. در این آموزش ما با استفاده از VuePress یک وب سایت مستندات استاتیک ایجاد کردیم که یک برنامه تک صفحه ای نیز میباشد. VuePress انعطاف پذیری نوشتن اسکریپت های Vue را در داخل فایل های Markdown ارائه می دهد که پویایی را به سایت های استاتیک ارائه می کند. به راحتی پروژه را اصلاح کنید تا چندین پوشه و فایل های markdown مربوطه را دربر بگیرید.

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

برنامه نویسی کاربردی در جاوا اسکریپت از خوانایی کد ، قابلیت حفظ و قابلیت آزمایش کد بهره می برد.
یکی از ابزارهای برنامه نویسی کاربردی ، برنامه نویسی به سبک پردازش آرایه است. این امر مستلزم گرفتن آرایه به عنوان ساختار داده بنیادی میباشد. سپس برنامه شما به یک سری عملیات روی عناصر موجود در آرایه تبدیل می شود.
حوزه های بسیاری وجود دارد که این ویژگی در آن ها مفید است ، مانند نقشه برداری نتایج AJAX برای مؤلفه های React با map ، حذف داده های غیرعادی با filter و استفاده از reduce. این عملکردها ، “Array Extras” نامیده می شوند و انتزاعی حول حلقه ها for هستند. چیزی نیست که با این توابع بتوانید انجام دهید و با for نتوانید به دست بیاورید و برعکس.
در این آموزش ، با نگاهی به filter ، map و reduce ، درک عمیق تری از برنامه نویسی کاربردی در جاوااسکریپت ایجاد خواهیم کرد.
تکرار با for
ما از حلقه های for برای تکرار روی هر مورد در آرایه استفاده می کنیم. معمولاً در طول راه کاری روی هر آیتم انجام می دهیم.
یک مثال می تواند بزرگ کردن حرف اول هر رشته در یک آرایه باشد.
const strings = [‘arielle’, ‘are’, ‘you’, ‘there’];
const capitalizedStrings = [];

for (let i = 0; i < strings.length; i += 1) {
const string = strings[i];
capitalizedStrings.push(string.toUpperCase());
}

console.log(capitalizedStrings);

در این قطعه ، با آرایه ای از حروف کوچک شروع می کنیم. سپس ، به یک آرایه خالی را مقدار اولیه می دهیم ، که رشته های بزرگ خود را ذخیره می کنیم.
در داخل حلقه for ، رشته بعدی را در هر تکرار می گیریم. حروف آن را بزرگ میکنیم و آن را به capitalizedStrings میفرستیم. در انتهای حلقه ، CapitalizedStrings شامل هر کلمه ای در رشته ها است ، اما می دانید ، که با حروف بزرگ است است.
این ما را به اولین تابع خود می رساند: forEach. روشی است که در آرایه ها “به طور خودکار” حول لیست ما حلقه می شود. به عبارت دیگر ، جزئیات مقدار اولیه و افزایش شمارنده برای ما را کنترل می کند.
به جای موارد فوق ، که به صورت دستی رشته ها را فهرست می کنیم ، می توانیم forEach را فراخوانی کنیم و رشته بعدی را در هر تکرار دریافت کنیم. نسخه به روز شده چیزی شبیه به این خواهد بود:
const strings = [‘arielle’, ‘are’, ‘you’, ‘there’];
const capitalizedStrings = [];

strings.forEach(function (string) {
capitalizedStrings.push(string.toUpperCase());
})

این تقریباً همان چیزی است که ما با آن شروع کردیم. اما خلاص شدن از این i کد ما را قابل خواندن تر می کند.
همچنین الگوی اصلی را ارائه می دهد که دوباره زمان و زمان را خواهیم دید. یعنی: ما ترجیح می دهیم از روشهایی در Array.prototype استفاده کنیم که جزییاتی مانند مقداردهی اولیه و افزایش شمارنده را حذف می کند. به این ترتیب ، ما می توانیم به جای متن استاندارد (boilerplate) ، روی منطق مهم تمرکز کنیم.
درک رمز سزار و حملات Brute Force
در کد های زیر ، ما در مثال های map ، reduce و filter T رشته های رمزگذاری و رمزگشایی را استفاده خواهیم کرد.
مثلا:
// Thanks to EvanHahn for this: https://gist.github.com/EvanHahn/2587465
const caesar = require(‘./caesar’);

// We can encrypt the string: ‘this is my secret message’ with `caesar`
// Here, we scramble the message by shifting each letter forward by 2 letters: ‘a’ becomes ‘c’; ‘s’ becomes ‘u’; etc.
const encryptedString = caesar(‘this is my super secret message.’, 2);
console.log(encryptedString); // ‘vjku ku oa uwrgt ugetgv uvtkpi.’

مفهوم این است که ، اگر من یک پیام عادی مانند ‘this is my super secret message’ به شما ارسال کنم ، و شخص دیگری به آن دست یابد ، می توانند بلافاصله راز را بخوانند. بدیهی است اگر اطلاعات حساسی مانند گذرواژه را ارسال کنید ، که ممکن است کسی در حال مشاهده ان باشد، میتواند مشکل آفرین باشد.
رمزگذاری (Encrypting) یک رشته به معنای: “پیچیده کردن خواندن است به طوری که بدون رمزگشایی خواندن آن ممکن نباشد.” به این ترتیب ، حتی اگر کسی در حال شنود باشد ، و حتی اگر پیام شما را رهگیری کند ، تا زمانی که آن را unscramble کنند، خوانده نشده باقی خواهد ماند. برای توضیح مثال بالا ، رشته “vjku ku oa uwrgt ugetgv uvtkpi” را ببینید که مفهوم آن تقریبا مشخص نیست.
رمزگذاری سزار یکی از راه های رمزگشایی رشته ای به این شکل است. برای رمزگذاری با رمز سزار ، یک کلید ، n ، بین 1 تا 24 انتخاب می کنیم و هر حرف در رشته اصلی را با یکی از حروف n تا انتهای الفبا جایگزین می کنیم.
بنابراین ، اگر کلید 2 را انتخاب کنیم ، a می شود c؛ b می شود d؛ c می شود e؛ و به همین ترتیب.
تعویض حروف مثل این رشته اصلی را تقریبا غیر قابل خواندن میکند. اما ، ما با تغییر حروف رمزگشایی کردیم. بنابراین ، تنها کاری که باید برای رمزگشایی انجام دهید این است که آنها را به عقب برگردانید. اگر پیامی را دریافت کردید که می دانید با کلید 2 رمزگذاری شده بود، تنها کاری که باید برای رمزگشایی انجام دهید این است که حروف را دو فاصله برگردانید. بنابراین ، c می شود a؛ d می شود b؛ و غیره.
متأسفانه ، امروزه این یک شکل رمزنگاری قوی نیست ، زیرا شکستن آن بسیار آسان است. یک روش برای رمزگشایی هر رشته رمزگذاری شده با رمز سزار این است که فقط سعی کنید آن را با هر کلید ممکن رمزگشایی کنید. بالاخره یکی از نتایج صحیح خواهد بود. تمام کاری که باید انجام دهید این است که آرایه 24 خروجی را اسکن کنید تا خروجی که انگلیسی است را پیدا کنید. بقیه به اندازه رشته اصلی غیرقابل خواندن خواهند بود.
در زیر ، من از تابعی به نام tryAll استفاده می کنم ، که دقیقاً همین کار را انجام می دهد. یعنی: یک رشته رمزگذاری شده را میگیرد و آرایه ای از هر رمزگشایی احتمالی را برمی گرداند. یکی از این نتایج رشته ای است که ما می خواهیم. بنابراین ، این همیشه رمز را می شکند.
اسکن آرایه ای از 24 رمزگشایی احتمالی چالش برانگیز است. باید بتوانیم مواردی را که قطعاً نادرست هستند از بین ببریم.
در بخش filter ، تابعی را با نام isEnglish مشاهده خواهید کرد که فقط این کار را انجام می دهد. به طور خاص ، یک رشته را می خواند. حساب می کند که چه تعداد از 1000 کلمه رایج انگلیسی در آن رشته وجود دارند. و در صورت یافتن بیش از 3 کلمه در جمله ، رشته را در دسته انگلیسی طبقه بندی می کند. اگر رشته شامل کمتر از 3 کلمه از آن آرایه باشد ، آن را بیرون می اندازد.
البته که روش های پیچیده تری برای بررسی اینکه یک رشته انگلیسی است ، وجود دارد ، اما فعلا این روش کافی است.
پیاده سازی های tryAll و isEnglish مهم نیستند ، اما اگر کنجکاو هستید ، می توانید آنها را در این لینک پیدا کنید: tryAll / isEnglish
تبدیل آرایه ها با map
بازسازی حلقه for برای استفاده از forEach  مزایای این سبک را نشان میدهد. اما هنوز جایی برای بهبود نسخه به روز شده وجود دارد.
در مثال بالا ، ما در حال روزرسانی capitalizedStrings  در پاسخ به forEach هستیم. هیچ چیز ذاتا غلطی در این کار نیست. اما ، اجتناب از عوارض جانبی مانند آن در هر زمان ممکن دردسر زیادی دارد.
اگر مجبور نیستیم ساختارهای داده را که در دامنه دیگری قرار دارند ، بروزرسانی کنیم … احتمالاً بهتر است انجام ندهیم.
در این مورد خاص ، می خواستیم هر رشته موجود در strings  را به نسخه حروف بزرگ آن تبدیل کنیم. این یک مورد کاربرد بسیار متداول برای حلقه for است: همه چیز را در یک آرایه قرار میدهد. آن را به چیز دیگری تبدیل میکند؛ و نتایج را در یک مجموعه جدید جمع آوری میکند.
تبدیل هر عنصر در یک آرایه به عنصر جدید و جمع آوری نتایج ، نقشه برداری (mapping) نامیده می شود. جاوا اسکریپت یک عملکرد داخلی برای این مورد استفاده دارد که map نامیده میشود.
ما forEach  استفاده کردیم زیرا نیاز به مدیریت متغیر تکرار i را حذف می کند. لازم نیست که به صورت دستی در آرایه لیست بندی کنیم و بنابراین می توانیم روی منطقی که واقعاً مهم است متمرکز شویم.
به همین ترتیب ، ما از map استفاده می کنیم زیرا مقدار دهی اولیه یک آرایه خالی را کنار میگذارد و به سمت آن میرود. دقیقاً مثل forEach  که هر مکالمه برگشتی که کاری را برای هر مقدار رشته انجام می دهد ، میپذیرد، map نیز یک callback را قبول میکند که با هر مقدار رشته کاری انجام می دهد.
بیایید قبل از توضیح نهایی به یک نسخه نمایشی سریع بپردازیم. در این مثال ، من از تابعی برای ” رمزگذاری “مجموعه ای از پیام ها استفاده می کنم. می توانیم از حلقه for استفاده کنیم و می توانیم از forEach استفاده کنیم … اما با map بهتر است.
const caesar = require(‘../caesar’);

const key = 12;
const messages = [
‘arielle, are you there?’,
‘the ghost has killed the shell’,
‘the liziorati attack at dawn’
]

const encryptedMessages = messages.map(function (string) {
return caesar(string, key);
})

console.log(encryptedMessages);

توجه داشته باشید که در اینجا چه اتفاقی افتاده است.
• ما با یک آرایه messages به زبان انگلیسی ساده شروع می کنیم.
• از روش map روی messages برای رمزگذاری هر رشته با تابع سزار استفاده می کنیم و به طور خودکار نتیجه را در یک آرایه جدید ذخیره می کنیم.
پس از اجرای کد فوق ، encryptMessages به شکل زیر خواهد بود
[‘mduqxxq, mdq kag ftqdq?’, ‘ftq staef tme wuxxqp ftq etqxx’, ‘ftq xuluadmfu mffmow mf pmiz’].
این حالت سطح بسیار بالاتری از انتزاع را نسبت به حالت ورود دستی به آرایه فراهم میکند.
اکنون زمان خوبی برای اشاره به این نکته است که می توانیم از توابع آرایه ای برای بیان دقیق تر استفاده کنیم:
const caesar = require(‘../caesar’);

const key = 12;
const messages = [
‘arielle, are you there?’,
‘the ghost has killed the shell’,
‘the liziorati attack at dawn’
];

const encryptedMessages = messages.map(string => string.toUpperCase()):

console.log(encryptedMessages);

کنار گذاشتن موارد با filter
الگوی رایج دیگر استفاده از حلقه for برای پردازش موارد در یک آرایه است ، اما فقط برخی از آنها را خارج کنید/نگه دارید.
ما معمولاً با انجام بررسی if تصمیم می گیریم که چه مواردی را نگه داشته و کدام موارد را دور بیندازیم.
در JS خام ، ممکن است اینگونه باشد:
// Secret message! This was a string encrypted with a key between 1 and 24.
const encryptedMessage = ‘mduqxxq, mdq kag ftqdq?’];

// We can break this code by just decrypting with _every_ possible key.
const possibilities = tryAll(encryptedMessage);

// Most of these decryption attempts aren’t readable. Sad.
// We can speed up finding the ones that are probably junk with an if check
const likelyPossibilities = [];
possibilities.forEach(function (decryptionAttempt) {
// Keep the string if it looks like an English sentence
if (isEnglish(decryptionAttempt)) {
likelyPossibilities.push(decryptionAttempt);
}
})

ابتدا ، سعی می کنیم پیام رمزگذاری شده را با هر کلید ممکن رمزگشایی کنیم. این بدان معناست که با آرایه ای از 24 احتمال رو به رو هستیم.
در این حلقه ، هرکدام را آزمایش می کنیم تا ببینیم که آیا یک رشته انگلیسی است یا خیر. اگر چنین است ، آن را نگه میداریم. اگر نه ، آن را دور می اندازیم.
این به وضوح یک مورد کاربرد رایج است. بنابراین ، یک ساختار داخلی برای آن وجود دارد که filter نامیده میشود.
مانند map ، ما یک filter وارد می کنیم ، که آن هم هر رشته را دریافت می کند. تفاوت در این است که ، filter تنها در صورتی که callback حالت true را بازگرداند، موارد را در یک آرایه ذخیره می کند. بنابراین ، ما می توانیم موارد فوق را به صورت زیر بیان کنیم:
// Secret message! This was a string encrypted with a key between 1 and 24.
const encryptedMessage = ‘mduqxxq, mdq kag ftqdq?’];

// We can break this code by just decrypting with _every_ possible key.
const possibilities = tryAll(encryptedMessage);

// Most of these decryption attempts aren’t readable. Sad.
// We can speed up finding the ones that are probably junk with an if check
const likelyPossibilities = possibilities.filter(function (string) {
// If isEnglish(string) returns true, filter saves in the output array
return isEnglish(string);
})

از آنجا که این callback ، فقط isEnglish را فرامیخواند ، در واقع می توانیم آن را حتی به صورت دقیق تر بنویسیم ، مثل این:
// Secret message! This was a string encrypted with a key between 1 and 24.
const encryptedMessage = ‘mduqxxq, mdq kag ftqdq?’];

// We can break this code by just decrypting with _every_ possible key.
const possibilities = tryAll(encryptedMessage);

// Most of these decryption attempts aren’t readable. Sad.
// We can speed up finding the ones that are probably junk with an if check
const likelyPossibilities = possibilities.filter(isEnglish);

موارد را با reduce در کنار هم قرار دهید
تاکنون ، برای سه مورد استفاده معمولی حول آرایه ها ، انتزاعاتی را مشاهده کردیم:
forEach ، که به ما امکان می دهد مانند for ، حول یک آرایه بگردیم اما نیاز به مدیریت دستی متغیر تکرار i را حذف می کند. آرایه را فهرست میکند؛ و غیره.
map ، که به ما امکان می دهد هر عنصر یک آرایه را تغییر دهیم و نتایج را در یک آرایه جمع آوری کنیم
filter ، که به ما امکان می دهد عناصر یک آرایه را برای نگهداری انتخاب کنیم
مورد دیگر استفاده رایج این است که: تکرار حول یک آرایه برای جمع آوری عناصر آن در یک نتیجه واحد
نمونه اصلی این است که تعداد زیادی عدد را جمع می کند.
// prices of: (big) box of oreos, girl scout cookies, fidget spinner, gold-plated Arch linux magnet
const prices = [12, 19, 7, 209];

// variable to store our total prices in
let totalPrice = 0;
for (let i = 0; i < prices.length; i += 1) {
totalPrice += prices[i];
}

// Report our total prices: $247
console.log(`Your total is ${totalPrice}.`);

همانطور که مطمئنا حدس زده اید ، انتزاعی نیز برای این مورد وجود دارد: reduce .
بازسازی حلقه فوق با reduce اینگونه خواهد بود:
const prices = [12, 19, 7, 209];

prices.reduce(function (totalPrice, nextPrice) {
// totalPrice is the price so far
console.log(`Total price so far: ${totalPrice}`)
console.log(`Next price to add: ${nextPrice}`)

// update totalPrice by adding the next price
totalPrice += nextPrice

// return the total price, and start over again
return totalPrice
}, 0)
// ^ the second argument to `reduce` is the totalPrice to start with on the first iteration

مانند map و filter ، reduce نیز یک callback را میپذیرد ، که در هر عنصر آرایه اجرا می شود.
برخلاف map و filter ، پاسخی که برای reduce ارسال می کنیم دو آرگومان را می پذیرد: یک TotalPrice و یک NextPrice.
TotalPrice مانند total در مثال اول است: قیمتی است که ما با اضافه کردن تمام قیمتهایی که تاکنون دیده ایم ، به دست می آوریم.
nextPrice عددی است که با انجام prices[i] در مثال اول به دست آوردیم. آن map را بخاطر بیاورید و reduce بطور خودکار در آرایه برای ما فهرست بندی میکند و این مقدار را به صورت خودکار به تماس های برگشتی آنها منتقل میکند. reduce همان کار را انجام می دهد ، اما آن مقدار را به عنوان آرگومان دوم به callback آن منتقل می کند.
درست مانند map و reduce ، در هر تکرار ، ما باید مقدار مورد نظر خود را برای بازگشت در انتهای حلقه برگردانیم. یعنی ، TotalPrice.
در آخر ، توجه داشته باشید که آرگومان دیگری را بعد از callback به reduce وارد میکنیم. در این حالت ، 0 را وارد میکنیم. این عمل مشابه با خطی در مثال اول است، که const total = 0 قرار دادیم. این آرگومان دوم مقدار اولیه totalPrice است.
درک reduce سخت تر از map یا filter است ، بنابراین بیایید به مثال دیگری توجه کنیم.
در مثال قبلی ، ما برای جمع آوری آرایه ای از اعداد به صورت مجموع از reduce استفاده کردیم. اما reduce چند کاره است. ما می توانیم از آن استفاده کنیم تا یک آرایه را به یک نتیجه واحد تبدیل کنیم.
مثلا، می توانیم از آن برای ساختن یک رشته استفاده کنیم.
const courses = [‘Introduction to Programming’, ‘Algorithms & Data Structures’, ‘Discrete Math’];

const curriculum = courses.reduce(function (courseList, course) {
// add the name to the class, with a preceding newline and tab for indentation
return courseList += `\n\t${course}`;
}, ‘The Computer Science curriculum consists of:’);

console.log(curriculum);

این کد خروجی زیر را ایجاد می کند:
The Computer Science curriculum consists of:
Introduction to Programming
Algorithms & Data Structures
Discrete Math

بنا به دلایلی ، بیان تعداد بسیار زیادی مثال از استفاده از reduce برای ساختن رشته هایی مانند این را لازم نمی بینم ، اما این یک شیوه کاربردی معمول است.
باز هم ، reduce چند کاره است: می توانیم از آن استفاده کنیم تا یک آرایه را به هر نوع نتیجه “تک” تبدیل کنیم.
حتی اگر آن نتیجه واحد آرایه دیگری باشد.
آن را بررسی کنید:
const names = [‘arielle’, ‘jung’, ‘scheherazade’];

const titleCase = function (name) {
// uppercase first letter of name
const first = name[0];
const capitalizedFirst = first.toUpperCase();

// get rest of name
const rest = name.slice(1);

// create list with all letters of the name, including capitalized first letter
const letters = [capitalizedFirst].concat(rest);

// join letters, return result
return letters.join(”);
}

const titleCased = names.reduce(function (titleCasedNames, name) {
// title-case the next name
const titleCasedName = titleCase(name);

// add the title-cased name to a list
titleCasedNames.push(titleCasedName);

// return list of capitalizedNames
return titleCasedNames
}, [])
// ^ start with an empty list

console.log(titleCased);
// [“Arielle”, “Jung”, “Scheherazade”]

ما از reduce برای تبدیل لیستی از اسامی با حروف کوچک به لیستی از اسامی دارای عنوان استفاده کردیم.
پیش از این ، یک لیست از اعداد را به یک مجموع واحد و یک لیست از رشته ها را به یک رشته واحد تبدیل کرده بودیم. در اینجا ، یک لیست از نام ها را به یک لیست واحد از نام ها با حرف اول بزرگ تبدیل کردیم.
این کار همچنان مجاز است ، زیرا لیست واحد نام های title-cased هنوز یک نتیجه واحد است. فقط به یک مجموعه تبدیل شده نه یک نوع ابتدایی.
ممکن است در مورد آن مثال آخر چیزی را متوجه شده باشید: ما از reduce برای همان کارهایی استفاده کرده ایم که قبلا برای map استفاده کرده بودیم.
با این وجود ممکن است آشکار نباشد ، اما یک مسئله بزرگ است.
ممکن است حدس بزنید که می توانیم map را بر حسب reduce بنویسیم. حق با شماست.
const map = (list, mapFunction) => {
const output = list.reduce((transformedList, nextElement) => {
// use the mapFunction to transform the nextElement in the list
const transformedElement = mapFunction(nextElement);

// add transformedElement to our list of transformed elements
transformedList.push(transformedElement);

// return list of transformed elements
return transformedList;
}, [])
// ^ start with an empty list

return output;
}

می توانیم همان نتیجه فوق را با این کد به دست آوریم:
سلب مسئولیت (disclaimer) اجباری: اگر تا الان در حال اجرای map آماده تولید بودید، باید برخی از ویژگی ها را به این اجرا اضافه کنید. ما همه اینها را به خاطر عدم ابهام به خود شما واگذار خواهیم کرد.
اگر می توانیم برای اجرای map از reduce استفاده کنیم ، برای filter چگونه است؟
const filter = (list, predicate) => {
const output = list.reduce(function (filteredElements, nextElement) {
// only add `nextElement` if it passes our test
if (predicate(nextElement)) {
filteredElements.push(nextElement);
}

// return the list of filtered elements on each iteration
return filteredElements;
}, [])
})
}

اگر این مورد گیج کننده است، اشکالی ندارد. حتی برای توسعه دهندگان با تجربه تر هم یک ایده جدید است. اما ، ارزش این را دارد که با آن آشنا شوید: ما به این میزان بینش کم نیاز داریم تا بعداً transduction را درست درک کنیم.
… و ، به من اعتماد کنید ، transduction به تنهایی آنقدر جالب است که ارزش کار را دارد.
نتیجه
در این آموزش ، نحوه استفاده از map ، filter و reduce را برای نوشتن کد قابل خواندن یاد گرفتید.
البته که مشکلی در استفاده از for وجود ندارد. اما بالا بردن سطح انتزاع با این توابع ، نتایج فوری از لحاظ خوانایی و قابلیت حفظ آن را به ارمغان می آورد.
از اینجا ، می توانید روش های دیگر آرایه مانند flatten ،concat و flatMap را جستجو کنید.

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

مستندات خوب بخش مهمی از یک پروژه موفق است ، اما یک سیستم مستندسازی کامل ممکن است بیشتر از آنچه پروژه شما نیاز دارد را شامل شود. در این حالت ، صفحات استاتیک اغلب کاملاً خوب عمل می کنند. در این پست ، ما می خواهیم یک وب سایت مستندات استاتیک ایجاد کنیم که همچنین یک برنامه تک صفحه با استفاده از سازنده استاتیک سایت یعنی VuePress است.
سایت های استاتیک
سایت های استاتیک وب سایتهایی هستند که همانطور که ذخیره شده اند ارائه می شوند. هیچ تعامل مستقیم مشتری-سرور مجازی به جز از سمت برنامه های جاسازی شده شخص ثالث وجود ندارد. تولید کنندگان سایت استاتیک در اینترنت بسیار زیاد هستند و هر یک نسبت به بقیه متفاوت است. برخی از آنها سرعت و دفعات لود را بیش از انعطاف پذیری ترجیح میدهند، و برخی دیگر از قابلیت های بسط یافته حمایت می کنند. سایتهای استاتیک به دلیل افزایش سرعت آنها ترجیح داده می شوند و نبود سرور مجازی احتمال نقص در امنیت را کاهش می دهد.
VuePress دارای یک مولد سایت استاتیک و همچنین یک تم پیش فرض مناسب برای ساخت سریع وب سایت های مستند سازی است. در این آموزش ، ما از تم مستندات پیش فرض برای ساخت سیستم خود استفاده خواهیم کرد.
VuePress
به طور پیش فرض ، VuePress فایل های markdown را همانطور که در پوشه ها شکل گرفته و برای ارائه به فایل های HTML ارسال می شوند، تجزیه میکند. VuePress با ایجاد Vue ،  Vue Router برای ایجاد مسیرهای جداگانه ، و webpack  برای دارایی های دسته شده به کار می آید. در حین ساخت ، هر فایل markdown به عنوان الگوی Vue تجزیه می شود ، در حالی که دارایی ها توسط یک webpack دسته می شوند. تجزیه فایل های markdown به الگوهای Vue راهی را ایجاد می کند که می توانید برای عبور از اسکریپت های بومی Vue به شکل مولفه های تک فایل استفاده کنید.
VuePress سازگار با سئو است و به طور پیش فرض ابزاری برای اجرای ردیابی تحلیلی با استفاده از Google Analytics در صفحات شما فراهم می کند. همچنین ، VuePress با یک سیستم جستجوی حداقلی همراه است که تمام عناوین موجود در وب سایت را فهرست بندی می کند و در هنگام جستجو آنها را نمایش می دهد.
اگرچه انتقالات VuePress با یک طرح پاسخگوی پیش فرض برای مستندات ، ارسال می شوند ، اما از طرح بندی های سفارشی برای یک ظاهر طراحی شده نیز پشتیبانی می کند. برای این پست ، ما باید یک سیستم مستندسازی حداقلی با استفاده از تم پیش فرض و همچنین ویژگی Vue در Markdown را با استفاده از ساخت یک شمارنده ساده در یک فایل Markdown ، پیاده سازی کنیم.
پیش نیازها
برای این آموزش ، باید دانش اساسی در مورد HTML ، CSS و JavaScript داشته باشید. آگاهی از Vue نیز مفید است اما لازم نیست.
نصب
برای این پروژه به Node و npm مدیر بسته آن نیاز دارید. با اجرای دستور زیر بررسی کنید که آیا آن را در پایانه خود نصب کرده اید:
node -v && npm -v

این دستور به ترتیب نسخه های نصب شده node و npm را نمایش می دهد. اگر نصب نکردید ، می توانید آن را از اینجا دانلود کنید.
سپس ، یک پروژه جدید ایجاد کنید. یک پوشه جدید ایجاد کنید و به آن دیرکتوری تغییر دهید:
mkdir vuepress && cd $_

یک پروژه node جدید را در دیرکتوری vuepress مقداردهی کنید:
npm init -y

به سرعت پروژه جدیدی را چارچوب بندی می کند و یک فایل pack.json ایجاد می نماید.
سپس ، VuePress را بصورت محلی با دستور زیر نصب میکنیم:
npm install -D vuepress

پس از نصب VuePress در پروژه ، همه موارد مورد نیاز خود را دارید ، زیرا VuePress با تم مستندات پیش فرض استفاده شده برای این پروژه ارسال می شود. با این حال ، می خواهیم مستندات را متناسب با نیاز خود تنظیم کنیم ، بنابراین در محله بعد پوشه ها و فایل ها را با متن ساختگی ایجاد خواهیم کرد.
ایجاد پوشه ها و فایل ها
هنگام ایجاد پوشه در VuePress ، مراقب باشید ، زیرا پوشه ها و فایل های علامت گذاری را مطابق ترتیب آنها ارزیابی می کند. هر فایل علامت گذاری به عنوان یک پوشه به یک فایل HTML وارد می شود که مسیر آن پوشه اصلی است.
ابتدا یک پوشه Docs ایجاد کنید تا تمام محتوای و پیکربندی اسناد را در خود جای دهد:
mkdir docs && cd $_

در دایرکتوری Docs ، پوشه .vuepress و پوشه های اسناد را که فایل ها را ذخیره می کند ایجاد کنید – counter  و guide.
برای کارکردن این مسیرها ، در هر پوشه به فایل README.md نیاز دارند. این به عنوان یک مسیر هوم به آن بخش ویژه خدمت می کند.
پوشه counter  حاوی فایل های نشانه گذاری برای تجزیه و همچنین فایل های پیش فرض README.md برای صفحه اصلی است. پوشه guide  حاوی مطالب مشابه با پوشه counter  میباشد.
پوشه .vuepress دیرکتوری مولفه ها را در خود جای میدهد، پوشه dist که در build ایجاد شده و فایل config.js که برای پیکربندی سیستم کلی استفاده می شود.
ایجاد مؤلفه های Vue
برای این پروژه ، ما یک شمارشگر ساده با استفاده از Vue می سازیم. دو مؤلفه Vue را با پسوند .vue به نام counter.vue و my-header.vue ایجاد کنید. این مؤلفه ها به ترتیب به عنوان یک مؤلفه شمارنده و یک هدر ساده عمل می کنند. در my-header.vue ، متن vue را ویرایش کنید:
<template>
<div>
<h1>This Header is actually a Vue Template</h1>
</div>
</template>
<script>

</script>
<style scoped>
</style>

اسکریپت counter.vue را مانند این ویرایش کنید:
<template>
<div class=”counter”>
<h1>{{number}}</h1>
<button @click = “increment”>Increment</button>
<button @click = “decrement”>Decrement</button>
</div>
</template>
<script>
export default {
data(){
return{
number: 0,
}
},
methods:{
increment(){
if(this.number >= 0){
this.number++
}
},
decrement(){
if(this.number > 0){
this.number —
}
}
}
}
</script>
<style scoped>
.counter{
display: inline-block;
margin-left: 30%;
}
button{
display: inline-block;
padding: 20px;
margin: 10px;
font-weight: bold;
border-radius: 5px;
box-shadow: 0px 0px 5px 0px rgb(11, 11, 114);
}
h1{
text-align: center;
}
</style>

این مؤلفه شامل همه چیزهایی است که برای شمارنده لازم دارید. در حال حاضر مولفه های Vue آماده استفاده هستند.
ایجاد فایل های Markdown
در مرحله بعد ، فایلهای Markdown را در دایرکتوری counter  و guide  ایجاد کنید. فایل های Markdown را برای counter و guide ببینید. از Frontmatter برای تنظیم دینامیکی عنوان صفحات جداگانه استفاده می شود. مؤلفه <counter /> نیز در فایل علامت گذاری قرار داده شده است.
این فایل ها بعداً به صفحات استاتیک تبدیل می شوند. برای صفحه اصلی خود ، همچنین نیاز به یک فایل Markdown با عنوان README.md داریم تا به عنوان صفحه اصلی ارائه شود. Frontmatter در فایل های Markdown برای تنظیم برخی از ویژگی های پویای صفحه اصلی استفاده می شود. یک فایل EADME.md در دایرکتوری اسناد ایجاد و آن را ویرایش کنید:

home: true
actionText: See Counter App
actionLink: /counter/counter-app
features:
– title: Embedded Vue Counter
details: A Vue counter developed using Vue is embedded in this doc, now that’s the power of VuePress!
– title: Fun Docs made with VuePress
details: This entire doc was basically made with VuePress which parsed markdown files and corresponding assets using webpack.
footer: Developed using VuePress by William Imoh

سپس ، مؤلفه my-header Vue را در مسیر هوم قرار دهید. فایل README.md را ویرایش کنید تا مؤلفه را شامل شود:

home: true
actionText: See Counter App
actionLink: /counter/counter-app
features:
– title: Embedded Vue Counter
details: A Vue counter developed using Vue is embedded in this doc, now that’s the power of VuePress!
– title: Fun Docs made with VuePress
details: This entire doc was basically made with VuePress which parsed markdown files and corresponding assets using webpack.
footer: Developed using VuePress by William Imoh

<my-header></my-header>

اکنون تمام فایل های مورد نیاز Markdown را دارید. بیایید پیکربندی ناوبری و نوار کناری (sidebar) را با استفاده از .vuepress / config.js انجام دهیم.
پیکربندی طرح بندی
فایل config.js برای شخصی سازی سیستم مستندات استفاده می شود. در ایجاد این سیستم سفارشی ، یک آبجکت که شامل فیلدهای مورد نیاز است صادر می کنیم:
module.exports = {
title: ‘VuePress’,
description: “A demo documentation using VuePress”,
themeConfig:{
nav: [
{ text: ‘COUNTER’, link: ‘/counter/’ },
{ text: ‘GUIDE’, link: ‘/guide/’ },
],
sidebar: [
{
title: ‘Counter’,
collapsable: false,
children: [
‘/counter/counter-app’
]
},
{
title: ‘API Guide’,
collapsable: false,
children: [
‘/guide/guide’,
‘/guide/api’
]
}
]
}
}

ابتدا عنوان وب سایت را مشخص می کنیم و توضیحی را به آن اختصاص می دهیم که برای سئو خوب باشد. این عنوان و توضیحات به طور خودکار یک سیستم جستجوی فهرست شده را در وب سایت با نوار جستجو ارائه می دهد.
مورد بعدی در اسکریپت ، آبجکت themeConfig است که پارامترهای مورد نیاز برای اجرای برخی عملکردهای خاص در تم را دریافت می کند. برای ایجاد نوار ناوبری ، یک آرایه nav ایجاد می کنیم که حاوی آبجکت های مشخص کننده متن و مسیر نمایش هر عنصر nav می باشد. می توانید اطلاعات بیشتری درباره پیکربندی تم پیش فرض را در اینجا مشاهده کنید.
ما از نوارهای کناری طبقه بندی شده استفاده کرده ایم تا کاربران بتوانند هر لحظه در مستندات ، نگاهی سریع به منو داشته باشند. با استفاده از ویژگی collapsable  در گروه نوار کناری ، می توان منوی نوار کناری را به طور پیش فرض روی collapse تنظیم کرد. در اینجا می توانید اطلاعات بیشتری را در نوار کناری بیابید.
اکنون همه چیز تنظیم شده است ، برای شروع یک سرور مجازی توسعه ، دستور زیر را اجرا کنید:
vuepress dev docs

سرور مجازی dev محلی در پورت 8080 میزبانی می شود. VuePress با ویژگی لود مجدد جدید ، اجرای هرگونه تغییر در برنامه را در حین توسعه اعمال می کند.
اگر مؤلفه های Vue در حالت لایو بودن سرور مجازی توسعه محلی ایجاد شوند، ریستارت سرور مجازی توسعه لازم خواهد بود.

اکنون که ما یک سرور مجازی dev در حال اجرا داریم، هدف استقرار سایت خواهد بود. برای تمیز کردن مسائل ، فایل package.json را ویرایش کنید تا شامل دستورات توسعه و همچنین دستورات ساخت باشد. فایل package.json را ویرایش کنید:
{
“name”: “vuepress”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.js”,
“scripts”: {
“test”: “echo \”Error: no test specified\” && exit 1″,
“docs:dev”: “vuepress dev docs”,
“docs:build”: “vuepress build docs”
},
“keywords”: [],
“author”: “”,
“license”: “MIT”,
“devDependencies”: {
“vuepress”: “^0.5.0”
}
}

برای ساختن فایل های استاتیک ، اکنون می توانیم این دستور را اجرا کنیم:
npm run docs:build

ممکن است ساخت آن مدت زمانی طول بکشد و پس از آن می توانید فایل های استاتیک ساخته شده را در .vuepress / dist پیدا کنید
تغییر استایل
VuePress از فایل های استاتیک و همچنین دارایی های webpack پشتیبانی می کند و توجه میکند که از صحت URL اختصاص داده شده به یک دارایی در نشانه گذاری قبل از ساخت اطمینان حاصل شود. برای مورد ما ، فقط باید رنگ پایه را کمی تغییر دهیم. ما با استفاده از سبک ها رنگ های پیش فرض را باطل می کنیم.
یک فایل جدید به نام override.styl را در Docs / .vuepress ایجاد کنید. در حالی که از اسامی متغیر اختصاص داده شده به رنگ مطابق مستندات رسمی استفاده می کنیم ، اسکریپت override.styl را ویرایش می کنیم تا accentColor را با موارد زیر تغییر دهیم:
$accentColor = #cfa809
$textColor = #2c3e50
$borderColor = #eaecef
$codeBgColor = #282c34

سرور مجازی توسعه را با دستور زیر مجدد راه اندازی کنید:
npm run docs:dev

توجه داشته باشید که تغییرات ایجاد شده در فایل استایل بلافاصله در مرورگر منعکس می شود.
اکنون سیستم مستندات را با صفحات جداگانه تکمیل کرده ایم.
به کار بردن Netlify
در مرحله بعدی با استفاده از Netlify سایت استاتیک را مستقر می کنید. Netlify با بکارگیری Github یا هر ارائه دهنده کنترل نسخه میزبانی و پشتیبانی شده ، گزینه ادغام مداوم را فراهم می کند. برای استقرار سایت خود در Netlify این مراحل را دنبال کنید:
گام 1
در Github و Netlify یک حساب کاربری ایجاد کنید. کد خود را با استفاده از Git به Github وارد کنید.
گام 2
وارد حساب Netlify خود شوید و گزینه ” New site from Git ” را انتخاب کنید. Github را به عنوان ارائه دهنده توسعه مداوم انتخاب کنید و منبع حاوی مستندات را انتخاب کنید.
گام 3
شعبه را تعیین کنید تا به عنوان master مستقر شوید یا هر شعبه ای را که می خواهید مستقر کنید انتخاب کنید. دستور build را روی npm run docs:build تنظیم کنید: دایرکتوری انتشار را روی  docs/.vuepress/distقرار دهید. روی ” Deploy Site” کلیک کنید. وب سایت شما باید در زمان کمی مستقر شود و یک URL عمومی برای دسترسی به آن فراهم گردد.
در اینجا نسخه مستقر شده از این آموزش در Netlify وجود دارد.
نتیجه
سایت های استاتیک به دلیل سرعت ، امنیت و قابلیت نگهداری مفید هستند. در این آموزش ما با استفاده از VuePress یک وب سایت مستندات استاتیک ایجاد کردیم که یک برنامه تک صفحه ای نیز میباشد. VuePress انعطاف پذیری نوشتن اسکریپت های Vue را در داخل فایل های Markdown ارائه می دهد که پویایی را به سایت های استاتیک ارائه می کند. به راحتی پروژه را اصلاح کنید تا چندین پوشه و فایل های markdown مربوطه را دربر بگیرید.

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

رمزهای عبور معمولاً برای تأیید اعتبار کاربر در بیشتر برنامه های وب استفاده می شوند. به همین دلیل لازم است که گذرواژه‌ها به روشی ایمن ذخیره شوند. در طول سالها ، از تکنیک هایی مانند هش کردن (در هم سازی) رمز عبور یک طرفه استفاده شده است تا نمایش واقعی رمزهای ذخیره شده در یک پایگاه داده را مخفی کند. اما اگرچه درهم سازی گذرواژه قدم بزرگی در جهت ایمن سازی رمز عبور است ، کاربر هنوز هم یک مشکل بزرگ برای امنیت رمز عبور دارد. کاربرانی که از کلمه رایجی به عنوان رمز عبور استفاده می کنند ، عمل hashing را بی فایده می کنند، زیرا یک حمله brute-force می تواند به سرعت چنین رمزهایی را خراب کند.
برای پرداختن به این موضوع ، بسیاری از برنامه های وب امروز اصرار دارند که کاربران از گذرواژه های قوی برخوردار باشند ، و یا با حداقل طول رمز عبور و یا ترکیبی از کاراکترها و نمادهای الفبا در رمز عبور این کار را انجام میدهند. برای اندازه‌گیری قدرت رمز عبور ، Dropbox الگوریتمی برای تخمین قدرت واقعی رمز عبور با الهام از crackerهای رمز عبور ایجاد کرده است. این الگوریتم در یک کتابخانه جاوا اسکریپت به نام zxcvbn بسته بندی شده است. علاوه بر این ، این بسته شامل فرهنگ لغت کلمات متداول انگلیسی ، نام ها و کلمات عبور است.
در این آموزش با استفاده از چارچوب جاوااسکریپت React یک فرم با فیلدهایی برای نام کامل ، ایمیل و رمز عبور ایجاد خواهیم کرد. اندکی اعتبارسنجی سبک برای فرم انجام خواهیم داد و همچنین از کتابخانه zxcvbn برای برآورد قدرت پسورد در فرم استفاده می کنیم و ضمنا بازخورد بصری را ارائه میکنیم.
این نسخه نمایشی CodeSandbox از آنچه تا پایان این آموزش ایجاد خواهیم کرد را بررسی کنید.
پیش نیازها
قبل از شروع کار ، اطمینان حاصل کنید که نسخه جدیدی از Node را روی سیستم خود نصب کرده باشید. ما از yarn برای اجرای تمام اسکریپت های NPM و نصب متعلقات برای پروژه خود استفاده خواهیم کرد ، بنابراین همچنین از نصب yarn اطمینان حاصل کنید. برای نصب yarn روی سیستم می توانید از این راهنمای نصب yarn استفاده کنید. همچنین ، برای تولید برنامه جدید React خود ، از بسته محبوب create-react-app استفاده خواهیم کرد.
اگر قبلاً آن را نصب نکرده اید ، دستور زیر را اجرا کنید تا برنامه create-react-app را در سیستم خود نصب کنید.
npm install -g create-react-app

مرحله 1 – تنظیم برنامه خود
یک برنامه جدید React را با استفاده از دستور زیر شروع کنید. می توانید برنامه را هر طور که می خواهید نامگذاری کنید.
توجه: اگر از npm نسخه 5.2 یا بالاتر استفاده می کنید ، با یک باینری npx اضافی همراه است. با استفاده از باینری npx ، دیگر نیازی نیست که برنامه create-react-app را در سطح جهانی روی سیستم خود نصب کنید. با استفاده از این دستور می توانید برنامه جدید React را شروع کنید: npx create-react-app react-password-strength

در مرحله بعد ، متعلقات مورد نیاز برنامه خود را نصب خواهیم کرد. برای نصب متعلقات لازم ، دستور زیر را اجرا کنید.
$ yarn add bootstrap zxcvbn isemail prop-types

$ yarn add -D npm-run-all node-sass-chokidar

ما node-sass-chokida را به عنوان یک وابستگی توسعه برای برنامه خود نصب کرده ایم تا ما را قادر به استفاده از SASS کند. برای اطلاعات بیشتر در مورد این ، به این راهنما مراجعه کنید.
اکنون دیرکتوری src را باز کرده و پسوند فایل همه فایل های .css را به .scss تغییر دهید. فایل های .css مورد نیاز در ادامه کار توسط node-sass-chokidar کامپایل می شوند.
فایل pack.json را ویرایش کرده و بخش scripts  را تغییر دهید تا به شکل زیر باشد:
“scripts”: {
“start:js”: “react-scripts start”,
“build:js”: “react-scripts build”,
“start”: “npm-run-all -p watch:css start:js”,
“build”: “npm-run-all build:css build:js”,
“test”: “react-scripts test –env=jsdom”,
“eject”: “react-scripts eject”,
“build:css”: “node-sass-chokidar –include-path ./src –include-path ./node_modules src/ -o src/”,
“watch:css”: “npm run build:css && node-sass-chokidar –include-path ./src –include-path ./node_modules src/ -o src/ –watch –recursive”
}

همانطور که ممکن است متوجه شده باشید ، ما بسته bootstrap  را به عنوان یک وابستگی برای برنامه خود نصب کرده ایم تا یک ظاهر طراحی پیش فرض را بدست آوریم. برای وارد کردن Bootstrap در برنامه ، فایل src / index.js را ویرایش کنید و قبل از هر عبارت import  دیگر خط زیر را اضافه کنید.
import “bootstrap/dist/css/bootstrap.min.css”;

در آخر ، درخواست خود را شروع کنید:
$ yarn start

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

مرحله 2 – ساختن مولفه ها
به یاد داشته باشید که قصد داریم یک فرم با فیلدهای مربوط به نام کامل ، ایمیل و رمز عبور ایجاد کنیم و همچنین برخی از اعتبار سنجی های سبک را در این فیلدها انجام دهیم. مولفه های React زیر را ایجاد می کنیم:
FormField – یک فیلد ورودی فرم را با ویژگی های آن پوشش میدهد و کنترل کننده رویداد را تغییر میدهد.
EmailField – ایمیل FormField را دربرگرفته و منطق اعتبار سنجی ایمیل را به آن اضافه می کند.
PasswordField – رمز عبور FormField را محصور کرده و منطق اعتبار رمز عبور را به آن اضافه می کند. همچنین مقیاس قدرت رمز عبور و برخی از نشانه های بصری دیگر را به فیلد وصل می کند.
JoinForm – تیم حمایت عضویت که فیلدهای فرم را در خود جای میدهد.
پیش بروید و یک دیرکتوری components  در داخل فهرست src برنامه ایجاد کنید تا تمام اجزای ما در آن قرار بگیرند.
مؤلفه FormField
یک فایل جدید FormField.js را در دیرکتوری src / parts ایجاد کنید و قطعه کد زیر را به آن اضافه کنید:
import React, { Component, Fragment } from ‘react’;
import PropTypes from ‘prop-types’;

class FormField extends Component {

// initialize state
state = { value: ”, dirty: false, errors: [] }

hasChanged = e => {
e.preventDefault();

// destructure props – assign default dummy functions to validator and onStateChanged props
const { label, required = false, validator = f => f, onStateChanged = f => f } = this.props;

const value = e.target.value;
const isEmpty = value.length === 0;
const requiredMissing = this.state.dirty && required && isEmpty;

let errors = [];

if (requiredMissing) {
// if required and is empty, add required error to state
errors = [ …errors, `${label} is required` ];
} else if (‘function’ === typeof validator) {
try {
validator(value);
} catch (e) {
// if validator throws error, add validation error to state
errors = [ …errors, e.message ];
}
}

// update state and call the onStateChanged callback fn after the update
// dirty is only changed to true and remains true on and after the first state update
this.setState(({ dirty = false }) => ({ value, errors, dirty: !dirty || dirty }), () => onStateChanged(this.state));
}

render() {
const { value, dirty, errors } = this.state;
const { type, label, fieldId, placeholder, children } = this.props;

const hasErrors = errors.length > 0;
const controlClass = [‘form-control’, dirty ? hasErrors ? ‘is-invalid’ : ‘is-valid’ : ” ].join(‘ ‘).trim();

return (
<Fragment>
<div className=”form-group px-3 pb-2″>
<div className=”d-flex flex-row justify-content-between align-items-center”>
<label htmlFor={fieldId} className=”control-label”>{label}</label>
{/** Render the first error if there are any errors **/}
{ hasErrors && <div className=”error form-hint font-weight-bold text-right m-0 mb-2″>{ errors[0] }</div> }
</div>
{/_ Render the children nodes passed to component _/}
{children}
<input type={type} className={controlClass} id={fieldId} placeholder={placeholder} value={value} onChange={this.hasChanged} />
</div>
</Fragment>
);
}

}

FormField.propTypes = {
type: PropTypes.oneOf([“text”, “password”]).isRequired,
label: PropTypes.string.isRequired,
fieldId: PropTypes.string.isRequired,
placeholder: PropTypes.string.isRequired,
required: PropTypes.bool,
children: PropTypes.node,
validator: PropTypes.func,
onStateChanged: PropTypes.func
};

export default FormField;

در این بخش اندک مواردی روی این مولفه انجام می دهیم. بیایید سعی کنیم کمی آن را تجزیه کنیم:
Input State: ابتدا حالت را برای مؤلفه فیلد فرم تنظیم می کنیم تا مقدار فعلی فیلد ورودی ، وضعیت dirty  این فیلد و هرگونه خطای اعتبار سنجی موجود را ردیابی کنیم. هنگامی که مقدار یک فیلد برای اولین بار تغییر کند و dirty (کثیف) باقی بماند ، تبدیل به یک فیلد dirty می شود.
Handle Input Change: سپس کنترلر رویداد hasChanged (e) را اضافه کردیم تا مقدار حالت را به مقدار ورودی فعلی در هر تغییر در ورودی به روز کند. در هندلر وضعیت کثیف فیلد را نیز برطرف می کنیم. بررسی می کنیم که آیا این فیلد یک فیلد مورد نیاز بر اساس مشخصه ها است یا خیر ، و اگر مقدار خالی باشد ، یک خطای اعتبارسنجی به آرایه خطاهای حالت اضافه می کنیم.
اما ، اگر این فیلد یک فیلد لازم نیست یا لازم است اما خالی نیست ، به سراغ عملکرد اعتبارسنجی منتقل شده در مشخصه اعتبارسنجی اختیاری میرویم، آن را با مقدار ورودی فعلی فراخوانی می کنیم و خطای اعتبار سنجی حاصل را به آرایه خطاهای حالت اضافه می کنیم. (در صورت بروز هرگونه خطا).
در آخر ، وضعیت را به روز می کنیم و یک تابع callbackفراخوانی میکنیم که پس از بروزرسانی فراخوانی می شود. تابع callback ، تابع منتقل شده در مشخصه اختیاری onStateChanged را فراخوانی می کند ، و حالت جدید را به عنوان آرگومان خود وارد می کند. این امر برای انتشار تغییرات حالت در خارج از مؤلفه مفید خواهد بود.
Rendering and Props در اینجا فیلد ورودی و برچسب آن را ارائه می دهیم. همچنین به طور مشروط اولین خطای موجود در آرایه خطاهای حالت (در صورت بروز هر گونه خطا) را ارائه می دهیم. توجه کنید که چگونه کلاس ها را برای قسمت ورودی به صورت پویا تنظیم کرده ایم تا با استفاده از کلاس های داخلی Bootstrap ، وضعیت اعتبار سنجی را نشان دهند. همچنین گره های کودک موجود در این مولفه را ارائه می دهیم.
همانطور که در propType های مؤلفه مشاهده می شود ، مشخصه های لازم برای این مؤلفه عبارتند از: type (“text” یا “password “) ، label ، placeholder و field. مولفه های باقیمانده اختیاری هستند.
مؤلفه EmailField
یک فایل جدید EmailField.js را در دیرکتوری src / parts ایجاد کنید و قطعه کد زیر را به آن اضافه کنید.
import React from ‘react’;
import PropTypes from ‘prop-types’;
import { validate } from ‘isemail’;

import FormField from ‘./FormField’;

const EmailField = props => {

// prevent passing type and validator props from this component to the rendered form field component
const { type, validator, …restProps } = props;

// validateEmail function using the validate() method of the isemail package
const validateEmail = value => {
if (!validate(value)) throw new Error(‘Email is invalid’);
};

// pass the validateEmail to the validator prop
return <FormField type=”text” validator={validateEmail} {…restProps} />
};

EmailField.propTypes = {
label: PropTypes.string.isRequired,
fieldId: PropTypes.string.isRequired,
placeholder: PropTypes.string.isRequired,
required: PropTypes.bool,
children: PropTypes.node,
onStateChanged: PropTypes.func
};

export default EmailField;

در مؤلفه EmailField ، به سادگی یک مؤلفه FormField را ارائه می دهیم و یک عملکرد اعتبارسنجی ایمیل را به مشخصه اعتبارسنجی منتقل می کنیم. برای اعتبار سنجی ایمیل از روش validate() بسته isemail  استفاده می کنیم.
همچنین توجه داشته باشید که تمام مشخصه های دیگر به غیر از type  و validator  از مؤلفه EmailField به مؤلفه FormField منتقل می شوند.
مؤلفه PasswordField
یک فایل جدید PasswordField.js را در دیرکتوری src / parts ایجاد کنید و قطعه کد زیر را به آن اضافه کنید:
import React, { Component, Fragment } from ‘react’;
import PropTypes from ‘prop-types’;
import zxcvbn from ‘zxcvbn’;

import FormField from ‘./FormField’;

class PasswordField extends Component {

constructor(props) {

super(props);
const { minStrength = 3, thresholdLength = 7 } = props;

// set default minStrength to 3 if not a number or not specified
// minStrength must be a a number between 0 – 4

this.minStrength = typeof minStrength === ‘number’
? Math.max( Math.min(minStrength, 4), 0 )
: 3;

// set default thresholdLength to 7 if not a number or not specified
// thresholdLength must be a minimum value of 7

this.thresholdLength = typeof thresholdLength === ‘number’
? Math.max(thresholdLength, 7)
: 7;

// initialize internal component state
this.state = { password: ”, strength: 0 };
}

stateChanged = state => {

// update the internal state using the updated state from the form field

this.setState({
password: state.value,
strength: zxcvbn(state.value).score
}, () => this.props.onStateChanged(state));

};

validatePasswordStrong = value => {
// ensure password is long enough
if (value.length <= this.thresholdLength) throw new Error(“Password is short”);

// ensure password is strong enough using the zxcvbn library
if (zxcvbn(value).score < this.minStrength) throw new Error(“Password is weak”);
};

render() {
const { type, validator, onStateChanged, children, …restProps } = this.props;
const { password, strength } = this.state;

const passwordLength = password.length;
const passwordStrong = strength >= this.minStrength;
const passwordLong = passwordLength > this.thresholdLength;

// dynamically set the password length counter class
const counterClass = [‘badge badge-pill’, passwordLong ? passwordStrong ? ‘badge-success’ : ‘badge-warning’ : ‘badge-danger’].join(‘ ‘).trim();

// password strength meter is only visible when password is not empty
const strengthClass = [‘strength-meter mt-2’, passwordLength > 0 ? ‘visible’ : ‘invisible’].join(‘ ‘).trim();

return (
<Fragment>
<div className=”position-relative”>
{/** Pass the validation and stateChanged functions as props to the form field **/}
<FormField type=”password” validator={this.validatePasswordStrong} onStateChanged={this.stateChanged} {…restProps}>
<span className=”d-block form-hint”>To conform with our Strong Password policy, you are required to use a sufficiently strong password. Password must be more than 7 characters.</span>
{children}
{/** Render the password strength meter **/}
<div className={strengthClass}>
<div className=”strength-meter-fill” data-strength={strength}></div>
</div>
</FormField>
<div className=”position-absolute password-count mx-3″>
{/** Render the password length counter indicator **/}
<span className={counterClass}>{ passwordLength ? passwordLong ? `${this.thresholdLength}+` : passwordLength : ” }</span>
</div>
</div>
</Fragment>
);
}

}

PasswordField.propTypes = {
label: PropTypes.string.isRequired,
fieldId: PropTypes.string.isRequired,
placeholder: PropTypes.string.isRequired,
required: PropTypes.bool,
children: PropTypes.node,
onStateChanged: PropTypes.func,
minStrength: PropTypes.number,
thresholdLength: PropTypes.number
};

export default PasswordField;

ما در این مؤلفه از بسته تخمین قدرت رمز عبور zxcvbn در جاوااسکریپت استفاده می کنیم. این بسته یک تابعzxcvbn () را صادر می کند که یک (کلمه عبور: رشته) را به عنوان اولین آرگومان خود در نظر می گیرد و یک شیء را با چندین ویژگی برای برآورد قدرت پسورد باز می گرداند. در این آموزش ، ما فقط به ویژگی امتیاز میپردازیم ، که عدد صحیحی بین 0 – 4 است (برای اجرای نوار قدرت مفید است).
در اینجا به تفصیل آنچه در مؤلفه PasswordField در جریان است ، می پردازیم.
Initialization  – در constructor() ، ما دو ویژگی نمونه ایجاد کردیم: thresholdLangth  و minStrength  از قسمت مربوطه که به مؤلفه منتقل شده اند. thresholdLength (طول آستانه) حداکثر طول رمز عبور است قبل از آنکه به طرز قابل توجهی طولانی در نظر گرفته شود. پیش فرض 7 است و نمی تواند پایین تر باشد. minStrength حداقل نمره zxcvbn است قبل از اینکه رمز عبور به اندازه کافی قوی در نظر گرفته می شود. مقدار آن از 0-4 متغیر است. اگر به درستی مشخص نشده باشد ، پیش فرض 3 قرار میگیرد.
همچنین برای ذخیره رمز عبور فعلی و قدرت رمز عبور ، حالت داخلی فیلد رمز عبور را مقداردهی اولیه کردیم.
Handling Password Changes – یک تابع اعتبار سنجی گذرواژه تعریف کردیم که به مشخصه اعتبارسنجی مؤلفه FormField منتقل می شود. این تابع تضمین می کند که طول رمز عبور طولانی تر از طول آستانه است و همچنین دارای یک نمره حداقل zxcvbn () از minStrength مشخص شده است.
همچنین یک تابع stateChanged () تعریف کردیم ، که به مشخصه onStateChanged از مؤلفه FormField منتقل خواهد شد. این عملکرد حالت به روز شده از مؤلفه FormField را بازیابی می کند و از آن برای محاسبه و به روزرسانی وضعیت داخلی جدید مؤلفه PasswordField استفاده می کند.
یک تابع callback باید بعد از بروزرسانی حالت داخلی فراخوانی شود. تابع callback ، تابع منتقل شده در قسمت اختیاری onStateChanged از مؤلفه PasswordField را فراخوانی می کند و حالت به روز شده FormField را به عنوان آرگومان خود وارد میکند.
Rendering and Props – در اینجا به راحتی عنصر زیربنایی FormField را در کنار بعضی از عناصر برای اشاره ورودی ، سنجش قدرت رمز عبور ، و شمارنده طول رمزعبور ارائه کردیم.
مقیاس رمز عبور، قدرت رمز عبور فعلی را بر اساس حالت نشان می دهد و به گونه ای پیکربندی شده است که اگر طول رمز عبور 0 باشد به صورت پویا قابل مشاهده نباشد. این مقیاس برای سطوح مختلف قدرت رنگ های مختلف را نشان می دهد.
شمارنده طول رمز عبور ، نشان می دهد چه زمان طول پسورد کافی است. اگر رمز عبور از طول آستانه طولانی تر نباشد ، طول رمز عبور را نشان می دهد ، در غیر این صورت طول آستانه را به همراه یک (+) نشان می دهد.
مؤلفه PasswordField دو قسمت اختیاری دیگر را می پذیرد: minStrength و thresholdLength به همان صورت که در propTypes های مؤلفه تعریف شده است.
مولفه JoinForm
یک فایل جدید JoinForm.js را در دیرکتوری src / parts ایجاد کنید و قطعه کد زیر را به آن اضافه کنید:
import React, { Component } from ‘react’;

import FormField from ‘./FormField’;
import EmailField from ‘./EmailField’;
import PasswordField from ‘./PasswordField’;

class JoinForm extends Component {

// initialize state to hold validity of form fields
state = { fullname: false, email: false, password: false }

// higher-order function that returns a state change watch function
// sets the corresponding state property to true if the form field has no errors
fieldStateChanged = field => state => this.setState({ [field]: state.errors.length === 0 });

// state change watch functions for each field
emailChanged = this.fieldStateChanged(’email’);
fullnameChanged = this.fieldStateChanged(‘fullname’);
passwordChanged = this.fieldStateChanged(‘password’);

render() {
const { fullname, email, password } = this.state;
const formValidated = fullname && email && password;

// validation function for the fullname
// ensures that fullname contains at least two names separated with a space
const validateFullname = value => {
const regex = /^[a-z]{2,}(\s[a-z]{2,})+$/i;
if (!regex.test(value)) throw new Error(‘Fullname is invalid’);
};

return (
<div className=”form-container d-table-cell position-relative align-middle”>
<form action=”/” method=”POST” noValidate>

<div className=”d-flex flex-row justify-content-between align-items-center px-3 mb-5″>
<legend className=”form-label mb-0″>Support Team</legend>
{/** Show the form button only if all fields are valid **/}
{ formValidated && <button type=”button” className=”btn btn-primary text-uppercase px-3 py-2″>Join</button> }
</div>

<div className=”py-5 border-gray border-top border-bottom”>
{/** Render the fullname form field passing the name validation fn **/}
<FormField type=”text” fieldId=”fullname” label=”Fullname” placeholder=”Enter Fullname” validator={validateFullname} onStateChanged={this.fullnameChanged} required />

{/** Render the email field component **/}
<EmailField fieldId=”email” label=”Email” placeholder=”Enter Email Address” onStateChanged={this.emailChanged} required />

{/** Render the password field component using thresholdLength of 7 and minStrength of 3 **/}
<PasswordField fieldId=”password” label=”Password” placeholder=”Enter Password” onStateChanged={this.passwordChanged} thresholdLength={7} minStrength={3} required />
</div>

</form>
</div>
);
}

}

export default JoinForm;

مولفه JoinForm اجزای فیلد فرم را دربرمیگیرد که فرم ما را تشکیل می دهد. ما برای حفظ اعتبار سه فیلد فرم ، حالت اولیه را تنظیم کردیم: نام کامل ، ایمیل و رمز عبور. همه آنها در ابتدا false  هستند – که نامعتبر است.
همچنین توابع مشاهده تغییر حالت را برای هر فیلد تعریف کردیم تا حالت فرم را بر این اساس آپدیت کند. تابع watch  بررسی میکند که در یک فیلد خطایی نباشد و حالت داخلی فرم را برای آن فیلد روی true به روز می کند – که معتبر است. سپس این توابع مشاهده به نظارت بر onStateChanged هر مؤلفه فیلد فرم اختصاص داده می شوند تا تغییرات وضعیت را کنترل کنند.
سرانجام فرم را ارائه دادیم. توجه کنید که ما یک تابع اعتبارسنجی را به فیلد fullname  اضافه کرده ایم تا اطمینان حاصل شود که دو نام حداقل با فاصله (space) جدا شده اند و فقط حاوی کاراکترهای الفبا هستند.
مؤلفه App
تا این مرحله ، مرورگر هنوز برنامه React  را ارائه می دهد. پیش خواهیم رفت تا فایل App.js را در دیرکتوری src اصلاح کنیم تا JoinForm را در داخل AppComponent ارائه دهیم.
فایل App.js باید مانند قطعه زیر باشد:
import React from ‘react’;
import JoinForm from ‘./components/JoinForm’;
import ‘./App.css’;

const App = () => (
<div className=”main-container d-table position-absolute m-auto”>
<JoinForm />
</div>
);

export default App;

مرحله 3 – طراحی با SASS
یک قدم از ظاهر نهایی برنامه خود فاصله داریم. در حال حاضر ، به نظر می رسد همه چیز کمی خارج از مکان خود قرار دارد. پیش خواهیم رفت تا برخی از قوانین استایل را در فایل src / App.scss تعریف کنیم تا فرم مورد نظر را طراحی کنیم.
فایل App.scss مانند قطعه کد زیر خواهد شد:
/_ Declare some variables _/
$primary: #007bff;

// Password strength meter color for the different levels
$strength-colors: (darkred, orangered, orange, yellowgreen, green);

// Gap width between strength meter bars
$strength-gap: 6px;

body {
font-size: 62.5%;
}

.main-container {
width: 400px;
top: 0;
bottom: 0;
left: 0;
right: 0;
}

.form-container {
bottom: 100px;
}

legend.form-label {
font-size: 1.5rem;
color: desaturate(darken($primary, 10%), 60%);
}

.control-label {
font-size: 0.8rem;
font-weight: bold;
color: desaturate(darken($primary, 10%), 80%);
}

.form-control {
font-size: 1rem;
}

.form-hint {
font-size: 0.6rem;
line-height: 1.4;
margin: -5px auto 5px;
color: #999;

&.error {
color: #C00;
font-size: 0.8rem;
}
}

button.btn {
letter-spacing: 1px;
font-size: 0.8rem;
font-weight: 600;
}

.password-count {
bottom: 16px;
right: 10px;
font-size: 1rem;
}

.strength-meter {
position: relative;
height: 3px;
background: #DDD;
margin: 7px 0;
border-radius: 2px;

// Dynamically create the gap effect
&:before,
&:after {
content: ”;
height: inherit;
background: transparent;
display: block;
border-color: #FFF;
border-style: solid;
border-width: 0 $strength-gap 0;
position: absolute;
width: calc(20% + #{$strength-gap});
z-index: 10;
}

// Dynamically create the gap effect
&:before {
left: calc(20% – #{($strength-gap / 2)});
}

// Dynamically create the gap effect
&:after {
right: calc(20% – #{($strength-gap / 2)});
}
}

.strength-meter-fill {
background: transparent;
height: inherit;
position: absolute;
width: 0;
border-radius: inherit;
transition: width 0.5s ease-in-out, background 0.25s;

// Dynamically generate strength meter color styles
@for $i from 1 through 5 {
&[data-strength=’#{$i – 1}’] {
width: (20% * $i);
background: nth($strength-colors, $i);
}
}
}

ما موفق شده ایم که سبک های مورد نیاز برنامه خود را اضافه کنیم. به استفاده از محتوای CSS تولید شده در شبه عناصر .strength-meter:before و .strength-meter:after توجه کنید تا گپ هایی به مقیاس قدرت پسورد اضافه کنیم.
همچنین از دستورالعمل @for در Sass استفاده کردیم تا به صورت پویا رنگها را برای اندازه گیری سطوح مختلف قدرت رمز عبور ایجاد کنیم.
صفحه برنامه نهایی مانند این است:

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

بدون هیچ گونه خطایی ، هنگامی که همه فیلدها معتبر هستند ، صفحه مانند این ظاهر می شود:

نتیجه
در این آموزش ، یک قدرت سنج رمز عبور را بر اساس کتابخانه zxcvbn جاوااسکریپت در برنامه React ایجاد کردیم. برای مطالعه یک راهنمای استفاده دقیق و مستندات کتابخانه zxcvbn ، به منبع zxcvbn در Github مراجعه کنید. برای دریافت نمونه کامل کد این آموزش ، منبع  password-strength-react-demo در Github را بررسی کنید. همچنین می توانید یک نسخه آزمایشی زنده از این آموزش در مورد کد Sandbox دریافت کنید.
اگر به نسخه AngularJS این مقاله علاقه مند هستید ، می توانید به این مقاله نگاهی بیندازید: Password Strength Meter in AngularJS.

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

در این مقاله یک برنامه ساده Django خواهیم ساخت که آب و هوای فعلی را برای شهرهای مختلف نشان می دهد. برای به دست آوردن داده های فعلی هوا ، از Open Weather Map API استفاده خواهیم کرد.
با یک بانک اطلاعاتی کار خواهیم کرد و فرمی ایجاد می کنیم ، بنابراین مفاهیم مورد استفاده در اینجا برای پروژه های پیچیده تری قابل اجرا هستند.
کد موجود در این مقاله با Python 3 و Django 2.0 نوشته شده است ، بنابراین برای دنبال کردن این آموزش ، باید تا حدودی با هر دو آشنا باشید.
وقتی کار ما به پایان رسید، برنامه به این شکل خواهد بود.

تمام کد های این مقاله در GitHub قرار دارند.
نصب و راه اندازی
نصب Django مانند نصب هر کتابخانه دیگری در Python است: شما می توانید یک محیط مجازی را راه اندازی کنید و برای نصب Django ، pip را اجرا کنید ، یا می توانید کاری را که من انجام می دهم انجام دهید و یک دایرکتوری پروژه ایجاد کنید ، pipenv را اجرا کنید و سپس پوسته pipenv را فعال کنید. هر دو روش کار می شود ، اما برای این مقاله از pipenv استفاده می کنم.
⦁ $ pipenv install django

با این دستور آخرین نسخه Django برای شما نصب می شود. در زمان نوشتن این مقاله ، Django در نسخه 2.0.4 موجود است.
وقتی Django را نصب کردید ، اگر قبلاً دیرکتوری برای این پروژه ندارید ، یک دیرکتوری ایجاد و به داخل آن بروید. در آنجا ، می توانید دستور startproject را که Django به شما می دهد برای تولید پروژه اجرا کنید.
⦁ $ django-admin startproject the_weather

Django باید چندین فایل جدید را در دیرکتوری شما ایجاد کند.
بیایید سعی کنیم سرور مجازی توسعه را راه اندازی کنیم. برای انجام این کار ، به دیرکتوری جدید بروید و از manage.py برای اجرای دستور runserver در ترمینال خود استفاده کنید:
⦁ $ cd the_weather

⦁ $ python manage.py runserver

اگر به پایانه خود نگاه کنید ، باید URL برنامه خود را مشاهده کنید. به طور پیش فرض باید 127.0.0.1:8000 باشد.

مرورگر خود را باز کنید و به آن URL بروید.

اگر این را ببینید ، می فهمید که Django را به درستی تنظیم کرده اید. قطعاً باید آن را ببینید زیرا ما هنوز سعی نکرده ایم که کد را اصلاح کنیم.
داشبورد ادمین
در مرحله بعد می خواهیم نگاهی به داشبورد سرور مجازی که Django به ما نشان میدهد، بیاندازیم. برای انجام این کار ، ابتدا باید پایگاه داده خود را جابه جا کنیم ، به این معنی که Django جدولهای از پیش تعریف شده مورد نیاز برنامه های پیش فرض را ایجاد می کند. برای این کار ، دستور migrate  را اجرا کنید. سرور مجازی را با استفاده از CTRL + C متوقف و سپس دستور زیر را اجرا کنید:
⦁ $ python manage.py migrate

با اجرای آن دستور ، Django یک پایگاه داده SQLite برای شما ایجاد کرده است ، بانک اطلاعاتی پیش فرض در تنظیمات ، و چندین جدول به آن پایگاه داده اضافه کرده است. می دانید اگر یک فایل جدید db.sqlite3 را در دیرکتوری پروژه خود مشاهده کنید ، این بانک اطلاعات ایجاد شده است.
یکی از جداولی که Django به ما میدهد جدول کاربر است ، که برای ذخیره هر کاربر در برنامه ما استفاده خواهد شد. برنامه ای که ما در حال ساختن آن هستیم نیازی به هیچ کاربری ندارد ، اما داشتن کاربر ادمین به ما امکان دسترسی به داشبورد ادمین را می دهد.
برای ایجاد یک کاربر ادمین ، دستور createsuperuser را اجرا می کنیم.
⦁ $ python manage.py createsuperuser

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

سپس به 127.0.0.1:8000/admin بروید.
دلیل اینکه می توانیم به این صفحه برویم این است که ادمین در urls.py ما تنظیم شده است (دلیل اینکه می توانیم صفحه تبریک را ببینیم این است که Django به شما این امکان را می دهد تا نشانی اینترنتی خود را اضافه کنید(.
اگر با نام کاربری و رمز عبوری که تازه ایجاد کرده اید وارد شوید ، باید داشبورد ادمین Django را ببینید.

گروه ها و کاربران نمایانگر دو مدل هستند که Django به ما دسترسی می دهد. مدل ها فقط تفسیر کدهای جدول از یک پایگاه داده هستند. حتی اگر Django جدولهای بیشتری ایجاد میکرد ، هیچ نیازی به دسترسی مستقیم به بقیه آنها نیست ، بنابراین هیچ مدلی ایجاد نشد.
اگر روی “user” کلیک کنید ، باید جزئیات بیشتری در مورد جدول کاربر مشاهده کنید ، و باید کاربر ایجاد شده را مشاهده کنید. ایده خوبی است که با کلیک روی پیوندهای مختلف در داشبورد ، جستجو کنید تا ببینید چه چیزی در آنجا وجود دارد. فقط مراقب باشید که کاربر خود را حذف نکنید ، در غیر اینصورت مجدداً باید createsuperuser را اجرا کنید.
بگذارید فعلاً داشبورد ادمین را رها کنیم و به سراغ کد برویم. باید برای برنامه هواشناسی خود برنامه ای را در داخل پروژه خود ایجاد کنیم.
ایجاد برنامه
در Django ، می توانید با استفاده از برنامه ها ، عملکرد خود را در پروژه جدا کنید. من فکر می کنم app یک اسم گیج کننده است زیرا ما معمولاً یک app را برای کل پروژه معرفی می کنیم ، اما در مورد Django ، app به عملکرد خاصی در پروژه شما اشاره دارد. به عنوان مثال ، اگر به فایل settings.py نگاه کنید ، لیست INSTALLED_APPS را مشاهده خواهید کرد.
اولین برنامه نصب شده ، django.contrib.admin همان چیزی است که ما اکنون استفاده کردیم. این برنامه همه عملکردهای ادمین را اداره می کند و و هیچ چیز دیگری را شامل نمیشود. برنامه دیگر در پروژه ما به طور پیش فرض مواردی مانند auth است که به ما امکان ورود به داشبورد ادمین ما را می دهد.
در مثال ما ، باید یک app جدید ایجاد کنیم تا همه امور مربوط به نشان دادن آب و هوا را کنترل کنیم. برای ایجاد آن برنامه ، سرور مجازی را با CTRL + C متوقف و دستور زیر را اجرا کنید:
⦁ $ python manage.py startapp weather

با اجرای startapp ، Django دیرکتوری جدید و فایل های بیشتری را به پروژه ما اضافه کرده است.
با جدیدترین فایل های تولید شده ، بیایید فایل جدیدی به نام urls.py را در دیرکتوری برنامه ایجاد کنیم.
urls.py
from django.urls import path

urlpatterns = [
]

این فایل مشابه urls.py در دیرکتوری the_weather ماست. تفاوت در این است که این فایل urls.py شامل کلیه آدرس های اینترنتی مربوط به خود برنامه است.
ما هنوز URL را مشخص نکرده ایم ، اما می توانیم پروژه را تنظیم کنیم تا برنامه خود را بشناسیم و هر URL خاص به برنامه خود و فایل urls.py برنامه را مسیریابی کنیم.
ابتدا به لیست INSTALLED_APPS بروید و این برنامه را به لیست اضافه کنید.
the_weather/the_weather/settings.py

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

این به Django اجازه می دهد بداند که ما برای چه منظور می خواهیم از برنامه هواشناسی در پروژه خود استفاده کنیم. با انجام این کار ، Django می داند که کجا به دنبال جابه جایی و آدرس های اینترنتی باشد.
در مرحله بعدی ، باید urls.py اصلی را تغییر دهیم تا به فایل urls.py برنامه خود اشاره کنیم. برای انجام این کار ، یک خط تحت مسیر موجود برای داشبورد ادمین اضافه می کنیم. همچنین نیاز به وارد کردن include  داریم تا بتوانیم به فایل urls.py برنامه خود اشاره کنیم.
the_weather/the_weather/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path(‘admin/’, admin.site.urls),
path(”, include(‘weather.urls’)),
]

رشته خالی بدان معنی است که ما از نقطه انتهایی برای نقطه ورود به برنامه خود استفاده نمی کنیم. درعوض به برنامه اجازه خواهیم داد تا از نقاط انتهایی خاصی استفاده کند. می توانستیم چیزی شبیه به مسیری قرار دهیم (‘weather/’, …) ، این بدان معنی است که باید 127.0.0.1:8000/weather/ را تایپ کنیم تا هر چیز مرتبط با برنامه آب و هوایی خود را دریافت کنیم. اما از آنجا که پروژه ما ساده است ، آن را اینجا انجام نمی دهیم.
اضافه کردن قالب و نما
در حال حاضر برای اولین کاری که می خواهیم انجام دهیم، باید الگوی خود را به پروژه اضافه کنیم.
یکی از قالب ها در Django تنها یک فایل HTML است که امکان دستور اضافی را می دهد تا این الگو را پویا کند. می توانیم کارهایی مانند اضافه کردن متغیرها ، عبارات if و حلقه ها را علاوه بر موارد دیگر انجام دهیم.
یک فایل HTML داریم ، اما برای شروع ما کافی خواهد بود.
می خواهیم یک دایرکتوری الگو ایجاد کنیم تا این فایل را در آن قرار دهیم.
⦁ cd weather

⦁ mkdir templates && cd templates

⦁ mkdir weather

همچنین دایرکتوری دیگری با نام یکسان با برنامه خود ایجاد کردیم. این کار را کردیم زیرا Django تمام دایرکتوری های قالب را از برنامه های مختلفی که در اختیار داریم ترکیب می کند. برای جلوگیری از کپی شدن نام فایل ها ، می توانیم از نام برنامه خود برای جلوگیری از تکرار استفاده کنیم.
در داخل دیرکتوری هواشناسی ، فایل جدیدی با نام index.html ایجاد کنید. این الگوی اصلی ما خواهد بود. در اینجا HTML ای که برای الگو استفاده خواهیم کرد ، آورده شده است:
the_weather/weather/templates/weather/index.html
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<meta http-equiv=”X-UA-Compatible” content=”ie=edge”>
<title>What’s the weather like?</title>
<link rel=”stylesheet” href=”https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.2/css/bulma.css” />
</head>
<body>
<section class=”hero is-primary”>
<div class=”hero-body”>
<div class=”container”>
<h1 class=”title”>
What’s the weather like?
</h1>
</div>
</div>
</section>
<section class=”section”>
<div class=”container”>
<div class=”columns”>
<div class=”column is-offset-4 is-4″>
<form method=”POST”>
<div class=”field has-addons”>
<div class=”control is-expanded”>
<input class=”input” type=”text” placeholder=”City Name”>
</div>
<div class=”control”>
<button class=”button is-info”>
Add City
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<section class=”section”>
<div class=”container”>
<div class=”columns”>
<div class=”column is-offset-4 is-4″>
<div class=”box”>
<article class=”media”>
<div class=”media-left”>
<figure class=”image is-50×50″>
<img src=”http://openweathermap.org/img/w/10d.png” alt=”Image”>
</figure>
</div>
<div class=”media-content”>
<div class=”content”>
<p>
<span class=”title”>Las Vegas</span>
<br>
<span class=”subtitle”>29° F</span>
<br> thunderstorm with heavy rain
</p>
</div>
</div>
</article>
</div>
</div>
</div>
</div>
</section>
<footer class=”footer”>
</footer>
</body>
</html>

اکنون که الگوی خود را ایجاد کردیم ، بگذارید یک نما و URL ترکیبی ایجاد کنیم تا در واقع بتوانیم این را در برنامه خود مشاهده کنیم.
نماهای موجود در Django یا توابع یا کلاس ها هستند. در مورد ما از آنجا که یک نمای ساده ایجاد می کنیم ، یک تابع ایجاد خواهیم کرد. این تابع را به views.py خود اضافه کنید:
the_weather/weather/views.py
from django.shortcuts import render

def index(request):
return render(request, ‘weather/index.html’) #returns the index.html template

ما نمای خود را index نامگذاری می کنیم زیرا در فهرست برنامه ما ، که URL اصلی است قرار دارد. برای ارائه رندر قالب ، درخواست را باز می گردانیم ، که برای عملکرد رندر لازم است و نام فایل قالب که می خواهیم ارائه دهیم ، در این حالت weather / index.html است.
بیایید URL ای را اضافه کنیم که درخواست را به این نما ارسال کند. در urls.py برای برنامه ، لیست urlpatterns را به روز کنید.
the_weather/weather/urls.py
from django.urls import path
from . import views

urlpatterns = [
path(”, views.index), #the path for our index view
]

این کار به ما امکان می دهد تا نمایی را که تازه ایجاد کردیم ، ارجاع دهیم.
Django قرار است بدون نقطه نهایی با هر URL مطابقت داشته باشد و آن را به سمت تابعی که ایجاد کرده ایم هدایت کند.
به ریشه پروژه خود برگردید ، سرور مجازی را راه اندازی کنید و دوباره به 127.0.0.1:8000 بروید.
⦁ $ python manage.py runserver

آنچه اکنون می بینیم فقط نتیجه HTML است که در فایل index.html دارید. ورودی برای افزودن شهر و آب و هوای لاس وگاس را مشاهده خواهید کرد. با این حال ، این فرم کار نمی کند و آب و هوا فقط placeholder است ، اما نگران نباشید ، زیرا این موارد را برای این برنامه ایجاد خواهیم کرد.
استفاده از API آب و هوا
کاری که اکنون می خواهیم انجام دهیم ثبت نام در Open Weather Map API است. این کار به ما امکان می دهد آب و هوای واقعی را برای هر شهر که در برنامه خود اضافه می کنیم ، بدست آوریم.
به سایت مذکور بروید ، یک حساب کاربری ایجاد کنید و سپس به سمت کلیدهای API در داشبورد خود بروید. یک نام وارد کنید و یک کلید API جدید تولید کنید. این کلید به ما امکان می دهد تا از API برای به دست آوردن هوا استفاده کنیم.

نقطه پایانی که استفاده خواهیم کرد در زیر آمده است ، بنابراین می توانید با تغییر URL زیر با کلید API و حرکت به URL در مرورگر خود ، داده هایی را که باز می گردانید ، مشاهده می کنید. ممکن است چند دقیقه طول بکشد تا کلید API شما فعال شود ، بنابراین اگر در ابتدا کار نمی کند ، پس از چند دقیقه دوباره امتحان کنید.
http://api.openweathermap.org/data/2.5/weather?q=las%20vegas&units=imperial&appid=YOUR_APP_KEY
پس از این ، بیایید درخواستی اضافه کنیم تا داده ها را وارد برنامه خود کنیم.
ابتدا باید درخواست هایی را نصب کنیم تا بتوانیم از داخل برنامه خود با API تماس بگیریم.
⦁ $ pipenv install requests

بیایید نمای فهرست را به روز کنیم تا یک درخواست به URL خود بفرستیم.
the_weather/weather/views.py
from django.shortcuts import render
import requests

def index(request):
url = ‘http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=YOUR_APP_KEY’
city = ‘Las Vegas’
city_weather = requests.get(url.format(city)).json() #request the API data and convert the JSON to Python data types

return render(request, ‘weather/index.html’) #returns the index.html template

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

نمایش داده ها در قالب
در مرحله بعد ، باید داده ها را به قالب منتقل کنیم تا بتواند برای کاربر نمایش داده شود.
بیایید یک فرهنگ لغت ایجاد کنیم تا تمام داده های مورد نیاز خود را نگه داریم. از داده های برگشت یافته به ما ، به دما ، توضیحات و نماد نیاز داریم.
the_weather/weather/views.py
def index(request):

weather = {
‘city’ : city,
‘temperature’ : city_weather[‘main’][‘temp’],
‘description’ : city_weather[‘weather’][0][‘description’],
‘icon’ : city_weather[‘weather’][0][‘icon’]
}

return render(request, ‘weather/index.html’) #returns the index.html template

اکنون که تمام اطلاعات مورد نظر خود را داریم ، می توانیم آن را به قالب منتقل کنیم. برای انتقال آن به الگو ، متغیری به نام زمینه ایجاد خواهیم کرد. که یک فرهنگ لغت است که به ما امکان می دهد مقادیر آن را در داخل قالب استفاده کنیم.
the_weather/weather/views.py
def index(request):

context = {‘weather’ : weather}
return render(request, ‘weather/index.html’, context) #returns the index.html te

و پس از آن در ارائه ، متن را به عنوان آرگومان سوم اضافه خواهیم کرد.
با افزودن داده های آب و هوا در داخل متن ، بیایید به سراغ قالب برویم تا داده ها را اضافه کنیم.
در داخل قالب ، تمام کاری که باید انجام دهیم این است که HTML را اصلاح کنیم تا از متغیرها به جای مقادیری که تایپ کرده ایم استفاده کنیم. متغیرها از برچسب {{}}، استفاده می کنند و هر چیزی را در فرهنگ لغت متن خود ارجاع می دهند.
توجه داشته باشید که Django کلیدهای فرهنگ لغت را تبدیل می کند ، بنابراین تنها با استفاده از نشانه گذاری نقطه ای می توانید به آنها دسترسی پیدا کنید. به عنوان مثال ، weather.city نام شهر را به ما می دهد. مانند پیتون از weather[‘city’] استفاده نمی کنیم.
div جعبه را پیدا کنید و آن را به روز کنید:
the_weather/weather/templates/weather/index.html
<div class=”box”>
<article class=”media”>
<div class=”media-left”>
<figure class=”image is-50×50″>
<img src=”http://openweathermap.org/img/w/{{ weather.icon }}.png” alt=”Image”>
</figure>
</div>
<div class=”media-content”>
<div class=”content”>
<p>
<span class=”title”>{{ weather.city }}</span>
<br>
<span class=”subtitle”>{{ weather.temperature }}° F</span>
<br> {{ weather.description }}
</p>
</div>
</div>
</article>
</div>

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

اکنون می توانیم هوای یک شهر را ببینیم ، اما مجبور شدیم شهر را کدگذاری کنیم. کاری که اکنون می خواهیم انجام دهیم این است که از بانک اطلاعاتی بیرون بکشیم و شهرهایی را که در پایگاه داده ما هستند نشان دهیم.
برای این کار ، یک جدول در بانک اطلاعاتی خود ایجاد خواهیم کرد تا شهرهایی را که می خواهیم آب و هوا را برای آنها بشناسیم ، در اختیار داشته باشیم. یک مدل برای این منظور ایجاد خواهیم کرد.
به برنامه model.py در برنامه هواشناسی خود بروید و موارد زیر را اضافه کنید:
the_weather/weather/models.py
from django.db import models

class City(models.Model):
name = models.CharField(max_length=25)

def _str_(self): #show the actual city name on the dashboard
return self.name

class Meta: #show the plural of city as cities instead of citys
verbose_name_plural = ‘cities’

این کد یک جدول در دیتابیس ما ایجاد می کند که ستونی به نام name خواهد داشت که نام شهر است. این شهر یک charfield خواهد بود ، که فقط یک رشته است.
برای به دست آوردن این تغییرات در بانک اطلاعاتی ، باید ememigrations را برای تولید کد جهت به روزرسانی بانک اطلاعاتی و جابه جایی برای اعمال آن تغییرات انجام دهیم. بیایید اکنون این کار را انجام دهیم:
⦁ $ python manage.py makemigrations

⦁ $ python manage.py migrate

باید آن را به جایی تبدیل کنیم که بتوانیم این مدل را در داشبورد ادمین خود مشاهده کنیم. برای انجام این کار ، باید آن را در فایل admin.py خود ثبت کنیم.
the_weather/weather/admin.py
from django.contrib import admin
from .models import City

admin.site.register(City)

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

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

با ورود به دیتابیس ، باید از دید خود این ورودی ها را جستجو کنیم. با وارد کردن مدل City شروع کنید و سپس جستجوی آن مدل برای همه آبجکت ها شروع کنید.
the_weather/weather/views.py
from django.shortcuts import render
import requests
from .models import City
Copy
the_weather/weather/views.py

def index(request):
url = ‘http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=YOUR_APP_KEY’
cities = City.objects.all() #return all the cities in the database

از آنجا که ما لیست شهرها را داریم ، می خواهیم در آنها حلقه بزنیم و هوا را برای هر یک از آنها بدست آوریم و آن را به لیستی اضافه کنیم که در نهایت به قالب منتقل شود.
این فقط تنوع کارهایی است که در مورد اول انجام دادیم. تفاوت دیگر اینست که هر لغت نامه را به یک لیست حلقه و اضافه می کنیم. ما متغیر شهر اصلی را به نفع متغیر شهری در حلقه، حذف خواهیم کرد:
the_weather/weather/views.py
def index(request):

weather_data = []

for city in cities:

city_weather = requests.get(url.format(city)).json() #request the API data and convert the JSON to Python data types

weather = {
‘city’ : city,
‘temperature’ : city_weather[‘main’][‘temp’],
‘description’ : city_weather[‘weather’][0][‘description’],
‘icon’ : city_weather[‘weather’][0][‘icon’]
}

weather_data.append(weather) #add the data for the current city into our list

context = {‘weather_data’ : weather_data}

اکنون زمینه را برای وارد کردن این لیست به جای یک فرهنگ لغت واحد به روزرسانی می کنیم.
the_weather/weather/views.py

context = {‘weather_data’ : weather_data}

در مرحله بعد ، در داخل قالب ، باید این لیست را حلقه زده و HTML را برای هر شهر موجود در لیست تولید کنیم. برای این کار می توانیم یک حلقه for حول HTML قرار دهیم که یک جعبه واحد برای شهر ایجاد می کند.
the_weather/weather/index.html
<div class=”column is-offset-4 is-4″>
{% for weather in weather_data %}
<div class=”box”>
<article class=”media”>
<div class=”media-left”>
<figure class=”image is-50×50″>
<img src=”http://openweathermap.org/img/w/{{ weather.icon }}.png” alt=”Image”>
</figure>
</div>
<div class=”media-content”>
<div class=”content”>
<p>
<span class=”title”>{{ weather.city }}</span>
<br>
<span class=”subtitle”>{{ weather.temperature }}° F</span>
<br> {{ weather.description }}
</p>
</div>
</div>
</article>
</div>
{% endfor %}
</div>

اکنون می توانیم داده های مربوط به تمام شهرهایی که در بانک اطلاعات داریم را ببینیم.
ایجاد فرم
آخرین کاری که می خواهیم انجام دهیم این است که کاربر بتواند شهری را مستقیماً در قالب اضافه کند.
برای انجام این کار ، باید یک فرم ایجاد کنیم. می توانستیم فرم را بطور مستقیم ایجاد کنیم ، اما از آنجا که فرم ما دقیقاً همان فیلد مدل ما را خواهد داشت ، می توانیم از ModelForm استفاده کنیم.
یک فایل جدید به نام format.py ایجاد کنید.
the_weather/weather/forms.py
from django.forms import ModelForm, TextInput
from .models import City

class CityForm(ModelForm):
class Meta:
model = City
fields = [‘name’]
widgets = {
‘name’: TextInput(attrs={‘class’ : ‘input’, ‘placeholder’ : ‘City Name’}),
} #updates the input class to have the correct Bulma class and placeholder

برای مشاهده فرم ، باید آن را در نمای خود بسازیم و آن را به قالب منتقل کنیم.
برای انجام این کار ، بگذارید ویدیوی ایندکس را به روز کنیم تا فرم ایجاد شود. متغیر شهر قدیمی را همزمان جایگزین خواهیم کرد زیرا دیگر نیازی به آن نداریم. همچنین باید متن را به روز کنیم تا فرم به قالب منتقل شود.
the_weather/weather/views.py
def index(request):

form = CityForm()

weather_data = []

context = {‘weather_data’ : weather_data, ‘form’ : form}

اکنون بیایید در قالب ، بخش فرم را به روز کنیم تا از فرم در نمای خود و از csrf_token استفاده کنیم که برای درخواست های POST در Django ضروری است.
<form method=”POST”>
{% csrf_token %}
<div class=”field has-addons”>
<div class=”control is-expanded”>
{{ form.name }}
</div>
<div class=”control”>
<button class=”button is-info”>
Add City
</button>
</div>
</div>
</form>

با استفاده از فرم موجود در HTML ، باید داده های فرم را در صورت ورود به آن مدیریت کنیم. برای این کار ، یک بلوک if ایجاد می کنیم که درخواست POST را بررسی میکند. قبل از شروع گرفتن اطلاعات آب و هوا ، باید بررسی نوع درخواست را اضافه کنیم ، بنابراین بلافاصله داده های مربوط به شهری را که اضافه می کنیم ، دریافت می نماییم.
the_weather/weather/views.py
def index(request):
cities = City.objects.all() #return all the cities in the database

url = ‘http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=YOUR_APP_KEY’

if request.method == ‘POST’: # only true if form is submitted
form = CityForm(request.POST) # add actual request data to form for processing
form.save() # will validate and save if validate

form = CityForm()

با ارسال request.POST می توانیم داده های فرم را تأیید کنیم.
اکنون باید بتوانید نام یک شهر را تایپ کنید ، روی add کلیک کنید ، و آن را ببینید. میامی را به عنوان شهر بعدی اضافه خواهم کرد.

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

درخواست های فرم Laravel کلاس های خاصی هستند که قابلیت استفاده از کلاس های درخواست منظم را افزایش می دهند و ویژگی های پیشرفته ای برای اعتبارسنجی را فراهم می آورد. درخواست های فرم همچنین به منظم نگه داشتن اقدامات کنترل کننده کمک می کند ، زیرا می توانید تمام منطق اعتبار خود را به کلاس درخواست فرم منتقل کنید. مزیت دیگر این است که به شما امکان می دهد تا قبل از رسیدن به اقدامات کنترل کننده خود ، درخواست ها را فیلتر کنید.
در این راهنما ، مرحله تأیید گذرواژه را برای شما اجرا خواهیم کرد تا درخواست کنید که یک کاربر رمز عبور خود را قبل از دسترسی به ناحیه ادمین تأیید کند. این عمل به عنوان یک بررسی مضاعف عمل می کند و یک لایه امنیتی بیشتر برای برنامه شما فراهم می کند.
پیش نیازها
برای دنبال کردن این راهنما ، به یک برنامه کاربردی Laravel 5.6+ با ستاپ داخلی تأیید اعتبار Laravel نیاز دارید. لطفاً برای جزئیات بیشتر در مورد چگونگی تنظیم این کار ، مستندات رسمی را مطالعه کنید.
مرحله 1 – ایجاد نما
قصد داریم با تنظیم صفحه پروفایل ویرایش کاربر شروع کنیم.
در زمان نوشتن این آموزش ، ابزار فرمان artisan نمایی ایجاد نمی کرد ، بنابراین ما نیاز به ایجاد نما به صورت دستی داریم.
فایل resources/views/profile/edit.blade.php را ایجاد کرده و کد زیر را اضافه کنید.
@extends(‘layouts.app’)

@section(‘content’)
<div class=”container”>
@if (session(‘info’))
<div class=”row”>
<div class=”col-md-12″>
<div class=”alert alert-success alert-dismissible”>
<button type=”button” class=”close” data-dismiss=”alert” aria-hidden=”true”>×</button>
{{ session(‘info’) }}
</div>
</div>
</div>
@elseif (session(‘error’))
<div class=”row”>
<div class=”col-md-12″>
<div class=”alert alert-danger alert-dismissible”>
<button type=”button” class=”close” data-dismiss=”alert” aria-hidden=”true”>×</button>
{{ session(‘error’) }}
</div>
</div>
</div>
@endif
<div class=”row”>
<div class=”col-md-8 col-md-offset-2″>
<div class=”panel panel-default”>
<div class=”panel-heading”>Update Profile</div>

<div class=”panel-body”>
<form class=”form-horizontal” method=”POST” action=”{{ route(‘profile.update’, [‘user’ => $user]) }}”>
{{ csrf_field() }}
{{ method_field(‘PUT’) }}
<div class=”form-group{{ $errors->has(‘name’) ? ‘ has-error’ : ” }}”>
<label for=”name” class=”col-md-4 control-label”>Name</label>
<div class=”col-md-6″>
<input id=”name” type=”text” class=”form-control” name=”name” value=”{{ $user->name }}”>

@if ($errors->has(‘name’))
<span class=”help-block”>
<strong>{{ $errors->first(‘name’) }}</strong>
</span>
@endif
</div>
</div>

<div class=”form-group{{ $errors->has(‘password’) ? ‘ has-error’ : ” }}”>
<label for=”password” class=”col-md-4 control-label”>Password</label>

<div class=”col-md-6″>
<input id=”password” type=”password” class=”form-control” name=”password”>

@if ($errors->has(‘password’))
<span class=”help-block”>
<strong>{{ $errors->first(‘password’) }}</strong>
</span>
@endif
</div>
</div>

<div class=”form-group”>
<label for=”password-confirm” class=”col-md-4 control-label”>Confirm Password</label>

<div class=”col-md-6″>
<input id=”password-confirm” type=”password” class=”form-control” name=”password_confirmation”>
</div>
</div>

<div class=”form-group{{ $errors->has(‘current_password’) ? ‘ has-error’ : ” }}”>
<label for=”current-password” class=”col-md-4 control-label”>Current Password</label>

<div class=”col-md-6″>
<input id=”current-password” type=”password” class=”form-control” name=”current_password”>

@if ($errors->has(‘current_password’))
<span class=”help-block”>
<strong>{{ $errors->first(‘current_password’) }}</strong>
</span>
@endif
</div>
</div>

<div class=”form-group”>
<div class=”col-md-6 col-md-offset-4″>
<button type=”submit” class=”btn btn-primary”>
Update
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

در صفحه “ویرایش نمایه” ما ، یک پیام فلش info  و error  را بررسی می کنیم و آن را به کاربر نمایش می دهیم.
این قسمت دارای فیلدهای نام ، رمزعبور ، گذرواژه ، تأیید رمزعبور و رمز عبور فعلی است.
روشی که ما می خواهیم آن را عملیاتی کنیم این است که هر زمان که کاربر تغییری ایجاد کرد ، باید فیلد صحیح پسورد فعلی را برای ارائه به روزرسانی به دیتابیس ارائه دهند.
فیلدهای رمزعبور و تایید رمز عبور به کاربر امکان تغییر رمز عبور خود را می دهد. در صورت خالی ماندن ، گذرواژه فعلی کاربر حفظ خواهد شد و هیچ تغییری در رمز عبور ذخیره شده آنها ایجاد نمی شود.
متغیرهای اصلی در نمای ما فیلدهای رمز عبور ، تایید رمز عبور ، و رمز عبور فعلی هستند.
همانند فیلد نام ، یک مثال برای گسترش و افزودن فیلدهای بیشتر به فایل شما ارائه میدهد.
مرحله 2 – ایجاد درخواست فرم
اکنون به مهمترین قسمت این آموزش میپردازیم.
دستور زیر را برای ایجاد درخواست فرم اجرا کنید.
⦁ php artisan make:request UpdateProfile

دستور فوق فایلی را با نام app / Http / Requests / UpdateProfile.php ایجاد می کند.
کلیه تغییرات کد در این بخش در این فایل ایجاد می شود.
اولین کاری که باید انجام دهیم دادن نام مستعار به  Laravel’s Hash facade قبل از اعلامیه کلاس است.
use Illuminate\Support\Facades\Hash;
Copy
در مرحله بعد ، از آنجا که در درخواست فرم خود تایید هویت را انجام نمی دهیم ، باید از روش authorize  خود true  را برگردانیم.
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

روش قوانین آرایه ای را ارائه می دهد که به تشریح قوانین اعتبارسنجی برای این درخواست می پردازد.
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
‘name’ => ‘required|string|max:255’,
‘password’ => ‘nullable|required_with:password_confirmation|string|confirmed’,
‘current_password’ => ‘required’,
];
}

قوانین name  و current_password خود توصیفی هستند.
قوانین password  بیان می کند که رمز عبور با استفاده از اعلامیه confirmed  تأیید می شود.
همچنین required_with:password_confirmation را اعلام می کند به این معنی که اگر کاربر تأیید رمز عبور را ارائه دهد ، باید رمز عبور نیز ارائه کند.
این قوانین اعتبارسنجی به طور خودکار پس از هر درخواستی که در عملکرد کنترلر خود تایپ کنیم ، بررسی می شوند.
آخرین کاری که باید انجام دهیم اینست که یک روش withValidator  روی درخواست خود اعلام کنیم که قبل از ابطال هرگونه قانون اعتبارسنجی ، نمونه اعتبار سنجی کاملاً ساخته شده را وارد کند.
/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
// checks user current password
// before making changes
$validator->after(function ($validator) {
if ( !Hash::check($this->current_password, $this->user()->password) ) {
$validator->errors()->add(‘current_password’, ‘Your current password is incorrect.’);
}
});
return;
}

در داخل روش withValdator ، قلاب after را اضافه کرده ایم ، عملکردی که بعد از انجام همه بررسی های اعتبار سنجی ، اجرا خواهد شد.
در قلاب after ، گذرواژه ارائه شده کاربر را با گذرواژه آنها در پایگاه داده مقایسه کردیم.
$ this-> current_password مقدار فعلی فیلد فرم شکل فعلی current_password را به ما می دهد در حالی که Laravel به ما اجازه می دهد تا با استفاده از $ this-> user ()به کاربر معتبر فعلی دسترسی داشته باشیم ، بنابراین $this->user()->password رمز عبور درهم سازی شده کاربر ذخیره شده در پایگاه داده را به ما میدهد.
این دو گذرواژه با استفاده از روش Hash facade’s check مقایسه می شوند.
در صورت عدم موفقیت آمیز بودن بررسی hash ، خطایی با کلید current_password با استفاده از $validator->errors()->add(‘current_password’, ‘Your current password is incorrect.’). به اعتبار سنج اضافه میشود.
در اینجا درخواست فرم کامل UpdateProfile ما آمده است.
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

use Illuminate\Support\Facades\Hash;

class UpdateProfile extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
‘name’ => ‘required|string|max:255’,
‘password’ => ‘nullable|required_with:password_confirmation|string|confirmed’,
‘current_password’ => ‘required’,
];
}

/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
// checks user current password
// before making changes
$validator->after(function ($validator) {
if ( !Hash::check($this->current_password, $this->user()->password) ) {
$validator->errors()->add(‘current_password’, ‘Your current password is incorrect.’);
}
});
return;
}
}

مرحله 3 – تنظیم کنترلر
برای استفاده از درخواست فرم ، لازم است که آن را در عملکرد کنترلر خود تایپ کنید.
دستور زیر را برای تولید کنترلر پروفایل انجام دهید.
⦁ $ php artisan make:controller ProfileController

فایل app/Http/Controllers/ProfileController.php را باز کنید و اقدامات کنترلی زیر را اضافه کنید.
public function __construct()
{
$this->middleware(‘auth’);
}

/**
* Show the form for editing the specified resource.
*
* @param \App\User $user
* @return \Illuminate\Http\Response
*/
public function edit(Request $request, User $user)
{
// user
$viewData = [
‘user’ => $user,
];
// render view with data
return view(‘profile.edit’, $viewData);
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\User $user
* @return \Illuminate\Http\Response
*/
public function update(UpdateProfile $request, User $user)
{
// form data
$data = $request->all();
$user->update($data);
return redirect(route(‘profile.edit’, [‘user’ => $user]))
->with(‘info’, ‘Your profile has been updated successfully.’);
}

سازنده کنترلر پروفایل ، میان افزار auth را تنظیم می کند تا مطمئن شود کاربر قبل از ویرایش مشخصات خود وارد شده است.
عملکرد ویرایش با داده های نما ، view را نشان میدهد در حالی که عملکرد به روزرسانی نمایه کاربر را به روز می کند و پیغام فلش مربوط به صفحه نمایه ویرایش را مجدداً برمیگرداند.
به امضای عملکرد ویرایش توجه داشته باشید ، جایی که ما درخواست UpdateProfile را تایپ کرده ایم ، که همه کاری است که باید انجام دهیم تا اعتبارات داخل درخواست فرم UpdateProfile را باطل کنیم.
همچنین باید قبل از اعلام کلاس کنترلر، درخواست فرم و مدل کاربر را مستعار کنید.
use App\Http\Requests\UpdateProfile;
use App\User;

مرحله 4 – تنظیم مسیرهای محافظت شده و جهش های داده
فایل app/routes/web.php را باز کنید و کد زیر را برای اتصال به اقدامات کنترلر اضافه کنید.
Route::get(‘/profile/{user}/edit’, ‘ProfileController@edit’)->name(‘profile.edit’);
Route::put(‘/profile/{user}’, ‘ProfileController@update’)->name(‘profile.update’);

براساس قانون اعتبارسنجی که قبلاً به درخواست فرم خود اضافه کردیم ، امکان عبور رمز عبور null وجود دارد.
تحت هیچ شرایطی کاربر (یا یک توسعه دهنده برنامه) نمی خواهد رمزعبور خود را به صورت تهی یا رشته ای خالی تنظیم کند.
برای اطمینان از اینکه گذرواژه کاربر فقط بعد از وارد کردن توسط آن ها، تنظیم شده است ، قصد داریم از جهش دهنده های Eloquent ORM استفاده کنیم.
فایل app/User.php را باز کنید و کد زیر را اضافه کنید.
// Only accept a valid password and
// hash a password before saving
public function setPasswordAttribute($password)
{
if ( $password !== null & $password !== “” )
{
$this->attributes[‘password’] = bcrypt($password);
}
}

جهش دهنده های فصیح باید از طرح نامگذاری set<camel-cased-attribute-name>Attribute پیروی کنند.
از آنجا که ما در حال اعلام یک جهش دهنده برای ویژگی رمز عبور هستیم ، از این رو جهشگر را setPasswordAttribute نامگذاری کرده ایم.
تابع جهشگر مقدار تعیین شده را منتقل می کند که در جهشگر ما متغیر $password است.
در جهشگر ما ، بررسی می کنیم که آیا متغیر $password null یا یک رشته خالی نباشد و آن را با استفاده از $this->attributes[‘password’] در مدل خود تنظیم می کنیم.
همچنین توجه داشته باشید که گذرواژه قبل از ذخیره کردن hashed شده است ، بنابراین نیازی نیست که آن را در جای دیگری در برنامه خود انجام دهیم.
Auth/RegisterController و Auth/ResetPasswordController پیش فرض Laravel نیز پسورد را قبل از نگهداری آن در دیتابیس دارند، بنابراین باید بعد از اعلام جهش فوق ، روش create  و resetPassword  را در کنترلرهای مربوطه به روز کنیم.
فایل app/Http/Controllers/Auth/RegisterController.php را باز کرده و کد زیر را اضافه کنید.
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
‘name’ => $data[‘name’],
’email’ => $data[’email’],
‘password’ => $data[‘password’],
]);
}

فایل app/Http/Controllers/Auth/ResetPasswordController.php را باز کرده و کد زیر را اضافه کنید.
/**
* Reset the given user’s password.
*
* @param \Illuminate\Contracts\Auth\CanResetPassword $user
* @param string $password
* @return void
*/
protected function resetPassword($user, $password)
{
$user->password = $password;

$user->setRememberToken(Str::random(60));

$user->save();

event(new PasswordReset($user));

$this->guard()->login($user);
}

برای ResetPasswordController ، همچنین باید کلاسهای مربوطه را که قبل از اعلام کلاس استفاده می شود ، مستعار کنید.
use Illuminate\Support\Str;
use Illuminate\Auth\Events\PasswordReset;

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

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

 

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

برچسب‌ها:

  • behnam gol mohamadi