|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 668 KiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 400 KiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 966 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 728 KiB |
@ -0,0 +1,22 @@
|
|||||||
|
graph TD
|
||||||
|
subgraph DjangoBlog Project
|
||||||
|
A[accounts] -->|用户体系| B[blog]
|
||||||
|
A -->|用户登录| C[comments]
|
||||||
|
A -->|用户绑定| D[oauth]
|
||||||
|
A -->|用户轨迹| E[owntracks]
|
||||||
|
|
||||||
|
B -->|文章内容| C
|
||||||
|
B -->|搜索功能| F[djangoblog]
|
||||||
|
B -->|插件扩展| G[plugins]
|
||||||
|
B -->|API接口| H[servermanager]
|
||||||
|
|
||||||
|
F -->|搜索引擎| B
|
||||||
|
F -->|站点地图| B
|
||||||
|
|
||||||
|
G -->|插件功能| B
|
||||||
|
|
||||||
|
H -->|邮件/命令| B
|
||||||
|
H -->|微信处理| B
|
||||||
|
|
||||||
|
D -->|第三方登录| A
|
||||||
|
end
|
||||||
@ -0,0 +1,133 @@
|
|||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
|
||||||
|
classDiagram
|
||||||
|
%% 模型类
|
||||||
|
class BlogUser {
|
||||||
|
+String nickname
|
||||||
|
+DateTime creation_time
|
||||||
|
+DateTime last_modify_time
|
||||||
|
+String source
|
||||||
|
+get_absolute_url()
|
||||||
|
+get_full_url()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 表单类
|
||||||
|
class BlogUserCreationForm {
|
||||||
|
+CharField password1
|
||||||
|
+CharField password2
|
||||||
|
+clean_password2()
|
||||||
|
+save()
|
||||||
|
}
|
||||||
|
|
||||||
|
class BlogUserChangeForm {
|
||||||
|
+__init__()
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoginForm {
|
||||||
|
+__init__()
|
||||||
|
}
|
||||||
|
|
||||||
|
class RegisterForm {
|
||||||
|
+__init__()
|
||||||
|
+clean_email()
|
||||||
|
}
|
||||||
|
|
||||||
|
class ForgetPasswordForm {
|
||||||
|
+CharField new_password1
|
||||||
|
+CharField new_password2
|
||||||
|
+EmailField email
|
||||||
|
+CharField code
|
||||||
|
+clean_new_password2()
|
||||||
|
+clean_email()
|
||||||
|
+clean_code()
|
||||||
|
}
|
||||||
|
|
||||||
|
class ForgetPasswordCodeForm {
|
||||||
|
+EmailField email
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 视图类
|
||||||
|
class RegisterView {
|
||||||
|
+form_valid()
|
||||||
|
}
|
||||||
|
|
||||||
|
class LogoutView {
|
||||||
|
+get()
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoginView {
|
||||||
|
+get_context_data()
|
||||||
|
+form_valid()
|
||||||
|
+get_success_url()
|
||||||
|
}
|
||||||
|
|
||||||
|
class ForgetPasswordView {
|
||||||
|
+form_valid()
|
||||||
|
}
|
||||||
|
|
||||||
|
class ForgetPasswordEmailCode {
|
||||||
|
+post()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 认证后端
|
||||||
|
class EmailOrUsernameModelBackend {
|
||||||
|
+authenticate()
|
||||||
|
+get_user()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 应用配置
|
||||||
|
class AccountsConfig
|
||||||
|
|
||||||
|
%% 测试类
|
||||||
|
class AccountTest
|
||||||
|
|
||||||
|
%% 工具函数
|
||||||
|
class utils {
|
||||||
|
+send_verify_email()
|
||||||
|
+verify()
|
||||||
|
+set_code()
|
||||||
|
+get_code()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 继承关系
|
||||||
|
BlogUser --|> AbstractUser
|
||||||
|
BlogUserCreationForm --|> ModelForm
|
||||||
|
BlogUserChangeForm --|> UserChangeForm
|
||||||
|
LoginForm --|> AuthenticationForm
|
||||||
|
RegisterForm --|> UserCreationForm
|
||||||
|
ForgetPasswordForm --|> Form
|
||||||
|
ForgetPasswordCodeForm --|> Form
|
||||||
|
RegisterView --|> FormView
|
||||||
|
LogoutView --|> RedirectView
|
||||||
|
LoginView --|> FormView
|
||||||
|
ForgetPasswordView --|> FormView
|
||||||
|
ForgetPasswordEmailCode --|> View
|
||||||
|
EmailOrUsernameModelBackend --|> ModelBackend
|
||||||
|
AccountsConfig --|> AppConfig
|
||||||
|
AccountTest --|> TestCase
|
||||||
|
|
||||||
|
%% 关联关系
|
||||||
|
BlogUserCreationForm --> BlogUser : 创建
|
||||||
|
BlogUserChangeForm --> BlogUser : 修改
|
||||||
|
RegisterForm --> BlogUser : 注册
|
||||||
|
ForgetPasswordForm --> BlogUser : 重置密码
|
||||||
|
RegisterView --> RegisterForm : 使用
|
||||||
|
LoginView --> LoginForm : 使用
|
||||||
|
ForgetPasswordView --> ForgetPasswordForm : 使用
|
||||||
|
ForgetPasswordEmailCode --> ForgetPasswordCodeForm : 使用
|
||||||
|
EmailOrUsernameModelBackend --> BlogUser : 认证
|
||||||
|
AccountTest --> BlogUser : 测试
|
||||||
|
AccountTest --> utils : 测试
|
||||||
|
ForgetPasswordForm --> utils : 验证
|
||||||
|
ForgetPasswordEmailCode --> utils : 发送邮件
|
||||||
|
RegisterView --> utils : 发送邮件
|
||||||
|
|
||||||
|
%% 依赖关系
|
||||||
|
views ..> utils : 导入
|
||||||
|
forms ..> BlogUser : 导入
|
||||||
|
tests ..> BlogUser : 导入
|
||||||
|
tests ..> utils : 导入
|
||||||
|
admin ..> BlogUser : 导入
|
||||||
@ -0,0 +1,266 @@
|
|||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
|
||||||
|
classDiagram
|
||||||
|
%% 基础模型类
|
||||||
|
class BaseModel {
|
||||||
|
<<abstract>>
|
||||||
|
+id
|
||||||
|
+creation_time
|
||||||
|
+last_modify_time
|
||||||
|
+save()
|
||||||
|
+get_full_url()
|
||||||
|
+get_absolute_url()*
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 核心模型类
|
||||||
|
class Article {
|
||||||
|
+title
|
||||||
|
+body
|
||||||
|
+pub_time
|
||||||
|
+status
|
||||||
|
+comment_status
|
||||||
|
+type
|
||||||
|
+views
|
||||||
|
+article_order
|
||||||
|
+show_toc
|
||||||
|
+body_to_string()
|
||||||
|
+get_category_tree()
|
||||||
|
+viewed()
|
||||||
|
+comment_list()
|
||||||
|
+get_admin_url()
|
||||||
|
+next_article()
|
||||||
|
+prev_article()
|
||||||
|
+get_first_image_url()
|
||||||
|
}
|
||||||
|
|
||||||
|
class Category {
|
||||||
|
+name
|
||||||
|
+parent_category
|
||||||
|
+slug
|
||||||
|
+index
|
||||||
|
+get_category_tree()
|
||||||
|
+get_sub_categorys()
|
||||||
|
}
|
||||||
|
|
||||||
|
class Tag {
|
||||||
|
+name
|
||||||
|
+slug
|
||||||
|
+get_article_count()
|
||||||
|
}
|
||||||
|
|
||||||
|
class Links {
|
||||||
|
+name
|
||||||
|
+link
|
||||||
|
+sequence
|
||||||
|
+is_enable
|
||||||
|
+show_type
|
||||||
|
}
|
||||||
|
|
||||||
|
class SideBar {
|
||||||
|
+name
|
||||||
|
+content
|
||||||
|
+sequence
|
||||||
|
+is_enable
|
||||||
|
}
|
||||||
|
|
||||||
|
class BlogSettings {
|
||||||
|
+site_name
|
||||||
|
+site_description
|
||||||
|
+site_seo_description
|
||||||
|
+site_keywords
|
||||||
|
+article_sub_length
|
||||||
|
+sidebar_article_count
|
||||||
|
+sidebar_comment_count
|
||||||
|
+article_comment_count
|
||||||
|
+show_google_adsense
|
||||||
|
+google_adsense_codes
|
||||||
|
+open_site_comment
|
||||||
|
+global_header
|
||||||
|
+global_footer
|
||||||
|
+beian_code
|
||||||
|
+analytics_code
|
||||||
|
+show_gongan_code
|
||||||
|
+gongan_beiancode
|
||||||
|
+comment_need_review
|
||||||
|
+clean()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 枚举类型
|
||||||
|
class LinkShowType {
|
||||||
|
<<enumeration>>
|
||||||
|
I, L, P, A, S
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 表单类
|
||||||
|
class BlogSearchForm {
|
||||||
|
+querydata
|
||||||
|
+search()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 管理类
|
||||||
|
class ArticlelAdmin {
|
||||||
|
+list_display
|
||||||
|
+list_filter
|
||||||
|
+actions
|
||||||
|
+link_to_category()
|
||||||
|
+get_form()
|
||||||
|
+get_view_on_site_url()
|
||||||
|
}
|
||||||
|
|
||||||
|
class TagAdmin
|
||||||
|
class CategoryAdmin
|
||||||
|
class LinksAdmin
|
||||||
|
class SideBarAdmin
|
||||||
|
class BlogSettingsAdmin
|
||||||
|
|
||||||
|
%% 视图类
|
||||||
|
class ArticleListView {
|
||||||
|
<<abstract>>
|
||||||
|
+page_type
|
||||||
|
+link_type
|
||||||
|
+get_queryset_cache_key()*
|
||||||
|
+get_queryset_data()*
|
||||||
|
+get_queryset()
|
||||||
|
+get_context_data()
|
||||||
|
}
|
||||||
|
|
||||||
|
class IndexView
|
||||||
|
class ArticleDetailView {
|
||||||
|
+get_context_data()
|
||||||
|
}
|
||||||
|
class CategoryDetailView
|
||||||
|
class AuthorDetailView
|
||||||
|
class TagDetailView
|
||||||
|
class ArchivesView
|
||||||
|
class LinkListView
|
||||||
|
class EsSearchView
|
||||||
|
|
||||||
|
%% 中间件类
|
||||||
|
class OnlineMiddleware {
|
||||||
|
+__call__()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 搜索索引类
|
||||||
|
class ArticleIndex {
|
||||||
|
+text
|
||||||
|
+get_model()
|
||||||
|
+index_queryset()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Elasticsearch 文档类
|
||||||
|
class GeoIp {
|
||||||
|
+continent_name
|
||||||
|
+country_iso_code
|
||||||
|
+country_name
|
||||||
|
+location
|
||||||
|
}
|
||||||
|
|
||||||
|
class UserAgentBrowser
|
||||||
|
class UserAgentOS
|
||||||
|
class UserAgentDevice
|
||||||
|
class UserAgent
|
||||||
|
|
||||||
|
class ElapsedTimeDocument {
|
||||||
|
+url
|
||||||
|
+time_taken
|
||||||
|
+log_datetime
|
||||||
|
+ip
|
||||||
|
+geoip
|
||||||
|
+useragent
|
||||||
|
}
|
||||||
|
|
||||||
|
class ElaspedTimeDocumentManager {
|
||||||
|
+build_index()
|
||||||
|
+delete_index()
|
||||||
|
+create()
|
||||||
|
}
|
||||||
|
|
||||||
|
class ArticleDocument {
|
||||||
|
+body
|
||||||
|
+title
|
||||||
|
+author
|
||||||
|
+category
|
||||||
|
+tags
|
||||||
|
+pub_time
|
||||||
|
+status
|
||||||
|
+comment_status
|
||||||
|
+type
|
||||||
|
+views
|
||||||
|
+article_order
|
||||||
|
}
|
||||||
|
|
||||||
|
class ArticleDocumentManager {
|
||||||
|
+create_index()
|
||||||
|
+delete_index()
|
||||||
|
+convert_to_doc()
|
||||||
|
+rebuild()
|
||||||
|
+update_docs()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 应用配置类
|
||||||
|
class BlogConfig
|
||||||
|
|
||||||
|
%% 测试类
|
||||||
|
class ArticleTest
|
||||||
|
|
||||||
|
%% 继承关系
|
||||||
|
BaseModel <|-- Article
|
||||||
|
BaseModel <|-- Category
|
||||||
|
BaseModel <|-- Tag
|
||||||
|
ArticleListView <|-- IndexView
|
||||||
|
ArticleListView <|-- CategoryDetailView
|
||||||
|
ArticleListView <|-- AuthorDetailView
|
||||||
|
ArticleListView <|-- TagDetailView
|
||||||
|
ArticleListView <|-- ArchivesView
|
||||||
|
ArticleDetailView --|> DetailView
|
||||||
|
LinkListView --|> ListView
|
||||||
|
EsSearchView --|> SearchView
|
||||||
|
UserAgentOS --|> UserAgentBrowser
|
||||||
|
|
||||||
|
%% 关联关系
|
||||||
|
Article --> Category : Foreign Key
|
||||||
|
Article --> Tag : Many-to-Many
|
||||||
|
Article --> settings.AUTH_USER_MODEL : Foreign Key
|
||||||
|
Category --> Category : Self-reference (Parent Category)
|
||||||
|
Links --> LinkShowType : Uses
|
||||||
|
ArticleDocument --> Article : Mapping
|
||||||
|
ElapsedTimeDocument --> GeoIp : Contains
|
||||||
|
ElapsedTimeDocument --> UserAgent : Contains
|
||||||
|
UserAgent --> UserAgentBrowser : Contains
|
||||||
|
UserAgent --> UserAgentOS : Contains
|
||||||
|
UserAgent --> UserAgentDevice : Contains
|
||||||
|
|
||||||
|
%% 管理关系
|
||||||
|
ArticlelAdmin --> Article : 管理
|
||||||
|
TagAdmin --> Tag : 管理
|
||||||
|
CategoryAdmin --> Category : 管理
|
||||||
|
LinksAdmin --> Links : 管理
|
||||||
|
SideBarAdmin --> SideBar : 管理
|
||||||
|
BlogSettingsAdmin --> BlogSettings : 管理
|
||||||
|
|
||||||
|
%% 视图与模型关系
|
||||||
|
IndexView --> Article : 查询
|
||||||
|
ArticleDetailView --> Article : 详情
|
||||||
|
CategoryDetailView --> Category : 查询
|
||||||
|
AuthorDetailView --> Article : 查询
|
||||||
|
TagDetailView --> Tag : 查询
|
||||||
|
ArchivesView --> Article : 查询
|
||||||
|
LinkListView --> Links : 查询
|
||||||
|
|
||||||
|
%% 搜索关系
|
||||||
|
ArticleIndex --> Article : 索引
|
||||||
|
BlogSearchForm --> SearchForm : 继承
|
||||||
|
|
||||||
|
%% 文档管理关系
|
||||||
|
ArticleDocumentManager --> ArticleDocument : 管理
|
||||||
|
ElaspedTimeDocumentManager --> ElapsedTimeDocument : 管理
|
||||||
|
|
||||||
|
%% 测试关系
|
||||||
|
ArticleTest --> Article : 测试
|
||||||
|
ArticleTest --> Category : 测试
|
||||||
|
ArticleTest --> Tag : 测试
|
||||||
|
ArticleTest --> SideBar : 测试
|
||||||
|
ArticleTest --> Links : 测试
|
||||||
@ -0,0 +1,77 @@
|
|||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
|
||||||
|
classDiagram
|
||||||
|
%% 模型类
|
||||||
|
class Comment {
|
||||||
|
+body
|
||||||
|
+creation_time
|
||||||
|
+last_modify_time
|
||||||
|
+is_enable
|
||||||
|
+__str__()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 表单类
|
||||||
|
class CommentForm {
|
||||||
|
+parent_comment_id
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 视图类
|
||||||
|
class CommentPostView {
|
||||||
|
+dispatch()
|
||||||
|
+get()
|
||||||
|
+form_invalid()
|
||||||
|
+form_valid()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 管理类
|
||||||
|
class CommentAdmin {
|
||||||
|
+list_display
|
||||||
|
+list_filter
|
||||||
|
+actions
|
||||||
|
+link_to_userinfo()
|
||||||
|
+link_to_article()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 应用配置类
|
||||||
|
class CommentsConfig
|
||||||
|
|
||||||
|
%% 测试类
|
||||||
|
class CommentsTest
|
||||||
|
|
||||||
|
%% 工具函数
|
||||||
|
class utils {
|
||||||
|
+send_comment_email()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% 继承关系
|
||||||
|
CommentForm --|> ModelForm
|
||||||
|
CommentPostView --|> FormView
|
||||||
|
CommentAdmin --|> ModelAdmin
|
||||||
|
CommentsConfig --|> AppConfig
|
||||||
|
CommentsTest --|> TransactionTestCase
|
||||||
|
|
||||||
|
%% 关联关系
|
||||||
|
Comment --> AUTH_USER_MODEL : author
|
||||||
|
Comment --> Article : article
|
||||||
|
Comment --> Comment : parent_comment
|
||||||
|
CommentForm --> Comment : create
|
||||||
|
CommentPostView --> CommentForm : use
|
||||||
|
CommentPostView --> Comment : create
|
||||||
|
CommentAdmin --> Comment : manage
|
||||||
|
CommentsTest --> Comment : test
|
||||||
|
|
||||||
|
%% 依赖关系
|
||||||
|
CommentPostView ..> BlogUser : import
|
||||||
|
CommentPostView ..> Article : import
|
||||||
|
CommentsTest ..> BlogUser : import
|
||||||
|
CommentsTest ..> Article : import
|
||||||
|
CommentsTest ..> Category : import
|
||||||
|
utils ..> Comment : import
|
||||||
|
CommentAdmin ..> Comment : import
|
||||||
|
|
||||||
|
%% 方法调用关系
|
||||||
|
CommentPostView --> utils : possible_call
|
||||||
|
CommentsTest --> utils : test_call
|
||||||
@ -0,0 +1,264 @@
|
|||||||
|
---
|
||||||
|
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 : 包含位置跟踪路由
|
||||||
@ -0,0 +1,194 @@
|
|||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
classDiagram
|
||||||
|
%% Models
|
||||||
|
class OAuthUser {
|
||||||
|
+ForeignKey author
|
||||||
|
+CharField openid
|
||||||
|
+CharField nickname
|
||||||
|
+CharField token
|
||||||
|
+CharField picture
|
||||||
|
+CharField type
|
||||||
|
+CharField email
|
||||||
|
+TextField metadata
|
||||||
|
+DateTimeField creation_time
|
||||||
|
+DateTimeField last_modify_time
|
||||||
|
+__str__()
|
||||||
|
}
|
||||||
|
|
||||||
|
class OAuthConfig {
|
||||||
|
+CharField type
|
||||||
|
+CharField appkey
|
||||||
|
+CharField appsecret
|
||||||
|
+CharField callback_url
|
||||||
|
+BooleanField is_enable
|
||||||
|
+DateTimeField creation_time
|
||||||
|
+DateTimeField last_modify_time
|
||||||
|
+clean()
|
||||||
|
+__str__()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Admin Classes
|
||||||
|
class OAuthUserAdmin {
|
||||||
|
+search_fields
|
||||||
|
+list_per_page
|
||||||
|
+list_display
|
||||||
|
+list_display_links
|
||||||
|
+list_filter
|
||||||
|
+readonly_fields
|
||||||
|
+get_readonly_fields()
|
||||||
|
+has_add_permission()
|
||||||
|
+link_to_usermodel()
|
||||||
|
+show_user_image()
|
||||||
|
}
|
||||||
|
|
||||||
|
class OAuthConfigAdmin {
|
||||||
|
+list_display
|
||||||
|
+list_filter
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Forms
|
||||||
|
class RequireEmailForm {
|
||||||
|
+EmailField email
|
||||||
|
+IntegerField oauthid
|
||||||
|
+__init__()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Views
|
||||||
|
class RequireEmailView {
|
||||||
|
+form_class
|
||||||
|
+template_name
|
||||||
|
+get()
|
||||||
|
+get_initial()
|
||||||
|
+get_context_data()
|
||||||
|
+form_valid()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% OAuth Manager Classes
|
||||||
|
class BaseOauthManager {
|
||||||
|
<<Abstract>>
|
||||||
|
+AUTH_URL
|
||||||
|
+TOKEN_URL
|
||||||
|
+API_URL
|
||||||
|
+ICON_NAME
|
||||||
|
+access_token
|
||||||
|
+openid
|
||||||
|
+is_access_token_set
|
||||||
|
+is_authorized
|
||||||
|
+get_authorization_url()
|
||||||
|
+get_access_token_by_code()
|
||||||
|
+get_oauth_userinfo()
|
||||||
|
+get_picture()
|
||||||
|
+do_get()
|
||||||
|
+do_post()
|
||||||
|
+get_config()
|
||||||
|
}
|
||||||
|
|
||||||
|
class ProxyManagerMixin {
|
||||||
|
+proxies
|
||||||
|
+do_get()
|
||||||
|
+do_post()
|
||||||
|
}
|
||||||
|
|
||||||
|
class WBOauthManager {
|
||||||
|
+client_id
|
||||||
|
+client_secret
|
||||||
|
+callback_url
|
||||||
|
+get_authorization_url()
|
||||||
|
+get_access_token_by_code()
|
||||||
|
+get_oauth_userinfo()
|
||||||
|
+get_picture()
|
||||||
|
}
|
||||||
|
|
||||||
|
class GoogleOauthManager {
|
||||||
|
+client_id
|
||||||
|
+client_secret
|
||||||
|
+callback_url
|
||||||
|
+get_authorization_url()
|
||||||
|
+get_access_token_by_code()
|
||||||
|
+get_oauth_userinfo()
|
||||||
|
+get_picture()
|
||||||
|
}
|
||||||
|
|
||||||
|
class GitHubOauthManager {
|
||||||
|
+client_id
|
||||||
|
+client_secret
|
||||||
|
+callback_url
|
||||||
|
+get_authorization_url()
|
||||||
|
+get_access_token_by_code()
|
||||||
|
+get_oauth_userinfo()
|
||||||
|
+get_picture()
|
||||||
|
}
|
||||||
|
|
||||||
|
class FaceBookOauthManager {
|
||||||
|
+client_id
|
||||||
|
+client_secret
|
||||||
|
+callback_url
|
||||||
|
+get_authorization_url()
|
||||||
|
+get_access_token_by_code()
|
||||||
|
+get_oauth_userinfo()
|
||||||
|
+get_picture()
|
||||||
|
}
|
||||||
|
|
||||||
|
class QQOauthManager {
|
||||||
|
+client_id
|
||||||
|
+client_secret
|
||||||
|
+callback_url
|
||||||
|
+get_authorization_url()
|
||||||
|
+get_access_token_by_code()
|
||||||
|
+get_open_id()
|
||||||
|
+get_oauth_userinfo()
|
||||||
|
+get_picture()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Test Classes
|
||||||
|
class OAuthConfigTest {
|
||||||
|
+setUp()
|
||||||
|
+test_oauth_login_test()
|
||||||
|
}
|
||||||
|
|
||||||
|
class OauthLoginTest {
|
||||||
|
+setUp()
|
||||||
|
+init_apps()
|
||||||
|
+get_app_by_type()
|
||||||
|
+test_weibo_login()
|
||||||
|
+test_google_login()
|
||||||
|
+test_github_login()
|
||||||
|
+test_facebook_login()
|
||||||
|
+test_qq_login()
|
||||||
|
+test_weibo_authoriz_login_with_email()
|
||||||
|
+test_weibo_authoriz_login_without_email()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Exception Class
|
||||||
|
class OAuthAccessTokenException {
|
||||||
|
<<Exception>>
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Relationships
|
||||||
|
OAuthUserAdmin --> OAuthUser : 管理
|
||||||
|
OAuthConfigAdmin --> OAuthConfig : 管理
|
||||||
|
|
||||||
|
RequireEmailView --> RequireEmailForm : 使用
|
||||||
|
|
||||||
|
BaseOauthManager <|-- WBOauthManager : 继承
|
||||||
|
BaseOauthManager <|-- QQOauthManager : 继承
|
||||||
|
|
||||||
|
BaseOauthManager <|-- GoogleOauthManager : 继承
|
||||||
|
ProxyManagerMixin <|.. GoogleOauthManager : 混入
|
||||||
|
|
||||||
|
BaseOauthManager <|-- GitHubOauthManager : 继承
|
||||||
|
ProxyManagerMixin <|.. GitHubOauthManager : 混入
|
||||||
|
|
||||||
|
BaseOauthManager <|-- FaceBookOauthManager : 继承
|
||||||
|
ProxyManagerMixin <|.. FaceBookOauthManager : 混入
|
||||||
|
|
||||||
|
BaseOauthManager --> OAuthUser : 创建
|
||||||
|
BaseOauthManager --> OAuthConfig : 配置依赖
|
||||||
|
|
||||||
|
OAuthConfigTest --> OAuthConfig : 测试
|
||||||
|
OauthLoginTest --> BaseOauthManager : 测试
|
||||||
|
OauthLoginTest --> OAuthConfig : 测试
|
||||||
|
OauthLoginTest --> OAuthUser : 测试
|
||||||
@ -0,0 +1,71 @@
|
|||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
classDiagram
|
||||||
|
%% Models
|
||||||
|
class OwnTrackLog {
|
||||||
|
+CharField tid
|
||||||
|
+FloatField lat
|
||||||
|
+FloatField lon
|
||||||
|
+DateTimeField creation_time
|
||||||
|
+__str__()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Admin Classes
|
||||||
|
class OwnTrackLogsAdmin {
|
||||||
|
# 空管理类,使用默认配置
|
||||||
|
}
|
||||||
|
|
||||||
|
%% App Config
|
||||||
|
class OwntracksConfig {
|
||||||
|
+name
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Test Classes
|
||||||
|
class OwnTrackLogTest {
|
||||||
|
+setUp()
|
||||||
|
+test_own_track_log()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Views (作为功能模块表示)
|
||||||
|
class ViewFunctions {
|
||||||
|
<<Module>>
|
||||||
|
+manage_owntrack_log()
|
||||||
|
+show_maps()
|
||||||
|
+show_log_dates()
|
||||||
|
+convert_to_amap()
|
||||||
|
+get_datas()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% URL Patterns
|
||||||
|
class URLConfig {
|
||||||
|
<<Module>>
|
||||||
|
+logtracks
|
||||||
|
+show_maps
|
||||||
|
+get_datas
|
||||||
|
+show_dates
|
||||||
|
}
|
||||||
|
|
||||||
|
%% External Dependencies
|
||||||
|
class BlogUser {
|
||||||
|
<<External>>
|
||||||
|
+create_superuser()
|
||||||
|
}
|
||||||
|
|
||||||
|
class AMapAPI {
|
||||||
|
<<External>>
|
||||||
|
+坐标转换服务
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Relationships
|
||||||
|
OwnTrackLogsAdmin --> OwnTrackLog : 管理
|
||||||
|
OwnTrackLogTest --> OwnTrackLog : 测试
|
||||||
|
OwnTrackLogTest --> BlogUser : 创建测试用户
|
||||||
|
|
||||||
|
ViewFunctions --> OwnTrackLog : 创建/查询
|
||||||
|
ViewFunctions --> AMapAPI : 调用坐标转换
|
||||||
|
|
||||||
|
URLConfig --> ViewFunctions : 路由映射
|
||||||
|
|
||||||
|
OwntracksConfig ..> OwnTrackLog : 应用配置
|
||||||
@ -0,0 +1,155 @@
|
|||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
classDiagram
|
||||||
|
%% Models
|
||||||
|
class commands {
|
||||||
|
+CharField title
|
||||||
|
+CharField command
|
||||||
|
+CharField describe
|
||||||
|
+DateTimeField creation_time
|
||||||
|
+DateTimeField last_modify_time
|
||||||
|
+__str__()
|
||||||
|
}
|
||||||
|
|
||||||
|
class EmailSendLog {
|
||||||
|
+CharField emailto
|
||||||
|
+CharField title
|
||||||
|
+TextField content
|
||||||
|
+BooleanField send_result
|
||||||
|
+DateTimeField creation_time
|
||||||
|
+__str__()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Admin Classes
|
||||||
|
class CommandsAdmin {
|
||||||
|
+list_display
|
||||||
|
}
|
||||||
|
|
||||||
|
class EmailSendLogAdmin {
|
||||||
|
+list_display
|
||||||
|
+readonly_fields
|
||||||
|
+has_add_permission()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% WeChat Robot Components
|
||||||
|
class MemcacheStorage {
|
||||||
|
+prefix
|
||||||
|
+cache
|
||||||
|
+is_available
|
||||||
|
+key_name()
|
||||||
|
+get()
|
||||||
|
+set()
|
||||||
|
+delete()
|
||||||
|
}
|
||||||
|
|
||||||
|
class MessageHandler {
|
||||||
|
+message
|
||||||
|
+session
|
||||||
|
+userid
|
||||||
|
+userinfo
|
||||||
|
+is_admin
|
||||||
|
+is_password_set
|
||||||
|
+save_session()
|
||||||
|
+handler()
|
||||||
|
}
|
||||||
|
|
||||||
|
class WxUserInfo {
|
||||||
|
+isAdmin
|
||||||
|
+isPasswordSet
|
||||||
|
+Count
|
||||||
|
+Command
|
||||||
|
}
|
||||||
|
|
||||||
|
%% External API Classes
|
||||||
|
class BlogApi {
|
||||||
|
<<External>>
|
||||||
|
+search_articles()
|
||||||
|
+get_category_lists()
|
||||||
|
+get_recent_articles()
|
||||||
|
}
|
||||||
|
|
||||||
|
class CommandHandler {
|
||||||
|
<<External>>
|
||||||
|
+run()
|
||||||
|
+get_help()
|
||||||
|
}
|
||||||
|
|
||||||
|
class ChatGPT {
|
||||||
|
<<External>>
|
||||||
|
+chat()
|
||||||
|
}
|
||||||
|
|
||||||
|
class WeRoBot {
|
||||||
|
<<External>>
|
||||||
|
+token
|
||||||
|
+config
|
||||||
|
+filter()
|
||||||
|
+handler()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Test Classes
|
||||||
|
class ServerManagerTest {
|
||||||
|
+setUp()
|
||||||
|
+test_chat_gpt()
|
||||||
|
+test_validate_comment()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% App Config
|
||||||
|
class ServermanagerConfig {
|
||||||
|
+name
|
||||||
|
}
|
||||||
|
|
||||||
|
%% URL Configuration
|
||||||
|
class URLConfig {
|
||||||
|
+robot
|
||||||
|
}
|
||||||
|
|
||||||
|
%% External Models (for testing)
|
||||||
|
class BlogUser {
|
||||||
|
<<External>>
|
||||||
|
+create_superuser()
|
||||||
|
}
|
||||||
|
|
||||||
|
class Category {
|
||||||
|
<<External>>
|
||||||
|
}
|
||||||
|
|
||||||
|
class Article {
|
||||||
|
<<External>>
|
||||||
|
+title
|
||||||
|
+body
|
||||||
|
+get_full_url()
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Relationships
|
||||||
|
CommandsAdmin --> commands : 管理
|
||||||
|
EmailSendLogAdmin --> EmailSendLog : 管理
|
||||||
|
|
||||||
|
MemcacheStorage ..> WeRoBot : 会话存储实现
|
||||||
|
MessageHandler o-- WxUserInfo : 组合
|
||||||
|
MessageHandler --> CommandHandler : 使用
|
||||||
|
MessageHandler --> ChatGPT : 使用
|
||||||
|
|
||||||
|
WeRoBot --> MessageHandler : 消息处理
|
||||||
|
WeRoBot --> BlogApi : 博客API调用
|
||||||
|
WeRoBot --> MemcacheStorage : 会话存储
|
||||||
|
|
||||||
|
%% Robot Filter Functions
|
||||||
|
WeRoBot ..> search : 注册过滤器
|
||||||
|
WeRoBot ..> category : 注册过滤器
|
||||||
|
WeRoBot ..> recents : 注册过滤器
|
||||||
|
WeRoBot ..> help : 注册过滤器
|
||||||
|
WeRoBot ..> weather : 注册过滤器
|
||||||
|
WeRoBot ..> idcard : 注册过滤器
|
||||||
|
|
||||||
|
%% Test Relationships
|
||||||
|
ServerManagerTest --> commands : 测试
|
||||||
|
ServerManagerTest --> MessageHandler : 测试
|
||||||
|
ServerManagerTest --> CommandHandler : 测试
|
||||||
|
ServerManagerTest --> BlogUser : 测试依赖
|
||||||
|
ServerManagerTest --> Category : 测试依赖
|
||||||
|
ServerManagerTest --> Article : 测试依赖
|
||||||
|
|
||||||
|
URLConfig --> WeRoBot : 路由配置
|
||||||
@ -1 +1 @@
|
|||||||
Subproject commit 6854347d35f6619d9e16852d0d6b133ca645c6c5
|
Subproject commit df6020cd44f39affee81f58088380b23a5fb0c96
|
||||||