跳转到主要内容

标签(标签)

资源精选(342) Go开发(108) Go语言(103) Go(99) angular(82) LLM(75) 大语言模型(63) 人工智能(53) 前端开发(50) LangChain(43) golang(43) 机器学习(39) Go工程师(38) Go程序员(38) Go开发者(36) React(33) Go基础(29) Python(24) Vue(22) Web开发(20) Web技术(19) 精选资源(19) 深度学习(19) Java(18) ChatGTP(17) Cookie(16) android(16) 前端框架(13) JavaScript(13) Next.js(12) 安卓(11) 聊天机器人(10) typescript(10) 资料精选(10) NLP(10) 第三方Cookie(9) Redwoodjs(9) LLMOps(9) Go语言中级开发(9) 自然语言处理(9) PostgreSQL(9) 区块链(9) mlops(9) 安全(9) 全栈开发(8) ChatGPT(8) OpenAI(8) Linux(8) AI(8) GraphQL(8) iOS(8) 软件架构(7) Go语言高级开发(7) AWS(7) C++(7) 数据科学(7) whisper(6) Prisma(6) 隐私保护(6) RAG(6) JSON(6) DevOps(6) 数据可视化(6) wasm(6) 计算机视觉(6) 算法(6) Rust(6) 微服务(6) 隐私沙盒(5) FedCM(5) 语音识别(5) Angular开发(5) 快速应用开发(5) 提示工程(5) Agent(5) LLaMA(5) 低代码开发(5) Go测试(5) gorm(5) REST API(5) 推荐系统(5) WebAssembly(5) GameDev(5) CMS(5) CSS(5) machine-learning(5) 机器人(5) 游戏开发(5) Blockchain(5) Web安全(5) Kotlin(5) 低代码平台(5) 机器学习资源(5) Go资源(5) Nodejs(5) PHP(5) Swift(5) 智能体(4) devin(4) Blitz(4) javascript框架(4) Redwood(4) GDPR(4) 生成式人工智能(4) Angular16(4) Alpaca(4) 编程语言(4) SAML(4) JWT(4) JSON处理(4) Go并发(4) kafka(4) 移动开发(4) 移动应用(4) security(4) 隐私(4) spring-boot(4) 物联网(4) nextjs(4) 网络安全(4) API(4) Ruby(4) 信息安全(4) flutter(4) 专家智能体(3) Chrome(3) CHIPS(3) 3PC(3) SSE(3) 人工智能软件工程师(3) LLM Agent(3) Remix(3) Ubuntu(3) GPT4All(3) 软件开发(3) 问答系统(3) 开发工具(3) 最佳实践(3) RxJS(3) SSR(3) Node.js(3) Dolly(3) 移动应用开发(3) 低代码(3) IAM(3) Web框架(3) CORS(3) 基准测试(3) Go语言数据库开发(3) Oauth2(3) 并发(3) 主题(3) Theme(3) earth(3) nginx(3) 软件工程(3) azure(3) keycloak(3) 生产力工具(3) gpt3(3) 工作流(3) C(3) jupyter(3) 认证(3) prometheus(3) GAN(3) Spring(3) 逆向工程(3) 应用安全(3) Docker(3) Django(3) R(3) .NET(3) 大数据(3) Hacking(3) 渗透测试(3) C++资源(3) Mac(3) 微信小程序(3) Python资源(3) JHipster(3) 大型语言模型(2) 语言模型(2) 可穿戴设备(2) JDK(2) SQL(2) Apache(2) Hashicorp Vault(2) Spring Cloud Vault(2) Go语言Web开发(2) Go测试工程师(2) WebSocket(2) 容器化(2) AES(2) 加密(2) 输入验证(2) ORM(2) Fiber(2) Postgres(2) Gorilla Mux(2) Go数据库开发(2) 模块(2) 泛型(2) 指针(2) HTTP(2) PostgreSQL开发(2) Vault(2) K8s(2) Spring boot(2) R语言(2) 深度学习资源(2) 半监督学习(2) semi-supervised-learning(2) architecture(2) 普罗米修斯(2) 嵌入模型(2) productivity(2) 编码(2) Qt(2) 前端(2) Rust语言(2) NeRF(2) 神经辐射场(2) 元宇宙(2) CPP(2) 数据分析(2) spark(2) 流处理(2) Ionic(2) 人体姿势估计(2) human-pose-estimation(2) 视频处理(2) deep-learning(2) kotlin语言(2) kotlin开发(2) burp(2) Chatbot(2) npm(2) quantum(2) OCR(2) 游戏(2) game(2) 内容管理系统(2) MySQL(2) python-books(2) pentest(2) opengl(2) IDE(2) 漏洞赏金(2) Web(2) 知识图谱(2) PyTorch(2) 数据库(2) reverse-engineering(2) 数据工程(2) swift开发(2) rest(2) robotics(2) ios-animation(2) 知识蒸馏(2) 安卓开发(2) nestjs(2) solidity(2) 爬虫(2) 面试(2) 容器(2) C++精选(2) 人工智能资源(2) Machine Learning(2) 备忘单(2) 编程书籍(2) angular资源(2) 速查表(2) cheatsheets(2) SecOps(2) mlops资源(2) R资源(2) DDD(2) 架构设计模式(2) 量化(2) Hacking资源(2) 强化学习(2) flask(2) 设计(2) 性能(2) Sysadmin(2) 系统管理员(2) Java资源(2) 机器学习精选(2) android资源(2) android-UI(2) Mac资源(2) iOS资源(2) Vue资源(2) flutter资源(2) JavaScript精选(2) JavaScript资源(2) Rust开发(2) deeplearning(2) RAD(2)

