如何用AI工具开发一个轻量化CRM系统(一):7天开发总体规划与TaoToken统一Key接入

📅 发布时间:2026/10/18 20:25:27
如何用AI工具开发一个轻量化CRM系统(一):7天开发总体规划与TaoToken统一Key接入
1. 轻量化 CRM 到底要解决什么问题7 天规划怎么拆轻量化 CRM 系统说白了就是给 50 人以内的小团队用的客户关系管理工具它不需要工作流引擎、不需要多租户隔离、不需要复杂的审批链核心就三件事客户信息能存能查、销售机会能跟能统计、权限能控能管。适合谁适合销售团队自己维护客户台账、适合技术负责人用 AI 工具快速搭一套内部系统、也适合想练手全栈开发的同学拿来做真实项目。我试过用传统方式从零写一套 CRM光权限模块就折腾了三四天后来换成 AI 工具辅助生成代码配合统一的模型调用入口整体节奏才压到 7 天。这篇是系列第一篇重点讲两件事一是 7 天每天做什么、交付什么、怎么验证二是怎么把 AI 工具的 endpoint 统一改到一个 Key 上避免今天配这个明天配那个。先看整体节奏。第 1 天做系统边界和技术选型产出架构图和权限矩阵第 2 天做数据库设计和权限服务骨架第 3 天把权限模块的登录、角色、鉴权装饰器写完第 4 到 5 天做 CRM 业务模块客户、销售机会并对接权限第 6 天做测试联调重点是越权场景第 7 天打包部署。每天结束都要有一个可运行验证点不能等到第 7 天才发现跑不起来。技术栈选型上后端用 Python Flask原因是轻、生态好、AI 工具对 Python 的代码生成质量明显高于其他语言前端用 Vue 3 Element Plus组件库现成AI 生成表格和表单页很快数据库用 SQLite单文件、零部署小团队完全够用后期要换 PostgreSQL 也只需要改连接串。权限模块单独拆成 auth-service走 RESTful API用 RBAC 模型用户-角色-权限三级关联这样业务模块和权限模块解耦后面加模块不用动权限代码。权限矩阵是第 1 天必须定死的东西不然后面每天都在改。我建议直接列成表权限码adminsalesviewercrm:customer:view全部仅自己负责全部只读crm:customer:create允许允许拒绝crm:customer:edit全部仅自己负责拒绝crm:customer:delete允许拒绝拒绝crm:opportunity:view全部仅自己负责全部只读crm:opportunity:edit全部仅自己负责拒绝这张表后面会直接变成代码里的权限码常量和装饰器参数所以第 1 天多花半小时把它写清楚第 3 天写鉴权逻辑时能省两小时。7 天规划的本质不是每天写多少代码而是每天消除一个不确定性第 1 天消除需求不确定性第 2 天消除数据结构不确定性第 3 天消除鉴权逻辑不确定性以此类推。2. 把 AI 工具 endpoint 统一到 TaoToken 的前置准备做这个项目会用到多种 AI 工具Cursor 做对话式代码生成、Copilot 做行内补全、Postman 的 AI 功能生成测试用例、还有命令行里的 Claude Code 做批量重构。问题来了——每个工具都要单独配 Key、单独配 Base URL有的还要求特定格式切换一次环境就要重新配一遍非常烦。TaoToken 在这里的作用就是提供一个统一的模型调用入口你只需要一个 Key、一个 Base URL就能让上面这些工具都指向同一个地址。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 地址后面不加任何参数。前置准备分三步。第一步注册并拿到 Key。进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面创建一个新 Key复制出来存好后面所有工具都用这一个。第二步确认你要用的模型 ID比如做代码生成常用的 claude-sonnet 系列、gpt 系列具体可用列表在文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里能查到。第三步想清楚哪些工具要接Cursor、Cline、Claude Code、Codex 这几类是最常见的它们的配置方式略有不同但核心三件套是一样的——Base URL、API Key、Model ID。这里要提醒一个坑不同工具对 Base URL 的写法要求不一样。有的要求写到/v1结尾有的要求不带/v1TaoToken 的 API 根地址是https://taotoken.net/api具体某个工具要不要补/v1以该工具的配置说明为准。我踩过的坑是直接把根地址粘进某个工具结果报 404后来发现它自动拼了/v1/chat/completions所以根地址就够了。还有一个前置动作是环境变量管理。不要把 Key 硬编码到代码或配置文件里用环境变量export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api这样后面无论是 Python 脚本调用、还是命令行工具读取都从环境变量取换机器只改环境变量不动代码。如果你打算长期用 AI 做编码和 Agent 任务可以看下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用场景比按次计费划算。前置准备做完你应该手里有一个 Key、一个 Base URL、一个确定的 Model ID以及一套环境变量。这三样东西是后面所有配置的基础缺一个都会在验证阶段卡住。3. 可复制的项目目录、数据表与工具配置片段这一节给可直接复制的东西。先看项目目录结构前后端分离权限服务独立light-crm/ ├── auth-service/ # 权限服务独立 │ ├── app.py │ ├── models.py │ ├── decorators.py │ ├── routes/ │ │ └── auth.py │ └── requirements.txt ├── crm-service/ # CRM 业务服务 │ ├── app.py │ ├── models.py │ ├── routes/ │ │ ├── customers.py │ │ └── opportunities.py │ └── requirements.txt ├── frontend/ # Vue 3 前端 │ ├── src/ │ │ ├── views/ │ │ │ ├── CustomerList.vue │ │ │ └── OpportunityList.vue │ │ └── api/ │ └── package.json ├── schema.sql # 建表脚本 └── docker-compose.yml数据库建表脚本schema.sqlSQLite 语法包含权限三张关联表和业务两张表CREATE TABLE user ( id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE role ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(50) NOT NULL UNIQUE, description TEXT ); CREATE TABLE permission ( id INTEGER PRIMARY KEY AUTOINCREMENT, code VARCHAR(80) NOT NULL UNIQUE, description TEXT ); CREATE TABLE user_role ( user_id INTEGER NOT NULL, role_id INTEGER NOT NULL, PRIMARY KEY (user_id, role_id), FOREIGN KEY (user_id) REFERENCES user(id), FOREIGN KEY (role_id) REFERENCES role(id) ); CREATE TABLE role_permission ( role_id INTEGER NOT NULL, permission_id INTEGER NOT NULL, PRIMARY KEY (role_id, permission_id), FOREIGN KEY (role_id) REFERENCES role(id), FOREIGN KEY (permission_id) REFERENCES permission(id) ); CREATE TABLE customer ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL, phone VARCHAR(30), owner_id INTEGER NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (owner_id) REFERENCES user(id) ); CREATE TABLE sales_opportunity ( id INTEGER PRIMARY KEY AUTOINCREMENT, customer_id INTEGER NOT NULL, stage VARCHAR(20) NOT NULL DEFAULT potential, amount DECIMAL(12,2) DEFAULT 0, owner_id INTEGER NOT NULL, FOREIGN KEY (customer_id) REFERENCES customer(id), FOREIGN KEY (owner_id) REFERENCES user(id) ); CREATE INDEX idx_customer_owner ON customer(owner_id); CREATE INDEX idx_opportunity_stage ON sales_opportunity(stage);接下来是 AI 工具的配置片段。Cursor 和 Cline 这类支持自定义 OpenAI 兼容接口的工具配置写在 settings 里核心三件套{ openai.apiKey: sk-你的key, openai.baseUrl: https://taotoken.net/api, openai.model: claude-sonnet-4-20250514 }如果你用 Claude Code它的配置走环境变量或 settings 文件Base URL 指向 TaoToken 的 Anthropic 兼容入口export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的key export ANTHROPIC_MODELclaude-sonnet-4-20250514Codex 的auth.json配置路径通常在~/.codex/auth.json{ OPENAI_API_KEY: sk-你的key, OPENAI_BASE_URL: https://taotoken.net/api }注意上面三个片段里的 Base URL 都是https://taotoken.net/apiKey 都是同一个Model ID 按你实际要用的填。三件套齐了工具才能正常调用缺 Model ID 会报模型不存在缺 Key 会报 401Base URL 写错会报连接失败。把这三段配置分别贴到对应工具里第 4 天开始写业务代码时就能直接用 AI 生成不用再折腾配置。4. 验证请求确认权限服务和 AI 调用都能跑通配置写完必须验证不能等到写业务代码时才发现调不通。验证分两条线一条是权限服务本身能不能跑一条是 AI 工具能不能通过 TaoToken 正常生成代码。先验证权限服务。启动 auth-servicecd auth-service pip install -r requirements.txt python app.py服务默认跑在 5000 端口。用 curl 测登录接口curl -X POST http://localhost:5000/auth/login \ -H Content-Type: application/json \ -d {username:admin,password:admin123}预期返回一个 JSON里面带access_token字段。拿到 token 后测鉴权接口curl http://localhost:5000/auth/roles \ -H Authorization: Bearer 你的token如果返回角色列表说明 JWT 鉴权和数据库查询都通了。如果返回 401检查 token 有没有过期、请求头格式对不对如果返回 403检查这个用户有没有绑定 admin 角色。再验证 AI 工具调用。以命令行方式直接打 TaoToken 的接口确认 Key 和 Base URL 有效curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: claude-sonnet-4-20250514, messages: [{role:user,content:用一句话说明什么是RBAC}] }预期返回choices数组里面有模型回复内容。这一步通了说明你的 Key、Base URL、Model ID 三件套是对的后面 Cursor、Claude Code 里配同样的三件套就不会出问题。验证清单建议按天打勾阶段验证点通过标准第 1 天权限矩阵定稿三角色权限码无歧义第 2 天schema.sql 执行7 张表全部创建成功第 3 天登录鉴权接口401/403/200 三种返回正确第 4 天客户 CRUDsales 只能改自己的客户第 5 天销售机会 CRUD阶段筛选和金额统计正确第 6 天越权测试viewer 改客户返回 403第 7 天部署访问公网域名能打开登录页第 3 天验证时重点测三种返回不带 token 请求受保护接口应该返回 401带 viewer 的 token 请求创建客户接口应该返回 403带 admin 的 token 请求应该返回 200。这三种情况都对了权限装饰器逻辑才算真正跑通。很多人只测了 200 就以为好了结果上线后发现越权漏洞就是因为没测 401 和 403。AI 调用验证时如果返回里没有choices字段通常是模型 ID 写错了或者该模型没开通如果报连接超时检查 Base URL 是不是写成了带多余路径的地址。验证通过后把成功的 curl 命令存成一个verify.sh脚本后面每次改配置都跑一遍省得反复手敲。5. 本篇常见报错排查401、local proxy failed、reading choices、OAuth这一节把配置阶段最容易撞上的四类报错拆开讲每个都给现象、原因、修法。第一类401 Unauthorized。现象是请求返回{error:invalid api key}或类似信息。原因通常是 Key 没填、Key 填错、或者环境变量没生效。排查顺序先echo $TAOTOKEN_API_KEY看环境变量有没有值再看工具配置里是不是把 Key 写成了占位符没替换最后确认 Key 有没有被复制时多带了空格或换行。修法就是重新从控制台复制一次 Key粘贴时注意首尾不要有空白字符。第二类local proxy failed。现象是工具报local proxy failed或connection refused。这个报错通常出现在工具配置了本地代理端口、但代理服务没启动的情况下。排查检查工具的网络设置里有没有填http://127.0.0.1:某端口这类本地地址如果有要么把本地代理服务启动起来要么直接把 Base URL 改成https://taotoken.net/api走直连。注意这里说的是工具自身的网络配置项不是让你去搭什么额外服务最省事的做法就是直连 TaoToken 的 API 地址。第三类reading choices 报错。现象是返回 JSON 里没有choices字段工具解析时报cannot read property choices of undefined或error reading choices。原因一般是模型 ID 写错、或者请求体格式不对。排查先用第 4 节的 curl 命令单独测一次确认接口本身能返回choices如果 curl 能返回但工具报错说明是工具侧的请求体格式问题检查工具是不是要求特定的 API 格式比如有的工具只认 OpenAI 格式有的只认 Anthropic 格式。修法是确认工具的接口类型和 TaoToken 提供的兼容入口匹配。第四类OAuth 相关报错。现象是工具提示OAuth token expired或authentication failed。这类报错多出现在 Claude Code 这类默认走 OAuth 登录的工具上。原因是工具默认用账号登录态而不是 API Key。修法是在工具配置里显式指定用 API Key 模式把ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL都设好让它走 Key 鉴权而不是 OAuth。设置完重启工具再跑一次验证命令。把四类报错对照成表报错关键词常见原因修法401 UnauthorizedKey 缺失/错误/带空格重新复制 Key检查环境变量local proxy failed工具配了本地代理但没启动改直连 Base URLreading choices模型 ID 错或请求格式不匹配curl 单测确认接口格式OAuth failed工具走登录态而非 Key显式配置 API Key 模式排查时有个通用思路先用 curl 绕过工具直接打接口如果 curl 通、工具不通问题在工具配置如果 curl 也不通问题在 Key 或 Base URL。这个二分法能帮你快速定位不用在工具和接口之间来回猜。6. 后续节奏与统一 Key 的长期价值第 1 天到第 3 天的重点是把权限模块立起来第 4 天开始写业务代码时你会发现 AI 工具生成代码的效率直接取决于配置顺不顺。统一 Key 接入之后Cursor 生成客户列表组件、Claude Code 批量重构鉴权装饰器、Postman 生成测试用例全都走同一个入口不用每换一个工具就重新配一遍。如果你只是偶尔用 AI 补全代码按量调用就够了但如果你打算连续 7 天高强度用 AI 辅助开发每天几十上百次调用那 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 会更合适。模型对话入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 想先试试模型效果可以从这里进。Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。下一篇会进入第 2 天的实操用 AI 生成完整 ER 图、把 schema.sql 跑起来、搭出 auth-service 的 Flask 骨架并演示怎么让 AI 工具基于你的表结构生成带权限校验的接口代码。第 1 天把规划、目录、配置、验证四件事做完第 2 天就能直接进入编码不会卡在环境上。