DeepBlog Docs
帮助中心
返回网站
文档
管理
文档中心 / 🔧 技术对接与二次开发文档
🔧 技术对接与二次开发文档
# 🔧 技术对接与二次开发文档 ## 系统架构 ### 整体架构 | 截图位置 | 截图说明 | 预期内容 | |----------|----------|----------| | 架构图 | 系统分层架构 | 表现层(View/Template) → 控制层(Controller) → 业务逻辑层(Model/Service/Component) → 数据层(DAO/ActiveRecord) → 数据库 | ### 目录结构 ``` deepblog/ ├── commands/ # 控制台命令 │ ├── LlmWorkerController.php # LLM异步任务处理 │ └── PublishController.php # 内容发布定时任务 ├── components/ # 自定义核心组件 │ ├── LLM/ # 大模型相关组件 │ │ ├── LLMFactory.php # 大模型客户端工厂 │ │ ├── LLMProviderInterface.php # 通用接口 │ │ ├── DeepSeekProvider.php # DeepSeek实现 │ │ ├── OpenaiProvider.php # OpenAI/GPT实现 │ │ ├── AliyunProvider.php # 通义千问实现 │ │ ├── KimiProvider.php # Kimi/月之暗面实现 │ │ ├── HuoshanProvider.php # 火山引擎实现 │ │ └── XfyunProvider.php # 讯飞星辰实现 │ ├── CaptchaHelper.php # 验证码助手 │ ├── MailHelper.php # 邮件发送助手 │ ├── SecurityHelper.php # 安全工具类 │ ├── SiteConfig.php # 站点配置管理 │ └── WechatService.php # 微信相关服务 ├── config/ # 配置文件目录 │ ├── web.php # Web端核心配置 │ ├── console.php # 控制台配置 │ ├── params.php # 公共参数配置 │ ├── db.php # 数据库配置 │ └── wechat.php # 微信相关配置 ├── controllers/ # 前台控制器 │ ├── AuthController.php # 用户认证相关 │ ├── SiteController.php # 首页/公共页面 │ ├── PostController.php # 文章相关 │ ├── CategoryController.php # 分类相关 │ └── DocsController.php # 文档中心相关 ├── models/ # 数据模型 │ ├── Post.php # 文章模型 │ ├── Category.php # 分类模型 │ ├── Tag.php # 标签模型 │ ├── User.php # 用户模型 │ ├── Comment.php # 评论模型 │ ├── OperationLog.php # 操作日志模型 │ ├── SiteConfig.php # 系统配置模型 │ ├── LlmTask.php # LLM任务模型 │ └── LoginForm.php # 登录表单模型 ├── modules/ # 模块目录 │ ├── admin/ # 后台管理模块 │ └── api/ # API接口模块 ├── templates/ # 前台模板目录 │ ├── default/ # 默认模板 │ ├── apple/ # 苹果风格模板 │ └── red/ # 红色风格模板 ├── views/ # 系统默认视图 ├── web/ # Web入口目录 │ ├── assets/ # 静态资源 │ ├── uploads/ # 上传文件目录 │ ├── docs/ # 文档中心 │ └── index.php # 入口文件 ├── runtime/ # 运行时缓存/日志目录 ├── vendor/ # Composer依赖 └── yii # Yii控制台入口 ``` ## 数据库设计 ### ER图 | 截图位置 | 截图说明 | 预期内容 | |----------|----------|----------| | 数据库ER图 | 表关系图 | 文章表关联分类表、标签关联表关联文章和标签、用户表关联文章和评论、评论表关联文章和用户 | ### 核心数据表结构 ```sql -- 用户表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL COMMENT '用户名', `email` varchar(255) DEFAULT NULL COMMENT '邮箱', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `password_hash` varchar(255) NOT NULL COMMENT '密码哈希', `auth_key` varchar(32) NOT NULL COMMENT '自动登录密钥', `password_reset_token` varchar(255) DEFAULT NULL COMMENT '密码重置token', `avatar` varchar(255) DEFAULT NULL COMMENT '头像路径', `is_admin` tinyint(1) DEFAULT '0' COMMENT '是否管理员:0否1是', `status` tinyint(1) DEFAULT '10' COMMENT '状态:0删除9禁用10正常', `created_at` datetime NOT NULL COMMENT '创建时间', `updated_at` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 文章表 CREATE TABLE `post` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL COMMENT '标题', `slug` varchar(200) DEFAULT NULL COMMENT 'URL别名', `content` longtext COMMENT '正文内容', `summary` text COMMENT '摘要', `category_id` int(11) DEFAULT NULL COMMENT '分类ID', `user_id` int(11) NOT NULL COMMENT '作者ID', `cover_image` varchar(255) DEFAULT NULL COMMENT '封面图', `status` tinyint(1) DEFAULT '0' COMMENT '状态:0草稿1发布2待审核', `views` int(11) DEFAULT '0' COMMENT '浏览次数', `is_top` tinyint(1) DEFAULT '0' COMMENT '是否置顶:0否1是', `seo_title` varchar(200) DEFAULT NULL COMMENT 'SEO标题', `seo_description` text COMMENT 'SEO描述', `seo_keywords` varchar(200) DEFAULT NULL COMMENT 'SEO关键词', `created_at` datetime NOT NULL COMMENT '创建时间', `updated_at` datetime NOT NULL COMMENT '更新时间', `published_at` datetime DEFAULT NULL COMMENT '发布时间', PRIMARY KEY (`id`), KEY `category_id` (`category_id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章表'; -- 分类表 CREATE TABLE `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL COMMENT '分类名称', `slug` varchar(100) DEFAULT NULL COMMENT '别名', `parent_id` int(11) DEFAULT '0' COMMENT '父分类ID', `description` text COMMENT '分类描述', `sort` int(11) DEFAULT '0' COMMENT '排序值', `is_display` tinyint(1) DEFAULT '1' COMMENT '是否显示:0否1是', `template` varchar(100) DEFAULT NULL COMMENT '自定义模板', `created_at` datetime NOT NULL COMMENT '创建时间', `updated_at` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分类表'; -- 标签表 CREATE TABLE `tag` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL COMMENT '标签名称', `slug` varchar(50) DEFAULT NULL COMMENT '别名', `color` varchar(20) DEFAULT NULL COMMENT '标签颜色', `count` int(11) DEFAULT '0' COMMENT '关联文章数', `created_at` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='标签表'; -- 文章标签关联表 CREATE TABLE `post_tag` ( `id` int(11) NOT NULL AUTO_INCREMENT, `post_id` int(11) NOT NULL COMMENT '文章ID', `tag_id` int(11) NOT NULL COMMENT '标签ID', PRIMARY KEY (`id`), KEY `post_id` (`post_id`), KEY `tag_id` (`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章标签关联表'; -- 评论表 CREATE TABLE `comment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `post_id` int(11) NOT NULL COMMENT '文章ID', `user_id` int(11) DEFAULT NULL COMMENT '用户ID', `parent_id` int(11) DEFAULT '0' COMMENT '父评论ID', `content` text NOT NULL COMMENT '评论内容', `nickname` varchar(100) DEFAULT NULL COMMENT '匿名用户昵称', `email` varchar(255) DEFAULT NULL COMMENT '匿名用户邮箱', `ip` varchar(45) DEFAULT NULL COMMENT '评论IP', `status` tinyint(1) DEFAULT '0' COMMENT '状态:0待审核1已通过2已拒绝', `like_count` int(11) DEFAULT '0' COMMENT '点赞数', `created_at` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`), KEY `post_id` (`post_id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评论表'; -- 操作日志表 CREATE TABLE `operation_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL COMMENT '操作用户ID', `username` varchar(255) DEFAULT NULL COMMENT '用户名', `operation_type` varchar(50) NOT NULL COMMENT '操作类型', `operation_desc` text DEFAULT NULL COMMENT '操作描述', `ip_address` varchar(45) DEFAULT NULL COMMENT 'IP地址', `user_agent` text DEFAULT NULL COMMENT '用户UA', `request_data` json DEFAULT NULL COMMENT '请求数据', `response_data` json DEFAULT NULL COMMENT '响应数据', `status` smallint(6) NOT NULL DEFAULT '1' COMMENT '状态:1成功0失败', `created_at` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `operation_type` (`operation_type`), KEY `created_at` (`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表'; ``` ## API接口文档 ### 公共响应格式 ```json { "code": 200, "message": "success", "data": {} } ``` | 字段 | 说明 | |------|------| | code | 响应码:200成功,400参数错误,401未登录,403无权限,404资源不存在,500服务器错误 | | message | 响应说明 | | data | 响应数据 | ### 获取文章列表 **接口地址**:`GET /api/v1/posts` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | page | int | 否 | 页码,默认1 | | pageSize | int | 否 | 每页数量,默认10,最大50 | | category_id | int | 否 | 分类ID筛选 | | keyword | string | 否 | 关键词搜索 | | tag | string | 否 | 标签名称筛选 | | order | string | 否 | 排序方式:latest最新(默认)、hot热门、views浏览量 | **返回示例**: ```json { "code": 200, "message": "success", "data": { "list": [ { "id": 1, "title": "文章标题", "slug": "article-slug", "summary": "文章摘要...", "cover_image": "/uploads/cover.jpg", "category_name": "技术分享", "author": "管理员", "views": 123, "published_at": "2026-04-21 10:00:00" } ], "total": 100, "page": 1, "pageSize": 10, "totalPage": 10 } } ``` ### 获取文章详情 **接口地址**:`GET /api/v1/posts/{id}` **路径参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | id | int | 是 | 文章ID | **返回示例**: ```json { "code": 200, "message": "success", "data": { "id": 1, "title": "文章标题", "content": "
文章正文...
", "category_name": "技术分享", "author": "管理员", "avatar": "/uploads/avatar.jpg", "tags": ["PHP", "Yii2"], "views": 123, "published_at": "2026-04-21 10:00:00", "related_posts": [] } } ``` ### 获取分类列表 **接口地址**:`GET /api/v1/categories` **返回示例**: ```json { "code": 200, "message": "success", "data": [ { "id": 1, "name": "技术分享", "slug": "tech", "description": "技术相关文章分类", "post_count": 50 } ] } ``` ## 二次开发指南 ### 创建新模块 本系统基于Yii2模块化设计,扩展新功能非常方便: 1. **创建模块目录结构** ``` modules/ └── forum/ ├── ForumModule.php ├── controllers/ │ └── DefaultController.php ├── models/ ├── views/ │ └── default/ │ └── index.php └── config/ └── main.php ``` 2. **创建模块主类** ```php // modules/forum/ForumModule.php namespace app\modules\forum; class ForumModule extends \yii\base\Module { public function init() { parent::init(); // 加载模块自定义配置 \Yii::configure(this, require __DIR__ . '/config/main.php'); } } ``` 3. **注册模块到配置** ```php // config/web.php return [ 'modules' => [ 'forum' => [ 'class' => 'app\modules\forum\ForumModule', ], ], ]; ``` 4. **添加路由规则** ```php // config/web.php 'rules' => [ 'forum' => 'forum/default/index', 'forum/
' => 'forum/default/
', ], ``` ### 扩展点说明 #### Events(事件) 系统内置多个事件点,方便扩展功能: ```php // 支持的文章事件 - \app\models\Post::EVENT_BEFORE_INSERT // 文章创建前 - \app\models\Post::EVENT_AFTER_INSERT // 文章创建后 - \app\models\Post::EVENT_BEFORE_UPDATE // 文章更新前 - \app\models\Post::EVENT_AFTER_UPDATE // 文章更新后 - \app\models\Post::EVENT_BEFORE_DELETE // 文章删除前 - \app\models\Post::EVENT_AFTER_DELETE // 文章删除后 // 使用示例:文章发布后自动推送搜索引擎 \Yii::$app->on(\app\models\Post::EVENT_AFTER_INSERT, function ($event) { $post = $event->sender; if ($post->status == 1) { // 已发布 // 执行推送逻辑 \Yii::info("文章{$post->id}已发布,自动推送到搜索引擎"); } }); ``` #### Behaviors(行为) 可通过行为扩展模型功能: ```php // 自定义示例:自动为文章生成摘要 class AutoSummaryBehavior extends \yii\base\Behavior { public $contentAttribute = 'content'; public $summaryAttribute = 'summary'; public $length = 200; public function events() { return [ \app\models\Post::EVENT_BEFORE_INSERT => 'generateSummary', \app\models\Post::EVENT_BEFORE_UPDATE => 'generateSummary', ]; } public function generateSummary($event) { $post = $this->owner; if (empty($post->{$this->summaryAttribute})) { $text = strip_tags($post->{$this->contentAttribute}); $post->{$this->summaryAttribute} = mb_substr($text, 0, $this->length) . '...'; } } } // 模型中使用: public function behaviors() { return array_merge(parent::behaviors(), [ 'autoSummary' => [ 'class' => AutoSummaryBehavior::class, 'length' => 300, ], ]); } ``` ### 大模型功能扩展 系统内置多厂商大模型支持,可快速扩展新厂商: 1. 新建Provider类实现`LLMProviderInterface`接口 2. 在`LLMFactory::make()`方法中添加对应case 3. 在后台系统设置中添加对应配置项即可使用 ## 部署与配置 ### 环境要求 | 环境 | 最低要求 | 推荐配置 | |------|----------|----------| | PHP | 8.2 | 8.2+ | | MySQL | 5.7 | 8.0+ | | Composer | 2.0 | 2.6+ | | Web服务器 | Nginx 1.18+ / Apache 2.4+ | Nginx 1.24+ | | 内存 | 512M | 1G+ | | 存储空间 | 10G | 50G+(根据上传文件需求) | ### 核心配置说明 ```php // config/db.php 数据库配置 return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=deepblog;charset=utf8mb4', 'username' => 'root', 'password' => 'your_password', 'charset' => 'utf8mb4', 'enableSchemaCache' => true, // 生产环境开启表结构缓存提升性能 'schemaCacheDuration' => 3600, ]; // config/web.php 核心配置 return [ 'name' => 'DeepBlog博客系统', 'language' => 'zh-CN', 'timeZone' => 'Asia/Shanghai', 'components' => [ 'cache' => [ 'class' => 'yii\caching\FileCache', // 生产环境建议换成Redis ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, 'loginUrl' => ['auth/login'], ], 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ 'post/
' => 'post/view', 'category/
' => 'category/view', 'tag/
' => 'tag/view', ], ], ], ]; ``` ### Nginx配置示例 ```nginx server { listen 80; server_name your-domain.com; root /wwwroot/deepblog/web; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 30d; add_header Cache-Control "public, immutable"; } # 保护敏感目录 location ~ /\. { deny all; } location ~ /(runtime|vendor|config|commands|models|modules)/ { deny all; return 403; } } ``` ### 部署步骤 1. 克隆代码到服务器目录 2. 执行`composer install`安装依赖 3. 复制`config/db.php.example`为`config/db.php`并配置数据库信息 4. 执行`php yii migrate`执行数据库迁移(或手动导入SQL文件) 5. 配置Nginx/Apache虚拟主机,root指向`web`目录 6. 设置`runtime`和`web/uploads`目录权限为777 7. 访问站点,后台默认账号:admin/admin123(登录后请立即修改密码)