.claude

FastAPI + Vue 3 Full-Stack Project Skill

install
source · Clone the upstream repo
git clone https://github.com/liudonghua123/dns-health-check
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/liudonghua123/dns-health-check "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude" ~/.claude/skills/liudonghua123-dns-health-check-claude && rm -rf "$T"
manifest: .claude/project-skill.md
safety · automated scan (low risk)
This is a pattern-based risk scan, not a security review. Our crawler flagged:
  • pip install
Always read a skill's source content before installing. Patterns alone don't mean the skill is malicious — but they warrant attention.
source content

FastAPI + Vue 3 Full-Stack Project Skill

Project Overview

A database security audit system with:

  • Backend: FastAPI + async SQLAlchemy + JWT + RBAC
  • Frontend: Vue 3 + Tailwind CSS + Pinia + Vue I18n
  • Multi-database: SQLite, MySQL, PostgreSQL support
  • Features: Background scanning, audit logging, report export (PDF/DOCX)

Tech Stack

Backend

  • Python 3.13+
  • FastAPI (async web framework)
  • SQLAlchemy 2.0+ (async ORM)
  • Pydantic (data validation)
  • python-jose (JWT)
  • passlib + bcrypt (password hashing)
  • aiosqlite, aiomysql, asyncpg (async DB drivers)
  • reportlab, python-docx (PDF/DOCX export)

Frontend

  • Vue 3 (Composition API)
  • Tailwind CSS
  • Pinia (state management)
  • Vue Router
  • Vue I18n (internationalization)
  • Axios (HTTP client)
  • vue-toastification (notifications)

Project Structure

project/
├── backend/
│   ├── app/
│   │   ├── api/           # API endpoints
│   │   │   └── api_v1/
│   │   │       └── endpoints/
│   │   ├── core/          # Config, security
│   │   ├── db/            # Models, session
│   │   ├── schemas/       # Pydantic models
│   │   └── services/      # Business logic
│   ├── main.py            # Entry point
│   ├── create_admin.py    # Admin script
│   └── pyproject.toml     # Dependencies
├── frontend/
│   ├── src/
│   │   ├── views/         # Page components
│   │   ├── components/    # Reusable components
│   │   ├── stores/        # Pinia stores
│   │   ├── router/        # Vue Router
│   │   └── i18n.js        # Translations
│   └── package.json
└── README.md

Common Tasks

1. Add New API Endpoint

# backend/app/api/api_v1/endpoints/new_endpoint.py
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from app.api import deps
from app.db import models

router = APIRouter()

@router.get("/")
async def read_items(
    db: AsyncSession = Depends(deps.get_db),
    current_user: models.User = Depends(deps.get_current_user),
):
    # Your logic here
    return []

Register in

api.py
:

from app.api.api_v1.endpoints import new_endpoint
api_router.include_router(new_endpoint.router, prefix="/new", tags=["new"])

2. Add New Database Model

# backend/app/db/models.py
class NewModel(Base):
    __tablename__ = "new_models"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, nullable=False)
    created_at = Column(DateTime(timezone=True), server_default=func.now())

3. Add Frontend Page

<!-- frontend/src/views/NewPage.vue -->
<template>
  <div class="page-content">
    <h1>{{ $t('new.title') }}</h1>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import api from '../api'

const data = ref([])
onMounted(async () => {
  const res = await api.get('/new/')
  data.value = res.data
})
</script>

Register in router:

// frontend/src/router/index.js
import NewPage from '../views/NewPage.vue'
{ path: 'new', component: NewPage }

4. Add i18n Translation

// frontend/src/i18n.js
// Add in both en-US and zh-CN sections
new: {
  title: 'New Page',
  // Chinese
  title: '新页面',
}

5. Background Task (FastAPI)

# backend/app/services/scanner.py
from fastapi import BackgroundTasks

async def run_task(task_id: int, background_tasks: BackgroundTasks):
    background_tasks.add_task(process_task, task_id)

async def process_task(task_id: int):
    # Long-running task logic
    pass

6. Audit Logging

# Create log model in models.py
class SystemLog(Base):
    __tablename__ = "system_logs"
    id = Column(Integer, primary_key=True)
    action = Column(String, nullable=False)
    level = Column(String, default="info")
    user_id = Column(Integer, ForeignKey("users.id"))
    details = Column(Text)  # JSON string

# Log actions
from app.services.logger import log_action
await log_action(db, action="user_login", level="info",
    user_id=user.id, message="User logged in")

Development Commands

# Backend
cd backend
uv sync
uv run python create_admin.py
uv run python main.py  # Dev server with auto-reload + browser open

# Frontend
cd frontend
npm install
npm run dev    # Dev server
npm run build  # Production build

# PyInstaller (use venv!)
cd backend
uv pip install pyinstaller
uv run pyinstaller sensitive-information-audit.exe.spec

Key Patterns

Async Database Session

async def get_db():
    async with AsyncSessionLocal() as session:
        yield session

JWT Authentication

# Verify token
user = await deps.get_current_user(db=db, token=token)

# Create token
access_token = security.create_access_token(
    user.username, expires_delta=timedelta(minutes=30)
)

RBAC Check

# In deps.py
def get_current_user(...):
    # Check user roles and permissions
    if not auth_store.has_permission(required_permission):
        raise HTTPException(403)

Frontend API Call

import api from '@/api'

// GET
const res = await api.get('/endpoint/')

// POST
await api.post('/endpoint/', { data })

// With auth header (automatic via interceptor)

Frontend Polling (with auto-stop)

const pollingEnabled = ref(false)
let pollingInterval = null

const startPolling = () => {
  if (pollingInterval) return
  pollingEnabled.value = true
  pollingInterval = setInterval(fetchData, 5000)
}

const stopPolling = () => {
  if (pollingInterval) {
    clearInterval(pollingInterval)
    pollingInterval = null
  }
  pollingEnabled.value = false
}

onMounted(() => fetchData())
onUnmounted(() => stopPolling())

PyInstaller Notes

  • Always use venv pyinstaller:
    uv run pyinstaller
  • Use
    .spec
    file for complex builds
  • Collect submodules:
    collect_submodules('fastapi')
  • Key hidden imports: jose, passlib, sqlalchemy.ext.asyncio