天天看點

基于.NetCore開發部落格項目 StarBlog - (3) 模型設計

系列文章

  • 基于.NetCore開發部落格項目 StarBlog - (1) 為什麼需要自己寫一個部落格?
  • 基于.NetCore開發部落格項目 StarBlog - (2) 環境準備和建立項目
  • 基于.NetCore開發部落格項目 StarBlog - (3) 模型設計
  • 基于.NetCore開發部落格項目 StarBlog - (4) markdown部落格批量導入
  • 基于.NetCore開發部落格項目 StarBlog - (5) 開始搭建Web項目
  • 基于.NetCore開發部落格項目 StarBlog - (6) 頁面開發之部落格文章清單
  • 基于.NetCore開發部落格項目 StarBlog - (7) 頁面開發之文章詳情頁面
  • 基于.NetCore開發部落格項目 StarBlog - (8) 分類層級結構展示
  • 基于.NetCore開發部落格項目 StarBlog - (9) 圖檔批量導入
  • 基于.NetCore開發部落格項目 StarBlog - (10) 圖檔瀑布流
  • 基于.NetCore開發部落格項目 StarBlog - (11) 實作通路統計
  • 基于.NetCore開發部落格項目 StarBlog - (12) Razor頁面動态編譯
  • ...

前言

上一篇文章介紹(水)了建立項目的操作,本文開始終于進入正題要開始寫代碼了!

對了,上一篇文章有朋友留言問管理端的使用者名和密碼是多少,這個是我疏忽了,沒有做一個便捷的項目初始化功能,目前登入管理端需要在資料庫的User表建立一個使用者,後續我會完善角色和權限控制部分,然後給項目加一些指令行工具,就像

django-admin

那樣。

OK,本文介紹StarBlog部落格項目的模型設計。

模型設計

根據部落格的功能需求,資料分成三類:

  • 文章相關(文章、文章分類)
  • 攝影/相冊相關
  • 推薦内容配置(推薦文章、分類、圖檔;置頂文章、分類)

代碼

由于我還沒學DDD,(後續學了Abp vNext架構的話可能會用新技術進行重構),是以先用傳統的MVC架構來規劃項目~

回顧上一篇文章,我們建立了幾個項目,現在,我們要把資料模型寫在

StarBlog.Data

項目中。

打開IDE,在

StarBlog.Data

項目中建立一個目錄,名為

Models

,接下來的資料模型全都要放到這個目錄/命名空間下。

由于項目代碼已經在GitHub開源了,資料模型代碼我就不全部貼上來了,先看看建立完成之後的目錄結構。

代碼可以這裡看到:https://github.com/Deali-Axy/StarBlog/tree/master/StarBlog.Data/Models

Models
├── Category.cs			 # 文章分類
├── FeaturedCategory.cs  # 推薦分類
├── FeaturedPhoto.cs     # 推薦圖檔
├── FeaturedPost.cs      # 推薦文章
├── Photo.cs             # 攝影圖檔
├── Post.cs              # 文章
├── TopPost.cs           # 置頂文章
└── User.cs              # 使用者
           

為了便于讀者了解項目設計和模型間的關系,我們挑幾個關鍵的說一下。

Category.cs

文章分類。完整代碼見:https://github.com/Deali-Axy/StarBlog/blob/master/StarBlog.Data/Models/Category.cs

StarBlog部落格支援markdown批量導入,然後以目錄結構作為文章的分類,目錄名就是分類名,且支援多級分類。

部分代碼如下:

public class Category {
    public int Id { get; set; }
    public string Name { get; set; }
    public int ParentId { get; set; }
    public bool Visible { get; set; } = true;
}
           

Post.cs

完整代碼見:https://github.com/Deali-Axy/StarBlog/blob/master/StarBlog.Data/Models/Post.cs

部落格網站,最重要的就是文章,文章的模型部分代碼如下

namespace StarBlog.Data.Models;

public class Post {
    // 省略部分字段...
    public string? Status { get; set; }
    public bool IsPublish { get; set; }
    public string? Path { get; set; }
    public DateTime CreationTime { get; set; }
    public DateTime LastUpdateTime { get; set; }
    public string? Categories { get; set; }
}
           

首先看

Status

IsPublish

字段,一個是文章狀态(未完成、未修改、未釋出),一個是否釋出。最終決定文章是否在網站上展示是

IsPublish

字段,那

Status

字段存在的意義是啥?

答案:為了保留導入前的文章狀态。

本項目的部落格支援導入整個目錄markdown檔案作為文章,我的習慣是會在markdown檔案的檔案名最前面寫上這個文章的狀态,比如一篇未完成的文章,它的檔案名是:

(未完成)StarBlog部落格開發筆記(3):模型設計

,是以這個

Status

字段就是要把

(未完成)

