基于Nux3+MySql 实现“待办事项”应用。做一个简单的全栈应用!

image.png
image.png

一、环境介绍

本项目前端页面和后台服务都采用nuxt3实现,数据库采用MySql,为了简化数据数据增删改查操作采用了ORM:Prisma。

项目已上传到gitee,地址为:https://gitee.com/xiangli22/nuxt3-prisma-mysql

项目目录结构如下:
image.png

一、步骤

创建nux3项目,并安装依赖

// 创建nux3项目,其中<project-name>为项目名称
npx nuxi@latest init nuxt3-prisma-mysql
// 进入项目目录
cd nuxt3-prisma-mysql
// 安装依赖
npm install

安装Prisma,作为依赖项

npm install --save-dev prisma

初始化Prisma

npx prisma init

这个命令创建了一个名为prisma的新目录,其中包含一个名为schema.prisma的文件和一个位于项目根目录中的**.env文件schema.prisma**包含prisma模式以及数据库连接和prisma客户端生成器。 .env是一个dotenv用于定义环境变量的文件(用于数据库连接)。

配置schema.prisma、.env文件

需要提前创建好一个数据库,本项目数据库为:prisma;账号为:root;密码为123456789。

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}
DATABASE_URL="mysql://root:123456789@localhost:3306/prisma"

使用Prisma Migrate创建数据库表

schema.prisma文件中编写模型model

generator client {
  provider = "prisma-client-js"
}

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

// 待办清单模型
model Todo {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  title     String   @db.VarChar(255)
  description String?
  completed  Boolean  @default(false)
}

将数据模型映射到数据库架构

npx prisma migrate dev --name init

此命令执行两项操作:

  1. 为这次迁移创建了一个新的SQL迁移文件
  2. 对数据库运行SQL迁移文件

此时数据库中已经创建好了名为“todo”的数据表。

安装 Prisma Client

npm install @prisma/client

安装命令会自动调用prisma generate,它会读取prisma模式并生成一个适合您的模型的prisma Client版本。以后每当您对 Prisma 架构进行更改时,您都需要手动调用prisma generate以适应 Prisma 客户端 API 中的更改。
image.png

编写数据接口

查询待办事项清单接口

import { PrismaClient } from '@prisma/client'
// 接口地址为:/api/todo,nux3会根据(get/post/put/delete)方法选择对应接口
export default defineEventHandler(async (event) => {
    // ... 在这里做任何你想做的事情
    const prisma = new PrismaClient()
    try {
        // 查询待办事项清单
        const todoList = await prisma.todo.findMany({})
        return todoList
    } catch (error) {
        console.error('数据库操作出现异常:', error)
        // 重新抛出异常,以便在调用此事件处理程序的地方进行处理
        throw error
    } finally {
        // 确保断开与数据库的连接
        await prisma.$disconnect()
    }
})
  

新增待办事项接口


export default defineEventHandler(async (event) => {
    // ... 在这里做任何你想做的事情
    const prisma = new PrismaClient()
    console.log("event",event)
    try {
        // 获取前端传递的数据
        const data = await readBody(event)
        const res = await prisma.todo.create({
            data: {
                title: data.newTodo,
            },
        })
        return { res }
    } catch (error) {
        console.error('数据库操作出现异常:', error)
        throw error // 重新抛出异常,以便在调用此事件处理程序的地方进行处理
    } finally {
        await prisma.$disconnect() // 确保断开与数据库的连接
    }
  })

删除待办事项

import { PrismaClient } from '@prisma/client'

export default defineEventHandler(async (event) => {
    // ... 在这里做任何你想做的事情
    const prisma = new PrismaClient()
    console.log("event",event)
    try {
        // 获取前端传递的数据
        const data = await readBody(event)
        const deleteTodo = await prisma.todo.delete({
          where: {
            id: data.item,
          },
        })
        return { deleteTodo }
    } catch (error) {
        console.error('数据库操作出现异常:', error)
        throw error // 重新抛出异常,以便在调用此事件处理程序的地方进行处理
    } finally {
        await prisma.$disconnect() // 确保断开与数据库的连接
    }
  })

编写前端页面

注意:本项目组件选用了antdesign-vue,请在项目目录下运行下述命令。
npm install --save-dev @ant-design-vue/nuxt

另外,还需要在配置文件中添加配置信息,详情如下。

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  devtools: { enabled: true },
  modules: [
    '@ant-design-vue/nuxt'
  ],
})
<template>
  <h1>待办清单</h1>
  <a-input v-model:value="newTodo" style="width: 500px;margin-bottom: 50px;">
      <template #addonAfter>
        <CheckOutlined @click="addTodo" />
      </template>
  </a-input>
  <div>
    <a-card style="width: 500px">
      <a-list size="small" bordered  v-for="(todo, index) in todolist.value" :key="index">
        <a-list-item>
          {{ todo.title }}
          <template #actions>
          <a key="list-loadmore-delete" @click="delTodo(todo.id)">delete</a>
        </template>
        </a-list-item>
      </a-list>
    </a-card>
  </div>

