---
config:
    layout: elk
---
classDiagram
    %% 管理站点类
    class DjangoBlogAdminSite {
        +site_header
        +site_title
        +has_permission()
    }

    %% 应用配置类
    class DjangoblogAppConfig {
        +ready()
    }

    %% 信号处理器
    class blog_signals {
        <<module>>
        +send_email_signal
        +oauth_user_login_signal
        +send_email_signal_handler()
        +oauth_user_login_signal_handler()
        +model_post_save_callback()
        +user_auth_callback()
    }

    %% 搜索引擎相关类
    class ElasticSearchBackend {
        +manager
        +search()
        +get_suggestion()
        +_create()
        +_delete()
        +_rebuild()
        +update()
        +remove()
        +clear()
    }

    class ElasticSearchQuery {
        +_convert_datetime()
        +clean()
        +build_query_fragment()
        +get_count()
        +get_spelling_suggestion()
    }

    class ElasticSearchModelSearchForm {
        +search()
    }

    class ElasticSearchEngine

    class WhooshSearchBackend {
        +RESERVED_WORDS
        +RESERVED_CHARACTERS
        +setup()
        +build_schema()
        +update()
        +remove()
        +clear()
        +delete_index()
        +optimize()
        +search()
        +more_like_this()
        +_process_results()
        +create_spelling_suggestion()
    }

    class WhooshSearchQuery {
        +_convert_datetime()
        +clean()
        +build_query_fragment()
    }

    class WhooshEngine

    class WhooshHtmlFormatter {
        +template
    }

    %% RSS订阅类
    class DjangoBlogFeed {
        +feed_type
        +description
        +title
        +link
        +author_name()
        +author_link()
        +items()
        +item_title()
        +item_description()
        +feed_copyright()
        +item_link()
        +item_guid()
    }

    %% 日志管理类
    class LogEntryAdmin {
        +list_filter
        +search_fields
        +list_display
        +has_add_permission()
        +has_change_permission()
        +has_delete_permission()
        +object_link()
        +user_link()
        +get_queryset()
        +get_actions()
    }

    %% 站点地图类
    class StaticViewSitemap {
        +priority
        +changefreq
        +items()
        +location()
    }

    class ArticleSiteMap {
        +changefreq
        +priority
        +items()
        +lastmod()
    }

    class CategorySiteMap {
        +changefreq
        +priority
        +items()
        +lastmod()
    }

    class TagSiteMap {
        +changefreq
        +priority
        +items()
        +lastmod()
    }

    class UserSiteMap {
        +changefreq
        +priority
        +items()
        +lastmod()
    }

    %% 蜘蛛通知类
    class SpiderNotify {
        <<static>>
        +baidu_notify()
        +notify()
    }

    %% 测试类
    class DjangoBlogTest

    %% 工具类
    class CommonMarkdown {
        <<static>>
        +_convert_markdown()
        +get_markdown_with_toc()
        +get_markdown()
    }

    %% 设置类（配置）
    class settings {
        <<module>>
        +INSTALLED_APPS
        +MIDDLEWARE
        +DATABASES
        +HAYSTACK_CONNECTIONS
        +CACHES
        +LOGGING
    }

    %% URL配置
    class urls {
        <<module>>
        +urlpatterns
        +handler404
        +handler500
        +handle403
    }

    %% WSGI配置
    class wsgi {
        <<module>>
        +application
    }

    %% 继承关系
    DjangoBlogAdminSite --|> AdminSite
    DjangoblogAppConfig --|> AppConfig
    ElasticSearchBackend --|> BaseSearchBackend
    ElasticSearchQuery --|> BaseSearchQuery
    ElasticSearchEngine --|> BaseEngine
    WhooshSearchBackend --|> BaseSearchBackend
    WhooshSearchQuery --|> BaseSearchQuery
    WhooshEngine --|> BaseEngine
    WhooshHtmlFormatter --|> HtmlFormatter
    DjangoBlogFeed --|> Feed
    LogEntryAdmin --|> ModelAdmin
    StaticViewSitemap --|> Sitemap
    ArticleSiteMap --|> Sitemap
    CategorySiteMap --|> Sitemap
    TagSiteMap --|> Sitemap
    UserSiteMap --|> Sitemap
    DjangoBlogTest --|> TestCase

    %% 关联关系
    DjangoBlogAdminSite --> ArticlelAdmin : 注册
    DjangoBlogAdminSite --> CategoryAdmin : 注册
    DjangoBlogAdminSite --> TagAdmin : 注册
    DjangoBlogAdminSite --> LinksAdmin : 注册
    DjangoBlogAdminSite --> SideBarAdmin : 注册
    DjangoBlogAdminSite --> BlogSettingsAdmin : 注册
    DjangoBlogAdminSite --> CommandsAdmin : 注册
    DjangoBlogAdminSite --> EmailSendLogAdmin : 注册
    DjangoBlogAdminSite --> BlogUserAdmin : 注册
    DjangoBlogAdminSite --> CommentAdmin : 注册
    DjangoBlogAdminSite --> OAuthUserAdmin : 注册
    DjangoBlogAdminSite --> OAuthConfigAdmin : 注册
    DjangoBlogAdminSite --> OwnTrackLogsAdmin : 注册
    DjangoBlogAdminSite --> SiteAdmin : 注册
    DjangoBlogAdminSite --> LogEntryAdmin : 注册

    ElasticSearchBackend --> ArticleDocumentManager : 使用
    ElasticSearchModelSearchForm --> ElasticSearchBackend : 配置
    WhooshSearchBackend --> ChineseAnalyzer : 使用

    blog_signals --> Comment : 信号处理
    blog_signals --> OAuthUser : 信号处理
    blog_signals --> LogEntry : 信号处理
    blog_signals --> EmailSendLog : 记录

    DjangoBlogFeed --> Article : 获取内容
    ArticleSiteMap --> Article : 映射
    CategorySiteMap --> Category : 映射
    TagSiteMap --> Tag : 映射
    UserSiteMap --> Article : 映射

    %% 依赖关系
    DjangoblogAppConfig ..> plugin_manage.loader : 导入
    blog_signals ..> comments.utils : 导入
    blog_signals ..> djangoblog.utils : 导入
    blog_signals ..> djangoblog.spider_notify : 导入
    ElasticSearchBackend ..> blog.documents : 导入
    WhooshSearchBackend ..> jieba.analyse : 导入
    utils ..> bleach : 导入
    utils ..> markdown : 导入

    %% 配置关系
    settings --> INSTALLED_APPS : 包含所有应用
    settings --> MIDDLEWARE : 包含中间件
    urls --> admin_site : 包含管理路由
    urls --> blog.urls : 包含博客路由
    urls --> comments.urls : 包含评论路由
    urls --> accounts.urls : 包含账户路由
    urls --> oauth.urls : 包含OAuth路由
    urls --> servermanager.urls : 包含服务器管理路由
    urls --> owntracks.urls : 包含位置跟踪路由