虽迟但到,前后端商用代码全量开源,快速部署你自己的ChatGPT

258 阅读9分钟

EsChatPro

一个开箱即用且极易上手的类ChatGPT/通义千问/文心一言的商业开源应用
可接入任何 OpenAI接口兼容的大语言模型

版本特性

  • 可接入任何主流 OpendAI接口兼容 的 AI 大语言模型
  • 支持暗黑主题 🌙
  • 完美的移动端兼容 📱
  • 打字机回复效果 ⌨️
  • 上下文对话支持,可创建多轮对话记录
  • 自定义系统角色
  • 整段生成内容支持复制、代码复制、代码高亮
  • 双登录模式:
    • 1.关联公众号登录(个人订阅号即可)
    • 2.普通的授权码登录模式(手动分发授权码)
  • 自定义调用次数及文本输入上限
  • MongoDB 数据库
  • 后台仪表盘:使用分析、用户概览、调用日历
  • 用户管理
  • 商业化-VIP 会员管理
  • 商业化-VIP 用户卡密管理:生成、激活
  • 生成内容分享管理,类似于百度网盘的链接分享,分享后其他用户可通过分享密码查看对话内容
  • 分享内容 静态模板渲染,利于 SEO
  • 自定义系统角色、后台管理
  • 内容分享管理、公告管理 、更新记录管理
  • 接入模型管理

[!NOTE] > 具体关于使用微信公众号实现网站授权登录的技术方案可参考如下文章,非常详细 juejin.cn/post/723439…


目录


前置要求

Node

