当前位置: 首页
前端开发
零基础开发Geo优化软件:数据模型与API设计

零基础开发Geo优化软件:数据模型与API设计

热心网友 时间:2026-06-17
转载

GEO优化软件从零开发指南:数据模型与API设计详解

这套GEO软件的核心流程实际上并不复杂,完全可以拆解为四个关键步骤:首先是批量拓词,建立选题池;然后将企业介绍、服务说明、FAQ、案例等资料存入知识库;接着基于关键词和知识库生成文章;最后就是发布与分发。听起来像是一个AI写作工具,但真正落到系统开发时你会发现,重点反而不是AI本身,而是数据如何沉淀、如何复用。

从0开发一套geo优化软件:数据模型与API设计

因此,本篇专门聚焦数据模型与API。GEO系统的数据模型,核心思路是围绕「内容资产」来设计,而不是围绕「AI调用」来设计。真正需要长期保存和反复使用的,是关键词、知识库、文章、发布记录、账号、投放资源、配额和任务这些实体。按这个方向拆解模块,系统做出来会更像一个内容运营平台,而不是一个单点的写作小工具。

1. 应用作用域

frontend/src/api/backend.js 中有一个非常关键的设计:GEO相关的接口会自动挂载到 /apps/geo_app 路径下。被纳入这个作用域的资源包括以下这些:

  • /keyword-groups
  • /keywords
  • /articles
  • /knowledge-bases
  • /conversion-targets
  • /article-styles
  • /platforms
  • /distribute
  • /social-accounts
  • /site-publish
  • /auto-operations
  • /soft-articles
  • /ai-quotas
  • /ai-generation-tasks

这样设计的优势在于,后端可以用同一套路由和权限框架同时服务多个产品。只需要通过 X-App-Code 或URL前缀来区分业务域即可。这里我们使用 geo_app 作为应用标识,未来如果扩展其他垂直产品,也不需要推倒整套后端重新开发。

前端的请求拦截器可以这样编写,此后所有业务页面都无需重复处理token、客户端模式和应用标识等繁琐细节:

backendApi.interceptors.request.use(config => {
  const token = storage.get('token')
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }  config.headers['X-App-Code'] = APP_CODE
  config.headers['X-Client-Mode'] =
    (window.require || window.electron) ? 'electron' : 'browser_web'
  config.url = withAppPrefix(config.url)  return config
})

2. 关键词模型

应用作用域搭建完成后,接下来看第一类核心资产:关键词。关键词是整个GEO内容生产的入口,其重要性不言而喻。建议至少设计两个表来搞定它。

首先是 keyword_groups 这个分组表:

  • id
  • user_id
  • app_code
  • name
  • description
  • enabled
  • sort
  • created_at
  • updated_at

然后是 keywords 这个关键词明细表:

  • id
  • group_id
  • user_id
  • app_code
  • word
  • source
  • created_at
  • updated_at

在关键词页面上,这些操作已经集成为日常运营的工具箱:分组创建、关键词列表展示、AI拓词、批量添加、批量删除、移动分组等。API层对应的就是 getKeywordGroupscreateKeywordGroupgetKeywordsgenerateKeywordsbatchCreateKeywordsmoveKeywords 这些方法。

后端建表时,先保持这种粒度即可,不需要一开始就把关键词表设计成复杂的SEO大表:

CREATE TABLE keyword_groups (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT NOT NULL,
  app_code VARCHAR(64) NOT NULL,
  name VARCHAR(120) NOT NULL,
  description TEXT NULL,
  enabled TINYINT DEFAULT 1,
  sort INT DEFAULT 0,
  created_at TIMESTAMP NULL,
  updated_at TIMESTAMP NULL
);CREATE TABLE keywords (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT NOT NULL,
  group_id BIGINT NOT NULL,
  app_code VARCHAR(64) NOT NULL,
  word VARCHAR(180) NOT NULL,
  source VARCHAR(40) DEFAULT 'manual',
  created_at TIMESTAMP NULL,
  updated_at TIMESTAMP NULL,
  INDEX idx_group_id (group_id),
  INDEX idx_user_app (user_id, app_code)
);

3. 知识库模型

光有关键词还不够。关键词告诉系统要写什么方向,而知识库要解决的是另一个问题:内容真实可信。知识库的作用,就是保证生成的文章不是空泛的套话,而是能围绕真实的产品、服务和案例展开。建议如下设计:

knowledge_bases 知识库主表:

  • id
  • user_id
  • app_code
  • name
  • description
  • enabled
  • created_at
  • updated_at

knowledge_files 知识文件表:

  • id
  • knowledge_base_id
  • name
  • file_type
  • file_path
  • file_size
  • content
  • metadata
  • created_at
  • updated_at

项目里关于知识库的API已经比较完备了,包括上传文件、添加文本、获取文件内容、更新内容、移动文件、删除文件等能力。开发时要注意一个细节:文本和图片的处理方式完全不同。文本可以直接组装进提示词,但图片更适合作为素材引用,让模型在文章里输出一个占位符即可。

4. 转化目标和文章风格

转化目标回答的是「文章最终要为谁服务」这个问题。而文章风格回答的是「内容具体该怎么写」这个问题。这两个概念千万不要混在一个prompt字段里,它们应当各司其职。

conversion_targets 转化目标表:

  • name
  • company_name
  • official_website
  • industry
  • description

article_styles 文章风格表:

  • name
  • type
  • prompt
  • enabled

article-creation.vue 中,已经把正文风格和标题风格分开使用,还支持标题改写。这个设计很有必要,因为标题负责吸引点击和匹配搜索,正文负责承载可信度和信息密度,两者目标不同,不能混为一谈。

