Flutter服务器端集成插件dart_server_plus的使用

Flutter服务器端集成插件dart_server_plus的使用

dart_server_plus 是一个功能强大的对象关系映射(ORM)库,专为 Dart 编程语言设计,旨在简化服务器端开发和数据库管理。它提供了丰富的功能集,用于创建和管理服务器、连接数据库以及处理各种数据操作。支持 MySQL 和 PostgreSQL 数据库,使您可以轻松构建高效且可扩展的应用程序。

关键特性

dart_server_plus 提供了一系列功能,简化了服务器端编程和数据库交互:

  • 服务器创建与管理:快速设置并配置服务器以处理传入的 HTTP 请求。
  • 模式定义:定义并强制执行字段类型和约束。
  • 数据库连接:无缝连接到 MySQL 和 PostgreSQL 数据库,并支持安全认证。
  • CRUD 操作:简化记录的创建、检索、更新和删除。
  • 高级查询:支持复杂查询,包括分页、排序和过滤。
  • 关系管理:通过嵌套查询和包含选项轻松处理相关数据。
  • 日志记录:可选的日志记录功能,用于监控 SQL 查询和调试问题。

安装

要将 dart_server_plus 集成到您的 Dart 项目中,请按照以下步骤操作:

  1. 打开 pubspec.yaml 文件并在 dependencies 下添加 dart_server_plus
dependencies:
  dart_server_plus: ^1.0.0
  1. 运行 flutter pub get 命令以安装依赖项。

快速开始

创建服务器

使用 dart_server_plus 创建服务器涉及实例化 Server 类并配置其监听传入连接。以下是一个基本示例:

import 'package:dart_server_plus/dart_server_plus.dart';

void main() {
  // 实例化服务器
  Server server = Server();

  // 开始监听指定端口
  server.listen(
    port: 8080,
    callback: () {
      print("服务器正在监听端口 8080");
    },
  );
}

在这个示例中,服务器监听端口 8080。您可以根据需要自定义端口号或其他配置。

定义模式

模式定义了数据库表的结构,包括字段、数据类型和约束。以下是如何为 users 表定义模式的示例:

Schema userSchema = Schema(
  table: "users",
  fields: {
    "id": {
      "type": DataType.SERIAL(),
      "primaryKey": true,
    },
    "username": {
      "type": DataType.STRING(50),
      "unique": true,
      "allowNull": false,
    },
    "first_name": DataType.STRING(50),
    "last_name": DataType.STRING(50),
    "gender": DataType.STRING(10),
    "email": {
      "type": DataType.STRING(100),
      "unique": true,
      "allowNull": false,
    },
    "verify": {
      "type": DataType.BOOLEAN(),
      "default": "FALSE",
      "allowNull": false,
    }
  },
);

此模式定义了 users 表的结构,指定了每个字段的类型和约束。例如,username 是必需字段,并具有唯一性约束。

连接到数据库

要连接到 PostgreSQL 或 MySQL 数据库,您需要配置数据库客户端并提供凭据和连接详细信息。以下是 PostgreSQL 的示例:

PostgresClient client = PostgresClient(
  host: 'localhost',
  database: 'test',
  userName: 'postgres',
  password: '123456'
);
await client.connect();

请将占位符值替换为您实际的数据库主机、数据库名称、用户名和密码。

初始化 DartServerPlus

一旦您定义了模式并建立了数据库连接,就可以初始化 DartServerPlus 并同步数据库模式:

DartServerPlus dartServerPlus = DartServerPlus(client: client, schemas: [userSchema], logging: true);
await dartServerPlus.sync(syncTable: true);

此代码初始化了 DartServerPlus,并使用数据库客户端和模式进行同步。syncTable 参数确保现有表被更新或重新创建。

注册路由并执行 CRUD 操作

使用 dart_server_plus,您可以轻松设置路由以处理不同类型的 HTTP 请求。以下是一些执行 CRUD 操作的示例。

插入新记录

处理 POST 请求以插入新记录:

