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.mjs
和 app.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.ts
和 server/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包年
只需 99
,99
你买不了吃亏,买不了上当
免责声明
本系统仅供学习和研究目的使用,在选择接入模型时,请遵循当地法律法规,尊重他人的合法权益,不得用于任何违法违规活动。如因使用本系统而产生的任何法律责任,由使用者自行承担。