diff --git a/api/core/types/config.go b/api/core/types/config.go
index ebb69708..99dc4838 100644
--- a/api/core/types/config.go
+++ b/api/core/types/config.go
@@ -150,7 +150,8 @@ type SystemConfig struct {
Models []string `json:"models"`
InitChatCalls int `json:"init_chat_calls"` // 新用户注册赠送对话次数
InitImgCalls int `json:"init_img_calls"` // 新用户注册赠送绘图次数
- VipMonthCalls int `json:"vip_month_calls"` // 会员每个赠送的调用次数
+ VipMonthCalls int `json:"vip_month_calls"` // VIP 会员每月赠送的对话次数
+ VipMonthImgCalls int `json:"vip_month_img_calls"` // VIP 会员每月赠送绘图次数
EnabledRegister bool `json:"enabled_register"` // 是否启用注册功能,关闭注册功能之后将无法注册
EnabledMsg bool `json:"enabled_msg"` // 是否启用短信验证码服务
RewardImg string `json:"reward_img"` // 众筹收款二维码地址
diff --git a/api/core/types/order.go b/api/core/types/order.go
index 433580a1..55c19a1c 100644
--- a/api/core/types/order.go
+++ b/api/core/types/order.go
@@ -9,9 +9,10 @@ const (
)
type OrderRemark struct {
- Days int `json:"days"` // 有效期
- Calls int `json:"calls"` // 增加调用次数
- Name string `json:"name"` // 产品名称
+ Days int `json:"days"` // 有效期
+ Calls int `json:"calls"` // 增加对话次数
+ ImgCalls int `json:"img_calls"` // 增加绘图次数
+ Name string `json:"name"` // 产品名称
Price float64 `json:"price"`
Discount float64 `json:"discount"`
}
diff --git a/api/handler/admin/product_handler.go b/api/handler/admin/product_handler.go
index 2c6d8df4..11fa66e5 100644
--- a/api/handler/admin/product_handler.go
+++ b/api/handler/admin/product_handler.go
@@ -33,6 +33,7 @@ func (h *ProductHandler) Save(c *gin.Context) {
Enabled bool `json:"enabled"`
Days int `json:"days"`
Calls int `json:"calls"`
+ ImgCalls int `json:"img_calls"`
CreatedAt int64 `json:"created_at"`
}
if err := c.ShouldBindJSON(&data); err != nil {
@@ -40,7 +41,14 @@ func (h *ProductHandler) Save(c *gin.Context) {
return
}
- item := model.Product{Name: data.Name, Price: data.Price, Discount: data.Discount, Days: data.Days, Calls: data.Calls, Enabled: data.Enabled}
+ item := model.Product{
+ Name: data.Name,
+ Price: data.Price,
+ Discount: data.Discount,
+ Days: data.Days,
+ Calls: data.Calls,
+ ImgCalls: data.ImgCalls,
+ Enabled: data.Enabled}
item.Id = data.Id
if item.Id > 0 {
item.CreatedAt = time.Unix(data.CreatedAt, 0)
diff --git a/api/handler/payment_handler.go b/api/handler/payment_handler.go
index 1b819024..a7561a8d 100644
--- a/api/handler/payment_handler.go
+++ b/api/handler/payment_handler.go
@@ -196,6 +196,7 @@ func (h *PaymentHandler) PayQrcode(c *gin.Context) {
remark := types.OrderRemark{
Days: product.Days,
Calls: product.Calls,
+ ImgCalls: product.ImgCalls,
Name: product.Name,
Price: product.Price,
Discount: product.Discount,
@@ -330,6 +331,12 @@ func (h *PaymentHandler) notify(orderNo string) error {
user.Calls += h.App.SysConfig.VipMonthCalls
}
+ if remark.ImgCalls > 0 {
+ user.ImgCalls += remark.ImgCalls
+ } else {
+ user.ImgCalls += h.App.SysConfig.VipMonthImgCalls
+ }
+
// 更新用户信息
res = h.db.Updates(&user)
if res.Error != nil {
diff --git a/api/service/mj/pool.go b/api/service/mj/pool.go
index efcd853e..179373d6 100644
--- a/api/service/mj/pool.go
+++ b/api/service/mj/pool.go
@@ -28,7 +28,7 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa
name := fmt.Sprintf("MjService-%d", k)
// create mj service
- service := NewService(name, queue, 4, 600, db, client, manager, appConfig)
+ service := NewService(name, queue, 4, 600, db, client, manager, appConfig.ProxyURL)
botName := fmt.Sprintf("MjBot-%d", k)
bot, err := NewBot(botName, appConfig.ProxyURL, &config, service)
if err != nil {
diff --git a/api/service/mj/service.go b/api/service/mj/service.go
index 754966e5..c3437a88 100644
--- a/api/service/mj/service.go
+++ b/api/service/mj/service.go
@@ -25,7 +25,7 @@ type Service struct {
taskTimeout int64
}
-func NewService(name string, queue *store.RedisQueue, maxTaskNum int32, timeout int64, db *gorm.DB, client *Client, manager *oss.UploaderManager, config *types.AppConfig) *Service {
+func NewService(name string, queue *store.RedisQueue, maxTaskNum int32, timeout int64, db *gorm.DB, client *Client, manager *oss.UploaderManager, proxy string) *Service {
return &Service{
name: name,
db: db,
@@ -34,7 +34,7 @@ func NewService(name string, queue *store.RedisQueue, maxTaskNum int32, timeout
uploadManager: manager,
taskTimeout: timeout,
maxHandleTaskNum: maxTaskNum,
- proxyURL: config.ProxyURL,
+ proxyURL: proxy,
taskStartTimes: make(map[int]time.Time, 0),
}
}
diff --git a/api/service/xxl_job_service.go b/api/service/xxl_job_service.go
index b8982053..5ff11462 100644
--- a/api/service/xxl_job_service.go
+++ b/api/service/xxl_job_service.go
@@ -101,30 +101,39 @@ func (e *XXLJobExecutor) ResetVipCalls(cxt context.Context, param *xxl.RunReq) (
u.Vip = false
} else {
if u.Calls <= 0 {
- u.Calls = config.VipMonthCalls
- } else {
- // 如果该用户当月有充值点卡,则将点卡中未用完的点数结余到下个月
- var orders []model.Order
- e.db.Debug().Where("user_id = ? AND pay_time > ?", u.Id, firstOfMonth).Find(&orders)
- var calls = 0
- for _, o := range orders {
- var remark types.OrderRemark
- err = utils.JsonDecode(o.Remark, &remark)
- if err != nil {
- continue
- }
- if remark.Days > 0 { // 会员续费
- continue
- }
- calls += remark.Calls
- }
- if u.Calls > calls { // 本月套餐没有用完
- u.Calls = calls + config.VipMonthCalls
- } else {
- u.Calls = u.Calls + config.VipMonthCalls
- }
- logger.Infof("%s 点卡结余:%d", u.Mobile, calls)
+ u.Calls = 0
}
+ if u.ImgCalls <= 0 {
+ u.ImgCalls = 0
+ }
+ // 如果该用户当月有充值点卡,则将点卡中未用完的点数结余到下个月
+ var orders []model.Order
+ e.db.Debug().Where("user_id = ? AND pay_time > ?", u.Id, firstOfMonth).Find(&orders)
+ var calls = 0
+ var imgCalls = 0
+ for _, o := range orders {
+ var remark types.OrderRemark
+ err = utils.JsonDecode(o.Remark, &remark)
+ if err != nil {
+ continue
+ }
+ if remark.Days > 0 { // 会员续费
+ continue
+ }
+ calls += remark.Calls
+ imgCalls += remark.ImgCalls
+ }
+ if u.Calls > calls { // 本月套餐没有用完
+ u.Calls = calls + config.VipMonthCalls
+ } else {
+ u.Calls = u.Calls + config.VipMonthCalls
+ }
+ if u.ImgCalls > imgCalls { // 本月套餐没有用完
+ u.ImgCalls = imgCalls + config.VipMonthImgCalls
+ } else {
+ u.ImgCalls = u.ImgCalls + config.VipMonthImgCalls
+ }
+ logger.Infof("%s 点卡结余:%d", u.Mobile, calls)
}
u.Tokens = 0
// update user
diff --git a/api/store/model/product.go b/api/store/model/product.go
index 040f715a..b89c4db6 100644
--- a/api/store/model/product.go
+++ b/api/store/model/product.go
@@ -8,6 +8,7 @@ type Product struct {
Discount float64
Days int
Calls int
+ ImgCalls int
Enabled bool
Sales int
SortNum int
diff --git a/api/store/vo/product.go b/api/store/vo/product.go
index b0a867d3..83b40df1 100644
--- a/api/store/vo/product.go
+++ b/api/store/vo/product.go
@@ -7,6 +7,7 @@ type Product struct {
Discount float64 `json:"discount"`
Days int `json:"days"`
Calls int `json:"calls"`
+ ImgCalls int `json:"img_calls"`
Enabled bool `json:"enabled"`
Sales int `json:"sales"`
SortNum int `json:"sort_num"`
diff --git a/database/update-v3.2.3.sql b/database/update-v3.2.3.sql
new file mode 100644
index 00000000..addb50a0
--- /dev/null
+++ b/database/update-v3.2.3.sql
@@ -0,0 +1 @@
+ALTER TABLE `chatgpt_products` ADD `img_calls` INT(11) NOT NULL DEFAULT '0' COMMENT '绘图次数' AFTER `calls`;
\ No newline at end of file
diff --git a/web/src/components/UserOrder.vue b/web/src/components/UserOrder.vue
index b715da76..5a195104 100644
--- a/web/src/components/UserOrder.vue
+++ b/web/src/components/UserOrder.vue
@@ -17,11 +17,16 @@
-
+
{{ scope.row.remark?.calls }}
+
+
+ {{ scope.row.remark?.img_calls ?? 0 }}
+
+
diff --git a/web/src/views/admin/Product.vue b/web/src/views/admin/Product.vue
index 0543a7a1..1bbce89f 100644
--- a/web/src/views/admin/Product.vue
+++ b/web/src/views/admin/Product.vue
@@ -9,7 +9,7 @@
- {{scope.row.name}}
+ {{ scope.row.name }}
@@ -17,10 +17,11 @@
长期有效
- {{scope.row.days}}
+ {{ scope.row.days }}
-
+
+
@@ -69,8 +70,12 @@
-
-
+
+
+
+
+
+
@@ -140,13 +145,13 @@ onMounted(() => {
const sortedData = Array.from(from.children).map(row => row.querySelector('.sort').getAttribute('data-id'));
const ids = []
const sorts = []
- sortedData.forEach((id,index) => {
+ sortedData.forEach((id, index) => {
ids.push(parseInt(id))
sorts.push(index)
})
- httpPost("/api/admin/product/sort", {ids: ids, sorts:sorts}).catch(e => {
- ElMessage.error("排序失败:"+e.message)
+ httpPost("/api/admin/product/sort", {ids: ids, sorts: sorts}).catch(e => {
+ ElMessage.error("排序失败:" + e.message)
})
}
})
@@ -189,7 +194,7 @@ const enable = (row) => {
httpPost('/api/admin/product/enable', {id: row.id, enabled: row.enabled}).then(() => {
ElMessage.success("操作成功!")
}).catch(e => {
- ElMessage.error("操作失败:"+e.message)
+ ElMessage.error("操作失败:" + e.message)
})
}
diff --git a/web/src/views/admin/SysConfig.vue b/web/src/views/admin/SysConfig.vue
index 2eddff5a..42ec4649 100644
--- a/web/src/views/admin/SysConfig.vue
+++ b/web/src/views/admin/SysConfig.vue
@@ -24,6 +24,9 @@
+
+
+