linhaojun857/aurora
基于SpringBoot+Vue开发的个人博客系统
Healthy across all four use cases
weakest axisPermissive license, no critical CVEs, actively maintained — safe to depend on.
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 11mo ago
- ✓8 active contributors
- ✓Apache-2.0 licensed
Show all 7 evidence items →Show less
- ✓CI configured
- ⚠Slowing — last commit 11mo ago
- ⚠Concentrated ownership — top contributor handles 79% of recent commits
- ⚠No test directory detected
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/linhaojun857/aurora)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/linhaojun857/aurora on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: linhaojun857/aurora
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/linhaojun857/aurora shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across all four use cases
- Last commit 11mo ago
- 8 active contributors
- Apache-2.0 licensed
- CI configured
- ⚠ Slowing — last commit 11mo ago
- ⚠ Concentrated ownership — top contributor handles 79% of recent commits
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live linhaojun857/aurora
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/linhaojun857/aurora.
What it runs against: a local clone of linhaojun857/aurora — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in linhaojun857/aurora | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 362 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of linhaojun857/aurora. If you don't
# have one yet, run these first:
#
# git clone https://github.com/linhaojun857/aurora.git
# cd aurora
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of linhaojun857/aurora and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "linhaojun857/aurora(\\.git)?\\b" \\
&& ok "origin remote is linhaojun857/aurora" \\
|| miss "origin remote is not linhaojun857/aurora (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "aurora-springboot/src/main/java/com/aurora/AuroraSpringbootApplication.java" \\
&& ok "aurora-springboot/src/main/java/com/aurora/AuroraSpringbootApplication.java" \\
|| miss "missing critical file: aurora-springboot/src/main/java/com/aurora/AuroraSpringbootApplication.java"
test -f "aurora-springboot/src/main/java/com/aurora/config/WebSecurityConfig.java" \\
&& ok "aurora-springboot/src/main/java/com/aurora/config/WebSecurityConfig.java" \\
|| miss "missing critical file: aurora-springboot/src/main/java/com/aurora/config/WebSecurityConfig.java"
test -f "aurora-springboot/src/main/java/com/aurora/filter/JwtAuthenticationTokenFilter.java" \\
&& ok "aurora-springboot/src/main/java/com/aurora/filter/JwtAuthenticationTokenFilter.java" \\
|| miss "missing critical file: aurora-springboot/src/main/java/com/aurora/filter/JwtAuthenticationTokenFilter.java"
test -f "aurora-springboot/src/main/java/com/aurora/controller/ArticleController.java" \\
&& ok "aurora-springboot/src/main/java/com/aurora/controller/ArticleController.java" \\
|| miss "missing critical file: aurora-springboot/src/main/java/com/aurora/controller/ArticleController.java"
test -f "aurora-springboot/src/main/java/com/aurora/config/RabbitMQConfig.java" \\
&& ok "aurora-springboot/src/main/java/com/aurora/config/RabbitMQConfig.java" \\
|| miss "missing critical file: aurora-springboot/src/main/java/com/aurora/config/RabbitMQConfig.java"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 362 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~332d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/linhaojun857/aurora"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Aurora is a full-stack, self-hosted personal blog system built on Spring Boot 2.3.7 + Vue 3 (frontend) / Vue 2 (admin) that combines content management, user authentication, real-time search via Elasticsearch, and asynchronous job processing with RabbitMQ. It provides both a public-facing blog frontend and an admin dashboard for managing articles, comments, categories, and site metadata with integrated social login (QQ) and file storage via MinIO. Maven monorepo split into aurora-springboot/ (backend) and companion Vue projects (frontend at /src/main/vue, admin at separate location). Backend uses layered Spring architecture: annotation/ (AOP markers like @AccessLimit, @OptLog), aspect/ (cross-cutting concerns), config/ (Bean definitions for Redis, RabbitMQ, Security), constant/ (app-wide enums), controller/ (REST endpoints), consumer/ (async message handlers for RabbitMQ), with supporting entity/service/mapper layers (inferred from Mybatis-Plus setup).
👥Who it's for
Individual bloggers and small teams who want a full-featured, open-source blog platform they can self-host and customize; Java/Vue developers who want to study a production-grade example of Spring Security + Mybatis-Plus + Vue SPA architecture with caching and message queues.
🌱Maturity & risk
Actively maintained by a single student contributor (linhaojun857) with a live demo at linhaojun.top and explicit long-term maintenance commitment in the README. Has CI/CD via GitHub Actions (aurora.yml), Dockerfile support, and a deployed MySQL schema (aurora.sql), but commit frequency and test coverage are not visible—treat as 'stable + regularly patched' rather than enterprise-grade.
Single-maintainer maintenance model with explicit note that author is a student with Java as non-primary language, risking slower issue resolution. Dependency stack is moderately heavy (Redis, RabbitMQ, Elasticsearch, Quartz, MinIO) requiring external services; no visible test suite in file listing. Spring Boot 2.3.7 (released 2020) is aging but still in extended support.
Active areas of work
No recent commit data in file listing, but the README's TODO list indicates: frontend code optimization, Vue 3 migration for admin panel (currently Vue 2), and a lightweight backend variant in progress. Live site is maintained at linhaojun.top with demo credentials available.
🚀Get running
Clone: git clone https://github.com/linhaojun857/aurora.git. Install backend: cd aurora-springboot && mvn clean install. Install frontend: npm install in the Vue project directories. Configure application.yml with MySQL, Redis, RabbitMQ, Elasticsearch, MinIO, and QQ OAuth credentials. Run backend: mvn spring-boot:run (or start via IDE). Run frontend: npm run dev.
Daily commands:
Backend: cd aurora-springboot && mvn spring-boot:run (assumes application.yml configured with DB, Redis, RabbitMQ, ES, MinIO endpoints). Frontend: npm run dev in respective Vue directories. Docker: docker build -f aurora-springboot/Dockerfile -t aurora:latest . and docker-compose (see deployment docs). All external services (MySQL, Redis, RabbitMQ, Elasticsearch, MinIO) must be running or mocked.
🗺️Map of the codebase
aurora-springboot/src/main/java/com/aurora/AuroraSpringbootApplication.java— Application entry point; required to understand how Spring Boot initializes the entire blog systemaurora-springboot/src/main/java/com/aurora/config/WebSecurityConfig.java— Defines Spring Security configuration and JWT-based authentication flow; core to understanding access controlaurora-springboot/src/main/java/com/aurora/filter/JwtAuthenticationTokenFilter.java— JWT token validation filter executed on every request; critical to understanding request authentication lifecycleaurora-springboot/src/main/java/com/aurora/controller/ArticleController.java— Primary API endpoint for article operations; demonstrates controller patterns used throughout the codebaseaurora-springboot/src/main/java/com/aurora/config/RabbitMQConfig.java— Message queue configuration for async operations like comments and notifications; essential for understanding event-driven flowsaurora-springboot/pom.xml— Maven dependencies; shows all external libraries and their versions (SpringBoot 2.3.7, MyBatisPlus, Redis, RabbitMQ, etc.)aurora-springboot/sql/aurora.sql— Database schema and initial data; required for understanding the data model and relationships
🛠️How to make changes
Add a New REST API Endpoint
- Create a new entity class in entity/ folder (e.g., MyEntity.java) with @TableName and field annotations (
aurora-springboot/src/main/java/com/aurora/entity) - Create a mapper interface extending BaseMapper<MyEntity> in a mapper/ folder (auto-scaffolded by MyBatisPlus) (
aurora-springboot/src/main/java/com/aurora) - Create a service class with @Service annotation and inject the mapper via @Autowired (
aurora-springboot/src/main/java/com/aurora) - Add @GetMapping, @PostMapping, @PutMapping, @DeleteMapping methods in a new controller class (
aurora-springboot/src/main/java/com/aurora/controller/MyEntityController.java) - Add URL patterns to WebSecurityConfig.java if authentication/authorization is required (
aurora-springboot/src/main/java/com/aurora/config/WebSecurityConfig.java)
Add Asynchronous Event Processing via RabbitMQ
- Define queue, exchange, and binding in RabbitMQConfig.java with @Bean methods (
aurora-springboot/src/main/java/com/aurora/config/RabbitMQConfig.java) - Add queue name constant to RabbitMQConstant.java (
aurora-springboot/src/main/java/com/aurora/constant/RabbitMQConstant.java) - Create a new consumer class in consumer/ folder with @RabbitListener(queues = ...) (
aurora-springboot/src/main/java/com/aurora/consumer/MyEventConsumer.java) - Publish events to the queue using RabbitTemplate.convertAndSend() in your service (
aurora-springboot/src/main/java/com/aurora)
Add Operation Logging to a Method
- Add @OptLog annotation with description above the method in any controller or service (
aurora-springboot/src/main/java/com/aurora/annotation/OptLog.java) - OperationLogAspect will automatically intercept and log the operation to the database (
aurora-springboot/src/main/java/com/aurora/aspect/OperationLogAspect.java) - View logs via OperationLogController REST endpoints (
aurora-springboot/src/main/java/com/aurora/controller/OperationLogController.java)
Implement Rate Limiting on an Endpoint
- Add @AccessLimit(seconds = 60, maxCount = 5) annotation above the endpoint method (
aurora-springboot/src/main/java/com/aurora/annotation/AccessLimit.java) - Configure the interceptor in WebMvcConfig.java to apply the @AccessLimit check (
aurora-springboot/src/main/java/com/aurora/config/WebMvcConfig.java) - Rate limit counters are stored in Redis with the key pattern from RedisConstant.java (
aurora-springboot/src/main/java/com/aurora/constant/RedisConstant.java)
🔧Why these technologies
- Spring Boot 2.3.7 + Spring Security — Provides out-of-the-box web framework with battle-tested security framework for JWT and role-based access control
- MyBatisPlus ORM — Reduces boilerplate SQL with automatic CRUD code generation while maintaining fine-grained query control
- Redis — High-speed in-memory cache for frequently accessed data (articles, user sessions) and rate limiting counters
- RabbitMQ — Decouples heavy operations (email,
🪤Traps & gotchas
External service dependencies: Redis, RabbitMQ, Elasticsearch, MinIO, and MySQL must all be running; no embedded or mocked fallback. Environment variables: MinIO credentials, QQ OAuth app ID/secret, SMTP settings for email notifications must be set in application.yml or .env—missing them silently breaks file upload, social login, and comment notifications. RabbitMQ consumers: MaxWellConsumer expects a Debezium-style MySQL CDC stream; misconfiguration causes data-change events to pile up. Elasticsearch schema: Full-text search on articles requires index mapping to match Article entity; index not auto-created. Quartz: Job scheduling requires Quartz tables in MySQL (auto-created if schema matches), but concurrent job executions can cause race conditions if cluster mode not properly configured. Spring Security filters: Custom security filters in WebSecurityConfig may conflict with CORS; test cross-origin requests from admin frontend to backend carefully.
🏗️Architecture
💡Concepts to learn
- Spring Security with JWT/OAuth — Aurora uses Spring Security to guard endpoints and support both traditional JWT login and social login (QQ); understanding filter chains and token rotation is crucial for adding new auth flows or fixing security bugs.
- RabbitMQ Message-Driven Architecture — Aurora decouples I/O-heavy operations (email notifications, search indexing, data change capture) into async RabbitMQ consumers; this prevents blocking the API when processing comment notifications or syncing to Elasticsearch.
- Aspect-Oriented Programming (AOP) with Spring — Aurora uses @Aspect annotations (@AccessLimit, @OptLog) to transparently log operations and enforce rate limits without polluting controller code—critical pattern for cross-cutting concerns.
- Elasticsearch Full-Text Search — Aurora indexes blog articles in Elasticsearch for fast keyword search; understanding mappings, analyzers, and query DSL is needed to extend search (e.g., faceting by category, relevance tuning).
- Change Data Capture (CDC) with Maxwell — Aurora's MaxWellConsumer listens to MySQL binary logs via Maxwell to sync article/comment changes into Elasticsearch in real-time; understanding CDC patterns is essential for maintaining data consistency.
- Mybatis-Plus ORM — Aurora uses Mybatis-Plus for database access with auto-generated CRUD, dynamic SQL, and pagination; proficiency here is needed to add new entities and queries without boilerplate.
- Rate Limiting via @AccessLimit Annotation — Aurora's custom @AccessLimit annotation (in annotation/AccessLimit.java) likely uses Redis for distributed rate limiting; understanding token bucket or sliding window concepts protects against abuse.
🔗Related repos
halo-dev/halo— Feature-rich, JVM-based blog platform similar to Aurora but with more mature plugin ecosystem and better documentation; good reference for production-grade blog architecture.vuepress/vuepress-next— Static blog generator with Vue 3 frontend; lightweight alternative if you don't need database-driven content or user comments.getgrav/grav— Flat-file blog system in PHP with no external dependencies; useful comparison for Aurora's monolithic approach vs. decentralized content model.wordpress/wordpress-develop— Industry-standard blog platform; not Java-based, but defines UX expectations (post revisions, comment moderation, plugin hooks) that Aurora aspires to.auroral-ui/hexo-theme-aurora— Original Hexo theme that inspired Aurora's frontend UI—check this repo to understand the design language and CSS frameworks Aurora borrowed.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive unit tests for consumer classes (CommentNoticeConsumer, MaxWellConsumer, SubscribeConsumer)
The project has RabbitMQ message consumers but no visible test coverage. These are critical components for comment notifications and data synchronization. Adding unit tests would catch message processing bugs early and ensure reliability of the async messaging pipeline. This is especially important given the complexity of RabbitMQ integration.
- [ ] Create aurora-springboot/src/test/java/com/aurora/consumer/ directory
- [ ] Add CommentNoticeConsumerTest.java with mocked RabbitTemplate and test cases for comment notification routing
- [ ] Add MaxWellConsumerTest.java to verify CDC (Change Data Capture) event processing
- [ ] Add SubscribeConsumerTest.java for subscription message handling
- [ ] Update pom.xml to ensure junit5 and mockito dependencies are present for testing
Add integration tests for security and authentication flows in WebSecurityConfig
The project uses Spring Security (WebSecurityConfig.java) and has UserAuthController.java for login/OAuth integration, but no visible security test coverage. Given the presence of QQ OAuth (QQConfigProperties.java) and JWT/token handling, adding security tests would prevent authentication bypass vulnerabilities and ensure proper role-based access control across all endpoints.
- [ ] Create aurora-springboot/src/test/java/com/aurora/config/WebSecurityConfigTest.java
- [ ] Add tests for OAuth login flow with QQ provider (QQConfigProperties)
- [ ] Add tests for JWT token validation and refresh mechanisms
- [ ] Add tests for role-based endpoint access (Admin vs User permissions) across controllers
- [ ] Include tests for CORS and CSRF protection configurations
Add GitHub Actions workflow for automated database schema validation and migration testing
The project has aurora.sql schema file but the existing aurora.yml workflow appears incomplete. Adding automated schema validation ensures that SQL changes don't break the build and that MybatisPlus ORM stays synchronized with the actual database. This is critical for preventing production data issues.
- [ ] Review and complete .github/workflows/aurora.yml with database testing stage
- [ ] Add a test job that spins up a MySQL container and executes aurora.sql
- [ ] Validate that all Entity classes (Article.java, Comment.java, Category.java, etc.) match the schema
- [ ] Add schema diff detection to flag mismatches between aurora.sql and MybatisPlus annotations
- [ ] Include liquibase or flyway migration testing to prepare for versioned schema changes
🌿Good first issues
- Write integration tests for
ArticleController.javamethods (listArticles, getArticleDetail, createArticle)—currently no visible test files and coverage is opaque. Start with a simple @SpringBootTest that mocks ArticleService and verifies HTTP status codes. - Add missing OpenAPI/Swagger documentation:
Knife4jConfig.javais configured but controller methods lack @ApiOperation/@ApiModelProperty annotations—add Knife4j decorators to at least 5 REST endpoints in ArticleController and CommentController to generate clean API docs. - Create a troubleshooting guide in /docs for the hidden traps above (RabbitMQ consumer setup, Elasticsearch index mapping, MinIO URL configuration)—document real errors junior devs hit when running locally for the first time.
⭐Top contributors
Click to expand
Top contributors
- @linhaojun857 — 79 commits
- @YoungYo — 10 commits
- @anxuezhi — 3 commits
- @karl1901 — 2 commits
- @xinchenXE — 2 commits
📝Recent commits
Click to expand
Recent commits
07e9524— Update README.md [skip ci] (linhaojun857)cebf431— Merge pull request #177 from karl1901/master [skip ci] (linhaojun857)bf0358e— 添加CentOS一键部署脚本原文件 (karl1901)7490a01— README.md 增加了 快速开始 -> 一键安装 命令 (karl1901)0ce9d9a— Merge pull request #169 from linhaojun857/dev (linhaojun857)168d504— Fix safety problem (linhaojun857)f355e03— Merge pull request #166 from linhaojun857/dev (linhaojun857)bec1630— Update Dockerfile (linhaojun857)7a4282a— Merge pull request #165 from linhaojun857/dev (linhaojun857)ce27399— Update the show of article title cursor in the archive page (linhaojun857)
🔒Security observations
Failed to generate security analysis.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.