技术茶馆公告

🍵 欢迎来到技术茶馆 🍵

这里是一个分享技术、交流学习的地方

技术札记 | 茶馆周刊 | 工具书签 | 作品展示

让我们一起品茗技术,共同成长

Skip to content

矩阵魔方开发记录:从零到一打造小红书发布助手

写在前面

大家好,我是技术茶馆的博主。今天想和大家分享一个我最近一直在开发的项目——矩阵魔方(xhs-publisher),一个专为小红书内容创作者打造的全栈 Web 应用。

这个项目从最初的一个简单想法,到现在已经发展成为一个集内容创作、AI 辅助、数据洞察、账号管理于一体的完整解决方案。在这篇文章中,我想和大家分享整个开发历程中的技术选型、架构设计、遇到的挑战以及解决方案。

项目的诞生:解决真实痛点

为什么要做这个项目?

作为一名内容创作者,我深知在小红书上发布内容的痛点:

  • 📱 移动端编辑体验不佳:小红书只有移动端 App,在电脑上编辑长文本非常不方便
  • 🔄 批量管理困难:运营多个账号时,需要在不同手机间切换,效率极低
  • 💡 缺乏创作灵感:不知道写什么内容,不了解当前热点话题
  • 📊 数据分析缺失:无法系统地分析内容表现,优化创作策略

基于这些痛点,我决定开发一个网页端的小红书发布助手,让内容创作变得更高效、更智能。

核心价值主张

  • 🚀 提升效率:网页端编辑,支持批量操作和模板化创作
  • 🤖 AI 赋能:集成多个 AI 模型辅助内容创作
  • 📊 数据驱动:提供热点素材和内容洞察分析
  • 💰 商业化:内置充值和兑换码系统,支持 SaaS 模式运营

技术架构:现代化全栈方案

技术栈选型

经过深思熟虑,我选择了以下技术栈:

前端技术

Vue 3 + Vite
├── Element Plus        # UI 组件库
├── TailwindCSS        # 原子化 CSS
├── Vue Router 4       # 路由管理
├── Axios              # HTTP 客户端
├── @icon-park/vue-next # 图标库
└── qrcode.vue         # 二维码生成

选择理由

  • Vue 3:组合式 API 让代码更简洁,响应式系统性能更优
  • Vite:极速的开发体验,HMR 几乎是瞬间的
  • Element Plus:成熟的企业级组件库,开箱即用
  • TailwindCSS:快速构建 UI,避免 CSS 命名困扰

后端技术

NestJS 10
├── Prisma             # 现代化 ORM
├── Passport + JWT     # 认证授权
├── BullMQ + Redis     # 任务队列
├── Swagger            # API 文档
├── 阿里云 OSS         # 文件存储
└── 火山引擎 OpenAPI   # AI 集成

选择理由

  • NestJS:TypeScript 原生支持,依赖注入让代码更易测试
  • Prisma:类型安全的数据库访问,自动生成迁移脚本
  • BullMQ:强大的任务队列,支持任务优先级、重试、延迟执行
  • JWT:无状态认证,天然支持分布式部署

项目结构

xhs-publisher/
├── client/                 # Vue 3 前端
│   ├── src/
│   │   ├── views/         # 14 个页面组件
│   │   ├── components/    # 5 个通用组件
│   │   ├── admin/         # 管理后台(7 个文件)
│   │   ├── router/        # 路由配置
│   │   ├── utils/         # 工具函数
│   │   └── composables/   # 组合式函数
│   └── package.json

└── server/                # NestJS 后端
    ├── src/
    │   ├── modules/       # 12 个功能模块
    │   │   ├── ai-core/      # AI 核心模块
    │   │   ├── auth/         # 认证授权
    │   │   ├── user/         # 用户管理
    │   │   ├── finance/      # 财务系统
    │   │   ├── admin/        # 管理后台
    │   │   ├── publish/      # 发布模块
    │   │   ├── creation/     # 内容创作
    │   │   ├── insights/     # 数据洞察
    │   │   ├── hot-materials/# 热点素材
    │   │   ├── xhs/          # 小红书 API
    │   │   ├── oss/          # 对象存储
    │   │   └── crawler/      # 爬虫模块
    │   ├── common/        # 公共模块
    │   ├── config/        # 配置管理
    │   └── main.ts        # 应用入口
    ├── prisma/            # 数据库 Schema
    └── package.json

