mirror of
				https://github.com/yangjian102621/geekai.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	remove license code
This commit is contained in:
		@@ -4,24 +4,21 @@ import (
 | 
				
			|||||||
	"chatplus/core"
 | 
						"chatplus/core"
 | 
				
			||||||
	"chatplus/core/types"
 | 
						"chatplus/core/types"
 | 
				
			||||||
	"chatplus/handler"
 | 
						"chatplus/handler"
 | 
				
			||||||
	"chatplus/service"
 | 
					 | 
				
			||||||
	"chatplus/store"
 | 
						"chatplus/store"
 | 
				
			||||||
	"chatplus/store/model"
 | 
						"chatplus/store/model"
 | 
				
			||||||
	"chatplus/utils"
 | 
						"chatplus/utils"
 | 
				
			||||||
	"chatplus/utils/resp"
 | 
						"chatplus/utils/resp"
 | 
				
			||||||
	"github.com/gin-gonic/gin"
 | 
						"github.com/gin-gonic/gin"
 | 
				
			||||||
	"github.com/shirou/gopsutil/host"
 | 
					 | 
				
			||||||
	"gorm.io/gorm"
 | 
						"gorm.io/gorm"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ConfigHandler struct {
 | 
					type ConfigHandler struct {
 | 
				
			||||||
	handler.BaseHandler
 | 
						handler.BaseHandler
 | 
				
			||||||
	levelDB        *store.LevelDB
 | 
						levelDB *store.LevelDB
 | 
				
			||||||
	licenseService *service.LicenseService
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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) *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}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (h *ConfigHandler) Update(c *gin.Context) {
 | 
					func (h *ConfigHandler) Update(c *gin.Context) {
 | 
				
			||||||
@@ -91,27 +88,3 @@ func (h *ConfigHandler) Get(c *gin.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	resp.SUCCESS(c, value)
 | 
						resp.SUCCESS(c, value)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Active 激活系统
 | 
					 | 
				
			||||||
func (h *ConfigHandler) Active(c *gin.Context) {
 | 
					 | 
				
			||||||
	var data struct {
 | 
					 | 
				
			||||||
		License string `json:"license"`
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := c.ShouldBindJSON(&data); err != nil {
 | 
					 | 
				
			||||||
		resp.ERROR(c, types.InvalidArgs)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info, err := host.Info()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		resp.ERROR(c, err.Error())
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	err = h.licenseService.ActiveLicense(data.License, info.HostID)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		resp.ERROR(c, err.Error())
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	resp.SUCCESS(c, info.HostID)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
	"chatplus/core/types"
 | 
						"chatplus/core/types"
 | 
				
			||||||
	"chatplus/handler"
 | 
						"chatplus/handler"
 | 
				
			||||||
	logger2 "chatplus/logger"
 | 
						logger2 "chatplus/logger"
 | 
				
			||||||
	"chatplus/service"
 | 
					 | 
				
			||||||
	"chatplus/service/oss"
 | 
						"chatplus/service/oss"
 | 
				
			||||||
	"chatplus/store/model"
 | 
						"chatplus/store/model"
 | 
				
			||||||
	"chatplus/store/vo"
 | 
						"chatplus/store/vo"
 | 
				
			||||||
@@ -36,17 +35,15 @@ var logger = logger2.GetLogger()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type ChatHandler struct {
 | 
					type ChatHandler struct {
 | 
				
			||||||
	handler.BaseHandler
 | 
						handler.BaseHandler
 | 
				
			||||||
	redis          *redis.Client
 | 
						redis         *redis.Client
 | 
				
			||||||
	uploadManager  *oss.UploaderManager
 | 
						uploadManager *oss.UploaderManager
 | 
				
			||||||
	licenseService *service.LicenseService
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewChatHandler(app *core.AppServer, db *gorm.DB, redis *redis.Client, manager *oss.UploaderManager, licenseService *service.LicenseService) *ChatHandler {
 | 
					func NewChatHandler(app *core.AppServer, db *gorm.DB, redis *redis.Client, manager *oss.UploaderManager) *ChatHandler {
 | 
				
			||||||
	return &ChatHandler{
 | 
						return &ChatHandler{
 | 
				
			||||||
		BaseHandler:    handler.BaseHandler{App: app, DB: db},
 | 
							BaseHandler:   handler.BaseHandler{App: app, DB: db},
 | 
				
			||||||
		redis:          redis,
 | 
							redis:         redis,
 | 
				
			||||||
		uploadManager:  manager,
 | 
							uploadManager: manager,
 | 
				
			||||||
		licenseService: licenseService,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -482,14 +479,6 @@ func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, sessi
 | 
				
			|||||||
		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
 | 
					 | 
				
			||||||
	if session.Model.Platform == types.OpenAI {
 | 
					 | 
				
			||||||
		err := h.licenseService.IsValidApiURL(apiKey.ApiURL)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var apiURL string
 | 
						var apiURL string
 | 
				
			||||||
	switch session.Model.Platform {
 | 
						switch session.Model.Platform {
 | 
				
			||||||
	case types.Azure:
 | 
						case types.Azure:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -164,8 +164,6 @@ func main() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// 邮件服务
 | 
							// 邮件服务
 | 
				
			||||||
		fx.Provide(service.NewSmtpService),
 | 
							fx.Provide(service.NewSmtpService),
 | 
				
			||||||
		// License 服务
 | 
					 | 
				
			||||||
		fx.Provide(service.NewLicenseService),
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// 微信机器人服务
 | 
							// 微信机器人服务
 | 
				
			||||||
		fx.Provide(wx.NewWeChatBot),
 | 
							fx.Provide(wx.NewWeChatBot),
 | 
				
			||||||
@@ -290,7 +288,6 @@ func main() {
 | 
				
			|||||||
			group := s.Engine.Group("/api/admin/")
 | 
								group := s.Engine.Group("/api/admin/")
 | 
				
			||||||
			group.POST("config/update", h.Update)
 | 
								group.POST("config/update", h.Update)
 | 
				
			||||||
			group.GET("config/get", h.Get)
 | 
								group.GET("config/get", h.Get)
 | 
				
			||||||
			group.POST("active", h.Active)
 | 
					 | 
				
			||||||
		}),
 | 
							}),
 | 
				
			||||||
		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/")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,108 +0,0 @@
 | 
				
			|||||||
package service
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"chatplus/core"
 | 
					 | 
				
			||||||
	"chatplus/core/types"
 | 
					 | 
				
			||||||
	"chatplus/store"
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"github.com/imroc/req/v3"
 | 
					 | 
				
			||||||
	"github.com/shirou/gopsutil/host"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type LicenseService struct {
 | 
					 | 
				
			||||||
	config types.ApiConfig
 | 
					 | 
				
			||||||
	levelDB *store.LevelDB
 | 
					 | 
				
			||||||
	license types.License
 | 
					 | 
				
			||||||
	machineId string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewLicenseService(server *core.AppServer, levelDB *store.LevelDB) * LicenseService {
 | 
					 | 
				
			||||||
	var license types.License
 | 
					 | 
				
			||||||
	var machineId string
 | 
					 | 
				
			||||||
	_ = levelDB.Get(types.LicenseKey, &license)
 | 
					 | 
				
			||||||
	info, err := host.Info()
 | 
					 | 
				
			||||||
	if err == nil {
 | 
					 | 
				
			||||||
		machineId = info.HostID
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return &LicenseService{
 | 
					 | 
				
			||||||
		config: server.Config.ApiConfig,
 | 
					 | 
				
			||||||
		levelDB: levelDB,
 | 
					 | 
				
			||||||
		license: license,
 | 
					 | 
				
			||||||
		machineId: machineId,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ActiveLicense 激活 License
 | 
					 | 
				
			||||||
func (s *LicenseService) ActiveLicense(license string, machineId string) error {
 | 
					 | 
				
			||||||
	var res struct {
 | 
					 | 
				
			||||||
		Code    types.BizCode `json:"code"`
 | 
					 | 
				
			||||||
		Message string        `json:"message"`
 | 
					 | 
				
			||||||
		Data    struct {
 | 
					 | 
				
			||||||
			Name      string `json:"name"`
 | 
					 | 
				
			||||||
			License   string `json:"license"`
 | 
					 | 
				
			||||||
			Mid       string `json:"mid"`
 | 
					 | 
				
			||||||
			ExpiredAt int64  `json:"expired_at"`
 | 
					 | 
				
			||||||
			UserNum   int    `json:"user_num"`
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	apiURL := fmt.Sprintf("%s/%s", s.config.ApiURL, "api/license/active")
 | 
					 | 
				
			||||||
	response, err := req.C().R().
 | 
					 | 
				
			||||||
		SetBody(map[string]string{"license": license, "machine_id": machineId}).
 | 
					 | 
				
			||||||
		SetSuccessResult(&res).Post(apiURL)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return fmt.Errorf("发送激活请求失败: %v", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if response.IsErrorState() {
 | 
					 | 
				
			||||||
		return fmt.Errorf( "发送激活请求失败:%v", response.Status)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if res.Code != types.Success {
 | 
					 | 
				
			||||||
		return fmt.Errorf( "激活失败:%v", res.Message)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	err = s.levelDB.Put(types.LicenseKey, types.License{
 | 
					 | 
				
			||||||
		Key:       license,
 | 
					 | 
				
			||||||
		MachineId: machineId,
 | 
					 | 
				
			||||||
		UserNum:   res.Data.UserNum,
 | 
					 | 
				
			||||||
		ExpiredAt: res.Data.ExpiredAt,
 | 
					 | 
				
			||||||
		IsActive: true,
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return fmt.Errorf("保存许可证书失败:%v", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetLicense 获取许可信息
 | 
					 | 
				
			||||||
func (s *LicenseService) GetLicense() types.License {
 | 
					 | 
				
			||||||
	return s.license
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// IsValidApiURL 判断是否合法的中转 URL
 | 
					 | 
				
			||||||
func (s *LicenseService) IsValidApiURL(uri string) error {
 | 
					 | 
				
			||||||
	// 获得许可授权的直接放行
 | 
					 | 
				
			||||||
	if s.license.IsActive {
 | 
					 | 
				
			||||||
		if s.license.MachineId != s.machineId {
 | 
					 | 
				
			||||||
			return errors.New("系统使用了盗版的许可证书")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if time.Now().Unix() > s.license.ExpiredAt {
 | 
					 | 
				
			||||||
			return errors.New("系统许可证书已经过期")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if !strings.HasPrefix(uri, "https://gpt.bemore.lol") &&
 | 
					 | 
				
			||||||
		!strings.HasPrefix(uri, "https://api.openai.com") &&
 | 
					 | 
				
			||||||
		!strings.HasPrefix(uri, "http://cdn.chat-plus.net") &&
 | 
					 | 
				
			||||||
		!strings.HasPrefix(uri, "https://api.chat-plus.net") {
 | 
					 | 
				
			||||||
		return fmt.Errorf("当前 API 地址 %s 不在白名单列表当中。",uri)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -3,7 +3,6 @@ package mj
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"chatplus/core/types"
 | 
						"chatplus/core/types"
 | 
				
			||||||
	logger2 "chatplus/logger"
 | 
						logger2 "chatplus/logger"
 | 
				
			||||||
	"chatplus/service"
 | 
					 | 
				
			||||||
	"chatplus/service/oss"
 | 
						"chatplus/service/oss"
 | 
				
			||||||
	"chatplus/service/sd"
 | 
						"chatplus/service/sd"
 | 
				
			||||||
	"chatplus/store"
 | 
						"chatplus/store"
 | 
				
			||||||
@@ -27,7 +26,7 @@ type ServicePool struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
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, appConfig *types.AppConfig) *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)
 | 
				
			||||||
@@ -36,12 +35,7 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa
 | 
				
			|||||||
		if config.Enabled == false {
 | 
							if config.Enabled == false {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		err := licenseService.IsValidApiURL(config.ApiURL)
 | 
					
 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			logger.Error(err)
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		cli := NewPlusClient(config)
 | 
							cli := NewPlusClient(config)
 | 
				
			||||||
		name := fmt.Sprintf("mj-plus-service-%d", k)
 | 
							name := fmt.Sprintf("mj-plus-service-%d", k)
 | 
				
			||||||
		plusService := NewService(name, taskQueue, notifyQueue, db, cli)
 | 
							plusService := NewService(name, taskQueue, notifyQueue, db, cli)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -258,19 +258,6 @@
 | 
				
			|||||||
        <Menu/>
 | 
					        <Menu/>
 | 
				
			||||||
      </el-tab-pane>
 | 
					      </el-tab-pane>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <el-tab-pane label="授权激活" name="license">
 | 
					 | 
				
			||||||
        <div class="container">
 | 
					 | 
				
			||||||
          <el-form :model="system" label-width="150px" label-position="right">
 | 
					 | 
				
			||||||
            <el-form-item label="许可授权码" prop="license">
 | 
					 | 
				
			||||||
              <el-input v-model="license"/>
 | 
					 | 
				
			||||||
            </el-form-item>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            <el-form-item>
 | 
					 | 
				
			||||||
              <el-button type="primary" @click="active">立即激活</el-button>
 | 
					 | 
				
			||||||
            </el-form-item>
 | 
					 | 
				
			||||||
          </el-form>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
      </el-tab-pane>
 | 
					 | 
				
			||||||
    </el-tabs>
 | 
					    </el-tabs>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
@@ -344,19 +331,6 @@ const save = function (key) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 激活授权
 | 
					 | 
				
			||||||
const license = ref("")
 | 
					 | 
				
			||||||
const active = () => {
 | 
					 | 
				
			||||||
  if (license.value === "") {
 | 
					 | 
				
			||||||
    return ElMessage.error("请输入授权码")
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  httpPost("/api/admin/active", {license: license.value}).then(res => {
 | 
					 | 
				
			||||||
    ElMessage.success("授权成功,机器编码为:" + res.data)
 | 
					 | 
				
			||||||
  }).catch(e => {
 | 
					 | 
				
			||||||
    ElMessage.error(e.message)
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const configKey = ref("")
 | 
					const configKey = ref("")
 | 
				
			||||||
const beforeUpload = (key) => {
 | 
					const beforeUpload = (key) => {
 | 
				
			||||||
  configKey.value = key
 | 
					  configKey.value = key
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user