feat: initial commit with Nuxt 3 student management system

- Add Nuxt 3 + Prisma + SQLite full-stack setup
- Add student CRUD API with batch import/export
- Add stats dashboard with gender/class distribution
- Add target community settings feature
- Add Docker deployment support (Dockerfile + docker-compose)
- Add README with development and deployment instructions
This commit is contained in:
2026-03-21 02:00:55 +08:00
commit 05c33b1fe8
25 changed files with 15749 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
import { prisma } from '~/server/utils/prisma'
export default defineEventHandler(async (event) => {
const id = Number(event.context.params?.id)
await prisma.student.delete({
where: { id }
})
return { success: true }
})

View File

@@ -0,0 +1,23 @@
import { prisma } from '~/server/utils/prisma'
export default defineEventHandler(async (event) => {
const id = Number(event.context.params?.id)
const body = await readBody(event)
const student = await prisma.student.update({
where: { id },
data: {
className: body.className,
name: body.name,
gender: body.gender,
birthday: body.birthday || null,
address: body.address || null,
fatherName: body.fatherName || null,
fatherPhone: body.fatherPhone || null,
motherName: body.motherName || null,
motherPhone: body.motherPhone || null
}
})
return student
})

View File

@@ -0,0 +1,6 @@
import { prisma } from '~/server/utils/prisma'
export default defineEventHandler(async (event) => {
await prisma.student.deleteMany()
return { success: true }
})

View File

@@ -0,0 +1,28 @@
import { prisma } from '~/server/utils/prisma'
export default defineEventHandler(async (event) => {
const body = await readBody(event)
if (!Array.isArray(body.students)) {
throw createError({
statusCode: 400,
message: 'Invalid data format'
})
}
const result = await prisma.student.createMany({
data: body.students.map((s: any) => ({
className: s.className,
name: s.name,
gender: s.gender || '',
birthday: s.birthday || null,
address: s.address || null,
fatherName: s.fatherName || null,
fatherPhone: s.fatherPhone || null,
motherName: s.motherName || null,
motherPhone: s.motherPhone || null
}))
})
return { count: result.count }
})

View File

@@ -0,0 +1,8 @@
import { prisma } from '~/server/utils/prisma'
export default defineEventHandler(async (event) => {
const students = await prisma.student.findMany({
orderBy: { id: 'desc' }
})
return students
})

View File

@@ -0,0 +1,21 @@
import { prisma } from '~/server/utils/prisma'
export default defineEventHandler(async (event) => {
const body = await readBody(event)
const student = await prisma.student.create({
data: {
className: body.className,
name: body.name,
gender: body.gender,
birthday: body.birthday || null,
address: body.address || null,
fatherName: body.fatherName || null,
fatherPhone: body.fatherPhone || null,
motherName: body.motherName || null,
motherPhone: body.motherPhone || null
}
})
return student
})