这种前后端分离 + 模块化的架构设计,让项目具有良好的可维护性和可扩展性。


核心功能实现

1. 内容发布:打通网页到 App 的最后一公里

这是整个项目最核心的功能,也是技术难度最高的部分。

技术挑战

小红书官方并没有提供开放的发布 API,我们只能通过以下方式实现:

  1. 小红书 JSSDK:官方提供的 JavaScript SDK,可以在网页中唤起 App
  2. URL Scheme:自定义协议,用于跨应用跳转

实现方案

前端页面

  • Publisher.vue - 桌面端发布器
  • MobilePublish.vue - 移动端适配页面
  • ContentEditor.vue - 富文本编辑器
  • PublishButton.vue - 一键发布按钮
  • SchemeSelector.vue - Scheme 选择器

后端模块

  • publish/ - 处理发布流程
  • xhs/ - 小红书 API 集成

完整流程

关键代码片段

javascript
// 初始化小红书 JSSDK
const initXhsSDK = async () => {
  const { signature, timestamp, nonceStr } = await getSignature();

  window.xhs.config({
    signature,
    timestamp,
    nonceStr,
    jsApiList: ["shareToNote"],
  });

  window.xhs.ready(() => {
    console.log("小红书 SDK 初始化成功");
  });
};

// 发布内容
const publishToXhs = () => {
  window.xhs.shareToNote({
    title: noteTitle.value,
    content: noteContent.value,
    images: uploadedImages.value,
    success: () => {
      ElMessage.success("发布成功!");
    },
    fail: (err) => {
      // 降级方案:使用 URL Scheme
      const scheme = `xhsdiscover://note/publish?title=${encodeURIComponent(
        noteTitle.value
      )}`;
      window.location.href = scheme;
    },
  });
};

技术亮点

  • 双重保障:JSSDK + URL Scheme,确保发布成功率
  • 移动端适配:响应式设计,支持手机浏览器访问
  • 错误处理:详细的错误提示和用户引导

2. AI 辅助创作:让内容创作更智能

这是项目的一大亮点,也是我投入精力最多的部分。

功能矩阵

功能页面说明
AI 文案生成Copywriting.vue根据关键词生成完整文案
一键生成OneClickGenerate.vue一键生成标题+正文+标签
人设风格PersonaStyle.vue定制专属创作风格
选题策划TopicPlanning.vueAI 辅助选题和内容规划

技术实现

后端 AI 核心模块

typescript
// ai-core/ai.service.ts
@Injectable()
export class AiService {
  constructor(
    @InjectQueue("ai-tasks") private aiQueue: Queue,
    private readonly configService: ConfigService
  ) {}

  async generateContent(
    prompt: string,
    model: "deepseek" | "qwen"
  ): Promise<string> {
    // 添加到任务队列,避免阻塞主线程
    const job = await this.aiQueue.add("generate", {
      prompt,
      model,
      timestamp: Date.now(),
    });

    return job.finished();
  }

  // DeepSeek 集成
  private async callDeepSeek(prompt: string): Promise<string> {
    const client = new OpenAI({
      apiKey: this.configService.get("DEEPSEEK_API_KEY"),
      baseURL: "https://api.deepseek.com/v1",
    });

    const response = await client.chat.completions.create({
      model: "deepseek-chat",
      messages: [{ role: "user", content: prompt }],
      stream: false,
    });

    return response.choices[0].message.content;
  }