5. 文章模型

关键词、知识库、风格、转化目标,最终都会汇聚到文章这个载体上。文章是整个系统的中心资产,建议字段设计如下:

  • id
  • user_id
  • app_code
  • title
  • content
  • status
  • source
  • word_count
  • keyword_ids
  • knowledge_base_ids
  • style_id
  • title_style_id
  • conversion_target_id
  • error_message
  • created_at
  • updated_at

文章的状态,建议至少包含这几个:

  • created
  • manual
  • ai
  • generating
  • failed

目前文章列表已经支持状态筛选、失败重试、发布、投放、导出Word、查看发布记录等功能。后端在设计时,要把文章生成过程做成任务化的,避免前端页面长时间等待大模型响应,那样用户体验会很差。

6. AI 配额和任务

数据资产之外,还需要单独考虑AI任务和额度管理。项目里的 keywords.vuearticle-creation.vue 都会展示AI额度信息。关键词拓词调用后会轮询 getAiGenerationTask,这说明生成任务必须是异步的。

建议这样设计:

ai_generation_tasks 任务表:

  • id
  • user_id
  • app_code
  • task_type
  • usage_type
  • status
  • request_payload
  • result_payload
  • error_message
  • started_at
  • finished_at

ai_quota_usages 配额使用记录表:

  • id
  • user_id
  • task_id
  • usage_type
  • amount
  • period_key
  • status

这里状态要区分 reservedusedreleased。当任务失败或取消时,要释放额度;任务完成时,再确认扣减。这个设计能有效避免高并发下额度被重复消耗的问题。

任务和额度建议采用"预占 -> 确认 -> 释放"的状态机来管理,伪代码逻辑如下:

DB::transaction(function () use ($user, $payload) {
    $quota = AiQuota::lockForUpdate()
        ->where('user_id', $user->id)
        ->where('usage_type', 'article_generation')
        ->firstOrFail();    if ($quota->remaining <= 0) {
        throw new RuntimeException('AI额度不足');
    }    $task = AiGenerationTask::create([
        'user_id' => $user->id,
        'app_code' => 'geo_app',
        'task_type' => 'article',
        'usage_type' => 'article_generation',
        'status' => 'pending',
        'request_payload' => $payload,
    ]);    AiQuotaUsage::create([
        'user_id' => $user->id,
        'task_id' => $task->id,
        'usage_type' => 'article_generation',
        'amount' => 1,
        'status' => 'reserved',
    ]);
});

7. 发布和投放模型

发布方面要分两类来看:账号发布和站点发布。

账号发布依赖的是 /social-accounts/distribute/records 这两组接口。站点发布则依赖 /site-publish/site-publish/publish。自动运营服务会在文章生成后,自动创建分发记录,再调用RPA或站点发布接口完成最终的推送。

8. API 响应规范

最后,是API响应格式的问题。项目里的axios拦截器,默认假设Laravel的统一响应格式是这样的:

{
  "code": 0,
  "message": "success",
  "data": {}
}

如果code返回非0,前端会直接当成错误处理。如果返回401,前端就会清理token并跳转到登录页。后端在实现时,必须保持这个格式稳定不变,否则前端页面出问题的时候,排查起来会非常棘手。数据和接口的基础打好之后,下一步才适合深入AI生成链路——否则,生成出来的内容连系统都承接不住,那就更谈不上优化了。

来源:https://juejin.cn/post/7646739818932125742

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
深入理解调用栈与异步任务的状态同步机制

深入理解调用栈与异步任务的状态同步机制

调用栈仅记录同步执行流,异步回调由事件循环调度、任务队列存放,闭包维持作用域。执行时新建上下文入栈,不复用旧栈帧。调用栈不主动同步异步状态,事件循环是真正的协调者。

时间:2026-07-08 06:57
HTML自定义元素实现跨组件通信的完整指南

HTML自定义元素实现跨组件通信的完整指南

自定义元素跨组件通信需依赖CustomEvent,且bubbles和composed必须同时设为true才能穿透ShadowDOM。事件监听应挂载在document或父容器等合适节点,避免使用DOM查找或data ARIA属性替代事件通信,从而确保事件正确穿越边界,保持跨组件通信的可靠性。

时间:2026-07-08 06:56
JavaScript static关键字在工具库构建中的应用

JavaScript static关键字在工具库构建中的应用

在JavaScript工具库构建中,static关键字将函数或常量挂载到类名上,无需实例化即可调用,适用于无状态操作如日期格式化、字符串截断、深克隆,并统一管理配置常量与实现工厂方法,但需避免依赖实例状态。

时间:2026-07-08 06:56
如何避免静态初始化块异常导致应用冷启动中断

如何避免静态初始化块异常导致应用冷启动中断

防范静态初始化失败导致应用中断,需用try-catch兜住异常并提供安全默认值;将高风险逻辑移出static块,改用延迟加载或Holder模式;显式控制初始化顺序并增强可观测性;诊断时直击ExceptionInInitializerError的根因。

时间:2026-07-08 06:56
虚拟DOM标签级diff比对优化过程详解

虚拟DOM标签级diff比对优化过程详解

虚拟DOMdiff以节点为单位,按层级同标签优先判断复用,通过key精准识别节点身份,配合细粒度属性更新及短路优化,避免全量递归比较,只更新变化的节点,跳过冗余计算,将时间复杂度从O(n³)降至接近O(n),从而大幅提升渲染性能。

时间:2026-07-08 06:56
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