{"adoption": {"forks": 391, "observed_at": "2026-08-28T04:03:48.112374+00:00", "stars": 1156}, "canonical_url": "https://ross.abutalabs.com/products/eblog", "card": {"archived": false, "artifact_type": "learning-resource", "description": "eblog是一个基于Springboot2.1.2开发的博客学习项目，为了让项目融合更多的知识点，达到学习目的，编写了详细的从0到1开发文档。主要学习包括：自定义Freemarker标签，redis的zset结构完成本周热议排行榜，t-io+websocket完成即时消息通知和群聊，rabbitmq+elasticsearch完成博客内容搜索引擎等。值得学习的地方很多！", "domain": ["web-development", "education", "databases", "tutorials"], "enriched": true, "function": ["web-framework", "search-engine", "caching", "message-queue", "websocket", "auth", "orm", "templating", "chat-interface"], "health_score": 20, "homepage": "https://juejin.im/post/5ee88c58518825434c3db0e5", "language": "JavaScript", "license": "MIT", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["MarkerHub/eblog"], "name": "MarkerHub/eblog", "platform": ["jvm", "self-hosted"], "pushed_at": "2024-05-16T17:14:53+00:00", "repo": "MarkerHub/eblog", "stars": 1156, "tags": ["spring-boot", "blog", "mybatis-plus", "shiro", "freemarker", "elasticsearch", "rabbitmq", "redis", "t-io", "tutorial-project", "chinese", "search", "web-server"], "topics": [], "urls": [], "use_cases": ["learn spring boot by building a blog", "learn how to integrate elasticsearch with rabbitmq for content search", "implement websocket group chat with t-io", "learn redis zset ranking implementation", "study shiro and redis session sharing", "learn mybatis plus code generation", "follow a full-stack java blog tutorial"], "what_it_is": "eblog is a Spring Boot 2.1.2-based blog project built as a learning exercise, accompanied by a detailed from-zero-to-one development tutorial and video courses. It integrates many technologies including Shiro+Redis session sharing, Redis zset hot-topic rankings, t-io+WebSocket instant messaging and group chat, and RabbitMQ+Elasticsearch content search.", "when_to_avoid": ["you need a production-ready blog platform with security hardening like XSS protection", "you need an actively maintained codebase on current framework versions", "you want a modern frontend or a decoupled front/back-end architecture"], "when_to_choose": ["you want a guided, documented Java learning project covering many common middleware", "you prefer tutorials with written docs and video walkthroughs", "you want to see how Spring Boot, Redis, RabbitMQ, Elasticsearch, and WebSocket fit together in one app"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/eblog", "repo": "MarkerHub/eblog", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.112374+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:32:05.945546+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "13206b1e9f83a68b2eba3123a513ab17e1c2d5a37e74a98fb22d1dbc8edd3ccf", "fetched_at": "2026-08-28T04:03:48.112374+00:00", "kind": "readme", "missing": false, "url": "https://github.com/MarkerHub/eblog"}, {"content_hash": "a163c70ccbc52bea9a6020bdd61c7e1ce63a34c37a084e02e009f4f15f180f41", "fetched_at": "2026-08-29T12:37:25.543095+00:00", "kind": "homepage", "missing": false, "url": "https://juejin.im/post/5ee88c58518825434c3db0e5"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2367, "days_push": 839, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 32, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}