  // 通义千问集成
  private async callQwen(prompt: string): Promise<string> {
    // 使用火山引擎 OpenAPI
    const client = new VolcengineOpenAPI({
      accessKeyId: this.configService.get("VOLCENGINE_ACCESS_KEY"),
      secretAccessKey: this.configService.get("VOLCENGINE_SECRET_KEY"),
    });

    // 调用通义千问 API
    // ...
  }
}

前端调用示例

vue
<script setup>
import { ref } from "vue";
import { generateContent } from "@/api/ai";

const keyword = ref("");
const generatedContent = ref("");
const loading = ref(false);

const handleGenerate = async () => {
  loading.value = true;
  try {
    const result = await generateContent({
      keyword: keyword.value,
      model: "deepseek",
      type: "copywriting",
    });
    generatedContent.value = result.content;
  } catch (error) {
    ElMessage.error("生成失败,请重试");
  } finally {
    loading.value = false;
  }
};
</script>

<template>
  <div class="ai-generator">
    <el-input
      v-model="keyword"
      placeholder="输入关键词,AI 为你生成文案"
      @keyup.enter="handleGenerate"
    />
    <el-button type="primary" :loading="loading" @click="handleGenerate">
      生成文案
    </el-button>
    <div v-if="generatedContent" class="result">
      {{ generatedContent }}
    </div>
  </div>
</template>

设计亮点

  • 多模型支持:DeepSeek、通义千问可切换,降低单一依赖
  • 任务队列:使用 BullMQ 异步处理,避免阻塞
  • 流式响应:支持 SSE(Server-Sent Events),实时显示生成进度
  • 成本优化:根据场景选择最优模型,控制 API 调用成本

3. 数据洞察:用数据驱动内容创作

热点素材抓取

技术方案

typescript
// hot-materials/crawler.service.ts
@Injectable()
export class CrawlerService {
  @Cron("0 */2 * * *") // 每 2 小时执行一次
  async crawlHotTopics() {
    // 抓取小红书热榜
    const topics = await this.fetchXhsHotTopics();

    // 存储到数据库
    await this.prisma.hotTopic.createMany({
      data: topics.map((topic) => ({
        title: topic.title,
        heat: topic.heat,
        category: topic.category,
        crawledAt: new Date(),
      })),
    });
  }

  private async fetchXhsHotTopics() {
    // 使用 Puppeteer 或 API 抓取
    // ...
  }
}

前端展示

vue
<!-- HotMaterials.vue -->
<template>
  <div class="hot-materials">
    <el-card v-for="topic in hotTopics" :key="topic.id">
      <div class="topic-header">
        <span class="topic-title">{{ topic.title }}</span>
        <el-tag type="danger">🔥 {{ formatHeat(topic.heat) }}</el-tag>
      </div>
      <div class="topic-meta">
        <span>{{ topic.category }}</span>
        <span>{{ formatTime(topic.crawledAt) }}</span>
      </div>
      <el-button size="small" @click="useThisTopic(topic)">
        使用此话题
      </el-button>
    </el-card>
  </div>
</template>

内容数据洞察

提供以下数据分析:

  • 📈 发布趋势分析
  • 🎯 热门话题追踪
  • 📊 内容表现对比
  • 💡 优化建议

4. 账号矩阵管理:批量运营的利器

功能特性

  • 支持管理多个小红书账号
  • 批量发布和内容分发
  • 账号数据统一查看
  • 定时发布任务

数据库设计

prisma
// prisma/schema.prisma
model Account {
  id          String   @id @default(cuid())
  userId      String
  platform    String   // 'xiaohongshu'
  nickname    String
  avatar      String?
  accessToken String?
  refreshToken String?
  expiresAt   DateTime?
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  user        User     @relation(fields: [userId], references: [id])
  posts       Post[]

  @@index([userId])
}

model Post {
  id          String   @id @default(cuid())
  accountId   String
  title       String
  content     String   @db.Text
  images      Json
  status      String   // 'draft' | 'published' | 'scheduled'
  publishedAt DateTime?
  createdAt   DateTime @default(now())

  account     Account  @relation(fields: [accountId], references: [id])

  @@index([accountId])
}