</template>

<script setup lang="ts">
  const todolist = ref([])
  const newTodo = ref('')
  const newTodoInput = ref(null)
  async function getTodoList () {
    // 查询待办事项清单
    const { data } = await useFetch('/api/todo',{
      method: 'get',
    })
    todolist.value = data
  }
  async function addTodo () {
    // 新增待办事项清单
    const { data } = await useFetch('/api/todo',{
      method: 'post',
      body: { newTodo }
    })
    console.log("新增待办事项清单",data)
    getTodoList()
  }
  async function delTodo (item) {
    // 删除待办事项
    const { data } = await useFetch('/api/todo',{
      method: 'delete',
      body: { item }
    })
    console.log("新增待办事项清单",data)
    getTodoList()
  }

  onMounted(async () => {
    getTodoList()
  })
</script>
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 好的,我可以回答这个问题。启动本地应用程序的方法因不同操作系统而异,以下是针对Windows操作系统的方法: 首先,在Windows操作系统中,可以使用Java Runtime类的exec()方法启动本地应用程序。该方法需要传入一个字符串参数,该参数包含要运行的应用程序的路径。例如,以下代码将启动Windows计算器应用程序: ``` String programPath = "C:\\Windows\\System32\\calc.exe"; Runtime.getRuntime().exec(programPath); ``` 请注意,要在程序路径中使用双反斜杠(\\)作为路径分隔符。 如果您需要在启动应用程序时传递命令行参数,您可以将这些参数作为字符串数组传递给exec()方法。例如,以下代码将在Windows操作系统中启动记事本应用程序,并打开名为"example.txt"的文本文件: ``` String programPath = "C:\\Windows\\System32\\notepad.exe"; String[] cmdArgs = {"example.txt"}; Runtime.getRuntime().exec(new String[] {programPath, cmdArgs[0]}); ``` 请注意,使用数组的方式传递参数时,应用程序路径和参数应该分别作为数组的不同元素传递给exec()方法。 希望这个方法可以帮助到你。 ### 回答2: 要编写一个方法来启动本地应用,首先需要知道应用的名称或路径。以下是一个示例方法: ```java public void startLocalApp(String appName) { try { String os = System.getProperty("os.name").toLowerCase(); String command = ""; if (os.contains("win")) { // Windows操作系统 command = "cmd /c start " + appName; } else if (os.contains("mac")) { // macOS操作系统 command = "open -a " + appName; } else if (os.contains("nix") || os.contains("nux") || os.contains("sunos")) { // Linux/Unix或Solaris操作系统 command = "xdg-open " + appName; } else { System.out.println("Unsupported operating system"); return; } Runtime.getRuntime().exec(command); } catch (IOException e) { e.printStackTrace(); } } ``` 这个方法检查了操作系统类型,并根据不同的操作系统使用不同的命令来启动应用。对于Windows操作系统,使用`cmd /c start`命令;对于macOS操作系统,使用`open -a`命令;对于Linux/Unix或Solaris操作系统,使用`xdg-open`命令。如果操作系统不是这三种类型之一,则输出"Unsupported operating system"并返回。 要使用这个方法,只需要传递应用的名称给`startLocalApp`方法即可。示例调用如下: ```java startLocalApp("notepad.exe"); // 启动记事本应用(Windows) startLocalApp("TextEdit"); // 启动文本编辑器应用(macOS) startLocalApp("gedit"); // 启动文本编辑器应用(Linux) ``` 请注意,上述示例方法只适用于启动本地已安装的应用。如果应用是根据路径启动的,你可以将应用的完整路径传递给`startLocalApp`方法。 ### 回答3: 启动本地应用的方法可以通过使用操作系统提供的命令行工具或者使用编程语言的相关函数来实现。 方法一: 1. 首先,需要知道要启动的本地应用的路径和名称。 2. 使用操作系统的命令行工具,比如Windows系统中的cmd命令或者macOS系统中的Terminal,打开命令行界面。 3. 在命令行中输入启动应用的命令。例如,Windows系统中可以使用“start 应用程序路径”命令,macOS系统中可以使用“open 应用程序路径”命令。 4. 执行命令后,本地应用将会被启动。 方法二: 如果使用编程语言来实现启动本地应用的方法,可以根据不同的编程语言选择相应的函数来实现。 例如,使用Python编程语言: 1. 首先,需要导入`subprocess`模块,这个模块允许我们在Python程序中执行其他应用程序。 2. 使用`subprocess.run()`函数,传入应用程序路径作为参数,即可启动本地应用。例如,`subprocess.run(["/应用程序路径"])`。 3. 执行程序后,本地应用将会被启动。 无论是使用命令行工具还是编程语言,都需要提供正确的应用程序路径和名称,否则无法正确启动本地应用。另外,启动的本地应用可能会有一些额外的启动参数,可以根据应用程序的要求在命令中添加相应的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值