#surrealdb #leptos #cli

app ultime

终极全栈体验

5 个版本

0.0.5 2023 年 7 月 6 日
0.0.4 2023 年 6 月 25 日
0.0.3 2023 年 6 月 18 日
0.0.2 2023 年 6 月 18 日
0.0.1 2023 年 6 月 17 日

#1459命令行工具

每月 43 次下载

MIT 许可证

115KB
3K SLoC

Crates.io GitHub Workflow Status GitHub codecov

Ultime

终极全栈体验。

警告 此项目处于早期预览阶段。

此项目可作为 CLI 使用

cargo install ultime

架构

此项目包含以下技术栈的功能,可为您提供更快、更好的开发工作流程:

主要功能是基于您的 SurrealDB 架构和查询自动生成代码。Ultime 项目应如下所示

  • /schemas · 来自 surrealdb-migrations 的 schemas 文件夹
  • /events · 来自 surrealdb-migrations 的 events 文件夹
  • /migrations · 来自 surrealdb-migrations 的 migrations 文件夹
  • /queries · 包含项目特定查询的 .surql 文件列表(仅获取数据)
  • /mutations · 包含项目特定变更的 .surql 文件列表(更改数据)
  • /src
    • /api · API 端点列表
    • /components · 可在任何地方使用的组件列表
    • /db
      • /crud · 来自 /schemas 文件的基本 CRUD 操作函数
      • /events · 执行 SurrealDB 事件的函数,来自 /events 文件
      • /mutations · 更新数据库的函数,来自 /mutations 文件
      • /queries · 查询数据库的函数,来自 /queries 文件
    • /models · 应用中使用的结构体列表
      • queries.rs · 来自 /queries 文件的每个查询的响应类型(此文件目前未自动生成)
      • mutations.rs · 来自 /mutations 文件的每个变更的响应类型(此文件目前未自动生成)
    • /pages · 可用作路由的高阶组件列表

开始使用

首先,您需要使用 预定义模板之一 创建一个新项目。例如

ultime new my-blog --template blog

将创建一个新目录。您可以使用 cd 命令进入此新目录并运行以下命令

ultime

此命令将

  • 启动新的SurrealDB本地实例
  • 自动应用模式和迁移
  • /schemas/events/queries/mutations文件夹生成db模块
  • 启动leptos应用

自动生成模型代码

目前,无法自动检测.surql文件的输出:queriesmutations。然而,会自动为您生成一个类型,您只需定义该类型的属性。所有模型都应定义在/src/models文件夹中。

以下是从/queries/posts.surql查询响应中的模型定义示例

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PostsQueryItem {
    pub id: String,
    pub title: String,
    pub content: String,
    pub status: String,
    pub number_of_comments: u16,
}

pub type PostsQuery = Vec<PostsQueryItem>;

以下是从/mutations/comment.surql查询响应中的另一个示例

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CommentMutationItem {
    pub id: String,
    pub content: String,
}

pub type CommentMutation = Vec<CommentMutationItem>;

查询/突变变量提取

为了区分内部变量和输入变量,我们制定了一个模式来成功提取查询和突变变量。

以下是一个突变...

// $user_id: String
// $post_id: Option<String>
// $comment_id: Option<String>
// $content: String

LET $user = (SELECT * FROM type::thing("user", $user_id));

LET $post_or_comment = (SELECT * FROM type::thing("post", $post_id), type::thing("comment", $comment_id));

RELATE $user->comment->$post_or_comment
SET content = $content;

...将生成此函数

pub async fn mutate_comment<C: Connection>(
    db: &'_ Surreal<C>,
    user_id: String,
    post_id: Option<String>,
    comment_id: Option<String>,
    content: String
) -> Result<CommentMutation> {
    const QUERY: &str = include_str!("../../../mutations/comment.surql");

    let result: CommentMutation =  db
        .query(QUERY)
        .bind(("user_id", user_id))
        .bind(("post_id", post_id))
        .bind(("comment_id", comment_id))
        .bind(("content", content))
        .await?
        .take(0)?;

    Ok(result)
}

如您所见,注释应遵循规则

  • 每行只能有一个变量
  • 它应以变量名开头(不要忘记$前缀)
  • 然后跟一个冒号:
  • 然后它应以变量类型结束
  • 空白符可根据您的编码约定使用

预定义模板

为了帮助您快速入门,这里有一系列您可以使用的预定义模板

模板 描述
您可以创建的最小ultime项目。
一个干净的架构,已定义script_migration表以存储应用迁移。
一个基本的leptos应用,带有一个计数器示例。
博客 一个博客应用:创建新的博客文章,发布/取消发布文章和评论。

您可以使用以下命令行创建一个新的ultime项目

ultime new <PROJECT_NAME> --template <TEMPLATE>

依赖关系

~67MB
~1M SLoC