From 4dcae754884033c70a4522a7c2c810e3cbdda78c Mon Sep 17 00:00:00 2001 From: RockYang Date: Sat, 6 May 2023 11:35:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +-- README.md | 37 +++++++++++++++---- config.sample.toml | 22 ----------- Makefile => src/Makefile | 0 src/config.sample.toml | 31 ++++++++++++++++ fresh.conf => src/fresh.conf | 0 go.mod => src/go.mod | 2 +- go.sum => src/go.sum | 0 {logger => src/logger}/logger.go | 0 main.go => src/main.go | 4 +- {server => src/server}/client.go | 0 {server => src/server}/db.go | 4 +- .../server}/handler_admin_apikey.go | 6 +-- .../server}/handler_admin_config.go | 4 +- {server => src/server}/handler_admin_role.go | 2 +- {server => src/server}/handler_admin_user.go | 4 +- {server => src/server}/handler_chat.go | 4 +- {server => src/server}/handler_login.go | 4 +- {server => src/server}/server.go | 6 +-- {test => src/test}/test.go | 0 {types => src/types}/chat.go | 0 {types => src/types}/config.go | 0 {types => src/types}/web.go | 0 {utils => src/utils}/config.go | 4 +- {utils => src/utils}/leveldb.go | 0 {utils => src/utils}/utils.go | 0 web/src/views/admin/RoleList.vue | 2 +- web/vue.config.js | 6 +-- 28 files changed, 87 insertions(+), 61 deletions(-) delete mode 100644 config.sample.toml rename Makefile => src/Makefile (100%) create mode 100644 src/config.sample.toml rename fresh.conf => src/fresh.conf (100%) rename go.mod => src/go.mod (98%) rename go.sum => src/go.sum (100%) rename {logger => src/logger}/logger.go (100%) rename main.go => src/main.go (96%) rename {server => src/server}/client.go (100%) rename {server => src/server}/db.go (98%) rename {server => src/server}/handler_admin_apikey.go (96%) rename {server => src/server}/handler_admin_config.go (99%) rename {server => src/server}/handler_admin_role.go (99%) rename {server => src/server}/handler_admin_user.go (99%) rename {server => src/server}/handler_chat.go (99%) rename {server => src/server}/handler_login.go (98%) rename {server => src/server}/server.go (99%) rename {test => src/test}/test.go (100%) rename {types => src/types}/chat.go (100%) rename {types => src/types}/config.go (100%) rename {types => src/types}/web.go (100%) rename {utils => src/utils}/config.go (97%) rename {utils => src/utils}/leveldb.go (100%) rename {utils => src/utils}/utils.go (100%) diff --git a/.gitignore b/.gitignore index d67820c0..de1db321 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ pnpm-debug.log* lerna-debug.log* node_modules -dist +src/dist dist-ssr *.local @@ -22,7 +22,7 @@ dist-ssr *.njsproj *.sln *.sw? -tmp +src/tmp bin web/.env.development -data +src/data diff --git a/README.md b/README.md index 803d8281..f6240be7 100644 --- a/README.md +++ b/README.md @@ -9,21 +9,42 @@ **本项目基于 MIT 协议,免费开放全部源代码,可以作为个人学习使用或者商用。如需商用建议联系作者登记,仅做统计使用,优秀项目我们将在项目首页为您展示。** -## 项目功能介绍 +## 项目介绍 +这一套完整的系统,包括两套前端聊天应用和一个后台管理系统。系统有用户鉴权,你可以自己使用,也可以部署直接给 C 端用户提供 ChatGPT 的服务。 + +项目的技术架构是 + +> Go + Vue3 + element-plus + +后端采用的是 Go 语言开发的 Gin Web 框架。前端用的是 Vue3 + element-plus UI 框架 + +目前已经实现了以下功能: +1. 通用版的 ChatGPT 聊天界面和功能,聊天记录保存在客户端。 +2. 口令机制:输入口令才可以访问,支持设置口令的对话次数,有效期。 +3. 角色版的聊天界面和功能,角色设定,预设一些角色,比如程序员,客服,作家,老师,艺术家... +4. 保存聊天记录,支持聊天上下文。 +5. OpenAI API 负载均衡,限制每个 API Key 每分钟之内调用次数不超过 15次,防止被封。 +6. 支持配置多个代理,保证高可用。 +7. 实现 markdown 语法解析和代码高亮,支持复制回复内容功能。 +8. 后台管理功能,实现系统的动态配置,用户和角色的动态管理。 + +## 功能截图 + +### 1. + ## TODOLIST -* [x] 使用 level DB 保存用户,角色和聊天记录数据 -* [x] 引入用户角色,添加用户聊天鉴权,设置口令模式 -* [x] 定期清理不在线的会话 sessionID 和聊天上下文记录 -* [x] OpenAI API 负载均衡,限制每个 API Key 每分钟之内调用次数不超过 15次,防止被封 -* [x] 角色设定,预设一些角色,比如程序员,客服,作家,老师,艺术家... -* [x] 实现 markdown 语法解析和代码高亮,支持复制回复内容功能 * [ ] 用户配置界面,配置用户的使用习惯,可以让用户配置自己的 API KEY,调用自己的 API Key,将不记 Token 的使用次数 -* [ ] **新增管理后台功能,实现用户,角色的动态管理** * [ ] 嵌入 AI 绘画功能,支持根据描述词生成图片 * [ ] 接入自己训练的开源大语言模型 * [ ] 接入 Google 语音 API,支持语音聊天 +## 本地部署 + +## 线上发布 + +## 注意事项 + ## 参与贡献 diff --git a/config.sample.toml b/config.sample.toml deleted file mode 100644 index dbf30b4a..00000000 --- a/config.sample.toml +++ /dev/null @@ -1,22 +0,0 @@ -Listen = "0.0.0.0:5678" -ProxyURL = "http://127.0.0.1:7890" -EnableAuth = false -Tokens = [""] - -[Session] - SecretKey = "azyehq3ivunjhbntz78isj00i4hz2mt9xtddysfucxakadq4qbfrt0b7q3lnvg80" - Name = "CHAT_SESSION_ID" - Path = "/" - Domain = "" - MaxAge = 86400 - Secure = true - HttpOnly = false - SameSite = 4 - -[Chat] - ApiURL = "https://api.openai.com/v1/chat/completions" - ApiKeys = ["xxx"] - Model = "gpt-3.5-turbo" - Temperature = 1.0 - MaxTokens = 1024 - EnableContext = true diff --git a/Makefile b/src/Makefile similarity index 100% rename from Makefile rename to src/Makefile diff --git a/src/config.sample.toml b/src/config.sample.toml new file mode 100644 index 00000000..f6109c99 --- /dev/null +++ b/src/config.sample.toml @@ -0,0 +1,31 @@ +Title = "Chat-Plus AI 助手" +ConsoleTitle = "Chat-Plus 控制台" +Listen = "0.0.0.0:5678" +ProxyURL = ["YOUR_PORYX_URL"] +AccessKey = "YOUR_ACCESS_KEY" + +[Session] +SecretKey = "azyehq3ivunjhbntz78isj00i4hz2mt9xtddysfucxakadq4qbfrt0b7q3lnvg80" +Name = "CHAT_SESSION_ID" +Path = "/" +Domain = "" +MaxAge = 86400 +Secure = false +HttpOnly = false +SameSite = 2 + +[ImgURL] +WechatCard = "https://img.r9it.com/chatgpt/WX20230505-162403.png" +WechatGroup = " https://img.r9it.com/chatgpt/WX20230505-162538.png" + +[Manager] +Username = "admin" +Password = "admin123" + +[Chat] +ApiURL = "https://api.openai.com/v1/chat/completions" +Model = "gpt-3.5-turbo" +Temperature = 1.0 +MaxTokens = 1024 +EnableContext = true +ChatContextExpireTime = 3600 \ No newline at end of file diff --git a/fresh.conf b/src/fresh.conf similarity index 100% rename from fresh.conf rename to src/fresh.conf diff --git a/go.mod b/src/go.mod similarity index 98% rename from go.mod rename to src/go.mod index 8ac51f45..7ec74ae0 100644 --- a/go.mod +++ b/src/go.mod @@ -1,4 +1,4 @@ -module openai +module chatplus go 1.19 diff --git a/go.sum b/src/go.sum similarity index 100% rename from go.sum rename to src/go.sum diff --git a/logger/logger.go b/src/logger/logger.go similarity index 100% rename from logger/logger.go rename to src/logger/logger.go diff --git a/main.go b/src/main.go similarity index 96% rename from main.go rename to src/main.go index 77c66080..5e4997f2 100644 --- a/main.go +++ b/src/main.go @@ -1,12 +1,12 @@ package main import ( + logger2 "chatplus/logger" + "chatplus/server" "embed" "flag" "fmt" "github.com/mitchellh/go-homedir" - logger2 "openai/logger" - "openai/server" "os" "path/filepath" ) diff --git a/server/client.go b/src/server/client.go similarity index 100% rename from server/client.go rename to src/server/client.go diff --git a/server/db.go b/src/server/db.go similarity index 98% rename from server/db.go rename to src/server/db.go index 4af1b826..6a605647 100644 --- a/server/db.go +++ b/src/server/db.go @@ -1,9 +1,9 @@ package server import ( + "chatplus/types" + "chatplus/utils" "encoding/json" - "openai/types" - "openai/utils" ) const ( diff --git a/server/handler_admin_apikey.go b/src/server/handler_admin_apikey.go similarity index 96% rename from server/handler_admin_apikey.go rename to src/server/handler_admin_apikey.go index 09df3a88..11697fe3 100644 --- a/server/handler_admin_apikey.go +++ b/src/server/handler_admin_apikey.go @@ -1,11 +1,11 @@ package server import ( + "chatplus/types" + "chatplus/utils" "encoding/json" "github.com/gin-gonic/gin" "net/http" - "openai/types" - "openai/utils" ) // AddApiKeyHandle 添加一个 API key @@ -20,7 +20,7 @@ func (s *Server) AddApiKeyHandle(c *gin.Context) { return } // 过滤已存在的 Key - for _,key:=range s.Config.Chat.ApiKeys { + for _, key := range s.Config.Chat.ApiKeys { if key.Value == data.ApiKey { c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "API KEY 已存在"}) return diff --git a/server/handler_admin_config.go b/src/server/handler_admin_config.go similarity index 99% rename from server/handler_admin_config.go rename to src/server/handler_admin_config.go index ae309c14..9a8f2590 100644 --- a/server/handler_admin_config.go +++ b/src/server/handler_admin_config.go @@ -1,11 +1,11 @@ package server import ( + "chatplus/types" + "chatplus/utils" "encoding/json" "github.com/gin-gonic/gin" "net/http" - "openai/types" - "openai/utils" "strings" ) diff --git a/server/handler_admin_role.go b/src/server/handler_admin_role.go similarity index 99% rename from server/handler_admin_role.go rename to src/server/handler_admin_role.go index e7e29745..d0648338 100644 --- a/server/handler_admin_role.go +++ b/src/server/handler_admin_role.go @@ -1,9 +1,9 @@ package server import ( + "chatplus/types" "encoding/json" "net/http" - "openai/types" "github.com/gin-gonic/gin" ) diff --git a/server/handler_admin_user.go b/src/server/handler_admin_user.go similarity index 99% rename from server/handler_admin_user.go rename to src/server/handler_admin_user.go index 869d17b4..013ebb5b 100644 --- a/server/handler_admin_user.go +++ b/src/server/handler_admin_user.go @@ -1,12 +1,12 @@ package server import ( + "chatplus/types" + "chatplus/utils" "encoding/json" "fmt" "github.com/gin-gonic/gin" "net/http" - "openai/types" - "openai/utils" "strings" ) diff --git a/server/handler_chat.go b/src/server/handler_chat.go similarity index 99% rename from server/handler_chat.go rename to src/server/handler_chat.go index 98ed1b97..a5708c3f 100644 --- a/server/handler_chat.go +++ b/src/server/handler_chat.go @@ -3,6 +3,8 @@ package server import ( "bufio" "bytes" + "chatplus/types" + "chatplus/utils" "context" "encoding/json" "errors" @@ -12,8 +14,6 @@ import ( "math/rand" "net/http" "net/url" - "openai/types" - "openai/utils" "strings" "time" ) diff --git a/server/handler_login.go b/src/server/handler_login.go similarity index 98% rename from server/handler_login.go rename to src/server/handler_login.go index 0c589df5..a1b5f636 100644 --- a/server/handler_login.go +++ b/src/server/handler_login.go @@ -1,12 +1,12 @@ package server import ( + "chatplus/types" + "chatplus/utils" "encoding/json" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "net/http" - "openai/types" - "openai/utils" "strings" "time" ) diff --git a/server/server.go b/src/server/server.go similarity index 99% rename from server/server.go rename to src/server/server.go index 9a31b73b..46f6adcd 100644 --- a/server/server.go +++ b/src/server/server.go @@ -1,6 +1,9 @@ package server import ( + logger2 "chatplus/logger" + "chatplus/types" + "chatplus/utils" "context" "embed" "github.com/gin-contrib/sessions" @@ -9,9 +12,6 @@ import ( "io" "io/fs" "net/http" - logger2 "openai/logger" - "openai/types" - "openai/utils" "os" "path/filepath" "runtime/debug" diff --git a/test/test.go b/src/test/test.go similarity index 100% rename from test/test.go rename to src/test/test.go diff --git a/types/chat.go b/src/types/chat.go similarity index 100% rename from types/chat.go rename to src/types/chat.go diff --git a/types/config.go b/src/types/config.go similarity index 100% rename from types/config.go rename to src/types/config.go diff --git a/types/web.go b/src/types/web.go similarity index 100% rename from types/web.go rename to src/types/web.go diff --git a/utils/config.go b/src/utils/config.go similarity index 97% rename from utils/config.go rename to src/utils/config.go index c3011c57..b365b889 100644 --- a/utils/config.go +++ b/src/utils/config.go @@ -2,10 +2,10 @@ package utils import ( "bytes" + logger2 "chatplus/logger" + "chatplus/types" "github.com/BurntSushi/toml" "net/http" - logger2 "openai/logger" - "openai/types" "os" ) diff --git a/utils/leveldb.go b/src/utils/leveldb.go similarity index 100% rename from utils/leveldb.go rename to src/utils/leveldb.go diff --git a/utils/utils.go b/src/utils/utils.go similarity index 100% rename from utils/utils.go rename to src/utils/utils.go diff --git a/web/src/views/admin/RoleList.vue b/web/src/views/admin/RoleList.vue index 153f0e1a..40ff1d04 100644 --- a/web/src/views/admin/RoleList.vue +++ b/web/src/views/admin/RoleList.vue @@ -45,7 +45,7 @@ diff --git a/web/vue.config.js b/web/vue.config.js index e1c6318a..0c0fc728 100644 --- a/web/vue.config.js +++ b/web/vue.config.js @@ -1,9 +1,5 @@ const {defineConfig} = require('@vue/cli-service') let webpack = require('webpack') -// const fs = require('fs') -// const path = require('path') -// const os = require('os') - module.exports = defineConfig({ transpileDependencies: true, configureWebpack: { @@ -17,7 +13,7 @@ module.exports = defineConfig({ }, publicPath: '/chat', - outputDir: '../dist', + outputDir: '../src/dist', crossorigin: "anonymous", devServer: { allowedHosts: ['127.0.0.1:5678'],