mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-09-12 13:10:05 +00:00

- Add MySQL database support with environment-based configuration - Fix MySQL compatibility issue with 'key' column name - Maintain SQLite as default database - Add proper validation for MySQL configuration - Test and verify compatibility with existing database - Replaced raw SQL queries using JSON_EACH functions with standard GORM queries - Modified functions to handle JSON parsing in Go code instead of database since JSON_EACH is not available on MySQL or MariaDB: - getAllEmails() - GetClientTrafficByID() - getFallbackMaster() - MigrationRemoveOrphanedTraffics() The system now supports both MySQL and SQLite databases, with SQLite remaining as the default option. MySQL connection is only used when explicitly configured through environment variables.
107 lines
3.6 KiB
Go
107 lines
3.6 KiB
Go
package model
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"x-ui/util/json_util"
|
|
"x-ui/xray"
|
|
)
|
|
|
|
type Protocol string
|
|
|
|
const (
|
|
VMESS Protocol = "vmess"
|
|
VLESS Protocol = "vless"
|
|
DOKODEMO Protocol = "dokodemo-door"
|
|
HTTP Protocol = "http"
|
|
Trojan Protocol = "trojan"
|
|
Shadowsocks Protocol = "shadowsocks"
|
|
Socks Protocol = "socks"
|
|
WireGuard Protocol = "wireguard"
|
|
)
|
|
|
|
type User struct {
|
|
Id int `json:"id" gorm:"primaryKey;autoIncrement"`
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
type Inbound struct {
|
|
Id int `json:"id" form:"id" gorm:"primaryKey;autoIncrement"`
|
|
UserId int `json:"-"`
|
|
Up int64 `json:"up" form:"up"`
|
|
Down int64 `json:"down" form:"down"`
|
|
Total int64 `json:"total" form:"total"`
|
|
Remark string `json:"remark" form:"remark"`
|
|
Enable bool `json:"enable" form:"enable"`
|
|
ExpiryTime int64 `json:"expiryTime" form:"expiryTime"`
|
|
ClientStats []xray.ClientTraffic `gorm:"foreignKey:InboundId;references:Id" json:"clientStats" form:"clientStats"`
|
|
|
|
// config part
|
|
Listen string `json:"listen" form:"listen"`
|
|
Port int `json:"port" form:"port"`
|
|
Protocol Protocol `json:"protocol" form:"protocol"`
|
|
Settings string `json:"settings" form:"settings"`
|
|
StreamSettings string `json:"streamSettings" form:"streamSettings"`
|
|
Tag string `json:"tag" form:"tag" gorm:"unique"`
|
|
Sniffing string `json:"sniffing" form:"sniffing"`
|
|
Allocate string `json:"allocate" form:"allocate"`
|
|
}
|
|
|
|
type OutboundTraffics struct {
|
|
Id int `json:"id" form:"id" gorm:"primaryKey;autoIncrement"`
|
|
Tag string `json:"tag" form:"tag" gorm:"unique"`
|
|
Up int64 `json:"up" form:"up" gorm:"default:0"`
|
|
Down int64 `json:"down" form:"down" gorm:"default:0"`
|
|
Total int64 `json:"total" form:"total" gorm:"default:0"`
|
|
}
|
|
|
|
type InboundClientIps struct {
|
|
Id int `json:"id" gorm:"primaryKey;autoIncrement"`
|
|
ClientEmail string `json:"clientEmail" form:"clientEmail" gorm:"unique"`
|
|
Ips string `json:"ips" form:"ips"`
|
|
}
|
|
|
|
type HistoryOfSeeders struct {
|
|
Id int `json:"id" gorm:"primaryKey;autoIncrement"`
|
|
SeederName string `json:"seederName"`
|
|
}
|
|
|
|
func (i *Inbound) GenXrayInboundConfig() *xray.InboundConfig {
|
|
listen := i.Listen
|
|
if listen != "" {
|
|
listen = fmt.Sprintf("\"%v\"", listen)
|
|
}
|
|
return &xray.InboundConfig{
|
|
Listen: json_util.RawMessage(listen),
|
|
Port: i.Port,
|
|
Protocol: string(i.Protocol),
|
|
Settings: json_util.RawMessage(i.Settings),
|
|
StreamSettings: json_util.RawMessage(i.StreamSettings),
|
|
Tag: i.Tag,
|
|
Sniffing: json_util.RawMessage(i.Sniffing),
|
|
Allocate: json_util.RawMessage(i.Allocate),
|
|
}
|
|
}
|
|
|
|
type Setting struct {
|
|
Id int `json:"id" form:"id" gorm:"primaryKey;autoIncrement"`
|
|
Key string `json:"key" form:"key" gorm:"column:key"`
|
|
Value string `json:"value" form:"value"`
|
|
}
|
|
|
|
type Client struct {
|
|
ID string `json:"id"`
|
|
Security string `json:"security"`
|
|
Password string `json:"password"`
|
|
Flow string `json:"flow"`
|
|
Email string `json:"email"`
|
|
LimitIP int `json:"limitIp"`
|
|
TotalGB int64 `json:"totalGB" form:"totalGB"`
|
|
ExpiryTime int64 `json:"expiryTime" form:"expiryTime"`
|
|
Enable bool `json:"enable" form:"enable"`
|
|
TgID int64 `json:"tgId" form:"tgId"`
|
|
SubID string `json:"subId" form:"subId"`
|
|
Comment string `json:"comment" form:"comment"`
|
|
Reset int `json:"reset" form:"reset"`
|
|
}
|