作者选择了 技术教育基金作为 写给捐款计划的一部分接受捐款。
介绍
AdonisJs是用JavaScript(https://en.wikipedia.org/wiki/JavaScript)编写的Node.js(https://nodejs.org/en/)网页框架,在所有主要操作系统上运行,它使用受欢迎的MVC(模型 - 视图 - 控制器)](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)设计模式,并为书写服务器侧 Web 应用程序提供稳定的生态系统。该框架具有无缝的 身份验证,SQL ORM(对象关系地图), 迁移和 数据库种子.AdonisJs具有类似的 PHP Web 应用框架(Laravel](https://laravel.com/),包括相同的文件夹结构和多个共享设置概念。
默认情况下,AdonisJs 使用的是为直观使用而设计的 Edge 模板引擎,与 Laravel 一样,AdonisJs 使用一个名为 Lucid的 ORM,它作为应用程序模型与数据库之间的通信接口。 使用AdonisJs,开发人员可以构建一个完整的应用程序,后端服务器将负责应用业务逻辑、路由和对应用程序的所有页面进行渲染。 还可以创建 Web 服务 API 来返回控制器的 JSON 响应;这些 Web 服务可以使用前端框架,如 Vue.js, React,和 Angular来消耗。
在本教程中,您将使用其 CLI 构建一个应用程序,使用 AdonisJs. 您将在您的应用程序中创建路径,控制器,模型和视图,并进行表单验证。本教程中的示例将是一个鼓舞人心的引用应用程序,用户可以登录并登录创建一个鼓舞人心的引用程序。
前提条件
在您开始本指南之前,您将需要以下内容:
Node.js 是一个 JavaScript 运行时环境,允许您在浏览器之外运行代码。它配有预安装的包管理器,名为 npm,允许您安装和更新包。 若要在 macOS 或 Ubuntu 18.04 上安装这些包,请遵循 如何在 macOS 上安装 Node.js 并创建本地开发环境或 [如何在 Ubuntu 18.04 上安装 Node.js 的 PPA 部分**的 ** 安装]的步骤。 * MySQL 安装在您的机器上。 请遵循 这里下载并安装到您选择的操作系统中。 若要成功地安装 MySQL,您可以通过使用 [Hebrewom] 编辑器在 Mac 上https://code.visualstudio.com/ 安装它。 如何在 Ubuntu 中安装我们的 JavaScript
<$>[注] 注: 本教程使用 macOS 机器进行开发. 如果您正在使用其他操作系统,您可能需要在第一步中使用sudo
用于npm
命令。
步骤 1 – 安装 Adonis CLI
在本节中,您将在本地机器上安装 Adonis CLI及其所有所需的包,该 CLI 将允许您创建一个新的 AdonisJs 项目,并为您的应用程序中控制器,中间件和模型创建和生成锅炉板。
运行以下命令以通过npm
在您的机器上全球安装 AdonisJs CLI:
1npm i -g @adonisjs/cli
一旦安装过程完成,请在终端中输入以下命令,以确认 AdonisJs 的安装并查看当前版本:
1adonis --version
您将看到显示当前版本的 AdonisJs 的输出:
1[secondary_label Output]
24.1.0
随着AdonisJs CLI的成功安装,您现在可以访问并使用adonis
命令创建AdonisJs项目的新安装,管理您的项目,并生成相关文件,如控制器,模型等。
现在,您可以使用adonis
命令来创建一个新的AdonisJs项目,如下所示:
1adonis new adonis-quotes-app
上一个命令将创建一个名为adonis-quotes-app
的应用程序,在您的本地项目目录中创建一个名为adonis-quotes-app
的新目录,并使用相关的 AdonisJs MVC 结构。
移动到新应用程序文件夹:
1cd adonis-quotes-app
然后通过运行开始您的应用程序:
1adonis serve --dev
这将启动开发服务器的默认端口 3333
如在您的应用程序的 root .env
文件中指定。
在这里,您将安装 mysql
驱动程序连接到您的 MySQL 服务器从您的 Node.js 应用程序通过 npm
。
1npm i mysql
现在,您已经成功安装了此应用程序的 MySQL Node.js 驱动程序,您需要创建应用程序数据库并设置相应的连接。
您从前提教程中安装的最新版本的 MySQL 使用一个名为 caching_sha2_password
的默认身份验证插件。 此功能目前不受 MySQL 的 Node.js 驱动程序的支持。 为了避免应用程序中的任何数据库连接问题,您需要创建一个新的 MySQL 用户并使用目前支持的身份验证插件 -mysql_native_password
。
首先,请使用 root 帐户访问 MySQL 客户端:
1mysql -u root -p
您将被要求在 MySQL 安装过程中输入您的 root 帐户密码。
接下来,使用mysql_native_password
插件创建用户和密码:
1CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
您将看到以下结果:
1[secondary_label Output]
2Query OK, 0 rows affected (0.02 sec)
接下来,为应用程序创建一个数据库:
1CREATE DATABASE adonis;
您将看到以下结果:
1[secondary_label Output]
2Query OK, 1 row affected (0.03 sec)
您现在已经成功创建了此应用程序的数据库。
现在,为新 MySQL 用户启用访问创建的数据库,运行以下命令,向数据库中的用户授予所有权限:
1GRANT ALL PRIVILEGES ON adonis.* TO 'sammy'@'localhost';
通过运行以下命令重新加载授权表,以应用您刚刚做的更改:
1FLUSH PRIVILEGES;
您将看到以下结果:
1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)
退出 MySQL 客户端:
1quit;
你已经成功安装了AdonisJs CLI,创建了一个新的AdonisJs项目,并通过npm
安装了mysql
。你还创建了这个应用程序的数据库,并为它设置了一个MySQL用户,具有相应的特权。
第2步:使用边缘模板引擎
AdonisJs配备了自己的模板引擎,名为 Edge。它允许您创建可重复使用的HTML模板,并允许在最少的代码下将前端逻辑引入您的应用程序。Edge为JavaScript开发人员提供开发应用程序时的工具,以构建基于组件的布局,写条件,使用迭代,并创建视图层以保持逻辑。
以下是您的应用程序需要正常运作的观点:
- 主布局 :使用Edge,您可以创建一个包含CSS、常见JavaScript文件、jQuery和常见用户界面部分的页面,这些页面将在整个应用程序中保持相同,例如导航栏、标志、标题等:一旦您设置了主布局页面,您的应用程序中的其他视图(页面)将继承它。 * ** 索引视图** :本页面将使用主布局来继承常见文件,并还会为应用程序的首页提供内容。 * ** 登录页面** :本页面还将使用主布局,并将该表单与用户登录的用户名和密码的输入字段进行渲染。 * ** 登录页面:在这里,用户将看到一个表单,并将其详细信息存储在数据库中。 *
首先,使用adonis
命令创建主布局页,运行以下命令:
1adonis make:view layouts/master
您将看到类似于以下的输出:
1[secondary_label Output]
2✔ create resources/views/layouts/master.edge
此命令将自动在您的资源/视图/布局
文件夹中创建一个master.edge
文件。
1nano resources/views/layouts/master.edge
把以下代码插入其中:
1[label /resources/views/layouts/master.edge]
2<!DOCTYPE html>
3<html lang="en">
4<head>
5 <meta charset="UTF-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
7 <meta http-equiv="X-UA-Compatible" content="ie=edge">
8 <title>adonis-quotes-app</title>
9 {{ style('https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css') }}
10 {{ style('style') }}
11 {{ script('https://code.jquery.com/jquery-3.3.1.slim.min.js') }}
12</head>
13<body>
14 <div class="container-fliud">
15 @include('navbar')
16 @!section('content')
17 </div>
18 {{ script('https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js') }}
19
20</body>
21</html>
在此檔案中,你包括了 Bootstrap CSS, Bootstrap JavaScript,和 jQuery的 CDN 檔案。你添加了「style.css」的全球 CSS 檔案名稱,而在「div」中,你包括了一個名為「navbar」的 partial 檔案。要在你的應用程式中複數頁面中重複使用你需要的 HTML 代碼片段,例如「nav」或「footer」,你可以嵌入部分檔案。這些是包含重複代碼的小檔案,讓您更快地更新這些元素的代碼,而不是每次發生。「navbar」包含一個 Login 和 ** Register** 按鈕,一個標誌和一個主頁連結。
有了这一点,将为此应用程序创建的所有后续页面可以扩展主布局,并在不需要重新写内容的情况下渲染navbar
。
最后,您定义一个部分标签 @!section()
以包括来自其他页面的内容,并让它们通过主布局进行渲染。
保存和退出文件,一旦你完成编辑它。
接下来,您将使用adonis
命令创建导航栏:
1adonis make:view navbar
你会看到类似的输出:
1[secondary_label Output]
2✔ create resources/views/navbar.edge
打开新创建的文件:
1nano resources/views/navbar.edge
然后添加以下代码:
1[label /resources/views/navbar.edge]
2<nav class="navbar navbar-expand-lg navbar-dark text-white">
3 <a class="navbar-brand" >LOGO</a>
4 <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
5 <span class="navbar-toggler-icon"></span>
6 </button>
7
8 <div class="collapse navbar-collapse" id="navbarNav">
9 <ul class="navbar-nav">
10 <li class="nav-item active ">
11 <a class="btn text-white" href="/">Home</a>
12 </li>
13 </ul>
14 </div>
15 <div class="navbar-right" id="navbarNav">
16 @loggedIn
17 <ul class="navbar-nav">
18 <li>
19 <div class="text-right">
20 <a href="{{route('create.quote')}}" class="btn btn-outline-primary">Create Quote</a>
21 </div>
22 </li>
23
24 <li class="nav-item dropdown">
25 <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
26 {{ auth.user.username}}
27 </a>
28 <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
29 <form method="POST" action="{{route('logout')}}">
30 {{ csrfField() }}
31 <button type="submit" class="dropdown-item" href="">logout</button>
32 </form>
33 </div>
34 </li>
35 </ul>
36 @else
37 <ul class="navbar-nav">
38 <li class="nav-item active pr-2">
39 <a href="{{route('login.create')}}" class="btn btn-outline-danger">
40 login
41 </a>
42 </li>
43 <li class="nav-item active pr-2">
44 <a href="{{route('register.create')}}" class="btn btn-outline-primary">
45 Register
46 </a>
47 </li>
48 </ul>
49 @endloggedIn
50 </div>
51</nav>
除了定义主页的链接和注册和登录按钮外,您还添加了一个@loggedIn
标签。在此处,您可以写一个有条件的声明,围绕被验证的用户,并在必要时显示适当的内容。对于被验证的用户,应用程序将显示他们的用户名和创建新报价的按钮。如果用户没有登录,您的应用程序将显示一个按钮,以登录或注册。此页面将被列入每个页面的一部分,就像以前在该应用程序的主布局中一样。
保存和退出文件。
现在,你将创建你将用于应用程序的主页的索引页面. 它将渲染和显示用户写的所有鼓舞人心的引文列表:
1adonis make:view index
您将看到类似于以下的输出:
1[secondary_label Output]
2✔ create resources/views/index.edge
这里创建的文件将位于资源/视图/index.edge
。
1nano resources/views/index.edge
然后添加以下代码:
1[label /resources/views/index.edge]
2@layout('layouts/master')
3@section('content')
4
5<div class="container">
6 <div class="text-center">
7 @if(flashMessage('successmessage'))
8 <span class="alert alert-success p-1">{{ flashMessage('successmessage') }}</span>
9 @endif
10 </div>
11 <div class="row">
12 @each(quote in quotes)
13 <div class="col-md-4 mb-4 quote-wrapper">
14 <a href="/view-quote/{{quote.id}}" class="w-100">
15 <div class="card shadow-lg bg-dark text-white">
16 <div class="card-body">
17 <blockquote class="blockquote mb-0">
18 <p>{{quote.body}}</p>
19 <footer class="blockquote-footer">
20 <cite title="Source Title"> {{quote.username}}</cite>
21 </footer>
22 </blockquote>
23 @if(auth.user.id == quote.user_id)
24 <div>
25 <a href="/edit-quote/{{quote.id}}" class="btn btn-primary">edit</a>
26 <a href="/delete-quote/{{quote.id}}" class="btn btn-danger">delete</a>
27 </div>
28 @endif
29 </div>
30 </div>
31 </a>
32 </div>
33 @else
34 <div class="col-md-12 empty-quote text-center">
35 <p>No inspirational quote has been created</p>
36 </div>
37 @endeach
38 </div>
39</div>
40@endsection
在这里,您表示此视图将通过扩展使用主
布局。此页面现在可以访问包含在主
布局中的所有库、风格表和navbar
。接下来,您会使用内置的@each
标签重复使用一系列的引文
。引文
布局将从您在本教程中稍后创建的QuoteController
传递到此视图。如果没有引文,将显示适当的消息。
保存和退出此文件。
现在,要创建登录页面,请从终端执行以下命令:
1adonis make:view auth/login
你会看到一个类似的输出:
1[secondary_label Output]
2✔ create resources/views/auth/login.edge
这将自动在资源/视图
中创建一个auth
文件夹,并在其中创建一个login.edge
文件。
1nano resources/views/auth/login.edge
添加以下内容:
1[label /resources/views/auth/login.edge]
2@layout('layouts/master')
3@section('content')
4 <div class="container">
5 <div class="row">
6 <div class="col-md-4 shadow bg-white mt-5 rounded offset-md-4">
7 <form method="POST" action="{{route('login.store')}}">
8 {{ csrfField() }}
9 <div>
10 @if(flashMessage('successmessage'))
11 <span class="alert alert-success p-1">{{ flashMessage('successmessage') }}</span>
12 @endif
13 </div>
14 <div class="form-group">
15 <label for="email">Email address</label>
16 <input type="email" class="form-control" id="email" name="email" value="{{old('email','')}}" placeholder="Enter email">
17 {{ elIf('<span class=text-danger>$self</span>', getErrorFor('email'), hasErrorFor('email')) }}
18 </div>
19 <div class="form-group">
20 <label for="pasword">Password</label>
21 <input type="password" class="form-control" id="password" name="password" value="{{old('password','')}}" placeholder="Password">
22 {{ elIf('<span class=text-danger>$self</span>', getErrorFor('password'), hasErrorFor('password')) }}
23 </div>
24
25 <div class="text-center">
26 <button type="submit" class="btn btn-primary">Submit</button>
27 </div>
28 </form>
29 </div>
30 </div>
31 </div>
32@endsection
该文件包含一个包含输入元素的表单,您将使用它来收集注册用户的用户名和密码,然后他们可以成功验证并开始创建报价。在本页面上需要注意的另一个重要元素是{{ csrfField() }}
。
它通过为每个访问您的网站的用户生成一个独特的CSRF秘密,一旦您的用户从前端发送了HTTP请求,将为此秘密生成相应的代币,并与请求一起传递。
保存和退出文件一旦完成。
接下来,您将使用此命令创建注册表页面:
1adonis make:view auth/register
您将看到类似于此的输出:
1[secondary_label Output]
2✔ create resources/views/auth/register.edge
在resources/views/auth/register.edge
中找到并打开新创建的文件:
1nano resources/views/auth/register.edge
添加以下代码:
1[label resources/views/auth/register.edge]
2@layout('layouts/master')
3@section('content')
4 <div class="container ">
5 <div class="row">
6 <div class="col-md-4 bg-white p-3 mt-5 shadow no-border rounded offset-md-4">
7 <form method="POST" action="{{route('register.store')}}">
8 {{ csrfField() }}
9 <div class="form-group">
10 <label for="name">Fullname</label>
11 <input type="text" class="form-control" id="name" name="name" value="{{old('name','')}}" placeholder="Enter Fullname">
12 {{ elIf('<span class=text-danger>$self</span>', getErrorFor('name'), hasErrorFor('name')) }}
13 </div>
14 <div class="form-group">
15 <label for="email">Email address</label>
16 <input type="email" class="form-control" id="email" name="email" value="{{old('email','')}}" placeholder="Enter email">
17 {{ elIf('<span class=text-danger>$self</span>', getErrorFor('email'), hasErrorFor('email')) }}
18 </div>
19 <div class="form-group">
20 <label for="pasword">Password</label>
21 <input type="password" class="form-control" id="password" name="password" placeholder="Password">
22 {{ elIf('<span class=text-danger>$self</span>', getErrorFor('password'), hasErrorFor('password')) }}
23 </div>
24 <div class="text-center">
25 <button type="submit" class="btn btn-primary">Submit</button>
26 </div>
27 </form>
28 </div>
29 </div>
30 </div>
31@endsection
类似于你在登录页面上,这个文件包含一个HTML表格,包含输入字段来收集用户在注册过程中的名称
,电子邮件
和密码
。
保存和退出文件。
现在,您将生成一个新的文件,通过从终端运行以下命令来创建一个鼓舞人心的报价:
1adonis make:view quotes/create-quote
你会看到这样的输出:
1[secondary_label Output]
2✔ create resources/views/quotes/create-quote.edge
打开资源/观点/引用/create-quote.edge
:
1nano resources/views/quotes/create-quote.edge
并添加以下内容:
1[label /resources/views/quotes/create-quote.edge]
2@layout('layouts/master')
3@section('content')
4<div class="container">
5 <div class="row">
6 <div class="col-md-3"></div>
7 <div class="col-md-6 shadow bg-white mt-5 rounded p-3">
8 <div class="float-right">
9 <a href="/" class="btn btn-outline-dark ">back</a>
10 </div>
11 <br>
12
13 <div class="clear-fix"></div>
14 <form method="POST" action="{{route('store.quote')}}">
15 {{ csrfField() }}
16 <div class="form-group">
17 <label for="quote">Create Quote</label>
18 <textarea type="text" rows="5" name='body' id="body" class="form-control" id="quote" placeholder="Write an inspirational quote"></textarea>
19 </div>
20
21 <div class="text-center">
22 <button type="submit" class="btn btn-primary">Submit</button>
23 </div>
24 </form>
25 </div>
26 </div>
27 <div class="col-md-3"></div>
28 </div>
29</div>
30@endsection
此页面扩展了主布局,并包含一个HTML表格,包含一个文本区域元素,允许用户在发布并处理相应路径之前在多个行内输入文本。
保存和退出文件一旦完成。
接下来,您将创建一个页面来编辑特定的报价,从终端执行以下命令:
1adonis make:view quotes/edit-quote
您将看到以下结果:
1[secondary_label Output]
2✔ create resources/views/quotes/edit-quote.edge
打开文件与:
1nano resources/views/quotes/edit-quote.edge
将下列内容添加到资源/观点/引文/编辑引文
中:
1[label /resources/views/quotes/edit-quote.edge]
2@layout('layouts/master')
3@section('content')
4<div class="container">
5 <div class="row">
6 <div class="col-md-6 shadow bg-white rounded p-3 offset-md-3">
7 <div class="float-right">
8 <a href="/" class="btn btn-outline-dark ">back</a>
9 </div>
10 <br>
11
12 <div class="clear-fix"></div>
13 <form method="POST" action="/update-quote/{{quote.id}}">
14 {{ csrfField() }}
15 <div class="form-group">
16 <label for="pasword">Edit Quote</label>
17 <textarea type="text" rows="5" name='body' id="body" class="form-control" id="quote" placeholder="write the inspirational quote">{{quote.body}}</textarea>
18 </div>
19 <div class="text-center">
20 <button type="submit" class="btn btn-primary">Update</button>
21 </div>
22
23 </form>
24 </div>
25 </div>
26</div>
27@endsection
此页面包含类似于 create-quote.edge
文件的内容 - 区别在于它包含需要编辑的特定引文的详细信息, `