中的這個狀态識别提取出來,(具體用到的是正規表達式,這是後面要介紹的内容)。

然後是

Path

字段,這個字段表示文章作為markdown檔案導入前存放的相對位置,比如導入了

D:\blog

這個目錄裡的所有文章,而這個目錄的結構是這樣的:

blog
├── Asp-Net-Core學習筆記
│   ├── Asp-Net-Core學習筆記:1.MVC入門篇.md
│   ├── Asp-Net-Core學習筆記:2.MVC視圖、模型、持久化、檔案、錯誤處理、日志.md
│   ├── Asp-Net-Core學習筆記:3.使用SignalR實時通信架構開發聊天室.md
│   ├── Asp-Net-Core學習筆記:4.Blazor-WebAssembly入門.md
│   ├── Asp-Net-Core學習筆記:5.建構和部署.md
│   ├── Asp-Net-Core學習筆記:WebApi開發實踐.md
│   ├── Asp-Net-Core學習筆記:身份認證入門.md
│   ├── Asp-Net-Core學習筆記:部署,早知道,還是docker,以及一點碎碎念.md
├── Asp-Net-Core開發筆記
│   ├── Asp-Net-Core開發筆記:使用NPM和gulp管理前端靜态檔案.md
│   ├── Asp-Net-Core開發筆記:在docker部署時遇到一個小坑.md
│   └── Asp-Net-Core開發筆記:接口傳回json對象出現套娃遞歸問題.md
├── 不吹不黑,跨平台架構AspNetCore開發實踐雜談.md
├── 夢想家裝平台開發記錄,Asp-Net-Core上手實踐.md
├── (未修改)How-to-Connect-to-MySQL-from--NET-Core.md
├── (未修改)使用Ocelot實作Api網關.md
├── (未釋出)跨域配置.md
├── (未完成)ASP-NET-Core-使用-Hangfire-定時任務.md
├── (未完成)Core-定時任務之HangFire.md
├── (未完成)使用-ASP-NET-Core-和-Hangfire-實作-HTTP-異步化方案.md
├── (未完成)使用Sentry.md
└── (未完成)在xunit裡使用依賴注入.md
           

那對于在

blog/AspNetCore

目錄下的文章

(未釋出)跨域配置.md

來說,它的

Path

字段就是

AspNetCore

對于在

blog/AspNetCore/Asp-Net-Core學習筆記

目錄下的文章來說,

Path

字段就是

AspNetCore/Asp-Net-Core學習筆記

這個

Path

字段的意義,就在于實作前面說的多級分類,同時最下面的

Categories

字段,也是為了實作多級分類準備的。

在文章導入的過程中,目錄名稱作為文章分類名建立了文章的分類,同時記錄分類ID到文章的

CategoryId

字段中,如果是多級分類的話,文章的

CategoryId

字段記錄的是最後一個分類,父分類是不在這個

CategoryId

裡的,雖然

Category

有個

ParentId

字段可以找到父分類,但是在實際使用的時候比較麻煩,是以我又加了這個

Categories

字段,把文章的分類層級記錄起來,其内容類似這樣

1,2,3

,用逗号分隔開分類ID

這樣前台展示的時候隻需要用

services

Categories

字段處理成

List<Category>

就可以了。

Photo.cs

對了,還有圖檔模型,因為平時有空會拍照,是以做個攝影分享的功能,這個模型就存上傳的圖檔。

部分代碼如下

public class Photo {
    // 省略部分字段...
    public string Location { get; set; }
    public string FilePath { get; set; }
    public long Height { get; set; }
    public long Width { get; set; }
}
           

圖檔的高度和寬度字段我一開始是沒考慮的,不過在做瀑布流展示的時候發現沒有寬高度不行,于是找到了

SixLabors.ImageSharp

這個庫讀取圖檔資訊,這個庫功能還挺強的,推薦一波~

Location

拍攝地點現在隻能手動輸入,我之前用Python做過一個相冊的項目,可以根據圖檔的Exif資訊讀取拍攝的GPS資訊,然後用逆位址解析的方法解析出拍攝的位址,這個先記個todo,後面來實作~

其他的

三個Featured開頭的是推薦相關的,可以在背景配置;

然後置頂文章和置頂分類隻能分别設定一個,展示在網站首頁。

大概就這些了,下篇文章見~

同時所有項目代碼已經上傳GitHub,歡迎各位大佬Star/Fork!

  • 部落格後端+前台項目位址:https://github.com/Deali-Axy/StarBlog
  • 管理背景前端項目位址:https://github.com/Deali-Axy/StarBlog-Admin

微信公衆号:「程式設計實驗室」

專注于網際網路熱門新技術探索與團隊靈活開發實踐,包括架構設計、機器學習與資料分析算法、移動端開發、Linux、Web前後端開發等,歡迎一起探讨技術,分享學習實踐經驗。

繼續閱讀