5. 用户系统与商业化

认证授权

使用 Passport + JWT 实现:

typescript
// auth/jwt.strategy.ts
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(
    private configService: ConfigService,
    private userService: UserService
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: configService.get("JWT_SECRET"),
    });
  }

  async validate(payload: any) {
    const user = await this.userService.findById(payload.sub);
    if (!user) {
      throw new UnauthorizedException();
    }
    return user;
  }
}

财务系统

充值流程

兑换码系统

typescript
// finance/redemption.service.ts
@Injectable()
export class RedemptionService {
  async createCode(amount: number, count: number): Promise<string[]> {
    const codes = [];
    for (let i = 0; i < count; i++) {
      const code = this.generateCode();
      await this.prisma.redemptionCode.create({
        data: {
          code,
          amount,
          status: "unused",
        },
      });
      codes.push(code);
    }
    return codes;
  }

  async redeemCode(userId: string, code: string): Promise<boolean> {
    const redemption = await this.prisma.redemptionCode.findUnique({
      where: { code },
    });

    if (!redemption || redemption.status !== "unused") {
      throw new BadRequestException("兑换码无效或已使用");
    }

    // 更新用户余额
    await this.userService.addBalance(userId, redemption.amount);

    // 标记兑换码已使用
    await this.prisma.redemptionCode.update({
      where: { code },
      data: { status: "used", usedBy: userId, usedAt: new Date() },
    });

    return true;
  }

  private generateCode(): string {
    // 生成 16 位随机兑换码
    return randomBytes(8).toString("hex").toUpperCase();
  }
}

开发历程:五个阶段的进化

第一阶段:MVP 原型(2 周)

目标:验证核心功能可行性

完成内容

  • ✅ 搭建 Vue 3 + Vite 前端项目
  • ✅ 实现基础内容编辑器
  • ✅ 集成小红书 JSSDK
  • ✅ 实现 URL Scheme 跳转
  • ✅ 移动端基础适配

技术难点

  • 小红书 JSSDK 的签名机制理解
  • 跨域问题处理(开发环境 vs 生产环境)
  • 移动端浏览器兼容性(微信、Safari、Chrome)

经验总结

MVP 阶段最重要的是快速验证想法,不要过度设计。我最初花了很多时间纠结架构,后来发现先把核心功能跑通才是关键。


第二阶段:架构重构(3 周)

目标:从 Express 迁移到 NestJS,建立可扩展架构

完成内容

  • ✅ 搭建 NestJS 后端项目
  • ✅ 引入 Prisma ORM
  • ✅ 配置 BullMQ 任务队列
  • ✅ 实现 JWT 认证系统
  • ✅ 集成阿里云 OSS
  • ✅ 模块化拆分(12 个功能模块)

为什么选择 NestJS?

对比项ExpressNestJS
类型安全❌ 需要额外配置✅ 原生 TypeScript
依赖注入❌ 需要第三方库✅ 内置 DI 容器
模块化❌ 需要手动组织✅ 模块系统
API 文档❌ 需要手写✅ Swagger 自动生成
测试支持⚠️ 需要配置✅ 内置测试工具

架构优势

  • 依赖注入:代码解耦,易于测试
  • 模块化设计:职责清晰,易于扩展
  • 类型安全:减少运行时错误
  • 自动化文档:Swagger 自动生成 API 文档

第三阶段:AI 能力集成(2 周)

目标:引入 AI 辅助创作能力

完成内容

  • ✅ 集成 DeepSeek AI 模型
  • ✅ 集成通义千问
  • ✅ 实现 AI 文案生成页面
  • ✅ 实现一键生成功能
  • ✅ 实现人设风格定制
  • ✅ 实现选题策划功能

技术选型

为什么选择 DeepSeek?

  • 💰 成本低:比 GPT-4 便宜 90%
  • 🚀 速度快:响应时间 < 2s
  • 🇨🇳 国内可用:无需翻墙
  • 📝 中文友好:对中文内容理解更好