现在,您登录的几乎每个应用程序都有一个仪表板。它们中的大多数都是用React或Angular等现代框架构建的,并且有某种后端来支持它们。用户依靠这些仪表板来检查他们的帐户信息、更新他们的业务以及处理许多其他操作。

在本教程中,我们将使用Redwood为管理系统制作一个用户面板。用户可以采取一些操作将其他用户添加到具有不同角色的帐户中。仪表板还允许用户将新项目添加到其库存中,这些项目将附加到不同的位置。

让我们以红木为背景开始吧。

什么是Redwood

Redwood是一个使用Prisma、React和GraphQL构建的全栈框架。它有很多功能和一些命令,我们将使用这些功能快速制作这个应用程序。如果你有兴趣了解更多关于红木的信息,一定要查看他们的文档。

设置项目

现在,让我们开始设置我们的仪表板。我们将通过运行以下命令来引导此应用程序。只是提醒一下,它可能需要几分钟才能完成,但值得等待。

yarn create redwood-app ./redwood-dashboard

当命令执行完毕后,您会注意到您有相当多的文件夹和文件。最重要的文件夹是api目录和web目录。api目录保存后端和数据库的所有代码,而web目录保存前端的所有代码。

在我们开始使用该应用程序之前,您应该先运行它,看看它是如何工作的。使用以下命令启动前端和后端。

yarn rw dev

以下是您应该在浏览器中看到的内容。

基本红木应用程序

定义仪表板模型

既然您已经看到了该应用程序的运行情况,让我们开始利用Redwood的一些命令在后端工作。我们将首先为仪表板制作一个Prisma模型。这就是我们的应用程序连接到Postgres数据库的方式。在api>db内部,打开schema.prisma文件。

在这里,我们将使用几种不同类型的关系为数据库中所需的表创建模式。您将看到Redwood已经设置了一些配置和一个用户模型的示例。

我们将把数据源数据库提供程序更改为postgresql,您可以在下面的代码片段中看到。

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

然后,我们将删除TODO并更新示例用户模型。

model User {
  id    Int    @id @default(autoincrement())
  email String @unique
  name  String
  role  String
}

我们更新的用户模型有几个列,用于存储关于用户的信息。电子邮件字段有一个约束,即它必须始终是唯一的值。同一个电子邮件地址不能多次出现在数据库中。接下来,我们将为Item和Location表添加一个新模型。这些需要同时创建,因为它们彼此之间有关系。

 

model Item {
  id         Int      @id @default(autoincrement())
  sku        String   @unique
  name       String
  location   Location @relation(fields: [locationId], references: [id])
  locationId Int
}