node 需要 ^18 || ^19 || ^20 版本(14 <= node <= 18的需要安装 fetch polyfill

可以通过如下命令查看自己本机的 node 版本

node -v
# v18.19.0

使用 nvm 可管理本地多个 node 版本

Mac 用户可以使用 n 来管理 node 版本

brew install n

MongoDB

EsChatPro 使用的是 MongoDB 数据库,关于 MongoDB 的安装,网络上有很多教程,这里就不赘述了。

用户配置 服务端 server 目录

配置文件请参考 server/.env.example 文件

在服务端 server 根目录中创建 .env 文件,并复制 .env.example 文件内容进行修改

详细配置信息如下:

MongoURI
  • 必须: true
  • 描述: 连接 MongoDB 数据库的 URI 地址
JWT_SECRET_KEY
  • 必须: true
  • 描述: 设置用于用户登录 jwt 鉴权的 secret key。
MAX_LENGTH
  • 必须: false
  • 默认值: 2000
  • 描述: 普通用户允许的最大输入字符长度。默认限制为 2000 字符。
DAILY_LIMIT
  • 必须: false
  • 默认值: 20
  • 描述: 普通用户每日调用接口的额度上限。默认设定为每日最多调用 20 次。
VIP_MAX_LENGTH
  • 必须: false
  • 默认值: 10000
  • 描述: VIP 用户允许的最大输入字符长度。默认限制为 10000 字符。
VIP_DAILY_LIMIT
  • 必须: false
  • 默认值: 99
  • 描述: VIP 用户每日调用接口的额度上限。默认设定为每日最多调用 99 次。
SHARE_MAX_COUNT
  • 必须: false
  • 默认值: 5
  • 描述: 普通用户分享内容数量上限。默认限制为 5 条。
WECHAT_TOKEN
  • 必须: true
  • 描述: 对应微信公众号后台设置的 token,可按需自定义。

用户配置 客户端 client 目录

网站登录 - 公众号二维码存放路径

client/static/imgs/mp_qrcode.jpg

应用内部分截图展示

截图请展开查看

🏠 首页

用户登录

首页目录展开

首页目录收起

暗黑模式

多模型切换

输入框展开编辑

网站公告

会员激活

信息修改

昵称修改

头像修改

数据同步

拉取

推送

系统角色

内置角色

公开

自定义

创建系统角色

系统角色可视化

内容分享

链接分享

链接分享成功

输入密码方可访问

输入密码后展示分享内容

分享内容管理

截图分享

截图成功

后台管理

统计分析

用户管理

用户管理-开会员

用户管理-详情

用户管理-用户指定日期调用时间记录

卡密管理

批量生成卡密

会员管理

系统角色管理

公告管理

内容分享管理

网站更新记录维护

模型管理

移动端兼容

移动端对话管理

移动端内容生成

移动端内容生成

移动端内容生成

移动端内容生成

技术栈

客户端

Vue3 + Element Plus + Pinia + Unocss

服务端

Express + MongoDB

目录结构

客户端

/src/assets 静态资源

/src/components 公共组件

/src/hooks 公共 hooks

/src/router 路由配置

/src/service 接口请求、响应拦截器

/src/stores 状态管理

/src/utils 全局工具类

/src/views 页面

服务端

/src/constant 常量

/src/schema MongoDB 数据库 schema

/src/routes 路由

  • /admin 后台管理目录
  • /share 内容分享目录、静态内容生成
  • wechat.ts 公众号验证、获取验证码、登录校验
  • home.ts 用户登录状态校验、获取网站公告
  • chat.ts 大模型对话
  • user.ts 用户信息相关
  • notice.ts 网站公告
  • timeline.ts 时间线
  • vip.ts 会员相关
  • system_role.ts 系统角色
  • sync.ts 数据同步

/src/store node-cache 配置,主要用于验证码的生成及校验

/src/utils 工具类

.env.example 配置文件示例,请创建自己的 .env 文件

app.ts 服务端应用入口,可配置端口、跨域等

安装部署

本地开发

克隆项目

git clone git@github.com:isnl/EsChatPro.git

服务端

进入服务端根目录

cd server

安装依赖

npm install

重要: 数据库依赖 MongoDB ,开发及部署之前需确保数据库正常运行,且完成上述的前置要求

启动服务端

npm run dev

启动服务端后,按如下操作执行数据库初始化脚本:

此操作为插入一条 后台管理员数据后台管理动态路由数据,管理员数据可以修改,动态路由数据不能修改

脚本路径为:scripts/init-mongo.js

npm run init-mongo

客户端

进入客户端根目录

cd client

安装依赖

npm install

启动客户端

npm run dev

本地构建

客户端构建

进入客户端根目录

cd client

执行构建命令

npm run build

此时会在 服务端根目录下 生成客户端的构建产物 clientDist


服务端构建

进入服务端根目录

cd server

执行构建命令

npm run build

此时会在服务端根目录产生两个构建产物 app.mjsapp.mjs.map

接下来使用如下命令启动服务即可

npm start

当然,你也可以使用 pm2 来守护进程,防止进程被杀死

pm2 start npm --name ai -- start

注意事项

公众号用户设置管理员

用自己微信扫码登录后,使用 MongoDB Compass 或其他数据库终端连接数据库,在 user 集合中找到自己,并将 role 字段设置为 1 即可

非公众号授权登录方式 新建用户

MongoDB Compass 或其他数据库终端连接数据库,并在 user 集合中新增如下数据,openId 为授权码字段,自行生成,长度和内容随机,确保唯一性即可。

{
  "openId": "GA02rPMrA",
  "id": "poRElv1koxGkvYriOlM61",
  "avatar": "E053",
  "name": "GFN1E-ChatGPTer",
  "createdAt": "2024-04-05 15:38:15"
}

添加管理员用户

同样的, user 集合中新增如下数据,openId 为授权码字段,自行生成,长度和内容随机,确保唯一性即可。role 字段为 1

// role: 权限字段,1为管理员,0为普通用户,默认为普通用户
{
  "openId": "GA02rPMrA",
  "id": "poRElv1koxGkvYriOlM61",
  "avatar": "E053",
  "name": "GFN1E-ChatGPTer",
  "createdAt": "2024-04-05 15:38:15",
  "role": 1
}

添加 AI 大模型

进入后台管理 -> 模型管理 -> 新建模型

常见问题

Q: 部署后为啥不是流式响应

A: 检查 nginx 配置

proxy_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;

Q: 授权码登录方式,授权码在哪创建?

A: 系统运行后,用 MongoDB Compass 或其他数据库终端连接数据库,并在 user 集合中新增如下数据,openId 为授权码字段,自行生成,长度和内容随机,确保唯一性即可。 哦对了,如果你想给你自己的账号添加管理员权限,请再添加 role 字段,值为 1

// 权限字段,1为管理员,0为普通用户
{
  "openId": "GA02rPMrA",
  "id": "poRElv1koxGkvYriOlM61",
  "avatar": "E053",
  "name": "GFN1E-ChatGPTer",
  "createdAt": "2024-04-05 15:38:15",
  "role": 1
}

Q: 除了微信公众号和授权码登录方式外,能不能让用户自己注册账号自行使用?

A: 参考 server/src/schema/user.tsserver/src/routes/user.ts 文件,自行开发注册相关功能即可


Q: 能不能给指定的用户单独设置每日调用次数和文本长度限制?

A: 需要写点代码,在后台用户管理中,将调用次数和文本长度字段存入数据库中的用户表里。并在如下文件中(server/src/routes/gpt.ts)用户调用 AI 生成内容的时候,先根据用户 id 获取到用户信息,再将调用次数和文本长度限制改为从用户信息中获取的方式即可

  • process.env.MAX_LENGTH -> 用户信息中的 MAX_LENGTH
  • process.env.DAILY_LIMIT -> 用户信息中的 DAILY_LIMIT

Q: 没有服务器和域名怎么办?

A: 买!阿里云现在服务器价格新老用户都很便宜 2 核 4G,5M 固定带宽,80G ESSD Entry 盘一年只需要199(企业用户),2 核 2G,3M 固定带宽,40G ESSD Entry 盘只需 99(个人企业同享)
不是哥们,这价格你敢信!!! 最重要的是 续费同价,这你受得了吗!

当然,新用户更优惠,.com域名 + 2核2G ECS包年 只需 9999 你买不了吃亏,买不了上当

点击即刻购买

免责声明

本系统仅供学习和研究目的使用,在选择接入模型时,请遵循当地法律法规,尊重他人的合法权益,不得用于任何违法违规活动。如因使用本系统而产生的任何法律责任,由使用者自行承担。

LICENSE

MIT