Dart 服务端开发(一)- 环境搭建、数据库安装

2,974 阅读4分钟

前言

由来

最近在写自己的一些个人项目的时候老需要一些后台接口,笔者之前一直是通过 bmob 或者 leancloud 来快速获得一份带基本功能的接口,一直考虑学一门后台,起初尝试过 python 的 flask ,体验也还不错,由于平时作为 Flutter 开发者,写得最多的语言还是 dart ,所以才想着尝试用 dart 来写客户端对应的后台接口。 整个学习目前花费两天。

感知

目前大部分的人对 dart 的后台还是存疑,可能大部分的焦点在于,

  • 默认只支持 get,put,put,delete
  • 默认数据库是 postgres 我在知乎等地方得到的评价是:不成熟,不适合大型项目,小项目就不顾及了。

选用框架

  • aqueduct

使用 dart 环境

Dart SDK version: 2.10.4 (stable) (Wed Nov 11 13:35:58 2020 +0100) on "macos_x64"

实现需求

  • 账号注册、登录
  • 标准的 OAuth2.0 token验证。
  • swagger 文档生成。

本篇不会涉及具体实战 提示:笔者不会细讲各部分的原理,只会从笔者这边的思路分享上手开发的经验

开始使用

安装环境

在终端执行

pub global activate aqueduct

一般不会有什么问题,但会出现一个警告。

通常是添加以下环境变量即可解决。

export PATH="$PATH":"$HOME/.pub-cache/bin"

创建项目

aqueduct create example

项目结构

.
├── README.md
├── analysis_options.yaml
├── bin
│   └── main.dart
├── config.src.yaml
├── config.yaml
├── lib
│   ├── channel.dart
│   └── example.dart
├── pubspec.yaml
└── test
    ├── example_test.dart
    └── harness
        └── app.dart

bin/main.dart自然作为整个项目的运行入口,主要的代码在lib/channel.dart

更改配置文件(可选)

config.yaml

port: 8000

port 则为运行监听的端口号。

启动服务

运行 dart bin/main.dart或者aqueduct serve

这里有个 bug,即使我们在 yaml 中改了端口号,运行aqueduct serve还是会显示当前端口在8888,但实际生效的是我们具体设置的。

在程序中切换端口

Future main() async {
  final app = Application<ServerChannel>()
    ..options.configurationFilePath = "config.yaml"
    ..options.port = 8000;
}

测试接口

用浏览器或者 postman 访问http://127.0.0.1:$port/example

安装数据库

打开官网www.postgresql.org/

下载对应平台的数据库,笔者是 mac,下载后长这样

双击其中某个数据库会打开终端,默认有那个 postgres,双击它,然后输入\password可以更改密码。

或者通过brew安装

brew install postgresql

apt安装

apt install postgresql

启动数据库服务

mac命令版

brew services start postgresql

mac图形版

直接点图形界面的start然后后台。

ubuntu

/etc/init.d/postgresql start

或者

pg_ctl start  

使用Navicat Premium连接数据库

点左上角连接按钮,然后选 postgresql,下面的是默认就有的,直接连。

Navicat 的使用不细讲了

新建一个实体类

普通实体类

class Server extends ManagedObject<_Server> implements _Server {
  Server() {}
}
class _Server {
  @Column(
    primaryKey: true,
  )
  int userId;
  @Column(
    databaseType: ManagedPropertyType.string,
  )
  String serversBase64;
}

支持 OAuth2.0 验证的实体类


class User extends ManagedObject<_User>
    implements _User, ManagedAuthResourceOwner<_User> {
  User() {
    mobile ??= '';
    qq ??= '';
    role ??= 1;
    salt ??= '';
  }
}

class _User extends ResourceOwnerTableDefinition {
  @override
  @primaryKey //作为主键 == @
  int id;
  String password;
  String mobile;
  String qq;
  @Column(unique: true, nullable: true) //添加索引
  String email;
  int role;

  @Column(indexed: true) //添加索引
  DateTime createDate;
}

这两个实体类会对应两张表,一张是用户表,主键为 id ,这个 id 由注解代码 @primaryKey规定为自增,另一张是跟用户有关的一个自定义表,自定义表的主键为用户表用户数据的 id。

另外可使用注解 @Column来规定限制表中的数据,unique: true代表这个值在整个表中唯一, nullable: true表示可空,都是字面意思。

初始化迁移文件

不清楚这个说法是不是不太妥

先在 channel.dart 导入上面的实体类

修改配置文件database.yaml

username: postgres
password: ***
host: localhost
port: 5432
databaseName: postgres

执行aqueduct db generate

执行后会有文件生成到 migrations/00000001_initial.migration.dart 。

生成的坑

在 dart2.8 以后有一个重大改动会导致这个代码生成器异常。

在 yaml 中加入以下代码即可解决,比起降级 dart 版本,官方也更推荐这个做法。

dependency_overrides:
  postgres: 2.1.1

映射到数据库

执行pub run aqueduct db upgrade,注意aqueduct db upgrade在 dart 版本2.8之后会失败。

执行结束去Navicat查看会发现表的结构已经有了。 数据库的新建是在Navicat右键左上角已连接的数据库

好了,第一篇到这。