AI 调用优化

typescript
// 使用任务队列避免阻塞
@Processor("ai-tasks")
export class AiProcessor {
  @Process("generate")
  async handleGenerate(job: Job) {
    const { prompt, model } = job.data;

    // 更新进度
    await job.progress(10);

    const result = await this.aiService.generate(prompt, model);

    await job.progress(100);
    return result;
  }
}

第四阶段:数据与运营(2 周)

目标:提供数据洞察和运营工具

完成内容

  • ✅ 热点素材抓取
  • ✅ 内容数据洞察
  • ✅ 账号矩阵管理
  • ✅ 充值和兑换码系统
  • ✅ 管理后台

爬虫实现

typescript
// 使用 Puppeteer 抓取小红书热榜
async crawlHotTopics() {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();

  await page.goto('https://www.xiaohongshu.com/explore');

  const topics = await page.evaluate(() => {
    const items = document.querySelectorAll('.hot-topic-item');
    return Array.from(items).map(item => ({
      title: item.querySelector('.title').textContent,
      heat: item.querySelector('.heat').textContent,
      category: item.querySelector('.category').textContent,
    }));
  });

  await browser.close();
  return topics;
}

第五阶段:完善与优化(进行中)

目标:提升用户体验和系统稳定性

计划内容

  • 🔄 性能优化
    • 前端代码分割和懒加载
    • 后端 API 响应时间优化
    • 数据库查询优化
  • 🔄 错误处理完善
    • 统一错误码
    • 友好的错误提示
    • 错误日志收集
  • 🔄 用户体验优化
    • 加载状态优化
    • 交互反馈优化
    • 移动端体验提升
  • 📋 测试覆盖
    • 单元测试
    • 集成测试
    • E2E 测试
  • 📋 部署和 CI/CD
    • Docker 容器化
    • GitHub Actions 自动部署
    • 监控和告警

技术挑战与解决方案

挑战 1:小红书 JSSDK 集成

问题

  • 官方文档不完善
  • 签名机制复杂
  • 不同浏览器行为不一致

解决方案

  1. 通过第三方服务获取签名
javascript
const getSignature = async () => {
  const response = await axios.post("/api/xhs/signature", {
    url: window.location.href,
  });
  return response.data;
};
  1. 实现降级方案
javascript
const publishWithFallback = () => {
  try {
    // 尝试使用 JSSDK
    window.xhs.shareToNote({...});
  } catch (error) {
    // 降级到 URL Scheme
    const scheme = `xhsdiscover://note/publish?...`;
    window.location.href = scheme;
  }
};
  1. 详细的错误提示
vue
<el-alert
  v-if="publishError"
  type="warning"
  title="自动发布失败"
  description="请点击下方按钮手动跳转到小红书 App"
  show-icon
/>

挑战 2:AI 响应速度优化

问题

  • AI 生成内容耗时较长(5-10s)
  • 用户等待体验差
  • 高并发时服务器压力大

解决方案

  1. 使用任务队列
typescript
// 将 AI 任务放入队列
const job = await this.aiQueue.add("generate", {
  prompt,
  model,
});

// 返回任务 ID
return { jobId: job.id };
  1. 实现流式响应(SSE)
typescript
@Sse('ai/stream/:jobId')
async streamAiResult(@Param('jobId') jobId: string) {
  return new Observable(observer => {
    const interval = setInterval(async () => {
      const job = await this.aiQueue.getJob(jobId);
      const progress = await job.progress();

      observer.next({ data: { progress } });

      if (await job.isCompleted()) {
        const result = await job.returnvalue;
        observer.next({ data: { result } });
        observer.complete();
        clearInterval(interval);
      }
    }, 500);
  });
}
  1. 前端实时显示进度
vue
<script setup>
const eventSource = new EventSource(`/api/ai/stream/${jobId}`);