userRouter.post("/insert", (req, res) async {
  var data = await DartServerPlus.insert(
    table: "users",
    returning: true,
    data: {
      "username": "test",
      "first_name": "Test",
      "last_name": "User",
      "email": "test@mailinator.com",
      "gender": "male",
      "verify": false,
    },
  );
  return res.json({'data': data});
});

此路由向 users 表插入一条新用户记录,并返回插入的数据。

删除记录

处理 DELETE 请求以删除记录:

userRouter.delete("/delete", (req, res) async {
  var data = await DartServerPlus.delete(
    table: "users",
    returning: true,
    where: {'id': 1}
  );
  return res.json({'data': data});
});

此路由删除指定 ID 的用户记录,并返回删除的结果。

更新现有记录

处理 PATCH 请求以更新现有记录:

userRouter.patch("/update", (req, res) async {
  var data = await DartServerPlus.update(
    table: "users",
    returning: true,
    data: {'verify': true}
  );
  return res.json({'data': data});
});

此路由更新 users 表中 verify 字段的值,并返回更新后的数据。

获取所有记录

处理 GET 请求以获取所有记录:

userRouter.get("/all", (req, res) async {
  var data = await DartServerPlus.findAll(table: "users");
  return res.json({'data': data});
});

此路由从 users 表中检索所有用户记录,并将其返回在响应中。

高级查询功能

dart_server_plus 提供了一系列高级查询功能以满足复杂的查询需求。

计数记录

计算表中的记录总数:

var data = await DartServerPlus.count(table: "users");

此查询返回 users 表中的总记录数。

获取特定字段

仅检索表中的特定字段:

var data = await DartServerPlus.findAll(
  table: "users",
  fields: ['id', 'first_name', 'last_name']
);

此查询仅从 users 表中检索 idfirst_namelast_name 字段。

分页和排序

应用分页和排序到查询中:

var data = await DartServerPlus.findAncCountAll(
  table: "users",
  limit: 10,
  offset: 0,
  order: {'id': false}
);

此查询按每页 10 条记录进行分页,并按 id 字段降序排列。

筛选结果

对查询应用筛选条件:

var data = await DartServerPlus.findAncCountAll(
  table: "users",
  where: {
    Op.lte: {'id': 10},
    'gender': 'male'
  }
);

此查询筛选出 id 小于或等于 10 且性别为男性的记录。

包含相关表

在查询中包含相关表:

var data = await DartServerPlus.findAncCountAll(
  table: "users",
  include: [{'table': 'address'}]
);

此查询包含与 users 表相关的 address 表中的数据。

性能考虑

在处理大数据集时,考虑以下提示以优化性能:

  • 索引:确保数据库表上经常查询的字段有适当的索引,以加速搜索操作。
  • 分页:使用分页来限制单个查询中检索的数据量,提高性能并减少内存使用。
  • 查询优化:分析并优化 SQL 查询以确保它们高效执行。
  • 连接池:使用连接池以有效管理数据库连接,减少建立新连接的开销。

完整示例代码

以下是一个完整的示例代码,展示了如何使用 dart_server_plus 构建一个简单的服务器并执行 CRUD 操作:

import 'package:dart_server_plus/dart_server_plus.dart';

const bool sync = false;
const int port = 5555;

