Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
32c1442878 | ||
|
|
b99652801d | ||
|
|
be565a98b9 | ||
|
|
5195a380db | ||
|
|
8dbbabb0e8 | ||
|
|
bec4500746 | ||
|
|
66a31f599d | ||
|
|
534cfb2180 | ||
|
|
a9dc20ffbd | ||
|
|
7f20ad32b6 | ||
|
|
a3c0b43bc4 | ||
|
|
1f2c9a6b3a | ||
|
|
194b0ec184 | ||
|
|
c94895a7c4 |
@@ -1,7 +1,7 @@
|
||||
package teaconst
|
||||
|
||||
const (
|
||||
Version = "1.3.2"
|
||||
Version = "1.3.3"
|
||||
|
||||
ProductName = "Edge API"
|
||||
ProcessName = "edge-api"
|
||||
@@ -20,7 +20,7 @@ const (
|
||||
|
||||
// 其他节点版本号,用来检测是否有需要升级的节点
|
||||
|
||||
NodeVersion = "1.3.2"
|
||||
NodeVersion = "1.3.3"
|
||||
|
||||
// SQLVersion SQL版本号
|
||||
SQLVersion = "11"
|
||||
|
||||
@@ -149,6 +149,14 @@ func (this *HTTPFirewallPolicyDAO) CreateFirewallPolicy(tx *dbs.Tx, userId int64
|
||||
}
|
||||
op.BlockOptions = blockOptionsJSON
|
||||
|
||||
// page options
|
||||
var pageOptions = firewallconfigs.DefaultHTTPFirewallPageAction()
|
||||
pageOptionsJSON, err := json.Marshal(pageOptions)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
op.PageOptions = pageOptionsJSON
|
||||
|
||||
// captcha options
|
||||
var captchaOptions = firewallconfigs.DefaultHTTPFirewallCaptchaAction()
|
||||
captchaOptionsJSON, err := json.Marshal(captchaOptions)
|
||||
@@ -313,6 +321,7 @@ func (this *HTTPFirewallPolicyDAO) UpdateFirewallPolicy(tx *dbs.Tx,
|
||||
inboundJSON []byte,
|
||||
outboundJSON []byte,
|
||||
blockOptionsJSON []byte,
|
||||
pageOptionsJSON []byte,
|
||||
captchaOptionsJSON []byte,
|
||||
mode firewallconfigs.FirewallMode,
|
||||
useLocalFirewall bool,
|
||||
@@ -343,6 +352,9 @@ func (this *HTTPFirewallPolicyDAO) UpdateFirewallPolicy(tx *dbs.Tx,
|
||||
if IsNotNull(blockOptionsJSON) {
|
||||
op.BlockOptions = blockOptionsJSON
|
||||
}
|
||||
if IsNotNull(pageOptionsJSON) {
|
||||
op.PageOptions = pageOptionsJSON
|
||||
}
|
||||
if IsNotNull(captchaOptionsJSON) {
|
||||
op.CaptchaOptions = captchaOptionsJSON
|
||||
}
|
||||
@@ -524,6 +536,16 @@ func (this *HTTPFirewallPolicyDAO) ComposeFirewallPolicy(tx *dbs.Tx, policyId in
|
||||
config.BlockOptions = blockAction
|
||||
}
|
||||
|
||||
// Page动作配置
|
||||
if IsNotNull(policy.PageOptions) {
|
||||
var pageAction = firewallconfigs.DefaultHTTPFirewallPageAction()
|
||||
err = json.Unmarshal(policy.PageOptions, pageAction)
|
||||
if err != nil {
|
||||
return config, err
|
||||
}
|
||||
config.PageOptions = pageAction
|
||||
}
|
||||
|
||||
// Captcha动作配置
|
||||
if IsNotNull(policy.CaptchaOptions) {
|
||||
var captchaAction = &firewallconfigs.HTTPFirewallCaptchaAction{}
|
||||
|
||||
@@ -16,8 +16,9 @@ const (
|
||||
HTTPFirewallPolicyField_Description dbs.FieldName = "description" // 描述
|
||||
HTTPFirewallPolicyField_Inbound dbs.FieldName = "inbound" // 入站规则
|
||||
HTTPFirewallPolicyField_Outbound dbs.FieldName = "outbound" // 出站规则
|
||||
HTTPFirewallPolicyField_BlockOptions dbs.FieldName = "blockOptions" // BLOCK选项
|
||||
HTTPFirewallPolicyField_CaptchaOptions dbs.FieldName = "captchaOptions" // 验证码选项
|
||||
HTTPFirewallPolicyField_BlockOptions dbs.FieldName = "blockOptions" // BLOCK动作选项
|
||||
HTTPFirewallPolicyField_PageOptions dbs.FieldName = "pageOptions" // PAGE动作选项
|
||||
HTTPFirewallPolicyField_CaptchaOptions dbs.FieldName = "captchaOptions" // 验证码动作选项
|
||||
HTTPFirewallPolicyField_Mode dbs.FieldName = "mode" // 模式
|
||||
HTTPFirewallPolicyField_UseLocalFirewall dbs.FieldName = "useLocalFirewall" // 是否自动使用本地防火墙
|
||||
HTTPFirewallPolicyField_SynFlood dbs.FieldName = "synFlood" // SynFlood防御设置
|
||||
@@ -42,8 +43,9 @@ type HTTPFirewallPolicy struct {
|
||||
Description string `field:"description"` // 描述
|
||||
Inbound dbs.JSON `field:"inbound"` // 入站规则
|
||||
Outbound dbs.JSON `field:"outbound"` // 出站规则
|
||||
BlockOptions dbs.JSON `field:"blockOptions"` // BLOCK选项
|
||||
CaptchaOptions dbs.JSON `field:"captchaOptions"` // 验证码选项
|
||||
BlockOptions dbs.JSON `field:"blockOptions"` // BLOCK动作选项
|
||||
PageOptions dbs.JSON `field:"pageOptions"` // PAGE动作选项
|
||||
CaptchaOptions dbs.JSON `field:"captchaOptions"` // 验证码动作选项
|
||||
Mode string `field:"mode"` // 模式
|
||||
UseLocalFirewall uint8 `field:"useLocalFirewall"` // 是否自动使用本地防火墙
|
||||
SynFlood dbs.JSON `field:"synFlood"` // SynFlood防御设置
|
||||
@@ -67,8 +69,9 @@ type HTTPFirewallPolicyOperator struct {
|
||||
Description any // 描述
|
||||
Inbound any // 入站规则
|
||||
Outbound any // 出站规则
|
||||
BlockOptions any // BLOCK选项
|
||||
CaptchaOptions any // 验证码选项
|
||||
BlockOptions any // BLOCK动作选项
|
||||
PageOptions any // PAGE动作选项
|
||||
CaptchaOptions any // 验证码动作选项
|
||||
Mode any // 模式
|
||||
UseLocalFirewall any // 是否自动使用本地防火墙
|
||||
SynFlood any // SynFlood防御设置
|
||||
|
||||
@@ -554,6 +554,18 @@ func (this *HTTPWebDAO) ComposeWebConfig(tx *dbs.Tx, webId int64, isLocationOrGr
|
||||
}
|
||||
}
|
||||
|
||||
// hls
|
||||
if IsNotNull(web.Hls) {
|
||||
var hlsConfig = &serverconfigs.HLSConfig{}
|
||||
err = json.Unmarshal(web.Hls, hlsConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if this.shouldCompose(isLocationOrGroup, forNode, hlsConfig.IsPrior, true) {
|
||||
config.HLS = hlsConfig
|
||||
}
|
||||
}
|
||||
|
||||
if cacheMap != nil {
|
||||
cacheMap.Put(cacheKey, config)
|
||||
}
|
||||
@@ -1464,6 +1476,10 @@ func (this *HTTPWebDAO) FindWebReferers(tx *dbs.Tx, webId int64) ([]byte, error)
|
||||
|
||||
// UpdateWebUserAgent 修改User-Agent设置
|
||||
func (this *HTTPWebDAO) UpdateWebUserAgent(tx *dbs.Tx, webId int64, userAgentConfig *serverconfigs.UserAgentConfig) error {
|
||||
if webId <= 0 {
|
||||
return errors.New("require 'webId'")
|
||||
}
|
||||
|
||||
if userAgentConfig == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ const (
|
||||
HTTPWebField_Referers dbs.FieldName = "referers" // 防盗链设置
|
||||
HTTPWebField_UserAgent dbs.FieldName = "userAgent" // UserAgent设置
|
||||
HTTPWebField_Optimization dbs.FieldName = "optimization" // 页面优化配置
|
||||
HTTPWebField_Hls dbs.FieldName = "hls" // HLS设置
|
||||
)
|
||||
|
||||
// HTTPWeb HTTP Web
|
||||
@@ -83,6 +84,7 @@ type HTTPWeb struct {
|
||||
Referers dbs.JSON `field:"referers"` // 防盗链设置
|
||||
UserAgent dbs.JSON `field:"userAgent"` // UserAgent设置
|
||||
Optimization dbs.JSON `field:"optimization"` // 页面优化配置
|
||||
Hls dbs.JSON `field:"hls"` // HLS设置
|
||||
}
|
||||
|
||||
type HTTPWebOperator struct {
|
||||
@@ -124,6 +126,7 @@ type HTTPWebOperator struct {
|
||||
Referers any // 防盗链设置
|
||||
UserAgent any // UserAgent设置
|
||||
Optimization any // 页面优化配置
|
||||
Hls any // HLS设置
|
||||
}
|
||||
|
||||
func NewHTTPWebOperator() *HTTPWebOperator {
|
||||
|
||||
@@ -264,13 +264,22 @@ func (this *NodeClusterDAO) CountAllEnabledClusters(tx *dbs.Tx, keyword string)
|
||||
}
|
||||
|
||||
// ListEnabledClusters 列出单页集群
|
||||
func (this *NodeClusterDAO) ListEnabledClusters(tx *dbs.Tx, keyword string, offset, size int64) (result []*NodeCluster, err error) {
|
||||
func (this *NodeClusterDAO) ListEnabledClusters(tx *dbs.Tx, keyword string, idDesc bool, idAsc bool, offset, size int64) (result []*NodeCluster, err error) {
|
||||
var query = this.Query(tx).
|
||||
State(NodeClusterStateEnabled)
|
||||
if len(keyword) > 0 {
|
||||
query.Where("(name LIKE :keyword OR dnsName like :keyword OR (dnsDomainId > 0 AND dnsDomainId IN (SELECT id FROM "+dns.SharedDNSDomainDAO.Table+" WHERE name LIKE :keyword AND state=1)))").
|
||||
Param("keyword", dbutils.QuoteLike(keyword))
|
||||
}
|
||||
|
||||
if idDesc {
|
||||
query.DescPk()
|
||||
} else if idAsc {
|
||||
query.AscPk()
|
||||
} else {
|
||||
query.Desc("isPinned").DescPk()
|
||||
}
|
||||
|
||||
_, err = query.
|
||||
Result(
|
||||
NodeClusterField_Id,
|
||||
@@ -295,8 +304,6 @@ func (this *NodeClusterDAO) ListEnabledClusters(tx *dbs.Tx, keyword string, offs
|
||||
Offset(offset).
|
||||
Limit(size).
|
||||
Slice(&result).
|
||||
Desc("isPinned").
|
||||
DescPk().
|
||||
FindAll()
|
||||
|
||||
return
|
||||
|
||||
@@ -882,9 +882,28 @@ func (this *NodeDAO) FindNodeStatus(tx *dbs.Tx, nodeId int64) (*nodeconfigs.Node
|
||||
return status, nil
|
||||
}
|
||||
|
||||
// UpdateNodeIsOn 修改节点启用状态
|
||||
func (this *NodeDAO) UpdateNodeIsOn(tx *dbs.Tx, nodeId int64, isOn bool) error {
|
||||
if nodeId <= 0 {
|
||||
return errors.New("invalid nodeId")
|
||||
}
|
||||
err := this.Query(tx).
|
||||
Pk(nodeId).
|
||||
Set("isOn", isOn).
|
||||
UpdateQuickly()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return this.NotifyDNSUpdate(tx, nodeId)
|
||||
}
|
||||
|
||||
// UpdateNodeIsActive 更改节点在线状态
|
||||
func (this *NodeDAO) UpdateNodeIsActive(tx *dbs.Tx, nodeId int64, isActive bool) error {
|
||||
b := "true"
|
||||
if nodeId <= 0 {
|
||||
return errors.New("invalid nodeId")
|
||||
}
|
||||
var b = "true"
|
||||
if !isActive {
|
||||
b = "false"
|
||||
}
|
||||
@@ -898,6 +917,9 @@ func (this *NodeDAO) UpdateNodeIsActive(tx *dbs.Tx, nodeId int64, isActive bool)
|
||||
|
||||
// UpdateNodeIsInstalled 设置节点安装状态
|
||||
func (this *NodeDAO) UpdateNodeIsInstalled(tx *dbs.Tx, nodeId int64, isInstalled bool) error {
|
||||
if nodeId <= 0 {
|
||||
return errors.New("invalid nodeId")
|
||||
}
|
||||
_, err := this.Query(tx).
|
||||
Pk(nodeId).
|
||||
Set("isInstalled", isInstalled).
|
||||
|
||||
@@ -34,6 +34,7 @@ const (
|
||||
NodeTaskTypeWebPPolicyChanged NodeTaskType = "webPPolicyChanged" // WebP策略变化
|
||||
NodeTaskTypeUpdatingServers NodeTaskType = "updatingServers" // 更新一组服务
|
||||
NodeTaskTypeTOAChanged NodeTaskType = "toaChanged" // TOA配置变化
|
||||
NodeTaskTypePlanChanged NodeTaskType = "planChanged" // 套餐变化
|
||||
|
||||
// NS相关
|
||||
|
||||
|
||||
@@ -538,6 +538,17 @@ func (this *OriginDAO) CheckUserOrigin(tx *dbs.Tx, userId int64, originId int64)
|
||||
return SharedReverseProxyDAO.CheckUserReverseProxy(tx, userId, reverseProxyId)
|
||||
}
|
||||
|
||||
// ExistsOrigin 检查源站是否存在
|
||||
func (this *OriginDAO) ExistsOrigin(tx *dbs.Tx, originId int64) (bool, error) {
|
||||
if originId <= 0 {
|
||||
return false, nil
|
||||
}
|
||||
return this.Query(tx).
|
||||
Pk(originId).
|
||||
State(OriginStateEnabled).
|
||||
Exist()
|
||||
}
|
||||
|
||||
// NotifyUpdate 通知更新
|
||||
func (this *OriginDAO) NotifyUpdate(tx *dbs.Tx, originId int64) error {
|
||||
reverseProxyId, err := SharedReverseProxyDAO.FindReverseProxyContainsOriginId(tx, originId)
|
||||
|
||||
@@ -49,7 +49,12 @@ func (this *PlanDAO) EnablePlan(tx *dbs.Tx, id uint32) error {
|
||||
|
||||
// DisablePlan 禁用条目
|
||||
func (this *PlanDAO) DisablePlan(tx *dbs.Tx, id int64) error {
|
||||
_, err := this.Query(tx).
|
||||
clusterId, err := this.FindPlanClusterId(tx, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = this.Query(tx).
|
||||
Pk(id).
|
||||
Set("state", PlanStateDisabled).
|
||||
Update()
|
||||
@@ -57,7 +62,7 @@ func (this *PlanDAO) DisablePlan(tx *dbs.Tx, id int64) error {
|
||||
return err
|
||||
}
|
||||
|
||||
return this.NotifyUpdate(tx, id)
|
||||
return this.NotifyUpdate(tx, id, clusterId)
|
||||
}
|
||||
|
||||
// FindEnabledPlan 查找启用中的条目
|
||||
@@ -175,18 +180,18 @@ func (this *PlanDAO) FindEnabledPlanTrafficLimit(tx *dbs.Tx, planId int64, cache
|
||||
return config, nil
|
||||
}
|
||||
|
||||
// NotifyUpdate 通知变更
|
||||
func (this *PlanDAO) NotifyUpdate(tx *dbs.Tx, planId int64) error {
|
||||
// 这里不要加入状态参数,因为需要适应删除后的更新
|
||||
clusterId, err := this.Query(tx).
|
||||
// FindPlanClusterId 查找套餐所属集群
|
||||
func (this *PlanDAO) FindPlanClusterId(tx *dbs.Tx, planId int64) (clusterId int64, err error) {
|
||||
return this.Query(tx).
|
||||
Pk(planId).
|
||||
Result("clusterId").
|
||||
FindInt64Col(0)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if clusterId > 0 {
|
||||
return SharedNodeClusterDAO.NotifyUpdate(tx, clusterId)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// NotifyUpdate 通知变更
|
||||
func (this *PlanDAO) NotifyUpdate(tx *dbs.Tx, planId int64, clusterId int64) error {
|
||||
if clusterId <= 0 {
|
||||
return nil
|
||||
}
|
||||
return SharedNodeClusterDAO.NotifyUpdate(tx, clusterId)
|
||||
}
|
||||
|
||||
@@ -6,9 +6,10 @@ const (
|
||||
PlanField_Id dbs.FieldName = "id" // ID
|
||||
PlanField_IsOn dbs.FieldName = "isOn" // 是否启用
|
||||
PlanField_Name dbs.FieldName = "name" // 套餐名
|
||||
PlanField_Description dbs.FieldName = "description" // 描述
|
||||
PlanField_Description dbs.FieldName = "description" // 套餐简介
|
||||
PlanField_ClusterId dbs.FieldName = "clusterId" // 集群ID
|
||||
PlanField_TrafficLimit dbs.FieldName = "trafficLimit" // 流量限制
|
||||
PlanField_BandwidthLimitPerNode dbs.FieldName = "bandwidthLimitPerNode" // 单节点带宽限制
|
||||
PlanField_Features dbs.FieldName = "features" // 允许的功能
|
||||
PlanField_HasFullFeatures dbs.FieldName = "hasFullFeatures" // 是否有完整的功能
|
||||
PlanField_TrafficPrice dbs.FieldName = "trafficPrice" // 流量价格设定
|
||||
@@ -26,6 +27,7 @@ const (
|
||||
PlanField_DailyRequests dbs.FieldName = "dailyRequests" // 每日访问量额度
|
||||
PlanField_DailyWebsocketConnections dbs.FieldName = "dailyWebsocketConnections" // 每日Websocket连接数
|
||||
PlanField_MonthlyWebsocketConnections dbs.FieldName = "monthlyWebsocketConnections" // 每月Websocket连接数
|
||||
PlanField_MaxUploadSize dbs.FieldName = "maxUploadSize" // 最大上传
|
||||
)
|
||||
|
||||
// Plan 用户套餐
|
||||
@@ -33,9 +35,10 @@ type Plan struct {
|
||||
Id uint32 `field:"id"` // ID
|
||||
IsOn bool `field:"isOn"` // 是否启用
|
||||
Name string `field:"name"` // 套餐名
|
||||
Description string `field:"description"` // 描述
|
||||
Description string `field:"description"` // 套餐简介
|
||||
ClusterId uint32 `field:"clusterId"` // 集群ID
|
||||
TrafficLimit dbs.JSON `field:"trafficLimit"` // 流量限制
|
||||
BandwidthLimitPerNode dbs.JSON `field:"bandwidthLimitPerNode"` // 单节点带宽限制
|
||||
Features dbs.JSON `field:"features"` // 允许的功能
|
||||
HasFullFeatures bool `field:"hasFullFeatures"` // 是否有完整的功能
|
||||
TrafficPrice dbs.JSON `field:"trafficPrice"` // 流量价格设定
|
||||
@@ -53,15 +56,17 @@ type Plan struct {
|
||||
DailyRequests uint64 `field:"dailyRequests"` // 每日访问量额度
|
||||
DailyWebsocketConnections uint64 `field:"dailyWebsocketConnections"` // 每日Websocket连接数
|
||||
MonthlyWebsocketConnections uint64 `field:"monthlyWebsocketConnections"` // 每月Websocket连接数
|
||||
MaxUploadSize dbs.JSON `field:"maxUploadSize"` // 最大上传
|
||||
}
|
||||
|
||||
type PlanOperator struct {
|
||||
Id any // ID
|
||||
IsOn any // 是否启用
|
||||
Name any // 套餐名
|
||||
Description any // 描述
|
||||
Description any // 套餐简介
|
||||
ClusterId any // 集群ID
|
||||
TrafficLimit any // 流量限制
|
||||
BandwidthLimitPerNode any // 单节点带宽限制
|
||||
Features any // 允许的功能
|
||||
HasFullFeatures any // 是否有完整的功能
|
||||
TrafficPrice any // 流量价格设定
|
||||
@@ -79,6 +84,7 @@ type PlanOperator struct {
|
||||
DailyRequests any // 每日访问量额度
|
||||
DailyWebsocketConnections any // 每日Websocket连接数
|
||||
MonthlyWebsocketConnections any // 每月Websocket连接数
|
||||
MaxUploadSize any // 最大上传
|
||||
}
|
||||
|
||||
func NewPlanOperator() *PlanOperator {
|
||||
|
||||
71
internal/db/models/posts/post_category_dao.go
Normal file
71
internal/db/models/posts/post_category_dao.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package posts
|
||||
|
||||
import (
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/iwind/TeaGo/Tea"
|
||||
"github.com/iwind/TeaGo/dbs"
|
||||
)
|
||||
|
||||
const (
|
||||
PostCategoryStateEnabled = 1 // 已启用
|
||||
PostCategoryStateDisabled = 0 // 已禁用
|
||||
)
|
||||
|
||||
type PostCategoryDAO dbs.DAO
|
||||
|
||||
func NewPostCategoryDAO() *PostCategoryDAO {
|
||||
return dbs.NewDAO(&PostCategoryDAO{
|
||||
DAOObject: dbs.DAOObject{
|
||||
DB: Tea.Env,
|
||||
Table: "edgePostCategories",
|
||||
Model: new(PostCategory),
|
||||
PkName: "id",
|
||||
},
|
||||
}).(*PostCategoryDAO)
|
||||
}
|
||||
|
||||
var SharedPostCategoryDAO *PostCategoryDAO
|
||||
|
||||
func init() {
|
||||
dbs.OnReady(func() {
|
||||
SharedPostCategoryDAO = NewPostCategoryDAO()
|
||||
})
|
||||
}
|
||||
|
||||
// EnablePostCategory 启用条目
|
||||
func (this *PostCategoryDAO) EnablePostCategory(tx *dbs.Tx, categoryId int64) error {
|
||||
_, err := this.Query(tx).
|
||||
Pk(categoryId).
|
||||
Set("state", PostCategoryStateEnabled).
|
||||
Update()
|
||||
return err
|
||||
}
|
||||
|
||||
// DisablePostCategory 禁用条目
|
||||
func (this *PostCategoryDAO) DisablePostCategory(tx *dbs.Tx, categoryId int64) error {
|
||||
_, err := this.Query(tx).
|
||||
Pk(categoryId).
|
||||
Set("state", PostCategoryStateDisabled).
|
||||
Update()
|
||||
return err
|
||||
}
|
||||
|
||||
// FindEnabledPostCategory 查找启用中的条目
|
||||
func (this *PostCategoryDAO) FindEnabledPostCategory(tx *dbs.Tx, categoryId int64) (*PostCategory, error) {
|
||||
result, err := this.Query(tx).
|
||||
Pk(categoryId).
|
||||
State(PostCategoryStateEnabled).
|
||||
Find()
|
||||
if result == nil {
|
||||
return nil, err
|
||||
}
|
||||
return result.(*PostCategory), err
|
||||
}
|
||||
|
||||
// FindPostCategoryName 根据主键查找名称
|
||||
func (this *PostCategoryDAO) FindPostCategoryName(tx *dbs.Tx, categoryId int64) (string, error) {
|
||||
return this.Query(tx).
|
||||
Pk(categoryId).
|
||||
Result("name").
|
||||
FindStringCol("")
|
||||
}
|
||||
6
internal/db/models/posts/post_category_dao_test.go
Normal file
6
internal/db/models/posts/post_category_dao_test.go
Normal file
@@ -0,0 +1,6 @@
|
||||
package posts_test
|
||||
|
||||
import (
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
_ "github.com/iwind/TeaGo/bootstrap"
|
||||
)
|
||||
35
internal/db/models/posts/post_category_model.go
Normal file
35
internal/db/models/posts/post_category_model.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package posts
|
||||
|
||||
import "github.com/iwind/TeaGo/dbs"
|
||||
|
||||
const (
|
||||
PostCategoryField_Id dbs.FieldName = "id" // ID
|
||||
PostCategoryField_Name dbs.FieldName = "name" // 分类名称
|
||||
PostCategoryField_IsOn dbs.FieldName = "isOn" // 是否启用
|
||||
PostCategoryField_Code dbs.FieldName = "code" // 代号
|
||||
PostCategoryField_Order dbs.FieldName = "order" // 排序
|
||||
PostCategoryField_State dbs.FieldName = "state" // 分类状态
|
||||
)
|
||||
|
||||
// PostCategory 文章分类
|
||||
type PostCategory struct {
|
||||
Id uint32 `field:"id"` // ID
|
||||
Name string `field:"name"` // 分类名称
|
||||
IsOn bool `field:"isOn"` // 是否启用
|
||||
Code string `field:"code"` // 代号
|
||||
Order uint32 `field:"order"` // 排序
|
||||
State uint8 `field:"state"` // 分类状态
|
||||
}
|
||||
|
||||
type PostCategoryOperator struct {
|
||||
Id any // ID
|
||||
Name any // 分类名称
|
||||
IsOn any // 是否启用
|
||||
Code any // 代号
|
||||
Order any // 排序
|
||||
State any // 分类状态
|
||||
}
|
||||
|
||||
func NewPostCategoryOperator() *PostCategoryOperator {
|
||||
return &PostCategoryOperator{}
|
||||
}
|
||||
1
internal/db/models/posts/post_category_model_ext.go
Normal file
1
internal/db/models/posts/post_category_model_ext.go
Normal file
@@ -0,0 +1 @@
|
||||
package posts
|
||||
63
internal/db/models/posts/post_dao.go
Normal file
63
internal/db/models/posts/post_dao.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package posts
|
||||
|
||||
import (
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/iwind/TeaGo/Tea"
|
||||
"github.com/iwind/TeaGo/dbs"
|
||||
)
|
||||
|
||||
const (
|
||||
PostStateEnabled = 1 // 已启用
|
||||
PostStateDisabled = 0 // 已禁用
|
||||
)
|
||||
|
||||
type PostDAO dbs.DAO
|
||||
|
||||
func NewPostDAO() *PostDAO {
|
||||
return dbs.NewDAO(&PostDAO{
|
||||
DAOObject: dbs.DAOObject{
|
||||
DB: Tea.Env,
|
||||
Table: "edgePosts",
|
||||
Model: new(Post),
|
||||
PkName: "id",
|
||||
},
|
||||
}).(*PostDAO)
|
||||
}
|
||||
|
||||
var SharedPostDAO *PostDAO
|
||||
|
||||
func init() {
|
||||
dbs.OnReady(func() {
|
||||
SharedPostDAO = NewPostDAO()
|
||||
})
|
||||
}
|
||||
|
||||
// EnablePost 启用条目
|
||||
func (this *PostDAO) EnablePost(tx *dbs.Tx, postId int64) error {
|
||||
_, err := this.Query(tx).
|
||||
Pk(postId).
|
||||
Set("state", PostStateEnabled).
|
||||
Update()
|
||||
return err
|
||||
}
|
||||
|
||||
// DisablePost 禁用条目
|
||||
func (this *PostDAO) DisablePost(tx *dbs.Tx, postId int64) error {
|
||||
_, err := this.Query(tx).
|
||||
Pk(postId).
|
||||
Set("state", PostStateDisabled).
|
||||
Update()
|
||||
return err
|
||||
}
|
||||
|
||||
// FindEnabledPost 查找启用中的条目
|
||||
func (this *PostDAO) FindEnabledPost(tx *dbs.Tx, postId int64) (*Post, error) {
|
||||
result, err := this.Query(tx).
|
||||
Pk(postId).
|
||||
State(PostStateEnabled).
|
||||
Find()
|
||||
if result == nil {
|
||||
return nil, err
|
||||
}
|
||||
return result.(*Post), err
|
||||
}
|
||||
6
internal/db/models/posts/post_dao_test.go
Normal file
6
internal/db/models/posts/post_dao_test.go
Normal file
@@ -0,0 +1,6 @@
|
||||
package posts_test
|
||||
|
||||
import (
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
_ "github.com/iwind/TeaGo/bootstrap"
|
||||
)
|
||||
50
internal/db/models/posts/post_model.go
Normal file
50
internal/db/models/posts/post_model.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package posts
|
||||
|
||||
import "github.com/iwind/TeaGo/dbs"
|
||||
|
||||
const (
|
||||
PostField_Id dbs.FieldName = "id" // ID
|
||||
PostField_CategoryId dbs.FieldName = "categoryId" // 文章分类
|
||||
PostField_Type dbs.FieldName = "type" // 类型:normal, url
|
||||
PostField_Url dbs.FieldName = "url" // URL
|
||||
PostField_Subject dbs.FieldName = "subject" // 标题
|
||||
PostField_Body dbs.FieldName = "body" // 内容
|
||||
PostField_CreatedAt dbs.FieldName = "createdAt" // 创建时间
|
||||
PostField_IsPublished dbs.FieldName = "isPublished" // 是否已发布
|
||||
PostField_PublishedAt dbs.FieldName = "publishedAt" // 发布时间
|
||||
PostField_ProductCode dbs.FieldName = "productCode" // 产品代号
|
||||
PostField_State dbs.FieldName = "state" // 状态
|
||||
)
|
||||
|
||||
// Post 文章管理
|
||||
type Post struct {
|
||||
Id uint32 `field:"id"` // ID
|
||||
CategoryId uint32 `field:"categoryId"` // 文章分类
|
||||
Type string `field:"type"` // 类型:normal, url
|
||||
Url string `field:"url"` // URL
|
||||
Subject string `field:"subject"` // 标题
|
||||
Body string `field:"body"` // 内容
|
||||
CreatedAt uint64 `field:"createdAt"` // 创建时间
|
||||
IsPublished bool `field:"isPublished"` // 是否已发布
|
||||
PublishedAt uint64 `field:"publishedAt"` // 发布时间
|
||||
ProductCode string `field:"productCode"` // 产品代号
|
||||
State uint8 `field:"state"` // 状态
|
||||
}
|
||||
|
||||
type PostOperator struct {
|
||||
Id any // ID
|
||||
CategoryId any // 文章分类
|
||||
Type any // 类型:normal, url
|
||||
Url any // URL
|
||||
Subject any // 标题
|
||||
Body any // 内容
|
||||
CreatedAt any // 创建时间
|
||||
IsPublished any // 是否已发布
|
||||
PublishedAt any // 发布时间
|
||||
ProductCode any // 产品代号
|
||||
State any // 状态
|
||||
}
|
||||
|
||||
func NewPostOperator() *PostOperator {
|
||||
return &PostOperator{}
|
||||
}
|
||||
1
internal/db/models/posts/post_model_ext.go
Normal file
1
internal/db/models/posts/post_model_ext.go
Normal file
@@ -0,0 +1 @@
|
||||
package posts
|
||||
@@ -376,14 +376,14 @@ func (this *ReverseProxyDAO) UpdateReverseProxyScheduling(tx *dbs.Tx, reversePro
|
||||
}
|
||||
|
||||
// UpdateReverseProxyPrimaryOrigins 修改主要源站
|
||||
func (this *ReverseProxyDAO) UpdateReverseProxyPrimaryOrigins(tx *dbs.Tx, reverseProxyId int64, origins []byte) error {
|
||||
func (this *ReverseProxyDAO) UpdateReverseProxyPrimaryOrigins(tx *dbs.Tx, reverseProxyId int64, originRefs []byte) error {
|
||||
if reverseProxyId <= 0 {
|
||||
return errors.New("invalid reverseProxyId")
|
||||
}
|
||||
var op = NewReverseProxyOperator()
|
||||
op.Id = reverseProxyId
|
||||
if len(origins) > 0 {
|
||||
op.PrimaryOrigins = origins
|
||||
if len(originRefs) > 0 {
|
||||
op.PrimaryOrigins = originRefs
|
||||
} else {
|
||||
op.PrimaryOrigins = "[]"
|
||||
}
|
||||
|
||||
@@ -1 +1,31 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||
"github.com/iwind/TeaGo/logs"
|
||||
)
|
||||
|
||||
// DecodePrimaryOrigins 解析主要源站
|
||||
func (this *ReverseProxy) DecodePrimaryOrigins() []*serverconfigs.OriginRef {
|
||||
var refs = []*serverconfigs.OriginRef{}
|
||||
if IsNotNull(this.PrimaryOrigins) {
|
||||
err := json.Unmarshal(this.PrimaryOrigins, &refs)
|
||||
if err != nil {
|
||||
logs.Error(err)
|
||||
}
|
||||
}
|
||||
return refs
|
||||
}
|
||||
|
||||
// DecodeBackupOrigins 解析备用源站
|
||||
func (this *ReverseProxy) DecodeBackupOrigins() []*serverconfigs.OriginRef {
|
||||
var refs = []*serverconfigs.OriginRef{}
|
||||
if IsNotNull(this.BackupOrigins) {
|
||||
err := json.Unmarshal(this.BackupOrigins, &refs)
|
||||
if err != nil {
|
||||
logs.Error(err)
|
||||
}
|
||||
}
|
||||
return refs
|
||||
}
|
||||
|
||||
@@ -757,14 +757,14 @@ func (this *ServerDAO) UpdateServerAuditing(tx *dbs.Tx, serverId int64, result *
|
||||
return this.NotifyDNSUpdate(tx, serverId)
|
||||
}
|
||||
|
||||
// UpdateServerReverseProxy 修改反向代理配置
|
||||
func (this *ServerDAO) UpdateServerReverseProxy(tx *dbs.Tx, serverId int64, config []byte) error {
|
||||
// UpdateServerReverseProxyRef 修改反向代理配置
|
||||
func (this *ServerDAO) UpdateServerReverseProxyRef(tx *dbs.Tx, serverId int64, reverseProxyRefJSON []byte) error {
|
||||
if serverId <= 0 {
|
||||
return errors.New("serverId should not be smaller than 0")
|
||||
}
|
||||
var op = NewServerOperator()
|
||||
op.Id = serverId
|
||||
op.ReverseProxy = JSONBytes(config)
|
||||
op.ReverseProxy = JSONBytes(reverseProxyRefJSON)
|
||||
err := this.Save(tx, op)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -773,6 +773,28 @@ func (this *ServerDAO) UpdateServerReverseProxy(tx *dbs.Tx, serverId int64, conf
|
||||
return this.NotifyUpdate(tx, serverId)
|
||||
}
|
||||
|
||||
// CreateServerReverseProxyRef 创建反向代理配置
|
||||
func (this *ServerDAO) CreateServerReverseProxyRef(tx *dbs.Tx, userId int64, serverId int64) (reverseProxyId int64, err error) {
|
||||
reverseProxyId, err = SharedReverseProxyDAO.CreateReverseProxy(tx, 0, userId, nil, []byte("[]"), []byte("[]"))
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
var reverseProxyRef = &serverconfigs.ReverseProxyRef{
|
||||
IsPrior: false,
|
||||
IsOn: true,
|
||||
ReverseProxyId: reverseProxyId,
|
||||
}
|
||||
reverseProxyRefJSON, err := json.Marshal(reverseProxyRef)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
err = this.UpdateServerReverseProxyRef(tx, serverId, reverseProxyRefJSON)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return reverseProxyId, nil
|
||||
}
|
||||
|
||||
// CountAllEnabledServers 计算所有可用服务数量
|
||||
func (this *ServerDAO) CountAllEnabledServers(tx *dbs.Tx) (int64, error) {
|
||||
return this.Query(tx).
|
||||
@@ -1322,28 +1344,10 @@ func (this *ServerDAO) ComposeServerConfig(tx *dbs.Tx, server *Server, ignoreCer
|
||||
}
|
||||
|
||||
// 套餐是否依然有效
|
||||
plan, err := SharedPlanDAO.FindEnabledPlan(tx, int64(userPlan.PlanId), cacheMap)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if plan != nil {
|
||||
config.UserPlan = &serverconfigs.UserPlanConfig{
|
||||
Id: int64(userPlan.Id),
|
||||
DayTo: userPlan.DayTo,
|
||||
Plan: &serverconfigs.PlanConfig{
|
||||
Id: int64(plan.Id),
|
||||
Name: plan.Name,
|
||||
},
|
||||
}
|
||||
|
||||
if len(plan.TrafficLimit) > 0 && (config.TrafficLimit == nil || !config.TrafficLimit.IsOn) {
|
||||
var trafficLimitConfig = &serverconfigs.TrafficLimitConfig{}
|
||||
err = json.Unmarshal(plan.TrafficLimit, trafficLimitConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
config.TrafficLimit = trafficLimitConfig
|
||||
}
|
||||
config.UserPlan = &serverconfigs.UserPlanConfig{
|
||||
Id: int64(userPlan.Id),
|
||||
DayTo: userPlan.DayTo,
|
||||
PlanId: int64(userPlan.PlanId),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1380,8 +1384,8 @@ func (this *ServerDAO) ComposeServerConfig(tx *dbs.Tx, server *Server, ignoreCer
|
||||
return config, nil
|
||||
}
|
||||
|
||||
// FindReverseProxyRef 根据条件获取反向代理配置
|
||||
func (this *ServerDAO) FindReverseProxyRef(tx *dbs.Tx, serverId int64) (*serverconfigs.ReverseProxyRef, error) {
|
||||
// FindServerReverseProxyRef 根据条件获取反向代理配置
|
||||
func (this *ServerDAO) FindServerReverseProxyRef(tx *dbs.Tx, serverId int64) (*serverconfigs.ReverseProxyRef, error) {
|
||||
reverseProxy, err := this.Query(tx).
|
||||
Pk(serverId).
|
||||
Result("reverseProxy").
|
||||
@@ -1392,7 +1396,7 @@ func (this *ServerDAO) FindReverseProxyRef(tx *dbs.Tx, serverId int64) (*serverc
|
||||
if len(reverseProxy) == 0 || reverseProxy == "null" {
|
||||
return nil, nil
|
||||
}
|
||||
config := &serverconfigs.ReverseProxyRef{}
|
||||
var config = &serverconfigs.ReverseProxyRef{}
|
||||
err = json.Unmarshal([]byte(reverseProxy), config)
|
||||
return config, err
|
||||
}
|
||||
@@ -2358,8 +2362,36 @@ func (this *ServerDAO) UpdateServerTrafficLimitConfig(tx *dbs.Tx, serverId int64
|
||||
|
||||
// RenewServerTrafficLimitStatus 根据限流配置更新网站的流量限制状态
|
||||
func (this *ServerDAO) RenewServerTrafficLimitStatus(tx *dbs.Tx, trafficLimitConfig *serverconfigs.TrafficLimitConfig, serverId int64, isUpdatingConfig bool) error {
|
||||
if serverId <= 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
if !trafficLimitConfig.IsOn {
|
||||
if isUpdatingConfig {
|
||||
var oldStatus = &serverconfigs.TrafficLimitStatus{}
|
||||
trafficLimitStatus, err := this.Query(tx).
|
||||
Pk(serverId).
|
||||
Result("trafficLimitStatus").
|
||||
FindJSONCol()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if IsNotNull(trafficLimitStatus) {
|
||||
err = json.Unmarshal(trafficLimitStatus, oldStatus)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if oldStatus.PlanId == 0 /** 说明是网站自行设置的限制 **/ {
|
||||
err = this.Query(tx).
|
||||
Pk(serverId).
|
||||
Set("trafficLimitStatus", dbs.SQL("NULL")).
|
||||
UpdateQuickly()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return this.NotifyUpdate(tx, serverId)
|
||||
}
|
||||
return nil
|
||||
@@ -2470,7 +2502,9 @@ func (this *ServerDAO) UpdateServerTrafficLimitStatus(tx *dbs.Tx, serverId int64
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(oldStatus.UntilDay) > 0 && oldStatus.UntilDay >= day /** 如果已经限制,且比当前日期长,则无需重复 **/ {
|
||||
if len(oldStatus.UntilDay) > 0 &&
|
||||
oldStatus.UntilDay >= day /** 如果已经限制,且比当前日期长,则无需重复 **/ &&
|
||||
oldStatus.PlanId == planId /** 套餐无变化 **/ {
|
||||
// no need to change
|
||||
return nil
|
||||
}
|
||||
@@ -2986,6 +3020,17 @@ func (this *ServerDAO) CheckServerPlanQuota(tx *dbs.Tx, serverId int64, countSer
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExistsServer 检查网站是否存在
|
||||
func (this *ServerDAO) ExistsServer(tx *dbs.Tx, serverId int64) (bool, error) {
|
||||
if serverId <= 0 {
|
||||
return false, nil
|
||||
}
|
||||
return this.Query(tx).
|
||||
Pk(serverId).
|
||||
State(ServerStateEnabled).
|
||||
Exist()
|
||||
}
|
||||
|
||||
// NotifyUpdate 同步服务所在的集群
|
||||
func (this *ServerDAO) NotifyUpdate(tx *dbs.Tx, serverId int64) error {
|
||||
if serverId <= 0 {
|
||||
|
||||
@@ -67,6 +67,11 @@ func (this *RestServer) handle(writer http.ResponseWriter, req *http.Request) {
|
||||
var matches = servicePathReg.FindStringSubmatch(path)
|
||||
if len(matches) != 3 {
|
||||
writer.WriteHeader(http.StatusNotFound)
|
||||
this.writeJSON(writer, maps.Map{
|
||||
"code": "404",
|
||||
"message": "invalid api path '" + path + "'",
|
||||
"data": maps.Map{},
|
||||
}, shouldPretty)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -76,11 +81,21 @@ func (this *RestServer) handle(writer http.ResponseWriter, req *http.Request) {
|
||||
serviceType, ok := restServicesMap[serviceName]
|
||||
if !ok {
|
||||
writer.WriteHeader(http.StatusNotFound)
|
||||
this.writeJSON(writer, maps.Map{
|
||||
"code": "404",
|
||||
"message": "service '" + serviceName + "' not found",
|
||||
"data": maps.Map{},
|
||||
}, shouldPretty)
|
||||
return
|
||||
}
|
||||
|
||||
if len(methodName) == 0 {
|
||||
writer.WriteHeader(http.StatusNotFound)
|
||||
this.writeJSON(writer, maps.Map{
|
||||
"code": "404",
|
||||
"message": "method '" + methodName + "' not found",
|
||||
"data": maps.Map{},
|
||||
}, shouldPretty)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -94,19 +109,39 @@ func (this *RestServer) handle(writer http.ResponseWriter, req *http.Request) {
|
||||
method = serviceType.MethodByName(methodName)
|
||||
if !method.IsValid() {
|
||||
writer.WriteHeader(http.StatusNotFound)
|
||||
this.writeJSON(writer, maps.Map{
|
||||
"code": "404",
|
||||
"message": "method '" + methodName + "' not found",
|
||||
"data": maps.Map{},
|
||||
}, shouldPretty)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
writer.WriteHeader(http.StatusNotFound)
|
||||
this.writeJSON(writer, maps.Map{
|
||||
"code": "404",
|
||||
"message": "method '" + methodName + "' not found",
|
||||
"data": maps.Map{},
|
||||
}, shouldPretty)
|
||||
return
|
||||
}
|
||||
}
|
||||
if method.Type().NumIn() != 2 || method.Type().NumOut() != 2 {
|
||||
writer.WriteHeader(http.StatusNotFound)
|
||||
this.writeJSON(writer, maps.Map{
|
||||
"code": "404",
|
||||
"message": "method '" + methodName + "' not found",
|
||||
"data": maps.Map{},
|
||||
}, shouldPretty)
|
||||
return
|
||||
}
|
||||
if method.Type().In(0).Name() != "Context" {
|
||||
writer.WriteHeader(http.StatusNotFound)
|
||||
this.writeJSON(writer, maps.Map{
|
||||
"code": "404",
|
||||
"message": "method '" + methodName + "' not found (or invalid context)",
|
||||
"data": maps.Map{},
|
||||
}, shouldPretty)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -166,7 +201,11 @@ func (this *RestServer) handle(writer http.ResponseWriter, req *http.Request) {
|
||||
body, err := io.ReadAll(io.LimitReader(req.Body, 32*sizes.M))
|
||||
if err != nil {
|
||||
writer.WriteHeader(http.StatusBadRequest)
|
||||
_, _ = writer.Write([]byte(err.Error()))
|
||||
this.writeJSON(writer, maps.Map{
|
||||
"code": 400,
|
||||
"message": err.Error(),
|
||||
"data": maps.Map{},
|
||||
}, shouldPretty)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -180,7 +219,11 @@ func (this *RestServer) handle(writer http.ResponseWriter, req *http.Request) {
|
||||
err = json.Unmarshal(body, reqValue)
|
||||
if err != nil {
|
||||
writer.WriteHeader(http.StatusBadRequest)
|
||||
_, _ = writer.Write([]byte("Decode request failed: " + err.Error() + ". Request body should be a valid JSON data"))
|
||||
this.writeJSON(writer, maps.Map{
|
||||
"code": 400,
|
||||
"message": "Decode request failed: " + err.Error() + ". Request body should be a valid JSON data",
|
||||
"data": maps.Map{},
|
||||
}, shouldPretty)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -503,7 +503,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
|
||||
|
||||
// 默认集群
|
||||
this.BeginTag(ctx, "SharedNodeClusterDAO.ListEnabledClusters")
|
||||
nodeClusters, err := models.SharedNodeClusterDAO.ListEnabledClusters(tx, "", 0, 1)
|
||||
nodeClusters, err := models.SharedNodeClusterDAO.ListEnabledClusters(tx, "", true, false, 0, 1)
|
||||
this.EndTag(ctx, "SharedNodeClusterDAO.ListEnabledClusters")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -305,7 +305,7 @@ func (this *HTTPFirewallPolicyService) UpdateHTTPFirewallPolicy(ctx context.Cont
|
||||
req.MaxRequestBodySize = 0
|
||||
}
|
||||
|
||||
err = models.SharedHTTPFirewallPolicyDAO.UpdateFirewallPolicy(tx, req.HttpFirewallPolicyId, req.IsOn, req.Name, req.Description, inboundConfigJSON, outboundConfigJSON, req.BlockOptionsJSON, req.CaptchaOptionsJSON, req.Mode, req.UseLocalFirewall, synFloodConfig, logConfig, req.MaxRequestBodySize, req.DenyCountryHTML, req.DenyProvinceHTML)
|
||||
err = models.SharedHTTPFirewallPolicyDAO.UpdateFirewallPolicy(tx, req.HttpFirewallPolicyId, req.IsOn, req.Name, req.Description, inboundConfigJSON, outboundConfigJSON, req.BlockOptionsJSON, req.PageOptionsJSON, req.CaptchaOptionsJSON, req.Mode, req.UseLocalFirewall, synFloodConfig, logConfig, req.MaxRequestBodySize, req.DenyCountryHTML, req.DenyProvinceHTML)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -500,6 +500,7 @@ func (this *HTTPFirewallPolicyService) FindEnabledHTTPFirewallPolicy(ctx context
|
||||
Mode: policy.Mode,
|
||||
SynFloodJSON: policy.SynFlood,
|
||||
BlockOptionsJSON: policy.BlockOptions,
|
||||
PageOptionsJSON: policy.PageOptions,
|
||||
CaptchaOptionsJSON: policy.CaptchaOptions,
|
||||
},
|
||||
}, nil
|
||||
|
||||
@@ -32,3 +32,13 @@ func (this *HTTPWebService) FindHTTPWebCC(ctx context.Context, req *pb.FindHTTPW
|
||||
func (this *HTTPWebService) UpdateHTTPWebRequestScripts(ctx context.Context, req *pb.UpdateHTTPWebRequestScriptsRequest) (*pb.RPCSuccess, error) {
|
||||
return nil, this.NotImplementedYet()
|
||||
}
|
||||
|
||||
// UpdateHTTPWebHLS 修改HLS设置
|
||||
func (this *HTTPWebService) UpdateHTTPWebHLS(ctx context.Context, req *pb.UpdateHTTPWebHLSRequest) (*pb.RPCSuccess, error) {
|
||||
return nil, this.NotImplementedYet()
|
||||
}
|
||||
|
||||
// FindHTTPWebHLS 查找HLS设置
|
||||
func (this *HTTPWebService) FindHTTPWebHLS(ctx context.Context, req *pb.FindHTTPWebHLSRequest) (*pb.FindHTTPWebHLSResponse, error) {
|
||||
return nil, this.NotImplementedYet()
|
||||
}
|
||||
|
||||
@@ -2293,3 +2293,19 @@ func (this *NodeService) FindNodeWebPPolicies(ctx context.Context, req *pb.FindN
|
||||
WebPPolicies: pbPolicies,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// UpdateNodeIsOn 修改节点的启用状态
|
||||
func (this *NodeService) UpdateNodeIsOn(ctx context.Context, req *pb.UpdateNodeIsOnRequest) (*pb.RPCSuccess, error) {
|
||||
_, err := this.ValidateAdmin(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var tx = this.NullTx()
|
||||
err = models.SharedNodeDAO.UpdateNodeIsOn(tx, req.NodeId, req.IsOn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return this.Success()
|
||||
}
|
||||
|
||||
@@ -349,12 +349,12 @@ func (this *NodeClusterService) ListEnabledNodeClusters(ctx context.Context, req
|
||||
|
||||
var tx = this.NullTx()
|
||||
|
||||
clusters, err := models.SharedNodeClusterDAO.ListEnabledClusters(tx, req.Keyword, req.Offset, req.Size)
|
||||
clusters, err := models.SharedNodeClusterDAO.ListEnabledClusters(tx, req.Keyword, req.IdDesc, req.IdAsc, req.Offset, req.Size)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result := []*pb.NodeCluster{}
|
||||
var result = []*pb.NodeCluster{}
|
||||
for _, cluster := range clusters {
|
||||
result = append(result, &pb.NodeCluster{
|
||||
Id: int64(cluster.Id),
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
//go:build !plus
|
||||
// +build !plus
|
||||
|
||||
package services
|
||||
|
||||
@@ -34,6 +33,11 @@ func (this *PlanService) FindEnabledPlan(ctx context.Context, req *pb.FindEnable
|
||||
return &pb.FindEnabledPlanResponse{Plan: nil}, nil
|
||||
}
|
||||
|
||||
// FindBasicPlan 查找套餐基本信息
|
||||
func (this *PlanService) FindBasicPlan(ctx context.Context, req *pb.FindBasicPlanRequest) (*pb.FindBasicPlanResponse, error) {
|
||||
return nil, this.NotImplementedYet()
|
||||
}
|
||||
|
||||
// CountAllEnabledPlans 计算套餐数量
|
||||
func (this *PlanService) CountAllEnabledPlans(ctx context.Context, req *pb.CountAllEnabledPlansRequest) (*pb.RPCCountResponse, error) {
|
||||
return this.SuccessCount(0)
|
||||
@@ -53,3 +57,8 @@ func (this *PlanService) SortPlans(ctx context.Context, req *pb.SortPlansRequest
|
||||
func (this *PlanService) FindAllAvailablePlans(ctx context.Context, req *pb.FindAllAvailablePlansRequest) (*pb.FindAllAvailablePlansResponse, error) {
|
||||
return nil, this.NotImplementedYet()
|
||||
}
|
||||
|
||||
// FindAllAvailableBasicPlans 列出所有可用的套餐的基本信息
|
||||
func (this *PlanService) FindAllAvailableBasicPlans(ctx context.Context, req *pb.FindAllAvailableBasicPlansRequest) (*pb.FindAllAvailableBasicPlansResponse, error) {
|
||||
return nil, this.NotImplementedYet()
|
||||
}
|
||||
|
||||
@@ -695,6 +695,218 @@ func (this *ServerService) CreateBasicTCPServer(ctx context.Context, req *pb.Cre
|
||||
return &pb.CreateBasicTCPServerResponse{ServerId: serverId}, nil
|
||||
}
|
||||
|
||||
// AddServerOrigin 为网站添加源站
|
||||
func (this *ServerService) AddServerOrigin(ctx context.Context, req *pb.AddServerOriginRequest) (*pb.RPCSuccess, error) {
|
||||
_, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if req.ServerId <= 0 {
|
||||
return nil, errors.New("require 'serverId'")
|
||||
}
|
||||
if req.OriginId <= 0 {
|
||||
return nil, errors.New("require 'originId'")
|
||||
}
|
||||
|
||||
var tx = this.NullTx()
|
||||
|
||||
// check user
|
||||
if userId > 0 {
|
||||
err = models.SharedServerDAO.CheckUserServer(tx, userId, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = models.SharedOriginDAO.CheckUserOrigin(tx, userId, req.OriginId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
// check server
|
||||
existsServer, err := models.SharedServerDAO.ExistsServer(tx, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !existsServer {
|
||||
return nil, errors.New("server '" + types.String(req.ServerId) + "' not found")
|
||||
}
|
||||
|
||||
// check origin
|
||||
existsOrigin, err := models.SharedOriginDAO.ExistsOrigin(tx, req.OriginId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !existsOrigin {
|
||||
return nil, errors.New("origin '" + types.String(req.OriginId) + "' not found")
|
||||
}
|
||||
}
|
||||
|
||||
reverseProxyRef, err := models.SharedServerDAO.FindServerReverseProxyRef(tx, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if reverseProxyRef == nil || reverseProxyRef.ReverseProxyId <= 0 {
|
||||
reverseProxyId, err := models.SharedServerDAO.CreateServerReverseProxyRef(tx, userId, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
reverseProxyRef = &serverconfigs.ReverseProxyRef{
|
||||
IsPrior: false,
|
||||
IsOn: true,
|
||||
ReverseProxyId: reverseProxyId,
|
||||
}
|
||||
}
|
||||
|
||||
reverseProxy, err := models.SharedReverseProxyDAO.FindEnabledReverseProxy(tx, reverseProxyRef.ReverseProxyId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if reverseProxy == nil {
|
||||
return nil, errors.New("can not found reverse proxy")
|
||||
}
|
||||
|
||||
if req.IsPrimary {
|
||||
var refs = reverseProxy.DecodePrimaryOrigins()
|
||||
refs = append(refs, &serverconfigs.OriginRef{
|
||||
IsOn: true,
|
||||
OriginId: req.OriginId,
|
||||
})
|
||||
refsJSON, err := json.Marshal(refs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = models.SharedReverseProxyDAO.UpdateReverseProxyPrimaryOrigins(tx, int64(reverseProxy.Id), refsJSON)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
var refs = reverseProxy.DecodeBackupOrigins()
|
||||
refs = append(refs, &serverconfigs.OriginRef{
|
||||
IsOn: true,
|
||||
OriginId: req.OriginId,
|
||||
})
|
||||
refsJSON, err := json.Marshal(refs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = models.SharedReverseProxyDAO.UpdateReverseProxyBackupOrigins(tx, int64(reverseProxy.Id), refsJSON)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return this.Success()
|
||||
}
|
||||
|
||||
// DeleteServerOrigin 从网站中删除某个源站
|
||||
func (this *ServerService) DeleteServerOrigin(ctx context.Context, req *pb.DeleteServerOriginRequest) (*pb.RPCSuccess, error) {
|
||||
_, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if req.ServerId <= 0 {
|
||||
return nil, errors.New("require 'serverId'")
|
||||
}
|
||||
if req.OriginId <= 0 {
|
||||
return nil, errors.New("require 'originId'")
|
||||
}
|
||||
|
||||
var tx = this.NullTx()
|
||||
|
||||
// check user
|
||||
if userId > 0 {
|
||||
err = models.SharedServerDAO.CheckUserServer(tx, userId, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = models.SharedOriginDAO.CheckUserOrigin(tx, userId, req.OriginId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
// check server
|
||||
existsServer, err := models.SharedServerDAO.ExistsServer(tx, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !existsServer {
|
||||
return nil, errors.New("server '" + types.String(req.ServerId) + "' not found")
|
||||
}
|
||||
|
||||
// check origin
|
||||
existsOrigin, err := models.SharedOriginDAO.ExistsOrigin(tx, req.OriginId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !existsOrigin {
|
||||
return nil, errors.New("origin '" + types.String(req.OriginId) + "' not found")
|
||||
}
|
||||
}
|
||||
|
||||
reverseProxyRef, err := models.SharedServerDAO.FindServerReverseProxyRef(tx, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if reverseProxyRef == nil || reverseProxyRef.ReverseProxyId <= 0 {
|
||||
return this.Success()
|
||||
}
|
||||
|
||||
reverseProxy, err := models.SharedReverseProxyDAO.FindEnabledReverseProxy(tx, reverseProxyRef.ReverseProxyId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if reverseProxy == nil {
|
||||
return this.Success()
|
||||
}
|
||||
|
||||
var primaryOrigins = reverseProxy.DecodePrimaryOrigins()
|
||||
var newPrimaryOrigins = []*serverconfigs.OriginRef{}
|
||||
var found = false
|
||||
for _, origin := range primaryOrigins {
|
||||
if origin.OriginId == req.OriginId {
|
||||
found = true
|
||||
continue
|
||||
}
|
||||
newPrimaryOrigins = append(newPrimaryOrigins, origin)
|
||||
}
|
||||
if found {
|
||||
newPrimaryOriginsJSON, err := json.Marshal(newPrimaryOrigins)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = models.SharedReverseProxyDAO.UpdateReverseProxyPrimaryOrigins(tx, int64(reverseProxy.Id), newPrimaryOriginsJSON)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
var backupOrigins = reverseProxy.DecodeBackupOrigins()
|
||||
var newBackupOrigins = []*serverconfigs.OriginRef{}
|
||||
found = false
|
||||
for _, origin := range backupOrigins {
|
||||
if origin.OriginId == req.OriginId {
|
||||
found = true
|
||||
continue
|
||||
}
|
||||
newBackupOrigins = append(newBackupOrigins, origin)
|
||||
}
|
||||
if found {
|
||||
newBackupOriginsJSON, err := json.Marshal(newBackupOrigins)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = models.SharedReverseProxyDAO.UpdateReverseProxyBackupOrigins(tx, int64(reverseProxy.Id), newBackupOriginsJSON)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return this.Success()
|
||||
}
|
||||
|
||||
// UpdateServerBasic 修改服务基本信息
|
||||
func (this *ServerService) UpdateServerBasic(ctx context.Context, req *pb.UpdateServerBasicRequest) (*pb.RPCSuccess, error) {
|
||||
// 校验请求
|
||||
@@ -1001,7 +1213,7 @@ func (this *ServerService) UpdateServerReverseProxy(ctx context.Context, req *pb
|
||||
}
|
||||
|
||||
// 修改配置
|
||||
err = models.SharedServerDAO.UpdateServerReverseProxy(tx, req.ServerId, req.ReverseProxyJSON)
|
||||
err = models.SharedServerDAO.UpdateServerReverseProxyRef(tx, req.ServerId, req.ReverseProxyJSON)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1462,7 +1674,7 @@ func (this *ServerService) ListEnabledServersMatch(ctx context.Context, req *pb.
|
||||
return &pb.ListEnabledServersMatchResponse{Servers: result}, nil
|
||||
}
|
||||
|
||||
// DeleteServer 禁用某服务
|
||||
// DeleteServer 删除某网站
|
||||
func (this *ServerService) DeleteServer(ctx context.Context, req *pb.DeleteServerRequest) (*pb.RPCSuccess, error) {
|
||||
// 校验请求
|
||||
_, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||
@@ -1479,7 +1691,7 @@ func (this *ServerService) DeleteServer(ctx context.Context, req *pb.DeleteServe
|
||||
}
|
||||
}
|
||||
|
||||
// 禁用服务
|
||||
// 禁用网站
|
||||
err = models.SharedServerDAO.DisableServer(tx, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -1488,6 +1700,37 @@ func (this *ServerService) DeleteServer(ctx context.Context, req *pb.DeleteServe
|
||||
return this.Success()
|
||||
}
|
||||
|
||||
// DeleteServers 删除一组网站
|
||||
func (this *ServerService) DeleteServers(ctx context.Context, req *pb.DeleteServersRequest) (*pb.RPCSuccess, error) {
|
||||
// 校验请求
|
||||
_, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var tx = this.NullTx()
|
||||
for _, serverId := range req.ServerIds {
|
||||
if serverId <= 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查权限
|
||||
if userId > 0 {
|
||||
err = models.SharedServerDAO.CheckUserServer(tx, userId, serverId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// 禁用网站
|
||||
err = models.SharedServerDAO.DisableServer(tx, serverId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return this.Success()
|
||||
}
|
||||
|
||||
// FindEnabledServer 查找单个服务
|
||||
func (this *ServerService) FindEnabledServer(ctx context.Context, req *pb.FindEnabledServerRequest) (*pb.FindEnabledServerResponse, error) {
|
||||
// 校验请求
|
||||
@@ -1674,7 +1917,7 @@ func (this *ServerService) FindAndInitServerReverseProxyConfig(ctx context.Conte
|
||||
|
||||
var tx = this.NullTx()
|
||||
|
||||
reverseProxyRef, err := models.SharedServerDAO.FindReverseProxyRef(tx, req.ServerId)
|
||||
reverseProxyRef, err := models.SharedServerDAO.FindServerReverseProxyRef(tx, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1693,7 +1936,7 @@ func (this *ServerService) FindAndInitServerReverseProxyConfig(ctx context.Conte
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = models.SharedServerDAO.UpdateServerReverseProxy(tx, req.ServerId, refJSON)
|
||||
err = models.SharedServerDAO.UpdateServerReverseProxyRef(tx, req.ServerId, refJSON)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -102722,7 +102722,7 @@
|
||||
"name": "edgeHTTPFirewallPolicies",
|
||||
"engine": "InnoDB",
|
||||
"charset": "utf8mb4_general_ci",
|
||||
"definition": "CREATE TABLE `edgeHTTPFirewallPolicies` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID',\n `groupId` int(11) unsigned DEFAULT '0' COMMENT '服务分组ID',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `name` varchar(255) DEFAULT NULL COMMENT '名称',\n `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n `inbound` json DEFAULT NULL COMMENT '入站规则',\n `outbound` json DEFAULT NULL COMMENT '出站规则',\n `blockOptions` json DEFAULT NULL COMMENT 'BLOCK选项',\n `captchaOptions` json DEFAULT NULL COMMENT '验证码选项',\n `mode` varchar(32) DEFAULT 'defend' COMMENT '模式',\n `useLocalFirewall` tinyint(1) unsigned DEFAULT '1' COMMENT '是否自动使用本地防火墙',\n `synFlood` json DEFAULT NULL COMMENT 'SynFlood防御设置',\n `log` json DEFAULT NULL COMMENT '日志配置',\n `maxRequestBodySize` int(11) unsigned DEFAULT '0' COMMENT '可以检查的最大请求内容尺寸',\n `denyCountryHTML` text COMMENT '区域封禁提示',\n `denyProvinceHTML` text COMMENT '省份封禁提示',\n PRIMARY KEY (`id`),\n KEY `userId` (`userId`),\n KEY `serverId` (`serverId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP防火墙'",
|
||||
"definition": "CREATE TABLE `edgeHTTPFirewallPolicies` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID',\n `groupId` int(11) unsigned DEFAULT '0' COMMENT '服务分组ID',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `name` varchar(255) DEFAULT NULL COMMENT '名称',\n `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n `inbound` json DEFAULT NULL COMMENT '入站规则',\n `outbound` json DEFAULT NULL COMMENT '出站规则',\n `blockOptions` json DEFAULT NULL COMMENT 'BLOCK动作选项',\n `pageOptions` json DEFAULT NULL COMMENT 'PAGE动作选项',\n `captchaOptions` json DEFAULT NULL COMMENT '验证码动作选项',\n `mode` varchar(32) DEFAULT 'defend' COMMENT '模式',\n `useLocalFirewall` tinyint(1) unsigned DEFAULT '1' COMMENT '是否自动使用本地防火墙',\n `synFlood` json DEFAULT NULL COMMENT 'SynFlood防御设置',\n `log` json DEFAULT NULL COMMENT '日志配置',\n `maxRequestBodySize` int(11) unsigned DEFAULT '0' COMMENT '可以检查的最大请求内容尺寸',\n `denyCountryHTML` text COMMENT '区域封禁提示',\n `denyProvinceHTML` text COMMENT '省份封禁提示',\n PRIMARY KEY (`id`),\n KEY `userId` (`userId`),\n KEY `serverId` (`serverId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP防火墙'",
|
||||
"fields": [
|
||||
{
|
||||
"name": "id",
|
||||
@@ -102778,11 +102778,15 @@
|
||||
},
|
||||
{
|
||||
"name": "blockOptions",
|
||||
"definition": "json COMMENT 'BLOCK选项'"
|
||||
"definition": "json COMMENT 'BLOCK动作选项'"
|
||||
},
|
||||
{
|
||||
"name": "pageOptions",
|
||||
"definition": "json COMMENT 'PAGE动作选项'"
|
||||
},
|
||||
{
|
||||
"name": "captchaOptions",
|
||||
"definition": "json COMMENT '验证码选项'"
|
||||
"definition": "json COMMENT '验证码动作选项'"
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
@@ -103488,7 +103492,7 @@
|
||||
"name": "edgeHTTPWebs",
|
||||
"engine": "InnoDB",
|
||||
"charset": "utf8mb4_general_ci",
|
||||
"definition": "CREATE TABLE `edgeHTTPWebs` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `root` json DEFAULT NULL COMMENT '根目录',\n `charset` json DEFAULT NULL COMMENT '字符集',\n `shutdown` json DEFAULT NULL COMMENT '临时关闭页面配置',\n `pages` json DEFAULT NULL COMMENT '特殊页面',\n `redirectToHttps` json DEFAULT NULL COMMENT '跳转到HTTPS设置',\n `indexes` json DEFAULT NULL COMMENT '首页文件列表',\n `maxRequestBodySize` json DEFAULT NULL COMMENT '最大允许的请求内容尺寸',\n `requestHeader` json DEFAULT NULL COMMENT '请求Header配置',\n `responseHeader` json DEFAULT NULL COMMENT '响应Header配置',\n `accessLog` json DEFAULT NULL COMMENT '访问日志配置',\n `stat` json DEFAULT NULL COMMENT '统计配置',\n `gzip` json DEFAULT NULL COMMENT 'Gzip配置(v0.3.2弃用)',\n `compression` json DEFAULT NULL COMMENT '压缩配置',\n `cache` json DEFAULT NULL COMMENT '缓存配置',\n `firewall` json DEFAULT NULL COMMENT '防火墙设置',\n `locations` json DEFAULT NULL COMMENT '路由规则配置',\n `websocket` json DEFAULT NULL COMMENT 'Websocket设置',\n `rewriteRules` json DEFAULT NULL COMMENT '重写规则配置',\n `hostRedirects` json DEFAULT NULL COMMENT '域名跳转',\n `fastcgi` json DEFAULT NULL COMMENT 'Fastcgi配置',\n `auth` json DEFAULT NULL COMMENT '认证策略配置',\n `webp` json DEFAULT NULL COMMENT 'WebP配置',\n `remoteAddr` json DEFAULT NULL COMMENT '客户端IP配置',\n `mergeSlashes` tinyint(1) unsigned DEFAULT '0' COMMENT '是否合并路径中的斜杠',\n `requestLimit` json DEFAULT NULL COMMENT '请求限制',\n `requestScripts` json DEFAULT NULL COMMENT '请求脚本',\n `uam` json DEFAULT NULL COMMENT 'UAM设置',\n `cc` json DEFAULT NULL COMMENT 'CC设置',\n `referers` json DEFAULT NULL COMMENT '防盗链设置',\n `userAgent` json DEFAULT NULL COMMENT 'UserAgent设置',\n `optimization` json DEFAULT NULL COMMENT '页面优化配置',\n PRIMARY KEY (`id`),\n KEY `userId` (`userId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Web'",
|
||||
"definition": "CREATE TABLE `edgeHTTPWebs` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `root` json DEFAULT NULL COMMENT '根目录',\n `charset` json DEFAULT NULL COMMENT '字符集',\n `shutdown` json DEFAULT NULL COMMENT '临时关闭页面配置',\n `pages` json DEFAULT NULL COMMENT '特殊页面',\n `redirectToHttps` json DEFAULT NULL COMMENT '跳转到HTTPS设置',\n `indexes` json DEFAULT NULL COMMENT '首页文件列表',\n `maxRequestBodySize` json DEFAULT NULL COMMENT '最大允许的请求内容尺寸',\n `requestHeader` json DEFAULT NULL COMMENT '请求Header配置',\n `responseHeader` json DEFAULT NULL COMMENT '响应Header配置',\n `accessLog` json DEFAULT NULL COMMENT '访问日志配置',\n `stat` json DEFAULT NULL COMMENT '统计配置',\n `gzip` json DEFAULT NULL COMMENT 'Gzip配置(v0.3.2弃用)',\n `compression` json DEFAULT NULL COMMENT '压缩配置',\n `cache` json DEFAULT NULL COMMENT '缓存配置',\n `firewall` json DEFAULT NULL COMMENT '防火墙设置',\n `locations` json DEFAULT NULL COMMENT '路由规则配置',\n `websocket` json DEFAULT NULL COMMENT 'Websocket设置',\n `rewriteRules` json DEFAULT NULL COMMENT '重写规则配置',\n `hostRedirects` json DEFAULT NULL COMMENT '域名跳转',\n `fastcgi` json DEFAULT NULL COMMENT 'Fastcgi配置',\n `auth` json DEFAULT NULL COMMENT '认证策略配置',\n `webp` json DEFAULT NULL COMMENT 'WebP配置',\n `remoteAddr` json DEFAULT NULL COMMENT '客户端IP配置',\n `mergeSlashes` tinyint(1) unsigned DEFAULT '0' COMMENT '是否合并路径中的斜杠',\n `requestLimit` json DEFAULT NULL COMMENT '请求限制',\n `requestScripts` json DEFAULT NULL COMMENT '请求脚本',\n `uam` json DEFAULT NULL COMMENT 'UAM设置',\n `cc` json DEFAULT NULL COMMENT 'CC设置',\n `referers` json DEFAULT NULL COMMENT '防盗链设置',\n `userAgent` json DEFAULT NULL COMMENT 'UserAgent设置',\n `optimization` json DEFAULT NULL COMMENT '页面优化配置',\n `hls` json DEFAULT NULL COMMENT 'HLS设置',\n PRIMARY KEY (`id`),\n KEY `userId` (`userId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Web'",
|
||||
"fields": [
|
||||
{
|
||||
"name": "id",
|
||||
@@ -103641,6 +103645,10 @@
|
||||
{
|
||||
"name": "optimization",
|
||||
"definition": "json COMMENT '页面优化配置'"
|
||||
},
|
||||
{
|
||||
"name": "hls",
|
||||
"definition": "json COMMENT 'HLS设置'"
|
||||
}
|
||||
],
|
||||
"indexes": [
|
||||
@@ -111485,7 +111493,7 @@
|
||||
"name": "edgePlans",
|
||||
"engine": "InnoDB",
|
||||
"charset": "utf8mb4_general_ci",
|
||||
"definition": "CREATE TABLE `edgePlans` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `name` varchar(255) DEFAULT NULL COMMENT '套餐名',\n `description` varchar(255) DEFAULT NULL COMMENT '套餐简介',\n `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID',\n `trafficLimit` json DEFAULT NULL COMMENT '流量限制',\n `features` json DEFAULT NULL COMMENT '允许的功能',\n `hasFullFeatures` tinyint(1) unsigned DEFAULT '1' COMMENT '是否有完整的功能',\n `trafficPrice` json DEFAULT NULL COMMENT '流量价格设定',\n `bandwidthPrice` json DEFAULT NULL COMMENT '带宽价格',\n `monthlyPrice` decimal(12,2) unsigned DEFAULT '0.00' COMMENT '月付',\n `seasonallyPrice` decimal(12,2) unsigned DEFAULT '0.00' COMMENT '季付',\n `yearlyPrice` decimal(12,2) unsigned DEFAULT '0.00' COMMENT '年付',\n `priceType` varchar(32) DEFAULT NULL COMMENT '价格类型',\n `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `totalServers` int(11) unsigned DEFAULT '1' COMMENT '可以绑定的网站数量',\n `totalServerNamesPerServer` int(255) unsigned DEFAULT '0' COMMENT '每个网站可以绑定的域名数量',\n `totalServerNames` int(255) unsigned DEFAULT '0' COMMENT '总域名数量',\n `monthlyRequests` bigint(20) unsigned DEFAULT '0' COMMENT '每月访问量额度',\n `dailyRequests` bigint(20) unsigned DEFAULT '0' COMMENT '每日访问量额度',\n `dailyWebsocketConnections` bigint(20) unsigned DEFAULT '0' COMMENT '每日Websocket连接数',\n `monthlyWebsocketConnections` bigint(20) unsigned DEFAULT '0' COMMENT '每月Websocket连接数',\n PRIMARY KEY (`id`),\n KEY `state` (`state`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户套餐'",
|
||||
"definition": "CREATE TABLE `edgePlans` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `name` varchar(255) DEFAULT NULL COMMENT '套餐名',\n `description` varchar(255) DEFAULT NULL COMMENT '套餐简介',\n `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID',\n `trafficLimit` json DEFAULT NULL COMMENT '流量限制',\n `bandwidthLimitPerNode` json DEFAULT NULL COMMENT '单节点带宽限制',\n `features` json DEFAULT NULL COMMENT '允许的功能',\n `hasFullFeatures` tinyint(1) unsigned DEFAULT '1' COMMENT '是否有完整的功能',\n `trafficPrice` json DEFAULT NULL COMMENT '流量价格设定',\n `bandwidthPrice` json DEFAULT NULL COMMENT '带宽价格',\n `monthlyPrice` decimal(12,2) unsigned DEFAULT '0.00' COMMENT '月付',\n `seasonallyPrice` decimal(12,2) unsigned DEFAULT '0.00' COMMENT '季付',\n `yearlyPrice` decimal(12,2) unsigned DEFAULT '0.00' COMMENT '年付',\n `priceType` varchar(32) DEFAULT NULL COMMENT '价格类型',\n `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `totalServers` int(11) unsigned DEFAULT '1' COMMENT '可以绑定的网站数量',\n `totalServerNamesPerServer` int(255) unsigned DEFAULT '0' COMMENT '每个网站可以绑定的域名数量',\n `totalServerNames` int(255) unsigned DEFAULT '0' COMMENT '总域名数量',\n `monthlyRequests` bigint(20) unsigned DEFAULT '0' COMMENT '每月访问量额度',\n `dailyRequests` bigint(20) unsigned DEFAULT '0' COMMENT '每日访问量额度',\n `dailyWebsocketConnections` bigint(20) unsigned DEFAULT '0' COMMENT '每日Websocket连接数',\n `monthlyWebsocketConnections` bigint(20) unsigned DEFAULT '0' COMMENT '每月Websocket连接数',\n `maxUploadSize` json DEFAULT NULL COMMENT '最大上传',\n PRIMARY KEY (`id`),\n KEY `state` (`state`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户套餐'",
|
||||
"fields": [
|
||||
{
|
||||
"name": "id",
|
||||
@@ -111511,6 +111519,10 @@
|
||||
"name": "trafficLimit",
|
||||
"definition": "json COMMENT '流量限制'"
|
||||
},
|
||||
{
|
||||
"name": "bandwidthLimitPerNode",
|
||||
"definition": "json COMMENT '单节点带宽限制'"
|
||||
},
|
||||
{
|
||||
"name": "features",
|
||||
"definition": "json COMMENT '允许的功能'"
|
||||
@@ -111578,6 +111590,10 @@
|
||||
{
|
||||
"name": "monthlyWebsocketConnections",
|
||||
"definition": "bigint(20) unsigned DEFAULT '0' COMMENT '每月Websocket连接数'"
|
||||
},
|
||||
{
|
||||
"name": "maxUploadSize",
|
||||
"definition": "json COMMENT '最大上传'"
|
||||
}
|
||||
],
|
||||
"indexes": [
|
||||
@@ -111592,6 +111608,108 @@
|
||||
],
|
||||
"records": []
|
||||
},
|
||||
{
|
||||
"name": "edgePostCategories",
|
||||
"engine": "InnoDB",
|
||||
"charset": "utf8mb4_general_ci",
|
||||
"definition": "CREATE TABLE `edgePostCategories` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `name` varchar(255) DEFAULT NULL COMMENT '分类名称',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `code` varchar(255) DEFAULT NULL COMMENT '代号',\n `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '分类状态',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章分类'",
|
||||
"fields": [
|
||||
{
|
||||
"name": "id",
|
||||
"definition": "int(11) unsigned auto_increment COMMENT 'ID'"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"definition": "varchar(255) COMMENT '分类名称'"
|
||||
},
|
||||
{
|
||||
"name": "isOn",
|
||||
"definition": "tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用'"
|
||||
},
|
||||
{
|
||||
"name": "code",
|
||||
"definition": "varchar(255) COMMENT '代号'"
|
||||
},
|
||||
{
|
||||
"name": "order",
|
||||
"definition": "int(11) unsigned DEFAULT '0' COMMENT '排序'"
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"definition": "tinyint(1) unsigned DEFAULT '1' COMMENT '分类状态'"
|
||||
}
|
||||
],
|
||||
"indexes": [
|
||||
{
|
||||
"name": "PRIMARY",
|
||||
"definition": "UNIQUE KEY `PRIMARY` (`id`) USING BTREE"
|
||||
}
|
||||
],
|
||||
"records": []
|
||||
},
|
||||
{
|
||||
"name": "edgePosts",
|
||||
"engine": "InnoDB",
|
||||
"charset": "utf8mb4_general_ci",
|
||||
"definition": "CREATE TABLE `edgePosts` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `categoryId` int(11) unsigned DEFAULT '0' COMMENT '文章分类',\n `type` varchar(255) DEFAULT NULL COMMENT '类型:normal, url',\n `url` varchar(255) DEFAULT NULL COMMENT 'URL',\n `subject` varchar(255) DEFAULT NULL COMMENT '标题',\n `body` longtext COMMENT '内容',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `isPublished` tinyint(1) unsigned DEFAULT '0' COMMENT '是否已发布',\n `publishedAt` bigint(11) unsigned DEFAULT '0' COMMENT '发布时间',\n `productCode` varchar(64) DEFAULT NULL COMMENT '产品代号',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n PRIMARY KEY (`id`),\n KEY `categoryId` (`categoryId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章管理'",
|
||||
"fields": [
|
||||
{
|
||||
"name": "id",
|
||||
"definition": "int(11) unsigned auto_increment COMMENT 'ID'"
|
||||
},
|
||||
{
|
||||
"name": "categoryId",
|
||||
"definition": "int(11) unsigned DEFAULT '0' COMMENT '文章分类'"
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"definition": "varchar(255) COMMENT '类型:normal, url'"
|
||||
},
|
||||
{
|
||||
"name": "url",
|
||||
"definition": "varchar(255) COMMENT 'URL'"
|
||||
},
|
||||
{
|
||||
"name": "subject",
|
||||
"definition": "varchar(255) COMMENT '标题'"
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"definition": "longtext COMMENT '内容'"
|
||||
},
|
||||
{
|
||||
"name": "createdAt",
|
||||
"definition": "bigint(11) unsigned DEFAULT '0' COMMENT '创建时间'"
|
||||
},
|
||||
{
|
||||
"name": "isPublished",
|
||||
"definition": "tinyint(1) unsigned DEFAULT '0' COMMENT '是否已发布'"
|
||||
},
|
||||
{
|
||||
"name": "publishedAt",
|
||||
"definition": "bigint(11) unsigned DEFAULT '0' COMMENT '发布时间'"
|
||||
},
|
||||
{
|
||||
"name": "productCode",
|
||||
"definition": "varchar(64) COMMENT '产品代号'"
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"definition": "tinyint(1) unsigned DEFAULT '1' COMMENT '状态'"
|
||||
}
|
||||
],
|
||||
"indexes": [
|
||||
{
|
||||
"name": "PRIMARY",
|
||||
"definition": "UNIQUE KEY `PRIMARY` (`id`) USING BTREE"
|
||||
},
|
||||
{
|
||||
"name": "categoryId",
|
||||
"definition": "KEY `categoryId` (`categoryId`) USING BTREE"
|
||||
}
|
||||
],
|
||||
"records": []
|
||||
},
|
||||
{
|
||||
"name": "edgeProviders",
|
||||
"engine": "InnoDB",
|
||||
|
||||
Reference in New Issue
Block a user