CMS內容管理系統的設計與實現:架構設計

一、整體架構方案

(一)架構方案選擇(根據項目規模)

1. 中小型項目推薦方案(團隊<10人)

管理前端 Vue3+Ruoyi-UI
Spring Boot單體應用
門戶前端 Nuxt3+SSR
統一數據庫
  • 技術要點
    • 使用 模塊化單體架構(非微服務)
    • 通過 package劃分 隔離管理/門戶API
    • 利用 Profile 實現環境隔離
    • 無需Spring Cloud,保持簡單

2. 大型項目方案(團隊>20人)

管理前端
API Gateway
門戶前端
Admin服務集群
Portal服務集群
管理數據庫
門戶數據庫
  • 技術要點
    • 采用 Spring Cloud Alibaba
    • 通過 Nacos 實現服務發現
    • 使用 Sentinel 做流量控制
    • 需要獨立 DBA團隊 支持

3.部署方案對比

方案優點缺點適用階段
單體部署運維簡單,成本低擴展性受限初期(<5萬UV)
模塊分離部署部分服務可獨立伸縮需要基礎監控能力中期(5-50萬UV)
全微服務彈性擴展,故障隔離運維復雜,成本高后期(>50萬UV)

(二)演進路線實施建議

2024-01-01 2024-02-01 2024-03-01 2024-04-01 2024-05-01 2024-06-01 基礎內容管理 評論模塊開發 數據統計模塊 服務拆分準備 獨立部署門戶服務 管理端微服務化 初期階段 中期階段 后期階段 CMS架構演進路線
# 初期:單體模塊化
src/
└── main└── java└── com└── company└── cms├── content├── comment└── statistics# 中期:子模塊拆分
cms-system/
├── cms-content
├── cms-comment
└── cms-statistics# 后期:微服務化
cms-admin-service/
cms-portal-service/
cms-comment-service/
  1. 初期采用模塊化單體

    • 使用 Maven多模塊 而非微服務
    • 通過 @Profile(“admin”) 隔離配置
    • 使用 Flyway 管理多環境數據庫
  2. 漸進式演進路徑

    單體
    模塊獨立部署
    核心微服務化
    全微服務架構
  3. 監控準備

    • 即使單體架構也要配置 Prometheus+Granfana
    • 日志系統使用 ELK Stack
    • 關鍵業務指標埋點

可根據實際用戶量增長逐步升級架構,避免早期過度設計。

二、模塊化分層架構設計

(一)總體劃分架構

1.后端目錄劃分

采用 「業務垂直切分 + 客戶端橫向隔離 + 技術縱向分層」 的三維結構,具體實現如下:

src/main/java/com/company/cms
├── content                  # 內容業務模塊
│   ├── admin               # 管理端實現
│   │   ├── controller
│   │   ├── service
│   │   └── mapper
│   ├── portal              # 門戶端實現
│   │   ├── controller
│   │   ├── service
│   │   └── mapper
│   └── domain              # 公共領域對象
│       ├── entity
│       ├── dto
│       └── vo
├── comment                 # 評論業務模塊
│   ├── admin
│   ├── portal
│   └── domain
├── statistics              # 統計業務模塊
│   ├── admin
│   ├── portal
│   └── domain
└── common                  # CMS公共模塊├── config             # 專有配置├── interceptor        # 攔截器└── utils              # 工具類

2. 業務垂直切分

CMS系統
內容模塊
評論模塊
統計模塊
管理端
門戶端
  • 隔離性:各業務模塊可獨立開發部署

  • 可維護性:修改影響范圍明確

  • 復用性:公共domain對象跨客戶端復用

3. 客戶端橫向隔離

// 內容模塊下的權限差異示例
// 管理端Controller
@PreAuthorize("hasRole('CONTENT_ADMIN')")
@PostMapping("/admin/content")
public AjaxResult createContent(...) {// 需要審核流程
}// 門戶端Controller 
@RateLimit(100) // 限流注解
@GetMapping("/portal/content")
public ContentVO getContent(...) {// 緩存優化實現
}

4. 技術縱向分層

# 典型業務模塊內部結構
content/
├── admin
│   ├── controller       # API入口
│   ├── service          # 業務邏輯
│   └── mapper           # 數據持久
├── portal
│   ├── controller
│   ├── service
│   └── mapper
└── domain               # 核心領域模型├── entity          # JPA實體├── dto             # 傳輸對象└── vo              # 視圖對象

(二)前后端代碼統籌

1.代碼倉庫管理策略

