基于Nux3+MySql 实现“待办事项”应用。做一个简单的全栈应用!
创作时间:
作者:
@小白创作中心
基于Nux3+MySql 实现“待办事项”应用。做一个简单的全栈应用!
引用
CSDN
1.
https://blog.csdn.net/qq_38754686/article/details/136659628
本文将介绍如何使用Nuxt3和MySQL开发一个简单的待办事项应用。通过本教程,你将学习到如何搭建项目环境、使用Prisma进行数据库操作、编写数据接口以及开发前端页面。
一、环境介绍
本项目前端页面和后台服务都采用nuxt3实现,数据库采用MySql,为了简化数据数据增删改查操作采用了ORM:Prisma。
项目已上传到gitee,地址为:https://gitee.com/xiangli22/nuxt3-prisma-mysql
项目目录结构如下:
一、步骤
创建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
此命令执行两项操作:
为这次迁移创建了一个新的SQL迁移文件
对数据库运行SQL迁移文件
此时数据库中已经创建好了名为“todo”的数据表。
安装 Prisma Client
npm install @prisma/client
安装命令会自动调用prisma generate,它会读取prisma模式并生成一个适合您的模型的prisma Client版本。以后每当您对 Prisma 架构进行更改时,您都需要手动调用prisma generate以适应 Prisma 客户端 API 中的更改。
编写数据接口
查询待办事项清单接口
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>
热门推荐
探寻北京烤鸭:传统制作技艺与历史传承
恋爱分手讨借款 "龙法和"巧妙解纠纷
黑胡椒精油的重要性是什么?
枸杞:护眼、抗衰老、提升免疫力的天然‘防护镜’,你吃对了吗?
神经网络模型的量化简介(工程版)
《追花两万里》:赴一趟共生共惠的自然之旅
解密胃痛的致命原因——不规律饮食、胃酸反流、压力背后的真相
中国书院的由来和发展——中国四大书院
泡茶杯哪种比较好?泡茶杯选购的小技巧?
17个板块上涨!3张图,告诉你昆明最新房价变化
中考数学复习三角形的垂心性质与应用
如何如实填写健康状况以确保个人与他人健康安全
断食期间吃什么保证营养
“代代相传”的地方特色寿司
如何高效利用万方数据库
自媒体与机构媒体,两者在信息传播中的异同及影响力对比如何?
风信子的象征意义及文化传承(探索风信子的美与内涵)
USB-C 与 HDMI:连接显示器时该选择哪种?
家电渠道商新一轮挤压开始了
迪拜市场全解析:经济产业、社交媒体、对外贸易与商务社交礼仪禁忌
口腔溃疡:病因是什么以及如何治疗?
线程安全的队列
《哪吒》里的“我命由我不由天”是谁说的?究竟讲的是什么道理
《蜡笔小新:我们的恐龙日记》:跨越时空的友谊与成长之旅
科学控痘,饮食避坑全攻略
AMD CPU份额三年来首超Intel 达55% 领跑处理器市场
减肥,尽量要吃“干净”的食物
2025文科生可以报计算机专业吗 有限制吗
高速行车安全指南:从进入高速到驶出,这些技巧请收好
剑桥通用英语五级(KET,PET,FCE,CAE,CPE)攻略