chore: initial import to Nexus_Edu

This commit is contained in:
SpecialX
2025-11-28 19:23:19 +08:00
commit 38244630a7
153 changed files with 22541 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
import { NextRequest } from 'next/server';
import { successResponse, errorResponse, dbDelay } from '@/lib/server-utils';
export async function POST(request: NextRequest) {
await dbDelay();
try {
const body = await request.json();
const { username, password } = body;
// Simple mock validation
if (!username) {
return errorResponse('Username is required');
}
let role = 'Teacher';
let name = '李明';
let id = 'u-tea-1';
if (username === 'student' || username.startsWith('s')) {
role = 'Student';
name = '王小明';
id = 'u-stu-1';
} else if (username === 'admin') {
role = 'Admin';
name = '系统管理员';
id = 'u-adm-1';
}
const token = `mock-jwt-token-${id}-${Date.now()}`;
return successResponse({
token,
user: {
id,
realName: name,
studentId: username,
avatarUrl: `https://api.dicebear.com/7.x/avataaars/svg?seed=${name}`,
gender: 'Male',
schoolId: 's-1',
role
}
});
} catch (e) {
return errorResponse('Invalid request body');
}
}

View File

@@ -0,0 +1,28 @@
import { NextRequest } from 'next/server';
import { successResponse, errorResponse, extractToken, dbDelay } from '@/lib/server-utils';
export async function GET(request: NextRequest) {
await dbDelay();
const token = extractToken(request);
if (!token) {
return errorResponse('Unauthorized', 401);
}
// In a real app, verify JWT here.
// For mock, we return a default user or parse the mock token if it contained info.
return successResponse({
id: "u-1",
realName: "李明 (Real API)",
studentId: "T2024001",
avatarUrl: "https://api.dicebear.com/7.x/avataaars/svg?seed=Alex",
gender: "Male",
schoolId: "s-1",
role: "Teacher",
email: 'liming@school.edu',
phone: '13800138000',
bio: '来自真实 API 的数据'
});
}

View File

@@ -0,0 +1,27 @@
import { NextRequest } from 'next/server';
import { successResponse, errorResponse } from '@/lib/server-utils';
import { db } from '@/lib/db';
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const { host, port, user, password, database } = body;
if (!host || !user) {
return errorResponse('Missing required fields');
}
await db.testConnection({
host,
port: Number(port),
user,
password,
database
});
return successResponse({ message: 'Connection successful' });
} catch (e: any) {
return errorResponse(e.message || 'Connection failed', 500);
}
}

View File

@@ -0,0 +1,23 @@
import { NextRequest } from 'next/server';
import { successResponse, dbDelay } from '@/lib/server-utils';
export async function GET(request: NextRequest) {
await dbDelay();
const { searchParams } = new URL(request.url);
const role = searchParams.get('role');
let classes = [
{ id: 'c-1', name: '高一 (10) 班', gradeName: '高一年级', teacherName: '李明', studentCount: 32, inviteCode: 'X7K9P' },
{ id: 'c-2', name: '高一 (12) 班', gradeName: '高一年级', teacherName: '张伟', studentCount: 28, inviteCode: 'M2L4Q' },
{ id: 'c-3', name: 'AP 微积分先修班', gradeName: '高三年级', teacherName: '李明', studentCount: 15, inviteCode: 'Z9J1W' },
{ id: 'c-4', name: '物理奥赛集训队', gradeName: '高二年级', teacherName: '王博士', studentCount: 20, inviteCode: 'H4R8T' },
];
if (role === 'Student') {
classes = classes.slice(0, 1);
}
return successResponse(classes);
}