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.
29 lines
826 B
TypeScript
29 lines
826 B
TypeScript
import { createApp } from 'vue'
|
|
import { createPinia } from 'pinia'
|
|
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
|
|
import ElementPlus from 'element-plus'
|
|
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
|
|
|
|
import 'element-plus/dist/index.css'
|
|
|
|
import App from './App.vue'
|
|
import router from './router'
|
|
|
|
const app = createApp(App)
|
|
|
|
const pinia = createPinia()
|
|
// Registered once here; individual stores opt in with the `persist` option.
|
|
pinia.use(piniaPluginPersistedstate)
|
|
|
|
app.use(pinia)
|
|
app.use(router)
|
|
app.use(ElementPlus)
|
|
|
|
// Element Plus icons are components, not part of the plugin, so they are
|
|
// registered globally to keep templates free of per-file imports.
|
|
for (const [name, component] of Object.entries(ElementPlusIconsVue)) {
|
|
app.component(name, component)
|
|
}
|
|
|
|
app.mount('#app')
|