若是屬于少量人開發項目,則推薦單一代碼倉庫 + 多模塊結構的方案進行開發。

my-cms-project/
├── backend/          # Spring Boot后端
│   ├── src/
│   └── pom.xml
├── admin-frontend/   # 管理端Vue3
│   ├── src/
│   └── package.json
└── portal-frontend/  # 門戶端Nuxt3├── pages/└── package.json

若是多人開發項目,應該分為3個代碼倉庫,由不同的技術人員開發提交對應的代碼。

2.配置示例(.gitignore):

# 通用忽略
*.log
*.iml
.idea/# 后端忽略
backend/target/# 前端忽略
admin-frontend/node_modules/
admin-frontend/dist/
portal-frontend/node_modules/
portal-frontend/.nuxt/

三、后端實施建議

(一)領域對象

1.領域對象復用

// 公共實體定義
@Entity
@Table(name = "cms_content")
public class Content {@Id@GeneratedValueprivate Long id;// 公共字段private String title;private String content;// 管理端特有字段(審計用)@Column(name = "audit_status")@AdminOnly  // 自定義注解private AuditStatus auditStatus;// 門戶端特有字段(展示用)@Column(name = "view_count")@PortalOnlyprivate Integer viewCount;
}

(二)API控制器

1.API路徑設計規范

管理端和門戶端的api接口需要隔離,用/api/admin和/api/portal區分好,還是用/admin/api和/portal/api區分好?

推薦:/api/admin/api/portal 雙前綴模式

管理端: /api/admin/v1/content
門戶端: /api/portal/v1/content

優勢分析:

  • 路由清晰:/api 明確標識API入口,/admin|portal區分客戶端
  • 網關友好:Nginx可統一配置/api路由規則
  • 安全隔離:方便在網關層設置不同安全策略
  • 版本控制:v1支持平滑升級到v2

2.控制器隔離

// 管理端文章控制器
@RestController
@RequestMapping("/api/admin/v1/articles")
public class AdminArticleController {@PreAuthorize("hasRole('ADMIN')")@PostMappingpublic AjaxResult createArticle(@Valid @RequestBody ArticleCreateDTO dto) {// 管理端專用創建邏輯}
}// 門戶端文章控制器 
@RestController
@RequestMapping("/api/portal/v1/articles")
public class PortalArticleController {@GetMapping("/{id}")public ArticleVO getArticle(@PathVariable Long id) {// 門戶端專用查詢邏輯}
}

3.API文檔管理

// 使用Swagger分組
@Bean
public Docket adminApi() {return new Docket(DocumentationType.OAS_30).groupName("管理端API").select().apis(RequestHandlerSelectors.basePackage("com.cms.controller.admin"))
}

(三)服務層

1.服務層復用策略

// 通用服務接口
public interface ArticleBaseService {Article getById(Long id);
}// 管理端服務實現  
@Service
public class AdminArticleService implements ArticleBaseService {@Overridepublic Article getById(Long id) {// 管理端專用邏輯(包含審計字段)}public void auditArticle(Long id) {// 管理端特有方法}
}// 門戶端服務實現
@Service 
public class PortalArticleService implements ArticleBaseService {@Overridepublic Article getById(Long id) {// 門戶端專用邏輯(緩存優化)}
}

2. 服務層差異處理

// 管理端服務實現
@Service
public class AdminContentService {@AdminAuditRequired // 自定義審核注解public void publishContent(Long id) {// 包含審核流程}
}// 門戶端服務實現
@Service
public class PortalContentService {@Cacheable("content") // 緩存優化public ContentVO getContent(Long id) {// 訪問統計邏輯}
}

(四)安全配置

1.安全配置分離

// 管理端安全配置類
@Configuration
@EnableWebSecurity
@Order(1) // 高優先級
public class AdminSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.antMatcher("/admin/**").authorizeRequests().anyRequest().hasRole("ADMIN").and().formLogin().disable();}
}// 門戶端安全配置類  
@Configuration
@Order(2) // 低優先級
public class PortalSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.antMatcher("/portal/**").authorizeRequests().antMatchers(HttpMethod.GET).permitAll().anyRequest().authenticated().and().oauth2ResourceServer().jwt();}
}
# application-admin.yml(管理端配置)
security:oauth2:resource:id: admin-apiuser-info-uri: http://auth-server/oauth2/user# application-portal.yml(門戶端配置)  
security:oauth2:resource:id: portal-apiuser-info-uri: http://auth-server/oauth2/openid
# 權限配置示例(admin/portal分離)
security:admin:roles: [CONTENT_ADMIN, COMMENT_ADMIN]access: DENY_AFTER_17:00-08:00 # 管理端時間限制portal:rate-limit: 1000/分鐘open-apis: [/api/portal/content/*]

