diff --git a/api/handler/chatimpl/chat_handler.go b/api/handler/chatimpl/chat_handler.go index 11595c57..2ce9950c 100644 --- a/api/handler/chatimpl/chat_handler.go +++ b/api/handler/chatimpl/chat_handler.go @@ -435,7 +435,7 @@ func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, platf apiURL = strings.Replace(apiKey.ApiURL, "{model}", req.Model, 1) break default: - if req.Model == "gpt-4-all" { + if req.Model == "gpt-4-all" || strings.HasPrefix(req.Model, "gpt-4-gizmo-g-") { apiURL = "https://gpt.bemore.lol/v1/chat/completions" } else { apiURL = apiKey.ApiURL diff --git a/api/handler/payment_handler.go b/api/handler/payment_handler.go index 9e158012..09a18085 100644 --- a/api/handler/payment_handler.go +++ b/api/handler/payment_handler.go @@ -329,7 +329,7 @@ func (h *PaymentHandler) notify(orderNo string) error { user.ImgCalls += remark.ImgCalls } - } else { // 非 VIP 用户 + } else { // 非 VIP 用户 if remark.Days > 0 { // vip 套餐:days > 0, calls == 0 user.ExpiredTime = time.Now().AddDate(0, 0, remark.Days).Unix() user.Calls += h.App.SysConfig.VipMonthCalls diff --git a/api/handler/upload_handler.go b/api/handler/upload_handler.go index e7cb7cfd..62f508a3 100644 --- a/api/handler/upload_handler.go +++ b/api/handler/upload_handler.go @@ -21,11 +21,11 @@ func NewUploadHandler(app *core.AppServer, db *gorm.DB, manager *oss.UploaderMan } func (h *UploadHandler) Upload(c *gin.Context) { - fileURL, err := h.uploaderManager.GetUploadHandler().PutFile(c, "file") + file, err := h.uploaderManager.GetUploadHandler().PutFile(c, "file") if err != nil { resp.ERROR(c, err.Error()) return } - resp.SUCCESS(c, fileURL) + resp.SUCCESS(c, file) } diff --git a/api/service/oss/aliyun_oss.go b/api/service/oss/aliyun_oss.go index a44b3547..35ea314d 100644 --- a/api/service/oss/aliyun_oss.go +++ b/api/service/oss/aliyun_oss.go @@ -44,16 +44,16 @@ func NewAliYunOss(appConfig *types.AppConfig) (*AliYunOss, error) { } -func (s AliYunOss) PutFile(ctx *gin.Context, name string) (string, error) { +func (s AliYunOss) PutFile(ctx *gin.Context, name string) (File, error) { // 解析表单 file, err := ctx.FormFile(name) if err != nil { - return "", err + return File{}, err } // 打开上传文件 src, err := file.Open() if err != nil { - return "", err + return File{}, err } defer src.Close() @@ -62,10 +62,14 @@ func (s AliYunOss) PutFile(ctx *gin.Context, name string) (string, error) { // 上传文件 err = s.bucket.PutObject(objectKey, src) if err != nil { - return "", err + return File{}, err } - return fmt.Sprintf("%s/%s", s.config.Domain, objectKey), nil + return File{ + URL: fmt.Sprintf("%s/%s", s.config.Domain, objectKey), + Ext: fileExt, + Size: file.Size, + }, nil } func (s AliYunOss) PutImg(imageURL string, useProxy bool) (string, error) { diff --git a/api/service/oss/localstorage.go b/api/service/oss/localstorage.go index fac4fc11..7536dab3 100644 --- a/api/service/oss/localstorage.go +++ b/api/service/oss/localstorage.go @@ -23,23 +23,28 @@ func NewLocalStorage(config *types.AppConfig) LocalStorage { } } -func (s LocalStorage) PutFile(ctx *gin.Context, name string) (string, error) { +func (s LocalStorage) PutFile(ctx *gin.Context, name string) (File, error) { file, err := ctx.FormFile(name) if err != nil { - return "", fmt.Errorf("error with get form: %v", err) + return File{}, fmt.Errorf("error with get form: %v", err) } - filePath, err := utils.GenUploadPath(s.config.BasePath, file.Filename) + path, err := utils.GenUploadPath(s.config.BasePath, file.Filename) if err != nil { - return "", fmt.Errorf("error with generate filename: %s", err.Error()) + return File{}, fmt.Errorf("error with generate filename: %s", err.Error()) } // 将文件保存到指定路径 - err = ctx.SaveUploadedFile(file, filePath) + err = ctx.SaveUploadedFile(file, path) if err != nil { - return "", fmt.Errorf("error with save upload file: %s", err.Error()) + return File{}, fmt.Errorf("error with save upload file: %s", err.Error()) } - return utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, filePath), nil + ext := filepath.Ext(file.Filename) + return File{ + URL: utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, path), + Ext: ext, + Size: file.Size, + }, nil } func (s LocalStorage) PutImg(imageURL string, useProxy bool) (string, error) { diff --git a/api/service/oss/minio_oss.go b/api/service/oss/minio_oss.go index fcd34c27..d9e16e47 100644 --- a/api/service/oss/minio_oss.go +++ b/api/service/oss/minio_oss.go @@ -65,15 +65,15 @@ func (s MiniOss) PutImg(imageURL string, useProxy bool) (string, error) { return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil } -func (s MiniOss) PutFile(ctx *gin.Context, name string) (string, error) { +func (s MiniOss) PutFile(ctx *gin.Context, name string) (File, error) { file, err := ctx.FormFile(name) if err != nil { - return "", fmt.Errorf("error with get form: %v", err) + return File{}, fmt.Errorf("error with get form: %v", err) } // Open the uploaded file fileReader, err := file.Open() if err != nil { - return "", fmt.Errorf("error opening file: %v", err) + return File{}, fmt.Errorf("error opening file: %v", err) } defer fileReader.Close() @@ -83,10 +83,14 @@ func (s MiniOss) PutFile(ctx *gin.Context, name string) (string, error) { ContentType: file.Header.Get("Content-Type"), }) if err != nil { - return "", fmt.Errorf("error uploading to MinIO: %v", err) + return File{}, fmt.Errorf("error uploading to MinIO: %v", err) } - return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil + return File{ + URL: fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), + Ext: fileExt, + Size: file.Size, + }, nil } func (s MiniOss) Delete(fileURL string) error { diff --git a/api/service/oss/qiniu_oss.go b/api/service/oss/qiniu_oss.go index dd605aec..cf7789d1 100644 --- a/api/service/oss/qiniu_oss.go +++ b/api/service/oss/qiniu_oss.go @@ -50,16 +50,16 @@ func NewQiNiuOss(appConfig *types.AppConfig) QinNiuOss { } } -func (s QinNiuOss) PutFile(ctx *gin.Context, name string) (string, error) { +func (s QinNiuOss) PutFile(ctx *gin.Context, name string) (File, error) { // 解析表单 file, err := ctx.FormFile(name) if err != nil { - return "", err + return File{}, err } // 打开上传文件 src, err := file.Open() if err != nil { - return "", err + return File{}, err } defer src.Close() @@ -70,10 +70,15 @@ func (s QinNiuOss) PutFile(ctx *gin.Context, name string) (string, error) { extra := storage.PutExtra{} err = s.uploader.Put(ctx, &ret, s.putPolicy.UploadToken(s.mac), key, src, file.Size, &extra) if err != nil { - return "", err + return File{}, err } - return fmt.Sprintf("%s/%s", s.config.Domain, ret.Key), nil + return File{ + URL: fmt.Sprintf("%s/%s", s.config.Domain, ret.Key), + Ext: fileExt, + Size: file.Size, + }, nil + } func (s QinNiuOss) PutImg(imageURL string, useProxy bool) (string, error) { diff --git a/api/service/oss/uploader.go b/api/service/oss/uploader.go index f484c467..0861e09a 100644 --- a/api/service/oss/uploader.go +++ b/api/service/oss/uploader.go @@ -2,8 +2,13 @@ package oss import "github.com/gin-gonic/gin" +type File struct { + Size int64 + URL string + Ext string +} type Uploader interface { - PutFile(ctx *gin.Context, name string) (string, error) + PutFile(ctx *gin.Context, name string) (File, error) PutImg(imageURL string, useProxy bool) (string, error) Delete(fileURL string) error } diff --git a/api/store/model/file.go b/api/store/model/file.go new file mode 100644 index 00000000..24ed0d06 --- /dev/null +++ b/api/store/model/file.go @@ -0,0 +1,12 @@ +package model + +import "time" + +type File struct { + Id uint `gorm:"primarykey;column:id"` + UserId uint + URL string + Ext string + Size int64 + CreatedAt time.Time +} diff --git a/api/store/vo/File.go b/api/store/vo/File.go new file mode 100644 index 00000000..1127bd6b --- /dev/null +++ b/api/store/vo/File.go @@ -0,0 +1,10 @@ +package vo + +type File struct { + Id uint + UserId uint `json:"user_id"` + URL string `json:"url"` + Ext string `json:"ext"` + Size int64 `json:"size"` + CreatedAt int64 `json:"created_at"` +} diff --git a/database/update-v3.2.5.sql b/database/update-v3.2.5.sql index 7aff250a..5c80c025 100644 --- a/database/update-v3.2.5.sql +++ b/database/update-v3.2.5.sql @@ -1,2 +1,12 @@ ALTER TABLE `chatgpt_orders` CHANGE `mobile` `username` VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户明'; -ALTER TABLE `chatgpt_invite_logs` CHANGE `username` `username` VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名'; \ No newline at end of file +ALTER TABLE `chatgpt_invite_logs` CHANGE `username` `username` VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名'; + +CREATE TABLE `chatgpt_plus`.`chatgpt_files` ( + `id` INT(11) NOT NULL AUTO_INCREMENT , + `user_id` INT(11) NOT NULL COMMENT '用户 ID' , + `url` VARCHAR(255) NOT NULL COMMENT '文件地址' , + `ext` VARCHAR(10) NOT NULL COMMENT '文件后缀' , + `created_at` DATETIME NOT NULL COMMENT '创建时间' , + PRIMARY KEY (`id`)) ENGINE = InnoDB COMMENT = '用户文件表'; + +ALTER TABLE `chatgpt_files` ADD `size` BIGINT(20) NOT NULL DEFAULT '0' COMMENT '文件大小' AFTER `ext`; \ No newline at end of file diff --git a/web/src/components/UserProfile.vue b/web/src/components/UserProfile.vue index 8c5c5b62..105fd0b6 100644 --- a/web/src/components/UserProfile.vue +++ b/web/src/components/UserProfile.vue @@ -93,7 +93,7 @@ const afterRead = (file) => { formData.append('file', result, result.name); // 执行上传操作 httpPost('/api/upload', formData).then((res) => { - user.value.avatar = res.data + user.value.avatar = res.data.url ElMessage.success({message: "上传成功", duration: 500}) }).catch((e) => { ElMessage.error('图片上传失败:' + e.message) diff --git a/web/src/views/ImageMj.vue b/web/src/views/ImageMj.vue index c81fce86..25ddbf7b 100644 --- a/web/src/views/ImageMj.vue +++ b/web/src/views/ImageMj.vue @@ -668,7 +668,7 @@ const afterRead = (file) => { formData.append('file', result, result.name); // 执行上传操作 httpPost('/api/upload', formData).then((res) => { - params.value.img = res.data + params.value.img = res.data.url ElMessage.success('上传成功') }).catch((e) => { ElMessage.error('上传失败:' + e.message) diff --git a/web/src/views/admin/SysConfig.vue b/web/src/views/admin/SysConfig.vue index e47e63df..175e91a2 100644 --- a/web/src/views/admin/SysConfig.vue +++ b/web/src/views/admin/SysConfig.vue @@ -316,7 +316,7 @@ const uploadRewardImg = (file) => { formData.append('file', result, result.name); // 执行上传操作 httpPost('/api/upload', formData).then((res) => { - system.value['reward_img'] = res.data + system.value['reward_img'] = res.data.url ElMessage.success('上传成功') }).catch((e) => { ElMessage.error('上传失败:' + e.message)