model Location {
  id       Int    @id @default(autoincrement())
  name     String
  district Int
  Item     Item[]
}

然后,我们将更新seed.js文件,以便在启动应用程序之前存在一些值。这在产品面板上很常见,用于填充下拉选项或初始化用户可以添加到不同设置中的标记。我们将添加一个用户、一个项目和一个位置来为我们的数据库播种。提醒一下,我已经从这个文件中删除了很多评论。

/* eslint-disable no-console */
const { PrismaClient } = require('@prisma/client')
const dotenv = require('dotenv')

dotenv.config()
const db = new PrismaClient()

async function main() {
  console.warn('Please define your seed data.')

  await db.user.create({
    data: { name: 'Kaiya', email: 'best@test.com', role: 'inventory' },
  })

  await db.location.create({
    data: { name: 'Compound North', district: 1 },
  })

  await db.item.create({
    data: {
      name: 'Morning Glory',
      sku: 'hf8029ht8942ht8429pht8p942p',
      locationId: 1,
    },
  })
}

main()
  .catch((e) => console.error(e))
  .finally(async () => {
    await db.$disconnect()
  })

有了模式和种子数据,我们几乎可以运行第一次迁移了。在我们这样做之前,我们需要连接到数据库。因此,在项目根目录的.env文件中,更新DATABASE_URL以匹配Postgres实例。它看起来和这个相似。

DATABASE_URL=postgres://postgres:admin@localhost:5432/dashboard

如果你没有本地的Postgres实例,你可以很快在这里下载。

现在,我们将使用以下内容运行迁移:

yarn rw prisma migrate dev

这将提示您输入迁移名称,创建数据库和表,并添加种子数据。如果您通过pgAdmin查看数据库,您会看到这样的内容。

pgAdmin中的种子数据库

现在您已经准备好了数据库,可以存储和发送我们需要的值,让我们转到后端和前端。

添加后端和前端

Redwood有一个特殊的命令,它为我们做了很多工作。它将为从前端组件到后端GraphQL查询、类型和突变的表创建整个CRUD。我们将利用这一点来充分利用我们的仪表板。让我们从以下命令开始。

yarn rw g scaffold user

这将生成几个页面、组件和GraphQL文件,以处理仪表板用户部分的所有CRUD操作。查看web > pages。您应该看到一个名为User的新目录。这包含了我们需要处理的所有关于用户的页面。

现在查看web > components。将有另一个用户文件夹。这个包含了我们用来与GraphQL服务器交互的组件。大多数数据都是在这些组件中提取的,请求是从这些组件发送的。

web > layouts文件夹还将有一个新目录,其中包含用户页面的布局文件。这就是您可以为一组特定页面创建样式的方法。

在Routes.js文件中,您将看到UserLayout中为用户包装了一组新的路由。生成的所有页面也会将其路由自动添加到其父布局内的该文件中。

在api目录中还生成了一些新文件。如果您在api>src>graphql中查看,您会发现用于所有所需CRUD操作的graphql模式,并且类型已由schema.prisma文件中的模型定义。

然后在api > src > services,中,您将找到模式中定义的查询和突变的所有GraphQL解析器。

所有这些页面、组件、类型和解析器都是由Redwood命令生成的。让我们使用yarn rw-dev运行该应用程序,这样您就可以看到所有这些工作。如果你在浏览器中转到用户页面,你应该会看到类似的内容。

主页现在将返回404,因为我们还没有为该路由添加组件。我们稍后会这样做,但/users页面仍然可以工作。

您可以使用页面上的按钮添加新用户、更新当前用户或删除当前用户。

我们将再运行两次scaffold命令,以生成项目和位置的CRUD。

yarn rw g scaffold location
yarn rw g scaffold item

现在,我们已经拥有了用户面板所需的所有操作。我们需要做几件事来给这个仪表板一个更真实的感觉。我们将添加一个主页和一个布局,以帮助我们在仪表板的各个部分之间导航。

制作主页

让我们从添加样式化组件包开始,因为我们将使用它来样式化一些东西。首先,转到终端中的web目录。这就是这个软件包需要安装的地方。

yarn add styled-components

现在让我们运行一个神奇的Redwood命令来生成主页及其路由。