void main() async {
  try {
    Server server = Server();

    PostgresClient client = PostgresClient(
      host: 'localhost',
      database: 'test',
      userName: 'postgres',
      password: "Dharmesh@123"
    );
    await client.connect();

    DartServerPlus orm = DartServerPlus(client: client, schemas: [userSchema], logging: true);
    await orm.sync(syncTable: sync);

    Router userRouter = Router(endPoint: '/users');

    userRouter.post("/insert", (req, res) async {
      var data = await orm.insert(
        table: "users",
        returning: true,
        data: {
          "username": "test",
          "first_name": "Test",
          "last_name": "User",
          "email": "test@mailinator.com",
          "gender": "male",
          "verify": false,
        },
      );
      return res.json({'data': data});
    });

    userRouter.delete("/delete", (req, res) async {
      var data = await orm.delete(table: "users", returning: true, where: {'id': 1});
      return res.json({'data': data});
    });

    userRouter.patch("/update", (req, res) async {
      var data = await orm.update(table: "users", returning: true, data: {'verify': true});
      return res.json({'data': data});
    });

    userRouter.get("/all", (req, res) async {
      var data = await orm.findAncCountAll(table: "users");
      return res.json({'data': data});
    });

    server.registerRouters([userRouter]);

    server.get("/", (req, res) async {
      return res.write("服务器运行正常。");
    });

    server.onError((error, res) {
      res.json({'error': error.toString()});
    });

    server.listen(
      port: port,
      callback: () {
        print("服务器正在监听端口 $port");
      },
    );
  } catch (e) {
    print("异常: ${e.toString()}");
  }
}

Schema userSchema = Schema(
  table: "users",
  fields: {
    "id": {
      "type": DataType.SERIAL(),
      "primaryKey": true,
    },
    "username": {
      "type": DataType.STRING(50),
      "unique": true,
      "allowNull": false,
    },
    "first_name": DataType.STRING(50),
    "last_name": DataType.STRING(50),
    "gender": DataType.STRING(10),
    "email": {
      "type": DataType.STRING(100),
      "unique": true,
      "allowNull": false,
    },
    "verify": {
      "type": DataType.BOOLEAN(),
      "default": "FALSE",
      "allowNull": false,
    }
  },
);

更多关于Flutter服务器端集成插件dart_server_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter服务器端集成插件dart_server_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dart_server_plus 是一个用于在 Flutter 项目中快速构建服务器端的插件。它基于 shelf 框架,提供了简单易用的 API 来创建 HTTP 服务器。以下是如何在 Flutter 项目中使用 dart_server_plus 的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 dart_server_plus 依赖:

dependencies:
  dart_server_plus: ^1.0.0

然后运行 flutter pub get 来安装依赖。

2. 创建服务器

接下来,你可以创建一个简单的 HTTP 服务器。以下是一个基本的示例:

import 'package:dart_server_plus/dart_server_plus.dart';

void main() async {
  // 创建一个服务器实例
  final server = Server();

  // 添加路由
  server.get('/', (Request request) {
    return Response.ok('Hello, World!');
  });

  server.post('/echo', (Request request) async {
    final body = await request.readAsString();
    return Response.ok('You sent: $body');
  });

  // 启动服务器
  await server.start(port: 8080);
  print('Server is running on http://localhost:8080');
}

3. 运行服务器

你可以直接在命令行中运行这个 Dart 文件:

dart bin/server.dart

服务器将会在 http://localhost:8080 上运行。

4. 测试服务器

你可以使用 curl 或者浏览器来测试服务器:

  • 访问根路径:

    curl http://localhost:8080
    

    输出:

    Hello, World!
    
  • 发送 POST 请求:

    curl -X POST -d "Hello, Server!" http://localhost:8080/echo
    

    输出:

    You sent: Hello, Server!
    

5. 更多功能

dart_server_plus 还支持更多的功能,例如:

  • 中间件:你可以添加中间件来处理请求和响应。
  • 路由参数:你可以使用路由参数来捕获 URL 中的动态部分。
  • 静态文件服务:你可以使用 server.static 方法来提供静态文件服务。

以下是一个使用中间件和路由参数的示例:

import 'package:dart_server_plus/dart_server_plus.dart';

void main() async {
  final server = Server();

  // 添加中间件
  server.use((Request request, NextHandler next) async {
    print('Request received: ${request.method} ${request.url}');
    return next(request);
  });

  // 使用路由参数
  server.get('/user/:id', (Request request) {
    final userId = request.params['id'];
    return Response.ok('User ID: $userId');
  });

  // 提供静态文件服务
  server.static('/public', 'path/to/static/files');

  await server.start(port: 8080);
  print('Server is running on http://localhost:8080');
}
回到顶部