# cavincao/mini-blog architecture

> Architecture diagram of the GitHub repository cavincao/mini-blog, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/cavincao/mini-blog
- Repository: https://github.com/cavincao/mini-blog

## Overview

Mini Blog is a WeChat mini-program blog with a cloud-function backend and a documented Page → ViewModel → Service → Backend architecture; the README also describes a Mock option. The main reader workflow loads and searches posts, then renders rich text. Admin, member, messaging, GitHub synchronization, and Markdown rendering are separate product capabilities. Edges are limited to README statements and shown source references/calls; several listed pages and cloud functions were not sampled, so their internal dispatch details are not inferred.

Main entry points: [`miniprogram/services/ServiceFactory.js`](https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/ServiceFactory.js) (Service factory), [`miniprogram/services/cloud/BaseCloudService.js`](https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/cloud/BaseCloudService.js) (Cloud service base), [`miniprogram/pages/articleSearch/articleSearch.js`](https://github.com/cavincao/mini-blog/blob/master/miniprogram/pages/articleSearch/articleSearch.js) (Article search), [`miniprogram/pages/detail/detail.js`](https://github.com/cavincao/mini-blog/blob/master/miniprogram/pages/detail/detail.js) (Article detail)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_reader["Reading and discovery"]
  node_search["Article search<br/>[articleSearch.js]"]
  node_detail["Article detail<br/>[detail.js]"]
  node_postvm["Post ViewModel<br/>[PostViewModel.js]"]
  node_towxml["Rich-text renderer<br/>[index.js]"]
  node_markdown["Markdown parser<br/>[markdown.js]"]
  node_markdownplugins["Markdown extensions"]
  node_tokenizer["HTML tokenizer<br/>[Tokenizer.js]"]
end

subgraph group_admin["Content administration"]
  node_adminpage["Admin pages"]
  node_adminvm["Admin ViewModel<br/>[AdminViewModel.js]"]
end

subgraph group_account["Member and messaging"]
  node_memberpages["Member pages"]
  node_membervm["Member ViewModel<br/>[MemberViewModel.js]"]
  node_messagevm["Message ViewModel"]
end

subgraph group_integration["GitHub integration"]
  node_gitpages["GitHub pages"]
  node_gitvm["GitHub ViewModel<br/>[GitHubViewModel.js]"]
  node_syncfunction["GitHub sync<br/>[index.js]"]
end

subgraph group_runtime["Services and backend"]
  node_factory["Service factory<br/>[ServiceFactory.js]"]
  node_cloudpost["Cloud post service"]
  node_cloudadmin["Cloud admin service"]
  node_cloudmember["Cloud member service"]
  node_basecloud["Cloud service base"]
  node_postsfunction["Post cloud function<br/>[index.js]"]
  node_adminfunction["Admin cloud function<br/>[index.js]"]
  node_memberfunction["Member cloud function<br/>[index.js]"]
end

node_visitor(("Mini-program user"))
node_cloud[("WeChat cloud platform")]

node_visitor -->|"searches"| node_search
node_visitor -->|"reads"| node_detail
node_search -->|"requests posts"| node_postvm
node_search -->|"loads labels"| node_adminvm
node_detail -.->|"loads details"| node_postvm
node_adminpage -->|"manages content"| node_adminvm
node_memberpages -->|"uses"| node_membervm
node_gitpages -->|"uses"| node_gitvm
node_postvm -->|"gets service"| node_factory
node_adminvm -->|"gets service"| node_factory
node_factory -->|"selects cloud"| node_cloudpost
node_factory -->|"selects cloud"| node_cloudadmin
node_factory -->|"selects cloud"| node_cloudmember
node_cloudpost -->|"extends"| node_basecloud
node_cloudadmin -->|"extends"| node_basecloud
node_cloudmember -->|"extends"| node_basecloud
node_basecloud -->|"calls functions"| node_cloud
node_cloudpost -->|"dispatches actions"| node_postsfunction
node_cloudadmin -->|"dispatches actions"| node_adminfunction
node_cloudmember -->|"dispatches actions"| node_memberfunction
node_detail -.->|"renders content"| node_towxml
node_towxml -->|"parses Markdown"| node_markdown
node_markdown -->|"uses extensions"| node_markdownplugins
node_towxml -->|"parses markup"| node_tokenizer
node_gitvm -.->|"syncs articles"| node_syncfunction

click node_search "https://github.com/cavincao/mini-blog/blob/master/miniprogram/pages/articleSearch/articleSearch.js"
click node_detail "https://github.com/cavincao/mini-blog/blob/master/miniprogram/pages/detail/detail.js"
click node_postvm "https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/PostViewModel.js"
click node_adminpage "https://github.com/cavincao/mini-blog/tree/master/miniprogram/pages/admin"
click node_adminvm "https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/AdminViewModel.js"
click node_memberpages "https://github.com/cavincao/mini-blog/tree/master/miniprogram/pages/mine"
click node_membervm "https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/MemberViewModel.js"
click node_messagevm "https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/MessageViewModel.js"
click node_gitpages "https://github.com/cavincao/mini-blog/tree/master/miniprogram/pages/git"
click node_gitvm "https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/GitHubViewModel.js"
click node_syncfunction "https://github.com/cavincao/mini-blog/blob/master/cloudfunctions/syncService/index.js"
click node_towxml "https://github.com/cavincao/mini-blog/blob/master/miniprogram/towxml/index.js"
click node_markdown "https://github.com/cavincao/mini-blog/blob/master/miniprogram/towxml/parse/markdown/markdown.js"
click node_markdownplugins "https://github.com/cavincao/mini-blog/tree/master/miniprogram/towxml/parse/markdown/plugins"
click node_tokenizer "https://github.com/cavincao/mini-blog/blob/master/miniprogram/towxml/parse/parse2/Tokenizer.js"
click node_factory "https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/ServiceFactory.js"
click node_cloudpost "https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/cloud/CloudPostService.js"
click node_cloudadmin "https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/cloud/CloudAdminService.js"
click node_cloudmember "https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/cloud/CloudMemberService.js"
click node_basecloud "https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/cloud/BaseCloudService.js"
click node_postsfunction "https://github.com/cavincao/mini-blog/blob/master/cloudfunctions/postsService/index.js"
click node_adminfunction "https://github.com/cavincao/mini-blog/blob/master/cloudfunctions/adminService/index.js"
click node_memberfunction "https://github.com/cavincao/mini-blog/blob/master/cloudfunctions/memberService/index.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_search,node_detail,node_postvm,node_towxml,node_markdown,node_markdownplugins,node_tokenizer,node_visitor toneBlue
class node_adminpage,node_adminvm,node_cloud toneAmber
class node_memberpages,node_membervm,node_messagevm toneMint
class node_gitpages,node_gitvm,node_syncfunction toneRose
class node_factory,node_cloudpost,node_cloudadmin,node_cloudmember,node_basecloud,node_postsfunction,node_adminfunction,node_memberfunction toneIndigo
```

## Components

### Reading and discovery

- [Article search](https://github.com/cavincao/mini-blog/blob/master/miniprogram/pages/articleSearch/articleSearch.js): `miniprogram/pages/articleSearch/articleSearch.js`
- [Article detail](https://github.com/cavincao/mini-blog/blob/master/miniprogram/pages/detail/detail.js): `miniprogram/pages/detail/detail.js`
- [Post ViewModel](https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/PostViewModel.js): `miniprogram/viewmodels/PostViewModel.js`
- [Rich-text renderer](https://github.com/cavincao/mini-blog/blob/master/miniprogram/towxml/index.js): `miniprogram/towxml/index.js`
- [Markdown parser](https://github.com/cavincao/mini-blog/blob/master/miniprogram/towxml/parse/markdown/markdown.js): `miniprogram/towxml/parse/markdown/markdown.js`
- [Markdown extensions](https://github.com/cavincao/mini-blog/tree/master/miniprogram/towxml/parse/markdown/plugins): `miniprogram/towxml/parse/markdown/plugins`
- [HTML tokenizer](https://github.com/cavincao/mini-blog/blob/master/miniprogram/towxml/parse/parse2/Tokenizer.js): `miniprogram/towxml/parse/parse2/Tokenizer.js`

### Content administration

- [Admin pages](https://github.com/cavincao/mini-blog/tree/master/miniprogram/pages/admin): `miniprogram/pages/admin`
- [Admin ViewModel](https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/AdminViewModel.js): `miniprogram/viewmodels/AdminViewModel.js`

### Member and messaging

- [Member pages](https://github.com/cavincao/mini-blog/tree/master/miniprogram/pages/mine): `miniprogram/pages/mine`
- [Member ViewModel](https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/MemberViewModel.js): `miniprogram/viewmodels/MemberViewModel.js`
- [Message ViewModel](https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/MessageViewModel.js): `miniprogram/viewmodels/MessageViewModel.js`

### GitHub integration

- [GitHub pages](https://github.com/cavincao/mini-blog/tree/master/miniprogram/pages/git): `miniprogram/pages/git`
- [GitHub ViewModel](https://github.com/cavincao/mini-blog/blob/master/miniprogram/viewmodels/GitHubViewModel.js): `miniprogram/viewmodels/GitHubViewModel.js`
- [GitHub sync](https://github.com/cavincao/mini-blog/blob/master/cloudfunctions/syncService/index.js): `cloudfunctions/syncService/index.js`

### Services and backend

- [Service factory](https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/ServiceFactory.js): `miniprogram/services/ServiceFactory.js`
- [Cloud post service](https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/cloud/CloudPostService.js): `miniprogram/services/cloud/CloudPostService.js`
- [Cloud admin service](https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/cloud/CloudAdminService.js): `miniprogram/services/cloud/CloudAdminService.js`
- [Cloud member service](https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/cloud/CloudMemberService.js): `miniprogram/services/cloud/CloudMemberService.js`
- [Cloud service base](https://github.com/cavincao/mini-blog/blob/master/miniprogram/services/cloud/BaseCloudService.js): `miniprogram/services/cloud/BaseCloudService.js`
- [Post cloud function](https://github.com/cavincao/mini-blog/blob/master/cloudfunctions/postsService/index.js): `cloudfunctions/postsService/index.js`
- [Admin cloud function](https://github.com/cavincao/mini-blog/blob/master/cloudfunctions/adminService/index.js): `cloudfunctions/adminService/index.js`
- [Member cloud function](https://github.com/cavincao/mini-blog/blob/master/cloudfunctions/memberService/index.js): `cloudfunctions/memberService/index.js`

### Other components

- **Mini-program user**
- **WeChat cloud platform**

## Connections

- Mini-program user → Article search: searches (evidence: `README.md`)
- Mini-program user → Article detail: reads (evidence: `README.md`)
- Article search → Post ViewModel: requests posts (evidence: `miniprogram/pages/articleSearch/articleSearch.js`)
- Article search → Admin ViewModel: loads labels (evidence: `miniprogram/pages/articleSearch/articleSearch.js`)
- Article detail → Post ViewModel: loads details
- Admin pages → Admin ViewModel: manages content (evidence: `README.md`)
- Member pages → Member ViewModel: uses (evidence: `README.md`)
- GitHub pages → GitHub ViewModel: uses (evidence: `README.md`)
- Post ViewModel → Service factory: gets service (evidence: `miniprogram/viewmodels/PostViewModel.js`)
- Admin ViewModel → Service factory: gets service (evidence: `miniprogram/viewmodels/AdminViewModel.js`)
- Service factory → Cloud post service: selects cloud (evidence: `miniprogram/services/ServiceFactory.js`)
- Service factory → Cloud admin service: selects cloud (evidence: `miniprogram/services/ServiceFactory.js`)
- Service factory → Cloud member service: selects cloud (evidence: `miniprogram/services/ServiceFactory.js`)
- Cloud post service → Cloud service base: extends (evidence: `miniprogram/services/cloud/CloudPostService.js`)
- Cloud admin service → Cloud service base: extends (evidence: `miniprogram/services/cloud/CloudAdminService.js`)
- Cloud member service → Cloud service base: extends (evidence: `miniprogram/services/cloud/CloudMemberService.js`)
- Cloud service base → WeChat cloud platform: calls functions (evidence: `miniprogram/services/cloud/BaseCloudService.js`)
- Cloud post service → Post cloud function: dispatches actions (evidence: `miniprogram/services/cloud/CloudPostService.js`)
- Cloud admin service → Admin cloud function: dispatches actions (evidence: `miniprogram/services/cloud/CloudAdminService.js`)
- Cloud member service → Member cloud function: dispatches actions (evidence: `miniprogram/services/cloud/CloudMemberService.js`)
- Article detail → Rich-text renderer: renders content
- Rich-text renderer → Markdown parser: parses Markdown
- Markdown parser → Markdown extensions: uses extensions (evidence: `miniprogram/towxml/parse/markdown/index.js`)
- Rich-text renderer → HTML tokenizer: parses markup
- GitHub ViewModel → GitHub sync: syncs articles
