Skip to main content
warsgb

aisa

by warsgb

React + Node app skills

Installation guide →
17 skills GitHub

Documentation

# AISA - AI售前助手全栈应用

AISA (AI Sales Assistant) 是一个基于 **React + NestJS + PostgreSQL** 的全栈AI售前助手应用,提供13个专业的售前AI技能,帮助售前团队高效完成客户研究、方案设计、竞品分析等工作。

## 📋 目录

- [一键安装](#一键安装)
- [技术栈](#技术栈)
- [功能特性](#功能特性)
- [环境要求](#环境要求)
- [快速开始](#快速开始)
- [详细配置](#详细配置)
- [启动服务](#启动服务)
- [使用指南](#使用指南)
- [项目结构](#项目结构)
- [常见问题](#常见问题)

## 🚀 技术栈

### 前端
- **React 18** - 用户界面库
- **TypeScript** - 类型安全
- **Vite** - 构建工具
- **Tailwind CSS** - 样式框架
- **Socket.IO Client** - WebSocket 通信

### 后端
- **NestJS** - Node.js 企业级框架
- **TypeScript** - 类型安全
- **TypeORM** - ORM 框架
- **PostgreSQL** - 数据库
- **Socket.IO** - WebSocket 服务
- **JWT** - 身份认证
- **Zhipu AI / Anthropic Claude** - AI 模型支持

## ✨ 功能特性

- 🔐 **用户认证系统** - 注册、登录、团队管理
- 👥 **团队协作** - 支持多团队、多成员协作
- 🏢 **客户管理** - 客户信息管理、项目跟踪
- 🤖 **13个AI技能** - 覆盖售前全流程
  - 金融行业客户研究
  - 竞品反制话术
  - 电梯演讲生成
  - 痛点分析
  - 方案设计
  - 价值主张提炼
  - 演示场景设计
  - 等等...
- 📄 **文档管理** - 支持文档版本控制
- 📎 **参考资料** - 上传和管理参考资料
- 🔄 **实时流式响应** - AI 技能实时流式输出

## 🚀 一键安装

**全新服务器部署**:在全新的 Linux 服务器上,可以使用一键安装脚本自动完成所有配置:

```bash
curl -sSL https://raw.githubusercontent.com/warsgb/aisa/master/install.sh | bash
```

或使用 wget:

```bash
wget -qO- https://raw.githubusercontent.com/warsgb/aisa/master/install.sh | bash
```

一键安装脚本会自动:
- 检测操作系统类型(Ubuntu/CentOS)
- 安装系统依赖(Node.js 20.x, PostgreSQL, Git)
- 克隆代码仓库
- 生成安全密钥(JWT)
- 配置数据库(用户和数据库)
- 安装项目依赖
- 构建后端
- 配置 PM2 进程管理
- 启动服务

详细文档:[INSTALL.md](./INSTALL.md)

---

## 📦 环境要求

在开始之前,请确保您的系统已安装以下软件:

- **Node.js** >= 18.x ([下载地址](https://nodejs.org/))
- **PostgreSQL** >= 14.x
  - macOS: `brew install postgresql@16`
  - Ubuntu: `sudo apt install postgresql`
  - Windows: [下载安装包](https://www.postgresql.org/download/windows/)
- **npm** 或 **yarn** (随 Node.js 安装)
- **Git** (可选,用于克隆代码)

## 🏁 快速开始

### 1. 克隆项目

```bash
git clone <repository-url>
cd aisa
```

### 2. 安装依赖

```bash
# 安装前端依赖
npm install

# 安装后端依赖
cd backend
npm install
cd ..
```

### 3. 配置环境变量

项目提供了环境变量模板文件,需要复制并填写实际配置:

```bash
# 前端环境配置
cp .env.example .env

# 后端环境配置
cp backend/.env.example backend/.env
```

### 4. 生成安全密钥

使用提供的脚本生成 JWT 密钥:

```bash
./scripts/generate-secrets.sh
```

将生成的密钥复制到 `backend/.env` 文件中的对应位置:

```bash
JWT_SECRET=<生成的密钥1>
JWT_REFRESH_SECRET=<生成的密钥2>
```

### 5. 配置数据库

#### 创建数据库和用户

```bash
# macOS/Linux
psql -U postgres

# Windows
psql -U postgres
```

在 PostgreSQL 命令行中执行:

```sql
CREATE USER aisa_user WITH PASSWORD 'aisa_password_2026';
CREATE DATABASE aisa_db OWNER aisa_user;
GRANT ALL PRIVILEGES ON DATABASE aisa_db TO aisa_user;
\q
```

#### 启动 PostgreSQL 服务

```bash
# macOS (Homebrew)
brew services start postgresql@16

# Linux (systemd)
sudo systemctl start postgresql

# Windows (服务管理器)
net start postgresql-x64-16
```

### 6. 配置 AI API 密钥

编辑 `backend/.env` 文件,配置你选择的 AI 服务商密钥:

#### 使用智谱 AI (GLM)

```bash
AI_PROVIDER=zhipu
ZHIPU_API_KEY=your_zhipu_api_key_here
ZHIPU_MODEL=glm-4.7
```

获取 API Key: https://open.bigmodel.cn/

#### 使用 Anthropic Claude

```bash
AI_PROVIDER=anthropic
ANTHROPIC_API_KEY=your_anthropic_api_key_here
ANTHROPIC_MODEL=claude-3-5-sonnet-20241022
```

### 7. 构建后端

```bash
cd backend
npm run build
cd ..
```

### 8. 启动服务

使用项目提供的启动脚本:

```bash
# 启动所有服务(前端 + 后端)
./start-all.sh

# 或者单独启动
./start-frontend.sh  # 仅启动前端
./backend/start-backend.sh  # 仅启动后端
```

### 9. 访问应用

- **前端界面**: http://localhost:5173
- **后端 API**: http://localhost:3001
- **健康检查**: http://localhost:3001/health

## 🔧 详细配置

### 环境变量说明

#### 前端 `.env` 文件

```bash
# 后端 API 地址(开发环境默认 localhost)
VITE_API_URL=http://localhost:3001

# WebSocket 地址
VITE_WS_URL=http://localhost:3001
```

#### 后端 `backend/.env` 文件

```bash
# 应用配置
NODE_ENV=development          # 运行模式:development/production
PORT=3001                     # 后端服务端口

# 数据库配置
DB_HOST=localhost             # 数据库主机
DB_PORT=5432                  # 数据库端口
DB_USERNAME=aisa_user         # 数据库用户名
DB_PASSWORD=aisa_password_2026  # 数据库密码
DB_DATABASE=aisa_db           # 数据库名称

# JWT 配置(必需!)
JWT_SECRET=your_jwt_secret_key_here              # JWT 访问令牌密钥
JWT_EXPIRES_IN=1h                                # 访问令牌有效期
JWT_REFRESH_SECRET=your_refresh_secret_key_here  # JWT 刷新令牌密钥
JWT_REFRESH_EXPIRES_IN=7d                        # 刷新令牌有效期

# AI 服务配置
AI_PROVIDER=zhipu              # AI 提供商:zhipu/anthropic/openai

# 智谱 AI 配置
ZHIPU_API_KEY=your_key_here    # 智谱 API Key
ZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4/
ZHIPU_MODEL=glm-4.7            # 模型选择
ZHIPU_MAX_TOKENS=65536         # 最大 token 数
ZHIPU_TEMPERATURE=0.7          # 温度参数

# 文件上传配置
UPLOAD_DIR=./uploads           # 上传文件存储目录(相对路径)
MAX_FILE_SIZE=10485760         # 最大文件大小(10MB)

# CORS 配置
CORS_ORIGIN=http://localhost:5173    # 允许的前端域名
CORS_ALLOW_ALL=false                 # 开发环境可设为 true 允许所有域名
```

### 目录结构说明

```
aisa/
├── backend/                    # 后端代码
│   ├── src/                   # 源代码
│   │   ├── modules/          # 业务模块
│   │   ├── common/           # 公共模块
│   │   ├── entities/         # 数据库实体
│   │   └── main.ts           # 应用入口
│   ├── dist/                 # 编译后的代码
│   ├── logs/                 # 日志文件
│   ├── uploads/              # 上传文件存储
│   ├── .env                  # 环境变量(不提交到 Git)
│   └── package.json          # 后端依赖
├── src/                       # 前端源代码
│   ├── components/           # React 组件
│   ├── pages/                # 页面组件
│   ├── services/             # API 服务
│   ├── types/                # TypeScript 类型
│   └── main.tsx              # 应用入口
├── skills/                    # AI 技能定义
│   ├── presale-elevator-pitch/
│   ├── financial-customer-research/
│   └── ...
├── scripts/                   # 工具脚本
│   ├── generate-secrets.sh   # 生成密钥
│   ├── start.sh              # 启动脚本
│   └── status.sh             # 状态检查
├── start-all.sh              # 启动所有服务
├── stop-all.sh               # 停止所有服务
├── status.sh                 # 查看服务状态
├── .env.example              # 前端环境变量模板
├── .gitignore                # Git 忽略文件
└── README.md                 # 项目说明
```

## 🎯 启动服务

### 使用启动脚本(推荐)

```bash
# 启动所有服务
./start-all.sh

# 停止所有服务
./stop-all.sh

# 查看服务状态
./status.sh
```

### 手动启动

```bash
# 启动后端(开发模式)
cd backend
NODE_ENV=development npm run start:dev

# 启动后端(生产模式)
NODE_ENV=production node dist/main

# 启动前端
npm run dev
```

### 服务端口

- **前端**: http://localhost:5173
- **后端**: http://localhost:3001
- **数据库**: localhost:5432

## 📖 使用指南

### 1. 注册账号

首次使用需要注册账号:

```bash
curl -X POST http://localhost:3001/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "your_password",
    "full_name": "您的姓名",
    "team_name": "团队名称"
  }'
```

### 2. 登录系统

```bash
curl -X POST http://localhost:3001/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "your_password"
  }'
```

### 3. 创建客户

登录后,在前端界面或通过 API 创建客户:

```bash
curl -X POST "http://localhost:3001/teams/{team_id}/customers" \
  -H "Authorization: Bearer {access_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "客户名称",
    "industry": "行业",
    "description": "客户描述"
  }'
```

### 4. 调用 AI 技能

在前端界面选择要调用的技能,输入相关参数,即可获得 AI 生成的售前内容。

**注意**: 技能执行使用 WebSocket 进行实时流式输出,需要保持连接稳定。

## 🛠️ 常用命令

```bash
# 安装依赖
npm install              # 前端依赖
cd backend && npm install # 后端依赖

# 构建项目
npm run build            # 前端构建
cd backend && npm run build  # 后端构建

# 开发模式
npm run dev              # 前端开发服务器
cd backend && npm run start:dev  # 后端开发服务器

# 代码检查
npm run lint             # ESLint 检查
npm run format           # Prettier 格式化

# 数据库操作
psql -U aisa_user -d aisa_db  # 连接数据库
```

## 🐛 常见问题

### ⚠️ 服务器部署重要提示

如果在服务器上拉取最新代码后无法正常使用,请检查以下配置:

#### 1. 修改前端 API 地址

代码中的 `.env` 文件默认配置为本地开发地址(`localhost:3001`),在服务器上部署时需要修改:

```bash
# 方法1:直接修改 .env 文件
vi /opt/aisa/.env

# 将以下内容:
VITE_API_URL=http://localhost:3001
VITE_WS_URL=http://localhost:3001

# 改为服务器实际 IP(假设服务器 IP 是 192.168.1.100):
VITE_API_URL=http://192.168.1.100:3001
VITE_WS_URL=http://192.168.1.100:3001
```

```bash
# 方法2:创建 .env.local 文件覆盖(推荐,不会被 git 提交)
cd /opt/aisa
cat > .env.local << 'EOF'
VITE_API_URL=http://你的服务器IP:3001
VITE_WS_URL=http://你的服务器IP:3001
EOF
```

#### 2. 重启前端服务

修改配置后需要重启前端服务:

```bash
# 如果使用 PM2
pm2 restart aisa-frontend

# 如果使用 start-frontend-dev.sh
pkill -f "vite"
cd /opt/aisa
./start-frontend-dev.sh
```

#### 3. 验证配置

访问前端页面,打开浏览器开发者工具(F12),查看 Console 是否还有 `401 Unauthorized` 或 `ERR_CONNECTION_REFUSED` 错误。

---

### 1. 端口被占用

如果遇到端口被占用的错误:

```bash
# 查看占用端口的进程
lsof -ti:3001  # 后端端口
lsof -ti:5173  # 前端端口

# 杀死占用端口的进程
lsof -ti:3001 | xargs kill -9
```

### 2. 数据库连接失败

检查 PostgreSQL 服务是否启动:

```bash
# macOS
brew services list | grep postgresql

# Linux
sudo systemctl status postgresql

# 启动服务
brew services start postgresql@16  # macOS
sudo systemctl start postgresql   # Linux
```

### 3. JWT 密钥错误

确保在 `backend/.env` 中正确配置了 JWT 密钥:

```bash
# 生成新的密钥
./scripts/generate-secrets.sh

# 将生成的密钥填入 backend/.env
JWT_SECRET=<生成的密钥1>
JWT_REFRESH_SECRET=<生成的密钥2>
```

### 4. AI API 调用失败

- 检查 API Key 是否正确配置
- 确认 API Key 有足够的额度
- 检查网络连接是否正常

### 5. 技能加载失败

检查 `skills/` 目录是否存在且包含技能定义文件。如果修改了技能文件,需要重启后端服务。

### 6. 前端无法连接后端

检查以下配置:

1. `.env` 文件中的 `VITE_API_URL` 是否正确
2. 后端服务是否正常运行
3. 防火墙是否阻止了连接

## 📝 开发说明

### 技能定义

技能定义在 `skills/` 目录中,每个技能包含:

```
skills/<skill-slug>/
├── SKILL.md              # 技能说明文档(带 frontmatter)
└── ...                   # 其他相关文件
```

技能的 frontmatter 定义:

```yaml
---
slug: skill-slug
name: 技能名称
description: 技能描述
category: 技能分类
usage_hint: 使用提示
parameters:
  - name: param_name
    type: string
    label: 参数名称
    required: true
---
```

### 数据库同步

在开发模式下,TypeORM 会自动同步数据库表结构。

如果需要重置数据库:

```bash
psql -U aisa_user -d aisa_db -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
```

然后重启后端,表会自动重新创建。

## 🤝 贡献指南

欢迎提交 Issue 和 Pull Request!

1. Fork 本项目
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request

## 📄 许可证

本项目采用 MIT 许可证。

## 📞 支持

如有问题或建议,请提交 Issue 或联系项目维护者。

---

**祝您使用愉快!** 🎉