4.1 KiB
4.1 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Jog System — a modern blog CMS with Spring Boot 3 + Vue 3 (Java 21), JWT auth, MySQL + Redis + Flyway.
Build & Run
Important: jog-admin/pom.xml bundles frontend-maven-plugin that downloads Node.js, runs npm ci, and npm run build during Maven's generate-resources phase. This means mvn compile / mvn spring-boot:run also trigger a full frontend build — heavyweight and slow. For daily development, run the backend from IDE instead.
# Backend — compile all modules (triggers frontend build via plugin, slow)
mvn clean compile -DskipTests
# Backend — run all tests (uses Mockito, tagged p0/p1)
mvn test
# Backend — run a single test class
mvn test -Dtest=AuthServiceImplP0P1Test
# Backend — run tests by tag
mvn test -Dgroups="p0"
# Backend — start dev server (port 8080)
# NOTE: triggers frontend-maven-plugin (slow). Recommended: run
# JogApplication.main() from IDE instead to skip frontend build.
mvn spring-boot:run -pl jog-admin
# Frontend — start dev server (port 5173, proxies /api → 8080)
cd jog-frontend && npm run dev
# Frontend — build (outputs to jog-admin/src/main/resources/static)
cd jog-frontend && npm run build
# Full production build (installs Node + npm ci + build via frontend-maven-plugin)
mvn clean package -DskipTests
Project Structure
jog-admin/ # Spring Boot entry point (depends on all modules)
jog-common/ # Shared: annotations, enums, exceptions, models (ApiResult, PageResult)
jog-framework/ # Cross-cutting: security (JWT), config, AOP (logging, rate-limit), XSS filter
jog-module-system/ # Auth (login/register/refresh), user management
jog-module-blog/ # Articles, categories, tags, AI summary (DashScope), tag recommendation
jog-module-comment/ # Comments (nested, audit, like)
jog-frontend/ # Vue 3 + Vite + Element Plus + Pinia + Tiptap
Module dependency chain (top to bottom):
jog-admin → jog-module-{system,blog,comment} → jog-framework → jog-common
Architecture Conventions
Backend
- Controller → Service (interface) → ServiceImpl → Mapper (MyBatis-Plus)
- Controllers use
@RequiredArgsConstructor+finalfield injection, no@Autowired - Service implementations are
@Transactionalon mutation methods - All controllers return
ApiResult<T>(code/message/data/timestamp) - Error codes via
ErrorCodeenum, thrown asBusinessException - Three API tiers:
/api/public/**(no auth),/api/app/**(USER/ADMIN),/api/admin/**(ADMIN only) - Pagination:
PageResult<T>wrapping MyBatis-PlusPage<T> - JWT: access token (2h) + refresh token (24h / 14d with "remember me")
- DTOs use
jakarta.validationannotations - Lombok:
@Data,@Builder,@RequiredArgsConstructorthroughout
Frontend
src/utils/request.js— axios instance with auto Bearer token, 401 auto-refreshsrc/api/*.js— per-domain API functions, no direct axios calls in viewssrc/stores/user.js— Pinia store for auth state (token, userInfo, isLoggedIn, isAdmin)src/router/index.js— route guards:requiresAuthredirects to login,requiresAdminredirects to home- Views: 3 layout groups — BlogLayout (public), AppLayout (user), AdminLayout (admin)
Database
- Flyway migrations in
jog-admin/src/main/resources/db/migration/ - MyBatis-Plus: camelCase mapping,
@TableLogicfor soft delete (deleted=1) - Redis: used for rate limiting (AI summary), token blacklist
Testing
@ExtendWith(MockitoExtension.class)for unit tests — mock all mappers- Test classes suffixed with
P0P1TestorTest; live IT classes suffixed withLiveIT - Test tags:
@Tag("p0")(critical),@Tag("p1")(important)
AI Features
- DashScope (阿里云百炼) via OpenAI-compatible API in
AiSummaryServiceImpl - Tag recommendation via
TagRecommendServiceImpl - Both rate-limited per-user via Redis
- Configurable via
dashscope.*properties inapplication.yml
Git Rules
- Only the user performs
git commit,git push, orgit push -u— Claude must not auto-execute these