eventSource.onmessage = (event) => {
  const data = JSON.parse(event.data);
  if (data.progress) {
    progress.value = data.progress;
  }
  if (data.result) {
    generatedContent.value = data.result;
    eventSource.close();
  }
};
</script>

<template>
  <el-progress :percentage="progress" />
</template>

挑战 3:多账号管理的安全性

问题

  • 如何安全存储多个账号的凭证?
  • 如何防止 Token 泄露?
  • 如何实现 Token 自动刷新?

解决方案

  1. 加密存储
typescript
import { createCipheriv, createDecipheriv } from "crypto";

@Injectable()
export class EncryptionService {
  private readonly algorithm = "aes-256-cbc";
  private readonly key = this.configService.get("ENCRYPTION_KEY");

  encrypt(text: string): string {
    const iv = randomBytes(16);
    const cipher = createCipheriv(this.algorithm, this.key, iv);
    const encrypted = Buffer.concat([cipher.update(text), cipher.final()]);
    return `${iv.toString("hex")}:${encrypted.toString("hex")}`;
  }

  decrypt(text: string): string {
    const [ivHex, encryptedHex] = text.split(":");
    const iv = Buffer.from(ivHex, "hex");
    const encrypted = Buffer.from(encryptedHex, "hex");
    const decipher = createDecipheriv(this.algorithm, this.key, iv);
    const decrypted = Buffer.concat([
      decipher.update(encrypted),
      decipher.final(),
    ]);
    return decrypted.toString();
  }
}
  1. Token 刷新机制
typescript
@Injectable()
export class AccountService {
  async getValidToken(accountId: string): Promise<string> {
    const account = await this.prisma.account.findUnique({
      where: { id: accountId },
    });

    // 检查 Token 是否过期
    if (account.expiresAt < new Date()) {
      // 刷新 Token
      const newToken = await this.refreshToken(account.refreshToken);

      // 更新数据库
      await this.prisma.account.update({
        where: { id: accountId },
        data: {
          accessToken: this.encryptionService.encrypt(newToken.accessToken),
          expiresAt: newToken.expiresAt,
        },
      });

      return newToken.accessToken;
    }

    return this.encryptionService.decrypt(account.accessToken);
  }
}
  1. 账号隔离
typescript
// 使用 Row-Level Security
@Injectable()
export class AccountGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    const accountId = request.params.accountId;

    // 验证账号归属
    return this.accountService.belongsToUser(accountId, user.id);
  }
}

挑战 4:热点数据实时性

问题

  • 如何及时获取小红书最新热点?
  • 如何避免频繁爬取被封禁?
  • 如何提升查询速度?

解决方案

  1. 定时任务 + 增量更新
typescript
@Cron('0 */2 * * *') // 每 2 小时执行
async crawlHotTopics() {
  const latestTopics = await this.fetchXhsHotTopics();

  // 只更新变化的数据
  for (const topic of latestTopics) {
    await this.prisma.hotTopic.upsert({
      where: { topicId: topic.id },
      update: { heat: topic.heat, updatedAt: new Date() },
      create: { ...topic },
    });
  }
}
  1. Redis 缓存
typescript
@Injectable()
export class HotMaterialsService {
  async getHotTopics(): Promise<HotTopic[]> {
    // 先查缓存
    const cached = await this.redis.get("hot_topics");
    if (cached) {
      return JSON.parse(cached);
    }

    // 查数据库
    const topics = await this.prisma.hotTopic.findMany({
      orderBy: { heat: "desc" },
      take: 50,
    });

    // 写入缓存(5 分钟过期)
    await this.redis.setex("hot_topics", 300, JSON.stringify(topics));

    return topics;
  }
}
  1. 爬虫策略优化
typescript
// 使用代理池
const proxyList = [
  "http://proxy1.example.com:8080",
  "http://proxy2.example.com:8080",
  // ...
];

const randomProxy = proxyList[Math.floor(Math.random() * proxyList.length)];

