SeaCMS 产品文档
版本:1.1.0
更新日期:2026-04-18
官方网站:SeaCMS
第一部分:技术文档
1. 产品概述
SeaCMS 是一个基于 Python Flask 框架和 SQLite 数据库构建的轻量级内容管理系统(CMS),专为个人博客、企业官网、技术文档站点等场景设计。系统采用前后端一体化架构,提供完整的后台管理界面和响应式前端展示。
1.1 核心特性
|
特性 |
说明 |
|---|---|
|
文章管理 |
支持文章创建、编辑、发布、定时发布、版本控制、SEO优化 |
|
页面管理 |
支持自定义页面创建、排序、模板选择 |
|
分类与标签 |
支持分类层级、标签聚合、多维度内容组织 |
|
富文本编辑器 |
自研 SeaEditor,支持图片/文件上传、表格、代码块等 |
|
媒体管理 |
支持图片、文档上传,自动生成缩略图信息 |
|
评论系统 |
支持评论审核、嵌套回复、状态管理 |
|
用户与权限 |
基于RBAC的角色权限体系,支持5种角色 |
|
双因素认证 |
支持TOTP双因素认证(Google Authenticator兼容) |
|
API接口 |
RESTful API,支持Token认证,便于第三方集成 |
|
主题管理 |
内置8种预设主题,支持可视化主题编辑器,自定义配色/布局/字体 |
|
本地化资源 |
所有前端资源本地化部署,无需依赖外部CDN |
|
安全防护 |
内置WAF中间件,CSRF保护,SQL注入/XSS防护 |
|
访问统计 |
访客追踪、页面浏览统计、来源分析 |
|
数据备份 |
数据库备份、恢复、下载 |
|
SEO优化 |
Sitemap自动生成、Meta标签管理、SEO分析评分 |
|
暗色模式 |
全站支持亮色/暗色主题切换 |
|
响应式设计 |
完美适配桌面端和移动端 |
|
Docker部署 |
提供Dockerfile和docker-compose配置 |
1.2 技术栈
|
类别 |
技术 |
版本 |
|---|---|---|
|
后端框架 |
Flask |
3.1.0 |
|
ORM |
Flask-SQLAlchemy (SQLAlchemy) |
3.1.1 / 2.0.36 |
|
数据库 |
SQLite |
系统内置 |
|
认证 |
Flask-Login |
0.6.3 |
|
权限 |
Flask-Principal |
0.4.0 |
|
表单 |
Flask-WTF (WTForms) |
1.2.2 / 3.2.1 |
|
数据库迁移 |
Flask-Migrate |
4.0.7 |
|
缓存 |
Flask-Caching |
2.3.0 |
|
API |
Flask-RESTful |
0.3.10 |
|
邮件 |
Flask-Mail |
0.10.0 |
|
限流 |
Flask-Limiter |
3.9.0 |
|
密码加密 |
bcrypt |
4.2.1 |
|
2FA |
pyotp |
2.9.0 |
|
二维码 |
qrcode |
7.4.2 |
|
图片处理 |
Pillow |
- |
|
HTML清洗 |
bleach |
6.2.0 |
|
定时任务 |
APScheduler |
3.10.4 |
|
生产服务器 |
Gunicorn |
23.0.0 |
|
前端CSS |
Tailwind CSS |
本地部署 |
|
前端图标 |
Font Awesome |
本地部署 |
|
图表库 |
Chart.js |
本地部署 |
|
中文字体 |
Noto Sans SC |
本地部署 |
|
反向代理 |
Nginx |
Alpine |
2. 技术架构
2.1 系统架构图
┌─────────────────────────────────────────────────┐
│ Nginx (反向代理) │
│ 静态文件缓存 / SSL终止 / 负载均衡 │
└──────────────────────┬──────────────────────────┘
│
┌──────────────────────▼──────────────────────────┐
│ Gunicorn (WSGI服务器) │
│ 4 Workers / 120s超时 │
└──────────────────────┬──────────────────────────┘
│
┌──────────────────────▼──────────────────────────┐
│ Flask 应用 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Auth BP │ │ Admin BP │ │ Main BP │ │
│ │ /auth │ │ /admin │ │ / │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ API BP │ │ WAF │ │ Scheduler│ │
│ │ /api │ │ 中间件 │ │ 定时任务 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────────────────────────────────┐ │
│ │ Extensions Layer │ │
│ │ DB | Login | CSRF | Cache | Mail │ │
│ │ Migrate | Principal | Limiter │ │
│ └──────────────────────────────────────┘ │
└──────────────────────┬──────────────────────────┘
│
┌──────────────────────▼──────────────────────────┐
│ SQLite 数据库 │
│ (instance/seacms.db) │
└─────────────────────────────────────────────────┘
2.2 请求处理流程
客户端请求
│
▼
Nginx (静态文件直接返回,其他转发)
│
▼
Gunicorn
│
▼
Flask App
│
├── WAF中间件检查 (SQL注入/XSS/路径遍历检测)
│
├── CSRF验证 (POST/PUT/DELETE请求)
│
├── 限流检查 (Flask-Limiter)
│
├── 路由分发 (Blueprint)
│ ├── /auth/* → 认证模块
│ ├── /admin/* → 后台管理模块
│ ├── / → 前台展示模块
│ └── /api/* → API模块
│
├── 业务逻辑处理
│
├── 模板渲染 (Jinja2)
│
└── 返回响应
2.3 蓝图注册
|
蓝图 |
URL前缀 |
功能 |
|---|---|---|
|
|
|
用户认证(登录、注册、2FA) |
|
|
|
后台管理(文章、页面、设置等) |
|
|
|
前台展示(首页、博客、文章详情等) |
|
|
|
RESTful API接口 |
3. 项目结构
seacms/
├── app/ # 应用主目录
│ ├── __init__.py # 应用工厂函数 create_app()
│ ├── extensions.py # Flask扩展初始化
│ ├── middleware.py # WAF中间件
│ ├── models.py # 数据模型定义
│ ├── tasks.py # 定时任务(定时发布)
│ ├── admin/ # 后台管理模块
│ │ ├── __init__.py
│ │ ├── forms.py # WTForms表单定义
│ │ └── routes.py # 后台路由(50+接口)
│ ├── api/ # API模块
│ │ ├── __init__.py
│ │ └── routes.py # RESTful API路由
│ ├── auth/ # 认证模块
│ │ ├── __init__.py
│ │ ├── forms.py # 登录/注册/资料表单
│ │ └── routes.py # 认证路由
│ ├── main/ # 前台模块
│ │ ├── __init__.py
│ │ └── routes.py # 前台路由
│ ├── static/ # 静态资源
│ │ ├── css/
│ │ │ └── sea-editor.css # 富文本编辑器样式
│ │ ├── js/
│ │ │ └── sea-editor.js # 富文本编辑器脚本
│ │ ├── uploads/ # 上传文件目录
│ │ └── vendor/ # 本地化前端资源
│ │ ├── tailwindcss/ # Tailwind CSS (JIT编译器)
│ │ ├── fontawesome/ # Font Awesome (CSS+字体)
│ │ ├── chartjs/ # Chart.js 图表库
│ │ └── fonts/ # Noto Sans SC 中文字体
│ └── templates/ # Jinja2模板
│ ├── admin/ # 后台模板(30个)
│ ├── auth/ # 认证模板(6个)
│ └── main/ # 前台模板(7个)
├── instance/ # 实例目录
│ └── seacms.db # SQLite数据库文件
├── backups/ # 数据库备份目录
├── scripts/
│ └── init_db.py # 数据库初始化脚本
├── config.py # 配置类
├── run.py # 应用入口
├── Dockerfile # Docker镜像构建
├── docker-compose.yml # Docker编排
├── nginx.conf # Nginx配置
├── requirements.txt # Python依赖
├── .env.example # 环境变量示例
└── start.sh # 启动脚本
4. 数据库设计
4.1 ER关系图
┌──────────┐ ┌──────────────┐ ┌──────────┐
│ User │────<│ user_roles │>────│ Role │
└────┬─────┘ └──────────────┘ └──────────┘
│
│ 1:N
│
┌────▼─────┐ ┌──────────┐ ┌──────────┐
│ Post │>────│ post_tags │<────│ Tag │
└────┬─────┘ └──────────┘ └──────────┘
│
│ N:1 ┌──────────┐
├──────────────>│ Category │
│ └──────────┘
│ N:1
├──────────────>│ User │ (author)
│
│ 1:N
├──────────────>│ Comment │
│
│ 1:N
└──────────────>│PostVersion│
┌──────────┐ ┌──────────────┐ ┌──────────────┐
│ Page │ │ Media │ │ Setting │
└──────────┘ └──────────────┘ └──────────────┘
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ OperationLog │ │ APIToken │ │ContactMessage│
└──────────────┘ └──────────────┘ └──────────────┘
┌──────────────┐ ┌──────────────┐
│ VisitLog │ │ContentTemplate│
└──────────────┘ └──────────────┘
4.2 数据表详细设计
users - 用户表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
username |
VARCHAR(64) |
UNIQUE, NOT NULL |
用户名 |
|
|
VARCHAR(120) |
UNIQUE, NOT NULL |
邮箱 |
|
password_hash |
VARCHAR(256) |
NOT NULL |
bcrypt加密密码 |
|
nickname |
VARCHAR(64) |
- |
昵称 |
|
avatar |
VARCHAR(255) |
DEFAULT 'default_avatar.png' |
头像 |
|
bio |
TEXT |
- |
个人简介 |
|
is_active |
BOOLEAN |
DEFAULT TRUE |
是否启用 |
|
is_confirmed |
BOOLEAN |
DEFAULT FALSE |
邮箱是否验证 |
|
login_attempts |
INTEGER |
DEFAULT 0 |
登录尝试次数 |
|
locked_until |
DATETIME |
- |
锁定截止时间 |
|
last_login_at |
DATETIME |
- |
最后登录时间 |
|
last_login_ip |
VARCHAR(45) |
- |
最后登录IP |
|
totp_secret |
VARCHAR(32) |
- |
TOTP密钥 |
|
two_factor_enabled |
BOOLEAN |
DEFAULT FALSE |
是否启用2FA |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
|
updated_at |
DATETIME |
ON UPDATE UTCNOW |
更新时间 |
roles - 角色表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
name |
VARCHAR(64) |
UNIQUE, NOT NULL, INDEX |
角色名称 |
|
description |
VARCHAR(255) |
- |
角色描述 |
|
permissions |
TEXT |
DEFAULT '' |
权限列表(逗号分隔) |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
预置角色:
|
角色 |
描述 |
权限 |
|---|---|---|
|
superadmin |
超级管理员 |
all |
|
admin |
管理员 |
manage_users,manage_posts,manage_pages,manage_media,manage_settings |
|
editor |
编辑 |
manage_posts,manage_pages,manage_media |
|
author |
作者 |
write_post,manage_own_posts |
|
user |
普通用户 |
comment |
posts - 文章表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
title |
VARCHAR(200) |
NOT NULL |
标题 |
|
slug |
VARCHAR(200) |
UNIQUE, NOT NULL, INDEX |
URL别名 |
|
content |
TEXT |
- |
内容(HTML) |
|
summary |
TEXT |
- |
摘要 |
|
cover_image |
VARCHAR(255) |
- |
封面图URL |
|
status |
VARCHAR(20) |
DEFAULT 'draft', INDEX |
状态: draft/pending/published/trash |
|
is_top |
BOOLEAN |
DEFAULT FALSE, INDEX |
是否置顶 |
|
allow_comment |
BOOLEAN |
DEFAULT TRUE |
允许评论 |
|
view_count |
INTEGER |
DEFAULT 0 |
浏览次数 |
|
meta_title |
VARCHAR(200) |
- |
SEO标题 |
|
meta_description |
VARCHAR(300) |
- |
SEO描述 |
|
meta_keywords |
VARCHAR(255) |
- |
SEO关键词 |
|
author_id |
INTEGER |
FK→users.id, INDEX |
作者ID |
|
category_id |
INTEGER |
FK→categories.id, INDEX |
分类ID |
|
published_at |
DATETIME |
- |
发布时间 |
|
scheduled_at |
DATETIME |
- |
定时发布时间 |
|
language |
VARCHAR(10) |
DEFAULT 'zh' |
语言 |
|
created_at |
DATETIME |
DEFAULT UTCNOW, INDEX |
创建时间 |
|
updated_at |
DATETIME |
ON UPDATE UTCNOW |
更新时间 |
categories - 分类表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
name |
VARCHAR(64) |
NOT NULL |
分类名称 |
|
slug |
VARCHAR(64) |
UNIQUE, NOT NULL, INDEX |
URL别名 |
|
description |
VARCHAR(255) |
- |
描述 |
|
parent_id |
INTEGER |
FK→categories.id |
父分类ID |
|
sort_order |
INTEGER |
DEFAULT 0 |
排序 |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
tags - 标签表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
name |
VARCHAR(64) |
NOT NULL, UNIQUE |
标签名称 |
|
slug |
VARCHAR(64) |
UNIQUE, NOT NULL, INDEX |
URL别名 |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
pages - 页面表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
title |
VARCHAR(200) |
NOT NULL |
标题 |
|
slug |
VARCHAR(200) |
UNIQUE, NOT NULL, INDEX |
URL别名 |
|
content |
TEXT |
- |
内容(HTML) |
|
template |
VARCHAR(100) |
DEFAULT 'default' |
模板名称 |
|
sort_order |
INTEGER |
DEFAULT 0 |
排序 |
|
is_home |
BOOLEAN |
DEFAULT FALSE |
是否首页 |
|
status |
VARCHAR(20) |
DEFAULT 'published' |
状态 |
|
meta_title |
VARCHAR(200) |
- |
SEO标题 |
|
meta_description |
VARCHAR(300) |
- |
SEO描述 |
|
meta_keywords |
VARCHAR(255) |
- |
SEO关键词 |
|
author_id |
INTEGER |
FK→users.id |
作者ID |
|
language |
VARCHAR(10) |
DEFAULT 'zh' |
语言 |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
|
updated_at |
DATETIME |
ON UPDATE UTCNOW |
更新时间 |
comments - 评论表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
content |
TEXT |
NOT NULL |
评论内容 |
|
author_name |
VARCHAR(64) |
- |
评论者名称 |
|
author_email |
VARCHAR(120) |
- |
评论者邮箱 |
|
author_url |
VARCHAR(255) |
- |
评论者网址 |
|
author_id |
INTEGER |
FK→users.id |
注册用户ID |
|
post_id |
INTEGER |
FK→posts.id, INDEX |
文章ID |
|
parent_id |
INTEGER |
FK→comments.id |
父评论ID |
|
status |
VARCHAR(20) |
DEFAULT 'pending', INDEX |
状态: pending/approved/spam/trash |
|
ip_address |
VARCHAR(45) |
- |
IP地址 |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
media - 媒体文件表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
filename |
VARCHAR(255) |
NOT NULL |
存储文件名(UUID) |
|
original_name |
VARCHAR(255) |
NOT NULL |
原始文件名 |
|
file_path |
VARCHAR(500) |
NOT NULL |
文件路径 |
|
file_size |
INTEGER |
- |
文件大小(字节) |
|
file_type |
VARCHAR(50) |
- |
类型: image/document |
|
mime_type |
VARCHAR(100) |
- |
MIME类型 |
|
alt_text |
VARCHAR(255) |
- |
替代文本 |
|
width |
INTEGER |
- |
图片宽度 |
|
height |
INTEGER |
- |
图片高度 |
|
uploader_id |
INTEGER |
FK→users.id |
上传者ID |
|
created_at |
DATETIME |
DEFAULT UTCNOW, INDEX |
创建时间 |
post_versions - 文章版本表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
post_id |
INTEGER |
FK→posts.id, INDEX, NOT NULL |
文章ID |
|
version_number |
INTEGER |
NOT NULL |
版本号 |
|
title |
VARCHAR(200) |
- |
版本标题 |
|
content |
TEXT |
- |
版本内容 |
|
summary |
TEXT |
- |
版本摘要 |
|
user_id |
INTEGER |
FK→users.id |
操作用户ID |
|
change_summary |
VARCHAR(255) |
- |
变更说明 |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
settings - 系统设置表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
key |
VARCHAR(100) |
UNIQUE, NOT NULL, INDEX |
设置键 |
|
value |
TEXT |
- |
设置值 |
|
description |
VARCHAR(255) |
- |
描述 |
|
group |
VARCHAR(50) |
DEFAULT 'general' |
分组: general/seo/comment/upload/mail/theme/security/performance/editor |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
|
updated_at |
DATETIME |
ON UPDATE UTCNOW |
更新时间 |
visit_logs - 访问日志表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
url |
VARCHAR(500) |
NOT NULL, INDEX |
访问URL |
|
referrer |
VARCHAR(500) |
- |
来源URL |
|
ip_address |
VARCHAR(45), INDEX |
- |
IP地址 |
|
user_agent |
VARCHAR(500) |
- |
浏览器UA |
|
visitor_id |
VARCHAR(36), INDEX |
- |
访客标识(Cookie) |
|
post_id |
INTEGER |
FK→posts.id |
关联文章ID |
|
created_at |
DATETIME |
DEFAULT UTCNOW, INDEX |
创建时间 |
operation_logs - 操作日志表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
user_id |
INTEGER |
FK→users.id |
操作用户ID |
|
action |
VARCHAR(100) |
NOT NULL |
操作类型 |
|
target_type |
VARCHAR(50) |
- |
目标类型 |
|
target_id |
INTEGER |
- |
目标ID |
|
detail |
TEXT |
- |
操作详情 |
|
ip_address |
VARCHAR(45) |
- |
IP地址 |
|
created_at |
DATETIME |
DEFAULT UTCNOW, INDEX |
创建时间 |
api_tokens - API令牌表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
name |
VARCHAR(100) |
NOT NULL |
令牌名称 |
|
token |
VARCHAR(64) |
UNIQUE, NOT NULL, INDEX |
令牌值 |
|
user_id |
INTEGER |
FK→users.id, NOT NULL |
所属用户ID |
|
is_active |
BOOLEAN |
DEFAULT TRUE |
是否启用 |
|
last_used_at |
DATETIME |
- |
最后使用时间 |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
contact_messages - 联系消息表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
name |
VARCHAR(64) |
NOT NULL |
发送者姓名 |
|
|
VARCHAR(120) |
NOT NULL |
发送者邮箱 |
|
subject |
VARCHAR(200) |
- |
主题 |
|
message |
TEXT |
NOT NULL |
消息内容 |
|
is_read |
BOOLEAN |
DEFAULT FALSE |
是否已读 |
|
ip_address |
VARCHAR(45) |
- |
IP地址 |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
content_templates - 内容模板表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
name |
VARCHAR(100) |
NOT NULL |
模板名称 |
|
description |
VARCHAR(255) |
- |
描述 |
|
content |
TEXT |
- |
模板内容(HTML) |
|
template_type |
VARCHAR(20) |
DEFAULT 'post' |
类型: post/page |
|
is_builtin |
BOOLEAN |
DEFAULT FALSE |
是否内置 |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
|
updated_at |
DATETIME |
ON UPDATE UTCNOW |
更新时间 |
themes - 主题表
|
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
|
id |
INTEGER |
PK, AUTO |
主键 |
|
name |
VARCHAR(100) |
NOT NULL |
主题名称 |
|
slug |
VARCHAR(100) |
UNIQUE, NOT NULL |
主题标识 |
|
description |
VARCHAR(255) |
- |
描述 |
|
is_preset |
BOOLEAN |
DEFAULT FALSE |
是否预设主题 |
|
is_active |
BOOLEAN |
DEFAULT FALSE |
是否启用 |
|
thumbnail |
VARCHAR(255) |
- |
缩略图URL |
|
config |
TEXT |
- |
主题配置(JSON) |
|
custom_css |
TEXT |
- |
自定义CSS |
|
created_at |
DATETIME |
DEFAULT UTCNOW |
创建时间 |
|
updated_at |
DATETIME |
ON UPDATE UTCNOW |
更新时间 |
预设主题(8种):
|
主题 |
说明 |
|---|---|
|
ocean-blue |
海洋蓝 - 清新专业风格 |
|
sunset-orange |
日落橙 - 温暖活力风格 |
|
forest-green |
森林绿 - 自然清新风格 |
|
royal-purple |
皇家紫 - 高贵典雅风格 |
|
midnight-dark |
午夜黑 - 现代暗色风格 |
|
sakura-pink |
樱花粉 - 浪漫温柔风格 |
|
golden-sand |
金沙黄 - 商务稳重风格 |
|
arctic-white |
极地白 - 简约纯净风格 |
关联表
user_roles - 用户角色关联
|
字段 |
类型 |
约束 |
|---|---|---|
|
user_id |
INTEGER |
FK→users.id, PK |
|
role_id |
INTEGER |
FK→roles.id, PK |
post_tags - 文章标签关联
|
字段 |
类型 |
约束 |
|---|---|---|
|
post_id |
INTEGER |
FK→posts.id, PK |
|
tag_id |
INTEGER |
FK→tags.id, PK |
5. API 接口文档
5.1 公开接口
获取文章列表
GET /api/public/posts
参数:
|
参数 |
类型 |
默认值 |
说明 |
|---|---|---|---|
|
page |
int |
1 |
页码 |
|
per_page |
int |
10 |
每页数量 |
|
category_id |
int |
- |
按分类筛选 |
响应字段:
|
字段 |
类型 |
说明 |
|---|---|---|
|
id |
int |
文章ID |
|
title |
string |
标题 |
|
slug |
string |
URL别名 |
|
content |
string |
内容 |
|
summary |
string |
摘要 |
|
cover_image |
string |
封面图 |
|
status |
string |
状态 |
|
view_count |
int |
浏览次数 |
|
is_top |
bool |
是否置顶 |
|
meta_title |
string |
SEO标题 |
|
meta_description |
string |
SEO描述 |
|
meta_keywords |
string |
SEO关键词 |
|
published_at |
datetime |
发布时间 |
|
created_at |
datetime |
创建时间 |
|
updated_at |
datetime |
更新时间 |
获取文章详情
GET /api/public/posts/<slug>
获取分类列表
GET /api/public/categories
获取页面列表
GET /api/public/pages
获取页面详情
GET /api/public/pages/<slug>
获取站点信息
GET /api/public/site-info
响应示例:
{
"site_name": "SeaCMS",
"site_description": "一个基于Flask的内容管理系统",
"site_keywords": "CMS,Flask,内容管理",
"total_posts": 42,
"total_categories": 5,
"total_tags": 18
}
提交评论
POST /api/comments
请求体:
{
"post_id": 1,
"content": "评论内容",
"author_name": "访客",
"author_email": "visitor@example.com"
}
用户认证
POST /api/auth
请求体:
{
"username": "admin",
"password": "password"
}
5.2 管理接口(需Token认证)
所有管理接口需在请求头中携带API Token:
Authorization: Bearer <your-api-token>
管理文章列表
GET /api/manage/posts?page=1&per_page=20
创建文章
POST /api/manage/posts
请求体:
{
"title": "文章标题",
"content": "文章内容",
"summary": "文章摘要",
"status": "draft"
}
获取/更新/删除文章
GET /api/manage/posts/<id>
PUT /api/manage/posts/<id>
DELETE /api/manage/posts/<id>
PUT请求体(部分更新):
{
"title": "新标题",
"content": "新内容",
"status": "published"
}
DELETE操作: 将文章状态设为 trash,不物理删除。
6. 安全机制
6.1 WAF(Web应用防火墙)
系统内置WAF中间件,在请求到达路由前进行安全检查:
|
防护类型 |
检测内容 |
|---|---|
|
SQL注入 |
UNION SELECT, OR 1=1, DROP TABLE, 注释符等 |
|
XSS攻击 |
script标签, javascript:, 事件处理器, iframe, eval等 |
|
路径遍历 |
../, /etc/passwd, /proc/self, .env, .git/等 |
|
IP封锁 |
支持手动封锁IP和IP白名单 |
豁免规则: 已登录用户的后台管理(/admin/*)和API(/api/*)请求跳过WAF内容检查,允许发布包含HTML代码的文章内容。前台公开接口(评论提交、搜索等)仍受WAF保护。
6.2 认证安全
|
机制 |
说明 |
|---|---|
|
密码加密 |
bcrypt算法,自动加盐 |
|
登录保护 |
5次失败后锁定15分钟 |
|
CSRF保护 |
所有POST请求验证CSRF Token |
|
会话安全 |
HttpOnly Cookie, SameSite=Lax, 生产环境Secure |
|
会话超时 |
24小时过期 |
|
双因素认证 |
TOTP协议,兼容Google Authenticator |
6.3 请求限流
|
限制 |
值 |
|---|---|
|
每日请求 |
200次/IP |
|
每小时请求 |
50次/IP |
6.4 文件上传安全
|
措施 |
说明 |
|---|---|
|
类型限制 |
仅允许配置的白名单扩展名 |
|
大小限制 |
默认16MB |
|
文件名处理 |
UUID重命名,防止路径注入 |
|
内容检测 |
图片文件自动获取尺寸信息 |
7. 部署指南
7.1 本地开发部署
# 1. 克隆项目
git clone <repository-url>
cd seacms
# 2. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 配置环境变量
cp .env.example .env
# 编辑 .env 文件,设置 SECRET_KEY 等
# 5. 初始化数据库
python scripts/init_db.py
# 6. 启动开发服务器
python run.py
访问 http://localhost:8000 查看前台,http://localhost:8000/admin 进入后台。
7.2 Docker部署
# 构建并启动
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
Docker Compose服务:
|
服务 |
端口 |
说明 |
|---|---|---|
|
web |
5000 |
Flask应用(Gunicorn) |
|
nginx |
80 |
Nginx反向代理 |
7.3 生产环境部署
# 使用Gunicorn启动
gunicorn --bind 0.0.0.0:5000 \
--workers 4 \
--timeout 120 \
--access-logfile - \
--error-logfile - \
run:app
Nginx配置要点:
-
静态文件直接由Nginx服务,设置30天缓存
-
代理请求到Gunicorn
-
设置
client_max_body_size 20M支持文件上传 -
建议配置SSL证书启用HTTPS
7.4 环境变量配置
|
变量 |
必填 |
默认值 |
说明 |
|---|---|---|---|
|
SECRET_KEY |
是 |
- |
应用密钥,生产环境必须修改 |
|
DATABASE_URL |
否 |
sqlite:///seacms.db |
数据库连接 |
|
FLASK_ENV |
否 |
development |
运行环境: development/production |
|
FLASK_DEBUG |
否 |
0 |
调试模式 |
|
UPLOAD_FOLDER |
否 |
app/static/uploads |
上传目录 |
|
MAX_CONTENT_LENGTH |
否 |
67108864 |
最大上传大小(字节,默认64MB) |
|
ALLOWED_EXTENSIONS |
否 |
png,jpg,jpeg,gif,... |
允许的文件类型 |
|
MAIL_SERVER |
否 |
smtp.example.com |
邮件服务器 |
|
MAIL_PORT |
否 |
587 |
邮件端口 |
|
MAIL_USE_TLS |
否 |
1 |
启用TLS |
|
MAIL_USERNAME |
否 |
- |
邮箱账号 |
|
MAIL_PASSWORD |
否 |
- |
邮箱密码 |
|
ADMIN_EMAIL |
否 |
管理员邮箱 |
|
|
ADMIN_PASSWORD |
否 |
admin123456 |
管理员初始密码 |
8. 配置参考
8.1 应用配置类
|
配置项 |
DevelopmentConfig |
ProductionConfig |
|---|---|---|
|
DEBUG |
True |
False |
|
SQLALCHEMY_ECHO |
False |
False |
|
SESSION_COOKIE_SECURE |
False |
True |
|
WTF_CSRF_ENABLED |
True |
True |
|
PERMANENT_SESSION_LIFETIME |
86400s |
86400s |
|
POSTS_PER_PAGE |
10 |
10 |
|
ADMIN_PER_PAGE |
15 |
15 |
|
LOGIN_ATTEMPTS_MAX |
5 |
5 |
|
LOGIN_LOCKOUT_TIME |
900s |
900s |
8.2 Flask扩展配置
|
扩展 |
配置 |
|---|---|
|
SQLAlchemy |
pool_pre_ping=True, pool_recycle=300 |
|
LoginManager |
session_protection='strong' |
|
CSRFProtect |
time_limit=3600s |
|
Cache |
type=SimpleCache, timeout=300s |
|
Limiter |
200/day, 50/hour per IP |
第二部分:操作手册
1. 快速开始
1.1 首次登录
-
启动应用后访问
http://your-domain/admin -
使用默认管理员账号登录:
-
用户名:
admin -
密码:
admin123456
-
-
首次登录后请立即修改密码
1.2 基本设置
登录后台后,建议按以下顺序完成初始配置:
-
系统设置 → 修改站点名称、描述、关键词
-
分类管理 → 创建文章分类
-
用户管理 → 修改管理员密码,创建其他用户
-
安全设置 → 启用WAF,配置双因素认证
2. 后台管理
2.1 仪表盘
仪表盘提供系统概览信息:
|
区域 |
内容 |
|---|---|
|
统计卡片 |
文章总数、用户总数、总浏览量、评论总数 |
|
待处理 |
待审核评论数、未读消息数 |
|
近期文章 |
最近5篇文章列表 |
|
7日趋势 |
最近7天文章发布数量图表 |
|
分类统计 |
各分类文章数量分布 |
|
访问统计 |
最近7天访问量、独立访客数 |
2.2 导航菜单
|
菜单 |
功能 |
权限要求 |
|---|---|---|
|
仪表盘 |
系统概览 |
登录用户 |
|
文章管理 |
文章CRUD、批量操作 |
登录用户(作者仅管理自己的) |
|
分类管理 |
分类CRUD |
编辑及以上 |
|
标签管理 |
标签CRUD |
编辑及以上 |
|
页面管理 |
页面CRUD |
编辑及以上 |
|
评论管理 |
评论审核、状态管理 |
管理员 |
|
媒体管理 |
文件上传、管理 |
登录用户 |
|
用户管理 |
用户CRUD、启用/禁用 |
管理员 |
|
系统设置 |
站点配置 |
管理员 |
|
内容模板 |
模板CRUD |
编辑及以上 |
|
访问统计 |
流量分析 |
管理员 |
|
API令牌 |
Token管理 |
管理员 |
|
联系消息 |
消息查看 |
管理员 |
|
数据备份 |
备份/恢复 |
管理员 |
|
操作日志 |
日志查看 |
管理员 |
|
系统信息 |
运行环境信息 |
管理员 |
3. 内容管理
3.1 文章管理
创建文章
-
进入 文章管理 → 点击 新建文章
-
填写文章信息:
-
标题(必填):文章标题
-
URL别名(可选):留空自动生成
-
内容:使用富文本编辑器编写
-
摘要:文章简介,留空时自动截取
-
封面图:输入图片URL
-
分类:选择文章分类
-
标签:输入标签,多个标签用逗号分隔
-
状态:草稿/待审核/已发布
-
置顶:是否在列表顶部显示
-
允许评论:是否开启评论
-
-
SEO设置(可选):
-
Meta标题
-
Meta描述
-
Meta关键词
-
-
点击 SEO分析 查看优化建议
-
点击 保存 或 发布
编辑文章
-
在文章列表中点击文章标题或编辑按钮
-
修改内容后点击保存
-
系统自动保存版本记录
文章版本
-
在编辑页面点击 版本历史
-
查看所有历史版本
-
点击版本号查看版本详情
-
点击 恢复此版本 回滚内容
批量操作
-
在文章列表勾选多个文章
-
选择操作类型:
-
删除(移入回收站/永久删除)
-
发布
-
转为草稿
-
移动到指定分类
-
-
点击执行
自动保存
编辑文章时,系统每45秒自动保存一次,保存指示器会短暂显示。
3.2 富文本编辑器 (SeaEditor)
SeaEditor 是系统内置的富文本编辑器,提供以下功能:
工具栏功能
|
分组 |
按钮 |
功能 |
|---|---|---|
|
撤销 |
撤销、重做 |
撤销/重做操作 |
|
格式 |
标题下拉 |
H1-H4、正文 |
|
文本 |
加粗、斜体、下划线、删除线 |
文本样式 |
|
对齐 |
左对齐、居中、右对齐、两端对齐 |
段落对齐 |
|
列表 |
无序列表、有序列表 |
列表 |
|
缩进 |
增加/减少缩进 |
缩进控制 |
|
插入 |
链接、图片、文件上传 |
内容插入 |
|
高级 |
引用、代码块、表格、水平线 |
高级格式 |
|
颜色 |
文字颜色、背景颜色 |
颜色设置 |
|
工具 |
清除格式、源代码、全屏 |
辅助工具 |
图片插入
-
点击工具栏 图片 按钮
-
选择插入方式:
-
URL地址:输入图片URL、替代文字、宽度
-
本地上传:点击或拖拽上传本地图片,支持预览
-
-
支持格式:JPG、PNG、GIF、WebP
文件上传
-
点击工具栏 上传文件 按钮
-
点击或拖拽上传文件
-
可选填链接文字
-
图片文件自动插入为图片,其他文件插入为下载链接
3.3 页面管理
创建页面
-
进入 页面管理 → 点击 新建页面
-
填写页面信息:
-
标题、URL别名、内容
-
模板选择
-
排序序号
-
是否设为首页
-
发布状态
-
SEO设置
-
-
已发布的页面会自动出现在前台导航栏
3.4 分类管理
-
支持层级分类(父子关系)
-
每个分类可设置排序序号
-
有文章的分类无法删除
-
分类URL使用slug格式
3.5 标签管理
-
标签在文章编辑时可直接创建
-
也可在标签管理页面单独管理
-
同一标签可关联多篇文章
3.6 内容模板
系统预置5个内容模板:
|
模板名 |
类型 |
说明 |
|---|---|---|
|
标准文章 |
post |
包含概述、正文、总结 |
|
教程文章 |
post |
步骤式教程格式 |
|
产品评测 |
post |
产品评测格式 |
|
联系页面 |
page |
联系信息页面 |
|
关于页面 |
page |
关于我们页面 |
内置模板不可编辑/删除,可创建自定义模板。
4. 媒体管理
4.1 上传文件
-
进入 媒体管理 → 点击 上传文件
-
选择文件或拖拽上传
-
支持批量上传
-
上传后自动记录文件信息
4.2 文件管理
-
按类型筛选(图片/文档)
-
点击文件可复制URL
-
支持批量删除
-
图片文件显示尺寸信息
4.3 上传限制
|
项目 |
默认值 |
|---|---|
|
最大文件大小 |
16MB |
|
允许的图片格式 |
png, jpg, jpeg, gif, webp, svg |
|
允许的文档格式 |
doc, docx, pdf, xlsx, xls, zip |
可在系统设置中修改上传限制。
5. 用户与权限
5.1 角色权限矩阵
|
功能 |
superadmin |
admin |
editor |
author |
user |
|---|---|---|---|---|---|
|
仪表盘 |
✅ |
✅ |
✅ |
✅ |
✅ |
|
管理所有文章 |
✅ |
✅ |
✅ |
❌ |
❌ |
|
管理自己的文章 |
✅ |
✅ |
✅ |
✅ |
❌ |
|
分类管理 |
✅ |
✅ |
✅ |
❌ |
❌ |
|
标签管理 |
✅ |
✅ |
✅ |
❌ |
❌ |
|
页面管理 |
✅ |
✅ |
✅ |
❌ |
❌ |
|
评论管理 |
✅ |
✅ |
❌ |
❌ |
❌ |
|
媒体管理 |
✅ |
✅ |
✅ |
✅ |
❌ |
|
用户管理 |
✅ |
✅ |
❌ |
❌ |
❌ |
|
系统设置 |
✅ |
✅ |
❌ |
❌ |
❌ |
|
数据备份 |
✅ |
✅ |
❌ |
❌ |
❌ |
|
操作日志 |
✅ |
✅ |
❌ |
❌ |
❌ |
5.2 用户管理操作
-
编辑用户:修改用户名、邮箱、昵称、角色、状态
-
启用/禁用:切换用户活跃状态,不能禁用自己
-
删除用户:物理删除,不能删除自己
5.3 双因素认证 (2FA)
启用2FA
-
登录后进入 个人资料 页面
-
点击 设置双因素认证
-
使用Google Authenticator等APP扫描二维码
-
输入APP显示的6位验证码完成绑定
使用2FA登录
-
输入用户名和密码
-
系统跳转到2FA验证页面
-
输入验证码完成登录
禁用2FA
-
进入个人资料页面
-
点击禁用双因素认证
-
输入当前验证码确认
6. 系统设置
6.1 基本设置
|
设置项 |
说明 |
默认值 |
|---|---|---|
|
站点名称 |
显示在导航栏和标题 |
SeaCMS |
|
站点描述 |
SEO描述 |
- |
|
站点关键词 |
SEO关键词 |
- |
|
站点Logo |
Logo图片URL |
- |
|
ICP备案号 |
显示在页脚 |
- |
|
统计代码 |
第三方统计JS代码 |
- |
6.2 SEO设置
|
设置项 |
说明 |
默认值 |
|---|---|---|
|
SEO标题后缀 |
追加到页面标题后 |
- SeaCMS |
|
默认SEO描述 |
未设置时的默认描述 |
- |
|
默认SEO关键词 |
未设置时的默认关键词 |
- |
6.3 评论设置
|
设置项 |
说明 |
默认值 |
|---|---|---|
|
开启评论 |
全局评论开关 |
开启 |
|
评论审核 |
新评论需审核 |
开启 |
|
评论验证码 |
评论需输入验证码 |
关闭 |
6.4 上传设置
|
设置项 |
说明 |
默认值 |
|---|---|---|
|
上传大小限制 |
单文件最大MB数 |
16MB |
|
允许上传类型 |
逗号分隔的扩展名 |
png,jpg,jpeg,gif,webp,svg,doc,docx,pdf |
6.5 主题设置
|
设置项 |
说明 |
|---|---|
|
自定义CSS |
追加到页面底部的CSS代码 |
|
自定义JS |
追加到页面底部的JS代码 |
6.6 安全设置
|
设置项 |
说明 |
默认值 |
|---|---|---|
|
启用WAF |
Web应用防火墙 |
开启 |
|
IP白名单 |
每行一个IP |
空 |
6.7 性能设置
|
设置项 |
说明 |
默认值 |
|---|---|---|
|
CDN地址 |
静态资源CDN前缀 |
空 |
|
缓存超时 |
缓存过期时间(秒) |
300 |
7. 主题管理
7.1 主题概述
SeaCMS 提供强大的主题管理功能,支持一键切换预设主题,也可通过可视化编辑器自定义主题样式。
7.2 预设主题
系统内置 8 种精心设计的预设主题:
|
主题名称 |
主色调 |
风格描述 |
|---|---|---|
|
海洋蓝 (Ocean Blue) |
#2563eb |
清新专业,适合技术博客 |
|
日落橙 (Sunset Orange) |
#ea580c |
温暖活力,适合生活类网站 |
|
森林绿 (Forest Green) |
#16a34a |
自然清新,适合环保主题 |
|
皇家紫 (Royal Purple) |
#9333ea |
高贵典雅,适合艺术类网站 |
|
午夜黑 (Midnight Dark) |
#1f2937 |
现代暗色,适合科技类网站 |
|
樱花粉 (Sakura Pink) |
#ec4899 |
浪漫温柔,适合个人博客 |
|
金沙黄 (Golden Sand) |
#d97706 |
商务稳重,适合企业官网 |
|
极地白 (Arctic White) |
#6b7280 |
简约纯净,适合文档站点 |
7.3 主题切换
-
进入 外观管理 → 主题管理
-
浏览预设主题列表,点击主题卡片预览效果
-
点击 启用 按钮切换主题
-
前台立即应用新主题样式
7.4 可视化主题编辑器
点击主题的 编辑 按钮进入可视化编辑器,支持以下自定义选项:
颜色设置
|
设置项 |
说明 |
|---|---|
|
主色调 |
网站主要颜色(按钮、链接等) |
|
主色调浅色 |
悬停状态、浅色背景 |
|
主色调深色 |
激活状态、深色背景 |
|
背景色 |
页面背景颜色 |
|
文字颜色 |
正文文字颜色 |
|
边框颜色 |
边框、分割线颜色 |
布局设置
|
设置项 |
说明 |
|---|---|
|
导航样式 |
顶部固定 / 静态导航 |
|
侧边栏位置 |
左侧 / 右侧 / 隐藏 |
|
内容宽度 |
固定宽度 / 全宽 |
|
圆角大小 |
元素圆角半径 |
字体设置
|
设置项 |
说明 |
|---|---|
|
正文字号 |
文章正文字体大小 |
|
标题字号 |
文章标题字体大小 |
|
行高 |
文字行间距 |
模块设置
|
设置项 |
说明 |
|---|---|
|
显示Hero横幅 |
是否显示首页顶部横幅 |
|
Hero高度 |
横幅高度 |
|
Hero背景图 |
横幅背景图片URL |
|
显示侧边栏 |
是否显示侧边栏 |
|
显示页脚 |
是否显示页脚 |
页脚设置
|
设置项 |
说明 |
|---|---|
|
页脚背景色 |
页脚区域背景颜色 |
|
页脚文字色 |
页脚文字颜色 |
|
页脚样式 |
简洁 / 标准 / 详细 |
自定义CSS
在 自定义CSS 文本框中输入任意CSS代码,实现更高级的样式定制。
7.5 主题开发
如需开发自定义主题,请参考 SeaCMS_主题开发文档.md。
8. 前端展示
8.1 页面路由
|
路由 |
说明 |
|---|---|
|
|
首页(轮播+最新文章) |
|
|
博客列表(分页、分类筛选、标签筛选) |
|
|
文章详情(评论、相关文章) |
|
|
自定义页面 |
|
|
搜索 |
|
|
联系我们 |
|
|
站点地图 |
|
|
爬虫规则 |
8.2 首页布局
-
顶部轮播图(置顶文章,最多5篇)
-
最新文章列表(10篇)
-
侧边栏:分类列表、标签云、热门文章
8.3 暗色模式
-
点击导航栏主题切换按钮
-
自动保存偏好到本地存储
-
全站适配暗色主题
8.4 SEO特性
-
自动生成Sitemap(包含文章、页面、分类)
-
每篇文章可设置独立的Meta标签
-
内置SEO分析评分工具
-
语义化HTML结构
-
Open Graph标签支持
第三部分:授权许可
SeaCMS 开源许可协议
MIT License
Copyright (c) 2026 SeaCMS
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
第三方开源组件许可
SeaCMS 使用了以下开源组件,各组件遵循其各自的许可协议:
|
组件 |
版本 |
许可协议 |
|---|---|---|
|
Flask |
3.1.0 |
BSD-3-Clause |
|
Flask-SQLAlchemy |
3.1.1 |
BSD-3-Clause |
|
SQLAlchemy |
2.0.36 |
MIT |
|
Flask-Login |
0.6.3 |
MIT |
|
Flask-Principal |
0.4.0 |
BSD-3-Clause |
|
Flask-WTF |
1.2.2 |
BSD-3-Clause |
|
WTForms |
3.2.1 |
BSD-3-Clause |
|
Flask-Migrate |
4.0.7 |
MIT |
|
Flask-Caching |
2.3.0 |
BSD-3-Clause |
|
Flask-RESTful |
0.3.10 |
BSD-3-Clause |
|
Flask-Mail |
0.10.0 |
BSD-3-Clause |
|
Flask-Limiter |
3.9.0 |
MIT |
|
bcrypt |
4.2.1 |
Apache-2.0 |
|
Pillow |
- |
HPND |
|
bleach |
6.2.0 |
Apache-2.0 |
|
pyotp |
2.9.0 |
MIT |
|
qrcode |
7.4.2 |
BSD-3-Clause |
|
APScheduler |
3.10.4 |
MIT |
|
Gunicorn |
23.0.0 |
MIT |
|
python-dotenv |
1.0.1 |
BSD-3-Clause |
|
email-validator |
2.2.0 |
Unlicense |
|
Tailwind CSS |
本地部署 |
MIT |
|
Font Awesome |
本地部署 |
Font Awesome Free License |
|
Chart.js |
本地部署 |
MIT |
|
Noto Sans SC |
本地部署 |
SIL OFL |
免责声明
-
本软件按"原样"提供,不作任何明示或暗示的保证,包括但不限于对适销性、特定用途适用性和非侵权性的保证。
-
在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其他行为,还是产生于、源于或有关于本软件以及本软件的使用或其他处置。
-
用户应对使用本软件所产生的任何结果自行承担全部责任和风险。
-
本软件不提供任何形式的技术支持保证,作者保留随时停止维护的权利。
贡献者协议
通过向 SeaCMS 项目提交代码、文档或其他贡献,您同意:
-
您的贡献将按照 MIT 许可协议进行授权
-
您拥有提交贡献的合法权利
-
您的贡献不侵犯任何第三方的知识产权
-
项目维护者有权决定是否合并您的贡献
文档结束 — SeaCMS v1.1.0