yarn rw g page home /

这将在web > src > pages中为主页组件创建一个新目录,并将一个新路由添加到Routes.js。您可以在此处重新运行应用程序以查看新主页。在浏览器中会是这样的。

新主页

现在我们已经有了主页,让我们制作一个适用于此页面和迄今为止所有其他页面的布局。当然,有一个Redwood命令可以处理这个问题。

yarn rw g layout home

这将为我们的主页在web > src > layouts中创建一个新文件夹。我们将在HomeLayout组件中使用一些样式化的组件来创建侧导航菜单,并为面板提供一个小的定义。我们还将使用红木路由在侧边导航中添加到其他页面的链接。

import { Link, routes } from '@redwoodjs/router'
import styled from 'styled-components'

const HomeLayout = ({ children }) => {
  return (
    <FlexBox>
      <SideNav>
        <LinkContainer>
          <Link to={routes.users()}>Users</Link>
        </LinkContainer>
        <LinkContainer>
          <Link to={routes.locations()}>Locations</Link>
        </LinkContainer>
        <LinkContainer>
          <Link to={routes.items()}>Items</Link>
        </LinkContainer>
      </SideNav>
      <FullPage>{children}</FullPage>
    </FlexBox>
  )
}

const FlexBox = styled.div`
  display: flex;
`

const FullPage = styled.div`
  height: 100vh;
  width: 100%;
`

const LinkContainer = styled.div`
  padding: 12px;

  > * {
    color: #000;
    font-family: sans-serif;
    font-size: 18px;
    text-decoration: none;
  }

  > *:hover {
    color: #5b5b5b;
  }
`

const SideNav = styled.nav`
  border-right: 1px solid;
  width: 250px;
`

export default HomeLayout

接下来,我们需要将此布局应用于应用程序中的所有页面。我们将在Routes.js文件中执行此操作。这意味着在所有现有路线周围添加一个<Set>组件,如下所示。

...
<Router>
  <Set wrap={HomeLayout}>
    <Route path="/" page={HomePage} name="home" />
    <Set wrap={ItemsLayout}>
      <Route path="/items/new" page={ItemNewItemPage} name="newItem" />
      <Route path="/items/{id:Int}/edit" page={ItemEditItemPage} name="editItem" />
      <Route path="/items/{id:Int}" page={ItemItemPage} name="item" />
      <Route path="/items" page={ItemItemsPage} name="items" />
    </Set>
    <Set wrap={LocationsLayout}>
      <Route path="/locations/new" page={LocationNewLocationPage} name="newLocation" />
      <Route path="/locations/{id:Int}/edit" page={LocationEditLocationPage} name="editLocation" />
      <Route path="/locations/{id:Int}" page={LocationLocationPage} name="location" />
      <Route path="/locations" page={LocationLocationsPage} name="locations" />
    </Set>
    <Set wrap={UsersLayout}>
      <Route path="/users/new" page={UserNewUserPage} name="newUser" />
      <Route path="/users/{id:Int}/edit" page={UserEditUserPage} name="editUser" />
      <Route path="/users/{id:Int}" page={UserUserPage} name="user" />
      <Route path="/users" page={UserUsersPage} name="users" />
    </Set>
    <Route notfound page={NotFoundPage} />
  </Set>
</Router>

 

现在,如果您运行yarn rw-dev,您将看到这样的内容。

应用了全局布局的仪表板

如果你浏览侧面导航中的任何链接,你都会看到这样的内容。

具有布局的仪表板中的用户

我把多余的款式留给你。设计这个可以是一个完全独立的教程!

这可能感觉像是一个悬念,因为我们实际上并没有写太多代码,但这就是我喜欢Redwood的地方。你可以让大型应用程序快速启动并运行,一切正常。

已完成代码

您可以在这个代码沙盒( Code Sandbox)上签出前端,而无需连接到后端。

如果您想要前端和后端的所有代码,请查看redwood-user-dashboard in this Git repo!!

结论

仪表板是许多应用程序的主要组成部分,因此了解如何快速创建仪表板很有帮助。红木是一个框架,可以帮助你开始这样的高级项目,它可以快速生成复杂的结构。

 

文章链接