(五)異常處理

1.異常處理方案

@RestControllerAdvice(basePackages = {"com.company.cms.content.admin","com.company.cms.content.portal"})
public class ContentExceptionHandler {@ExceptionHandler(ContentNotFoundException.class)public ResponseEntity<ErrorResult> handleNotFound(ContentNotFoundException ex) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ErrorResult("CONTENT_NOT_FOUND", ex.getMessage()));}
}

2. 錯誤碼規范示例

模塊錯誤范圍示例
內容模塊1000-19991001=內容不存在
評論模塊2000-29992003=評論包含敏感詞
統計模塊3000-39993005=數據導出失敗

(六)配置管理

1.配置管理策略

多環境配置示例

config/
├── application.yml           # 公共配置
├── application-dev.yml       # 開發環境
├── application-prod.yml      # 生產環境
├── content-admin.yml         # 內容管理端特有配置
└── content-portal.yml        # 內容門戶端特有配置
# application.yml(公共配置)
spring:datasource:url: jdbc:mysql://localhost:3306/cmsusername: rootpassword: 123456---
# application-admin.yml(管理端特有配置)
management:endpoints:web:exposure:include: health,info,metricsendpoint:health:show-details: always---
# application-portal.yml(門戶端特有配置)  
spring:redis:host: portal-redisport: 6379

動態配置示例

@Configuration
@ConfigurationProperties(prefix = "cms.content")
public class ContentConfig {// 管理端特有配置private AdminConfig admin;// 門戶端特有配置private PortalConfig portal;@Datapublic static class AdminConfig {private int auditTimeout = 24; // 審核超時時間(小時)}@Datapublic static class PortalConfig {private int cacheTTL = 3600; // 緩存時間(秒)}
}
3. 數據庫隔離策略
-- 管理表(admin_開頭)
CREATE TABLE admin_operation_log (id BIGINT PRIMARY KEY,user_id BIGINT NOT NULL,action VARCHAR(50) NOT NULL
);-- 門戶表(portal_開頭)
CREATE TABLE portal_comment (id BIGINT PRIMARY KEY,article_id BIGINT NOT NULL,content TEXT
);

四、前端技術確認

端類型技術棧適用場景示例代碼
管理后臺Vue3 + Ruoyi-UI需要快速開發CRUD界面使用若依的src/views/system結構
門戶網站Nuxt3 + SSR需要SEO優化和首屏性能pages/article/[id].vue動態路由

(一)前端API調用對比

管理端調用示例(Vue3):

// admin-frontend/src/api/content.js
import request from '@/utils/request'export function getContentList(params) {return request({url: '/api/admin/v1/content',method: 'get',params})
}

門戶端調用示例(Nuxt3):

// portal-frontend/composables/useContent.js
export default () => {const getContent = async (id) => {return $fetch(`/api/portal/v1/content/${id}`, {method: 'GET'})}return { getContent }
}

(二)開發環境代理配置

管理端Vite配置(admin-frontend/vite.config.js):

