前言
由来
最近在写自己的一些个人项目的时候老需要一些后台接口,笔者之前一直是通过 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
安装数据库
下载对应平台的数据库,笔者是 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
右键左上角已连接的数据库
好了,第一篇到这。