5128e1551c
Backend (backend/):
- FastAPI app with layered app/{api,core,crud,db,models,schemas} structure
- TiDB connection via SQLAlchemy. The URL is built with URL.create rather
than string formatting: the password contains '@', which would otherwise be
parsed as the user/host separator and silently truncate the credential.
- Alembic environment wired to Base.metadata and the app settings, so
backend/.env stays the single source of truth for credentials
- /api/health endpoint reporting database reachability
- models/ and crud/ are intentionally empty: no model classes are defined and
no tables are created, at import time or otherwise
Frontend (frontend/):
- Vue 3 + Vite + TypeScript scaffold (create-vue, --bare)
- axios instance with a normalized error shape
- vue-router with a home route and a catch-all 404
- pinia + pinia-plugin-persistedstate; the app store persists selected keys
- Element Plus with its icons registered globally
- dev proxy forwards /api to the FastAPI service on port 8000
The database paper_doc was created in TiDB out of band; no table exists yet.
37 lines
880 B
JSON
37 lines
880 B
JSON
{
|
|
"name": "frontend",
|
|
"version": "0.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "run-p type-check \"build-only {@}\" --",
|
|
"preview": "vite preview",
|
|
"build-only": "vite build",
|
|
"type-check": "vue-tsc --build"
|
|
},
|
|
"dependencies": {
|
|
"@element-plus/icons-vue": "^2.3.2",
|
|
"axios": "^1.20.0",
|
|
"element-plus": "^2.14.5",
|
|
"pinia": "^4.0.2",
|
|
"pinia-plugin-persistedstate": "^4.7.1",
|
|
"vue": "^3.5.40",
|
|
"vue-router": "^5.2.0"
|
|
},
|
|
"devDependencies": {
|
|
"@tsconfig/node24": "^24.0.4",
|
|
"@types/node": "^24.13.3",
|
|
"@vitejs/plugin-vue": "^6.0.8",
|
|
"@vue/tsconfig": "^0.9.1",
|
|
"npm-run-all2": "^9.0.2",
|
|
"typescript": "~6.0.0",
|
|
"vite": "^8.1.5",
|
|
"vite-plugin-vue-devtools": "^8.1.5",
|
|
"vue-tsc": "^3.3.7"
|
|
},
|
|
"engines": {
|
|
"node": "^22.18.0 || >=24.12.0"
|
|
}
|
|
}
|