export default defineConfig({server: {proxy: {'/api/admin': {target: 'http://localhost:8080', // Spring Boot地址changeOrigin: true,rewrite: path => path.replace(/^\/api\/admin/, '')}}}
})

門戶端Nuxt配置(portal-frontend/nuxt.config.js):

export default defineNuxtConfig({devServer: {proxy: {'/api/portal': 'http://localhost:8080'}}
})

前端環境變量:

# admin-frontend/.env.development
VITE_API_BASE=/api/admin# portal-frontend/.env.production
NUXT_PUBLIC_API_BASE=/api/portal

五、其它

1.Nginx統一配置:

server {listen 80;# 管理前端location /admin {alias /var/www/admin-frontend/dist;try_files $uri $uri/ /admin/index.html;}# 門戶前端location / {alias /var/www/portal-frontend/dist;try_files $uri $uri/ /index.html;}# API路由location /api {proxy_pass http://backend-server:8080;proxy_set_header Host $host;# 管理API超時設置location ~ ^/api/admin {proxy_read_timeout 300s;}# 門戶API緩存配置location ~ ^/api/portal.*\.(js|css|png)$ {expires 30d;}}
}

2.日常開發流程:

創建功能分支
后端開發
管理前端對接
門戶前端對接
本地聯調測試
提交到同一分支
創建合并請求
代碼評審后合并

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82970.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式里的時間魔法:RTC 與 BKP 深度拆解

文章目錄 RTC實時時鐘與BKPUnix時間戳UTC/GMT時間戳轉換時間戳轉換BKP簡介BKP基本結構1. 電池供電模塊&#xff08;VBAT 輸入&#xff09;2. 侵入檢測模塊&#xff08;TAMPER 輸入&#xff09;3. 時鐘輸出模塊&#xff08;RTC 輸出&#xff09;4. 內部寄存器組 RTC簡介RTC時鐘源…

STC8H系列 驅動步進電機

STC8H 驅動步進電機 一、引言二、硬件設計三、軟件設計Step_Motor2.c文件Step_ Motor2.h文件 一、引言 眾所周知STC8H系列有兩個PWM&#xff0c;分別為PWMA和PWMB外設模塊&#xff0c;我全都用上&#xff0c;豈不是就有兩個帶動電機的脈沖信號&#xff1f;&#xff01;哈哈哈哈…

Python高階函數:從入門到精通

目錄 Python高階函數詳解&#xff1a;從概念到高級應用引言&#xff1a;函數式編程的魅力一、高階函數基礎概念1.1 什么是高階函數1.2 Python中的一等函數 二、內置高階函數詳解2.1 map函數&#xff1a;數據轉換利器2.2 filter函數&#xff1a;數據篩選專家2.3 reduce函數&…

騰訊開源視頻生成工具 HunyuanVideo-Avatar,上傳一張圖+一段音頻,就能讓圖中的人物、動物甚至虛擬角色“活”過來,開口說話、唱歌、演相聲!

騰訊混元團隊提出的 HunyuanVideo-Avatar 是一個基于多模態擴散變換器&#xff08;MM-DiT&#xff09;的模型&#xff0c;能夠生成動態、情緒可控和多角色對話視頻。支持僅 10GB VRAM 的單 GPU運行&#xff0c;支持多種下游任務和應用。例如生成會說話的虛擬形象視頻&#xff0…

DeepSeek-R1-0528:開源推理模型的革新與突破

一、 發布日期與背景 2025年5月29日&#xff0c;備受業界關注的DeepSeek推理模型DeepSeek-R1迎來重要更新——DeepSeek-R1-0528模型正式發布。此次更新采取了“靜默發布”策略&#xff0c;未提前預告&#xff0c;而是通過官方渠道&#xff08;官網、App、小程序&#xff09;及…

LeetCode 1723: 完成所有工作的最短時間

給你一個整數數組 jobs &#xff0c;其中 jobs[i] 是完成第 i 項工作要花費的時間。 請你將這些工作分配給 k 位工人。所有工作都應該分配給工人&#xff0c;且每項工作只能分配給一位工人。工人的 工作時間 是完成分配給他們的所有工作花費時間的總和。請你設計一套最佳的工作…

JDK8新特性之Steam流

這里寫目錄標題 一、Stream流概述1.1、傳統寫法1.2、Stream寫法1.3、Stream流操作分類 二、Stream流獲取方式2.1、根據Collection獲取2.2、通過Stream的of方法 三、Stream常用方法介紹3.1、forEach3.2、count3.3、filter3.4、limit3.5、skip3.6、map3.7、sorted3.8、distinct3.…

split方法

在編程中&#xff0c;split 方法通常用于將字符串按照指定的分隔符拆分成多個部分&#xff0c;并返回一個包含拆分結果的列表&#xff08;或數組&#xff09;。不同編程語言中的 split 方法語法略有不同&#xff0c;但核心功能相似。以下是常見語言中的用法&#xff1a; ?1. P…

深入理解 x86 匯編中的符號擴展指令:從 CBW 到 CDQ 的全解析

引入 在匯編語言的世界里&#xff0c;數據寬度的轉換是一項基礎卻至關重要的操作。尤其是在處理有符號數時&#xff0c;符號擴展&#xff08;Sign Extension&#xff09;作為保持數值符號一致性的核心技術&#xff0c;直接影響著運算結果的正確性。本文將聚焦 x86 架構中最常用…

計算機基礎知識(第五篇)

計算機基礎知識&#xff08;第五篇&#xff09; 架構演化與維護 軟件架構的演化和定義 軟件架構的演化和維護就是對架構進行修改和完善的過程&#xff0c;目的就是為了使軟件能夠適應環境的變化而進行的糾錯性修改和完善性修改等&#xff0c;是一個不斷迭代的過程&#xff0…

前端開發三劍客:HTML5+CSS3+ES6

在前端開發領域&#xff0c;HTML、CSS和JavaScript構成了構建網頁與Web應用的核心基礎。隨著技術標準的不斷演進&#xff0c;HTML5、CSS3以及ES6&#xff08;ECMAScript 2015及后續版本&#xff09;帶來了諸多新特性與語法優化&#xff0c;極大地提升了開發效率和用戶體驗。本文…

c++ 頭文件

目錄 防止頭文件重復包含 頭文件的作用 如何讓程序的多個 .cpp 文件之間共享全局變量&#xff08;可能是 int、結構體、數組、指針、類對象&#xff09;? 防止頭文件重復包含 為什么要防止頭問件重復包含&#xff1f; 當然一般也不會把變量定義放到頭問件&#xff0c;那為…

深入解析 JavaScript 中 var、let、const 的核心區別與實踐應用

一、歷史背景與語法基礎 JavaScript 作為動態弱類型語言&#xff0c;變量聲明機制經歷了從 ES5 到 ES6 的重大變革。在 ES5 及更早版本中&#xff0c;var 是唯一的變量聲明方式&#xff0c;而 ES6&#xff08;2015 年&#xff09;引入了 let 和 const&#xff0c;旨在解決 var…

【Linux庖丁解牛】—自定義shell的編寫!

1. 打印命令行提示符 在我們使用系統提供的shell時&#xff0c;每次都會打印出一行字符串&#xff0c;這其實就是命令行提示符&#xff0c;那我們自定義的shell當然也需要這一行字符串。 這一行字符串包含用戶名&#xff0c;主機名&#xff0c;當前工作路徑&#xff0c;所以&a…

應用案例 | 設備分布廣, 現場維護難? 宏集Cogent DataHub助力分布式鍋爐遠程運維, 讓現場變“透明”

在日本&#xff0c;能源利用與環保問題再次成為社會關注的焦點。越來越多的工業用戶開始尋求更高效、可持續的方式來運營設備、管理能源。而作為一家專注于節能與自動化系統集成的企業&#xff0c;日本大阪的TESS工程公司給出了一個值得借鑒的答案。 01 鍋爐遠程監控難題如何破…

【OSG學習筆記】Day 16: 骨骼動畫與蒙皮(osgAnimation)

骨骼動畫基礎 骨骼動畫是 3D 計算機圖形中常用的技術&#xff0c;它通過以下兩個主要組件實現角色動畫。 骨骼系統 (Skeleton)&#xff1a;由層級結構的骨頭組成&#xff0c;類似于人體骨骼蒙皮 (Mesh Skinning)&#xff1a;將模型網格頂點綁定到骨骼上&#xff0c;使骨骼移動…

jdk同時安裝多個版本并自由切換

一、安裝不同版本的JDK 二、配置環境變量&#xff08;多版本JDK&#xff09; 1. 新建版本專用環境變量&#xff08;用于切換&#xff09; 操作位置&#xff1a;系統變量 > 新建 變量名&#xff1a;JAVA_HOME_1.8 變量值&#xff1a;JDK 8安裝路徑變量名&#xff1a;JAVA1…

java中裝飾模式

目錄 一 裝飾模式案例說明 1.1 說明 1.2 代碼 1.2.1 定義數據服務接口 1.2.2 定義基礎數據庫服務實現 1.2.3 日志裝飾器 1.2.4 緩存裝飾器 1.2.5 主程序調用 1.3 裝飾模式的特點 一 裝飾模式案例說明 1.1 說明 本案例是&#xff1a;數據查詢增加緩存&#xff0c;使用…

【論文閱讀】YOLOv8在單目下視多車目標檢測中的應用

Application of YOLOv8 in monocular downward multiple Car Target detection????? 原文真離譜&#xff0c;文章都不全還發上來 引言 自動駕駛技術是21世紀最重要的技術發展之一&#xff0c;有望徹底改變交通安全和效率。任何自動駕駛系統的核心都依賴于通過精確物體檢…

在uni-app中如何從Options API遷移到Composition API?

uni-app 從 Options API 遷移到 Composition API 的詳細指南 一、遷移前的準備 升級環境&#xff1a; 確保 HBuilderX 版本 ≥ 3.2.0項目 uni-app 版本 ≥ 3.0.0 了解 Composition API 基礎&#xff1a; 響應式系統&#xff1a;ref、reactive生命周期鉤子&#xff1a;onMount…