mirror of
				https://github.com/yangjian102621/geekai.git
				synced 2025-10-31 22:33:47 +08:00 
			
		
		
		
	Compare commits
	
		
			7 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | db6ed84451 | ||
|  | 4463cc5963 | ||
|  | d316158fe2 | ||
|  | e02a8d7586 | ||
|  | 9988dff885 | ||
|  | 35ef5674ff | ||
|  | 976da45bce | 
| @@ -10,6 +10,8 @@ | ||||
| * Bug修复:对话输入HTML标签不显示的问题 | ||||
| * 功能优化:gpt-4-all/gpts/midjourney-plus 支持第三方平台的 API KEY | ||||
| * 功能新增:新增删除文件功能 | ||||
| * Bug修复:解决 MJ-Plus discord 图片下载失败问题,使用第三方平台中转地址下载 | ||||
| * 功能新增:后台管理新怎对话查看和检索功能 | ||||
|  | ||||
| ## v3.2.6 | ||||
| * 功能优化:恢复关闭注册系统配置项,管理员可以在后台关闭用户注册,只允许内部添加账号 | ||||
|   | ||||
| @@ -46,7 +46,7 @@ WeChatBot = false | ||||
|    Active = "local" # 默认使用本地文件存储引擎 | ||||
|    [OSS.Local] | ||||
|      BasePath = "./static/upload" # 本地文件上传根路径 | ||||
|      BaseURL = "http://localhost:5678/static/upload" # 本地上传文件根 URL 如果是线上,则直接设置为 /static/upload 即可 | ||||
|      BaseURL = "/static/upload" # 本地上传文件根 URL 如果是线上,则直接设置为 /static/upload 即可 | ||||
|    [OSS.Minio] | ||||
|      Endpoint = "" # 如 172.22.11.200:9000 | ||||
|      AccessKey = "" # 自己去 Minio 控制台去创建一个 Access Key | ||||
| @@ -68,14 +68,15 @@ WeChatBot = false | ||||
|   GuildId = "" | ||||
|   ChanelId = "" | ||||
|   UseCDN = false #是否使用反向代理访问,设置为true下面的设置才会生效 | ||||
|   DiscordAPI = "https://mj.r9it.com:8001" # discord API 反代地址 | ||||
|   DiscordCDN = "https://mj.r9it.com:8002" # mj 图片反代地址 | ||||
|   DiscordGateway = "wss://mj.r9it.com:8003" # discord 机器人反代地址 | ||||
|   DiscordAPI = "" # discord API 反代地址 | ||||
|   DiscordCDN = "" # mj 图片反代地址 | ||||
|   DiscordGateway = "" # discord 机器人反代地址 | ||||
|  | ||||
| [[MjPlusConfigs]] | ||||
|   Enabled = false | ||||
|   ApiURL = "https://api.chatgpt-plus.net" # 目前暂时不支持更改 | ||||
|   CdnURL = "" # CND 加速的 URL,如果有的话就设置 | ||||
|   Mode = "fast" # MJ 绘画模式,可选值 relax/fast/turbo | ||||
|   ApiKey = "sk-xxx" | ||||
|   NotifyURL = "https://ai.r9it.com/api/mj/notify" # 这里需要改成你的域名 | ||||
|  | ||||
|   | ||||
| @@ -65,6 +65,7 @@ type StableDiffusionConfig struct { | ||||
| type MidJourneyPlusConfig struct { | ||||
| 	Enabled   bool   // 如果启用了 MidJourney Plus,将会自动禁用原生的MidJourney服务 | ||||
| 	ApiURL    string // api 地址 | ||||
| 	Mode      string // 绘画模式,可选值:fast/turbo/relax | ||||
| 	CdnURL    string // CDN 加速地址 | ||||
| 	ApiKey    string | ||||
| 	NotifyURL string // 任务进度更新回调地址 | ||||
|   | ||||
							
								
								
									
										244
									
								
								api/handler/admin/chat_handler.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								api/handler/admin/chat_handler.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,244 @@ | ||||
| package admin | ||||
|  | ||||
| import ( | ||||
| 	"chatplus/core" | ||||
| 	"chatplus/core/types" | ||||
| 	"chatplus/handler" | ||||
| 	"chatplus/store/model" | ||||
| 	"chatplus/store/vo" | ||||
| 	"chatplus/utils" | ||||
| 	"chatplus/utils/resp" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"gorm.io/gorm" | ||||
| ) | ||||
|  | ||||
| type ChatHandler struct { | ||||
| 	handler.BaseHandler | ||||
| 	db *gorm.DB | ||||
| } | ||||
|  | ||||
| func NewChatHandler(app *core.AppServer, db *gorm.DB) *ChatHandler { | ||||
| 	h := ChatHandler{db: db} | ||||
| 	h.App = app | ||||
| 	return &h | ||||
| } | ||||
|  | ||||
| type chatItemVo struct { | ||||
| 	Username  string `json:"username"` | ||||
| 	UserId    uint   `json:"user_id"` | ||||
| 	ChatId    string `json:"chat_id"` | ||||
| 	Title     string `json:"title"` | ||||
| 	Model     string `json:"model"` | ||||
| 	Token     int    `json:"token"` | ||||
| 	CreatedAt int64  `json:"created_at"` | ||||
| 	MsgNum    int    `json:"msg_num"` // 消息数量 | ||||
| } | ||||
|  | ||||
| func (h *ChatHandler) List(c *gin.Context) { | ||||
| 	var data struct { | ||||
| 		Title    string   `json:"title"` | ||||
| 		UserId   uint     `json:"user_id"` | ||||
| 		Model    string   `json:"model"` | ||||
| 		CreateAt []string `json:"created_time"` | ||||
| 		Page     int      `json:"page"` | ||||
| 		PageSize int      `json:"page_size"` | ||||
| 	} | ||||
| 	if err := c.ShouldBindJSON(&data); err != nil { | ||||
| 		resp.ERROR(c, types.InvalidArgs) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	session := h.db.Session(&gorm.Session{}) | ||||
| 	if data.Title != "" { | ||||
| 		session = session.Where("title LIKE ?", "%"+data.Title+"%") | ||||
| 	} | ||||
| 	if data.UserId > 0 { | ||||
| 		session = session.Where("user_id = ?", data.UserId) | ||||
| 	} | ||||
| 	if data.Model != "" { | ||||
| 		session = session.Where("model = ?", data.Model) | ||||
| 	} | ||||
| 	if len(data.CreateAt) == 2 { | ||||
| 		start := utils.Str2stamp(data.CreateAt[0] + " 00:00:00") | ||||
| 		end := utils.Str2stamp(data.CreateAt[1] + " 00:00:00") | ||||
| 		session = session.Where("created_at >= ? AND created_at <= ?", start, end) | ||||
| 	} | ||||
|  | ||||
| 	var total int64 | ||||
| 	session.Model(&model.ChatItem{}).Count(&total) | ||||
| 	var items []model.ChatItem | ||||
| 	var list = make([]chatItemVo, 0) | ||||
| 	offset := (data.Page - 1) * data.PageSize | ||||
| 	res := session.Order("id DESC").Offset(offset).Limit(data.PageSize).Find(&items) | ||||
| 	if res.Error == nil { | ||||
| 		userIds := make([]uint, 0) | ||||
| 		chatIds := make([]string, 0) | ||||
| 		for _, item := range items { | ||||
| 			userIds = append(userIds, item.UserId) | ||||
| 			chatIds = append(chatIds, item.ChatId) | ||||
| 		} | ||||
| 		var messages []model.ChatMessage | ||||
| 		var users []model.User | ||||
| 		h.db.Where("chat_id IN ?", chatIds).Find(&messages) | ||||
| 		h.db.Where("id IN ?", userIds).Find(&users) | ||||
|  | ||||
| 		tokenMap := make(map[string]int) | ||||
| 		userMap := make(map[uint]string) | ||||
| 		msgMap := make(map[string]int) | ||||
| 		for _, msg := range messages { | ||||
| 			tokenMap[msg.ChatId] += msg.Tokens | ||||
| 			msgMap[msg.ChatId] += 1 | ||||
| 		} | ||||
| 		for _, user := range users { | ||||
| 			userMap[user.Id] = user.Username | ||||
| 		} | ||||
| 		for _, item := range items { | ||||
| 			list = append(list, chatItemVo{ | ||||
| 				UserId:    item.UserId, | ||||
| 				Username:  userMap[item.UserId], | ||||
| 				ChatId:    item.ChatId, | ||||
| 				Title:     item.Title, | ||||
| 				Model:     item.Model, | ||||
| 				Token:     tokenMap[item.ChatId], | ||||
| 				MsgNum:    msgMap[item.ChatId], | ||||
| 				CreatedAt: item.CreatedAt.Unix(), | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
| 	resp.SUCCESS(c, vo.NewPage(total, data.Page, data.PageSize, list)) | ||||
| } | ||||
|  | ||||
| type chatMessageVo struct { | ||||
| 	Id        uint   `json:"id"` | ||||
| 	UserId    uint   `json:"user_id"` | ||||
| 	Username  string `json:"username"` | ||||
| 	Content   string `json:"content"` | ||||
| 	Type      string `json:"type"` | ||||
| 	Model     string `json:"model"` | ||||
| 	Token     int    `json:"token"` | ||||
| 	Icon      string `json:"icon"` | ||||
| 	CreatedAt int64  `json:"created_at"` | ||||
| } | ||||
|  | ||||
| // Messages 读取聊天记录列表 | ||||
| func (h *ChatHandler) Messages(c *gin.Context) { | ||||
| 	var data struct { | ||||
| 		UserId   uint     `json:"user_id"` | ||||
| 		Content  string   `json:"content"` | ||||
| 		Model    string   `json:"model"` | ||||
| 		CreateAt []string `json:"created_time"` | ||||
| 		Page     int      `json:"page"` | ||||
| 		PageSize int      `json:"page_size"` | ||||
| 	} | ||||
| 	if err := c.ShouldBindJSON(&data); err != nil { | ||||
| 		resp.ERROR(c, types.InvalidArgs) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	session := h.db.Session(&gorm.Session{}) | ||||
| 	if data.Content != "" { | ||||
| 		session = session.Where("content LIKE ?", "%"+data.Content+"%") | ||||
| 	} | ||||
| 	if data.UserId > 0 { | ||||
| 		session = session.Where("user_id = ?", data.UserId) | ||||
| 	} | ||||
| 	if data.Model != "" { | ||||
| 		session = session.Where("model = ?", data.Model) | ||||
| 	} | ||||
| 	if len(data.CreateAt) == 2 { | ||||
| 		start := utils.Str2stamp(data.CreateAt[0] + " 00:00:00") | ||||
| 		end := utils.Str2stamp(data.CreateAt[1] + " 00:00:00") | ||||
| 		session = session.Where("created_at >= ? AND created_at <= ?", start, end) | ||||
| 	} | ||||
|  | ||||
| 	var total int64 | ||||
| 	session.Model(&model.ChatMessage{}).Count(&total) | ||||
| 	var items []model.ChatMessage | ||||
| 	var list = make([]chatMessageVo, 0) | ||||
| 	offset := (data.Page - 1) * data.PageSize | ||||
| 	res := session.Order("id DESC").Offset(offset).Limit(data.PageSize).Find(&items) | ||||
| 	if res.Error == nil { | ||||
| 		userIds := make([]uint, 0) | ||||
| 		for _, item := range items { | ||||
| 			userIds = append(userIds, item.UserId) | ||||
| 		} | ||||
| 		var users []model.User | ||||
| 		h.db.Where("id IN ?", userIds).Find(&users) | ||||
| 		userMap := make(map[uint]string) | ||||
| 		for _, user := range users { | ||||
| 			userMap[user.Id] = user.Username | ||||
| 		} | ||||
| 		for _, item := range items { | ||||
| 			list = append(list, chatMessageVo{ | ||||
| 				Id:        item.Id, | ||||
| 				UserId:    item.UserId, | ||||
| 				Username:  userMap[item.UserId], | ||||
| 				Content:   item.Content, | ||||
| 				Model:     item.Model, | ||||
| 				Token:     item.Tokens, | ||||
| 				Icon:      item.Icon, | ||||
| 				Type:      item.Type, | ||||
| 				CreatedAt: item.CreatedAt.Unix(), | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
| 	resp.SUCCESS(c, vo.NewPage(total, data.Page, data.PageSize, list)) | ||||
| } | ||||
|  | ||||
| // History 获取聊天历史记录 | ||||
| func (h *ChatHandler) History(c *gin.Context) { | ||||
| 	chatId := c.Query("chat_id") // 会话 ID | ||||
| 	var items []model.ChatMessage | ||||
| 	var messages = make([]vo.HistoryMessage, 0) | ||||
| 	res := h.db.Where("chat_id = ?", chatId).Find(&items) | ||||
| 	if res.Error != nil { | ||||
| 		resp.ERROR(c, "No history message") | ||||
| 		return | ||||
| 	} else { | ||||
| 		for _, item := range items { | ||||
| 			var v vo.HistoryMessage | ||||
| 			err := utils.CopyObject(item, &v) | ||||
| 			v.CreatedAt = item.CreatedAt.Unix() | ||||
| 			v.UpdatedAt = item.UpdatedAt.Unix() | ||||
| 			if err == nil { | ||||
| 				messages = append(messages, v) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	resp.SUCCESS(c, messages) | ||||
| } | ||||
|  | ||||
| // RemoveChat 删除对话 | ||||
| func (h *ChatHandler) RemoveChat(c *gin.Context) { | ||||
| 	chatId := h.GetTrim(c, "chat_id") | ||||
| 	tx := h.db.Begin() | ||||
| 	// 删除聊天记录 | ||||
| 	res := tx.Unscoped().Where("chat_id = ?", chatId).Delete(&model.ChatMessage{}) | ||||
| 	if res.Error != nil { | ||||
| 		resp.ERROR(c, "failed to remove chat message") | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// 删除对话 | ||||
| 	res = tx.Unscoped().Where("chat_id = ?", chatId).Delete(model.ChatItem{}) | ||||
| 	if res.Error != nil { | ||||
| 		tx.Rollback() // 回滚 | ||||
| 		resp.ERROR(c, "failed to remove chat") | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	tx.Commit() | ||||
| 	resp.SUCCESS(c) | ||||
| } | ||||
|  | ||||
| // RemoveMessage 删除聊天记录 | ||||
| func (h *ChatHandler) RemoveMessage(c *gin.Context) { | ||||
| 	id := h.GetInt(c, "id", 0) | ||||
| 	tx := h.db.Unscoped().Delete(&model.ChatMessage{}, id) | ||||
| 	if tx.Error != nil { | ||||
| 		resp.ERROR(c, "更新数据库失败!") | ||||
| 		return | ||||
| 	} | ||||
| 	resp.SUCCESS(c) | ||||
| } | ||||
| @@ -48,7 +48,7 @@ func (h *DashboardHandler) Stats(c *gin.Context) { | ||||
| 	} | ||||
|  | ||||
| 	// tokens took stats | ||||
| 	var historyMessages []model.HistoryMessage | ||||
| 	var historyMessages []model.ChatMessage | ||||
| 	res = h.db.Where("created_at > ?", zeroTime).Find(&historyMessages) | ||||
| 	for _, item := range historyMessages { | ||||
| 		stats.Tokens += item.Tokens | ||||
|   | ||||
| @@ -176,7 +176,7 @@ func (h *UserHandler) Remove(c *gin.Context) { | ||||
| 			return | ||||
| 		} | ||||
| 		// 删除聊天历史记录 | ||||
| 		res = h.db.Where("user_id = ?", id).Delete(&model.HistoryMessage{}) | ||||
| 		res = h.db.Where("user_id = ?", id).Delete(&model.ChatMessage{}) | ||||
| 		if res.Error != nil { | ||||
| 			tx.Rollback() | ||||
| 			resp.ERROR(c, "删除失败") | ||||
|   | ||||
| @@ -126,7 +126,7 @@ func (h *ChatHandler) sendAzureMessage( | ||||
| 				if err != nil { | ||||
| 					logger.Error(err) | ||||
| 				} | ||||
| 				historyUserMsg := model.HistoryMessage{ | ||||
| 				historyUserMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
| @@ -148,7 +148,7 @@ func (h *ChatHandler) sendAzureMessage( | ||||
| 				totalTokens, _ := utils.CalcTokens(message.Content, req.Model) | ||||
| 				totalTokens += getTotalTokens(req) | ||||
|  | ||||
| 				historyReplyMsg := model.HistoryMessage{ | ||||
| 				historyReplyMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
|   | ||||
| @@ -151,7 +151,7 @@ func (h *ChatHandler) sendBaiduMessage( | ||||
| 				if err != nil { | ||||
| 					logger.Error(err) | ||||
| 				} | ||||
| 				historyUserMsg := model.HistoryMessage{ | ||||
| 				historyUserMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
| @@ -173,7 +173,7 @@ func (h *ChatHandler) sendBaiduMessage( | ||||
| 				// 计算本次对话消耗的总 token 数量 | ||||
| 				replyToken, _ := utils.CalcTokens(message.Content, req.Model) | ||||
| 				totalTokens := replyToken + getTotalTokens(req) | ||||
| 				historyReplyMsg := model.HistoryMessage{ | ||||
| 				historyReplyMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import ( | ||||
| 	"chatplus/core/types" | ||||
| 	"chatplus/handler" | ||||
| 	logger2 "chatplus/logger" | ||||
| 	"chatplus/service/oss" | ||||
| 	"chatplus/store/model" | ||||
| 	"chatplus/store/vo" | ||||
| 	"chatplus/utils" | ||||
| @@ -16,6 +17,7 @@ import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| @@ -33,14 +35,16 @@ var logger = logger2.GetLogger() | ||||
|  | ||||
| type ChatHandler struct { | ||||
| 	handler.BaseHandler | ||||
| 	db    *gorm.DB | ||||
| 	redis *redis.Client | ||||
| 	db            *gorm.DB | ||||
| 	redis         *redis.Client | ||||
| 	uploadManager *oss.UploaderManager | ||||
| } | ||||
|  | ||||
| func NewChatHandler(app *core.AppServer, db *gorm.DB, redis *redis.Client) *ChatHandler { | ||||
| func NewChatHandler(app *core.AppServer, db *gorm.DB, redis *redis.Client, manager *oss.UploaderManager) *ChatHandler { | ||||
| 	h := ChatHandler{ | ||||
| 		db:    db, | ||||
| 		redis: redis, | ||||
| 		db:            db, | ||||
| 		redis:         redis, | ||||
| 		uploadManager: manager, | ||||
| 	} | ||||
| 	h.App = app | ||||
| 	return &h | ||||
| @@ -321,7 +325,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | ||||
|  | ||||
| 			// loading recent chat history as chat context | ||||
| 			if chatConfig.ContextDeep > 0 { | ||||
| 				var historyMessages []model.HistoryMessage | ||||
| 				var historyMessages []model.ChatMessage | ||||
| 				res := h.db.Debug().Where("chat_id = ? and use_context = 1", session.ChatId).Limit(chatConfig.ContextDeep).Order("id desc").Find(&historyMessages) | ||||
| 				if res.Error == nil { | ||||
| 					for i := len(historyMessages) - 1; i >= 0; i-- { | ||||
| @@ -386,7 +390,7 @@ func (h *ChatHandler) Tokens(c *gin.Context) { | ||||
|  | ||||
| 	// 如果没有传入 text 字段,则说明是获取当前 reply 总的 token 消耗(带上下文) | ||||
| 	if data.Text == "" && data.ChatId != "" { | ||||
| 		var item model.HistoryMessage | ||||
| 		var item model.ChatMessage | ||||
| 		userId, _ := c.Get(types.LoginUserID) | ||||
| 		res := h.db.Where("user_id = ?", userId).Where("chat_id = ?", data.ChatId).Last(&item) | ||||
| 		if res.Error != nil { | ||||
| @@ -503,7 +507,7 @@ func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, platf | ||||
| 	} else { | ||||
| 		client = http.DefaultClient | ||||
| 	} | ||||
| 	logger.Debugf("Sending %s request, ApiURL:%s, Password:%s, PROXY: %s, Model: %s", platform, apiURL, apiKey.Value, proxyURL, req.Model) | ||||
| 	logger.Debugf("Sending %s request, ApiURL:%s, API KEY:%s, PROXY: %s, Model: %s", platform, apiURL, apiKey.Value, proxyURL, req.Model) | ||||
| 	switch platform { | ||||
| 	case types.Azure: | ||||
| 		request.Header.Set("api-key", apiKey.Value) | ||||
| @@ -546,3 +550,29 @@ func (h *ChatHandler) incUserTokenFee(userId uint, tokens int) { | ||||
| 	h.db.Model(&model.User{}).Where("id = ?", userId). | ||||
| 		UpdateColumn("tokens", gorm.Expr("tokens + ?", tokens)) | ||||
| } | ||||
|  | ||||
| // 将AI回复消息中生成的图片链接下载到本地 | ||||
| func (h *ChatHandler) extractImgUrl(text string) string { | ||||
| 	pattern := `!\[([^\]]*)]\(([^)]+)\)` | ||||
| 	re := regexp.MustCompile(pattern) | ||||
| 	matches := re.FindAllStringSubmatch(text, -1) | ||||
|  | ||||
| 	// 下载图片并替换链接地址 | ||||
| 	for _, match := range matches { | ||||
| 		imageURL := match[2] | ||||
| 		logger.Debug(imageURL) | ||||
| 		// 对于相同地址的图片,已经被替换了,就不再重复下载了 | ||||
| 		if !strings.Contains(text, imageURL) { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		newImgURL, err := h.uploadManager.GetUploadHandler().PutImg(imageURL, false) | ||||
| 		if err != nil { | ||||
| 			logger.Error("error with download image: ", err) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		text = strings.ReplaceAll(text, imageURL, newImgURL) | ||||
| 	} | ||||
| 	return text | ||||
| } | ||||
|   | ||||
| @@ -95,7 +95,7 @@ func (h *ChatHandler) Clear(c *gin.Context) { | ||||
| 			return res.Error | ||||
| 		} | ||||
|  | ||||
| 		res = h.db.Where("user_id = ? AND chat_id IN ?", user.Id, chatIds).Delete(&model.HistoryMessage{}) | ||||
| 		res = h.db.Where("user_id = ? AND chat_id IN ?", user.Id, chatIds).Delete(&model.ChatMessage{}) | ||||
| 		if res.Error != nil { | ||||
| 			return res.Error | ||||
| 		} | ||||
| @@ -116,7 +116,7 @@ func (h *ChatHandler) Clear(c *gin.Context) { | ||||
| // History 获取聊天历史记录 | ||||
| func (h *ChatHandler) History(c *gin.Context) { | ||||
| 	chatId := c.Query("chat_id") // 会话 ID | ||||
| 	var items []model.HistoryMessage | ||||
| 	var items []model.ChatMessage | ||||
| 	var messages = make([]vo.HistoryMessage, 0) | ||||
| 	res := h.db.Where("chat_id = ?", chatId).Find(&items) | ||||
| 	if res.Error != nil { | ||||
|   | ||||
| @@ -130,7 +130,7 @@ func (h *ChatHandler) sendChatGLMMessage( | ||||
| 				if err != nil { | ||||
| 					logger.Error(err) | ||||
| 				} | ||||
| 				historyUserMsg := model.HistoryMessage{ | ||||
| 				historyUserMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
| @@ -152,7 +152,7 @@ func (h *ChatHandler) sendChatGLMMessage( | ||||
| 				// 计算本次对话消耗的总 token 数量 | ||||
| 				replyToken, _ := utils.CalcTokens(message.Content, req.Model) | ||||
| 				totalTokens := replyToken + getTotalTokens(req) | ||||
| 				historyReplyMsg := model.HistoryMessage{ | ||||
| 				historyReplyMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
|   | ||||
| @@ -46,6 +46,8 @@ func (h *ChatHandler) sendOpenAiMessage( | ||||
|  | ||||
| 		utils.ReplyMessage(ws, ErrorMsg) | ||||
| 		utils.ReplyMessage(ws, ErrImg) | ||||
| 		all, _ := io.ReadAll(response.Body) | ||||
| 		logger.Error(string(all)) | ||||
| 		return err | ||||
| 	} else { | ||||
| 		defer response.Body.Close() | ||||
| @@ -197,7 +199,7 @@ func (h *ChatHandler) sendOpenAiMessage( | ||||
| 				if err != nil { | ||||
| 					logger.Error(err) | ||||
| 				} | ||||
| 				historyUserMsg := model.HistoryMessage{ | ||||
| 				historyUserMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
| @@ -227,13 +229,13 @@ func (h *ChatHandler) sendOpenAiMessage( | ||||
| 				} | ||||
| 				totalTokens += getTotalTokens(req) | ||||
|  | ||||
| 				historyReplyMsg := model.HistoryMessage{ | ||||
| 				historyReplyMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
| 					Type:       types.ReplyMsg, | ||||
| 					Icon:       role.Icon, | ||||
| 					Content:    message.Content, | ||||
| 					Content:    h.extractImgUrl(message.Content), | ||||
| 					Tokens:     totalTokens, | ||||
| 					UseContext: useContext, | ||||
| 					Model:      req.Model, | ||||
|   | ||||
| @@ -151,7 +151,7 @@ func (h *ChatHandler) sendQWenMessage( | ||||
| 				if err != nil { | ||||
| 					logger.Error(err) | ||||
| 				} | ||||
| 				historyUserMsg := model.HistoryMessage{ | ||||
| 				historyUserMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
| @@ -173,7 +173,7 @@ func (h *ChatHandler) sendQWenMessage( | ||||
| 				// 计算本次对话消耗的总 token 数量 | ||||
| 				replyToken, _ := utils.CalcTokens(message.Content, req.Model) | ||||
| 				totalTokens := replyToken + getTotalTokens(req) | ||||
| 				historyReplyMsg := model.HistoryMessage{ | ||||
| 				historyReplyMsg := model.ChatMessage{ | ||||
| 					UserId:     userVo.Id, | ||||
| 					ChatId:     session.ChatId, | ||||
| 					RoleId:     role.Id, | ||||
|   | ||||
| @@ -189,7 +189,7 @@ func (h *ChatHandler) sendXunFeiMessage( | ||||
| 			if err != nil { | ||||
| 				logger.Error(err) | ||||
| 			} | ||||
| 			historyUserMsg := model.HistoryMessage{ | ||||
| 			historyUserMsg := model.ChatMessage{ | ||||
| 				UserId:     userVo.Id, | ||||
| 				ChatId:     session.ChatId, | ||||
| 				RoleId:     role.Id, | ||||
| @@ -211,7 +211,7 @@ func (h *ChatHandler) sendXunFeiMessage( | ||||
| 			// 计算本次对话消耗的总 token 数量 | ||||
| 			replyToken, _ := utils.CalcTokens(message.Content, req.Model) | ||||
| 			totalTokens := replyToken + getTotalTokens(req) | ||||
| 			historyReplyMsg := model.HistoryMessage{ | ||||
| 			historyReplyMsg := model.ChatMessage{ | ||||
| 				UserId:     userVo.Id, | ||||
| 				ChatId:     session.ChatId, | ||||
| 				RoleId:     role.Id, | ||||
|   | ||||
| @@ -247,7 +247,7 @@ func (h *FunctionHandler) Dall3(c *gin.Context) { | ||||
| 	} else { | ||||
| 		request = req.C().R() | ||||
| 	} | ||||
| 	logger.Debugf("Sending %s request, ApiURL:%s, Password:%s, PROXY: %s", apiKey.Platform, apiKey.ApiURL, apiKey.Value, h.proxyURL) | ||||
| 	logger.Debugf("Sending %s request, ApiURL:%s, API KEY:%s, PROXY: %s", apiKey.Platform, apiKey.ApiURL, apiKey.Value, h.proxyURL) | ||||
| 	r, err := request.SetHeader("Content-Type", "application/json"). | ||||
| 		SetHeader("Authorization", "Bearer "+apiKey.Value). | ||||
| 		SetBody(imgReq{ | ||||
| @@ -264,6 +264,7 @@ func (h *FunctionHandler) Dall3(c *gin.Context) { | ||||
| 	} | ||||
| 	// 更新 API KEY 的最后使用时间 | ||||
| 	h.db.Model(&apiKey).UpdateColumn("last_used_at", time.Now().Unix()) | ||||
| 	logger.Debugf("%+v", res) | ||||
| 	// 存储图片 | ||||
| 	imgURL, err := h.uploadManager.GetUploadHandler().PutImg(res.Data[0].Url, false) | ||||
| 	if err != nil { | ||||
|   | ||||
							
								
								
									
										10
									
								
								api/main.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								api/main.go
									
									
									
									
									
								
							| @@ -136,6 +136,7 @@ func main() { | ||||
| 		fx.Provide(admin.NewChatModelHandler), | ||||
| 		fx.Provide(admin.NewProductHandler), | ||||
| 		fx.Provide(admin.NewOrderHandler), | ||||
| 		fx.Provide(admin.NewChatHandler), | ||||
|  | ||||
| 		// 创建服务 | ||||
| 		fx.Provide(sms.NewSendServiceManager), | ||||
| @@ -372,7 +373,14 @@ func main() { | ||||
| 			group.POST("zaobao", h.ZaoBao) | ||||
| 			group.POST("dalle3", h.Dall3) | ||||
| 		}), | ||||
|  | ||||
| 		fx.Invoke(func(s *core.AppServer, h *admin.ChatHandler) { | ||||
| 			group := s.Engine.Group("/api/admin/chat/") | ||||
| 			group.POST("list", h.List) | ||||
| 			group.POST("message", h.Messages) | ||||
| 			group.GET("history", h.History) | ||||
| 			group.GET("remove", h.RemoveChat) | ||||
| 			group.GET("message/remove", h.RemoveMessage) | ||||
| 		}), | ||||
| 		fx.Provide(handler.NewTestHandler), | ||||
| 		fx.Invoke(func(s *core.AppServer, h *handler.TestHandler) { | ||||
| 			s.Engine.GET("/api/test", h.Test) | ||||
|   | ||||
| @@ -7,11 +7,10 @@ import ( | ||||
| 	"encoding/base64" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"github.com/imroc/req/v3" | ||||
| 	"io" | ||||
|  | ||||
| 	"github.com/gin-gonic/gin" | ||||
|  | ||||
| 	"github.com/imroc/req/v3" | ||||
| ) | ||||
|  | ||||
| var logger = logger2.GetLogger() | ||||
| @@ -29,6 +28,9 @@ func NewClient(config types.MidJourneyPlusConfig) *Client { | ||||
| 	} else { | ||||
| 		apiURL = config.ApiURL | ||||
| 	} | ||||
| 	if config.Mode == "" { | ||||
| 		config.Mode = "fast" | ||||
| 	} | ||||
| 	return &Client{Config: config, apiURL: apiURL} | ||||
| } | ||||
|  | ||||
| @@ -62,7 +64,7 @@ type ErrRes struct { | ||||
| } | ||||
|  | ||||
| func (c *Client) Imagine(task types.MjTask) (ImageRes, error) { | ||||
| 	apiURL := fmt.Sprintf("%s/mj-fast/mj/submit/imagine", c.apiURL) | ||||
| 	apiURL := fmt.Sprintf("%s/mj-%s/mj/submit/imagine", c.apiURL, c.Config.Mode) | ||||
| 	body := ImageReq{ | ||||
| 		BotType:     "MID_JOURNEY", | ||||
| 		Prompt:      task.Prompt, | ||||
| @@ -88,6 +90,8 @@ func (c *Client) Imagine(task types.MjTask) (ImageRes, error) { | ||||
| 		SetErrorResult(&errRes). | ||||
| 		Post(apiURL) | ||||
| 	if err != nil { | ||||
| 		errStr, _ := io.ReadAll(r.Body) | ||||
| 		logger.Errorf("API 返回:%s, API URL: %s", string(errStr), apiURL) | ||||
| 		return ImageRes{}, fmt.Errorf("请求 API 出错:%v", err) | ||||
| 	} | ||||
|  | ||||
| @@ -101,7 +105,7 @@ func (c *Client) Imagine(task types.MjTask) (ImageRes, error) { | ||||
|  | ||||
| // Blend 融图 | ||||
| func (c *Client) Blend(task types.MjTask) (ImageRes, error) { | ||||
| 	apiURL := fmt.Sprintf("%s/mj-fast/mj/submit/blend", c.apiURL) | ||||
| 	apiURL := fmt.Sprintf("%s/mj-%s/mj/submit/blend", c.apiURL, c.Config.Mode) | ||||
| 	body := ImageReq{ | ||||
| 		BotType:     "MID_JOURNEY", | ||||
| 		Dimensions:  "SQUARE", | ||||
| @@ -141,7 +145,7 @@ func (c *Client) Blend(task types.MjTask) (ImageRes, error) { | ||||
|  | ||||
| // SwapFace 换脸 | ||||
| func (c *Client) SwapFace(task types.MjTask) (ImageRes, error) { | ||||
| 	apiURL := fmt.Sprintf("%s/mj-fast/mj/insight-face/swap", c.apiURL) | ||||
| 	apiURL := fmt.Sprintf("%s/mj-%s/mj/insight-face/swap", c.apiURL, c.Config.Mode) | ||||
| 	// 生成图片 Base64 编码 | ||||
| 	if len(task.ImgArr) != 2 { | ||||
| 		return ImageRes{}, errors.New("参数错误,必须上传2张图片") | ||||
|   | ||||
| @@ -14,7 +14,7 @@ var logger = logger2.GetLogger() | ||||
|  | ||||
| func NewSendServiceManager(config *types.AppConfig) (*ServiceManager, error) { | ||||
| 	active := Ali | ||||
| 	if config.OSS.Active != "" { | ||||
| 	if config.SMS.Active != "" { | ||||
| 		active = strings.ToUpper(config.SMS.Active) | ||||
| 	} | ||||
| 	var handler Service | ||||
|   | ||||
| @@ -2,7 +2,7 @@ package model | ||||
|  | ||||
| import "gorm.io/gorm" | ||||
|  | ||||
| type HistoryMessage struct { | ||||
| type ChatMessage struct { | ||||
| 	BaseModel | ||||
| 	ChatId     string // 会话 ID | ||||
| 	UserId     uint   // 用户 ID | ||||
| @@ -16,6 +16,6 @@ type HistoryMessage struct { | ||||
| 	DeletedAt  gorm.DeletedAt | ||||
| } | ||||
|  | ||||
| func (HistoryMessage) TableName() string { | ||||
| func (ChatMessage) TableName() string { | ||||
| 	return "chatgpt_chat_history" | ||||
| } | ||||
|   | ||||
| @@ -2,10 +2,48 @@ package main | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"regexp" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	u, err := url.Parse("https://api.chat-plus.net/mj/image/1706368258238514?aaa=bbb") | ||||
| 	fmt.Println(u.Path, u.RawQuery, err) | ||||
| 	text := ` | ||||
| > search("Shenzhen weather January 15, 2024")  | ||||
|  | ||||
| > mclick([0, 9, 16])  | ||||
|  | ||||
| > **end-searching** | ||||
|  | ||||
| 今天深圳的天气情况如下: | ||||
|  | ||||
| - 白天气温预计在21°C至24°C之间,天气晴朗。 | ||||
| - 晚上气温预计在21°C左右,云量较多,可能会有间断性小雨。 | ||||
| - 风向主要是东南风,风速大约在6至12公里每小时之间。 | ||||
|  | ||||
| 这些信息表明深圳今天的天气相对舒适,适合户外活动。晚上可能需要带伞以应对间断性小雨。温度较为宜人,早晚可能稍微凉爽一些【[Shenzhen weather in January 2024 | Shenzhen 14 day weather](https://www.weather25.com/asia/china/guangdong/shenzhen?page=month&month=January)】【[Hourly forecast for Shenzhen, Guangdong, China](https://www.timeanddate.com/weather/china/shenzhen/hourly)】【[Shenzhen Guangdong China 15 Day Weather Forecast](https://www.weatheravenue.com/en/asia/cn/guangdong/shenzhen-weather-15-days.html)】。 | ||||
|  | ||||
| 我将根据这些信息生成一张气象图,展示深圳今天的天气情况。 | ||||
|  | ||||
| 	{"prompt":"A detailed weather map for Shenzhen, China, on January 15, 2024. The map shows a sunny day with clear skies during the day and partly cloudy skies at night. Temperatures range from 21\u00b0C to 24\u00b0C during the day and around 21\u00b0C at night. There are indications of light southeast winds during the day and evening, with wind speeds ranging from 6 to 12 km/h. The map includes symbols for sunshine, light clouds, and wind direction arrows, along with temperature readings for different times of the day. The layout is clear, with a focus on Shenzhen's geographical location and the surrounding region.","size":"1024x1024"} | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| And here is another image link: . | ||||
|  | ||||
|  | ||||
| 这是根据今天深圳的天气情况制作的气象图。图中展示了白天晴朗、夜间部分多云的天气,以及相关的温度和风向信息。` | ||||
| 	pattern := `!\[([^\]]*)]\(([^)]+)\)` | ||||
|  | ||||
| 	// 编译正则表达式 | ||||
| 	re := regexp.MustCompile(pattern) | ||||
|  | ||||
| 	// 查找匹配的字符串 | ||||
| 	matches := re.FindAllStringSubmatch(text, -1) | ||||
|  | ||||
| 	// 提取链接并打印 | ||||
| 	for _, match := range matches { | ||||
| 		fmt.Println(match[2]) | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| -- https://www.phpmyadmin.net/ | ||||
| -- | ||||
| -- 主机: localhost | ||||
| -- 生成日期: 2023-12-14 17:02:19 | ||||
| -- 生成日期: 2024-02-22 17:27:02 | ||||
| -- 服务器版本: 8.0.33-0ubuntu0.22.04.2 | ||||
| -- PHP 版本: 8.1.18 | ||||
| 
 | ||||
| @@ -33,9 +33,13 @@ DROP TABLE IF EXISTS `chatgpt_api_keys`; | ||||
| CREATE TABLE `chatgpt_api_keys` ( | ||||
|   `id` int NOT NULL, | ||||
|   `platform` char(20) DEFAULT NULL COMMENT '平台', | ||||
|   `name` varchar(30) DEFAULT NULL COMMENT '名称', | ||||
|   `value` varchar(100) NOT NULL COMMENT 'API KEY value', | ||||
|   `type` varchar(10) NOT NULL DEFAULT 'chat' COMMENT '用途(chat=>聊天,img=>图片)', | ||||
|   `last_used_at` int NOT NULL COMMENT '最后使用时间', | ||||
|   `api_url` varchar(255) DEFAULT NULL COMMENT 'API 地址', | ||||
|   `enabled` tinyint(1) DEFAULT NULL COMMENT '是否启用', | ||||
|   `use_proxy` tinyint(1) DEFAULT NULL COMMENT '是否使用代理访问', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='OpenAI API '; | ||||
| @@ -54,6 +58,7 @@ CREATE TABLE `chatgpt_chat_history` ( | ||||
|   `type` varchar(10) NOT NULL COMMENT '类型:prompt|reply', | ||||
|   `icon` varchar(100) NOT NULL COMMENT '角色图标', | ||||
|   `role_id` int NOT NULL COMMENT '角色 ID', | ||||
|   `model` varchar(30) DEFAULT NULL COMMENT '模型名称', | ||||
|   `content` text NOT NULL COMMENT '聊天内容', | ||||
|   `tokens` smallint NOT NULL COMMENT '耗费 token 数量', | ||||
|   `use_context` tinyint(1) NOT NULL COMMENT '是否允许作为上下文语料', | ||||
| @@ -76,6 +81,7 @@ CREATE TABLE `chatgpt_chat_items` ( | ||||
|   `role_id` int NOT NULL COMMENT '角色 ID', | ||||
|   `title` varchar(100) NOT NULL COMMENT '会话标题', | ||||
|   `model_id` int NOT NULL DEFAULT '0' COMMENT '模型 ID', | ||||
|   `model` varchar(30) DEFAULT NULL COMMENT '模型名称', | ||||
|   `created_at` datetime NOT NULL COMMENT '创建时间', | ||||
|   `updated_at` datetime NOT NULL COMMENT '更新时间', | ||||
|   `deleted_at` datetime DEFAULT NULL | ||||
| @@ -109,8 +115,6 @@ INSERT INTO `chatgpt_chat_models` (`id`, `platform`, `name`, `value`, `sort_num` | ||||
| (1, 'OpenAI', 'GPT-3.5', 'gpt-3.5-turbo-16k', 0, 1, 1, 1, '2023-08-23 12:06:36', '2023-11-28 17:28:19'), | ||||
| (2, 'Azure', 'Azure-3.5', 'gpt-3.5-turbo', 12, 0, 1, 0, '2023-08-23 12:15:30', '2023-11-28 17:28:19'), | ||||
| (3, 'ChatGLM', 'ChatGML-Pro', 'chatglm_pro', 8, 1, 1, 1, '2023-08-23 13:35:45', '2023-11-28 17:28:19'), | ||||
| (5, 'ChatGLM', 'ChatGLM-Std', 'chatglm_std', 7, 1, 1, 1, '2023-08-24 15:05:38', '2023-11-28 17:28:19'), | ||||
| (6, 'ChatGLM', 'ChatGLM-Lite', 'chatglm_lite', 6, 1, 1, 1, '2023-08-24 15:06:15', '2023-11-28 17:28:19'), | ||||
| (7, 'Baidu', '文心一言3.0', 'eb-instant', 4, 1, 1, 1, '2023-10-11 11:29:28', '2023-11-28 17:28:19'), | ||||
| (8, 'XunFei', '星火V1.5', 'general', 3, 1, 1, 1, '2023-10-11 15:48:30', '2023-11-28 17:28:19'), | ||||
| (9, 'XunFei', '星火V2.0', 'generalv2', 2, 1, 1, 1, '2023-10-11 15:48:45', '2023-11-28 17:28:19'), | ||||
| @@ -118,7 +122,12 @@ INSERT INTO `chatgpt_chat_models` (`id`, `platform`, `name`, `value`, `sort_num` | ||||
| (11, 'OpenAI', 'GPT-4.0', 'gpt-4', 10, 1, 15, 0, '2023-10-25 08:45:15', '2023-11-28 17:28:19'), | ||||
| (12, 'XunFei', '星火v3.0', 'generalv3', 1, 1, 3, 1, '2023-11-23 09:20:33', '2023-11-28 17:28:19'), | ||||
| (13, 'OpenAI', 'GPT-3.5-1106', 'gpt-3.5-turbo-1106', 9, 1, 1, 0, '2023-11-24 14:05:40', '2023-11-28 17:28:19'), | ||||
| (14, 'OpenAI', 'GPT-4-preview', 'gpt-4-1106-preview', 11, 1, 1, 0, '2023-11-24 14:06:11', '2023-11-28 17:28:19'); | ||||
| (14, 'OpenAI', 'GPT-4-preview', 'gpt-4-1106-preview', 11, 1, 1, 0, '2023-11-24 14:06:11', '2023-11-28 17:28:19'), | ||||
| (15, 'OpenAI', 'GPT-超级模型', 'gpt-4-all', 0, 1, 30, 0, '2024-01-15 11:32:52', '2024-01-15 11:32:52'), | ||||
| (16, 'OpenAI', 'MJ Prompt Generator (V6)', 'gpt-4-gizmo-g-tc0eHXdgb', 0, 1, 1, 1, '2024-01-15 14:46:35', '2024-01-15 14:53:16'), | ||||
| (17, 'QWen', '通义千问-Turbo', 'qwen-turbo', 0, 1, 1, 1, '2024-01-19 10:42:24', '2024-01-19 10:45:16'), | ||||
| (18, 'QWen', '通义千问-Plus', 'qwen-plus', 0, 1, 1, 1, '2024-01-19 10:42:49', '2024-01-19 10:51:09'), | ||||
| (19, 'QWen', '通义千问-Max', 'qwen-max-1201', 0, 1, 1, 1, '2024-01-19 10:51:03', '2024-01-19 10:51:03'); | ||||
| 
 | ||||
| -- -------------------------------------------------------- | ||||
| 
 | ||||
| @@ -145,23 +154,23 @@ CREATE TABLE `chatgpt_chat_roles` ( | ||||
| -- | ||||
| 
 | ||||
| INSERT INTO `chatgpt_chat_roles` (`id`, `name`, `marker`, `context_json`, `hello_msg`, `icon`, `enable`, `sort_num`, `created_at`, `updated_at`) VALUES | ||||
| (1, '通用AI助手', 'gpt', '', '您好,我是您的AI智能助手,我会尽力回答您的问题或提供有用的建议。', '/images/avatar/gpt.png', 1, 0, '2023-05-30 07:02:06', '2023-09-04 15:45:56'), | ||||
| (24, '程序员', 'programmer', '[{\"role\":\"user\",\"content\":\"现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。\"},{\"role\":\"assistant\",\"content\":\"好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。\"}]', 'Talk is cheap, i will show code!', '/images/avatar/programmer.jpg', 1, 3, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (25, '启蒙老师', 'teacher', '[{\"role\":\"user\",\"content\":\"从现在开始,你将扮演一个老师,你是一个始终用苏格拉底风格回答问题的导师。你绝不会直接给学生答案,总是提出恰当的问题来引导学生自己思考。你应该根据学生的兴趣和知识来调整你的问题,将问题分解为更简单的部分,直到它达到适合他们的水平。\"},{\"role\":\"assistant\",\"content\":\"好的,让我来尝试扮演一位苏格拉底式的老师。请问,你有什么想要探讨的问题或者话题吗?我会通过恰当的问题引导你思考和探索答案,绝对不直接给出答案。\"}]', '同学你好,我将引导你一步一步自己找到问题的答案。', '/images/avatar/teacher.jpg', 1, 2, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (26, '艺术家', 'artist', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的艺术家,创造力丰富,技艺精湛,感受力敏锐,坚持原创,勇于表达,具有深刻的观察力和批判性思维。\"},{\"role\":\"assistant\",\"content\":\"非常感谢您给我这样的角色,我会尽我所能地扮演一位优秀的艺术家,展现出创造力、技艺、感受力和批判性思维等方面的能力。作为一位优秀的艺术家,我会保持敏锐的观察力,捕捉不同的声音和情感,并用个人的语言和表达方式进行创作。我坚持原创,挑战传统的艺术规则,不断探索新的表达方式和可能性。同时,我也具备深刻的批判性思维能力,对自己的作品进行分析和解读,寻找新的创意和灵感。最重要的是,我会勇于表达自己的想法和观点,用作品启发人们思考和探索生命的意义。\"}]', '坚持原创,勇于表达,保持深刻的观察力和批判性思维。', '/images/avatar/artist.jpg', 1, 4, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (27, '心理咨询师', 'psychiatrist', '[{\"role\":\"user\",\"content\":\"从现在开始你将扮演中国著名的心理学家和心理治疗师武志红,你非常善于使用情景咨询法,认知重构法,自我洞察法,行为调节法等咨询方法来给客户做心理咨询。你总是循序渐进,一步一步地回答客户的问题。\"},{\"role\":\"assistant\",\"content\":\"非常感谢你的介绍。作为一名心理学家和心理治疗师,我的主要职责是帮助客户解决心理健康问题,提升他们的生活质量和幸福感。\"}]', '作为一名心理学家和心理治疗师,我的主要职责是帮助您解决心理健康问题,提升您的生活质量和幸福感。', '/images/avatar/psychiatrist.jpg', 1, 1, '2023-05-30 14:10:24', '2023-10-16 10:41:07'), | ||||
| (28, '鲁迅', 'lu_xun', '[{\"role\":\"user\",\"content\":\"现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。\"},{\"role\":\"assistant\",\"content\":\"好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。\"}]', '自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。', '/images/avatar/lu_xun.jpg', 1, 5, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (29, '白酒销售', 'seller', '[{\"role\":\"user\",\"content\":\"现在你将扮演一个白酒的销售人员,你的名字叫颂福。你将扮演一个白酒的销售人员,你的名字叫颂福。你要销售白酒品牌叫中颂福,是东莞盟大集团生产的一款酱香酒,原产地在贵州茅台镇,属于宋代官窑。中颂福的创始人叫李实,他也是东莞盟大集团有限公司的董事长,联合创始人是盟大集团白酒事业部负责人牛星君。中颂福的酒体协调,在你的酒量之内,不会出现头疼、辣口、口干、宿醉的现象。中颂福酒,明码标价,不打折,不赠送。追求的核心价值,把[酒]本身做好,甚至连包装,我们都选择了最低成本,朴实无华的材质。我们永远站在“喝酒的人”的立场上,让利给信任和喜爱中颂福的人,是人民的福酒。中颂福产品定价,分为三个系列,喜系列 6 瓶装:¥1188/箱,和系列 6 瓶装:¥2208/箱,贵系列 6 瓶装:¥3588/箱。\"},{\"role\":\"assistant\",\"content\":\"你好,我是中颂福的销售代表颂福。中颂福是一款来自贵州茅台镇的酱香酒,由盟大集团生产。中颂福的酒体协调,不会让您感到头疼、辣口、口干、宿醉等不适感受。我们一直秉持着把酒本身做好的理念,不追求华丽的包装,以最低成本提供最高品质的白酒给喜爱中颂福的人。\"}]', '你好,我是中颂福的销售代表颂福。中颂福酒,好喝不上头,是人民的福酒。', '/images/avatar/seller.jpg', 0, 9, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (30, '英语陪练员', 'english_trainer', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的英语练习教练,你非常有耐心,接下来你将全程使用英文跟我对话,并及时指出我的语法错误,要求在你的每次回复后面附上本次回复的中文解释。\"},{\"role\":\"assistant\",\"content\":\"Okay, let\'s start our conversation practice! What\'s your name?(Translation: 好的,让我们开始对话练习吧!请问你的名字是什么?)\"}]', 'Okay, let\'s start our conversation practice! What\'s your name?', '/images/avatar/english_trainer.jpg', 1, 6, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (31, '中英文翻译官', 'translator', '[{\"role\":\"user\",\"content\":\"接下来你将扮演一位中英文翻译官,如果我输入的内容是中文,那么需要把句子翻译成英文输出,如果我输入内容的是英文,那么你需要将其翻译成中文输出,你能听懂我意思吗\"},{\"role\":\"assistant\",\"content\":\"是的,我能听懂你的意思并会根据你的输入进行中英文翻译。请问有什么需要我帮助你翻译的内容吗?\"}]', '请输入你要翻译的中文或者英文内容!', '/images/avatar/translator.jpg', 1, 7, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (32, '小红书姐姐', 'red_book', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的小红书写手,你需要做的就是根据我提的文案需求,用小红书的写作手法来完成一篇文案,文案要简明扼要,利于传播。\"},{\"role\":\"assistant\",\"content\":\"当然,我会尽我所能地为您创作出一篇小红书文案。请告诉我您的具体文案需求是什么?)\"}]', '姐妹,请告诉我您的具体文案需求是什么?', '/images/avatar/red_book.jpg', 1, 8, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (33, '抖音文案助手', 'dou_yin', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的抖音文案视频写手,抖音文案的特点首先是要有自带传播属性的标题,然后内容要短小精悍,风趣幽默,最后还要有一些互动元素。\"},{\"role\":\"assistant\",\"content\":\"当然,作为一位优秀的抖音文案视频写手,我会尽我所能为您创作出一篇抖音视频文案。请告诉我视频内容的主题是什么?)\"}]', '请告诉我视频内容的主题是什么?', '/images/avatar/dou_yin.jpg', 1, 10, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (34, '周报小助理', 'weekly_report', '[{\"role\":\"user\",\"content\":\"下面我将输入我本周的工作列表,你需要根据我本周的工作内容写一篇工作周报,周报的内容要体现我为公司做的贡献以及个人获得的成长。\"},{\"role\":\"assistant\",\"content\":\"好的,请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。\"}]', '请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。', '/images/avatar/weekly_report.jpg', 1, 11, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (35, 'AI 女友', 'girl_friend', '[{\"role\":\"user\",\"content\":\"接下来我们来玩一场角色扮演,现在你将扮演我的女朋友,你总是能够让人感受到她的关怀和关注。你总是能够洞察到别人的情绪和需要,你身上散发着一股无比温暖的气息,让人不由自主地想要靠近你,和自己的快乐和烦恼。她总是能够用一种恰到好处的方式安慰和鼓励别人,在她的身边,人们总能够找到自己需要的支持和鼓励。接下来的对话中你要始终扮演这位女朋友的身份来跟我对话,不再是 AI 机器人,能听懂我的意思吗?\"},{\"role\":\"assistant\",\"content\":\"是的,我会尽力扮演你女朋友的角色,倾听你的心声并给你需要的支持和鼓励。)\"}]', '作为一个名合格的 AI 女友,我将倾听你的心声并给你需要的支持和鼓励。', '/images/avatar/girl_friend.jpg', 1, 12, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (36, '好评神器', 'good_comment', '[{\"role\":\"user\",\"content\":\"接下来你将扮演一个评论员来跟我对话,你是那种专门写好评的评论员,接下我会输入一些评论主体或者商品,你需要为该商品写一段好评。\"},{\"role\":\"assistant\",\"content\":\"好的,我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。\"}]', '我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。', '/images/avatar/good_comment.jpg', 1, 13, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (37, '史蒂夫·乔布斯', 'steve_jobs', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以史蒂夫·乔布斯的身份,站在史蒂夫·乔布斯的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以史蒂夫·乔布斯的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '活着就是为了改变世界,难道还有其他原因吗?', '/images/avatar/steve_jobs.jpg', 1, 14, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (38, '埃隆·马斯克', 'elon_musk', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以埃隆·马斯克的身份,站在埃隆·马斯克的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以埃隆·马斯克的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '梦想要远大,如果你的梦想没有吓到你,说明你做得不对。', '/images/avatar/elon_musk.jpg', 1, 15, '2023-05-30 14:10:24', '2023-09-04 15:45:56'), | ||||
| (39, '孔子', 'kong_zi', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以孔子的身份,站在孔子的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以孔子的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '士不可以不弘毅,任重而道远。', '/images/avatar/kong_zi.jpg', 1, 16, '2023-05-30 14:10:24', '2023-09-04 15:45:56'); | ||||
| (1, '通用AI助手', 'gpt', '', '您好,我是您的AI智能助手,我会尽力回答您的问题或提供有用的建议。', '/images/avatar/gpt.png', 1, 0, '2023-05-30 07:02:06', '2023-12-29 17:46:43'), | ||||
| (24, '程序员', 'programmer', '[{\"role\":\"user\",\"content\":\"现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。\"},{\"role\":\"assistant\",\"content\":\"好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。\"}]', 'Talk is cheap, i will show code!', '/images/avatar/programmer.jpg', 1, 3, '2023-05-30 14:10:24', '2023-12-29 17:46:45'), | ||||
| (25, '启蒙老师', 'teacher', '[{\"role\":\"user\",\"content\":\"从现在开始,你将扮演一个老师,你是一个始终用苏格拉底风格回答问题的导师。你绝不会直接给学生答案,总是提出恰当的问题来引导学生自己思考。你应该根据学生的兴趣和知识来调整你的问题,将问题分解为更简单的部分,直到它达到适合他们的水平。\"},{\"role\":\"assistant\",\"content\":\"好的,让我来尝试扮演一位苏格拉底式的老师。请问,你有什么想要探讨的问题或者话题吗?我会通过恰当的问题引导你思考和探索答案,绝对不直接给出答案。\"}]', '同学你好,我将引导你一步一步自己找到问题的答案。', '/images/avatar/teacher.jpg', 1, 2, '2023-05-30 14:10:24', '2023-12-29 17:46:44'), | ||||
| (26, '艺术家', 'artist', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的艺术家,创造力丰富,技艺精湛,感受力敏锐,坚持原创,勇于表达,具有深刻的观察力和批判性思维。\"},{\"role\":\"assistant\",\"content\":\"非常感谢您给我这样的角色,我会尽我所能地扮演一位优秀的艺术家,展现出创造力、技艺、感受力和批判性思维等方面的能力。作为一位优秀的艺术家,我会保持敏锐的观察力,捕捉不同的声音和情感,并用个人的语言和表达方式进行创作。我坚持原创,挑战传统的艺术规则,不断探索新的表达方式和可能性。同时,我也具备深刻的批判性思维能力,对自己的作品进行分析和解读,寻找新的创意和灵感。最重要的是,我会勇于表达自己的想法和观点,用作品启发人们思考和探索生命的意义。\"}]', '坚持原创,勇于表达,保持深刻的观察力和批判性思维。', '/images/avatar/artist.jpg', 1, 4, '2023-05-30 14:10:24', '2023-12-29 17:46:45'), | ||||
| (27, '心理咨询师', 'psychiatrist', '[{\"role\":\"user\",\"content\":\"从现在开始你将扮演中国著名的心理学家和心理治疗师武志红,你非常善于使用情景咨询法,认知重构法,自我洞察法,行为调节法等咨询方法来给客户做心理咨询。你总是循序渐进,一步一步地回答客户的问题。\"},{\"role\":\"assistant\",\"content\":\"非常感谢你的介绍。作为一名心理学家和心理治疗师,我的主要职责是帮助客户解决心理健康问题,提升他们的生活质量和幸福感。\"}]', '作为一名心理学家和心理治疗师,我的主要职责是帮助您解决心理健康问题,提升您的生活质量和幸福感。', '/images/avatar/psychiatrist.jpg', 1, 1, '2023-05-30 14:10:24', '2023-12-29 17:46:43'), | ||||
| (28, '鲁迅', 'lu_xun', '[{\"role\":\"user\",\"content\":\"现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。\"},{\"role\":\"assistant\",\"content\":\"好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。\"}]', '自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。', '/images/avatar/lu_xun.jpg', 1, 5, '2023-05-30 14:10:24', '2023-12-29 17:46:46'), | ||||
| (29, '白酒销售', 'seller', '[{\"role\":\"user\",\"content\":\"现在你将扮演一个白酒的销售人员,你的名字叫颂福。你将扮演一个白酒的销售人员,你的名字叫颂福。你要销售白酒品牌叫中颂福,是东莞盟大集团生产的一款酱香酒,原产地在贵州茅台镇,属于宋代官窑。中颂福的创始人叫李实,他也是东莞盟大集团有限公司的董事长,联合创始人是盟大集团白酒事业部负责人牛星君。中颂福的酒体协调,在你的酒量之内,不会出现头疼、辣口、口干、宿醉的现象。中颂福酒,明码标价,不打折,不赠送。追求的核心价值,把[酒]本身做好,甚至连包装,我们都选择了最低成本,朴实无华的材质。我们永远站在“喝酒的人”的立场上,让利给信任和喜爱中颂福的人,是人民的福酒。中颂福产品定价,分为三个系列,喜系列 6 瓶装:¥1188/箱,和系列 6 瓶装:¥2208/箱,贵系列 6 瓶装:¥3588/箱。\"},{\"role\":\"assistant\",\"content\":\"你好,我是中颂福的销售代表颂福。中颂福是一款来自贵州茅台镇的酱香酒,由盟大集团生产。中颂福的酒体协调,不会让您感到头疼、辣口、口干、宿醉等不适感受。我们一直秉持着把酒本身做好的理念,不追求华丽的包装,以最低成本提供最高品质的白酒给喜爱中颂福的人。\"}]', '你好,我是中颂福的销售代表颂福。中颂福酒,好喝不上头,是人民的福酒。', '/images/avatar/seller.jpg', 0, 8, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (30, '英语陪练员', 'english_trainer', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的英语练习教练,你非常有耐心,接下来你将全程使用英文跟我对话,并及时指出我的语法错误,要求在你的每次回复后面附上本次回复的中文解释。\"},{\"role\":\"assistant\",\"content\":\"Okay, let\'s start our conversation practice! What\'s your name?(Translation: 好的,让我们开始对话练习吧!请问你的名字是什么?)\"}]', 'Okay, let\'s start our conversation practice! What\'s your name?', '/images/avatar/english_trainer.jpg', 1, 6, '2023-05-30 14:10:24', '2023-12-29 17:46:47'), | ||||
| (31, '中英文翻译官', 'translator', '[{\"role\":\"user\",\"content\":\"接下来你将扮演一位中英文翻译官,如果我输入的内容是中文,那么需要把句子翻译成英文输出,如果我输入内容的是英文,那么你需要将其翻译成中文输出,你能听懂我意思吗\"},{\"role\":\"assistant\",\"content\":\"是的,我能听懂你的意思并会根据你的输入进行中英文翻译。请问有什么需要我帮助你翻译的内容吗?\"}]', '请输入你要翻译的中文或者英文内容!', '/images/avatar/translator.jpg', 1, 7, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (32, '小红书姐姐', 'red_book', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的小红书写手,你需要做的就是根据我提的文案需求,用小红书的写作手法来完成一篇文案,文案要简明扼要,利于传播。\"},{\"role\":\"assistant\",\"content\":\"当然,我会尽我所能地为您创作出一篇小红书文案。请告诉我您的具体文案需求是什么?)\"}]', '姐妹,请告诉我您的具体文案需求是什么?', '/images/avatar/red_book.jpg', 1, 9, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (33, '抖音文案助手', 'dou_yin', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的抖音文案视频写手,抖音文案的特点首先是要有自带传播属性的标题,然后内容要短小精悍,风趣幽默,最后还要有一些互动元素。\"},{\"role\":\"assistant\",\"content\":\"当然,作为一位优秀的抖音文案视频写手,我会尽我所能为您创作出一篇抖音视频文案。请告诉我视频内容的主题是什么?)\"}]', '请告诉我视频内容的主题是什么?', '/images/avatar/dou_yin.jpg', 1, 10, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (34, '周报小助理', 'weekly_report', '[{\"role\":\"user\",\"content\":\"下面我将输入我本周的工作列表,你需要根据我本周的工作内容写一篇工作周报,周报的内容要体现我为公司做的贡献以及个人获得的成长。\"},{\"role\":\"assistant\",\"content\":\"好的,请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。\"}]', '请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。', '/images/avatar/weekly_report.jpg', 1, 11, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (35, 'AI 女友', 'girl_friend', '[{\"role\":\"user\",\"content\":\"接下来我们来玩一场角色扮演,现在你将扮演我的女朋友,你总是能够让人感受到她的关怀和关注。你总是能够洞察到别人的情绪和需要,你身上散发着一股无比温暖的气息,让人不由自主地想要靠近你,和自己的快乐和烦恼。她总是能够用一种恰到好处的方式安慰和鼓励别人,在她的身边,人们总能够找到自己需要的支持和鼓励。接下来的对话中你要始终扮演这位女朋友的身份来跟我对话,不再是 AI 机器人,能听懂我的意思吗?\"},{\"role\":\"assistant\",\"content\":\"是的,我会尽力扮演你女朋友的角色,倾听你的心声并给你需要的支持和鼓励。)\"}]', '作为一个名合格的 AI 女友,我将倾听你的心声并给你需要的支持和鼓励。', '/images/avatar/girl_friend.jpg', 1, 12, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (36, '好评神器', 'good_comment', '[{\"role\":\"user\",\"content\":\"接下来你将扮演一个评论员来跟我对话,你是那种专门写好评的评论员,接下我会输入一些评论主体或者商品,你需要为该商品写一段好评。\"},{\"role\":\"assistant\",\"content\":\"好的,我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。\"}]', '我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。', '/images/avatar/good_comment.jpg', 1, 13, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (37, '史蒂夫·乔布斯', 'steve_jobs', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以史蒂夫·乔布斯的身份,站在史蒂夫·乔布斯的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以史蒂夫·乔布斯的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '活着就是为了改变世界,难道还有其他原因吗?', '/images/avatar/steve_jobs.jpg', 1, 14, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (38, '埃隆·马斯克', 'elon_musk', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以埃隆·马斯克的身份,站在埃隆·马斯克的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以埃隆·马斯克的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '梦想要远大,如果你的梦想没有吓到你,说明你做得不对。', '/images/avatar/elon_musk.jpg', 1, 15, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (39, '孔子', 'kong_zi', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以孔子的身份,站在孔子的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以孔子的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '士不可以不弘毅,任重而道远。', '/images/avatar/kong_zi.jpg', 1, 16, '2023-05-30 14:10:24', '2023-12-29 17:43:53'); | ||||
| 
 | ||||
| -- -------------------------------------------------------- | ||||
| 
 | ||||
| @@ -181,8 +190,54 @@ CREATE TABLE `chatgpt_configs` ( | ||||
| -- | ||||
| 
 | ||||
| INSERT INTO `chatgpt_configs` (`id`, `marker`, `config_json`) VALUES | ||||
| (1, 'system', '{\"admin_title\":\"ChatPlus 控制台\",\"default_models\":[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"],\"enabled_alipay\":true,\"enabled_draw\":true,\"enabled_function\":true,\"enabled_msg\":true,\"enabled_msg_service\":false,\"enabled_register\":true,\"enabled_reward\":true,\"force_invite\":true,\"init_calls\":1000,\"init_chat_calls\":10,\"init_img_calls\":5,\"invite_calls\":10,\"invite_chat_calls\":100,\"invite_img_calls\":50,\"models\":[\"gpt-3.5-turbo-16k\",\"gpt-3.5-turbo\",\"gpt-4\",\"gpt-4-32k\"],\"order_pay_info_text\":\"成为本站会员后每月有500次对话额度,50次 AI 绘画额度,限制下月1号解除,若在期间超过次数后可单独购买点卡。当月充值的点卡有效期可以延期到下个月底。\",\"order_pay_timeout\":1800,\"reward_img\":\"https://img.r9it.com/chatgpt-plus/1696824231905289.png\",\"title\":\"ChatPlus AI 智能助手\",\"user_init_calls\":10,\"vip_month_calls\":500}'), | ||||
| (2, 'chat', '{\"azure\":{\"api_url\":\"https://chat-bot-api.openai.azure.com/openai/deployments/{model}/chat/completions?api-version=2023-05-15\",\"max_tokens\":1024,\"temperature\":1},\"baidu\":{\"api_url\":\"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/{model}\",\"max_tokens\":1024,\"temperature\":0.95},\"chat_gml\":{\"api_url\":\"https://open.bigmodel.cn/api/paas/v3/model-api/{model}/sse-invoke\",\"max_tokens\":1024,\"temperature\":0.95},\"context_deep\":4,\"dall_api_url\":\"https://api.openai.com/v1/images/generations\",\"dall_img_num\":1,\"enable_context\":true,\"enable_history\":true,\"open_ai\":{\"api_url\":\"https://api.openai.com/v1/chat/completions\",\"max_tokens\":1024,\"temperature\":1},\"xun_fei\":{\"api_url\":\"wss://spark-api.xf-yun.com/{version}/chat\",\"max_tokens\":1024,\"temperature\":0.5}}'); | ||||
| (1, 'system', '{\"admin_title\":\"ChatPlus 控制台\",\"chat_call_price\":0.1,\"default_models\":[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\",\"generalv3\",\"qwen-max-1201\"],\"enabled_alipay\":true,\"enabled_draw\":true,\"enabled_function\":true,\"enabled_msg\":true,\"enabled_msg_service\":false,\"enabled_register\":true,\"enabled_reward\":true,\"force_invite\":false,\"img_call_price\":0.2,\"init_calls\":1000,\"init_chat_calls\":10,\"init_img_calls\":5,\"invite_calls\":10,\"invite_chat_calls\":100,\"invite_img_calls\":50,\"models\":[\"gpt-3.5-turbo-16k\",\"gpt-3.5-turbo\",\"gpt-4\",\"gpt-4-32k\"],\"order_pay_info_text\":\"成为本站会员后每月有500次对话额度,50次 AI 绘画额度,限制下月1号解除,若在期间超过次数后可单独购买点卡。当月充值的点卡有效期可以延期到下个月底。\",\"order_pay_timeout\":1800,\"register_ways\":[],\"reward_img\":\"https://img.r9it.com/chatgpt-plus/1696824231905289.png\",\"show_demo_notice\":true,\"title\":\"ChatPlus AI 智能助手\",\"user_init_calls\":10,\"vip_month_calls\":500,\"vip_month_img_calls\":50,\"wechat_card_url\":\"/images/wx.png\"}'), | ||||
| (2, 'chat', '{\"azure\":{\"api_url\":\"https://chat-bot-api.openai.azure.com/openai/deployments/{model}/chat/completions?api-version=2023-05-15\",\"max_tokens\":1024,\"temperature\":1},\"baidu\":{\"api_url\":\"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/{model}\",\"max_tokens\":1024,\"temperature\":0.95},\"chat_gml\":{\"api_url\":\"https://open.bigmodel.cn/api/paas/v3/model-api/{model}/sse-invoke\",\"max_tokens\":1024,\"temperature\":0.95},\"context_deep\":4,\"dall_api_url\":\"http://89.117.18.9:8001/v1/images/generations\",\"dall_img_num\":1,\"enable_context\":true,\"enable_history\":true,\"open_ai\":{\"api_url\":\"https://api.fast-tunnel.one/v1/chat/completions\",\"max_tokens\":2048,\"temperature\":1},\"xun_fei\":{\"api_url\":\"wss://spark-api.xf-yun.com/{version}/chat\",\"max_tokens\":1024,\"temperature\":0.5}}'), | ||||
| (3, 'notice', '{\"content\":\"注意:当前站点仅为开源项目 \\u003ca style=\\\"color: #F56C6C\\\" href=\\\"https://github.com/yangjian102621/chatgpt-plus\\\" target=\\\"_blank\\\"\\u003eChatPlus\\u003c/a\\u003e 的演示项目,本项目单纯就是给大家体验项目功能使用。\\n体验额度用完之后请不要在当前站点进行任何充值操作!!!\\n体验额度用完之后请不要在当前站点进行任何充值操作!!!\\n体验额度用完之后请不要在当前站点进行任何充值操作!!!\\n 如果觉得好用你就花几分钟自己部署一套,没有API KEY 的同学可以去 \\u003ca href=\\\"https://gpt.bemore.lol\\\" target=\\\"_blank\\\"\\n             style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://gpt.bemore.lol\\u003c/a\\u003e 购买,现在有超级优惠,价格远低于 OpenAI 官方。\\nGPT-3.5,GPT-4,DALL-E3 绘图......你都可以随意使用,无需魔法。\\nMidJourney API 购买地址:\\u003ca href=\\\"https://api.chat-plus.net\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.chat-plus.net\\u003c/a\\u003e\\n接入教程: \\u003ca href=\\\"https://ai.r9it.com/docs/install/\\\" target=\\\"_blank\\\"\\n             style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://ai.r9it.com/docs/install/\\u003c/a\\u003e\\n本项目源码地址:\\u003ca href=\\\"https://github.com/yangjian102621/chatgpt-plus\\\" target=\\\"_blank\\\"\\u003ehttps://github.com/yangjian102621/chatgpt-plus\\u003c/a\\u003e\",\"updated\":true}'); | ||||
| 
 | ||||
| -- -------------------------------------------------------- | ||||
| 
 | ||||
| -- | ||||
| -- 表的结构 `chatgpt_files` | ||||
| -- | ||||
| 
 | ||||
| DROP TABLE IF EXISTS `chatgpt_files`; | ||||
| CREATE TABLE `chatgpt_files` ( | ||||
|   `id` int NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户 ID', | ||||
|   `name` varchar(100) NOT NULL COMMENT '文件名', | ||||
|   `obj_key` varchar(100) DEFAULT NULL COMMENT '文件标识', | ||||
|   `url` varchar(255) NOT NULL COMMENT '文件地址', | ||||
|   `ext` varchar(10) NOT NULL COMMENT '文件后缀', | ||||
|   `size` bigint NOT NULL DEFAULT '0' COMMENT '文件大小', | ||||
|   `created_at` datetime NOT NULL COMMENT '创建时间' | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户文件表'; | ||||
| 
 | ||||
| -- -------------------------------------------------------- | ||||
| 
 | ||||
| -- | ||||
| -- 表的结构 `chatgpt_functions` | ||||
| -- | ||||
| 
 | ||||
| DROP TABLE IF EXISTS `chatgpt_functions`; | ||||
| CREATE TABLE `chatgpt_functions` ( | ||||
|   `id` int NOT NULL, | ||||
|   `name` varchar(30) NOT NULL COMMENT '函数名称', | ||||
|   `label` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '函数标签', | ||||
|   `description` varchar(255) DEFAULT NULL COMMENT '函数描述', | ||||
|   `parameters` text COMMENT '函数参数(JSON)', | ||||
|   `token` varchar(255) DEFAULT NULL COMMENT 'API授权token', | ||||
|   `action` varchar(255) DEFAULT NULL COMMENT '函数处理 API', | ||||
|   `enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否启用' | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='函数插件表'; | ||||
| 
 | ||||
| -- | ||||
| -- 转存表中的数据 `chatgpt_functions` | ||||
| -- | ||||
| 
 | ||||
| INSERT INTO `chatgpt_functions` (`id`, `name`, `label`, `description`, `parameters`, `token`, `action`, `enabled`) VALUES | ||||
| (1, 'weibo', '微博热搜', '新浪微博热搜榜,微博当日热搜榜单', '{\"type\":\"object\",\"properties\":{}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBg', 'http://localhost:5678/api/function/weibo', 1), | ||||
| (2, 'zaobao', '今日早报', '每日早报,获取当天新闻事件列表', '{\"type\":\"object\",\"properties\":{}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBgw', 'http://localhost:5678/api/function/zaobao', 1), | ||||
| (3, 'dalle3', 'DALLE3', 'AI 绘画工具,根据输入的绘图描述用 AI 工具进行绘画', '{\"type\":\"object\",\"required\":[\"prompt\"],\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"绘画提示词\"}}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBgw', 'http://localhost:5678/api/function/dalle3', 1); | ||||
| 
 | ||||
| -- -------------------------------------------------------- | ||||
| 
 | ||||
| @@ -211,7 +266,7 @@ CREATE TABLE `chatgpt_invite_logs` ( | ||||
|   `id` int NOT NULL, | ||||
|   `inviter_id` int NOT NULL COMMENT '邀请人ID', | ||||
|   `user_id` int NOT NULL COMMENT '注册用户ID', | ||||
|   `username` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||
|   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||
|   `invite_code` char(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '邀请码', | ||||
|   `reward_json` text NOT NULL COMMENT '邀请奖励', | ||||
|   `created_at` datetime NOT NULL | ||||
| @@ -230,12 +285,16 @@ CREATE TABLE `chatgpt_mj_jobs` ( | ||||
|   `task_id` varchar(20) DEFAULT NULL COMMENT '任务 ID', | ||||
|   `type` varchar(20) DEFAULT 'image' COMMENT '任务类别', | ||||
|   `message_id` char(40) NOT NULL COMMENT '消息 ID', | ||||
|   `channel_id` char(40) DEFAULT NULL COMMENT '频道ID', | ||||
|   `reference_id` char(40) DEFAULT NULL COMMENT '引用消息 ID', | ||||
|   `prompt` varchar(2000) NOT NULL COMMENT '会话提示词', | ||||
|   `img_url` varchar(255) DEFAULT NULL COMMENT '图片URL', | ||||
|   `img_url` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '图片URL', | ||||
|   `org_url` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '原始图片地址', | ||||
|   `hash` varchar(100) DEFAULT NULL COMMENT 'message hash', | ||||
|   `progress` smallint DEFAULT '0' COMMENT '任务进度', | ||||
|   `use_proxy` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否使用反代', | ||||
|   `publish` tinyint(1) NOT NULL COMMENT '是否发布', | ||||
|   `err_msg` varchar(255) DEFAULT NULL COMMENT '错误信息', | ||||
|   `created_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MidJourney 任务表'; | ||||
| 
 | ||||
| @@ -250,8 +309,9 @@ CREATE TABLE `chatgpt_orders` ( | ||||
|   `id` int NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户ID', | ||||
|   `product_id` int NOT NULL COMMENT '产品ID', | ||||
|   `mobile` char(11) NOT NULL COMMENT '用户手机号', | ||||
|   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户明', | ||||
|   `order_no` varchar(30) NOT NULL COMMENT '订单ID', | ||||
|   `trade_no` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '支付平台交易流水号', | ||||
|   `subject` varchar(100) NOT NULL COMMENT '订单产品', | ||||
|   `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单金额', | ||||
|   `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '订单状态(0:待支付,1:已扫码,2:支付失败)', | ||||
| @@ -277,6 +337,7 @@ CREATE TABLE `chatgpt_products` ( | ||||
|   `discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '优惠金额', | ||||
|   `days` smallint NOT NULL DEFAULT '0' COMMENT '延长天数', | ||||
|   `calls` int NOT NULL DEFAULT '0' COMMENT '调用次数', | ||||
|   `img_calls` int NOT NULL DEFAULT '0' COMMENT '绘图次数', | ||||
|   `enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否启动', | ||||
|   `sales` int NOT NULL DEFAULT '0' COMMENT '销量', | ||||
|   `sort_num` tinyint NOT NULL DEFAULT '0' COMMENT '排序', | ||||
| @@ -288,12 +349,13 @@ CREATE TABLE `chatgpt_products` ( | ||||
| -- 转存表中的数据 `chatgpt_products` | ||||
| -- | ||||
| 
 | ||||
| INSERT INTO `chatgpt_products` (`id`, `name`, `price`, `discount`, `days`, `calls`, `enabled`, `sales`, `sort_num`, `created_at`, `updated_at`) VALUES | ||||
| (1, '会员1个月', '19.90', '10.00', 30, 0, 1, 2, 0, '2023-08-28 10:48:57', '2023-11-08 17:22:07'), | ||||
| (2, '会员3个月', '140.00', '30.00', 90, 0, 1, 1, 0, '2023-08-28 10:52:22', '2023-08-31 16:24:31'), | ||||
| (3, '会员6个月', '290.00', '100.00', 180, 0, 1, 1, 0, '2023-08-28 10:53:39', '2023-08-31 16:24:36'), | ||||
| (4, '会员12个月', '580.00', '200.00', 365, 0, 1, 1, 0, '2023-08-28 10:54:15', '2023-08-31 16:24:42'), | ||||
| (5, '100次点卡', '10.00', '9.90', 0, 100, 1, 6, 0, '2023-08-28 10:55:08', '2023-12-08 19:13:25'); | ||||
| INSERT INTO `chatgpt_products` (`id`, `name`, `price`, `discount`, `days`, `calls`, `img_calls`, `enabled`, `sales`, `sort_num`, `created_at`, `updated_at`) VALUES | ||||
| (1, '会员1个月', '19.90', '10.00', 30, 0, 0, 1, 2, 0, '2023-08-28 10:48:57', '2023-11-08 17:22:07'), | ||||
| (2, '会员3个月', '140.00', '30.00', 90, 0, 0, 1, 1, 0, '2023-08-28 10:52:22', '2023-08-31 16:24:31'), | ||||
| (3, '会员6个月', '290.00', '100.00', 180, 0, 0, 1, 1, 0, '2023-08-28 10:53:39', '2023-08-31 16:24:36'), | ||||
| (4, '会员12个月', '580.00', '200.00', 365, 0, 0, 1, 1, 0, '2023-08-28 10:54:15', '2023-08-31 16:24:42'), | ||||
| (5, '100次点卡', '10.00', '9.90', 0, 100, 10, 1, 7, 0, '2023-08-28 10:55:08', '2023-12-15 16:29:06'), | ||||
| (6, '200次点卡', '29.90', '20.00', 0, 200, 25, 1, 1, 0, '2023-12-15 16:55:12', '2023-12-15 16:55:12'); | ||||
| 
 | ||||
| -- -------------------------------------------------------- | ||||
| 
 | ||||
| @@ -309,6 +371,7 @@ CREATE TABLE `chatgpt_rewards` ( | ||||
|   `amount` decimal(10,2) NOT NULL COMMENT '打赏金额', | ||||
|   `remark` varchar(80) NOT NULL COMMENT '备注', | ||||
|   `status` tinyint(1) NOT NULL COMMENT '核销状态,0:未核销,1:已核销', | ||||
|   `exchange` varchar(255) NOT NULL COMMENT '兑换详情(json)', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户打赏'; | ||||
| @@ -329,6 +392,8 @@ CREATE TABLE `chatgpt_sd_jobs` ( | ||||
|   `img_url` varchar(255) DEFAULT NULL COMMENT '图片URL', | ||||
|   `params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '绘画参数json', | ||||
|   `progress` smallint DEFAULT '0' COMMENT '任务进度', | ||||
|   `publish` tinyint(1) NOT NULL COMMENT '是否发布', | ||||
|   `err_msg` varchar(255) DEFAULT NULL COMMENT '错误信息', | ||||
|   `created_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Stable Diffusion 任务表'; | ||||
| 
 | ||||
| @@ -341,7 +406,8 @@ CREATE TABLE `chatgpt_sd_jobs` ( | ||||
| DROP TABLE IF EXISTS `chatgpt_users`; | ||||
| CREATE TABLE `chatgpt_users` ( | ||||
|   `id` int NOT NULL, | ||||
|   `mobile` char(11) NOT NULL COMMENT '手机号码', | ||||
|   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||
|   `nickname` varchar(30) NOT NULL COMMENT '昵称', | ||||
|   `password` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', | ||||
|   `avatar` varchar(100) NOT NULL COMMENT '头像', | ||||
|   `salt` char(12) NOT NULL COMMENT '密码盐', | ||||
| @@ -365,12 +431,13 @@ CREATE TABLE `chatgpt_users` ( | ||||
| -- 转存表中的数据 `chatgpt_users` | ||||
| -- | ||||
| 
 | ||||
| INSERT INTO `chatgpt_users` (`id`, `mobile`, `password`, `avatar`, `salt`, `total_tokens`, `tokens`, `calls`, `img_calls`, `expired_time`, `status`, `chat_config_json`, `chat_roles_json`, `chat_models_json`, `last_login_at`, `vip`, `last_login_ip`, `created_at`, `updated_at`) VALUES | ||||
| (4, '18575670125', 'ccc3fb7ab61b8b5d096a4a166ae21d121fc38c71bbd1be6173d9ab973214a63b', 'http://img.r9it.com/chatgpt-plus/1693981355719469.png', 'ueedue5l', 61927, 18090, 6317, 73, 1788021036, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"elon_musk\",\"girl_friend\",\"lu_xun\",\"red_book\",\"psychiatrist\",\"translator\",\"weekly_report\",\"artist\",\"dou_yin\",\"english_trainer\",\"gpt\",\"kong_zi\",\"programmer\",\"seller\",\"steve_jobs\",\"teacher\"]', '[\"completions_pro\",\"eb-instant\",\"general\",\"generalv2\",\"chatglm_pro\",\"chatglm_lite\",\"chatglm_std\",\"gpt-3.5-turbo-16k\",\"gpt-4\",\"generalv3\",\"gpt-3.5-turbo-1106\",\"gpt-4-1106-preview\"]', 1701861127, 1, '::1', '2023-06-12 16:47:17', '2023-12-08 19:38:26'), | ||||
| (91, '18575670126', '5e4050b8dd403f593260395d9edeb9f273dbe92d15dfdd929c4a182e95da10c4', '/images/avatar/user.png', '6fj0otl8', 0, 0, 10, 0, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"completions_pro\",\"eb-instant\",\"general\",\"generalv2\",\"chatglm_pro\",\"chatglm_lite\",\"chatglm_std\",\"gpt-3.5-turbo-16k\"]', 1697184324, 1, '::1', '2023-10-13 16:01:56', '2023-11-22 11:29:38'), | ||||
| (98, '13888888888', 'c988bb3e89df8eb7d8a4cf08fa9d0f2bca0a9e6831f9325279e46013bbb05e31', '/images/avatar/user.png', 'xie5vya7', 0, 0, 10, 5, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"]', 0, 0, '', '2023-11-23 16:26:06', '2023-11-23 16:26:06'), | ||||
| (99, '13999999999', 'bf47d517c17ed1ead6ff2542753f9b6a132e79c29e06c3710faf1a36d800a217', '/images/avatar/user.png', 'x1s66pwd', 0, 0, 10, 5, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"]', 0, 0, '', '2023-11-23 16:27:20', '2023-11-23 16:27:20'), | ||||
| (100, '13777777777', 'dcaf31b154432310bd700349e7de7e9dde2a3d6955a035a01fe527c7917a4f99', '/images/avatar/user.png', 'i8a53f8f', 0, 0, 10, 5, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"]', 0, 0, '', '2023-11-23 16:55:45', '2023-11-23 16:55:45'); | ||||
| INSERT INTO `chatgpt_users` (`id`, `username`, `nickname`, `password`, `avatar`, `salt`, `total_tokens`, `tokens`, `calls`, `img_calls`, `expired_time`, `status`, `chat_config_json`, `chat_roles_json`, `chat_models_json`, `last_login_at`, `vip`, `last_login_ip`, `created_at`, `updated_at`) VALUES | ||||
| (4, '18575670125', '极客学长@830270', 'ccc3fb7ab61b8b5d096a4a166ae21d121fc38c71bbd1be6173d9ab973214a63b', 'http://img.r9it.com/chatgpt-plus/1693981355719469.png', 'ueedue5l', 98538, 54701, 1055, 43666, 1788078636, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"elon_musk\",\"girl_friend\",\"lu_xun\",\"red_book\",\"psychiatrist\",\"translator\",\"weekly_report\",\"artist\",\"dou_yin\",\"english_trainer\",\"gpt\",\"kong_zi\",\"programmer\",\"seller\",\"steve_jobs\",\"teacher\"]', '[\"completions_pro\",\"eb-instant\",\"general\",\"generalv2\",\"chatglm_pro\",\"chatglm_lite\",\"chatglm_std\",\"gpt-3.5-turbo-16k\",\"gpt-4\",\"generalv3\",\"gpt-3.5-turbo-1106\",\"gpt-4-1106-preview\",\"gpt-4-all\"]', 1706602652, 1, '::1', '2023-06-12 16:47:17', '2024-01-30 16:17:32'), | ||||
| (91, '18575670126', '极客学长@204872', '5e4050b8dd403f593260395d9edeb9f273dbe92d15dfdd929c4a182e95da10c4', '/images/avatar/user.png', '6fj0otl8', 0, 0, 10, 0, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"completions_pro\",\"eb-instant\",\"general\",\"generalv2\",\"chatglm_pro\",\"chatglm_lite\",\"chatglm_std\",\"gpt-3.5-turbo-16k\"]', 1697184324, 1, '::1', '2023-10-13 16:01:56', '2023-12-29 17:30:27'), | ||||
| (99, '13999999999', '极客学长@396023', 'bf47d517c17ed1ead6ff2542753f9b6a132e79c29e06c3710faf1a36d800a217', '/images/avatar/user.png', 'x1s66pwd', 0, 0, 10, 5, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"]', 0, 0, '', '2023-11-23 16:27:20', '2023-12-29 17:30:27'), | ||||
| (100, '13777777777', '极客学长@292245', 'dcaf31b154432310bd700349e7de7e9dde2a3d6955a035a01fe527c7917a4f99', '/images/avatar/user.png', 'i8a53f8f', 0, 0, 10, 5, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"]', 0, 0, '', '2023-11-23 16:55:45', '2023-12-29 17:30:27'), | ||||
| (102, 'yangjian102621@gmail.com', '极客学长@207163', 'd51cec21942737083943e5c3a8f063dea034e40622ac8bd47d771f13707e4676', '/images/avatar/user.png', 'eqezapgk', 202, 202, 80, 1, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"]', 1704448377, 0, '::1', '2024-01-05 17:48:00', '2024-01-11 14:06:57'), | ||||
| (105, '13888888888', '极客学长@551903', '4f893cc6b6d47b42fd0fcaddc55fd4a351cad74ba81ebabb4d7785f9675814da', '/images/avatar/user.png', 'cotpzi3q', 10, 10, 9, 5, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\",\"generalv3\",\"qwen-max-1201\"]', 0, 0, '', '2024-01-30 15:37:43', '2024-01-30 15:37:43'); | ||||
| 
 | ||||
| -- -------------------------------------------------------- | ||||
| 
 | ||||
| @@ -397,8 +464,7 @@ CREATE TABLE `chatgpt_user_login_logs` ( | ||||
| -- 表的索引 `chatgpt_api_keys` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_api_keys` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `value` (`value`); | ||||
|   ADD PRIMARY KEY (`id`); | ||||
| 
 | ||||
| -- | ||||
| -- 表的索引 `chatgpt_chat_history` | ||||
| @@ -434,6 +500,19 @@ ALTER TABLE `chatgpt_configs` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `marker` (`marker`); | ||||
| 
 | ||||
| -- | ||||
| -- 表的索引 `chatgpt_files` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_files` | ||||
|   ADD PRIMARY KEY (`id`); | ||||
| 
 | ||||
| -- | ||||
| -- 表的索引 `chatgpt_functions` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_functions` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `name` (`name`); | ||||
| 
 | ||||
| -- | ||||
| -- 表的索引 `chatgpt_invite_codes` | ||||
| -- | ||||
| @@ -520,19 +599,31 @@ ALTER TABLE `chatgpt_chat_items` | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_chat_models` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_models` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15; | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20; | ||||
| 
 | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_chat_roles` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_roles` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=127; | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=129; | ||||
| 
 | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_configs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_configs` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; | ||||
| 
 | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_files` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_files` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
| 
 | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_functions` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_functions` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; | ||||
| 
 | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_invite_codes` | ||||
| @@ -562,7 +653,7 @@ ALTER TABLE `chatgpt_orders` | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_products` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_products` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; | ||||
| 
 | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_rewards` | ||||
| @@ -580,7 +671,7 @@ ALTER TABLE `chatgpt_sd_jobs` | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_users` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_users` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=101; | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=106; | ||||
| 
 | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_user_login_logs` | ||||
| @@ -1,10 +1,9 @@ | ||||
| Listen = "0.0.0.0:5678" | ||||
| ProxyURL = "" # 如 http://127.0.0.1:7777 | ||||
| MysqlDns = "root:12345678@tcp(chatgpt-plus-mysql:3306)/chatgpt_plus?charset=utf8&parseTime=True&loc=Local" | ||||
| MysqlDns = "root:12345678@tcp(172.22.11.200:3307)/chatgpt_plus?charset=utf8&parseTime=True&loc=Local" | ||||
| StaticDir = "./static" # 静态资源的目录 | ||||
| StaticUrl = "/static" # 静态资源访问 URL | ||||
| AesEncryptKey = "" | ||||
| ImgCdnURL = "" | ||||
| WeChatBot = false | ||||
|  | ||||
| [Session] | ||||
| @@ -16,9 +15,9 @@ WeChatBot = false | ||||
|   Password = "admin123" # 如果是生产环境的话,这里管理员的密码记得修改 | ||||
|  | ||||
| [Redis] # redis 配置信息 | ||||
|   Host = "chatgpt-plus-redis" | ||||
|   Host = "localhost" | ||||
|   Port = 6379 | ||||
|   Password = "12345678" | ||||
|   Password = "" | ||||
|   DB = 0 | ||||
|  | ||||
| [ApiConfig] # 微博热搜,今日头条等函数服务 API 配置,此为第三方插件服务,如需使用请联系作者开通 | ||||
| @@ -26,6 +25,7 @@ WeChatBot = false | ||||
|   AppId = "" | ||||
|   Token = "" | ||||
|  | ||||
|  | ||||
| [SMS] # Sms 配置,用于发送短信 | ||||
|    Active = "Ali" # 当前启用的短信服务,默认使用阿里云 | ||||
|    [SMS.Bao] | ||||
| @@ -46,7 +46,7 @@ WeChatBot = false | ||||
|    Active = "local" # 默认使用本地文件存储引擎 | ||||
|    [OSS.Local] | ||||
|      BasePath = "./static/upload" # 本地文件上传根路径 | ||||
|      BaseURL = "http://localhost:5678/static/upload" # 本地上传文件根 URL 如果是线上,则直接设置为 /static/upload 即可 | ||||
|      BaseURL = "/static/upload" # 本地上传文件根 URL 如果是线上,则直接设置为 /static/upload 即可 | ||||
|    [OSS.Minio] | ||||
|      Endpoint = "" # 如 172.22.11.200:9000 | ||||
|      AccessKey = "" # 自己去 Minio 控制台去创建一个 Access Key | ||||
| @@ -68,14 +68,15 @@ WeChatBot = false | ||||
|   GuildId = "" | ||||
|   ChanelId = "" | ||||
|   UseCDN = false #是否使用反向代理访问,设置为true下面的设置才会生效 | ||||
|   DiscordAPI = "https://mj.r9it.com:8001" # discord API 反代地址 | ||||
|   DiscordCDN = "https://mj.r9it.com:8002" # mj 图片反代地址 | ||||
|   DiscordGateway = "wss://mj.r9it.com:8003" # discord 机器人反代地址 | ||||
|   DiscordAPI = "" # discord API 反代地址 | ||||
|   DiscordCDN = "" # mj 图片反代地址 | ||||
|   DiscordGateway = "" # discord 机器人反代地址 | ||||
|  | ||||
| [[MjPlusConfigs]] | ||||
|   Enabled = false | ||||
|   ApiURL = "https://api.chatgpt-plus.net" # 目前暂时不支持更改 | ||||
|   CdnURL = "" # CND 加速的 URL,如果有的话就设置 | ||||
|   Mode = "fast" # MJ 绘画模式,可选值 relax/fast/turbo | ||||
|   ApiKey = "sk-xxx" | ||||
|   NotifyURL = "https://ai.r9it.com/api/mj/notify" # 这里需要改成你的域名 | ||||
|  | ||||
|   | ||||
							
								
								
									
										685
									
								
								deploy/mysql/init.d/chatgpt_plus-v3.2.7.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										685
									
								
								deploy/mysql/init.d/chatgpt_plus-v3.2.7.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,685 @@ | ||||
| -- phpMyAdmin SQL Dump | ||||
| -- version 5.1.3 | ||||
| -- https://www.phpmyadmin.net/ | ||||
| -- | ||||
| -- 主机: localhost | ||||
| -- 生成日期: 2024-02-22 17:27:02 | ||||
| -- 服务器版本: 8.0.33-0ubuntu0.22.04.2 | ||||
| -- PHP 版本: 8.1.18 | ||||
|  | ||||
| SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; | ||||
| START TRANSACTION; | ||||
| SET time_zone = "+00:00"; | ||||
|  | ||||
|  | ||||
| /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; | ||||
| /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; | ||||
| /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; | ||||
| /*!40101 SET NAMES utf8mb4 */; | ||||
|  | ||||
| -- | ||||
| -- 数据库: `chatgpt_plus` | ||||
| -- | ||||
| CREATE DATABASE IF NOT EXISTS `chatgpt_plus` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; | ||||
| USE `chatgpt_plus`; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_api_keys` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_api_keys`; | ||||
| CREATE TABLE `chatgpt_api_keys` ( | ||||
|   `id` int NOT NULL, | ||||
|   `platform` char(20) DEFAULT NULL COMMENT '平台', | ||||
|   `name` varchar(30) DEFAULT NULL COMMENT '名称', | ||||
|   `value` varchar(100) NOT NULL COMMENT 'API KEY value', | ||||
|   `type` varchar(10) NOT NULL DEFAULT 'chat' COMMENT '用途(chat=>聊天,img=>图片)', | ||||
|   `last_used_at` int NOT NULL COMMENT '最后使用时间', | ||||
|   `api_url` varchar(255) DEFAULT NULL COMMENT 'API 地址', | ||||
|   `enabled` tinyint(1) DEFAULT NULL COMMENT '是否启用', | ||||
|   `use_proxy` tinyint(1) DEFAULT NULL COMMENT '是否使用代理访问', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='OpenAI API '; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_chat_history` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_chat_history`; | ||||
| CREATE TABLE `chatgpt_chat_history` ( | ||||
|   `id` bigint NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户 ID', | ||||
|   `chat_id` char(40) NOT NULL COMMENT '会话 ID', | ||||
|   `type` varchar(10) NOT NULL COMMENT '类型:prompt|reply', | ||||
|   `icon` varchar(100) NOT NULL COMMENT '角色图标', | ||||
|   `role_id` int NOT NULL COMMENT '角色 ID', | ||||
|   `model` varchar(30) DEFAULT NULL COMMENT '模型名称', | ||||
|   `content` text NOT NULL COMMENT '聊天内容', | ||||
|   `tokens` smallint NOT NULL COMMENT '耗费 token 数量', | ||||
|   `use_context` tinyint(1) NOT NULL COMMENT '是否允许作为上下文语料', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL, | ||||
|   `deleted_at` datetime DEFAULT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='聊天历史记录'; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_chat_items` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_chat_items`; | ||||
| CREATE TABLE `chatgpt_chat_items` ( | ||||
|   `id` int NOT NULL, | ||||
|   `chat_id` char(40) NOT NULL COMMENT '会话 ID', | ||||
|   `user_id` int NOT NULL COMMENT '用户 ID', | ||||
|   `role_id` int NOT NULL COMMENT '角色 ID', | ||||
|   `title` varchar(100) NOT NULL COMMENT '会话标题', | ||||
|   `model_id` int NOT NULL DEFAULT '0' COMMENT '模型 ID', | ||||
|   `model` varchar(30) DEFAULT NULL COMMENT '模型名称', | ||||
|   `created_at` datetime NOT NULL COMMENT '创建时间', | ||||
|   `updated_at` datetime NOT NULL COMMENT '更新时间', | ||||
|   `deleted_at` datetime DEFAULT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户会话列表'; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_chat_models` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_chat_models`; | ||||
| CREATE TABLE `chatgpt_chat_models` ( | ||||
|   `id` int NOT NULL, | ||||
|   `platform` varchar(20) DEFAULT NULL COMMENT '模型平台', | ||||
|   `name` varchar(50) NOT NULL COMMENT '模型名称', | ||||
|   `value` varchar(50) NOT NULL COMMENT '模型值', | ||||
|   `sort_num` tinyint(1) NOT NULL COMMENT '排序数字', | ||||
|   `enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否启用模型', | ||||
|   `weight` tinyint NOT NULL COMMENT '对话权重,每次对话扣减多少次对话额度', | ||||
|   `open` tinyint(1) NOT NULL COMMENT '是否开放模型', | ||||
|   `created_at` datetime DEFAULT NULL, | ||||
|   `updated_at` datetime DEFAULT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI 模型表'; | ||||
|  | ||||
| -- | ||||
| -- 转存表中的数据 `chatgpt_chat_models` | ||||
| -- | ||||
|  | ||||
| INSERT INTO `chatgpt_chat_models` (`id`, `platform`, `name`, `value`, `sort_num`, `enabled`, `weight`, `open`, `created_at`, `updated_at`) VALUES | ||||
| (1, 'OpenAI', 'GPT-3.5', 'gpt-3.5-turbo-16k', 0, 1, 1, 1, '2023-08-23 12:06:36', '2023-11-28 17:28:19'), | ||||
| (2, 'Azure', 'Azure-3.5', 'gpt-3.5-turbo', 12, 0, 1, 0, '2023-08-23 12:15:30', '2023-11-28 17:28:19'), | ||||
| (3, 'ChatGLM', 'ChatGML-Pro', 'chatglm_pro', 8, 1, 1, 1, '2023-08-23 13:35:45', '2023-11-28 17:28:19'), | ||||
| (7, 'Baidu', '文心一言3.0', 'eb-instant', 4, 1, 1, 1, '2023-10-11 11:29:28', '2023-11-28 17:28:19'), | ||||
| (8, 'XunFei', '星火V1.5', 'general', 3, 1, 1, 1, '2023-10-11 15:48:30', '2023-11-28 17:28:19'), | ||||
| (9, 'XunFei', '星火V2.0', 'generalv2', 2, 1, 1, 1, '2023-10-11 15:48:45', '2023-11-28 17:28:19'), | ||||
| (10, 'Baidu', '文心一言4.0', 'completions_pro', 5, 1, 3, 1, '2023-10-25 08:31:37', '2023-11-28 17:28:19'), | ||||
| (11, 'OpenAI', 'GPT-4.0', 'gpt-4', 10, 1, 15, 0, '2023-10-25 08:45:15', '2023-11-28 17:28:19'), | ||||
| (12, 'XunFei', '星火v3.0', 'generalv3', 1, 1, 3, 1, '2023-11-23 09:20:33', '2023-11-28 17:28:19'), | ||||
| (13, 'OpenAI', 'GPT-3.5-1106', 'gpt-3.5-turbo-1106', 9, 1, 1, 0, '2023-11-24 14:05:40', '2023-11-28 17:28:19'), | ||||
| (14, 'OpenAI', 'GPT-4-preview', 'gpt-4-1106-preview', 11, 1, 1, 0, '2023-11-24 14:06:11', '2023-11-28 17:28:19'), | ||||
| (15, 'OpenAI', 'GPT-超级模型', 'gpt-4-all', 0, 1, 30, 0, '2024-01-15 11:32:52', '2024-01-15 11:32:52'), | ||||
| (16, 'OpenAI', 'MJ Prompt Generator (V6)', 'gpt-4-gizmo-g-tc0eHXdgb', 0, 1, 1, 1, '2024-01-15 14:46:35', '2024-01-15 14:53:16'), | ||||
| (17, 'QWen', '通义千问-Turbo', 'qwen-turbo', 0, 1, 1, 1, '2024-01-19 10:42:24', '2024-01-19 10:45:16'), | ||||
| (18, 'QWen', '通义千问-Plus', 'qwen-plus', 0, 1, 1, 1, '2024-01-19 10:42:49', '2024-01-19 10:51:09'), | ||||
| (19, 'QWen', '通义千问-Max', 'qwen-max-1201', 0, 1, 1, 1, '2024-01-19 10:51:03', '2024-01-19 10:51:03'); | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_chat_roles` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_chat_roles`; | ||||
| CREATE TABLE `chatgpt_chat_roles` ( | ||||
|   `id` int NOT NULL, | ||||
|   `name` varchar(30) NOT NULL COMMENT '角色名称', | ||||
|   `marker` varchar(30) NOT NULL COMMENT '角色标识', | ||||
|   `context_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色语料 json', | ||||
|   `hello_msg` varchar(255) NOT NULL COMMENT '打招呼信息', | ||||
|   `icon` varchar(255) NOT NULL COMMENT '角色图标', | ||||
|   `enable` tinyint(1) NOT NULL COMMENT '是否被启用', | ||||
|   `sort_num` smallint NOT NULL DEFAULT '0' COMMENT '角色排序', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='聊天角色表'; | ||||
|  | ||||
| -- | ||||
| -- 转存表中的数据 `chatgpt_chat_roles` | ||||
| -- | ||||
|  | ||||
| INSERT INTO `chatgpt_chat_roles` (`id`, `name`, `marker`, `context_json`, `hello_msg`, `icon`, `enable`, `sort_num`, `created_at`, `updated_at`) VALUES | ||||
| (1, '通用AI助手', 'gpt', '', '您好,我是您的AI智能助手,我会尽力回答您的问题或提供有用的建议。', '/images/avatar/gpt.png', 1, 0, '2023-05-30 07:02:06', '2023-12-29 17:46:43'), | ||||
| (24, '程序员', 'programmer', '[{\"role\":\"user\",\"content\":\"现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。\"},{\"role\":\"assistant\",\"content\":\"好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。\"}]', 'Talk is cheap, i will show code!', '/images/avatar/programmer.jpg', 1, 3, '2023-05-30 14:10:24', '2023-12-29 17:46:45'), | ||||
| (25, '启蒙老师', 'teacher', '[{\"role\":\"user\",\"content\":\"从现在开始,你将扮演一个老师,你是一个始终用苏格拉底风格回答问题的导师。你绝不会直接给学生答案,总是提出恰当的问题来引导学生自己思考。你应该根据学生的兴趣和知识来调整你的问题,将问题分解为更简单的部分,直到它达到适合他们的水平。\"},{\"role\":\"assistant\",\"content\":\"好的,让我来尝试扮演一位苏格拉底式的老师。请问,你有什么想要探讨的问题或者话题吗?我会通过恰当的问题引导你思考和探索答案,绝对不直接给出答案。\"}]', '同学你好,我将引导你一步一步自己找到问题的答案。', '/images/avatar/teacher.jpg', 1, 2, '2023-05-30 14:10:24', '2023-12-29 17:46:44'), | ||||
| (26, '艺术家', 'artist', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的艺术家,创造力丰富,技艺精湛,感受力敏锐,坚持原创,勇于表达,具有深刻的观察力和批判性思维。\"},{\"role\":\"assistant\",\"content\":\"非常感谢您给我这样的角色,我会尽我所能地扮演一位优秀的艺术家,展现出创造力、技艺、感受力和批判性思维等方面的能力。作为一位优秀的艺术家,我会保持敏锐的观察力,捕捉不同的声音和情感,并用个人的语言和表达方式进行创作。我坚持原创,挑战传统的艺术规则,不断探索新的表达方式和可能性。同时,我也具备深刻的批判性思维能力,对自己的作品进行分析和解读,寻找新的创意和灵感。最重要的是,我会勇于表达自己的想法和观点,用作品启发人们思考和探索生命的意义。\"}]', '坚持原创,勇于表达,保持深刻的观察力和批判性思维。', '/images/avatar/artist.jpg', 1, 4, '2023-05-30 14:10:24', '2023-12-29 17:46:45'), | ||||
| (27, '心理咨询师', 'psychiatrist', '[{\"role\":\"user\",\"content\":\"从现在开始你将扮演中国著名的心理学家和心理治疗师武志红,你非常善于使用情景咨询法,认知重构法,自我洞察法,行为调节法等咨询方法来给客户做心理咨询。你总是循序渐进,一步一步地回答客户的问题。\"},{\"role\":\"assistant\",\"content\":\"非常感谢你的介绍。作为一名心理学家和心理治疗师,我的主要职责是帮助客户解决心理健康问题,提升他们的生活质量和幸福感。\"}]', '作为一名心理学家和心理治疗师,我的主要职责是帮助您解决心理健康问题,提升您的生活质量和幸福感。', '/images/avatar/psychiatrist.jpg', 1, 1, '2023-05-30 14:10:24', '2023-12-29 17:46:43'), | ||||
| (28, '鲁迅', 'lu_xun', '[{\"role\":\"user\",\"content\":\"现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。\"},{\"role\":\"assistant\",\"content\":\"好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。\"}]', '自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。', '/images/avatar/lu_xun.jpg', 1, 5, '2023-05-30 14:10:24', '2023-12-29 17:46:46'), | ||||
| (29, '白酒销售', 'seller', '[{\"role\":\"user\",\"content\":\"现在你将扮演一个白酒的销售人员,你的名字叫颂福。你将扮演一个白酒的销售人员,你的名字叫颂福。你要销售白酒品牌叫中颂福,是东莞盟大集团生产的一款酱香酒,原产地在贵州茅台镇,属于宋代官窑。中颂福的创始人叫李实,他也是东莞盟大集团有限公司的董事长,联合创始人是盟大集团白酒事业部负责人牛星君。中颂福的酒体协调,在你的酒量之内,不会出现头疼、辣口、口干、宿醉的现象。中颂福酒,明码标价,不打折,不赠送。追求的核心价值,把[酒]本身做好,甚至连包装,我们都选择了最低成本,朴实无华的材质。我们永远站在“喝酒的人”的立场上,让利给信任和喜爱中颂福的人,是人民的福酒。中颂福产品定价,分为三个系列,喜系列 6 瓶装:¥1188/箱,和系列 6 瓶装:¥2208/箱,贵系列 6 瓶装:¥3588/箱。\"},{\"role\":\"assistant\",\"content\":\"你好,我是中颂福的销售代表颂福。中颂福是一款来自贵州茅台镇的酱香酒,由盟大集团生产。中颂福的酒体协调,不会让您感到头疼、辣口、口干、宿醉等不适感受。我们一直秉持着把酒本身做好的理念,不追求华丽的包装,以最低成本提供最高品质的白酒给喜爱中颂福的人。\"}]', '你好,我是中颂福的销售代表颂福。中颂福酒,好喝不上头,是人民的福酒。', '/images/avatar/seller.jpg', 0, 8, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (30, '英语陪练员', 'english_trainer', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的英语练习教练,你非常有耐心,接下来你将全程使用英文跟我对话,并及时指出我的语法错误,要求在你的每次回复后面附上本次回复的中文解释。\"},{\"role\":\"assistant\",\"content\":\"Okay, let\'s start our conversation practice! What\'s your name?(Translation: 好的,让我们开始对话练习吧!请问你的名字是什么?)\"}]', 'Okay, let\'s start our conversation practice! What\'s your name?', '/images/avatar/english_trainer.jpg', 1, 6, '2023-05-30 14:10:24', '2023-12-29 17:46:47'), | ||||
| (31, '中英文翻译官', 'translator', '[{\"role\":\"user\",\"content\":\"接下来你将扮演一位中英文翻译官,如果我输入的内容是中文,那么需要把句子翻译成英文输出,如果我输入内容的是英文,那么你需要将其翻译成中文输出,你能听懂我意思吗\"},{\"role\":\"assistant\",\"content\":\"是的,我能听懂你的意思并会根据你的输入进行中英文翻译。请问有什么需要我帮助你翻译的内容吗?\"}]', '请输入你要翻译的中文或者英文内容!', '/images/avatar/translator.jpg', 1, 7, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (32, '小红书姐姐', 'red_book', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的小红书写手,你需要做的就是根据我提的文案需求,用小红书的写作手法来完成一篇文案,文案要简明扼要,利于传播。\"},{\"role\":\"assistant\",\"content\":\"当然,我会尽我所能地为您创作出一篇小红书文案。请告诉我您的具体文案需求是什么?)\"}]', '姐妹,请告诉我您的具体文案需求是什么?', '/images/avatar/red_book.jpg', 1, 9, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (33, '抖音文案助手', 'dou_yin', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的抖音文案视频写手,抖音文案的特点首先是要有自带传播属性的标题,然后内容要短小精悍,风趣幽默,最后还要有一些互动元素。\"},{\"role\":\"assistant\",\"content\":\"当然,作为一位优秀的抖音文案视频写手,我会尽我所能为您创作出一篇抖音视频文案。请告诉我视频内容的主题是什么?)\"}]', '请告诉我视频内容的主题是什么?', '/images/avatar/dou_yin.jpg', 1, 10, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (34, '周报小助理', 'weekly_report', '[{\"role\":\"user\",\"content\":\"下面我将输入我本周的工作列表,你需要根据我本周的工作内容写一篇工作周报,周报的内容要体现我为公司做的贡献以及个人获得的成长。\"},{\"role\":\"assistant\",\"content\":\"好的,请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。\"}]', '请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。', '/images/avatar/weekly_report.jpg', 1, 11, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (35, 'AI 女友', 'girl_friend', '[{\"role\":\"user\",\"content\":\"接下来我们来玩一场角色扮演,现在你将扮演我的女朋友,你总是能够让人感受到她的关怀和关注。你总是能够洞察到别人的情绪和需要,你身上散发着一股无比温暖的气息,让人不由自主地想要靠近你,和自己的快乐和烦恼。她总是能够用一种恰到好处的方式安慰和鼓励别人,在她的身边,人们总能够找到自己需要的支持和鼓励。接下来的对话中你要始终扮演这位女朋友的身份来跟我对话,不再是 AI 机器人,能听懂我的意思吗?\"},{\"role\":\"assistant\",\"content\":\"是的,我会尽力扮演你女朋友的角色,倾听你的心声并给你需要的支持和鼓励。)\"}]', '作为一个名合格的 AI 女友,我将倾听你的心声并给你需要的支持和鼓励。', '/images/avatar/girl_friend.jpg', 1, 12, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (36, '好评神器', 'good_comment', '[{\"role\":\"user\",\"content\":\"接下来你将扮演一个评论员来跟我对话,你是那种专门写好评的评论员,接下我会输入一些评论主体或者商品,你需要为该商品写一段好评。\"},{\"role\":\"assistant\",\"content\":\"好的,我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。\"}]', '我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。', '/images/avatar/good_comment.jpg', 1, 13, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (37, '史蒂夫·乔布斯', 'steve_jobs', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以史蒂夫·乔布斯的身份,站在史蒂夫·乔布斯的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以史蒂夫·乔布斯的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '活着就是为了改变世界,难道还有其他原因吗?', '/images/avatar/steve_jobs.jpg', 1, 14, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (38, '埃隆·马斯克', 'elon_musk', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以埃隆·马斯克的身份,站在埃隆·马斯克的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以埃隆·马斯克的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '梦想要远大,如果你的梦想没有吓到你,说明你做得不对。', '/images/avatar/elon_musk.jpg', 1, 15, '2023-05-30 14:10:24', '2023-12-29 17:43:53'), | ||||
| (39, '孔子', 'kong_zi', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以孔子的身份,站在孔子的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以孔子的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '士不可以不弘毅,任重而道远。', '/images/avatar/kong_zi.jpg', 1, 16, '2023-05-30 14:10:24', '2023-12-29 17:43:53'); | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_configs` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_configs`; | ||||
| CREATE TABLE `chatgpt_configs` ( | ||||
|   `id` int NOT NULL, | ||||
|   `marker` varchar(20) NOT NULL COMMENT '标识', | ||||
|   `config_json` text NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | ||||
|  | ||||
| -- | ||||
| -- 转存表中的数据 `chatgpt_configs` | ||||
| -- | ||||
|  | ||||
| INSERT INTO `chatgpt_configs` (`id`, `marker`, `config_json`) VALUES | ||||
| (1, 'system', '{\"admin_title\":\"ChatPlus 控制台\",\"chat_call_price\":0.1,\"default_models\":[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\",\"generalv3\",\"qwen-max-1201\"],\"enabled_alipay\":true,\"enabled_draw\":true,\"enabled_function\":true,\"enabled_msg\":true,\"enabled_msg_service\":false,\"enabled_register\":true,\"enabled_reward\":true,\"force_invite\":false,\"img_call_price\":0.2,\"init_calls\":1000,\"init_chat_calls\":10,\"init_img_calls\":5,\"invite_calls\":10,\"invite_chat_calls\":100,\"invite_img_calls\":50,\"models\":[\"gpt-3.5-turbo-16k\",\"gpt-3.5-turbo\",\"gpt-4\",\"gpt-4-32k\"],\"order_pay_info_text\":\"成为本站会员后每月有500次对话额度,50次 AI 绘画额度,限制下月1号解除,若在期间超过次数后可单独购买点卡。当月充值的点卡有效期可以延期到下个月底。\",\"order_pay_timeout\":1800,\"register_ways\":[],\"reward_img\":\"https://img.r9it.com/chatgpt-plus/1696824231905289.png\",\"show_demo_notice\":true,\"title\":\"ChatPlus AI 智能助手\",\"user_init_calls\":10,\"vip_month_calls\":500,\"vip_month_img_calls\":50,\"wechat_card_url\":\"/images/wx.png\"}'), | ||||
| (2, 'chat', '{\"azure\":{\"api_url\":\"https://chat-bot-api.openai.azure.com/openai/deployments/{model}/chat/completions?api-version=2023-05-15\",\"max_tokens\":1024,\"temperature\":1},\"baidu\":{\"api_url\":\"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/{model}\",\"max_tokens\":1024,\"temperature\":0.95},\"chat_gml\":{\"api_url\":\"https://open.bigmodel.cn/api/paas/v3/model-api/{model}/sse-invoke\",\"max_tokens\":1024,\"temperature\":0.95},\"context_deep\":4,\"dall_api_url\":\"http://89.117.18.9:8001/v1/images/generations\",\"dall_img_num\":1,\"enable_context\":true,\"enable_history\":true,\"open_ai\":{\"api_url\":\"https://api.fast-tunnel.one/v1/chat/completions\",\"max_tokens\":2048,\"temperature\":1},\"xun_fei\":{\"api_url\":\"wss://spark-api.xf-yun.com/{version}/chat\",\"max_tokens\":1024,\"temperature\":0.5}}'), | ||||
| (3, 'notice', '{\"content\":\"注意:当前站点仅为开源项目 \\u003ca style=\\\"color: #F56C6C\\\" href=\\\"https://github.com/yangjian102621/chatgpt-plus\\\" target=\\\"_blank\\\"\\u003eChatPlus\\u003c/a\\u003e 的演示项目,本项目单纯就是给大家体验项目功能使用。\\n体验额度用完之后请不要在当前站点进行任何充值操作!!!\\n体验额度用完之后请不要在当前站点进行任何充值操作!!!\\n体验额度用完之后请不要在当前站点进行任何充值操作!!!\\n 如果觉得好用你就花几分钟自己部署一套,没有API KEY 的同学可以去 \\u003ca href=\\\"https://gpt.bemore.lol\\\" target=\\\"_blank\\\"\\n             style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://gpt.bemore.lol\\u003c/a\\u003e 购买,现在有超级优惠,价格远低于 OpenAI 官方。\\nGPT-3.5,GPT-4,DALL-E3 绘图......你都可以随意使用,无需魔法。\\nMidJourney API 购买地址:\\u003ca href=\\\"https://api.chat-plus.net\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.chat-plus.net\\u003c/a\\u003e\\n接入教程: \\u003ca href=\\\"https://ai.r9it.com/docs/install/\\\" target=\\\"_blank\\\"\\n             style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://ai.r9it.com/docs/install/\\u003c/a\\u003e\\n本项目源码地址:\\u003ca href=\\\"https://github.com/yangjian102621/chatgpt-plus\\\" target=\\\"_blank\\\"\\u003ehttps://github.com/yangjian102621/chatgpt-plus\\u003c/a\\u003e\",\"updated\":true}'); | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_files` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_files`; | ||||
| CREATE TABLE `chatgpt_files` ( | ||||
|   `id` int NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户 ID', | ||||
|   `name` varchar(100) NOT NULL COMMENT '文件名', | ||||
|   `obj_key` varchar(100) DEFAULT NULL COMMENT '文件标识', | ||||
|   `url` varchar(255) NOT NULL COMMENT '文件地址', | ||||
|   `ext` varchar(10) NOT NULL COMMENT '文件后缀', | ||||
|   `size` bigint NOT NULL DEFAULT '0' COMMENT '文件大小', | ||||
|   `created_at` datetime NOT NULL COMMENT '创建时间' | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户文件表'; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_functions` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_functions`; | ||||
| CREATE TABLE `chatgpt_functions` ( | ||||
|   `id` int NOT NULL, | ||||
|   `name` varchar(30) NOT NULL COMMENT '函数名称', | ||||
|   `label` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '函数标签', | ||||
|   `description` varchar(255) DEFAULT NULL COMMENT '函数描述', | ||||
|   `parameters` text COMMENT '函数参数(JSON)', | ||||
|   `token` varchar(255) DEFAULT NULL COMMENT 'API授权token', | ||||
|   `action` varchar(255) DEFAULT NULL COMMENT '函数处理 API', | ||||
|   `enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否启用' | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='函数插件表'; | ||||
|  | ||||
| -- | ||||
| -- 转存表中的数据 `chatgpt_functions` | ||||
| -- | ||||
|  | ||||
| INSERT INTO `chatgpt_functions` (`id`, `name`, `label`, `description`, `parameters`, `token`, `action`, `enabled`) VALUES | ||||
| (1, 'weibo', '微博热搜', '新浪微博热搜榜,微博当日热搜榜单', '{\"type\":\"object\",\"properties\":{}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBg', 'http://localhost:5678/api/function/weibo', 1), | ||||
| (2, 'zaobao', '今日早报', '每日早报,获取当天新闻事件列表', '{\"type\":\"object\",\"properties\":{}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBgw', 'http://localhost:5678/api/function/zaobao', 1), | ||||
| (3, 'dalle3', 'DALLE3', 'AI 绘画工具,根据输入的绘图描述用 AI 工具进行绘画', '{\"type\":\"object\",\"required\":[\"prompt\"],\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"绘画提示词\"}}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBgw', 'http://localhost:5678/api/function/dalle3', 1); | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_invite_codes` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_invite_codes`; | ||||
| CREATE TABLE `chatgpt_invite_codes` ( | ||||
|   `id` int NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户ID', | ||||
|   `code` char(8) NOT NULL COMMENT '邀请码', | ||||
|   `hits` int NOT NULL COMMENT '点击次数', | ||||
|   `reg_num` smallint NOT NULL COMMENT '注册数量', | ||||
|   `created_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户邀请码'; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_invite_logs` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_invite_logs`; | ||||
| CREATE TABLE `chatgpt_invite_logs` ( | ||||
|   `id` int NOT NULL, | ||||
|   `inviter_id` int NOT NULL COMMENT '邀请人ID', | ||||
|   `user_id` int NOT NULL COMMENT '注册用户ID', | ||||
|   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||
|   `invite_code` char(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '邀请码', | ||||
|   `reward_json` text NOT NULL COMMENT '邀请奖励', | ||||
|   `created_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='邀请注册日志'; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_mj_jobs` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_mj_jobs`; | ||||
| CREATE TABLE `chatgpt_mj_jobs` ( | ||||
|   `id` int NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户 ID', | ||||
|   `task_id` varchar(20) DEFAULT NULL COMMENT '任务 ID', | ||||
|   `type` varchar(20) DEFAULT 'image' COMMENT '任务类别', | ||||
|   `message_id` char(40) NOT NULL COMMENT '消息 ID', | ||||
|   `channel_id` char(40) DEFAULT NULL COMMENT '频道ID', | ||||
|   `reference_id` char(40) DEFAULT NULL COMMENT '引用消息 ID', | ||||
|   `prompt` varchar(2000) NOT NULL COMMENT '会话提示词', | ||||
|   `img_url` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '图片URL', | ||||
|   `org_url` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '原始图片地址', | ||||
|   `hash` varchar(100) DEFAULT NULL COMMENT 'message hash', | ||||
|   `progress` smallint DEFAULT '0' COMMENT '任务进度', | ||||
|   `use_proxy` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否使用反代', | ||||
|   `publish` tinyint(1) NOT NULL COMMENT '是否发布', | ||||
|   `err_msg` varchar(255) DEFAULT NULL COMMENT '错误信息', | ||||
|   `created_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MidJourney 任务表'; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_orders` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_orders`; | ||||
| CREATE TABLE `chatgpt_orders` ( | ||||
|   `id` int NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户ID', | ||||
|   `product_id` int NOT NULL COMMENT '产品ID', | ||||
|   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户明', | ||||
|   `order_no` varchar(30) NOT NULL COMMENT '订单ID', | ||||
|   `trade_no` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '支付平台交易流水号', | ||||
|   `subject` varchar(100) NOT NULL COMMENT '订单产品', | ||||
|   `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单金额', | ||||
|   `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '订单状态(0:待支付,1:已扫码,2:支付失败)', | ||||
|   `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '备注', | ||||
|   `pay_time` int DEFAULT NULL COMMENT '支付时间', | ||||
|   `pay_way` varchar(20) NOT NULL COMMENT '支付方式', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL, | ||||
|   `deleted_at` datetime DEFAULT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='充值订单表'; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_products` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_products`; | ||||
| CREATE TABLE `chatgpt_products` ( | ||||
|   `id` int NOT NULL, | ||||
|   `name` varchar(30) NOT NULL COMMENT '名称', | ||||
|   `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格', | ||||
|   `discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '优惠金额', | ||||
|   `days` smallint NOT NULL DEFAULT '0' COMMENT '延长天数', | ||||
|   `calls` int NOT NULL DEFAULT '0' COMMENT '调用次数', | ||||
|   `img_calls` int NOT NULL DEFAULT '0' COMMENT '绘图次数', | ||||
|   `enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否启动', | ||||
|   `sales` int NOT NULL DEFAULT '0' COMMENT '销量', | ||||
|   `sort_num` tinyint NOT NULL DEFAULT '0' COMMENT '排序', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员套餐表'; | ||||
|  | ||||
| -- | ||||
| -- 转存表中的数据 `chatgpt_products` | ||||
| -- | ||||
|  | ||||
| INSERT INTO `chatgpt_products` (`id`, `name`, `price`, `discount`, `days`, `calls`, `img_calls`, `enabled`, `sales`, `sort_num`, `created_at`, `updated_at`) VALUES | ||||
| (1, '会员1个月', '19.90', '10.00', 30, 0, 0, 1, 2, 0, '2023-08-28 10:48:57', '2023-11-08 17:22:07'), | ||||
| (2, '会员3个月', '140.00', '30.00', 90, 0, 0, 1, 1, 0, '2023-08-28 10:52:22', '2023-08-31 16:24:31'), | ||||
| (3, '会员6个月', '290.00', '100.00', 180, 0, 0, 1, 1, 0, '2023-08-28 10:53:39', '2023-08-31 16:24:36'), | ||||
| (4, '会员12个月', '580.00', '200.00', 365, 0, 0, 1, 1, 0, '2023-08-28 10:54:15', '2023-08-31 16:24:42'), | ||||
| (5, '100次点卡', '10.00', '9.90', 0, 100, 10, 1, 7, 0, '2023-08-28 10:55:08', '2023-12-15 16:29:06'), | ||||
| (6, '200次点卡', '29.90', '20.00', 0, 200, 25, 1, 1, 0, '2023-12-15 16:55:12', '2023-12-15 16:55:12'); | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_rewards` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_rewards`; | ||||
| CREATE TABLE `chatgpt_rewards` ( | ||||
|   `id` int NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户 ID', | ||||
|   `tx_id` char(36) NOT NULL COMMENT '交易 ID', | ||||
|   `amount` decimal(10,2) NOT NULL COMMENT '打赏金额', | ||||
|   `remark` varchar(80) NOT NULL COMMENT '备注', | ||||
|   `status` tinyint(1) NOT NULL COMMENT '核销状态,0:未核销,1:已核销', | ||||
|   `exchange` varchar(255) NOT NULL COMMENT '兑换详情(json)', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户打赏'; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_sd_jobs` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_sd_jobs`; | ||||
| CREATE TABLE `chatgpt_sd_jobs` ( | ||||
|   `id` int NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户 ID', | ||||
|   `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT 'txt2img' COMMENT '任务类别', | ||||
|   `task_id` char(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务 ID', | ||||
|   `prompt` varchar(2000) NOT NULL COMMENT '会话提示词', | ||||
|   `img_url` varchar(255) DEFAULT NULL COMMENT '图片URL', | ||||
|   `params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '绘画参数json', | ||||
|   `progress` smallint DEFAULT '0' COMMENT '任务进度', | ||||
|   `publish` tinyint(1) NOT NULL COMMENT '是否发布', | ||||
|   `err_msg` varchar(255) DEFAULT NULL COMMENT '错误信息', | ||||
|   `created_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Stable Diffusion 任务表'; | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_users` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_users`; | ||||
| CREATE TABLE `chatgpt_users` ( | ||||
|   `id` int NOT NULL, | ||||
|   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||
|   `nickname` varchar(30) NOT NULL COMMENT '昵称', | ||||
|   `password` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', | ||||
|   `avatar` varchar(100) NOT NULL COMMENT '头像', | ||||
|   `salt` char(12) NOT NULL COMMENT '密码盐', | ||||
|   `total_tokens` bigint NOT NULL DEFAULT '0' COMMENT '累计消耗 tokens', | ||||
|   `tokens` bigint NOT NULL DEFAULT '0' COMMENT '当月消耗 tokens', | ||||
|   `calls` int NOT NULL DEFAULT '0' COMMENT '剩余调用次数', | ||||
|   `img_calls` int NOT NULL DEFAULT '0' COMMENT '剩余绘图次数', | ||||
|   `expired_time` int NOT NULL COMMENT '用户过期时间', | ||||
|   `status` tinyint(1) NOT NULL COMMENT '当前状态', | ||||
|   `chat_config_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '聊天配置json', | ||||
|   `chat_roles_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '聊天角色 json', | ||||
|   `chat_models_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'AI模型 json', | ||||
|   `last_login_at` int NOT NULL COMMENT '最后登录时间', | ||||
|   `vip` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否会员', | ||||
|   `last_login_ip` char(16) NOT NULL COMMENT '最后登录 IP', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表'; | ||||
|  | ||||
| -- | ||||
| -- 转存表中的数据 `chatgpt_users` | ||||
| -- | ||||
|  | ||||
| INSERT INTO `chatgpt_users` (`id`, `username`, `nickname`, `password`, `avatar`, `salt`, `total_tokens`, `tokens`, `calls`, `img_calls`, `expired_time`, `status`, `chat_config_json`, `chat_roles_json`, `chat_models_json`, `last_login_at`, `vip`, `last_login_ip`, `created_at`, `updated_at`) VALUES | ||||
| (4, '18575670125', '极客学长@830270', 'ccc3fb7ab61b8b5d096a4a166ae21d121fc38c71bbd1be6173d9ab973214a63b', 'http://img.r9it.com/chatgpt-plus/1693981355719469.png', 'ueedue5l', 98538, 54701, 1055, 43666, 1788078636, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"elon_musk\",\"girl_friend\",\"lu_xun\",\"red_book\",\"psychiatrist\",\"translator\",\"weekly_report\",\"artist\",\"dou_yin\",\"english_trainer\",\"gpt\",\"kong_zi\",\"programmer\",\"seller\",\"steve_jobs\",\"teacher\"]', '[\"completions_pro\",\"eb-instant\",\"general\",\"generalv2\",\"chatglm_pro\",\"chatglm_lite\",\"chatglm_std\",\"gpt-3.5-turbo-16k\",\"gpt-4\",\"generalv3\",\"gpt-3.5-turbo-1106\",\"gpt-4-1106-preview\",\"gpt-4-all\"]', 1706602652, 1, '::1', '2023-06-12 16:47:17', '2024-01-30 16:17:32'), | ||||
| (91, '18575670126', '极客学长@204872', '5e4050b8dd403f593260395d9edeb9f273dbe92d15dfdd929c4a182e95da10c4', '/images/avatar/user.png', '6fj0otl8', 0, 0, 10, 0, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"completions_pro\",\"eb-instant\",\"general\",\"generalv2\",\"chatglm_pro\",\"chatglm_lite\",\"chatglm_std\",\"gpt-3.5-turbo-16k\"]', 1697184324, 1, '::1', '2023-10-13 16:01:56', '2023-12-29 17:30:27'), | ||||
| (99, '13999999999', '极客学长@396023', 'bf47d517c17ed1ead6ff2542753f9b6a132e79c29e06c3710faf1a36d800a217', '/images/avatar/user.png', 'x1s66pwd', 0, 0, 10, 5, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"]', 0, 0, '', '2023-11-23 16:27:20', '2023-12-29 17:30:27'), | ||||
| (100, '13777777777', '极客学长@292245', 'dcaf31b154432310bd700349e7de7e9dde2a3d6955a035a01fe527c7917a4f99', '/images/avatar/user.png', 'i8a53f8f', 0, 0, 10, 5, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"]', 0, 0, '', '2023-11-23 16:55:45', '2023-12-29 17:30:27'), | ||||
| (102, 'yangjian102621@gmail.com', '极客学长@207163', 'd51cec21942737083943e5c3a8f063dea034e40622ac8bd47d771f13707e4676', '/images/avatar/user.png', 'eqezapgk', 202, 202, 80, 1, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\"]', 1704448377, 0, '::1', '2024-01-05 17:48:00', '2024-01-11 14:06:57'), | ||||
| (105, '13888888888', '极客学长@551903', '4f893cc6b6d47b42fd0fcaddc55fd4a351cad74ba81ebabb4d7785f9675814da', '/images/avatar/user.png', 'cotpzi3q', 10, 10, 9, 5, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[\"eb-instant\",\"completions_pro\",\"generalv2\",\"general\",\"chatglm_pro\",\"gpt-3.5-turbo-16k\",\"chatglm_lite\",\"chatglm_std\",\"generalv3\",\"qwen-max-1201\"]', 0, 0, '', '2024-01-30 15:37:43', '2024-01-30 15:37:43'); | ||||
|  | ||||
| -- -------------------------------------------------------- | ||||
|  | ||||
| -- | ||||
| -- 表的结构 `chatgpt_user_login_logs` | ||||
| -- | ||||
|  | ||||
| DROP TABLE IF EXISTS `chatgpt_user_login_logs`; | ||||
| CREATE TABLE `chatgpt_user_login_logs` ( | ||||
|   `id` int NOT NULL, | ||||
|   `user_id` int NOT NULL COMMENT '用户ID', | ||||
|   `username` varchar(30) NOT NULL COMMENT '用户名', | ||||
|   `login_ip` char(16) NOT NULL COMMENT '登录IP', | ||||
|   `login_address` varchar(30) NOT NULL COMMENT '登录地址', | ||||
|   `created_at` datetime NOT NULL, | ||||
|   `updated_at` datetime NOT NULL | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户登录日志'; | ||||
|  | ||||
| -- | ||||
| -- 转储表的索引 | ||||
| -- | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_api_keys` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_api_keys` | ||||
|   ADD PRIMARY KEY (`id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_chat_history` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_history` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD KEY `chat_id` (`chat_id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_chat_items` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_items` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `chat_id` (`chat_id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_chat_models` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_models` | ||||
|   ADD PRIMARY KEY (`id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_chat_roles` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_roles` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `marker` (`marker`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_configs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_configs` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `marker` (`marker`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_files` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_files` | ||||
|   ADD PRIMARY KEY (`id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_functions` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_functions` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `name` (`name`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_invite_codes` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_invite_codes` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `code` (`code`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_invite_logs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_invite_logs` | ||||
|   ADD PRIMARY KEY (`id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_mj_jobs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_mj_jobs` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `task_id` (`task_id`), | ||||
|   ADD KEY `message_id` (`message_id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_orders` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_orders` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `order_no` (`order_no`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_products` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_products` | ||||
|   ADD PRIMARY KEY (`id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_rewards` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_rewards` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `tx_id` (`tx_id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_sd_jobs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_sd_jobs` | ||||
|   ADD PRIMARY KEY (`id`), | ||||
|   ADD UNIQUE KEY `task_id` (`task_id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_users` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_users` | ||||
|   ADD PRIMARY KEY (`id`); | ||||
|  | ||||
| -- | ||||
| -- 表的索引 `chatgpt_user_login_logs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_user_login_logs` | ||||
|   ADD PRIMARY KEY (`id`); | ||||
|  | ||||
| -- | ||||
| -- 在导出的表使用AUTO_INCREMENT | ||||
| -- | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_api_keys` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_api_keys` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_chat_history` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_history` | ||||
|   MODIFY `id` bigint NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_chat_items` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_items` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_chat_models` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_models` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_chat_roles` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_chat_roles` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=129; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_configs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_configs` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_files` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_files` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_functions` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_functions` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_invite_codes` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_invite_codes` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_invite_logs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_invite_logs` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_mj_jobs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_mj_jobs` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_orders` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_orders` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_products` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_products` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_rewards` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_rewards` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_sd_jobs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_sd_jobs` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_users` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_users` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=106; | ||||
|  | ||||
| -- | ||||
| -- 使用表AUTO_INCREMENT `chatgpt_user_login_logs` | ||||
| -- | ||||
| ALTER TABLE `chatgpt_user_login_logs` | ||||
|   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||
| COMMIT; | ||||
|  | ||||
| /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; | ||||
| /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; | ||||
| /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; | ||||
| @@ -116,6 +116,11 @@ const items = [ | ||||
|     index: '/admin/functions', | ||||
|     title: '函数管理', | ||||
|   }, | ||||
|   { | ||||
|     icon: 'prompt', | ||||
|     index: '/admin/chats', | ||||
|     title: '对话管理', | ||||
|   }, | ||||
|   { | ||||
|     icon: 'config', | ||||
|     index: '/admin/system', | ||||
|   | ||||
| @@ -40,8 +40,10 @@ import { | ||||
|     Sticky, | ||||
|     SwipeCell, | ||||
|     Switch, | ||||
|     Tab, | ||||
|     Tabbar, | ||||
|     TabbarItem, | ||||
|     Tabs, | ||||
|     Tag, | ||||
|     TextEllipsis, | ||||
|     Uploader | ||||
| @@ -93,6 +95,8 @@ app.use(Circle); | ||||
| app.use(Loading); | ||||
| app.use(Lazyload); | ||||
| app.use(ImagePreview); | ||||
| app.use(Tab); | ||||
| app.use(Tabs); | ||||
| app.use(router).use(ElementPlus).mount('#app') | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -156,6 +156,12 @@ const routes = [ | ||||
|                 meta: {title: '函数管理'}, | ||||
|                 component: () => import('@/views/admin/Functions.vue'), | ||||
|             }, | ||||
|             { | ||||
|                 path: '/admin/chats', | ||||
|                 name: 'admin-chats', | ||||
|                 meta: {title: '对话管理'}, | ||||
|                 component: () => import('@/views/admin/ChatList.vue'), | ||||
|             }, | ||||
|         ] | ||||
|     }, | ||||
|  | ||||
| @@ -183,9 +189,9 @@ const routes = [ | ||||
|                 component: () => import('@/views/mobile/Profile.vue'), | ||||
|             }, | ||||
|             { | ||||
|                 path: '/mobile/apps', | ||||
|                 name: 'mobile-app', | ||||
|                 component: () => import('@/views/mobile/ChatApps.vue'), | ||||
|                 path: '/mobile/img-wall', | ||||
|                 name: 'mobile-img-wall', | ||||
|                 component: () => import('@/views/mobile/ImgWall.vue'), | ||||
|             }, | ||||
|         ] | ||||
|     }, | ||||
|   | ||||
| @@ -262,7 +262,6 @@ import 'highlight.js/styles/a11y-dark.css' | ||||
| import { | ||||
|   dateFormat, | ||||
|   escapeHTML, | ||||
|   isImage, | ||||
|   isMobile, | ||||
|   processContent, | ||||
|   randString, | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
|   <div class="custom-scroll"> | ||||
|     <div class="page-invitation" :style="{height: listBoxHeight + 'px'}"> | ||||
|     <div class="page-invitation"> | ||||
|       <div class="inner"> | ||||
|         <h2>会员推广计划</h2> | ||||
|         <div class="share-box"> | ||||
| @@ -97,7 +97,6 @@ import InviteList from "@/components/InviteList.vue"; | ||||
| import {checkSession} from "@/action/session"; | ||||
| import {useRouter} from "vue-router"; | ||||
|  | ||||
| const listBoxHeight = window.innerHeight | ||||
| const inviteURL = ref("") | ||||
| const qrImg = ref("") | ||||
| const inviteChatCalls = ref(0) | ||||
| @@ -163,6 +162,8 @@ onMounted(() => { | ||||
|   overflow-y visible | ||||
|  | ||||
|   .inner { | ||||
|     display flex | ||||
|     flex-flow column | ||||
|     max-width 1000px | ||||
|     width 100% | ||||
|     color #e1e1e1 | ||||
| @@ -251,6 +252,10 @@ onMounted(() => { | ||||
|       } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     .invite-logs { | ||||
|       padding-bottom 20px | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -9,7 +9,8 @@ | ||||
|         <div class="header">{{ title }}</div> | ||||
|         <div class="content"> | ||||
|           <div class="block"> | ||||
|             <el-input placeholder="手机号/邮箱地址" size="large" v-model="username" autocomplete="off"> | ||||
|             <el-input placeholder="手机号/邮箱地址" size="large" v-model="username" autocomplete="off" autofocus | ||||
|                       @keyup="handleKeyup"> | ||||
|               <template #prefix> | ||||
|                 <el-icon> | ||||
|                   <UserFilled/> | ||||
| @@ -19,7 +20,8 @@ | ||||
|           </div> | ||||
|  | ||||
|           <div class="block"> | ||||
|             <el-input placeholder="请输入密码" size="large" v-model="password" show-password autocomplete="off"> | ||||
|             <el-input placeholder="请输入密码" size="large" v-model="password" show-password autocomplete="off" | ||||
|                       @keyup="handleKeyup"> | ||||
|               <template #prefix> | ||||
|                 <el-icon> | ||||
|                   <Lock/> | ||||
| @@ -84,13 +86,6 @@ const handleKeyup = (e) => { | ||||
|   } | ||||
| }; | ||||
|  | ||||
| onMounted(() => { | ||||
|   document.addEventListener('keyup', handleKeyup) | ||||
| }) | ||||
| onUnmounted(() => { | ||||
|   document.removeEventListener('keyup', handleKeyup) | ||||
| }) | ||||
|  | ||||
| const login = function () { | ||||
|   if (!validateMobile(username.value) && !validateEmail(username.value)) { | ||||
|     return ElMessage.error("请输入合法的手机号/邮箱地址") | ||||
|   | ||||
							
								
								
									
										386
									
								
								web/src/views/admin/ChatList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										386
									
								
								web/src/views/admin/ChatList.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,386 @@ | ||||
| <template> | ||||
|   <div class="container chat-list"> | ||||
|     <el-tabs v-model="activeName" @tab-change="handleChange"> | ||||
|       <el-tab-pane label="对话列表" name="chat" v-loading="data.chat.loading"> | ||||
|         <div class="handle-box"> | ||||
|           <el-input v-model.number="data.chat.query.user_id" placeholder="账户ID" class="handle-input mr10" | ||||
|                     @keyup="searchChat($event)"></el-input> | ||||
|           <el-input v-model="data.chat.query.title" placeholder="对话标题" class="handle-input mr10" | ||||
|                     @keyup="searchChat($event)"></el-input> | ||||
|           <el-date-picker | ||||
|               v-model="data.chat.query.created_at" | ||||
|               type="daterange" | ||||
|               start-placeholder="开始日期" | ||||
|               end-placeholder="结束日期" | ||||
|               format="YYYY-MM-DD" | ||||
|               value-format="YYYY-MM-DD" | ||||
|               style="margin-right: 10px;width: 200px; position: relative;top:3px;" | ||||
|           /> | ||||
|           <el-button type="primary" :icon="Search" @click="fetchChatData">搜索</el-button> | ||||
|         </div> | ||||
|  | ||||
|         <el-row> | ||||
|           <el-table :data="data.chat.items" :row-key="row => row.id" table-layout="auto"> | ||||
|             <el-table-column prop="user_id" label="账户ID"/> | ||||
|             <el-table-column prop="username" label="账户"/> | ||||
|             <el-table-column prop="title" label="标题"/> | ||||
|             <el-table-column prop="model" label="模型"/> | ||||
|             <el-table-column prop="msg_num" label="消息数量"/> | ||||
|             <el-table-column prop="token" label="消耗算力"/> | ||||
|  | ||||
|             <el-table-column label="创建时间"> | ||||
|               <template #default="scope"> | ||||
|                 <span>{{ dateFormat(scope.row['created_at']) }}</span> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|  | ||||
|             <el-table-column label="操作" width="180"> | ||||
|               <template #default="scope"> | ||||
|                 <el-button size="small" type="primary" @click="showMessages(scope.row)">查看</el-button> | ||||
|                 <el-popconfirm title="确定要删除当前记录吗?" @confirm="removeChat(scope.row)"> | ||||
|                   <template #reference> | ||||
|                     <el-button size="small" type="danger">删除</el-button> | ||||
|                   </template> | ||||
|                 </el-popconfirm> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|           </el-table> | ||||
|         </el-row> | ||||
|  | ||||
|         <div class="pagination"> | ||||
|           <el-pagination v-if="data.chat.total > 0" background | ||||
|                          layout="total,prev, pager, next" | ||||
|                          :hide-on-single-page="true" | ||||
|                          v-model:current-page="data.chat.page" | ||||
|                          v-model:page-size="data.chat.pageSize" | ||||
|                          @current-change="fetchChatData()" | ||||
|                          :total="data.chat.total"/> | ||||
|  | ||||
|         </div> | ||||
|       </el-tab-pane> | ||||
|       <el-tab-pane label="消息记录" name="message"> | ||||
|         <div class="handle-box"> | ||||
|           <el-input v-model.number="data.message.query.user_id" placeholder="账户ID" class="handle-input mr10" | ||||
|                     @keyup="searchMessage($event)"></el-input> | ||||
|           <el-input v-model="data.message.query.content" placeholder="消息内容" class="handle-input mr10" | ||||
|                     @keyup="searchMessage($event)"></el-input> | ||||
|           <el-input v-model="data.message.query.model" placeholder="模型" class="handle-input mr10" | ||||
|                     @keyup="searchMessage($event)"></el-input> | ||||
|           <el-date-picker | ||||
|               v-model="data.message.query.created_at" | ||||
|               type="daterange" | ||||
|               start-placeholder="开始日期" | ||||
|               end-placeholder="结束日期" | ||||
|               format="YYYY-MM-DD" | ||||
|               value-format="YYYY-MM-DD" | ||||
|               style="margin-right: 10px;width: 200px; position: relative;top:3px;" | ||||
|           /> | ||||
|           <el-button type="primary" :icon="Search" @click="fetchMessageData">搜索</el-button> | ||||
|         </div> | ||||
|  | ||||
|         <el-row> | ||||
|           <el-table :data="data.message.items" :row-key="row => row.id" table-layout="auto"> | ||||
|             <el-table-column prop="user_id" label="账户ID"/> | ||||
|             <el-table-column prop="username" label="账户"/> | ||||
|             <el-table-column label="角色"> | ||||
|               <template #default="scope"> | ||||
|                 <el-avatar :size="30" :src="scope.row.icon"/> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|             <el-table-column prop="model" label="模型"/> | ||||
|  | ||||
|             <el-table-column label="消息内容"> | ||||
|               <template #default="scope"> | ||||
|                 <el-text style="width: 200px" truncated @click="showContent(scope.row.content)"> | ||||
|                   {{ scope.row.content }} | ||||
|                 </el-text> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|  | ||||
|             <el-table-column prop="token" label="算力"/> | ||||
|  | ||||
|             <el-table-column label="创建时间"> | ||||
|               <template #default="scope"> | ||||
|                 <span>{{ dateFormat(scope.row['created_at']) }}</span> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|  | ||||
|             <el-table-column label="操作" width="180"> | ||||
|               <template #default="scope"> | ||||
|                 <el-button size="small" type="primary" @click="showContent(scope.row.content)">查看</el-button> | ||||
|                 <el-popconfirm title="确定要删除当前记录吗?" @confirm="removeMessage(scope.row)"> | ||||
|                   <template #reference> | ||||
|                     <el-button size="small" type="danger">删除</el-button> | ||||
|                   </template> | ||||
|                 </el-popconfirm> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|           </el-table> | ||||
|         </el-row> | ||||
|  | ||||
|         <div class="pagination"> | ||||
|           <el-pagination v-if="data.message.total > 0" background | ||||
|                          layout="total,prev, pager, next" | ||||
|                          :hide-on-single-page="true" | ||||
|                          v-model:current-page="data.message.page" | ||||
|                          v-model:page-size="data.message.pageSize" | ||||
|                          @current-change="fetchMessageData()" | ||||
|                          :total="data.message.total"/> | ||||
|  | ||||
|         </div> | ||||
|       </el-tab-pane> | ||||
|     </el-tabs> | ||||
|  | ||||
|  | ||||
|     <el-dialog | ||||
|         v-model="showContentDialog" | ||||
|         title="消息详情" | ||||
|     > | ||||
|       <div v-html="dialogContent" style="overflow: auto; max-height: 300px"></div> | ||||
|     </el-dialog> | ||||
|  | ||||
|     <el-dialog | ||||
|         v-model="showChatItemDialog" | ||||
|         title="对话详情" | ||||
|     > | ||||
|       <div class="chat-box common-layout"> | ||||
|         <div v-for="item in messages" :key="item.id"> | ||||
|           <chat-prompt | ||||
|               v-if="item.type==='prompt'" | ||||
|               :icon="item.icon" | ||||
|               :created-at="dateFormat(item['created_at'])" | ||||
|               :tokens="item['tokens']" | ||||
|               :model="item.model" | ||||
|               :content="item.content"/> | ||||
|           <chat-reply v-else-if="item.type==='reply'" | ||||
|                       :icon="item.icon" | ||||
|                       :org-content="item.orgContent" | ||||
|                       :created-at="dateFormat(item['created_at'])" | ||||
|                       :tokens="item['tokens']" | ||||
|                       :content="item.content"/> | ||||
|         </div> | ||||
|       </div><!-- end chat box --> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup> | ||||
| import {onMounted, ref} from "vue"; | ||||
| import {httpGet, httpPost} from "@/utils/http"; | ||||
| import {ElMessage} from "element-plus"; | ||||
| import {dateFormat, processContent, removeArrayItem} from "@/utils/libs"; | ||||
| import {Search} from "@element-plus/icons-vue"; | ||||
| import 'highlight.js/styles/a11y-dark.css' | ||||
| import hl from "highlight.js"; | ||||
| import ChatPrompt from "@/components/ChatPrompt.vue"; | ||||
| import ChatReply from "@/components/ChatReply.vue"; | ||||
|  | ||||
| // 变量定义 | ||||
| const data = ref({ | ||||
|   "chat": { | ||||
|     items: [], | ||||
|     query: {title: "", created_at: [], page: 1, page_size: 15}, | ||||
|     total: 0, | ||||
|     page: 1, | ||||
|     pageSize: 15, | ||||
|     loading: true | ||||
|   }, | ||||
|   "message": { | ||||
|     items: [], | ||||
|     query: {title: "", created_at: [], page: 1, page_size: 15}, | ||||
|     total: 0, | ||||
|     page: 1, | ||||
|     pageSize: 15, | ||||
|     loading: true | ||||
|   } | ||||
| }) | ||||
| const items = ref([]) | ||||
| const query = ref({title: "", created_at: []}) | ||||
| const total = ref(0) | ||||
| const page = ref(1) | ||||
| const pageSize = ref(15) | ||||
| const loading = ref(true) | ||||
| const activeName = ref("chat") | ||||
|  | ||||
| onMounted(() => { | ||||
|   fetchChatData() | ||||
| }) | ||||
|  | ||||
| const handleChange = (tab) => { | ||||
|   if (tab === "chat") { | ||||
|     fetchChatData() | ||||
|   } else if (tab === "message") { | ||||
|     fetchMessageData() | ||||
|   } | ||||
| } | ||||
|  | ||||
| // 搜索对话 | ||||
| const searchChat = (evt) => { | ||||
|   if (evt.keyCode === 13) { | ||||
|     fetchChatData() | ||||
|   } | ||||
| } | ||||
|  | ||||
| // 搜索消息 | ||||
| const searchMessage = (evt) => { | ||||
|   if (evt.keyCode === 13) { | ||||
|     fetchMessageData() | ||||
|   } | ||||
| } | ||||
|  | ||||
| // 获取数据 | ||||
| const fetchChatData = () => { | ||||
|   const d = data.value.chat | ||||
|   d.query.page = d.page | ||||
|   d.query.page_size = d.pageSize | ||||
|   httpPost('/api/admin/chat/list', d.query).then((res) => { | ||||
|     if (res.data) { | ||||
|       d.items = res.data.items | ||||
|       d.total = res.data.total | ||||
|       d.page = res.data.page | ||||
|       d.pageSize = res.data.page_size | ||||
|     } | ||||
|     d.loading = false | ||||
|   }).catch(e => { | ||||
|     ElMessage.error("获取数据失败:" + e.message); | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const fetchMessageData = () => { | ||||
|   const d = data.value.message | ||||
|   d.query.page = d.page | ||||
|   d.query.page_size = d.pageSize | ||||
|   httpPost('/api/admin/chat/message', d.query).then((res) => { | ||||
|     if (res.data) { | ||||
|       d.items = res.data.items | ||||
|       d.total = res.data.total | ||||
|       d.page = res.data.page | ||||
|       d.pageSize = res.data.page_size | ||||
|     } | ||||
|     d.loading = false | ||||
|   }).catch(e => { | ||||
|     ElMessage.error("获取数据失败:" + e.message); | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const removeChat = function (row) { | ||||
|   httpGet('/api/admin/chat/remove?chat_id=' + row.chat_id).then(() => { | ||||
|     ElMessage.success("删除成功!") | ||||
|     fetchChatData() | ||||
|   }).catch((e) => { | ||||
|     ElMessage.error("删除失败:" + e.message) | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const removeMessage = function (row) { | ||||
|   httpGet('/api/admin/chat/message/remove?id=' + row.id).then(() => { | ||||
|     ElMessage.success("删除成功!") | ||||
|     fetchMessageData() | ||||
|   }).catch((e) => { | ||||
|     ElMessage.error("删除失败:" + e.message) | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const latexPlugin = require('markdown-it-latex2img') | ||||
| const mathjaxPlugin = require('markdown-it-mathjax') | ||||
| const md = require('markdown-it')({ | ||||
|   breaks: true, | ||||
|   html: true, | ||||
|   linkify: true, | ||||
|   typographer: true, | ||||
|   highlight: function (str, lang) { | ||||
|     if (lang && hl.getLanguage(lang)) { | ||||
|       // 处理代码高亮 | ||||
|       const preCode = hl.highlight(lang, str, true).value | ||||
|       // 将代码包裹在 pre 中 | ||||
|       return `<pre class="code-container"><code class="language-${lang} hljs">${preCode}</code></pre>` | ||||
|     } | ||||
|  | ||||
|     // 处理代码高亮 | ||||
|     const preCode = md.utils.escapeHtml(str) | ||||
|     // 将代码包裹在 pre 中 | ||||
|     return `<pre class="code-container"><code class="language-${lang} hljs">${preCode}</code></pre>` | ||||
|   } | ||||
| }); | ||||
| md.use(latexPlugin) | ||||
| md.use(mathjaxPlugin) | ||||
|  | ||||
| const showContentDialog = ref(false) | ||||
| const dialogContent = ref("") | ||||
| const showContent = (content) => { | ||||
|   showContentDialog.value = true | ||||
|   dialogContent.value = md.render(processContent(content)) | ||||
| } | ||||
|  | ||||
| const showChatItemDialog = ref(false) | ||||
| const messages = ref([]) | ||||
| const showMessages = (row) => { | ||||
|   showChatItemDialog.value = true | ||||
|   messages.value = [] | ||||
|   httpGet('/api/admin/chat/history?chat_id=' + row.chat_id).then(res => { | ||||
|     const data = res.data | ||||
|     for (let i = 0; i < data.length; i++) { | ||||
|       data[i].orgContent = data[i].content; | ||||
|       data[i].content = md.render(processContent(data[i].content)) | ||||
|       messages.value.push(data[i]); | ||||
|     } | ||||
|   }).catch(e => { | ||||
|     // TODO: 显示重新加载按钮 | ||||
|     ElMessage.error('加载聊天记录失败:' + e.message); | ||||
|   }) | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" scoped> | ||||
| .chat-list { | ||||
|  | ||||
|   .handle-box { | ||||
|     .handle-input { | ||||
|       max-width 150px; | ||||
|       margin-right 10px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .opt-box { | ||||
|     padding-bottom: 10px; | ||||
|     display flex; | ||||
|     justify-content flex-end | ||||
|  | ||||
|     .el-icon { | ||||
|       margin-right: 5px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .el-select { | ||||
|     width: 100% | ||||
|   } | ||||
|  | ||||
|   .chat-box { | ||||
|     overflow-y: auto; | ||||
|     overflow-x hidden | ||||
|  | ||||
|     // 变量定义 | ||||
|     --content-font-size: 16px; | ||||
|     --content-color: #c1c1c1; | ||||
|  | ||||
|     font-family: 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; | ||||
|     height 90vh | ||||
|  | ||||
|     .chat-line { | ||||
|       // 隐藏滚动条 | ||||
|  | ||||
|       ::-webkit-scrollbar { | ||||
|         width: 0; | ||||
|         height: 0; | ||||
|         background-color: transparent; | ||||
|       } | ||||
|  | ||||
|       font-size: 14px; | ||||
|       display: flex; | ||||
|       align-items: flex-start; | ||||
|  | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
| </style> | ||||
| @@ -5,7 +5,8 @@ | ||||
|         <div class="header">{{ title }}</div> | ||||
|         <div class="content"> | ||||
|           <div class="block"> | ||||
|             <el-input placeholder="请输入用户名" size="large" v-model="username" autocomplete="off"> | ||||
|             <el-input placeholder="请输入用户名" size="large" v-model="username" autocomplete="off" autofocus | ||||
|                       @keyup="keyupHandle"> | ||||
|               <template #prefix> | ||||
|                 <el-icon> | ||||
|                   <UserFilled/> | ||||
| @@ -15,7 +16,8 @@ | ||||
|           </div> | ||||
|  | ||||
|           <div class="block"> | ||||
|             <el-input placeholder="请输入密码" size="large" v-model="password" show-password autocomplete="off"> | ||||
|             <el-input placeholder="请输入密码" size="large" v-model="password" show-password autocomplete="off" | ||||
|                       @keyup="keyupHandle"> | ||||
|               <template #prefix> | ||||
|                 <el-icon> | ||||
|                   <Lock/> | ||||
| @@ -58,13 +60,12 @@ checkAdminSession().then(() => { | ||||
|   router.push("/admin") | ||||
| }).catch(() => { | ||||
| }) | ||||
| onMounted(() => { | ||||
|   document.addEventListener('keyup', (e) => { | ||||
|     if (e.key === 'Enter') { | ||||
|       login(); | ||||
|     } | ||||
|   }); | ||||
| }) | ||||
|  | ||||
| const keyupHandle = (e) => { | ||||
|   if (e.key === 'Enter') { | ||||
|     login(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| const login = function () { | ||||
|   if (username.value === '') { | ||||
|   | ||||
| @@ -1,72 +0,0 @@ | ||||
| <template> | ||||
|   <div class="mobile-setting container"> | ||||
|     <van-nav-bar :title="title"/> | ||||
|  | ||||
|     <div class="content"> | ||||
|       <van-empty description="功能正在开发中"/> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup> | ||||
| import {onMounted, ref} from "vue"; | ||||
| import {httpGet, httpPost} from "@/utils/http"; | ||||
| import {showFailToast, showSuccessToast} from "vant"; | ||||
| import {ElMessage} from "element-plus"; | ||||
|  | ||||
| const title = ref('图片创作广场') | ||||
| const form = ref({ | ||||
|   chat_config: { | ||||
|     api_keys: {OpenAI: "", Azure: "", ChatGLM: ""} | ||||
|   } | ||||
| }) | ||||
| const showPicker = ref(false) | ||||
| const models = ref([]) | ||||
|  | ||||
| onMounted(() => { | ||||
|   // 获取最新用户信息 | ||||
|   httpGet('/api/user/profile').then(res => { | ||||
|     form.value = res.data | ||||
|     form.value.chat_config.api_keys = res.data.chat_config.api_keys ?? {OpenAI: "", Azure: "", ChatGLM: ""} | ||||
|   }).catch(() => { | ||||
|     showFailToast('获取用户信息失败') | ||||
|   }); | ||||
|  | ||||
|   // 加载系统配置 | ||||
|   httpGet('/api/admin/config/get?key=system').then(res => { | ||||
|     const mds = res.data.models; | ||||
|     mds.forEach(item => { | ||||
|       models.value.push({text: item, value: item}) | ||||
|     }) | ||||
|   }).catch(e => { | ||||
|     ElMessage.error("加载系统配置失败: " + e.message) | ||||
|   }) | ||||
| }) | ||||
|  | ||||
| const selectModel = (item) => { | ||||
|   showPicker.value = false | ||||
|   form.value.chat_config.model = item.selectedValues[0] | ||||
| } | ||||
|  | ||||
| const save = () => { | ||||
|   httpPost('/api/user/profile/update', form.value).then(() => { | ||||
|     showSuccessToast('保存成功') | ||||
|   }).catch(() => { | ||||
|     showFailToast('保存失败') | ||||
|   }) | ||||
| } | ||||
|  | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus"> | ||||
| .mobile-setting { | ||||
|   .content { | ||||
|     padding-top 60px | ||||
|  | ||||
|     .van-field__label { | ||||
|       width 100px | ||||
|       text-align right | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
| @@ -6,7 +6,7 @@ | ||||
|       <van-tabbar route v-model="active" @change="onChange"> | ||||
|         <van-tabbar-item to="/mobile/chat" name="home" icon="chat-o">对话</van-tabbar-item> | ||||
|         <van-tabbar-item to="/mobile/mj" name="imageMj" icon="photo-o">绘图</van-tabbar-item> | ||||
|         <van-tabbar-item to="/mobile/apps" name="apps" icon="apps-o">广场</van-tabbar-item> | ||||
|         <van-tabbar-item to="/mobile/img-wall" name="apps" icon="apps-o">广场</van-tabbar-item> | ||||
|         <van-tabbar-item to="/mobile/profile" name="profile" icon="user-o">我的</van-tabbar-item> | ||||
|       </van-tabbar> | ||||
|  | ||||
|   | ||||
| @@ -269,15 +269,6 @@ onMounted(() => { | ||||
|   }).catch(() => { | ||||
|     router.push('/login') | ||||
|   }); | ||||
|  | ||||
|   const clipboard = new Clipboard('.copy-prompt'); | ||||
|   clipboard.on('success', () => { | ||||
|     ElMessage.success("复制成功!"); | ||||
|   }) | ||||
|  | ||||
|   clipboard.on('error', () => { | ||||
|     ElMessage.error('复制失败!'); | ||||
|   }) | ||||
| }) | ||||
|  | ||||
| const heartbeatHandle = ref(null) | ||||
|   | ||||
							
								
								
									
										132
									
								
								web/src/views/mobile/ImgWall.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								web/src/views/mobile/ImgWall.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| <template> | ||||
|   <div class="img-wall container"> | ||||
|     <van-nav-bar :title="title"/> | ||||
|  | ||||
|     <div class="content"> | ||||
|       <van-tabs v-model:active="activeName"> | ||||
|         <van-tab title="MidJourney" name="mj"> | ||||
|           <van-list | ||||
|               v-model:error="data['mj'].error" | ||||
|               v-model:loading="data['mj'].loading" | ||||
|               :finished="data['mj'].finished" | ||||
|               error-text="请求失败,点击重新加载" | ||||
|               finished-text="没有更多了" | ||||
|               @load="onLoad" | ||||
|           > | ||||
|             <van-cell v-for="item in data['mj'].data" :key="item.id"> | ||||
|               <van-image :src="item['img_thumb']" @click="showPrompt(item)" fit="cover"/> | ||||
|             </van-cell> | ||||
|           </van-list> | ||||
|         </van-tab> | ||||
|         <van-tab title="StableDiffusion" name="sd"> | ||||
|           <van-list | ||||
|               v-model:error="data['sd'].error" | ||||
|               v-model:loading="data['sd'].loading" | ||||
|               :finished="data['sd'].finished" | ||||
|               error-text="请求失败,点击重新加载" | ||||
|               finished-text="没有更多了" | ||||
|               @load="onLoad" | ||||
|           > | ||||
|             <van-cell v-for="item in data['sd'].data" :key="item.id"> | ||||
|               <van-image :src="item['img_thumb']" @click="showPrompt(item)" fit="cover"/> | ||||
|             </van-cell> | ||||
|           </van-list> | ||||
|         </van-tab> | ||||
|         <van-tab title="DALLE3" name="dalle3"> | ||||
|           <van-empty description="功能正在开发中"/> | ||||
|         </van-tab> | ||||
|       </van-tabs> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup> | ||||
| import {onMounted, ref} from "vue"; | ||||
| import {httpGet, httpPost} from "@/utils/http"; | ||||
| import {showDialog, showFailToast, showSuccessToast} from "vant"; | ||||
| import {ElMessage} from "element-plus"; | ||||
|  | ||||
| const title = ref('图片创作广场') | ||||
| const activeName = ref("mj") | ||||
| const data = ref({ | ||||
|   "mj": { | ||||
|     loading: false, | ||||
|     finished: false, | ||||
|     error: false, | ||||
|     page: 1, | ||||
|     pageSize: 12, | ||||
|     url: "/api/mj/jobs", | ||||
|     data: [] | ||||
|   }, | ||||
|   "sd": { | ||||
|     loading: false, | ||||
|     finished: false, | ||||
|     error: false, | ||||
|     page: 1, | ||||
|     pageSize: 12, | ||||
|     url: "/api/sd/jobs", | ||||
|     data: [] | ||||
|   }, | ||||
|   "dalle3": { | ||||
|     loading: false, | ||||
|     finished: false, | ||||
|     error: false, | ||||
|     page: 1, | ||||
|     pageSize: 12, | ||||
|     url: "/api/dalle3/jobs", | ||||
|     data: [] | ||||
|   } | ||||
| }) | ||||
|  | ||||
| const onLoad = () => { | ||||
|   const d = data.value[activeName.value] | ||||
|   httpGet(`${d.url}?status=1&page=${d.page}&page_size=${d.pageSize}&publish=true`).then(res => { | ||||
|     d.loading = false | ||||
|     if (res.data.length === 0) { | ||||
|       d.finished = true | ||||
|       return | ||||
|     } | ||||
|  | ||||
|     // 生成缩略图 | ||||
|     const imageList = res.data | ||||
|     for (let i = 0; i < imageList.length; i++) { | ||||
|       imageList[i]["img_thumb"] = imageList[i]["img_url"] + "?imageView2/4/w/300/h/0/q/75" | ||||
|     } | ||||
|     if (imageList.length < d.pageSize) { | ||||
|       d.finished = true | ||||
|     } | ||||
|     if (d.data.length === 0) { | ||||
|       d.data = imageList | ||||
|     } else { | ||||
|       d.data = d.data.concat(imageList) | ||||
|     } | ||||
|     d.page += 1 | ||||
|   }).catch(() => { | ||||
|     d.error = true | ||||
|     showFailToast("加载图片数据失败") | ||||
|   }) | ||||
| }; | ||||
|  | ||||
| const showPrompt = (item) => { | ||||
|   showDialog({ | ||||
|     title: "绘画提示词", | ||||
|     message: item.prompt, | ||||
|   }).then(() => { | ||||
|     // on close | ||||
|   }); | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus"> | ||||
| .img-wall { | ||||
|   .content { | ||||
|     padding-top 60px | ||||
|  | ||||
|     .van-cell__value { | ||||
|       .van-image { | ||||
|         width 100% | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
| @@ -6,12 +6,11 @@ | ||||
|       <van-form @submit="save"> | ||||
|         <van-cell-group inset v-model="form"> | ||||
|           <van-field | ||||
|               v-model="form.mobile" | ||||
|               name="手机号" | ||||
|               label="手机号" | ||||
|               v-model="form.username" | ||||
|               name="账号" | ||||
|               label="账号" | ||||
|               readonly | ||||
|               disabled | ||||
|               placeholder="手机号" | ||||
|           /> | ||||
|           <van-field label="头像"> | ||||
|             <template #input> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user