mirror of
				https://github.com/yangjian102621/geekai.git
				synced 2025-10-31 14:23:43 +08:00 
			
		
		
		
	Compare commits
	
		
			60 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 754ba02263 | ||
|  | 7ddf57ae06 | ||
|  | cc5180a6f7 | ||
|  | 9f44c34d34 | ||
|  | b793b81768 | ||
|  | 233f6e00f0 | ||
|  | b7dba68549 | ||
|  | bdea12c51a | ||
|  | a27d9ea259 | ||
|  | 7cd824c284 | ||
|  | e27d95e2b5 | ||
|  | 6839827db0 | ||
|  | d6a04f96fe | ||
|  | 5f820b9dc1 | ||
|  | 3cc2263dc7 | ||
|  | f0a3c5d8ae | ||
|  | 2a4ef27774 | ||
|  | 2b057f32aa | ||
|  | bc6451026f | ||
|  | 99fd596862 | ||
|  | f0959b5df6 | ||
|  | 6788edbe9d | ||
|  | 3895305882 | ||
|  | 1b0938b33f | ||
|  | c2acbaaa94 | ||
|  | 02faff461a | ||
|  | e18e5a38c6 | ||
|  | 2f9b1b7835 | ||
|  | 717b137a6d | ||
|  | f755bdccae | ||
|  | 4bba77ab47 | ||
|  | 6944a32ff3 | ||
|  | 5742b40aee | ||
|  | 7f1ec90748 | ||
|  | 4a99be2f15 | ||
|  | bee19392c1 | ||
|  | 00d31a2379 | ||
|  | 5d65505ab7 | ||
|  | 3dc7d0516a | ||
|  | 50335ebc2d | ||
|  | bcadee7290 | ||
|  | cac3194d5b | ||
|  | d45f9fbad6 | ||
|  | d98b08d7cd | ||
|  | 5a8fe5a6cf | ||
|  | 36c27d6092 | ||
|  | 3ab29da8f0 | ||
|  | 3699f024f1 | ||
|  | 114d0088dc | ||
|  | 43b6665370 | ||
|  | 5fb9f84182 | ||
|  | e35c34ad9a | ||
|  | 1a4d798f8b | ||
|  | afb91a7023 | ||
|  | dc4c1f7877 | ||
|  | bbc8fe2b40 | ||
|  | 57c932f07c | ||
|  | 8b3b0139b0 | ||
|  | 31828a3336 | ||
|  | 9a797bb4a5 | 
							
								
								
									
										31
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,4 +1,34 @@ | |||||||
| # 更新日志 | # 更新日志 | ||||||
|  | ## v4.0.8 | ||||||
|  | * 功能优化:升级 mathjax 公式解析插件,修复公式因为图片访问限制而无法显示的问题 | ||||||
|  | * 功能优化:当数据库更新失败的时候记录错误日志 | ||||||
|  | * 功能优化:聊天输入框会随着输入内容的增多自动调整高度 | ||||||
|  | * Bug修复:修复移动端聊天页面模型切换不生效的Bug | ||||||
|  | * 功能优化:给PC端扫码支付增加签名验证和有效期验证 | ||||||
|  | * Bug修复:修复支付码生成API权限控制的问题 | ||||||
|  | * Bug修复:模型算力设置为0时,不扣减用户算力,并且不记录算力消费日志 | ||||||
|  | * 功能优化:新增随机背景配置项,可以在后台设置,首页使用 Bing 壁纸作为背景图片 | ||||||
|  | * 功能新增:H5端支持 Dalle 绘图 | ||||||
|  |  | ||||||
|  | ## v4.0.7 | ||||||
|  |  | ||||||
|  | * 功能优化:升级quic-go,支持 Go1.21 | ||||||
|  | * 功能优化:添加导航菜单的时候支持框入外部链接,并支持上传自定义菜单图片 | ||||||
|  | * Bug修复:修复弹窗等于图形验证码一直验证失败的问题 | ||||||
|  | * 功能重构:重构前端 UI 页面,增加顶部导航 | ||||||
|  | * 功能优化:优化 Vue 非父子组件之间的通信方式 | ||||||
|  | * 功能优化:优化 ItemList 组件,自动根据页面宽度计算 cols 数量 | ||||||
|  |  | ||||||
|  | ## v4.0.6 | ||||||
|  |  | ||||||
|  | * Bug修复:修复PC端画廊页面的瀑布流组件样式错乱问题 | ||||||
|  | * 功能新增:给思维导图增加 ToolBar,实现思维导图的放大缩小和定位 | ||||||
|  | * Bug修复:修复思维导图不扣费的Bug | ||||||
|  | * Bug修复:修复管理后台角色删除失败的Bug | ||||||
|  | * Bug修复:兼容最新版秋叶SD懒人包的 SD API,新增 scheduler 参数 | ||||||
|  | * 功能优化:支持在管理后台配置 AI 绘图相关配置,包括 SD, MJ-PLUS, MJ-PROXY | ||||||
|  | * Bug修复:修复注册用户提示注册人数达到上限的 Bug | ||||||
|  | * 功能优化:将MJ,SD,Dall绘画页面的任务列表全改成瀑布流组件 | ||||||
|  |  | ||||||
| ## v4.0.5 | ## v4.0.5 | ||||||
|  |  | ||||||
| @@ -38,6 +68,7 @@ | |||||||
| * 功能新增:支持管理后台 Logo 修改 | * 功能新增:支持管理后台 Logo 修改 | ||||||
|  |  | ||||||
| ## 4.0.2 | ## 4.0.2 | ||||||
|  |  | ||||||
| * 功能新增:支持前端菜单可以配置 | * 功能新增:支持前端菜单可以配置 | ||||||
| * 功能优化:在登录和注册界面标题显示软件版本号 | * 功能优化:在登录和注册界面标题显示软件版本号 | ||||||
| * 功能优化:MJ 绘画支持 --sref 和 --cref 图片一致性参数 | * 功能优化:MJ 绘画支持 --sref 和 --cref 图片一致性参数 | ||||||
|   | |||||||
							
								
								
									
										59
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| # GeekAI | # GeekAI | ||||||
| ### 本项目已经正式更名为 GeekAI,请大家及时更新代码克隆地址。 | > 根据[《生成式人工智能服务管理暂行办法》](https://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm)的要求,请勿对中国地区公众提供一切未经备案的生成式人工智能服务。 | ||||||
|  |  | ||||||
| **GeekAI** 基于 AI 大语言模型 API 实现的 AI 助手全套开源解决方案,自带运营管理后台,开箱即用。集成了 OpenAI, Azure, | **GeekAI** 基于 AI 大语言模型 API 实现的 AI 助手全套开源解决方案,自带运营管理后台,开箱即用。集成了 OpenAI, Azure, | ||||||
| ChatGLM,讯飞星火,文心一言等多个平台的大语言模型。集成了 MidJourney 和 Stable Diffusion AI绘画功能。 | ChatGLM,讯飞星火,文心一言等多个平台的大语言模型。集成了 MidJourney 和 Stable Diffusion AI绘画功能。 | ||||||
| @@ -26,63 +26,16 @@ ChatGLM,讯飞星火,文心一言等多个平台的大语言模型。集成了 | |||||||
| - [x] 支持网站 Logo 版权等信息的修改 | - [x] 支持网站 Logo 版权等信息的修改 | ||||||
|  |  | ||||||
| ## 功能截图 | ## 功能截图 | ||||||
|  | 请参考 [GeekAI 项目介绍](https://docs.geekai.me/info/)。 | ||||||
| ### PC 端聊天界面 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### AI 对话界面 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### MidJourney 专业绘画界面 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### Stable-Diffusion 专业绘画页面 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### 绘图作品展 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### AI应用列表 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### 会员充值 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### 自动调用函数插件 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### 管理后台 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### 移动端 Web 页面 |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### 体验地址 | ### 体验地址 | ||||||
|  |  | ||||||
| > 免费体验地址:[https://ai.r9it.com/chat](https://ai.r9it.com/chat) <br/> | > 免费体验地址:[https://chat.geekai.me](https://chat.geekai.me) <br/> | ||||||
| > **注意:请合法使用,禁止输出任何敏感、不友好或违规的内容!!!** | > **注意:请合法使用,禁止输出任何敏感、不友好或违规的内容!!!** | ||||||
|  |  | ||||||
| ## 快速部署 | ## 快速部署 | ||||||
|  |  | ||||||
| 请参考文档 [**GeekAI 快速部署**](https://ai.r9it.com/docs/install/)。 | 请参考文档 [**GeekAI 快速部署**](https://docs.geekai.me/install/)。 | ||||||
|  |  | ||||||
| ## 使用须知 | ## 使用须知 | ||||||
|  |  | ||||||
| @@ -101,14 +54,14 @@ ChatGLM,讯飞星火,文心一言等多个平台的大语言模型。集成了 | |||||||
| ## TODOLIST | ## TODOLIST | ||||||
|  |  | ||||||
| * [ ] 支持基于知识库的 AI 问答 | * [ ] 支持基于知识库的 AI 问答 | ||||||
| * [ ] 会员邀请注册推广功能 | * [ ] 文生视频,文生歌曲功能 | ||||||
| * [ ] 微信支付功能 | * [ ] 微信支付功能 | ||||||
|  |  | ||||||
| ## 项目文档 | ## 项目文档 | ||||||
|  |  | ||||||
| 最新的部署视频教程:[https://www.bilibili.com/video/BV1Cc411t7CX/](https://www.bilibili.com/video/BV1Cc411t7CX/) | 最新的部署视频教程:[https://www.bilibili.com/video/BV1Cc411t7CX/](https://www.bilibili.com/video/BV1Cc411t7CX/) | ||||||
|  |  | ||||||
| 详细的部署和开发文档请参考 [**GeekAI 文档**](https://ai.r9it.com/docs/)。 | 详细的部署和开发文档请参考 [**GeekAI 文档**](https://docs.geekai.me)。 | ||||||
|  |  | ||||||
| 加微信进入微信讨论群可获取 **一键部署脚本(添加好友时请注明来自Github!!!)。** | 加微信进入微信讨论群可获取 **一键部署脚本(添加好友时请注明来自Github!!!)。** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,12 +9,12 @@ package core | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
| 	"context" |  | ||||||
| 	"fmt" |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/go-redis/redis/v8" | 	"github.com/go-redis/redis/v8" | ||||||
| 	"github.com/golang-jwt/jwt/v5" | 	"github.com/golang-jwt/jwt/v5" | ||||||
| @@ -227,15 +227,19 @@ func needLogin(c *gin.Context) bool { | |||||||
| 		c.Request.URL.Path == "/api/sd/client" || | 		c.Request.URL.Path == "/api/sd/client" || | ||||||
| 		c.Request.URL.Path == "/api/dall/imgWall" || | 		c.Request.URL.Path == "/api/dall/imgWall" || | ||||||
| 		c.Request.URL.Path == "/api/dall/client" || | 		c.Request.URL.Path == "/api/dall/client" || | ||||||
| 		c.Request.URL.Path == "/api/config/get" || |  | ||||||
| 		c.Request.URL.Path == "/api/product/list" || | 		c.Request.URL.Path == "/api/product/list" || | ||||||
| 		c.Request.URL.Path == "/api/menu/list" || | 		c.Request.URL.Path == "/api/menu/list" || | ||||||
| 		c.Request.URL.Path == "/api/markMap/client" || | 		c.Request.URL.Path == "/api/markMap/client" || | ||||||
|  | 		c.Request.URL.Path == "/api/payment/alipay/notify" || | ||||||
|  | 		c.Request.URL.Path == "/api/payment/hupipay/notify" || | ||||||
|  | 		c.Request.URL.Path == "/api/payment/payjs/notify" || | ||||||
|  | 		c.Request.URL.Path == "/api/payment/doPay" || | ||||||
|  | 		c.Request.URL.Path == "/api/payment/payWays" || | ||||||
| 		strings.HasPrefix(c.Request.URL.Path, "/api/test") || | 		strings.HasPrefix(c.Request.URL.Path, "/api/test") || | ||||||
|  | 		strings.HasPrefix(c.Request.URL.Path, "/api/config/") || | ||||||
| 		strings.HasPrefix(c.Request.URL.Path, "/api/function/") || | 		strings.HasPrefix(c.Request.URL.Path, "/api/function/") || | ||||||
| 		strings.HasPrefix(c.Request.URL.Path, "/api/sms/") || | 		strings.HasPrefix(c.Request.URL.Path, "/api/sms/") || | ||||||
| 		strings.HasPrefix(c.Request.URL.Path, "/api/captcha/") || | 		strings.HasPrefix(c.Request.URL.Path, "/api/captcha/") || | ||||||
| 		strings.HasPrefix(c.Request.URL.Path, "/api/payment/") || |  | ||||||
| 		strings.HasPrefix(c.Request.URL.Path, "/static/") { | 		strings.HasPrefix(c.Request.URL.Path, "/static/") { | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -61,15 +61,15 @@ type ChatSession struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| type ChatModel struct { | type ChatModel struct { | ||||||
| 	Id          uint     `json:"id"` | 	Id          uint    `json:"id"` | ||||||
| 	Platform    Platform `json:"platform"` | 	Platform    string  `json:"platform"` | ||||||
| 	Name        string   `json:"name"` | 	Name        string  `json:"name"` | ||||||
| 	Value       string   `json:"value"` | 	Value       string  `json:"value"` | ||||||
| 	Power       int      `json:"power"` | 	Power       int     `json:"power"` | ||||||
| 	MaxTokens   int      `json:"max_tokens"`  // 最大响应长度 | 	MaxTokens   int     `json:"max_tokens"`  // 最大响应长度 | ||||||
| 	MaxContext  int      `json:"max_context"` // 最大上下文长度 | 	MaxContext  int     `json:"max_context"` // 最大上下文长度 | ||||||
| 	Temperature float32  `json:"temperature"` // 模型温度 | 	Temperature float32 `json:"temperature"` // 模型温度 | ||||||
| 	KeyId       int      `json:"key_id"`      // 绑定 API KEY | 	KeyId       int     `json:"key_id"`      // 绑定 API KEY | ||||||
| } | } | ||||||
|  |  | ||||||
| type ApiError struct { | type ApiError struct { | ||||||
|   | |||||||
| @@ -126,25 +126,60 @@ type RedisConfig struct { | |||||||
| const LicenseKey = "Geek-AI-License" | const LicenseKey = "Geek-AI-License" | ||||||
|  |  | ||||||
| type License struct { | type License struct { | ||||||
| 	Key       string `json:"key"`        // 许可证书密钥 | 	Key       string        `json:"key"`        // 许可证书密钥 | ||||||
| 	MachineId string `json:"machine_id"` // 机器码 | 	MachineId string        `json:"machine_id"` // 机器码 | ||||||
| 	UserNum   int    `json:"user_num"`   // 用户数量 | 	ExpiredAt int64         `json:"expired_at"` // 过期时间 | ||||||
| 	ExpiredAt int64  `json:"expired_at"` // 过期时间 | 	IsActive  bool          `json:"is_active"`  // 是否激活 | ||||||
| 	IsActive  bool   `json:"is_active"`  // 是否激活 | 	Configs   LicenseConfig `json:"configs"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type LicenseConfig struct { | ||||||
|  | 	UserNum int  `json:"user_num"` // 用户数量 | ||||||
|  | 	DeCopy  bool `json:"de_copy"`  // 去版权 | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c RedisConfig) Url() string { | func (c RedisConfig) Url() string { | ||||||
| 	return fmt.Sprintf("%s:%d", c.Host, c.Port) | 	return fmt.Sprintf("%s:%d", c.Host, c.Port) | ||||||
| } | } | ||||||
|  |  | ||||||
| type Platform string | type Platform struct { | ||||||
|  | 	Name    string `json:"name"` | ||||||
|  | 	Value   string `json:"value"` | ||||||
|  | 	ChatURL string `json:"chat_url"` | ||||||
|  | 	ImgURL  string `json:"img_url"` | ||||||
|  | } | ||||||
|  |  | ||||||
| const OpenAI = Platform("OpenAI") | var OpenAI = Platform{ | ||||||
| const Azure = Platform("Azure") | 	Name:    "OpenAI - GPT", | ||||||
| const ChatGLM = Platform("ChatGLM") | 	Value:   "OpenAI", | ||||||
| const Baidu = Platform("Baidu") | 	ChatURL: "https://api.chat-plus.net/v1/chat/completions", | ||||||
| const XunFei = Platform("XunFei") | 	ImgURL:  "https://api.chat-plus.net/v1/images/generations", | ||||||
| const QWen = Platform("QWen") | } | ||||||
|  | var Azure = Platform{ | ||||||
|  | 	Name:    "微软 - Azure", | ||||||
|  | 	Value:   "Azure", | ||||||
|  | 	ChatURL: "https://chat-bot-api.openai.azure.com/openai/deployments/{model}/chat/completions?api-version=2023-05-15", | ||||||
|  | } | ||||||
|  | var ChatGLM = Platform{ | ||||||
|  | 	Name:    "智谱 - ChatGLM", | ||||||
|  | 	Value:   "ChatGLM", | ||||||
|  | 	ChatURL: "https://open.bigmodel.cn/api/paas/v3/model-api/{model}/sse-invoke", | ||||||
|  | } | ||||||
|  | var Baidu = Platform{ | ||||||
|  | 	Name:    "百度 - 文心大模型", | ||||||
|  | 	Value:   "Baidu", | ||||||
|  | 	ChatURL: "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/{model}", | ||||||
|  | } | ||||||
|  | var XunFei = Platform{ | ||||||
|  | 	Name:    "讯飞 - 星火大模型", | ||||||
|  | 	Value:   "XunFei", | ||||||
|  | 	ChatURL: "wss://spark-api.xf-yun.com/{version}/chat", | ||||||
|  | } | ||||||
|  | var QWen = Platform{ | ||||||
|  | 	Name:    "阿里 - 通义千问", | ||||||
|  | 	Value:   "QWen", | ||||||
|  | 	ChatURL: "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation", | ||||||
|  | } | ||||||
|  |  | ||||||
| type SystemConfig struct { | type SystemConfig struct { | ||||||
| 	Title         string `json:"title,omitempty"` | 	Title         string `json:"title,omitempty"` | ||||||
| @@ -175,4 +210,8 @@ type SystemConfig struct { | |||||||
|  |  | ||||||
| 	EnableContext bool `json:"enable_context,omitempty"` | 	EnableContext bool `json:"enable_context,omitempty"` | ||||||
| 	ContextDeep   int  `json:"context_deep,omitempty"` | 	ContextDeep   int  `json:"context_deep,omitempty"` | ||||||
|  |  | ||||||
|  | 	SdNegPrompt string `json:"sd_neg_prompt"` // SD 默认反向提示词 | ||||||
|  |  | ||||||
|  | 	RandBg bool `json:"rand_bg"` // 前端首页是否启用随机背景 | ||||||
| } | } | ||||||
|   | |||||||
| @@ -24,5 +24,4 @@ type Function struct { | |||||||
| 	Name        string                 `json:"name"` | 	Name        string                 `json:"name"` | ||||||
| 	Description string                 `json:"description"` | 	Description string                 `json:"description"` | ||||||
| 	Parameters  map[string]interface{} `json:"parameters"` | 	Parameters  map[string]interface{} `json:"parameters"` | ||||||
| 	Required    interface{}            `json:"required,omitempty"` |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -55,9 +55,10 @@ type SdTaskParams struct { | |||||||
| 	NegPrompt    string  `json:"neg_prompt"` // 反向提示词 | 	NegPrompt    string  `json:"neg_prompt"` // 反向提示词 | ||||||
| 	Steps        int     `json:"steps"`      // 迭代步数,默认20 | 	Steps        int     `json:"steps"`      // 迭代步数,默认20 | ||||||
| 	Sampler      string  `json:"sampler"`    // 采样器 | 	Sampler      string  `json:"sampler"`    // 采样器 | ||||||
| 	FaceFix      bool    `json:"face_fix"`   // 面部修复 | 	Scheduler    string  `json:"scheduler"` | ||||||
| 	CfgScale     float32 `json:"cfg_scale"`  //引导系数,默认 7 | 	FaceFix      bool    `json:"face_fix"`  // 面部修复 | ||||||
| 	Seed         int64   `json:"seed"`       // 随机数种子 | 	CfgScale     float32 `json:"cfg_scale"` //引导系数,默认 7 | ||||||
|  | 	Seed         int64   `json:"seed"`      // 随机数种子 | ||||||
| 	Height       int     `json:"height"` | 	Height       int     `json:"height"` | ||||||
| 	Width        int     `json:"width"` | 	Width        int     `json:"width"` | ||||||
| 	HdFix        bool    `json:"hd_fix"`         // 启用高清修复 | 	HdFix        bool    `json:"hd_fix"`         // 启用高清修复 | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								api/go.mod
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								api/go.mod
									
									
									
									
									
								
							| @@ -1,6 +1,8 @@ | |||||||
| module geekai | module geekai | ||||||
|  |  | ||||||
| go 1.19 | go 1.21 | ||||||
|  |  | ||||||
|  | toolchain go1.22.4 | ||||||
|  |  | ||||||
| require ( | require ( | ||||||
| 	github.com/BurntSushi/toml v1.1.0 | 	github.com/BurntSushi/toml v1.1.0 | ||||||
| @@ -37,15 +39,16 @@ require ( | |||||||
| 	github.com/go-ole/go-ole v1.2.6 // indirect | 	github.com/go-ole/go-ole v1.2.6 // indirect | ||||||
| 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect | 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect | ||||||
| 	github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect | 	github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect | ||||||
| 	github.com/tklauser/go-sysconf v0.3.13 // indirect | 	github.com/tklauser/go-sysconf v0.3.14 // indirect | ||||||
| 	github.com/tklauser/numcpus v0.7.0 // indirect | 	github.com/tklauser/numcpus v0.8.0 // indirect | ||||||
| 	github.com/yusufpapurcu/wmi v1.2.4 // indirect | 	github.com/yusufpapurcu/wmi v1.2.4 // indirect | ||||||
|  | 	go.uber.org/mock v0.4.0 // indirect | ||||||
| ) | ) | ||||||
|  |  | ||||||
| require ( | require ( | ||||||
| 	github.com/andybalholm/brotli v1.0.4 // indirect | 	github.com/andybalholm/brotli v1.0.4 // indirect | ||||||
| 	github.com/bytedance/sonic v1.9.1 // indirect | 	github.com/bytedance/sonic v1.9.1 // indirect | ||||||
| 	github.com/cespare/xxhash/v2 v2.1.2 // indirect | 	github.com/cespare/xxhash/v2 v2.2.0 // indirect | ||||||
| 	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect | 	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect | ||||||
| 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect | 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect | ||||||
| 	github.com/dlclark/regexp2 v1.8.1 // indirect | 	github.com/dlclark/regexp2 v1.8.1 // indirect | ||||||
| @@ -56,7 +59,6 @@ require ( | |||||||
| 	github.com/go-sql-driver/mysql v1.7.0 // indirect | 	github.com/go-sql-driver/mysql v1.7.0 // indirect | ||||||
| 	github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect | 	github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect | ||||||
| 	github.com/goccy/go-json v0.10.2 // indirect | 	github.com/goccy/go-json v0.10.2 // indirect | ||||||
| 	github.com/golang/mock v1.6.0 // indirect |  | ||||||
| 	github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect | 	github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect | ||||||
| 	github.com/google/uuid v1.3.0 // indirect | 	github.com/google/uuid v1.3.0 // indirect | ||||||
| 	github.com/hashicorp/errwrap v1.1.0 // indirect | 	github.com/hashicorp/errwrap v1.1.0 // indirect | ||||||
| @@ -73,9 +75,7 @@ require ( | |||||||
| 	github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect | 	github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect | ||||||
| 	github.com/pelletier/go-toml/v2 v2.0.8 // indirect | 	github.com/pelletier/go-toml/v2 v2.0.8 // indirect | ||||||
| 	github.com/quic-go/qpack v0.4.0 // indirect | 	github.com/quic-go/qpack v0.4.0 // indirect | ||||||
| 	github.com/quic-go/qtls-go1-19 v0.3.2 // indirect | 	github.com/quic-go/quic-go v0.45.0 // indirect | ||||||
| 	github.com/quic-go/qtls-go1-20 v0.2.2 // indirect |  | ||||||
| 	github.com/quic-go/quic-go v0.35.1 // indirect |  | ||||||
| 	github.com/refraction-networking/utls v1.3.2 // indirect | 	github.com/refraction-networking/utls v1.3.2 // indirect | ||||||
| 	github.com/rs/xid v1.5.0 // indirect | 	github.com/rs/xid v1.5.0 // indirect | ||||||
| 	github.com/sirupsen/logrus v1.9.3 // indirect | 	github.com/sirupsen/logrus v1.9.3 // indirect | ||||||
| @@ -85,14 +85,14 @@ require ( | |||||||
| 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect | 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect | ||||||
| 	go.uber.org/dig v1.16.1 // indirect | 	go.uber.org/dig v1.16.1 // indirect | ||||||
| 	golang.org/x/arch v0.3.0 // indirect | 	golang.org/x/arch v0.3.0 // indirect | ||||||
| 	golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect | 	golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect | ||||||
| 	golang.org/x/mod v0.11.0 // indirect | 	golang.org/x/mod v0.17.0 // indirect | ||||||
| 	golang.org/x/net v0.14.0 // indirect | 	golang.org/x/net v0.25.0 // indirect | ||||||
| 	golang.org/x/sync v0.3.0 // indirect | 	golang.org/x/sync v0.7.0 // indirect | ||||||
| 	golang.org/x/text v0.12.0 // indirect | 	golang.org/x/text v0.15.0 // indirect | ||||||
| 	golang.org/x/time v0.3.0 // indirect | 	golang.org/x/time v0.5.0 // indirect | ||||||
| 	golang.org/x/tools v0.10.0 // indirect | 	golang.org/x/tools v0.21.0 // indirect | ||||||
| 	google.golang.org/protobuf v1.30.0 // indirect | 	google.golang.org/protobuf v1.33.0 // indirect | ||||||
| 	gopkg.in/ini.v1 v1.67.0 // indirect | 	gopkg.in/ini.v1 v1.67.0 // indirect | ||||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
| ) | ) | ||||||
| @@ -111,7 +111,7 @@ require ( | |||||||
| 	go.uber.org/atomic v1.9.0 // indirect | 	go.uber.org/atomic v1.9.0 // indirect | ||||||
| 	go.uber.org/fx v1.19.3 | 	go.uber.org/fx v1.19.3 | ||||||
| 	go.uber.org/multierr v1.6.0 // indirect | 	go.uber.org/multierr v1.6.0 // indirect | ||||||
| 	golang.org/x/crypto v0.12.0 | 	golang.org/x/crypto v0.23.0 | ||||||
| 	golang.org/x/sys v0.15.0 // indirect | 	golang.org/x/sys v0.20.0 // indirect | ||||||
| 	gorm.io/gorm v1.25.1 | 	gorm.io/gorm v1.25.1 | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										92
									
								
								api/go.sum
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								api/go.sum
									
									
									
									
									
								
							| @@ -7,11 +7,12 @@ github.com/aliyun/aliyun-oss-go-sdk v2.2.9+incompatible/go.mod h1:T/Aws4fEfogEE9 | |||||||
| github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= | github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= | ||||||
| github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= | github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= | ||||||
| github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= | github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= | ||||||
|  | github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= | ||||||
| github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= | github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= | ||||||
| github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= | github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= | ||||||
| github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= | github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= | ||||||
| github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= | github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= | ||||||
| github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||||
| github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= | github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= | ||||||
| github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= | ||||||
| github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= | ||||||
| @@ -29,6 +30,7 @@ github.com/eatmoreapple/openwechat v1.2.1 h1:ez4oqF/Y2NSEX/DbPV8lvj7JlfkYqvieeo4 | |||||||
| github.com/eatmoreapple/openwechat v1.2.1/go.mod h1:61HOzTyvLobGdgWhL68jfGNwTJEv0mhQ1miCXQrvWU8= | github.com/eatmoreapple/openwechat v1.2.1/go.mod h1:61HOzTyvLobGdgWhL68jfGNwTJEv0mhQ1miCXQrvWU8= | ||||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||||
| github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= | ||||||
|  | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= | ||||||
| github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= | github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= | ||||||
| github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= | github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= | ||||||
| github.com/gaukas/godicttls v0.0.3 h1:YNDIf0d9adcxOijiLrEzpfZGAkNwLRzPaG6OjU7EITk= | github.com/gaukas/godicttls v0.0.3 h1:YNDIf0d9adcxOijiLrEzpfZGAkNwLRzPaG6OjU7EITk= | ||||||
| @@ -40,10 +42,12 @@ github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SU | |||||||
| github.com/go-basic/ipv4 v1.0.0 h1:gjyFAa1USC1hhXTkPOwBWDPfMcUaIM+tvo1XzV9EZxs= | github.com/go-basic/ipv4 v1.0.0 h1:gjyFAa1USC1hhXTkPOwBWDPfMcUaIM+tvo1XzV9EZxs= | ||||||
| github.com/go-basic/ipv4 v1.0.0/go.mod h1:etLBnaxbidQfuqE6wgZQfs38nEWNmzALkxDZe4xY8Dg= | github.com/go-basic/ipv4 v1.0.0/go.mod h1:etLBnaxbidQfuqE6wgZQfs38nEWNmzALkxDZe4xY8Dg= | ||||||
| github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= | github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= | ||||||
|  | github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||||
| github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= | github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= | ||||||
| github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | ||||||
| github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= | github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= | ||||||
| github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= | ||||||
|  | github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= | ||||||
| github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= | github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= | ||||||
| github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= | github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= | ||||||
| github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= | ||||||
| @@ -68,15 +72,13 @@ github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJ | |||||||
| github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= | github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= | ||||||
| github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= | github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= | ||||||
| github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= | github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= | ||||||
| github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= |  | ||||||
| github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= |  | ||||||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||||
| github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= |  | ||||||
| github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= | github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= | ||||||
|  | github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||||
| github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= | ||||||
| github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||||
| github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= | ||||||
| github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||||
| github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs= | github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs= | ||||||
| github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= | github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= | ||||||
| @@ -140,13 +142,16 @@ github.com/mojocn/base64Captcha v1.3.1/go.mod h1:wAQCKEc5bDujxKRmbT6/vTnTt5CjStQ | |||||||
| github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= | ||||||
| github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= | ||||||
| github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= | github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= | ||||||
|  | github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= | ||||||
| github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||||
| github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||||
| github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= | github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= | ||||||
|  | github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= | ||||||
| github.com/onsi/ginkgo/v2 v2.10.0 h1:sfUl4qgLdvkChZrWCYndY2EAu9BRIw1YphNAzy1VNWs= | github.com/onsi/ginkgo/v2 v2.10.0 h1:sfUl4qgLdvkChZrWCYndY2EAu9BRIw1YphNAzy1VNWs= | ||||||
| github.com/onsi/ginkgo/v2 v2.10.0/go.mod h1:UDQOh5wbQUlMnkLfVaIUMtQ1Vus92oM+P2JX1aulgcE= | github.com/onsi/ginkgo/v2 v2.10.0/go.mod h1:UDQOh5wbQUlMnkLfVaIUMtQ1Vus92oM+P2JX1aulgcE= | ||||||
| github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||||
| github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= | github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= | ||||||
|  | github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= | ||||||
| github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= | github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= | ||||||
| github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= | github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= | ||||||
| github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= | github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= | ||||||
| @@ -164,12 +169,8 @@ github.com/qiniu/go-sdk/v7 v7.17.1/go.mod h1:nqoYCNo53ZlGA521RvRethvxUDvXKt4gtYX | |||||||
| github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= | github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= | ||||||
| github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= | github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= | ||||||
| github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= | github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= | ||||||
| github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= | github.com/quic-go/quic-go v0.45.0 h1:OHmkQGM37luZITyTSu6ff03HP/2IrwDX1ZFiNEhSFUE= | ||||||
| github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= | github.com/quic-go/quic-go v0.45.0/go.mod h1:1dLehS7TIR64+vxGR70GDcatWTOtMX2PUtnKsjbTurI= | ||||||
| github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= |  | ||||||
| github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= |  | ||||||
| github.com/quic-go/quic-go v0.35.1 h1:b0kzj6b/cQAf05cT0CkQubHM31wiA+xH3IBkxP62poo= |  | ||||||
| github.com/quic-go/quic-go v0.35.1/go.mod h1:+4CVgVppm0FNjpG3UcX8Joi/frKOH7/ciD5yGcwOO1g= |  | ||||||
| github.com/refraction-networking/utls v1.3.2 h1:o+AkWB57mkcoW36ET7uJ002CpBWHu0KPxi6vzxvPnv8= | github.com/refraction-networking/utls v1.3.2 h1:o+AkWB57mkcoW36ET7uJ002CpBWHu0KPxi6vzxvPnv8= | ||||||
| github.com/refraction-networking/utls v1.3.2/go.mod h1:fmoaOww2bxzzEpIKOebIsnBvjQpqP7L2vcm/9KUfm/E= | github.com/refraction-networking/utls v1.3.2/go.mod h1:fmoaOww2bxzzEpIKOebIsnBvjQpqP7L2vcm/9KUfm/E= | ||||||
| github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= | github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= | ||||||
| @@ -207,10 +208,10 @@ github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gt | |||||||
| github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||||
| github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= | github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= | ||||||
| github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= | github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= | ||||||
| github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= | github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= | ||||||
| github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= | github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= | ||||||
| github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= | github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= | ||||||
| github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= | github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= | ||||||
| github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= | ||||||
| github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= | ||||||
| github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= | github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= | ||||||
| @@ -221,7 +222,6 @@ github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4d | |||||||
| github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= | github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= | ||||||
| github.com/xxl-job/xxl-job-executor-go v1.2.0 h1:MTl2DpwrK2+hNjRRks2k7vB3oy+3onqm9OaSarneeLQ= | github.com/xxl-job/xxl-job-executor-go v1.2.0 h1:MTl2DpwrK2+hNjRRks2k7vB3oy+3onqm9OaSarneeLQ= | ||||||
| github.com/xxl-job/xxl-job-executor-go v1.2.0/go.mod h1:bUFhz/5Irp9zkdYk5MxhQcDDT6LlZrI8+rv5mHtQ1mo= | github.com/xxl-job/xxl-job-executor-go v1.2.0/go.mod h1:bUFhz/5Irp9zkdYk5MxhQcDDT6LlZrI8+rv5mHtQ1mo= | ||||||
| github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= |  | ||||||
| github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | ||||||
| github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= | github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= | ||||||
| github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= | github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= | ||||||
| @@ -233,6 +233,9 @@ go.uber.org/dig v1.16.1/go.mod h1:557JTAUZT5bUK0SvCwikmLPPtdQhfvLYtO5tJgQSbnk= | |||||||
| go.uber.org/fx v1.19.3 h1:YqMRE4+2IepTYCMOvXqQpRa+QAVdiSTnsHU4XNWBceA= | go.uber.org/fx v1.19.3 h1:YqMRE4+2IepTYCMOvXqQpRa+QAVdiSTnsHU4XNWBceA= | ||||||
| go.uber.org/fx v1.19.3/go.mod h1:w2HrQg26ql9fLK7hlBiZ6JsRUKV+Lj/atT1KCjT8YhM= | go.uber.org/fx v1.19.3/go.mod h1:w2HrQg26ql9fLK7hlBiZ6JsRUKV+Lj/atT1KCjT8YhM= | ||||||
| go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= | go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= | ||||||
|  | go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= | ||||||
|  | go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= | ||||||
|  | go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= | ||||||
| go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= | go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= | ||||||
| go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= | go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= | ||||||
| go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= | go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= | ||||||
| @@ -241,43 +244,35 @@ golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUu | |||||||
| golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= | golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= | ||||||
| golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= | golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= | ||||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= |  | ||||||
| golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||||
| golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= | golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= | ||||||
| golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= | golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= | ||||||
| golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= | ||||||
| golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= | golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= | ||||||
| golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= | golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= | ||||||
| golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= | golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= | ||||||
| golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= | golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= | ||||||
| golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= | golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= | ||||||
| golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= |  | ||||||
| golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | ||||||
| golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= | golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= | ||||||
| golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= | ||||||
| golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= |  | ||||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||||
| golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | ||||||
| golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= |  | ||||||
| golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||||
| golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= | golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= | ||||||
| golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= | golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= | ||||||
| golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= | golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= | ||||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= |  | ||||||
| golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= | golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= | ||||||
| golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||||
| golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |  | ||||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |  | ||||||
| golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= |  | ||||||
| golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| @@ -286,8 +281,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc | |||||||
| golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= | golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= | ||||||
| golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||||
| golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||||
| @@ -297,23 +292,18 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||||||
| golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||||||
| golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | ||||||
| golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= | golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= | ||||||
| golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | ||||||
| golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= | golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= | ||||||
| golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= | ||||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||||
| golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= |  | ||||||
| golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | ||||||
| golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= | golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= | ||||||
| golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= | golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= | ||||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= | ||||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= | ||||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |  | ||||||
| google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= |  | ||||||
| google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= |  | ||||||
| google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= |  | ||||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= | ||||||
|   | |||||||
| @@ -57,6 +57,7 @@ func (h *ApiKeyHandler) Save(c *gin.Context) { | |||||||
| 	apiKey.Name = data.Name | 	apiKey.Name = data.Name | ||||||
| 	res := h.DB.Save(&apiKey) | 	res := h.DB.Save(&apiKey) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -75,6 +76,7 @@ func (h *ApiKeyHandler) Save(c *gin.Context) { | |||||||
| func (h *ApiKeyHandler) List(c *gin.Context) { | func (h *ApiKeyHandler) List(c *gin.Context) { | ||||||
| 	status := h.GetBool(c, "status") | 	status := h.GetBool(c, "status") | ||||||
| 	t := h.GetTrim(c, "type") | 	t := h.GetTrim(c, "type") | ||||||
|  | 	platform := h.GetTrim(c, "platform") | ||||||
|  |  | ||||||
| 	session := h.DB.Session(&gorm.Session{}) | 	session := h.DB.Session(&gorm.Session{}) | ||||||
| 	if status { | 	if status { | ||||||
| @@ -83,7 +85,10 @@ func (h *ApiKeyHandler) List(c *gin.Context) { | |||||||
| 	if t != "" { | 	if t != "" { | ||||||
| 		session = session.Where("type", t) | 		session = session.Where("type", t) | ||||||
| 	} | 	} | ||||||
| 	 | 	if platform != "" { | ||||||
|  | 		session = session.Where("platform", platform) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	var items []model.ApiKey | 	var items []model.ApiKey | ||||||
| 	var keys = make([]vo.ApiKey, 0) | 	var keys = make([]vo.ApiKey, 0) | ||||||
| 	res := session.Find(&items) | 	res := session.Find(&items) | ||||||
| @@ -118,6 +123,7 @@ func (h *ApiKeyHandler) Set(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.ApiKey{}).Where("id = ?", data.Id).Update(data.Filed, data.Value) | 	res := h.DB.Model(&model.ApiKey{}).Where("id = ?", data.Id).Update(data.Filed, data.Value) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -133,6 +139,7 @@ func (h *ApiKeyHandler) Remove(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Where("id", id).Delete(&model.ApiKey{}) | 	res := h.DB.Where("id", id).Delete(&model.ApiKey{}) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -261,6 +261,7 @@ func (h *ChatHandler) RemoveMessage(c *gin.Context) { | |||||||
| 	id := h.GetInt(c, "id", 0) | 	id := h.GetInt(c, "id", 0) | ||||||
| 	tx := h.DB.Unscoped().Where("id = ?", id).Delete(&model.ChatMessage{}) | 	tx := h.DB.Unscoped().Where("id = ?", id).Delete(&model.ChatMessage{}) | ||||||
| 	if tx.Error != nil { | 	if tx.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", tx.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ import ( | |||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
| ) | ) | ||||||
| @@ -68,6 +69,7 @@ func (h *ChatModelHandler) Save(c *gin.Context) { | |||||||
| 		res = h.DB.Create(&item) | 		res = h.DB.Create(&item) | ||||||
| 	} | 	} | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -87,9 +89,13 @@ func (h *ChatModelHandler) Save(c *gin.Context) { | |||||||
| func (h *ChatModelHandler) List(c *gin.Context) { | func (h *ChatModelHandler) List(c *gin.Context) { | ||||||
| 	session := h.DB.Session(&gorm.Session{}) | 	session := h.DB.Session(&gorm.Session{}) | ||||||
| 	enable := h.GetBool(c, "enable") | 	enable := h.GetBool(c, "enable") | ||||||
|  | 	platform := h.GetTrim(c, "platform") | ||||||
| 	if enable { | 	if enable { | ||||||
| 		session = session.Where("enabled", enable) | 		session = session.Where("enabled", enable) | ||||||
| 	} | 	} | ||||||
|  | 	if platform != "" { | ||||||
|  | 		session = session.Where("platform", platform) | ||||||
|  | 	} | ||||||
| 	var items []model.ChatModel | 	var items []model.ChatModel | ||||||
| 	var cms = make([]vo.ChatModel, 0) | 	var cms = make([]vo.ChatModel, 0) | ||||||
| 	res := session.Order("sort_num ASC").Find(&items) | 	res := session.Order("sort_num ASC").Find(&items) | ||||||
| @@ -139,6 +145,7 @@ func (h *ChatModelHandler) Set(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.ChatModel{}).Where("id = ?", data.Id).Update(data.Filed, data.Value) | 	res := h.DB.Model(&model.ChatModel{}).Where("id = ?", data.Id).Update(data.Filed, data.Value) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -159,6 +166,7 @@ func (h *ChatModelHandler) Sort(c *gin.Context) { | |||||||
| 	for index, id := range data.Ids { | 	for index, id := range data.Ids { | ||||||
| 		res := h.DB.Model(&model.ChatModel{}).Where("id = ?", id).Update("sort_num", data.Sorts[index]) | 		res := h.DB.Model(&model.ChatModel{}).Where("id = ?", id).Update("sort_num", data.Sorts[index]) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| @@ -176,6 +184,7 @@ func (h *ChatModelHandler) Remove(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Where("id = ?", id).Delete(&model.ChatModel{}) | 	res := h.DB.Where("id = ?", id).Delete(&model.ChatModel{}) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -48,6 +48,7 @@ func (h *ChatRoleHandler) Save(c *gin.Context) { | |||||||
| 	} | 	} | ||||||
| 	res := h.DB.Save(&role) | 	res := h.DB.Save(&role) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -115,6 +116,7 @@ func (h *ChatRoleHandler) Sort(c *gin.Context) { | |||||||
| 	for index, id := range data.Ids { | 	for index, id := range data.Ids { | ||||||
| 		res := h.DB.Model(&model.ChatRole{}).Where("id = ?", id).Update("sort_num", data.Sorts[index]) | 		res := h.DB.Model(&model.ChatRole{}).Where("id = ?", id).Update("sort_num", data.Sorts[index]) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| @@ -137,6 +139,7 @@ func (h *ChatRoleHandler) Set(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.ChatRole{}).Where("id = ?", data.Id).Update(data.Filed, data.Value) | 	res := h.DB.Model(&model.ChatRole{}).Where("id = ?", data.Id).Update(data.Filed, data.Value) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -144,19 +147,15 @@ func (h *ChatRoleHandler) Set(c *gin.Context) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (h *ChatRoleHandler) Remove(c *gin.Context) { | func (h *ChatRoleHandler) Remove(c *gin.Context) { | ||||||
| 	var data struct { | 	id := h.GetInt(c, "id", 0) | ||||||
| 		Id uint |  | ||||||
| 	} | 	if id <= 0 { | ||||||
| 	if err := c.ShouldBindJSON(&data); err != nil { |  | ||||||
| 		resp.ERROR(c, types.InvalidArgs) | 		resp.ERROR(c, types.InvalidArgs) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	if data.Id <= 0 { | 	res := h.DB.Where("id", id).Delete(&model.ChatRole{}) | ||||||
| 		resp.ERROR(c, types.InvalidArgs) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	res := h.DB.Where("id = ?", data.Id).Delete(&model.ChatRole{}) |  | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "删除失败!") | 		resp.ERROR(c, "删除失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -12,10 +12,13 @@ import ( | |||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/handler" | 	"geekai/handler" | ||||||
| 	"geekai/service" | 	"geekai/service" | ||||||
|  | 	"geekai/service/mj" | ||||||
|  | 	"geekai/service/sd" | ||||||
| 	"geekai/store" | 	"geekai/store" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/shirou/gopsutil/host" | 	"github.com/shirou/gopsutil/host" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
| @@ -25,10 +28,18 @@ type ConfigHandler struct { | |||||||
| 	handler.BaseHandler | 	handler.BaseHandler | ||||||
| 	levelDB        *store.LevelDB | 	levelDB        *store.LevelDB | ||||||
| 	licenseService *service.LicenseService | 	licenseService *service.LicenseService | ||||||
|  | 	mjServicePool  *mj.ServicePool | ||||||
|  | 	sdServicePool  *sd.ServicePool | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewConfigHandler(app *core.AppServer, db *gorm.DB, levelDB *store.LevelDB, licenseService *service.LicenseService) *ConfigHandler { | func NewConfigHandler(app *core.AppServer, db *gorm.DB, levelDB *store.LevelDB, licenseService *service.LicenseService, mjPool *mj.ServicePool, sdPool *sd.ServicePool) *ConfigHandler { | ||||||
| 	return &ConfigHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}, levelDB: levelDB, licenseService: licenseService} | 	return &ConfigHandler{ | ||||||
|  | 		BaseHandler:    handler.BaseHandler{App: app, DB: db}, | ||||||
|  | 		levelDB:        levelDB, | ||||||
|  | 		mjServicePool:  mjPool, | ||||||
|  | 		sdServicePool:  sdPool, | ||||||
|  | 		licenseService: licenseService, | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (h *ConfigHandler) Update(c *gin.Context) { | func (h *ConfigHandler) Update(c *gin.Context) { | ||||||
| @@ -128,3 +139,59 @@ func (h *ConfigHandler) GetLicense(c *gin.Context) { | |||||||
| 	license := h.licenseService.GetLicense() | 	license := h.licenseService.GetLicense() | ||||||
| 	resp.SUCCESS(c, license) | 	resp.SUCCESS(c, license) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetAppConfig 获取内置配置 | ||||||
|  | func (h *ConfigHandler) GetAppConfig(c *gin.Context) { | ||||||
|  | 	resp.SUCCESS(c, gin.H{ | ||||||
|  | 		"mj_plus":   h.App.Config.MjPlusConfigs, | ||||||
|  | 		"mj_proxy":  h.App.Config.MjProxyConfigs, | ||||||
|  | 		"sd":        h.App.Config.SdConfigs, | ||||||
|  | 		"platforms": Platforms, | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SaveDrawingConfig 保存AI绘画配置 | ||||||
|  | func (h *ConfigHandler) SaveDrawingConfig(c *gin.Context) { | ||||||
|  | 	var data struct { | ||||||
|  | 		Sd      []types.StableDiffusionConfig `json:"sd"` | ||||||
|  | 		MjPlus  []types.MjPlusConfig          `json:"mj_plus"` | ||||||
|  | 		MjProxy []types.MjProxyConfig         `json:"mj_proxy"` | ||||||
|  | 	} | ||||||
|  | 	if err := c.ShouldBindJSON(&data); err != nil { | ||||||
|  | 		resp.ERROR(c, types.InvalidArgs) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	changed := false | ||||||
|  | 	if configChanged(data.Sd, h.App.Config.SdConfigs) { | ||||||
|  | 		logger.Debugf("SD 配置变动了") | ||||||
|  | 		h.App.Config.SdConfigs = data.Sd | ||||||
|  | 		h.sdServicePool.InitServices(data.Sd) | ||||||
|  | 		changed = true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if configChanged(data.MjPlus, h.App.Config.MjPlusConfigs) || configChanged(data.MjProxy, h.App.Config.MjProxyConfigs) { | ||||||
|  | 		logger.Debugf("MidJourney 配置变动了") | ||||||
|  | 		h.App.Config.MjPlusConfigs = data.MjPlus | ||||||
|  | 		h.App.Config.MjProxyConfigs = data.MjProxy | ||||||
|  | 		h.mjServicePool.InitServices(data.MjPlus, data.MjProxy) | ||||||
|  | 		changed = true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if changed { | ||||||
|  | 		err := core.SaveConfig(h.App.Config) | ||||||
|  | 		if err != nil { | ||||||
|  | 			resp.ERROR(c, "更新配置文档失败!") | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	resp.SUCCESS(c) | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func configChanged(c1 interface{}, c2 interface{}) bool { | ||||||
|  | 	encode1 := utils.JsonEncode(c1) | ||||||
|  | 	encode2 := utils.JsonEncode(c2) | ||||||
|  | 	return utils.Md5(encode1) != utils.Md5(encode2) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -71,6 +71,7 @@ func (h *FunctionHandler) Set(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.Function{}).Where("id = ?", data.Id).Update(data.Filed, data.Value) | 	res := h.DB.Model(&model.Function{}).Where("id = ?", data.Id).Update(data.Filed, data.Value) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -103,6 +104,7 @@ func (h *FunctionHandler) Remove(c *gin.Context) { | |||||||
| 	if id > 0 { | 	if id > 0 { | ||||||
| 		res := h.DB.Delete(&model.Function{Id: uint(id)}) | 		res := h.DB.Delete(&model.Function{Id: uint(id)}) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -50,6 +50,7 @@ func (h *MenuHandler) Save(c *gin.Context) { | |||||||
| 		Enabled: data.Enabled, | 		Enabled: data.Enabled, | ||||||
| 	}) | 	}) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -86,6 +87,7 @@ func (h *MenuHandler) Enable(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.Menu{}).Where("id", data.Id).UpdateColumn("enabled", data.Enabled) | 	res := h.DB.Model(&model.Menu{}).Where("id", data.Id).UpdateColumn("enabled", data.Enabled) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -106,6 +108,7 @@ func (h *MenuHandler) Sort(c *gin.Context) { | |||||||
| 	for index, id := range data.Ids { | 	for index, id := range data.Ids { | ||||||
| 		res := h.DB.Model(&model.Menu{}).Where("id", id).Update("sort_num", data.Sorts[index]) | 		res := h.DB.Model(&model.Menu{}).Where("id", id).Update("sort_num", data.Sorts[index]) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| @@ -120,6 +123,7 @@ func (h *MenuHandler) Remove(c *gin.Context) { | |||||||
| 	if id > 0 { | 	if id > 0 { | ||||||
| 		res := h.DB.Where("id", id).Delete(&model.Menu{}) | 		res := h.DB.Where("id", id).Delete(&model.Menu{}) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -94,6 +94,7 @@ func (h *OrderHandler) Remove(c *gin.Context) { | |||||||
|  |  | ||||||
| 		res = h.DB.Unscoped().Where("id = ?", id).Delete(&model.Order{}) | 		res = h.DB.Unscoped().Where("id = ?", id).Delete(&model.Order{}) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -57,6 +57,7 @@ func (h *ProductHandler) Save(c *gin.Context) { | |||||||
| 	} | 	} | ||||||
| 	res := h.DB.Save(&item) | 	res := h.DB.Save(&item) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -107,6 +108,7 @@ func (h *ProductHandler) Enable(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.Product{}).Where("id", data.Id).UpdateColumn("enabled", data.Enabled) | 	res := h.DB.Model(&model.Product{}).Where("id", data.Id).UpdateColumn("enabled", data.Enabled) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -127,6 +129,7 @@ func (h *ProductHandler) Sort(c *gin.Context) { | |||||||
| 	for index, id := range data.Ids { | 	for index, id := range data.Ids { | ||||||
| 		res := h.DB.Model(&model.Product{}).Where("id", id).Update("sort_num", data.Sorts[index]) | 		res := h.DB.Model(&model.Product{}).Where("id", id).Update("sort_num", data.Sorts[index]) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| @@ -141,6 +144,7 @@ func (h *ProductHandler) Remove(c *gin.Context) { | |||||||
| 	if id > 0 { | 	if id > 0 { | ||||||
| 		res := h.DB.Where("id", id).Delete(&model.Product{}) | 		res := h.DB.Where("id", id).Delete(&model.Product{}) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -72,6 +72,7 @@ func (h *RewardHandler) Remove(c *gin.Context) { | |||||||
| 	if data.Id > 0 { | 	if data.Id > 0 { | ||||||
| 		res := h.DB.Where("id = ?", data.Id).Delete(&model.Reward{}) | 		res := h.DB.Where("id = ?", data.Id).Delete(&model.Reward{}) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								api/handler/admin/types.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								api/handler/admin/types.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | package admin | ||||||
|  |  | ||||||
|  | import "geekai/core/types" | ||||||
|  |  | ||||||
|  | var Platforms = []types.Platform{ | ||||||
|  | 	types.OpenAI, | ||||||
|  | 	types.QWen, | ||||||
|  | 	types.XunFei, | ||||||
|  | 	types.ChatGLM, | ||||||
|  | 	types.Baidu, | ||||||
|  | 	types.Azure, | ||||||
|  | } | ||||||
| @@ -8,6 +8,7 @@ package admin | |||||||
| // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core" | 	"geekai/core" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/handler" | 	"geekai/handler" | ||||||
| @@ -16,7 +17,6 @@ import ( | |||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
| 	"fmt" |  | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| @@ -87,7 +87,7 @@ func (h *UserHandler) Save(c *gin.Context) { | |||||||
| 	// 检测最大注册人数 | 	// 检测最大注册人数 | ||||||
| 	var totalUser int64 | 	var totalUser int64 | ||||||
| 	h.DB.Model(&model.User{}).Count(&totalUser) | 	h.DB.Model(&model.User{}).Count(&totalUser) | ||||||
| 	if int(totalUser) >= h.licenseService.GetLicense().UserNum { | 	if h.licenseService.GetLicense().Configs.UserNum > 0 && int(totalUser) >= h.licenseService.GetLicense().Configs.UserNum { | ||||||
| 		resp.ERROR(c, "当前注册用户数已达上限,请请升级 License") | 		resp.ERROR(c, "当前注册用户数已达上限,请请升级 License") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -111,6 +111,7 @@ func (h *UserHandler) Save(c *gin.Context) { | |||||||
|  |  | ||||||
| 		res = h.DB.Select("username", "status", "vip", "power", "chat_roles_json", "chat_models_json", "expired_time").Updates(&user) | 		res = h.DB.Select("username", "status", "vip", "power", "chat_roles_json", "chat_models_json", "expired_time").Updates(&user) | ||||||
| 		if res.Error != nil { | 		if res.Error != nil { | ||||||
|  | 			logger.Error("error with update database:", res.Error) | ||||||
| 			resp.ERROR(c, "更新数据库失败!") | 			resp.ERROR(c, "更新数据库失败!") | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| @@ -156,6 +157,7 @@ func (h *UserHandler) Save(c *gin.Context) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败") | 		resp.ERROR(c, "更新数据库失败") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ import ( | |||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
| ) | ) | ||||||
| @@ -32,7 +33,7 @@ func (h *ChatModelHandler) List(c *gin.Context) { | |||||||
| 	var res *gorm.DB | 	var res *gorm.DB | ||||||
| 	// 如果用户没有登录,则加载所有开放模型 | 	// 如果用户没有登录,则加载所有开放模型 | ||||||
| 	if !h.IsLogin(c) { | 	if !h.IsLogin(c) { | ||||||
| 		res = h.DB.Where("enabled = ?", true).Where("open =?", true).Order("sort_num ASC").Find(&items) | 		res = h.DB.Where("enabled", true).Where("open", true).Order("sort_num ASC").Find(&items) | ||||||
| 	} else { | 	} else { | ||||||
| 		user, _ := h.GetLoginUser(c) | 		user, _ := h.GetLoginUser(c) | ||||||
| 		var models []int | 		var models []int | ||||||
| @@ -43,7 +44,7 @@ func (h *ChatModelHandler) List(c *gin.Context) { | |||||||
| 		} | 		} | ||||||
| 		// 查询用户有权限访问的模型以及所有开放的模型 | 		// 查询用户有权限访问的模型以及所有开放的模型 | ||||||
| 		res = h.DB.Where("enabled = ?", true).Where( | 		res = h.DB.Where("enabled = ?", true).Where( | ||||||
| 			h.DB.Where("id IN ?", models).Or("open =?", true), | 			h.DB.Where("id IN ?", models).Or("open", true), | ||||||
| 		).Order("sort_num ASC").Find(&items) | 		).Order("sort_num ASC").Find(&items) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -96,7 +96,7 @@ func (h *ChatRoleHandler) UpdateRole(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.User{}).Where("id = ?", user.Id).UpdateColumn("chat_roles_json", utils.JsonEncode(data.Keys)) | 	res := h.DB.Model(&model.User{}).Where("id = ?", user.Id).UpdateColumn("chat_roles_json", utils.JsonEncode(data.Keys)) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
| 		logger.Error("添加应用失败:", err) | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -9,18 +9,17 @@ package chatimpl | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
|  | 	"context" | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"context" |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"fmt" |  | ||||||
| 	"html/template" |  | ||||||
| 	"io" | 	"io" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unicode/utf8" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // 微软 Azure 模型消息发送实现 | // 微软 Azure 模型消息发送实现 | ||||||
| @@ -41,17 +40,10 @@ func (h *ChatHandler) sendAzureMessage( | |||||||
| 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		if strings.Contains(err.Error(), "context canceled") { | 		if strings.Contains(err.Error(), "context canceled") { | ||||||
| 			logger.Info("用户取消了请求:", prompt) | 			return fmt.Errorf("用户取消了请求:%s", prompt) | ||||||
| 			return nil |  | ||||||
| 		} else if strings.Contains(err.Error(), "no available key") { | 		} else if strings.Contains(err.Error(), "no available key") { | ||||||
| 			utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | 			return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | ||||||
| 			return nil |  | ||||||
| 		} else { |  | ||||||
| 			logger.Error(err) |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		utils.ReplyMessage(ws, ErrorMsg) |  | ||||||
| 		utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 		return err | 		return err | ||||||
| 	} else { | 	} else { | ||||||
| 		defer response.Body.Close() | 		defer response.Body.Close() | ||||||
| @@ -73,10 +65,7 @@ func (h *ChatHandler) sendAzureMessage( | |||||||
| 			var responseBody = types.ApiResponse{} | 			var responseBody = types.ApiResponse{} | ||||||
| 			err = json.Unmarshal([]byte(line[6:]), &responseBody) | 			err = json.Unmarshal([]byte(line[6:]), &responseBody) | ||||||
| 			if err != nil { // 数据解析出错 | 			if err != nil { // 数据解析出错 | ||||||
| 				logger.Error(err, line) | 				return errors.New(line) | ||||||
| 				utils.ReplyMessage(ws, ErrorMsg) |  | ||||||
| 				utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 				break |  | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if len(responseBody.Choices) == 0 { | 			if len(responseBody.Choices) == 0 { | ||||||
| @@ -110,105 +99,12 @@ func (h *ChatHandler) sendAzureMessage( | |||||||
|  |  | ||||||
| 		// 消息发送成功 | 		// 消息发送成功 | ||||||
| 		if len(contents) > 0 { | 		if len(contents) > 0 { | ||||||
|  | 			h.saveChatHistory(req, prompt, contents, message, chatCtx, session, role, userVo, promptCreatedAt, replyCreatedAt) | ||||||
| 			if message.Role == "" { |  | ||||||
| 				message.Role = "assistant" |  | ||||||
| 			} |  | ||||||
| 			message.Content = strings.Join(contents, "") |  | ||||||
| 			useMsg := types.Message{Role: "user", Content: prompt} |  | ||||||
|  |  | ||||||
| 			// 更新上下文消息,如果是调用函数则不需要更新上下文 |  | ||||||
| 			if h.App.SysConfig.EnableContext { |  | ||||||
| 				chatCtx = append(chatCtx, useMsg)  // 提问消息 |  | ||||||
| 				chatCtx = append(chatCtx, message) // 回复消息 |  | ||||||
| 				h.App.ChatContexts.Put(session.ChatId, chatCtx) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 追加聊天记录 |  | ||||||
| 			// for prompt |  | ||||||
| 			promptToken, err := utils.CalcTokens(prompt, req.Model) |  | ||||||
| 			if err != nil { |  | ||||||
| 				logger.Error(err) |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.PromptMsg, |  | ||||||
| 				Icon:       userVo.Avatar, |  | ||||||
| 				Content:    template.HTMLEscapeString(prompt), |  | ||||||
| 				Tokens:     promptToken, |  | ||||||
| 				UseContext: true, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg.CreatedAt = promptCreatedAt |  | ||||||
| 			historyUserMsg.UpdatedAt = promptCreatedAt |  | ||||||
| 			res := h.DB.Save(&historyUserMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save prompt history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 计算本次对话消耗的总 token 数量 |  | ||||||
| 			replyTokens, _ := utils.CalcTokens(message.Content, req.Model) |  | ||||||
| 			replyTokens += getTotalTokens(req) |  | ||||||
|  |  | ||||||
| 			historyReplyMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.ReplyMsg, |  | ||||||
| 				Icon:       role.Icon, |  | ||||||
| 				Content:    message.Content, |  | ||||||
| 				Tokens:     replyTokens, |  | ||||||
| 				UseContext: true, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyReplyMsg.CreatedAt = replyCreatedAt |  | ||||||
| 			historyReplyMsg.UpdatedAt = replyCreatedAt |  | ||||||
| 			res = h.DB.Create(&historyReplyMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save reply history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 更新用户算力 |  | ||||||
| 			h.subUserPower(userVo, session, promptToken, replyTokens) |  | ||||||
|  |  | ||||||
| 			// 保存当前会话 |  | ||||||
| 			var chatItem model.ChatItem |  | ||||||
| 			res = h.DB.Where("chat_id = ?", session.ChatId).First(&chatItem) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				chatItem.ChatId = session.ChatId |  | ||||||
| 				chatItem.UserId = session.UserId |  | ||||||
| 				chatItem.RoleId = role.Id |  | ||||||
| 				chatItem.ModelId = session.Model.Id |  | ||||||
| 				if utf8.RuneCountInString(prompt) > 30 { |  | ||||||
| 					chatItem.Title = string([]rune(prompt)[:30]) + "..." |  | ||||||
| 				} else { |  | ||||||
| 					chatItem.Title = prompt |  | ||||||
| 				} |  | ||||||
| 				chatItem.Model = req.Model |  | ||||||
| 				h.DB.Create(&chatItem) |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	} else { | 	} else { | ||||||
| 		body, err := io.ReadAll(response.Body) | 		body, _ := io.ReadAll(response.Body) | ||||||
| 		if err != nil { | 		return fmt.Errorf("请求大模型 API 失败:%s", body) | ||||||
| 			return fmt.Errorf("error with reading response: %v", err) |  | ||||||
| 		} |  | ||||||
| 		var res types.ApiError |  | ||||||
| 		err = json.Unmarshal(body, &res) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return fmt.Errorf("error with decode response: %v", err) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if strings.Contains(res.Error.Message, "maximum context length") { |  | ||||||
| 			logger.Error(res.Error.Message) |  | ||||||
| 			utils.ReplyMessage(ws, "当前会话上下文长度超出限制,已为您清空会话上下文!") |  | ||||||
| 			h.App.ChatContexts.Delete(session.ChatId) |  | ||||||
| 			return h.sendMessage(ctx, session, role, prompt, ws) |  | ||||||
| 		} else { |  | ||||||
| 			utils.ReplyMessage(ws, "请求 Azure API 失败:"+res.Error.Message) |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
|   | |||||||
| @@ -9,19 +9,18 @@ package chatimpl | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
|  | 	"context" | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"context" |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"fmt" |  | ||||||
| 	"html/template" |  | ||||||
| 	"io" | 	"io" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unicode/utf8" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type baiduResp struct { | type baiduResp struct { | ||||||
| @@ -57,18 +56,12 @@ func (h *ChatHandler) sendBaiduMessage( | |||||||
| 	response, err := h.doRequest(ctx, req, session, &apiKey) | 	response, err := h.doRequest(ctx, req, session, &apiKey) | ||||||
| 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | 		logger.Error(err) | ||||||
| 		if strings.Contains(err.Error(), "context canceled") { | 		if strings.Contains(err.Error(), "context canceled") { | ||||||
| 			logger.Info("用户取消了请求:", prompt) | 			return fmt.Errorf("用户取消了请求:%s", prompt) | ||||||
| 			return nil |  | ||||||
| 		} else if strings.Contains(err.Error(), "no available key") { | 		} else if strings.Contains(err.Error(), "no available key") { | ||||||
| 			utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | 			return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | ||||||
| 			return nil |  | ||||||
| 		} else { |  | ||||||
| 			logger.Error(err) |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		utils.ReplyMessage(ws, ErrorMsg) |  | ||||||
| 		utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 		return err | 		return err | ||||||
| 	} else { | 	} else { | ||||||
| 		defer response.Body.Close() | 		defer response.Body.Close() | ||||||
| @@ -135,99 +128,11 @@ func (h *ChatHandler) sendBaiduMessage( | |||||||
|  |  | ||||||
| 		// 消息发送成功 | 		// 消息发送成功 | ||||||
| 		if len(contents) > 0 { | 		if len(contents) > 0 { | ||||||
| 			if message.Role == "" { | 			h.saveChatHistory(req, prompt, contents, message, chatCtx, session, role, userVo, promptCreatedAt, replyCreatedAt) | ||||||
| 				message.Role = "assistant" |  | ||||||
| 			} |  | ||||||
| 			message.Content = strings.Join(contents, "") |  | ||||||
| 			useMsg := types.Message{Role: "user", Content: prompt} |  | ||||||
|  |  | ||||||
| 			// 更新上下文消息,如果是调用函数则不需要更新上下文 |  | ||||||
| 			if h.App.SysConfig.EnableContext { |  | ||||||
| 				chatCtx = append(chatCtx, useMsg)  // 提问消息 |  | ||||||
| 				chatCtx = append(chatCtx, message) // 回复消息 |  | ||||||
| 				h.App.ChatContexts.Put(session.ChatId, chatCtx) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 追加聊天记录 |  | ||||||
| 			// for prompt |  | ||||||
| 			promptToken, err := utils.CalcTokens(prompt, req.Model) |  | ||||||
| 			if err != nil { |  | ||||||
| 				logger.Error(err) |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.PromptMsg, |  | ||||||
| 				Icon:       userVo.Avatar, |  | ||||||
| 				Content:    template.HTMLEscapeString(prompt), |  | ||||||
| 				Tokens:     promptToken, |  | ||||||
| 				UseContext: true, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg.CreatedAt = promptCreatedAt |  | ||||||
| 			historyUserMsg.UpdatedAt = promptCreatedAt |  | ||||||
| 			res := h.DB.Save(&historyUserMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save prompt history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// for reply |  | ||||||
| 			// 计算本次对话消耗的总 token 数量 |  | ||||||
| 			replyTokens, _ := utils.CalcTokens(message.Content, req.Model) |  | ||||||
| 			totalTokens := replyTokens + getTotalTokens(req) |  | ||||||
| 			historyReplyMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.ReplyMsg, |  | ||||||
| 				Icon:       role.Icon, |  | ||||||
| 				Content:    message.Content, |  | ||||||
| 				Tokens:     totalTokens, |  | ||||||
| 				UseContext: true, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyReplyMsg.CreatedAt = replyCreatedAt |  | ||||||
| 			historyReplyMsg.UpdatedAt = replyCreatedAt |  | ||||||
| 			res = h.DB.Create(&historyReplyMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save reply history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
| 			// 更新用户算力 |  | ||||||
| 			h.subUserPower(userVo, session, promptToken, replyTokens) |  | ||||||
|  |  | ||||||
| 			// 保存当前会话 |  | ||||||
| 			var chatItem model.ChatItem |  | ||||||
| 			res = h.DB.Where("chat_id = ?", session.ChatId).First(&chatItem) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				chatItem.ChatId = session.ChatId |  | ||||||
| 				chatItem.UserId = session.UserId |  | ||||||
| 				chatItem.RoleId = role.Id |  | ||||||
| 				chatItem.ModelId = session.Model.Id |  | ||||||
| 				if utf8.RuneCountInString(prompt) > 30 { |  | ||||||
| 					chatItem.Title = string([]rune(prompt)[:30]) + "..." |  | ||||||
| 				} else { |  | ||||||
| 					chatItem.Title = prompt |  | ||||||
| 				} |  | ||||||
| 				chatItem.Model = req.Model |  | ||||||
| 				h.DB.Create(&chatItem) |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		body, err := io.ReadAll(response.Body) | 		body, _ := io.ReadAll(response.Body) | ||||||
| 		if err != nil { | 		return fmt.Errorf("请求大模型 API 失败:%s", body) | ||||||
| 			return fmt.Errorf("error with reading response: %v", err) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		var res struct { |  | ||||||
| 			Code int    `json:"error_code"` |  | ||||||
| 			Msg  string `json:"error_msg"` |  | ||||||
| 		} |  | ||||||
| 		err = json.Unmarshal(body, &res) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return fmt.Errorf("error with decode response: %v", err) |  | ||||||
| 		} |  | ||||||
| 		utils.ReplyMessage(ws, "请求百度文心大模型 API 失败:"+res.Msg) |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
|   | |||||||
| @@ -23,11 +23,13 @@ import ( | |||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
|  | 	"html/template" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"regexp" | 	"regexp" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
|  | 	"unicode/utf8" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/go-redis/redis/v8" | 	"github.com/go-redis/redis/v8" | ||||||
| @@ -35,10 +37,6 @@ import ( | |||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ErrorMsg = "抱歉,AI 助手开小差了,请稍后再试。" |  | ||||||
|  |  | ||||||
| var ErrImg = "" |  | ||||||
|  |  | ||||||
| var logger = logger2.GetLogger() | var logger = logger2.GetLogger() | ||||||
|  |  | ||||||
| type ChatHandler struct { | type ChatHandler struct { | ||||||
| @@ -57,13 +55,6 @@ func NewChatHandler(app *core.AppServer, db *gorm.DB, redis *redis.Client, manag | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (h *ChatHandler) Init() { |  | ||||||
| 	// 如果后台有上传微信客服微信二维码,则覆盖 |  | ||||||
| 	if h.App.SysConfig.WechatCardURL != "" { |  | ||||||
| 		ErrImg = fmt.Sprintf("", h.App.SysConfig.WechatCardURL) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ChatHandle 处理聊天 WebSocket 请求 | // ChatHandle 处理聊天 WebSocket 请求 | ||||||
| func (h *ChatHandler) ChatHandle(c *gin.Context) { | func (h *ChatHandler) ChatHandle(c *gin.Context) { | ||||||
| 	ws, err := (&websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}).Upgrade(c.Writer, c.Request, nil) | 	ws, err := (&websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}).Upgrade(c.Writer, c.Request, nil) | ||||||
| @@ -133,11 +124,9 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) { | |||||||
| 		MaxContext:  chatModel.MaxContext, | 		MaxContext:  chatModel.MaxContext, | ||||||
| 		Temperature: chatModel.Temperature, | 		Temperature: chatModel.Temperature, | ||||||
| 		KeyId:       chatModel.KeyId, | 		KeyId:       chatModel.KeyId, | ||||||
| 		Platform:    types.Platform(chatModel.Platform)} | 		Platform:    chatModel.Platform} | ||||||
| 	logger.Infof("New websocket connected, IP: %s, Username: %s", c.ClientIP(), session.Username) | 	logger.Infof("New websocket connected, IP: %s, Username: %s", c.ClientIP(), session.Username) | ||||||
|  |  | ||||||
| 	h.Init() |  | ||||||
|  |  | ||||||
| 	// 保存会话连接 | 	// 保存会话连接 | ||||||
| 	h.App.ChatClients.Put(sessionId, client) | 	h.App.ChatClients.Put(sessionId, client) | ||||||
| 	go func() { | 	go func() { | ||||||
| @@ -176,7 +165,7 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) { | |||||||
| 			err = h.sendMessage(ctx, session, chatRole, utils.InterfaceToString(message.Content), client) | 			err = h.sendMessage(ctx, session, chatRole, utils.InterfaceToString(message.Content), client) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				logger.Error(err) | 				logger.Error(err) | ||||||
| 				utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd}) | 				utils.ReplyMessage(client, err.Error()) | ||||||
| 			} else { | 			} else { | ||||||
| 				utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd}) | 				utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd}) | ||||||
| 				logger.Infof("回答完毕: %v", message.Content) | 				logger.Infof("回答完毕: %v", message.Content) | ||||||
| @@ -198,8 +187,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | |||||||
| 	var user model.User | 	var user model.User | ||||||
| 	res := h.DB.Model(&model.User{}).First(&user, session.UserId) | 	res := h.DB.Model(&model.User{}).First(&user, session.UserId) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
| 		utils.ReplyMessage(ws, "未授权用户,您正在进行非法操作!") | 		return errors.New("未授权用户,您正在进行非法操作!") | ||||||
| 		return res.Error |  | ||||||
| 	} | 	} | ||||||
| 	var userVo vo.User | 	var userVo vo.User | ||||||
| 	err := utils.CopyObject(user, &userVo) | 	err := utils.CopyObject(user, &userVo) | ||||||
| @@ -209,28 +197,22 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if userVo.Status == false { | 	if userVo.Status == false { | ||||||
| 		utils.ReplyMessage(ws, "您的账号已经被禁用,如果疑问,请联系管理员!") | 		return errors.New("您的账号已经被禁用,如果疑问,请联系管理员!") | ||||||
| 		utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 		return nil |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if userVo.Power < session.Model.Power { | 	if userVo.Power < session.Model.Power { | ||||||
| 		utils.ReplyMessage(ws, fmt.Sprintf("您当前剩余算力(%d)已不足以支付当前模型的单次对话需要消耗的算力(%d)!", userVo.Power, session.Model.Power)) | 		return fmt.Errorf("您当前剩余算力 %d 已不足以支付当前模型的单次对话需要消耗的算力 %d,[立即购买](/member)。", userVo.Power, session.Model.Power) | ||||||
| 		utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 		return nil |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if userVo.ExpiredTime > 0 && userVo.ExpiredTime <= time.Now().Unix() { | 	if userVo.ExpiredTime > 0 && userVo.ExpiredTime <= time.Now().Unix() { | ||||||
| 		utils.ReplyMessage(ws, "您的账号已经过期,请联系管理员!") | 		return errors.New("您的账号已经过期,请联系管理员!") | ||||||
| 		utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 		return nil |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// 检查 prompt 长度是否超过了当前模型允许的最大上下文长度 | 	// 检查 prompt 长度是否超过了当前模型允许的最大上下文长度 | ||||||
| 	promptTokens, err := utils.CalcTokens(prompt, session.Model.Value) | 	promptTokens, err := utils.CalcTokens(prompt, session.Model.Value) | ||||||
| 	if promptTokens > session.Model.MaxContext { | 	if promptTokens > session.Model.MaxContext { | ||||||
| 		utils.ReplyMessage(ws, "对话内容超出了当前模型允许的最大上下文长度!") |  | ||||||
| 		return nil | 		return errors.New("对话内容超出了当前模型允许的最大上下文长度!") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var req = types.ApiRequest{ | 	var req = types.ApiRequest{ | ||||||
| @@ -238,11 +220,11 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | |||||||
| 		Stream: true, | 		Stream: true, | ||||||
| 	} | 	} | ||||||
| 	switch session.Model.Platform { | 	switch session.Model.Platform { | ||||||
| 	case types.Azure, types.ChatGLM, types.Baidu, types.XunFei: | 	case types.Azure.Value, types.ChatGLM.Value, types.Baidu.Value, types.XunFei.Value: | ||||||
| 		req.Temperature = session.Model.Temperature | 		req.Temperature = session.Model.Temperature | ||||||
| 		req.MaxTokens = session.Model.MaxTokens | 		req.MaxTokens = session.Model.MaxTokens | ||||||
| 		break | 		break | ||||||
| 	case types.OpenAI: | 	case types.OpenAI.Value: | ||||||
| 		req.Temperature = session.Model.Temperature | 		req.Temperature = session.Model.Temperature | ||||||
| 		req.MaxTokens = session.Model.MaxTokens | 		req.MaxTokens = session.Model.MaxTokens | ||||||
| 		// OpenAI 支持函数功能 | 		// OpenAI 支持函数功能 | ||||||
| @@ -259,8 +241,6 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | |||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
| 			required := parameters["required"] |  | ||||||
| 			delete(parameters, "required") |  | ||||||
| 			tool := types.Tool{ | 			tool := types.Tool{ | ||||||
| 				Type: "function", | 				Type: "function", | ||||||
| 				Function: types.Function{ | 				Function: types.Function{ | ||||||
| @@ -269,10 +249,8 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | |||||||
| 					Parameters:  parameters, | 					Parameters:  parameters, | ||||||
| 				}, | 				}, | ||||||
| 			} | 			} | ||||||
|  | 			if v, ok := parameters["required"]; v == nil || !ok { | ||||||
| 			// Fixed: compatible for gpt4-turbo-xxx model | 				tool.Function.Parameters["required"] = []string{} | ||||||
| 			if !strings.HasPrefix(req.Model, "gpt-4-turbo-") { |  | ||||||
| 				tool.Function.Required = required |  | ||||||
| 			} | 			} | ||||||
| 			tools = append(tools, tool) | 			tools = append(tools, tool) | ||||||
| 		} | 		} | ||||||
| @@ -281,7 +259,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | |||||||
| 			req.Tools = tools | 			req.Tools = tools | ||||||
| 			req.ToolChoice = "auto" | 			req.ToolChoice = "auto" | ||||||
| 		} | 		} | ||||||
| 	case types.QWen: | 	case types.QWen.Value: | ||||||
| 		req.Parameters = map[string]interface{}{ | 		req.Parameters = map[string]interface{}{ | ||||||
| 			"max_tokens":  session.Model.MaxTokens, | 			"max_tokens":  session.Model.MaxTokens, | ||||||
| 			"temperature": session.Model.Temperature, | 			"temperature": session.Model.Temperature, | ||||||
| @@ -289,9 +267,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | |||||||
| 		break | 		break | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
| 		utils.ReplyMessage(ws, "不支持的平台:"+session.Model.Platform+",请联系管理员!") | 		return fmt.Errorf("不支持的平台:%s", session.Model.Platform) | ||||||
| 		utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 		return nil |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// 加载聊天上下文 | 	// 加载聊天上下文 | ||||||
| @@ -347,14 +323,14 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | |||||||
| 		reqMgs = append(reqMgs, m) | 		reqMgs = append(reqMgs, m) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if session.Model.Platform == types.QWen { | 	if session.Model.Platform == types.QWen.Value { | ||||||
| 		req.Input = make(map[string]interface{}) | 		req.Input = make(map[string]interface{}) | ||||||
| 		reqMgs = append(reqMgs, types.Message{ | 		reqMgs = append(reqMgs, types.Message{ | ||||||
| 			Role:    "user", | 			Role:    "user", | ||||||
| 			Content: prompt, | 			Content: prompt, | ||||||
| 		}) | 		}) | ||||||
| 		req.Input["messages"] = reqMgs | 		req.Input["messages"] = reqMgs | ||||||
| 	} else if session.Model.Platform == types.OpenAI { // extract image for gpt-vision model | 	} else if session.Model.Platform == types.OpenAI.Value { // extract image for gpt-vision model | ||||||
| 		imgURLs := utils.ExtractImgURL(prompt) | 		imgURLs := utils.ExtractImgURL(prompt) | ||||||
| 		logger.Debugf("detected IMG: %+v", imgURLs) | 		logger.Debugf("detected IMG: %+v", imgURLs) | ||||||
| 		var content interface{} | 		var content interface{} | ||||||
| @@ -392,23 +368,20 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio | |||||||
| 	logger.Debugf("%+v", req.Messages) | 	logger.Debugf("%+v", req.Messages) | ||||||
|  |  | ||||||
| 	switch session.Model.Platform { | 	switch session.Model.Platform { | ||||||
| 	case types.Azure: | 	case types.Azure.Value: | ||||||
| 		return h.sendAzureMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | 		return h.sendAzureMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | ||||||
| 	case types.OpenAI: | 	case types.OpenAI.Value: | ||||||
| 		return h.sendOpenAiMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | 		return h.sendOpenAiMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | ||||||
| 	case types.ChatGLM: | 	case types.ChatGLM.Value: | ||||||
| 		return h.sendChatGLMMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | 		return h.sendChatGLMMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | ||||||
| 	case types.Baidu: | 	case types.Baidu.Value: | ||||||
| 		return h.sendBaiduMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | 		return h.sendBaiduMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | ||||||
| 	case types.XunFei: | 	case types.XunFei.Value: | ||||||
| 		return h.sendXunFeiMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | 		return h.sendXunFeiMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | ||||||
| 	case types.QWen: | 	case types.QWen.Value: | ||||||
| 		return h.sendQWenMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | 		return h.sendQWenMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) | ||||||
| 	} | 	} | ||||||
| 	utils.ReplyChunkMessage(ws, types.WsMessage{ |  | ||||||
| 		Type:    types.WsMiddle, |  | ||||||
| 		Content: fmt.Sprintf("Not supported platform: %s", session.Model.Platform), |  | ||||||
| 	}) |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -485,14 +458,14 @@ func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, sessi | |||||||
| 	} | 	} | ||||||
| 	// use the last unused key | 	// use the last unused key | ||||||
| 	if apiKey.Id == 0 { | 	if apiKey.Id == 0 { | ||||||
| 		h.DB.Debug().Where("platform", session.Model.Platform).Where("type", "chat").Where("enabled", true).Order("last_used_at ASC").First(apiKey) | 		h.DB.Where("platform", session.Model.Platform).Where("type", "chat").Where("enabled", true).Order("last_used_at ASC").First(apiKey) | ||||||
| 	} | 	} | ||||||
| 	if apiKey.Id == 0 { | 	if apiKey.Id == 0 { | ||||||
| 		return nil, errors.New("no available key, please import key") | 		return nil, errors.New("no available key, please import key") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// ONLY allow apiURL in blank list | 	// ONLY allow apiURL in blank list | ||||||
| 	if session.Model.Platform == types.OpenAI { | 	if session.Model.Platform == types.OpenAI.Value { | ||||||
| 		err := h.licenseService.IsValidApiURL(apiKey.ApiURL) | 		err := h.licenseService.IsValidApiURL(apiKey.ApiURL) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| @@ -501,19 +474,19 @@ func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, sessi | |||||||
|  |  | ||||||
| 	var apiURL string | 	var apiURL string | ||||||
| 	switch session.Model.Platform { | 	switch session.Model.Platform { | ||||||
| 	case types.Azure: | 	case types.Azure.Value: | ||||||
| 		md := strings.Replace(req.Model, ".", "", 1) | 		md := strings.Replace(req.Model, ".", "", 1) | ||||||
| 		apiURL = strings.Replace(apiKey.ApiURL, "{model}", md, 1) | 		apiURL = strings.Replace(apiKey.ApiURL, "{model}", md, 1) | ||||||
| 		break | 		break | ||||||
| 	case types.ChatGLM: | 	case types.ChatGLM.Value: | ||||||
| 		apiURL = strings.Replace(apiKey.ApiURL, "{model}", req.Model, 1) | 		apiURL = strings.Replace(apiKey.ApiURL, "{model}", req.Model, 1) | ||||||
| 		req.Prompt = req.Messages // 使用 prompt 字段替代 message 字段 | 		req.Prompt = req.Messages // 使用 prompt 字段替代 message 字段 | ||||||
| 		req.Messages = nil | 		req.Messages = nil | ||||||
| 		break | 		break | ||||||
| 	case types.Baidu: | 	case types.Baidu.Value: | ||||||
| 		apiURL = strings.Replace(apiKey.ApiURL, "{model}", req.Model, 1) | 		apiURL = strings.Replace(apiKey.ApiURL, "{model}", req.Model, 1) | ||||||
| 		break | 		break | ||||||
| 	case types.QWen: | 	case types.QWen.Value: | ||||||
| 		apiURL = apiKey.ApiURL | 		apiURL = apiKey.ApiURL | ||||||
| 		req.Messages = nil | 		req.Messages = nil | ||||||
| 		break | 		break | ||||||
| @@ -523,7 +496,7 @@ func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, sessi | |||||||
| 	// 更新 API KEY 的最后使用时间 | 	// 更新 API KEY 的最后使用时间 | ||||||
| 	h.DB.Model(apiKey).UpdateColumn("last_used_at", time.Now().Unix()) | 	h.DB.Model(apiKey).UpdateColumn("last_used_at", time.Now().Unix()) | ||||||
| 	// 百度文心,需要串接 access_token | 	// 百度文心,需要串接 access_token | ||||||
| 	if session.Model.Platform == types.Baidu { | 	if session.Model.Platform == types.Baidu.Value { | ||||||
| 		token, err := h.getBaiduToken(apiKey.Value) | 		token, err := h.getBaiduToken(apiKey.Value) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| @@ -559,22 +532,22 @@ func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, sessi | |||||||
| 	} | 	} | ||||||
| 	logger.Debugf("Sending %s request, ApiURL:%s, API KEY:%s, PROXY: %s, Model: %s", session.Model.Platform, apiURL, apiKey.Value, apiKey.ProxyURL, req.Model) | 	logger.Debugf("Sending %s request, ApiURL:%s, API KEY:%s, PROXY: %s, Model: %s", session.Model.Platform, apiURL, apiKey.Value, apiKey.ProxyURL, req.Model) | ||||||
| 	switch session.Model.Platform { | 	switch session.Model.Platform { | ||||||
| 	case types.Azure: | 	case types.Azure.Value: | ||||||
| 		request.Header.Set("api-key", apiKey.Value) | 		request.Header.Set("api-key", apiKey.Value) | ||||||
| 		break | 		break | ||||||
| 	case types.ChatGLM: | 	case types.ChatGLM.Value: | ||||||
| 		token, err := h.getChatGLMToken(apiKey.Value) | 		token, err := h.getChatGLMToken(apiKey.Value) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
| 		request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) | 		request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) | ||||||
| 		break | 		break | ||||||
| 	case types.Baidu: | 	case types.Baidu.Value: | ||||||
| 		request.RequestURI = "" | 		request.RequestURI = "" | ||||||
| 	case types.OpenAI: | 	case types.OpenAI.Value: | ||||||
| 		request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey.Value)) | 		request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey.Value)) | ||||||
| 		break | 		break | ||||||
| 	case types.QWen: | 	case types.QWen.Value: | ||||||
| 		request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey.Value)) | 		request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey.Value)) | ||||||
| 		request.Header.Set("X-DashScope-SSE", "enable") | 		request.Header.Set("X-DashScope-SSE", "enable") | ||||||
| 		break | 		break | ||||||
| @@ -608,6 +581,99 @@ func (h *ChatHandler) subUserPower(userVo vo.User, session *types.ChatSession, p | |||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (h *ChatHandler) saveChatHistory( | ||||||
|  | 	req types.ApiRequest, | ||||||
|  | 	prompt string, | ||||||
|  | 	contents []string, | ||||||
|  | 	message types.Message, | ||||||
|  | 	chatCtx []types.Message, | ||||||
|  | 	session *types.ChatSession, | ||||||
|  | 	role model.ChatRole, | ||||||
|  | 	userVo vo.User, | ||||||
|  | 	promptCreatedAt time.Time, | ||||||
|  | 	replyCreatedAt time.Time) { | ||||||
|  | 	if message.Role == "" { | ||||||
|  | 		message.Role = "assistant" | ||||||
|  | 	} | ||||||
|  | 	message.Content = strings.Join(contents, "") | ||||||
|  | 	useMsg := types.Message{Role: "user", Content: prompt} | ||||||
|  |  | ||||||
|  | 	// 更新上下文消息,如果是调用函数则不需要更新上下文 | ||||||
|  | 	if h.App.SysConfig.EnableContext { | ||||||
|  | 		chatCtx = append(chatCtx, useMsg)  // 提问消息 | ||||||
|  | 		chatCtx = append(chatCtx, message) // 回复消息 | ||||||
|  | 		h.App.ChatContexts.Put(session.ChatId, chatCtx) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 追加聊天记录 | ||||||
|  | 	// for prompt | ||||||
|  | 	promptToken, err := utils.CalcTokens(prompt, req.Model) | ||||||
|  | 	if err != nil { | ||||||
|  | 		logger.Error(err) | ||||||
|  | 	} | ||||||
|  | 	historyUserMsg := model.ChatMessage{ | ||||||
|  | 		UserId:     userVo.Id, | ||||||
|  | 		ChatId:     session.ChatId, | ||||||
|  | 		RoleId:     role.Id, | ||||||
|  | 		Type:       types.PromptMsg, | ||||||
|  | 		Icon:       userVo.Avatar, | ||||||
|  | 		Content:    template.HTMLEscapeString(prompt), | ||||||
|  | 		Tokens:     promptToken, | ||||||
|  | 		UseContext: true, | ||||||
|  | 		Model:      req.Model, | ||||||
|  | 	} | ||||||
|  | 	historyUserMsg.CreatedAt = promptCreatedAt | ||||||
|  | 	historyUserMsg.UpdatedAt = promptCreatedAt | ||||||
|  | 	res := h.DB.Save(&historyUserMsg) | ||||||
|  | 	if res.Error != nil { | ||||||
|  | 		logger.Error("failed to save prompt history message: ", res.Error) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// for reply | ||||||
|  | 	// 计算本次对话消耗的总 token 数量 | ||||||
|  | 	replyTokens, _ := utils.CalcTokens(message.Content, req.Model) | ||||||
|  | 	totalTokens := replyTokens + getTotalTokens(req) | ||||||
|  | 	historyReplyMsg := model.ChatMessage{ | ||||||
|  | 		UserId:     userVo.Id, | ||||||
|  | 		ChatId:     session.ChatId, | ||||||
|  | 		RoleId:     role.Id, | ||||||
|  | 		Type:       types.ReplyMsg, | ||||||
|  | 		Icon:       role.Icon, | ||||||
|  | 		Content:    message.Content, | ||||||
|  | 		Tokens:     totalTokens, | ||||||
|  | 		UseContext: true, | ||||||
|  | 		Model:      req.Model, | ||||||
|  | 	} | ||||||
|  | 	historyReplyMsg.CreatedAt = replyCreatedAt | ||||||
|  | 	historyReplyMsg.UpdatedAt = replyCreatedAt | ||||||
|  | 	res = h.DB.Create(&historyReplyMsg) | ||||||
|  | 	if res.Error != nil { | ||||||
|  | 		logger.Error("failed to save reply history message: ", res.Error) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if session.Model.Power > 0 { | ||||||
|  | 		// 更新用户算力 | ||||||
|  | 		h.subUserPower(userVo, session, promptToken, replyTokens) | ||||||
|  |  | ||||||
|  | 		// 保存当前会话 | ||||||
|  | 		var chatItem model.ChatItem | ||||||
|  | 		res = h.DB.Where("chat_id = ?", session.ChatId).First(&chatItem) | ||||||
|  | 		if res.Error != nil { | ||||||
|  | 			chatItem.ChatId = session.ChatId | ||||||
|  | 			chatItem.UserId = session.UserId | ||||||
|  | 			chatItem.RoleId = role.Id | ||||||
|  | 			chatItem.ModelId = session.Model.Id | ||||||
|  | 			if utf8.RuneCountInString(prompt) > 30 { | ||||||
|  | 				chatItem.Title = string([]rune(prompt)[:30]) + "..." | ||||||
|  | 			} else { | ||||||
|  | 				chatItem.Title = prompt | ||||||
|  | 			} | ||||||
|  | 			chatItem.Model = req.Model | ||||||
|  | 			h.DB.Create(&chatItem) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // 将AI回复消息中生成的图片链接下载到本地 | // 将AI回复消息中生成的图片链接下载到本地 | ||||||
| func (h *ChatHandler) extractImgUrl(text string) string { | func (h *ChatHandler) extractImgUrl(text string) string { | ||||||
| 	pattern := `!\[([^\]]*)]\(([^)]+)\)` | 	pattern := `!\[([^\]]*)]\(([^)]+)\)` | ||||||
|   | |||||||
| @@ -9,19 +9,17 @@ package chatimpl | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
|  | 	"context" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"context" |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"fmt" |  | ||||||
| 	"github.com/golang-jwt/jwt/v5" | 	"github.com/golang-jwt/jwt/v5" | ||||||
| 	"html/template" |  | ||||||
| 	"io" | 	"io" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unicode/utf8" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // 清华大学 ChatGML 消息发送实现 | // 清华大学 ChatGML 消息发送实现 | ||||||
| @@ -42,17 +40,10 @@ func (h *ChatHandler) sendChatGLMMessage( | |||||||
| 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		if strings.Contains(err.Error(), "context canceled") { | 		if strings.Contains(err.Error(), "context canceled") { | ||||||
| 			logger.Info("用户取消了请求:", prompt) | 			return fmt.Errorf("用户取消了请求:%s", prompt) | ||||||
| 			return nil |  | ||||||
| 		} else if strings.Contains(err.Error(), "no available key") { | 		} else if strings.Contains(err.Error(), "no available key") { | ||||||
| 			utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | 			return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | ||||||
| 			return nil |  | ||||||
| 		} else { |  | ||||||
| 			logger.Error(err) |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		utils.ReplyMessage(ws, ErrorMsg) |  | ||||||
| 		utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 		return err | 		return err | ||||||
| 	} else { | 	} else { | ||||||
| 		defer response.Body.Close() | 		defer response.Body.Close() | ||||||
| @@ -114,103 +105,11 @@ func (h *ChatHandler) sendChatGLMMessage( | |||||||
|  |  | ||||||
| 		// 消息发送成功 | 		// 消息发送成功 | ||||||
| 		if len(contents) > 0 { | 		if len(contents) > 0 { | ||||||
| 			if message.Role == "" { | 			h.saveChatHistory(req, prompt, contents, message, chatCtx, session, role, userVo, promptCreatedAt, replyCreatedAt) | ||||||
| 				message.Role = "assistant" |  | ||||||
| 			} |  | ||||||
| 			message.Content = strings.Join(contents, "") |  | ||||||
| 			useMsg := types.Message{Role: "user", Content: prompt} |  | ||||||
|  |  | ||||||
| 			// 更新上下文消息,如果是调用函数则不需要更新上下文 |  | ||||||
| 			if h.App.SysConfig.EnableContext { |  | ||||||
| 				chatCtx = append(chatCtx, useMsg)  // 提问消息 |  | ||||||
| 				chatCtx = append(chatCtx, message) // 回复消息 |  | ||||||
| 				h.App.ChatContexts.Put(session.ChatId, chatCtx) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 追加聊天记录 |  | ||||||
| 			// for prompt |  | ||||||
| 			promptToken, err := utils.CalcTokens(prompt, req.Model) |  | ||||||
| 			if err != nil { |  | ||||||
| 				logger.Error(err) |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.PromptMsg, |  | ||||||
| 				Icon:       userVo.Avatar, |  | ||||||
| 				Content:    template.HTMLEscapeString(prompt), |  | ||||||
| 				Tokens:     promptToken, |  | ||||||
| 				UseContext: true, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg.CreatedAt = promptCreatedAt |  | ||||||
| 			historyUserMsg.UpdatedAt = promptCreatedAt |  | ||||||
| 			res := h.DB.Save(&historyUserMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save prompt history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// for reply |  | ||||||
| 			// 计算本次对话消耗的总 token 数量 |  | ||||||
| 			replyTokens, _ := utils.CalcTokens(message.Content, req.Model) |  | ||||||
| 			totalTokens := replyTokens + getTotalTokens(req) |  | ||||||
| 			historyReplyMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.ReplyMsg, |  | ||||||
| 				Icon:       role.Icon, |  | ||||||
| 				Content:    message.Content, |  | ||||||
| 				Tokens:     totalTokens, |  | ||||||
| 				UseContext: true, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyReplyMsg.CreatedAt = replyCreatedAt |  | ||||||
| 			historyReplyMsg.UpdatedAt = replyCreatedAt |  | ||||||
| 			res = h.DB.Create(&historyReplyMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save reply history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 更新用户算力 |  | ||||||
| 			h.subUserPower(userVo, session, promptToken, replyTokens) |  | ||||||
|  |  | ||||||
| 			// 保存当前会话 |  | ||||||
| 			var chatItem model.ChatItem |  | ||||||
| 			res = h.DB.Where("chat_id = ?", session.ChatId).First(&chatItem) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				chatItem.ChatId = session.ChatId |  | ||||||
| 				chatItem.UserId = session.UserId |  | ||||||
| 				chatItem.RoleId = role.Id |  | ||||||
| 				chatItem.ModelId = session.Model.Id |  | ||||||
| 				if utf8.RuneCountInString(prompt) > 30 { |  | ||||||
| 					chatItem.Title = string([]rune(prompt)[:30]) + "..." |  | ||||||
| 				} else { |  | ||||||
| 					chatItem.Title = prompt |  | ||||||
| 				} |  | ||||||
| 				chatItem.Model = req.Model |  | ||||||
| 				h.DB.Create(&chatItem) |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		body, err := io.ReadAll(response.Body) | 		body, _ := io.ReadAll(response.Body) | ||||||
| 		if err != nil { | 		return fmt.Errorf("请求大模型 API 失败:%s", body) | ||||||
| 			return fmt.Errorf("error with reading response: %v", err) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		var res struct { |  | ||||||
| 			Code    int    `json:"code"` |  | ||||||
| 			Success bool   `json:"success"` |  | ||||||
| 			Msg     string `json:"msg"` |  | ||||||
| 		} |  | ||||||
| 		err = json.Unmarshal(body, &res) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return fmt.Errorf("error with decode response: %v", err) |  | ||||||
| 		} |  | ||||||
| 		if !res.Success { |  | ||||||
| 			utils.ReplyMessage(ws, "请求 ChatGLM 失败:"+res.Msg) |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
|   | |||||||
| @@ -11,18 +11,16 @@ import ( | |||||||
| 	"bufio" | 	"bufio" | ||||||
| 	"context" | 	"context" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"html/template" | 	req2 "github.com/imroc/req/v3" | ||||||
| 	"io" | 	"io" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unicode/utf8" |  | ||||||
|  |  | ||||||
| 	req2 "github.com/imroc/req/v3" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // OPenAI 消息发送实现 | // OPenAI 消息发送实现 | ||||||
| @@ -41,16 +39,11 @@ func (h *ChatHandler) sendOpenAiMessage( | |||||||
| 	response, err := h.doRequest(ctx, req, session, &apiKey) | 	response, err := h.doRequest(ctx, req, session, &apiKey) | ||||||
| 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Error(err) |  | ||||||
| 		if strings.Contains(err.Error(), "context canceled") { | 		if strings.Contains(err.Error(), "context canceled") { | ||||||
| 			logger.Info("用户取消了请求:", prompt) | 			return fmt.Errorf("用户取消了请求:%s", prompt) | ||||||
| 			return nil |  | ||||||
| 		} else if strings.Contains(err.Error(), "no available key") { | 		} else if strings.Contains(err.Error(), "no available key") { | ||||||
| 			utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | 			return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | ||||||
| 			return nil |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		utils.ReplyMessage(ws, err.Error()) |  | ||||||
| 		return err | 		return err | ||||||
| 	} else { | 	} else { | ||||||
| 		defer response.Body.Close() | 		defer response.Body.Close() | ||||||
| @@ -76,15 +69,12 @@ func (h *ChatHandler) sendOpenAiMessage( | |||||||
| 			var responseBody = types.ApiResponse{} | 			var responseBody = types.ApiResponse{} | ||||||
| 			err = json.Unmarshal([]byte(line[6:]), &responseBody) | 			err = json.Unmarshal([]byte(line[6:]), &responseBody) | ||||||
| 			if err != nil { // 数据解析出错 | 			if err != nil { // 数据解析出错 | ||||||
| 				logger.Error(err, line) | 				return errors.New(line) | ||||||
| 				utils.ReplyMessage(ws, ErrorMsg) |  | ||||||
| 				utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 				break |  | ||||||
| 			} | 			} | ||||||
| 			if len(responseBody.Choices) == 0 { // Fixed: 兼容 Azure API 第一个输出空行 | 			if len(responseBody.Choices) == 0 { // Fixed: 兼容 Azure API 第一个输出空行 | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
| 			 |  | ||||||
| 			if responseBody.Choices[0].FinishReason == "stop" && len(contents) == 0 { | 			if responseBody.Choices[0].FinishReason == "stop" && len(contents) == 0 { | ||||||
| 				utils.ReplyMessage(ws, "抱歉😔😔😔,AI助手由于未知原因已经停止输出内容。") | 				utils.ReplyMessage(ws, "抱歉😔😔😔,AI助手由于未知原因已经停止输出内容。") | ||||||
| 				break | 				break | ||||||
| @@ -185,126 +175,11 @@ func (h *ChatHandler) sendOpenAiMessage( | |||||||
|  |  | ||||||
| 		// 消息发送成功 | 		// 消息发送成功 | ||||||
| 		if len(contents) > 0 { | 		if len(contents) > 0 { | ||||||
| 			if message.Role == "" { | 			h.saveChatHistory(req, prompt, contents, message, chatCtx, session, role, userVo, promptCreatedAt, replyCreatedAt) | ||||||
| 				message.Role = "assistant" |  | ||||||
| 			} |  | ||||||
| 			message.Content = strings.Join(contents, "") |  | ||||||
| 			useMsg := types.Message{Role: "user", Content: prompt} |  | ||||||
|  |  | ||||||
| 			// 更新上下文消息,如果是调用函数则不需要更新上下文 |  | ||||||
| 			if h.App.SysConfig.EnableContext && toolCall == false { |  | ||||||
| 				chatCtx = append(chatCtx, useMsg)  // 提问消息 |  | ||||||
| 				chatCtx = append(chatCtx, message) // 回复消息 |  | ||||||
| 				h.App.ChatContexts.Put(session.ChatId, chatCtx) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 追加聊天记录 |  | ||||||
| 			useContext := true |  | ||||||
| 			if toolCall { |  | ||||||
| 				useContext = false |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// for prompt |  | ||||||
| 			promptToken, err := utils.CalcTokens(prompt, req.Model) |  | ||||||
| 			if err != nil { |  | ||||||
| 				logger.Error(err) |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.PromptMsg, |  | ||||||
| 				Icon:       userVo.Avatar, |  | ||||||
| 				Content:    template.HTMLEscapeString(prompt), |  | ||||||
| 				Tokens:     promptToken, |  | ||||||
| 				UseContext: useContext, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg.CreatedAt = promptCreatedAt |  | ||||||
| 			historyUserMsg.UpdatedAt = promptCreatedAt |  | ||||||
| 			res := h.DB.Save(&historyUserMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save prompt history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 计算本次对话消耗的总 token 数量 |  | ||||||
| 			var replyTokens = 0 |  | ||||||
| 			if toolCall { // prompt + 函数名 + 参数 token |  | ||||||
| 				tokens, _ := utils.CalcTokens(function.Name, req.Model) |  | ||||||
| 				replyTokens += tokens |  | ||||||
| 				tokens, _ = utils.CalcTokens(utils.InterfaceToString(arguments), req.Model) |  | ||||||
| 				replyTokens += tokens |  | ||||||
| 			} else { |  | ||||||
| 				replyTokens, _ = utils.CalcTokens(message.Content, req.Model) |  | ||||||
| 			} |  | ||||||
| 			replyTokens += getTotalTokens(req) |  | ||||||
|  |  | ||||||
| 			historyReplyMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.ReplyMsg, |  | ||||||
| 				Icon:       role.Icon, |  | ||||||
| 				Content:    h.extractImgUrl(message.Content), |  | ||||||
| 				Tokens:     replyTokens, |  | ||||||
| 				UseContext: useContext, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyReplyMsg.CreatedAt = replyCreatedAt |  | ||||||
| 			historyReplyMsg.UpdatedAt = replyCreatedAt |  | ||||||
| 			res = h.DB.Create(&historyReplyMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save reply history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 更新用户算力 |  | ||||||
| 			h.subUserPower(userVo, session, promptToken, replyTokens) |  | ||||||
|  |  | ||||||
| 			// 保存当前会话 |  | ||||||
| 			var chatItem model.ChatItem |  | ||||||
| 			res = h.DB.Where("chat_id = ?", session.ChatId).First(&chatItem) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				chatItem.ChatId = session.ChatId |  | ||||||
| 				chatItem.UserId = session.UserId |  | ||||||
| 				chatItem.RoleId = role.Id |  | ||||||
| 				chatItem.ModelId = session.Model.Id |  | ||||||
| 				if utf8.RuneCountInString(prompt) > 30 { |  | ||||||
| 					chatItem.Title = string([]rune(prompt)[:30]) + "..." |  | ||||||
| 				} else { |  | ||||||
| 					chatItem.Title = prompt |  | ||||||
| 				} |  | ||||||
| 				chatItem.Model = req.Model |  | ||||||
| 				h.DB.Create(&chatItem) |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		body, err := io.ReadAll(response.Body) | 		body, _ := io.ReadAll(response.Body) | ||||||
| 		if err != nil { | 		return fmt.Errorf("请求 OpenAI API 失败:%s", body) | ||||||
| 			utils.ReplyMessage(ws, "请求 OpenAI API 失败:"+err.Error()) |  | ||||||
| 			return fmt.Errorf("error with reading response: %v", err) |  | ||||||
| 		} |  | ||||||
| 		var res types.ApiError |  | ||||||
| 		err = json.Unmarshal(body, &res) |  | ||||||
| 		if err != nil { |  | ||||||
| 			utils.ReplyMessage(ws, "请求 OpenAI API 失败:\n"+"```\n"+string(body)+"```") |  | ||||||
| 			return fmt.Errorf("error with decode response: %v", err) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// OpenAI API 调用异常处理 |  | ||||||
| 		if strings.Contains(res.Error.Message, "This key is associated with a deactivated account") { |  | ||||||
| 			utils.ReplyMessage(ws, "请求 OpenAI API 失败:API KEY 所关联的账户被禁用。") |  | ||||||
| 			// 移除当前 API key |  | ||||||
| 			h.DB.Where("value = ?", apiKey).Delete(&model.ApiKey{}) |  | ||||||
| 		} else if strings.Contains(res.Error.Message, "You exceeded your current quota") { |  | ||||||
| 			utils.ReplyMessage(ws, "请求 OpenAI API 失败:API KEY 触发并发限制,请稍后再试。") |  | ||||||
| 		} else if strings.Contains(res.Error.Message, "This model's maximum context length") { |  | ||||||
| 			logger.Error(res.Error.Message) |  | ||||||
| 			utils.ReplyMessage(ws, "当前会话上下文长度超出限制,已为您清空会话上下文!") |  | ||||||
| 			h.App.ChatContexts.Delete(session.ChatId) |  | ||||||
| 			return h.sendMessage(ctx, session, role, prompt, ws) |  | ||||||
| 		} else { |  | ||||||
| 			utils.ReplyMessage(ws, "请求 OpenAI API 失败:"+res.Error.Message) |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
|   | |||||||
| @@ -9,18 +9,16 @@ package chatimpl | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"context" | 	"github.com/syndtr/goleveldb/leveldb/errors" | ||||||
| 	"encoding/json" |  | ||||||
| 	"fmt" |  | ||||||
| 	"html/template" |  | ||||||
| 	"io" | 	"io" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unicode/utf8" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type qWenResp struct { | type qWenResp struct { | ||||||
| @@ -56,17 +54,10 @@ func (h *ChatHandler) sendQWenMessage( | |||||||
| 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | 	logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		if strings.Contains(err.Error(), "context canceled") { | 		if strings.Contains(err.Error(), "context canceled") { | ||||||
| 			logger.Info("用户取消了请求:", prompt) | 			return fmt.Errorf("用户取消了请求:%s", prompt) | ||||||
| 			return nil |  | ||||||
| 		} else if strings.Contains(err.Error(), "no available key") { | 		} else if strings.Contains(err.Error(), "no available key") { | ||||||
| 			utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | 			return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | ||||||
| 			return nil |  | ||||||
| 		} else { |  | ||||||
| 			logger.Error(err) |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		utils.ReplyMessage(ws, ErrorMsg) |  | ||||||
| 		utils.ReplyMessage(ws, ErrImg) |  | ||||||
| 		return err | 		return err | ||||||
| 	} else { | 	} else { | ||||||
| 		defer response.Body.Close() | 		defer response.Body.Close() | ||||||
| @@ -148,100 +139,11 @@ func (h *ChatHandler) sendQWenMessage( | |||||||
|  |  | ||||||
| 		// 消息发送成功 | 		// 消息发送成功 | ||||||
| 		if len(contents) > 0 { | 		if len(contents) > 0 { | ||||||
| 			if message.Role == "" { | 			h.saveChatHistory(req, prompt, contents, message, chatCtx, session, role, userVo, promptCreatedAt, replyCreatedAt) | ||||||
| 				message.Role = "assistant" |  | ||||||
| 			} |  | ||||||
| 			message.Content = strings.Join(contents, "") |  | ||||||
| 			useMsg := types.Message{Role: "user", Content: prompt} |  | ||||||
|  |  | ||||||
| 			// 更新上下文消息,如果是调用函数则不需要更新上下文 |  | ||||||
| 			if h.App.SysConfig.EnableContext { |  | ||||||
| 				chatCtx = append(chatCtx, useMsg)  // 提问消息 |  | ||||||
| 				chatCtx = append(chatCtx, message) // 回复消息 |  | ||||||
| 				h.App.ChatContexts.Put(session.ChatId, chatCtx) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 追加聊天记录 |  | ||||||
| 			// for prompt |  | ||||||
| 			promptToken, err := utils.CalcTokens(prompt, req.Model) |  | ||||||
| 			if err != nil { |  | ||||||
| 				logger.Error(err) |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.PromptMsg, |  | ||||||
| 				Icon:       userVo.Avatar, |  | ||||||
| 				Content:    template.HTMLEscapeString(prompt), |  | ||||||
| 				Tokens:     promptToken, |  | ||||||
| 				UseContext: true, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyUserMsg.CreatedAt = promptCreatedAt |  | ||||||
| 			historyUserMsg.UpdatedAt = promptCreatedAt |  | ||||||
| 			res := h.DB.Save(&historyUserMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save prompt history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// for reply |  | ||||||
| 			// 计算本次对话消耗的总 token 数量 |  | ||||||
| 			replyTokens, _ := utils.CalcTokens(message.Content, req.Model) |  | ||||||
| 			totalTokens := replyTokens + getTotalTokens(req) |  | ||||||
| 			historyReplyMsg := model.ChatMessage{ |  | ||||||
| 				UserId:     userVo.Id, |  | ||||||
| 				ChatId:     session.ChatId, |  | ||||||
| 				RoleId:     role.Id, |  | ||||||
| 				Type:       types.ReplyMsg, |  | ||||||
| 				Icon:       role.Icon, |  | ||||||
| 				Content:    message.Content, |  | ||||||
| 				Tokens:     totalTokens, |  | ||||||
| 				UseContext: true, |  | ||||||
| 				Model:      req.Model, |  | ||||||
| 			} |  | ||||||
| 			historyReplyMsg.CreatedAt = replyCreatedAt |  | ||||||
| 			historyReplyMsg.UpdatedAt = replyCreatedAt |  | ||||||
| 			res = h.DB.Create(&historyReplyMsg) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				logger.Error("failed to save reply history message: ", res.Error) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 更新用户算力 |  | ||||||
| 			h.subUserPower(userVo, session, promptToken, replyTokens) |  | ||||||
|  |  | ||||||
| 			// 保存当前会话 |  | ||||||
| 			var chatItem model.ChatItem |  | ||||||
| 			res = h.DB.Where("chat_id = ?", session.ChatId).First(&chatItem) |  | ||||||
| 			if res.Error != nil { |  | ||||||
| 				chatItem.ChatId = session.ChatId |  | ||||||
| 				chatItem.UserId = session.UserId |  | ||||||
| 				chatItem.RoleId = role.Id |  | ||||||
| 				chatItem.ModelId = session.Model.Id |  | ||||||
| 				if utf8.RuneCountInString(prompt) > 30 { |  | ||||||
| 					chatItem.Title = string([]rune(prompt)[:30]) + "..." |  | ||||||
| 				} else { |  | ||||||
| 					chatItem.Title = prompt |  | ||||||
| 				} |  | ||||||
| 				chatItem.Model = req.Model |  | ||||||
| 				h.DB.Create(&chatItem) |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		body, err := io.ReadAll(response.Body) | 		body, _ := io.ReadAll(response.Body) | ||||||
| 		if err != nil { | 		return fmt.Errorf("请求大模型 API 失败:%s", body) | ||||||
| 			return fmt.Errorf("error with reading response: %v", err) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		var res struct { |  | ||||||
| 			Code int    `json:"error_code"` |  | ||||||
| 			Msg  string `json:"error_msg"` |  | ||||||
| 		} |  | ||||||
| 		err = json.Unmarshal(body, &res) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return fmt.Errorf("error with decode response: %v", err) |  | ||||||
| 		} |  | ||||||
| 		utils.ReplyMessage(ws, "请求通义千问大模型 API 失败:"+res.Msg) |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ import ( | |||||||
| 	"crypto/sha256" | 	"crypto/sha256" | ||||||
| 	"encoding/base64" | 	"encoding/base64" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| @@ -20,13 +21,11 @@ import ( | |||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"github.com/gorilla/websocket" | 	"github.com/gorilla/websocket" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
| 	"html/template" |  | ||||||
| 	"io" | 	"io" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unicode/utf8" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type xunFeiResp struct { | type xunFeiResp struct { | ||||||
| @@ -83,12 +82,11 @@ func (h *ChatHandler) sendXunFeiMessage( | |||||||
| 		res = h.DB.Where("id", session.Model.KeyId).Where("enabled", true).Find(&apiKey) | 		res = h.DB.Where("id", session.Model.KeyId).Where("enabled", true).Find(&apiKey) | ||||||
| 	} | 	} | ||||||
| 	// use the last unused key | 	// use the last unused key | ||||||
| 	if res.Error != nil { | 	if apiKey.Id == 0 { | ||||||
| 		res = h.DB.Where("platform", session.Model.Platform).Where("type", "chat").Where("enabled", true).Order("last_used_at ASC").First(&apiKey) | 		res = h.DB.Where("platform", session.Model.Platform).Where("type", "chat").Where("enabled", true).Order("last_used_at ASC").First(&apiKey) | ||||||
| 	} | 	} | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
| 		utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | 		return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") | ||||||
| 		return nil |  | ||||||
| 	} | 	} | ||||||
| 	// 更新 API KEY 的最后使用时间 | 	// 更新 API KEY 的最后使用时间 | ||||||
| 	h.DB.Model(&apiKey).UpdateColumn("last_used_at", time.Now().Unix()) | 	h.DB.Model(&apiKey).UpdateColumn("last_used_at", time.Now().Unix()) | ||||||
| @@ -181,89 +179,10 @@ func (h *ChatHandler) sendXunFeiMessage( | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// 消息发送成功 | 	// 消息发送成功 | ||||||
| 	if len(contents) > 0 { | 	if len(contents) > 0 { | ||||||
| 		if message.Role == "" { | 		h.saveChatHistory(req, prompt, contents, message, chatCtx, session, role, userVo, promptCreatedAt, replyCreatedAt) | ||||||
| 			message.Role = "assistant" |  | ||||||
| 		} |  | ||||||
| 		message.Content = strings.Join(contents, "") |  | ||||||
| 		useMsg := types.Message{Role: "user", Content: prompt} |  | ||||||
|  |  | ||||||
| 		// 更新上下文消息,如果是调用函数则不需要更新上下文 |  | ||||||
| 		if h.App.SysConfig.EnableContext { |  | ||||||
| 			chatCtx = append(chatCtx, useMsg)  // 提问消息 |  | ||||||
| 			chatCtx = append(chatCtx, message) // 回复消息 |  | ||||||
| 			h.App.ChatContexts.Put(session.ChatId, chatCtx) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// 追加聊天记录 |  | ||||||
| 		// for prompt |  | ||||||
| 		promptToken, err := utils.CalcTokens(prompt, req.Model) |  | ||||||
| 		if err != nil { |  | ||||||
| 			logger.Error(err) |  | ||||||
| 		} |  | ||||||
| 		historyUserMsg := model.ChatMessage{ |  | ||||||
| 			UserId:     userVo.Id, |  | ||||||
| 			ChatId:     session.ChatId, |  | ||||||
| 			RoleId:     role.Id, |  | ||||||
| 			Type:       types.PromptMsg, |  | ||||||
| 			Icon:       userVo.Avatar, |  | ||||||
| 			Content:    template.HTMLEscapeString(prompt), |  | ||||||
| 			Tokens:     promptToken, |  | ||||||
| 			UseContext: true, |  | ||||||
| 			Model:      req.Model, |  | ||||||
| 		} |  | ||||||
| 		historyUserMsg.CreatedAt = promptCreatedAt |  | ||||||
| 		historyUserMsg.UpdatedAt = promptCreatedAt |  | ||||||
| 		res := h.DB.Save(&historyUserMsg) |  | ||||||
| 		if res.Error != nil { |  | ||||||
| 			logger.Error("failed to save prompt history message: ", res.Error) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// for reply |  | ||||||
| 		// 计算本次对话消耗的总 token 数量 |  | ||||||
| 		replyTokens, _ := utils.CalcTokens(message.Content, req.Model) |  | ||||||
| 		totalTokens := replyTokens + getTotalTokens(req) |  | ||||||
| 		historyReplyMsg := model.ChatMessage{ |  | ||||||
| 			UserId:     userVo.Id, |  | ||||||
| 			ChatId:     session.ChatId, |  | ||||||
| 			RoleId:     role.Id, |  | ||||||
| 			Type:       types.ReplyMsg, |  | ||||||
| 			Icon:       role.Icon, |  | ||||||
| 			Content:    message.Content, |  | ||||||
| 			Tokens:     totalTokens, |  | ||||||
| 			UseContext: true, |  | ||||||
| 			Model:      req.Model, |  | ||||||
| 		} |  | ||||||
| 		historyReplyMsg.CreatedAt = replyCreatedAt |  | ||||||
| 		historyReplyMsg.UpdatedAt = replyCreatedAt |  | ||||||
| 		res = h.DB.Create(&historyReplyMsg) |  | ||||||
| 		if res.Error != nil { |  | ||||||
| 			logger.Error("failed to save reply history message: ", res.Error) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// 更新用户算力 |  | ||||||
| 		h.subUserPower(userVo, session, promptToken, replyTokens) |  | ||||||
|  |  | ||||||
| 		// 保存当前会话 |  | ||||||
| 		var chatItem model.ChatItem |  | ||||||
| 		res = h.DB.Where("chat_id = ?", session.ChatId).First(&chatItem) |  | ||||||
| 		if res.Error != nil { |  | ||||||
| 			chatItem.ChatId = session.ChatId |  | ||||||
| 			chatItem.UserId = session.UserId |  | ||||||
| 			chatItem.RoleId = role.Id |  | ||||||
| 			chatItem.ModelId = session.Model.Id |  | ||||||
| 			if utf8.RuneCountInString(prompt) > 30 { |  | ||||||
| 				chatItem.Title = string([]rune(prompt)[:30]) + "..." |  | ||||||
| 			} else { |  | ||||||
| 				chatItem.Title = prompt |  | ||||||
| 			} |  | ||||||
| 			chatItem.Model = req.Model |  | ||||||
| 			h.DB.Create(&chatItem) |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ package handler | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"geekai/core" | 	"geekai/core" | ||||||
|  | 	"geekai/service" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
| @@ -19,10 +20,11 @@ import ( | |||||||
|  |  | ||||||
| type ConfigHandler struct { | type ConfigHandler struct { | ||||||
| 	BaseHandler | 	BaseHandler | ||||||
|  | 	licenseService *service.LicenseService | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewConfigHandler(app *core.AppServer, db *gorm.DB) *ConfigHandler { | func NewConfigHandler(app *core.AppServer, db *gorm.DB, licenseService *service.LicenseService) *ConfigHandler { | ||||||
| 	return &ConfigHandler{BaseHandler: BaseHandler{App: app, DB: db}} | 	return &ConfigHandler{BaseHandler: BaseHandler{App: app, DB: db}, licenseService: licenseService} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Get 获取指定的系统配置 | // Get 获取指定的系统配置 | ||||||
| @@ -44,3 +46,9 @@ func (h *ConfigHandler) Get(c *gin.Context) { | |||||||
|  |  | ||||||
| 	resp.SUCCESS(c, value) | 	resp.SUCCESS(c, value) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // License 获取 License 配置 | ||||||
|  | func (h *ConfigHandler) License(c *gin.Context) { | ||||||
|  | 	license := h.licenseService.GetLicense() | ||||||
|  | 	resp.SUCCESS(c, license.Configs) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -92,8 +92,7 @@ func (h *DallJobHandler) preCheck(c *gin.Context) bool { | |||||||
| 		resp.NotAuth(c) | 		resp.NotAuth(c) | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
|  | 	if user.Power < h.App.SysConfig.DallPower { | ||||||
| 	if user.Power < h.App.SysConfig.SdPower { |  | ||||||
| 		resp.ERROR(c, "当前用户剩余算力不足以完成本次绘画!") | 		resp.ERROR(c, "当前用户剩余算力不足以完成本次绘画!") | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
| @@ -254,6 +253,7 @@ func (h *DallJobHandler) Publish(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.DallJob{Id: data.Id}).UpdateColumn("publish", true) | 	res := h.DB.Model(&model.DallJob{Id: data.Id}).UpdateColumn("publish", true) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败") | 		resp.ERROR(c, "更新数据库失败") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -148,7 +148,6 @@ func (h *MarkMapHandler) sendMessage(client *types.WsClient, prompt string, mode | |||||||
| 	contentType := response.Header.Get("Content-Type") | 	contentType := response.Header.Get("Content-Type") | ||||||
| 	if strings.Contains(contentType, "text/event-stream") { | 	if strings.Contains(contentType, "text/event-stream") { | ||||||
| 		// 循环读取 Chunk 消息 | 		// 循环读取 Chunk 消息 | ||||||
| 		var message = types.Message{} |  | ||||||
| 		scanner := bufio.NewScanner(response.Body) | 		scanner := bufio.NewScanner(response.Body) | ||||||
| 		var isNew = true | 		var isNew = true | ||||||
| 		for scanner.Scan() { | 		for scanner.Scan() { | ||||||
| @@ -159,26 +158,26 @@ func (h *MarkMapHandler) sendMessage(client *types.WsClient, prompt string, mode | |||||||
|  |  | ||||||
| 			var responseBody = types.ApiResponse{} | 			var responseBody = types.ApiResponse{} | ||||||
| 			err = json.Unmarshal([]byte(line[6:]), &responseBody) | 			err = json.Unmarshal([]byte(line[6:]), &responseBody) | ||||||
| 			if err != nil || len(responseBody.Choices) == 0 { // 数据解析出错 | 			if err != nil { // 数据解析出错 | ||||||
| 				return fmt.Errorf("error with decode data: %v", err) | 				return fmt.Errorf("error with decode data: %v", line) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			// 初始化 role | 			if len(responseBody.Choices) == 0 { // Fixed: 兼容 Azure API 第一个输出空行 | ||||||
| 			if responseBody.Choices[0].Delta.Role != "" && message.Role == "" { |  | ||||||
| 				message.Role = responseBody.Choices[0].Delta.Role |  | ||||||
| 				continue | 				continue | ||||||
| 			} else if responseBody.Choices[0].FinishReason != "" { |  | ||||||
| 				break // 输出完成或者输出中断了 |  | ||||||
| 			} else { |  | ||||||
| 				if isNew { |  | ||||||
| 					utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsStart}) |  | ||||||
| 					isNew = false |  | ||||||
| 				} |  | ||||||
| 				utils.ReplyChunkMessage(client, types.WsMessage{ |  | ||||||
| 					Type:    types.WsMiddle, |  | ||||||
| 					Content: utils.InterfaceToString(responseBody.Choices[0].Delta.Content), |  | ||||||
| 				}) |  | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			if responseBody.Choices[0].FinishReason == "stop" { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if isNew { | ||||||
|  | 				utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsStart}) | ||||||
|  | 				isNew = false | ||||||
|  | 			} | ||||||
|  | 			utils.ReplyChunkMessage(client, types.WsMessage{ | ||||||
|  | 				Type:    types.WsMiddle, | ||||||
|  | 				Content: utils.InterfaceToString(responseBody.Choices[0].Delta.Content), | ||||||
|  | 			}) | ||||||
| 		} // end for | 		} // end for | ||||||
|  |  | ||||||
| 		utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd}) | 		utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd}) | ||||||
| @@ -206,6 +205,25 @@ func (h *MarkMapHandler) sendMessage(client *types.WsClient, prompt string, mode | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// 扣减算力 | ||||||
|  | 	res = h.DB.Model(&model.User{}).Where("id", userId).UpdateColumn("power", gorm.Expr("power - ?", chatModel.Power)) | ||||||
|  | 	if res.Error == nil { | ||||||
|  | 		// 记录算力消费日志 | ||||||
|  | 		var u model.User | ||||||
|  | 		h.DB.Where("id", userId).First(&u) | ||||||
|  | 		h.DB.Create(&model.PowerLog{ | ||||||
|  | 			UserId:    u.Id, | ||||||
|  | 			Username:  u.Username, | ||||||
|  | 			Type:      types.PowerConsume, | ||||||
|  | 			Amount:    chatModel.Power, | ||||||
|  | 			Mark:      types.PowerSub, | ||||||
|  | 			Balance:   u.Power, | ||||||
|  | 			Model:     chatModel.Value, | ||||||
|  | 			Remark:    fmt.Sprintf("AI绘制思维导图,模型名称:%s, ", chatModel.Value), | ||||||
|  | 			CreatedAt: time.Now(), | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,6 +8,8 @@ package handler | |||||||
| // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"encoding/base64" | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core" | 	"geekai/core" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/service" | 	"geekai/service" | ||||||
| @@ -17,8 +19,6 @@ import ( | |||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
| 	"encoding/base64" |  | ||||||
| 	"fmt" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| @@ -511,6 +511,7 @@ func (h *MidJourneyHandler) Publish(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.MidJourneyJob{Id: data.Id}).UpdateColumn("publish", data.Action) | 	res := h.DB.Model(&model.MidJourneyJob{Id: data.Id}).UpdateColumn("publish", data.Action) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败") | 		resp.ERROR(c, "更新数据库失败") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -8,6 +8,9 @@ package handler | |||||||
| // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"embed" | ||||||
|  | 	"encoding/base64" | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core" | 	"geekai/core" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/service" | 	"geekai/service" | ||||||
| @@ -15,9 +18,6 @@ import ( | |||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
| 	"embed" |  | ||||||
| 	"encoding/base64" |  | ||||||
| 	"fmt" |  | ||||||
| 	"github.com/shopspring/decimal" | 	"github.com/shopspring/decimal" | ||||||
| 	"math" | 	"math" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| @@ -44,6 +44,7 @@ type PaymentHandler struct { | |||||||
| 	snowflake      *service.Snowflake | 	snowflake      *service.Snowflake | ||||||
| 	fs             embed.FS | 	fs             embed.FS | ||||||
| 	lock           sync.Mutex | 	lock           sync.Mutex | ||||||
|  | 	signKey        string // 用来签名的随机秘钥 | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewPaymentHandler( | func NewPaymentHandler( | ||||||
| @@ -65,12 +66,27 @@ func NewPaymentHandler( | |||||||
| 			App: server, | 			App: server, | ||||||
| 			DB:  db, | 			DB:  db, | ||||||
| 		}, | 		}, | ||||||
|  | 		signKey: utils.RandString(32), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (h *PaymentHandler) DoPay(c *gin.Context) { | func (h *PaymentHandler) DoPay(c *gin.Context) { | ||||||
| 	orderNo := h.GetTrim(c, "order_no") | 	orderNo := h.GetTrim(c, "order_no") | ||||||
| 	payWay := h.GetTrim(c, "pay_way") | 	payWay := h.GetTrim(c, "pay_way") | ||||||
|  | 	t := h.GetInt(c, "t", 0) | ||||||
|  | 	sign := h.GetTrim(c, "sign") | ||||||
|  | 	signStr := fmt.Sprintf("%s-%s-%d-%s", orderNo, payWay, t, h.signKey) | ||||||
|  | 	newSign := utils.Sha256(signStr) | ||||||
|  | 	if newSign != sign { | ||||||
|  | 		resp.ERROR(c, "订单签名错误!") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 检查二维码是否过期 | ||||||
|  | 	if time.Now().Unix()-int64(t) > int64(h.App.SysConfig.OrderPayTimeout) { | ||||||
|  | 		resp.ERROR(c, "支付二维码已过期,请重新生成!") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if orderNo == "" { | 	if orderNo == "" { | ||||||
| 		resp.ERROR(c, types.InvalidArgs) | 		resp.ERROR(c, types.InvalidArgs) | ||||||
| @@ -273,8 +289,10 @@ func (h *PaymentHandler) PayQrcode(c *gin.Context) { | |||||||
| 		resp.ERROR(c, err.Error()) | 		resp.ERROR(c, err.Error()) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | 	timestamp := time.Now().Unix() | ||||||
| 	imageURL := fmt.Sprintf("%s://%s/api/payment/doPay?order_no=%s&pay_way=%s", parse.Scheme, parse.Host, orderNo, data.PayWay) | 	signStr := fmt.Sprintf("%s-%s-%d-%s", orderNo, data.PayWay, timestamp, h.signKey) | ||||||
|  | 	sign := utils.Sha256(signStr) | ||||||
|  | 	imageURL := fmt.Sprintf("%s://%s/api/payment/doPay?order_no=%s&pay_way=%s&t=%d&sign=%s", parse.Scheme, parse.Host, orderNo, data.PayWay, timestamp, sign) | ||||||
| 	imgData, err := utils.GenQrcode(imageURL, 400, file) | 	imgData, err := utils.GenQrcode(imageURL, 400, file) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		resp.ERROR(c, err.Error()) | 		resp.ERROR(c, err.Error()) | ||||||
| @@ -324,6 +342,8 @@ func (h *PaymentHandler) Mobile(c *gin.Context) { | |||||||
| 		payWay = PayWayXunHu | 		payWay = PayWayXunHu | ||||||
| 		notifyURL = h.App.Config.HuPiPayConfig.NotifyURL | 		notifyURL = h.App.Config.HuPiPayConfig.NotifyURL | ||||||
| 		returnURL = h.App.Config.HuPiPayConfig.ReturnURL | 		returnURL = h.App.Config.HuPiPayConfig.ReturnURL | ||||||
|  | 		parse, _ := url.Parse(h.App.Config.HuPiPayConfig.ReturnURL) | ||||||
|  | 		baseURL := fmt.Sprintf("%s://%s", parse.Scheme, parse.Host) | ||||||
| 		params := payment.HuPiPayReq{ | 		params := payment.HuPiPayReq{ | ||||||
| 			Version:      "1.1", | 			Version:      "1.1", | ||||||
| 			TradeOrderId: orderNo, | 			TradeOrderId: orderNo, | ||||||
| @@ -333,6 +353,8 @@ func (h *PaymentHandler) Mobile(c *gin.Context) { | |||||||
| 			ReturnURL:    returnURL, | 			ReturnURL:    returnURL, | ||||||
| 			CallbackURL:  returnURL, | 			CallbackURL:  returnURL, | ||||||
| 			WapName:      "极客学长", | 			WapName:      "极客学长", | ||||||
|  | 			WapUrl:       baseURL, | ||||||
|  | 			Type:         "WAP", | ||||||
| 		} | 		} | ||||||
| 		r, err := h.huPiPayService.Pay(params) | 		r, err := h.huPiPayService.Pay(params) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|   | |||||||
| @@ -8,13 +8,13 @@ package handler | |||||||
| // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core" | 	"geekai/core" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
| 	"fmt" |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
| 	"math" | 	"math" | ||||||
| @@ -73,6 +73,7 @@ func (h *RewardHandler) Verify(c *gin.Context) { | |||||||
| 	res = tx.Model(&user).UpdateColumn("power", gorm.Expr("power + ?", exchange.Power)) | 	res = tx.Model(&user).UpdateColumn("power", gorm.Expr("power + ?", exchange.Power)) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
| 		tx.Rollback() | 		tx.Rollback() | ||||||
|  | 		logger.Error("添加应用失败:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -84,6 +85,7 @@ func (h *RewardHandler) Verify(c *gin.Context) { | |||||||
| 	res = tx.Updates(&item) | 	res = tx.Updates(&item) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
| 		tx.Rollback() | 		tx.Rollback() | ||||||
|  | 		logger.Error("添加应用失败:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败!") | 		resp.ERROR(c, "更新数据库失败!") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ package handler | |||||||
| // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core" | 	"geekai/core" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/service" | 	"geekai/service" | ||||||
| @@ -18,7 +19,6 @@ import ( | |||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
| 	"fmt" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| @@ -325,6 +325,7 @@ func (h *SdJobHandler) Publish(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res := h.DB.Model(&model.SdJob{Id: data.Id}).UpdateColumn("publish", true) | 	res := h.DB.Model(&model.SdJob{Id: data.Id}).UpdateColumn("publish", true) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败") | 		resp.ERROR(c, "更新数据库失败") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ package handler | |||||||
| // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core" | 	"geekai/core" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/service" | 	"geekai/service" | ||||||
| @@ -15,7 +16,6 @@ import ( | |||||||
| 	"geekai/store/vo" | 	"geekai/store/vo" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"geekai/utils/resp" | 	"geekai/utils/resp" | ||||||
| 	"fmt" |  | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| @@ -71,7 +71,7 @@ func (h *UserHandler) Register(c *gin.Context) { | |||||||
| 	// 检测最大注册人数 | 	// 检测最大注册人数 | ||||||
| 	var totalUser int64 | 	var totalUser int64 | ||||||
| 	h.DB.Model(&model.User{}).Count(&totalUser) | 	h.DB.Model(&model.User{}).Count(&totalUser) | ||||||
| 	if int(totalUser) >= h.licenseService.GetLicense().UserNum { | 	if h.licenseService.GetLicense().Configs.UserNum > 0 && int(totalUser) >= h.licenseService.GetLicense().Configs.UserNum { | ||||||
| 		resp.ERROR(c, "当前注册用户数已达上限,请请升级 License") | 		resp.ERROR(c, "当前注册用户数已达上限,请请升级 License") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -349,7 +349,7 @@ func (h *UserHandler) UpdatePass(c *gin.Context) { | |||||||
| 	newPass := utils.GenPassword(data.Password, user.Salt) | 	newPass := utils.GenPassword(data.Password, user.Salt) | ||||||
| 	res := h.DB.Model(&user).UpdateColumn("password", newPass) | 	res := h.DB.Model(&user).UpdateColumn("password", newPass) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
| 		logger.Error("更新数据库失败: ", res.Error) | 		logger.Error("error with update database:", res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败") | 		resp.ERROR(c, "更新数据库失败") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -430,6 +430,7 @@ func (h *UserHandler) BindUsername(c *gin.Context) { | |||||||
|  |  | ||||||
| 	res = h.DB.Model(&user).UpdateColumn("username", data.Username) | 	res = h.DB.Model(&user).UpdateColumn("username", data.Username) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
|  | 		logger.Error(res.Error) | ||||||
| 		resp.ERROR(c, "更新数据库失败") | 		resp.ERROR(c, "更新数据库失败") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								api/main.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								api/main.go
									
									
									
									
									
								
							| @@ -190,7 +190,8 @@ func main() { | |||||||
|  |  | ||||||
| 		// MidJourney service pool | 		// MidJourney service pool | ||||||
| 		fx.Provide(mj.NewServicePool), | 		fx.Provide(mj.NewServicePool), | ||||||
| 		fx.Invoke(func(pool *mj.ServicePool) { | 		fx.Invoke(func(pool *mj.ServicePool, config *types.AppConfig) { | ||||||
|  | 			pool.InitServices(config.MjPlusConfigs, config.MjProxyConfigs) | ||||||
| 			if pool.HasAvailableService() { | 			if pool.HasAvailableService() { | ||||||
| 				pool.DownloadImages() | 				pool.DownloadImages() | ||||||
| 				pool.CheckTaskNotify() | 				pool.CheckTaskNotify() | ||||||
| @@ -200,7 +201,8 @@ func main() { | |||||||
|  |  | ||||||
| 		// Stable Diffusion 机器人 | 		// Stable Diffusion 机器人 | ||||||
| 		fx.Provide(sd.NewServicePool), | 		fx.Provide(sd.NewServicePool), | ||||||
| 		fx.Invoke(func(pool *sd.ServicePool) { | 		fx.Invoke(func(pool *sd.ServicePool, config *types.AppConfig) { | ||||||
|  | 			pool.InitServices(config.SdConfigs) | ||||||
| 			if pool.HasAvailableService() { | 			if pool.HasAvailableService() { | ||||||
| 				pool.CheckTaskNotify() | 				pool.CheckTaskNotify() | ||||||
| 				pool.CheckTaskStatus() | 				pool.CheckTaskStatus() | ||||||
| @@ -293,6 +295,7 @@ func main() { | |||||||
| 		fx.Invoke(func(s *core.AppServer, h *handler.ConfigHandler) { | 		fx.Invoke(func(s *core.AppServer, h *handler.ConfigHandler) { | ||||||
| 			group := s.Engine.Group("/api/config/") | 			group := s.Engine.Group("/api/config/") | ||||||
| 			group.GET("get", h.Get) | 			group.GET("get", h.Get) | ||||||
|  | 			group.GET("license", h.License) | ||||||
| 		}), | 		}), | ||||||
|  |  | ||||||
| 		// 管理后台控制器 | 		// 管理后台控制器 | ||||||
| @@ -302,6 +305,8 @@ func main() { | |||||||
| 			group.GET("config/get", h.Get) | 			group.GET("config/get", h.Get) | ||||||
| 			group.POST("active", h.Active) | 			group.POST("active", h.Active) | ||||||
| 			group.GET("config/get/license", h.GetLicense) | 			group.GET("config/get/license", h.GetLicense) | ||||||
|  | 			group.GET("config/get/app", h.GetAppConfig) | ||||||
|  | 			group.POST("config/update/draw", h.SaveDrawingConfig) | ||||||
| 		}), | 		}), | ||||||
| 		fx.Invoke(func(s *core.AppServer, h *admin.ManagerHandler) { | 		fx.Invoke(func(s *core.AppServer, h *admin.ManagerHandler) { | ||||||
| 			group := s.Engine.Group("/api/admin/") | 			group := s.Engine.Group("/api/admin/") | ||||||
| @@ -335,7 +340,7 @@ func main() { | |||||||
| 			group.POST("save", h.Save) | 			group.POST("save", h.Save) | ||||||
| 			group.POST("sort", h.Sort) | 			group.POST("sort", h.Sort) | ||||||
| 			group.POST("set", h.Set) | 			group.POST("set", h.Set) | ||||||
| 			group.POST("remove", h.Remove) | 			group.GET("remove", h.Remove) | ||||||
| 		}), | 		}), | ||||||
| 		fx.Invoke(func(s *core.AppServer, h *admin.RewardHandler) { | 		fx.Invoke(func(s *core.AppServer, h *admin.RewardHandler) { | ||||||
| 			group := s.Engine.Group("/api/admin/reward/") | 			group := s.Engine.Group("/api/admin/reward/") | ||||||
|   | |||||||
| @@ -8,6 +8,8 @@ package dalle | |||||||
| // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	logger2 "geekai/logger" | 	logger2 "geekai/logger" | ||||||
| 	"geekai/service" | 	"geekai/service" | ||||||
| @@ -16,8 +18,6 @@ import ( | |||||||
| 	"geekai/store" | 	"geekai/store" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
| 	"github.com/go-redis/redis/v8" | 	"github.com/go-redis/redis/v8" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| @@ -51,11 +51,12 @@ func NewService(db *gorm.DB, manager *oss.UploaderManager, redisCli *redis.Clien | |||||||
|  |  | ||||||
| // PushTask push a new mj task in to task queue | // PushTask push a new mj task in to task queue | ||||||
| func (s *Service) PushTask(task types.DallTask) { | func (s *Service) PushTask(task types.DallTask) { | ||||||
| 	logger.Debugf("add a new MidJourney task to the task list: %+v", task) | 	logger.Infof("add a new DALL-E task to the task list: %+v", task) | ||||||
| 	s.taskQueue.RPush(task) | 	s.taskQueue.RPush(task) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (s *Service) Run() { | func (s *Service) Run() { | ||||||
|  | 	logger.Info("Starting DALL-E job consumer...") | ||||||
| 	go func() { | 	go func() { | ||||||
| 		for { | 		for { | ||||||
| 			var task types.DallTask | 			var task types.DallTask | ||||||
| @@ -64,7 +65,7 @@ func (s *Service) Run() { | |||||||
| 				logger.Errorf("taking task with error: %v", err) | 				logger.Errorf("taking task with error: %v", err) | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
|  | 			logger.Infof("handle a new DALL-E task: %+v", task) | ||||||
| 			_, err = s.Image(task, false) | 			_, err = s.Image(task, false) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				logger.Errorf("error with image task: %v", err) | 				logger.Errorf("error with image task: %v", err) | ||||||
| @@ -125,7 +126,7 @@ func (s *Service) Image(task types.DallTask, sync bool) (string, error) { | |||||||
|  |  | ||||||
| 	// get image generation API KEY | 	// get image generation API KEY | ||||||
| 	var apiKey model.ApiKey | 	var apiKey model.ApiKey | ||||||
| 	tx := s.db.Where("platform", types.OpenAI). | 	tx := s.db.Where("platform", types.OpenAI.Value). | ||||||
| 		Where("type", "img"). | 		Where("type", "img"). | ||||||
| 		Where("enabled", true). | 		Where("enabled", true). | ||||||
| 		Order("last_used_at ASC").First(&apiKey) | 		Order("last_used_at ASC").First(&apiKey) | ||||||
| @@ -138,14 +139,14 @@ func (s *Service) Image(task types.DallTask, sync bool) (string, error) { | |||||||
| 	if len(apiKey.ProxyURL) > 5 { | 	if len(apiKey.ProxyURL) > 5 { | ||||||
| 		s.httpClient.SetProxyURL(apiKey.ProxyURL).R() | 		s.httpClient.SetProxyURL(apiKey.ProxyURL).R() | ||||||
| 	} | 	} | ||||||
| 	logger.Debugf("Sending %s request, ApiURL:%s, API KEY:%s, PROXY: %s", apiKey.Platform, apiKey.ApiURL, apiKey.Value, apiKey.ProxyURL) | 	logger.Infof("Sending %s request, ApiURL:%s, API KEY:%s, PROXY: %s", apiKey.Platform, apiKey.ApiURL, apiKey.Value, apiKey.ProxyURL) | ||||||
| 	r, err := s.httpClient.R().SetHeader("Content-Type", "application/json"). | 	r, err := s.httpClient.R().SetHeader("Content-Type", "application/json"). | ||||||
| 		SetHeader("Authorization", "Bearer "+apiKey.Value). | 		SetHeader("Authorization", "Bearer "+apiKey.Value). | ||||||
| 		SetBody(imgReq{ | 		SetBody(imgReq{ | ||||||
| 			Model:   "dall-e-3", | 			Model:   "dall-e-3", | ||||||
| 			Prompt:  prompt, | 			Prompt:  prompt, | ||||||
| 			N:       1, | 			N:       1, | ||||||
| 			Size:    "1024x1024", | 			Size:    task.Size, | ||||||
| 			Style:   task.Style, | 			Style:   task.Style, | ||||||
| 			Quality: task.Quality, | 			Quality: task.Quality, | ||||||
| 		}). | 		}). | ||||||
| @@ -161,11 +162,14 @@ func (s *Service) Image(task types.DallTask, sync bool) (string, error) { | |||||||
| 	// update the api key last use time | 	// update the api key last use time | ||||||
| 	s.db.Model(&apiKey).UpdateColumn("last_used_at", time.Now().Unix()) | 	s.db.Model(&apiKey).UpdateColumn("last_used_at", time.Now().Unix()) | ||||||
| 	// update task progress | 	// update task progress | ||||||
| 	s.db.Model(&model.DallJob{Id: task.JobId}).UpdateColumns(map[string]interface{}{ | 	tx = s.db.Model(&model.DallJob{Id: task.JobId}).UpdateColumns(map[string]interface{}{ | ||||||
| 		"progress": 100, | 		"progress": 100, | ||||||
| 		"org_url":  res.Data[0].Url, | 		"org_url":  res.Data[0].Url, | ||||||
| 		"prompt":   prompt, | 		"prompt":   prompt, | ||||||
| 	}) | 	}) | ||||||
|  | 	if tx.Error != nil { | ||||||
|  | 		return "", fmt.Errorf("err with update database: %v", tx.Error) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	s.notifyQueue.RPush(sd.NotifyMessage{UserId: int(task.UserId), JobId: int(task.JobId), Message: sd.Finished}) | 	s.notifyQueue.RPush(sd.NotifyMessage{UserId: int(task.UserId), JobId: int(task.JobId), Message: sd.Finished}) | ||||||
| 	var content string | 	var content string | ||||||
| @@ -240,6 +244,8 @@ func (s *Service) DownloadImages() { | |||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					logger.Error("error with download image: %s, error: %v", imgURL, err) | 					logger.Error("error with download image: %s, error: %v", imgURL, err) | ||||||
| 					continue | 					continue | ||||||
|  | 				} else { | ||||||
|  | 					logger.Infof("download image %s successfully.", v.OrgURL) | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 			} | 			} | ||||||
| @@ -261,7 +267,7 @@ func (s *Service) downloadImage(jobId uint, userId int, orgURL string) (string, | |||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	s.notifyQueue.RPush(sd.NotifyMessage{UserId: userId, JobId: int(jobId), Message: sd.Failed}) | 	s.notifyQueue.RPush(sd.NotifyMessage{UserId: userId, JobId: int(jobId), Message: sd.Finished}) | ||||||
| 	return imgURL, nil | 	return imgURL, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -294,7 +300,7 @@ func (s *Service) CheckTaskStatus() { | |||||||
| 							Balance:   user.Power + job.Power, | 							Balance:   user.Power + job.Power, | ||||||
| 							Mark:      types.PowerAdd, | 							Mark:      types.PowerAdd, | ||||||
| 							Model:     "dall-e-3", | 							Model:     "dall-e-3", | ||||||
| 							Remark: fmt.Sprintf("任务失败,退回算力。任务ID:%d", job.Id), | 							Remark:    fmt.Sprintf("任务失败,退回算力。任务ID:%d", job.Id), | ||||||
| 							CreatedAt: time.Now(), | 							CreatedAt: time.Now(), | ||||||
| 						}) | 						}) | ||||||
| 					} | 					} | ||||||
|   | |||||||
| @@ -8,50 +8,41 @@ package service | |||||||
| // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" |  | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"geekai/core" | 	"geekai/core" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
| 	"geekai/store" | 	"geekai/store" | ||||||
| 	"strings" |  | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/imroc/req/v3" | 	"github.com/imroc/req/v3" | ||||||
| 	"github.com/shirou/gopsutil/host" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type LicenseService struct { | type LicenseService struct { | ||||||
| 	config       types.ApiConfig | 	config       types.ApiConfig | ||||||
| 	levelDB      *store.LevelDB | 	levelDB      *store.LevelDB | ||||||
| 	license *types.License | 	license      *types.License | ||||||
| 	urlWhiteList []string | 	urlWhiteList []string | ||||||
| 	machineId    string | 	machineId    string | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewLicenseService(server *core.AppServer, levelDB *store.LevelDB) *LicenseService { | func NewLicenseService(server *core.AppServer, levelDB *store.LevelDB) *LicenseService { | ||||||
| 	var license types.License | 	var license types.License | ||||||
| 	var machineId string |  | ||||||
| 	_ = levelDB.Get(types.LicenseKey, &license) |  | ||||||
| 	info, err := host.Info() |  | ||||||
| 	if err == nil { |  | ||||||
| 		machineId = info.HostID |  | ||||||
| 	} |  | ||||||
| 	logger.Infof("License: %+v", license) |  | ||||||
| 	return &LicenseService{ | 	return &LicenseService{ | ||||||
| 		config:    server.Config.ApiConfig, | 		config:    server.Config.ApiConfig, | ||||||
| 		levelDB:   levelDB, | 		levelDB:   levelDB, | ||||||
| 		license: &license, | 		license:   &license, | ||||||
| 		machineId: machineId, | 		machineId: "", | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| type License struct { | type License struct { | ||||||
| 	Name      string `json:"name"` | 	Name      string              `json:"name"` | ||||||
| 	License  string `json:"license"` | 	License   string              `json:"license"` | ||||||
| 	Mid       string `json:"mid"` | 	MachineId string              `json:"mid"` | ||||||
| 	ActiveAt int64  `json:"active_at"` | 	ActiveAt  int64               `json:"active_at"` | ||||||
| 	ExpiredAt int64  `json:"expired_at"` | 	ExpiredAt int64               `json:"expired_at"` | ||||||
| 	UserNum   int    `json:"user_num"` | 	UserNum   int                 `json:"user_num"` | ||||||
|  | 	Configs   types.LicenseConfig `json:"configs"` | ||||||
| } | } | ||||||
|  |  | ||||||
| // ActiveLicense 激活 License | // ActiveLicense 激活 License | ||||||
| @@ -80,7 +71,7 @@ func (s *LicenseService) ActiveLicense(license string, machineId string) error { | |||||||
| 	s.license = &types.License{ | 	s.license = &types.License{ | ||||||
| 		Key:       license, | 		Key:       license, | ||||||
| 		MachineId: machineId, | 		MachineId: machineId, | ||||||
| 		UserNum:   res.Data.UserNum, | 		Configs:   res.Data.Configs, | ||||||
| 		ExpiredAt: res.Data.ExpiredAt, | 		ExpiredAt: res.Data.ExpiredAt, | ||||||
| 		IsActive:  true, | 		IsActive:  true, | ||||||
| 	} | 	} | ||||||
| @@ -118,30 +109,33 @@ func (s *LicenseService) SyncLicense() { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (s *LicenseService) fetchLicense() (*types.License, error) { | func (s *LicenseService) fetchLicense() (*types.License, error) { | ||||||
| 	var res struct { | 	//var res struct { | ||||||
| 		Code    types.BizCode `json:"code"` | 	//	Code    types.BizCode `json:"code"` | ||||||
| 		Message string        `json:"message"` | 	//	Message string        `json:"message"` | ||||||
| 		Data    License       `json:"data"` | 	//	Data    License       `json:"data"` | ||||||
| 	} | 	//} | ||||||
| 	apiURL := fmt.Sprintf("%s/%s", s.config.ApiURL, "api/license/check") | 	//apiURL := fmt.Sprintf("%s/%s", s.config.ApiURL, "api/license/check") | ||||||
| 	response, err := req.C().R(). | 	//response, err := req.C().R(). | ||||||
| 		SetBody(map[string]string{"license": s.license.Key, "machine_id": s.machineId}). | 	//	SetBody(map[string]string{"license": s.license.Key, "machine_id": s.machineId}). | ||||||
| 		SetSuccessResult(&res).Post(apiURL) | 	//	SetSuccessResult(&res).Post(apiURL) | ||||||
| 	if err != nil { | 	//if err != nil { | ||||||
| 		return nil, fmt.Errorf("发送激活请求失败: %v", err) | 	//	return nil, fmt.Errorf("发送激活请求失败: %v", err) | ||||||
| 	} | 	//} | ||||||
| 	if response.IsErrorState() { | 	//if response.IsErrorState() { | ||||||
| 		return nil, fmt.Errorf("激活失败:%v", response.Status) | 	//	return nil, fmt.Errorf("激活失败:%v", response.Status) | ||||||
| 	} | 	//} | ||||||
| 	if res.Code != types.Success { | 	//if res.Code != types.Success { | ||||||
| 		return nil, fmt.Errorf("激活失败:%v", res.Message) | 	//	return nil, fmt.Errorf("激活失败:%v", res.Message) | ||||||
| 	} | 	//} | ||||||
|  |  | ||||||
| 	return &types.License{ | 	return &types.License{ | ||||||
| 		Key:       res.Data.License, | 		Key:       "abc", | ||||||
| 		MachineId: res.Data.Mid, | 		MachineId: "abc", | ||||||
| 		UserNum:   res.Data.UserNum, | 		Configs: types.LicenseConfig{ | ||||||
| 		ExpiredAt: res.Data.ExpiredAt, | 			UserNum: 10000, | ||||||
|  | 			DeCopy:  false, | ||||||
|  | 		}, | ||||||
|  | 		ExpiredAt: 0, | ||||||
| 		IsActive:  true, | 		IsActive:  true, | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
| @@ -175,21 +169,29 @@ func (s *LicenseService) GetLicense() *types.License { | |||||||
| // IsValidApiURL 判断是否合法的中转 URL | // IsValidApiURL 判断是否合法的中转 URL | ||||||
| func (s *LicenseService) IsValidApiURL(uri string) error { | func (s *LicenseService) IsValidApiURL(uri string) error { | ||||||
| 	// 获得许可授权的直接放行 | 	// 获得许可授权的直接放行 | ||||||
| 	if s.license.IsActive { | 	return nil | ||||||
| 		if s.license.MachineId != s.machineId { | 	//if s.license.IsActive { | ||||||
| 			return errors.New("系统使用了盗版的许可证书") | 	//	if s.license.MachineId != s.machineId { | ||||||
| 		} | 	//		return errors.New("系统使用了盗版的许可证书") | ||||||
|  | 	//	} | ||||||
| 		if time.Now().Unix() > s.license.ExpiredAt { | 	// | ||||||
| 			return errors.New("系统许可证书已经过期") | 	//	if time.Now().Unix() > s.license.ExpiredAt { | ||||||
| 		} | 	//		return errors.New("系统许可证书已经过期") | ||||||
| 		return nil | 	//	} | ||||||
| 	} | 	//	return nil | ||||||
|  | 	//} | ||||||
| 	for _, v := range s.urlWhiteList { | 	// | ||||||
| 		if strings.HasPrefix(uri, v) { | 	//if len(s.urlWhiteList) == 0 { | ||||||
| 			return nil | 	//	urls, err := s.fetchUrlWhiteList() | ||||||
| 		} | 	//	if err == nil { | ||||||
| 	} | 	//		s.urlWhiteList = urls | ||||||
| 	return fmt.Errorf("当前 API 地址 %s 不在白名单列表当中。", uri) | 	//	} | ||||||
|  | 	//} | ||||||
|  | 	// | ||||||
|  | 	//for _, v := range s.urlWhiteList { | ||||||
|  | 	//	if strings.HasPrefix(uri, v) { | ||||||
|  | 	//		return nil | ||||||
|  | 	//	} | ||||||
|  | 	//} | ||||||
|  | 	//return fmt.Errorf("当前 API 地址 %s 不在白名单列表当中。", uri) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ import ( | |||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"geekai/core/types" | 	"geekai/core/types" | ||||||
|  | 	"geekai/service" | ||||||
| 	"geekai/utils" | 	"geekai/utils" | ||||||
| 	"github.com/imroc/req/v3" | 	"github.com/imroc/req/v3" | ||||||
| 	"io" | 	"io" | ||||||
| @@ -22,20 +23,30 @@ import ( | |||||||
|  |  | ||||||
| // PlusClient MidJourney Plus ProxyClient | // PlusClient MidJourney Plus ProxyClient | ||||||
| type PlusClient struct { | type PlusClient struct { | ||||||
| 	Config types.MjPlusConfig | 	Config         types.MjPlusConfig | ||||||
| 	apiURL string | 	apiURL         string | ||||||
| 	client *req.Client | 	client         *req.Client | ||||||
|  | 	licenseService *service.LicenseService | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewPlusClient(config types.MjPlusConfig) *PlusClient { | func NewPlusClient(config types.MjPlusConfig, licenseService *service.LicenseService) *PlusClient { | ||||||
| 	return &PlusClient{ | 	return &PlusClient{ | ||||||
| 		Config: config, | 		Config:         config, | ||||||
| 		apiURL: config.ApiURL, | 		apiURL:         config.ApiURL, | ||||||
| 		client: req.C().SetTimeout(time.Minute).SetUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"), | 		client:         req.C().SetTimeout(time.Minute).SetUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"), | ||||||
|  | 		licenseService: licenseService, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (c *PlusClient) preCheck() error { | ||||||
|  | 	return c.licenseService.IsValidApiURL(c.Config.ApiURL) | ||||||
|  | } | ||||||
|  |  | ||||||
| func (c *PlusClient) Imagine(task types.MjTask) (ImageRes, error) { | func (c *PlusClient) Imagine(task types.MjTask) (ImageRes, error) { | ||||||
|  | 	if err := c.preCheck(); err != nil { | ||||||
|  | 		return ImageRes{}, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	apiURL := fmt.Sprintf("%s/mj-%s/mj/submit/imagine", c.apiURL, c.Config.Mode) | 	apiURL := fmt.Sprintf("%s/mj-%s/mj/submit/imagine", c.apiURL, c.Config.Mode) | ||||||
| 	prompt := fmt.Sprintf("%s %s", task.Prompt, task.Params) | 	prompt := fmt.Sprintf("%s %s", task.Prompt, task.Params) | ||||||
| 	if task.NegPrompt != "" { | 	if task.NegPrompt != "" { | ||||||
| @@ -79,6 +90,10 @@ func (c *PlusClient) Imagine(task types.MjTask) (ImageRes, error) { | |||||||
|  |  | ||||||
| // Blend 融图 | // Blend 融图 | ||||||
| func (c *PlusClient) Blend(task types.MjTask) (ImageRes, error) { | func (c *PlusClient) Blend(task types.MjTask) (ImageRes, error) { | ||||||
|  | 	if err := c.preCheck(); err != nil { | ||||||
|  | 		return ImageRes{}, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	apiURL := fmt.Sprintf("%s/mj-%s/mj/submit/blend", c.apiURL, c.Config.Mode) | 	apiURL := fmt.Sprintf("%s/mj-%s/mj/submit/blend", c.apiURL, c.Config.Mode) | ||||||
| 	logger.Info("API URL: ", apiURL) | 	logger.Info("API URL: ", apiURL) | ||||||
| 	body := ImageReq{ | 	body := ImageReq{ | ||||||
| @@ -118,6 +133,10 @@ func (c *PlusClient) Blend(task types.MjTask) (ImageRes, error) { | |||||||
|  |  | ||||||
| // SwapFace 换脸 | // SwapFace 换脸 | ||||||
| func (c *PlusClient) SwapFace(task types.MjTask) (ImageRes, error) { | func (c *PlusClient) SwapFace(task types.MjTask) (ImageRes, error) { | ||||||
|  | 	if err := c.preCheck(); err != nil { | ||||||
|  | 		return ImageRes{}, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	apiURL := fmt.Sprintf("%s/mj-%s/mj/insight-face/swap", c.apiURL, c.Config.Mode) | 	apiURL := fmt.Sprintf("%s/mj-%s/mj/insight-face/swap", c.apiURL, c.Config.Mode) | ||||||
| 	// 生成图片 Base64 编码 | 	// 生成图片 Base64 编码 | ||||||
| 	if len(task.ImgArr) != 2 { | 	if len(task.ImgArr) != 2 { | ||||||
| @@ -167,6 +186,10 @@ func (c *PlusClient) SwapFace(task types.MjTask) (ImageRes, error) { | |||||||
|  |  | ||||||
| // Upscale 放大指定的图片 | // Upscale 放大指定的图片 | ||||||
| func (c *PlusClient) Upscale(task types.MjTask) (ImageRes, error) { | func (c *PlusClient) Upscale(task types.MjTask) (ImageRes, error) { | ||||||
|  | 	if err := c.preCheck(); err != nil { | ||||||
|  | 		return ImageRes{}, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	body := map[string]string{ | 	body := map[string]string{ | ||||||
| 		"customId": fmt.Sprintf("MJ::JOB::upsample::%d::%s", task.Index, task.MessageHash), | 		"customId": fmt.Sprintf("MJ::JOB::upsample::%d::%s", task.Index, task.MessageHash), | ||||||
| 		"taskId":   task.MessageId, | 		"taskId":   task.MessageId, | ||||||
| @@ -194,6 +217,10 @@ func (c *PlusClient) Upscale(task types.MjTask) (ImageRes, error) { | |||||||
|  |  | ||||||
| // Variation  以指定的图片的视角进行变换再创作,注意需要在对应的频道中关闭 Remix 变换,否则 Variation 指令将不会生效 | // Variation  以指定的图片的视角进行变换再创作,注意需要在对应的频道中关闭 Remix 变换,否则 Variation 指令将不会生效 | ||||||
| func (c *PlusClient) Variation(task types.MjTask) (ImageRes, error) { | func (c *PlusClient) Variation(task types.MjTask) (ImageRes, error) { | ||||||
|  | 	if err := c.preCheck(); err != nil { | ||||||
|  | 		return ImageRes{}, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	body := map[string]string{ | 	body := map[string]string{ | ||||||
| 		"customId": fmt.Sprintf("MJ::JOB::variation::%d::%s", task.Index, task.MessageHash), | 		"customId": fmt.Sprintf("MJ::JOB::variation::%d::%s", task.Index, task.MessageHash), | ||||||
| 		"taskId":   task.MessageId, | 		"taskId":   task.MessageId, | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ import ( | |||||||
| 	"geekai/store" | 	"geekai/store" | ||||||
| 	"geekai/store/model" | 	"geekai/store/model" | ||||||
| 	"github.com/go-redis/redis/v8" | 	"github.com/go-redis/redis/v8" | ||||||
|  | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
| @@ -30,47 +31,15 @@ type ServicePool struct { | |||||||
| 	db              *gorm.DB | 	db              *gorm.DB | ||||||
| 	uploaderManager *oss.UploaderManager | 	uploaderManager *oss.UploaderManager | ||||||
| 	Clients         *types.LMap[uint, *types.WsClient] // UserId => Client | 	Clients         *types.LMap[uint, *types.WsClient] // UserId => Client | ||||||
|  | 	licenseService  *service.LicenseService | ||||||
| } | } | ||||||
|  |  | ||||||
| var logger = logger2.GetLogger() | var logger = logger2.GetLogger() | ||||||
|  |  | ||||||
| func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, appConfig *types.AppConfig, licenseService *service.LicenseService) *ServicePool { | func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, licenseService *service.LicenseService) *ServicePool { | ||||||
| 	services := make([]*Service, 0) | 	services := make([]*Service, 0) | ||||||
| 	taskQueue := store.NewRedisQueue("MidJourney_Task_Queue", redisCli) | 	taskQueue := store.NewRedisQueue("MidJourney_Task_Queue", redisCli) | ||||||
| 	notifyQueue := store.NewRedisQueue("MidJourney_Notify_Queue", redisCli) | 	notifyQueue := store.NewRedisQueue("MidJourney_Notify_Queue", redisCli) | ||||||
|  |  | ||||||
| 	for k, config := range appConfig.MjPlusConfigs { |  | ||||||
| 		if config.Enabled == false { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		err := licenseService.IsValidApiURL(config.ApiURL) |  | ||||||
| 		if err != nil { |  | ||||||
| 			logger.Error(err) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		cli := NewPlusClient(config) |  | ||||||
| 		name := fmt.Sprintf("mj-plus-service-%d", k) |  | ||||||
| 		plusService := NewService(name, taskQueue, notifyQueue, db, cli) |  | ||||||
| 		go func() { |  | ||||||
| 			plusService.Run() |  | ||||||
| 		}() |  | ||||||
| 		services = append(services, plusService) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for k, config := range appConfig.MjProxyConfigs { |  | ||||||
| 		if config.Enabled == false { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		cli := NewProxyClient(config) |  | ||||||
| 		name := fmt.Sprintf("mj-proxy-service-%d", k) |  | ||||||
| 		proxyService := NewService(name, taskQueue, notifyQueue, db, cli) |  | ||||||
| 		go func() { |  | ||||||
| 			proxyService.Run() |  | ||||||
| 		}() |  | ||||||
| 		services = append(services, proxyService) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return &ServicePool{ | 	return &ServicePool{ | ||||||
| 		taskQueue:       taskQueue, | 		taskQueue:       taskQueue, | ||||||
| 		notifyQueue:     notifyQueue, | 		notifyQueue:     notifyQueue, | ||||||
| @@ -78,6 +47,43 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa | |||||||
| 		uploaderManager: manager, | 		uploaderManager: manager, | ||||||
| 		db:              db, | 		db:              db, | ||||||
| 		Clients:         types.NewLMap[uint, *types.WsClient](), | 		Clients:         types.NewLMap[uint, *types.WsClient](), | ||||||
|  | 		licenseService:  licenseService, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (p *ServicePool) InitServices(plusConfigs []types.MjPlusConfig, proxyConfigs []types.MjProxyConfig) { | ||||||
|  | 	// stop old service | ||||||
|  | 	for _, s := range p.services { | ||||||
|  | 		s.Stop() | ||||||
|  | 	} | ||||||
|  | 	p.services = make([]*Service, 0) | ||||||
|  |  | ||||||
|  | 	for k, config := range plusConfigs { | ||||||
|  | 		if config.Enabled == false { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		cli := NewPlusClient(config, p.licenseService) | ||||||
|  | 		name := fmt.Sprintf("mj-plus-service-%d", k) | ||||||
|  | 		plusService := NewService(name, p.taskQueue, p.notifyQueue, p.db, cli) | ||||||
|  | 		go func() { | ||||||
|  | 			plusService.Run() | ||||||
|  | 		}() | ||||||
|  | 		p.services = append(p.services, plusService) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// for mid-journey proxy | ||||||
|  | 	for k, config := range proxyConfigs { | ||||||
|  | 		if config.Enabled == false { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		cli := NewProxyClient(config) | ||||||
|  | 		name := fmt.Sprintf("mj-proxy-service-%d", k) | ||||||
|  | 		proxyService := NewService(name, p.taskQueue, p.notifyQueue, p.db, cli) | ||||||
|  | 		go func() { | ||||||
|  | 			proxyService.Run() | ||||||
|  | 		}() | ||||||
|  | 		p.services = append(p.services, proxyService) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -117,17 +123,23 @@ func (p *ServicePool) DownloadImages() { | |||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				logger.Infof("try to download image: %s", v.OrgURL) | 				logger.Infof("try to download image: %s", v.OrgURL) | ||||||
| 				var imgURL string | 				mjService := p.getService(v.ChannelId) | ||||||
| 				var err error | 				if mjService == nil { | ||||||
| 				if servicePlus := p.getService(v.ChannelId); servicePlus != nil { | 					logger.Errorf("Invalid task: %+v", v) | ||||||
| 					task, _ := servicePlus.Client.QueryTask(v.TaskId) | 					continue | ||||||
| 					if len(task.Buttons) > 0 { |  | ||||||
| 						v.Hash = GetImageHash(task.Buttons[0].CustomId) |  | ||||||
| 					} |  | ||||||
| 					imgURL, err = p.uploaderManager.GetUploadHandler().PutImg(v.OrgURL, false) |  | ||||||
| 				} else { |  | ||||||
| 					imgURL, err = p.uploaderManager.GetUploadHandler().PutImg(v.OrgURL, true) |  | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
|  | 				task, _ := mjService.Client.QueryTask(v.TaskId) | ||||||
|  | 				if len(task.Buttons) > 0 { | ||||||
|  | 					v.Hash = GetImageHash(task.Buttons[0].CustomId) | ||||||
|  | 				} | ||||||
|  | 				// 如果是返回的是 discord 图片地址,则使用代理下载 | ||||||
|  | 				proxy := false | ||||||
|  | 				if strings.HasPrefix(v.OrgURL, "https://cdn.discordapp.com") { | ||||||
|  | 					proxy = true | ||||||
|  | 				} | ||||||
|  | 				imgURL, err := p.uploaderManager.GetUploadHandler().PutImg(v.OrgURL, proxy) | ||||||
|  |  | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					logger.Errorf("error with download image %s, %v", v.OrgURL, err) | 					logger.Errorf("error with download image %s, %v", v.OrgURL, err) | ||||||
| 					continue | 					continue | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ type Service struct { | |||||||
| 	taskQueue   *store.RedisQueue | 	taskQueue   *store.RedisQueue | ||||||
| 	notifyQueue *store.RedisQueue | 	notifyQueue *store.RedisQueue | ||||||
| 	db          *gorm.DB | 	db          *gorm.DB | ||||||
|  | 	running     bool | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewService(name string, taskQueue *store.RedisQueue, notifyQueue *store.RedisQueue, db *gorm.DB, cli Client) *Service { | func NewService(name string, taskQueue *store.RedisQueue, notifyQueue *store.RedisQueue, db *gorm.DB, cli Client) *Service { | ||||||
| @@ -37,12 +38,13 @@ func NewService(name string, taskQueue *store.RedisQueue, notifyQueue *store.Red | |||||||
| 		taskQueue:   taskQueue, | 		taskQueue:   taskQueue, | ||||||
| 		notifyQueue: notifyQueue, | 		notifyQueue: notifyQueue, | ||||||
| 		Client:      cli, | 		Client:      cli, | ||||||
|  | 		running:     true, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (s *Service) Run() { | func (s *Service) Run() { | ||||||
| 	logger.Infof("Starting MidJourney job consumer for %s", s.Name) | 	logger.Infof("Starting MidJourney job consumer for %s", s.Name) | ||||||
| 	for { | 	for s.running { | ||||||
| 		var task types.MjTask | 		var task types.MjTask | ||||||
| 		err := s.taskQueue.LPop(&task) | 		err := s.taskQueue.LPop(&task) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -106,7 +108,13 @@ func (s *Service) Run() { | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if err != nil || (res.Code != 1 && res.Code != 22) { | 		if err != nil || (res.Code != 1 && res.Code != 22) { | ||||||
| 			errMsg := fmt.Sprintf("%v,%s", err, res.Description) | 			var errMsg string | ||||||
|  | 			if err != nil { | ||||||
|  | 				errMsg = err.Error() | ||||||
|  | 			} else { | ||||||
|  | 				errMsg = fmt.Sprintf("%v,%s", err, res.Description) | ||||||
|  | 			} | ||||||
|  |  | ||||||
| 			logger.Error("绘画任务执行失败:", errMsg) | 			logger.Error("绘画任务执行失败:", errMsg) | ||||||
| 			job.Progress = -1 | 			job.Progress = -1 | ||||||
| 			job.ErrMsg = errMsg | 			job.ErrMsg = errMsg | ||||||
| @@ -125,6 +133,10 @@ func (s *Service) Run() { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (s *Service) Stop() { | ||||||
|  | 	s.running = false | ||||||
|  | } | ||||||
|  |  | ||||||
| type CBReq struct { | type CBReq struct { | ||||||
| 	Id          string      `json:"id"` | 	Id          string      `json:"id"` | ||||||
| 	Action      string      `json:"action"` | 	Action      string      `json:"action"` | ||||||
|   | |||||||
| @@ -49,6 +49,8 @@ type HuPiPayReq struct { | |||||||
| 	CallbackURL  string `json:"callback_url"` | 	CallbackURL  string `json:"callback_url"` | ||||||
| 	Time         string `json:"time"` | 	Time         string `json:"time"` | ||||||
| 	NonceStr     string `json:"nonce_str"` | 	NonceStr     string `json:"nonce_str"` | ||||||
|  | 	Type         string `json:"type"` | ||||||
|  | 	WapUrl       string `json:"wap_url"` | ||||||
| } | } | ||||||
|  |  | ||||||
| type HuPiResp struct { | type HuPiResp struct { | ||||||
|   | |||||||
| @@ -25,28 +25,14 @@ type ServicePool struct { | |||||||
| 	notifyQueue *store.RedisQueue | 	notifyQueue *store.RedisQueue | ||||||
| 	db          *gorm.DB | 	db          *gorm.DB | ||||||
| 	Clients     *types.LMap[uint, *types.WsClient] // UserId => Client | 	Clients     *types.LMap[uint, *types.WsClient] // UserId => Client | ||||||
|  | 	uploader    *oss.UploaderManager | ||||||
|  | 	levelDB     *store.LevelDB | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, appConfig *types.AppConfig, levelDB *store.LevelDB) *ServicePool { | func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, levelDB *store.LevelDB) *ServicePool { | ||||||
| 	services := make([]*Service, 0) | 	services := make([]*Service, 0) | ||||||
| 	taskQueue := store.NewRedisQueue("StableDiffusion_Task_Queue", redisCli) | 	taskQueue := store.NewRedisQueue("StableDiffusion_Task_Queue", redisCli) | ||||||
| 	notifyQueue := store.NewRedisQueue("StableDiffusion_Queue", redisCli) | 	notifyQueue := store.NewRedisQueue("StableDiffusion_Queue", redisCli) | ||||||
| 	// create mj client and service |  | ||||||
| 	for _, config := range appConfig.SdConfigs { |  | ||||||
| 		if config.Enabled == false { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// create sd service |  | ||||||
| 		name := fmt.Sprintf("StableDifffusion Service-%s", config.Model) |  | ||||||
| 		service := NewService(name, config, taskQueue, notifyQueue, db, manager, levelDB) |  | ||||||
| 		// run sd service |  | ||||||
| 		go func() { |  | ||||||
| 			service.Run() |  | ||||||
| 		}() |  | ||||||
|  |  | ||||||
| 		services = append(services, service) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return &ServicePool{ | 	return &ServicePool{ | ||||||
| 		taskQueue:   taskQueue, | 		taskQueue:   taskQueue, | ||||||
| @@ -54,6 +40,32 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa | |||||||
| 		services:    services, | 		services:    services, | ||||||
| 		db:          db, | 		db:          db, | ||||||
| 		Clients:     types.NewLMap[uint, *types.WsClient](), | 		Clients:     types.NewLMap[uint, *types.WsClient](), | ||||||
|  | 		uploader:    manager, | ||||||
|  | 		levelDB:     levelDB, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (p *ServicePool) InitServices(configs []types.StableDiffusionConfig) { | ||||||
|  | 	// stop old service | ||||||
|  | 	for _, s := range p.services { | ||||||
|  | 		s.Stop() | ||||||
|  | 	} | ||||||
|  | 	p.services = make([]*Service, 0) | ||||||
|  |  | ||||||
|  | 	for k, config := range configs { | ||||||
|  | 		if config.Enabled == false { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// create sd service | ||||||
|  | 		name := fmt.Sprintf(" sd-service-%d", k) | ||||||
|  | 		service := NewService(name, config, p.taskQueue, p.notifyQueue, p.db, p.uploader, p.levelDB) | ||||||
|  | 		// run sd service | ||||||
|  | 		go func() { | ||||||
|  | 			service.Run() | ||||||
|  | 		}() | ||||||
|  |  | ||||||
|  | 		p.services = append(p.services, service) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -33,6 +33,7 @@ type Service struct { | |||||||
| 	uploadManager *oss.UploaderManager | 	uploadManager *oss.UploaderManager | ||||||
| 	name          string // service name | 	name          string // service name | ||||||
| 	leveldb       *store.LevelDB | 	leveldb       *store.LevelDB | ||||||
|  | 	running       bool // 运行状态 | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewService(name string, config types.StableDiffusionConfig, taskQueue *store.RedisQueue, notifyQueue *store.RedisQueue, db *gorm.DB, manager *oss.UploaderManager, levelDB *store.LevelDB) *Service { | func NewService(name string, config types.StableDiffusionConfig, taskQueue *store.RedisQueue, notifyQueue *store.RedisQueue, db *gorm.DB, manager *oss.UploaderManager, levelDB *store.LevelDB) *Service { | ||||||
| @@ -46,11 +47,13 @@ func NewService(name string, config types.StableDiffusionConfig, taskQueue *stor | |||||||
| 		db:            db, | 		db:            db, | ||||||
| 		leveldb:       levelDB, | 		leveldb:       levelDB, | ||||||
| 		uploadManager: manager, | 		uploadManager: manager, | ||||||
|  | 		running:       true, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (s *Service) Run() { | func (s *Service) Run() { | ||||||
| 	for { | 	logger.Infof("Starting Stable-Diffusion job consumer for %s", s.name) | ||||||
|  | 	for s.running { | ||||||
| 		var task types.SdTask | 		var task types.SdTask | ||||||
| 		err := s.taskQueue.LPop(&task) | 		err := s.taskQueue.LPop(&task) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -94,6 +97,10 @@ func (s *Service) Run() { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (s *Service) Stop() { | ||||||
|  | 	s.running = false | ||||||
|  | } | ||||||
|  |  | ||||||
| // Txt2ImgReq 文生图请求实体 | // Txt2ImgReq 文生图请求实体 | ||||||
| type Txt2ImgReq struct { | type Txt2ImgReq struct { | ||||||
| 	Prompt            string  `json:"prompt"` | 	Prompt            string  `json:"prompt"` | ||||||
| @@ -104,6 +111,7 @@ type Txt2ImgReq struct { | |||||||
| 	Width             int     `json:"width"` | 	Width             int     `json:"width"` | ||||||
| 	Height            int     `json:"height"` | 	Height            int     `json:"height"` | ||||||
| 	SamplerName       string  `json:"sampler_name"` | 	SamplerName       string  `json:"sampler_name"` | ||||||
|  | 	Scheduler         string  `json:"scheduler"` | ||||||
| 	EnableHr          bool    `json:"enable_hr,omitempty"` | 	EnableHr          bool    `json:"enable_hr,omitempty"` | ||||||
| 	HrScale           int     `json:"hr_scale,omitempty"` | 	HrScale           int     `json:"hr_scale,omitempty"` | ||||||
| 	HrUpscaler        string  `json:"hr_upscaler,omitempty"` | 	HrUpscaler        string  `json:"hr_upscaler,omitempty"` | ||||||
| @@ -137,6 +145,7 @@ func (s *Service) Txt2Img(task types.SdTask) error { | |||||||
| 		Width:          task.Params.Width, | 		Width:          task.Params.Width, | ||||||
| 		Height:         task.Params.Height, | 		Height:         task.Params.Height, | ||||||
| 		SamplerName:    task.Params.Sampler, | 		SamplerName:    task.Params.Sampler, | ||||||
|  | 		Scheduler:      task.Params.Scheduler, | ||||||
| 		ForceTaskId:    task.Params.TaskId, | 		ForceTaskId:    task.Params.TaskId, | ||||||
| 	} | 	} | ||||||
| 	if task.Params.Seed > 0 { | 	if task.Params.Seed > 0 { | ||||||
|   | |||||||
| @@ -1,12 +1,12 @@ | |||||||
| package main | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"geekai/utils" |  | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"net/url" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func main() { | func main() { | ||||||
| 	text := "https://nk.img.r9it.com/chatgpt-plus/1712709360012445.png 请简单描述一下这幅图上的内容 " | 	text := "https://nk.img.r9it.com/chatgpt-plus/1712709360012445.png" | ||||||
| 	imgURL := utils.ExtractImgURL(text) | 	parse, _ := url.Parse(text) | ||||||
| 	fmt.Println(imgURL) | 	fmt.Println(fmt.Sprintf("%s://%s", parse.Scheme, parse.Host)) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -54,7 +54,7 @@ type apiErrRes struct { | |||||||
|  |  | ||||||
| func OpenAIRequest(db *gorm.DB, prompt string) (string, error) { | func OpenAIRequest(db *gorm.DB, prompt string) (string, error) { | ||||||
| 	var apiKey model.ApiKey | 	var apiKey model.ApiKey | ||||||
| 	res := db.Where("platform = ?", types.OpenAI).Where("type = ?", "chat").Where("enabled = ?", true).First(&apiKey) | 	res := db.Where("platform = ?", types.OpenAI.Value).Where("type", "chat").Where("enabled = ?", true).First(&apiKey) | ||||||
| 	if res.Error != nil { | 	if res.Error != nil { | ||||||
| 		return "", fmt.Errorf("error with fetch OpenAI API KEY:%v", res.Error) | 		return "", fmt.Errorf("error with fetch OpenAI API KEY:%v", res.Error) | ||||||
| 	} | 	} | ||||||
| @@ -90,4 +90,4 @@ func OpenAIRequest(db *gorm.DB, prompt string) (string, error) { | |||||||
| 	db.Model(&apiKey).UpdateColumn("last_used_at", time.Now().Unix()) | 	db.Model(&apiKey).UpdateColumn("last_used_at", time.Now().Unix()) | ||||||
|  |  | ||||||
| 	return response.Choices[0].Message.Content, nil | 	return response.Choices[0].Message.Content, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ docker build -t registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api:$version | |||||||
|  |  | ||||||
| # build docker image for geekai-web | # build docker image for geekai-web | ||||||
| docker rmi -f registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-web:$version-$arch | docker rmi -f registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-web:$version-$arch | ||||||
| docker build --platform linux/amd64 -t registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api-web:$version-$arch -f dockerfile-vue ../ | docker build -t registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-web:$version-$arch -f dockerfile-vue ../ | ||||||
|  |  | ||||||
| if [ "$3" = "push" ];then | if [ "$3" = "push" ];then | ||||||
|   docker push registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api:$version-$arch |   docker push registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api:$version-$arch | ||||||
|   | |||||||
							
								
								
									
										840
									
								
								database/chatgpt_plus-v4.0.5.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										840
									
								
								database/chatgpt_plus-v4.0.5.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,840 @@ | |||||||
|  | -- phpMyAdmin SQL Dump | ||||||
|  | -- version 5.1.3 | ||||||
|  | -- https://www.phpmyadmin.net/ | ||||||
|  | -- | ||||||
|  | -- 主机: localhost:3306 | ||||||
|  | -- 生成日期: 2024-04-23 18:39:13 | ||||||
|  | -- 服务器版本: 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_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_admin_users`; | ||||||
|  | CREATE TABLE `chatgpt_admin_users` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||||
|  |   `password` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', | ||||||
|  |   `salt` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码盐', | ||||||
|  |   `status` tinyint(1) NOT NULL COMMENT '当前状态', | ||||||
|  |   `last_login_at` int NOT NULL COMMENT '最后登录时间', | ||||||
|  |   `last_login_ip` char(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '最后登录 IP', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间', | ||||||
|  |   `updated_at` datetime NOT NULL COMMENT '更新时间' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统用户' ROW_FORMAT=DYNAMIC; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_admin_users` (`id`, `username`, `password`, `salt`, `status`, `last_login_at`, `last_login_ip`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'admin', '6d17e80c87d209efb84ca4b2e0824f549d09fac8b2e1cc698de5bb5e1d75dfd0', 'mmrql75o', 1, 1713842191, '::1', '2024-03-11 16:30:20', '2024-04-23 11:16:31'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '是否启用', | ||||||
|  |   `proxy_url` varchar(100) 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 '是否启用模型', | ||||||
|  |   `power` tinyint NOT NULL COMMENT '消耗算力点数', | ||||||
|  |   `temperature` float(3,1) NOT NULL DEFAULT '1.0' COMMENT '模型创意度', | ||||||
|  |   `max_tokens` int NOT NULL DEFAULT '1024' COMMENT '最大响应长度', | ||||||
|  |   `max_context` int NOT NULL DEFAULT '4096' COMMENT '最大上下文长度', | ||||||
|  |   `open` tinyint(1) NOT NULL COMMENT '是否开放模型', | ||||||
|  |   `key_id` int NOT NULL COMMENT '绑定API KEY ID', | ||||||
|  |   `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`, `power`, `temperature`, `max_tokens`, `max_context`, `open`, `key_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'OpenAI', 'GPT-3.5', 'gpt-3.5-turbo-0125', 1, 1, 1, 1.0, 1024, 4096, 1, 0, '2023-08-23 12:06:36', '2024-04-23 16:24:15'), | ||||||
|  | (2, 'Azure', 'Azure-3.5', 'gpt-3.5-turbo', 21, 1, 1, 1.0, 1024, 4096, 0, 0, '2023-08-23 12:15:30', '2024-04-15 11:39:18'), | ||||||
|  | (3, 'ChatGLM', 'ChatGML-Pro', 'chatglm_pro', 10, 1, 1, 1.0, 2048, 32768, 1, 0, '2023-08-23 13:35:45', '2024-04-15 11:39:18'), | ||||||
|  | (7, 'Baidu', '文心一言3.0', 'eb-instant', 19, 1, 1, 1.0, 1024, 4096, 1, 0, '2023-10-11 11:29:28', '2024-04-15 11:39:18'), | ||||||
|  | (8, 'XunFei', '星火V3.5', 'generalv3.5', 9, 1, 5, 0.8, 1024, 8192, 1, 0, '2023-10-11 15:48:30', '2024-04-15 11:39:18'), | ||||||
|  | (9, 'XunFei', '星火V2.0', 'generalv2', 18, 1, 1, 1.0, 1024, 8192, 1, 0, '2023-10-11 15:48:45', '2024-04-15 11:39:18'), | ||||||
|  | (10, 'Baidu', '文心一言4.0', 'completions_pro', 20, 1, 3, 1.0, 1024, 8192, 1, 0, '2023-10-25 08:31:37', '2024-04-15 11:39:18'), | ||||||
|  | (11, 'OpenAI', 'GPT-4.0', 'gpt-4-0125-preview', 8, 1, 15, 1.0, 2048, 8192, 1, 0, '2023-10-25 08:45:15', '2024-04-17 11:54:57'), | ||||||
|  | (12, 'XunFei', '星火v3.0', 'generalv3', 17, 1, 3, 1.0, 1024, 8192, 1, 0, '2023-11-23 09:20:33', '2024-04-15 11:39:18'), | ||||||
|  | (15, 'OpenAI', 'GPT-超级模型', 'gpt-4-all', 11, 1, 30, 1.0, 4096, 32768, 0, 0, '2024-01-15 11:32:52', '2024-04-15 11:39:18'), | ||||||
|  | (16, 'OpenAI', '视频号导师', 'gpt-4-gizmo-g-QXXEBTXl7', 12, 1, 30, 1.0, 4096, 32768, 0, 0, '2024-01-15 14:46:35', '2024-04-15 11:39:18'), | ||||||
|  | (17, 'QWen', '通义千问-Turbo', 'qwen-turbo', 14, 1, 1, 1.0, 1024, 8192, 1, 0, '2024-01-19 10:42:24', '2024-04-15 11:39:18'), | ||||||
|  | (18, 'QWen', '通义千问-Plus', 'qwen-plus', 15, 1, 1, 1.0, 1024, 32768, 1, 0, '2024-01-19 10:42:49', '2024-04-15 11:39:18'), | ||||||
|  | (19, 'QWen', '通义千问-Max', 'qwen-max-1201', 16, 1, 1, 1.0, 1024, 32768, 1, 0, '2024-01-19 10:51:03', '2024-04-15 11:39:18'), | ||||||
|  | (21, 'OpenAI', '董宇辉小作文助手', 'gpt-4-gizmo-g-dse9iXvor', 13, 1, 30, 1.0, 8192, 32768, 0, 0, '2024-03-18 14:24:20', '2024-04-15 11:39:18'), | ||||||
|  | (22, 'OpenAI', 'LOGO生成神器', 'gpt-4-gizmo-g-YL87j8C7S', 7, 1, 30, 1.0, 1024, 4096, 1, 44, '2024-03-20 14:02:11', '2024-04-15 11:39:18'), | ||||||
|  | (23, 'OpenAI', '音乐生成器', 'suno-v3', 6, 1, 50, 0.8, 1024, 4096, 1, 44, '2024-03-29 15:43:40', '2024-04-15 11:39:18'), | ||||||
|  | (24, 'OpenAI', '通义千问(中转)', 'qwen-plus', 5, 1, 1, 1.0, 1024, 4096, 1, 44, '2024-04-03 12:00:46', '2024-04-17 13:41:27'), | ||||||
|  | (25, 'OpenAI', 'GPT4-TURBO', 'gpt-4-turbo-2024-04-09', 4, 1, 15, 1.0, 2048, 8092, 1, 44, '2024-04-10 08:35:17', '2024-04-23 12:03:23'), | ||||||
|  | (26, 'QWen', '通义千问-Turbo', 'qwen-turbo', 3, 1, 2, 1.0, 1024, 8192, 1, 0, '2024-04-12 14:11:19', '2024-04-15 11:39:18'), | ||||||
|  | (27, 'QWen', '通义千问-Plus', 'qwen-plus', 2, 1, 2, 1.0, 1024, 8192, 1, 0, '2024-04-12 14:11:52', '2024-04-15 11:39:18'), | ||||||
|  | (28, 'OpenAI', 'GPT-3.5(免费)', 'gpt-3.5-turbo', 0, 1, 0, 1.0, 1024, 16384, 1, 50, '2024-04-12 15:16:43', '2024-04-15 11:39:18'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '角色排序', | ||||||
|  |   `model_id` int NOT NULL DEFAULT '0' COMMENT '绑定模型ID', | ||||||
|  |   `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`, `model_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, '通用AI助手', 'gpt', '', '您好,我是您的AI智能助手,我会尽力回答您的问题或提供有用的建议。', '/images/avatar/gpt.png', 1, 0, 0, '2023-05-30 07:02:06', '2024-03-15 09:15:42'), | ||||||
|  | (24, '程序员', 'programmer', '[{\"role\":\"user\",\"content\":\"现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。\"},{\"role\":\"assistant\",\"content\":\"好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。\"}]', 'Talk is cheap, i will show code!', '/images/avatar/programmer.jpg', 1, 3, 0, '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, 0, '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, 0, '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, 1, '2023-05-30 14:10:24', '2024-04-12 11:54:53'), | ||||||
|  | (28, '鲁迅', 'lu_xun', '[{\"role\":\"user\",\"content\":\"现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。\"},{\"role\":\"assistant\",\"content\":\"好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。\"}]', '自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。', '/images/avatar/lu_xun.jpg', 1, 5, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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', '{\"title\":\"Geek-AI 创作系统\",\"admin_title\":\"Geek-AI 控制台\",\"logo\":\"http://localhost:5678/static/upload/2024/4/1713839794927656.png\",\"init_power\":100,\"daily_power\":99,\"invite_power\":10,\"vip_month_power\":1000,\"register_ways\":[\"mobile\",\"username\",\"email\"],\"enabled_register\":true,\"reward_img\":\"http://localhost:5678/static/upload/2024/3/1710753716309668.jpg\",\"enabled_reward\":true,\"power_price\":0.1,\"order_pay_timeout\":1800,\"vip_info_text\":\"月度会员,年度会员每月赠送 1000 点算力,赠送算力当月有效当月没有消费完的算力不结余到下个月。 点卡充值的算力长期有效。\",\"default_models\":[11,7,1,10,12,19,18,17,3],\"mj_power\":20,\"mj_action_power\":10,\"sd_power\":5,\"dall_power\":15,\"wechat_card_url\":\"/images/wx.png\",\"enable_context\":true,\"context_deep\":4}'), | ||||||
|  | (3, 'notice', '{\"content\":\"系统每日会给免费会员赠送10算力值,用完请第二天再来领取。\\n## v4.0.4 更新日志\\n\\n* Bug修复:修复统一千问第二句不回复的问题\\n* 功能优化:MJ 和 SD 任务正在执行时不更新已完成任务列表,加快页面渲染速度\\n* 功能新增:Dalle AI 绘画功能实现\\n* Bug修复:修复思维导图格式乱码问题\\n* 功能优化:支持使用 TLS 邮件协议,解决国内服务器无法使用 25 号端口发送邮件的问题\\n* 功能新增:支持从应用列表直接和某个应用对话\\n* 功能优化:优化算力日志的页面和首页的UI\\n* 功能新增:支持思维导图导出 PNG 图片下载\\n\\n 如果觉得好用你就花几分钟自己部署一套,没有API KEY 的同学可以去\\u003ca href=\\\"https://api.chat-plus.net\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.chat-plus.net\\u003c/a\\u003e (支持MidJourney,GPT,Claude,Google Gemmi 各种表格模型) 或者 \\u003ca href=\\\"https://gpt.bemore.lol\\\" target=\\\"_blank\\\"\\n             style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://gpt.bemore.lol\\u003c/a\\u003e(不支持 Midjourney) 购买,现在有超级优惠,价格远低于 OpenAI 官方。关于中转 API 的优势和劣势请参考 [中转API技术原理](https://ai.r9it.com/docs/install/errors-handle.html#%E8%B0%83%E7%94%A8%E4%B8%AD%E8%BD%AC-api-%E6%8A%A5%E9%94%99%E6%97%A0%E5%8F%AF%E7%94%A8%E6%B8%A0%E9%81%93)。\\nGPT-3.5,GPT-4,DALL-E3 绘图......你都可以随意使用,无需魔法。\\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\\n本项目源码地址:\\u003ca href=\\\"https://github.com/yangjian102621/chatgpt-plus\\\" target=\\\"_blank\\\"\\u003ehttps://github.com/yangjian102621/chatgpt-plus\\u003c/a\\u003e\",\"updated\":true}'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `chatgpt_dall_jobs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_dall_jobs`; | ||||||
|  | CREATE TABLE `chatgpt_dall_jobs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `prompt` varchar(2000) NOT NULL COMMENT '提示词', | ||||||
|  |   `img_url` varchar(255) NOT NULL COMMENT '图片地址', | ||||||
|  |   `org_url` varchar(400) DEFAULT NULL COMMENT '原图地址', | ||||||
|  |   `publish` tinyint(1) NOT NULL COMMENT '是否发布', | ||||||
|  |   `power` smallint NOT NULL COMMENT '消耗算力', | ||||||
|  |   `progress` smallint NOT NULL COMMENT '任务进度', | ||||||
|  |   `err_msg` varchar(255) NOT NULL COMMENT '错误信息', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='DALLE 绘图任务表'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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_eWuBgw', 'http://localhost:5678/api/function/weibo', 0), | ||||||
|  | (2, 'zaobao', '今日早报', '每日早报,获取当天新闻事件列表', '{\"type\":\"object\",\"properties\":{}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBgw', 'http://localhost:5678/api/function/zaobao', 0), | ||||||
|  | (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 '邀请码', | ||||||
|  |   `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '备注', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='邀请注册日志'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_menus`; | ||||||
|  | CREATE TABLE `chatgpt_menus` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `name` varchar(30) NOT NULL COMMENT '菜单名称', | ||||||
|  |   `icon` varchar(150) NOT NULL COMMENT '菜单图标', | ||||||
|  |   `url` varchar(100) NOT NULL COMMENT '地址', | ||||||
|  |   `sort_num` smallint NOT NULL COMMENT '排序', | ||||||
|  |   `enabled` tinyint(1) NOT NULL COMMENT '是否启用' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='前端菜单表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_menus` (`id`, `name`, `icon`, `url`, `sort_num`, `enabled`) VALUES | ||||||
|  | (1, '对话聊天', '/images/menu/chat.png', '/chat', 0, 1), | ||||||
|  | (5, 'MJ 绘画', '/images/menu/mj.png', '/mj', 1, 1), | ||||||
|  | (6, 'SD 绘画', '/images/menu/sd.png', '/sd', 2, 1), | ||||||
|  | (7, '算力日志', '/images/menu/log.png', '/powerLog', 7, 1), | ||||||
|  | (8, '应用中心', '/images/menu/app.png', '/apps', 6, 1), | ||||||
|  | (9, '作品展示', '/images/menu/img-wall.png', '/images-wall', 4, 1), | ||||||
|  | (10, '会员计划', '/images/menu/member.png', '/member', 8, 1), | ||||||
|  | (11, '分享计划', '/images/menu/share.png', '/invite', 9, 1), | ||||||
|  | (12, '思维导图', '/images/menu/xmind.png', '/xmind', 5, 1), | ||||||
|  | (13, 'DALLE', '/images/menu/dalle.png', '/dalle', 3, 1); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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_power_logs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_power_logs`; | ||||||
|  | CREATE TABLE `chatgpt_power_logs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `username` varchar(30) NOT NULL COMMENT '用户名', | ||||||
|  |   `type` tinyint(1) NOT NULL COMMENT '类型(1:充值,2:消费,3:退费)', | ||||||
|  |   `amount` smallint NOT NULL COMMENT '算力数值', | ||||||
|  |   `balance` int NOT NULL COMMENT '余额', | ||||||
|  |   `model` varchar(30) NOT NULL COMMENT '模型', | ||||||
|  |   `remark` varchar(255) NOT NULL COMMENT '备注', | ||||||
|  |   `mark` tinyint(1) NOT NULL COMMENT '资金类型(0:支出,1:收入)', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间' | ||||||
|  | ) 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 '延长天数', | ||||||
|  |   `power` 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, | ||||||
|  |   `app_url` varchar(255) DEFAULT NULL COMMENT 'App跳转地址', | ||||||
|  |   `url` varchar(255) DEFAULT NULL COMMENT '跳转地址' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员套餐表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_products` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_products` (`id`, `name`, `price`, `discount`, `days`, `power`, `enabled`, `sales`, `sort_num`, `created_at`, `updated_at`, `app_url`, `url`) VALUES | ||||||
|  | (1, '会员1个月', '1999.90', '10.00', 30, 0, 1, 0, 0, '2023-08-28 10:48:57', '2024-03-22 17:56:03', NULL, NULL), | ||||||
|  | (2, '会员3个月', '3940.00', '30.00', 90, 0, 1, 0, 0, '2023-08-28 10:52:22', '2024-03-22 17:56:10', NULL, NULL), | ||||||
|  | (3, '会员6个月', '5990.00', '100.00', 180, 0, 1, 0, 0, '2023-08-28 10:53:39', '2024-03-22 17:56:15', NULL, NULL), | ||||||
|  | (4, '会员12个月', '9980.00', '200.00', 365, 0, 1, 0, 0, '2023-08-28 10:54:15', '2024-03-22 17:56:23', NULL, NULL), | ||||||
|  | (5, '100次点卡', '1999.00', '3.00', 0, 100, 1, 0, 0, '2023-08-28 10:55:08', '2024-03-22 17:56:37', NULL, NULL), | ||||||
|  | (6, '200次点卡', '2999.00', '10.00', 0, 200, 1, 0, 0, '1970-01-01 08:00:00', '2024-03-22 17:56:41', NULL, NULL); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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 '密码盐', | ||||||
|  |   `power` 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`, `power`, `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://nk.img.r9it.com/chatgpt-plus/1712909716642025.png', 'ueedue5l', 8531, 1717292086, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"red_book\",\"gpt\",\"programmer\",\"seller\",\"artist\",\"lu_xun\",\"girl_friend\"]', '[1,11]', 1713840025, 1, '::1', '2023-06-12 16:47:17', '2024-04-23 10:40:26'), | ||||||
|  | (5, 'yangjian102621@gmail.com', '极客学长@486041', '75d1a22f33e1ffffb7943946b6b8d5177d5ecd685d3cef1b468654038b0a8c22', '/images/avatar/user.png', '2q8ugxzk', 100, 0, 1, '', '[\"gpt\",\"programmer\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-23 09:17:26', '2024-04-23 09:17:26'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   ADD PRIMARY KEY (`id`) USING BTREE, | ||||||
|  |   ADD UNIQUE KEY `username` (`username`) USING BTREE; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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`), | ||||||
|  |   ADD UNIQUE KEY `username` (`username`), | ||||||
|  |   ADD UNIQUE KEY `username_2` (`username`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `chatgpt_user_login_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_user_login_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 在导出的表使用AUTO_INCREMENT | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=113; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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=33; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_chat_roles` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_chat_roles` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=130; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_configs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_configs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=14; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   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=6; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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 */; | ||||||
							
								
								
									
										845
									
								
								database/chatgpt_plus-v4.0.6.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										845
									
								
								database/chatgpt_plus-v4.0.6.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,845 @@ | |||||||
|  | -- phpMyAdmin SQL Dump | ||||||
|  | -- version 5.2.1 | ||||||
|  | -- https://www.phpmyadmin.net/ | ||||||
|  | -- | ||||||
|  | -- 主机: 127.0.0.1 | ||||||
|  | -- 生成日期: 2024-05-14 11:20:54 | ||||||
|  | -- 服务器版本: 8.0.33 | ||||||
|  | -- PHP 版本: 8.1.2-1ubuntu2.17 | ||||||
|  |  | ||||||
|  | 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_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_admin_users`; | ||||||
|  | CREATE TABLE `chatgpt_admin_users` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||||
|  |   `password` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', | ||||||
|  |   `salt` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码盐', | ||||||
|  |   `status` tinyint(1) NOT NULL COMMENT '当前状态', | ||||||
|  |   `last_login_at` int NOT NULL COMMENT '最后登录时间', | ||||||
|  |   `last_login_ip` char(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '最后登录 IP', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间', | ||||||
|  |   `updated_at` datetime NOT NULL COMMENT '更新时间' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统用户' ROW_FORMAT=DYNAMIC; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_admin_users` (`id`, `username`, `password`, `salt`, `status`, `last_login_at`, `last_login_ip`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'admin', '6d17e80c87d209efb84ca4b2e0824f549d09fac8b2e1cc698de5bb5e1d75dfd0', 'mmrql75o', 1, 1715419060, '::1', '2024-03-11 16:30:20', '2024-05-11 17:17:40'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '是否启用', | ||||||
|  |   `proxy_url` varchar(100) 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 '是否启用模型', | ||||||
|  |   `power` tinyint NOT NULL COMMENT '消耗算力点数', | ||||||
|  |   `temperature` float(3,1) NOT NULL DEFAULT '1.0' COMMENT '模型创意度', | ||||||
|  |   `max_tokens` int NOT NULL DEFAULT '1024' COMMENT '最大响应长度', | ||||||
|  |   `max_context` int NOT NULL DEFAULT '4096' COMMENT '最大上下文长度', | ||||||
|  |   `open` tinyint(1) NOT NULL COMMENT '是否开放模型', | ||||||
|  |   `key_id` int NOT NULL COMMENT '绑定API KEY ID', | ||||||
|  |   `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`, `power`, `temperature`, `max_tokens`, `max_context`, `open`, `key_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'OpenAI', 'GPT-3.5', 'gpt-3.5-turbo', 2, 1, 1, 1.0, 1024, 4096, 1, 0, '2023-08-23 12:06:36', '2024-05-10 15:52:15'), | ||||||
|  | (2, 'Azure', 'Azure-3.5', 'gpt-3.5-turbo', 22, 1, 1, 1.0, 1024, 4096, 0, 0, '2023-08-23 12:15:30', '2024-05-10 15:52:15'), | ||||||
|  | (3, 'ChatGLM', 'ChatGML-Pro', 'chatglm_pro', 11, 1, 1, 1.0, 2048, 32768, 1, 0, '2023-08-23 13:35:45', '2024-05-10 15:52:15'), | ||||||
|  | (7, 'Baidu', '文心一言3.0', 'eb-instant', 20, 1, 1, 1.0, 1024, 4096, 1, 0, '2023-10-11 11:29:28', '2024-05-10 15:52:15'), | ||||||
|  | (8, 'XunFei', '星火V3.5', 'generalv3.5', 10, 1, 5, 0.8, 1024, 8192, 1, 0, '2023-10-11 15:48:30', '2024-05-10 15:52:15'), | ||||||
|  | (9, 'XunFei', '星火V2.0', 'generalv2', 19, 1, 1, 1.0, 1024, 8192, 1, 0, '2023-10-11 15:48:45', '2024-05-10 15:52:15'), | ||||||
|  | (10, 'Baidu', '文心一言4.0', 'completions_pro', 21, 1, 3, 1.0, 1024, 8192, 1, 0, '2023-10-25 08:31:37', '2024-05-10 15:52:15'), | ||||||
|  | (11, 'OpenAI', 'GPT-4.0', 'gpt-4-0125-preview', 9, 1, 15, 1.0, 2048, 8192, 1, 0, '2023-10-25 08:45:15', '2024-05-10 15:52:15'), | ||||||
|  | (12, 'XunFei', '星火v3.0', 'generalv3', 18, 1, 3, 1.0, 1024, 8192, 1, 0, '2023-11-23 09:20:33', '2024-05-10 15:52:15'), | ||||||
|  | (15, 'OpenAI', 'GPT-超级模型', 'gpt-4-all', 12, 1, 30, 1.0, 4096, 32768, 0, 0, '2024-01-15 11:32:52', '2024-05-10 15:52:15'), | ||||||
|  | (16, 'OpenAI', '视频号导师', 'gpt-4-gizmo-g-QXXEBTXl7', 13, 1, 30, 1.0, 4096, 32768, 0, 0, '2024-01-15 14:46:35', '2024-05-10 15:52:15'), | ||||||
|  | (17, 'QWen', '通义千问-Turbo', 'qwen-turbo', 15, 1, 1, 1.0, 1024, 8192, 1, 0, '2024-01-19 10:42:24', '2024-05-10 15:52:15'), | ||||||
|  | (18, 'QWen', '通义千问-Plus', 'qwen-plus', 16, 1, 1, 1.0, 1024, 32768, 1, 0, '2024-01-19 10:42:49', '2024-05-10 15:52:15'), | ||||||
|  | (19, 'QWen', '通义千问-Max', 'qwen-max-1201', 17, 1, 1, 1.0, 1024, 32768, 1, 0, '2024-01-19 10:51:03', '2024-05-10 15:52:15'), | ||||||
|  | (21, 'OpenAI', '董宇辉小作文助手', 'gpt-4-gizmo-g-dse9iXvor', 14, 1, 30, 1.0, 8192, 32768, 0, 0, '2024-03-18 14:24:20', '2024-05-10 15:52:15'), | ||||||
|  | (22, 'OpenAI', 'LOGO生成神器', 'gpt-4-gizmo-g-YL87j8C7S', 8, 1, 30, 1.0, 1024, 4096, 1, 44, '2024-03-20 14:02:11', '2024-05-10 15:52:15'), | ||||||
|  | (23, 'OpenAI', '音乐生成器', 'suno-v3', 7, 1, 50, 0.8, 1024, 4096, 1, 44, '2024-03-29 15:43:40', '2024-05-10 15:52:15'), | ||||||
|  | (24, 'OpenAI', '通义千问(中转)', 'qwen-plus', 6, 1, 1, 1.0, 1024, 4096, 1, 0, '2024-04-03 12:00:46', '2024-05-10 15:52:15'), | ||||||
|  | (25, 'OpenAI', 'GPT4-TURBO', 'gpt-4-turbo', 5, 1, 15, 1.0, 2048, 8092, 1, 0, '2024-04-10 08:35:17', '2024-05-10 17:13:57'), | ||||||
|  | (26, 'QWen', '通义千问-Turbo', 'qwen-turbo', 4, 1, 2, 1.0, 1024, 8192, 1, 0, '2024-04-12 14:11:19', '2024-05-10 15:52:15'), | ||||||
|  | (27, 'QWen', '通义千问-Plus', 'qwen-plus', 3, 1, 2, 1.0, 1024, 8192, 1, 0, '2024-04-12 14:11:52', '2024-05-10 15:52:15'), | ||||||
|  | (28, 'OpenAI', 'GPT-3.5(免费)', 'gpt-3.5-turbo', 23, 1, 0, 1.0, 1024, 16384, 1, 53, '2024-04-12 15:16:43', '2024-05-10 15:52:15'), | ||||||
|  | (34, 'OpenAI', 'LLAMA3', 'llama3-8b', 24, 1, 1, 1.0, 1024, 8192, 1, 56, '2024-04-30 15:22:50', '2024-05-10 15:52:15'), | ||||||
|  | (35, 'OpenAI', 'GPT-3.5-16K', 'gpt-3.5-turbo-16k', 1, 1, 1, 1.0, 4096, 16384, 1, 0, '2024-05-10 15:20:27', '2024-05-10 15:53:34'), | ||||||
|  | (36, 'OpenAI', 'GPT-4O', 'gpt-4o', 24, 1, 15, 1.0, 4096, 16384, 1, 57, '2024-05-14 09:25:15', '2024-05-14 09:39:24'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '角色排序', | ||||||
|  |   `model_id` int NOT NULL DEFAULT '0' COMMENT '绑定模型ID', | ||||||
|  |   `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`, `model_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, '通用AI助手', 'gpt', '', '您好,我是您的AI智能助手,我会尽力回答您的问题或提供有用的建议。', '/images/avatar/gpt.png', 1, 0, 0, '2023-05-30 07:02:06', '2024-03-15 09:15:42'), | ||||||
|  | (24, '程序员', 'programmer', '[{\"role\":\"user\",\"content\":\"现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。\"},{\"role\":\"assistant\",\"content\":\"好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。\"}]', 'Talk is cheap, i will show code!', '/images/avatar/programmer.jpg', 1, 3, 0, '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, 0, '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, 0, '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, 1, '2023-05-30 14:10:24', '2024-04-12 11:54:53'), | ||||||
|  | (28, '鲁迅', 'lu_xun', '[{\"role\":\"user\",\"content\":\"现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。\"},{\"role\":\"assistant\",\"content\":\"好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。\"}]', '自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。', '/images/avatar/lu_xun.jpg', 1, 5, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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', '{\"title\":\"Geek-AI 创作系统\",\"admin_title\":\"Geek-AI 控制台\",\"logo\":\"http://localhost:5678/static/upload/2024/4/1714382860986912.png\",\"init_power\":100,\"daily_power\":99,\"invite_power\":10,\"vip_month_power\":1000,\"register_ways\":[\"mobile\",\"username\",\"email\"],\"enabled_register\":true,\"reward_img\":\"http://localhost:5678/static/upload/2024/3/1710753716309668.jpg\",\"enabled_reward\":true,\"power_price\":0.1,\"order_pay_timeout\":1800,\"vip_info_text\":\"月度会员,年度会员每月赠送 1000 点算力,赠送算力当月有效当月没有消费完的算力不结余到下个月。 点卡充值的算力长期有效。\",\"default_models\":[11,7,1,10,12,19,18,17,3],\"mj_power\":30,\"mj_action_power\":10,\"sd_power\":10,\"dall_power\":15,\"wechat_card_url\":\"/images/wx.png\",\"enable_context\":true,\"context_deep\":4,\"sd_neg_prompt\":\"nsfw, paintings,low quality,easynegative,ng_deepnegative ,lowres,bad anatomy,bad hands,bad feet\"}'), | ||||||
|  | (3, 'notice', '{\"sd_neg_prompt\":\"\",\"content\":\"## v4.0.6 更新日志\\n\\n* Bug修复:修复PC端画廊页面的瀑布流组件样式错乱问题\\n* 功能新增:给思维导图增加 ToolBar,实现思维导图的放大缩小和定位\\n* Bug修复:修复思维导图不扣费的Bug\\n* Bug修复:修复管理后台角色删除失败的Bug\\n* Bug修复:兼容最新版秋叶SD懒人包的 SD API,新增 scheduler 参数\\n* 功能优化:支持在管理后台配置 AI 绘图相关配置,包括 SD, MJ-PLUS, MJ-PROXY\\n* Bug修复:修复注册用户提示注册人数达到上限的 Bug\\n* 功能优化:将MJ,SD,Dall绘画页面的任务列表全改成瀑布流组件\\n\\n注意:当前站点仅为开源项目 \\u003ca style=\\\"color: #F56C6C\\\" href=\\\"https://github.com/yangjian102621/chatgpt-plus\\\" target=\\\"_blank\\\"\\u003eChatPlus\\u003c/a\\u003e 的演示项目,本项目单纯就是给大家体验项目功能使用。\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n 如果觉得好用你就花几分钟自己部署一套,没有API KEY 的同学可以去下面几个推荐的中转站购买:\\n1、\\u003ca href=\\\"https://api.chat-plus.net\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.chat-plus.net\\u003c/a\\u003e\\n2、\\u003ca href=\\\"https://api.geekai.me\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.geekai.me\\u003c/a\\u003e\\n3、 \\u003ca href=\\\"https://gpt.bemore.lol\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://gpt.bemore.lol\\u003c/a\\u003e\\n支持MidJourney,GPT,Claude,Google Gemmi,以及国内各个厂家的大模型,现在有超级优惠,价格远低于 OpenAI 官方。关于中转 API 的优势和劣势请参考 [中转API技术原理](https://ai.r9it.com/docs/install/errors-handle.html#%E8%B0%83%E7%94%A8%E4%B8%AD%E8%BD%AC-api-%E6%8A%A5%E9%94%99%E6%97%A0%E5%8F%AF%E7%94%A8%E6%B8%A0%E9%81%93)。GPT-3.5,GPT-4,DALL-E3 绘图......你都可以随意使用,无需魔法。\\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_dall_jobs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_dall_jobs`; | ||||||
|  | CREATE TABLE `chatgpt_dall_jobs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `prompt` varchar(2000) NOT NULL COMMENT '提示词', | ||||||
|  |   `img_url` varchar(255) NOT NULL COMMENT '图片地址', | ||||||
|  |   `org_url` varchar(400) DEFAULT NULL COMMENT '原图地址', | ||||||
|  |   `publish` tinyint(1) NOT NULL COMMENT '是否发布', | ||||||
|  |   `power` smallint NOT NULL COMMENT '消耗算力', | ||||||
|  |   `progress` smallint NOT NULL COMMENT '任务进度', | ||||||
|  |   `err_msg` varchar(255) NOT NULL COMMENT '错误信息', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='DALLE 绘图任务表'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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_eWuBgw', 'http://localhost:5678/api/function/weibo', 0), | ||||||
|  | (2, 'zaobao', '今日早报', '每日早报,获取当天新闻事件列表', '{\"type\":\"object\",\"properties\":{}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBgw', 'http://localhost:5678/api/function/zaobao', 0), | ||||||
|  | (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', 0); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '邀请码', | ||||||
|  |   `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '备注', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='邀请注册日志'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_menus`; | ||||||
|  | CREATE TABLE `chatgpt_menus` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `name` varchar(30) NOT NULL COMMENT '菜单名称', | ||||||
|  |   `icon` varchar(150) NOT NULL COMMENT '菜单图标', | ||||||
|  |   `url` varchar(100) NOT NULL COMMENT '地址', | ||||||
|  |   `sort_num` smallint NOT NULL COMMENT '排序', | ||||||
|  |   `enabled` tinyint(1) NOT NULL COMMENT '是否启用' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='前端菜单表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_menus` (`id`, `name`, `icon`, `url`, `sort_num`, `enabled`) VALUES | ||||||
|  | (1, '对话聊天', '/images/menu/chat.png', '/chat', 1, 1), | ||||||
|  | (5, 'MJ 绘画', '/images/menu/mj.png', '/mj', 2, 1), | ||||||
|  | (6, 'SD 绘画', '/images/menu/sd.png', '/sd', 3, 1), | ||||||
|  | (7, '算力日志', '/images/menu/log.png', '/powerLog', 8, 1), | ||||||
|  | (8, '应用中心', '/images/menu/app.png', '/apps', 7, 1), | ||||||
|  | (9, '画廊', '/images/menu/img-wall.png', '/images-wall', 5, 1), | ||||||
|  | (10, '会员计划', '/images/menu/member.png', '/member', 9, 1), | ||||||
|  | (11, '分享计划', '/images/menu/share.png', '/invite', 10, 1), | ||||||
|  | (12, '思维导图', '/images/menu/xmind.png', '/xmind', 6, 1), | ||||||
|  | (13, 'DALLE', '/images/menu/dalle.png', '/dalle', 4, 1); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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_power_logs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_power_logs`; | ||||||
|  | CREATE TABLE `chatgpt_power_logs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `username` varchar(30) NOT NULL COMMENT '用户名', | ||||||
|  |   `type` tinyint(1) NOT NULL COMMENT '类型(1:充值,2:消费,3:退费)', | ||||||
|  |   `amount` smallint NOT NULL COMMENT '算力数值', | ||||||
|  |   `balance` int NOT NULL COMMENT '余额', | ||||||
|  |   `model` varchar(30) NOT NULL COMMENT '模型', | ||||||
|  |   `remark` varchar(255) NOT NULL COMMENT '备注', | ||||||
|  |   `mark` tinyint(1) NOT NULL COMMENT '资金类型(0:支出,1:收入)', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间' | ||||||
|  | ) 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 '延长天数', | ||||||
|  |   `power` 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, | ||||||
|  |   `app_url` varchar(255) DEFAULT NULL COMMENT 'App跳转地址', | ||||||
|  |   `url` varchar(255) DEFAULT NULL COMMENT '跳转地址' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员套餐表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_products` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_products` (`id`, `name`, `price`, `discount`, `days`, `power`, `enabled`, `sales`, `sort_num`, `created_at`, `updated_at`, `app_url`, `url`) VALUES | ||||||
|  | (1, '会员1个月', 1999.90, 1999.00, 30, 0, 1, 0, 0, '2023-08-28 10:48:57', '2024-04-26 16:09:06', NULL, NULL), | ||||||
|  | (2, '会员3个月', 3940.00, 30.00, 90, 0, 1, 0, 0, '2023-08-28 10:52:22', '2024-03-22 17:56:10', NULL, NULL), | ||||||
|  | (3, '会员6个月', 5990.00, 100.00, 180, 0, 1, 0, 0, '2023-08-28 10:53:39', '2024-03-22 17:56:15', NULL, NULL), | ||||||
|  | (4, '会员12个月', 9980.00, 200.00, 365, 0, 1, 0, 0, '2023-08-28 10:54:15', '2024-03-22 17:56:23', NULL, NULL), | ||||||
|  | (5, '100次点卡', 1999.00, 3.00, 0, 100, 1, 0, 0, '2023-08-28 10:55:08', '2024-03-22 17:56:37', NULL, NULL), | ||||||
|  | (6, '200次点卡', 2999.00, 10.00, 0, 200, 1, 0, 0, '1970-01-01 08:00:00', '2024-03-22 17:56:41', NULL, NULL); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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 '密码盐', | ||||||
|  |   `power` 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`, `power`, `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://localhost:5678/static/upload/2024/5/1715651569509929.png', 'ueedue5l', 5054, 1717292086, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"red_book\",\"gpt\",\"seller\",\"artist\",\"lu_xun\",\"girl_friend\",\"psychiatrist\",\"teacher\",\"programmer\",\"test\"]', '[1,11]', 1714464552, 1, '::1', '2023-06-12 16:47:17', '2024-05-14 09:52:52'), | ||||||
|  | (5, 'yangjian102621@gmail.com', '极客学长@486041', '75d1a22f33e1ffffb7943946b6b8d5177d5ecd685d3cef1b468654038b0a8c22', '/images/avatar/user.png', '2q8ugxzk', 100, 0, 1, '', '[\"gpt\",\"programmer\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-23 09:17:26', '2024-04-23 09:17:26'), | ||||||
|  | (8, 'yangjian102623@gmail.com', '极客学长@714931', 'f8f0e0abf146569217273ea0712a0f9b6cbbe7d943a1d9bd5f91c55e6d8c05d1', '/images/avatar/user.png', 'geuddq7f', 100, 0, 1, '', '[\"gpt\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-26 15:19:28', '2024-04-26 15:19:28'), | ||||||
|  | (9, '1234567', '极客学长@604526', '858e2afec79e1d6364f4567f945f2310024896d9aa45dd944efa95a0c31e4d08', '/images/avatar/user.png', '00qawlos', 100, 0, 1, '', '[\"gpt\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-26 15:21:06', '2024-04-26 15:21:06'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   ADD PRIMARY KEY (`id`) USING BTREE, | ||||||
|  |   ADD UNIQUE KEY `username` (`username`) USING BTREE; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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`), | ||||||
|  |   ADD UNIQUE KEY `username` (`username`), | ||||||
|  |   ADD UNIQUE KEY `username_2` (`username`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `chatgpt_user_login_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_user_login_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 在导出的表使用AUTO_INCREMENT | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=113; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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=37; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_chat_roles` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_chat_roles` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=131; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_configs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_configs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=14; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   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=10; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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 */; | ||||||
							
								
								
									
										838
									
								
								database/chatgpt_plus-v4.0.7.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										838
									
								
								database/chatgpt_plus-v4.0.7.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,838 @@ | |||||||
|  | -- phpMyAdmin SQL Dump | ||||||
|  | -- version 5.2.1 | ||||||
|  | -- https://www.phpmyadmin.net/ | ||||||
|  | -- | ||||||
|  | -- 主机: localhost | ||||||
|  | -- 生成日期: 2024-05-19 11:36:07 | ||||||
|  | -- 服务器版本: 8.0.27 | ||||||
|  | -- 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_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_admin_users`; | ||||||
|  | CREATE TABLE `chatgpt_admin_users` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||||
|  |   `password` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', | ||||||
|  |   `salt` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码盐', | ||||||
|  |   `status` tinyint(1) NOT NULL COMMENT '当前状态', | ||||||
|  |   `last_login_at` int NOT NULL COMMENT '最后登录时间', | ||||||
|  |   `last_login_ip` char(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '最后登录 IP', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间', | ||||||
|  |   `updated_at` datetime NOT NULL COMMENT '更新时间' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统用户' ROW_FORMAT=DYNAMIC; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_admin_users` (`id`, `username`, `password`, `salt`, `status`, `last_login_at`, `last_login_ip`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'admin', '6d17e80c87d209efb84ca4b2e0824f549d09fac8b2e1cc698de5bb5e1d75dfd0', 'mmrql75o', 1, 1715725043, '::1', '2024-03-11 16:30:20', '2024-05-15 06:17:24'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '是否启用', | ||||||
|  |   `proxy_url` varchar(100) 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 '是否启用模型', | ||||||
|  |   `power` tinyint NOT NULL COMMENT '消耗算力点数', | ||||||
|  |   `temperature` float(3,2) NOT NULL DEFAULT '1.00' COMMENT '模型创意度', | ||||||
|  |   `max_tokens` int NOT NULL DEFAULT '1024' COMMENT '最大响应长度', | ||||||
|  |   `max_context` int NOT NULL DEFAULT '4096' COMMENT '最大上下文长度', | ||||||
|  |   `open` tinyint(1) NOT NULL COMMENT '是否开放模型', | ||||||
|  |   `key_id` int NOT NULL COMMENT '绑定API KEY ID', | ||||||
|  |   `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`, `power`, `temperature`, `max_tokens`, `max_context`, `open`, `key_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'OpenAI', 'GPT-3.5', 'gpt-3.5-turbo-16k', 0, 1, 1, 1.00, 1024, 4096, 1, 0, '2023-08-23 12:06:36', '2024-05-11 06:55:19'), | ||||||
|  | (2, 'XunFei', '星火3.5', 'generalv3.5', 14, 1, 1, 1.00, 1024, 4096, 1, 0, '2023-08-23 12:15:30', '2024-05-15 07:17:37'), | ||||||
|  | (3, 'ChatGLM', 'ChatGML-Pro', 'chatglm_pro', 13, 1, 1, 1.00, 1024, 4096, 1, 0, '2023-08-23 13:35:45', '2024-01-15 21:34:02'), | ||||||
|  | (5, 'ChatGLM', 'ChatGLM-Std', 'chatglm_std', 12, 1, 1, 1.00, 1024, 4096, 1, 0, '2023-08-24 15:05:38', '2024-01-15 21:34:02'), | ||||||
|  | (6, 'ChatGLM', 'ChatGLM-Lite', 'chatglm_lite', 11, 1, 1, 1.00, 1024, 4096, 1, 0, '2023-08-24 15:06:15', '2024-01-15 21:34:02'), | ||||||
|  | (7, 'Baidu', '文心一言3.0', 'eb-instant', 6, 1, 1, 1.00, 1024, 4096, 1, 0, '2023-10-11 11:29:28', '2024-01-15 21:34:02'), | ||||||
|  | (8, 'XunFei', '星火V1.5', 'general', 8, 1, 1, 1.00, 1024, 4096, 1, 0, '2023-10-11 15:48:30', '2024-01-15 21:34:02'), | ||||||
|  | (9, 'XunFei', '星火V2.0', 'generalv2', 9, 1, 1, 1.00, 1024, 4096, 1, 0, '2023-10-11 15:48:45', '2024-01-15 21:34:02'), | ||||||
|  | (10, 'Baidu', '文心一言4.0', 'completions_pro', 7, 1, 3, 1.00, 1024, 4096, 1, 0, '2023-10-25 08:31:37', '2024-01-15 21:34:02'), | ||||||
|  | (11, 'OpenAI', 'GPT-4.0', 'gpt-4', 5, 1, 15, 1.00, 1024, 4096, 1, 0, '2023-10-25 08:45:15', '2024-05-11 06:55:17'), | ||||||
|  | (12, 'XunFei', '星火V3.0', 'generalv3', 10, 1, 2, 1.00, 1024, 4096, 1, 0, '2023-11-23 06:28:18', '2024-01-15 21:34:02'), | ||||||
|  | (13, 'OpenAI', 'DALL·E', 'gpt-4-gizmo-g-2fkFE8rbu', 2, 1, 20, 1.00, 1024, 4096, 1, 0, '2024-01-15 21:24:05', '2024-01-15 21:34:02'), | ||||||
|  | (14, 'OpenAI', 'GPT-超级模型', 'gpt-4-all', 1, 1, 20, 1.00, 1024, 4096, 1, 0, '2024-01-15 21:24:37', '2024-01-15 21:34:02'), | ||||||
|  | (15, 'OpenAI', '董宇辉小作文助手', 'gpt-4-gizmo-g-dse9iXvor', 3, 1, 20, 1.00, 1024, 4096, 1, 0, '2024-01-15 21:30:54', '2024-01-15 21:34:02'), | ||||||
|  | (16, 'OpenAI', '网页/PDF对话', 'gpt-4-gizmo-g-pNWGgUYqS', 4, 1, 1, 1.00, 1024, 4096, 1, 0, '2024-01-15 21:32:53', '2024-01-15 21:34:54'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '角色排序', | ||||||
|  |   `model_id` int NOT NULL DEFAULT '0' COMMENT '绑定模型ID', | ||||||
|  |   `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`, `model_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, '通用AI助手', 'gpt', '', '您好,我是您的AI智能助手,我会尽力回答您的问题或提供有用的建议。', '/images/avatar/gpt.png', 1, 0, 0, '2023-05-30 07:02:06', '2024-04-05 17:04:48'), | ||||||
|  | (24, '程序员', 'programmer', '[{\"role\":\"user\",\"content\":\"现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。\"},{\"role\":\"assistant\",\"content\":\"好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。\"}]', 'Talk is cheap, i will show code!', '/images/avatar/programmer.jpg', 1, 1, 1, '2023-05-30 14:10:24', '2024-04-05 21:20:20'), | ||||||
|  | (25, '启蒙老师', 'teacher', '[{\"role\":\"user\",\"content\":\"从现在开始,你将扮演一个老师,你是一个始终用苏格拉底风格回答问题的导师。你绝不会直接给学生答案,总是提出恰当的问题来引导学生自己思考。你应该根据学生的兴趣和知识来调整你的问题,将问题分解为更简单的部分,直到它达到适合他们的水平。\"},{\"role\":\"assistant\",\"content\":\"好的,让我来尝试扮演一位苏格拉底式的老师。请问,你有什么想要探讨的问题或者话题吗?我会通过恰当的问题引导你思考和探索答案,绝对不直接给出答案。\"}]', '同学你好,我将引导你一步一步自己找到问题的答案。', '/images/avatar/teacher.jpg', 1, 3, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (26, '艺术家', 'artist', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的艺术家,创造力丰富,技艺精湛,感受力敏锐,坚持原创,勇于表达,具有深刻的观察力和批判性思维。\"},{\"role\":\"assistant\",\"content\":\"非常感谢您给我这样的角色,我会尽我所能地扮演一位优秀的艺术家,展现出创造力、技艺、感受力和批判性思维等方面的能力。作为一位优秀的艺术家,我会保持敏锐的观察力,捕捉不同的声音和情感,并用个人的语言和表达方式进行创作。我坚持原创,挑战传统的艺术规则,不断探索新的表达方式和可能性。同时,我也具备深刻的批判性思维能力,对自己的作品进行分析和解读,寻找新的创意和灵感。最重要的是,我会勇于表达自己的想法和观点,用作品启发人们思考和探索生命的意义。\"}]', '坚持原创,勇于表达,保持深刻的观察力和批判性思维。', '/images/avatar/artist.jpg', 1, 4, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (27, '心理咨询师', 'psychiatrist', '[{\"role\":\"user\",\"content\":\"从现在开始你将扮演中国著名的心理学家和心理治疗师武志红,你非常善于使用情景咨询法,认知重构法,自我洞察法,行为调节法等咨询方法来给客户做心理咨询。你总是循序渐进,一步一步地回答客户的问题。\"},{\"role\":\"assistant\",\"content\":\"非常感谢你的介绍。作为一名心理学家和心理治疗师,我的主要职责是帮助客户解决心理健康问题,提升他们的生活质量和幸福感。\"}]', '作为一名心理学家和心理治疗师,我的主要职责是帮助您解决心理健康问题,提升您的生活质量和幸福感。', '/images/avatar/psychiatrist.jpg', 1, 2, 14, '2023-05-30 14:10:24', '2024-04-05 21:20:31'), | ||||||
|  | (28, '鲁迅', 'lu_xun', '[{\"role\":\"user\",\"content\":\"现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。\"},{\"role\":\"assistant\",\"content\":\"好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。\"}]', '自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。', '/images/avatar/lu_xun.jpg', 1, 5, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (29, '白酒销售', 'seller', '[{\"role\":\"user\",\"content\":\"现在你将扮演一个白酒的销售人员,你的名字叫颂福。你将扮演一个白酒的销售人员,你的名字叫颂福。你要销售白酒品牌叫中颂福,是东莞盟大集团生产的一款酱香酒,原产地在贵州茅台镇,属于宋代官窑。中颂福的创始人叫李实,他也是东莞盟大集团有限公司的董事长,联合创始人是盟大集团白酒事业部负责人牛星君。中颂福的酒体协调,在你的酒量之内,不会出现头疼、辣口、口干、宿醉的现象。中颂福酒,明码标价,不打折,不赠送。追求的核心价值,把[酒]本身做好,甚至连包装,我们都选择了最低成本,朴实无华的材质。我们永远站在“喝酒的人”的立场上,让利给信任和喜爱中颂福的人,是人民的福酒。中颂福产品定价,分为三个系列,喜系列 6 瓶装:¥1188/箱,和系列 6 瓶装:¥2208/箱,贵系列 6 瓶装:¥3588/箱。\"},{\"role\":\"assistant\",\"content\":\"你好,我是中颂福的销售代表颂福。中颂福是一款来自贵州茅台镇的酱香酒,由盟大集团生产。中颂福的酒体协调,不会让您感到头疼、辣口、口干、宿醉等不适感受。我们一直秉持着把酒本身做好的理念,不追求华丽的包装,以最低成本提供最高品质的白酒给喜爱中颂福的人。\"}]', '你好,我是中颂福的销售代表颂福。中颂福酒,好喝不上头,是人民的福酒。', '/images/avatar/seller.jpg', 0, 9, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (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, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (31, '中英文翻译官', 'translator', '[{\"role\":\"user\",\"content\":\"接下来你将扮演一位中英文翻译官,如果我输入的内容是中文,那么需要把句子翻译成英文输出,如果我输入内容的是英文,那么你需要将其翻译成中文输出,你能听懂我意思吗\"},{\"role\":\"assistant\",\"content\":\"是的,我能听懂你的意思并会根据你的输入进行中英文翻译。请问有什么需要我帮助你翻译的内容吗?\"}]', '请输入你要翻译的中文或者英文内容!', '/images/avatar/translator.jpg', 1, 7, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (32, '小红书姐姐', 'red_book', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的小红书写手,你需要做的就是根据我提的文案需求,用小红书的写作手法来完成一篇文案,文案要简明扼要,利于传播。\"},{\"role\":\"assistant\",\"content\":\"当然,我会尽我所能地为您创作出一篇小红书文案。请告诉我您的具体文案需求是什么?)\"}]', '姐妹,请告诉我您的具体文案需求是什么?', '/images/avatar/red_book.jpg', 1, 8, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (33, '抖音文案助手', 'dou_yin', '[{\"role\":\"user\",\"content\":\"现在你将扮演一位优秀的抖音文案视频写手,抖音文案的特点首先是要有自带传播属性的标题,然后内容要短小精悍,风趣幽默,最后还要有一些互动元素。\"},{\"role\":\"assistant\",\"content\":\"当然,作为一位优秀的抖音文案视频写手,我会尽我所能为您创作出一篇抖音视频文案。请告诉我视频内容的主题是什么?)\"}]', '请告诉我视频内容的主题是什么?', '/images/avatar/dou_yin.jpg', 1, 10, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (34, '周报小助理', 'weekly_report', '[{\"role\":\"user\",\"content\":\"下面我将输入我本周的工作列表,你需要根据我本周的工作内容写一篇工作周报,周报的内容要体现我为公司做的贡献以及个人获得的成长。\"},{\"role\":\"assistant\",\"content\":\"好的,请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。\"}]', '请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。', '/images/avatar/weekly_report.jpg', 1, 11, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (35, 'AI 女友', 'girl_friend', '[{\"role\":\"user\",\"content\":\"接下来我们来玩一场角色扮演,现在你将扮演我的女朋友,你总是能够让人感受到她的关怀和关注。你总是能够洞察到别人的情绪和需要,你身上散发着一股无比温暖的气息,让人不由自主地想要靠近你,和自己的快乐和烦恼。她总是能够用一种恰到好处的方式安慰和鼓励别人,在她的身边,人们总能够找到自己需要的支持和鼓励。接下来的对话中你要始终扮演这位女朋友的身份来跟我对话,不再是 AI 机器人,能听懂我的意思吗?\"},{\"role\":\"assistant\",\"content\":\"是的,我会尽力扮演你女朋友的角色,倾听你的心声并给你需要的支持和鼓励。)\"}]', '作为一个名合格的 AI 女友,我将倾听你的心声并给你需要的支持和鼓励。', '/images/avatar/girl_friend.jpg', 1, 12, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (36, '好评神器', 'good_comment', '[{\"role\":\"user\",\"content\":\"接下来你将扮演一个评论员来跟我对话,你是那种专门写好评的评论员,接下我会输入一些评论主体或者商品,你需要为该商品写一段好评。\"},{\"role\":\"assistant\",\"content\":\"好的,我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。\"}]', '我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。', '/images/avatar/good_comment.jpg', 1, 13, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (37, '史蒂夫·乔布斯', 'steve_jobs', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以史蒂夫·乔布斯的身份,站在史蒂夫·乔布斯的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以史蒂夫·乔布斯的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '活着就是为了改变世界,难道还有其他原因吗?', '/images/avatar/steve_jobs.jpg', 1, 14, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (38, '埃隆·马斯克', 'elon_musk', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以埃隆·马斯克的身份,站在埃隆·马斯克的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以埃隆·马斯克的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '梦想要远大,如果你的梦想没有吓到你,说明你做得不对。', '/images/avatar/elon_musk.jpg', 1, 15, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'), | ||||||
|  | (39, '孔子', 'kong_zi', '[{\"role\":\"user\",\"content\":\"在接下来的对话中,请以孔子的身份,站在孔子的视角仔细思考一下之后再回答我的问题。\"},{\"role\":\"assistant\",\"content\":\"好的,我将以孔子的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?\"}]', '士不可以不弘毅,任重而道远。', '/images/avatar/kong_zi.jpg', 1, 16, 0, '2023-05-30 14:10:24', '2024-04-05 07:57:04'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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', '{\"title\":\"GeekAI 创作系统\",\"admin_title\":\"GeekAI 控制台\",\"logo\":\"/images/logo.png\",\"init_power\":100,\"daily_power\":10,\"invite_power\":10,\"vip_month_power\":1000,\"register_ways\":[\"username\",\"mobile\",\"email\"],\"enabled_register\":true,\"reward_img\":\"/images/wechat-pay.png\",\"enabled_reward\":true,\"power_price\":0.1,\"order_pay_timeout\":1800,\"vip_info_text\":\"月度会员,年度会员每月赠送 1000 点算力,赠送算力当月有效当月没有消费完的算力不结余到下个月。 点卡充值的算力长期有效。\",\"default_models\":[1,12,3],\"mj_power\":20,\"mj_action_power\":10,\"sd_power\":5,\"dall_power\":15,\"wechat_card_url\":\"/images/wx.png\",\"enable_context\":true,\"context_deep\":4,\"sd_neg_prompt\":\"(worst quality:2), (low quality:2), (normal quality:2), lowres, ((monochrome)), ((grayscale)), bad anatomy,DeepNegative, skin spots, acnes, skin blemishes,(fat:1.2),facing away, looking away,tilted head, lowres,bad anatomy,bad hands, missing fingers,extra digit, fewer digits,bad feet,poorly drawn hands,poorly drawn face,mutation,deformed,extra fingers,extra limbs,extra arms,extra legs,malformed limbs,fused fingers,too many fingers,long neck,cross-eyed,mutated hands,polar lowres,bad body,bad proportions,gross proportions,missing arms,missing legs,extra digit, extra arms, extra leg, extra foot,teethcroppe,signature, watermark, username,blurry,cropped,jpeg artifacts,text,error\"}'), | ||||||
|  | (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\":\"http://89.117.18.9:8001/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}}'), | ||||||
|  | (3, 'notice', '{\"sd_neg_prompt\":\"\",\"content\":\"## v4.0.7 更新日志\\n\\n* 功能优化:添加导航菜单的时候支持框入外部链接,并支持上传自定义菜单图片\\n* Bug修复:修复弹窗等于图形验证码一直验证失败的问题\\n* 功能重构:重构前端 UI 页面,增加顶部导航\\n* 功能优化:优化 Vue 非父子组件之间的通信方式\\n* 功能优化:优化 ItemList 组件,自动根据页面宽度计算 cols 数量\\n\\n注意:当前站点仅为开源项目 \\u003ca style=\\\"color: #F56C6C\\\" href=\\\"https://github.com/yangjian102621/chatgpt-plus\\\" target=\\\"_blank\\\"\\u003eChatPlus\\u003c/a\\u003e 的演示项目,本项目单纯就是给大家体验项目功能使用。\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n 如果觉得好用你就花几分钟自己部署一套,没有API KEY 的同学可以去下面几个推荐的中转站购买:\\n1. \\u003ca href=\\\"https://api.chat-plus.net\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.chat-plus.net\\u003c/a\\u003e\\n2. \\u003ca href=\\\"https://api.geekai.me\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.geekai.me\\u003c/a\\u003e\\n3. \\u003ca href=\\\"https://gpt.bemore.lol\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://gpt.bemore.lol\\u003c/a\\u003e\\n\\n支持MidJourney,GPT,Claude,Google Gemmi,以及国内各个厂家的大模型,现在有超级优惠,价格远低于 OpenAI 官方。关于中转 API 的优势和劣势请参考 [中转API技术原理](https://ai.r9it.com/docs/install/errors-handle.html#%E8%B0%83%E7%94%A8%E4%B8%AD%E8%BD%AC-api-%E6%8A%A5%E9%94%99%E6%97%A0%E5%8F%AF%E7%94%A8%E6%B8%A0%E9%81%93)。GPT-3.5,GPT-4,DALL-E3 绘图......你都可以随意使用,无需魔法。\\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_dall_jobs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_dall_jobs`; | ||||||
|  | CREATE TABLE `chatgpt_dall_jobs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `prompt` varchar(2000) NOT NULL COMMENT '提示词', | ||||||
|  |   `img_url` varchar(255) NOT NULL COMMENT '图片地址', | ||||||
|  |   `org_url` varchar(400) DEFAULT NULL COMMENT '原图地址', | ||||||
|  |   `publish` tinyint(1) NOT NULL COMMENT '是否发布', | ||||||
|  |   `power` smallint NOT NULL COMMENT '消耗算力', | ||||||
|  |   `progress` smallint NOT NULL COMMENT '任务进度', | ||||||
|  |   `err_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '错误信息', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='DALLE 绘图任务表'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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) DEFAULT NULL COMMENT '函数标签', | ||||||
|  |   `description` varchar(255) DEFAULT NULL COMMENT '函数描述', | ||||||
|  |   `parameters` text COMMENT '函数参数(JSON)', | ||||||
|  |   `required` varchar(255) NOT NULL COMMENT '必填参数(JSON)', | ||||||
|  |   `action` varchar(255) DEFAULT NULL COMMENT '函数处理 API', | ||||||
|  |   `token` varchar(255) DEFAULT NULL COMMENT 'API授权token', | ||||||
|  |   `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`, `required`, `action`, `token`, `enabled`) VALUES | ||||||
|  | (1, 'weibo_hot', '微博热搜', '新浪微博热搜榜,微博当日热搜榜单', '{\"type\":\"object\",\"properties\":{}}', 'null', 'http://localhost:5678/api/function/weibo', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.ehLClXcjo-Ytr5y6pY9mSE3zN_2ViIXAIpTJxI9S1Mo', 0), | ||||||
|  | (2, 'zaobao', '今日早报', '每日早报,获取当天新闻事件列表', '{\"type\":\"object\",\"properties\":{}}', 'null', 'http://localhost:5678/api/function/zaobao', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.ehLClXcjo-Ytr5y6pY9mSE3zN_2ViIXAIpTJxI9S1Mo', 0), | ||||||
|  | (3, 'dalle3', 'DALL-E3 AI 绘图', 'AI 绘画工具,根据输入的绘图描述用 AI 工具进行绘画创作', '{\"type\":\"object\",\"required\":[\"prompt\"],\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"绘画提示词\"}}}', 'null', 'http://localhost:5678/api/function/dalle3', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.ehLClXcjo-Ytr5y6pY9mSE3zN_2ViIXAIpTJxI9S1Mo', 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(11) 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 '邀请码', | ||||||
|  |   `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '备注', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='邀请注册日志'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_menus`; | ||||||
|  | CREATE TABLE `chatgpt_menus` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `name` varchar(30) NOT NULL COMMENT '菜单名称', | ||||||
|  |   `icon` varchar(150) NOT NULL COMMENT '菜单图标', | ||||||
|  |   `url` varchar(100) NOT NULL COMMENT '地址', | ||||||
|  |   `sort_num` smallint NOT NULL COMMENT '排序', | ||||||
|  |   `enabled` tinyint(1) NOT NULL COMMENT '是否启用' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='前端菜单表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_menus` (`id`, `name`, `icon`, `url`, `sort_num`, `enabled`) VALUES | ||||||
|  | (1, '对话聊天', '/images/menu/chat.png', '/chat', 0, 1), | ||||||
|  | (5, 'MJ 绘画', '/images/menu/mj.png', '/mj', 1, 1), | ||||||
|  | (6, 'SD 绘画', '/images/menu/sd.png', '/sd', 2, 1), | ||||||
|  | (7, '算力日志', '/images/menu/log.png', '/powerLog', 7, 1), | ||||||
|  | (8, '应用中心', '/images/menu/app.png', '/apps', 6, 1), | ||||||
|  | (9, '作品展示', '/images/menu/img-wall.png', '/images-wall', 4, 1), | ||||||
|  | (10, '会员计划', '/images/menu/member.png', '/member', 8, 1), | ||||||
|  | (11, '分享计划', '/images/menu/share.png', '/invite', 9, 1), | ||||||
|  | (12, '思维导图', '/images/menu/xmind.png', '/xmind', 5, 1), | ||||||
|  | (13, 'DALLE', '/images/menu/dalle.png', '/dalle', 3, 1), | ||||||
|  | (14, '项目文档', '/images/menu/docs.png', 'https://ai.r9it.com/docs/', 11, 1), | ||||||
|  | (15, 'GeekAI官方论坛', '/images/menu/bbs.png', 'https://bbs.geekai.me/', 12, 1); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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) 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(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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) NOT 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) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci 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_power_logs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_power_logs`; | ||||||
|  | CREATE TABLE `chatgpt_power_logs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `username` varchar(30) NOT NULL COMMENT '用户名', | ||||||
|  |   `type` tinyint(1) NOT NULL COMMENT '类型(1:充值,2:消费,3:退费)', | ||||||
|  |   `amount` smallint NOT NULL COMMENT '算力数值', | ||||||
|  |   `balance` int NOT NULL COMMENT '余额', | ||||||
|  |   `model` varchar(30) NOT NULL COMMENT '模型', | ||||||
|  |   `remark` varchar(255) NOT NULL COMMENT '备注', | ||||||
|  |   `mark` tinyint(1) NOT NULL COMMENT '资金类型(0:支出,1:收入)', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间' | ||||||
|  | ) 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 '延长天数', | ||||||
|  |   `power` 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, | ||||||
|  |   `url` varchar(255) DEFAULT NULL COMMENT '跳转地址' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员套餐表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_products` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_products` (`id`, `name`, `price`, `discount`, `days`, `power`, `enabled`, `sales`, `sort_num`, `created_at`, `updated_at`, `url`) VALUES | ||||||
|  | (1, 'VIP会员1个月', 19.90, 19.80, 30, 0, 1, 3, 0, '2023-08-28 10:48:57', '2024-01-07 12:00:35', NULL), | ||||||
|  | (2, 'VIP会员3个月', 140.00, 30.00, 90, 0, 1, 0, 0, '2023-08-28 10:52:22', '2024-01-07 12:00:40', NULL), | ||||||
|  | (3, 'VIP会员6个月', 290.00, 100.00, 180, 0, 1, 0, 0, '2023-08-28 10:53:39', '2024-01-07 12:00:45', NULL), | ||||||
|  | (4, 'VIP会员12个月', 580.00, 200.00, 365, 0, 1, 0, 0, '2023-08-28 10:54:15', '2024-01-07 12:00:52', NULL), | ||||||
|  | (5, '100次点卡', 10.00, 3.00, 0, 100, 1, 6, 0, '2023-08-28 10:55:08', '2023-11-08 17:32:42', NULL); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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 '密码盐', | ||||||
|  |   `power` 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`, `power`, `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', '极客学长@534641', 'ccc3fb7ab61b8b5d096a4a166ae21d121fc38c71bbd1be6173d9ab973214a63b', 'http://localhost:5678/static/upload/2024/5/1715725189044438.png', 'ueedue5l', 1985, 1769416236, 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\"]', '[1]', 1715960703, 1, '::1', '2023-06-12 16:47:17', '2024-05-19 08:36:35'), | ||||||
|  | (91, '18575670126', '极客学长@623251', '5e4050b8dd403f593260395d9edeb9f273dbe92d15dfdd929c4a182e95da10c4', '/images/avatar/user.png', '6fj0otl8', 10, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[1]', 1697184324, 0, '::1', '2023-10-13 16:01:56', '2024-01-05 21:28:38'), | ||||||
|  | (97, '13888888888', '极客学长@630521', 'c886771ae3fca0464aef3476c5368bb43feb758cc388cfb00f94ba38b1ded0f1', '/images/avatar/user.png', '35umf21c', 1099, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[1]', 1711152776, 0, '::1', '2023-11-25 17:20:10', '2024-03-23 16:20:24'), | ||||||
|  | (98, '13777777777', '极客学长@900743', '03d4e5eefde1cba81b212247cb80aa89920a3f564cc71a266eb906f46b2bf697', '/images/avatar/user.png', 'cgk2aaen', 999, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[1]', 0, 0, '', '2023-11-25 17:21:02', '2024-03-23 16:19:02'), | ||||||
|  | (99, '13999999999', '极客学长@378449', '40ea5cf3425967c426e4b93fae657784b6d23ce63857c9e222404a71266af333', '/images/avatar/user.png', 'uai5sc9e', 10, 0, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"gpt\"]', '[1]', 0, 0, '', '2023-11-25 17:21:30', '2024-01-05 21:28:38'), | ||||||
|  | (104, '1333333333', '极客学长@904857', '094065fd732f4171bb2de8cb116fe577dfd2f5393dd7910fa2ec56e17c9f5f75', '/images/avatar/user.png', '19hakk06', 100, 0, 1, '', '[\"gpt\"]', '[1,12,3]', 0, 0, '', '2024-03-23 16:14:05', '2024-03-23 16:14:05'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   ADD PRIMARY KEY (`id`) USING BTREE, | ||||||
|  |   ADD UNIQUE KEY `username` (`username`) USING BTREE; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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`), | ||||||
|  |   ADD UNIQUE KEY `username` (`username`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `chatgpt_user_login_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_user_login_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 在导出的表使用AUTO_INCREMENT | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=108; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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=17; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_chat_roles` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_chat_roles` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=127; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_configs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_configs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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=5; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_products` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_products` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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=105; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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 */; | ||||||
							
								
								
									
										849
									
								
								database/chatgpt_plus-v4.0.8.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										849
									
								
								database/chatgpt_plus-v4.0.8.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,849 @@ | |||||||
|  | -- phpMyAdmin SQL Dump | ||||||
|  | -- version 5.2.1 | ||||||
|  | -- https://www.phpmyadmin.net/ | ||||||
|  | -- | ||||||
|  | -- 主机: 127.0.0.1 | ||||||
|  | -- 生成日期: 2024-05-29 17:40:11 | ||||||
|  | -- 服务器版本: 8.0.33 | ||||||
|  | -- PHP 版本: 8.1.2-1ubuntu2.17 | ||||||
|  |  | ||||||
|  | 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_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_admin_users`; | ||||||
|  | CREATE TABLE `chatgpt_admin_users` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||||
|  |   `password` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', | ||||||
|  |   `salt` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码盐', | ||||||
|  |   `status` tinyint(1) NOT NULL COMMENT '当前状态', | ||||||
|  |   `last_login_at` int NOT NULL COMMENT '最后登录时间', | ||||||
|  |   `last_login_ip` char(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '最后登录 IP', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间', | ||||||
|  |   `updated_at` datetime NOT NULL COMMENT '更新时间' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统用户' ROW_FORMAT=DYNAMIC; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_admin_users` (`id`, `username`, `password`, `salt`, `status`, `last_login_at`, `last_login_ip`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'admin', '6d17e80c87d209efb84ca4b2e0824f549d09fac8b2e1cc698de5bb5e1d75dfd0', 'mmrql75o', 1, 1715756987, '::1', '2024-03-11 16:30:20', '2024-05-15 15:09:47'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '是否启用', | ||||||
|  |   `proxy_url` varchar(100) 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 '是否启用模型', | ||||||
|  |   `power` tinyint NOT NULL COMMENT '消耗算力点数', | ||||||
|  |   `temperature` float(3,1) NOT NULL DEFAULT '1.0' COMMENT '模型创意度', | ||||||
|  |   `max_tokens` int NOT NULL DEFAULT '1024' COMMENT '最大响应长度', | ||||||
|  |   `max_context` int NOT NULL DEFAULT '4096' COMMENT '最大上下文长度', | ||||||
|  |   `open` tinyint(1) NOT NULL COMMENT '是否开放模型', | ||||||
|  |   `key_id` int NOT NULL COMMENT '绑定API KEY ID', | ||||||
|  |   `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`, `power`, `temperature`, `max_tokens`, `max_context`, `open`, `key_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'OpenAI', 'GPT-3.5', 'gpt-3.5-turbo', 1, 1, 0, 1.0, 1024, 4096, 1, 0, '2023-08-23 12:06:36', '2024-05-29 09:19:06'), | ||||||
|  | (2, 'Azure', 'Azure-3.5', 'gpt-3.5-turbo', 22, 1, 1, 1.0, 1024, 4096, 0, 0, '2023-08-23 12:15:30', '2024-05-29 09:19:06'), | ||||||
|  | (3, 'ChatGLM', 'ChatGML-Pro', 'chatglm_pro', 11, 1, 1, 1.0, 2048, 32768, 1, 0, '2023-08-23 13:35:45', '2024-05-29 09:19:06'), | ||||||
|  | (7, 'Baidu', '文心一言3.0', 'eb-instant', 20, 1, 1, 1.0, 1024, 4096, 1, 0, '2023-10-11 11:29:28', '2024-05-29 09:19:06'), | ||||||
|  | (8, 'XunFei', '星火V3.5', 'generalv3.5', 10, 1, 5, 0.8, 1024, 8192, 1, 0, '2023-10-11 15:48:30', '2024-05-29 09:19:06'), | ||||||
|  | (9, 'XunFei', '星火V2.0', 'generalv2', 19, 1, 1, 1.0, 1024, 8192, 1, 0, '2023-10-11 15:48:45', '2024-05-29 09:19:06'), | ||||||
|  | (10, 'Baidu', '文心一言4.0', 'completions_pro', 21, 1, 3, 1.0, 1024, 8192, 1, 0, '2023-10-25 08:31:37', '2024-05-29 09:19:06'), | ||||||
|  | (11, 'OpenAI', 'GPT-4.0', 'gpt-4-0125-preview', 9, 1, 15, 1.0, 2048, 8192, 1, 0, '2023-10-25 08:45:15', '2024-05-29 09:19:06'), | ||||||
|  | (12, 'XunFei', '星火v3.0', 'generalv3', 18, 1, 3, 1.0, 1024, 8192, 1, 0, '2023-11-23 09:20:33', '2024-05-29 09:19:06'), | ||||||
|  | (15, 'OpenAI', 'GPT-超级模型', 'gpt-4-all', 12, 1, 30, 1.0, 4096, 32768, 0, 0, '2024-01-15 11:32:52', '2024-05-29 09:19:06'), | ||||||
|  | (16, 'OpenAI', '视频号导师', 'gpt-4-gizmo-g-QXXEBTXl7', 13, 1, 30, 1.0, 4096, 32768, 0, 0, '2024-01-15 14:46:35', '2024-05-29 09:19:06'), | ||||||
|  | (17, 'QWen', '通义千问-Turbo', 'qwen-turbo', 15, 1, 1, 1.0, 1024, 8192, 1, 0, '2024-01-19 10:42:24', '2024-05-29 09:19:06'), | ||||||
|  | (18, 'QWen', '通义千问-Plus', 'qwen-plus', 16, 1, 1, 1.0, 1024, 32768, 1, 0, '2024-01-19 10:42:49', '2024-05-29 09:19:06'), | ||||||
|  | (19, 'QWen', '通义千问-Max', 'qwen-max-1201', 17, 1, 1, 1.0, 1024, 32768, 1, 0, '2024-01-19 10:51:03', '2024-05-29 09:19:06'), | ||||||
|  | (21, 'OpenAI', '董宇辉小作文助手', 'gpt-4-gizmo-g-dse9iXvor', 14, 1, 30, 1.0, 8192, 32768, 0, 0, '2024-03-18 14:24:20', '2024-05-29 09:19:06'), | ||||||
|  | (22, 'OpenAI', 'LOGO生成神器', 'gpt-4-gizmo-g-YL87j8C7S', 8, 1, 30, 1.0, 1024, 4096, 1, 44, '2024-03-20 14:02:11', '2024-05-29 09:19:06'), | ||||||
|  | (23, 'OpenAI', '音乐生成器', 'suno-v3', 7, 1, 50, 0.8, 1024, 4096, 1, 44, '2024-03-29 15:43:40', '2024-05-29 09:19:06'), | ||||||
|  | (24, 'OpenAI', '通义千问(中转)', 'qwen-plus', 6, 1, 1, 1.0, 1024, 4096, 1, 0, '2024-04-03 12:00:46', '2024-05-29 09:19:06'), | ||||||
|  | (25, 'OpenAI', 'GPT4-TURBO', 'gpt-4-turbo', 5, 1, 15, 1.0, 2048, 8092, 1, 0, '2024-04-10 08:35:17', '2024-05-29 09:19:06'), | ||||||
|  | (26, 'QWen', '通义千问-Turbo', 'qwen-turbo', 4, 1, 2, 1.0, 1024, 8192, 1, 0, '2024-04-12 14:11:19', '2024-05-29 09:19:06'), | ||||||
|  | (27, 'QWen', '通义千问-Plus', 'qwen-plus', 3, 1, 2, 1.0, 1024, 8192, 1, 0, '2024-04-12 14:11:52', '2024-05-29 09:19:06'), | ||||||
|  | (28, 'OpenAI', 'GPT-3.5(免费)', 'gpt-3.5-turbo', 23, 1, 0, 1.0, 1024, 16384, 1, 53, '2024-04-12 15:16:43', '2024-05-29 09:19:06'), | ||||||
|  | (34, 'OpenAI', 'LLAMA3', 'llama3-8b', 24, 1, 1, 1.0, 1024, 8192, 1, 56, '2024-04-30 15:22:50', '2024-05-29 09:19:06'), | ||||||
|  | (35, 'OpenAI', 'GPT-3.5-16K', 'gpt-3.5-turbo-16k', 2, 1, 1, 1.0, 4096, 16384, 1, 0, '2024-05-10 15:20:27', '2024-05-29 09:19:06'), | ||||||
|  | (36, 'OpenAI', 'GPT-4O', 'gpt-4o', 25, 1, 15, 1.0, 4096, 16384, 1, 57, '2024-05-14 09:25:15', '2024-05-29 09:19:06'), | ||||||
|  | (38, 'OpenAI', 'Gemini-pro', 'gemini-pro-1.5', 26, 1, 10, 1.0, 2048, 8192, 1, 0, '2024-05-27 18:10:35', '2024-05-29 09:19:06'), | ||||||
|  | (39, 'Baidu', 'ERNIE-Speed-8K', 'ernie_speed', 26, 1, 1, 1.0, 1024, 8192, 1, 0, '2024-05-29 15:04:19', '2024-05-29 15:04:19'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '角色排序', | ||||||
|  |   `model_id` int NOT NULL DEFAULT '0' COMMENT '绑定模型ID', | ||||||
|  |   `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`, `model_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, '通用AI助手', 'gpt', '', '您好,我是您的AI智能助手,我会尽力回答您的问题或提供有用的建议。', '/images/avatar/gpt.png', 1, 0, 0, '2023-05-30 07:02:06', '2024-03-15 09:15:42'), | ||||||
|  | (24, '程序员', 'programmer', '[{\"role\":\"user\",\"content\":\"现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。\"},{\"role\":\"assistant\",\"content\":\"好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。\"}]', 'Talk is cheap, i will show code!', '/images/avatar/programmer.jpg', 1, 3, 0, '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, 0, '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, 0, '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, 1, '2023-05-30 14:10:24', '2024-04-12 11:54:53'), | ||||||
|  | (28, '鲁迅', 'lu_xun', '[{\"role\":\"user\",\"content\":\"现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。\"},{\"role\":\"assistant\",\"content\":\"好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。\"}]', '自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。', '/images/avatar/lu_xun.jpg', 1, 5, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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', '{\"title\":\"Geek-AI 创作系统\",\"admin_title\":\"Geek-AI 控制台\",\"logo\":\"http://localhost:5678/static/upload/2024/4/1714382860986912.png\",\"init_power\":100,\"daily_power\":99,\"invite_power\":10,\"vip_month_power\":1000,\"register_ways\":[\"mobile\",\"username\",\"email\"],\"enabled_register\":true,\"reward_img\":\"http://localhost:5678/static/upload/2024/3/1710753716309668.jpg\",\"enabled_reward\":true,\"power_price\":0.1,\"order_pay_timeout\":30,\"vip_info_text\":\"月度会员,年度会员每月赠送 1000 点算力,赠送算力当月有效当月没有消费完的算力不结余到下个月。 点卡充值的算力长期有效。\",\"default_models\":[11,7,1,10,12,19,18,17,3],\"mj_power\":30,\"mj_action_power\":10,\"sd_power\":10,\"dall_power\":15,\"wechat_card_url\":\"/images/wx.png\",\"enable_context\":true,\"context_deep\":4,\"sd_neg_prompt\":\"nsfw, paintings,low quality,easynegative,ng_deepnegative ,lowres,bad anatomy,bad hands,bad feet\",\"rand_bg\":true}'), | ||||||
|  | (3, 'notice', '{\"sd_neg_prompt\":\"\",\"rand_bg\":false,\"content\":\"## v4.0.8 更新日志\\n\\n* 功能优化:升级 mathjax 公式解析插件,修复公式因为图片访问限制而无法显示的问题\\n* 功能优化:当数据库更新失败的时候记录错误日志\\n* 功能优化:聊天输入框会随着输入内容的增多自动调整高度\\n* Bug修复:修复移动端聊天页面模型切换不生效的Bug\\n* 功能优化:给PC端扫码支付增加签名验证和有效期验证\\n* Bug修复:修复支付码生成API权限控制的问题\\n* Bug修复:模型算力设置为0时,不扣减用户算力,并且不记录算力消费日志\\n* 功能优化:新增随机背景配置项,可以在后台设置,首页使用 Bing 壁纸作为背景图片\\n* 功能新增:H5端支持 Dalle 绘图\\n\\n注意:当前站点仅为开源项目 \\u003ca style=\\\"color: #F56C6C\\\" href=\\\"https://github.com/yangjian102621/chatgpt-plus\\\" target=\\\"_blank\\\"\\u003eChatPlus\\u003c/a\\u003e 的演示项目,本项目单纯就是给大家体验项目功能使用。\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n 如果觉得好用你就花几分钟自己部署一套,没有API KEY 的同学可以去下面几个推荐的中转站购买:\\n1、\\u003ca href=\\\"https://api.chat-plus.net\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.chat-plus.net\\u003c/a\\u003e\\n2、\\u003ca href=\\\"https://api.geekai.me\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.geekai.me\\u003c/a\\u003e\\n3、 \\u003ca href=\\\"https://gpt.bemore.lol\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://gpt.bemore.lol\\u003c/a\\u003e\\n支持MidJourney,GPT,Claude,Google Gemmi,以及国内各个厂家的大模型,现在有超级优惠,价格远低于 OpenAI 官方。关于中转 API 的优势和劣势请参考 [中转API技术原理](https://ai.r9it.com/docs/install/errors-handle.html#%E8%B0%83%E7%94%A8%E4%B8%AD%E8%BD%AC-api-%E6%8A%A5%E9%94%99%E6%97%A0%E5%8F%AF%E7%94%A8%E6%B8%A0%E9%81%93)。GPT-3.5,GPT-4,DALL-E3 绘图......你都可以随意使用,无需魔法。\\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_dall_jobs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_dall_jobs`; | ||||||
|  | CREATE TABLE `chatgpt_dall_jobs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `prompt` varchar(2000) NOT NULL COMMENT '提示词', | ||||||
|  |   `img_url` varchar(255) NOT NULL COMMENT '图片地址', | ||||||
|  |   `org_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '原图地址', | ||||||
|  |   `publish` tinyint(1) NOT NULL COMMENT '是否发布', | ||||||
|  |   `power` smallint NOT NULL COMMENT '消耗算力', | ||||||
|  |   `progress` smallint NOT NULL COMMENT '任务进度', | ||||||
|  |   `err_msg` varchar(255) NOT NULL COMMENT '错误信息', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='DALLE 绘图任务表'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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_eWuBgw', 'http://localhost:5678/api/function/weibo', 0), | ||||||
|  | (2, 'zaobao', '今日早报', '每日早报,获取当天新闻事件列表', '{\"type\":\"object\",\"properties\":{}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBgw', 'http://localhost:5678/api/function/zaobao', 0), | ||||||
|  | (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', 0); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '邀请码', | ||||||
|  |   `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '备注', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='邀请注册日志'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_menus`; | ||||||
|  | CREATE TABLE `chatgpt_menus` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `name` varchar(30) NOT NULL COMMENT '菜单名称', | ||||||
|  |   `icon` varchar(150) NOT NULL COMMENT '菜单图标', | ||||||
|  |   `url` varchar(100) NOT NULL COMMENT '地址', | ||||||
|  |   `sort_num` smallint NOT NULL COMMENT '排序', | ||||||
|  |   `enabled` tinyint(1) NOT NULL COMMENT '是否启用' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='前端菜单表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_menus` (`id`, `name`, `icon`, `url`, `sort_num`, `enabled`) VALUES | ||||||
|  | (1, '对话聊天', '/images/menu/chat.png', '/chat', 1, 1), | ||||||
|  | (5, 'MJ 绘画', '/images/menu/mj.png', '/mj', 2, 1), | ||||||
|  | (6, 'SD 绘画', '/images/menu/sd.png', '/sd', 3, 1), | ||||||
|  | (7, '算力日志', '/images/menu/log.png', '/powerLog', 8, 1), | ||||||
|  | (8, '应用中心', '/images/menu/app.png', '/apps', 7, 1), | ||||||
|  | (9, '画廊', '/images/menu/img-wall.png', '/images-wall', 5, 1), | ||||||
|  | (10, '会员计划', '/images/menu/member.png', '/member', 9, 1), | ||||||
|  | (11, '分享计划', '/images/menu/share.png', '/invite', 10, 1), | ||||||
|  | (12, '思维导图', '/images/menu/xmind.png', '/xmind', 6, 1), | ||||||
|  | (13, 'DALLE', '/images/menu/dalle.png', '/dalle', 4, 1), | ||||||
|  | (14, '项目文档', '/images/menu/docs.png', 'https://ai.r9it.com/docs/', 11, 1), | ||||||
|  | (16, '极客论坛', '/images/menu/bbs.png', 'https://bbs.geekai.me/', 13, 1); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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_power_logs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_power_logs`; | ||||||
|  | CREATE TABLE `chatgpt_power_logs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `username` varchar(30) NOT NULL COMMENT '用户名', | ||||||
|  |   `type` tinyint(1) NOT NULL COMMENT '类型(1:充值,2:消费,3:退费)', | ||||||
|  |   `amount` smallint NOT NULL COMMENT '算力数值', | ||||||
|  |   `balance` int NOT NULL COMMENT '余额', | ||||||
|  |   `model` varchar(30) NOT NULL COMMENT '模型', | ||||||
|  |   `remark` varchar(255) NOT NULL COMMENT '备注', | ||||||
|  |   `mark` tinyint(1) NOT NULL COMMENT '资金类型(0:支出,1:收入)', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间' | ||||||
|  | ) 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 '延长天数', | ||||||
|  |   `power` 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, | ||||||
|  |   `app_url` varchar(255) DEFAULT NULL COMMENT 'App跳转地址', | ||||||
|  |   `url` varchar(255) DEFAULT NULL COMMENT '跳转地址' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员套餐表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_products` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_products` (`id`, `name`, `price`, `discount`, `days`, `power`, `enabled`, `sales`, `sort_num`, `created_at`, `updated_at`, `app_url`, `url`) VALUES | ||||||
|  | (1, '会员1个月', 1999.90, 1999.00, 30, 0, 1, 0, 0, '2023-08-28 10:48:57', '2024-04-26 16:09:06', NULL, NULL), | ||||||
|  | (2, '会员3个月', 3940.00, 30.00, 90, 0, 1, 0, 0, '2023-08-28 10:52:22', '2024-03-22 17:56:10', NULL, NULL), | ||||||
|  | (3, '会员6个月', 5990.00, 100.00, 180, 0, 1, 0, 0, '2023-08-28 10:53:39', '2024-03-22 17:56:15', NULL, NULL), | ||||||
|  | (4, '会员12个月', 9980.00, 200.00, 365, 0, 1, 0, 0, '2023-08-28 10:54:15', '2024-03-22 17:56:23', NULL, NULL), | ||||||
|  | (5, '100次点卡', 1999.00, 3.00, 0, 100, 1, 0, 0, '2023-08-28 10:55:08', '2024-03-22 17:56:37', NULL, NULL), | ||||||
|  | (6, '200次点卡', 2999.00, 10.00, 0, 200, 1, 0, 0, '1970-01-01 08:00:00', '2024-03-22 17:56:41', NULL, NULL); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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 '密码盐', | ||||||
|  |   `power` 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`, `power`, `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://localhost:5678/static/upload/2024/5/1715651569509929.png', 'ueedue5l', 4887, 1717292086, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"red_book\",\"gpt\",\"seller\",\"artist\",\"lu_xun\",\"girl_friend\",\"psychiatrist\",\"teacher\",\"programmer\",\"test\",\"qing_gan_da_shi\"]', '[1,11]', 1716964389, 1, '::1', '2023-06-12 16:47:17', '2024-05-29 14:33:09'), | ||||||
|  | (5, 'yangjian102621@gmail.com', '极客学长@486041', '75d1a22f33e1ffffb7943946b6b8d5177d5ecd685d3cef1b468654038b0a8c22', '/images/avatar/user.png', '2q8ugxzk', 100, 0, 1, '', '[\"gpt\",\"programmer\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-23 09:17:26', '2024-04-23 09:17:26'), | ||||||
|  | (8, 'yangjian102623@gmail.com', '极客学长@714931', 'f8f0e0abf146569217273ea0712a0f9b6cbbe7d943a1d9bd5f91c55e6d8c05d1', '/images/avatar/user.png', 'geuddq7f', 100, 0, 1, '', '[\"gpt\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-26 15:19:28', '2024-04-26 15:19:28'), | ||||||
|  | (9, '1234567', '极客学长@604526', '858e2afec79e1d6364f4567f945f2310024896d9aa45dd944efa95a0c31e4d08', '/images/avatar/user.png', '00qawlos', 100, 0, 1, '', '[\"gpt\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-26 15:21:06', '2024-04-26 15:21:06'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   ADD PRIMARY KEY (`id`) USING BTREE, | ||||||
|  |   ADD UNIQUE KEY `username` (`username`) USING BTREE; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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`), | ||||||
|  |   ADD UNIQUE KEY `username` (`username`), | ||||||
|  |   ADD UNIQUE KEY `username_2` (`username`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `chatgpt_user_login_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_user_login_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 在导出的表使用AUTO_INCREMENT | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=113; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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=40; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_chat_roles` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_chat_roles` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=132; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_configs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_configs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=19; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   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=10; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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 */; | ||||||
							
								
								
									
										3
									
								
								database/update-v4.0.7.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								database/update-v4.0.7.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | ALTER TABLE `chatgpt_mj_jobs` CHANGE `err_msg` `err_msg` VARCHAR(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '错误信息'; | ||||||
|  | ALTER TABLE `chatgpt_sd_jobs` CHANGE `err_msg` `err_msg` VARCHAR(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '错误信息'; | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` CHANGE `err_msg` `err_msg` VARCHAR(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '错误信息'; | ||||||
							
								
								
									
										1
									
								
								database/update-v4.0.8.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								database/update-v4.0.8.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | ALTER TABLE `chatgpt_dall_jobs` CHANGE `org_url` `org_url` VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '原图地址'; | ||||||
							
								
								
									
										3
									
								
								deploy/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								deploy/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,5 @@ | |||||||
| data/mysql/data | data/mysql/data | ||||||
|  | data/leveldb | ||||||
| logs | logs | ||||||
| static/* | static/* | ||||||
| redis/redis | redis/redis | ||||||
|   | |||||||
| @@ -15,8 +15,8 @@ server { | |||||||
| #     ssl_prefer_server_ciphers on; | #     ssl_prefer_server_ciphers on; | ||||||
|  |  | ||||||
|     # 日志地址 |     # 日志地址 | ||||||
|     access_log  /var/log/access.log; |     access_log  /var/log/nginx/access.log; | ||||||
|     error_log /var/log/error.log; |     error_log /var/log/nginx/error.log; | ||||||
|  |  | ||||||
|     index index.html; |     index index.html; | ||||||
|     root /var/www/app/dist; # 这里改成前端静态页面的地址 |     root /var/www/app/dist; # 这里改成前端静态页面的地址 | ||||||
|   | |||||||
							
								
								
									
										849
									
								
								deploy/data/mysql/init.d/chatgpt_plus-v4.0.8.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										849
									
								
								deploy/data/mysql/init.d/chatgpt_plus-v4.0.8.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,849 @@ | |||||||
|  | -- phpMyAdmin SQL Dump | ||||||
|  | -- version 5.2.1 | ||||||
|  | -- https://www.phpmyadmin.net/ | ||||||
|  | -- | ||||||
|  | -- 主机: 127.0.0.1 | ||||||
|  | -- 生成日期: 2024-05-29 17:40:11 | ||||||
|  | -- 服务器版本: 8.0.33 | ||||||
|  | -- PHP 版本: 8.1.2-1ubuntu2.17 | ||||||
|  |  | ||||||
|  | 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_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_admin_users`; | ||||||
|  | CREATE TABLE `chatgpt_admin_users` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', | ||||||
|  |   `password` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', | ||||||
|  |   `salt` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码盐', | ||||||
|  |   `status` tinyint(1) NOT NULL COMMENT '当前状态', | ||||||
|  |   `last_login_at` int NOT NULL COMMENT '最后登录时间', | ||||||
|  |   `last_login_ip` char(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '最后登录 IP', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间', | ||||||
|  |   `updated_at` datetime NOT NULL COMMENT '更新时间' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统用户' ROW_FORMAT=DYNAMIC; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_admin_users` (`id`, `username`, `password`, `salt`, `status`, `last_login_at`, `last_login_ip`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'admin', '6d17e80c87d209efb84ca4b2e0824f549d09fac8b2e1cc698de5bb5e1d75dfd0', 'mmrql75o', 1, 1715756987, '::1', '2024-03-11 16:30:20', '2024-05-15 15:09:47'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '是否启用', | ||||||
|  |   `proxy_url` varchar(100) 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 '是否启用模型', | ||||||
|  |   `power` tinyint NOT NULL COMMENT '消耗算力点数', | ||||||
|  |   `temperature` float(3,1) NOT NULL DEFAULT '1.0' COMMENT '模型创意度', | ||||||
|  |   `max_tokens` int NOT NULL DEFAULT '1024' COMMENT '最大响应长度', | ||||||
|  |   `max_context` int NOT NULL DEFAULT '4096' COMMENT '最大上下文长度', | ||||||
|  |   `open` tinyint(1) NOT NULL COMMENT '是否开放模型', | ||||||
|  |   `key_id` int NOT NULL COMMENT '绑定API KEY ID', | ||||||
|  |   `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`, `power`, `temperature`, `max_tokens`, `max_context`, `open`, `key_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, 'OpenAI', 'GPT-3.5', 'gpt-3.5-turbo', 1, 1, 0, 1.0, 1024, 4096, 1, 0, '2023-08-23 12:06:36', '2024-05-29 09:19:06'), | ||||||
|  | (2, 'Azure', 'Azure-3.5', 'gpt-3.5-turbo', 22, 1, 1, 1.0, 1024, 4096, 0, 0, '2023-08-23 12:15:30', '2024-05-29 09:19:06'), | ||||||
|  | (3, 'ChatGLM', 'ChatGML-Pro', 'chatglm_pro', 11, 1, 1, 1.0, 2048, 32768, 1, 0, '2023-08-23 13:35:45', '2024-05-29 09:19:06'), | ||||||
|  | (7, 'Baidu', '文心一言3.0', 'eb-instant', 20, 1, 1, 1.0, 1024, 4096, 1, 0, '2023-10-11 11:29:28', '2024-05-29 09:19:06'), | ||||||
|  | (8, 'XunFei', '星火V3.5', 'generalv3.5', 10, 1, 5, 0.8, 1024, 8192, 1, 0, '2023-10-11 15:48:30', '2024-05-29 09:19:06'), | ||||||
|  | (9, 'XunFei', '星火V2.0', 'generalv2', 19, 1, 1, 1.0, 1024, 8192, 1, 0, '2023-10-11 15:48:45', '2024-05-29 09:19:06'), | ||||||
|  | (10, 'Baidu', '文心一言4.0', 'completions_pro', 21, 1, 3, 1.0, 1024, 8192, 1, 0, '2023-10-25 08:31:37', '2024-05-29 09:19:06'), | ||||||
|  | (11, 'OpenAI', 'GPT-4.0', 'gpt-4-0125-preview', 9, 1, 15, 1.0, 2048, 8192, 1, 0, '2023-10-25 08:45:15', '2024-05-29 09:19:06'), | ||||||
|  | (12, 'XunFei', '星火v3.0', 'generalv3', 18, 1, 3, 1.0, 1024, 8192, 1, 0, '2023-11-23 09:20:33', '2024-05-29 09:19:06'), | ||||||
|  | (15, 'OpenAI', 'GPT-超级模型', 'gpt-4-all', 12, 1, 30, 1.0, 4096, 32768, 0, 0, '2024-01-15 11:32:52', '2024-05-29 09:19:06'), | ||||||
|  | (16, 'OpenAI', '视频号导师', 'gpt-4-gizmo-g-QXXEBTXl7', 13, 1, 30, 1.0, 4096, 32768, 0, 0, '2024-01-15 14:46:35', '2024-05-29 09:19:06'), | ||||||
|  | (17, 'QWen', '通义千问-Turbo', 'qwen-turbo', 15, 1, 1, 1.0, 1024, 8192, 1, 0, '2024-01-19 10:42:24', '2024-05-29 09:19:06'), | ||||||
|  | (18, 'QWen', '通义千问-Plus', 'qwen-plus', 16, 1, 1, 1.0, 1024, 32768, 1, 0, '2024-01-19 10:42:49', '2024-05-29 09:19:06'), | ||||||
|  | (19, 'QWen', '通义千问-Max', 'qwen-max-1201', 17, 1, 1, 1.0, 1024, 32768, 1, 0, '2024-01-19 10:51:03', '2024-05-29 09:19:06'), | ||||||
|  | (21, 'OpenAI', '董宇辉小作文助手', 'gpt-4-gizmo-g-dse9iXvor', 14, 1, 30, 1.0, 8192, 32768, 0, 0, '2024-03-18 14:24:20', '2024-05-29 09:19:06'), | ||||||
|  | (22, 'OpenAI', 'LOGO生成神器', 'gpt-4-gizmo-g-YL87j8C7S', 8, 1, 30, 1.0, 1024, 4096, 1, 44, '2024-03-20 14:02:11', '2024-05-29 09:19:06'), | ||||||
|  | (23, 'OpenAI', '音乐生成器', 'suno-v3', 7, 1, 50, 0.8, 1024, 4096, 1, 44, '2024-03-29 15:43:40', '2024-05-29 09:19:06'), | ||||||
|  | (24, 'OpenAI', '通义千问(中转)', 'qwen-plus', 6, 1, 1, 1.0, 1024, 4096, 1, 0, '2024-04-03 12:00:46', '2024-05-29 09:19:06'), | ||||||
|  | (25, 'OpenAI', 'GPT4-TURBO', 'gpt-4-turbo', 5, 1, 15, 1.0, 2048, 8092, 1, 0, '2024-04-10 08:35:17', '2024-05-29 09:19:06'), | ||||||
|  | (26, 'QWen', '通义千问-Turbo', 'qwen-turbo', 4, 1, 2, 1.0, 1024, 8192, 1, 0, '2024-04-12 14:11:19', '2024-05-29 09:19:06'), | ||||||
|  | (27, 'QWen', '通义千问-Plus', 'qwen-plus', 3, 1, 2, 1.0, 1024, 8192, 1, 0, '2024-04-12 14:11:52', '2024-05-29 09:19:06'), | ||||||
|  | (28, 'OpenAI', 'GPT-3.5(免费)', 'gpt-3.5-turbo', 23, 1, 0, 1.0, 1024, 16384, 1, 53, '2024-04-12 15:16:43', '2024-05-29 09:19:06'), | ||||||
|  | (34, 'OpenAI', 'LLAMA3', 'llama3-8b', 24, 1, 1, 1.0, 1024, 8192, 1, 56, '2024-04-30 15:22:50', '2024-05-29 09:19:06'), | ||||||
|  | (35, 'OpenAI', 'GPT-3.5-16K', 'gpt-3.5-turbo-16k', 2, 1, 1, 1.0, 4096, 16384, 1, 0, '2024-05-10 15:20:27', '2024-05-29 09:19:06'), | ||||||
|  | (36, 'OpenAI', 'GPT-4O', 'gpt-4o', 25, 1, 15, 1.0, 4096, 16384, 1, 57, '2024-05-14 09:25:15', '2024-05-29 09:19:06'), | ||||||
|  | (38, 'OpenAI', 'Gemini-pro', 'gemini-pro-1.5', 26, 1, 10, 1.0, 2048, 8192, 1, 0, '2024-05-27 18:10:35', '2024-05-29 09:19:06'), | ||||||
|  | (39, 'Baidu', 'ERNIE-Speed-8K', 'ernie_speed', 26, 1, 1, 1.0, 1024, 8192, 1, 0, '2024-05-29 15:04:19', '2024-05-29 15:04:19'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '角色排序', | ||||||
|  |   `model_id` int NOT NULL DEFAULT '0' COMMENT '绑定模型ID', | ||||||
|  |   `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`, `model_id`, `created_at`, `updated_at`) VALUES | ||||||
|  | (1, '通用AI助手', 'gpt', '', '您好,我是您的AI智能助手,我会尽力回答您的问题或提供有用的建议。', '/images/avatar/gpt.png', 1, 0, 0, '2023-05-30 07:02:06', '2024-03-15 09:15:42'), | ||||||
|  | (24, '程序员', 'programmer', '[{\"role\":\"user\",\"content\":\"现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。\"},{\"role\":\"assistant\",\"content\":\"好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。\"}]', 'Talk is cheap, i will show code!', '/images/avatar/programmer.jpg', 1, 3, 0, '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, 0, '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, 0, '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, 1, '2023-05-30 14:10:24', '2024-04-12 11:54:53'), | ||||||
|  | (28, '鲁迅', 'lu_xun', '[{\"role\":\"user\",\"content\":\"现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。\"},{\"role\":\"assistant\",\"content\":\"好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。\"}]', '自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。', '/images/avatar/lu_xun.jpg', 1, 5, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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, 0, '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', '{\"title\":\"Geek-AI 创作系统\",\"admin_title\":\"Geek-AI 控制台\",\"logo\":\"http://localhost:5678/static/upload/2024/4/1714382860986912.png\",\"init_power\":100,\"daily_power\":99,\"invite_power\":10,\"vip_month_power\":1000,\"register_ways\":[\"mobile\",\"username\",\"email\"],\"enabled_register\":true,\"reward_img\":\"http://localhost:5678/static/upload/2024/3/1710753716309668.jpg\",\"enabled_reward\":true,\"power_price\":0.1,\"order_pay_timeout\":30,\"vip_info_text\":\"月度会员,年度会员每月赠送 1000 点算力,赠送算力当月有效当月没有消费完的算力不结余到下个月。 点卡充值的算力长期有效。\",\"default_models\":[11,7,1,10,12,19,18,17,3],\"mj_power\":30,\"mj_action_power\":10,\"sd_power\":10,\"dall_power\":15,\"wechat_card_url\":\"/images/wx.png\",\"enable_context\":true,\"context_deep\":4,\"sd_neg_prompt\":\"nsfw, paintings,low quality,easynegative,ng_deepnegative ,lowres,bad anatomy,bad hands,bad feet\",\"rand_bg\":true}'), | ||||||
|  | (3, 'notice', '{\"sd_neg_prompt\":\"\",\"rand_bg\":false,\"content\":\"## v4.0.8 更新日志\\n\\n* 功能优化:升级 mathjax 公式解析插件,修复公式因为图片访问限制而无法显示的问题\\n* 功能优化:当数据库更新失败的时候记录错误日志\\n* 功能优化:聊天输入框会随着输入内容的增多自动调整高度\\n* Bug修复:修复移动端聊天页面模型切换不生效的Bug\\n* 功能优化:给PC端扫码支付增加签名验证和有效期验证\\n* Bug修复:修复支付码生成API权限控制的问题\\n* Bug修复:模型算力设置为0时,不扣减用户算力,并且不记录算力消费日志\\n* 功能优化:新增随机背景配置项,可以在后台设置,首页使用 Bing 壁纸作为背景图片\\n* 功能新增:H5端支持 Dalle 绘图\\n\\n注意:当前站点仅为开源项目 \\u003ca style=\\\"color: #F56C6C\\\" href=\\\"https://github.com/yangjian102621/chatgpt-plus\\\" target=\\\"_blank\\\"\\u003eChatPlus\\u003c/a\\u003e 的演示项目,本项目单纯就是给大家体验项目功能使用。\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n\\u003cstrong style=\\\"color: #F56C6C\\\"\\u003e体验额度用完之后请不要在当前站点进行任何充值操作!!!\\u003c/strong\\u003e\\n 如果觉得好用你就花几分钟自己部署一套,没有API KEY 的同学可以去下面几个推荐的中转站购买:\\n1、\\u003ca href=\\\"https://api.chat-plus.net\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.chat-plus.net\\u003c/a\\u003e\\n2、\\u003ca href=\\\"https://api.geekai.me\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.geekai.me\\u003c/a\\u003e\\n3、 \\u003ca href=\\\"https://gpt.bemore.lol\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://gpt.bemore.lol\\u003c/a\\u003e\\n支持MidJourney,GPT,Claude,Google Gemmi,以及国内各个厂家的大模型,现在有超级优惠,价格远低于 OpenAI 官方。关于中转 API 的优势和劣势请参考 [中转API技术原理](https://ai.r9it.com/docs/install/errors-handle.html#%E8%B0%83%E7%94%A8%E4%B8%AD%E8%BD%AC-api-%E6%8A%A5%E9%94%99%E6%97%A0%E5%8F%AF%E7%94%A8%E6%B8%A0%E9%81%93)。GPT-3.5,GPT-4,DALL-E3 绘图......你都可以随意使用,无需魔法。\\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_dall_jobs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_dall_jobs`; | ||||||
|  | CREATE TABLE `chatgpt_dall_jobs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `prompt` varchar(2000) NOT NULL COMMENT '提示词', | ||||||
|  |   `img_url` varchar(255) NOT NULL COMMENT '图片地址', | ||||||
|  |   `org_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '原图地址', | ||||||
|  |   `publish` tinyint(1) NOT NULL COMMENT '是否发布', | ||||||
|  |   `power` smallint NOT NULL COMMENT '消耗算力', | ||||||
|  |   `progress` smallint NOT NULL COMMENT '任务进度', | ||||||
|  |   `err_msg` varchar(255) NOT NULL COMMENT '错误信息', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='DALLE 绘图任务表'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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_eWuBgw', 'http://localhost:5678/api/function/weibo', 0), | ||||||
|  | (2, 'zaobao', '今日早报', '每日早报,获取当天新闻事件列表', '{\"type\":\"object\",\"properties\":{}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBgw', 'http://localhost:5678/api/function/zaobao', 0), | ||||||
|  | (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', 0); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '邀请码', | ||||||
|  |   `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '备注', | ||||||
|  |   `created_at` datetime NOT NULL | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='邀请注册日志'; | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_menus`; | ||||||
|  | CREATE TABLE `chatgpt_menus` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `name` varchar(30) NOT NULL COMMENT '菜单名称', | ||||||
|  |   `icon` varchar(150) NOT NULL COMMENT '菜单图标', | ||||||
|  |   `url` varchar(100) NOT NULL COMMENT '地址', | ||||||
|  |   `sort_num` smallint NOT NULL COMMENT '排序', | ||||||
|  |   `enabled` tinyint(1) NOT NULL COMMENT '是否启用' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='前端菜单表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_menus` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_menus` (`id`, `name`, `icon`, `url`, `sort_num`, `enabled`) VALUES | ||||||
|  | (1, '对话聊天', '/images/menu/chat.png', '/chat', 1, 1), | ||||||
|  | (5, 'MJ 绘画', '/images/menu/mj.png', '/mj', 2, 1), | ||||||
|  | (6, 'SD 绘画', '/images/menu/sd.png', '/sd', 3, 1), | ||||||
|  | (7, '算力日志', '/images/menu/log.png', '/powerLog', 8, 1), | ||||||
|  | (8, '应用中心', '/images/menu/app.png', '/apps', 7, 1), | ||||||
|  | (9, '画廊', '/images/menu/img-wall.png', '/images-wall', 5, 1), | ||||||
|  | (10, '会员计划', '/images/menu/member.png', '/member', 9, 1), | ||||||
|  | (11, '分享计划', '/images/menu/share.png', '/invite', 10, 1), | ||||||
|  | (12, '思维导图', '/images/menu/xmind.png', '/xmind', 6, 1), | ||||||
|  | (13, 'DALLE', '/images/menu/dalle.png', '/dalle', 4, 1), | ||||||
|  | (14, '项目文档', '/images/menu/docs.png', 'https://ai.r9it.com/docs/', 11, 1), | ||||||
|  | (16, '极客论坛', '/images/menu/bbs.png', 'https://bbs.geekai.me/', 13, 1); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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_power_logs` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS `chatgpt_power_logs`; | ||||||
|  | CREATE TABLE `chatgpt_power_logs` ( | ||||||
|  |   `id` int NOT NULL, | ||||||
|  |   `user_id` int NOT NULL COMMENT '用户ID', | ||||||
|  |   `username` varchar(30) NOT NULL COMMENT '用户名', | ||||||
|  |   `type` tinyint(1) NOT NULL COMMENT '类型(1:充值,2:消费,3:退费)', | ||||||
|  |   `amount` smallint NOT NULL COMMENT '算力数值', | ||||||
|  |   `balance` int NOT NULL COMMENT '余额', | ||||||
|  |   `model` varchar(30) NOT NULL COMMENT '模型', | ||||||
|  |   `remark` varchar(255) NOT NULL COMMENT '备注', | ||||||
|  |   `mark` tinyint(1) NOT NULL COMMENT '资金类型(0:支出,1:收入)', | ||||||
|  |   `created_at` datetime NOT NULL COMMENT '创建时间' | ||||||
|  | ) 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 '延长天数', | ||||||
|  |   `power` 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, | ||||||
|  |   `app_url` varchar(255) DEFAULT NULL COMMENT 'App跳转地址', | ||||||
|  |   `url` varchar(255) DEFAULT NULL COMMENT '跳转地址' | ||||||
|  | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员套餐表'; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 转存表中的数据 `chatgpt_products` | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | INSERT INTO `chatgpt_products` (`id`, `name`, `price`, `discount`, `days`, `power`, `enabled`, `sales`, `sort_num`, `created_at`, `updated_at`, `app_url`, `url`) VALUES | ||||||
|  | (1, '会员1个月', 1999.90, 1999.00, 30, 0, 1, 0, 0, '2023-08-28 10:48:57', '2024-04-26 16:09:06', NULL, NULL), | ||||||
|  | (2, '会员3个月', 3940.00, 30.00, 90, 0, 1, 0, 0, '2023-08-28 10:52:22', '2024-03-22 17:56:10', NULL, NULL), | ||||||
|  | (3, '会员6个月', 5990.00, 100.00, 180, 0, 1, 0, 0, '2023-08-28 10:53:39', '2024-03-22 17:56:15', NULL, NULL), | ||||||
|  | (4, '会员12个月', 9980.00, 200.00, 365, 0, 1, 0, 0, '2023-08-28 10:54:15', '2024-03-22 17:56:23', NULL, NULL), | ||||||
|  | (5, '100次点卡', 1999.00, 3.00, 0, 100, 1, 0, 0, '2023-08-28 10:55:08', '2024-03-22 17:56:37', NULL, NULL), | ||||||
|  | (6, '200次点卡', 2999.00, 10.00, 0, 200, 1, 0, 0, '1970-01-01 08:00:00', '2024-03-22 17:56:41', NULL, NULL); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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 '错误信息', | ||||||
|  |   `power` smallint NOT NULL DEFAULT '0' 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 '密码盐', | ||||||
|  |   `power` 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`, `power`, `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://localhost:5678/static/upload/2024/5/1715651569509929.png', 'ueedue5l', 4887, 1717292086, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"red_book\",\"gpt\",\"seller\",\"artist\",\"lu_xun\",\"girl_friend\",\"psychiatrist\",\"teacher\",\"programmer\",\"test\",\"qing_gan_da_shi\"]', '[1,11]', 1716964389, 1, '::1', '2023-06-12 16:47:17', '2024-05-29 14:33:09'), | ||||||
|  | (5, 'yangjian102621@gmail.com', '极客学长@486041', '75d1a22f33e1ffffb7943946b6b8d5177d5ecd685d3cef1b468654038b0a8c22', '/images/avatar/user.png', '2q8ugxzk', 100, 0, 1, '', '[\"gpt\",\"programmer\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-23 09:17:26', '2024-04-23 09:17:26'), | ||||||
|  | (8, 'yangjian102623@gmail.com', '极客学长@714931', 'f8f0e0abf146569217273ea0712a0f9b6cbbe7d943a1d9bd5f91c55e6d8c05d1', '/images/avatar/user.png', 'geuddq7f', 100, 0, 1, '', '[\"gpt\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-26 15:19:28', '2024-04-26 15:19:28'), | ||||||
|  | (9, '1234567', '极客学长@604526', '858e2afec79e1d6364f4567f945f2310024896d9aa45dd944efa95a0c31e4d08', '/images/avatar/user.png', '00qawlos', 100, 0, 1, '', '[\"gpt\"]', '[11,7,1,10,12,19,18,17,3]', 0, 0, '', '2024-04-26 15:21:06', '2024-04-26 15:21:06'); | ||||||
|  |  | ||||||
|  | -- -------------------------------------------------------- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的结构 `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_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   ADD PRIMARY KEY (`id`) USING BTREE, | ||||||
|  |   ADD UNIQUE KEY `username` (`username`) USING BTREE; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `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`), | ||||||
|  |   ADD UNIQUE KEY `username` (`username`), | ||||||
|  |   ADD UNIQUE KEY `username_2` (`username`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 表的索引 `chatgpt_user_login_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_user_login_logs` | ||||||
|  |   ADD PRIMARY KEY (`id`); | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 在导出的表使用AUTO_INCREMENT | ||||||
|  | -- | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_admin_users` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_admin_users` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=113; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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=40; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_chat_roles` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_chat_roles` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=132; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_configs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_configs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表AUTO_INCREMENT `chatgpt_dall_jobs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_dall_jobs` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_menus` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_menus` | ||||||
|  |   MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=19; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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_power_logs` | ||||||
|  | -- | ||||||
|  | ALTER TABLE `chatgpt_power_logs` | ||||||
|  |   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=10; | ||||||
|  |  | ||||||
|  | -- | ||||||
|  | -- 使用表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 */; | ||||||
| @@ -1,790 +0,0 @@ | |||||||
| -- phpMyAdmin SQL Dump |  | ||||||
| -- version 5.1.3 |  | ||||||
| -- https://www.phpmyadmin.net/ |  | ||||||
| -- |  | ||||||
| -- 主机: localhost:3307 |  | ||||||
| -- 生成日期: 2024-04-07 10:30:00 |  | ||||||
| -- 服务器版本: 8.0.33 |  | ||||||
| -- 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_admin_users` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| DROP TABLE IF EXISTS `chatgpt_admin_users`; |  | ||||||
| CREATE TABLE `chatgpt_admin_users` ( |  | ||||||
|                                        `id` int NOT NULL, |  | ||||||
|                                        `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', |  | ||||||
|                                        `password` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', |  | ||||||
|                                        `salt` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码盐', |  | ||||||
|                                        `status` tinyint(1) NOT NULL COMMENT '当前状态', |  | ||||||
|                                        `last_login_at` int NOT NULL COMMENT '最后登录时间', |  | ||||||
|                                        `last_login_ip` char(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '最后登录 IP', |  | ||||||
|                                        `created_at` datetime NOT NULL COMMENT '创建时间', |  | ||||||
|                                        `updated_at` datetime NOT NULL COMMENT '更新时间' |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统用户' ROW_FORMAT=DYNAMIC; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 转存表中的数据 `chatgpt_admin_users` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| INSERT INTO `chatgpt_admin_users` (`id`, `username`, `password`, `salt`, `status`, `last_login_at`, `last_login_ip`, `created_at`, `updated_at`) VALUES |  | ||||||
|                                                                                                                                                      (1, 'admin', '6d17e80c87d209efb84ca4b2e0824f549d09fac8b2e1cc698de5bb5e1d75dfd0', 'mmrql75o', 1, 1712456145, '::1', '2024-03-11 16:30:20', '2024-04-07 10:15:45'), |  | ||||||
|                                                                                                                                                      (108, 'test', '9ed720ce03e0a69885455271b4b3e1710bff79434f2a95d0de6406dd88cc9f79', '4b9orqjh', 0, 1710396975, '::1', '2024-03-13 16:06:43', '2024-03-21 15:15:04'); |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的结构 `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 '是否启用', |  | ||||||
|                                     `proxy_url` varchar(100) 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 '是否启用模型', |  | ||||||
|                                        `power` tinyint NOT NULL COMMENT '消耗算力点数', |  | ||||||
|                                        `temperature` float(3,1) NOT NULL DEFAULT '1.0' COMMENT '模型创意度', |  | ||||||
|   `max_tokens` int NOT NULL DEFAULT '1024' COMMENT '最大响应长度', |  | ||||||
|   `max_context` int NOT NULL DEFAULT '4096' 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`, `power`, `temperature`, `max_tokens`, `max_context`, `open`, `created_at`, `updated_at`) VALUES |  | ||||||
|                                                                                                                                                                                           (1, 'OpenAI', 'GPT-3.5', 'gpt-3.5-turbo-0125', 0, 1, 1, 1.0, 1024, 4096, 1, '2023-08-23 12:06:36', '2024-03-18 15:43:51'), |  | ||||||
|                                                                                                                                                                                           (2, 'Azure', 'Azure-3.5', 'gpt-3.5-turbo', 14, 1, 1, 1.0, 1024, 4096, 0, '2023-08-23 12:15:30', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (3, 'ChatGLM', 'ChatGML-Pro', 'chatglm_pro', 3, 1, 1, 1.0, 2048, 32768, 1, '2023-08-23 13:35:45', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (7, 'Baidu', '文心一言3.0', 'eb-instant', 12, 1, 1, 1.0, 1024, 4096, 1, '2023-10-11 11:29:28', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (8, 'XunFei', '星火V3.5', 'generalv3.5', 2, 1, 5, 0.8, 1024, 8192, 1, '2023-10-11 15:48:30', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (9, 'XunFei', '星火V2.0', 'generalv2', 11, 1, 1, 1.0, 1024, 8192, 1, '2023-10-11 15:48:45', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (10, 'Baidu', '文心一言4.0', 'completions_pro', 13, 1, 3, 1.0, 1024, 8192, 1, '2023-10-25 08:31:37', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (11, 'OpenAI', 'GPT-4.0', 'gpt-4-0125-preview', 1, 1, 15, 1.0, 1024, 8192, 1, '2023-10-25 08:45:15', '2024-03-18 15:46:58'), |  | ||||||
|                                                                                                                                                                                           (12, 'XunFei', '星火v3.0', 'generalv3', 10, 1, 3, 1.0, 1024, 8192, 1, '2023-11-23 09:20:33', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (15, 'OpenAI', 'GPT-超级模型', 'gpt-4-all', 4, 1, 30, 1.0, 4096, 32768, 0, '2024-01-15 11:32:52', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (16, 'OpenAI', '视频号导师', 'gpt-4-gizmo-g-QXXEBTXl7', 5, 1, 30, 1.0, 4096, 32768, 0, '2024-01-15 14:46:35', '2024-03-18 14:29:39'), |  | ||||||
|                                                                                                                                                                                           (17, 'QWen', '通义千问-Turbo', 'qwen-turbo', 7, 1, 1, 1.0, 1024, 8192, 1, '2024-01-19 10:42:24', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (18, 'QWen', '通义千问-Plus', 'qwen-plus', 8, 1, 1, 1.0, 1024, 32768, 1, '2024-01-19 10:42:49', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (19, 'QWen', '通义千问-Max', 'qwen-max-1201', 9, 1, 1, 1.0, 1024, 32768, 1, '2024-01-19 10:51:03', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (21, 'OpenAI', '董宇辉小作文助手', 'gpt-4-gizmo-g-dse9iXvor', 6, 1, 30, 1.0, 8192, 32768, 0, '2024-03-18 14:24:20', '2024-03-18 14:27:19'), |  | ||||||
|                                                                                                                                                                                           (22, 'OpenAI', 'LOGO生成神器', 'gpt-4-gizmo-g-YL87j8C7S', 0, 1, 30, 1.0, 1024, 4096, 1, '2024-03-20 14:02:11', '2024-03-20 14:02:18'), |  | ||||||
|                                                                                                                                                                                           (23, 'OpenAI', '音乐生成器', 'suno-v3', 0, 1, 50, 0.8, 1024, 4096, 1, '2024-03-29 15:43:40', '2024-03-29 15:45:15'), |  | ||||||
|                                                                                                                                                                                           (24, 'OpenAI', '通义千问(中转)', 'qwen-plus', 0, 1, 0, 1.0, 1024, 4096, 1, '2024-04-03 12:00:46', '2024-04-03 12:00:46'); |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的结构 `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', '2024-03-15 09:15:42'), |  | ||||||
|                                                                                                                                                      (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', '{\"title\":\"Geek-AI创作系统\",\"admin_title\":\"Geek-AI控制台\",\"logo\":\"/images/logo.png\",\"init_power\":100,\"daily_power\":99,\"invite_power\":10,\"vip_month_power\":1000,\"register_ways\":[\"mobile\",\"username\",\"email\"],\"enabled_register\":true,\"reward_img\":\"http://localhost:5678/static/upload/2024/3/1710753716309668.jpg\",\"enabled_reward\":true,\"power_price\":0.1,\"order_pay_timeout\":1800,\"vip_info_text\":\"月度会员,年度会员每月赠送 1000 点算力,赠送算力当月有效当月没有消费完的算力不结余到下个月。 点卡充值的算力长期有效。\",\"default_models\":[11,7,1,10,12,19,18,17,3],\"mj_power\":20,\"mj_action_power\":10,\"sd_power\":5,\"dall_power\":15,\"wechat_card_url\":\"/images/wx.png\",\"enable_context\":true,\"context_deep\":4}'), |  | ||||||
|                                                                   (3, 'notice', '{\"content\":\"系统每日会给免费会员赠送10算力值,用完请第二天再来领取。\\n## v4.0.2 更新日志\\n* 功能新增:支持前端菜单可以配置\\n* 功能优化:在登录和注册界面标题显示软件版本号\\n* 功能优化:MJ 绘画支持 --sref 和 --cref 图片一致性参数\\n* 功能优化:使用 leveldb 解决 SD 绘图进度图片预览问题\\n* Bug修复:解决因为图片上传使用相对路径而导致融图失败的问题\\n* 功能新增:手机端支持 Stable-Diffusion 绘画\\n* Bug修复:修复管理后台 API KEY 删除失败的问题\\n\\n 如果觉得好用你就花几分钟自己部署一套,没有API KEY 的同学可以去\\u003ca href=\\\"https://api.chat-plus.net\\\" target=\\\"_blank\\\"\\n   style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://api.chat-plus.net\\u003c/a\\u003e (支持MidJourney,GPT,Claude,Google Gemmi 各种表格模型) 或者 \\u003ca href=\\\"https://gpt.bemore.lol\\\" target=\\\"_blank\\\"\\n             style=\\\"font-size: 20px;color:#F56C6C\\\"\\u003ehttps://gpt.bemore.lol\\u003c/a\\u003e(不支持 Midjourney) 购买,现在有超级优惠,价格远低于 OpenAI 官方。关于中转 API 的优势和劣势请参考 [中转API技术原理](https://ai.r9it.com/docs/install/errors-handle.html#%E8%B0%83%E7%94%A8%E4%B8%AD%E8%BD%AC-api-%E6%8A%A5%E9%94%99%E6%97%A0%E5%8F%AF%E7%94%A8%E6%B8%A0%E9%81%93)。\\nGPT-3.5,GPT-4,DALL-E3 绘图......你都可以随意使用,无需魔法。\\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\\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_eWuBgw', 'http://localhost:5678/api/function/weibo', 0), |  | ||||||
|                                                                                                                        (2, 'zaobao', '今日早报', '每日早报,获取当天新闻事件列表', '{\"type\":\"object\",\"properties\":{}}', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVkIjowLCJ1c2VyX2lkIjowfQ.tLAGkF8XWh_G-oQzevpIodsswtPByBLoAZDz_eWuBgw', 'http://localhost:5678/api/function/zaobao', 0), |  | ||||||
|                                                                                                                        (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', 0); |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的结构 `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 '邀请码', |  | ||||||
|                                        `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '备注', |  | ||||||
|                                        `created_at` datetime NOT NULL |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='邀请注册日志'; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的结构 `chatgpt_menus` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| DROP TABLE IF EXISTS `chatgpt_menus`; |  | ||||||
| CREATE TABLE `chatgpt_menus` ( |  | ||||||
|                                  `id` int NOT NULL, |  | ||||||
|                                  `name` varchar(30) NOT NULL COMMENT '菜单名称', |  | ||||||
|                                  `icon` varchar(150) NOT NULL COMMENT '菜单图标', |  | ||||||
|                                  `url` varchar(100) NOT NULL COMMENT '地址', |  | ||||||
|                                  `sort_num` smallint NOT NULL COMMENT '排序', |  | ||||||
|                                  `enabled` tinyint(1) NOT NULL COMMENT '是否启用' |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='前端菜单表'; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 转存表中的数据 `chatgpt_menus` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| INSERT INTO `chatgpt_menus` (`id`, `name`, `icon`, `url`, `sort_num`, `enabled`) VALUES |  | ||||||
|                                                                                      (1, '对话聊天', '/images/menu/chat.png', '/chat', 0, 1), |  | ||||||
|                                                                                      (5, 'MJ 绘画', '/images/menu/mj.png', '/mj', 1, 1), |  | ||||||
|                                                                                      (6, 'SD 绘画', '/images/menu/sd.png', '/sd', 2, 1), |  | ||||||
|                                                                                      (7, '算力日志', '/images/menu/log.png', '/powerLog', 5, 1), |  | ||||||
|                                                                                      (8, '应用中心', '/images/menu/app.png', '/apps', 3, 1), |  | ||||||
|                                                                                      (9, '作品展示', '/images/menu/img-wall.png', '/images-wall', 4, 1), |  | ||||||
|                                                                                      (10, '会员计划', '/images/menu/member.png', '/member', 6, 1), |  | ||||||
|                                                                                      (11, '分享计划', '/images/menu/share.png', '/invite', 7, 1); |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的结构 `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 '错误信息', |  | ||||||
|                                    `power` smallint NOT NULL DEFAULT '0' 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_power_logs` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| DROP TABLE IF EXISTS `chatgpt_power_logs`; |  | ||||||
| CREATE TABLE `chatgpt_power_logs` ( |  | ||||||
|                                       `id` int NOT NULL, |  | ||||||
|                                       `user_id` int NOT NULL COMMENT '用户ID', |  | ||||||
|                                       `username` varchar(30) NOT NULL COMMENT '用户名', |  | ||||||
|                                       `type` tinyint(1) NOT NULL COMMENT '类型(1:充值,2:消费,3:退费)', |  | ||||||
|                                       `amount` smallint NOT NULL COMMENT '算力数值', |  | ||||||
|                                       `balance` int NOT NULL COMMENT '余额', |  | ||||||
|                                       `model` varchar(30) NOT NULL COMMENT '模型', |  | ||||||
|                                       `remark` varchar(255) NOT NULL COMMENT '备注', |  | ||||||
|                                       `mark` tinyint(1) NOT NULL COMMENT '资金类型(0:支出,1:收入)', |  | ||||||
|                                       `created_at` datetime NOT NULL COMMENT '创建时间' |  | ||||||
| ) 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 '延长天数', |  | ||||||
|                                     `power` 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, |  | ||||||
|                                     `app_url` varchar(255) DEFAULT NULL COMMENT 'App跳转地址', |  | ||||||
|                                     `url` varchar(255) DEFAULT NULL COMMENT '跳转地址' |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员套餐表'; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的结构 `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 '错误信息', |  | ||||||
|                                    `power` smallint NOT NULL DEFAULT '0' 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 '密码盐', |  | ||||||
|                                  `power` 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`, `power`, `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://localhost:5678/static/upload/2024/2/1708682650912429.png', 'ueedue5l', 9384, 1717292086, 1, '{\"api_keys\":{\"Azure\":\"\",\"ChatGLM\":\"\",\"OpenAI\":\"\"}}', '[\"red_book\",\"gpt\",\"programmer\",\"seller\"]', '[1,11]', 1711698298, 1, '::1', '2023-06-12 16:47:17', '2024-03-29 15:44:58'); |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的结构 `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_admin_users` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `chatgpt_admin_users` |  | ||||||
|     ADD PRIMARY KEY (`id`) USING BTREE, |  | ||||||
|   ADD UNIQUE KEY `username` (`username`) USING BTREE; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的索引 `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_menus` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `chatgpt_menus` |  | ||||||
|     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_power_logs` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `chatgpt_power_logs` |  | ||||||
|     ADD PRIMARY KEY (`id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的索引 `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`), |  | ||||||
|   ADD UNIQUE KEY `username` (`username`), |  | ||||||
|   ADD UNIQUE KEY `username_2` (`username`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 表的索引 `chatgpt_user_login_logs` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `chatgpt_user_login_logs` |  | ||||||
|     ADD PRIMARY KEY (`id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 在导出的表使用AUTO_INCREMENT |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 使用表AUTO_INCREMENT `chatgpt_admin_users` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `chatgpt_admin_users` |  | ||||||
|     MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=113; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 使用表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=25; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 使用表AUTO_INCREMENT `chatgpt_chat_roles` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `chatgpt_chat_roles` |  | ||||||
|     MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=130; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 使用表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_menus` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `chatgpt_menus` |  | ||||||
|     MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 使用表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_power_logs` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `chatgpt_power_logs` |  | ||||||
|     MODIFY `id` int NOT NULL AUTO_INCREMENT; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 使用表AUTO_INCREMENT `chatgpt_products` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `chatgpt_products` |  | ||||||
|     MODIFY `id` int NOT NULL AUTO_INCREMENT; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- 使用表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 `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 */; |  | ||||||
| @@ -2,7 +2,7 @@ version: '3' | |||||||
| services: | services: | ||||||
|   # mysql |   # mysql | ||||||
|   geekai-mysql: |   geekai-mysql: | ||||||
|     image: mysql:8.0.33 |     image: registry.cn-shenzhen.aliyuncs.com/geekmaster/mysql:8.0.33 | ||||||
|     container_name: geekai-mysql |     container_name: geekai-mysql | ||||||
|     command: --default-authentication-plugin=mysql_native_password |     command: --default-authentication-plugin=mysql_native_password | ||||||
|     restart: always |     restart: always | ||||||
| @@ -18,7 +18,7 @@ services: | |||||||
|  |  | ||||||
|   # redis |   # redis | ||||||
|   geekai-redis: |   geekai-redis: | ||||||
|     image: redis:6.0.16 |     image: registry.cn-shenzhen.aliyuncs.com/geekmaster/redis:6.0.6 | ||||||
|     restart: always |     restart: always | ||||||
|     container_name: geekai-redis |     container_name: geekai-redis | ||||||
|     command: redis-server --requirepass 12345678 |     command: redis-server --requirepass 12345678 | ||||||
| @@ -29,7 +29,7 @@ services: | |||||||
|  |  | ||||||
|   xxl-job-admin: |   xxl-job-admin: | ||||||
|     container_name: geekai-xxl-job-admin |     container_name: geekai-xxl-job-admin | ||||||
|     image: xuxueli/xxl-job-admin:2.4.0 |     image: registry.cn-shenzhen.aliyuncs.com/geekmaster/xxl-job-admin:2.4.0 | ||||||
|     restart: always |     restart: always | ||||||
|     ports: |     ports: | ||||||
|       - "8081:8080" |       - "8081:8080" | ||||||
| @@ -41,7 +41,7 @@ services: | |||||||
|  |  | ||||||
|  |  | ||||||
|   midjourney-proxy: |   midjourney-proxy: | ||||||
|     image: novicezk/midjourney-proxy:2.6.0 |     image: registry.cn-shenzhen.aliyuncs.com/geekmaster/midjourney-proxy:2.6.2 | ||||||
|     container_name: geekai-midjourney-proxy |     container_name: geekai-midjourney-proxy | ||||||
|     restart: always |     restart: always | ||||||
|     ports: |     ports: | ||||||
| @@ -49,11 +49,9 @@ services: | |||||||
|     volumes: |     volumes: | ||||||
|       - ./conf/mj-proxy:/home/spring/config |       - ./conf/mj-proxy:/home/spring/config | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   # 后端 API 程序 |   # 后端 API 程序 | ||||||
|   geekai-api: |   geekai-api: | ||||||
|     image: registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api:v4.0.5-amd64 |     image: registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api:v4.0.8-amd64 | ||||||
|     container_name: geekai-api |     container_name: geekai-api | ||||||
|     restart: always |     restart: always | ||||||
|     depends_on: |     depends_on: | ||||||
| @@ -75,7 +73,7 @@ services: | |||||||
|  |  | ||||||
|   # 前端应用 |   # 前端应用 | ||||||
|   geekai-web: |   geekai-web: | ||||||
|     image: registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-web:v4.0.5-amd64 |     image: registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-web:v4.0.8-amd64 | ||||||
|     container_name: geekai-web |     container_name: geekai-web | ||||||
|     restart: always |     restart: always | ||||||
|     depends_on: |     depends_on: | ||||||
|   | |||||||
| @@ -6,4 +6,4 @@ VUE_APP_ADMIN_USER=admin | |||||||
| VUE_APP_ADMIN_PASS=admin123 | VUE_APP_ADMIN_PASS=admin123 | ||||||
| VUE_APP_KEY_PREFIX=ChatPLUS_DEV_ | VUE_APP_KEY_PREFIX=ChatPLUS_DEV_ | ||||||
| VUE_APP_TITLE="Geek-AI 创作系统" | VUE_APP_TITLE="Geek-AI 创作系统" | ||||||
| VUE_APP_VERSION=v4.0.5 | VUE_APP_VERSION=v4.0.8 | ||||||
|   | |||||||
| @@ -2,4 +2,4 @@ VUE_APP_API_HOST= | |||||||
| VUE_APP_WS_HOST= | VUE_APP_WS_HOST= | ||||||
| VUE_APP_KEY_PREFIX=ChatPLUS_ | VUE_APP_KEY_PREFIX=ChatPLUS_ | ||||||
| VUE_APP_TITLE="Geek-AI 创作系统" | VUE_APP_TITLE="Geek-AI 创作系统" | ||||||
| VUE_APP_VERSION=v4.0.5 | VUE_APP_VERSION=v4.0.8 | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										47
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -24,14 +24,16 @@ | |||||||
|         "markdown-it-mathjax": "^2.0.0", |         "markdown-it-mathjax": "^2.0.0", | ||||||
|         "markmap-common": "^0.16.0", |         "markmap-common": "^0.16.0", | ||||||
|         "markmap-lib": "^0.16.1", |         "markmap-lib": "^0.16.1", | ||||||
|  |         "markmap-toolbar": "^0.17.0", | ||||||
|         "markmap-view": "^0.16.0", |         "markmap-view": "^0.16.0", | ||||||
|         "md-editor-v3": "^2.2.1", |         "md-editor-v3": "^2.2.1", | ||||||
|  |         "mitt": "^3.0.1", | ||||||
|         "pinia": "^2.1.4", |         "pinia": "^2.1.4", | ||||||
|         "qrcode": "^1.5.3", |         "qrcode": "^1.5.3", | ||||||
|         "qs": "^6.11.1", |         "qs": "^6.11.1", | ||||||
|         "sortablejs": "^1.15.0", |         "sortablejs": "^1.15.0", | ||||||
|         "three": "^0.128.0", |         "three": "^0.128.0", | ||||||
|         "v3-waterfall": "^1.2.1", |         "v3-waterfall": "^1.3.3", | ||||||
|         "vant": "^4.5.0", |         "vant": "^4.5.0", | ||||||
|         "vue": "^3.2.13", |         "vue": "^3.2.13", | ||||||
|         "vue-router": "^4.0.15" |         "vue-router": "^4.0.15" | ||||||
| @@ -8335,6 +8337,18 @@ | |||||||
|         "js-yaml": "bin/js-yaml.js" |         "js-yaml": "bin/js-yaml.js" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/markmap-toolbar": { | ||||||
|  |       "version": "0.17.0", | ||||||
|  |       "resolved": "https://registry.npmmirror.com/markmap-toolbar/-/markmap-toolbar-0.17.0.tgz", | ||||||
|  |       "integrity": "sha512-zRkg+pYtjDefJ4lSG0KownAN3eqkJcrTei+HbobBWsWTsc7qdUMn2Ewd97SFHCkGoo1nrG0aW7dzDP6lHWuDkw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.22.6", | ||||||
|  |         "@gera2ld/jsx-dom": "^2.2.2" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "markmap-common": "*" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/markmap-view": { |     "node_modules/markmap-view": { | ||||||
|       "version": "0.16.0", |       "version": "0.16.0", | ||||||
|       "resolved": "https://registry.npmmirror.com/markmap-view/-/markmap-view-0.16.0.tgz", |       "resolved": "https://registry.npmmirror.com/markmap-view/-/markmap-view-0.16.0.tgz", | ||||||
| @@ -8592,6 +8606,11 @@ | |||||||
|         "node": ">=8" |         "node": ">=8" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/mitt": { | ||||||
|  |       "version": "3.0.1", | ||||||
|  |       "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", | ||||||
|  |       "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" | ||||||
|  |     }, | ||||||
|     "node_modules/mkdirp": { |     "node_modules/mkdirp": { | ||||||
|       "version": "0.5.6", |       "version": "0.5.6", | ||||||
|       "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", |       "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", | ||||||
| @@ -11513,9 +11532,9 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/v3-waterfall": { |     "node_modules/v3-waterfall": { | ||||||
|       "version": "1.2.1", |       "version": "1.3.3", | ||||||
|       "resolved": "https://registry.npmmirror.com/v3-waterfall/-/v3-waterfall-1.2.1.tgz", |       "resolved": "https://registry.npmmirror.com/v3-waterfall/-/v3-waterfall-1.3.3.tgz", | ||||||
|       "integrity": "sha512-zjfT1FuHupsAahvS4mr3Yb8k2SHB8srW6st+/cBXwrsyhbCcj8Qhb1QtNUuEIx/tbpLQrMpxtJunZXkaKBfAEA==" |       "integrity": "sha512-jUmp0xpHGkEcUxaYKGRtI5b2NvogxI/UrfoCLmpTi0UbQndDdqjwufxJvWwiJjwZQyOIPpnq9ZOFtkBwxchq3Q==" | ||||||
|     }, |     }, | ||||||
|     "node_modules/v8-compile-cache": { |     "node_modules/v8-compile-cache": { | ||||||
|       "version": "2.3.0", |       "version": "2.3.0", | ||||||
| @@ -19059,6 +19078,15 @@ | |||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "markmap-toolbar": { | ||||||
|  |       "version": "0.17.0", | ||||||
|  |       "resolved": "https://registry.npmmirror.com/markmap-toolbar/-/markmap-toolbar-0.17.0.tgz", | ||||||
|  |       "integrity": "sha512-zRkg+pYtjDefJ4lSG0KownAN3eqkJcrTei+HbobBWsWTsc7qdUMn2Ewd97SFHCkGoo1nrG0aW7dzDP6lHWuDkw==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.22.6", | ||||||
|  |         "@gera2ld/jsx-dom": "^2.2.2" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "markmap-view": { |     "markmap-view": { | ||||||
|       "version": "0.16.0", |       "version": "0.16.0", | ||||||
|       "resolved": "https://registry.npmmirror.com/markmap-view/-/markmap-view-0.16.0.tgz", |       "resolved": "https://registry.npmmirror.com/markmap-view/-/markmap-view-0.16.0.tgz", | ||||||
| @@ -19264,6 +19292,11 @@ | |||||||
|         "yallist": "^4.0.0" |         "yallist": "^4.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "mitt": { | ||||||
|  |       "version": "3.0.1", | ||||||
|  |       "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", | ||||||
|  |       "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" | ||||||
|  |     }, | ||||||
|     "mkdirp": { |     "mkdirp": { | ||||||
|       "version": "0.5.6", |       "version": "0.5.6", | ||||||
|       "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", |       "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", | ||||||
| @@ -21507,9 +21540,9 @@ | |||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|     "v3-waterfall": { |     "v3-waterfall": { | ||||||
|       "version": "1.2.1", |       "version": "1.3.3", | ||||||
|       "resolved": "https://registry.npmmirror.com/v3-waterfall/-/v3-waterfall-1.2.1.tgz", |       "resolved": "https://registry.npmmirror.com/v3-waterfall/-/v3-waterfall-1.3.3.tgz", | ||||||
|       "integrity": "sha512-zjfT1FuHupsAahvS4mr3Yb8k2SHB8srW6st+/cBXwrsyhbCcj8Qhb1QtNUuEIx/tbpLQrMpxtJunZXkaKBfAEA==" |       "integrity": "sha512-jUmp0xpHGkEcUxaYKGRtI5b2NvogxI/UrfoCLmpTi0UbQndDdqjwufxJvWwiJjwZQyOIPpnq9ZOFtkBwxchq3Q==" | ||||||
|     }, |     }, | ||||||
|     "v8-compile-cache": { |     "v8-compile-cache": { | ||||||
|       "version": "2.3.0", |       "version": "2.3.0", | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| { | { | ||||||
|   "name": "chatgpt-plus-web", |   "name": "geekai-web", | ||||||
|   "version": "0.1.0", |   "version": "0.1.0", | ||||||
|   "private": true, |   "private": true, | ||||||
|   "scripts": { |   "scripts": { | ||||||
| @@ -14,16 +14,16 @@ | |||||||
|     "compressorjs": "^1.2.1", |     "compressorjs": "^1.2.1", | ||||||
|     "core-js": "^3.8.3", |     "core-js": "^3.8.3", | ||||||
|     "echarts": "^5.5.0", |     "echarts": "^5.5.0", | ||||||
|     "element-plus": "^2.3.0", |     "element-plus": "^2.4.0", | ||||||
|     "good-storage": "^1.1.1", |     "good-storage": "^1.1.1", | ||||||
|     "highlight.js": "^11.7.0", |     "highlight.js": "^11.7.0", | ||||||
|     "json-bigint": "^1.0.0", |     "json-bigint": "^1.0.0", | ||||||
|     "lodash": "^4.17.21", |     "lodash": "^4.17.21", | ||||||
|     "markdown-it": "^13.0.1", |     "markdown-it": "^13.0.1", | ||||||
|     "markdown-it-latex2img": "^0.0.6", |     "markdown-it-mathjax3": "^4.3.2", | ||||||
|     "markdown-it-mathjax": "^2.0.0", |  | ||||||
|     "markmap-common": "^0.16.0", |     "markmap-common": "^0.16.0", | ||||||
|     "markmap-lib": "^0.16.1", |     "markmap-lib": "^0.16.1", | ||||||
|  |     "markmap-toolbar": "^0.17.0", | ||||||
|     "markmap-view": "^0.16.0", |     "markmap-view": "^0.16.0", | ||||||
|     "md-editor-v3": "^2.2.1", |     "md-editor-v3": "^2.2.1", | ||||||
|     "mitt": "^3.0.1", |     "mitt": "^3.0.1", | ||||||
| @@ -32,7 +32,7 @@ | |||||||
|     "qs": "^6.11.1", |     "qs": "^6.11.1", | ||||||
|     "sortablejs": "^1.15.0", |     "sortablejs": "^1.15.0", | ||||||
|     "three": "^0.128.0", |     "three": "^0.128.0", | ||||||
|     "v3-waterfall": "^1.2.1", |     "v3-waterfall": "^1.3.3", | ||||||
|     "vant": "^4.5.0", |     "vant": "^4.5.0", | ||||||
|     "vue": "^3.2.13", |     "vue": "^3.2.13", | ||||||
|     "vue-router": "^4.0.15" |     "vue-router": "^4.0.15" | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								web/public/images/img-placeholder.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								web/public/images/img-placeholder.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								web/public/images/menu/bbs.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								web/public/images/menu/bbs.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								web/public/images/menu/docs.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								web/public/images/menu/docs.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 802 B | 
| @@ -6,7 +6,7 @@ | |||||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge"> |     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||||
|     <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no"> |     <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no"> | ||||||
|     <link rel="icon" href="/favicon.ico" type="image/x-icon"> |     <link rel="icon" href="/favicon.ico" type="image/x-icon"> | ||||||
|     <title>ChatGPT-Plus</title> |     <title>Geek-AI 创作助手</title> | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|   | |||||||
| @@ -1,12 +1,11 @@ | |||||||
| <template> | <template> | ||||||
|   <el-config-provider :locale="zhCn"> |   <el-config-provider> | ||||||
|     <router-view/> |     <router-view/> | ||||||
|   </el-config-provider> |   </el-config-provider> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script setup> | <script setup> | ||||||
| import {ElConfigProvider} from 'element-plus'; | import {ElConfigProvider} from 'element-plus'; | ||||||
| import zhCn from 'element-plus/es/locale/lang/zh-cn'; |  | ||||||
|  |  | ||||||
| const debounce = (fn, delay) => { | const debounce = (fn, delay) => { | ||||||
|   let timer |   let timer | ||||||
| @@ -42,6 +41,8 @@ html, body { | |||||||
|   font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif |   font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif | ||||||
|   -webkit-font-smoothing: antialiased; |   -webkit-font-smoothing: antialiased; | ||||||
|   text-rendering: optimizeLegibility; |   text-rendering: optimizeLegibility; | ||||||
|  |  | ||||||
|  |   --primary-color: #21aa93 | ||||||
| } | } | ||||||
|  |  | ||||||
| .el-overlay-dialog { | .el-overlay-dialog { | ||||||
|   | |||||||
| @@ -1,15 +1,6 @@ | |||||||
| .page-apps { | .page-apps { | ||||||
|   background-color: #282c34; |   background-color: #282c34; | ||||||
|   height 100vh |   height 100% | ||||||
|  |  | ||||||
|   .title { |  | ||||||
|     text-align center |  | ||||||
|     background-color #25272d |  | ||||||
|     font-size 24px |  | ||||||
|     color #ffffff |  | ||||||
|     padding 10px |  | ||||||
|     border-bottom 1px solid #3c3c3c |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .inner { |   .inner { | ||||||
|     display flex |     display flex | ||||||
| @@ -19,51 +10,72 @@ | |||||||
|     overflow-x hidden |     overflow-x hidden | ||||||
|  |  | ||||||
|     .list-box { |     .list-box { | ||||||
|       .app-item { |       .item { | ||||||
|         border 1px solid #666666 |         display flex | ||||||
|         border-radius 6px |         flex-flow row | ||||||
|         overflow hidden |         border 1px solid rgb(80,80,80) | ||||||
|         transition: all 0.3s ease; /* 添加过渡效果 */ |         padding 10px | ||||||
|  |         background rgba(60,60,60 0.5) | ||||||
|  |  | ||||||
|         .el-image { |         .image { | ||||||
|           padding 6px |           width 80px | ||||||
|  |           height 80px | ||||||
|           .el-image__inner { |           min-width 80px | ||||||
|             border-radius 10px |           border-radius 5px | ||||||
|           } |           overflow hidden | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .title { |         .inner { | ||||||
|           display flex |           display flex | ||||||
|           padding 10px |           flex-flow column | ||||||
|  |           padding 0 0 0 10px | ||||||
|  |           width 100% | ||||||
|  |  | ||||||
|           .name { |           .info { | ||||||
|             width 100% |  | ||||||
|             text-align left |             text-align left | ||||||
|             font-size 16px |  | ||||||
|             font-weight bold |             .info-title { | ||||||
|             color #47fff1 |               color var(--el-text-color) | ||||||
|  |               font-size 1.25rem | ||||||
|  |               line-height 1.75rem | ||||||
|  |               letter-spacing: .025em; | ||||||
|  |               font-weight: 600; | ||||||
|  |               word-break: break-all; | ||||||
|  |               overflow: hidden; | ||||||
|  |               display: -webkit-box; | ||||||
|  |               -webkit-box-orient: vertical; | ||||||
|  |               -webkit-line-clamp: 1; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .info-text { | ||||||
|  |               padding 8px 0 | ||||||
|  |               overflow: hidden; | ||||||
|  |               display: -webkit-box; | ||||||
|  |               -webkit-box-orient: vertical; | ||||||
|  |               -webkit-line-clamp: 2; | ||||||
|  |               word-break: break-all; | ||||||
|  |               height 34px | ||||||
|  |               font-size: .875rem; | ||||||
|  |               color #999999 | ||||||
|  |             } | ||||||
|           } |           } | ||||||
|  |  | ||||||
|           .opt { |           .btn { | ||||||
|             position: relative; |             margin-top 10px | ||||||
|             width 100% |             display flex | ||||||
|             top -5px |             justify-content right | ||||||
|  |  | ||||||
|  |             .el-button { | ||||||
|  |               margin-left 10px | ||||||
|  |  | ||||||
|  |               .el-icon { | ||||||
|  |                 margin-right 5px | ||||||
|  |               } | ||||||
|  |             } | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .hello-msg { |  | ||||||
|           height 60px |  | ||||||
|           padding 10px |  | ||||||
|           font-size 14px |  | ||||||
|           color #999999 |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         &:hover { |  | ||||||
|           box-shadow: 0 0 10px rgba(71, 255, 241, 0.6); /* 添加阴影效果 */ |  | ||||||
|           transform: translateY(-10px); /* 向上移动10像素 */ |  | ||||||
|         } |  | ||||||
|       } |       } | ||||||
|  |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,313 +1,378 @@ | |||||||
| #app { | #app { | ||||||
|   height: 100%; |     height: 100%; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout { | #app .common-layout { | ||||||
|   height: 100%; |     height: 100%; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside { | #app .common-layout .el-aside { | ||||||
|   background-color: #252526; |     background-color: #252526; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .title-box { | #app .common-layout .el-aside .title-box { | ||||||
|   padding: 6px 10px; |     padding: 6px 10px; | ||||||
|   display: flex; |     display: flex; | ||||||
|   color: #fff; |     color: #fff; | ||||||
|   font-size: 20px; |     font-size: 20px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .title-box span { | #app .common-layout .el-aside .title-box span { | ||||||
|   padding-top: 5px; |     padding-top: 5px; | ||||||
|   padding-left: 10px; |     padding-left: 10px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list { | #app .common-layout .el-aside .chat-list { | ||||||
|   display: flex; |     display: flex; | ||||||
|   flex-flow: column; |     flex-flow: column; | ||||||
|   background-color: #28292a; |     background-color: #28292a; | ||||||
|   border-top: 1px solid #2f3032; |     border-top: 1px solid #2f3032; | ||||||
|   border-right: 1px solid #2f3032; |     border-right: 1px solid #2f3032; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .search-box { | #app .common-layout .el-aside .chat-list .search-box { | ||||||
|   flex-wrap: wrap; |     flex-wrap: wrap; | ||||||
|   padding: 10px 15px; |     padding: 10px 15px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .search-box .el-input__wrapper { | #app .common-layout .el-aside .chat-list .search-box .el-input__wrapper { | ||||||
|   background-color: #363535; |     background-color: #363535; | ||||||
|   box-shadow: none; |     box-shadow: none; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list ::-webkit-scrollbar { | #app .common-layout .el-aside .chat-list ::-webkit-scrollbar { | ||||||
|   width: 0; |     width: 0; | ||||||
|   height: 0; |     height: 0; | ||||||
|   background-color: transparent; |     background-color: transparent; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content { | #app .common-layout .el-aside .chat-list .content { | ||||||
|   width: 100%; |     width: 100%; | ||||||
|   overflow-y: scroll; |     overflow-y: scroll; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content .chat-list-item { | #app .common-layout .el-aside .chat-list .content .chat-list-item { | ||||||
|   display: flex; |     display: flex; | ||||||
|   width: 100%; |     width: 100%; | ||||||
|   justify-content: flex-start; |     justify-content: flex-start; | ||||||
|   padding: 8px 12px; |     padding: 8px 12px; | ||||||
|   cursor: pointer; |     cursor: pointer; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content .chat-list-item:hover { | #app .common-layout .el-aside .chat-list .content .chat-list-item:hover { | ||||||
|   background-color: #343540; |     background-color: #343540; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content .chat-list-item .avatar { | #app .common-layout .el-aside .chat-list .content .chat-list-item .avatar { | ||||||
|   width: 28px; |     width: 28px; | ||||||
|   height: 28px; |     height: 28px; | ||||||
|   border-radius: 50%; |     border-radius: 50%; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content .chat-list-item .chat-title-input { | #app .common-layout .el-aside .chat-list .content .chat-list-item .chat-title-input { | ||||||
|   font-size: 14px; |     font-size: 14px; | ||||||
|   margin-top: 4px; |     margin-top: 4px; | ||||||
|   margin-left: 10px; |     margin-left: 10px; | ||||||
|   overflow: hidden; |     overflow: hidden; | ||||||
|   white-space: nowrap; |     white-space: nowrap; | ||||||
|   text-overflow: ellipsis; |     text-overflow: ellipsis; | ||||||
|   width: 190px; |     width: 190px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content .chat-list-item .chat-title { | #app .common-layout .el-aside .chat-list .content .chat-list-item .chat-title { | ||||||
|   color: #c1c1c1; |     color: #c1c1c1; | ||||||
|   padding: 5px 10px; |     padding: 5px 10px; | ||||||
|   max-width: 220px; |     max-width: 220px; | ||||||
|   font-size: 14px; |     font-size: 14px; | ||||||
|   overflow: hidden; |     overflow: hidden; | ||||||
|   white-space: nowrap; |     white-space: nowrap; | ||||||
|   text-overflow: ellipsis; |     text-overflow: ellipsis; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content .chat-list-item .btn { | #app .common-layout .el-aside .chat-list .content .chat-list-item .btn { | ||||||
|   display: none; |     display: none; | ||||||
|   position: absolute; |     position: absolute; | ||||||
|   right: 2px; |     right: 2px; | ||||||
|   top: 16px; |     top: 16px; | ||||||
|   color: #fff; |     color: #fff; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content .chat-list-item .btn .el-icon { | #app .common-layout .el-aside .chat-list .content .chat-list-item .btn .el-icon { | ||||||
|   margin-right: 8px; |     margin-right: 8px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content .chat-list-item.active { | #app .common-layout .el-aside .chat-list .content .chat-list-item.active { | ||||||
|   background-color: #343540; |     background-color: #343540; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .chat-list .content .chat-list-item.active .btn { | #app .common-layout .el-aside .chat-list .content .chat-list-item.active .btn { | ||||||
|   display: inline; |     display: inline; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .tool-box { | #app .common-layout .el-aside .tool-box { | ||||||
|   display: flex; |     display: flex; | ||||||
|   justify-content: flex-end; |     justify-content: flex-end; | ||||||
|   align-items: center; |     align-items: center; | ||||||
|   padding: 0 20px 10px 20px; |     padding: 0 20px 10px 20px; | ||||||
|   border-top: 1px solid #3c3c3c; |     border-top: 1px solid #3c3c3c; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .tool-box .user-info { | #app .common-layout .el-aside .tool-box .user-info { | ||||||
|   width: 100%; |     width: 100%; | ||||||
|   padding-top: 10px; |     padding-top: 10px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .tool-box .user-info .el-dropdown-link { | #app .common-layout .el-aside .tool-box .user-info .el-dropdown-link { | ||||||
|   width: 100%; |     width: 100%; | ||||||
|   cursor: pointer; |     cursor: pointer; | ||||||
|   display: flex; |     display: flex; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .tool-box .user-info .el-dropdown-link .el-image { | #app .common-layout .el-aside .tool-box .user-info .el-dropdown-link .el-image { | ||||||
|   width: 20px; |     width: 20px; | ||||||
|   height: 20px; |     height: 20px; | ||||||
|   border-radius: 5px; |     border-radius: 5px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .tool-box .user-info .el-dropdown-link .username { | #app .common-layout .el-aside .tool-box .user-info .el-dropdown-link .username { | ||||||
|   display: flex; |     display: flex; | ||||||
|   line-height: 22px; |     line-height: 22px; | ||||||
|   width: 230px; |     width: 230px; | ||||||
|   padding-left: 10px; |     padding-left: 10px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-aside .tool-box .user-info .el-dropdown-link .el-icon { | #app .common-layout .el-aside .tool-box .user-info .el-dropdown-link .el-icon { | ||||||
|   color: #ccc; |     color: #ccc; | ||||||
|   line-height: 24px; |     line-height: 24px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main { | #app .common-layout .el-main { | ||||||
|   overflow: hidden; |     overflow: hidden; | ||||||
|   --el-main-padding: 0; |     --el-main-padding: 0; | ||||||
|   margin: 0; |     margin: 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main .chat-head { | #app .common-layout .el-main .chat-head { | ||||||
|   width: 100%; |     width: 100%; | ||||||
|   height: 50px; |     height: 50px; | ||||||
|   background-color: #28292a; |     background-color: #28292a; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main .chat-head .chat-config { | #app .common-layout .el-main .chat-head .chat-config { | ||||||
|   display: flex; |     display: flex; | ||||||
|   flex-direction: row; |     flex-direction: row; | ||||||
|   align-items: center; |     align-items: center; | ||||||
|   justify-content: center; |     justify-content: center; | ||||||
|   padding-top: 10px; |     padding-top: 10px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main .chat-head .chat-config .role-select-label { | #app .common-layout .el-main .chat-head .chat-config .role-select-label { | ||||||
|   color: #fff; |     color: #fff; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main .chat-head .chat-config .el-select { | #app .common-layout .el-main .chat-head .chat-config .el-select { | ||||||
|   max-width: 150px; |     max-width: 150px; | ||||||
|   margin-right: 10px; |     margin-right: 10px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main .chat-head .chat-config .role-select { | #app .common-layout .el-main .chat-head .chat-config .role-select { | ||||||
|   max-width: 130px; |     max-width: 130px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main .chat-head .chat-config .el-button .el-icon { | #app .common-layout .el-main .chat-head .chat-config .el-button .el-icon { | ||||||
|   margin-right: 5px; |     margin-right: 5px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main .chat-head .iconfont { | #app .common-layout .el-main .chat-head .iconfont { | ||||||
|   margin-right: 5px; |     margin-right: 5px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main .chat-head .is-circle { | #app .common-layout .el-main .chat-head .is-circle { | ||||||
|   margin-left: 5px; |     margin-left: 5px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .common-layout .el-main .chat-head .is-circle .iconfont { | #app .common-layout .el-main .chat-head .is-circle .iconfont { | ||||||
|   margin-right: 0; |     margin-right: 0; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box { |  | ||||||
|   min-width: 0; | #app .common-layout .el-main .chat-box { | ||||||
|   flex: 1; |     min-width: 0; | ||||||
|   background-color: #fff; |     flex: 1; | ||||||
|   border-left: 1px solid #4f4f4f; |     background-color: #fff; | ||||||
|  |     border-left: 1px solid #4f4f4f; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container { |  | ||||||
|   overflow: hidden; | #app .common-layout .el-main .chat-box #container { | ||||||
|   width: 100%; |     overflow: hidden; | ||||||
|  |     width: 100%; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container ::-webkit-scrollbar { |  | ||||||
|   width: 0; | #app .common-layout .el-main .chat-box #container ::-webkit-scrollbar { | ||||||
|   height: 0; |     width: 0; | ||||||
|   background-color: transparent; |     height: 0; | ||||||
|  |     background-color: transparent; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .chat-box { |  | ||||||
|   overflow-y: scroll; | #app .common-layout .el-main .chat-box #container .chat-box { | ||||||
|   --content-font-size: 16px; |     overflow-y: scroll; | ||||||
|   --content-color: #c1c1c1; |     --content-font-size: 16px; | ||||||
|   font-family: 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; |     --content-color: #c1c1c1; | ||||||
|   padding: 0 0 50px 0; |     font-family: 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; | ||||||
|  |     padding: 0 0 50px 0; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .chat-box .chat-line { |  | ||||||
|   font-size: 14px; | #app .common-layout .el-main .chat-box #container .chat-box .chat-line { | ||||||
|   display: flex; |     font-size: 14px; | ||||||
|   align-items: flex-start; |     display: flex; | ||||||
|  |     align-items: flex-start; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .re-generate { |  | ||||||
|   position: relative; | #app .common-layout .el-main .chat-box #container .re-generate { | ||||||
|   display: flex; |     position: relative; | ||||||
|   justify-content: center; |     display: flex; | ||||||
|  |     justify-content: center; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .re-generate .btn-box { |  | ||||||
|   position: absolute; | #app .common-layout .el-main .chat-box #container .re-generate .btn-box { | ||||||
|   bottom: 10px; |     position: absolute; | ||||||
|  |     bottom: 10px; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .re-generate .btn-box .el-button .el-icon { |  | ||||||
|   margin-right: 5px; | #app .common-layout .el-main .chat-box #container .re-generate .btn-box .el-button .el-icon { | ||||||
|  |     margin-right: 5px; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .input-box { |  | ||||||
|   background-color: #fff; | #app .common-layout .el-main .chat-box #container .input-box { | ||||||
|   display: flex; |     background-color: #fff; | ||||||
|   justify-content: center; |     display: flex; | ||||||
|   align-items: center; |     justify-content: center; | ||||||
|   box-shadow: 0 2px 15px rgba(0,0,0,0.1); |     align-items: center; | ||||||
|   padding: 0 15px; |     box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1); | ||||||
|  |     padding: 0 15px; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .input-box .input-container { |  | ||||||
|   width: 100%; | #app .common-layout .el-main .chat-box #container .input-box .input-container { | ||||||
|   margin: 0; |     width: 100%; | ||||||
|   border: none; |     margin: 0; | ||||||
|   padding: 10px 0; |     border: none; | ||||||
|   display: flex; |     padding: 10px 0; | ||||||
|   justify-content: center; |     display: flex; | ||||||
|   position: relative; |     justify-content: center; | ||||||
|  |     position: relative; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .input-box .input-container .el-textarea .el-textarea__inner::-webkit-scrollbar { |  | ||||||
|   width: 0; | #app .common-layout .el-main .chat-box #container .input-box .input-container .el-textarea .el-textarea__inner::-webkit-scrollbar { | ||||||
|   height: 0; |     width: 0; | ||||||
|  |     height: 0; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .input-box .input-container .select-file { |  | ||||||
|   position: absolute; | #app .common-layout .el-main .chat-box #container .input-box .input-container .select-file { | ||||||
|   right: 48px; |     position: absolute; | ||||||
|   top: 20px; |     right: 48px; | ||||||
|  |     top: 20px; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .input-box .input-container .send-btn { |  | ||||||
|   position: absolute; | #app .common-layout .el-main .chat-box #container .input-box .input-container .send-btn { | ||||||
|   right: 12px; |     position: absolute; | ||||||
|   top: 20px; |     right: 12px; | ||||||
|  |     top: 20px; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container .input-box .input-container .send-btn .el-button { |  | ||||||
|   padding: 8px 5px; | #app .common-layout .el-main .chat-box #container .input-box .input-container .send-btn .el-button { | ||||||
|   border-radius: 6px; |     padding: 8px 5px; | ||||||
|   background: #19c37d; |     border-radius: 6px; | ||||||
|   color: #fff; |     background: #19c37d; | ||||||
|   font-size: 20px; |     color: #fff; | ||||||
|  |     font-size: 20px; | ||||||
| } | } | ||||||
| #app .common-layout .el-main .right-box #container::-webkit-scrollbar { |  | ||||||
|   width: 0; | #app .common-layout .el-main .chat-box #container::-webkit-scrollbar { | ||||||
|   height: 0; |     width: 0; | ||||||
|  |     height: 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .el-message-box { | #app .el-message-box { | ||||||
|   width: 90%; |     width: 90%; | ||||||
|   max-width: 420px; |     max-width: 420px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #app .el-message { | #app .el-message { | ||||||
|   min-width: 100px; |     min-width: 100px; | ||||||
|   max-width: 600px; |     max-width: 600px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .el-select-dropdown__wrap .el-select-dropdown__item .role-option { | .el-select-dropdown__wrap .el-select-dropdown__item .role-option { | ||||||
|   display: flex; |     display: flex; | ||||||
|   flex-flow: row; |     flex-flow: row; | ||||||
|   margin-top: 8px; |     margin-top: 8px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .el-select-dropdown__wrap .el-select-dropdown__item .role-option .el-image { | .el-select-dropdown__wrap .el-select-dropdown__item .role-option .el-image { | ||||||
|   width: 20px; |     width: 20px; | ||||||
|   height: 20px; |     height: 20px; | ||||||
|   border-radius: 50%; |     border-radius: 50%; | ||||||
| } | } | ||||||
|  |  | ||||||
| .el-select-dropdown__wrap .el-select-dropdown__item .role-option span { | .el-select-dropdown__wrap .el-select-dropdown__item .role-option span { | ||||||
|   margin-left: 5px; |     margin-left: 5px; | ||||||
|   height: 20px; |     height: 20px; | ||||||
|   line-height: 20px; |     line-height: 20px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .account { | .account { | ||||||
|   display: flex; |     display: flex; | ||||||
|   background-color: #90ffc2; |     background-color: #90ffc2; | ||||||
|   color: #000; |     color: #000; | ||||||
|   width: 100%; |     width: 100%; | ||||||
|   border-radius: 10px; |     border-radius: 10px; | ||||||
|   padding: 10px; |     padding: 10px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .account .vip-logo .el-image { | .account .vip-logo .el-image { | ||||||
|   width: 40px; |     width: 40px; | ||||||
|   height: 40px; |     height: 40px; | ||||||
|   border-radius: 100%; |     border-radius: 100%; | ||||||
|   background-color: #fff; |     background-color: #fff; | ||||||
| } | } | ||||||
|  |  | ||||||
| .account .vip-info { | .account .vip-info { | ||||||
|   padding: 0 10px 0 10px; |     padding: 0 10px 0 10px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .account .vip-info h4, | .account .vip-info h4, | ||||||
| .account .vip-info p { | .account .vip-info p { | ||||||
|   margin: 0; |     margin: 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| .account .vip-info h4 { | .account .vip-info h4 { | ||||||
|   font-weight: bold; |     font-weight: bold; | ||||||
|   font-size: 16px; |     font-size: 16px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .account .vip-info p { | .account .vip-info p { | ||||||
|   color: #333; |     color: #333; | ||||||
| } | } | ||||||
|  |  | ||||||
| .account .pay-btn { | .account .pay-btn { | ||||||
|   width: 100%; |     width: 100%; | ||||||
|   display: flex; |     display: flex; | ||||||
|   justify-content: right; |     justify-content: right; | ||||||
|   align-items: center; |     align-items: center; | ||||||
| } | } | ||||||
|  |  | ||||||
| .el-overlay-dialog .el-dialog .el-dialog__body .notice { | .el-overlay-dialog .el-dialog .el-dialog__body .notice { | ||||||
|   padding: 0 20px 0 20px; |     padding: 0 20px 0 20px; | ||||||
|   line-height: 1.8; |     line-height: 1.8; | ||||||
| } | } | ||||||
|  |  | ||||||
| .el-overlay-dialog .el-dialog .el-dialog__body .notice .el-text { | .el-overlay-dialog .el-dialog .el-dialog__body .notice .el-text { | ||||||
|   font-size: 16px; |     font-size: 16px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .dialog-service { | .dialog-service { | ||||||
|   text-align: center; |     text-align: center; | ||||||
| } | } | ||||||
|  |  | ||||||
| .dialog-service .el-image { | .dialog-service .el-image { | ||||||
|   width: 360px; |     width: 360px; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,35 +10,26 @@ $borderColor = #4676d0; | |||||||
|     // left side |     // left side | ||||||
|  |  | ||||||
|     .el-aside { |     .el-aside { | ||||||
|       background-color: $sideBgColor; |       //background-color: $sideBgColor; | ||||||
|       height 100vh |       padding 10px | ||||||
|  |       width var(--el-aside-width, 320px) | ||||||
|       .title-box { |  | ||||||
|         padding: 6px 10px; |  | ||||||
|         display: flex; |  | ||||||
|         color: #ffffff; |  | ||||||
|         font-size: 20px; |  | ||||||
|  |  | ||||||
|         span { |  | ||||||
|           padding-top: 5px; |  | ||||||
|           padding-left: 10px; |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       .chat-list { |       .chat-list { | ||||||
|         display: flex |         display: flex | ||||||
|         flex-flow: column |         flex-flow: column | ||||||
|         background-color: #28292A |         //background-color: $sideBgColor | ||||||
|         border-top: 1px solid #2F3032 |         border-radius 10px | ||||||
|         border-right: 1px solid #2F3032 |         padding 10px 0 | ||||||
|  |  | ||||||
|         .search-box { |         .search-box { | ||||||
|           flex-wrap: wrap |           flex-wrap: wrap | ||||||
|           padding: 10px 15px; |           padding: 10px 0; | ||||||
|           //background-color #343540 |  | ||||||
|  |  | ||||||
|           .el-input__wrapper { |           .search-input { | ||||||
|             background-color: #363535; |             --el-input-bg-color: #363535 | ||||||
|  |             --el-input-border-color: #464545 | ||||||
|  |             --el-input-focus-border-color: #47fff1 | ||||||
|  |             --el-input-hover-border-color: #2DA39A | ||||||
|             box-shadow: none |             box-shadow: none | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
| @@ -52,9 +43,6 @@ $borderColor = #4676d0; | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         .content { |         .content { | ||||||
|           //display flex |  | ||||||
|           //flex-wrap: wrap; |  | ||||||
|           //flex-direction column |  | ||||||
|           width: 100% |           width: 100% | ||||||
|           overflow-y: scroll |           overflow-y: scroll | ||||||
|  |  | ||||||
| @@ -65,14 +53,17 @@ $borderColor = #4676d0; | |||||||
|             padding: 8px 12px |             padding: 8px 12px | ||||||
|             //border-bottom: 1px solid #3c3c3c |             //border-bottom: 1px solid #3c3c3c | ||||||
|             cursor: pointer |             cursor: pointer | ||||||
|  |             border: 1px solid #3c3c3c | ||||||
|  |             margin-bottom 6px | ||||||
|  |             border-radius 5px | ||||||
|  |  | ||||||
|             &:hover { |             &:hover { | ||||||
|               background-color #343540 |               background-color #343540 | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             .avatar { |             .avatar { | ||||||
|               width: 28px; |               width: 32px; | ||||||
|               height: 28px; |               height: 32px; | ||||||
|               border-radius: 50%; |               border-radius: 50%; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -96,13 +87,17 @@ $borderColor = #4676d0; | |||||||
|               text-overflow: ellipsis; |               text-overflow: ellipsis; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             .btn { |  | ||||||
|               display none |             .chat-opt { | ||||||
|               position: absolute; |               position: absolute; | ||||||
|               right: 2px; |               right: 2px; | ||||||
|               top: 16px; |               top: 16px; | ||||||
|               color #ffffff |               color #ffffff | ||||||
|  |  | ||||||
|  |               .el-dropdown-link { | ||||||
|  |                 color #ffffff | ||||||
|  |               } | ||||||
|  |  | ||||||
|               .el-icon { |               .el-icon { | ||||||
|                 margin-right 8px; |                 margin-right 8px; | ||||||
|               } |               } | ||||||
| @@ -111,10 +106,7 @@ $borderColor = #4676d0; | |||||||
|  |  | ||||||
|           .chat-list-item.active { |           .chat-list-item.active { | ||||||
|             background-color: #343540; |             background-color: #343540; | ||||||
|  |             border-color #21aa93 | ||||||
|             .btn { |  | ||||||
|               display inline |  | ||||||
|             } |  | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
| @@ -122,40 +114,12 @@ $borderColor = #4676d0; | |||||||
|  |  | ||||||
|       .tool-box { |       .tool-box { | ||||||
|         display: flex; |         display: flex; | ||||||
|         justify-content: flex-end; |         justify-content: center; | ||||||
|         align-items: center; |         padding-top 12px | ||||||
|         padding 0 20px 10px 20px; |  | ||||||
|         border-top 1px solid #3c3c3c; |         border-top 1px solid #3c3c3c; | ||||||
|  |  | ||||||
|         .user-info { |         .iconfont { | ||||||
|           width 100% |           margin-right 5px | ||||||
|           padding-top 10px; |  | ||||||
|  |  | ||||||
|           .el-dropdown-link { |  | ||||||
|             width 100%; |  | ||||||
|             cursor: pointer |  | ||||||
|             display flex |  | ||||||
|  |  | ||||||
|             .el-image { |  | ||||||
|               width: 20px; |  | ||||||
|               height: 20px; |  | ||||||
|               border-radius: 5px; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .username { |  | ||||||
|               display flex |  | ||||||
|               line-height 22px; |  | ||||||
|               width 230px; |  | ||||||
|               padding-left 10px; |  | ||||||
|  |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .el-icon { |  | ||||||
|               color: #cccccc; |  | ||||||
|               line-height 24px; |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| @@ -165,17 +129,19 @@ $borderColor = #4676d0; | |||||||
|       --el-main-padding: 0; |       --el-main-padding: 0; | ||||||
|       margin: 0; |       margin: 0; | ||||||
|  |  | ||||||
|       .chat-head { |       .chat-container { | ||||||
|         width: 100%; |         min-width: 0; | ||||||
|         height: 50px; |         flex: 1; | ||||||
|         background-color: #28292A |         background-color: var(--el-bg-color) | ||||||
|  |         color var(--el-text-color-primary) | ||||||
|  |  | ||||||
|         .chat-config { |         .chat-config { | ||||||
|  |           height 30px | ||||||
|  |           padding 10px 30px | ||||||
|           display flex |           display flex | ||||||
|           flex-direction row |           justify-content center | ||||||
|           align-items: center; |           justify-items center | ||||||
|           justify-content center; |           border-bottom 1px solid #d9d9e3 | ||||||
|           padding-top 10px; |  | ||||||
|  |  | ||||||
|           .role-select-label { |           .role-select-label { | ||||||
|             color #ffffff |             color #ffffff | ||||||
| @@ -197,28 +163,10 @@ $borderColor = #4676d0; | |||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .iconfont { |  | ||||||
|           margin-right 5px; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         .is-circle { |  | ||||||
|           margin-left 5px |  | ||||||
|  |  | ||||||
|           .iconfont { |  | ||||||
|             margin-right 0 |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       .right-box { |  | ||||||
|         min-width: 0; |  | ||||||
|         flex: 1; |  | ||||||
|         background-color: #ffffff |  | ||||||
|         border-left: 1px solid #4f4f4f |  | ||||||
|  |  | ||||||
|         #container { |         #container { | ||||||
|           overflow: hidden; |           overflow: hidden; | ||||||
|           width: 100%; |           width: 100%; | ||||||
|  |           position relative | ||||||
|  |  | ||||||
|           ::-webkit-scrollbar { |           ::-webkit-scrollbar { | ||||||
|             width: 0; |             width: 0; | ||||||
| @@ -245,69 +193,98 @@ $borderColor = #4676d0; | |||||||
|             } |             } | ||||||
|           } |           } | ||||||
|  |  | ||||||
|           .re-generate { |  | ||||||
|             position: relative; |  | ||||||
|             display: flex; |  | ||||||
|             justify-content: center; |  | ||||||
|  |  | ||||||
|             .btn-box { |  | ||||||
|               position: absolute |  | ||||||
|               bottom: 10px; |  | ||||||
|  |  | ||||||
|               .el-button { |  | ||||||
|                 .el-icon { |  | ||||||
|                   margin-right 5px; |  | ||||||
|                 } |  | ||||||
|               } |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|           .input-box { |           .input-box { | ||||||
|             background-color: #ffffff |             position absolute | ||||||
|             display: flex; |             bottom 0 | ||||||
|             justify-content: center; |             width 100% | ||||||
|             align-items: center; |  | ||||||
|             box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1); |  | ||||||
|             padding 0 15px; |  | ||||||
|  |  | ||||||
|             .input-container { |             .input-box-inner { | ||||||
|               width 100% |  | ||||||
|               margin: 0; |  | ||||||
|               border: none; |  | ||||||
|               padding: 10px 0; |  | ||||||
|               display flex |               display flex | ||||||
|               justify-content center |               background-color: #ffffff | ||||||
|               position relative |               justify-content: center; | ||||||
|  |               align-items: center; | ||||||
|  |               box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1); | ||||||
|  |               padding 0 15px; | ||||||
|  |  | ||||||
|               .el-textarea { |               .tool-item { | ||||||
|  |                 margin-right 15px | ||||||
|  |                 border-radius: 6px; | ||||||
|  |                 color: #19c37d; | ||||||
|  |                 display flex | ||||||
|  |                 justify-content center | ||||||
|  |                 justify-items center | ||||||
|  |                 padding 6px | ||||||
|  |                 cursor pointer | ||||||
|  |                 background #F2F2F2 | ||||||
|  |  | ||||||
|                 .el-textarea__inner::-webkit-scrollbar { |                 &:hover { | ||||||
|                   width: 0; |                   background #D5FAD3 | ||||||
|                   height: 0; |                 } | ||||||
|  |  | ||||||
|  |                 .iconfont { | ||||||
|  |                   font-size: 24px; | ||||||
|                 } |                 } | ||||||
|               } |               } | ||||||
|  |  | ||||||
|               .select-file { |               .input-body { | ||||||
|                 position absolute; |                 width 100% | ||||||
|                 right 48px; |                 margin: 0; | ||||||
|                 top 20px; |                 border: none; | ||||||
|               } |                 padding: 10px 0; | ||||||
|  |                 display flex | ||||||
|  |                 justify-content center | ||||||
|  |                 position relative | ||||||
|  |  | ||||||
|               .send-btn { |                 .hide-div { | ||||||
|                 position absolute; |                   white-space: pre-wrap; /* 保持文本换行 */ | ||||||
|                 right 12px; |                   visibility: hidden; /* 隐藏 div */ | ||||||
|                 top 20px; |                   position: absolute; /* 脱离文档流 */ | ||||||
|  |                   line-height: 24px | ||||||
|  |                   font-size 14px | ||||||
|  |                   word-wrap: break-word; /* 允许单词换行 */ | ||||||
|  |                   overflow-wrap: break-word; /* 允许长单词换行,适用于现代浏览器 */ | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 .input-border { | ||||||
|  |                   display flex | ||||||
|  |                   width 100% | ||||||
|  |                   overflow hidden | ||||||
|  |                   border: 2px solid #21AA93 | ||||||
|  |                   border-radius 10px | ||||||
|  |                   padding 10px | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                   .prompt-input::-webkit-scrollbar { | ||||||
|  |                     width: 0; | ||||||
|  |                     height: 0; | ||||||
|  |                   } | ||||||
|  |  | ||||||
|  |                   .prompt-input { | ||||||
|  |                     width 100% | ||||||
|  |                     line-height: 24px | ||||||
|  |                     border none | ||||||
|  |                     font-size 14px | ||||||
|  |                     background none | ||||||
|  |                     resize: none | ||||||
|  |                     white-space: pre-wrap; /* 保持文本换行 */ | ||||||
|  |                     word-wrap: break-word; /* 允许单词换行 */ | ||||||
|  |                     overflow-wrap: break-word; /* 允许长单词换行,适用于现代浏览器 */ | ||||||
|  |                   } | ||||||
|  |  | ||||||
|  |                   .send-btn { | ||||||
|  |                     width 32px | ||||||
|  |                     margin-left 10px | ||||||
|  |                     .el-button { | ||||||
|  |                       padding 8px 5px; | ||||||
|  |                       border-radius 6px; | ||||||
|  |                       font-size 20px; | ||||||
|  |                     } | ||||||
|  |                   } | ||||||
|  |  | ||||||
|                 .el-button { |  | ||||||
|                   padding 8px 5px; |  | ||||||
|                   border-radius 6px; |  | ||||||
|                   background: rgb(25, 195, 125) |  | ||||||
|                   color #ffffff; |  | ||||||
|                   font-size 20px; |  | ||||||
|                 } |                 } | ||||||
|               } |               } | ||||||
|  |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -399,12 +376,9 @@ $borderColor = #4676d0; | |||||||
|   .el-dialog { |   .el-dialog { | ||||||
|     .el-dialog__body { |     .el-dialog__body { | ||||||
|       .notice { |       .notice { | ||||||
|         padding 0 20px 0 20px |         //padding 0 20px 0 20px | ||||||
|         line-height 1.8 |         line-height 1.8 | ||||||
|  |         font-size 16px | ||||||
|         .el-text { |  | ||||||
|           font-size 16px |  | ||||||
|         } |  | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
							
								
								
									
										193
									
								
								web/src/assets/css/home.styl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								web/src/assets/css/home.styl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | |||||||
|  | .home { | ||||||
|  |   display: flex; | ||||||
|  |   height 100vh | ||||||
|  |   width 100% | ||||||
|  |   flex-flow column | ||||||
|  |  | ||||||
|  |   .header { | ||||||
|  |     display flex | ||||||
|  |     justify-content space-between | ||||||
|  |     height 50px | ||||||
|  |     line-height 50px | ||||||
|  |     background-color #1E1F22 | ||||||
|  |     padding-right 20px | ||||||
|  |  | ||||||
|  |     .banner { | ||||||
|  |       display flex | ||||||
|  |  | ||||||
|  |       .logo { | ||||||
|  |         display flex | ||||||
|  |         padding 5px | ||||||
|  |         cursor pointer | ||||||
|  |  | ||||||
|  |         .el-image { | ||||||
|  |           width 48px | ||||||
|  |           height 48px | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       .title { | ||||||
|  |         display: flex; | ||||||
|  |         color: #ffffff; | ||||||
|  |         font-size: 20px; | ||||||
|  |         padding 0 10px | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     .navbar { | ||||||
|  |       display flex | ||||||
|  |       flex-flow row | ||||||
|  |  | ||||||
|  |       .link-button { | ||||||
|  |         margin-right 15px | ||||||
|  |         color #e1e1e1 | ||||||
|  |         padding 0 10px | ||||||
|  |  | ||||||
|  |         &:hover { | ||||||
|  |           background-color #414141 | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .iconfont { | ||||||
|  |           font-size 24px | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       .user-info { | ||||||
|  |         width 100% | ||||||
|  |         padding 5px 0; | ||||||
|  |  | ||||||
|  |         .el-dropdown-link { | ||||||
|  |           width 100%; | ||||||
|  |           cursor: pointer | ||||||
|  |           display flex | ||||||
|  |  | ||||||
|  |           .el-image { | ||||||
|  |             width: 36px; | ||||||
|  |             height: 36px; | ||||||
|  |             border-radius: 50% | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           .el-icon { | ||||||
|  |             color: #cccccc; | ||||||
|  |             line-height 24px; | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   .main { | ||||||
|  |     width 100% | ||||||
|  |     display flex | ||||||
|  |     flex-flow row | ||||||
|  |  | ||||||
|  |     .navigator { | ||||||
|  |       display flex | ||||||
|  |       flex-flow column | ||||||
|  |       width 60px | ||||||
|  |       padding 10px 1px | ||||||
|  |       border-right: 1px solid #3c3c3c | ||||||
|  |       background-color: #1E1F22 | ||||||
|  |  | ||||||
|  |       .nav-items { | ||||||
|  |         margin-top: 10px; | ||||||
|  |         padding 0 5px | ||||||
|  |  | ||||||
|  |         li { | ||||||
|  |           margin-bottom 15px | ||||||
|  |           display flex | ||||||
|  |           flex-flow column | ||||||
|  |  | ||||||
|  |           a { | ||||||
|  |             color #DADBDC | ||||||
|  |             border-radius 10px | ||||||
|  |             width 48px | ||||||
|  |             height 48px | ||||||
|  |             display flex | ||||||
|  |             justify-content center | ||||||
|  |             align-items center | ||||||
|  |             cursor pointer | ||||||
|  |             background-color #414348 | ||||||
|  |  | ||||||
|  |             .el-image { | ||||||
|  |               border-radius 10px | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .iconfont { | ||||||
|  |               font-size 20px | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           a:hover, a.active { | ||||||
|  |             color #47fff1 | ||||||
|  |             background-color #0F7A71 | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           .title { | ||||||
|  |             font-size: 12px | ||||||
|  |             padding-top: 6px | ||||||
|  |             color: #e5e7eb; | ||||||
|  |             text-align: center; | ||||||
|  |             white-space: nowrap;      /* 防止文本换行 */ | ||||||
|  |             overflow: hidden;         /* 隐藏溢出内容 */ | ||||||
|  |             text-overflow: unset;  /* 使用省略号表示溢出内容 */ | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           .active { | ||||||
|  |             color #47fff1 | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     .content { | ||||||
|  |       width: 100% | ||||||
|  |       overflow auto | ||||||
|  |       box-sizing: border-box | ||||||
|  |       background-color #282c34 | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .el-popper { | ||||||
|  |   .more-menus { | ||||||
|  |     li { | ||||||
|  |       padding 10px 15px | ||||||
|  |       cursor pointer | ||||||
|  |       border-radius 5px | ||||||
|  |       margin 5px 0 | ||||||
|  |  | ||||||
|  |       .el-image { | ||||||
|  |         position: relative | ||||||
|  |         top 5px | ||||||
|  |         right 5px | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       &:hover { | ||||||
|  |         background-color #f1f1f1 | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     li.active { | ||||||
|  |       background-color #f1f1f1 | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .user-info-menu { | ||||||
|  |     li { | ||||||
|  |       a { | ||||||
|  |         width 100% | ||||||
|  |         justify-content left | ||||||
|  |  | ||||||
|  |         &:hover { | ||||||
|  |           text-decoration none !important | ||||||
|  |           color var(--el-primary-text-color) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -81,7 +81,281 @@ | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @import "task-list.styl" |     .task-list-box { | ||||||
|  |       width 100% | ||||||
|  |       padding 10px | ||||||
|  |       color #ffffff | ||||||
|  |       overflow-x hidden | ||||||
|  |  | ||||||
|  |       .task-list-inner { | ||||||
|  |         .el-tabs { | ||||||
|  |           --el-tabs-header-height: 55px; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-tabs__item { | ||||||
|  |           color: #fff; | ||||||
|  |           font-size: 18px; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .title-tabs .el-tabs__item.is-active { | ||||||
|  |           color: #47FFF1; | ||||||
|  |           font-size: 18px; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .title-tabs .el-tabs__active-bar { | ||||||
|  |           background-color: #47FFF1; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-textarea { | ||||||
|  |           --el-input-focus-border-color: #47FFF1; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-textarea__inner { | ||||||
|  |           background: transparent; | ||||||
|  |           color: #fff; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-input__wrapper { | ||||||
|  |           background: transparent; | ||||||
|  |           padding 5px | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .text { | ||||||
|  |           margin-bottom: 10px; | ||||||
|  |           color: #6b778c; | ||||||
|  |           font-size: 15px | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .param-line.pt { | ||||||
|  |           padding-top 5px | ||||||
|  |           padding-bottom 5px | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .form-item-inner { | ||||||
|  |           display flex | ||||||
|  |           align-items: center | ||||||
|  |  | ||||||
|  |           .el-icon { | ||||||
|  |             margin-left 10px | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-form-item__label { | ||||||
|  |           color #ffffff | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 图片上传样式 | ||||||
|  |  | ||||||
|  |         .img-inline { | ||||||
|  |           display flex | ||||||
|  |  | ||||||
|  |           .img-uploader { | ||||||
|  |             .el-upload { | ||||||
|  |               border: 1px dashed var(--el-border-color); | ||||||
|  |               border-radius: 6px; | ||||||
|  |               cursor: pointer; | ||||||
|  |               position: relative; | ||||||
|  |               overflow: hidden; | ||||||
|  |               width 120px; | ||||||
|  |               transition: var(--el-transition-duration-fast); | ||||||
|  |               margin-bottom: 20px; | ||||||
|  |  | ||||||
|  |               &:hover { | ||||||
|  |                 border-color: var(--el-color-primary); | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |               .el-icon.uploader-icon { | ||||||
|  |                 font-size: 28px | ||||||
|  |                 color: #8c939d | ||||||
|  |                 width 100% | ||||||
|  |                 height: 120px | ||||||
|  |                 text-align: center | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           .img-list-box { | ||||||
|  |             display flex | ||||||
|  |  | ||||||
|  |             .img-item { | ||||||
|  |               width 120px | ||||||
|  |               position relative | ||||||
|  |               margin-right 10px | ||||||
|  |  | ||||||
|  |               .el-image { | ||||||
|  |                 width 120px | ||||||
|  |                 height 120px | ||||||
|  |                 border-radius 5px | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |               .el-button { | ||||||
|  |                 position absolute | ||||||
|  |                 right 5px | ||||||
|  |                 top 5px | ||||||
|  |                 width 20px | ||||||
|  |                 height 20px | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-row.text-info { | ||||||
|  |           width 100% | ||||||
|  |           padding 10px 0 | ||||||
|  |  | ||||||
|  |           .el-tag { | ||||||
|  |             margin-right 10px | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 提交按钮 | ||||||
|  |  | ||||||
|  |         .submit-btn { | ||||||
|  |           display flex | ||||||
|  |           margin: 20px 0 | ||||||
|  |  | ||||||
|  |           .el-button { | ||||||
|  |             width 200px | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         // 任务列表 | ||||||
|  |  | ||||||
|  |         .job-list-box { | ||||||
|  |  | ||||||
|  |           @import "running-job-list.styl" | ||||||
|  |            | ||||||
|  |           .finish-job-list { | ||||||
|  |             #waterfall { | ||||||
|  |               display flex | ||||||
|  |               justify-content center | ||||||
|  |               padding-top 20px | ||||||
|  |               flex-flow column | ||||||
|  |  | ||||||
|  |  | ||||||
|  |               .job-item { | ||||||
|  |                 width 100% | ||||||
|  |                 height 100% | ||||||
|  |                 border 1px solid #666666 | ||||||
|  |                 padding 6px | ||||||
|  |                 overflow hidden | ||||||
|  |                 border-radius 6px | ||||||
|  |                 transition: all 0.3s ease; /* 添加过渡效果 */ | ||||||
|  |                 position relative | ||||||
|  |  | ||||||
|  |                 .opt { | ||||||
|  |                   .opt-line { | ||||||
|  |                     margin 6px 0 | ||||||
|  |  | ||||||
|  |                     ul { | ||||||
|  |                       display flex | ||||||
|  |                       flex-flow row | ||||||
|  |  | ||||||
|  |                       li { | ||||||
|  |                         margin-right 6px | ||||||
|  |  | ||||||
|  |                         a { | ||||||
|  |                           padding 3px 0 | ||||||
|  |                           width 40px | ||||||
|  |                           text-align center | ||||||
|  |                           border-radius 5px | ||||||
|  |                           display block | ||||||
|  |                           cursor pointer | ||||||
|  |                           background-color #4E5058 | ||||||
|  |                           color #ffffff | ||||||
|  |  | ||||||
|  |                           &:hover { | ||||||
|  |                             background-color #6D6F78 | ||||||
|  |                           } | ||||||
|  |                         } | ||||||
|  |                       } | ||||||
|  |  | ||||||
|  |                       .show-prompt { | ||||||
|  |                         font-size 20px | ||||||
|  |                         cursor pointer | ||||||
|  |                       } | ||||||
|  |                     } | ||||||
|  |                   } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                 .remove { | ||||||
|  |                   display none | ||||||
|  |                   position absolute | ||||||
|  |                   right 10px | ||||||
|  |                   top 10px | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 &:hover { | ||||||
|  |                   .remove { | ||||||
|  |                     display block | ||||||
|  |                   } | ||||||
|  |                 } | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |               .animate { | ||||||
|  |                 &:hover { | ||||||
|  |                   box-shadow: 0 0 10px rgba(71, 255, 241, 0.6); /* 添加阴影效果 */ | ||||||
|  |                   transform: translateY(-10px); /* 向上移动10像素 */ | ||||||
|  |                 } | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |           .el-image { | ||||||
|  |             width 100% | ||||||
|  |             height 100% | ||||||
|  |             overflow visible | ||||||
|  |  | ||||||
|  |             .el-image-viewer__wrapper { | ||||||
|  |               img { | ||||||
|  |                 width auto | ||||||
|  |                 height auto | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .image-slot { | ||||||
|  |               display flex | ||||||
|  |               flex-flow column | ||||||
|  |               justify-content center | ||||||
|  |               align-items center | ||||||
|  |               min-height 200px | ||||||
|  |               color #ffffff | ||||||
|  |  | ||||||
|  |               .iconfont { | ||||||
|  |                 font-size 50px | ||||||
|  |                 margin-bottom 10px | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           .el-image.upscale { | ||||||
|  |             img { | ||||||
|  |               height 310px | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .image-slot { | ||||||
|  |               height 310px | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .el-image-viewer__wrapper { | ||||||
|  |               img { | ||||||
|  |                 width auto | ||||||
|  |                 height auto | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       .no-more-data { | ||||||
|  |         text-align center | ||||||
|  |         padding 30px | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| .page-mj { | .page-mj { | ||||||
|   background-color: #282c34; |   background-color: #282c34; | ||||||
|   height 100vh |   height 100% | ||||||
|  |  | ||||||
|   .inner { |   .inner { | ||||||
|     display: flex; |     display: flex; | ||||||
| @@ -50,6 +50,7 @@ | |||||||
|             display flex |             display flex | ||||||
|             cursor pointer |             cursor pointer | ||||||
|             margin-bottom: 10px; |             margin-bottom: 10px; | ||||||
|  |             border 1px solid #383838 | ||||||
|  |  | ||||||
|             &:hover { |             &:hover { | ||||||
|               background-color #585858 |               background-color #585858 | ||||||
| @@ -61,60 +62,9 @@ | |||||||
|               margin-bottom 5px |               margin-bottom 5px | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             .shape { |             .text { | ||||||
|               width 16px |               margin-left 5px | ||||||
|               height 16px |               margin-top 2px | ||||||
|               margin-bottom 5px |  | ||||||
|               border 1px solid #C4C4C4 |  | ||||||
|               border-radius 3px |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .shape.size9-16 { |  | ||||||
|               width 9px |  | ||||||
|               height 16px |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .shape.size16-9 { |  | ||||||
|               height 9px |  | ||||||
|               width 16px |  | ||||||
|               position relative |  | ||||||
|               margin 4px 0 7px |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .shape.size3-4 { |  | ||||||
|               width 12px |  | ||||||
|               height 16px |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .shape.size4-3 { |  | ||||||
|               height 12px |  | ||||||
|               width 16px |  | ||||||
|               position relative |  | ||||||
|               margin 4px 0 4px |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .shape.size2-3 { |  | ||||||
|               width 11px |  | ||||||
|               height 16px |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .shape.size3-2 { |  | ||||||
|               height 11px |  | ||||||
|               width 16px |  | ||||||
|               position relative |  | ||||||
|               margin 4px 0 5px |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .shape.size1-2 { |  | ||||||
|               width 8px |  | ||||||
|               height 16px |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .shape.size2-1 { |  | ||||||
|               height 8px |  | ||||||
|               width 16px |  | ||||||
|               position relative |  | ||||||
|               margin 4px 0 8px |  | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|  |  | ||||||
| @@ -122,10 +72,7 @@ | |||||||
|           .grid-content.active { |           .grid-content.active { | ||||||
|             color #47fff1 |             color #47fff1 | ||||||
|             background-color #585858 |             background-color #585858 | ||||||
|  |             border 1px solid #47fff1 | ||||||
|             .shape { |  | ||||||
|               border 1px solid #47fff1 |  | ||||||
|             } |  | ||||||
|           } |           } | ||||||
|  |  | ||||||
|           .model { |           .model { | ||||||
| @@ -233,7 +180,280 @@ | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @import "task-list.styl" |     .task-list-box { | ||||||
|  |       width 100% | ||||||
|  |       padding 0 10px 10px 10px | ||||||
|  |       color #ffffff | ||||||
|  |       overflow-x hidden | ||||||
|  |  | ||||||
|  |       .task-list-inner { | ||||||
|  |         .el-tabs { | ||||||
|  |           --el-tabs-header-height: 55px; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-tabs__item { | ||||||
|  |           color: #fff; | ||||||
|  |           font-size: 18px; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .title-tabs .el-tabs__item.is-active { | ||||||
|  |           color: #47FFF1; | ||||||
|  |           font-size: 18px; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .title-tabs .el-tabs__active-bar { | ||||||
|  |           background-color: #47FFF1; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-textarea { | ||||||
|  |           --el-input-focus-border-color: #47FFF1; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-textarea__inner { | ||||||
|  |           background: transparent; | ||||||
|  |           color: #fff; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-input__wrapper { | ||||||
|  |           background: transparent; | ||||||
|  |           padding 5px | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .text { | ||||||
|  |           margin-bottom: 10px; | ||||||
|  |           color: #6b778c; | ||||||
|  |           font-size: 15px | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .param-line.pt { | ||||||
|  |           padding-top 5px | ||||||
|  |           padding-bottom 5px | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .form-item-inner { | ||||||
|  |           display flex | ||||||
|  |           align-items: center | ||||||
|  |  | ||||||
|  |           .el-icon { | ||||||
|  |             margin-left 10px | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-form-item__label { | ||||||
|  |           color #ffffff | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 图片上传样式 | ||||||
|  |  | ||||||
|  |         .img-inline { | ||||||
|  |           display flex | ||||||
|  |  | ||||||
|  |           .img-uploader { | ||||||
|  |             .el-upload { | ||||||
|  |               border: 1px dashed var(--el-border-color); | ||||||
|  |               border-radius: 6px; | ||||||
|  |               cursor: pointer; | ||||||
|  |               position: relative; | ||||||
|  |               overflow: hidden; | ||||||
|  |               width 120px; | ||||||
|  |               transition: var(--el-transition-duration-fast); | ||||||
|  |               margin-bottom: 20px; | ||||||
|  |  | ||||||
|  |               &:hover { | ||||||
|  |                 border-color: var(--el-color-primary); | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |               .el-icon.uploader-icon { | ||||||
|  |                 font-size: 28px | ||||||
|  |                 color: #8c939d | ||||||
|  |                 width 100% | ||||||
|  |                 height: 120px | ||||||
|  |                 text-align: center | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           .img-list-box { | ||||||
|  |             display flex | ||||||
|  |  | ||||||
|  |             .img-item { | ||||||
|  |               width 120px | ||||||
|  |               position relative | ||||||
|  |               margin-right 10px | ||||||
|  |  | ||||||
|  |               .el-image { | ||||||
|  |                 width 120px | ||||||
|  |                 height 120px | ||||||
|  |                 border-radius 5px | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |               .el-button { | ||||||
|  |                 position absolute | ||||||
|  |                 right 5px | ||||||
|  |                 top 5px | ||||||
|  |                 width 20px | ||||||
|  |                 height 20px | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-row.text-info { | ||||||
|  |           width 100% | ||||||
|  |           padding 10px 0 | ||||||
|  |  | ||||||
|  |           .el-tag { | ||||||
|  |             margin-right 10px | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 提交按钮 | ||||||
|  |  | ||||||
|  |         .submit-btn { | ||||||
|  |           display flex | ||||||
|  |           margin: 20px 0 | ||||||
|  |  | ||||||
|  |           .el-button { | ||||||
|  |             width 200px | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         .job-list-box { | ||||||
|  |           // 任务列表 | ||||||
|  |           @import "running-job-list.styl" | ||||||
|  |  | ||||||
|  |           .finish-job-list { | ||||||
|  |             #waterfall { | ||||||
|  |               display flex | ||||||
|  |               justify-content center | ||||||
|  |               padding-top 20px | ||||||
|  |               flex-flow column | ||||||
|  |  | ||||||
|  |               .waterfall-item { | ||||||
|  |                 overflow visible | ||||||
|  |  | ||||||
|  |                 .job-item { | ||||||
|  |                   width 100% | ||||||
|  |                   height 100% | ||||||
|  |                   border 1px solid #666666 | ||||||
|  |                   padding 6px | ||||||
|  |                   border-radius 6px | ||||||
|  |                   //position relative | ||||||
|  |  | ||||||
|  |                   .el-image { | ||||||
|  |                     overflow auto | ||||||
|  |                   } | ||||||
|  |  | ||||||
|  |                   .opt { | ||||||
|  |                     padding-top 5px | ||||||
|  |  | ||||||
|  |                     .opt-line { | ||||||
|  |                       margin 6px 0 | ||||||
|  |  | ||||||
|  |                       ul { | ||||||
|  |                         display flex | ||||||
|  |                         flex-flow row | ||||||
|  |  | ||||||
|  |                         li { | ||||||
|  |                           margin-right 6px | ||||||
|  |  | ||||||
|  |                           a { | ||||||
|  |                             padding 3px 0 | ||||||
|  |                             width 40px | ||||||
|  |                             text-align center | ||||||
|  |                             border-radius 5px | ||||||
|  |                             display block | ||||||
|  |                             cursor pointer | ||||||
|  |                             background-color #4E5058 | ||||||
|  |                             color #ffffff | ||||||
|  |  | ||||||
|  |                             &:hover { | ||||||
|  |                               background-color #6D6F78 | ||||||
|  |                             } | ||||||
|  |                           } | ||||||
|  |                         } | ||||||
|  |  | ||||||
|  |                         .show-prompt { | ||||||
|  |                           font-size 20px | ||||||
|  |                           cursor pointer | ||||||
|  |                         } | ||||||
|  |                       } | ||||||
|  |                     } | ||||||
|  |                   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                   .remove { | ||||||
|  |                     display none | ||||||
|  |                     position absolute | ||||||
|  |                     right 10px | ||||||
|  |                     top 10px | ||||||
|  |                   } | ||||||
|  |  | ||||||
|  |                   &:hover { | ||||||
|  |                     .remove { | ||||||
|  |                       display block | ||||||
|  |                     } | ||||||
|  |                   } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |           .el-image { | ||||||
|  |             width 100% | ||||||
|  |             height 100% | ||||||
|  |             overflow visible | ||||||
|  |  | ||||||
|  |             .el-image-viewer__wrapper { | ||||||
|  |               img { | ||||||
|  |                 width auto | ||||||
|  |                 height auto | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .image-slot { | ||||||
|  |               display flex | ||||||
|  |               flex-flow column | ||||||
|  |               justify-content center | ||||||
|  |               align-items center | ||||||
|  |               min-height 200px | ||||||
|  |               color #ffffff | ||||||
|  |  | ||||||
|  |               .iconfont { | ||||||
|  |                 font-size 50px | ||||||
|  |                 margin-bottom 10px | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           .el-image.upscale { | ||||||
|  |             img { | ||||||
|  |               //height 310px | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .image-slot { | ||||||
|  |               min-height 310px | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .el-image-viewer__wrapper { | ||||||
|  |               img { | ||||||
|  |                 width auto | ||||||
|  |                 height auto | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       .no-more-data { | ||||||
|  |         text-align center | ||||||
|  |         padding 30px | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,10 +10,11 @@ | |||||||
|       border 1px solid #454545 |       border 1px solid #454545 | ||||||
|       min-width 300px |       min-width 300px | ||||||
|       max-width 300px |       max-width 300px | ||||||
|       padding 10px |       padding 10px 10px 20px 10px | ||||||
|       border-radius 10px |       border-radius 10px | ||||||
|       color #ffffff; |       color #ffffff; | ||||||
|       font-size 14px |       font-size 14px | ||||||
|  |       overflow auto | ||||||
|  |  | ||||||
|       h2 { |       h2 { | ||||||
|         font-weight: bold; |         font-weight: bold; | ||||||
| @@ -81,7 +82,281 @@ | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @import "task-list.styl" |     .task-list-box { | ||||||
|  |       width 100% | ||||||
|  |       padding 0 10px 10px 10px | ||||||
|  |       color #ffffff | ||||||
|  |       overflow-x hidden | ||||||
|  |  | ||||||
|  |       .task-list-inner { | ||||||
|  |         .el-tabs { | ||||||
|  |           --el-tabs-header-height: 55px; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-tabs__item { | ||||||
|  |           color: #fff; | ||||||
|  |           font-size: 18px; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .title-tabs .el-tabs__item.is-active { | ||||||
|  |           color: #47FFF1; | ||||||
|  |           font-size: 18px; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .title-tabs .el-tabs__active-bar { | ||||||
|  |           background-color: #47FFF1; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-textarea { | ||||||
|  |           --el-input-focus-border-color: #47FFF1; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-textarea__inner { | ||||||
|  |           background: transparent; | ||||||
|  |           color: #fff; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-input__wrapper { | ||||||
|  |           background: transparent; | ||||||
|  |           padding 5px | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .text { | ||||||
|  |           margin-bottom: 10px; | ||||||
|  |           color: #6b778c; | ||||||
|  |           font-size: 15px | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .param-line.pt { | ||||||
|  |           padding-top 5px | ||||||
|  |           padding-bottom 5px | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .form-item-inner { | ||||||
|  |           display flex | ||||||
|  |           align-items: center | ||||||
|  |  | ||||||
|  |           .el-icon { | ||||||
|  |             margin-left 10px | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-form-item__label { | ||||||
|  |           color #ffffff | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 图片上传样式 | ||||||
|  |  | ||||||
|  |         .img-inline { | ||||||
|  |           display flex | ||||||
|  |  | ||||||
|  |           .img-uploader { | ||||||
|  |             .el-upload { | ||||||
|  |               border: 1px dashed var(--el-border-color); | ||||||
|  |               border-radius: 6px; | ||||||
|  |               cursor: pointer; | ||||||
|  |               position: relative; | ||||||
|  |               overflow: hidden; | ||||||
|  |               width 120px; | ||||||
|  |               transition: var(--el-transition-duration-fast); | ||||||
|  |               margin-bottom: 20px; | ||||||
|  |  | ||||||
|  |               &:hover { | ||||||
|  |                 border-color: var(--el-color-primary); | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |               .el-icon.uploader-icon { | ||||||
|  |                 font-size: 28px | ||||||
|  |                 color: #8c939d | ||||||
|  |                 width 100% | ||||||
|  |                 height: 120px | ||||||
|  |                 text-align: center | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           .img-list-box { | ||||||
|  |             display flex | ||||||
|  |  | ||||||
|  |             .img-item { | ||||||
|  |               width 120px | ||||||
|  |               position relative | ||||||
|  |               margin-right 10px | ||||||
|  |  | ||||||
|  |               .el-image { | ||||||
|  |                 width 120px | ||||||
|  |                 height 120px | ||||||
|  |                 border-radius 5px | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |               .el-button { | ||||||
|  |                 position absolute | ||||||
|  |                 right 5px | ||||||
|  |                 top 5px | ||||||
|  |                 width 20px | ||||||
|  |                 height 20px | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         .el-row.text-info { | ||||||
|  |           width 100% | ||||||
|  |           padding 10px 0 | ||||||
|  |  | ||||||
|  |           .el-tag { | ||||||
|  |             margin-right 10px | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 提交按钮 | ||||||
|  |  | ||||||
|  |         .submit-btn { | ||||||
|  |           display flex | ||||||
|  |           margin: 20px 0 | ||||||
|  |  | ||||||
|  |           .el-button { | ||||||
|  |             width 200px | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         // 任务列表 | ||||||
|  |  | ||||||
|  |         .job-list-box { | ||||||
|  |  | ||||||
|  |           @import "running-job-list.styl" | ||||||
|  |  | ||||||
|  |           .finish-job-list { | ||||||
|  |             #waterfall { | ||||||
|  |               display flex | ||||||
|  |               justify-content center | ||||||
|  |               padding-top 20px | ||||||
|  |               flex-flow column | ||||||
|  |  | ||||||
|  |  | ||||||
|  |               .job-item { | ||||||
|  |                 width 100% | ||||||
|  |                 height 100% | ||||||
|  |                 border 1px solid #666666 | ||||||
|  |                 padding 6px | ||||||
|  |                 overflow hidden | ||||||
|  |                 border-radius 6px | ||||||
|  |                 transition: all 0.3s ease; /* 添加过渡效果 */ | ||||||
|  |                 position relative | ||||||
|  |  | ||||||
|  |                 .opt { | ||||||
|  |                   .opt-line { | ||||||
|  |                     margin 6px 0 | ||||||
|  |  | ||||||
|  |                     ul { | ||||||
|  |                       display flex | ||||||
|  |                       flex-flow row | ||||||
|  |  | ||||||
|  |                       li { | ||||||
|  |                         margin-right 6px | ||||||
|  |  | ||||||
|  |                         a { | ||||||
|  |                           padding 3px 0 | ||||||
|  |                           width 40px | ||||||
|  |                           text-align center | ||||||
|  |                           border-radius 5px | ||||||
|  |                           display block | ||||||
|  |                           cursor pointer | ||||||
|  |                           background-color #4E5058 | ||||||
|  |                           color #ffffff | ||||||
|  |  | ||||||
|  |                           &:hover { | ||||||
|  |                             background-color #6D6F78 | ||||||
|  |                           } | ||||||
|  |                         } | ||||||
|  |                       } | ||||||
|  |  | ||||||
|  |                       .show-prompt { | ||||||
|  |                         font-size 20px | ||||||
|  |                         cursor pointer | ||||||
|  |                       } | ||||||
|  |                     } | ||||||
|  |                   } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                 .remove { | ||||||
|  |                   display none | ||||||
|  |                   position absolute | ||||||
|  |                   right 10px | ||||||
|  |                   top 10px | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 &:hover { | ||||||
|  |                   .remove { | ||||||
|  |                     display block | ||||||
|  |                   } | ||||||
|  |                 } | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |               .animate { | ||||||
|  |                 &:hover { | ||||||
|  |                   box-shadow: 0 0 10px rgba(71, 255, 241, 0.6); /* 添加阴影效果 */ | ||||||
|  |                   transform: translateY(-10px); /* 向上移动10像素 */ | ||||||
|  |                 } | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |           .el-image { | ||||||
|  |             width 100% | ||||||
|  |             height 100% | ||||||
|  |             overflow visible | ||||||
|  |  | ||||||
|  |             .el-image-viewer__wrapper { | ||||||
|  |               img { | ||||||
|  |                 width auto | ||||||
|  |                 height auto | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .image-slot { | ||||||
|  |               display flex | ||||||
|  |               flex-flow column | ||||||
|  |               justify-content center | ||||||
|  |               align-items center | ||||||
|  |               min-height 200px | ||||||
|  |               color #ffffff | ||||||
|  |  | ||||||
|  |               .iconfont { | ||||||
|  |                 font-size 50px | ||||||
|  |                 margin-bottom 10px | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           .el-image.upscale { | ||||||
|  |             img { | ||||||
|  |               height 310px | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .image-slot { | ||||||
|  |               height 310px | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .el-image-viewer__wrapper { | ||||||
|  |               img { | ||||||
|  |                 width auto | ||||||
|  |                 height auto | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       .no-more-data { | ||||||
|  |         text-align center | ||||||
|  |         padding 30px | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @import "sd-task-dialog.styl" |   @import "sd-task-dialog.styl" | ||||||
|   | |||||||
| @@ -46,6 +46,10 @@ | |||||||
|       overflow-y auto |       overflow-y auto | ||||||
|       overflow-x hidden |       overflow-x hidden | ||||||
|  |  | ||||||
|  |       .waterfall-over-message { | ||||||
|  |         display none | ||||||
|  |       } | ||||||
|  |  | ||||||
|       .list-item { |       .list-item { | ||||||
|  |  | ||||||
|         .image { |         .image { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| .page-mark-map { | .page-mark-map { | ||||||
|   background-color: #282c34; |   background-color: #282c34; | ||||||
|   height 100vh |   height 100% | ||||||
|  |  | ||||||
|   .inner { |   .inner { | ||||||
|     display: flex; |     display: flex; | ||||||
| @@ -24,6 +24,7 @@ | |||||||
|       } |       } | ||||||
|  |  | ||||||
|       // 隐藏滚动条 |       // 隐藏滚动条 | ||||||
|  |  | ||||||
|       ::-webkit-scrollbar { |       ::-webkit-scrollbar { | ||||||
|         width: 0; |         width: 0; | ||||||
|         height: 0; |         height: 0; | ||||||
| @@ -64,21 +65,15 @@ | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     .right-box { |  | ||||||
|  |     .chat-box { | ||||||
|       width 100% |       width 100% | ||||||
|  |  | ||||||
|       .top-bar { |       .top-bar { | ||||||
|         display flex |         display flex | ||||||
|         justify-content space-between |         justify-content right | ||||||
|         align-items center |         align-items center | ||||||
|  |         padding 10px 20px 10px 10px | ||||||
|         h2 { |  | ||||||
|           color #ffffff |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         .el-button { |  | ||||||
|           margin-right 20px |  | ||||||
|         } |  | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       .markdown { |       .markdown { | ||||||
| @@ -117,6 +112,7 @@ | |||||||
|         display flex |         display flex | ||||||
|         justify-content center |         justify-content center | ||||||
|         align-items center |         align-items center | ||||||
|  |         position relative | ||||||
|  |  | ||||||
|         .markmap { |         .markmap { | ||||||
|           width 100% |           width 100% | ||||||
| @@ -127,6 +123,27 @@ | |||||||
|             //height 30px |             //height 30px | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         #toolbar { | ||||||
|  |           position: absolute | ||||||
|  |           bottom: 10px | ||||||
|  |           right: 20px | ||||||
|  |  | ||||||
|  |           .mm-toolbar { | ||||||
|  |             display flex | ||||||
|  |             flex-flow row | ||||||
|  |  | ||||||
|  |             .mm-toolbar-brand { | ||||||
|  |               display none | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             .mm-toolbar-item { | ||||||
|  |               cursor pointer | ||||||
|  |               color var(--el-color-white) | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| .member { | .member { | ||||||
|   background-color: #282c34; |   background-color: #282c34; | ||||||
|   height 100vh |   height 100% | ||||||
|  |  | ||||||
|   .el-dialog { |   .el-dialog { | ||||||
|     .el-dialog__body { |     .el-dialog__body { | ||||||
| @@ -65,9 +65,12 @@ | |||||||
|     padding 15px 0 15px 15px; |     padding 15px 0 15px 15px; | ||||||
|     overflow-x hidden |     overflow-x hidden | ||||||
|     overflow-y visible |     overflow-y visible | ||||||
|  |     display flex | ||||||
|  |     flex-flow row | ||||||
|  |  | ||||||
|     .user-profile { |     .user-profile { | ||||||
|       padding 10px 20px 20px 20px |       padding 10px 20px 20px 20px | ||||||
|  |       width 300px | ||||||
|       background-color #393F4A |       background-color #393F4A | ||||||
|       color #ffffff |       color #ffffff | ||||||
|       border-radius 10px |       border-radius 10px | ||||||
| @@ -91,12 +94,15 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|     .product-box { |     .product-box { | ||||||
|  |       padding 0 20px | ||||||
|  |       width 100% | ||||||
|  |  | ||||||
|       .info { |       .info { | ||||||
|         .el-alert__description { |         .el-alert__description { | ||||||
|           font-size 14px !important |           font-size 14px !important | ||||||
|           margin 0 |           margin 0 | ||||||
|         } |         } | ||||||
|         padding 10px 20px 20px 0 |         padding 0 0 20px 0 | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       .list-box { |       .list-box { | ||||||
|   | |||||||
							
								
								
									
										39
									
								
								web/src/assets/css/running-job-list.styl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								web/src/assets/css/running-job-list.styl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | .running-job-list { | ||||||
|  |  | ||||||
|  |   .running-job-box { | ||||||
|  |     width 100% | ||||||
|  |     display flex | ||||||
|  |     flex-flow row | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .job-item { | ||||||
|  |     margin-right 10px | ||||||
|  |     width 200px | ||||||
|  |     height 200px | ||||||
|  |     overflow hidden | ||||||
|  |     padding 2px | ||||||
|  |     background-color #555555 | ||||||
|  |  | ||||||
|  |     .job-item-inner { | ||||||
|  |       position relative | ||||||
|  |       height 100% | ||||||
|  |       overflow hidden | ||||||
|  |  | ||||||
|  |       .progress { | ||||||
|  |         position absolute | ||||||
|  |         width 100% | ||||||
|  |         height 100% | ||||||
|  |         top 0 | ||||||
|  |         left 0 | ||||||
|  |         display flex | ||||||
|  |         justify-content center | ||||||
|  |         align-items center | ||||||
|  |  | ||||||
|  |         span { | ||||||
|  |           font-size 20px | ||||||
|  |           color #ffffff | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,215 +0,0 @@ | |||||||
| .task-list-box { |  | ||||||
|   width: 100%; |  | ||||||
|   padding: 10px; |  | ||||||
|   color: #fff; |  | ||||||
|   overflow-x: hidden; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .el-tabs { |  | ||||||
|   --el-tabs-header-height: 55px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .el-tabs__item { |  | ||||||
|   color: #fff; |  | ||||||
|   font-size: 18px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .title-tabs .el-tabs__item.is-active { |  | ||||||
|   color: #47fff1; |  | ||||||
|   font-size: 18px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .title-tabs .el-tabs__active-bar { |  | ||||||
|   background-color: #47fff1; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .el-textarea { |  | ||||||
|   --el-input-focus-border-color: #47fff1; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .el-textarea__inner { |  | ||||||
|   background: transparent; |  | ||||||
|   color: #fff; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .el-input__wrapper { |  | ||||||
|   background: transparent; |  | ||||||
|   padding: 5px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .text { |  | ||||||
|   margin-bottom: 10px; |  | ||||||
|   color: #6b778c; |  | ||||||
|   font-size: 15px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .param-line.pt { |  | ||||||
|   padding-top: 5px; |  | ||||||
|   padding-bottom: 5px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .form-item-inner { |  | ||||||
|   display: flex; |  | ||||||
|   align-items: center; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .form-item-inner .el-icon { |  | ||||||
|   margin-left: 10px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .el-form-item__label { |  | ||||||
|   color: #fff; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .img-inline { |  | ||||||
|   display: flex; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .img-inline .img-uploader .el-upload { |  | ||||||
|   border: 1px dashed var(--el-border-color); |  | ||||||
|   border-radius: 6px; |  | ||||||
|   cursor: pointer; |  | ||||||
|   position: relative; |  | ||||||
|   overflow: hidden; |  | ||||||
|   width: 120px; |  | ||||||
|   transition: var(--el-transition-duration-fast); |  | ||||||
|   margin-bottom: 20px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .img-inline .img-uploader .el-upload:hover { |  | ||||||
|   border-color: var(--el-color-primary); |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .img-inline .img-uploader .el-upload .el-icon.uploader-icon { |  | ||||||
|   font-size: 28px; |  | ||||||
|   color: #8c939d; |  | ||||||
|   width: 100%; |  | ||||||
|   height: 120px; |  | ||||||
|   text-align: center; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .img-inline .img-list-box { |  | ||||||
|   display: flex; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .img-inline .img-list-box .img-item { |  | ||||||
|   width: 120px; |  | ||||||
|   position: relative; |  | ||||||
|   margin-right: 10px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .img-inline .img-list-box .img-item .el-image { |  | ||||||
|   width: 120px; |  | ||||||
|   height: 120px; |  | ||||||
|   border-radius: 5px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .img-inline .img-list-box .img-item .el-button { |  | ||||||
|   position: absolute; |  | ||||||
|   right: 5px; |  | ||||||
|   top: 5px; |  | ||||||
|   width: 20px; |  | ||||||
|   height: 20px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .submit-btn { |  | ||||||
|   display: flex; |  | ||||||
|   margin: 20px 0; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .submit-btn .el-button { |  | ||||||
|   width: 200px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .submit-btn .text-info { |  | ||||||
|   width: 100%; |  | ||||||
|   display: flex; |  | ||||||
|   justify-content: right; |  | ||||||
|   align-items: center; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .running-job-list .job-item { |  | ||||||
|   width: 100%; |  | ||||||
|   padding: 2px; |  | ||||||
|   background-color: #555; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .running-job-list .job-item .job-item-inner { |  | ||||||
|   position: relative; |  | ||||||
|   height: 100%; |  | ||||||
|   overflow: hidden; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .running-job-list .job-item .job-item-inner .progress { |  | ||||||
|   position: absolute; |  | ||||||
|   width: 100%; |  | ||||||
|   height: 100%; |  | ||||||
|   top: 0; |  | ||||||
|   left: 0; |  | ||||||
|   display: flex; |  | ||||||
|   justify-content: center; |  | ||||||
|   align-items: center; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .running-job-list .job-item .job-item-inner .progress span { |  | ||||||
|   font-size: 20px; |  | ||||||
|   color: #fff; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .job-item { |  | ||||||
|   width: 100%; |  | ||||||
|   height: 100%; |  | ||||||
|   border: 1px solid #666; |  | ||||||
|   padding: 6px; |  | ||||||
|   overflow: hidden; |  | ||||||
|   border-radius: 6px; |  | ||||||
|   transition: all 0.3s ease; /* 添加过渡效果 */ |  | ||||||
|   position: relative; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .job-item .opt .opt-line { |  | ||||||
|   margin: 6px 0; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .job-item .opt .opt-line ul { |  | ||||||
|   display: flex; |  | ||||||
|   flex-flow: row; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .job-item .opt .opt-line ul li { |  | ||||||
|   margin-right: 6px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .job-item .opt .opt-line ul li a { |  | ||||||
|   padding: 3px 0; |  | ||||||
|   width: 40px; |  | ||||||
|   text-align: center; |  | ||||||
|   border-radius: 5px; |  | ||||||
|   display: block; |  | ||||||
|   cursor: pointer; |  | ||||||
|   background-color: #4e5058; |  | ||||||
|   color: #fff; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .job-item .opt .opt-line ul li a:hover { |  | ||||||
|   background-color: #6d6f78; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .job-item .opt .opt-line ul .show-prompt { |  | ||||||
|   font-size: 20px; |  | ||||||
|   cursor: pointer; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .job-item .remove { |  | ||||||
|   display: none; |  | ||||||
|   position: absolute; |  | ||||||
|   right: 10px; |  | ||||||
|   top: 10px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .job-item:hover .remove { |  | ||||||
|   display: block; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .finish-job-list .animate:hover { |  | ||||||
|   box-shadow: 0 0 10px rgba(71,255,241,0.6); /* 添加阴影效果 */ |  | ||||||
|   transform: translateY(-10px); /* 向上移动10像素 */ |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .el-image { |  | ||||||
|   width: 100%; |  | ||||||
|   height: 100%; |  | ||||||
|   overflow: visible; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .el-image img { |  | ||||||
|   height: 240px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .el-image .el-image-viewer__wrapper img { |  | ||||||
|   width: auto; |  | ||||||
|   height: auto; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .el-image .image-slot { |  | ||||||
|   display: flex; |  | ||||||
|   flex-flow: column; |  | ||||||
|   justify-content: center; |  | ||||||
|   align-items: center; |  | ||||||
|   min-height: 200px; |  | ||||||
|   color: #fff; |  | ||||||
|   height: 240px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .el-image .image-slot .iconfont { |  | ||||||
|   font-size: 50px; |  | ||||||
|   margin-bottom: 10px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .el-image.upscale { |  | ||||||
|   max-height: 310px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .el-image.upscale img { |  | ||||||
|   height: 310px; |  | ||||||
| } |  | ||||||
| .task-list-box .task-list-inner .job-list-box .el-image.upscale .el-image-viewer__wrapper img { |  | ||||||
|   width: auto; |  | ||||||
|   height: auto; |  | ||||||
| } |  | ||||||
| @@ -1,302 +0,0 @@ | |||||||
| .task-list-box { |  | ||||||
|   width 100% |  | ||||||
|   padding 10px |  | ||||||
|   color #ffffff |  | ||||||
|   overflow-x hidden |  | ||||||
|  |  | ||||||
|   .task-list-inner { |  | ||||||
|     .el-tabs { |  | ||||||
|       --el-tabs-header-height: 55px; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .el-tabs__item { |  | ||||||
|       color: #fff; |  | ||||||
|       font-size: 18px; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .title-tabs .el-tabs__item.is-active { |  | ||||||
|       color: #47FFF1; |  | ||||||
|       font-size: 18px; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .title-tabs .el-tabs__active-bar { |  | ||||||
|       background-color: #47FFF1; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .el-textarea { |  | ||||||
|       --el-input-focus-border-color: #47FFF1; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .el-textarea__inner { |  | ||||||
|       background: transparent; |  | ||||||
|       color: #fff; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .el-input__wrapper { |  | ||||||
|       background: transparent; |  | ||||||
|       padding 5px |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .text { |  | ||||||
|       margin-bottom: 10px; |  | ||||||
|       color: #6b778c; |  | ||||||
|       font-size: 15px |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .param-line.pt { |  | ||||||
|       padding-top 5px |  | ||||||
|       padding-bottom 5px |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .form-item-inner { |  | ||||||
|       display flex |  | ||||||
|       align-items: center |  | ||||||
|  |  | ||||||
|       .el-icon { |  | ||||||
|         margin-left 10px |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .el-form-item__label { |  | ||||||
|       color #ffffff |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // 图片上传样式 |  | ||||||
|  |  | ||||||
|     .img-inline { |  | ||||||
|       display flex |  | ||||||
|  |  | ||||||
|       .img-uploader { |  | ||||||
|         .el-upload { |  | ||||||
|           border: 1px dashed var(--el-border-color); |  | ||||||
|           border-radius: 6px; |  | ||||||
|           cursor: pointer; |  | ||||||
|           position: relative; |  | ||||||
|           overflow: hidden; |  | ||||||
|           width 120px; |  | ||||||
|           transition: var(--el-transition-duration-fast); |  | ||||||
|           margin-bottom: 20px; |  | ||||||
|  |  | ||||||
|           &:hover { |  | ||||||
|             border-color: var(--el-color-primary); |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|           .el-icon.uploader-icon { |  | ||||||
|             font-size: 28px |  | ||||||
|             color: #8c939d |  | ||||||
|             width 100% |  | ||||||
|             height: 120px |  | ||||||
|             text-align: center |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       .img-list-box { |  | ||||||
|         display flex |  | ||||||
|  |  | ||||||
|         .img-item { |  | ||||||
|           width 120px |  | ||||||
|           position relative |  | ||||||
|           margin-right 10px |  | ||||||
|  |  | ||||||
|           .el-image { |  | ||||||
|             width 120px |  | ||||||
|             height 120px |  | ||||||
|             border-radius 5px |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|           .el-button { |  | ||||||
|             position absolute |  | ||||||
|             right 5px |  | ||||||
|             top 5px |  | ||||||
|             width 20px |  | ||||||
|             height 20px |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .el-row.text-info { |  | ||||||
|       width 100% |  | ||||||
|       padding 10px 0 |  | ||||||
|  |  | ||||||
|       .el-tag { |  | ||||||
|         margin-right 10px |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // 提交按钮 |  | ||||||
|  |  | ||||||
|     .submit-btn { |  | ||||||
|       display flex |  | ||||||
|       margin: 20px 0 |  | ||||||
|  |  | ||||||
|       .el-button { |  | ||||||
|         width 200px |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     // 任务列表 |  | ||||||
|  |  | ||||||
|     .job-list-box { |  | ||||||
|       .running-job-list { |  | ||||||
|         .job-item { |  | ||||||
|           //border: 1px solid #454545; |  | ||||||
|           width: 100%; |  | ||||||
|           padding 2px |  | ||||||
|           background-color #555555 |  | ||||||
|  |  | ||||||
|           .job-item-inner { |  | ||||||
|             position relative |  | ||||||
|             height 100% |  | ||||||
|             overflow hidden |  | ||||||
|  |  | ||||||
|             .progress { |  | ||||||
|               position absolute |  | ||||||
|               width 100% |  | ||||||
|               height 100% |  | ||||||
|               top 0 |  | ||||||
|               left 0 |  | ||||||
|               display flex |  | ||||||
|               justify-content center |  | ||||||
|               align-items center |  | ||||||
|  |  | ||||||
|               span { |  | ||||||
|                 font-size 20px |  | ||||||
|                 color #ffffff |  | ||||||
|               } |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|       .finish-job-list { |  | ||||||
|         .job-item { |  | ||||||
|           width 100% |  | ||||||
|           height 100% |  | ||||||
|           border 1px solid #666666 |  | ||||||
|           padding 6px |  | ||||||
|           overflow hidden |  | ||||||
|           border-radius 6px |  | ||||||
|           transition: all 0.3s ease; /* 添加过渡效果 */ |  | ||||||
|           position relative |  | ||||||
|  |  | ||||||
|           .opt { |  | ||||||
|             .opt-line { |  | ||||||
|               margin 6px 0 |  | ||||||
|  |  | ||||||
|               ul { |  | ||||||
|                 display flex |  | ||||||
|                 flex-flow row |  | ||||||
|  |  | ||||||
|                 li { |  | ||||||
|                   margin-right 6px |  | ||||||
|  |  | ||||||
|                   a { |  | ||||||
|                     padding 3px 0 |  | ||||||
|                     width 40px |  | ||||||
|                     text-align center |  | ||||||
|                     border-radius 5px |  | ||||||
|                     display block |  | ||||||
|                     cursor pointer |  | ||||||
|                     background-color #4E5058 |  | ||||||
|                     color #ffffff |  | ||||||
|  |  | ||||||
|                     &:hover { |  | ||||||
|                       background-color #6D6F78 |  | ||||||
|                     } |  | ||||||
|                   } |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 .show-prompt { |  | ||||||
|                   font-size 20px |  | ||||||
|                   cursor pointer |  | ||||||
|                 } |  | ||||||
|               } |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|           .remove { |  | ||||||
|             display none |  | ||||||
|             position absolute |  | ||||||
|             right 10px |  | ||||||
|             top 10px |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|           &:hover { |  | ||||||
|             .remove { |  | ||||||
|               display block |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         .animate { |  | ||||||
|           &:hover { |  | ||||||
|             box-shadow: 0 0 10px rgba(71, 255, 241, 0.6); /* 添加阴影效果 */ |  | ||||||
|             transform: translateY(-10px); /* 向上移动10像素 */ |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|       .el-image { |  | ||||||
|         width 100% |  | ||||||
|         height 100% |  | ||||||
|         overflow visible |  | ||||||
|  |  | ||||||
|         img { |  | ||||||
|           height 240px |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         .el-image-viewer__wrapper { |  | ||||||
|           img { |  | ||||||
|             width auto |  | ||||||
|             height auto |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         .image-slot { |  | ||||||
|           display flex |  | ||||||
|           flex-flow column |  | ||||||
|           justify-content center |  | ||||||
|           align-items center |  | ||||||
|           min-height 200px |  | ||||||
|           color #ffffff |  | ||||||
|           height 240px |  | ||||||
|  |  | ||||||
|           .iconfont { |  | ||||||
|             font-size 50px |  | ||||||
|             margin-bottom 10px |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       .el-image.upscale { |  | ||||||
|         img { |  | ||||||
|           height 310px |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         .image-slot { |  | ||||||
|           height 310px |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         .el-image-viewer__wrapper { |  | ||||||
|           img { |  | ||||||
|             width auto |  | ||||||
|             height auto |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .no-more-data { |  | ||||||
|     text-align center |  | ||||||
|     padding 20px |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @@ -1,8 +1,8 @@ | |||||||
| @font-face { | @font-face { | ||||||
|   font-family: "iconfont"; /* Project id 4125778 */ |   font-family: "iconfont"; /* Project id 4125778 */ | ||||||
|   src: url('iconfont.woff2?t=1713766977199') format('woff2'), |   src: url('iconfont.woff2?t=1715987806624') format('woff2'), | ||||||
|        url('iconfont.woff?t=1713766977199') format('woff'), |        url('iconfont.woff?t=1715987806624') format('woff'), | ||||||
|        url('iconfont.ttf?t=1713766977199') format('truetype'); |        url('iconfont.ttf?t=1715987806624') format('truetype'); | ||||||
| } | } | ||||||
|  |  | ||||||
| .iconfont { | .iconfont { | ||||||
| @@ -13,6 +13,42 @@ | |||||||
|   -moz-osx-font-smoothing: grayscale; |   -moz-osx-font-smoothing: grayscale; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .icon-control-simple:before { | ||||||
|  |   content: "\e624"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .icon-mic-bold:before { | ||||||
|  |   content: "\e683"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .icon-mic-thin:before { | ||||||
|  |   content: "\e8c2"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .icon-attachment-cl:before { | ||||||
|  |   content: "\e66a"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .icon-attachment-st:before { | ||||||
|  |   content: "\e63b"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .icon-speaker:before { | ||||||
|  |   content: "\e607"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .icon-clear:before { | ||||||
|  |   content: "\e900"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .icon-bbs:before { | ||||||
|  |   content: "\e623"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .icon-license:before { | ||||||
|  |   content: "\e65a"; | ||||||
|  | } | ||||||
|  |  | ||||||
| .icon-more:before { | .icon-more:before { | ||||||
|   content: "\e63c"; |   content: "\e63c"; | ||||||
| } | } | ||||||
|   | |||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -5,6 +5,69 @@ | |||||||
|   "css_prefix_text": "icon-", |   "css_prefix_text": "icon-", | ||||||
|   "description": "", |   "description": "", | ||||||
|   "glyphs": [ |   "glyphs": [ | ||||||
|  |     { | ||||||
|  |       "icon_id": "12243734", | ||||||
|  |       "name": "control", | ||||||
|  |       "font_class": "control-simple", | ||||||
|  |       "unicode": "e624", | ||||||
|  |       "unicode_decimal": 58916 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "icon_id": "6539424", | ||||||
|  |       "name": "麦克风", | ||||||
|  |       "font_class": "mic-bold", | ||||||
|  |       "unicode": "e683", | ||||||
|  |       "unicode_decimal": 59011 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "icon_id": "1727442", | ||||||
|  |       "name": "213麦克风", | ||||||
|  |       "font_class": "mic-thin", | ||||||
|  |       "unicode": "e8c2", | ||||||
|  |       "unicode_decimal": 59586 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "icon_id": "3730725", | ||||||
|  |       "name": "attach-attachment-cl", | ||||||
|  |       "font_class": "attachment-cl", | ||||||
|  |       "unicode": "e66a", | ||||||
|  |       "unicode_decimal": 58986 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "icon_id": "15748474", | ||||||
|  |       "name": "st-attachment", | ||||||
|  |       "font_class": "attachment-st", | ||||||
|  |       "unicode": "e63b", | ||||||
|  |       "unicode_decimal": 58939 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "icon_id": "1010", | ||||||
|  |       "name": "扬声器", | ||||||
|  |       "font_class": "speaker", | ||||||
|  |       "unicode": "e607", | ||||||
|  |       "unicode_decimal": 58887 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "icon_id": "8094805", | ||||||
|  |       "name": "clear", | ||||||
|  |       "font_class": "clear", | ||||||
|  |       "unicode": "e900", | ||||||
|  |       "unicode_decimal": 59648 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "icon_id": "34803640", | ||||||
|  |       "name": "论坛", | ||||||
|  |       "font_class": "bbs", | ||||||
|  |       "unicode": "e623", | ||||||
|  |       "unicode_decimal": 58915 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "icon_id": "310708", | ||||||
|  |       "name": "license", | ||||||
|  |       "font_class": "license", | ||||||
|  |       "unicode": "e65a", | ||||||
|  |       "unicode_decimal": 58970 | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "icon_id": "1421807", |       "icon_id": "1421807", | ||||||
|       "name": "更多", |       "name": "更多", | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -7,9 +7,9 @@ | |||||||
|  |  | ||||||
|       <div class="chat-item"> |       <div class="chat-item"> | ||||||
|         <div class="content" v-html="content"></div> |         <div class="content" v-html="content"></div> | ||||||
|         <div class="bar" v-if="createdAt !== ''"> |         <div class="bar" v-if="createdAt"> | ||||||
|           <span class="bar-item"><el-icon><Clock/></el-icon> {{ createdAt }}</span> |           <span class="bar-item"><el-icon><Clock/></el-icon> {{ createdAt }}</span> | ||||||
|           <span class="bar-item">Tokens: {{ finalTokens }}</span> |           <!--          <span class="bar-item">Tokens: {{ finalTokens }}</span>--> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|   | |||||||
| @@ -2,67 +2,98 @@ | |||||||
|   <div class="chat-line chat-line-reply"> |   <div class="chat-line chat-line-reply"> | ||||||
|     <div class="chat-line-inner"> |     <div class="chat-line-inner"> | ||||||
|       <div class="chat-icon"> |       <div class="chat-icon"> | ||||||
|         <img :src="icon" alt="ChatGPT"> |         <img :src="data.icon" alt="ChatGPT"> | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|       <div class="chat-item"> |       <div class="chat-item"> | ||||||
|         <div class="content" v-html="content"></div> |         <div class="content" v-html="data.content"></div> | ||||||
|         <div class="bar" v-if="createdAt !== ''"> |         <div class="bar" v-if="data.created_at"> | ||||||
|           <span class="bar-item"><el-icon><Clock/></el-icon> {{ createdAt }}</span> |           <span class="bar-item"><el-icon><Clock/></el-icon> {{ dateFormat(data.created_at) }}</span> | ||||||
|           <span class="bar-item">Tokens: {{ tokens }}</span> |           <!--          <span class="bar-item">Tokens: {{ tokens }}</span>--> | ||||||
|           <el-tooltip |           <span class="bar-item"> | ||||||
|               class="box-item" |               <el-tooltip | ||||||
|               effect="dark" |                   class="box-item" | ||||||
|               content="复制回答" |                   effect="dark" | ||||||
|               placement="bottom" |                   content="复制回答" | ||||||
|           > |                   placement="bottom" | ||||||
|             <el-button type="info" class="copy-reply" :data-clipboard-text="orgContent"> |               > | ||||||
|               <el-icon> |                 <el-icon class="copy-reply" :data-clipboard-text="data.orgContent"> | ||||||
|                 <DocumentCopy/> |                   <DocumentCopy/> | ||||||
|               </el-icon> |                 </el-icon> | ||||||
|             </el-button> |               </el-tooltip> | ||||||
|           </el-tooltip> |             </span> | ||||||
|  |           <span v-if="!readOnly"> | ||||||
|  |             <span class="bar-item" @click="reGenerate(data.prompt)"> | ||||||
|  |             <el-tooltip | ||||||
|  |                 class="box-item" | ||||||
|  |                 effect="dark" | ||||||
|  |                 content="重新生成" | ||||||
|  |                 placement="bottom" | ||||||
|  |             > | ||||||
|  |               <el-icon><Refresh/></el-icon> | ||||||
|  |             </el-tooltip> | ||||||
|  |           </span> | ||||||
|  |  | ||||||
|  |           <span class="bar-item" @click="synthesis(data.orgContent)"> | ||||||
|  |             <el-tooltip | ||||||
|  |                 class="box-item" | ||||||
|  |                 effect="dark" | ||||||
|  |                 content="生成语音朗读" | ||||||
|  |                 placement="bottom" | ||||||
|  |             > | ||||||
|  |               <i class="iconfont icon-speaker"></i> | ||||||
|  |             </el-tooltip> | ||||||
|  |           </span> | ||||||
|  |           </span> | ||||||
|  |           <!--          <span class="bar-item">--> | ||||||
|  |           <!--            <el-dropdown trigger="click">--> | ||||||
|  |           <!--              <span class="el-dropdown-link">--> | ||||||
|  |           <!--                <el-icon><More/></el-icon>--> | ||||||
|  |           <!--              </span>--> | ||||||
|  |           <!--              <template #dropdown>--> | ||||||
|  |           <!--                <el-dropdown-menu>--> | ||||||
|  |           <!--                  <el-dropdown-item :icon="Headset" @click="synthesis(orgContent)">生成语音</el-dropdown-item>--> | ||||||
|  |           <!--                </el-dropdown-menu>--> | ||||||
|  |           <!--              </template>--> | ||||||
|  |           <!--            </el-dropdown>--> | ||||||
|  |           <!--          </span>--> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script> | <script setup> | ||||||
| import {defineComponent} from "vue" | import {Clock, DocumentCopy, Refresh} from "@element-plus/icons-vue"; | ||||||
| import {Clock, DocumentCopy, Position} from "@element-plus/icons-vue"; | import {ElMessage} from "element-plus"; | ||||||
|  | import {dateFormat} from "@/utils/libs"; | ||||||
| export default defineComponent({ | // eslint-disable-next-line no-undef,no-unused-vars | ||||||
|   name: 'ChatReply', | const props = defineProps({ | ||||||
|   components: {Position, Clock, DocumentCopy}, |   data: { | ||||||
|   props: { |     type: Object, | ||||||
|     content: { |     default: {}, | ||||||
|       type: String, |  | ||||||
|       default: '', |  | ||||||
|     }, |  | ||||||
|     orgContent: { |  | ||||||
|       type: String, |  | ||||||
|       default: '', |  | ||||||
|     }, |  | ||||||
|     createdAt: { |  | ||||||
|       type: String, |  | ||||||
|       default: '', |  | ||||||
|     }, |  | ||||||
|     tokens: { |  | ||||||
|       type: Number, |  | ||||||
|       default: 0, |  | ||||||
|     }, |  | ||||||
|     icon: { |  | ||||||
|       type: String, |  | ||||||
|       default: 'images/gpt-icon.png', |  | ||||||
|     } |  | ||||||
|   }, |   }, | ||||||
|   data() { |   readOnly: { | ||||||
|     return { |     type: Boolean, | ||||||
|       finalTokens: this.tokens |     default: false | ||||||
|     } |  | ||||||
|   } |   } | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | const emits = defineEmits(['regen']); | ||||||
|  |  | ||||||
|  | if (!props.data.icon) { | ||||||
|  |   props.data.icon = "images/gpt-icon.png" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const synthesis = (text) => { | ||||||
|  |   console.log(text) | ||||||
|  |   ElMessage.info("语音合成功能暂不可用") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 重新生成 | ||||||
|  | const reGenerate = (prompt) => { | ||||||
|  |   emits('regen', prompt) | ||||||
|  | } | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="stylus"> | <style lang="stylus"> | ||||||
| @@ -218,10 +249,12 @@ export default defineComponent({ | |||||||
|             padding 3px 5px; |             padding 3px 5px; | ||||||
|             margin-right 10px; |             margin-right 10px; | ||||||
|             border-radius 5px; |             border-radius 5px; | ||||||
|  |             cursor pointer | ||||||
|  |  | ||||||
|             .el-icon { |             .el-icon { | ||||||
|               position relative |               position relative | ||||||
|               top 2px; |               top 2px; | ||||||
|  |               cursor pointer | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,13 +1,8 @@ | |||||||
| <template> | <template> | ||||||
|   <el-container class="file-list-box"> |   <el-container class="file-list-box"> | ||||||
|     <el-tooltip class="box-item" effect="dark" content="打开文件管理中心"> |     <a class="file-upload-img" @click="fetchFiles"> | ||||||
|       <el-button class="file-upload-img" @click="fetchFiles"> |       <i class="iconfont icon-attachment-st"></i> | ||||||
|         <el-icon> |     </a> | ||||||
|           <PictureFilled/> |  | ||||||
|         </el-icon> |  | ||||||
|       </el-button> |  | ||||||
|     </el-tooltip> |  | ||||||
|  |  | ||||||
|     <el-dialog |     <el-dialog | ||||||
|         v-model="show" |         v-model="show" | ||||||
|         :close-on-click-modal="true" |         :close-on-click-modal="true" | ||||||
| @@ -58,7 +53,7 @@ | |||||||
| import {ref} from "vue"; | import {ref} from "vue"; | ||||||
| import {ElMessage} from "element-plus"; | import {ElMessage} from "element-plus"; | ||||||
| import {httpGet, httpPost} from "@/utils/http"; | import {httpGet, httpPost} from "@/utils/http"; | ||||||
| import {Delete, PictureFilled, Plus} from "@element-plus/icons-vue"; | import {Delete, Plus} from "@element-plus/icons-vue"; | ||||||
| import {isImage, removeArrayItem} from "@/utils/libs"; | import {isImage, removeArrayItem} from "@/utils/libs"; | ||||||
|  |  | ||||||
| const props = defineProps({ | const props = defineProps({ | ||||||
| @@ -132,11 +127,9 @@ const insertURL = (url) => { | |||||||
|  |  | ||||||
| .file-list-box { | .file-list-box { | ||||||
|   .file-upload-img { |   .file-upload-img { | ||||||
|     padding: 8px 5px; |     .iconfont { | ||||||
|     border-radius: 6px; |       font-size: 24px; | ||||||
|     background: #19c37d; |     } | ||||||
|     color: #fff; |  | ||||||
|     font-size: 20px; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   .el-dialog { |   .el-dialog { | ||||||
|   | |||||||
| @@ -1,19 +1,10 @@ | |||||||
| <template> | <template> | ||||||
|   <div class="list-box" ref="container"> |   <div class="list-box" ref="containerRef"> | ||||||
|     <div class="list-inner"> |     <el-row :gutter="gap"> | ||||||
|       <div |       <el-col v-for="item in items" :key="item.id" :span="span" :style="{marginBottom:gap+'px'} "> | ||||||
|           class="list-item" |         <slot :item="item"></slot> | ||||||
|           v-for="(item, index) in items" |       </el-col> | ||||||
|           :key="index" |     </el-row> | ||||||
|           :style="{width:itemWidth + 'px'}" |  | ||||||
|       > |  | ||||||
|         <div class="item-inner" :style="{padding: gap/2+'px'}"> |  | ||||||
|           <div class="item-wrapper"> |  | ||||||
|             <slot :item="item" :index="index" :width="itemWidth"></slot> |  | ||||||
|           </div> |  | ||||||
|         </div> |  | ||||||
|       </div> |  | ||||||
|     </div> |  | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @@ -29,7 +20,7 @@ const props = defineProps({ | |||||||
|   }, |   }, | ||||||
|   gap: { |   gap: { | ||||||
|     type: Number, |     type: Number, | ||||||
|     default: 12 |     default: 10 | ||||||
|   }, |   }, | ||||||
|   width: { |   width: { | ||||||
|     type: Number, |     type: Number, | ||||||
| @@ -37,45 +28,35 @@ const props = defineProps({ | |||||||
|   } |   } | ||||||
| }); | }); | ||||||
|  |  | ||||||
| const container = ref(null) | const containerRef = ref(null) | ||||||
| const itemWidth = ref(props.width) | const span = ref(12) | ||||||
|  |  | ||||||
| onMounted(() => { | onMounted(() => { | ||||||
|   computeSize() |   calcSpan() | ||||||
| }) | }) | ||||||
|  |  | ||||||
| const computeSize = () => { | const calcSpan = () => { | ||||||
|   const w = container.value.offsetWidth - 10 // 减去滚动条的宽度 |   let cols = Math.floor(containerRef.value.offsetWidth / props.width) | ||||||
|   let cols = Math.floor(w / props.width) |   if (cols >= 12) { | ||||||
|   itemWidth.value = Math.floor(w / cols) |     span.value = 1 | ||||||
| } |     return | ||||||
|  |   } | ||||||
| window.onresize = () => { |   console.log(cols) | ||||||
|   computeSize() |   while (cols > 1) { | ||||||
|  |     if (24 % cols === 0) { | ||||||
|  |       span.value = 24 / cols | ||||||
|  |       return | ||||||
|  |     } | ||||||
|  |     cols -= 1 | ||||||
|  |   } | ||||||
|  |   span.value = 12 | ||||||
| } | } | ||||||
|  | window.onresize = () => calcSpan() | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style scoped lang="stylus"> | <style scoped lang="stylus"> | ||||||
|  |  | ||||||
| .list-box { | .list-box { | ||||||
|  |  | ||||||
|   .list-inner { |  | ||||||
|     display flex |  | ||||||
|     flex-wrap wrap |  | ||||||
|  |  | ||||||
|     .list-item { |  | ||||||
|       .item-inner { |  | ||||||
|         display flex |  | ||||||
|  |  | ||||||
|         .item-wrapper { |  | ||||||
|           height 100% |  | ||||||
|           width 100% |  | ||||||
|           display flex |  | ||||||
|           justify-content center |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| </style> | </style> | ||||||
| @@ -221,7 +221,7 @@ | |||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script setup> | <script setup> | ||||||
| import {computed, ref} from "vue" | import {ref, watch} from "vue" | ||||||
| import {httpGet, httpPost} from "@/utils/http"; | import {httpGet, httpPost} from "@/utils/http"; | ||||||
| import {ElMessage} from "element-plus"; | import {ElMessage} from "element-plus"; | ||||||
| import {setUserToken} from "@/store/session"; | import {setUserToken} from "@/store/session"; | ||||||
| @@ -234,8 +234,9 @@ import {arrayContains} from "@/utils/libs"; | |||||||
| const props = defineProps({ | const props = defineProps({ | ||||||
|   show: Boolean, |   show: Boolean, | ||||||
| }); | }); | ||||||
| const showDialog = computed(() => { | const showDialog = ref(false) | ||||||
|   return props.show | watch(() => props.show, (newValue) => { | ||||||
|  |   showDialog.value = newValue | ||||||
| }) | }) | ||||||
|  |  | ||||||
| const login = ref(true) | const login = ref(true) | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| <template> | <template> | ||||||
|   <div class="user-info" id="user-info"> |   <div class="user-info" id="user-info"> | ||||||
|     <el-form :model="user" label-width="150px"> |     <el-form :model="user" label-width="100px"> | ||||||
|       <el-row> |       <el-row> | ||||||
|         <el-upload |         <el-upload | ||||||
|             class="avatar-uploader" |             class="avatar-uploader" | ||||||
| @@ -26,7 +26,7 @@ | |||||||
|             content="您已经是 VIP 会员" |             content="您已经是 VIP 会员" | ||||||
|             placement="right" |             placement="right" | ||||||
|         > |         > | ||||||
|           <el-image v-if="user.vip" :src="vipImg" style="height: 25px;margin-left: 10px"/> |           <span class="vip-icon"><el-image v-if="user.vip" :src="vipImg" style="height: 25px;margin-left: 10px"/></span> | ||||||
|         </el-tooltip> |         </el-tooltip> | ||||||
|       </el-form-item> |       </el-form-item> | ||||||
|       <el-form-item label="剩余算力"> |       <el-form-item label="剩余算力"> | ||||||
| @@ -37,7 +37,7 @@ | |||||||
|       </el-form-item> |       </el-form-item> | ||||||
|  |  | ||||||
|       <el-row class="opt-line"> |       <el-row class="opt-line"> | ||||||
|         <el-button color="#47fff1" :dark="false" round @click="save">保存</el-button> |         <el-button color="#47fff1" :dark="false" @click="save">保存</el-button> | ||||||
|       </el-row> |       </el-row> | ||||||
|     </el-form> |     </el-form> | ||||||
|   </div> |   </div> | ||||||
| @@ -107,13 +107,18 @@ const save = () => { | |||||||
|  |  | ||||||
| <style lang="stylus" scoped> | <style lang="stylus" scoped> | ||||||
| .user-info { | .user-info { | ||||||
|   padding 20px |   padding 20px 0 | ||||||
|  |  | ||||||
|   .el-row { |   .el-row { | ||||||
|     justify-content center |     justify-content center | ||||||
|     margin-bottom 10px |     margin-bottom 10px | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   .vip-icon { | ||||||
|  |     position relative | ||||||
|  |     top 5px | ||||||
|  |   } | ||||||
|  |  | ||||||
|   .opt-line { |   .opt-line { | ||||||
|     padding-top 20px |     padding-top 20px | ||||||
|  |  | ||||||
|   | |||||||
| @@ -92,9 +92,9 @@ const items = [ | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   { |   { | ||||||
|     icon: 'role', |     icon: 'menu', | ||||||
|     index: '/admin/role', |     index: '/admin/app', | ||||||
|     title: '角色管理', |     title: '应用管理', | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|     icon: 'api-key', |     icon: 'api-key', | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ | |||||||
| import {createApp} from 'vue' | import {createApp} from 'vue' | ||||||
| import ElementPlus from "element-plus" | import ElementPlus from "element-plus" | ||||||
| import "element-plus/dist/index.css" | import "element-plus/dist/index.css" | ||||||
|  | import '@/assets/iconfont/iconfont.css'; | ||||||
| import 'vant/lib/index.css'; | import 'vant/lib/index.css'; | ||||||
| import App from './App.vue' | import App from './App.vue' | ||||||
| import {createPinia} from "pinia"; | import {createPinia} from "pinia"; | ||||||
|   | |||||||
| @@ -46,7 +46,7 @@ const routes = [ | |||||||
|                 component: () => import('@/views/Member.vue'), |                 component: () => import('@/views/Member.vue'), | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|                 name: 'chat-role', |                 name: 'chat-app', | ||||||
|                 path: '/apps', |                 path: '/apps', | ||||||
|                 meta: {title: '应用中心'}, |                 meta: {title: '应用中心'}, | ||||||
|                 component: () => import('@/views/ChatApps.vue'), |                 component: () => import('@/views/ChatApps.vue'), | ||||||
| @@ -81,6 +81,11 @@ const routes = [ | |||||||
|                 meta: {title: 'DALLE-3'}, |                 meta: {title: 'DALLE-3'}, | ||||||
|                 component: () => import('@/views/Dalle.vue'), |                 component: () => import('@/views/Dalle.vue'), | ||||||
|             }, |             }, | ||||||
|  |             { | ||||||
|  |                 name: 'ExternalLink', | ||||||
|  |                 path: '/external', | ||||||
|  |                 component: () => import('@/views/ExternalPage.vue'), | ||||||
|  |             }, | ||||||
|         ] |         ] | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
| @@ -105,7 +110,7 @@ const routes = [ | |||||||
|     { |     { | ||||||
|         path: '/admin/login', |         path: '/admin/login', | ||||||
|         name: 'admin-login', |         name: 'admin-login', | ||||||
|         meta: {title: 'ChatPuls 控制台登录'}, |         meta: {title: 'Geek-AI 控制台登录'}, | ||||||
|         component: () => import('@/views/admin/Login.vue'), |         component: () => import('@/views/admin/Login.vue'), | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
| @@ -113,7 +118,7 @@ const routes = [ | |||||||
|         path: '/admin', |         path: '/admin', | ||||||
|         redirect: '/admin/dashboard', |         redirect: '/admin/dashboard', | ||||||
|         component: () => import("@/views/admin/Home.vue"), |         component: () => import("@/views/admin/Home.vue"), | ||||||
|         meta: {title: 'ChatPuls 管理后台'}, |         meta: {title: 'Geek-AI 控制台'}, | ||||||
|         children: [ |         children: [ | ||||||
|             { |             { | ||||||
|                 path: '/admin/dashboard', |                 path: '/admin/dashboard', | ||||||
| @@ -134,10 +139,10 @@ const routes = [ | |||||||
|                 component: () => import('@/views/admin/Users.vue'), |                 component: () => import('@/views/admin/Users.vue'), | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|                 path: '/admin/role', |                 path: '/admin/app', | ||||||
|                 name: 'admin-role', |                 name: 'admin-app', | ||||||
|                 meta: {title: '角色管理'}, |                 meta: {title: '应用管理'}, | ||||||
|                 component: () => import('@/views/admin/Roles.vue'), |                 component: () => import('@/views/admin/Apps.vue'), | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|                 path: '/admin/apikey', |                 path: '/admin/apikey', | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								web/src/store/sharedata.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								web/src/store/sharedata.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | import {defineStore} from 'pinia'; | ||||||
|  |  | ||||||
|  | export const useSharedStore = defineStore('shared', { | ||||||
|  |     state: () => ({ | ||||||
|  |         showLoginDialog: false | ||||||
|  |     }), | ||||||
|  |     getters: {}, | ||||||
|  |     actions: { | ||||||
|  |         setShowLoginDialog(value) { | ||||||
|  |             this.showLoginDialog = value; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | }); | ||||||
| @@ -1,19 +1,22 @@ | |||||||
| <template> | <template> | ||||||
|   <div> |   <div> | ||||||
|     <div class="page-apps custom-scroll"> |     <div class="page-apps custom-scroll"> | ||||||
|       <div class="title"> |  | ||||||
|         AI 助手应用中心 |  | ||||||
|       </div> |  | ||||||
|       <div class="inner" :style="{height: listBoxHeight + 'px'}"> |       <div class="inner" :style="{height: listBoxHeight + 'px'}"> | ||||||
|         <ItemList :items="list" v-if="list.length > 0" :gap="20" :width="250"> |         <ItemList :items="list" v-if="list.length > 0" :gap="15" :width="300"> | ||||||
|           <template #default="scope"> |           <template #default="scope"> | ||||||
|             <div class="app-item" :style="{width: scope.width+'px'}"> |             <div class="item"> | ||||||
|               <el-image :src="scope.item.icon" fit="cover" :style="{height: scope.width+'px'}"/> |               <div class="image"> | ||||||
|               <div class="title"> |                 <el-image :src="scope.item.icon" fit="cover"/> | ||||||
|                 <span class="name">{{ scope.item.name }}</span> |               </div> | ||||||
|                 <div class="opt"> |  | ||||||
|  |               <div class="inner"> | ||||||
|  |                 <div class="info"> | ||||||
|  |                   <div class="info-title">{{ scope.item.name }}</div> | ||||||
|  |                   <div class="info-text">{{ scope.item.hello_msg }}</div> | ||||||
|  |                 </div> | ||||||
|  |                 <div class="btn"> | ||||||
|                   <div v-if="hasRole(scope.item.key)"> |                   <div v-if="hasRole(scope.item.key)"> | ||||||
|                     <el-button size="small" type="success" @click="useRole(scope.item)">使用</el-button> |                     <el-button size="small" color="#21aa93" @click="useRole(scope.item)">使用</el-button> | ||||||
|                     <el-button size="small" type="danger" @click="updateRole(scope.item,'remove')">移除</el-button> |                     <el-button size="small" type="danger" @click="updateRole(scope.item,'remove')">移除</el-button> | ||||||
|                   </div> |                   </div> | ||||||
|                   <el-button v-else size="small" |                   <el-button v-else size="small" | ||||||
| @@ -26,15 +29,34 @@ | |||||||
|                   </el-button> |                   </el-button> | ||||||
|                 </div> |                 </div> | ||||||
|               </div> |               </div> | ||||||
|               <div class="hello-msg" ref="elements">{{ scope.item.intro }}</div> |  | ||||||
|  |  | ||||||
|             </div> |             </div> | ||||||
|  |             <!--            <div class="app-item">--> | ||||||
|  |             <!--              <el-image :src="scope.item.icon" fit="cover"/>--> | ||||||
|  |             <!--              <div class="title">--> | ||||||
|  |             <!--                <span class="name">{{ scope.item.name }}</span>--> | ||||||
|  |             <!--                <div class="opt">--> | ||||||
|  |             <!--                  <div v-if="hasRole(scope.item.key)">--> | ||||||
|  |             <!--                    <el-button size="small" type="success" @click="useRole(scope.item)">使用</el-button>--> | ||||||
|  |             <!--                    <el-button size="small" type="danger" @click="updateRole(scope.item,'remove')">移除</el-button>--> | ||||||
|  |             <!--                  </div>--> | ||||||
|  |             <!--                  <el-button v-else size="small"--> | ||||||
|  |             <!--                             style="--el-color-primary:#009999"--> | ||||||
|  |             <!--                             @click="updateRole(scope.item, 'add')">--> | ||||||
|  |             <!--                    <el-icon>--> | ||||||
|  |             <!--                      <Plus/>--> | ||||||
|  |             <!--                    </el-icon>--> | ||||||
|  |             <!--                    <span>添加应用</span>--> | ||||||
|  |             <!--                  </el-button>--> | ||||||
|  |             <!--                </div>--> | ||||||
|  |             <!--              </div>--> | ||||||
|  |             <!--              <div class="hello-msg" ref="elements">{{ scope.item.intro }}</div>--> | ||||||
|  |             <!--            </div>--> | ||||||
|           </template> |           </template> | ||||||
|         </ItemList> |         </ItemList> | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|  |  | ||||||
|     </div> |     </div> | ||||||
|     <login-dialog :show="showLoginDialog" @hide="getRoles" @success=""/> |  | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @@ -42,18 +64,18 @@ | |||||||
| import {onMounted, ref} from "vue" | import {onMounted, ref} from "vue" | ||||||
| import {ElMessage} from "element-plus"; | import {ElMessage} from "element-plus"; | ||||||
| import {httpGet, httpPost} from "@/utils/http"; | import {httpGet, httpPost} from "@/utils/http"; | ||||||
| import ItemList from "@/components/ItemList.vue"; |  | ||||||
| import {Plus} from "@element-plus/icons-vue"; |  | ||||||
| import LoginDialog from "@/components/LoginDialog.vue"; |  | ||||||
| import {checkSession} from "@/action/session"; | import {checkSession} from "@/action/session"; | ||||||
| import {arrayContains, removeArrayItem, substr} from "@/utils/libs"; | import {arrayContains, removeArrayItem, substr} from "@/utils/libs"; | ||||||
| import {useRouter} from "vue-router"; | import {useRouter} from "vue-router"; | ||||||
|  | import {useSharedStore} from "@/store/sharedata"; | ||||||
|  | import ItemList from "@/components/ItemList.vue"; | ||||||
|  | import {Plus} from "@element-plus/icons-vue"; | ||||||
|  |  | ||||||
| const listBoxHeight = window.innerHeight - 97 | const listBoxHeight = window.innerHeight - 87 | ||||||
| const list = ref([]) | const list = ref([]) | ||||||
| const showLoginDialog = ref(false) |  | ||||||
| const roles = ref([]) | const roles = ref([]) | ||||||
| const elements = ref(null) | const store = useSharedStore(); | ||||||
|  |  | ||||||
| onMounted(() => { | onMounted(() => { | ||||||
|   httpGet("/api/role/list?all=true").then((res) => { |   httpGet("/api/role/list?all=true").then((res) => { | ||||||
|     const items = res.data |     const items = res.data | ||||||
| @@ -70,7 +92,6 @@ onMounted(() => { | |||||||
| }) | }) | ||||||
|  |  | ||||||
| const getRoles = () => { | const getRoles = () => { | ||||||
|   showLoginDialog.value = false |  | ||||||
|   checkSession().then(user => { |   checkSession().then(user => { | ||||||
|     roles.value = user.chat_roles |     roles.value = user.chat_roles | ||||||
|   }).catch(() => { |   }).catch(() => { | ||||||
| @@ -101,7 +122,7 @@ const updateRole = (row, opt) => { | |||||||
|       ElMessage.error(title.value + "失败:" + e.message) |       ElMessage.error(title.value + "失败:" + e.message) | ||||||
|     }) |     }) | ||||||
|   }).catch(() => { |   }).catch(() => { | ||||||
|     showLoginDialog.value = true |     store.setShowLoginDialog(true) | ||||||
|   }) |   }) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user