const browser = await puppeteer.launch({
  args: [`--proxy-server=${randomProxy}`],
});

// 添加随机延迟
await page.waitForTimeout(Math.random() * 3000 + 2000);

项目数据与成果

代码规模

  • 前端:25 个 Vue 组件,约 8,000 行代码
  • 后端:12 个功能模块,约 7,000 行代码
  • 总计:约 15,000+ 行代码

技术栈

  • 前端依赖:14 个核心依赖
  • 后端依赖:21 个核心依赖
  • 开发工具:17 个开发依赖

功能模块

  • 用户端功能:10+ 个页面
  • 管理端功能:5+ 个页面
  • 后端 API:50+ 个接口

性能指标

  • 首屏加载时间:< 2s
  • API 平均响应时间:< 200ms
  • AI 生成速度:5-10s
  • 支持并发用户:1000+

未来规划

短期目标(1-2 个月)

  • [ ] 完善错误处理和日志系统
  • [ ] 优化前端性能(代码分割、懒加载)
  • [ ] 完善 API 文档
  • [ ] 添加单元测试覆盖
  • [ ] 优化移动端体验

中期目标(3-6 个月)

  • [ ] 支持更多社交平台(抖音、快手、视频号)
  • [ ] 增强 AI 能力(图片生成、视频脚本)
  • [ ] 数据分析功能增强
  • [ ] 团队协作功能
  • [ ] 内容日历和定时发布

长期目标(6-12 个月)

  • [ ] 构建内容创作者社区
  • [ ] 开放 API 平台
  • [ ] 移动端 App 开发
  • [ ] 企业级 SaaS 服务
  • [ ] 国际化支持

经验总结

技术选型

  1. 选择成熟的技术栈:Vue 3、NestJS 都有完善的生态和社区支持
  2. 优先考虑开发效率:Vite 的极速开发体验让我节省了大量时间
  3. 类型安全很重要:TypeScript 帮我避免了很多低级错误
  4. 不要过度设计:MVP 阶段先跑通核心功能,再逐步优化

架构设计

  1. 模块化是王道:清晰的模块划分让代码易于维护和扩展
  2. 依赖注入提升可测试性:NestJS 的 DI 让单元测试变得简单
  3. 任务队列处理耗时操作:BullMQ 让系统更健壮
  4. 缓存是性能优化的关键:Redis 大幅提升了查询速度

开发流程

  1. 先做 MVP,快速验证:不要一开始就追求完美
  2. 持续重构:随着需求增加,及时重构代码
  3. 写好文档:API 文档、代码注释都很重要
  4. 自动化测试:虽然前期投入大,但长期收益高

踩过的坑

  1. 小红书 JSSDK 文档不全:花了很多时间试错
  2. AI 成本控制:一开始没注意,API 调用费用很高
  3. 数据库设计不合理:后期修改 Schema 很痛苦
  4. 没有做好错误处理:导致用户体验差

写在最后

矩阵魔方这个项目从最初的一个想法,到现在已经发展成为一个功能完善的全栈应用。在这个过程中,我学到了很多:

  • 🎯 技术选型的重要性:好的技术栈能让开发事半功倍
  • 🏗️ 架构设计的艺术:模块化、可扩展的架构是长期维护的基础
  • 🤖 AI 的无限可能:AI 正在改变内容创作的方式
  • 📊 数据驱动的价值:数据洞察能帮助创作者做出更好的决策

这个项目还在持续开发中,未来我会继续分享更多的技术细节和实战经验。如果你对这个项目感兴趣,或者有任何问题和建议,欢迎在评论区留言交流!

记住:好的产品是迭代出来的,不是一蹴而就的。 让我们一起在技术的道路上不断探索,创造更多有价值的产品。


相关链接


项目状态:🚧 积极开发中
当前版本:v1.0.0
最后更新:2025-12-16

如果这篇文章对你有帮助,欢迎点赞、收藏、分享!关注我,获取更多全栈开发和 AI 应用的实战经验。